11 #include "spinTransferTorque.h"
14 #include "time_integration.h"
29 constexpr
double A = 1. / 4.;
30 constexpr
double B = 1. / 6.;
31 constexpr
double C = 1. / 2.;
32 constexpr
double D = -2. / 15.;
33 constexpr
double E = 3. / 40.;
45 constexpr
double a[
N][
NPI] = {{1. -
u[0] -
v[0] -
w[0], 1. -
u[1] -
v[1] -
w[1],
46 1. -
u[2] -
v[2] -
w[2], 1. -
u[3] -
v[3] -
w[3],
47 1. -
u[4] -
v[4] -
w[4]},
48 {
u[0],
u[1],
u[2],
u[3],
u[4]},
49 {
v[0],
v[1],
v[2],
v[3],
v[4]},
50 {
w[0],
w[1],
w[2],
w[3],
w[4]}};
53 static const Eigen::Matrix<double,N,NPI> eigen_a = [] {
54 Eigen::Matrix<double,N,NPI> tmp; tmp <<
a[0][0],
a[0][1],
a[0][2],
a[0][3],
a[0][4],
55 a[1][0],
a[1][1],
a[1][2],
a[1][3],
a[1][4],
56 a[2][0],
a[2][1],
a[2][2],
a[2][3],
a[2][4],
57 a[3][0],
a[3][1],
a[3][2],
a[3][3],
a[3][4];
81 std::cout <<
"volume region name = " <<
regName << std::endl;
82 std::cout <<
"alpha_LLG = " <<
alpha_LLG << std::endl;
83 std::cout <<
"A = " <<
A << std::endl;
84 std::cout <<
"J = " <<
J << std::endl;
88 std::cout <<
"K*uk =" <<
K <<
"*[ " <<
uk <<
"]" << std::endl;
93 std::cout <<
"K3 = " <<
K3 <<
"; ex=[ " <<
ex <<
"], ey=[" <<
ey <<
"], ez=[" <<
ez
130 inline Tet(
const std::vector<Nodes::Node> &_p_node ,
132 std::initializer_list<int> _i )
148 std::cerr <<
"Singular jacobian in tetrahedron: |det(J)|= " << fabs(detJ) << std::endl;
152 Eigen::Matrix<double,N,Nodes::DIM> dadu;
153 dadu << -1., -1., -1., 1., 0., 0., 0., 1., 0., 0., 0., 1.;
154 da = dadu * J.inverse();
156 for (
int j = 0; j <
NPI; j++)
160 extraField = [] ( Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>> ) {};
161 extraCoeffs_BE = [](double, Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>>,
162 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>>,
163 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>>,
164 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>>,
165 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,N>>) {};
169 Eigen::Matrix<double,N,Nodes::DIM>
da;
174 Eigen::Ref<Eigen::Matrix<double,NPI,1>> result)
const
176 Eigen::Matrix<double,N,1> scalar_nod;
177 for (
int i = 0; i <
N; i++) scalar_nod(i) = getter(
getNode(i));
178 result = scalar_nod.transpose() * eigen_a;
184 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> result,
185 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> Tx,
186 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> Ty,
187 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> Tz)
const
189 Eigen::Matrix<double,Nodes::DIM,N> vec_nod;
190 for (
int i = 0; i <
N; i++) vec_nod.col(i) = getter(
getNode(i));
192 result = vec_nod * eigen_a;
193 Tx = vec_nod * (
da.col(Nodes::IDX_X)).replicate(1,
NPI);
194 Ty = vec_nod * (
da.col(Nodes::IDX_Y)).replicate(1,
NPI);
195 Tz = vec_nod * (
da.col(Nodes::IDX_Z)).replicate(1,
NPI);
201 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> X)
const
203 Eigen::Matrix<double,N,1> scalar_nod;
204 for (
int i = 0; i <
N; i++) scalar_nod(i) = getter(
getNode(i));
207 for (
int j = 0; j <
NPI; j++)
209 for (
int i = 0; i <
N; i++)
211 X.col(j) -= (scalar_nod[i] *
da.row(i));
219 Eigen::Ref<Eigen::Matrix<double,Tetra::NPI,1>> result)
const
221 Eigen::Matrix<double,N,1> scalar_nod;
223 for (
int i = 0; i <
N; i++)
227 result = scalar_nod.transpose() * eigen_a;
239 void lumping(Eigen::Ref<Eigen::Matrix<double,NPI,1>> alpha_eff,
double prefactor,
240 Eigen::Ref<Eigen::Matrix<double,3*N,3*N>> AE )
const;
243 void add_drift_BE(
double alpha,
double s_dt,
double Vdrift,
244 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> U,
245 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> V,
246 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dUd_,
247 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dVd_,
248 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,N>> BE)
const;
252 Eigen::Matrix<double,NPI,1>
calc_aniso_uniax(Eigen::Ref<const Eigen::Vector3d> uk,
253 const double Kbis,
const double s_dt,
254 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> U,
255 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> V,
256 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> H_aniso)
const;
260 Eigen::Matrix<double,NPI,1>
calc_aniso_cub(Eigen::Ref<const Eigen::Vector3d> ex,
261 Eigen::Ref<const Eigen::Vector3d> ey,
262 Eigen::Ref<const Eigen::Vector3d> ez,
263 const double K3bis,
const double s_dt,
264 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> U,
265 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> V,
266 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> H_aniso)
const;
271 std::function<
void( Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> Hext )> calc_Hext,
276 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dudx,
277 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dudy,
278 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dudz)
const;
285 std::function<Eigen::Vector3d(
Nodes::Node)> getter,
286 std::vector<double> &srcDen,
291 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dudx,
292 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dudy,
293 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dudz,
294 Eigen::Ref<Eigen::Matrix<double,NPI,1>> phi)
const;
298 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>>
const u)
const;
301 double Jacobian(Eigen::Ref<Eigen::Matrix3d> J);
310 std::function<void( Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> H)>
extraField;
313 std::function<void(
double Js, Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> U,
314 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dUdx,
315 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dUdy,
316 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dUdz,
320 void getPtGauss(Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> result)
const
322 Eigen::Matrix<double,Nodes::DIM,N> vec_nod;
323 for (
int i = 0; i <
N; i++)
327 result = vec_nod * eigen_a;
335 std::swap(
ind[2],
ind[3]);
342 Eigen::Matrix<double,NPI,1>
calc_alpha_eff(
const double dt,
const double alpha,
343 Eigen::Ref<Eigen::Matrix<double,NPI,1>> uHeff);
void getPtGauss(Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> result) const
Definition: tetra.h:320
double calc_vol(void) const
Definition: tetra.cpp:313
void charges(Tetra::prm const ¶m, std::function< Eigen::Vector3d(Nodes::Node)> getter, std::vector< double > &srcDen, int &nsrc) const
Definition: tetra.cpp:256
void lumping(Eigen::Ref< Eigen::Matrix< double, NPI, 1 >> alpha_eff, double prefactor, Eigen::Ref< Eigen::Matrix< double, 3 *N, 3 *N >> AE) const
Definition: tetra.cpp:45
Eigen::Matrix< double, NPI, 1 > calc_aniso_uniax(Eigen::Ref< const Eigen::Vector3d > uk, const double Kbis, const double s_dt, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> U, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> V, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> H_aniso) const
Definition: tetra.cpp:93
std::function< void(double Js, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> U, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> dUdx, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> dUdy, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> dUdz, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, N >> BE)> extraCoeffs_BE
Definition: tetra.h:317
Eigen::Matrix< double, NPI, 1 > calc_aniso_cub(Eigen::Ref< const Eigen::Vector3d > ex, Eigen::Ref< const Eigen::Vector3d > ey, Eigen::Ref< const Eigen::Vector3d > ez, const double K3bis, const double s_dt, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> U, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> V, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> H_aniso) const
Definition: tetra.cpp:104
Eigen::Matrix< double, N, Nodes::DIM > da
Definition: tetra.h:169
Tet(const std::vector< Nodes::Node > &_p_node, const int _idx, std::initializer_list< int > _i)
Definition: tetra.h:130
double zeemanEnergy(Tetra::prm const ¶m, Eigen::Ref< Eigen::Vector3d > const Hext, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> const u) const
Definition: tetra.cpp:288
void integrales(Tetra::prm const ¶m, timing const &prm_t, std::function< void(Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> Hext)> calc_Hext, Nodes::index idx_dir, double Vdrift)
Definition: tetra.cpp:128
double exchangeEnergy(Tetra::prm const ¶m, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> dudx, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> dudy, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> dudz) const
Definition: tetra.cpp:223
double Jacobian(Eigen::Ref< Eigen::Matrix3d > J)
Definition: tetra.cpp:296
void add_drift_BE(double alpha, double s_dt, double Vdrift, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> U, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> V, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> dUd_, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> dVd_, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, N >> BE) const
Definition: tetra.cpp:73
int idx
Definition: tetra.h:307
std::function< void(Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> H)> extraField
Definition: tetra.h:310
void interpolation(std::function< Eigen::Vector3d(Nodes::Node)> getter, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> result, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> Tx, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> Ty, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> Tz) const
Definition: tetra.h:183
void interpolation(std::function< double(Nodes::Node, Nodes::index)> getter, Nodes::index idx, Eigen::Ref< Eigen::Matrix< double, Tetra::NPI, 1 >> result) const
Definition: tetra.h:218
void interpolation(std::function< double(Nodes::Node)> getter, Eigen::Ref< Eigen::Matrix< double, NPI, 1 >> result) const
Definition: tetra.h:173
void interpolation_field(std::function< double(Nodes::Node)> getter, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> X) const
Definition: tetra.h:200
double demagEnergy(Tetra::prm const ¶m, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> dudx, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> dudy, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> dudz, Eigen::Ref< Eigen::Matrix< double, NPI, 1 >> phi) const
Definition: tetra.cpp:275
void orientate(void)
Definition: tetra.h:332
double anisotropyEnergy(Tetra::prm const ¶m, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> u) const
Definition: tetra.cpp:234
Template abstract class, mother class for tetraedrons and facettes.
Definition: element.h:24
void zeroBasing(void)
Definition: element.h:140
bool existNodes(void)
Definition: element.h:136
void infos() const
Definition: element.h:120
Eigen::Matrix< double, NPI, 1 > weight
Definition: element.h:48
std::vector< int > ind
Definition: element.h:42
const Nodes::Node & getNode(const int i) const
Definition: element.h:133
Definition: time_integration.h:6
contains namespace Facette header containing Fac class, and some constants and a less_than operator t...
index
Definition: node.h:34
const double epsilon
Definition: tetra.h:25
constexpr double A
Definition: tetra.h:29
constexpr double a[N][NPI]
Definition: tetra.h:45
constexpr double B
Definition: tetra.h:30
const int NPI
Definition: tetra.h:23
Eigen::Matrix< double, NPI, 1 > calc_alpha_eff(const double dt, const double alpha, Eigen::Ref< Eigen::Matrix< double, NPI, 1 >> uHeff)
Definition: tetra.cpp:15
const int N
Definition: tetra.h:22
constexpr double w[NPI]
Definition: tetra.h:36
constexpr double D
Definition: tetra.h:32
constexpr double C
Definition: tetra.h:31
constexpr double pds[NPI]
Definition: tetra.h:37
constexpr double v[NPI]
Definition: tetra.h:35
constexpr double E
Definition: tetra.h:33
constexpr double u[NPI]
Definition: tetra.h:34
header to define struct Node
Eigen::Vector3d p
Definition: node.h:62
Definition: spinTransferTorque.h:13
Eigen::Vector3d ex
Definition: tetra.h:73
Eigen::Vector3d uk
Definition: tetra.h:70
std::string regName
Definition: tetra.h:65
double A
Definition: tetra.h:67
double alpha_LLG
Definition: tetra.h:66
Eigen::Vector3d ez
Definition: tetra.h:75
Eigen::Vector3d ey
Definition: tetra.h:74
void infos()
Definition: tetra.h:79
double J
Definition: tetra.h:68
STT p_STT
Definition: tetra.h:76
double K
Definition: tetra.h:69
double K3
Definition: tetra.h:72