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
90template<
typename BasisType>
93 const Eigen::MatrixXd &
anc_GM
104template<
typename BasisType>
107 const Eigen::MatrixXd &
anc_GM
130 const MonomialScalarBasisCell &
basis1,
131 const MonomialScalarBasisCell &
basis2,
136template<
typename BasisType>
143template<
typename BasisType1,
typename BasisType2,
size_t N>
151 Eigen::MatrixXd
gm = Eigen::MatrixXd::Zero(
basis1.dimension(),
basis2.dimension());
157 for (
size_t i=0;
i<
N;
i++){
166 const RolyComplBasisCell &
basis1,
167 const RolyComplBasisCell &
basis2,
172template<
typename BasisType1,
size_t N>
182 Eigen::MatrixXd
gm = Eigen::MatrixXd::Zero(
dim1,
dim2);
188 for (
size_t m=0;
m<
N;
m++){
195template<
typename BasisType1,
size_t N>
209 const GolyComplBasisCell &
basis1,
210 const GolyComplBasisCell &
basis2,
224template<
typename BasisType>
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>
279 const MonomialScalarBasisCell &
basis1,
280 const MonomialScalarBasisCell &
basis2,
288 const MonomialScalarBasisCell &
basis1,
289 const MonomialScalarBasisCell &
basis2,
296template<
typename BasisType1,
typename BasisType2>
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>
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>
382template<
typename BasisType1,
typename BasisType2>
392 Eigen::MatrixXd
gm = Eigen::MatrixXd::Zero(
dim1,
dim2);
398 for (
size_t m=0;
m<2;
m++){
401 return gm/std::pow(
T.diam(), 2);
407template<
typename BasisType1,
typename BasisType2>
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>
470template<
typename BasisType1,
typename BasisType2>
471typename boost::disable_if<boost::is_same<BasisType2, MonomialCellIntegralsType>, Eigen::MatrixXd>::type
GramMatrix(
482template<
typename BasisType1,
typename Basis2>
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>
549 template<
typename BasisType1,
typename BasisType2,
size_t N>
557 Eigen::MatrixXd
gm = Eigen::MatrixXd::Zero(
basis1.dimension(),
basis2.dimension());
563 for (
size_t i=0;
i<
N*
N;
i++){
570template<
typename BasisType1,
typename BasisType2>
578 Eigen::MatrixXd
gm = Eigen::MatrixXd::Zero(
basis1.dimension(),
basis2.dimension());
601 template<
typename BasisType1,
typename BasisType2>
609 Eigen::MatrixXd
gm = Eigen::MatrixXd::Zero(
basis1.dimension(),
basis2.dimension());
632 template<
typename BasisType1,
typename BasisType2>
644 template<
typename BasisType1,
typename BasisType2,
size_t N>
652 Eigen::MatrixXd
gm = Eigen::MatrixXd::Zero(
basis1.dimension(),
basis2.dimension());
670 for (
size_t i=0;
i <
N;
i++){
674 return gm/(std::pow(
T.diam(),2));
Basis for the space of curls (vectorial rot) of polynomials.
Definition basis.hpp:1305
Basis (or rather family) of divergence of an existing basis.
Definition basis.hpp:1369
Basis for the space of gradients of polynomials.
Definition basis.hpp:1242
Matrix family obtained from a scalar family.
Definition basis.hpp:750
Scalar monomial basis on a cell.
Definition basis.hpp:168
Generate a basis restricted to the first "dimension" functions.
Definition basis.hpp:1131
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:1558
Generate a basis where the function indices are shifted.
Definition basis.hpp:1020
Vector family obtained by tensorization of a scalar family.
Definition basis.hpp:564
for i
Definition convergence_analysis.m:48
for j
Definition convergence_analysis.m:19
Eigen::Vector2i VectorZd
Definition basis.hpp:56
constexpr int dimspace
Dimension, and generic types for vector in correct dimension (makes it easier to translate a code bet...
Definition basis.hpp:53
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
depending on the Matrix Market format indicated by or array(dense array storage). The data will be duplicated % as appropriate if symmetry is indicated in the header. % % Optionally
if(strcmp(field, 'real')) % real valued entries T
Definition mmread.m:93
Definition mhd-solutions.hpp:9
Hash function for VectorZd type.
Definition GMpoly_cell.hpp:44