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) const
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:
113  inline Tri(const std::vector<Nodes::Node> &_p_node ,
114  const int _idx ,
115  std::initializer_list<int> _i )
116  : element<N,NPI>(_p_node,_idx,_i),surf(0),dMs(0)
117  {
118  if (existNodes())
119  {
120  surf = calc_surf();
121  n = calc_norm();
122  for(int i=0;i<NPI;i++)
123  { weight[i] = 2.0 * surf * Triangle::pds[i]; }
124  }
125  else
126  { std::cerr<<"Error: Tri constructor has out of bound index\n"; }
127  }
128 
130  double surf;
131 
134  double dMs;
135 
137  Eigen::Vector3d n;
138 
142  void interpolation(const std::function<Eigen::Vector3d(Nodes::Node)>& getter ,
143  Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> result ) const
144  {
145  Eigen::Matrix<double,Nodes::DIM,N> vec_nod;
146  for (int i = 0; i < N; i++) vec_nod.col(i) = getter(getNode(i));
147 
148  result = vec_nod * eigen_a;
149  }
150 
154  void interpolation(const std::function<double(Nodes::Node)>& getter ,
155  Eigen::Ref<Eigen::Matrix<double,NPI,1>> result ) const
156  {
157  Eigen::Matrix<double,N,1> scalar_nod;
158  for (int i = 0; i < N; i++) scalar_nod(i) = getter(getNode(i));
159 
160  result = scalar_nod.transpose() * eigen_a;
161  }
162 
165  void integrales(Triangle::prm const &params );
166 
168  double anisotropyEnergy(Triangle::prm const &param ,
169  const Eigen::Ref<const Eigen::Matrix<double,Nodes::DIM,NPI>> u ) const;
170 
172  Eigen::Matrix<double,NPI,1> charges(const double &dMs ,
173  const std::function<Eigen::Vector3d(const Nodes::Node&)> &getter ) const override;
174 
177  void correctionCharges(const std::function<Eigen::Vector3d(Nodes::Node)>& getter ,
178  Eigen::Matrix<double,Triangle::NPI,1> &localCharges ,
179  std::vector<double> &corr ) const;
180 
182  double demagEnergy(Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> u ,
183  const Eigen::Ref<const Eigen::Matrix<double,NPI,1>> phi ) const;
184 
186  double potential(const std::function<Eigen::Vector3d(Nodes::Node)>& getter, int i) const;
187 
191  bool operator==(const Tri &f) const
192  {
193  /* As we rule out degenerate triangles, it is sufficient to test whether all the vertices
194  * of f are also vertices of this. */
195  return std::find(ind.begin(), ind.end(), f.ind[0]) != ind.end()
196  && std::find(ind.begin(), ind.end(), f.ind[1]) != ind.end()
197  && std::find(ind.begin(), ind.end(), f.ind[2]) != ind.end();
198  }
199 
201  inline Eigen::Vector3d calc_norm(void) const
202  {
203  Eigen::Vector3d _n = normal_vect();
204  _n.normalize();
205  return _n;
206  }
207 
209  Eigen::Matrix<double,Nodes::DIM,NPI> getPtGauss(void) const override
210  {
211  Eigen::Matrix<double,Nodes::DIM,N> vec_nod;
212  for (int i = 0; i < N; i++)
213  {
214  vec_nod.col(i) << getNode(i).p;
215  }
216  return vec_nod*eigen_a;
217  }
218 
220  inline double calc_surf(void) const { return 0.5 * normal_vect().norm(); }
221 
222 private:
224  void orientate(void) override {}
225 
227  inline Eigen::Vector3d normal_vect() const
228  {
229  Eigen::Vector3d p0p1 = getNode(1).p - getNode(0).p;
230  Eigen::Vector3d p0p2 = getNode(2).p - getNode(0).p;
231 
232  return p0p1.cross(p0p2);
233  }
234  }; // end class Tri
235 
236  } // namespace Triangle
237 
238 #endif /* triangle_h */
Definition: triangle.h:109
void integrales(Triangle::prm const &params)
Definition: triangle.cpp:6
double dMs
Definition: triangle.h:134
Eigen::Matrix< double, Nodes::DIM, NPI > getPtGauss(void) const override
Definition: triangle.h:209
double calc_surf(void) const
Definition: triangle.h:220
void interpolation(const std::function< double(Nodes::Node)> &getter, Eigen::Ref< Eigen::Matrix< double, NPI, 1 >> result) const
Definition: triangle.h:154
double anisotropyEnergy(Triangle::prm const &param, const Eigen::Ref< const Eigen::Matrix< double, Nodes::DIM, NPI >> u) const
Definition: triangle.cpp:38
Eigen::Vector3d n
Definition: triangle.h:137
void interpolation(const std::function< Eigen::Vector3d(Nodes::Node)> &getter, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> result) const
Definition: triangle.h:142
double surf
Definition: triangle.h:130
double demagEnergy(Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> u, const Eigen::Ref< const Eigen::Matrix< double, NPI, 1 >> phi) const
Definition: triangle.cpp:80
double potential(const std::function< Eigen::Vector3d(Nodes::Node)> &getter, int i) const
Definition: triangle.cpp:87
void orientate(void) override
Definition: triangle.h:224
bool operator==(const Tri &f) const
Definition: triangle.h:191
Eigen::Vector3d calc_norm(void) const
Definition: triangle.h:201
Eigen::Vector3d normal_vect() const
Definition: triangle.h:227
void correctionCharges(const std::function< Eigen::Vector3d(Nodes::Node)> &getter, Eigen::Matrix< double, Triangle::NPI, 1 > &localCharges, std::vector< double > &corr) const
Definition: triangle.cpp:61
Tri(const std::vector< Nodes::Node > &_p_node, const int _idx, std::initializer_list< int > _i)
Definition: triangle.h:113
Eigen::Matrix< double, NPI, 1 > charges(const double &dMs, const std::function< Eigen::Vector3d(const Nodes::Node &)> &getter) const override
Definition: triangle.cpp:45
Template abstract class, mother class for tetraedrons and triangles.
Definition: element.h:30
Eigen::Matrix< double, NPI, 1 > weight
Definition: element.h:59
bool existNodes(void) const
Definition: element.h:119
const Nodes::Node & getNode(const int i) const
Definition: element.h:131
std::array< int, N > ind
Definition: element.h:53
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:60
Eigen::Vector3d p
Definition: node.h:61
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
void infos(const bool spinAcc=false) const
Definition: triangle.h:84
double V
Definition: triangle.h:75
double jn
Definition: triangle.h:77
std::string regName
Definition: triangle.h:71