1 # ifndef _GMPOLY_EDGE_HPP
2 # define _GMPOLY_EDGE_HPP
62 const MonomialScalarBasisEdge & basis1,
63 const MonomialScalarBasisEdge & basis2,
68 template<
typename BasisType1,
typename BasisType2>
70 const BasisType1 & basis1,
71 const BasisType2 & basis2,
76 static_assert(useAncestor<BasisType1>() || useAncestor<BasisType2>(),
"No method to compute this Gram matrix");
78 if constexpr (!useAncestor<BasisType1>() && useAncestor<BasisType2>()) {
80 }
else if constexpr (useAncestor<BasisType1>() && !useAncestor<BasisType2>()) {
89 template<
typename BasisType>
92 return GramMatrix(E, basis, basis, mono_int_map);
98 Eigen::MatrixXd
GMDer(
100 const MonomialScalarBasisEdge & basis1,
101 const MonomialScalarBasisEdge & basis2,
106 template<
typename BasisType1,
typename BasisType2>
108 const BasisType1 & basis1,
109 const BasisType2 & basis2,
114 static_assert(useAncestor<BasisType1>() || useAncestor<BasisType2>(),
"No method to compute this Gram matrix");
116 if constexpr (!useAncestor<BasisType1>() && useAncestor<BasisType2>()) {
117 return transformGM(basis2,
'C',
GMDer(E, basis1, basis2.ancestor(), mono_int_map) );
118 }
else if constexpr (useAncestor<BasisType1>() && !useAncestor<BasisType2>()) {
119 return transformGM(basis1,
'R',
GMDer(E, basis1.ancestor(), basis2, mono_int_map) );
128 template<
typename BasisType1,
typename BasisType2>
132 const BasisType2 & basis2,
136 return GMDer(E, basis1.
ancestor(), basis2, mono_int_map)/E.diam();
140 template<
typename BasisType1,
typename BasisType2>
143 const BasisType1 & basis1,
148 return (
GMDer(E, basis2.
ancestor(), basis1, mono_int_map).transpose())/E.diam();
Basis for the space of gradients of polynomials.
Definition: basis.hpp:1228
constexpr const BasisType & ancestor() const
Return the ancestor (basis that the gradient was taken of)
Definition: basis.hpp:1273
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
Eigen::MatrixXd GMDer(const Edge &E, const MonomialScalarBasisEdge &basis1, const MonomialScalarBasisEdge &basis2, MonomialEdgeIntegralsType mono_int_map={})
Computes the Gram Matrix of the derivative of a monomial basis with another monomial basis.
Definition: GMpoly_edge.cpp:52
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
MonomialEdgeIntegralsType IntegrateEdgeMonomials(const Edge &E, const int maxdeg)
Compute all integrals of edge monomials up to a total degree.
Definition: GMpoly_edge.cpp:6
std::vector< double > MonomialEdgeIntegralsType
Type for list of edge integrals of monomials.
Definition: GMpoly_edge.hpp:34
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
Definition: ddr-magnetostatics.hpp:40
MeshND::Edge< 2 > Edge
Definition: Mesh2D.hpp:11