1# ifndef _GMPOLY_CELL_HPP
2# define _GMPOLY_CELL_HPP
17#include <unordered_map>
47 constexpr size_t b = 100;
48 return p(0) + p(1) * b;
76template<
typename BasisType>
79 const Eigen::MatrixXd & anc_GM
83 return family_basis.
matrix() * anc_GM;
85 return anc_GM * (family_basis.
matrix()).transpose();
90template<
typename BasisType>
93 const Eigen::MatrixXd & anc_GM
97 return anc_GM.topRows(restr_basis.
dimension());
99 return anc_GM.leftCols(restr_basis.
dimension());
104template<
typename BasisType>
107 const Eigen::MatrixXd & anc_GM
111 return anc_GM.bottomRows(shifted_basis.
dimension());
113 return anc_GM.rightCols(shifted_basis.
dimension());
130 const MonomialScalarBasisCell & basis1,
131 const MonomialScalarBasisCell & basis2,
136template<
typename BasisType>
143template<
typename BasisType1,
typename BasisType2,
size_t N>
154 size_t dim1 = anc_gm.rows();
155 size_t dim2 = anc_gm.cols();
157 for (
size_t i=0;
i<N;
i++){
158 gm.block(
i*dim1,
i*dim2, dim1, dim2) = anc_gm;
166 const RolyComplBasisCell & basis1,
167 const RolyComplBasisCell & basis2,
172template<
typename BasisType1,
size_t N>
180 size_t dim1 = rolycompl_basis.
dimension();
182 Eigen::MatrixXd gm = Eigen::MatrixXd::Zero(dim1, dim2);
188 for (
size_t m=0; m<N; m++){
195template<
typename BasisType1,
size_t N>
203 return GramMatrix(
T, rolycompl_basis, tens_family, mono_int_map).transpose();
209 const GolyComplBasisCell & basis1,
210 const GolyComplBasisCell & basis2,
217 const RolyComplBasisCell & rolycompl_basis,
218 const MonomialScalarBasisCell & mono_basis,
224template<
typename BasisType>
228 const BasisType & basis2,
234 static_assert(BasisType::hasAncestor,
"No method to compute this Gram matrix of derivatives");
239template<
typename BasisType>
245 if constexpr(BasisType::hasAncestor){
246 return (BasisType::tensorRank == BasisType::AncestorType::tensorRank);
253template<
typename BasisType1,
typename BasisType2>
255 const BasisType1 & basis1,
256 const BasisType2 & basis2,
261 static_assert(useAncestor<BasisType1>() || useAncestor<BasisType2>(),
"No method to compute this Gram matrix");
263 if constexpr (!useAncestor<BasisType1>() && useAncestor<BasisType2>()) {
265 }
else if constexpr (useAncestor<BasisType1>() && !useAncestor<BasisType2>()) {
279 const MonomialScalarBasisCell & basis1,
280 const MonomialScalarBasisCell & basis2,
288 const MonomialScalarBasisCell & basis1,
289 const MonomialScalarBasisCell & basis2,
296template<
typename BasisType1,
typename BasisType2>
299 const BasisType1 & basis1,
300 const BasisType2 & basis2,
306 static_assert(BasisType1::hasAncestor || BasisType2::hasAncestor,
"No method to compute this Gram matrix of derivatives");
308 if constexpr (!BasisType1::hasAncestor && BasisType2::hasAncestor) {
310 }
else if constexpr (BasisType1::hasAncestor && !BasisType2::hasAncestor) {
318template<
typename BasisType1,
typename BasisType2>
321 const BasisType1 & basis1,
322 const BasisType2 & basis2,
329 static_assert(BasisType1::hasAncestor || BasisType2::hasAncestor,
"No method to compute this Gram matrix of derivatives");
331 if constexpr (!BasisType1::hasAncestor && BasisType2::hasAncestor) {
333 }
else if constexpr (BasisType1::hasAncestor && !BasisType2::hasAncestor) {
345template<
typename BasisType1,
typename BasisType2,
size_t N>
355 Eigen::MatrixXd gm = Eigen::MatrixXd::Zero(dim1, dim2);
361 for (
size_t m=0; m<N; m++){
369template<
typename BasisType1,
typename BasisType2,
size_t N>
377 return GramMatrix(
T, grad_basis, tens_family, mono_int_map).transpose();
382template<
typename BasisType1,
typename BasisType2>
392 Eigen::MatrixXd gm = Eigen::MatrixXd::Zero(dim1, dim2);
395 size_t totaldegree = grad_basis1.
ancestor().max_degree()+grad_basis2.
ancestor().max_degree()-2;
398 for (
size_t m=0; m<2; m++){
401 return gm/std::pow(
T.diam(), 2);
407template<
typename BasisType1,
typename BasisType2>
418 size_t totaldegree = basis1.
ancestor().max_degree()+basis2.
ancestor().max_degree()-2;
419 Eigen::MatrixXd gm = Eigen::MatrixXd::Zero(dim1,dim2);
424 for (
size_t m=0; m<2; m++){
428 return gm/std::pow(
T.diam(), 2);
433template<
typename BasisType1,
typename BasisType2>
443 Eigen::MatrixXd gm = Eigen::MatrixXd::Zero(dim1, dim2);
457template<
typename BasisType1,
typename BasisType2,
size_t N>
465 return GramMatrix(
T, curl_basis, tens_family, mono_int_map).transpose();
470template<
typename BasisType1,
typename BasisType2>
471typename boost::disable_if<boost::is_same<BasisType2, MonomialCellIntegralsType>, Eigen::MatrixXd>::type
GramMatrix(
474 const BasisType2 & basis2,
482template<
typename BasisType1,
typename Basis2>
485 const BasisType1 & basis1,
494template<
typename BasisType1>
504 Eigen::MatrixXd gm = Eigen::MatrixXd::Zero(dim1, dim2);
510 for (
size_t i = 0;
i < 2;
i++) {
520 const RolyComplBasisCell & basis1,
521 const MonomialScalarBasisCell & basis2,
526template<
typename BasisType1,
typename BasisType2>
529 const BasisType1 & basis1,
530 const BasisType2 & basis2,
535 static_assert(useAncestor<BasisType1>() || useAncestor<BasisType2>(),
"No method to compute this Gram matrix");
537 if constexpr (!useAncestor<BasisType1>() && useAncestor<BasisType2>()) {
539 }
else if constexpr (useAncestor<BasisType1>() && !useAncestor<BasisType2>()) {
549 template<
typename BasisType1,
typename BasisType2,
size_t N>
560 size_t dim1 = anc_gm.rows();
561 size_t dim2 = anc_gm.cols();
563 for (
size_t i=0;
i<N*N;
i++){
564 gm.block(
i*dim1,
i*dim2, dim1, dim2) = anc_gm;
570template<
typename BasisType1,
typename BasisType2>
581 BasisType1 scalar_basis1 = basis1.
ancestor().ancestor();
582 BasisType2 scalar_basis2 = basis2.
ancestor();
583 size_t dim1 = scalar_basis1.dimension();
584 size_t dim2 = scalar_basis2.dimension();
587 size_t totaldegree = scalar_basis1.max_degree() + scalar_basis2.max_degree();
593 gm.block(
j*
dimspace*dim1 +
i*dim1,
i*dim2, dim1, dim2) = gm_anc;
601 template<
typename BasisType1,
typename BasisType2>
612 BasisType1 scalar_basis1 = basis1.
ancestor().ancestor();
613 BasisType2 scalar_basis2 = basis2.
ancestor();
614 size_t dim1 = scalar_basis1.dimension();
615 size_t dim2 = scalar_basis2.dimension();
618 size_t totaldegree = scalar_basis1.max_degree() + scalar_basis2.max_degree();
624 gm.block(
i*dim1,
j*
dimspace*dim2 +
i*dim2, dim1, dim2) = gm_anc;
632 template<
typename BasisType1,
typename BasisType2>
640 return GramMatrix(
T, basis2, basis1, mono_int_map).transpose();
644 template<
typename BasisType1,
typename BasisType2,
size_t N>
655 BasisType1 scalar_basis1 = basis1.
ancestor().ancestor();
656 BasisType2 scalar_basis2 = basis2.
ancestor().ancestor();
657 size_t dim1 = scalar_basis1.dimension();
658 size_t dim2 = scalar_basis2.dimension();
661 size_t totaldegree = scalar_basis1.max_degree() + scalar_basis2.max_degree();
665 Eigen::MatrixXd gm_anc = Eigen::MatrixXd::Zero(dim1, dim2);
666 for (
size_t k=0; k <
dimspace; k++){
670 for (
size_t i=0;
i < N;
i++){
671 gm.block(
i*dim1,
i*dim2, dim1, dim2) = gm_anc;
674 return gm/(std::pow(
T.diam(),2));
Basis for the space of curls (vectorial rot) of polynomials.
Definition basis.hpp:1243
Basis (or rather family) of divergence of an existing basis.
Definition basis.hpp:1306
Basis for the space of gradients of polynomials.
Definition basis.hpp:1181
Matrix family obtained from a scalar family.
Definition basis.hpp:719
Scalar monomial basis on a cell.
Definition basis.hpp:166
Generate a basis restricted to the first "dimension" functions.
Definition basis.hpp:1071
Basis for the complement R^{c,k}(T) in P^k(T)^2 of the range of the vectorial rotational on a face.
Definition basis.hpp:1493
Generate a basis where the function indices are shifted.
Definition basis.hpp:961
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
size_t dimension() const
Compute the dimension of the basis.
Definition basis.hpp:1215
size_t dimension() const
Return the dimension of the family.
Definition basis.hpp:767
Eigen::Vector2i VectorZd
Definition basis.hpp:56
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 basis.
Definition basis.hpp:1107
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition basis.hpp:695
size_t dimension() const
Compute the dimension of the basis.
Definition basis.hpp:1520
size_t dimension() const
Return the dimension of the basis.
Definition basis.hpp:995
size_t dimension() const
Compute the dimension of the basis.
Definition basis.hpp:193
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition basis.hpp:211
constexpr int dimspace
Dimension, and generic types for vector in correct dimension (makes it easier to translate a code bet...
Definition basis.hpp:53
constexpr const BasisType & ancestor() const
Return the ancestor (basis that the gradient was taken of)
Definition basis.hpp:1288
constexpr const BasisType & ancestor() const
Return the ancestor (basis that the gradient was taken of)
Definition basis.hpp:1350
size_t dimension() const
Compute the dimension of the basis.
Definition basis.hpp:1276
size_t dimension() const
Return the dimension of the family.
Definition basis.hpp:595
const ScalarFamilyType & ancestor() const
Return the ancestor (family that has been tensorized)
Definition basis.hpp:827
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition basis.hpp:1532
const Eigen::MatrixXd & matrix() const
Return the coefficient matrix.
Definition basis.hpp:508
std::unordered_map< VectorZd, double, VecHash > MonomialCellIntegralsType
Type for list of integrals of monomials.
Definition GMpoly_cell.hpp:53
constexpr bool useAncestor()
Determines if the ancestor of a basis will be used to compute a Gram matrix for this basis.
Definition GMpoly_cell.hpp:240
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
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:139
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
size_t operator()(const VectorZd &p) const
Definition GMpoly_cell.hpp:45
Eigen::MatrixXd GramMatrixDiv(const Cell &T, const TensorizedVectorFamily< BasisType1, 2 > &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:495
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:193
MonomialCellIntegralsType IntegrateCellMonomials(const Cell &T, const size_t maxdeg)
Compute all integrals on a cell of monomials up to a total degree, using vertex values.
Definition GMpoly_cell.cpp:7
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
if(strcmp(field, 'real')) % real valued entries T
Definition mmread.m:93
for j
Definition mmread.m:174
Definition ddr-klplate.hpp:27
Hash function for VectorZd type.
Definition GMpoly_cell.hpp:44