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;
83template<
typename BasisType1,
typename BasisType2>
106 const MonomialScalarBasisFace &
basis1,
107 const MonomialScalarBasisFace &
basis2,
112template<
typename BasisType>
119template<
typename BasisType1,
typename BasisType2,
size_t N>
127 Eigen::MatrixXd
gm = Eigen::MatrixXd::Zero(
basis1.dimension(),
basis2.dimension());
133 for (
size_t i=0;
i<
N;
i++){
140template<
typename BasisType1,
typename BasisType2>
157 for (
size_t i=0;
i<2;
i++) {
158 for (
size_t j=0;
j<2;
j++) {
169 const RolyComplBasisFace &
basis1,
170 const RolyComplBasisFace &
basis2,
177 const GolyComplBasisFace &
basis1,
178 const GolyComplBasisFace &
basis2,
183template<
typename BasisType>
194 Eigen::MatrixXd
gm = Eigen::MatrixXd::Zero(
dim1, 2*
dim2);
204 for (
size_t k=0;
k<2;
k++) {
205 for (
size_t j=0;
j<2;
j++) {
210 return F.diam() *
gm;
214template<
typename BasisType>
235template<
typename BasisType>
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,
269template<
typename BasisType1,
typename BasisType2>
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) {
291template<
typename BasisType1,
typename BasisType2>
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) {
315template<
typename BasisType1,
typename BasisType2>
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);
340template<
typename BasisType1,
typename BasisType2>
352 Eigen::MatrixXd
gm = Eigen::MatrixXd::Zero(
dim1,
dim2*2);
361 Eigen::Matrix<double, 2, 3>
JF =
mono_P0_F.jacobian();
368 for (
size_t k=0;
k<2;
k++) {
369 for (
size_t j=0;
j<2;
j++) {
378template<
typename BasisType1,
typename BasisType2>
391template<
typename BasisType1,
typename BasisType2>
392typename boost::disable_if<boost::is_same<BasisType2, MonomialFaceIntegralsType>, Eigen::MatrixXd>::type
GramMatrix(
403template<
typename BasisType1,
typename Basis2>
416template<
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,
448template<
typename BasisType1,
typename BasisType2>
Basis for the space of curls of polynomials.
Definition basis.hpp:1318
Basis (or rather family) of divergence of an existing basis.
Definition basis.hpp:1381
Scalar monomial basis on a face.
Definition basis.hpp:226
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:1608
Vector family for polynomial functions that are tangent to a certain place (determined by the generat...
Definition basis.hpp:948
Vector family obtained by tensorization of a scalar family.
Definition basis.hpp:610
@ Matrix
Definition basis.hpp:67
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:41
MeshND::VectorRd< 2 > VectorRd
Definition Mesh2D.hpp:14
Hash function for VectorZd type.
Definition GMpoly_face.hpp:42