Feellgood
triangle.h
Go to the documentation of this file.
1 #ifndef triangle_h
2 #define triangle_h
3 
10 #include "element.h"
11 
15 namespace Triangle
16  {
18 const int N = 3;
19 
20 #if ONE_GAUSS_POINT // Single Gauss point at barycenter of triangle
22  const int NPI = 1;
23 
25  constexpr double u[NPI] = {1. / 3.};
26 
28  constexpr double v[NPI] = {1. / 3.};
29 
31  constexpr double pds[NPI] = {1. / 2.};
32 
36  constexpr double a[N][NPI] = { {1. - u[0] - v[0]}, {u[0]}, {v[0]}};
37 
39  const Eigen::Matrix<double,N,NPI> eigen_a =
40  (Eigen::MatrixXd(N,NPI) << a[0][0], a[1][0], a[2][0] ).finished();
41 #else
43  const int NPI = 4;
44 
46  constexpr double u[NPI] = {1 / 3., 1 / 5., 3 / 5., 1 / 5.};
47 
49  constexpr double v[NPI] = {1 / 3., 1 / 5., 1 / 5., 3 / 5.};
50 
52  constexpr double pds[NPI] = {-27 / 96., 25 / 96., 25 / 96., 25 / 96.};
53 
55  constexpr double a[N][NPI] = {
56  {1. - u[0] - v[0], 1. - u[1] - v[1], 1. - u[2] - v[2], 1. - u[3] - v[3]},
57  {u[0], u[1], u[2], u[3]},
58  {v[0], v[1], v[2], v[3]}};
59 
61  const Eigen::Matrix<double,N,NPI> eigen_a =
62  (Eigen::MatrixXd(N,NPI) << a[0][0], a[0][1], a[0][2], a[0][3],
63  a[1][0], a[1][1], a[1][2], a[1][3],
64  a[2][0], a[2][1], a[2][2], a[2][3] ).finished();
65 #endif
69 struct prm
70  {
71  std::string regName;
73  double Ks;
74  Eigen::Vector3d uk;
75  double V;
77  double jn;
79  Eigen::Vector3d uP;
81  Eigen::Vector3d s;
84  inline void infos(const bool spinAcc = false)
85  {
86  std::cout << "surface region name = " << regName
87  << " ; suppress charges = " << suppress_charges << std::endl;
88 
89  if (Ks != 0)
90  {
91  std::cout << "Ks*a = " << Ks << "*[ " << uk << "]" << std::endl;
92  }
93  else
94  std::cout << "no surface anisotropy" << std::endl;
95 
96  if (spinAcc)
97  {
98  std::cout<< "V= " << V << "; jn= " << jn << "; uP= " << uP << "; s= " << s << std::endl;
99  }
100  };
101  };
102 
108 class Tri : public element<N,NPI>
109  {
110 public:
115  inline Tri(const std::vector<Nodes::Node> &_p_node ,
116  const int _NOD ,
117  const int _idx ,
118  std::initializer_list<int> _i )
119  : element<N,NPI>(_p_node,_idx,_i),dMs(0)
120  {
121  if (_NOD > 0)
122  {
123  zeroBasing();
124  surf = calc_surf();
125  n = calc_norm();
126  }
127  else
128  {
129  surf = 0.0;
130  n = Eigen::Vector3d(0,0,0);
131  } // no index shift here if NOD == 0 : usefull while reordering triangle indices
132 
133  for(int i=0;i<NPI;i++)
134  { weight[i] = 2.0 * surf * Triangle::pds[i]; }
135  }
136 
138  double surf;
139 
142  double dMs;
143 
145  Eigen::Vector3d n;
146 
150  void interpolation(std::function<Eigen::Vector3d(Nodes::Node)> getter ,
151  Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> result ) const
152  {
153  Eigen::Matrix<double,Nodes::DIM,N> vec_nod;
154  for (int i = 0; i < N; i++) vec_nod.col(i) = getter(getNode(i));
155 
156  result = vec_nod * eigen_a;
157  }
158 
162  void interpolation(std::function<double(Nodes::Node)> getter ,
163  Eigen::Ref<Eigen::Matrix<double,NPI,1>> result ) const
164  {
165  Eigen::Matrix<double,N,1> scalar_nod;
166  for (int i = 0; i < N; i++) scalar_nod(i) = getter(getNode(i));
167 
168  result = scalar_nod.transpose() * eigen_a;
169  }
170 
173  void integrales(Triangle::prm const &params );
174 
176  double anisotropyEnergy(Triangle::prm const &param ,
177  Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> const u ) const;
178 
180  Eigen::Matrix<double,NPI,1> charges(const double &dMs ,
181  std::function<Eigen::Vector3d(const Nodes::Node&)> getter ) const;
182 
185  void correctionCharges(std::function<Eigen::Vector3d(Nodes::Node)> getter ,
186  Eigen::Matrix<double,Triangle::NPI,1> &localCharges ,
187  std::vector<double> &corr );
188 
190  double demagEnergy(Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> u ,
191  Eigen::Ref<Eigen::Matrix<double,NPI,1>> phi ) const;
192 
194  double potential(std::function<Eigen::Vector3d(Nodes::Node)> getter, int i) const;
195 
197  inline bool operator<(const Tri &f) const
198  {
199  return (this->ind[0] < f.ind[0])
200  || ((this->ind[0] == f.ind[0])
201  && ((this->ind[1] < f.ind[1])
202  || ((this->ind[1] == f.ind[1]) && (this->ind[2] < f.ind[2]))));
203  }
204 
207  bool operator==(const Tri &f) const
208  {
209  const int a= this->ind[0];
210  const int b= this->ind[1];
211  const int c= this->ind[2];
212  const int i= f.ind[0];
213  const int j= f.ind[1];
214  const int k= f.ind[2];
215  return ((a==i)&&(b==j)&&(c==k))||((a==j)&&(b==i)&&(c==k))
216  ||((a==i)&&(b==k)&&(c==j))||((a==k)&&(b==i)&&(c==j))
217  ||((a==j)&&(b==k)&&(c==i))||((a==k)&&(b==j)&&(c==i));
218  }
219 
221  inline Eigen::Vector3d calc_norm(void) const
222  {
223  Eigen::Vector3d _n = normal_vect();
224  _n.normalize();
225  return _n;
226  }
227 
229  void getPtGauss(Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> result) const
230  {
231  Eigen::Matrix<double,Nodes::DIM,N> vec_nod;
232  for (int i = 0; i < N; i++)
233  {
234  vec_nod.col(i) << getNode(i).p;
235  }
236  result = vec_nod * eigen_a;
237  }
238 
240  inline double calc_surf(void) const { return 0.5 * normal_vect().norm(); }
241 
242 private:
244  void orientate(void) {}
245 
247  inline Eigen::Vector3d normal_vect() const
248  {
249  Eigen::Vector3d p0p1 = getNode(1).p - getNode(0).p;
250  Eigen::Vector3d p0p2 = getNode(2).p - getNode(0).p;
251 
252  return p0p1.cross(p0p2);
253  }
254  }; // end class Tri
255 
256  } // namespace Triangle
257 
258 #endif /* triangle_h */
Definition: triangle.h:109
double potential(std::function< Eigen::Vector3d(Nodes::Node)> getter, int i) const
Definition: triangle.cpp:88
void integrales(Triangle::prm const &params)
Definition: triangle.cpp:6
Eigen::Matrix< double, NPI, 1 > charges(const double &dMs, std::function< Eigen::Vector3d(const Nodes::Node &)> getter) const
Definition: triangle.cpp:45
double dMs
Definition: triangle.h:142
void getPtGauss(Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> result) const
Definition: triangle.h:229
void orientate(void)
Definition: triangle.h:244
double calc_surf(void) const
Definition: triangle.h:240
double demagEnergy(Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> u, Eigen::Ref< Eigen::Matrix< double, NPI, 1 >> phi) const
Definition: triangle.cpp:81
bool operator<(const Tri &f) const
Definition: triangle.h:197
Eigen::Vector3d n
Definition: triangle.h:145
double surf
Definition: triangle.h:138
Tri(const std::vector< Nodes::Node > &_p_node, const int _NOD, const int _idx, std::initializer_list< int > _i)
Definition: triangle.h:115
double anisotropyEnergy(Triangle::prm const &param, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> const u) const
Definition: triangle.cpp:38
bool operator==(const Tri &f) const
Definition: triangle.h:207
void interpolation(std::function< double(Nodes::Node)> getter, Eigen::Ref< Eigen::Matrix< double, NPI, 1 >> result) const
Definition: triangle.h:162
Eigen::Vector3d calc_norm(void) const
Definition: triangle.h:221
Eigen::Vector3d normal_vect() const
Definition: triangle.h:247
void correctionCharges(std::function< Eigen::Vector3d(Nodes::Node)> getter, Eigen::Matrix< double, Triangle::NPI, 1 > &localCharges, std::vector< double > &corr)
Definition: triangle.cpp:61
void interpolation(std::function< Eigen::Vector3d(Nodes::Node)> getter, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> result) const
Definition: triangle.h:150
Template abstract class, mother class for tetraedrons and triangles.
Definition: element.h:31
void zeroBasing(void)
Definition: element.h:132
Eigen::Matrix< double, NPI, 1 > weight
Definition: element.h:57
std::vector< int > ind
Definition: element.h:51
const Nodes::Node & getNode(const int i) const
Definition: element.h:129
Definition: spinAccumulationSolver.h:23
const Eigen::Matrix< double, N, NPI > eigen_a
Definition: triangle.h:61
constexpr double pds[NPI]
Definition: triangle.h:52
constexpr double u[NPI]
Definition: triangle.h:46
constexpr double v[NPI]
Definition: triangle.h:49
const int N
Definition: triangle.h:18
constexpr double a[N][NPI]
Definition: triangle.h:55
const int NPI
Definition: triangle.h:43
Definition: node.h:61
Eigen::Vector3d p
Definition: node.h:62
Definition: triangle.h:70
Eigen::Vector3d s
Definition: triangle.h:81
Eigen::Vector3d uP
Definition: triangle.h:79
double Ks
Definition: triangle.h:73
bool suppress_charges
Definition: triangle.h:72
Eigen::Vector3d uk
Definition: triangle.h:74
double V
Definition: triangle.h:75
double jn
Definition: triangle.h:77
void infos(const bool spinAcc=false)
Definition: triangle.h:84
std::string regName
Definition: triangle.h:71