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 #include "algebra/algebra.h"
14 
29 template <int N,int NPI>
30 class element
31  {
33  public:
34  explicit element(const std::vector<Nodes::Node> &_p_node ,
35  const int _idx ,
36  std::initializer_list<int> & _i
37  ) : idxPrm(_idx), refNode(_p_node)
38  {
39  if(_i.size() == N)
40  { ind.assign(_i); }
41  else
42  {
43  std::cout<<"Warning: element constructor is given an init list with size() != N\n";
44  }
45  Kp.setZero();
46  Lp.setZero();
47  }
48 
50  std::vector<int> ind;
51 
53  int idxPrm;
54 
56  Eigen::Matrix<double,NPI,1> weight;
57 
59  Eigen::Matrix<double,2*N,2*N> Kp;
60 
62  Eigen::Matrix<double,2*N,1> Lp;
63 
65  inline constexpr int getN(void) const { return N; }
66 
68  inline constexpr int getNPI(void) const { return NPI; }
69 
78  void buildMatP(Eigen::Ref<Eigen::Matrix<double,2*N,3*N>> P )
79  {
80  P.setZero();
81  Eigen::Matrix<double,Nodes::DIM,N,Eigen::RowMajor> tempo;
82  for (int i = 0; i < N; i++) { tempo.col(i) = getNode(i).ep; }
83 
84  P.template block<N,N>(0,0).diagonal() = tempo.row(Nodes::IDX_X);
85  P.template block<N,N>(0,N).diagonal() = tempo.row(Nodes::IDX_Y);
86  P.template block<N,N>(0,2*N).diagonal() = tempo.row(Nodes::IDX_Z);
87 
88  for (int i = 0; i < N; i++) { tempo.col(i) = getNode(i).eq; }
89 
90  P.template block<N,N>(N,0).diagonal() = tempo.row(Nodes::IDX_X);
91  P.template block<N,N>(N,N).diagonal() = tempo.row(Nodes::IDX_Y);
92  P.template block<N,N>(N,2*N).diagonal() = tempo.row(Nodes::IDX_Z);
93  }
94 
96  virtual void getPtGauss(Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> result) const = 0;
97 
99  void infos(void)
100  {
101  std::cout << "idxPrm: " << idxPrm << " ind: {";
102  for(unsigned int i = 0; i < N-1; i++)
103  { std::cout << ind[i] << ": " << refNode[ind[i]].p << std::endl; }
104  std::cout << ind[N-1] <<": " << refNode[ind[N-1]].p << "}\n";
105  }
106 
109  virtual Eigen::Matrix<double,NPI,1> charges(const double &Ms_or_dMs,
110  std::function<Eigen::Vector3d(const Nodes::Node&)> getter) const = 0;
111 
112  protected:
114  inline const Nodes::Node & getNode(const int i) const { return refNode[ind[i]]; }
115 
117  inline bool existNodes(void) const { return (refNode.size() > 0); }
118 
120  inline void zeroBasing(void)
121  { std::for_each(ind.begin(),ind.end(),[](int & _i){ _i--; } ); }
122 
123  private:
125  const std::vector<Nodes::Node> & refNode;
126 
128  virtual void orientate() = 0;
129  };
130 #endif
set of class to handle sparse matrix operations for gradient conjugate algorithms a sparse vector cla...
Template abstract class, mother class for tetraedrons and facettes.
Definition: element.h:31
int idxPrm
Definition: element.h:53
void zeroBasing(void)
Definition: element.h:120
Eigen::Matrix< double, 2 *N, 1 > Lp
Definition: element.h:62
constexpr int getNPI(void) const
Definition: element.h:68
void buildMatP(Eigen::Ref< Eigen::Matrix< double, 2 *N, 3 *N >> P)
Definition: element.h:78
virtual void getPtGauss(Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> result) const =0
Eigen::Matrix< double, NPI, 1 > weight
Definition: element.h:56
virtual void orientate()=0
std::vector< int > ind
Definition: element.h:50
virtual Eigen::Matrix< double, NPI, 1 > charges(const double &Ms_or_dMs, std::function< Eigen::Vector3d(const Nodes::Node &)> getter) const =0
void infos(void)
Definition: element.h:99
element(const std::vector< Nodes::Node > &_p_node, const int _idx, std::initializer_list< int > &_i)
Definition: element.h:34
constexpr int getN(void) const
Definition: element.h:65
bool existNodes(void) const
Definition: element.h:117
Eigen::Matrix< double, 2 *N, 2 *N > Kp
Definition: element.h:59
const Nodes::Node & getNode(const int i) const
Definition: element.h:114
const std::vector< Nodes::Node > & refNode
Definition: element.h:125
const int N
Definition: facette.h:18
const int NPI
Definition: facette.h:43
const int P
Definition: fmm_demag.h:26
header to define struct Node
Definition: node.h:61
Eigen::Vector3d eq
Definition: node.h:65
Eigen::Vector3d ep
Definition: node.h:63