Material parameters
All material parameters may be specified per cell, i.e. as an array with one
entry per grid cell, which is what makes it possible to model composite
materials, grain structures and phase boundaries. In Matlab a scalar value is
expanded to a full array by struct(problem); in Python a scalar passed to
the constructor is expanded on assignment.
Matlab |
Python |
Unit |
Description |
|---|---|---|---|
|
|
A/m |
Saturation magnetization. Enters the demagnetization field directly and scales the exchange and anisotropy fields. |
|
|
J/m |
Exchange stiffness constant. Where two cells with different values share a face, the coupling between them is the harmonic mean of the two, which can be overridden as seen in Exchange across a material interface. |
|
|
J/m3 |
Uniaxial anisotropy constant, used together with the easy axis |
|
|
J/m3 |
Cubic anisotropy constants, used together with |
|
|
J/m3 |
General anisotropy expansion, an |
|
|
- |
Local crystal coordinate system, an |
|
|
- |
Uniaxial easy-axis direction of every cell, an |
|
|
m/(A s) |
Damping constant of the Landau-Lifshitz equation. |
|
|
m/(A s) |
Precession constant. Set to zero to remove precession. |
|
|
K |
Per-cell temperature, see Thermal fluctuations. |
Internally the solver forms the scaled coefficients \(J = A_0/(\mu_0 M_s)\), \(K = K_0/(\mu_0 M_s)\) and \(M = M_s\), so that all field terms come out in A/m.
Note
For the tetrahedron and unstructuredPrisms grids the exchange
prefactor is normalised by the largest value of \(A_0\) in the mesh, and
the spatial variation of \(A_0\) is instead carried inside the exchange
operator itself. On a uniform grid the local \(A_0\) enters the
prefactor directly.
The exchange length that sets the required cell size follows from \(A_0\) and \(M_s\),
Magnetocrystalline anisotropy
MagTense offers three ways of specifying the anisotropy. They are mutually
exclusive in the following sense: the uniaxial constant K0 cannot be
combined with K1, K2 or K0_arr. Doing so aborts the solve with
MagTense: the uniaxial anisotropy K0 cannot be combined with K1, K2 or K0_arr
MagTense: express the uniaxial term through K0_arr(:,1,:) instead, or set K0 to zero
K1/K2 and K0_arr are compatible - they are expressed in the same
rotated frame and are summed.
Uniaxial anisotropy
Specify a local anisotropy constant K0(i) at every grid point together with
an easy axis u_ea(i,:) = [easyX(i), easyY(i), easyZ(i)]. The anisotropy
field is then
i.e. a positive \(K_0\) makes \(\mathbf{u}_\mathrm{ea}\) an easy axis.
This path does not use CrysAxis.
Cubic anisotropy
Specify K1(i) and K2(i) at every grid point together with a local
coordinate system
whose rows are the crystal axes of cell \(i\) expressed in the global coordinate system. The default is the three Cartesian axes. The energy density follows the standard convention
with \(m\) expressed in the local crystal frame, so that \(K_1 > 0\) gives easy axes along \(\langle 100 \rangle\).
General anisotropy
If the anisotropy is neither uniaxial nor cubic, a general matrix formulation is available. The anisotropy energy density is written as a polynomial expansion [following Eq. (2) in https://doi.org/10.1088/1361-665X/aafff8, generalized to independent coordinates]
again with \(\mathbf{m}\) in the local crystal frame given by
CrysAxis. The anisotropy field is
\(\mathbf{H}_\mathrm{ani} = -\frac{1}{\mu_0 M_s}\,\partial E_\mathrm{an}/\partial \mathbf{m}\).
The overall minus sign in front of the bracket is what makes a positive
coefficient an easy direction, consistent with the uniaxial convention above.
The coefficients are specified per grid point as a 6x3 matrix
In this notation a uniaxial anisotropy along the local z-direction is
and a cubic anisotropy with the standard sign convention is
which is exactly what the solver inserts when K1 and K2 are given
directly. Because the two are added, an arbitrary higher-order term may be
placed in K0_arr while the cubic part is still given through K1 and
K2.
Time-dependent damping
The damping constant may be made a function of time. This is used to speed up relaxation towards an equilibrium state: a large damping early on kills the precession quickly, and it is then lowered towards the physical value.
If alpha is set to zero, the solver instead interpolates the tabulated
values in alphat. In Matlab this table is filled by
problem = problem.setAlpha( @(t) alpha_of_t(t), t_alpha );
and in Python through the t_alpha and alpha_fct constructor arguments.
If alpha is non-zero it is used as a constant and the table is ignored.
Note
The parameter MaxT0 is accepted by both interfaces for backward
compatibility but is not used by the current solver. Use the tabulated
alphat above instead.