Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
Quadrature.h
Go to the documentation of this file.
1/* This file is part of MoDELib, the Mechanics Of Defects Evolution Library.
2 *
3 *
4 * MoDELib is distributed without any warranty under the
5 * GNU General Public License (GPL) v2 <http://www.gnu.org/licenses/>.
6 */
7
8#ifndef model_QUADRATURE_H_
9#define model_QUADRATURE_H_
10
11#include <assert.h>
12#include <Eigen/Dense>
13#include <GaussLegendre.h>
14#include <UniformOpen.h>
15#include <NonUniformOpen.h>
16
17namespace model
18{
19
20 template<short unsigned int dim, size_t qOrder>
22 {
23 typedef Eigen::Matrix<double,dim,1> VectorDim;
24
25 static const VectorDim abscissa(const short unsigned int & k, const Eigen::Matrix<double,dim,qOrder>& abscissas)
26 {
27 return abscissas.col(k);
28 }
29 };
30
31 template<size_t qOrder>
32 struct VectorDimTypeSelector<1,qOrder>
33 {
34 typedef double VectorDim;
35
36 static const VectorDim& abscissa(const short unsigned int & k, const Eigen::Matrix<double,1,qOrder>& abscissas)
37 {
38 return abscissas(k);
39 }
40 };
41
42
43 /**************************************************************************/
44 /**************************************************************************/
48 template<short unsigned int dim, size_t qOrder, template <short unsigned int, size_t> class QuadratureRule = GaussLegendre>
50 {
51
52 constexpr static size_t quadratureOrder=qOrder;
53
54
56
58// static const Eigen::Matrix<double,dim,qOrder> abscissas;
59 static const Eigen::MatrixXd abscissas;
60
62// static const Eigen::Matrix<double,1, qOrder> weights;
63 static const Eigen::MatrixXd weights;
64
65 /**********************************************************************/
66 static const double& weight(const short unsigned int & k)
67 {/*\returns the k-th weight
68 */
69 return weights(k);
70 }
71
72 /**********************************************************************/
73 static const VectorDim abscissa(const short unsigned int & k)
74 {/*\returns the k-th abscissa
75 */
77 }
78
79 /**********************************************************************/
80 template<typename IntegrandType>
81 static void integrate(IntegrandType (*fp)(const double&), IntegrandType &intgrl)
82 {
105 for(size_t k=0;k<qOrder;++k)
106 {
107 intgrl+=(*fp)(k) * weights(k);
108 }
109 }
110
111 /**********************************************************************/
112 template <typename AnyClass, typename IntegrandType, typename ...Args>
113 static void integrate(const AnyClass* const C, IntegrandType &intgrl, IntegrandType (AnyClass::*mfp)(const VectorDim&, const Args&...) const, const Args&...args)
114 // static void integrate(AnyClass* const C, IntegrandType &intgrl, IntegrandType (AnyClass::*mfp)(const VectorDim&, const Args&...), const Args&...args)
115 {
153 for(size_t k=0;k<qOrder;++k)
154 {
155 intgrl+=(C->*mfp)(abscissa(k),args...) * weights(k);
156 }
157 }
158
159 /**********************************************************************/
160 template <typename AnyClass, typename IntegrandType, typename ...Args>
161 static void integrate(const AnyClass* const C, IntegrandType &intgrl, IntegrandType (AnyClass::*mfp)(const int&, const Args&... ) const, const Args&...args)
162 {
196
197 for(size_t k=0;k<qOrder;++k)
198 {
199 intgrl+=(C->*mfp)(k,args...) * weights(k);
200 }
201 }
202
203 /**********************************************************************/
204 template <typename AnyClass, typename ...Args>
205 static void execute(AnyClass* const C, void (AnyClass::*mfp)(const VectorDim&, const Args&...), const Args&...args)
206 {
209 for(size_t k=0;k<qOrder;++k)
210 {
211 (C->*mfp)(abscissa(k),args...);
212 }
213 }
214
215 /**********************************************************************/
216 template <typename AnyClass, typename ...Args>
217 static void execute(AnyClass* const C, void (AnyClass::*mfp)(const int&, const Args&...), const Args&...args)
218 {
221 for(size_t k=0;k<qOrder;++k)
222 {
223 (C->*mfp)(k,args...);
224 }
225 }
226
227
228 };
229
230
232 template<short unsigned int dim, size_t qOrder, template <short unsigned int, size_t> class QuadratureRule>
233// const Eigen::Matrix<double,dim,qOrder> Quadrature<dim,qOrder,QuadratureRule>::abscissas=QuadratureRule<dim,qOrder>::abcsissasAndWeights().template block<dim,qOrder>(0,0);
234 const Eigen::MatrixXd Quadrature<dim,qOrder,QuadratureRule>::abscissas=QuadratureRule<dim,qOrder>::abcsissasAndWeights().template block<dim,qOrder>(0,0);
235
237 template<short unsigned int dim, size_t qOrder, template <short unsigned int, size_t> class QuadratureRule>
238// const Eigen::Matrix<double,1,qOrder> Quadrature<dim,qOrder,QuadratureRule>::weights=QuadratureRule<dim,qOrder>::abcsissasAndWeights().template block<1,qOrder>(dim,0);
239 const Eigen::MatrixXd Quadrature<dim,qOrder,QuadratureRule>::weights=QuadratureRule<dim,qOrder>::abcsissasAndWeights().template block<1,qOrder>(dim,0);
240
241} // namespace model
242#endif
const Eigen::MatrixXd Quadrature< dim, qOrder, QuadratureRule >::abscissas
The static const member data abscissas is initialized only once when Quadrature<1,...
Definition Quadrature.h:234
A static class template for generating quadrature abcsissas and weights for arbitrary-order and Quadr...
Definition Quadrature.h:50
static const Eigen::MatrixXd weights
Definition Quadrature.h:63
static const VectorDim abscissa(const short unsigned int &k)
Definition Quadrature.h:73
static const double & weight(const short unsigned int &k)
Definition Quadrature.h:66
static constexpr size_t quadratureOrder
Definition Quadrature.h:52
static void integrate(const AnyClass *const C, IntegrandType &intgrl, IntegrandType(AnyClass::*mfp)(const int &, const Args &...) const, const Args &...args)
Definition Quadrature.h:161
static void integrate(IntegrandType(*fp)(const double &), IntegrandType &intgrl)
Definition Quadrature.h:81
static void execute(AnyClass *const C, void(AnyClass::*mfp)(const VectorDim &, const Args &...), const Args &...args)
Definition Quadrature.h:205
static void integrate(const AnyClass *const C, IntegrandType &intgrl, IntegrandType(AnyClass::*mfp)(const VectorDim &, const Args &...) const, const Args &...args)
Definition Quadrature.h:113
static void execute(AnyClass *const C, void(AnyClass::*mfp)(const int &, const Args &...), const Args &...args)
Definition Quadrature.h:217
static const Eigen::MatrixXd abscissas
Definition Quadrature.h:59
VectorDimTypeSelector< dim, qOrder >::VectorDim VectorDim
Definition Quadrature.h:55
static const VectorDim & abscissa(const short unsigned int &k, const Eigen::Matrix< double, 1, qOrder > &abscissas)
Definition Quadrature.h:36
static const VectorDim abscissa(const short unsigned int &k, const Eigen::Matrix< double, dim, qOrder > &abscissas)
Definition Quadrature.h:25
Eigen::Matrix< double, dim, 1 > VectorDim
Definition Quadrature.h:23
int k