# Auto-generated by Magesty `sce_to_sunny` (do not edit by hand;
# regenerate from the SCEModel instead).
#
# The SCE couplings are fit with unit spin directions, so they absorb
# the spin magnitude (J_SCE = J_phys·S²). The magnon dispersion needs
# the physical effective spin S_eff = m/(g μ_B); s = 1 inflates it by ~S.
# Spin scaling: :coupling — Sunny's Moment spin is the placeholder
# s₀ = 1; the physical S_eff is carried by the couplings
# (J = M/(s₀·√(S_i S_j)), single-ion 1/(s₀ S_i)). Mode :dipole_uncorrected.
# Only the magnon DISPERSION is physical; the static energy is rescaled
# and is NOT the SCE energy. Exact for a uniform S_eff.
# Energies are in the unit of the fit (typically eV). The reference
# energy j0 = -1029.54062415 and any spin-independent terms are
# dropped (Sunny has no constant energy term); the dispersion is unaffected.
# Cell route: primitive (chemical primitive cell; unfolded dispersion).

using Sunny

# ---- Crystal (chemical primitive cell) ----
# P1 is forced so the fitted couplings are placed exactly as given.
latvecs = [1.4149 -1.4149 -1.4149; -1.4149 -1.4149 -1.4149; -1.4149 1.4149 -1.4149]
positions = [
    [0, 0, 0],
]
types = ["Fe"]
cryst = Crystal(latvecs, positions, 1; types = types)

sys = System(cryst, [1 => Moment(s = 1, g = 2)], :dipole_uncorrected)

# ---- Bilinear exchange (per primitive bond; ê_i' J ê_j) ----
set_exchange!(sys, [-0.0369631558037 0 0; 0 -0.0369631558037 0; 0 0 -0.0369631558037], Bond(1, 1, [0, 0, 1]))
set_exchange!(sys, [0.00197427681808 0 0; 0 0.00197427681808 0; 0 0 0.00197427681808], Bond(1, 1, [0, 0, 2]))
set_exchange!(sys, [-0.0106433526944 0 0; 0 -0.0106433526944 0; 0 0 -0.0106433526944], Bond(1, 1, [0, 0, 3]))
set_exchange!(sys, [0.00198096112179 0 0; 0 0.00198096112179 0; 0 0 0.00198096112179], Bond(1, 1, [0, 0, 4]))
set_exchange!(sys, [0.00197559338338 0 0; 0 0.00197559338338 0; 0 0 0.00197559338338], Bond(1, 1, [0, 1, -3]))
set_exchange!(sys, [0.00241449549554 0 0; 0 0.00241449549554 0; 0 0 0.00241449549554], Bond(1, 1, [0, 1, -2]))
set_exchange!(sys, [-0.0208975901784 0 0; 0 -0.0208975901784 0; 0 0 -0.0208975901784], Bond(1, 1, [0, 1, -1]))
set_exchange!(sys, [-0.0369631558037 0 0; 0 -0.0369631558037 0; 0 0 -0.0369631558037], Bond(1, 1, [0, 1, 0]))
set_exchange!(sys, [-8.46179236952e-05 0 0; 0 -8.46179236952e-05 0; 0 0 -8.46179236952e-05], Bond(1, 1, [0, 1, 1]))
set_exchange!(sys, [-0.000104785520784 0 0; 0 -0.000104785520784 0; 0 0 -0.000104785520784], Bond(1, 1, [0, 1, 2]))
set_exchange!(sys, [0.000613683645166 0 0; 0 0.000613683645166 0; 0 0 0.000613683645166], Bond(1, 1, [0, 1, 3]))
set_exchange!(sys, [-0.000525912087212 0 0; 0 -0.000525912087212 0; 0 0 -0.000525912087212], Bond(1, 1, [0, 2, -2]))
set_exchange!(sys, [0.00241449549554 0 0; 0 0.00241449549554 0; 0 0 0.00241449549554], Bond(1, 1, [0, 2, -1]))
set_exchange!(sys, [0.00197427681808 0 0; 0 0.00197427681808 0; 0 0 0.00197427681808], Bond(1, 1, [0, 2, 0]))
set_exchange!(sys, [-0.000104785520784 0 0; 0 -0.000104785520784 0; 0 0 -0.000104785520784], Bond(1, 1, [0, 2, 1]))
set_exchange!(sys, [0.000237499197911 0 0; 0 0.000237499197911 0; 0 0 0.000237499197911], Bond(1, 1, [0, 2, 2]))
set_exchange!(sys, [0.00197559338338 0 0; 0 0.00197559338338 0; 0 0 0.00197559338338], Bond(1, 1, [0, 3, -1]))
set_exchange!(sys, [-0.0106433526944 0 0; 0 -0.0106433526944 0; 0 0 -0.0106433526944], Bond(1, 1, [0, 3, 0]))
set_exchange!(sys, [0.000613683645166 0 0; 0 0.000613683645166 0; 0 0 0.000613683645166], Bond(1, 1, [0, 3, 1]))
set_exchange!(sys, [0.00198096112179 0 0; 0 0.00198096112179 0; 0 0 0.00198096112179], Bond(1, 1, [0, 4, 0]))
set_exchange!(sys, [0.000613683645166 0 0; 0 0.000613683645166 0; 0 0 0.000613683645166], Bond(1, 1, [1, -3, 0]))
set_exchange!(sys, [0.00197559338338 0 0; 0 0.00197559338338 0; 0 0 0.00197559338338], Bond(1, 1, [1, -2, -1]))
set_exchange!(sys, [-0.000104785520784 0 0; 0 -0.000104785520784 0; 0 0 -0.000104785520784], Bond(1, 1, [1, -2, 0]))
set_exchange!(sys, [-0.00045972219785 0 0; 0 -0.00045972219785 0; 0 0 -0.00045972219785], Bond(1, 1, [1, -2, 1]))
set_exchange!(sys, [-0.00045972219785 0 0; 0 -0.00045972219785 0; 0 0 -0.00045972219785], Bond(1, 1, [1, -1, -2]))
set_exchange!(sys, [0.00241449549554 0 0; 0 0.00241449549554 0; 0 0 0.00241449549554], Bond(1, 1, [1, -1, -1]))
set_exchange!(sys, [-8.46179236952e-05 0 0; 0 -8.46179236952e-05 0; 0 0 -8.46179236952e-05], Bond(1, 1, [1, -1, 0]))
set_exchange!(sys, [0.00241449549554 0 0; 0 0.00241449549554 0; 0 0 0.00241449549554], Bond(1, 1, [1, -1, 1]))
set_exchange!(sys, [-0.00045972219785 0 0; 0 -0.00045972219785 0; 0 0 -0.00045972219785], Bond(1, 1, [1, -1, 2]))
set_exchange!(sys, [0.00197559338338 0 0; 0 0.00197559338338 0; 0 0 0.00197559338338], Bond(1, 1, [1, 0, -3]))
set_exchange!(sys, [0.00241449549554 0 0; 0 0.00241449549554 0; 0 0 0.00241449549554], Bond(1, 1, [1, 0, -2]))
set_exchange!(sys, [-0.0208975901784 0 0; 0 -0.0208975901784 0; 0 0 -0.0208975901784], Bond(1, 1, [1, 0, -1]))
set_exchange!(sys, [-0.0369631558037 0 0; 0 -0.0369631558037 0; 0 0 -0.0369631558037], Bond(1, 1, [1, 0, 0]))
set_exchange!(sys, [-8.46179236952e-05 0 0; 0 -8.46179236952e-05 0; 0 0 -8.46179236952e-05], Bond(1, 1, [1, 0, 1]))
set_exchange!(sys, [-0.000104785520784 0 0; 0 -0.000104785520784 0; 0 0 -0.000104785520784], Bond(1, 1, [1, 0, 2]))
set_exchange!(sys, [0.000613683645166 0 0; 0 0.000613683645166 0; 0 0 0.000613683645166], Bond(1, 1, [1, 0, 3]))
set_exchange!(sys, [0.000613683645166 0 0; 0 0.000613683645166 0; 0 0 0.000613683645166], Bond(1, 1, [1, 1, -4]))
set_exchange!(sys, [-0.000104785520784 0 0; 0 -0.000104785520784 0; 0 0 -0.000104785520784], Bond(1, 1, [1, 1, -3]))
set_exchange!(sys, [-8.46179236952e-05 0 0; 0 -8.46179236952e-05 0; 0 0 -8.46179236952e-05], Bond(1, 1, [1, 1, -2]))
set_exchange!(sys, [-0.0369631558037 0 0; 0 -0.0369631558037 0; 0 0 -0.0369631558037], Bond(1, 1, [1, 1, -1]))
set_exchange!(sys, [-0.0208975901784 0 0; 0 -0.0208975901784 0; 0 0 -0.0208975901784], Bond(1, 1, [1, 1, 0]))
set_exchange!(sys, [0.00241449549554 0 0; 0 0.00241449549554 0; 0 0 0.00241449549554], Bond(1, 1, [1, 1, 1]))
set_exchange!(sys, [0.00197559338338 0 0; 0 0.00197559338338 0; 0 0 0.00197559338338], Bond(1, 1, [1, 1, 2]))
set_exchange!(sys, [-0.00045972219785 0 0; 0 -0.00045972219785 0; 0 0 -0.00045972219785], Bond(1, 1, [1, 2, -3]))
set_exchange!(sys, [0.00241449549554 0 0; 0 0.00241449549554 0; 0 0 0.00241449549554], Bond(1, 1, [1, 2, -2]))
set_exchange!(sys, [-8.46179236952e-05 0 0; 0 -8.46179236952e-05 0; 0 0 -8.46179236952e-05], Bond(1, 1, [1, 2, -1]))
set_exchange!(sys, [0.00241449549554 0 0; 0 0.00241449549554 0; 0 0 0.00241449549554], Bond(1, 1, [1, 2, 0]))
set_exchange!(sys, [-0.00045972219785 0 0; 0 -0.00045972219785 0; 0 0 -0.00045972219785], Bond(1, 1, [1, 2, 1]))
set_exchange!(sys, [-0.00045972219785 0 0; 0 -0.00045972219785 0; 0 0 -0.00045972219785], Bond(1, 1, [1, 3, -2]))
set_exchange!(sys, [-0.000104785520784 0 0; 0 -0.000104785520784 0; 0 0 -0.000104785520784], Bond(1, 1, [1, 3, -1]))
set_exchange!(sys, [0.00197559338338 0 0; 0 0.00197559338338 0; 0 0 0.00197559338338], Bond(1, 1, [1, 3, 0]))
set_exchange!(sys, [0.000613683645166 0 0; 0 0.000613683645166 0; 0 0 0.000613683645166], Bond(1, 1, [1, 4, -1]))
set_exchange!(sys, [0.000237499197911 0 0; 0 0.000237499197911 0; 0 0 0.000237499197911], Bond(1, 1, [2, -2, 0]))
set_exchange!(sys, [-0.00045972219785 0 0; 0 -0.00045972219785 0; 0 0 -0.00045972219785], Bond(1, 1, [2, -1, -1]))
set_exchange!(sys, [-0.000104785520784 0 0; 0 -0.000104785520784 0; 0 0 -0.000104785520784], Bond(1, 1, [2, -1, 0]))
set_exchange!(sys, [0.00197559338338 0 0; 0 0.00197559338338 0; 0 0 0.00197559338338], Bond(1, 1, [2, -1, 1]))
set_exchange!(sys, [-0.000525912087212 0 0; 0 -0.000525912087212 0; 0 0 -0.000525912087212], Bond(1, 1, [2, 0, -2]))
set_exchange!(sys, [0.00241449549554 0 0; 0 0.00241449549554 0; 0 0 0.00241449549554], Bond(1, 1, [2, 0, -1]))
set_exchange!(sys, [0.00197427681808 0 0; 0 0.00197427681808 0; 0 0 0.00197427681808], Bond(1, 1, [2, 0, 0]))
set_exchange!(sys, [-0.000104785520784 0 0; 0 -0.000104785520784 0; 0 0 -0.000104785520784], Bond(1, 1, [2, 0, 1]))
set_exchange!(sys, [0.000237499197911 0 0; 0 0.000237499197911 0; 0 0 0.000237499197911], Bond(1, 1, [2, 0, 2]))
set_exchange!(sys, [-0.00045972219785 0 0; 0 -0.00045972219785 0; 0 0 -0.00045972219785], Bond(1, 1, [2, 1, -3]))
set_exchange!(sys, [0.00241449549554 0 0; 0 0.00241449549554 0; 0 0 0.00241449549554], Bond(1, 1, [2, 1, -2]))
set_exchange!(sys, [-8.46179236952e-05 0 0; 0 -8.46179236952e-05 0; 0 0 -8.46179236952e-05], Bond(1, 1, [2, 1, -1]))
set_exchange!(sys, [0.00241449549554 0 0; 0 0.00241449549554 0; 0 0 0.00241449549554], Bond(1, 1, [2, 1, 0]))
set_exchange!(sys, [-0.00045972219785 0 0; 0 -0.00045972219785 0; 0 0 -0.00045972219785], Bond(1, 1, [2, 1, 1]))
set_exchange!(sys, [0.000237499197911 0 0; 0 0.000237499197911 0; 0 0 0.000237499197911], Bond(1, 1, [2, 2, -4]))
set_exchange!(sys, [-0.000104785520784 0 0; 0 -0.000104785520784 0; 0 0 -0.000104785520784], Bond(1, 1, [2, 2, -3]))
set_exchange!(sys, [0.00197427681808 0 0; 0 0.00197427681808 0; 0 0 0.00197427681808], Bond(1, 1, [2, 2, -2]))
set_exchange!(sys, [0.00241449549554 0 0; 0 0.00241449549554 0; 0 0 0.00241449549554], Bond(1, 1, [2, 2, -1]))
set_exchange!(sys, [-0.000525912087212 0 0; 0 -0.000525912087212 0; 0 0 -0.000525912087212], Bond(1, 1, [2, 2, 0]))
set_exchange!(sys, [0.00197559338338 0 0; 0 0.00197559338338 0; 0 0 0.00197559338338], Bond(1, 1, [2, 3, -3]))
set_exchange!(sys, [-0.000104785520784 0 0; 0 -0.000104785520784 0; 0 0 -0.000104785520784], Bond(1, 1, [2, 3, -2]))
set_exchange!(sys, [-0.00045972219785 0 0; 0 -0.00045972219785 0; 0 0 -0.00045972219785], Bond(1, 1, [2, 3, -1]))
set_exchange!(sys, [0.000237499197911 0 0; 0 0.000237499197911 0; 0 0 0.000237499197911], Bond(1, 1, [2, 4, -2]))
set_exchange!(sys, [0.000613683645166 0 0; 0 0.000613683645166 0; 0 0 0.000613683645166], Bond(1, 1, [3, -1, 0]))
set_exchange!(sys, [0.00197559338338 0 0; 0 0.00197559338338 0; 0 0 0.00197559338338], Bond(1, 1, [3, 0, -1]))
set_exchange!(sys, [-0.0106433526944 0 0; 0 -0.0106433526944 0; 0 0 -0.0106433526944], Bond(1, 1, [3, 0, 0]))
set_exchange!(sys, [0.000613683645166 0 0; 0 0.000613683645166 0; 0 0 0.000613683645166], Bond(1, 1, [3, 0, 1]))
set_exchange!(sys, [-0.00045972219785 0 0; 0 -0.00045972219785 0; 0 0 -0.00045972219785], Bond(1, 1, [3, 1, -2]))
set_exchange!(sys, [-0.000104785520784 0 0; 0 -0.000104785520784 0; 0 0 -0.000104785520784], Bond(1, 1, [3, 1, -1]))
set_exchange!(sys, [0.00197559338338 0 0; 0 0.00197559338338 0; 0 0 0.00197559338338], Bond(1, 1, [3, 1, 0]))
set_exchange!(sys, [0.00197559338338 0 0; 0 0.00197559338338 0; 0 0 0.00197559338338], Bond(1, 1, [3, 2, -3]))
set_exchange!(sys, [-0.000104785520784 0 0; 0 -0.000104785520784 0; 0 0 -0.000104785520784], Bond(1, 1, [3, 2, -2]))
set_exchange!(sys, [-0.00045972219785 0 0; 0 -0.00045972219785 0; 0 0 -0.00045972219785], Bond(1, 1, [3, 2, -1]))
set_exchange!(sys, [0.000613683645166 0 0; 0 0.000613683645166 0; 0 0 0.000613683645166], Bond(1, 1, [3, 3, -4]))
set_exchange!(sys, [-0.0106433526944 0 0; 0 -0.0106433526944 0; 0 0 -0.0106433526944], Bond(1, 1, [3, 3, -3]))
set_exchange!(sys, [0.00197559338338 0 0; 0 0.00197559338338 0; 0 0 0.00197559338338], Bond(1, 1, [3, 3, -2]))
set_exchange!(sys, [0.000613683645166 0 0; 0 0.000613683645166 0; 0 0 0.000613683645166], Bond(1, 1, [3, 4, -3]))
set_exchange!(sys, [0.00198096112179 0 0; 0 0.00198096112179 0; 0 0 0.00198096112179], Bond(1, 1, [4, 0, 0]))
set_exchange!(sys, [0.000613683645166 0 0; 0 0.000613683645166 0; 0 0 0.000613683645166], Bond(1, 1, [4, 1, -1]))
set_exchange!(sys, [0.000237499197911 0 0; 0 0.000237499197911 0; 0 0 0.000237499197911], Bond(1, 1, [4, 2, -2]))
set_exchange!(sys, [0.000613683645166 0 0; 0 0.000613683645166 0; 0 0 0.000613683645166], Bond(1, 1, [4, 3, -3]))
set_exchange!(sys, [0.00198096112179 0 0; 0 0.00198096112179 0; 0 0 0.00198096112179], Bond(1, 1, [4, 4, -4]))

# ---- Magnetic structure (EDIT THIS BLOCK) ----
# Set up the magnetic unit cell for your ground state. For a ferromagnet
# (k = 0) nothing is needed. For a larger magnetic cell, reshape first, e.g.
#   sys = reshape_supercell(sys, [2 0 0; 0 2 0; 0 0 2])
randomize_spins!(sys)
minimize_energy!(sys)

# ---- Linear spin-wave dispersion ----
# Standard bcc high-symmetry path Γ–H–N–Γ–P–H, in reciprocal lattice units of
# this primitive `cryst`. The fractional values look unusual because `cryst` is
# the bcc *primitive* cell (not the conventional cubic cell); they map exactly to
# the canonical Cartesian points Γ=(0,0,0), H=(0,1,0), N=(½,½,0), P=(½,½,½) in
# units of 2π/a. To also draw the disconnected P–N leg, append `[0,-1/2,-1/2]`
# (N) with label "N".
qs = [[0, 0, 0],            # Γ
      [-1/2, -1/2, -1/2],   # H
      [0, -1/2, -1/2],      # N
      [0, 0, 0],            # Γ
      [-1/4, -1/4, -3/4],   # P
      [-1/2, -1/2, -1/2]]   # H
qlabels = ["Γ", "H", "N", "Γ", "P", "H"]
path = q_space_path(cryst, qs, 400; labels = qlabels)
swt = SpinWaveTheory(sys; measure = ssf_perp(sys))
disp = dispersion(swt, path)

# ---- Plot (requires a Makie backend) ----
# `disp` is a (bands × q) matrix; plot each band as its own line.
# `path.xticks` supplies the high-symmetry q-point positions and labels
# (e.g. "[0, 0, 0]"); vlines mark the interior path corners.
# Energy uses the fit's unit (typically eV); EDIT the label if not eV.
using GLMakie
fig = Figure()
ax = Axis(fig[1, 1]; xlabel = "Wavevector", ylabel = "Energy (eV)",
          xticks = path.xticks)
vlines!(ax, path.xticks[1][2:end-1]; color = :gray, linewidth = 0.75)
for b in axes(disp, 1); lines!(ax, disp[b, :]); end
fig

