Download this example as Julia file or Jupyter notebook.

SW11 - La₂CuO₄

This is a Sunny port of SpinW Tutorial 11, originally authored by Sandor Toth. It calculates the spin wave spectrum of La₂CuO₄.

Load packages

using Sunny, GLMakie

Build a square lattice for the the Cu²⁺ atoms. The lattice constant 1 Å is selected arbitrarily.

units = Units(:meV, :angstrom)
latvecs = lattice_vectors(1, 1, 10, 90, 90, 90)
positions = [[0, 0, 0]]
types = ["Cu"]
cryst = Crystal(latvecs, positions, 139; types)
view_crystal(cryst; ndims=2)
Example block output

Build a spin system using the exchange parameters from R. Coldea, Phys. Rev. Lett. 86, 5377 (2001).

sys = System(cryst, [1 => Moment(s=1/2, g=2)], :dipole; dims=(2, 2, 1))
J   = 138.3
Jp  = 2
Jpp = 2
Jc  = 38
set_exchange!(sys, J-Jc/2, Bond(1, 1, [1, 0, 0]))
set_exchange!(sys, Jp-Jc/4, Bond(1, 1, [1, 1, 0]))
set_exchange!(sys, Jpp, Bond(1, 1, [2, 0, 0]))

Energy minimization yields the expected Néel order

randomize_spins!(sys)
minimize_energy!(sys)
plot_spins(sys; ndims=2)
Example block output

Plot the spin wave spectrum for a path through $𝐪$-space. Apply a manual "quantum correction" that adjusts energy scale by the factor 1.18.

qs = [[3/4,1/4,0], [1/2, 1/2, 0], [1/2, 0, 0], [3/4, 1/4, 0], [1,0,0], [1/2 0 0]]
labels = ["P", "M", "X", "P", "Γ", "X"]
path = q_space_path(cryst, qs, 400; labels)
energies = range(0, 320, 400)
swt = SpinWaveTheory(sys; measure=ssf_perp(sys))
res = intensities(swt, path; energies, kernel=gaussian(fwhm=35))
res.energies .*= 1.18
plot_intensities(res; units)
Example block output

Plot instantaneous itensities, integrated over ω.

res = intensities_static(swt, path)
plot_intensities(res; colorrange=(0,20), units)
Example block output