Bulk Dzyaloshinskii–Moriya interaction¶
Last changes: Documentation changelog
This is the canonical public reference for isotropic bulk Dzyaloshinskii–Moriya interaction (bulk or Bloch DMI). Common physics is defined once here; FDM/FEM and CPU/GPU differences are realization sections.
The public coefficient is \(D_b\) in \(\mathrm{J\,m^{-2}}\). It multiplies one spatial derivative, so the resulting volume density is in \(\mathrm{J\,m^{-3}}\).
1. Physical problem¶
Let \(\Omega_m\) be the magnetic domain and \(\mathbf M=M_s\mathbf m\) the physical magnetization, with \(\lvert\mathbf m\rvert=1\) on magnetic degrees of freedom:
This is a volume invariant, distinct from interfacial DMI.
2. Governing equations¶
For an admissible variation \(\mathbf v\),
Using \(\nabla\cdot(\mathbf v\times\mathbf m) =\mathbf m\cdot(\nabla\times\mathbf v) -\mathbf v\cdot(\nabla\times\mathbf m)\):
With the Fullmag energy-field convention \(\delta E=-\mu_0\int_{\Omega_m}M_s\mathbf H_b\cdot\mathbf v\,\mathrm dV\):
The natural boundary term and exchange-coupled free boundary law are
The non-periodic FDM planner does not expose this natural closure and fails closed; FEM carries it through the weak residual.
3. Symbols and SI units¶
Symbol |
Meaning |
SI unit |
|---|---|---|
\(\mathbf M\) |
physical magnetization \(M_s\mathbf m\) |
\(\mathrm{A\,m^{-1}}\) |
\(M_s\) |
saturation magnetization |
\(\mathrm{A\,m^{-1}}\) |
\(\mathbf m\) |
reduced magnetization |
\(1\) |
\(\mathbf v\) |
admissible variation or test field |
\(1\) |
\(D_b\) |
bulk DMI coefficient |
\(\mathrm{J\,m^{-2}}\) |
\(A\) |
exchange stiffness in the coupled boundary law |
\(\mathrm{J\,m^{-1}}\) |
\(\mu_0\) |
vacuum permeability |
\(\mathrm{N\,A^{-2}}\) |
\(\Omega_m\) |
magnetic integration domain |
\(\mathrm{m^3}\) |
\(\partial\Omega_m\) |
magnetic boundary |
\(\mathrm{m^2}\) |
\(\boldsymbol\nu\) |
outward unit normal |
\(1\) |
\(w_b\) |
bulk DMI energy density |
\(\mathrm{J\,m^{-3}}\) |
\(E_b\) |
total bulk DMI energy |
\(\mathrm{J}\) |
\(\mathbf H_b\) |
bulk DMI effective field |
\(\mathrm{A\,m^{-1}}\) |
\(m_\alpha\) |
Cartesian magnetization component |
\(1\) |
\(\partial_\alpha\) |
spatial derivative |
\(\mathrm{m^{-1}}\) |
\(\delta_\alpha\) |
centered FDM derivative |
\(\mathrm{m^{-1}}\) |
\(\nabla_h\times\) |
centered discrete curl operator |
\(\mathrm{m^{-1}}\) |
\(\Delta x\) |
FDM x cell dimension |
\(\mathrm{m}\) |
\(\Delta y\) |
FDM y cell dimension |
\(\mathrm{m}\) |
\(\Delta z\) |
FDM z cell dimension |
\(\mathrm{m}\) |
\(i\) |
FDM cell index |
\(1\) |
\(\mathcal A\) |
active FDM cell set |
\(1\) |
\(V_i\) |
FDM cell volume |
\(\mathrm{m^3}\) |
\(\mathbf m_h\) |
FEM finite-element magnetization |
\(1\) |
\(\mathbf v_h\) |
FEM finite-element test field |
\(1\) |
\(\Omega_e\) |
FEM element domain |
\(\mathrm{m^3}\) |
\(q\) |
quadrature point index |
\(1\) |
\(D_{b,e}\) |
element bulk DMI coefficient |
\(\mathrm{J\,m^{-2}}\) |
\(\mathbf m_q\) |
quadrature-point magnetization |
\(1\) |
\(w_q\) |
quadrature weight including element Jacobian |
\(\mathrm{m^3}\) |
\(g_{b,a}\) |
assembled bulk-DMI residual at node a |
\(\mathrm{J}\) |
\(M_{s,a}\) |
nodal saturation magnetization |
\(\mathrm{A\,m^{-1}}\) |
\(M_a^{\mathrm{lump}}\) |
nodal lumped mass |
\(\mathrm{m^3}\) |
\(H_{b,a}\) |
projected nodal bulk-DMI field |
\(\mathrm{A\,m^{-1}}\) |
4. Assumptions and validity¶
The invariant is isotropic cubic/B20-type bulk DMI with one finite scalar coefficient; either sign is accepted and selects chirality.
FDM uses a centered cell curl. Periodic neighbors wrap; missing/inactive non-periodic neighbors use the center value.
Explicit FDM Bulk DMI requires all three axes periodic. Multilayer FDM rejects it.
FEM uses a nodal vector field, quadrature weak residual, and lumped-mass projection. The element coefficient is the arithmetic mean of nodal Dbulk_field values.
General Lifshitz tensors, lower-symmetry crystals, surface-only DMI, and an independent DMI boundary operator are outside this contract.
5. Python API¶
The current stage-first body API exposes the scalar bulk-DMI route as body.Dbulk. The builder
lowers it to a BulkDMI energy term. The FDM planner requires all three axes to be periodic, so
the complete helical-state scenario declares that policy explicitly and disables demagnetization
to isolate the bulk-DMI field and energy.
# %% Imports and units
import math
import fullmag as fm
nm = 1.0e-9
period = 40 * nm
wave_number = 2.0 * math.pi / period
# %% Fully periodic FDM study required by bulk DMI
study = fm.study("bulk_dmi_helical_state")
study.engine("fdm")
study.device("cpu", precision="double")
study.mode("strict")
study.objects.mesh.defaults(cell_size=(2 * nm, 2 * nm, 2 * nm))
study.pbc(x=True, y=True, z=True)
# %% Geometry, B20 material, transverse helix, and interactions
crystal = study.geometry(
fm.Box(size=(80 * nm, 16 * nm, 16 * nm), name="crystal"),
name="crystal",
)
crystal.Ms = 3.84e5
crystal.Aex = 8.78e-12
crystal.Dbulk = 1.58e-3
crystal.alpha = 0.02
crystal.m = fm.texture.helical(
wavevector=(wave_number, 0.0, 0.0),
e1=(0.0, 1.0, 0.0),
e2=(0.0, 0.0, 1.0),
)
study.exchange()
study.demag(enabled=False)
study.solver(integrator="rk4", fix_dt=1.0e-14)
# %% Ordered measurement stage
study.stages.add_run(stage_id="measure_bulk_dmi", until=1.0e-12).autosave(
fm.StageAutosave(
table=fm.TableAutosave(
t_sampl=1.0e-13,
quantities=["t", "mx", "my", "mz", "e_ex", "e_dmi", "e_total"],
),
fields=[fm.FieldAutosave("H_dmi_bulk", every=2.0e-13)],
)
)
Python parameter |
Type |
Default |
SI unit |
Validation domain |
Meaning |
Backend support |
ProblemIR destination |
|---|---|---|---|---|---|---|---|
|
|
required |
\(\mathrm{J\,m^{-2}}\) |
finite; either sign |
explicit bulk-DMI coefficient and chirality sign |
FDM/FEM CPU/GPU subject to planner and qualification gates |
|
|
|
|
\(\mathrm{J\,m^{-2}}\) |
finite when supplied |
material-owned scalar bulk-DMI coefficient |
FEM CPU/GPU; FDM planner-dependent |
|
|
|
|
\(\mathrm{J\,m^{-2}}\) |
finite values; resolved mesh cardinality |
spatial nodal bulk-DMI coefficient |
FEM CPU/GPU |
|
|
|
required |
\(1\) |
exactly three values |
periodic/open axes |
FDM CPU/GPU |
|
|
|
|
\(1\) |
three declared demag strings |
FDM demag policy |
FDM |
|
|
|
|
\(1\) |
non-negative; truncated images only |
image counts |
FDM |
|
The other required Material parameters (name, Ms, A, alpha) are documented by the canonical Material API page.
6. ProblemIR¶
Explicit authoring serializes as:
{"kind": "bulk_dmi", "D": 0.003}
Material authoring serializes as:
{"bulk_dmi": 0.003, "dbulk_field": null}
The explicit and material routes are alternative coefficient sources and are not silently summed. The FEM planner can use the material scalar when no explicit scalar supplies the coefficient and promotes a material field into the resolved FEM field. FdmPbc converts booleans to periodic/open strings. Requested Python intent is preserved separately from resolved execution: solver, device, precision, route, boundary policy, projection, and qualification evidence are provenance data.
7. Round-trip and failure semantics¶
Canonical script export preserves explicit BulkDMI(D=…) versus Material(Dbulk=…)/Material(Dbulk_field=…). Normalization never turns bulk DMI into interfacial DMI or invents a non-periodic FDM boundary.
Validation errors include non-finite coefficients, malformed FDM tuples, material-field cardinality mismatch, invalid IR terms, missing FEM context, and missing resident GPU buffers. The FDM planner rejects explicit Bulk DMI unless all three axes are periodic and rejects multilayer FDM.
Unsupported combinations are planner/runtime failures, not CPU fallback, silent term removal, or a claim of backend parity. Requested intent and resolved execution remain separately inspectable.
8. Discrete realization¶
FDM CPU¶
FDM GPU¶
FP64 and FP32 CUDA field-combination kernels use the same negative-curl convention and the CUDA reduction sums the bulk density. The planner still requires fully periodic axes; source presence is not device qualification.
FEM CPU¶
The native loop uses the arithmetic mean of nodal Dbulk_field, periodic reduced-node projection, MFEM quadrature, and lumped projection.
FEM GPU¶
The CUDA dmi_element_residual_kernel has a bulk mode for tetrahedral gradients, coefficient, curl, residual, and energy blocks. RK dispatch uses resident h_bulk_dmi, geometry, saturation, lumped-mass, and residual buffers. Final reduction owns a separate Bulk DMI energy slot. Atomic accumulation and reduction order differ from CPU.
9. Implementation mapping¶
Layer |
FDM CPU |
FDM GPU |
FEM CPU |
FEM GPU |
|---|---|---|---|---|
coefficient |
explicit scalar |
device D_bulk |
scalar or nodal mean |
resident material field |
field |
centered curl |
FP64/FP32 centered curl |
weak residual + lumped projection |
CUDA residual + RK projection |
energy |
active-cell volume sum |
CUDA reduction |
quadrature sum |
element blocks + final slot |
boundary |
all-axis periodic gate |
same gate |
weak residual term |
same weak form |
failure |
non-periodic/multilayer rejection |
same gate |
invalid context/buffers |
missing resources/evidence |
10. Validation¶
Check |
Expected result |
Evidence boundary |
|---|---|---|
constant m |
zero curl, field, energy |
analytical/unit test |
linear Cartesian field |
analytic curl components |
analytical/unit test |
D_b to -D_b |
field and energy sign reverse |
CPU/backend test |
FDM CPU/GPU |
same periodic FP64 grid within tolerance |
managed device run |
FEM weak residual |
tetrahedral reference agreement |
weak-residual test |
FEM CPU/GPU |
field and final energy agreement |
managed native runtime |
planner gate |
non-periodic/multilayer fails closed |
planner test |
Python round-trip |
explicit/material routes distinct |
Python/IR test |
Compilation, source inspection, and skipped GPU tests are not proof of executed-device parity.
11. Limitations¶
Non-periodic FDM natural exchange+DMI boundary conditions are not exposed.
Multilayer FDM Bulk DMI is rejected.
Lower-symmetry/tensorial DMI families are outside this contract.
The material-field element reduction is an arithmetic nodal mean.
Material.Dbulk warning text and the public coefficient contract use \(\mathrm{J\,m^{-2}}\).
12. Scientific bibliography¶
A. N. Bogdanov and D. A. Yablonskii, “Thermodynamically stable vortices in magnetically ordered crystals,” Soviet Physics JETP 68, 101 (1989).
A. N. Bogdanov and U. K. Rößler, “Chiral symmetry breaking in magnetic thin films and multilayers,” Physical Review Letters 87, 037203 (2001), doi:10.1103/PhysRevLett.87.037203.
13. Source-code index¶
Equation or claim |
Repository path |
Stable symbol |
Responsibility |
Lane/evidence |
|---|---|---|---|---|
explicit constructor and IR |
|
|
finite scalar and serialization |
Python contract |
material route |
|
|
scalar/field serialization |
Python contract |
FDM periodicity |
|
|
axes/policy validation |
Python contract |
IR explicit validation |
|
|
finite explicit value |
IR contract |
IR material validation |
|
|
finite material values |
IR contract |
FDM planner |
|
|
periodic gate and lowering |
FDM planning |
FEM planner |
|
|
material/explicit resolution |
FEM planning |
FDM CPU density |
|
|
centered curl density |
FDM CPU |
FDM CPU field |
|
|
negative-curl field |
FDM CPU |
FDM CPU SoA energy |
|
|
volume reduction |
FDM CPU |
FDM CUDA field |
|
|
FP64 bulk field |
FDM GPU |
FEM CPU realization |
|
|
quadrature/residual/projection/energy |
FEM CPU |
FEM weak residual |
|
|
residual algebra |
FEM CPU/GPU |
FEM projection |
|
|
residual-to-field |
FEM CPU/GPU |
FEM CUDA kernel |
|
|
residual/energy blocks |
FEM GPU |
FEM CUDA dispatch |
|
|
resident field dispatch |
FEM GPU |
FEM CUDA reduction |
|
|
final energy slot |
FEM GPU |
Control Room crosswalk¶
Use Model Explorer -> Objects -> <object> -> Physics when PhysicsInteractionPanel exposes the interaction. Status: partial. frontend support is not implemented applies to physical parameters without a matching control. See {doc}/frontend/capability-register; do not infer UI support from backend or Python availability.
Python/API crosswalk¶
The linked Python API page is authoritative for exact functions, arguments, units, and failure semantics. If this page is a foundation or category overview, runnable Python is ot applicable here and must be taken from the terminal API page.
Bibliography and source scope¶
Use the scientific bibliography and source-code index on the linked terminal page. This block adds no new equation or unverified implementation claim.
Source-code index¶
Public Python and lowering sources are linked by the applicable terminal API page. Runtime realization is in the relevant
backends/fdmorbackends/femlane; frontend ownership isapps/control-room/src/modules/inspector/panels/PhysicsInteractionPanel.tsxwhere a live control exists.