@@ -15,10 +15,10 @@ class Laplacian
15
15
public:
16
16
Laplacian (
17
17
Mesh const & M,
18
- Eigen::Ref<IndexVectorX const > const & eg ,
19
- Eigen::Ref<MatrixX const > const & wg ,
20
- Eigen::Ref<MatrixX const > const & GNeg ,
21
- int dims );
18
+ Eigen::Ref<MatrixX const > const & detJe ,
19
+ Eigen::Ref<MatrixX const > const & GNe ,
20
+ int dims ,
21
+ int qOrder );
22
22
23
23
Laplacian (Laplacian const &) = delete ;
24
24
Laplacian& operator =(Laplacian const &) = delete ;
@@ -40,6 +40,9 @@ class Laplacian
40
40
int mMeshDims ;
41
41
int mMeshOrder ;
42
42
int mOrder ;
43
+ int mQuadratureOrder ;
44
+
45
+ static auto constexpr kMaxQuadratureOrder = 4 ;
43
46
44
47
private:
45
48
void * mLaplacian ;
@@ -53,52 +56,58 @@ void BindLaplacian(pybind11::module& m)
53
56
.def (
54
57
pyb::init<
55
58
Mesh const &,
56
- Eigen::Ref<IndexVectorX const > const &,
57
59
Eigen::Ref<MatrixX const > const &,
58
60
Eigen::Ref<MatrixX const > const &,
61
+ int ,
59
62
int >(),
60
63
pyb::arg (" mesh" ),
61
- pyb::arg (" eg" ),
62
- pyb::arg (" wg" ),
64
+ pyb::arg (" detJe" ),
63
65
pyb::arg (" GNe" ),
64
- pyb::arg (" dims" ) = 1 ,
66
+ pyb::arg (" dims" ) = 1 ,
67
+ pyb::arg (" quadrature_order" ) = 1 ,
65
68
" Construct the symmetric part of the Laplacian operator on mesh mesh, using "
66
- " precomputed shape function gradients GNeg evaluated at quadrature points g at "
67
- " elements eg with weights wg. The discretization is based on Galerkin projection. The "
68
- " dimensions dims can be set to accommodate vector-valued functions." )
69
+ " precomputed jacobian determinants detJe and shape function gradients GNe evaluated at "
70
+ " quadrature points given by the quadrature rule of order quadrature_order. The "
71
+ " discretization is based on Galerkin projection. The dimensions dims can be set to "
72
+ " accommodate vector-valued functions." )
69
73
.def_property (
70
74
" dims" ,
71
75
[](Laplacian const & L) { return L.dims (); },
72
76
[](Laplacian& L, int dims) { L.dims () = dims; })
73
77
.def_readonly (" order" , &Laplacian::mOrder )
78
+ .def_readonly (" quadrature_order" , &Laplacian::mQuadratureOrder )
74
79
.def_property (
75
- " deltag " ,
80
+ " deltaE " ,
76
81
[](Laplacian const & L) { return L.ElementLaplacians (); },
77
- [](Laplacian& L, Eigen::Ref<MatrixX const > const & deltag ) {
78
- L.ElementLaplacians () = deltag ;
82
+ [](Laplacian& L, Eigen::Ref<MatrixX const > const & deltaE ) {
83
+ L.ElementLaplacians () = deltaE ;
79
84
},
80
- " |#element nodes|x|#element nodes * #quad.pts. | matrix of element Laplacians" )
85
+ " |#element nodes|x|#element nodes * #elements | matrix of element Laplacians" )
81
86
.def_property_readonly (" shape" , &Laplacian::Shape)
82
87
.def (" to_matrix" , &Laplacian::ToMatrix);
83
88
}
84
89
85
90
Laplacian::Laplacian (
86
91
Mesh const & M,
87
- Eigen::Ref<IndexVectorX const > const & eg,
88
- Eigen::Ref<MatrixX const > const & wg,
92
+ Eigen::Ref<MatrixX const > const & detJe,
89
93
Eigen::Ref<MatrixX const > const & GNe,
90
- int dims)
94
+ int dims,
95
+ int qOrder)
91
96
: eMeshElement(M.eElement),
92
97
mMeshDims (M.mDims ),
93
98
mMeshOrder(M.mOrder ),
94
99
mOrder(),
100
+ mQuadratureOrder(),
95
101
mLaplacian(nullptr )
96
102
{
97
- M.Apply ([&]<pbat::fem::CMesh MeshType>(MeshType* mesh) {
98
- using LaplacianType = pbat::fem::SymmetricLaplacianMatrix<MeshType>;
99
- mLaplacian = new LaplacianType (*mesh, eg, wg, GNe, dims);
100
- mOrder = LaplacianType::kOrder ;
101
- });
103
+ M.ApplyWithQuadrature <kMaxQuadratureOrder >(
104
+ [&]<pbat::fem::CMesh MeshType, auto QuadratureOrder>(MeshType* mesh) {
105
+ using LaplacianType = pbat::fem::SymmetricLaplacianMatrix<MeshType, QuadratureOrder>;
106
+ mLaplacian = new LaplacianType (*mesh, detJe, GNe, dims);
107
+ mOrder = LaplacianType::kOrder ;
108
+ mQuadratureOrder = LaplacianType::kQuadratureOrder ;
109
+ },
110
+ qOrder);
102
111
}
103
112
104
113
CSCMatrix Laplacian::ToMatrix () const
@@ -120,20 +129,20 @@ std::tuple<Index, Index> Laplacian::Shape() const
120
129
121
130
MatrixX const & Laplacian::ElementLaplacians () const
122
131
{
123
- MatrixX* deltagPtr ;
132
+ MatrixX* deltaEPtr ;
124
133
Apply ([&]<class LaplacianType >(LaplacianType* laplacian) {
125
- deltagPtr = std::addressof (laplacian->deltag );
134
+ deltaEPtr = std::addressof (laplacian->deltaE );
126
135
});
127
- return *deltagPtr ;
136
+ return *deltaEPtr ;
128
137
}
129
138
130
139
MatrixX& Laplacian::ElementLaplacians ()
131
140
{
132
- MatrixX* deltagPtr ;
141
+ MatrixX* deltaEPtr ;
133
142
Apply ([&]<class LaplacianType >(LaplacianType* laplacian) {
134
- deltagPtr = std::addressof (laplacian->deltag );
143
+ deltaEPtr = std::addressof (laplacian->deltaE );
135
144
});
136
- return *deltagPtr ;
145
+ return *deltaEPtr ;
137
146
}
138
147
139
148
int const & Laplacian::dims () const
@@ -163,11 +172,16 @@ Laplacian::~Laplacian()
163
172
template <class Func >
164
173
void Laplacian::Apply (Func&& f) const
165
174
{
166
- ApplyToMesh (mMeshDims , mMeshOrder , eMeshElement, [&]<pbat::fem::CMesh MeshType>() {
167
- using LaplacianType = pbat::fem::SymmetricLaplacianMatrix<MeshType>;
168
- LaplacianType* laplacian = reinterpret_cast <LaplacianType*>(mLaplacian );
169
- f.template operator ()<LaplacianType>(laplacian);
170
- });
175
+ ApplyToMeshWithQuadrature<kMaxQuadratureOrder >(
176
+ mMeshDims ,
177
+ mMeshOrder ,
178
+ eMeshElement,
179
+ mQuadratureOrder ,
180
+ [&]<pbat::fem::CMesh MeshType, auto QuadratureOrder>() {
181
+ using LaplacianType = pbat::fem::SymmetricLaplacianMatrix<MeshType, QuadratureOrder>;
182
+ LaplacianType* laplacian = reinterpret_cast <LaplacianType*>(mLaplacian );
183
+ f.template operator ()<LaplacianType>(laplacian);
184
+ });
171
185
}
172
186
173
187
} // namespace fem
0 commit comments