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  bool _JZero = false;
14  Solution(bool Jz) : _JZero(Jz) {;}
15  virtual ~Solution(){;};
16 };
17 
18 struct Solution0 final : public Solution {
19  Eigen::Vector<double,1> B (size_t map_id, const Eigen::Vector<double,2> &x) override
20  {
21  const double X = x[0], Y = x[1];
22  const double ct = std::cos(_t), st = std::sin(_t);
23  if (map_id == 0) {
24  return Eigen::Vector<double,1>{(X*X + Y*Y - 1)*ct + X*X + Y*Y + 1 - 2*X*st};
25  } else {
26  return Eigen::Vector<double,1>{(X*X + Y*Y - 1)*ct - X*X - Y*Y - 1 + 2*X*st};
27  }
28  }
29  Eigen::Vector<double,2> E (size_t map_id, const Eigen::Vector<double,2> &x) override
30  {
31  const double X = x[0], Y = x[1];
32  const double ct = std::cos(_t), st = std::sin(_t);
33  if (map_id == 0) {
34  return Eigen::Vector<double,2>{
35  Y*(-2*X*ct + (-X*X - Y*Y + 2)*st)/4,
36  X*(X*X + Y*Y - 2)*st/4 + (3*X*X + Y*Y - 3)*ct/4
37  };
38  } else {
39  return Eigen::Vector<double,2>{
40  Y*(2*X*ct + (-X*X - Y*Y + 2)*st)/4,
41  X*(X*X + Y*Y - 2)*st/4 - (3*X*X + Y*Y - 3)*ct/4
42  };
43  }
44  }
45  Eigen::Vector<double,1> dE (size_t map_id, const Eigen::Vector<double,2> &x) override
46  {
47  const double X = x[0], Y = x[1];
48  const double ct = std::cos(_t), st = std::sin(_t);
49  if (map_id == 0) {
50  return Eigen::Vector<double,1>{(X*X + Y*Y - 1)*st + 2*X*ct};
51  } else {
52  return Eigen::Vector<double,1>{(X*X + Y*Y - 1)*st - 2*X*ct};
53  }
54  }
55  Eigen::Vector<double,1> rho (size_t map_id, const Eigen::Vector<double,2> &x) override
56  {
57  return Eigen::Vector<double,1>{0.};
58  }
59  Eigen::Vector<double,2> J (size_t map_id, const Eigen::Vector<double,2> &x) override
60  {
61  const double X = x[0], Y = x[1];
62  const double ct = std::cos(_t), st = std::sin(_t);
63  if (map_id == 0) {
64  double tmpJN = 3*(std::pow(X*X + Y*Y,2)/2. + X*X + Y*Y + 0.5)
65  + (1.5*std::pow(X*X + Y*Y,2) + 1.25*(X*X + Y*Y) - 1)*ct;
66  return Eigen::Vector<double,2>{
67  Y*tmpJN - X*Y*(2*X*X + 2*Y*Y + 2.5)*st,
68  -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.
69  };
70  } else {
71  double tmpJS = 3*(std::pow(X*X + Y*Y,2)/2. + X*X + Y*Y + 0.5)
72  - (1.5*std::pow(X*X + Y*Y,2) + 1.25*(X*X + Y*Y) - 1)*ct;
73  return Eigen::Vector<double,2>{
74  -Y*tmpJS + X*Y*(2*X*X + 2*Y*Y + 2.5)*st,
75  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.
76  };
77  }
78  }
79 };
80 
81 struct Solution1 final : public Solution {
82  Solution1 () : Solution(true) {;}
83  Eigen::Vector<double,1> B (size_t map_id, const Eigen::Vector<double,2> &x) override
84  {
85  const double X = x[0], Y = x[1];
86  const double ct = std::cos(_t), st = std::sin(_t);
87  if (map_id == 0) {
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  } else {
91  return Eigen::Vector<double,1>{(X*X + Y*Y - 1)*ct - X*X - Y*Y - 1 + 2*X*st}
92  *std::pow(2./(1.+X*X+Y*Y),3);
93  }
94  }
95  Eigen::Vector<double,2> E (size_t map_id, const Eigen::Vector<double,2> &x) override
96  {
97  return Eigen::Vector<double,2>{0.,0.};
98  }
99  Eigen::Vector<double,1> dE (size_t map_id, const Eigen::Vector<double,2> &x) override
100  {
101  return Eigen::Vector<double,1>{0.};
102  }
103  Eigen::Vector<double,1> rho (size_t map_id, const Eigen::Vector<double,2> &x) override
104  {
105  return Eigen::Vector<double,1>{0.};
106  }
107  Eigen::Vector<double,2> J (size_t map_id, const Eigen::Vector<double,2> &x) override
108  {
109  return Eigen::Vector<double,2>{0.,0.};
110  }
111 };
112 
113 struct Solution2 final : public Solution {
114  Solution2 () : Solution(true) {;}
115  Eigen::Vector<double,1> B (size_t map_id, const Eigen::Vector<double,2> &x) override
116  {
117  const double X = x[0], Y = x[1];
118  const double ct = std::cos(_t), st = std::sin(_t);
119  if (map_id == 0) {
120  return Eigen::Vector<double,1>{(X*X + Y*Y - 1)*ct + X*X + Y*Y + 1 - 2*X*st}
121  *std::pow(2./(1.+X*X+Y*Y),3);
122  } else {
123  return Eigen::Vector<double,1>{(X*X + Y*Y - 1)*ct - X*X - Y*Y - 1 + 2*X*st}
124  *std::pow(2./(1.+X*X+Y*Y),3);
125  }
126  }
127  Eigen::Vector<double,2> E (size_t map_id, const Eigen::Vector<double,2> &x) override
128  {
129  if (map_id == 0) {
130  return Eigen::Vector<double,2>{1.,0.};
131  } else {
132  return Eigen::Vector<double,2>{1.,0.};
133  }
134  }
135  Eigen::Vector<double,1> dE (size_t map_id, const Eigen::Vector<double,2> &x) override
136  {
137  return Eigen::Vector<double,1>{0.};
138  }
139  Eigen::Vector<double,1> rho (size_t map_id, const Eigen::Vector<double,2> &x) override
140  {
141  return Eigen::Vector<double,1>{0.};
142  }
143  Eigen::Vector<double,2> J (size_t map_id, const Eigen::Vector<double,2> &x) override
144  {
145  return Eigen::Vector<double,2>{0.,0.};
146  }
147 };
148 
149 struct Solution3 final : public Solution {
150  Solution3 () : Solution(true) {;}
151  Eigen::Vector<double,1> B (size_t map_id, const Eigen::Vector<double,2> &x) override
152  {
153  return Eigen::Vector<double,1>{0.};
154  //return ((map_id == 1)? -1 : 1)*std::pow(2./(1+x[0]*x[0]+x[1]*x[1]),2)*rho(map_id,x);
155  }
156  Eigen::Vector<double,2> E (size_t map_id, const Eigen::Vector<double,2> &x) override
157  {
158  return Eigen::Vector<double,2>{0.,0.};
159  }
160  Eigen::Vector<double,1> dE (size_t map_id, const Eigen::Vector<double,2> &x) override
161  {
162  return Eigen::Vector<double,1>{0.};
163  }
164  Eigen::Vector<double,1> rho (size_t map_id, const Eigen::Vector<double,2> &x) override
165  {
166  const double X = x[0], Y = x[1];
167  constexpr double t_0 = 0.8;
168  double ct = std::cos(t_0), st = std::sin(t_0);
169  double r2 = X*X + Y*Y;
170  if (map_id == 0) {
171  double val = 2.*(1. - (2.*X*st + (1. - r2)*ct)/(1. + r2));
172  return Eigen::Vector<double,1>{(val > 3.8)? val : 0.};
173  } else {
174  double val = 2.*(1. - (2.*X*st - (1. - r2)*ct)/(1. + r2));
175  return Eigen::Vector<double,1>{(val > 3.8)? val : 0.};
176  }
177  }
178  Eigen::Vector<double,2> J (size_t map_id, const Eigen::Vector<double,2> &x) override
179  {
180  return Eigen::Vector<double,2>{0.,0.};
181  }
182 };
183 
184 struct Solution4 final : public Solution {
185  Eigen::Vector<double,1> B (size_t map_id, const Eigen::Vector<double,2> &x) override
186  {
187  return Eigen::Vector<double,1>{0.};
188  }
189  Eigen::Vector<double,2> E (size_t map_id, const Eigen::Vector<double,2> &x) override
190  {
191  return Eigen::Vector<double,2>{0.,0.};
192  }
193  Eigen::Vector<double,1> dE (size_t map_id, const Eigen::Vector<double,2> &x) override
194  {
195  return Eigen::Vector<double,1>{0.};
196  }
197  Eigen::Vector<double,1> rho (size_t map_id, const Eigen::Vector<double,2> &x) override
198  {
199  const double sqrt2 = std::sqrt(2);
200  const double X = x[0], r = x[0]*x[0]+x[1]*x[1];
201  if (map_id == 0) {
202  const double Da = (r*(sqrt2 + 2) - sqrt2*(1 + 2*X) + 2)/(r + 1);
203  if (Da < 0.5) {
204  constexpr double tau = 100.;
205  const double t = (_t < 1./tau)? tau*10.*_t : 0.;
206  return Eigen::Vector<double,1>{t*std::exp(-1./(0.5-Da))};
207  }
208  }
209  return Eigen::Vector<double,1>{0.};
210  }
211  Eigen::Vector<double,2> J (size_t map_id, const Eigen::Vector<double,2> &x) override
212  {
213  return Eigen::Vector<double,2>{0.,0.};
214  }
215 };
216 
217 struct Solution5 final : public Solution {
218  Eigen::Vector<double,1> B (size_t map_id, const Eigen::Vector<double,2> &x) override
219  {
220  const double sqrt2 = std::sqrt(2);
221  const double X = x[0], r = x[0]*x[0]+x[1]*x[1];
222  if (map_id < 2) {
223  const double Da = (r*(sqrt2 + 2) - sqrt2*(1 + 2*X) + 2)/(r + 1);
224  if (Da < 0.5) {
225  return Eigen::Vector<double,1>{20*std::exp(-1./(0.5-Da))};
226  }
227  }
228  return Eigen::Vector<double,1>{0.};
229  }
230  Eigen::Vector<double,2> E (size_t map_id, const Eigen::Vector<double,2> &x) override
231  {
232  return Eigen::Vector<double,2>{0.,0.};
233  }
234  Eigen::Vector<double,1> dE (size_t map_id, const Eigen::Vector<double,2> &x) override
235  {
236  return Eigen::Vector<double,1>{0.};
237  }
238  Eigen::Vector<double,1> rho (size_t map_id, const Eigen::Vector<double,2> &x) override
239  {
240  return Eigen::Vector<double,1>{0.};
241  }
242  Eigen::Vector<double,2> J (size_t map_id, const Eigen::Vector<double,2> &x) override
243  {
244  return Eigen::Vector<double,2>{0.,0.};
245  }
246 };
247 
248 struct SolutionL1 final : public Solution {
249  SolutionL1 () : Solution(true) {;}
250  Eigen::Vector<double,1> B (size_t map_id, const Eigen::Vector<double,2> &x) override
251  {
252  const double X2 = x[0]*x[0], Y2 = x[1]*x[1];
253  //const double tmp = ((map_id == 1)? -1 : 1)*std::cos(std::numbers::sqrt2*_t)*(1-X2-Y2)/(1+X2+Y2);
254  //const double tmp = std::cos(std::numbers::sqrt2*_t)*(1-X2-Y2)/(1+X2+Y2);
255  const double tmp = std::cos(std::numbers::sqrt2*_t)*(1-X2-Y2)/(1+X2+Y2)*4/std::pow(1+X2+Y2,2);
256  return Eigen::Vector<double,1>{tmp};
257  }
258  Eigen::Vector<double,2> E (size_t map_id, const Eigen::Vector<double,2> &x) override
259  {
260  const double X2 = x[0]*x[0], Y2 = x[1]*x[1];
261  const double tmp = std::sin(std::numbers::sqrt2*_t)/std::numbers::sqrt2*4./(1+X2+Y2)/(1+X2+Y2);
262  return Eigen::Vector<double,2>{-x[1],x[0]}*tmp;
263  }
264  Eigen::Vector<double,1> dE (size_t map_id, const Eigen::Vector<double,2> &x) override
265  {
266  const double X2 = x[0]*x[0], Y2 = x[1]*x[1];
267  //const double tmp = ((map_id == 1)? 1 : -1)*std::numbers::sqrt2*std::sin(std::numbers::sqrt2*_t)*(1-X2-Y2)/(1+X2+Y2);
268  //const double tmp = std::numbers::sqrt2*std::sin(std::numbers::sqrt2*_t)*(1-X2-Y2)/(1+X2+Y2);
269  const double tmp = std::numbers::sqrt2*std::sin(std::numbers::sqrt2*_t)*(1-X2-Y2)/(1+X2+Y2)*4/std::pow(1+X2+Y2,2);
270  return Eigen::Vector<double,1>{tmp};
271  }
272  Eigen::Vector<double,1> rho (size_t map_id, const Eigen::Vector<double,2> &x) override
273  {
274  return Eigen::Vector<double,1>{0.};
275  }
276  Eigen::Vector<double,2> J (size_t map_id, const Eigen::Vector<double,2> &x) override
277  {
278  return Eigen::Vector<double,2>{0.,0.};
279  }
280 };
281 
282 #endif
283 
Definition: sphere_ref.hpp:18
Eigen::Vector< double, 1 > dE(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:45
Eigen::Vector< double, 2 > J(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:59
Eigen::Vector< double, 1 > B(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:19
Eigen::Vector< double, 2 > E(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:29
Eigen::Vector< double, 1 > rho(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:55
Definition: sphere_ref.hpp:81
Eigen::Vector< double, 1 > B(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:83
Solution1()
Definition: sphere_ref.hpp:82
Eigen::Vector< double, 1 > rho(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:103
Eigen::Vector< double, 1 > dE(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:99
Eigen::Vector< double, 2 > J(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:107
Eigen::Vector< double, 2 > E(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:95
Definition: sphere_ref.hpp:113
Eigen::Vector< double, 1 > B(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:115
Eigen::Vector< double, 1 > dE(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:135
Eigen::Vector< double, 2 > E(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:127
Eigen::Vector< double, 1 > rho(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:139
Eigen::Vector< double, 2 > J(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:143
Solution2()
Definition: sphere_ref.hpp:114
Definition: sphere_ref.hpp:149
Eigen::Vector< double, 2 > E(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:156
Eigen::Vector< double, 2 > J(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:178
Eigen::Vector< double, 1 > dE(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:160
Eigen::Vector< double, 1 > rho(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:164
Eigen::Vector< double, 1 > B(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:151
Solution3()
Definition: sphere_ref.hpp:150
Definition: sphere_ref.hpp:184
Eigen::Vector< double, 1 > B(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:185
Eigen::Vector< double, 1 > rho(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:197
Eigen::Vector< double, 1 > dE(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:193
Eigen::Vector< double, 2 > E(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:189
Eigen::Vector< double, 2 > J(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:211
Definition: sphere_ref.hpp:217
Eigen::Vector< double, 2 > J(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:242
Eigen::Vector< double, 2 > E(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:230
Eigen::Vector< double, 1 > dE(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:234
Eigen::Vector< double, 1 > rho(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:238
Eigen::Vector< double, 1 > B(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:218
Definition: sphere_ref.hpp:248
Eigen::Vector< double, 1 > B(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:250
Eigen::Vector< double, 1 > rho(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:272
Eigen::Vector< double, 2 > E(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:258
Eigen::Vector< double, 2 > J(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:276
Eigen::Vector< double, 1 > dE(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: sphere_ref.hpp:264
SolutionL1()
Definition: sphere_ref.hpp:249
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:15
Solution(bool Jz)
Definition: sphere_ref.hpp:14
virtual Eigen::Vector< double, 1 > dE(size_t map_id, const Eigen::Vector< double, 2 > &)=0
bool _JZero
Definition: sphere_ref.hpp:13
virtual Eigen::Vector< double, 1 > B(size_t map_id, const Eigen::Vector< double, 2 > &)=0