Download this example as Julia file or Jupyter notebook.

SW07 - k=0 kagome antiferromagnet

This is a Sunny port of SpinW Tutorial 7, originally authored by Bjorn Fak and Sandor Toth. It calculates the spin wave spectrum of the kagome lattice with antiferromagnetic interactions, with ordering wavevector of $𝐤 = 0$, and relative rotation 120° between sublattices

Load Sunny and the GLMakie plotting package

using Sunny, GLMakie

Define the chemical cell of a kagome lattice with spacegroup 147 (P-3).

units = Units(:meV, :angstrom)
latvecs = lattice_vectors(6, 6, 8, 90, 90, 120)
cryst = Crystal(latvecs, [[1/2, 0, 0]], 147)
view_crystal(cryst; ndims=2)
Example block output

Construct a spin system with nearest and next-nearest neighbor antiferromagnetic interactions. Energy minimization determines a $𝐤 = 0$ magnetic order with 120° rotation between the three sublattices. The overall global rotation in spin-space is arbitrary.

sys = System(cryst, [1 => Moment(s=1, g=2)], :dipole)
J1 = 1.0
J2 = 0.11
set_exchange!(sys, J1, Bond(2, 3, [0, 0, 0]))
set_exchange!(sys, J2, Bond(2, 1, [0, 0, 0]))
randomize_spins!(sys)
minimize_energy!(sys)
plot_spins(sys; ndims=2)
Example block output

Calculate and plot intensities for a path through $𝐪$-space.

swt = SpinWaveTheory(sys; measure=ssf_perp(sys))
qs = [[-1/2,0,0], [0,0,0], [1/2,1/2,0]]
path = q_space_path(cryst, qs, 400)
res = intensities_bands(swt, path)
plot_intensities(res; units)
Example block output

Calculate and plot the powder averaged spectrum

radii = range(0, 2.5, 200)
energies = range(0, 2.5, 200)
kernel = gaussian(fwhm=0.02)
res = powder_average(cryst, radii, 1000) do qs
    intensities(swt, qs; energies, kernel)
end
plot_intensities(res; units)
Example block output