Download this example as Julia file or Jupyter notebook.

SW06 - Complex kagome ferromagnet

This is a Sunny port of SpinW Tutorial 6, originally authored by Bjorn Fak and Sandor Toth. It calculates the spin wave spectrum of the kagome lattice with multiple competing interactions.

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 strongly ferromagnetic nearest-neighbor interactions, and two additional interactions. There are two symmetry-inequivalent exchange types at distance 6 Å (3rd nearest neighbor). The first type, associated with J3a, is a bond from atom 2 to atom 2 that passes over atom 3. The second type, associated with J3b, is a bond from atom 1 to atom 1 that passes through the center of an "empty" hexagon of the kagome lattice.

sys = System(cryst, [1 => Moment(s=1, g=2)], :dipole)
J1 = -1.0
J2 = 0.1
J3a = 0.00
J3b = 0.17
set_exchange!(sys, J1, Bond(2, 3, [0, 0, 0]))
set_exchange!(sys, J2, Bond(2, 1, [0, 0, 0]))
set_exchange!(sys, J3a, Bond(2, 2, [1, 0, 0]))
set_exchange!(sys, J3b, Bond(1, 1, [1, 0, 0]))

Interactively visualize the specified interactions. Red (blue) color indicates FM (AFM).

view_crystal(sys; ndims=2)
Example block output

Energy minimization favors ferromagnetic order.

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. Select an empirical colorrange that brings the lower-intensity features into focus.

radii = range(0, 2.5, 200)
energies = range(0, 6.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, colorrange=(0,10))
Example block output