Manicore
Library to implement schemes on n-dimensionnal manifolds.
sphere_ref.hpp
Go to the documentation of this file.
1 #ifndef SPHERE_REF_HPP
2 #define SPHERE_REF_HPP
3 
4 #include <Eigen/Dense>
5 
6 struct Solution {
7  virtual Eigen::Vector<double,1> B (size_t map_id, const Eigen::Vector<double,2> &) = 0;
8  virtual Eigen::Vector<double,2> E (size_t map_id, const Eigen::Vector<double,2> &) = 0;
9  virtual Eigen::Vector<double,1> dE (size_t map_id, const Eigen::Vector<double,2> &) = 0;
10  virtual Eigen::Vector<double,1> rho (size_t map_id, const Eigen::Vector<double,2> &) = 0;
11  virtual Eigen::Vector<double,2> J (size_t map_id, const Eigen::Vector<double,2> &) = 0;
12  double _t = 0.;
13  virtual ~Solution(){;};
14 };
15 
16 struct Solution0 final : public Solution {
17  Eigen::Vector<double,1> B (size_t map_id, const Eigen::Vector<double,2> &x) override
18  {
19  const double X = x[0], Y = x[1];
20  const double ct = std::cos(_t), st = std::sin(_t);
21  if (map_id == 0) {
22  return Eigen::Vector<double,1>{(X*X + Y*Y - 1)*ct + X*X + Y*Y + 1 - 2*X*st};
23  } else {
24  return Eigen::Vector<double,1>{(X*X + Y*Y - 1)*ct - X*X - Y*Y - 1 + 2*X*st};
25  }
26  }
27  Eigen::Vector<double,2> E (size_t map_id, const Eigen::Vector<double,2> &x) override
28  {
29  const double X = x[0], Y = x[1];
30  const double ct = std::cos(_t), st = std::sin(_t);
31  if (map_id == 0) {
32  return Eigen::Vector<double,2>{
33  Y*(-2*X*ct + (-X*X - Y*Y + 2)*st)/4,
34  X*(X*X + Y*Y - 2)*st/4 + (3*X*X + Y*Y - 3)*ct/4
35  };
36  } else {
37  return Eigen::Vector<double,2>{
38  Y*(2*X*ct + (-X*X - Y*Y + 2)*st)/4,
39  X*(X*X + Y*Y - 2)*st/4 - (3*X*X + Y*Y - 3)*ct/4
40  };
41  }
42  }
43  Eigen::Vector<double,1> dE (size_t map_id, const Eigen::Vector<double,2> &x) override
44  {
45  const double X = x[0], Y = x[1];
46  const double ct = std::cos(_t), st = std::sin(_t);
47  if (map_id == 0) {
48  return Eigen::Vector<double,1>{(X*X + Y*Y - 1)*st + 2*X*ct};
49  } else {
50  return Eigen::Vector<double,1>{(X*X + Y*Y - 1)*st - 2*X*ct};
51  }
52  }
53  Eigen::Vector<double,1> rho (size_t map_id, const Eigen::Vector<double,2> &x) override
54  {
55  return Eigen::Vector<double,1>{0.};
56  }
57  Eigen::Vector<double,2> J (size_t map_id, const Eigen::Vector<double,2> &x) override
58  {
59  const double X = x[0], Y = x[1];
60  const double ct = std::cos(_t), st = std::sin(_t);
61  if (map_id == 0) {
62  double tmpJN = 3*(std::pow(X*X + Y*Y,2)/2. + X*X + Y*Y + 0.5)
63  + (1.5*std::pow(X*X + Y*Y,2) + 1.25*(X*X + Y*Y) - 1)*ct;
64  return Eigen::Vector<double,2>{
65  Y*tmpJN - X*Y*(2*X*X + 2*Y*Y + 2.5)*st,
66  -X*tmpJN + (10*std::pow(X,4) + 12*X*X*Y*Y + 15*X*X + 2*std::pow(Y,4) + 5*Y*Y - 1)*st/4.
67  };
68  } else {
69  double tmpJS = 3*(std::pow(X*X + Y*Y,2)/2. + X*X + Y*Y + 0.5)
70  - (1.5*std::pow(X*X + Y*Y,2) + 1.25*(X*X + Y*Y) - 1)*ct;
71  return Eigen::Vector<double,2>{
72  -Y*tmpJS + X*Y*(2*X*X + 2*Y*Y + 2.5)*st,
73  X*tmpJS - (10*std::pow(X,4) + 12*X*X*Y*Y + 15*X*X + 2*std::pow(Y,4) + 5*Y*Y - 1)*st/4.
74  };
75  }
76  }
77 };
78 
79 struct Solution1 final : public Solution {
80  Eigen::Vector<double,1> B (size_t map_id, const Eigen::Vector<double,2> &x) override
81  {
82  const double X = x[0], Y = x[1];
83  const double ct = std::cos(_t), st = std::sin(_t);
84  if (map_id == 0) {
85  return Eigen::Vector<double,1>{(X*X + Y*Y - 1)*ct + X*X + Y*Y + 1 - 2*X*st}
86  *std::pow(2./(1.+X*X+Y*Y),3);
87  } else {
88  return Eigen::Vector<double,1>{(X*X + Y*Y - 1)*ct - X*X - Y*Y - 1 + 2*X*st}
89  *std::pow(2./(1.+X*X+Y*Y),3);
90  }
91  }
92  Eigen::Vector<double,2> E (size_t map_id, const Eigen::Vector<double,2> &x) override
93  {
94  return Eigen::Vector<double,2>{0.,0.};
95  }
96  Eigen::Vector<double,1> dE (size_t map_id, const Eigen::Vector<double,2> &x) override
97  {
98  return Eigen::Vector<double,1>{0.};
99  }
100  Eigen::Vector<double,1> rho (size_t map_id, const Eigen::Vector<double,2> &x) override
101  {
102  return Eigen::Vector<double,1>{0.};
103  }
104  Eigen::Vector<double,2> J (size_t map_id, const Eigen::Vector<double,2> &x) override
105  {
106  return Eigen::Vector<double,2>{0.,0.};
107  }
108 };
109 
110 struct Solution2 final : public Solution {
111  Eigen::Vector<double,1> B (size_t map_id, const Eigen::Vector<double,2> &x) override
112  {
113  const double X = x[0], Y = x[1];
114  const double ct = std::cos(_t), st = std::sin(_t);
115  if (map_id == 0) {
116  return Eigen::Vector<double,1>{(X*X + Y*Y - 1)*ct + X*X + Y*Y + 1 - 2*X*st}
117  *std::pow(2./(1.+X*X+Y*Y),3);
118  } else {
119  return Eigen::Vector<double,1>{(X*X + Y*Y - 1)*ct - X*X - Y*Y - 1 + 2*X*st}
120  *std::pow(2./(1.+X*X+Y*Y),3);
121  }
122  }
123  Eigen::Vector<double,2> E (size_t map_id, const Eigen::Vector<double,2> &x) override
124  {
125  if (map_id == 0) {
126  return Eigen::Vector<double,2>{1.,0.};
127  } else {
128  return Eigen::Vector<double,2>{1.,0.};
129  }
130  }
131  Eigen::Vector<double,1> dE (size_t map_id, const Eigen::Vector<double,2> &x) override
132  {
133  return Eigen::Vector<double,1>{0.};
134  }
135  Eigen::Vector<double,1> rho (size_t map_id, const Eigen::Vector<double,2> &x) override
136  {
137  return Eigen::Vector<double,1>{0.};
138  }
139  Eigen::Vector<double,2> J (size_t map_id, const Eigen::Vector<double,2> &x) override
140  {
141  return Eigen::Vector<double,2>{0.,0.};
142  }
143 };
144 
145 struct Solution3 final : public Solution {
146  Eigen::Vector<double,1> B (size_t map_id, const Eigen::Vector<double,2> &x) override
147  {
148  return Eigen::Vector<double,1>{0.};
149  //return ((map_id == 1)? -1 : 1)*std::pow(2./(1+x[0]*x[0]+x[1]*x[1]),2)*rho(map_id,x);
150  }
151  Eigen::Vector<double,2> E (size_t map_id, const Eigen::Vector<double,2> &x) override
152  {
153  return Eigen::Vector<double,2>{0.,0.};
154  }
155  Eigen::Vector<double,1> dE (size_t map_id, const Eigen::Vector<double,2> &x) override
156  {
157  return Eigen::Vector<double,1>{0.};
158  }
159  Eigen::Vector<double,1> rho (size_t map_id, const Eigen::Vector<double,2> &x) override
160  {
161  const double X = x[0], Y = x[1];
162  constexpr double t_0 = 0.8;
163  double ct = std::cos(t_0), st = std::sin(t_0);
164  double r2 = X*X + Y*Y;
165  if (map_id == 0) {
166  double val = 2.*(1. - (2.*X*st + (1. - r2)*ct)/(1. + r2));
167  return Eigen::Vector<double,1>{(val > 3.8)? val : 0.};
168  } else {
169  double val = 2.*(1. - (2.*X*st - (1. - r2)*ct)/(1. + r2));
170  return Eigen::Vector<double,1>{(val > 3.8)? val : 0.};
171  }
172  }
173  Eigen::Vector<double,2> J (size_t map_id, const Eigen::Vector<double,2> &x) override
174  {
175  return Eigen::Vector<double,2>{0.,0.};
176  }
177 };
178 
179 #endif
180 
Definition: sphere_ref.hpp:16
Eigen::Vector< double, 1 > dE(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:43
Eigen::Vector< double, 2 > J(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:57
Eigen::Vector< double, 1 > B(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:17
Eigen::Vector< double, 2 > E(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:27
Eigen::Vector< double, 1 > rho(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:53
Definition: sphere_ref.hpp:79
Eigen::Vector< double, 1 > B(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:80
Eigen::Vector< double, 1 > rho(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:100
Eigen::Vector< double, 1 > dE(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:96
Eigen::Vector< double, 2 > J(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:104
Eigen::Vector< double, 2 > E(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:92
Definition: sphere_ref.hpp:110
Eigen::Vector< double, 1 > B(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:111
Eigen::Vector< double, 1 > dE(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:131
Eigen::Vector< double, 2 > E(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:123
Eigen::Vector< double, 1 > rho(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:135
Eigen::Vector< double, 2 > J(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:139
Definition: sphere_ref.hpp:145
Eigen::Vector< double, 2 > E(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:151
Eigen::Vector< double, 2 > J(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:173
Eigen::Vector< double, 1 > dE(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:155
Eigen::Vector< double, 1 > rho(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:159
Eigen::Vector< double, 1 > B(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:146
Definition: sphere_ref.hpp:6
virtual Eigen::Vector< double, 2 > J(size_t map_id, const Eigen::Vector< double, 2 > &)=0
virtual Eigen::Vector< double, 1 > rho(size_t map_id, const Eigen::Vector< double, 2 > &)=0
virtual Eigen::Vector< double, 2 > E(size_t map_id, const Eigen::Vector< double, 2 > &)=0
double _t
Definition: sphere_ref.hpp:12
virtual ~Solution()
Definition: sphere_ref.hpp:13
virtual Eigen::Vector< double, 1 > dE(size_t map_id, const Eigen::Vector< double, 2 > &)=0
virtual Eigen::Vector< double, 1 > B(size_t map_id, const Eigen::Vector< double, 2 > &)=0