Skip to content

Magnus Bloch Methods

Magnus methods are RF-excitation solvers that keep each time step as a rotation. They are useful when RF, gradients, or off-resonance change during a time step: you can either use a larger for speed, or keep the same and reduce time-discretization error.

KomaMRI provides three Magnus variants:

MethodField model inside one time stepPractical use
BlochMagnus1()piecewise constanthard-pulse approximation / baseline
BlochMagnus2()piecewise linear average fieldgood default for smooth RF excitation
BlochMagnus4()piecewise linear plus commutator correctionhigher accuracy at larger

Use them through sim_params["sim_method"]:

julia
sim_params = KomaMRICore.default_sim_params()
sim_params["sim_method"] = BlochMagnus2()
sim_params["Δt_rf"] = 8e-6
raw = simulate(obj, seq, sys; sim_params)

Accuracy And Step Size

The practical benefit is that higher-order Magnus methods can either improve RF excitation accuracy at the same , or reach similar accuracy with a larger .

The convergence behavior follows the expected order: first, second, and fourth order for BlochMagnus1(), BlochMagnus2(), and BlochMagnus4(). In Float64, the higher-order methods keep improving as becomes smaller until other errors dominate. In Float32, the error eventually reaches roundoff limits, so decreasing indefinitely is not always useful.

Effective Field Vector

Let be the effective field in the RF rotating frame, including RF frequency modulation. In angular-frequency units,

Here combines the transverse RF components and with the longitudinal frequency-offset term  .

For one excitation step from to , define   and  . The Magnus update is still a rotation:

where   is the cross-product matrix. By truncating the Magnus expansion and assuming the field is constant or linear during the step, KomaMRI uses the following rotation vectors:

The Magnus rotation vector produces a rotation around with angle :

The implementation computes directly. See effective_rotation_vector! for CPU and effective_rotation_vector for GPU kernels.