Download this example as Julia file or Jupyter notebook.

8. Momentum transfer conventions

This example illustrates Sunny's conventions for dynamical structure factor intensities, $\mathcal{S}(𝐪,ω)$, as documented in the page Structure Factor Conventions. The variables $𝐪$ and $ω$ describe momentum and energy transfer to the sample.

For systems without inversion-symmetry, the structure factor intensities at $± 𝐪$ may be inequivalent. To highlight this, consider a simple 1D chain that includes only Dzyaloshinskii–Moriya interactions between neighboring sites. Coupling to an external field then breaks time-reversal symmetry, giving rise to an inequivalence of intensities $\mathcal{S}(±𝐪,ω)$

using Sunny, GLMakie

Selecting the P1 spacegroup will effectively disable all symmetry analysis. This can be a convenient way to avoid symmetry-imposed constraints on the couplings. A disadvantage is that all bonds are treated as inequivalent, and Sunny will therefore not be able to propagate any couplings between bonds.

latvecs = lattice_vectors(2, 2, 1, 90, 90, 90)
cryst = Crystal(latvecs, [[0,0,0]], "P1")
Crystal
Spacegroup 'P 1' (1)
Lattice params a=2, b=2, c=1, α=90°, β=90°, γ=90°
Cell volume 4
Wyckoff 1a (site sym. '1'):
   1. [0, 0, 0]

Construct a 1D chain system that extends along the global Cartesian $ẑ$ axis. The Hamiltonian includes DM and Zeeman coupling terms, $ℋ = ∑_j D ẑ ⋅ (𝐒_j × 𝐒_{j+1}) - ∑_j 𝐁 ⋅ μ_j$, where $μ_j = - g 𝐒_j$ is the magnetic_moment and $𝐁 ∝ ẑ$.

sys = System(cryst, [1 => Moment(s=1, g=2)], :dipole; dims=(1, 1, 25))
D = 0.1
B = 5D
set_exchange!(sys, dmvec([0, 0, D]), Bond(1, 1, [0, 0, 1]))
set_field!(sys, [0, 0, B])

The large external field fully polarizes the system. Here, the DM coupling contributes nothing, leaving only Zeeman coupling.

randomize_spins!(sys)
minimize_energy!(sys)
@assert energy_per_site(sys) ≈ -10D

Sample from the classical Boltzmann distribution at a low temperature.

dt = 0.1
kT = 0.02
damping = 0.1
langevin = Langevin(dt; kT, damping)
suggest_timestep(sys, langevin; tol=1e-2)
for _ in 1:10_000
    step!(sys, langevin)
end
Consider dt ≈ 0.0995 for this spin configuration at tol = 0.01. Current value is dt = 0.1.

The Zeeman coupling polarizes the magnetic moments in the $𝐁 ∝ ẑ$ direction. The spin dipoles, however, are anti-aligned with the magnetic moments, and therefore point towards $-ẑ$. This is shown below.

plot_spins(sys)
Example block output

Estimate the dynamical structure factor using classical dynamics.

sc = SampledCorrelations(sys; dt, energies=range(0, 15D, 100), measure=ssf_trace(sys))
add_sample!(sc, sys)
nsamples = 100
for _ in 1:nsamples
    for _ in 1:1_000
        step!(sys, langevin)
    end
    add_sample!(sc, sys)
end
path = q_space_path(cryst, [[0,0,-1/2], [0,0,+1/2]], 400)
res1 = intensities(sc, path; energies=:available, kT)
Sunny.Intensities{Float64, Sunny.QPath, 2} (100×400 elements)

Calculate the same quantity with linear spin wave theory at $T = 0$. Because the ground state is fully polarized, the required magnetic cell is a $1×1×1$ grid of chemical unit cells.

sys_small = resize_supercell(sys, (1,1,1))
minimize_energy!(sys_small)
swt = SpinWaveTheory(sys_small; measure=ssf_trace(sys_small))
res2 = intensities_bands(swt, path)
Sunny.BandIntensities{Float64, Sunny.QPath, 2} (1×400 elements)

This model system has a single magnon band with dispersion $ϵ(𝐪) = 1 - D/B \sin(2πq₃)$ and uniform intensity. Both calculation methods reproduce this analytical solution. Observe that $𝐪$ and $-𝐪$ are inequivalent. The structure factor calculated from classical dynamics additionally shows an elastic peak at $𝐪 = [0,0,0]$, reflecting the ferromagnetic ground state.

fig = Figure(size=(768, 300))
plot_intensities!(fig[1, 1], res1; title="Classical dynamics")
plot_intensities!(fig[1, 2], res2; title="Spin wave theory")
fig
Example block output