MasterDMICartLLG

Calculates a residual contribution due to the bulk or interfacial (Cnv, normal +z) Dzyaloshinskii-Moriya interaction of a ferromagnet. The weak form is not integrated by parts, so the DMI surface term is retained and the exchange + DMI natural boundary condition holds without a BC object.

Overview

Residual contribution of the Dzyaloshinskii-Moriya interaction (DMI) of a ferromagnet to the LLG equation, in the same weak form and prefactor convention as MasterExchangeCartLLG. Two energy densities are available through dmi_type,

where the interfacial (Cnv) form assumes the interface normal along . With the torque operator and the test function for component , the residual is

where is the symmetric bilinear form with , i.e. the first variation of . The gradient of carries both and , and is not replaced by 1. The form is NOT integrated by parts, so the DMI surface term is retained: assembled with MasterExchangeCartLLG it imposes the natural boundary condition

without a BC object. The material property D carries the length scale in the same way as Ae: for a mesh in nm and in J/m, supply . The sign convention of the interfacial form is that of MuMax3 (Dind). The matching energy is MasterMagneticDMIEnergy.

Landau-Lifshitz-Bloch route

With llb = true (bulk and interfacial dmi_type) the kernel solves the LLB equation (Finite-temperature micromagnetics); D is and the material properties alpha_perp and alpha_par are required. As for MasterExchangeCartLLG, the optional grad_alpha_perp and grad_alpha_par properties add the terms that integration by parts produces when the damping varies in space.

[Kernels<<<{"href": "../../syntax/Kernels/index.html"}>>>]
  [MasterDMICartLLG_x]
    type = MasterDMICartLLG<<<{"description": "Calculates a residual contribution due to the bulk or interfacial (Cnv, normal +z) Dzyaloshinskii-Moriya interaction of a ferromagnet. The weak form is not integrated by parts, so the DMI surface term is retained and the exchange + DMI natural boundary condition holds without a BC object.", "href": "MasterDMICartLLG.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = mag_x
    component<<<{"description": "An integer corresponding to the direction in order parameter space this kernel acts in (e.g. for unrotated functionals 0 for q_x, 1 for q_y, 2 for q_z)."}>>> = 0
    dmi_type<<<{"description": "bulk: w = D m.(curl m); interfacial: w = D [mz div(m) - (m.grad) mz], interface normal +z"}>>> = interfacial
  []
[]
(test/tests/magnets/llb_alpha_ramp_dmi.i)

Example Input File Syntax

The DMI class is set with dmi_type, here through [GlobalParams]. Interfacial DMI on a 1D wire (SP6 of the DMI standard problems, Cortés-Ortuño et al., New J. Phys. 20, 113015 (2018)):

[GlobalParams<<<{"href": "../../syntax/GlobalParams/index.html"}>>>]
  mag_x = mag_x
  mag_y = mag_y
  mag_z = mag_z
  g0 = 0.0002211
  mu0 = 1.256637061e-06
  Hscale = 1
  dmi_type = interfacial
[]
(test/tests/magnets/sp6_1d.i)
[Kernels<<<{"href": "../../syntax/Kernels/index.html"}>>>]
  [dmi_x]
    type = MasterDMICartLLG<<<{"description": "Calculates a residual contribution due to the bulk or interfacial (Cnv, normal +z) Dzyaloshinskii-Moriya interaction of a ferromagnet. The weak form is not integrated by parts, so the DMI surface term is retained and the exchange + DMI natural boundary condition holds without a BC object.", "href": "MasterDMICartLLG.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = mag_x
    component<<<{"description": "An integer corresponding to the direction in order parameter space this kernel acts in (e.g. for unrotated functionals 0 for q_x, 1 for q_y, 2 for q_z)."}>>> = 0
  []
[]
(test/tests/magnets/sp6_1d.i)

Bulk DMI with a Zeeman field on a cylinder (the 3D case of the same benchmark):

[GlobalParams<<<{"href": "../../syntax/GlobalParams/index.html"}>>>]
  mag_x = mag_x
  mag_y = mag_y
  mag_z = mag_z
  g0 = 0.0002211
  mu0 = 1.256637061e-06
  Hscale = 1
  dmi_type = bulk
  potential_H_int = potential_H_int
  Hext_x = Hext_x
  Hext_y = Hext_y
  Hext_z = Hext_z
[]
(test/tests/magnets/sp6_3d.i)

The material property D is supplied with the other constants:

[Materials<<<{"href": "../../syntax/Materials/index.html"}>>>]
  [constants]
    type = GenericConstantMaterial<<<{"description": "Declares material properties based on names and values prescribed by input parameters.", "href": "../materials/GenericConstantMaterial.html"}>>>
    prop_names<<<{"description": "The names of the properties this material will have"}>>> = 'alpha Ms Ae D'
    prop_values<<<{"description": "The values associated with the named properties"}>>> = '1 384000 8780000 1580000'
  []
[]
(test/tests/magnets/sp6_3d.i)

Input Parameters

  • componentAn integer corresponding to the direction in order parameter space this kernel acts in (e.g. for unrotated functionals 0 for q_x, 1 for q_y, 2 for q_z).

    C++ Type:unsigned int

    Controllable:No

    Description:An integer corresponding to the direction in order parameter space this kernel acts in (e.g. for unrotated functionals 0 for q_x, 1 for q_y, 2 for q_z).

  • mag_xThe x component of the constrained magnetic vector

    C++ Type:std::vector<VariableName>

    Unit:(no unit assumed)

    Controllable:No

    Description:The x component of the constrained magnetic vector

  • mag_yThe y component of the constrained magnetic vector

    C++ Type:std::vector<VariableName>

    Unit:(no unit assumed)

    Controllable:No

    Description:The y component of the constrained magnetic vector

  • mag_zThe z component of the constrained magnetic vector

    C++ Type:std::vector<VariableName>

    Unit:(no unit assumed)

    Controllable:No

    Description:The z component of the constrained magnetic vector

  • variableThe name of the variable that this residual object operates on

    C++ Type:NonlinearVariableName

    Unit:(no unit assumed)

    Controllable:No

    Description:The name of the variable that this residual object operates on

Required Parameters

  • Hscale1scaling factor for effective fields

    Default:1

    C++ Type:Real

    Unit:(no unit assumed)

    Controllable:No

    Description:scaling factor for effective fields

  • blockThe list of blocks (ids or names) that this object will be applied

    C++ Type:std::vector<SubdomainName>

    Controllable:No

    Description:The list of blocks (ids or names) that this object will be applied

  • displacementsThe displacements

    C++ Type:std::vector<VariableName>

    Unit:(no unit assumed)

    Controllable:No

    Description:The displacements

  • dmi_typebulkbulk: w = D m.(curl m); interfacial: w = D [mz div(m) - (m.grad) mz], interface normal +z

    Default:bulk

    C++ Type:MooseEnum

    Options:bulk, interfacial

    Controllable:No

    Description:bulk: w = D m.(curl m); interfacial: w = D [mz div(m) - (m.grad) mz], interface normal +z

  • g01electron gyromagnetic factor

    Default:1

    C++ Type:Real

    Unit:(no unit assumed)

    Controllable:No

    Description:electron gyromagnetic factor

  • llbFalseLandau-Lifshitz-Bloch route (m = M/Ms0, |m| free): transverse damping alpha_perp/|m|^2 and longitudinal damping alpha_par (material properties alpha_perp, alpha_par); alpha stays the coupling lambda in the g0/(1 + alpha^2) prefactor. Spatially varying alpha_perp/alpha_par need the optional RealVectorValue material properties grad_alpha_perp and grad_alpha_par (both or neither, e.g. CoupledGradientMaterial with scalar_property_factor = dalpha_perp/dT): they add the product-rule terms of the weak form; without them the damping is treated as uniform

    Default:False

    C++ Type:bool

    Controllable:No

    Description:Landau-Lifshitz-Bloch route (m = M/Ms0, |m| free): transverse damping alpha_perp/|m|^2 and longitudinal damping alpha_par (material properties alpha_perp, alpha_par); alpha stays the coupling lambda in the g0/(1 + alpha^2) prefactor. Spatially varying alpha_perp/alpha_par need the optional RealVectorValue material properties grad_alpha_perp and grad_alpha_par (both or neither, e.g. CoupledGradientMaterial with scalar_property_factor = dalpha_perp/dT): they add the product-rule terms of the weak form; without them the damping is treated as uniform

  • llb_m2_eps1e-06Regularisation of 1/|m|^2 -> 1/(|m|^2 + llb_m2_eps) in the LLB damping terms; matters only where |m| ~ sqrt(llb_m2_eps), e.g. at the centre of a linear wall

    Default:1e-06

    C++ Type:Real

    Unit:(no unit assumed)

    Controllable:No

    Description:Regularisation of 1/|m|^2 -> 1/(|m|^2 + llb_m2_eps) in the LLB damping terms; matters only where |m| ~ sqrt(llb_m2_eps), e.g. at the centre of a linear wall

  • mu01permeability of the vacuum

    Default:1

    C++ Type:Real

    Unit:(no unit assumed)

    Controllable:No

    Description:permeability of the vacuum

Optional Parameters

  • absolute_value_vector_tagsThe tags for the vectors this residual object should fill with the absolute value of the residual contribution

    C++ Type:std::vector<TagName>

    Controllable:No

    Description:The tags for the vectors this residual object should fill with the absolute value of the residual contribution

  • extra_matrix_tagsThe extra tags for the matrices this Kernel should fill

    C++ Type:std::vector<TagName>

    Controllable:No

    Description:The extra tags for the matrices this Kernel should fill

  • extra_vector_tagsThe extra tags for the vectors this Kernel should fill

    C++ Type:std::vector<TagName>

    Controllable:No

    Description:The extra tags for the vectors this Kernel should fill

  • matrix_onlyFalseWhether this object is only doing assembly to matrices (no vectors)

    Default:False

    C++ Type:bool

    Controllable:No

    Description:Whether this object is only doing assembly to matrices (no vectors)

  • matrix_tagssystemThe tag for the matrices this Kernel should fill

    Default:system

    C++ Type:MultiMooseEnum

    Options:nontime, system

    Controllable:No

    Description:The tag for the matrices this Kernel should fill

  • vector_tagsnontimeThe tag for the vectors this Kernel should fill

    Default:nontime

    C++ Type:MultiMooseEnum

    Options:nontime, time

    Controllable:No

    Description:The tag for the vectors this Kernel should fill

Contribution To Tagged Field Data Parameters

  • control_tagsAdds user-defined labels for accessing object parameters via control logic.

    C++ Type:std::vector<std::string>

    Controllable:No

    Description:Adds user-defined labels for accessing object parameters via control logic.

  • diag_save_inThe name of auxiliary variables to save this Kernel's diagonal Jacobian contributions to. Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)

    C++ Type:std::vector<AuxVariableName>

    Unit:(no unit assumed)

    Controllable:No

    Description:The name of auxiliary variables to save this Kernel's diagonal Jacobian contributions to. Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)

  • enableTrueSet the enabled status of the MooseObject.

    Default:True

    C++ Type:bool

    Controllable:Yes

    Description:Set the enabled status of the MooseObject.

  • implicitTrueDetermines whether this object is calculated using an implicit or explicit form

    Default:True

    C++ Type:bool

    Controllable:No

    Description:Determines whether this object is calculated using an implicit or explicit form

  • save_inThe name of auxiliary variables to save this Kernel's residual contributions to. Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)

    C++ Type:std::vector<AuxVariableName>

    Unit:(no unit assumed)

    Controllable:No

    Description:The name of auxiliary variables to save this Kernel's residual contributions to. Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)

  • search_methodnearest_node_connected_sidesChoice of search algorithm. All options begin by finding the nearest node in the primary boundary to a query point in the secondary boundary. In the default nearest_node_connected_sides algorithm, primary boundary elements are searched iff that nearest node is one of their nodes. This is fast to determine via a pregenerated node-to-elem map and is robust on conforming meshes. In the optional all_proximate_sides algorithm, primary boundary elements are searched iff they touch that nearest node, even if they are not topologically connected to it. This is more CPU-intensive but is necessary for robustness on any boundary surfaces which has disconnections (such as Flex IGA meshes) or non-conformity (such as hanging nodes in adaptively h-refined meshes).

    Default:nearest_node_connected_sides

    C++ Type:MooseEnum

    Options:nearest_node_connected_sides, all_proximate_sides

    Controllable:No

    Description:Choice of search algorithm. All options begin by finding the nearest node in the primary boundary to a query point in the secondary boundary. In the default nearest_node_connected_sides algorithm, primary boundary elements are searched iff that nearest node is one of their nodes. This is fast to determine via a pregenerated node-to-elem map and is robust on conforming meshes. In the optional all_proximate_sides algorithm, primary boundary elements are searched iff they touch that nearest node, even if they are not topologically connected to it. This is more CPU-intensive but is necessary for robustness on any boundary surfaces which has disconnections (such as Flex IGA meshes) or non-conformity (such as hanging nodes in adaptively h-refined meshes).

  • seed0The seed for the master random number generator

    Default:0

    C++ Type:unsigned int

    Controllable:No

    Description:The seed for the master random number generator

  • use_displaced_meshFalseWhether or not this object should use the displaced mesh for computation. Note that in the case this is true but no displacements are provided in the Mesh block the undisplaced mesh will still be used.

    Default:False

    C++ Type:bool

    Controllable:No

    Description:Whether or not this object should use the displaced mesh for computation. Note that in the case this is true but no displacements are provided in the Mesh block the undisplaced mesh will still be used.

Advanced Parameters

  • prop_getter_suffixAn optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.

    C++ Type:MaterialPropertyName

    Unit:(no unit assumed)

    Controllable:No

    Description:An optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.

  • use_interpolated_stateFalseFor the old and older state use projected material properties interpolated at the quadrature points. To set up projection use the ProjectedStatefulMaterialStorageAction.

    Default:False

    C++ Type:bool

    Controllable:No

    Description:For the old and older state use projected material properties interpolated at the quadrature points. To set up projection use the ProjectedStatefulMaterialStorageAction.

Material Property Retrieval Parameters

Input Files