1# ifndef _GMPOLY_EDGE_HPP
2# define _GMPOLY_EDGE_HPP
62 const MonomialScalarBasisEdge & basis1,
63 const MonomialScalarBasisEdge & basis2,
68template<
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>()) {
89template<
typename BasisType1,
typename BasisType2,
size_t N>
100 size_t dim1 = anc_gm.rows();
101 size_t dim2 = anc_gm.cols();
103 for (
size_t i=0;
i<N;
i++){
104 gm.block(
i*dim1,
i*dim2, dim1, dim2) = anc_gm;
110template<
typename BasisType>
113 return GramMatrix(E, basis, basis, mono_int_map);
119Eigen::MatrixXd
GMDer(
121 const MonomialScalarBasisEdge & basis1,
122 const MonomialScalarBasisEdge & basis2,
127template<
typename BasisType1,
typename BasisType2>
129 const BasisType1 & basis1,
130 const BasisType2 & basis2,
135 static_assert(useAncestor<BasisType1>() || useAncestor<BasisType2>(),
"No method to compute this Gram matrix");
137 if constexpr (!useAncestor<BasisType1>() && useAncestor<BasisType2>()) {
138 return transformGM(basis2,
'C',
GMDer(E, basis1, basis2.ancestor(), mono_int_map) );
139 }
else if constexpr (useAncestor<BasisType1>() && !useAncestor<BasisType2>()) {
140 return transformGM(basis1,
'R',
GMDer(E, basis1.ancestor(), basis2, mono_int_map) );
149template<
typename BasisType1,
typename BasisType2>
153 const BasisType2 & basis2,
157 return GMDer(E, basis1.
ancestor(), basis2, mono_int_map)/E.diam();
161template<
typename BasisType1,
typename BasisType2>
164 const BasisType1 & basis1,
169 return (
GMDer(E, basis2.
ancestor(), basis1, mono_int_map).transpose())/E.diam();
Basis for the space of gradients of polynomials.
Definition basis.hpp:1181
Vector family obtained by tensorization of a scalar family.
Definition basis.hpp:559
Compute max and min eigenvalues of all matrices for i
Definition compute_eigs.m:5
constexpr const ScalarFamilyType & ancestor() const
Return the ancestor (family that has been tensorized)
Definition basis.hpp:689
constexpr const BasisType & ancestor() const
Return the ancestor (basis that the gradient was taken of)
Definition basis.hpp:1227
size_t dimension() const
Return the dimension of the family.
Definition basis.hpp:595
std::vector< double > MonomialEdgeIntegralsType
Type for list of edge integrals of monomials.
Definition GMpoly_edge.hpp:34
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:76
MonomialEdgeIntegralsType IntegrateEdgeMonomials(const Edge &E, const size_t maxdeg)
Compute all integrals of edge monomials up to a total degree.
Definition GMpoly_edge.cpp:6
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:77
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:49
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:86
Definition ddr-klplate.hpp:27