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: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:47
 
for j
Definition convergence_analysis.m:18
 
size_t dimension() const
Compute the dimension of the basis.
Definition basis.hpp:1277
 
size_t dimension() const
Return the dimension of the family.
Definition basis.hpp:799
 
Eigen::Vector2i VectorZd
Definition basis.hpp:56
 
constexpr const ScalarFamilyType & ancestor() const
Return the ancestor (family that has been tensorized)
Definition basis.hpp:720
 
constexpr const BasisType & ancestor() const
Return the ancestor (basis that the gradient was taken of)
Definition basis.hpp:1289
 
size_t dimension() const
Return the dimension of the basis.
Definition basis.hpp:1168
 
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition basis.hpp:726
 
size_t dimension() const
Compute the dimension of the basis.
Definition basis.hpp:1586
 
size_t dimension() const
Return the dimension of the basis.
Definition basis.hpp:1055
 
size_t dimension() const
Compute the dimension of the basis.
Definition basis.hpp:196
 
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition basis.hpp:214
 
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:1351
 
constexpr const BasisType & ancestor() const
Return the ancestor (basis that the gradient was taken of)
Definition basis.hpp:1414
 
size_t dimension() const
Compute the dimension of the basis.
Definition basis.hpp:1339
 
size_t dimension() const
Return the dimension of the family.
Definition basis.hpp:602
 
const ScalarFamilyType & ancestor() const
Return the ancestor (family that has been tensorized)
Definition basis.hpp:859
 
size_t max_degree() const
Returns the maximum degree of the basis functions.
Definition basis.hpp:1598
 
const Eigen::MatrixXd & matrix() const
Return the coefficient matrix.
Definition basis.hpp:513
 
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
 
Definition ddr-klplate.hpp:27
 
Hash function for VectorZd type.
Definition GMpoly_cell.hpp:44