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  bool _JZero = false;
14  virtual ~Solution(){;};
15 };
16 
17 // Notice: This solution is not smooth, B is continuous but not differentiable on two lines
18 // 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).
19 struct Solution0 final : public Solution {
20  Eigen::Vector<double,1> B (size_t map_id, const Eigen::Vector<double,2> &x) override
21  {
22  if (_t > 1. || _t < 0.) _t -= std::floor(_t);
23  const double X = x[0], Y = x[1];
24  const double w = (X < _t - 0.5) ? 1 : ((X > _t + 0.5) ? -1 : 0);
25  return Eigen::Vector<double,1>{2. + (Y-0.5)*(Y-0.5) + (X - _t + w)*(X - _t + w)};
26  }
27  Eigen::Vector<double,2> E (size_t map_id, const Eigen::Vector<double,2> &x) override
28  {
29  if (_t > 1. || _t < 0.) _t -= std::floor(_t);
30  const double X = x[0];
31  const double w = (X < _t - 0.5) ? 1 : ((X > _t + 0.5) ? -1 : 0);
32  return Eigen::Vector<double,2>{0., (X - _t + w)*(X - _t + w)};
33  }
34  Eigen::Vector<double,1> dE (size_t map_id, const Eigen::Vector<double,2> &x) override
35  {
36  if (_t > 1. || _t < 0.) _t -= std::floor(_t);
37  const double X = x[0];
38  const double w = (X < _t - 0.5) ? 1 : ((X > _t + 0.5) ? -1 : 0);
39  return Eigen::Vector<double,1>{2.*(X - _t + w)};
40  }
41  Eigen::Vector<double,1> rho (size_t map_id, const Eigen::Vector<double,2> &x) override
42  {
43  if (_t > 1. || _t < 0.) _t -= std::floor(_t);
44  return Eigen::Vector<double,1>{0.};
45  }
46  Eigen::Vector<double,2> J (size_t map_id, const Eigen::Vector<double,2> &x) override
47  {
48  if (_t > 1. || _t < 0.) _t -= std::floor(_t);
49  const double Y = x[1];
50  return Eigen::Vector<double,2>{2*Y - 1.,0};
51  }
52 };
53 
54 #endif
55 
Definition: sphere_ref.hpp:18
Eigen::Vector< double, 1 > dE(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: torus_ref.hpp:34
Eigen::Vector< double, 2 > J(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: torus_ref.hpp:46
Eigen::Vector< double, 1 > B(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: torus_ref.hpp:20
Eigen::Vector< double, 2 > E(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: torus_ref.hpp:27
Eigen::Vector< double, 1 > rho(size_t map_id, const Eigen::Vector< double, 2 > &x) override
Definition: torus_ref.hpp:41
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: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