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>
28 template <
int N,
int NPI>
33 explicit element(
const std::vector<Nodes::Node> &_p_node ,
35 const std::initializer_list<int> & _i
41 std::for_each(_i.begin(),_i.end(), [
this,&j](
const int &idx){ ind[j] = idx-1;j++;});
45 std::cerr<<
"Error: element constructor is given an init list with size() != N\n";
53 std::array<int,N>
ind;
62 Eigen::Matrix<double,2*N,2*N>
Kp;
65 Eigen::Matrix<double,2*N,1>
Lp;
68 inline constexpr
int getN(
void)
const {
return N; }
71 inline constexpr
int getNPI(
void)
const {
return NPI; }
81 void buildMatP(Eigen::Ref<Eigen::Matrix<double,2*N,3*N>>
P )
84 Eigen::Matrix<double,Nodes::DIM,N,Eigen::RowMajor> tempo;
85 for (
int i = 0; i <
N; i++) { tempo.col(i) =
getNode(i).
ep; }
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);
91 for (
int i = 0; i <
N; i++) { tempo.col(i) =
getNode(i).
eq; }
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);
99 virtual Eigen::Matrix<double,Nodes::DIM,NPI>
getPtGauss(
void)
const = 0;
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; }
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;
121 for(
unsigned int i=0; i<
N; i++)
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
Eigen::Vector3d eq
Definition: node.h:64
Eigen::Vector3d ep
Definition: node.h:62