XYZ thermodynamic spinons and bound branches¶
bethe-xyz-dispersion supplies infinite-chain excitation energies for the
same XYZ Hamiltonian as bethe-xyz-pbc.
It does not enumerate finite-ring eigenstates. All arithmetic and exports use
the selected fp64, native long-double, optional fp128 or explicit MPFR precision.
Use --precision bits-256 or --precision digits-100 when MPFR is configured;
MPLAPACK kernels are not required for these excitation bands.
For a worked comparison of bands, bound branches and their momentum copies, see the XYZ tutorial.
Hamiltonian and scope¶
The family has \(J_x\gt J_y\gt |J_z|\) at finite interior parameters; \(J_z\) changes sign at \(\eta=1/2\). The field and temperature are zero. There are two symmetry-breaking x-Néel vacua. A single spinon connects different asymptotic vacua; a local excitation of a fixed vacuum is not a single spinon. The two domain-wall orientations share the displayed dispersion. Generic XYZ has no conserved total Sz.
The elementary and bound curves are based on Johnson–Krinsky–McCoy (JKM), Sec. VII. Energies, not spectral weights, are implemented. Arbitrary exchange inversion, other coupling regions, finite fields, scattering amplitudes and form factors remain outside this interface.
Use and output¶
bethe-xyz-dispersion --eta 0.4 --t 1 --csv spinons.csv
bethe-xyz-dispersion --eta 0.75 --t 1 --branch bound --json bound.json
bethe-xyz-dispersion --eta 0.875 --t 0.75 --bound-state 2 --precision long-double
bethe-xyz-dispersion --eta 0.75 --t 1 --branch bound --momentum 0
bethe-xyz-dispersion --references
--branch selects spinon, two-spinon, bound, or all (default).
Every strictly existing bound index is included unless --bound-state S
selects one. Exactly at a merger the new index is not included.
A bound-only request in a region with no bound branch is an input error.
The enumeration limit is 4096 indices, and total output is capped at one
million rows; select an individual index or fewer points for larger requests.
These are output-resource limits, not a truncation disguised as completeness.
The single dispersion table supports the common output options,
including simultaneous screen, CSV, TSV and JSON sinks, streaming and disabled
retention. It contains:
branch, optional bound indexs, and relativedelta_rx,delta_rzparities;p,p_over_pi,cell_momentum, and the bound curve'sreduced_q;energyfor lines, orlower/upperfor the two-spinon envelope;status, with missing rather than invented numerical values on failure.
--points defaults to 65 per branch/parity copy; --momentum selects one
physical momentum instead. Spinons use \(0\le p\le\pi\) and other rows use
\(0\le p\le2\pi\). When spinons are selected, a shared --momentum must lie
in their smaller interval. Momentum units are radians per site, not units of pi.
Endpoint-inclusive grids repeat periodic endpoints deliberately.
Metadata records the theta parameters, dimensionless couplings, overall J,
spinon gap/band maximum, conventions, precision, provenance and CPU time.
All excitation energies include J. Numerical range failures exit 2, retain
labels and export JSON null or empty CSV/TSV energy cells. Invalid input exits
1 before opening output files, including with --force.
Convention audit and elementary band¶
Here is our explicit conversion to JKM's Hamiltonian \(H=-\frac12\sum_a\mathcal J_a\sigma^a\sigma^a\):
The axis permutation is global, so it does not change translation momentum. Using the Jacobi/theta identities, our own coupling ratios give \(J_z/J_x=\mathrm{cn}(2K\eta,l)\) and \(J_y/J_x=\mathrm{dn}(2K\eta,l)\). Thus JKM's \(\mu=\pi\eta\), \(\lambda=\pi\eta/t\), and \(\tau=\pi/t\). Their tau is not our imaginary theta period.
Introduce the excitation nome parameter \(t_1=\eta/t\). In our normalization, the maximum I and mass m become
The prime differentiates our normalized u, not pi*u. This follows by substituting the coupling map into JKM (7.8) and applying Jacobi's derivative identity. The implementation evaluates the small mass directly, never by subtracting a rounded elliptic modulus from one. Modular transformation and scaled theta functions preserve exponentially small gaps. A gap below the normal range of the selected scalar is rejected rather than silently set to zero.
Two-spinon rows use the shared band kinematics and take the envelope of both pi-shifted translation copies. This is an all-sector envelope, not a symmetry-resolved threshold or spectral support for any particular operator. A two-site MPS comparison uses \(k_{\rm cell}=2p\pmod{2\pi}\).
Bound curves and symmetry labels¶
For positive integer s the strict condition is
For example, eta=0.75 has s=1,2, with s=3 at its excluded merger. Let \(K_1'/K_1=\eta/t\), \(r=m/I=k_1'\), and define
Within a fixed asymptotic vacuum the excitation gap is 2m in the region without bound branches, and \(E_1(0)\) when the first bound branch exists. This excludes the vanishing finite-ring splitting between the two ground-state combinations; it is distinct from the reported single-spinon gap m.
We fix the positive energy prefactor directly from JKM (7.11a), and verify the eliminated expression against the complex-rapidity parametrization in the independent reference script below. The two square roots are important: replacing m in the spinon curve with a bound-state mass gives the wrong lattice dispersion. At a merger \(a_s\to1\), the curve tends to \(2\epsilon(Q/2)\), not necessarily the lowest continuum edge at that Q. A bound curve can run above scattering states at other momenta or in other channels; “bound” does not promise a line below the all-sector envelope everywhere.
For even rings define \(R_a=\prod_j\sigma_j^a\). The library and table use ratios to the chosen reference vacuum's parity, not absolute ring labels:
This is the axis-mapped version of JKM's \(\Delta\nu'=s\bmod2\) and \(\Delta P=\Delta Q+\pi\Delta\nu''\). Both z-parity copies are output; their reduced dispersions coincide but their physical momenta differ by pi. The two-site translation phases therefore coincide. Single-spinon rows leave global ring parities empty: their two ends belong to different vacua. We do not infer a finite-size degeneracy or state count from these curves.
Library and validation¶
bethe::xyz::SpinonDispersion<Real>(eta,t,J=1) provides gap(),
maximum_energy(), energy(p), continuum(q,convention), bound_exists(s),
bound_x_parity(s), bound_gap(s), and bound_energy(s,Q).
For a whole curve, call prepare_bound(s) once and use the returned owning
BoundBranch's energy(Q), gap(), index() and x_parity(). Preparation
evaluates the theta-function coefficient; queries then use only elementary
functions. The branch remains valid after the parent dispersion is destroyed.
The frontend reuses each prepared branch across both z-parity copies, retaining
per-row failure reporting when only some energies exceed the scalar range.
Unlike the frontend envelope, the library continuum defaults to a fixed sum
of two spinon momenta; request SpinonMomentum::folded for the union.
The bound library method takes reduced Q, while the frontend's
--momentum takes physical p. Domain mistakes throw invalid_argument;
numerical failures throw a runtime_error subtype.
Immutable branches also fit the existing Async preparation/reader interface:
#include <bethe/prepared_observable_grid.hpp>
#include <bethe/xyz_dispersion.hpp>
#include <uni20/async/tbb_scheduler.hpp>
using Band = bethe::xyz::SpinonDispersion<double>;
uni20::async::TbbScheduler scheduler(4);
bethe::ExecutionOptions execution{.scheduler = &scheduler, .max_in_flight = 8};
auto background = bethe::prepare_background_async(
[] { return Band(0.75, 1.0).prepare_bound(1); }, execution);
std::vector<double> energies;
auto curve = bethe::evaluate_observable_grid_async(
background.read(), 65,
[](Band::BoundBranch const& branch, std::size_t i) {
return branch.energy(2 * uni20::pi<double> * double(i) / 64);
},
[&energies](std::size_t, double e) { energies.push_back(e); }, execution);
curve.get_wait(scheduler); // final completion, including its preparation
Several curves may share that preparation, or a parameter sweep can prepare
one branch and evaluate a whole curve within each independent task. The latter
amortizes scheduling costs after the expensive theta evaluations are removed
from individual queries. The single-parameter CLI stays serial. See the
reuse and sweep measurements.
Native/long-double/binary128 and explicit MPFR use the same owning API. For
MPFR, construct eta and t at the same finite precision; the optional exchange
may be exact (including the default one), or have that same precision. Momentum
queries must match the prepared band/branch. Mixed, exact or unset query values
are rejected; no ambient MPFR precision is changed. Each result retains its
working precision, including zeros, gaps and continuum endpoints.
Uni20 supplies scaled complex theta values and derivatives. Its reduction and
series controls are separate from physical accuracy; reconstructing a very small
gap amplifies absolute error in a rounded logarithmic scale. More arithmetic
bits resolve that error but do not change branch existence or model conventions.
The finite-chain xyz-pbc solver has a separate precision boundary.
Independent JKM Jacobi-function references at 110/140 decimal digits agree beyond 105 digits. The MPFR tests measure precision growth at 80/160/256/333 bits, including couplings, gaps and multiple bound branches. Mixed-precision Debug/TBB readers share owning preparations and isolate failed queries. CLI checks cover non-dyadic grids, every exported field, tiny momenta, strict mergers and all three file formats. Cheap per-momentum formulas remain serial in the CLI.
The independent oracle can be rerun with mpmath (not a build dependency):
python3 scripts/reference_xyz_dispersion.py --eta 0.75 --t 1 --digits 65
Checks include native-precision references, strict merger conditions, exchange scaling, tiny masses, explicit underflow, and these independent limits:
- XY at eta=1/2: \(I=(J_x+J_y)J/2\), \(m=(J_x-J_y)J/2\).
- Gapless XXZ as t grows: \(I\to J\sin(\pi\eta)/(2\eta)\).
- Massive AF XXZ as t decreases with \(\eta=t\lambda/\pi\), after axis permutation and rescaling by Jy: \(\Delta=\cosh\lambda\).
- Ferromagnetic XXZ with \(\eta=1-t\lambda/\pi\): after the corresponding staggered rotation and rescaling, the s-magnon curve is \(\sinh\lambda[\cosh(s\lambda)-\cos Q]/\sinh(s\lambda)\).
Literal spin-Hamiltonian diagonalization on N=6,8,10 checks the first bound branch and both momentum/parity copies at eta=0.75,t=1. Their gaps approach the thermodynamic 0.24378676516 from opposite sides; at N=10 they are 0.23078578101 and 0.25686154761. The finite-size splitting is real, not a solver tolerance. This tests normalization and momentum assignment without claiming that a thermodynamic formula equals a small-ring eigenvalue.