Feellgood
element.h
1 #ifndef element_h
2 #define element_h
3 
4 #pragma GCC diagnostic push
5 #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
6 #include <execution>
7 #pragma GCC diagnostic pop
8 
9 #include <eigen3/Eigen/Sparse>
10 #include <eigen3/Eigen/Dense>
11 
12 #include "node.h"
13 
22 template <int N,int NPI>
23 class element
24  {
26  public:
27  explicit element(const std::vector<Nodes::Node> &_p_node ,
28  const int _idx ,
29  std::initializer_list<int> & _i
30  ) : idxPrm(_idx), refNode(_p_node)
31  {
32  if(_i.size() == N)
33  { ind.assign(_i); }
34  else
35  {
36  std::cout<<"Warning: element constructor is given an init list with size() != N\n";
37  }
38  Lp.setZero();
39  }
40 
42  std::vector<int> ind;
43 
45  int idxPrm;
46 
48  Eigen::Matrix<double,NPI,1> weight;
49 
51  Eigen::Matrix<double,2*N,2*N> Kp;
52 
54  Eigen::Matrix<double,2*N,1> Lp;
55 
57  inline constexpr int getN(void) const { return N; }
58 
60  inline constexpr int getNPI(void) const { return NPI; }
61 
69  void buildMatP(Eigen::Ref<Eigen::Matrix<double,2*N,3*N>> P )
70  {
71  P.setZero();
72  Eigen::Matrix<double,Nodes::DIM,N,Eigen::RowMajor> tempo;
73  for (int i = 0; i < N; i++) { tempo.col(i) = getNode(i).ep; }
74 
75  P.template block<N,N>(0,0).diagonal() = tempo.row(Nodes::IDX_X);
76  P.template block<N,N>(0,N).diagonal() = tempo.row(Nodes::IDX_Y);
77  P.template block<N,N>(0,2*N).diagonal() = tempo.row(Nodes::IDX_Z);
78 
79  for (int i = 0; i < N; i++) { tempo.col(i) = getNode(i).eq; }
80 
81  P.template block<N,N>(N,0).diagonal() = tempo.row(Nodes::IDX_X);
82  P.template block<N,N>(N,N).diagonal() = tempo.row(Nodes::IDX_Y);
83  P.template block<N,N>(N,2*N).diagonal() = tempo.row(Nodes::IDX_Z);
84  }
85 
87  void assemblage_mat(const int NOD ,
88  std::vector<Eigen::Triplet<double>> &K ) const
89  {
90  for (int i = 0; i < N; i++)
91  {
92  int i_ = ind[i];
93 
94  for (int j = 0; j < N; j++)
95  {
96  int j_ = ind[j];
97  if(Kp(i,j) != 0) K.emplace_back( NOD + i_, j_, Kp(i,j) );
98  if (Kp(i,N + j) != 0) K.emplace_back( NOD + i_, NOD + j_, Kp(i,N + j) );
99  if (Kp(N + i,j) != 0) K.emplace_back( i_, j_, Kp(N + i,j) );
100  if (Kp(N + i,N + j) != 0) K.emplace_back( i_, NOD + j_, Kp(N + i,N + j) );
101  }
102  }
103  }
104 
106  void assemblage_vect(const int NOD ,
107  Eigen::Ref<Eigen::VectorXd> L ) const
108  {
109  for (int i = 0; i < N; i++)
110  {
111  const int i_ = ind[i];
112  if(Lp[i] != 0)
113  { L(NOD + i_) += Lp[i]; }
114  if(Lp[N+i] != 0)
115  { L(i_) += Lp[N + i]; }
116  }
117  }
118 
120  void infos() const
121  {
122  std::cout << "idxPrm: " << idxPrm << " ind: {";
123  for(unsigned int i = 0; i < N-1; i++)
124  { std::cout << ind[i] << ": " << refNode[ind[i]].p << std::endl; }
125  std::cout << ind[N-1] <<": " << refNode[ind[N-1]].p << "}\n";
126  };
127 
129  virtual void getPtGauss(Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> result) const = 0;
130 
131  protected:
133  inline const Nodes::Node & getNode(const int i) const { return refNode[ind[i]]; }
134 
136  inline bool existNodes(void)
137  { return (refNode.size() > 0); }
138 
140  inline void zeroBasing(void)
141  { std::for_each(ind.begin(),ind.end(),[](int & _i){ _i--; } ); }
142 
143  private:
145  const std::vector<Nodes::Node> & refNode;
146 
148  virtual void orientate() = 0;
149  };
150 
151 #endif
Template abstract class, mother class for tetraedrons and facettes.
Definition: element.h:24
int idxPrm
Definition: element.h:45
void assemblage_vect(const int NOD, Eigen::Ref< Eigen::VectorXd > L) const
Definition: element.h:106
void zeroBasing(void)
Definition: element.h:140
Eigen::Matrix< double, 2 *N, 1 > Lp
Definition: element.h:54
bool existNodes(void)
Definition: element.h:136
constexpr int getNPI(void) const
Definition: element.h:60
void buildMatP(Eigen::Ref< Eigen::Matrix< double, 2 *N, 3 *N >> P)
Definition: element.h:69
void infos() const
Definition: element.h:120
virtual void getPtGauss(Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> result) const =0
Eigen::Matrix< double, NPI, 1 > weight
Definition: element.h:48
virtual void orientate()=0
std::vector< int > ind
Definition: element.h:42
element(const std::vector< Nodes::Node > &_p_node, const int _idx, std::initializer_list< int > &_i)
Definition: element.h:27
constexpr int getN(void) const
Definition: element.h:57
void assemblage_mat(const int NOD, std::vector< Eigen::Triplet< double >> &K) const
Definition: element.h:87
Eigen::Matrix< double, 2 *N, 2 *N > Kp
Definition: element.h:51
const Nodes::Node & getNode(const int i) const
Definition: element.h:133
const std::vector< Nodes::Node > & refNode
Definition: element.h:145
const int N
Definition: facette.h:17
const int NPI
Definition: facette.h:18
const int P
Definition: fmm_demag.h:32
header to define struct Node
Definition: node.h:61
Eigen::Vector3d eq
Definition: node.h:64
Eigen::Vector3d ep
Definition: node.h:63