@@ -15,10 +15,10 @@ class Laplacian
15
15
public:
16
16
Laplacian (
17
17
Mesh const & M,
18
- Eigen::Ref<MatrixX const > const & detJe ,
19
- Eigen::Ref<MatrixX const > const & GNe ,
20
- int dims ,
21
- int qOrder );
18
+ Eigen::Ref<IndexVectorX const > const & eg ,
19
+ Eigen::Ref<MatrixX const > const & wg ,
20
+ Eigen::Ref<MatrixX const > const & GNeg ,
21
+ int dims );
22
22
23
23
Laplacian (Laplacian const &) = delete ;
24
24
Laplacian& operator =(Laplacian const &) = delete ;
@@ -40,9 +40,6 @@ class Laplacian
40
40
int mMeshDims ;
41
41
int mMeshOrder ;
42
42
int mOrder ;
43
- int mQuadratureOrder ;
44
-
45
- static auto constexpr kMaxQuadratureOrder = 4 ;
46
43
47
44
private:
48
45
void * mLaplacian ;
@@ -56,58 +53,52 @@ void BindLaplacian(pybind11::module& m)
56
53
.def (
57
54
pyb::init<
58
55
Mesh const &,
56
+ Eigen::Ref<IndexVectorX const > const &,
59
57
Eigen::Ref<MatrixX const > const &,
60
58
Eigen::Ref<MatrixX const > const &,
61
- int ,
62
59
int >(),
63
60
pyb::arg (" mesh" ),
64
- pyb::arg (" detJe" ),
61
+ pyb::arg (" eg" ),
62
+ pyb::arg (" wg" ),
65
63
pyb::arg (" GNe" ),
66
- pyb::arg (" dims" ) = 1 ,
67
- pyb::arg (" quadrature_order" ) = 1 ,
64
+ pyb::arg (" dims" ) = 1 ,
68
65
" Construct the symmetric part of the Laplacian operator on mesh mesh, using "
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." )
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." )
73
69
.def_property (
74
70
" dims" ,
75
71
[](Laplacian const & L) { return L.dims (); },
76
72
[](Laplacian& L, int dims) { L.dims () = dims; })
77
73
.def_readonly (" order" , &Laplacian::mOrder )
78
- .def_readonly (" quadrature_order" , &Laplacian::mQuadratureOrder )
79
74
.def_property (
80
- " deltaE " ,
75
+ " deltag " ,
81
76
[](Laplacian const & L) { return L.ElementLaplacians (); },
82
- [](Laplacian& L, Eigen::Ref<MatrixX const > const & deltaE ) {
83
- L.ElementLaplacians () = deltaE ;
77
+ [](Laplacian& L, Eigen::Ref<MatrixX const > const & deltag ) {
78
+ L.ElementLaplacians () = deltag ;
84
79
},
85
- " |#element nodes|x|#element nodes * #elements | matrix of element Laplacians" )
80
+ " |#element nodes|x|#element nodes * #quad.pts. | matrix of element Laplacians" )
86
81
.def_property_readonly (" shape" , &Laplacian::Shape)
87
82
.def (" to_matrix" , &Laplacian::ToMatrix);
88
83
}
89
84
90
85
Laplacian::Laplacian (
91
86
Mesh const & M,
92
- Eigen::Ref<MatrixX const > const & detJe,
87
+ Eigen::Ref<IndexVectorX const > const & eg,
88
+ Eigen::Ref<MatrixX const > const & wg,
93
89
Eigen::Ref<MatrixX const > const & GNe,
94
- int dims,
95
- int qOrder)
90
+ int dims)
96
91
: eMeshElement(M.eElement),
97
92
mMeshDims (M.mDims ),
98
93
mMeshOrder(M.mOrder ),
99
94
mOrder(),
100
- mQuadratureOrder(),
101
95
mLaplacian(nullptr )
102
96
{
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);
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
+ });
111
102
}
112
103
113
104
CSCMatrix Laplacian::ToMatrix () const
@@ -129,20 +120,20 @@ std::tuple<Index, Index> Laplacian::Shape() const
129
120
130
121
MatrixX const & Laplacian::ElementLaplacians () const
131
122
{
132
- MatrixX* deltaEPtr ;
123
+ MatrixX* deltagPtr ;
133
124
Apply ([&]<class LaplacianType >(LaplacianType* laplacian) {
134
- deltaEPtr = std::addressof (laplacian->deltaE );
125
+ deltagPtr = std::addressof (laplacian->deltag );
135
126
});
136
- return *deltaEPtr ;
127
+ return *deltagPtr ;
137
128
}
138
129
139
130
MatrixX& Laplacian::ElementLaplacians ()
140
131
{
141
- MatrixX* deltaEPtr ;
132
+ MatrixX* deltagPtr ;
142
133
Apply ([&]<class LaplacianType >(LaplacianType* laplacian) {
143
- deltaEPtr = std::addressof (laplacian->deltaE );
134
+ deltagPtr = std::addressof (laplacian->deltag );
144
135
});
145
- return *deltaEPtr ;
136
+ return *deltagPtr ;
146
137
}
147
138
148
139
int const & Laplacian::dims () const
@@ -172,16 +163,11 @@ Laplacian::~Laplacian()
172
163
template <class Func >
173
164
void Laplacian::Apply (Func&& f) const
174
165
{
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
- });
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
+ });
185
171
}
186
172
187
173
} // namespace fem
0 commit comments