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. The cubic constants
K1/K2 and the general expansion K0_arr are expressed in the same
rotated crystal frame and are summed, so they can be given together. The
uniaxial constant K0 is its own path with its own easy axis; a uniaxial
term that is to be combined with the cubic or the general expansion is written
into K0_arr(:,1,:) instead, as shown under General anisotropy, and
the solver points this out if K0 is set together with the others.
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. The easy axis is given directly in the global coordinate system, per cell.
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.
A non-zero alpha is used as a constant damping.