13 #include "time_integration.h"
31 constexpr
double A = 1. / 4.;
32 constexpr
double u[
NPI] = {
A};
33 constexpr
double v[
NPI] = {
A};
34 constexpr
double w[
NPI] = {
A};
35 constexpr
double pds[
NPI] = {1./6.};
39 constexpr
double a[
N][
NPI] = {{1. -
u[0] -
v[0] -
w[0]},
45 const Eigen::Matrix<double,N,NPI>
eigen_a = (Eigen::MatrixXd(
N,
NPI) <<
a[0][0],
52 constexpr
double A = 1. / 4.;
53 constexpr
double B = 1. / 6.;
54 constexpr
double C = 1. / 2.;
55 constexpr
double D = -2. / 15.;
56 constexpr
double E = 3. / 40.;
68 constexpr
double a[
N][
NPI] = {{1. -
u[0] -
v[0] -
w[0], 1. -
u[1] -
v[1] -
w[1],
69 1. -
u[2] -
v[2] -
w[2], 1. -
u[3] -
v[3] -
w[3],
70 1. -
u[4] -
v[4] -
w[4]},
71 {
u[0],
u[1],
u[2],
u[3],
u[4]},
72 {
v[0],
v[1],
v[2],
v[3],
v[4]},
73 {
w[0],
w[1],
w[2],
w[3],
w[4]}};
76 const Eigen::Matrix<double,N,NPI>
eigen_a =
77 (Eigen::MatrixXd(
N,
NPI) <<
a[0][0],
a[0][1],
a[0][2],
a[0][3],
a[0][4],
78 a[1][0],
a[1][1],
a[1][2],
a[1][3],
a[1][4],
79 a[2][0],
a[2][1],
a[2][2],
a[2][3],
a[2][4],
80 a[3][0],
a[3][1],
a[3][2],
a[3][3],
a[3][4] ).finished();
149 inline Tet(
const std::vector<Nodes::Node> &_p_node ,
151 std::initializer_list<int> _i )
167 std::cerr <<
"Singular jacobian in tetrahedron: |det(J)|= "
168 << fabs(detJ) << std::endl;
172 Eigen::Matrix<double,N,Nodes::DIM> dadu;
174 dadu << -1., -1., -1., 1., 0., 0., 0., 1., 0., 0., 0., 1.;
175 da = dadu * J.inverse();
177 for (
int j = 0; j <
NPI; j++)
181 extraField = [] ( Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>> ) {};
186 Eigen::Matrix<double,N,Nodes::DIM>
da;
193 Eigen::Ref<Eigen::Matrix<double,NPI,1>> result)
const
195 Eigen::Matrix<double,N,1> scalar_nod;
196 for (
int i = 0; i <
N; i++) scalar_nod(i) = getter(
getNode(i));
197 result = scalar_nod.transpose() *
eigen_a;
203 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> result,
204 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> Tx,
205 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> Ty,
206 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> Tz)
const
208 Eigen::Matrix<double,Nodes::DIM,N> vec_nod;
209 for (
int i = 0; i <
N; i++) vec_nod.col(i) = getter(
getNode(i));
215 Tx = vec_nod * (
da.col(Nodes::IDX_X)).replicate(1,
NPI);
216 Ty = vec_nod * (
da.col(Nodes::IDX_Y)).replicate(1,
NPI);
217 Tz = vec_nod * (
da.col(Nodes::IDX_Z)).replicate(1,
NPI);
224 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> X)
const
226 Eigen::Matrix<double,N,1> scalar_nod;
227 for (
int i = 0; i <
N; i++) scalar_nod(i) = getter(
getNode(i));
230 for (
int j = 0; j <
NPI; j++)
232 for (
int i = 0; i <
N; i++)
234 X.col(j) -= (scalar_nod[i] *
da.row(i));
242 Nodes::index idx, Eigen::Ref<Eigen::Matrix<double,Tetra::NPI,1>> result)
const
244 Eigen::Matrix<double,N,1> scalar_nod;
246 for (
int i = 0; i <
N; i++)
250 result = scalar_nod.transpose() *
eigen_a;
263 void lumping(Eigen::Ref<Eigen::Matrix<double,NPI,1>> alpha_eff,
double prefactor,
264 Eigen::Ref<Eigen::Matrix<double,3*N,3*N>> AE )
const;
270 Eigen::Matrix<double,N,N>
calcDiagBlock(
const double c, Eigen::Matrix<double,N,1> &x)
const;
279 void add_drift_BE(
double alpha,
double s_dt,
double Vdrift,
280 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> U,
281 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> V,
282 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dUd_,
283 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dVd_,
284 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,N>> BE)
const;
288 Eigen::Matrix<double,NPI,1>
calc_aniso_uniax(Eigen::Ref<const Eigen::Vector3d> uk,
289 const double Kbis,
const double s_dt,
290 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> U,
291 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> V,
292 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> H_aniso)
const;
296 Eigen::Matrix<double,NPI,1>
calc_aniso_cub(Eigen::Ref<const Eigen::Vector3d> ex,
297 Eigen::Ref<const Eigen::Vector3d> ey,
298 Eigen::Ref<const Eigen::Vector3d> ez,
299 const double K3bis,
const double s_dt,
300 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> U,
301 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> V,
302 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> H_aniso)
const;
308 std::function< Eigen::Matrix<double,Nodes::DIM,NPI> (
void)> calc_Hext,
313 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dudx,
314 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dudy,
315 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dudz)
const;
319 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>>
u)
const;
323 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>>
u)
const;
326 Eigen::Matrix<double,Tetra::NPI,1>
charges(
const double &Ms,
327 std::function<Eigen::Vector3d(
const Nodes::Node&)> getter)
const;
331 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dudx,
332 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dudy,
333 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dudz,
334 Eigen::Ref<Eigen::Matrix<double,NPI,1>> phi)
const;
338 Eigen::Ref<Eigen::Vector3d>
const Hext ,
339 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>>
const u )
const;
344 std::vector<Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>> &spaceField,
346 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>>
const u)
const;
350 double Jacobian(Eigen::Ref<Eigen::Matrix3d> J);
359 std::function<void( Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> H)>
extraField;
362 void getPtGauss(Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> result)
const
364 Eigen::Matrix<double,Nodes::DIM,N> vec_nod;
365 for (
int i = 0; i <
N; i++)
377 std::swap(
ind[2],
ind[3]);
384 Eigen::Matrix<double,NPI,1>
calc_alpha_eff(
const double dt,
const double alpha,
385 Eigen::Ref<Eigen::Matrix<double,NPI,1>> uHeff);
388 Eigen::Matrix<double,Nodes::DIM,NPI>
calc_gradV(Tet
const &tet,std::vector<double> &V);
392 const double prefactor,
393 std::vector<Eigen::Vector3d> &s);
void getPtGauss(Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> result) const
Definition: tetra.h:362
double calc_vol(void) const
Definition: tetra.cpp:409
double uniaxialAnisotropyEnergy(Tetra::prm const ¶m, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> u) const
Definition: tetra.cpp:319
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:109
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:170
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:182
Eigen::Matrix< double, N, Nodes::DIM > da
Definition: tetra.h:186
Tet(const std::vector< Nodes::Node > &_p_node, const int _idx, std::initializer_list< int > _i)
Definition: tetra.h:149
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:308
Eigen::Matrix< double, N, 1 > calcOffDiagBlock(const Nodes::index idx) const
Definition: tetra.cpp:141
double Jacobian(Eigen::Ref< Eigen::Matrix3d > J)
Definition: tetra.cpp:392
Eigen::Matrix< double, Tetra::NPI, 1 > charges(const double &Ms, std::function< Eigen::Vector3d(const Nodes::Node &)> getter) const
Definition: tetra.cpp:346
double cubicAnisotropyEnergy(Tetra::prm const ¶m, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> u) const
Definition: tetra.cpp:329
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:149
int idx
Definition: tetra.h:356
std::function< void(Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> H)> extraField
Definition: tetra.h:359
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:202
double zeemanEnergy(Tetra::prm const ¶m, Eigen::Ref< Eigen::Vector3d > const Hext, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, Tetra::NPI >> const u) const
Definition: tetra.cpp:373
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:241
void interpolation(std::function< double(Nodes::Node)> getter, Eigen::Ref< Eigen::Matrix< double, NPI, 1 >> result) const
Definition: tetra.h:192
void interpolation_field(std::function< double(Nodes::Node)> getter, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> X) const
Definition: tetra.h:223
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:360
void orientate(void)
Definition: tetra.h:374
Eigen::Matrix< double, N, N > calcDiagBlock(const double c, Eigen::Matrix< double, N, 1 > &x) const
Definition: tetra.cpp:133
void integrales(Tetra::prm const ¶m, timing const &prm_t, std::function< Eigen::Matrix< double, Nodes::DIM, NPI >(void)> calc_Hext, Nodes::index idx_dir, double Vdrift)
Definition: tetra.cpp:209
Template abstract class, mother class for tetraedrons and facettes.
Definition: element.h:31
void zeroBasing(void)
Definition: element.h:120
Eigen::Matrix< double, NPI, 1 > weight
Definition: element.h:56
std::vector< int > ind
Definition: element.h:50
void infos(void)
Definition: element.h:99
bool existNodes(void) const
Definition: element.h:117
const Nodes::Node & getNode(const int i) const
Definition: element.h:114
Definition: time_integration.h:7
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:23
constexpr double A
Definition: tetra.h:52
constexpr double a[N][NPI]
Definition: tetra.h:68
constexpr double B
Definition: tetra.h:53
const int NPI
Definition: tetra.h:50
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:48
const int N
Definition: tetra.h:25
constexpr double w[NPI]
Definition: tetra.h:59
constexpr double D
Definition: tetra.h:55
constexpr double C
Definition: tetra.h:54
constexpr double pds[NPI]
Definition: tetra.h:60
Eigen::Matrix< double, Nodes::DIM, NPI > calc_gradV(Tet const &tet, std::vector< double > &V)
Definition: tetra.cpp:78
constexpr double v[NPI]
Definition: tetra.h:58
const Eigen::Matrix< double, N, NPI > eigen_a
Definition: tetra.h:76
constexpr double E
Definition: tetra.h:56
constexpr double u[NPI]
Definition: tetra.h:57
Eigen::Matrix< double, Nodes::DIM, Tetra::NPI > calc_Hst(Tetra::Tet const &tet, const double prefactor, std::vector< Eigen::Vector3d > &s)
Definition: tetra.cpp:94
header to define struct Node
Eigen::Vector3d p
Definition: node.h:62
Eigen::Vector3d ex
Definition: tetra.h:97
double P
Definition: tetra.h:101
double volume
Definition: tetra.h:111
Eigen::Vector3d uk
Definition: tetra.h:94
std::string regName
Definition: tetra.h:88
double A
Definition: tetra.h:90
double alpha_LLG
Definition: tetra.h:89
double N0
Definition: tetra.h:102
double spinHall
Definition: tetra.h:108
double lsd
Definition: tetra.h:106
Eigen::Vector3d ez
Definition: tetra.h:99
void infos(void)
Definition: tetra.cpp:15
Eigen::Vector3d ey
Definition: tetra.h:98
double Ms
Definition: tetra.h:91
double lsf
Definition: tetra.h:107
double K
Definition: tetra.h:93
double K3
Definition: tetra.h:96
double sigma
Definition: tetra.h:104