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;
47  double V;
48  double J;
49  Eigen::Vector3d P;
50  Eigen::Vector3d s;
53  inline void infos()
54  {
55  std::cout << "surface region name = " << regName
56  << " ; suppress charges = " << suppress_charges << std::endl;
57 
58  if (Ks != 0)
59  {
60  std::cout << "Ks*a = " << Ks << "*[ " << uk << "]" << std::endl;
61  }
62  else
63  std::cout << "no surface anisotropy" << std::endl;
64  };
65  };
66 
71 class Fac : public element<N,NPI>
72  {
73 public:
75  inline Fac(const std::vector<Nodes::Node> &_p_node ,
76  const int _NOD ,
77  const int _idx ,
78  std::initializer_list<int> _i )
79  : element<N,NPI>(_p_node,_idx,_i),dMs(0)
80  {
81  if (_NOD > 0)
82  {
83  zeroBasing();
84  surf = calc_surf();
85  n = calc_norm();
86  }
87  else
88  {
89  surf = 0.0;
90  n = Eigen::Vector3d(0,0,0);
91  } // no index shift here if NOD == 0 : usefull while reordering face indices
92 
93  for(int i=0;i<NPI;i++)
94  { weight[i] = 2.0 * surf * Facette::pds[i]; }
95  }
96 
98  double surf;
99 
101  double dMs;
102 
104  Eigen::Vector3d n;
105 
109  void interpolation(std::function<Eigen::Vector3d(Nodes::Node)> getter ,
110  Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> result ) const
111  {
112  Eigen::Matrix<double,Nodes::DIM,N> vec_nod;
113  for (int i = 0; i < N; i++) vec_nod.col(i) = getter(getNode(i));
114 
115  result = vec_nod * eigen_a;
116  }
117 
121  void interpolation(std::function<double(Nodes::Node)> getter ,
122  Eigen::Ref<Eigen::Matrix<double,NPI,1>> result ) const
123  {
124  Eigen::Matrix<double,N,1> scalar_nod;
125  for (int i = 0; i < N; i++) scalar_nod(i) = getter(getNode(i));
126 
127  result = scalar_nod.transpose() * eigen_a;
128  }
129 
131  void integrales(Facette::prm const &params );
132 
134  double anisotropyEnergy(Facette::prm const &param ,
135  Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> const u ) const;
136 
138  void charges(Facette::prm const &param ,
139  std::function<Eigen::Vector3d(Nodes::Node)> getter ,
140  std::vector<double> &srcDen ,
141  int &nsrc ,
142  std::vector<double> &corr ) const;
143 
145  double demagEnergy(Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> u ,
146  Eigen::Ref<Eigen::Matrix<double,NPI,1>> phi ) const;
147 
149  double potential(std::function<Eigen::Vector3d(Nodes::Node)> getter, int i) const;
150 
152  inline bool operator<(const Fac &f) const
153  {
154  return (this->ind[0] < f.ind[0])
155  || ((this->ind[0] == f.ind[0])
156  && ((this->ind[1] < f.ind[1])
157  || ((this->ind[1] == f.ind[1]) && (this->ind[2] < f.ind[2]))));
158  }
159 
162  bool operator==(const Fac &f) const
163  {
164  const int a= this->ind[0];
165  const int b= this->ind[1];
166  const int c= this->ind[2];
167  const int i= f.ind[0];
168  const int j= f.ind[1];
169  const int k= f.ind[2];
170  return ((a==i)&&(b==j)&&(c==k))||((a==j)&&(b==i)&&(c==k))
171  ||((a==i)&&(b==k)&&(c==j))||((a==k)&&(b==i)&&(c==j))
172  ||((a==j)&&(b==k)&&(c==i))||((a==k)&&(b==j)&&(c==i));
173  }
174 
176  inline Eigen::Vector3d calc_norm(void) const
177  {
178  Eigen::Vector3d _n = normal_vect();
179  _n.normalize();
180  return _n;
181  }
182 
184  void getPtGauss(Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> result) const
185  {
186  Eigen::Matrix<double,Nodes::DIM,N> vec_nod;
187  for (int i = 0; i < N; i++)
188  {
189  vec_nod.col(i) << getNode(i).p;
190  }
191  result = vec_nod * eigen_a;
192  }
193 
195  inline double calc_surf(void) const { return 0.5 * normal_vect().norm(); }
196 
197 private:
199  void orientate(void) {}
200 
202  inline Eigen::Vector3d normal_vect() const
203  {
204  Eigen::Vector3d p0p1 = getNode(1).p - getNode(0).p;
205  Eigen::Vector3d p0p2 = getNode(2).p - getNode(0).p;
206 
207  return p0p1.cross(p0p2);
208  }
209  }; // end class Fac
210 
211  } // namespace Facette
212 
213 #endif /* facette_h */
Definition: facette.h:72
double surf
Definition: facette.h:98
bool operator<(const Fac &f) const
Definition: facette.h:152
void orientate(void)
Definition: facette.h:199
void interpolation(std::function< Eigen::Vector3d(Nodes::Node)> getter, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> result) const
Definition: facette.h:109
double potential(std::function< Eigen::Vector3d(Nodes::Node)> getter, int i) const
Definition: facette.cpp:80
double dMs
Definition: facette.h:101
Eigen::Vector3d normal_vect() const
Definition: facette.h:202
double demagEnergy(Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> u, Eigen::Ref< Eigen::Matrix< double, NPI, 1 >> phi) const
Definition: facette.cpp:74
bool operator==(const Fac &f) const
Definition: facette.h:162
void interpolation(std::function< double(Nodes::Node)> getter, Eigen::Ref< Eigen::Matrix< double, NPI, 1 >> result) const
Definition: facette.h:121
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:41
Eigen::Vector3d n
Definition: facette.h:104
double calc_surf(void) const
Definition: facette.h:195
Fac(const std::vector< Nodes::Node > &_p_node, const int _NOD, const int _idx, std::initializer_list< int > _i)
Definition: facette.h:75
void integrales(Facette::prm const &params)
Definition: facette.cpp:6
Eigen::Vector3d calc_norm(void) const
Definition: facette.h:176
double anisotropyEnergy(Facette::prm const &param, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> const u) const
Definition: facette.cpp:34
void getPtGauss(Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> result) const
Definition: facette.h:184
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:53
Eigen::Vector3d s
Definition: facette.h:50
Eigen::Vector3d P
Definition: facette.h:49
bool suppress_charges
Definition: facette.h:44
double Ks
Definition: facette.h:45
double J
Definition: facette.h:48
double V
Definition: facette.h:47
std::string regName
Definition: facette.h:43
Definition: node.h:61
Eigen::Vector3d p
Definition: node.h:62