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 
28 template <int N,int NPI>
29 class element
30  {
32  public:
33  explicit element(const std::vector<Nodes::Node> &_p_node ,
34  const int _idx ,
35  const std::initializer_list<int> & _i
36  ) : idxPrm(_idx), refNode(_p_node)
37  {
38  if(_i.size() == N)
39  { //gmsh index convention Matlab/msh (one based) -> C++ (zero based)
40  int j(0);
41  std::for_each(_i.begin(),_i.end(), [this,&j](const int &idx){ ind[j] = idx-1;j++;});
42  }
43  else
44  {
45  std::cerr<<"Error: element constructor is given an init list with size() != N\n";
46  SYSTEM_ERROR;
47  }
48  Kp.setZero();
49  Lp.setZero();
50  }
51 
53  std::array<int,N> ind;
54 
56  int idxPrm;
57 
59  Eigen::Matrix<double,NPI,1> weight;
60 
62  Eigen::Matrix<double,2*N,2*N> Kp;
63 
65  Eigen::Matrix<double,2*N,1> Lp;
66 
68  inline constexpr int getN(void) const { return N; }
69 
71  inline constexpr int getNPI(void) const { return NPI; }
72 
81  void buildMatP(Eigen::Ref<Eigen::Matrix<double,2*N,3*N>> P )
82  {
83  P.setZero();
84  Eigen::Matrix<double,Nodes::DIM,N,Eigen::RowMajor> tempo;
85  for (int i = 0; i < N; i++) { tempo.col(i) = getNode(i).ep; }
86 
87  P.template block<N,N>(0,0).diagonal() = tempo.row(Nodes::IDX_X);
88  P.template block<N,N>(0,N).diagonal() = tempo.row(Nodes::IDX_Y);
89  P.template block<N,N>(0,2*N).diagonal() = tempo.row(Nodes::IDX_Z);
90 
91  for (int i = 0; i < N; i++) { tempo.col(i) = getNode(i).eq; }
92 
93  P.template block<N,N>(N,0).diagonal() = tempo.row(Nodes::IDX_X);
94  P.template block<N,N>(N,N).diagonal() = tempo.row(Nodes::IDX_Y);
95  P.template block<N,N>(N,2*N).diagonal() = tempo.row(Nodes::IDX_Z);
96  }
97 
99  virtual Eigen::Matrix<double,Nodes::DIM,NPI> getPtGauss(void) const = 0;
100 
102  void infos(void) const
103  {
104  std::cout << "idxPrm: " << idxPrm << " ind: {";
105  for(unsigned int i = 0; i < N-1; i++)
106  { std::cout << ind[i] << ": " << refNode[ind[i]].p << std::endl; }
107  std::cout << ind[N-1] <<": " << refNode[ind[N-1]].p << "}\n";
108  }
109 
112  virtual Eigen::Matrix<double,NPI,1> charges(const double &Ms_or_dMs,
113  const std::function<Eigen::Vector3d(const Nodes::Node&)> &getter) const = 0;
114 
119  inline bool existNodes(void) const
120  {
121  for(unsigned int i=0; i<N; i++)
122  {
123  if (ind[i] < 0 || ind[i] >= int(refNode.size()))
124  return false;
125  }
126  return true;
127  }
128 
129  protected:
131  inline const Nodes::Node & getNode(const int i) const { return refNode[ind[i]]; }
132 
133  private:
135  const std::vector<Nodes::Node> & refNode;
136 
138  virtual void orientate() = 0;
139  };
140 #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 triangles.
Definition: element.h:30
int idxPrm
Definition: element.h:56
Eigen::Matrix< double, 2 *N, 1 > Lp
Definition: element.h:65
constexpr int getNPI(void) const
Definition: element.h:71
void infos(void) const
Definition: element.h:102
void buildMatP(Eigen::Ref< Eigen::Matrix< double, 2 *N, 3 *N >> P)
Definition: element.h:81
Eigen::Matrix< double, NPI, 1 > weight
Definition: element.h:59
virtual void orientate()=0
virtual Eigen::Matrix< double, NPI, 1 > charges(const double &Ms_or_dMs, const std::function< Eigen::Vector3d(const Nodes::Node &)> &getter) const =0
element(const std::vector< Nodes::Node > &_p_node, const int _idx, const std::initializer_list< int > &_i)
Definition: element.h:33
constexpr int getN(void) const
Definition: element.h:68
bool existNodes(void) const
Definition: element.h:119
Eigen::Matrix< double, 2 *N, 2 *N > Kp
Definition: element.h:62
const Nodes::Node & getNode(const int i) const
Definition: element.h:131
std::array< int, N > ind
Definition: element.h:53
const std::vector< Nodes::Node > & refNode
Definition: element.h:135
virtual Eigen::Matrix< double, Nodes::DIM, NPI > getPtGauss(void) const =0
const int NPI
Definition: tetra.h:50
const int N
Definition: tetra.h:25
const int P
Definition: fmm_demag.h:26
header to define struct Node
Definition: node.h:60
Eigen::Vector3d eq
Definition: node.h:64
Eigen::Vector3d ep
Definition: node.h:62