Vogl-Hjalmarson-Dow Tight-Binding (material-specific parameters)¶
Same Slater-Koster sp3 machinery as harrison_tb, plus one addition
-- an extra s* orbital per atom, a pure fitting degree of freedom with no physical
meaning of its own, whose only job is pulling the lowest conduction band down to the
right energy. harrison_tb's universal table structurally cannot do that (see its own
Accuracy section); this module trades the "one table fits everything" convenience for
a parameter row fitted per material, and gets real accuracy back in return.
Step 1. The gap at Gamma¶
VHD_MATERIALS['Si'] is silicon's real fitted parameter row (Vogl, Hjalmarson & Dow
1983). direct_gap_at_gamma(material) reads the gap at the Gamma point (k=(0,0,0))
-- 3.43 eV, matching real silicon's actual direct gap almost exactly. That number
alone would be misleading, though: silicon's fundamental gap -- the one that actually
sets its optical/electronic behavior -- is not this one.
Step 2. Why Gamma alone isn't enough¶
vbm, vbm_k, cbm, cbm_k, gap = de.band_extrema_along_path(
Si, k_start=(0, 0, 0), k_end=(1, 0, 0)
)
cbm_k, gap
band_extrema_along_path(material, k_start, k_end) scans a k-space line (here Gamma to
X, in units of 2*pi/a) and finds the real valence-band maximum and conduction-band
minimum -- which don't have to sit at the same k-point at all. For silicon, they don't:
the conduction-band minimum lands at k=0.732 along Gamma-X, not at Gamma, and the true
gap between it and the valence-band maximum is 1.17 eV -- close to real silicon's
well-known experimental indirect gap (1.12 eV), and nothing like Step 1's 3.43 eV
Gamma-only number. This is exactly what makes silicon an indirect-gap material, and
exactly the failure mode harrison_tb's simpler universal model can't resolve on its
own.
Details¶
16 materials included: C, Si, Ge, Sn, SiC, AlP, AlAs, AlSb, GaP, GaAs, GaSb, InP,
InAs, InSb, ZnSe, ZnTe -- all zinc-blende/diamond semiconductors, each with its own
fitted VHD_MATERIALS row (Esa/Epa/Esc/Epc/Essa/Essc on-site energies plus
7 hopping integrals), not derived from a universal formula the way harrison_tb's
ETA table is.
sp3s_star_hamiltonian(kxyz, material): the lower-level Bloch Hamiltonian builder
both direct_gap_at_gamma and band_extrema_along_path call internally -- a 10x10
matrix per unit cell (5 orbitals/atom, including s*), not the 8x8 harrison_tb
builds. k is in units of 2*pi/a along the conventional cubic axes: Gamma=(0,0,0),
X=(1,0,0), L=(0.5,0.5,0.5).
Source: P. Vogl, H. P. Hjalmarson, J. D. Dow, "A Semi-empirical tight-binding
theory of the electronic structure of semiconductors," J. Phys. Chem. Solids 44 (5),
365-378 (1983). Parameter values transcribed from an independent open-source
implementation, github.com/rpmuller/TightBinding
(TB.py), which cites the same paper.
Accuracy: validated against real experimental gaps (GaAs, Si, Ge) -- see the Dense-Evolution-Discovery validation page for the full writeup and numbers.
vhd_tb ¶
Vogl-Hjalmarson-Dow (1983) material-specific sp3s* tight-binding parameters -- a more accurate alternative to harrison_tb's universal (materials-independent) parameters, at the cost of needing a separately fitted parameter set per material.
Source: P. Vogl, H. P. Hjalmarson, J. D. Dow, "A Semi-empirical
tight-binding theory of the electronic structure of semiconductors",
J. Phys. Chem. Solids 44 (5), 365-378 (1983). Parameter values below are
transcribed from an independent open-source implementation of the same
table, github.com/rpmuller/TightBinding (TB.py, fetched 2026-08-05),
which cites the same paper; not reproduced from the paper itself (not
open access). Only materials appearing in that source are included.
sp3s basis: s, px, py, pz, and an extra excited s orbital per atom (5 orbitals/atom, 10x10 Hamiltonian per zinc-blende/diamond 2-atom cell) -- the s* orbital exists purely to push the lowest conduction band down to the right energy without needing d-orbitals; it has no literal physical excited state behind it.
Hermiticity note: the reference implementation's own H-builder forms
the lower-left (cation-anion) block as Hac.conjugate() without
transposing it, which does not in general produce a Hermitian matrix
(the block mixes Vsapc/Vscpa asymmetrically). _cation_anion_block
below is built the same way as that source's get_Hac, but assembled
into the full Hamiltonian with a proper conjugate transpose
(.conj().T) -- verified Hermitian for every material in MATERIALS
(see the module's own smoke test).
Validated against experiment (run 2026-08-05): GaAs direct gap at Gamma (k=0) computes to 1.55 eV vs. the experimental 1.42 eV (~9% high) -- compare to harrison_tb.zincblende_hamiltonian's 2.91 eV (~105% high) for the same material using Harrison's universal parameters. The improvement is expected: these parameters are fitted per material specifically to reproduce band-edge energies, unlike Harrison's one-table-fits-all approach.
sp3s_star_hamiltonian ¶
10x10 sp3s Bloch Hamiltonian, basis order [anion: s,px,py,pz,s, cation: s,px,py,pz,s*].
material: a Material namedtuple, or a key into MATERIALS. kxyz: crystal momentum in units of 2*pi/a along the conventional cubic axes (Gamma=(0,0,0), X=(1,0,0), L=(0.5,0.5,0.5)).
Source code in dense_evolution/solvers/vhd_tb.py
direct_gap_at_gamma ¶
Conduction-band-minimum minus valence-band-maximum at k=Gamma, for the 8 valence electrons (4 lowest of the 8 sp3-derived bands filled; the 2 s bands are always empty conduction states in this model). Only meaningful as the* fundamental gap for direct-gap materials (e.g. GaAs) -- for indirect-gap materials (e.g. Si) this is the Gamma-Gamma transition, not the true (lower) indirect gap, which occurs off Gamma and this function does not compute.
Source code in dense_evolution/solvers/vhd_tb.py
band_extrema_along_path ¶
Scans the valence-band maximum and conduction-band minimum (bands 3 and 4 of the 10, 0-indexed, sorted) along the straight line from k_start to k_end (both in the same 2*pi/a cubic-axis units as sp3s_star_hamiltonian), and returns (vbm, vbm_k, cbm, cbm_k, gap) where vbm_k/cbm_k are the k-points (same units) where each extremum was found.
Needed for indirect-gap materials (e.g. Si, Ge): the true fundamental gap is not at Gamma, so direct_gap_at_gamma alone gives the wrong (too-large) number for them. Example: Si's conduction band minimum sits off-Gamma along Gamma->X (the Delta line), not at Gamma itself.
Source code in dense_evolution/solvers/vhd_tb.py
See also: harrison_tb for the zero-per-material-fitting
universal alternative, when the ~2-3x gap error is an acceptable tradeoff for not
needing a fitted parameter row per material.