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