4 #pragma GCC diagnostic push
5 #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
7 #pragma GCC diagnostic pop
9 #include <eigen3/Eigen/Sparse>
10 #include <eigen3/Eigen/Dense>
13 #include "algebra/algebra.h"
23 template <
int N,
int NPI>
28 explicit element(
const std::vector<Nodes::Node> &_p_node ,
30 std::initializer_list<int> & _i
37 std::cout<<
"Warning: element constructor is given an init list with size() != N\n";
53 Eigen::Matrix<double,2*N,2*N>
Kp;
56 Eigen::Matrix<double,2*N,1>
Lp;
59 inline constexpr
int getN(
void)
const {
return N; }
62 inline constexpr
int getNPI(
void)
const {
return NPI; }
71 void buildMatP(Eigen::Ref<Eigen::Matrix<double,2*N,3*N>>
P )
74 Eigen::Matrix<double,Nodes::DIM,N,Eigen::RowMajor> tempo;
75 for (
int i = 0; i <
N; i++) { tempo.col(i) =
getNode(i).
ep; }
77 P.template block<N,N>(0,0).diagonal() = tempo.row(Nodes::IDX_X);
78 P.template block<N,N>(0,
N).diagonal() = tempo.row(Nodes::IDX_Y);
79 P.template block<N,N>(0,2*
N).diagonal() = tempo.row(Nodes::IDX_Z);
81 for (
int i = 0; i <
N; i++) { tempo.col(i) =
getNode(i).
eq; }
83 P.template block<N,N>(
N,0).diagonal() = tempo.row(Nodes::IDX_X);
84 P.template block<N,N>(
N,
N).diagonal() = tempo.row(Nodes::IDX_Y);
85 P.template block<N,N>(
N,2*
N).diagonal() = tempo.row(Nodes::IDX_Z);
90 algebra::w_sparseMat &K )
const
92 for (
int i = 0; i <
N; i++)
96 for (
int j = 0; j <
N; j++)
99 if(
Kp(i,j) != 0) K.insert( NOD + i_, j_,
Kp(i,j) );
100 if (
Kp(i,
N + j) != 0) K.insert( NOD + i_, NOD + j_,
Kp(i,
N + j) );
101 if (
Kp(
N + i,j) != 0) K.insert( i_, j_,
Kp(
N + i,j) );
102 if (
Kp(
N + i,
N + j) != 0) K.insert( i_, NOD + j_,
Kp(
N + i,
N + j) );
109 algebra::Vector<double> &L )
const
111 for (
int i = 0; i <
N; i++)
113 const int i_ =
ind[i];
115 { L[NOD + i_] +=
Lp[i]; }
117 { L[i_] +=
Lp[
N + i]; }
124 std::cout <<
"idxPrm: " <<
idxPrm <<
" ind: {";
125 for(
unsigned int i = 0; i <
N-1; i++)
126 { std::cout <<
ind[i] <<
": " <<
refNode[
ind[i]].p << std::endl; }
131 virtual void getPtGauss(Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> result)
const = 0;
139 {
return (
refNode.size() > 0); }
143 { std::for_each(
ind.begin(),
ind.end(),[](
int & _i){ _i--; } ); }
Template abstract class, mother class for tetraedrons and facettes.
Definition: element.h:25
int idxPrm
Definition: element.h:47
void zeroBasing(void)
Definition: element.h:142
Eigen::Matrix< double, 2 *N, 1 > Lp
Definition: element.h:56
bool existNodes(void)
Definition: element.h:138
void assemblage_mat(const int NOD, algebra::w_sparseMat &K) const
Definition: element.h:89
void assemblage_vect(const int NOD, algebra::Vector< double > &L) const
Definition: element.h:108
constexpr int getNPI(void) const
Definition: element.h:62
void buildMatP(Eigen::Ref< Eigen::Matrix< double, 2 *N, 3 *N >> P)
Definition: element.h:71
void infos() const
Definition: element.h:122
virtual void getPtGauss(Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> result) const =0
Eigen::Matrix< double, NPI, 1 > weight
Definition: element.h:50
virtual void orientate()=0
std::vector< int > ind
Definition: element.h:44
element(const std::vector< Nodes::Node > &_p_node, const int _idx, std::initializer_list< int > &_i)
Definition: element.h:28
constexpr int getN(void) const
Definition: element.h:59
Eigen::Matrix< double, 2 *N, 2 *N > Kp
Definition: element.h:53
const Nodes::Node & getNode(const int i) const
Definition: element.h:135
const std::vector< Nodes::Node > & refNode
Definition: element.h:147
const int N
Definition: facette.h:17
const int NPI
Definition: facette.h:18
const int P
Definition: fmm_demag.h:25
header to define struct Node
Eigen::Vector3d eq
Definition: node.h:64
Eigen::Vector3d ep
Definition: node.h:63