1 # ifndef _GMPOLY_FACE_HPP
2 # define _GMPOLY_FACE_HPP
17 #include <unordered_map>
45 constexpr
size_t b = 100;
46 return p(0) + p(1) * b;
83 template<
typename BasisType1,
typename BasisType2>
85 const BasisType1 & basis1,
86 const BasisType2 & basis2,
91 static_assert(useAncestor<BasisType1>() || useAncestor<BasisType2>(),
"No method to compute this Gram matrix");
93 if constexpr (!useAncestor<BasisType1>() && useAncestor<BasisType2>()) {
95 }
else if constexpr (useAncestor<BasisType1>() && !useAncestor<BasisType2>()) {
106 const MonomialScalarBasisFace & basis1,
107 const MonomialScalarBasisFace & basis2,
112 template<
typename BasisType>
115 return GramMatrix(F, basis, basis, mono_int_map);
119 template<
typename BasisType1,
typename BasisType2,
size_t N>
130 size_t dim1 = anc_gm.rows();
131 size_t dim2 = anc_gm.cols();
133 for (
size_t i=0; i<N; i++){
134 gm.block(i*dim1, i*dim2, dim1, dim2) = anc_gm;
140 template<
typename BasisType1,
typename BasisType2>
151 size_t dim1 = anc_gm.rows();
152 size_t dim2 = anc_gm.cols();
154 Eigen::Matrix<double, 2, 3> generators1 = basis1.
generators();
155 Eigen::Matrix<double, 2, 3> generators2 = basis2.
generators();
157 for (
size_t i=0; i<2; i++) {
158 for (
size_t j=0; j<2; j++) {
159 gm.block(i*dim1, j*dim2, dim1, dim2) = generators1.row(i).dot(generators2.row(j)) * anc_gm;
169 const RolyComplBasisFace & basis1,
170 const RolyComplBasisFace & basis2,
177 const GolyComplBasisFace & basis1,
178 const GolyComplBasisFace & basis2,
183 template<
typename BasisType>
194 Eigen::MatrixXd gm = Eigen::MatrixXd::Zero(dim1, 2*dim2);
200 Eigen::Matrix<double, 2, 3> jacobian1 = basis1.
jacobian();
201 Eigen::Matrix<double, 2, 3> generators2 = basis2.
generators();
202 Eigen::Matrix2d W = jacobian1 * generators2.transpose();
204 for (
size_t k=0; k<2; k++) {
205 for (
size_t j=0; j<2; j++) {
206 gm.block(0, j*dim2, dim1, dim2) += W(k,j) * gmrs[k];
210 return F.diam() * gm;
214 template<
typename BasisType>
222 return GramMatrix(F, basis2, basis1, mono_int_map).transpose();
228 const RolyComplBasisFace & rolycompl_basis,
229 const MonomialScalarBasisFace & mono_basis,
235 template<
typename BasisType>
239 const BasisType & basis2,
245 static_assert(BasisType::hasAncestor,
"No method to compute this Gram matrix of derivatives");
252 const MonomialScalarBasisFace & basis1,
253 const MonomialScalarBasisFace & basis2,
261 const MonomialScalarBasisFace & basis1,
262 const MonomialScalarBasisFace & basis2,
269 template<
typename BasisType1,
typename BasisType2>
272 const BasisType1 & basis1,
273 const BasisType2 & basis2,
279 static_assert(BasisType1::hasAncestor || BasisType2::hasAncestor,
"No method to compute this Gram matrix of derivatives");
281 if constexpr (!BasisType1::hasAncestor && BasisType2::hasAncestor) {
283 }
else if constexpr (BasisType1::hasAncestor && !BasisType2::hasAncestor) {
291 template<
typename BasisType1,
typename BasisType2>
294 const BasisType1 & basis1,
295 const BasisType2 & basis2,
302 static_assert(BasisType1::hasAncestor || BasisType2::hasAncestor,
"No method to compute this Gram matrix of derivatives");
304 if constexpr (!BasisType1::hasAncestor && BasisType2::hasAncestor) {
306 }
else if constexpr (BasisType1::hasAncestor && !BasisType2::hasAncestor) {
315 template<
typename BasisType1,
typename BasisType2>
326 size_t totaldegree = basis1.
ancestor().max_degree()+basis2.
ancestor().max_degree()-2;
327 Eigen::MatrixXd gm = Eigen::MatrixXd::Zero(dim1,dim2);
332 for (
size_t m=0; m<2; m++){
336 return gm/std::pow(F.diam(), 2);
340 template<
typename BasisType1,
typename BasisType2>
352 Eigen::MatrixXd gm = Eigen::MatrixXd::Zero(dim1,dim2*2);
360 MonomialScalarBasisFace mono_P0_F(F, 0);
361 Eigen::Matrix<double, 2, 3> JF = mono_P0_F.jacobian();
363 Eigen::Matrix<double, 2, 3> generators2 = basis2.
generators();
365 W.col(0) = JF * nF.cross(generators2.row(0));
366 W.col(1) = JF * nF.cross(generators2.row(1));
368 for (
size_t k=0; k<2; k++) {
369 for (
size_t j=0; j<2; j++) {
370 gm.block(0, j*dim2, dim1, dim2) += W(k,j) * gmd[k];
378 template<
typename BasisType1,
typename BasisType2>
386 return GramMatrix(F, basis2, basis1, mono_int_map).transpose();
391 template<
typename BasisType1,
typename BasisType2>
392 typename boost::disable_if<boost::is_same<BasisType2, MonomialFaceIntegralsType>, Eigen::MatrixXd>::type
GramMatrix(
395 const BasisType2 & basis2,
403 template<
typename BasisType1,
typename Basis2>
406 const BasisType1 & basis1,
416 template<
typename BasisType1>
426 Eigen::MatrixXd gm = Eigen::MatrixXd::Zero(dim1, dim2);
432 for (
size_t i = 0; i < 2; i++) {
442 const RolyComplBasisFace & basis1,
443 const MonomialScalarBasisFace & basis2,
448 template<
typename BasisType1,
typename BasisType2>
451 const BasisType1 & basis1,
452 const BasisType2 & basis2,
457 static_assert(useAncestor<BasisType1>() || useAncestor<BasisType2>(),
"No method to compute this Gram matrix");
459 if constexpr (!useAncestor<BasisType1>() && useAncestor<BasisType2>()) {
461 }
else if constexpr (useAncestor<BasisType1>() && !useAncestor<BasisType2>()) {
Basis for the space of curls of polynomials.
Definition: basis.hpp:1290
Basis (or rather family) of divergence of an existing basis.
Definition: basis.hpp:1353
Scalar monomial basis on a face.
Definition: basis.hpp:225
Basis for the complement R^{c,k}(F) in P^k(F)^2 of the range of the vectorial rotational on a face.
Definition: basis.hpp:1580
Vector family for polynomial functions that are tangent to a certain place (determined by the generat...
Definition: basis.hpp:920
Vector family obtained by tensorization of a scalar family.
Definition: basis.hpp:609
size_t dimension() const
Return the dimension of the family.
Definition: basis.hpp:956
size_t dimension() const
Return the dimension of the family.
Definition: basis.hpp:640
constexpr const ScalarFamilyType & ancestor() const
Return the ancestor (family that has been tensorized)
Definition: basis.hpp:747
constexpr const BasisType & ancestor() const
Return the ancestor (basis that the gradient was taken of)
Definition: basis.hpp:1335
size_t dimension() const
Dimension of the basis.
Definition: basis.hpp:253
constexpr const BasisType & ancestor() const
Return the ancestor (basis that the gradient was taken of)
Definition: basis.hpp:1398
constexpr const ScalarFamilyType & ancestor() const
Return the ancestor (family used for the tangent)
Definition: basis.hpp:982
const JacobianType & jacobian() const
Return the Jacobian of the coordinate system transformation.
Definition: basis.hpp:1620
Eigen::Matrix< double, 2, dimspace > generators() const
Returns the generators of the basis functions.
Definition: basis.hpp:994
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition: basis.hpp:271
size_t dimension() const
Dimension of the basis.
Definition: basis.hpp:1608
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition: basis.hpp:988
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition: basis.hpp:1626
size_t dimension() const
Compute the dimension of the basis.
Definition: basis.hpp:1323
Eigen::MatrixXd GramMatrix(const Cell &T, const MonomialScalarBasisCell &basis1, const MonomialScalarBasisCell &basis2, MonomialCellIntegralsType mono_int_map={})
Computes the Gram Matrix of a pair of local scalar monomial bases.
Definition: GMpoly_cell.cpp:170
MonomialFaceIntegralsType IntegrateFaceMonomials(const Face &F, const int maxdeg)
Compute all integrals on a face of face monomials up to a total degree.
Definition: GMpoly_face.cpp:67
Eigen::MatrixXd GramMatrixDiv(const Cell &T, const TensorizedVectorFamily< BasisType1, N > &basis1, const MonomialScalarBasisCell &basis2, MonomialCellIntegralsType mono_int_map={})
Template to compute the Gram Matrix of a Divergence<Tensorized> basis and a monomial scalar basis.
Definition: GMpoly_cell.hpp:903
std::unordered_map< Eigen::Vector2i, double, VecFaceHash > MonomialFaceIntegralsType
Type for list of face integrals of monomials.
Definition: GMpoly_face.hpp:51
Eigen::MatrixXd GMScalarDerivative(const Cell &T, const MonomialScalarBasisCell &basis1, const MonomialScalarBasisCell &basis2, const size_t m, MonomialCellIntegralsType mono_int_map={})
Computes the Gram Matrix of a pair of local scalar monomial bases, taking a partial derivative of the...
Definition: GMpoly_cell.cpp:244
MonomialCellIntegralsType CheckIntegralsDegree(const Cell &T, const size_t degree, const MonomialCellIntegralsType &mono_int_map={})
Checks if the degree of an existing list of monomial integrals is sufficient, other re-compute and re...
Definition: GMpoly_cell.cpp:160
size_t operator()(const Eigen::Vector2i &p) const
Definition: GMpoly_face.hpp:43
Eigen::MatrixXd GMRolyComplScalar(const Cell &T, const RolyComplBasisCell &rolycompl_basis, const MonomialScalarBasisCell &mono_basis, const size_t m, MonomialCellIntegralsType mono_int_map={})
Computes the Gram Matrix of the mth component of a RolyCompl Basis and a monomial basis.
Definition: GMpoly_cell.cpp:298
Eigen::MatrixXd transformGM(const Family< BasisType > &family_basis, const char RC, const Eigen::MatrixXd &anc_GM)
Transforms a Gram Matrix from an ancestor to a family basis.
Definition: GMpoly_cell.hpp:85
std::vector< MonomialFaceIntegralsType > IntegrateFaceMonomials_onEdges(const Face &F, const size_t maxdeg)
Compute all integrals, on the edges of a face, of the face monomials up to a total degree.
Definition: GMpoly_face.cpp:6
Definition: ddr-magnetostatics.hpp:40
MeshND::VectorRd< 2 > VectorRd
Definition: Mesh2D.hpp:14
MeshND::Face< 2 > Face
Definition: Mesh2D.hpp:12
Hash function for VectorZd type.
Definition: GMpoly_face.hpp:42