HArD::Core2D
Hybrid Arbitrary Degree::Core 2D - Library to implement 2D schemes with edge and cell polynomials as unknowns
Loading...
Searching...
No Matches
excurl-test.hpp
Go to the documentation of this file.
1#ifndef EXCURL_TEST_HPP
2#define EXCURL_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 using std::cos;
12
13 //------------------------------------------------------------------------------
14
15 static std::function<Eigen::Vector2d(const Eigen::Vector2d&)>
16 constant_vector = [](const Eigen::Vector2d & x) -> Eigen::Vector2d {
17 return Eigen::Vector2d(1., 2.);
18 };
19
20 static std::function<double(const Eigen::Vector2d&)>
21 rot_constant_vector = [](const Eigen::Vector2d & x) -> double {
22 return 0.;
23 };
24
25 static std::function<MatrixRd(const Eigen::Vector2d&)>
26 grad_constant_vector = [](const Eigen::Vector2d & x) -> MatrixRd {
27 return MatrixRd::Zero();
28 };
29 //------------------------------------------------------------------------------
30
31 static std::function<Eigen::Vector2d(const Eigen::Vector2d&)>
32 linear_vector = [](const Eigen::Vector2d & x) -> Eigen::Vector2d {
33 return Eigen::Vector2d(
34 1. + x(0) - x(1),
35 2. + 2. * x(1) + x(0)
36 );
37 };
38
39 static std::function<double(const Eigen::Vector2d&)>
40 rot_linear_vector = [](const Eigen::Vector2d & x) -> double {
41 return 2;
42 };
43
44 static std::function<MatrixRd(const Eigen::Vector2d&)>
45 grad_linear_vector = [](const Eigen::Vector2d & x) -> MatrixRd {
46 MatrixRd G = MatrixRd::Zero();
47 G.row(0) << 1, -1;
48 G.row(1) << 1, 2;
49 return G;
50 };
51
52
53 //------------------------------------------------------------------------------
54
55 static std::function<Eigen::Vector2d(const Eigen::Vector2d&)>
56 quadratic_vector = [](const Eigen::Vector2d & x) -> Eigen::Vector2d {
57 return Eigen::Vector2d(
58 1. + x(0)*x(0) - x(1)*x(0),
59 2. + 2. * x(1)*x(1) + x(0)*x(1)
60 );
61 };
62
63 static std::function<double(const Eigen::Vector2d&)>
64 rot_quadratic_vector = [](const Eigen::Vector2d & x) -> double {
65 return x(0)+x(1);
66 };
67
68 static std::function<MatrixRd(const Eigen::Vector2d&)>
69 grad_quadratic_vector = [](const Eigen::Vector2d & x) -> MatrixRd {
70 MatrixRd G = MatrixRd::Zero();
71 G.row(0) << 2.*x(0)-x(1), -x(0);
72 G.row(1) << x(1), 4.*x(1)+x(0);
73 return G;
74 };
75
76 //------------------------------------------------------------------------------
77
78 static std::function<Eigen::Vector2d(const Eigen::Vector2d&)>
79 cubic_vector = [](const Eigen::Vector2d & x) -> Eigen::Vector2d {
80 return Eigen::Vector2d(
81 1. + std::pow(x(0),3) - x(1)*std::pow(x(0),2),
82 2. + 2. * std::pow(x(1), 3) + std::pow(x(1),2)*x(0)
83 );
84 };
85
86 static std::function<double(const Eigen::Vector2d&)>
87 rot_cubic_vector = [](const Eigen::Vector2d & x) -> double {
88 return x(0)*x(0)+x(1)*x(1);
89 };
90
91 static std::function<MatrixRd(const Eigen::Vector2d&)>
92 grad_cubic_vector = [](const Eigen::Vector2d & x) -> MatrixRd {
93 MatrixRd G = MatrixRd::Zero();
94 G.row(0) << 3*x(0)*x(0)-2*x(1)*x(0), -x(0)*x(0);
95 G.row(1) << x(1)*x(1), 6*x(1)*x(1)+2*x(1)*x(0);
96 return G;
97 };
98
99 //------------------------------------------------------------------------------
100
101 static std::function<Eigen::Vector2d(const Eigen::Vector2d&)>
102 trigonometric_vector = [](const Eigen::Vector2d & x) -> Eigen::Vector2d {
103 return Eigen::Vector2d(
104 sin(PI * x(0)) * sin(PI * x(1)),
105 sin(PI * x(0)) * sin(PI * x(1))
106 );
107 };
108
109 static std::function<double(const Eigen::Vector2d&)>
111 = [](const Eigen::Vector2d & x) -> double {
112 return PI*cos(PI*x(0))*sin(PI*x(1)) - PI*sin(PI*x(0))*cos(PI*x(1));
113 };
114
115 static std::function<MatrixRd(const Eigen::Vector2d&)>
116 grad_trigonometric_vector = [](const Eigen::Vector2d & x) -> MatrixRd {
117 MatrixRd G = MatrixRd::Zero();
118 G.row(0) << PI*cos(PI*x(0))*sin(PI*x(1)), PI*sin(PI*x(0))*cos(PI*x(1));
119 G.row(1) << PI*cos(PI*x(0))*sin(PI*x(1)), PI*sin(PI*x(0))*cos(PI*x(1));
120 return G;
121 };
122
123
124 //------------------------------------------------------------------------------
125 // Scalar function for gradient
126 static std::function<double(const Eigen::Vector2d&)>
127 trigonometric_q = [](const Eigen::Vector2d & x) -> double {
128 return sin(PI * x(0)) * sin(PI * x(1));
129 };
130
131 static std::function<Eigen::Vector2d(const Eigen::Vector2d&)>
133 = [](const Eigen::Vector2d & x) -> Eigen::Vector2d {
134 return Eigen::Vector2d(PI*cos(PI*x(0))*sin(PI*x(1)), PI*sin(PI*x(0))*cos(PI*x(1)));
135 };
136
137 //------------------------------------------------------------------------------
138
139 template<typename T>
141 const std::function<T(const Eigen::Vector2d &)> & f,
142 const Eigen::VectorXd & fX,
143 const boost::multi_array<T, 2> & fX_basis_quad,
144 const QuadratureRule & quad_X
145 )
146 {
147 // Check that the dimensions are consistent
148 assert(
149 fX_basis_quad.shape()[0] == (size_t)fX.size() &&
150 fX_basis_quad.shape()[1] == quad_X.size()
151 );
152
153 double err = 0.;
154
155 for (size_t iqn = 0; iqn < quad_X.size(); iqn++) {
156 T f_iqn = f(quad_X[iqn].vector());
157 T fX_iqn = fX(0) * fX_basis_quad[0][iqn];
158 for (size_t i = 1; i < fX_basis_quad.shape()[0]; i++) {
159 fX_iqn += fX(i) * fX_basis_quad[i][iqn];
160 } // for i
161
162 T diff_iqn = f_iqn - fX_iqn;
163
164 err += quad_X[iqn].w * scalar_product(diff_iqn, diff_iqn);
165 } // for iqn
166 return err;
167 }
168
169} // end of namespace HArDCore2D
170
171#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
Eigen::Matrix2d MatrixRd
Definition basis.hpp:54
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 &)> quadratic_vector
Definition excurl-test.hpp:56
static std::function< MatrixRd(const Eigen::Vector2d &)> grad_cubic_vector
Definition excurl-test.hpp:92
static std::function< Eigen::Vector2d(const Eigen::Vector2d &)> trigonometric_vector
Definition excurl-test.hpp:102
static std::function< MatrixRd(const Eigen::Vector2d &)> grad_trigonometric_vector
Definition excurl-test.hpp:116
static std::function< Eigen::Vector2d(const Eigen::Vector2d &)> cubic_vector
Definition excurl-test.hpp:79
static std::function< double(const Eigen::Vector2d &)> trigonometric_q
Definition excurl-test.hpp:127
static std::function< double(const Eigen::Vector2d &)> rot_quadratic_vector
Definition excurl-test.hpp:64
static std::function< MatrixRd(const Eigen::Vector2d &)> grad_quadratic_vector
Definition excurl-test.hpp:69
static std::function< double(const Eigen::Vector2d &)> rot_cubic_vector
Definition excurl-test.hpp:87
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< MatrixRd(const Eigen::Vector2d &)> grad_linear_vector
Definition excurl-test.hpp:45
static std::function< MatrixRd(const Eigen::Vector2d &)> grad_constant_vector
Definition excurl-test.hpp:26
static std::function< Eigen::Vector2d(const Eigen::Vector2d &)> grad_trigonometric_q
Definition excurl-test.hpp:133
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