Feellgood
facette.h
Go to the documentation of this file.
1 #ifndef facette_h
2 #define facette_h
3 
10 #include "element.h"
11 
15 namespace Facette
16  {
17 const int N = 3;
18 const int NPI = 4;
20 constexpr double u[NPI] = {1 / 3., 1 / 5., 3 / 5.,
21  1 / 5.};
22 constexpr double v[NPI] = {1 / 3., 1 / 5., 1 / 5.,
23  3 / 5.};
24 constexpr double pds[NPI] = {-27 / 96., 25 / 96., 25 / 96.,
25  25 / 96.};
28 constexpr double a[N][NPI] = {
29  {1. - u[0] - v[0], 1. - u[1] - v[1], 1. - u[2] - v[2], 1. - u[3] - v[3]},
30  {u[0], u[1], u[2], u[3]},
31  {v[0], v[1], v[2], v[3]}};
32 
34 const Eigen::Matrix<double,N,NPI> eigen_a = (Eigen::MatrixXd(N,NPI) << a[0][0], a[0][1], a[0][2], a[0][3],
35  a[1][0], a[1][1], a[1][2], a[1][3],
36  a[2][0], a[2][1], a[2][2], a[2][3] ).finished();
37 
41 struct prm
42  {
43  std::string regName;
45  double Ks;
46  Eigen::Vector3d uk;
49  inline void infos()
50  {
51  std::cout << "surface region name = " << regName
52  << " ; suppress charges = " << suppress_charges << std::endl;
53 
54  if (Ks != 0)
55  {
56  std::cout << "Ks*a = " << Ks << "*[ " << uk << "]" << std::endl;
57  }
58  else
59  std::cout << "no surface anisotropy" << std::endl;
60  };
61  };
62 
67 class Fac : public element<N,NPI>
68  {
69 public:
71  inline Fac(const std::vector<Nodes::Node> &_p_node ,
72  const int _NOD ,
73  const int _idx ,
74  std::initializer_list<int> _i )
75  : element<N,NPI>(_p_node,_idx,_i),dMs(0)
76  {
77  if (_NOD > 0)
78  {
79  zeroBasing();
80  surf = calc_surf();
81  n = calc_norm();
82  }
83  else
84  {
85  surf = 0.0;
86  n = Eigen::Vector3d(0,0,0);
87  } // no index shift here if NOD == 0 : usefull while reordering face indices
88 
89  for(int i=0;i<NPI;i++)
90  { weight[i] = 2.0 * surf * Facette::pds[i]; }
91  }
92 
94  double surf;
95 
97  double dMs;
98 
100  Eigen::Vector3d n;
101 
105  void interpolation(std::function<Eigen::Vector3d(Nodes::Node)> getter ,
106  Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> result ) const
107  {
108  Eigen::Matrix<double,Nodes::DIM,N> vec_nod;
109  for (int i = 0; i < N; i++) vec_nod.col(i) = getter(getNode(i));
110 
111  result = vec_nod * eigen_a;
112  }
113 
117  void interpolation(std::function<double(Nodes::Node)> getter ,
118  Eigen::Ref<Eigen::Matrix<double,NPI,1>> result ) const
119  {
120  Eigen::Matrix<double,N,1> scalar_nod;
121  for (int i = 0; i < N; i++) scalar_nod(i) = getter(getNode(i));
122 
123  result = scalar_nod.transpose() * eigen_a;
124  }
125 
127  void integrales(Facette::prm const &params );
128 
130  double anisotropyEnergy(Facette::prm const &param ,
131  Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> const u ) const;
132 
134  void charges(Facette::prm const &param ,
135  std::function<Eigen::Vector3d(Nodes::Node)> getter ,
136  std::vector<double> &srcDen ,
137  int &nsrc ,
138  std::vector<double> &corr ) const;
139 
141  double demagEnergy(Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> u ,
142  Eigen::Ref<Eigen::Matrix<double,NPI,1>> phi ) const;
143 
145  double potential(std::function<Eigen::Vector3d(Nodes::Node)> getter, int i) const;
146 
148  inline bool operator<(const Fac &f) const
149  {
150  return (this->ind[0] < f.ind[0])
151  || ((this->ind[0] == f.ind[0])
152  && ((this->ind[1] < f.ind[1])
153  || ((this->ind[1] == f.ind[1]) && (this->ind[2] < f.ind[2]))));
154  }
155 
157  inline Eigen::Vector3d calc_norm(void) const
158  {
159  Eigen::Vector3d _n = normal_vect();
160  _n.normalize();
161  return _n;
162  }
163 
165  void getPtGauss(Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> result) const
166  {
167  Eigen::Matrix<double,Nodes::DIM,N> vec_nod;
168  for (int i = 0; i < N; i++)
169  {
170  vec_nod.col(i) << getNode(i).p;
171  }
172  result = vec_nod * eigen_a;
173  }
174 
175 private:
176  void orientate(void) {}// orientation is done in mesh::indexReorder
177 
179  inline double calc_surf(void) const { return 0.5 * normal_vect().norm(); }
180 
182  inline Eigen::Vector3d normal_vect() const
183  {
184  Eigen::Vector3d p0p1 = getNode(1).p - getNode(0).p;
185  Eigen::Vector3d p0p2 = getNode(2).p - getNode(0).p;
186 
187  return p0p1.cross(p0p2);
188  }
189  }; // end class Fac
190 
191  } // namespace Facette
192 
193 #endif /* facette_h */
Definition: facette.h:68
double surf
Definition: facette.h:94
bool operator<(const Fac &f) const
Definition: facette.h:148
void orientate(void)
Definition: facette.h:176
void interpolation(std::function< Eigen::Vector3d(Nodes::Node)> getter, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> result) const
Definition: facette.h:105
double potential(std::function< Eigen::Vector3d(Nodes::Node)> getter, int i) const
Definition: facette.cpp:88
double dMs
Definition: facette.h:97
Eigen::Vector3d normal_vect() const
Definition: facette.h:182
double demagEnergy(Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> u, Eigen::Ref< Eigen::Matrix< double, NPI, 1 >> phi) const
Definition: facette.cpp:82
void interpolation(std::function< double(Nodes::Node)> getter, Eigen::Ref< Eigen::Matrix< double, NPI, 1 >> result) const
Definition: facette.h:117
void charges(Facette::prm const &param, std::function< Eigen::Vector3d(Nodes::Node)> getter, std::vector< double > &srcDen, int &nsrc, std::vector< double > &corr) const
Definition: facette.cpp:49
Eigen::Vector3d n
Definition: facette.h:100
double calc_surf(void) const
Definition: facette.h:179
Fac(const std::vector< Nodes::Node > &_p_node, const int _NOD, const int _idx, std::initializer_list< int > _i)
Definition: facette.h:71
void integrales(Facette::prm const &params)
Definition: facette.cpp:6
Eigen::Vector3d calc_norm(void) const
Definition: facette.h:157
double anisotropyEnergy(Facette::prm const &param, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> const u) const
Definition: facette.cpp:42
void getPtGauss(Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> result) const
Definition: facette.h:165
Template abstract class, mother class for tetraedrons and facettes.
Definition: element.h:25
void zeroBasing(void)
Definition: element.h:140
Eigen::Matrix< double, NPI, 1 > weight
Definition: element.h:50
std::vector< int > ind
Definition: element.h:44
const Nodes::Node & getNode(const int i) const
Definition: element.h:133
const int N
Definition: facette.h:17
constexpr double pds[NPI]
Definition: facette.h:24
constexpr double u[NPI]
Definition: facette.h:20
const Eigen::Matrix< double, N, NPI > eigen_a
Definition: facette.h:34
constexpr double v[NPI]
Definition: facette.h:22
const int NPI
Definition: facette.h:18
constexpr double a[N][NPI]
Definition: facette.h:28
Definition: facette.h:42
Eigen::Vector3d uk
Definition: facette.h:46
void infos()
Definition: facette.h:49
bool suppress_charges
Definition: facette.h:44
double Ks
Definition: facette.h:45
std::string regName
Definition: facette.h:43
Definition: node.h:61
Eigen::Vector3d p
Definition: node.h:62