Manicore
Library to implement schemes on n-dimensionnal manifolds.
torus_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 // Notice: This solution is not smooth, B is continuous but not differentiable on two lines
17 // B is the Euclidean distance to (t,1/2), and is not differentiable along y at (y = 0), and along x at (x = t + 1/2).
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  if (_t > 1. || _t < 0.) _t -= std::floor(_t);
22  const double X = x[0], Y = x[1];
23  const double w = (X < _t - 0.5) ? 1 : ((X > _t + 0.5) ? -1 : 0);
24  return Eigen::Vector<double,1>{2. + (Y-0.5)*(Y-0.5) + (X - _t + w)*(X - _t + w)};
25  }
26  Eigen::Vector<double,2> E (size_t map_id, const Eigen::Vector<double,2> &x) override
27  {
28  if (_t > 1. || _t < 0.) _t -= std::floor(_t);
29  const double X = x[0];
30  const double w = (X < _t - 0.5) ? 1 : ((X > _t + 0.5) ? -1 : 0);
31  return Eigen::Vector<double,2>{0., (X - _t + w)*(X - _t + w)};
32  }
33  Eigen::Vector<double,1> dE (size_t map_id, const Eigen::Vector<double,2> &x) override
34  {
35  if (_t > 1. || _t < 0.) _t -= std::floor(_t);
36  const double X = x[0];
37  const double w = (X < _t - 0.5) ? 1 : ((X > _t + 0.5) ? -1 : 0);
38  return Eigen::Vector<double,1>{2.*(X - _t + w)};
39  }
40  Eigen::Vector<double,1> rho (size_t map_id, const Eigen::Vector<double,2> &x) override
41  {
42  if (_t > 1. || _t < 0.) _t -= std::floor(_t);
43  return Eigen::Vector<double,1>{0.};
44  }
45  Eigen::Vector<double,2> J (size_t map_id, const Eigen::Vector<double,2> &x) override
46  {
47  if (_t > 1. || _t < 0.) _t -= std::floor(_t);
48  const double Y = x[1];
49  return Eigen::Vector<double,2>{2*Y - 1.,0};
50  }
51 };
52 
53 #endif
54 
Definition: sphere_ref.hpp:16
Eigen::Vector< double, 1 > dE(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: torus_ref.hpp:33
Eigen::Vector< double, 2 > J(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: torus_ref.hpp:45
Eigen::Vector< double, 1 > B(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: torus_ref.hpp:19
Eigen::Vector< double, 2 > E(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: torus_ref.hpp:26
Eigen::Vector< double, 1 > rho(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: torus_ref.hpp:40
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: torus_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