14 #include "time_integration.h"
29 constexpr
int NPI = 1;
32 constexpr
double A = 1. / 4.;
33 constexpr
double u[
NPI] = {
A};
34 constexpr
double v[
NPI] = {
A};
35 constexpr
double w[
NPI] = {
A};
36 constexpr
double pds[
NPI] = {1./6.};
40 constexpr
double a[
N][
NPI] = {{1. -
u[0] -
v[0] -
w[0]},
46 const Eigen::Matrix<double,N,NPI>
eigen_a = (Eigen::MatrixXd(
N,
NPI) <<
a[0][0],
51 constexpr
int NPI = 5;
53 constexpr
double A = 1. / 4.;
54 constexpr
double B = 1. / 6.;
55 constexpr
double C = 1. / 2.;
56 constexpr
double D = -2. / 15.;
57 constexpr
double E = 3. / 40.;
69 constexpr
double a[
N][
NPI] = {{1. -
u[0] -
v[0] -
w[0], 1. -
u[1] -
v[1] -
w[1],
70 1. -
u[2] -
v[2] -
w[2], 1. -
u[3] -
v[3] -
w[3],
71 1. -
u[4] -
v[4] -
w[4]},
72 {
u[0],
u[1],
u[2],
u[3],
u[4]},
73 {
v[0],
v[1],
v[2],
v[3],
v[4]},
74 {
w[0],
w[1],
w[2],
w[3],
w[4]}};
77 const Eigen::Matrix<double,N,NPI>
eigen_a =
78 (Eigen::MatrixXd(
N,
NPI) <<
a[0][0],
a[0][1],
a[0][2],
a[0][3],
a[0][4],
79 a[1][0],
a[1][1],
a[1][2],
a[1][3],
a[1][4],
80 a[2][0],
a[2][1],
a[2][2],
a[2][3],
a[2][4],
81 a[3][0],
a[3][1],
a[3][2],
a[3][3],
a[3][4] ).finished();
144 inline Tet(
const std::vector<Nodes::Node> &_p_node ,
146 const std::initializer_list<int> _i )
155 Eigen::Matrix<double,N,Nodes::DIM> dadu;
157 dadu << -1., -1., -1., 1., 0., 0., 0., 1., 0., 0., 0., 1.;
158 da = dadu * J.inverse();
160 for (
int j = 0; j <
NPI; j++)
163 extraField = [] (
const Eigen::Ref<const Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>> ) {};
166 { std::cerr<<
"Error: Tet constructor has out of bound index\n"; }
171 Eigen::Matrix<double,N,Nodes::DIM>
da;
178 Eigen::Ref<Eigen::Matrix<double,NPI,1>> result)
const
180 Eigen::Matrix<double,N,1> scalar_nod;
181 for (
int i = 0; i <
N; i++) scalar_nod(i) = getter(
getNode(i));
182 result = scalar_nod.transpose() *
eigen_a;
188 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> result,
189 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> Tx,
190 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> Ty,
191 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> Tz)
const
193 Eigen::Matrix<double,Nodes::DIM,N> vec_nod;
194 for (
int i = 0; i <
N; i++) vec_nod.col(i) = getter(
getNode(i));
200 Tx = vec_nod * (
da.col(Nodes::IDX_X)).replicate(1,
NPI);
201 Ty = vec_nod * (
da.col(Nodes::IDX_Y)).replicate(1,
NPI);
202 Tz = vec_nod * (
da.col(Nodes::IDX_Z)).replicate(1,
NPI);
209 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> X)
const
211 Eigen::Matrix<double,N,1> scalar_nod;
212 for (
int i = 0; i <
N; i++) scalar_nod(i) = getter(
getNode(i));
215 for (
int j = 0; j <
NPI; j++)
217 for (
int i = 0; i <
N; i++)
219 X.col(j) -= (scalar_nod[i] *
da.row(i));
227 const Nodes::index idx, Eigen::Ref<Eigen::Matrix<double,Tetra::NPI,1>> result)
const
229 Eigen::Matrix<double,N,1> scalar_nod;
231 for (
int i = 0; i <
N; i++)
235 result = scalar_nod.transpose() *
eigen_a;
248 void lumping(
const Eigen::Ref<
const Eigen::Matrix<double,NPI,1>> alpha_eff,
double prefactor,
249 Eigen::Ref<Eigen::Matrix<double,3*N,3*N>> AE )
const;
256 const Eigen::Matrix<double,N,1> &x)
const;
267 Eigen::Ref<Eigen::Matrix<double,3*N,3*N>> AE)
const;
271 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> U,
272 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dUdx,
273 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dUdy,
274 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dUdz,
275 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,N>> BE)
const;
280 void add_drift_BE(
const Eigen::Ref<
const Eigen::Matrix<double,NPI,1>> alpha,
double s_dt,
282 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> U,
283 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> V,
284 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dUd_,
285 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dVd_,
286 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,N>> BE)
const;
290 Eigen::Matrix<double,NPI,1>
calc_aniso_uniax(
const Eigen::Ref<const Eigen::Vector3d> uk,
291 const double Kbis,
const double s_dt,
292 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> U,
293 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> V,
294 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> H_aniso)
const;
298 Eigen::Matrix<double,NPI,1>
calc_aniso_cub(
const Eigen::Ref<const Eigen::Matrix3d> e ,
301 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> U ,
302 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> V ,
303 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> H_aniso )
const;
308 Eigen::Matrix<double,Nodes::DIM,NPI>
Hst_order2_contribution(
const Eigen::Ref<
const Eigen::Matrix<double,Nodes::DIM,NPI>> Hst,
309 const Eigen::Ref<
const Eigen::Matrix<double,Nodes::DIM,NPI>> U ,
310 const Eigen::Ref<
const Eigen::Matrix<double,Nodes::DIM,NPI>> V)
const;
317 const std::function< Eigen::Matrix<double,Nodes::DIM,NPI> (
void)>& calc_Hext,
322 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dudx,
323 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dudy,
324 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dudz)
const;
328 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>>
u,
329 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dudx,
330 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dudy,
331 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dudz)
const;
335 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>>
u)
const;
339 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>>
u)
const;
342 Eigen::Matrix<double,Tetra::NPI,1>
charges(
const double &Ms,
343 const std::function<Eigen::Vector3d(
const Nodes::Node&)> &getter)
const override;
347 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dudx,
348 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dudy,
349 Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> dudz,
350 Eigen::Ref<Eigen::Matrix<double,NPI,1>> phi)
const;
354 const Eigen::Ref<const Eigen::Vector3d> Hext ,
355 const Eigen::Ref<
const Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>>
u )
const;
360 const std::vector<Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>> &spaceField,
362 const Eigen::Ref<
const Eigen::Matrix<double,Nodes::DIM,Tetra::NPI>>
u)
const;
366 double Jacobian(Eigen::Ref<Eigen::Matrix3d> J)
const;
375 std::function<void( Eigen::Ref<Eigen::Matrix<double,Nodes::DIM,NPI>> H)>
extraField;
378 Eigen::Matrix<double,Nodes::DIM,NPI>
getPtGauss(
void)
const override
380 Eigen::Matrix<double,Nodes::DIM,N> vec_nod;
381 for (
int i = 0; i <
N; i++)
389 Eigen::Matrix<double,Nodes::DIM,NPI>
gradV(
const std::vector<double> &V)
const;
398 const double prefactor,
399 const std::vector<Eigen::Vector3d> &s);
absorbing ends, to absorb the spin waves reaching the ends of a wire instead of reflecting them (sett...
double calc_vol(void) const
Definition: tetra.cpp:487
Eigen::Matrix< double, N, N > calcDiagBlock(const double c, const Eigen::Matrix< double, N, 1 > &x) const
Definition: tetra.cpp:102
double zeemanEnergy(const Tetra::prm ¶m, const Eigen::Ref< const Eigen::Vector3d > Hext, const Eigen::Ref< const Eigen::Matrix< double, Nodes::DIM, Tetra::NPI >> u) const
Definition: tetra.cpp:435
double cubicAnisotropyEnergy(const Tetra::prm ¶m, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> u) const
Definition: tetra.cpp:391
double Jacobian(Eigen::Ref< Eigen::Matrix3d > J) const
Definition: tetra.cpp:454
void DMI_bulk_BE(const double cst, 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) const
Definition: tetra.cpp:153
Eigen::Matrix< double, N, Nodes::DIM > da
Definition: tetra.h:171
double uniaxialAnisotropyEnergy(const Tetra::prm ¶m, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> u) const
Definition: tetra.cpp:381
double DMIBulkEnergy(const Tetra::prm ¶m, 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) const
Definition: tetra.cpp:364
Eigen::Matrix< double, NPI, 1 > calc_aniso_cub(const Eigen::Ref< const Eigen::Matrix3d > e, 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:210
double exchangeEnergy(const Tetra::prm ¶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:353
Eigen::Matrix< double, Tetra::NPI, 1 > charges(const double &Ms, const std::function< Eigen::Vector3d(const Nodes::Node &)> &getter) const override
Definition: tetra.cpp:408
Eigen::Matrix< double, N, 1 > calcOffDiagBlock(const Nodes::index idx) const
Definition: tetra.cpp:111
void DMI_bulk_OffDiag(timing const &prm_t, const double DMIbulk_bis, Eigen::Ref< Eigen::Matrix< double, 3 *N, 3 *N >> AE) const
Definition: tetra.cpp:119
Eigen::Matrix< double, Nodes::DIM, NPI > getPtGauss(void) const override
Definition: tetra.h:378
void add_drift_BE(const Eigen::Ref< const Eigen::Matrix< double, NPI, 1 >> 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:176
void interpolation(const std::function< double(Nodes::Node)> &getter, Eigen::Ref< Eigen::Matrix< double, NPI, 1 >> result) const
Definition: tetra.h:177
void interpolation(const 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:187
Eigen::Matrix< double, Nodes::DIM, NPI > gradV(const std::vector< double > &V) const
Definition: tetra.cpp:47
int idx
Definition: tetra.h:372
void lumping(const Eigen::Ref< const Eigen::Matrix< double, NPI, 1 >> alpha_eff, double prefactor, Eigen::Ref< Eigen::Matrix< double, 3 *N, 3 *N >> AE) const
Definition: tetra.cpp:77
std::function< void(Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> H)> extraField
Definition: tetra.h:375
void orientate(void) override
Definition: tetra.cpp:471
Tet(const std::vector< Nodes::Node > &_p_node, const int _idx, const std::initializer_list< int > _i)
Definition: tetra.h:144
void interpolation_field(const std::function< double(Nodes::Node)> &getter, Eigen::Ref< Eigen::Matrix< double, Nodes::DIM, NPI >> X) const
Definition: tetra.h:208
void interpolation(const std::function< double(Nodes::Node, Nodes::index)> &getter, const Nodes::index idx, Eigen::Ref< Eigen::Matrix< double, Tetra::NPI, 1 >> result) const
Definition: tetra.h:226
Eigen::Matrix< double, NPI, 1 > calc_aniso_uniax(const 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:198
void integrales(const Tetra::prm ¶m, const timing &prm_t, const std::function< Eigen::Matrix< double, Nodes::DIM, NPI >(void)> &calc_Hext, Nodes::index idx_dir, double Vdrift, const AbsorbingEnds &absorb)
Definition: tetra.cpp:248
double demagEnergy(const Tetra::prm ¶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:422
Eigen::Matrix< double, Nodes::DIM, NPI > Hst_order2_contribution(const Eigen::Ref< const Eigen::Matrix< double, Nodes::DIM, NPI >> Hst, const Eigen::Ref< const Eigen::Matrix< double, Nodes::DIM, NPI >> U, const Eigen::Ref< const Eigen::Matrix< double, Nodes::DIM, NPI >> V) const
Definition: tetra.cpp:235
Template abstract class, mother class for tetraedrons and triangles.
Definition: element.h:30
Eigen::Matrix< double, NPI, 1 > weight
Definition: element.h:59
bool existNodes(void) const
Definition: element.h:119
const Nodes::Node & getNode(const int i) const
Definition: element.h:131
Definition: time_integration.h:13
index
Definition: node.h:33
constexpr double A
Definition: tetra.h:53
constexpr double a[N][NPI]
Definition: tetra.h:69
constexpr double B
Definition: tetra.h:54
constexpr int N
Definition: tetra.h:26
constexpr double epsilon
Definition: tetra.h:24
constexpr double w[NPI]
Definition: tetra.h:60
constexpr double D
Definition: tetra.h:56
constexpr int NPI
Definition: tetra.h:51
constexpr double C
Definition: tetra.h:55
constexpr double pds[NPI]
Definition: tetra.h:61
constexpr double v[NPI]
Definition: tetra.h:59
const Eigen::Matrix< double, N, NPI > eigen_a
Definition: tetra.h:77
constexpr double E
Definition: tetra.h:57
constexpr double u[NPI]
Definition: tetra.h:58
Eigen::Matrix< double, Nodes::DIM, Tetra::NPI > calc_Hst(const Tetra::Tet &tet, const double prefactor, const std::vector< Eigen::Vector3d > &s)
Definition: tetra.cpp:62
header to define struct Node
Definition: absorbing_ends.h:26
Eigen::Vector3d p
Definition: node.h:61
double P
Definition: tetra.h:101
bool absorbing
Definition: tetra.h:113
Eigen::Matrix3d e
Definition: tetra.h:99
double volume
Definition: tetra.h:109
Eigen::Vector3d uk
Definition: tetra.h:96
std::string regName
Definition: tetra.h:89
double A
Definition: tetra.h:91
double alpha_LLG
Definition: tetra.h:90
double N0
Definition: tetra.h:102
double lsd
Definition: tetra.h:106
double DMI
Definition: tetra.h:92
void infos(void)
Definition: tetra.cpp:14
double Ms
Definition: tetra.h:93
double lsf
Definition: tetra.h:107
double K
Definition: tetra.h:95
double K3
Definition: tetra.h:98
double sigma
Definition: tetra.h:104
contains namespace Triangle header containing Tri class, and some constants and a less_than operator ...