Finite-temperature micromagnetics: the Landau-Lifshitz-Bloch equation
The LLG equation keeps , so temperature can only enter through its parameters. Near the Curie temperature , or when the temperature varies in space, the magnitude of the magnetization changes as well: domain walls become elliptic and then linear Hinzke et al. (2008), and walls or skyrmions in a thermal gradient are pushed by the gradient of their own free energy Schlickeiser et al. (2014). The Landau-Lifshitz-Bloch (LLB) equation Garanin (1997) describes these effects. It is valid below and above . Reviews: Atxitia et al. (2017), Evans et al. (2012).
FERRET solves the LLB equation with the same kernels as LLG. Each torque kernel has a route switch llb = true, and MasterLongitudinalLLB supplies the longitudinal field with form = llb. With the default settings every kernel behaves exactly as before. (The form = penalty term of MasterLongitudinalLLB, mentioned on the micromagnetics page, is a norm penalty, not this equation.)
Equation
The variable is , with the saturation magnetization at . is free and relaxes toward the equilibrium value . FERRET writes the LLB equation in the regular form
(1)
This is identical to Garanin's form . The only multiplies , which vanishes at and above . The parameter llb_m2_eps regularizes it at the centre of a linear wall, where .
The effective field is the sum of the usual micromagnetic fields (exchange, DMI, anisotropy, Zeeman, demagnetization) and the longitudinal field
acts only through the term, so it relaxes to on the time scale . This time is short: about 10 fs at 300 K for typical parameters.
Temperature dependence goes into the material properties
| Property | Meaning |
|---|---|
Ms | , a constant. Do not make it temperature dependent: is already scaled by . |
me | |
chi_par | in m/A ( times the usual in 1/T) |
alpha_perp, alpha_par | transverse and longitudinal damping. In mean-field theory , and below ; above , . |
Ae, D, K1 (K2, Kh) | , , . The energies are written in , so these are the temperature-dependent constants divided by . |
alpha | , the coupling to the bath. In the LLB route it only sets the prefactor , that is, the time scale. The damping itself comes from alpha_perp and alpha_par. |
With a temperature variable T, each property can be a PiecewiseLinearInterpolationMaterial table in T, for example from a mean-field or atomistic calculation. These tables clamp outside their range, so cover every temperature the run can reach. Writing the constants this way is exact for a spatially varying . Unit-length LLG with is not: it adds a spurious force comparable to the entropic force itself.
In the LLB route the uniaxial anisotropy uses the transverse form . It has the same torque as the usual form but does not shift inside the domains. The optional hard-axis term (properties Kh, nhx, nhy, nhz) makes biaxial walls with a Walker breakdown.
Weak form and spatially varying damping
Every LLB kernel computes the residual , with the test vector
For gradient energies (exchange, DMI) the field contains or , and integration by parts moves the derivative onto . When and vary in space, contains and . MasterExchangeCartLLG and MasterDMICartLLG include these terms when the material properties grad_alpha_perp and grad_alpha_par (RealVectorValue) are present. Supply them whenever the damping varies in space, in particular with . Without them the damping is treated as locally uniform. A wall then drifts at , and a skyrmion settles about 7 degrees off the gradient axis. Stock MOOSE objects provide the gradients: PiecewiseLinearInterpolationMaterial declares the derivative dalpha_perp/dT, and CoupledGradientMaterial multiplies it by :
[Materials]
[alpha_perp] # table in T; also declares dalpha_perp/dT
type = PiecewiseLinearInterpolationMaterial
property = alpha_perp
variable = T
x = '...'
y = '...'
[]
[grad_alpha_perp]
type = CoupledGradientMaterial
gradient_material_name = grad_alpha_perp
coupled_variable = T
scalar_property_factor = dalpha_perp/dT
[]
# the same pair for alpha_par
[]
A prescribed can use GenericConstantVectorMaterial or GenericFunctionVectorMaterial for the gradients instead, as in the test below. The prefactor and are assumed uniform; a spatially varying alpha () or Ms is not covered by these terms.
[Materials<<<{"href": "../syntax/Materials/index.html"}>>>]
[constants]
type = GenericConstantMaterial<<<{"description": "Declares material properties based on names and values prescribed by input parameters.", "href": "../source/materials/GenericConstantMaterial.html"}>>>
prop_names<<<{"description": "The names of the properties this material will have"}>>> = 'alpha Ms Ae K1 nx ny nz me chi_par'
prop_values<<<{"description": "The values associated with the named properties"}>>> = '0.1 1 1 1 0 0 1 0.8 0.05'
[]
[alphas]
type = GenericFunctionMaterial<<<{"description": "Material object for declaring properties that are populated by evaluation of Function object.", "href": "../source/materials/GenericFunctionMaterial.html"}>>>
prop_names<<<{"description": "The names of the properties this material will have"}>>> = 'alpha_perp alpha_par'
prop_values<<<{"description": "The corresponding names of the functions that are going to provide the values for the variables"}>>> = 'ap al'
[]
[grad_alphas]
type = GenericConstantVectorMaterial<<<{"description": "Declares material properties based on names and vector values prescribed by input parameters.", "href": "../source/materials/GenericConstantVectorMaterial.html"}>>>
prop_names<<<{"description": "The names of the properties this material will have"}>>> = 'grad_alpha_perp grad_alpha_par'
prop_values<<<{"description": "The values associated with the named properties. The vector lengths must be the same."}>>> = '-0.002 0 0 0.002 0 0'
[]
[](test/tests/magnets/llb_alpha_ramp_wall.i)Stochastic LLB
The stochastic form sLLB-II of Evans et al. (2012) adds a transverse thermal field , which enters only through the damping term, and an additive longitudinal noise :
: a third instance of MasterInteractionCartLLGHConst with
thermal_field = true, the material propertysigma_perpand three noise user objectsnoise_x,noise_y,noise_z.: the stock
LocalConservedLangevinNoisekernel on each component, withamplitudeandT_bathset to an auxiliary variable equal to 1.The noise user objects are LocalConservedNormalNoise with
conserved = false(keep the uniform mode) andwhite_noise = true(space-time white noise, so the load vector has the fluctuation-dissipation covariance with the consistent mass matrix).
In FERRET units (nm, ns, A/m, in m/(A ns))
where the factor converts the cell volume to nm. Practical points:
MOOSE reseeds every random object at each step with
seed + timestep. Seeds of different noise objects must therefore differ by more than the number of time steps (the test uses apart). Otherwise the streams are copies of each other, shifted in time.Use
line_search = btfor stochastic runs.An element is a macrospin only if
mag_x/y/zare CONSTANT MONOMIAL, or if exchange locks the nodes together.
[UserObjects<<<{"href": "../syntax/UserObjects/index.html"}>>>]
[hx_noise]
type = LocalConservedNormalNoise<<<{"description": "Gaussian normal distributed random number noise provider for the ConservedLangevinNoise kernel.", "href": "../source/userobjects/LocalConservedNormalNoise.html"}>>>
conserved<<<{"description": "Subtract the volume average so the noise integrates to zero (concentration-type fields); false keeps the uniform mode (non-conserved order parameters, macrospins)"}>>> = false
white_noise<<<{"description": "Divide each value by sqrt(JxW dt): space-time white noise with unit strength, so a source -test*sqrt(2D)*value has the fluctuation-dissipation covariance 2D M/dt (M the consistent mass matrix)"}>>> = true
seed<<<{"description": "The seed for the master random number generator"}>>> = 1
[]
[hy_noise]
type = LocalConservedNormalNoise<<<{"description": "Gaussian normal distributed random number noise provider for the ConservedLangevinNoise kernel.", "href": "../source/userobjects/LocalConservedNormalNoise.html"}>>>
conserved<<<{"description": "Subtract the volume average so the noise integrates to zero (concentration-type fields); false keeps the uniform mode (non-conserved order parameters, macrospins)"}>>> = false
white_noise<<<{"description": "Divide each value by sqrt(JxW dt): space-time white noise with unit strength, so a source -test*sqrt(2D)*value has the fluctuation-dissipation covariance 2D M/dt (M the consistent mass matrix)"}>>> = true
seed<<<{"description": "The seed for the master random number generator"}>>> = 10000001
[]
[hz_noise]
type = LocalConservedNormalNoise<<<{"description": "Gaussian normal distributed random number noise provider for the ConservedLangevinNoise kernel.", "href": "../source/userobjects/LocalConservedNormalNoise.html"}>>>
conserved<<<{"description": "Subtract the volume average so the noise integrates to zero (concentration-type fields); false keeps the uniform mode (non-conserved order parameters, macrospins)"}>>> = false
white_noise<<<{"description": "Divide each value by sqrt(JxW dt): space-time white noise with unit strength, so a source -test*sqrt(2D)*value has the fluctuation-dissipation covariance 2D M/dt (M the consistent mass matrix)"}>>> = true
seed<<<{"description": "The seed for the master random number generator"}>>> = 20000001
[]
[px_noise]
type = LocalConservedNormalNoise<<<{"description": "Gaussian normal distributed random number noise provider for the ConservedLangevinNoise kernel.", "href": "../source/userobjects/LocalConservedNormalNoise.html"}>>>
conserved<<<{"description": "Subtract the volume average so the noise integrates to zero (concentration-type fields); false keeps the uniform mode (non-conserved order parameters, macrospins)"}>>> = false
white_noise<<<{"description": "Divide each value by sqrt(JxW dt): space-time white noise with unit strength, so a source -test*sqrt(2D)*value has the fluctuation-dissipation covariance 2D M/dt (M the consistent mass matrix)"}>>> = true
seed<<<{"description": "The seed for the master random number generator"}>>> = 30000001
[]
[py_noise]
type = LocalConservedNormalNoise<<<{"description": "Gaussian normal distributed random number noise provider for the ConservedLangevinNoise kernel.", "href": "../source/userobjects/LocalConservedNormalNoise.html"}>>>
conserved<<<{"description": "Subtract the volume average so the noise integrates to zero (concentration-type fields); false keeps the uniform mode (non-conserved order parameters, macrospins)"}>>> = false
white_noise<<<{"description": "Divide each value by sqrt(JxW dt): space-time white noise with unit strength, so a source -test*sqrt(2D)*value has the fluctuation-dissipation covariance 2D M/dt (M the consistent mass matrix)"}>>> = true
seed<<<{"description": "The seed for the master random number generator"}>>> = 40000001
[]
[pz_noise]
type = LocalConservedNormalNoise<<<{"description": "Gaussian normal distributed random number noise provider for the ConservedLangevinNoise kernel.", "href": "../source/userobjects/LocalConservedNormalNoise.html"}>>>
conserved<<<{"description": "Subtract the volume average so the noise integrates to zero (concentration-type fields); false keeps the uniform mode (non-conserved order parameters, macrospins)"}>>> = false
white_noise<<<{"description": "Divide each value by sqrt(JxW dt): space-time white noise with unit strength, so a source -test*sqrt(2D)*value has the fluctuation-dissipation covariance 2D M/dt (M the consistent mass matrix)"}>>> = true
seed<<<{"description": "The seed for the master random number generator"}>>> = 50000001
[]
[assert]
type = Terminator<<<{"description": "Requests termination of the current solve based on the evaluation of a parsed logical expression of the Postprocessor value(s).", "href": "../source/userobjects/Terminator.html"}>>>
expression<<<{"description": "FParser expression to process Postprocessor values into a boolean value. Termination of the simulation occurs when this returns true."}>>> = 'sim_time > 0.002230747728 & (abs(m_avg - 0.31308) > 0.008 | abs(m_std/0.02159 - 1) > 0.2)'
fail_mode<<<{"description": "Abort entire simulation (HARD), just the current time step (SOFT), or not at all (NONE)."}>>> = HARD
error_level<<<{"description": "The error level for the message. A level of ERROR will always lead to a hard termination of the entire simulation."}>>> = ERROR
message<<<{"description": "An optional message to be output instead of the default message when the termination condition is triggered"}>>> = 'sLLB ensemble: <|m|> or its spread is outside the Boltzmann window'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_end'
[]
[](test/tests/magnets/sllb_ensemble.i)Solver settings
Do not use the renormalization user object or the tangent-plane integrators: is a degree of freedom.
Use
implicit-eulerorbdf2.implicit-midpointis not L-stable, so the fast longitudinal mode rings when .Recommended:
nl_abs_tol = 1e-10,nl_rel_tol = 1e-8,nl_rel_step_tol = 1e-12,line_search = none(deterministic),nl_forced_its = 1. On fine meshes the round-off floor of the residual exceedsnl_abs_tol; the step tolerance lets Newton stop there instead of cutting .For static states, limit
dtmax. A very large implicit step is a Newton solve for the static equations, and near a bifurcation (for example the elliptic-to-linear wall transition) it can land on the unstable branch.
Regression tests
All are in test/tests/magnets/; each asserts its physics with a Terminator, so a wrong result stops the run.
The reduced-unit tests use .
| Test | Setup | Asserted (tolerance) |
|---|---|---|
llb_tau_par | macrospin, classical MFA, K, K | , ns () |
llb_tau_par_above | as llb_tau_par, K | the same relaxation, ns () |
llb_cone | macrospin at 300 K, , J/m (LLB inputs , ) | the minimum of the LLB free energy (anisotropy + longitudinal): cone angle and |
llb_helix | bulk-DMI helix at 600 K, one period , , periodic | exchange + DMI energy density (); pulled above to , shift (2 %, the mesh error is 0.9 %) |
llb_demag_film | 1-D film at 600 K along its normal , vacuum on both sides, natural BCs, precessing in an in-plane field along | in the film, once the transient has decayed: () and the para-process (); the gold CSV holds the Kittel ring-down |
llb_biaxial_chi | uniform LLB state, reduced units, , easy , hard with , | the hard-axis term has no part, so , , (, at ) |
walker_llg | LLG 1-D wall, reduced units, easy , hard , , , , started as the Walker profile | at , the exact Walker solution: , (), and with () |
walker_llg_above | as walker_llg, | the wall plane precesses at at every step up to (1 %); the rate is positive at every , which proves the breakdown |
llb_alpha_ramp_wall | LLB Bloch wall, reduced units, , easy , uniform , , | a static LLB state does not depend on : after , at every step. Without grad_alpha_* the wall drifts at ; the start-up ring-down leaves a displacement , not a drift |
llb_alpha_ramp_dmi | as llb_alpha_ramp_wall, Néel wall with interfacial | the same bound, now for the exchange + DMI weak form |
sllb_ensemble | sLLB-II, 200 independent macrospins (CONSTANT MONOMIAL , 5.3 nm cells) at 620 K | after : ensemble within 0.008 of the Boltzmann value 0.31308, and its spread within 20 % of 0.02159 |
Beyond the tests, the implementation reproduces:
the LLG limit;
the Bloch, elliptic and linear walls of Hinzke et al. (2008), including the transition temperature;
the entropic wall velocities of Schlickeiser et al. (2014);
the Thiele motion of a skyrmion in a thermal gradient (the Hall ratio to 0.4 %, and the force equal to to about 1 %).
References
- U. Atxitia, D. Hinzke, and U. Nowak.
Fundamentals and applications of the Landau-Lifshitz-Bloch equation.
Journal of Physics D: Applied Physics, 50:033003, 2017.[Export]
- R. F. L. Evans, D. Hinzke, U. Atxitia, U. Nowak, R. W. Chantrell, and O. Chubykalo-Fesenko.
Stochastic form of the Landau-Lifshitz-Bloch equation.
Physical Review B, 85:014433, 2012.[Export]
- D. A. Garanin.
Fokker-Planck and Landau-Lifshitz-Bloch equations for classical ferromagnets.
Physical Review B, 55:3050, 1997.[Export]
- D. Hinzke, N. Kazantseva, U. Nowak, O. N. Mryasov, P. Asselin, and R. W. Chantrell.
Domain wall properties of FePt: From Bloch to linear walls.
Physical Review B, 77:094407, 2008.[Export]
- F. Schlickeiser, U. Ritzmann, D. Hinzke, and U. Nowak.
Role of Entropy in Domain Wall Motion in Thermal Gradients.
Physical Review Letters, 113:097201, 2014.[Export]