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>
29 template <
int N,
int NPI>
34 explicit element(
const std::vector<Nodes::Node> &_p_node ,
36 const std::initializer_list<int> & _i
43 std::cerr<<
"Warning: element constructor is given an init list with size() != N\n";
60 Eigen::Matrix<double,2*N,2*N>
Kp;
63 Eigen::Matrix<double,2*N,1>
Lp;
66 inline constexpr
int getN(
void)
const {
return N; }
69 inline constexpr
int getNPI(
void)
const {
return NPI; }
79 void buildMatP(Eigen::Ref<Eigen::Matrix<double,2*N,3*N>>
P )
82 Eigen::Matrix<double,Nodes::DIM,N,Eigen::RowMajor> tempo;
83 for (
int i = 0; i <
N; i++) { tempo.col(i) =
getNode(i).
ep; }
85 P.template block<N,N>(0,0).diagonal() = tempo.row(Nodes::IDX_X);
86 P.template block<N,N>(0,
N).diagonal() = tempo.row(Nodes::IDX_Y);
87 P.template block<N,N>(0,2*
N).diagonal() = tempo.row(Nodes::IDX_Z);
89 for (
int i = 0; i <
N; i++) { tempo.col(i) =
getNode(i).
eq; }
91 P.template block<N,N>(
N,0).diagonal() = tempo.row(Nodes::IDX_X);
92 P.template block<N,N>(
N,
N).diagonal() = tempo.row(Nodes::IDX_Y);
93 P.template block<N,N>(
N,2*
N).diagonal() = tempo.row(Nodes::IDX_Z);
97 virtual void getPtGauss(Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> result)
const = 0;
102 std::cout <<
"idxPrm: " <<
idxPrm <<
" ind: {";
103 for(
unsigned int i = 0; i <
N-1; i++)
104 { std::cout <<
ind[i] <<
": " <<
refNode[
ind[i]].p << std::endl; }
110 virtual Eigen::Matrix<double,NPI,1>
charges(
const double &Ms_or_dMs,
111 const std::function<Eigen::Vector3d(
const Nodes::Node&)> &getter)
const = 0;
119 for(
unsigned int i=0; i<
N; i++)
133 { std::for_each(
ind.begin(),
ind.end(),[](
int & _i){ _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:31
int idxPrm
Definition: element.h:54
void zeroBasing(void)
Definition: element.h:132
Eigen::Matrix< double, 2 *N, 1 > Lp
Definition: element.h:63
constexpr int getNPI(void) const
Definition: element.h:69
void infos(void) const
Definition: element.h:100
void buildMatP(Eigen::Ref< Eigen::Matrix< double, 2 *N, 3 *N >> P)
Definition: element.h:79
virtual void getPtGauss(Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> result) const =0
Eigen::Matrix< double, NPI, 1 > weight
Definition: element.h:57
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:34
std::vector< int > ind
Definition: element.h:51
constexpr int getN(void) const
Definition: element.h:66
bool existNodes(void) const
Definition: element.h:117
Eigen::Matrix< double, 2 *N, 2 *N > Kp
Definition: element.h:60
const Nodes::Node & getNode(const int i) const
Definition: element.h:129
const std::vector< Nodes::Node > & refNode
Definition: element.h:137
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:65
Eigen::Vector3d ep
Definition: node.h:63