Feellgood
Public Member Functions | Public Attributes | Private Member Functions | Private Attributes | List of all members
spinAcc Class Reference

#include <spinAccumulationSolver.h>

Inheritance diagram for spinAcc:
solver< DIM_PB_SPIN_ACC >

Public Member Functions

 spinAcc (Mesh::mesh &_msh, std::vector< Tetra::prm > &_pTetra, std::vector< Facette::prm > &_pFac, const double _tol, const bool v, const int max_iter)
 
void boundaryConditions (void)
 
void preCompute (void)
 
bool compute (void)
 
void setPotential (std::vector< double > &_V)
 
bool checkBoundaryConditions (bool verbose) const
 
- Public Member Functions inherited from solver< DIM_PB_SPIN_ACC >
 solver (Mesh::mesh &_msh, std::vector< Tetra::prm > &_pTetra, std::vector< Facette::prm > &_pFac, const std::string name, const double _tol, const bool v, const int max_iter)
 

Public Attributes

std::vector< Eigen::Vector3d > s
 

Private Member Functions

void fillDirichletData (const int k, Eigen::Vector3d &s_value)
 
double getJs (Tetra::Tet const &tet) const
 
double getSigma (Tetra::Tet const &tet) const
 
double getPolarization (Tetra::Tet &tet) const
 
double getN0 (Tetra::Tet &tet) const
 
double getLsd (Tetra::Tet &tet) const
 
double getLsf (Tetra::Tet &tet) const
 
double getSpinHall (Tetra::Tet &tet) const
 
void prepareExtras (void)
 
void calc_gradV (Tetra::Tet const &tet, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, Tetra::NPI >> _gradV)
 
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)
 
bool solve (void)
 
void integraleMag (Tetra::Tet &tet, Eigen::Matrix< double, DIM_PB *Tetra::N, DIM_PB *Tetra::N > &AE, std::vector< double > &BE)
 
void integraleSpinHall (Tetra::Tet &tet, std::vector< double > &BE)
 
void integrales (Tetra::Tet &tet, Eigen::Matrix< double, DIM_PB *Tetra::N, DIM_PB *Tetra::N > &AE)
 
void integrales (Facette::Fac &fac, Eigen::Vector3d &Q, std::vector< double > &BE)
 

Private Attributes

std::vector< double > V
 
std::vector< double > valDirichlet
 
std::vector< int > idxDirichlet
 
std::vector< Eigen::Matrix< double, Nodes::DIM, Tetra::NPI > > gradV
 
std::vector< Eigen::Matrix< double, Nodes::DIM, Tetra::NPI > > Hm
 
const bool verbose
 
const int precision = 8
 

Additional Inherited Members

- Protected Member Functions inherited from solver< DIM_PB_SPIN_ACC >
void buildMat (std::vector< int > &ind, Eigen::Matrix< double, DIM_PROBLEM *N, DIM_PROBLEM *N > &Ke, algebra::w_sparseMat &K)
 
void buildVect (std::vector< int > &ind, std::vector< double > &Le, std::vector< double > &L)
 
- Protected Attributes inherited from solver< DIM_PB_SPIN_ACC >
Mesh::meshmsh
 
const int NOD
 
const std::vector< Tetra::prm > & paramTet
 
const std::vector< Facette::prm > & paramFac
 
algebra::iteration< double > iter
 
- Static Protected Attributes inherited from solver< DIM_PB_SPIN_ACC >
static const int DIM_PB
 

Detailed Description

container for Spin Accumulation constants, solver and related datas. The model obeys the diffusive spin equation. The boundary conditions are Dirichlet type. User has to provide through mesh and settings a surface S0 where spin diffusion vector s is a constant (zero recommended), and another surface S1 where current density and spin polarization is defined. This surface S1 must be the same as the one given to the potential solver for its own boundary conditions.

Constructor & Destructor Documentation

◆ spinAcc()

spinAcc::spinAcc ( Mesh::mesh _msh,
std::vector< Tetra::prm > &  _pTetra,
std::vector< Facette::prm > &  _pFac,
const double  _tol,
const bool  v,
const int  max_iter 
)
inline

constructor

Parameters
[in]_mshref to the mesh
[in]_pTetraref to vector of param tetra (volume region parameters)
[in]_pFacref to vector of param facette (surface region parameters)
[in]_toltolerance for bicg_dir solver
[in]vverbose bool
[in]max_itermaximum number of iterations

Member Function Documentation

◆ boundaryConditions()

void spinAcc::boundaryConditions ( void  )

boundary conditions: a surface with a fixed s, and another surface with fixed normal current density J and polarization vector P

◆ calc_gradV()

void spinAcc::calc_gradV ( Tetra::Tet const &  tet,
Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, Tetra::NPI >>  _gradV 
)
private

computes the gradient(V) for tetra tet

◆ calc_Hm()

void spinAcc::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 
)
private

computes Hm contributions for each npi for tetrahedron tet

◆ checkBoundaryConditions()

bool spinAcc::checkBoundaryConditions ( bool  verbose) const

check boundary conditions: mesh and settings have to define a single surface with constant normal current density J, a vector polarization P and another single surface where spin diffusion = 0

◆ compute()

bool spinAcc::compute ( void  )

call solver and update spin diffusion solution, returns true if solver succeeded

◆ fillDirichletData()

void spinAcc::fillDirichletData ( const int  k,
Eigen::Vector3d &  s_value 
)
private

fill valDirichlet and idxDirichlet vectors with k, a node index from fac.ind and the corresponding spin diffusion s value

◆ getJs()

double spinAcc::getJs ( Tetra::Tet const &  tet) const
private

returns Js = mu_0 Ms

◆ getLsd()

double spinAcc::getLsd ( Tetra::Tet tet) const
private

length s-d : only in magnetic material

◆ getLsf()

double spinAcc::getLsf ( Tetra::Tet tet) const
private

spin flip length : exists in both non magnetic and magnetic metals

◆ getN0()

double spinAcc::getN0 ( Tetra::Tet tet) const
private

density of states at Fermi level, units : J^-1 m^-3

◆ getPolarization()

double spinAcc::getPolarization ( Tetra::Tet tet) const
private

\( P \) is polarization rate of the current

◆ getSigma()

double spinAcc::getSigma ( Tetra::Tet const &  tet) const
private

returns sigma of the tetraedron, (conductivity in (Ohm.m)^-1

◆ getSpinHall()

double spinAcc::getSpinHall ( Tetra::Tet tet) const
private

spin Hall constant

◆ integraleMag()

void spinAcc::integraleMag ( Tetra::Tet tet,
Eigen::Matrix< double, DIM_PB *Tetra::N, DIM_PB *Tetra::N > &  AE,
std::vector< double > &  BE 
)
private

computes magnetic contributions to spin diffusion from tetrahedron tet

◆ integrales() [1/2]

void spinAcc::integrales ( Facette::Fac fac,
Eigen::Vector3d &  Q,
std::vector< double > &  BE 
)
private

computes contributions to vector BE from facette fac

◆ integrales() [2/2]

void spinAcc::integrales ( Tetra::Tet tet,
Eigen::Matrix< double, DIM_PB *Tetra::N, DIM_PB *Tetra::N > &  AE 
)
private

computes normal metal contributions to matrix AE and vector BE from tetrahedron tet

◆ integraleSpinHall()

void spinAcc::integraleSpinHall ( Tetra::Tet tet,
std::vector< double > &  BE 
)
private

computes spin Hall effect contribution to spin diffusion. This contribution does not depend on magnetization, its origin is Spin Orbit Torque.

◆ preCompute()

void spinAcc::preCompute ( void  )

initializations: compute gradV and Hm and call prepareExtras method

◆ prepareExtras()

void spinAcc::prepareExtras ( void  )
private

affect extraField function and extraCoeffs_BE function using lambdas for all the tetrahedrons (functor)

◆ setPotential()

void spinAcc::setPotential ( std::vector< double > &  _V)

set potential V

◆ solve()

bool spinAcc::solve ( void  )
private

solver, using biconjugate stabilized gradient, with diagonal preconditionner and Dirichlet boundary conditions

Member Data Documentation

◆ gradV

std::vector< Eigen::Matrix<double,Nodes::DIM,Tetra::NPI> > spinAcc::gradV
private

table of the gradients of the potential, gradV.size() is the number of tetrahedrons [gradV] = Volt/m = kg m A^-1 s^-3

◆ Hm

std::vector< Eigen::Matrix<double,Nodes::DIM,Tetra::NPI> > spinAcc::Hm
private

table of the Hm vectors (contribution of spinAcc to the tet::integrales) ; Hm.size() is the number of tetra

◆ idxDirichlet

std::vector<int> spinAcc::idxDirichlet
private

list of the indices for Dirichlet boundary conditions, it contains the indices of the nodes where s is given by the user to be a constant on a surface

◆ precision

const int spinAcc::precision = 8
private

number of digits in the optional output file

◆ s

std::vector<Eigen::Vector3d> spinAcc::s

spin accumulation solution over the nodes

◆ V

std::vector<double> spinAcc::V
private

container for potential values

◆ valDirichlet

std::vector<double> spinAcc::valDirichlet
private

Dirichlet values of the components of s on the nodes, it is zero if the node is not in idxDirichlet

◆ verbose

const bool spinAcc::verbose
private

if verbose set to true, some printing are sent to terminal


The documentation for this class was generated from the following files: