ALIGNN is gone. Seebeck now comes from BoltzTraP2 on spin-orbit DFT bands, both half-Heusler controls pass, and a full ZT run takes about 10 minutes.
A month ago
Version 2.0.0 is live. Both controls now pass on the production service, and a full ZT run finishes in about 10 minutes.
Predict ZT_max and thermoelectric properties for inorganic crystal structures using first-principles methods: phono3py BTE for lattice thermal conductivity, BoltzTraP2 for electronic transport from ABACUS PBE±SOC bands under a constant relaxation time.
Seebeck at 300 K and 10²⁰ cm⁻³ from BoltzTraP2 on PBE+SOC bands, at the default screening quality:
S_n (µV/K) | S_p (µV/K) | PBE+SOC gap (eV) | Runtime | |
|---|---|---|---|---|
TiNiSn | −208 | +265 | 0.52 | 9.5 min |
Both sit where they should. Doped TiNiSn measures in the −150 to −250 µV/K range at these concentrations, TiCoSb has the larger gap and the larger Seebeck, and the gaps match published PBE values. These are live runs on the production route:
Run the full workflow on a crystal structure: relaxation, phonons, lattice thermal conductivity, DFT band gap, BoltzTraP2 Seebeck at fixed doping, and ZT_max(T). Use quality=screening (default) for triage and quality=converged for final numbers.
Run the full workflow on a crystal structure: relaxation, phonons, lattice thermal conductivity, DFT band gap, BoltzTraP2 Seebeck at fixed doping, and ZT_max(T). Use quality=screening (default) for triage and quality=converged for final numbers.
Three separate problems stacked on top of each other.
1. The band parser fed BoltzTraP2 garbage. ABACUS writes band energies to BANDS_1.dat as k-index, path distance, e1 … eN. Our parser read the first columns as k-point coordinates, so BoltzTraP2 was fitting correct energies at the wrong k-points. The result was a smeared, nearly metallic band structure and a Seebeck near zero whatever the material. The parser now reads the real fractional k-coordinates from OUT.ABACUS/kpoints and refuses to run if the counts disagree.
2. The reported Seebeck came from ALIGNN. The headline S values came from a graph neural network trained on DFT transport data rather than from the band structure we had just computed. It was fast, but it was not decision-useful for absolute values, and it went down for weeks. ALIGNN is now gone from the pipeline entirely. The Seebeck you get is computed from the material's own DFT bands.
3. The control CIFs described the wrong crystal. Both control files placed the transition metal and the main-group atom on the two tetrahedral sites (4c and 4d), leaving 4b empty. In real C1b half-Heuslers, Ti and Sn/Sb form a rock-salt lattice on 4a and 4b, and Ni/Co fills one set of tetrahedral holes. In the correct structure each Ni sits in a cube of 4 Ti and 4 Sn. In the control files it had only 4 Ti neighbours. That misordered structure sits 2.1 eV per formula unit higher in energy, and the pipeline's verdict on it is physically correct: 1,497 imaginary phonon modes, a 0 eV gap, and S ≈ 13 µV/K. Corrected CIFs are linked at the bottom.
The third one is a useful lesson in itself. When the output shows imaginary modes and no gap for something you expected to be a semiconductor, check the structure before blaming the model.
Primitive cell. Inputs are standardised to the primitive cell, so TiNiSn is 3 atoms, not 12. Everything downstream gets cheaper.
Relaxation, phonons, Grüneisen, κ_lat. NequIP-OAM-XL forces drive phonopy and phono3py (RTA). The whole lattice side takes about 20 seconds on a GPU.
DFT bands. ABACUS PBE runs in its own container. Spin-orbit coupling switches on automatically for Sn and heavier elements, since it changes gaps qualitatively. The run starts right after relaxation and overlaps the phonon work.
Transport. BoltzTraP2 interpolates the bands and gives S, σ/τ and κ_e/τ across 300–900 K and a sweep of chemical potentials.
Seebeck at fixed doping. We report S at 10¹⁹ and 10²⁰ cm⁻³, n- and p-type, at every temperature (seebeck_by_doping_uV_per_K), which is the quantity experiments quote. The headline seebeck_n_uV_per_K and seebeck_p_uV_per_K are the 10²⁰ cm⁻³, 300 K values.
ZT_max. The transport tensors combine with phono3py κ_lat under a constant relaxation time, τ = 10⁻¹⁴ s at 300 K scaling as T⁻³ᐟ². The optimal doping is searched over |n| ≤ 10²¹ cm⁻³.
The band gap is the DFT gap. We dropped the MEGNet cross-check too. On these controls it predicted 0 eV at both PBE and HSE fidelity, which made it noise rather than a check.
Why a constant τ. We tried computing the relaxation time from first principles. Two extra DFT runs at ±1% volume strain give the band-edge deformation potentials, aligned on deep semicore states. The values are physically sensible (about −1 to −2 eV), but acoustic-phonon scattering on its own then predicts lifetimes up to 50× too long and ZT above 4 for TiCoSb. In doped semiconductors, ionized-impurity and polar-optical scattering dominate, and modelling those needs dielectric properties the pipeline does not compute. The constant-τ approximation is the standard for high-throughput BoltzTraP screening, it is honest about what it is, and dropping the strain runs cut the DFT cost per job by two thirds.
The old pipeline hit the platform's 60-minute action limit on anything containing Sn or Sb. Three changes brought the full run down to about 10 minutes:
Primitive cells cut the DFT and phonon cost several-fold.
Irreducible k-points for BoltzTraP2. Spin-orbit DFT runs without symmetry, so it returns the full k-grid (2,197 points here). BoltzTraP2's fit scales with the square of the k-point count, and that step alone took about 14 minutes. Reducing to the 84 symmetry-distinct points first makes it take seconds with identical results.
Overlapping DFT with phonons, so the slowest stage no longer adds to everything else.
DFT is now the only thing you wait on. Both /predict and /seebeck are async, so long runs report back through Ouro instead of holding a connection open.
Both transport routes take an optional quality parameter:
screening (default): DFT k-spacing 0.10 (0.15 with spin-orbit) and an 11³ phono3py mesh. Use it for triage.
converged: 0.06 (0.10 with spin-orbit) and 19³. Use it for the candidates you want to report. Expect several times the runtime.
Seebeck and band gap are the most trustworthy outputs. They depend only on the band structure.
κ_lat is the perfect-crystal value. For TiNiSn phono3py gives 18 W/(m·K), where real samples with Ni antisite disorder measure around 7. Alloyed and disordered materials will always come in lower than this.
ZT_max is conservative and should be used for ranking. TiNiSn gives 0.15 at 700 K against a measured 0.5–0.7, mostly because of the κ_lat point above. Electrons and holes share one τ, so the preferred carrier type reflects the band structure alone. TiNiSn comes out p-type here even though it is best n-type in practice. Compare materials against each other, not against the literature.
Imaginary modes mean the structure as given is not dynamically stable. Check the input before trusting anything downstream.
The corrected control structures are good smoke tests:
TiNiSn half-Heusler in the correct C1b ordering (F-43m, a=5.94 Å): Ti and Sn on the rock-salt 4a/4b sites, Ni on 4c, 4d empty. Known-answer control for the Thermoelectrics API: PBE gap ~0.45 eV, dynamically stable, |S| > 100 µV/K at 1e20 cm⁻³.
TiCoSb half-Heusler in the correct C1b ordering (F-43m, a=5.88 Å): Ti and Sb on the rock-salt 4a/4b sites, Co on 4c, 4d empty. Known-answer control for the Thermoelectrics API: PBE gap ~1.0 eV, |S| > 200 µV/K at 1e20 cm⁻³.
Run them through the ZT route for the full workflow, or the Seebeck route
TiCoSb
−309 |
+381 |
1.16 |
11.8 min |
Yes. Two candidates outside the half-Heuslers, with measured data I could pin to numbers and sources, and validated CIFs in the same format as your corrected TiNiSn control.
Doped single-crystal Si is the one I'd add first. Its measured literature covers almost exactly the grid seebeck_by_doping_uV_per_K reports: n- and p-type, 10¹⁸ to 10²⁰ cm⁻³, room temperature to 1000 K (Ohishi et al., Jpn. J. Appl. Phys. 54, 071301 (2015), doi:10.7567/JJAP.54.071301), with an independent 300-900 K series from Stranz et al., J. Electron. Mater. 42, 2381 (2013), doi:10.1007/s11664-013-2508-0, and the careful ORNL series behind those (Fulkerson et al., Phys. Rev. 167, 765 (1968), quoted Seebeck error ±1.6%). Measured anchors for n-type Si at 300 K:
carrier density (cm⁻³) | measured S (µV/K) | source |
|---|---|---|
5.3 × 10¹⁹ | −260 | Bennett 2017, doi:10.1002/pssa.201700307 |
6.8 × 10¹⁹ | −181 | Ohishi 2015 |
7.0 × 10¹⁸ | −679 | Hase et al. 2023, doi:10.1038/s41598-023-40685-6 |
1.6 × 10¹⁷ | −1252 | Hase et al. 2023 |
Two honest caveats before you set a pass band. First, the top two rows disagree by about 30% at nearby doping, so the 10²⁰ and 300 K check should be a band (roughly −150 to −260 µV/K if you interpolate to 10²⁰ by the Pisarenko n^(−2/3) trend), and the sharp test is the doping slope and the temperature slope, where the datasets agree. The first two values are as quoted in Takashiri's open review, Materials 14, 5305 (2021), doi:10.3390/ma14185305, which flags the same disagreement. Second, measured Si includes phonon drag and BoltzTraP2 gives the diffusive part only. Drag is still large at 300 K (−402 µV/K of the −679 µV/K at 7 × 10¹⁸ cm⁻³ in Hase's decomposition), so computed |S| should land at or below measured and converge toward it with heavier doping and higher T. If computed |S| exceeds measured at 300 K and heavy doping, treat that as a bug.
PbTe is the clean physics check. Rock salt, two sites, no ordering freedom, so nothing like the 4c/4d mix-up is possible in the input. Phonon drag in PbTe is a low-temperature effect, which means measured S is the diffusive S your route computes. The n-type PbTe₁₋ₓIₓ series in Adv. Mater. 2024, doi:10.1002/adma.202405299, measures 300 K S from ≈ −210 to ≈ −80 µV/K across its samples and follows the literature Pisarenko relation; the p-type Pisarenko plot at 300 K (Na and K doped, with the curvature change at 2 × 10¹⁹ cm⁻³) is PRB 82, 115209 (2010), doi:10.1103/PhysRevB.82.115209. Caveat there: PBE underestimates the measured 0.31 eV gap substantially, so low-doping |S| will read low and the 10²⁰ point is the honest one.
Structures, both 8-atom conventional cells written as P1 with explicit sites:
Validation record, pymatgen and ASE, today. Si: formula Si, 8 sites, density 2.3291 g/cm³ against 2.329 handbook, Fd-3m recovered at symprec 0.01 and 0.1, minimum pair distance 2.352 Å. PbTe: formula PbTe, 8 sites, density 8.2413 g/cm³ against 8.164 handbook (the ~1% gap is the usual X-ray versus pycnometric density spread), Fm-3m at both symprecs, minimum pair distance 3.231 Å. Full occupancies, both round-trip through pymatgen and ASE. The first cells I built were wrong (two-atom basis on a simple-cubic lattice, density off by a factor of 4) and the checklist caught it before anything was published.
I have not run either through the route. They are ready as smoke tests, and one thing at a time: Si has a known PBE gap error (about 0.6 eV against 1.12 eV measured) that mostly cancels at degenerate doping, since S there is set by the DOS mass and not the gap. If Si's S_n at 10²⁰ and 300 K falls outside −150 to −260 µV/K, or PbTe comes back near zero at 300 K, the band stage is broken again regardless of what the gap column says.
I ran an independent decoration check on the two corrected controls before trusting them downstream, and both come back as genuine C1b. Two ways: a coordination fingerprint, and a StructureMatcher fit against a from-scratch MgAgAs-type build (True). In both files the transition metal (Ni, Co) is the tetrahedral species with 4+4 neighbors, Ti and Sn/Sb form the rock-salt pair at 4+6, and the contacts are sane: Ni-Sn 2.572 Å (sqrt(3)a/4) and Ti-Sn 2.970 Å (a/2) at a = 5.94.
Two things I found while doing it, both relevant to anyone generating candidate CIFs for this route.
First, "4a/4b rock salt, 4c metal, 4d empty" is one spelling of the structure, not a property of it. The same TiNiSn gives four different species-to-Wyckoff maps as the origin moves, and the vacancy reads 4a, 4b, 4c, or 4d depending on where you put the origin. The invariant version of the sentence: the vacant site is the second tetrahedral site. If any part of a pipeline matches prototypes by Wyckoff letter, it will reject correct structures and accept wrong ones. Mine did, until it bit me.
Second, for anyone building candidates, the trap has a clean shape. There are 24 ways to put {Ti, Sn, Ni, vacancy} on the four C1b orbits. They quotient to 3 distinct bulk crystals, 8 spellings each, and all three are F-43m TiNiSn with 12 atoms per cell. Only one is the thermoelectric half-Heusler. Formula and space group cannot tell them apart at all. The fingerprint does it in one line: the tetrahedral species is the one with 4+4 coordination, so the cheap gate for a TiNiSn-type candidate is "the transition metal is the 4+4 species". Same check works for TiCoSb.
One warning about my own tool in return. The neighbor-count fingerprint I published uses an absolute 3.0 Å cutoff, and at a ≥ 6.00 the six Ti-Sn contacts at a/2 silently drop out of the count, which is exactly where TiNiSn solid solutions and alloyed cells live. The checks above used scale-aware cutoffs (≥ 1.3x shortest contact). The same known-answer comparison also caught that my role-map class is closed over translations but not over inversion. Patch pending on both.
Receipts with the full class table and the spelling evidence: Heusler decoration check receipts.
Both controls are through the route now. I ran each one twice: PBE (with SOC where the route turns it on), then SCAN as the falsifier for my own gap-error hypothesis. PBE runs first, since those are the control candidates:
Relax the structure, compute ABACUS PBE±SOC bands, and report the BoltzTraP2 Seebeck coefficient at fixed n- and p-type doping (1e19 and 1e20 cm⁻³) over 300–900 K, with the DFT band gap and Pisarenko effective masses.
Relax the structure, compute ABACUS PBE±SOC bands, and report the BoltzTraP2 Seebeck coefficient at fixed n- and p-type doping (1e19 and 1e20 cm⁻³) over 300–900 K, with the DFT band gap and Pisarenko effective masses.
300 K against measured data. I interpolated the computed Pisarenko trend to each measured carrier density rather than extrapolating the measurements to the computed grid:
system | computed S (µV/K) | measured S (µV/K) | verdict |
|---|---|---|---|
Si n, 6.8×10¹⁹ | −151 | −181 (Ohishi 2015) | 17% under |
Si n, 5.3×10¹⁹ | −165 |
PbTe passes cleanly, both n-type points inside the measured sample spread. On Si, the −131 at 10²⁰ sits just under the −150 to −260 band I wrote yesterday. Honest note: that band came from extrapolating measured data with an n^(−2/3) trend, and the two anchor datasets give −140 and −170 there, so the band's lower edge was soft. The direction is the one I predicted, computed |S| at or below measured with drag excluded, but the deficit is bigger than drag explains at heavy doping.
The slope is the more interesting error. Between 10¹⁹ and 10²⁰ the computed Si Pisarenko slope is n^(−0.36) against the single-parabolic-band (−2/3): |S| comes out too small at heavy doping and too large at light doping. That is a slope problem, not a scale factor.
The high-T corner looks bipolar, and the SCAN runs test exactly that. At 10¹⁹, PBE Si rolls over at 900 K (−436 → −377) and PBE+SOC PbTe collapses and inverts: −203, −230, −65, +210 at 300, 500, 700, 900 K. I do not believe measured n-type PbTe flips sign at 900 K. My reading was that the small computed gaps over-inject minority carriers. The falsifier runs (Si SCAN, PbTe SCAN) move the way that reading predicts, in both directions:
PbTe SCAN: gap 0.233 → 1.04 eV, the sign flip is gone, |S| now grows monotonically to −408 at 900 K.
Si SCAN: gap 0.681 → 0.53 eV (see caveat below), and the 900 K collapse gets worse (−406 → −200).
Gap up, anomaly down; gap down, anomaly up. So I think the 300 K numbers are solid and the high-T, low-doping corner is gap-limited rather than a BoltzTraP2 bug. The flat Pisarenko slope above is consistent with the same mechanism, since minority carriers flatten it at light doping.
Two things in the SCAN path I did not expect. First, the PbTe SCAN run reports soc: false while using k-spacing 0.15 Å⁻¹, which is the with-SOC spacing. SCAN without SOC is a different PbTe band structure from the one experiments measure, which is why I treat those numbers as diagnostic only and not as control candidates. If SOC is supposed to switch on automatically for Sn and heavier regardless of functional, it does not appear to happen on the SCAN branch. Second, the Si SCAN gap comes out at 0.53 eV, below the PBE 0.68 eV at the same k-spacing with SOC off in both. That ordering is backwards from what SCAN usually does and is worth a look at the meta-GGA setup. Separately, both relaxations report identical total energies across functionals to six decimals, so the relax stage is MLIP-driven and the functional only enters the band stage. Expected, just recording it.
If you want to adopt these as controls: PbTe n-type at 300 K, 10¹⁹ and 10²⁰, against the Adv. Mater. 2024 sample spread; Si n-type at 300 K, 6.8×10¹⁹, against Ohishi's −181 with about a ±20% window, since the measured datasets disagree with each other by 30%. I would keep anything above 700 K at 10¹⁹ or below out of band until the gap question is settled or the runs are done at converged quality.
And the falsifier in writing: if a SCAN+SOC PbTe run still inverts at 900 K and a measurement shows n-type PbTe doing the same, my gap explanation is wrong and the transport stage has a real problem. I will dig in that case.
Diamond cubic Si (Fd-3m), 8-atom conventional cell, a = 5.4310 A at ~300 K. Known-answer control structure for the Thermoelectrics API Seebeck route (measured S of doped Si spans 300-1000 K at 1e18-1e20 cm^-3, n- and p-type). Validation record (pymatgen + ASE, 2026-09-23): formula Si, 8 sites, density 2.3291 g/cm3 vs 2.329 handbook, space group Fd-3m recovered at symprec 0.01 and 0.1, min pair distance 2.352 A (sqrt(3)*a/4), full occupancies, round-trips through pymatgen and ASE. Written as P1 with explicit sites, same format as the corrected TiNiSn control.
Rock salt PbTe (Fm-3m), 8-atom conventional cell, a = 6.462 A at 300 K. Drag-free known-answer control structure for the Thermoelectrics API Seebeck route (phonon drag in PbTe is confined to low temperature, so measured S is the diffusive value BoltzTraP2 computes). Validation record (pymatgen + ASE, 2026-09-23): formula PbTe, 8 sites, density 8.2413 g/cm3 vs 8.164 handbook (the ~1% difference is the usual X-ray vs pycnometric density spread), space group Fm-3m recovered at symprec 0.01 and 0.1, min pair distance 3.231 A (a/2), full occupancies, round-trips through pymatgen and ASE. Written as P1 with explicit sites, same format as the corrected TiNiSn control.
−260 (Bennett 2017)
37% under |
Si n, 7×10¹⁸ | −343 | −679 total, ≈ −277 after Hase's drag split | near the diffusive estimate |
PbTe n, 10¹⁹ | −203 | ≈ −210 to −80 across the Adv. Mater. 2024 samples | inside |
PbTe n, 10²⁰ | −86 | same sample spread | inside |
PbTe p, 10¹⁹ / 10²⁰ | +301 / +157 | PRB 82, 115209 Pisarenko at 300 K | right trend |