SIESTA spinors
Non-collinear (nspin=4, spinor) SIESTA supercell runs unfold through
the same machinery as the collinear example — the parse → relabel →
weight chain on the doubled basis (each PAO times two spin
components). Here: the 8-atom conventional-cubic Si supercell run
non-collinear, unfolded onto the 2-atom primitive fcc cell. The scalar
Si pseudopotential has no SOC channels, so the spinor bands equal the
scalar bands with Kramers degeneracy — a clean end-to-end seal of the
spinor machinery, not spinor physics.
The bundle
Download siesta-spinor.tar.gz and unpack it:
tar xf siesta-spinor.tar.gz && cd siesta-spinor
Shipped: the non-collinear fixtures (data/si_sc_pso.fdf +
si_sc_pso.HSX supercell, data/si_prim_pso.fdf +
si_prim_pso.HSX primitive, POSCAR copy in
data/si_prim_pso.vasp), unfold.toml, and reproduce.py.
Prerequisites: pip install unfolding plus pip install HamiltonIO sisl. No SIESTA run is needed.
Structure and k-path
| primitive cell | 2-atom fcc Si, a = 5.430 Å |
| supercell | 8-atom conventional cubic cell, M = [[-1,1,1],[1,-1,1],[1,1,-1]] |
| orbitals | 8 spinor orbitals per atom (4 PAO × 2 spin components); derived automatically from the parsed model |
| k-path | Γ-X-W-Γ-L-W-X, 300 points |
Run parameters and shared options (mode, spin, method, resolve_degenerate, supercell-matrix row convention, k-path coordinates and frames, energy-reference conventions) are explained together in the method, parameters, and k-path guide.
Primitive cell input: required for the siesta route — it supplies the relabel map and the default path cell.
Configuration
# SIESTA spinors: non-collinear (nspin=4) Si8 supercell -> primitive fcc cell.
# Run from the unpacked bundle root: unfolding --config unfold.toml
# or with explicit flags:
# unfolding siesta --fdf data/si_sc_pso.fdf --primitive data/si_prim_pso.vasp \
# --unfold-mat -1 1 1 1 -1 1 1 1 -1 --special-points GXWGLX \
# --npts 300 --method ideal --output si_spinor_unfolded_cli.png
#
# The spinor orbital counts (8 per atom = 4 PAO x 2 spin components) are
# derived automatically from the parsed model; the same weight pipeline
# as the collinear route applies to the doubled basis.
route = "siesta"
[input]
fdf = "data/si_sc_pso.fdf" # non-collinear supercell run (si_sc_pso.HSX)
[structure]
primitive = "data/si_prim_pso.vasp"
supercell_matrix = [[-1, 1, 1], [1, -1, 1], [1, 1, -1]] # conventional = M @ primitive
[path]
special_points = "GXWGLX"
npts = 300
[options]
method = "ideal"
[output]
output = "si_spinor_unfolded_cli.png"Run it
From the unpacked bundle directory, one command with the shipped config:
unfolding --config unfold.toml # -> si_spinor_unfolded_cli.png
The same TOML can be passed as the only Python input:
from unfolding import load_config, run
run(load_config("unfold.toml"))or with explicit flags:
unfolding siesta --fdf data/si_sc_pso.fdf --primitive data/si_prim_pso.vasp \
--unfold-mat -1 1 1 1 -1 1 1 1 -1 --special-points GXWGLX \
--npts 300 --method ideal --output si_spinor_unfolded_cli.png
or through the Python API with explicit parameters:
import numpy as np
from ase.io import read
from unfolding import unfold_siesta
ax = unfold_siesta(
fdf="data/si_sc_pso.fdf", # non-collinear run; reads si_sc_pso.HSX
prim_atoms=read("data/si_prim_pso.vasp"),
unfold_sc_mat=np.array([[-1, 1, 1], [1, -1, 1], [1, 1, -1]]),
kpts=kpts, knames=knames, xqpts=x, Xqpts=X,
method="ideal",
)Nothing spinor-specific needs passing: the doubled orbital counts are read from the parsed model, and the same weight pipeline applies to the 64-orbital supercell basis. The published figure adds the primitive spinor-cell overlay:
python reproduce.py # -> si_spinor_unfolded.png

The fixtures
The same 8-atom Si setup as the collinear example run non-collinear
(SpinPolarized true + Spin.Orbit true, nspin=4) with a scalar Si
pseudopotential, so spin-orbit coupling is off. Sanity check for your
own spinor runs: every spinor band pair should be Kramers-degenerate
when SOC is off, and the weight sums over exactly-degenerate groups
should be integers. Spinor eigenvalues are Fermi-shifted by the writing
run, as usual in SIESTA.