HArD::Core2D
Hybrid Arbitrary Degree::Core 2D - Library to implement 2D schemes with edge and cell polynomials as unknowns
Loading...
Searching...
No Matches
sxcurl-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 static std::function<double(const Eigen::Vector2d&)>
14 trigonometric_scalar = [](const Eigen::Vector2d & x) -> double {
15 return sin(PI * x(0)) * sin(PI * x(1));
16 };
17
18 static std::function<Eigen::Vector2d(const Eigen::Vector2d&)>
19 grad_trigonometric_scalar = [](const Eigen::Vector2d & x) -> Eigen::Vector2d {
20 return PI * Eigen::Vector2d(
21 cos(PI * x(0)) * sin(PI * x(1)),
22 sin(PI * x(0)) * cos(PI * x(1))
23 );
24 };
25 //------------------------------------------------------------------------------
26
27 static std::function<double(const Eigen::Vector2d&)>
28 constant_scalar = [](const Eigen::Vector2d & x) -> double {
29 return 1.;
30 };
31
32 static std::function<Eigen::Vector2d(const Eigen::Vector2d&)>
33 grad_constant_scalar = [](const Eigen::Vector2d & x) -> Eigen::Vector2d {
34 return Eigen::Vector2d::Zero();
35 };
36
37 //------------------------------------------------------------------------------
38
39 static std::function<double(const Eigen::Vector2d&)>
40 linear_scalar = [](const Eigen::Vector2d & x) -> double {
41 return 1. + x(0) + 2. * x(1);
42 };
43
44 static std::function<Eigen::Vector2d(const Eigen::Vector2d&)>
45 grad_linear_scalar = [](const Eigen::Vector2d & x) -> Eigen::Vector2d {
46 return Eigen::Vector2d(1., 2.);
47 };
48
49 //------------------------------------------------------------------------------
50
51 static std::function<double(const Eigen::Vector2d&)>
52 quadratic_scalar = [](const Eigen::Vector2d & x) -> double {
53 return linear_scalar(x) + std::pow(x(0), 2) + 2. * std::pow(x(1), 2);
54 };
55
56 static std::function<Eigen::Vector2d(const Eigen::Vector2d&)>
57 grad_quadratic_scalar = [](const Eigen::Vector2d & x) -> Eigen::Vector2d {
58 return grad_linear_scalar(x) + Eigen::Vector2d(2. * x(0), 4. * x(1));
59 };
60
61
62//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
63//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
64//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
65 static std::function<Eigen::Vector2d(const Eigen::Vector2d&)>
66 constant_vector = [](const Eigen::Vector2d & x) -> Eigen::Vector2d {
67 return Eigen::Vector2d(1., -1.);
68 };
69
70 static std::function<double(const Eigen::Vector2d&)>
71 rot_constant_vector = [](const Eigen::Vector2d & x) -> double {
72 return 0.;
73 };
74
75 //------------------------------------------------------------------------------
76
77 static std::function<Eigen::Vector2d(const Eigen::Vector2d&)>
78 linear_vector = [](const Eigen::Vector2d & x) -> Eigen::Vector2d {
79 return Eigen::Vector2d(
80 1. + x(0) - x(1),
81 2. + 2. * x(1) + x(0)
82 );
83 };
84
85 static std::function<double(const Eigen::Vector2d&)>
86 rot_linear_vector = [](const Eigen::Vector2d & x) -> double {
87 return 2;
88 };
89
90 //------------------------------------------------------------------------------
91
92 static std::function<Eigen::Vector2d(const Eigen::Vector2d&)>
93 trigonometric_vector = [](const Eigen::Vector2d & x) -> Eigen::Vector2d {
94 return Eigen::Vector2d(
95 sin(PI * x(0)) * sin(PI * x(1)),
96 sin(PI * x(0)) * sin(PI * x(1))
97 );
98 };
99
100 static std::function<double(const Eigen::Vector2d&)>
102 = [](const Eigen::Vector2d & x) -> double {
103 return PI*cos(PI*x(0))*sin(PI*x(1)) - PI*sin(PI*x(0))*cos(PI*x(1));
104 };
105
106 //------------------------------------------------------------------------------
107
108 template<typename T>
109 double squared_l2_error(
110 const std::function<T(const Eigen::Vector2d &)> & f,
111 const Eigen::VectorXd & fX,
112 const boost::multi_array<T, 2> & fX_basis_quad,
113 const QuadratureRule & quad_X
114 )
115 {
116 // Check that the dimensions are consistent
117 //std::cout<<"fx_basis 0: "<<fX_basis_quad.shape()[0] <<", fxsize: "<<fX.size()<<", fx_basis 1: "<<fX_basis_quad.shape()[1]<<", quad size: "<< quad_X.size()<<std::endl;
118 assert(
119 fX_basis_quad.shape()[0] == (size_t)fX.size() &&
120 fX_basis_quad.shape()[1] == quad_X.size()
121 );
122
123 double err = 0.;
124
125 for (size_t iqn = 0; iqn < quad_X.size(); iqn++) {
126 T f_iqn = f(quad_X[iqn].vector());
127
128 T fX_iqn = fX(0) * fX_basis_quad[0][iqn];
129 for (size_t i = 1; i < fX_basis_quad.shape()[0]; i++) {
130 fX_iqn += fX(i) * fX_basis_quad[i][iqn];
131 } // for i
132
133 T diff_iqn = f_iqn - fX_iqn;
134
135 err += quad_X[iqn].w * scalar_product(diff_iqn, diff_iqn);
136 } // for iqn
137
138 return err;
139 }
140
141} // end of namespace HArDCore2D
142
143#endif
for i
Definition generate_cartesian_mesh.m:71
Create grid points x
Definition generate_cartesian_mesh.m:22
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< double(const Eigen::Vector2d &)> constant_scalar
Definition sxcurl-test.hpp:28
static std::function< Eigen::Vector2d(const Eigen::Vector2d &)> constant_vector
Definition excurl-test.hpp:16
static std::function< double(const Eigen::Vector2d &)> quadratic_scalar
Definition sxcurl-test.hpp:52
static std::function< Eigen::Vector2d(const Eigen::Vector2d &)> grad_quadratic_scalar
Definition sxcurl-test.hpp:57
static std::function< Eigen::Vector2d(const Eigen::Vector2d &)> trigonometric_vector
Definition excurl-test.hpp:102
static std::function< Eigen::Vector2d(const Eigen::Vector2d &)> grad_trigonometric_scalar
Definition sxcurl-test.hpp:19
static std::function< double(const Eigen::Vector2d &)> trigonometric_scalar
Definition sxcurl-test.hpp:14
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
static std::function< double(const Eigen::Vector2d &)> linear_scalar
Definition sxcurl-test.hpp:40
static std::function< Eigen::Vector2d(const Eigen::Vector2d &)> grad_linear_scalar
Definition sxcurl-test.hpp:45
static std::function< Eigen::Vector2d(const Eigen::Vector2d &)> grad_constant_scalar
Definition sxcurl-test.hpp:33
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