HArD::Core2D
Hybrid Arbitrary Degree::Core 2D - Library to implement 2D schemes with edge and cell polynomials as unknowns
Loading...
Searching...
No Matches
vsxgrad-test.hpp
Go to the documentation of this file.
1#ifndef VSXGRAD_TEST_HPP
2#define VSXGRAD_TEST_HPP
3
4#include <boost/math/constants/constants.hpp>
5#include <vsxgrad.hpp>
6
7namespace HArDCore2D
8{
9
10 static const double PI = boost::math::constants::pi<double>();
11 using std::sin;
12
13 //------------------------------------------------------------------------------
14
16 trigonometric = [](const VectorRd & x) -> VectorRd {
17 return sin(PI * x(0)) * sin(PI * x(1)) * VectorRd(1., 1.);
18 };
19
20 static std::function<MatrixRd(const Eigen::Vector2d&)>
21 grad_trigonometric = [](const Eigen::Vector2d & x) -> MatrixRd {
22 MatrixRd G = MatrixRd::Zero();
23 G.row(0) << PI * Eigen::Vector2d(
24 cos(PI * x(0)) * sin(PI * x(1)),
25 sin(PI * x(0)) * cos(PI * x(1))
26 ).transpose();
27 G.row(1) << PI * Eigen::Vector2d(
28 cos(PI * x(0)) * sin(PI * x(1)),
29 sin(PI * x(0)) * cos(PI * x(1))
30 ).transpose();
31
32 return G;
33 };
34
35 static std::function<double(const Eigen::Vector2d&)>
36 rot_trigonometric = [](const Eigen::Vector2d& x) -> double {
37 double d1f2 = PI * std::cos(PI * x(0)) * std::sin(PI * x(1));
38 double d2f1 = PI * std::sin(PI * x(0)) * std::cos(PI * x(1));
39 return d1f2 - d2f1;
40 };
41 //------------------------------------------------------------------------------
42
43 static std::function<VectorRd(const VectorRd&)>
44 constant = [](const VectorRd & x) -> VectorRd {
45 return VectorRd(1., 1.);
46 };
47
48 static std::function<MatrixRd(const VectorRd&)>
49 grad_constant = [](const VectorRd & x) -> MatrixRd {
50 return MatrixRd::Zero();
51 };
52
53static std::function<double(const VectorRd&)>
54rot_constant = [](const VectorRd & x) -> double {
55 return 0.;
56 };
57
58 //------------------------------------------------------------------------------
59
60 static std::function<VectorRd(const VectorRd&)>
61 linear = [](const VectorRd & x) -> VectorRd {
62 return (1. + x(0) + 2. * x(1)) * VectorRd(-1., 1.);
63 };
64
65 static std::function<MatrixRd(const Eigen::Vector2d&)>
66 grad_linear = [](const Eigen::Vector2d & x) -> MatrixRd {
67 MatrixRd G = MatrixRd::Zero();
68 G.row(0) << -VectorRd(1., 2.).transpose();
69 G.row(1) << VectorRd(1., 2.).transpose();
70 return G;
71 };
72
73static std::function<double(const VectorRd&)>
74rot_linear = [](const VectorRd & x) -> double {
75 return 3.0;
76};
77
78//------------------------------------------------------------------------------
79
80 static std::function<VectorRd(const VectorRd&)>
81 quadratic = [](const VectorRd & x) -> VectorRd {
82 return linear(x) + (std::pow(x(0), 2) + 2. * std::pow(x(1), 2)) * VectorRd(-1., 0.);
83 };
84
85 static std::function<MatrixRd(const Eigen::Vector2d&)>
86 grad_quadratic = [](const Eigen::Vector2d & x) -> MatrixRd {
87 MatrixRd G = grad_linear(x);
88 G.row(0) += -1 * VectorRd(2*x(0), 4*x(1)).transpose();
89 return G;
90 };
91
92 static std::function<double(const VectorRd&)>
93 rot_quadratic = [](const VectorRd & x) -> double {
94 return 3.0 + 4.0 * x(1);
95};
96
97 //------------------------------------------------------------------------------
98
99 template<typename T>
100 double squared_l2_error(
101 const std::function<T(const Eigen::Vector2d &)> & f,
102 const Eigen::VectorXd & fX,
103 const boost::multi_array<T, 2> & fX_basis_quad,
104 const QuadratureRule & quad_X
105 )
106 {
107 // Check that the dimensions are consistent
108 assert(
109 fX_basis_quad.shape()[0] == (size_t)fX.size() &&
110 fX_basis_quad.shape()[1] == quad_X.size()
111 );
112
113 double err = 0.;
114
115 for (size_t iqn = 0; iqn < quad_X.size(); iqn++) {
116 T f_iqn = f(quad_X[iqn].vector());
117
118 T fX_iqn = fX(0) * fX_basis_quad[0][iqn];
119 for (size_t i = 1; i < fX_basis_quad.shape()[0]; i++) {
120 fX_iqn += fX(i) * fX_basis_quad[i][iqn];
121 } // for i
122
123 T diff_iqn = f_iqn - fX_iqn;
124
125 err += quad_X[iqn].w * scalar_product(diff_iqn, diff_iqn);
126 } // for iqn
127
128 return err;
129 }
130
131
132} // end of namespace HArDCore2D
133
134#endif
135
Compute max and min eigenvalues of all matrices for i
Definition compute_eigs.m:5
Eigen::Vector2d VectorRd
Definition basis.hpp:55
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
std::function< Eigen::Vector2d(const Eigen::Vector2d &)> FunctionType
Definition vsxgrad.hpp:33
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< MatrixRd(const Eigen::Vector2d &)> grad_quadratic
Definition vsxgrad-test.hpp:86
static std::function< VectorRd(const VectorRd &)> linear
Definition vsxgrad-test.hpp:61
static VSXGrad::FunctionType trigonometric
Definition vsxgrad-test.hpp:16
static std::function< VectorRd(const VectorRd &)> constant
Definition vsxgrad-test.hpp:44
static std::function< MatrixRd(const VectorRd &)> grad_constant
Definition vsxgrad-test.hpp:49
static std::function< MatrixRd(const Eigen::Vector2d &)> grad_trigonometric
Definition vsxgrad-test.hpp:21
static std::function< double(const VectorRd &)> rot_quadratic
Definition vsxgrad-test.hpp:93
static std::function< MatrixRd(const Eigen::Vector2d &)> grad_linear
Definition vsxgrad-test.hpp:66
static std::function< double(const VectorRd &)> rot_constant
Definition vsxgrad-test.hpp:54
static std::function< double(const VectorRd &)> rot_linear
Definition vsxgrad-test.hpp:74
static std::function< VectorRd(const VectorRd &)> quadratic
Definition vsxgrad-test.hpp:81
static std::function< double(const Eigen::Vector2d &)> rot_trigonometric
Definition vsxgrad-test.hpp:36
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