HArD::Core2D
Hybrid Arbitrary Degree::Core 2D - Library to implement 2D schemes with edge and cell polynomials as unknowns
Loading...
Searching...
No Matches
l2projection.hpp
Go to the documentation of this file.
1namespace HArDCore2D {
2
3 namespace Tests {
4
6 template<typename BasisType>
8 {
9 public:
10 typedef typename BasisType::FunctionValue FunctionValue;
11 typedef boost::multi_array<FunctionValue, 2> BasisEvaluation;
12 typedef std::function<typename BasisType::FunctionValue(const Eigen::Vector2d &)> FunctionType;
13
16 const BasisType & basis,
17 QuadratureRule & quad,
18 const BasisEvaluation & basis_quad
19 )
20 : m_basis(basis),
21 m_quad(quad),
22 m_basis_quad(basis_quad),
23 m_cholesky_mass(compute_gram_matrix(basis_quad, basis_quad, quad))
24 {
25 // Check that the basis evaluation and quadrature rule are coherent
26 assert( basis.dimension() == basis_quad.shape()[0] && quad.size() == basis_quad.shape()[1] );
27 }
28
30 Eigen::VectorXd compute(const FunctionType & f) const
31 {
32 Eigen::VectorXd b = Eigen::VectorXd::Zero(m_basis.dimension());
33 for (size_t i = 0; i < m_basis.dimension(); i++) {
34 for (size_t iqn = 0; iqn < m_quad.size(); iqn++) {
35 FunctionValue f_iqn = f(m_quad[iqn].vector());
36 b(i) += m_quad[iqn].w * scalar_product(f_iqn, m_basis_quad[i][iqn]);
37 } // for iqn
38 } // for i
39 return m_cholesky_mass.solve(b);
40 }
41
44 double squared_error(const FunctionType & f, const Eigen::VectorXd & f_dofs) const
45 {
46 double err = 0.;
47 for (size_t iqn = 0; iqn < m_quad.size(); iqn++) {
48 FunctionValue f_iqn = f_dofs(0) * m_basis_quad[0][iqn];
49 for (size_t i = 1; i < m_basis.dimension(); i++) {
50 f_iqn += f_dofs(i) * m_basis_quad[i][iqn];
51 } // for i
52 FunctionValue diff_f_iqn = f_iqn - f(m_quad[iqn].vector());
53 err += m_quad[iqn].w * scalar_product(diff_f_iqn, diff_f_iqn);
54 } // for iqn
55 return err;
56 }
57
59 inline double error(const FunctionType & f, const Eigen::VectorXd & f_dofs) const
60 {
61 return std::sqrt( squared_error(f, f_dofs) );
62 }
63
65 inline const BasisEvaluation & basisQuad()
66 {
67 return m_basis_quad;
68 }
69
70 private:
71 BasisType m_basis;
72 QuadratureRule m_quad;
73 BasisEvaluation m_basis_quad;
74 Eigen::LDLT<Eigen::MatrixXd> m_cholesky_mass;
75 };
76
78 template<typename T>
80 const Eigen::VectorXd & f_dofs,
81 const QuadratureRule & quad,
82 const boost::multi_array<T, 2> & basis_quad
83 )
84 {
85 double norm = 0.;
86 for (size_t iqn = 0; iqn < quad.size(); iqn++) {
87 T f_iqn = f_dofs(0) * basis_quad[0][iqn];
88 for (size_t i = 1; i < basis_quad.shape()[0]; i++) {
89 f_iqn += f_dofs(i) * basis_quad[i][iqn];
90 } // for i
91
92 norm += quad[iqn].w * scalar_product(f_iqn, f_iqn);
93 } // for iqn
94 return norm;
95 }
96
98 template<typename T>
99 double l2_norm(
100 const Eigen::VectorXd & f_dofs,
101 const QuadratureRule & quad,
102 const boost::multi_array<T, 2> & basis_quad
103 )
104 {
105 return std::sqrt( squared_l2_norm(f_dofs, quad, basis_quad) );
106 }
107
108 } // end of namespace Tests
109
110} // end of namespace HArDCore2D
Compute the L2-orthogonal projection of a function.
Definition l2projection.hpp:8
boost::multi_array< FunctionValue, 2 > BasisEvaluation
Definition l2projection.hpp:11
L2Projection(const BasisType &basis, QuadratureRule &quad, const BasisEvaluation &basis_quad)
Constructor.
Definition l2projection.hpp:15
double squared_error(const FunctionType &f, const Eigen::VectorXd &f_dofs) const
Definition l2projection.hpp:44
Eigen::VectorXd compute(const FunctionType &f) const
Compute the projection of a function.
Definition l2projection.hpp:30
const BasisEvaluation & basisQuad()
Return the basis evaluation.
Definition l2projection.hpp:65
double error(const FunctionType &f, const Eigen::VectorXd &f_dofs) const
Compute the error between the L2-orthogonal projection and the function.
Definition l2projection.hpp:59
BasisType::FunctionValue FunctionValue
Definition l2projection.hpp:10
std::function< typename BasisType::FunctionValue(const Eigen::Vector2d &)> FunctionType
Definition l2projection.hpp:12
Compute max and min eigenvalues of all matrices for i
Definition compute_eigs.m:5
double scalar_product(const double &x, const double &y)
Scalar product between two reals.
Definition basis.cpp:163
Eigen::MatrixXd compute_gram_matrix(const boost::multi_array< VectorRd, 2 > &B1, const boost::multi_array< double, 2 > &B2, const QuadratureRule &qr)
Compute the Gram-like matrix given a family of vector-valued and one of scalar-valued functions by te...
Definition basis.cpp:225
std::vector< QuadratureNode > QuadratureRule
Definition quadraturerule.hpp:55
if(strcmp(field, 'real')) % real valued entries T
Definition mmread.m:93
double squared_l2_norm(const Eigen::VectorXd &f_dofs, const QuadratureRule &quad, const boost::multi_array< T, 2 > &basis_quad)
Compute the squared L2-norm of a discrete function.
Definition l2projection.hpp:79
double l2_norm(const Eigen::VectorXd &f_dofs, const QuadratureRule &quad, const boost::multi_array< T, 2 > &basis_quad)
Compute the L2-norm of a discrete function.
Definition l2projection.hpp:99
Definition ddr-klplate.hpp:27