Feellgood
spinAccumulationSolver.h
1 #ifndef spinAccumulationSolver_h
2 #define spinAccumulationSolver_h
3 
4 #include <vector>
5 #include "config.h"
6 #include "node.h"
7 #include "tetra.h"
8 #include "electrostatSolver.h"
9 #include "solver.h"
10 #include "meshUtils.h"
11 
13 const int DIM_PB_SPIN_ACC = 3;
14 
22 class spinAcc : public solver<DIM_PB_SPIN_ACC>
23  {
24  public:
27  std::vector<Tetra::prm> & _pTetra ,
28  std::vector<Facette::prm> & _pFac ,
29  const double _tol , // _tol could be 1e-6
30  const bool v ,
31  const int max_iter ):
32  solver<DIM_PB_SPIN_ACC>(_msh,_pTetra,_pFac,"bicg_dir",_tol,v,max_iter), verbose(v)
33  {
34  valDirichlet.resize(DIM_PB*NOD);
36  }
37 
40  void boundaryConditions(void);
41 
43  void preCompute(void);
44 
46  bool compute(void);
47 
49  void setPotential(std::vector<double> &_V);
50 
53  bool checkBoundaryConditions(bool verbose) const;
54 
56  std::vector<Eigen::Vector3d> s;
57 
58  private:
60  std::vector<double> V;
61 
63  std::vector<double> valDirichlet;
64 
67  std::vector<int> idxDirichlet;
68 
71  void fillDirichletData(const int k, Eigen::Vector3d &s_value);
72 
76  std::vector< Eigen::Matrix<double,Nodes::DIM,Tetra::NPI> > gradV;
77 
80  std::vector< Eigen::Matrix<double,Nodes::DIM,Tetra::NPI> > Hm;
81 
83  const bool verbose;
84 
86  const int precision = 8;
87 
89  double getJs(Tetra::Tet const &tet) const;
90 
92  double getSigma(Tetra::Tet const &tet) const;
93 
95  double getPolarization(Tetra::Tet &tet) const;
96 
98  double getN0(Tetra::Tet &tet) const;
99 
101  double getLsd(Tetra::Tet &tet) const;
102 
104  double getLsf(Tetra::Tet &tet) const;
105 
107  double getSpinHall(Tetra::Tet &tet) const;
108 
110  void prepareExtras(void);
111 
113  void calc_gradV(Tetra::Tet const &tet, Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>> _gradV);
114 
116  void calc_Hm(Tetra::Tet const &tet, Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>> _gradV,
117  Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>> _Hm);
118 
121  bool solve(void);
122 
124  void integraleMag(Tetra::Tet &tet,
125  Eigen::Matrix<double,DIM_PB*Tetra::N,DIM_PB*Tetra::N> &AE,
126  std::vector<double> &BE);
127 
130  void integraleSpinHall(Tetra::Tet &tet, std::vector<double> &BE);
131 
133  void integrales(Tetra::Tet &tet,
134  Eigen::Matrix<double,DIM_PB*Tetra::N,DIM_PB*Tetra::N> &AE);
135 
137  void integrales(Facette::Fac &fac, Eigen::Vector3d &Q, std::vector<double> &BE);
138  };
139 
140 #endif
Definition: facette.h:72
Definition: mesh.h:27
Definition: tetra.h:111
template class for the different solvers template parameter DIM_PROBLEM: dimensionnality of the probl...
Definition: solver.h:20
const int NOD
Definition: solver.h:40
static const int DIM_PB
Definition: solver.h:34
Definition: spinAccumulationSolver.h:23
void calc_gradV(Tetra::Tet const &tet, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, Tetra::NPI >> _gradV)
Definition: spinAccumulationSolver.cpp:177
double getLsf(Tetra::Tet &tet) const
Definition: spinAccumulationSolver.cpp:92
void prepareExtras(void)
Definition: spinAccumulationSolver.cpp:101
void calc_Hm(Tetra::Tet const &tet, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, Tetra::NPI >> _gradV, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, Tetra::NPI >> _Hm)
Definition: spinAccumulationSolver.cpp:189
void boundaryConditions(void)
Definition: spinAccumulationSolver.cpp:52
double getPolarization(Tetra::Tet &tet) const
Definition: spinAccumulationSolver.cpp:86
double getLsd(Tetra::Tet &tet) const
Definition: spinAccumulationSolver.cpp:89
spinAcc(Mesh::mesh &_msh, std::vector< Tetra::prm > &_pTetra, std::vector< Facette::prm > &_pFac, const double _tol, const bool v, const int max_iter)
Definition: spinAccumulationSolver.h:26
double getJs(Tetra::Tet const &tet) const
Definition: spinAccumulationSolver.cpp:77
double getN0(Tetra::Tet &tet) const
Definition: spinAccumulationSolver.cpp:83
bool compute(void)
Definition: spinAccumulationSolver.cpp:163
bool solve(void)
Definition: spinAccumulationSolver.cpp:199
std::vector< int > idxDirichlet
Definition: spinAccumulationSolver.h:67
double getSigma(Tetra::Tet const &tet) const
Definition: spinAccumulationSolver.cpp:80
const int precision
Definition: spinAccumulationSolver.h:86
const bool verbose
Definition: spinAccumulationSolver.h:83
void integrales(Tetra::Tet &tet, Eigen::Matrix< double, DIM_PB *Tetra::N, DIM_PB *Tetra::N > &AE)
Definition: spinAccumulationSolver.cpp:314
void integraleSpinHall(Tetra::Tet &tet, std::vector< double > &BE)
Definition: spinAccumulationSolver.cpp:292
std::vector< double > valDirichlet
Definition: spinAccumulationSolver.h:63
std::vector< Eigen::Vector3d > s
Definition: spinAccumulationSolver.h:56
void setPotential(std::vector< double > &_V)
Definition: spinAccumulationSolver.cpp:98
void integraleMag(Tetra::Tet &tet, Eigen::Matrix< double, DIM_PB *Tetra::N, DIM_PB *Tetra::N > &AE, std::vector< double > &BE)
Definition: spinAccumulationSolver.cpp:245
std::vector< Eigen::Matrix< double, Nodes::DIM, Tetra::NPI > > gradV
Definition: spinAccumulationSolver.h:76
double getSpinHall(Tetra::Tet &tet) const
Definition: spinAccumulationSolver.cpp:95
void fillDirichletData(const int k, Eigen::Vector3d &s_value)
Definition: spinAccumulationSolver.cpp:42
std::vector< double > V
Definition: spinAccumulationSolver.h:60
void preCompute(void)
Definition: spinAccumulationSolver.cpp:147
std::vector< Eigen::Matrix< double, Nodes::DIM, Tetra::NPI > > Hm
Definition: spinAccumulationSolver.h:80
bool checkBoundaryConditions(bool verbose) const
Definition: spinAccumulationSolver.cpp:9
solver for electrostatic problem when spin accumulation is required header containing electrostatSolv...
constexpr double v[NPI]
Definition: facette.h:22
header to define struct Node
two templates to fill matrix and vectors in various dimensionnality situations. DIM_PROBLEM = 1 is us...
namespace Tetra header containing Tet class, some constants, and integrales