HArD::Core2D
Hybrid Arbitrary Degree::Core 2D - Library to implement 2D schemes with edge and cell polynomials as unknowns
Loading...
Searching...
No Matches
xcurl-test.hpp
Go to the documentation of this file.
1#ifndef XCURL_TEST_HPP
2#define XCURL_TEST_HPP
3
4#include <boost/math/constants/constants.hpp>
5
6namespace HArDCore2D
7{
8
9 static const double PI = boost::math::constants::pi<double>();
10 using std::sin;
11
12 //------------------------------------------------------------------------------
13
14 static std::function<Eigen::Vector2d(const Eigen::Vector2d&)>
15 constant_vector = [](const Eigen::Vector2d & x) -> Eigen::Vector2d {
16 return Eigen::Vector2d(1., 2.);
17 };
18
19 static std::function<double(const Eigen::Vector2d&)>
20 rot_constant_vector = [](const Eigen::Vector2d & x) -> double {
21 return 0.;
22 };
23
24 //------------------------------------------------------------------------------
25
26 static std::function<Eigen::Vector2d(const Eigen::Vector2d&)>
27 linear_vector = [](const Eigen::Vector2d & x) -> Eigen::Vector2d {
28 return Eigen::Vector2d(
29 1. + x(0) - x(1),
30 2. + 2. * x(1) + x(0)
31 );
32 };
33
34 static std::function<double(const Eigen::Vector2d&)>
35 rot_linear_vector = [](const Eigen::Vector2d & x) -> double {
36 return 2;
37 };
38
39 //------------------------------------------------------------------------------
40
41 static std::function<Eigen::Vector2d(const Eigen::Vector2d&)>
42 trigonometric_vector = [](const Eigen::Vector2d & x) -> Eigen::Vector2d {
43 return Eigen::Vector2d(
44 sin(PI * x(0)) * sin(PI * x(1)),
45 sin(PI * x(0)) * sin(PI * x(1))
46 );
47 };
48
49 static std::function<double(const Eigen::Vector2d&)>
51 = [](const Eigen::Vector2d & x) -> double {
52 return PI*cos(PI*x(0))*sin(PI*x(1)) - PI*sin(PI*x(0))*cos(PI*x(1));
53 };
54
55 //------------------------------------------------------------------------------
56
57 template<typename T>
58 double squared_l2_error(
59 const std::function<T(const Eigen::Vector2d &)> & f,
60 const Eigen::VectorXd & fX,
61 const boost::multi_array<T, 2> & fX_basis_quad,
62 const QuadratureRule & quad_X
63 )
64 {
65 // Check that the dimensions are consistent
66 assert(
67 fX_basis_quad.shape()[0] == (size_t)fX.size() &&
68 fX_basis_quad.shape()[1] == quad_X.size()
69 );
70
71 double err = 0.;
72
73 for (size_t iqn = 0; iqn < quad_X.size(); iqn++) {
74 T f_iqn = f(quad_X[iqn].vector());
75
76 T fX_iqn = fX(0) * fX_basis_quad[0][iqn];
77 for (size_t i = 1; i < fX_basis_quad.shape()[0]; i++) {
78 fX_iqn += fX(i) * fX_basis_quad[i][iqn];
79 } // for i
80
81 T diff_iqn = f_iqn - fX_iqn;
82
83 err += quad_X[iqn].w * scalar_product(diff_iqn, diff_iqn);
84 } // for iqn
85
86 return err;
87 }
88
89} // end of namespace HArDCore2D
90
91#endif
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
static const double PI
Definition ddr-klplate.hpp:187
std::vector< QuadratureNode > QuadratureRule
Definition quadraturerule.hpp:55
if(strcmp(field, 'real')) % real valued entries T
Definition mmread.m:93
Definition ddr-klplate.hpp:27
static std::function< Eigen::Vector2d(const Eigen::Vector2d &)> constant_vector
Definition excurl-test.hpp:16
static std::function< Eigen::Vector2d(const Eigen::Vector2d &)> trigonometric_vector
Definition excurl-test.hpp:102
static std::function< double(const Eigen::Vector2d &)> rot_linear_vector
Definition excurl-test.hpp:40
static std::function< Eigen::Vector2d(const Eigen::Vector2d &)> linear_vector
Definition excurl-test.hpp:32
double squared_l2_error(const std::function< T(const Eigen::Vector2d &)> &f, const Eigen::VectorXd &fX, const boost::multi_array< T, 2 > &fX_basis_quad, const QuadratureRule &quad_X)
Definition excurl-test.hpp:140
static std::function< double(const Eigen::Vector2d &)> rot_constant_vector
Definition excurl-test.hpp:21
static std::function< double(const Eigen::Vector2d &)> rot_trigonometric_vector
Definition excurl-test.hpp:111