Moving from CRYSTAL¶
vibe-qc’s roadmap targets feature-for-feature parity with
CRYSTAL on the v1.0 / v2.0 timeline,
the Peintinger-Vilela Oliveira-Bredow pob-* basis-set family is
bundled, and the periodic SCF gauge convention is being aligned
with CRYSTAL’s BIPOLE construction (see
user_guide/bipole). For CRYSTAL users, the physics
maps directly; the input idiom is different — CRYSTAL takes a
fixed-grammar .d12 deck while vibe-qc takes a Python script. This
page is a keyword-by-keyword crosswalk.
Input file shape¶
CRYSTAL .d12¶
TiO2 rutile
CRYSTAL
0 0 0
136
4.5937 2.9587
2
22 0.0 0.0 0.0
8 0.30530 0.30530 0.0
END
BASISSET
POB-TZVP
END
DFT
EXCHANGE
PBE
CORRELAT
PBE
END
SHRINK
8 8
TOLINTEG
7 7 7 7 14
FMIXING
30
LEVSHIFT
2 1
END
vibe-qc Python¶
import numpy as np
import vibeqc as vq
# Rutile lattice — fetched from a CIF / Materials Project / hand-built.
a, c = 4.5937 * 1.8897259886, 2.9587 * 1.8897259886 # → bohr
sysp = vq.PeriodicSystem(
dim=3,
lattice=np.diag([a, a, c]), # tetragonal P4_2/mnm
unit_cell=[
vq.Atom(22, [0.00000 * a, 0.00000 * a, 0.0 * c]), # Ti
vq.Atom(22, [0.50000 * a, 0.50000 * a, 0.5 * c]),
vq.Atom( 8, [0.30530 * a, 0.30530 * a, 0.0 * c]), # O
vq.Atom( 8, [0.69470 * a, 0.69470 * a, 0.0 * c]),
vq.Atom( 8, [0.80530 * a, 0.19470 * a, 0.5 * c]),
vq.Atom( 8, [0.19470 * a, 0.80530 * a, 0.5 * c]),
],
)
basis = vq.BasisSet(sysp.unit_cell_molecule(), "pob-tzvp")
kmesh = vq.monkhorst_pack(sysp, [8, 8, 8]) # SHRINK 8 8
opts = vq.PeriodicRKSOptions()
opts.functional = "PBE"
opts.lattice_opts.cutoff_bohr = 12.0 # ≈ TOLINTEG row 5 control
opts.fock_mixing = 0.30 # FMIXING 30
opts.level_shift = 0.2 # LEVSHIFT 2 1 — vibe-qc uses Ha
# → 0.2 Ha ≈ 5 eV ≈ "2"
# in CRYSTAL's units (×10⁻¹ Ha)
result = vq.run_rks_periodic(sysp, basis, kmesh, opts)
print(result.energy)
The structural difference is that vibe-qc’s input is executable
Python rather than declarative text. That trades CRYSTAL’s
grammar guard-rails for the full flexibility of a programming
language — you can sweep over functionals in a for loop, generate
geometries from a CIF, splice in custom basis sets, etc., without
input-file pre-processing.
For high-volume CRYSTAL ports the
vq submit -d <dir> directory-submit
pattern lets you keep one Python “driver” plus several geometry
files alongside it, mimicking CRYSTAL’s .d12 + INPUT layout.
Keyword crosswalk¶
Important
Many CRYSTAL keywords accept integer values that map to scaled
SI / atomic units (the LEVSHIFT 2 1 means \(0.2\) Ha applied for
1 iteration). vibe-qc uses Hartree directly for every
energy-like field. Multiplying CRYSTAL’s integer by \(10^{-1}\)
generally lands the same number.
Geometry + symmetry¶
CRYSTAL |
vibe-qc |
|---|---|
|
|
Space-group number + lattice + asymmetric unit |
Full lattice matrix + full unit-cell atom list (vibe-qc reconstructs symmetry via spglib) |
|
(default — vibe-qc keeps the input cell) |
|
Manifested as |
|
Build the supercell in Python before calling |
|
The UHF / UKS drivers carry |
|
|
Note
Lattice direction matters. CRYSTAL stores lattice vectors
as rows; vibe-qc as columns. The conversion is one transpose:
lattice_vibeqc = lattice_crystal.T. Both are in the same units
once you convert Å → bohr.
Basis sets¶
CRYSTAL |
vibe-qc |
|---|---|
|
|
Per-element CRYSTAL-format basis lines |
Drop the file under |
Mixed BSE + custom basis |
Same pattern — drop in |
|
Same |
The bundled pob-* family on main covers H-Br (the same coverage
as the original Peintinger 2013 paper). The 87 BSE-fetched
basis sets that ship on the basissetdev branch are kept off
main per CLAUDE.md § 4.
ECPs¶
CRYSTAL |
vibe-qc |
|---|---|
|
|
|
|
Stuttgart MDF/MWB ECPs from external libraries |
One of the bundled |
See tutorial 32 for the ECPCenter recipe in detail.
k-mesh¶
CRYSTAL |
vibe-qc |
|---|---|
|
|
|
Not directly supported; vibe-qc uses one MP mesh per call. For HF-K convergence work, sweep |
|
The result object carries |
|
|
Coulomb / exchange truncation (TOLINTEG)¶
CRYSTAL’s TOLINTEG T1 T2 T3 T4 T5 controls five different
screening tolerances. vibe-qc collapses these into two knobs plus
the automatic optimiser:
CRYSTAL TOLINTEG row |
vibe-qc analogue |
|---|---|
|
|
|
(automatic — Cauchy-Schwarz screening at the C++ level) |
|
(automatic — same as T2) |
|
(automatic — same) |
|
(handled inside libecpint) |
PeriodicRHFOptions.auto_optimize_truncation = True (the default
on v0.7+) jointly optimises the lattice cutoff and Schwarz threshold
so you typically don’t touch them. See
linear_dependence for the diagnostic stack
when they need tightening.
SCF convergence — direct keyword map¶
CRYSTAL |
vibe-qc |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
Not implemented in vibe-qc; vibe-qc uses Pulay DIIS / EDIIS by default. |
|
Not implemented — same comment. |
|
|
|
Default on ( |
|
Set |
|
Roadmap (Phase 14 — checkpoint reads). |
Coulomb / Exchange engine¶
CRYSTAL |
vibe-qc |
|---|---|
|
|
|
Not yet exposed — defaults pinned in |
Implicit Ewald-V_ne / Ewald-E_nn |
Default for |
|
Roadmap (G1). Molecular |
|
Roadmap (depends on periodic gradients + Hessian). Molecular vibrations via |
Functionals¶
CRYSTAL |
vibe-qc |
|---|---|
|
|
|
|
|
Same names, same libxc ids |
|
|
|
Pass |
|
Roadmap (RSH machinery for periodic K still pending). |
What CRYSTAL does that vibe-qc doesn’t (yet)¶
Use CRYSTAL for these for now:
Production multi-k bulk SCF with the right BIPOLE / EXT EL-POLE / EXT EL-SPHEROPOLE gauge. vibe-qc’s BIPOLE driver is research-preview; Ewald-3D works at multi-k but isn’t the CRYSTAL-parity gauge target.
Periodic geometry optimisation (
OPTGEOM). Periodic gradients are roadmap Phase G1; vibe-qc only supports molecular optimisation today.Vibrational frequencies for solids (
FREQCALC). Depends on periodic gradients + Hessian; molecularFREQworks viarun_job(compute_hessian=True).Phonon dispersion (
PHONON). Roadmap.Elastic constants (
ELASTCON). Roadmap.Symmetry-adapted SCF. vibe-qc reads symmetry via spglib but doesn’t yet exploit it inside the SCF loop. Big-symmetry cells pay full O(N) per k-point.
Open-shell multi-k SCF (your favourite antiferromagnetic oxide). Γ-only and closed-shell multi-k are shipped; open-shell multi-k is roadmap.
Coupled-cluster periodic (
MP2,CCSD). vibe-qc’s molecular MP2 / RI-MP2 is solid; periodic post-HF correlation is v2.x scope.
What vibe-qc does that CRYSTAL doesn’t (or does differently)¶
Things you gain by switching:
Auto-citations. Every
run_periodic_jobwrites a.bibtex/.referencespair listing every paper to cite — including the pob-* basis-set papers, libxc, spglib, and the per-functional papers. See citations.Python scripting. Sweeps over functionals / k-mesh / lattice constant are a few-line
forloop, not multiple.d12files.ASE-bridged geometry I/O. Read CIF / POSCAR / Quantum Espresso
.pwidirectly; pass toPeriodicSystemvia the ASE bridge.vqqueue with vibe-qc-aware preflight.vq submit --vibeqc-preflightknows which artefacts the job will write, so remote fetch is selective. See tutorial 43.Open-source. MPL-2.0; no per-seat license; no proprietary binary distribution.
Validating vibe-qc against CRYSTAL¶
vibe-qc treats CRYSTAL14 as an out-of-process validation reference
(per CLAUDE.md § 10:
no QC-code imports). The
vq submit
runner spawns CRYSTAL14 as a subprocess on the configured remote;
the
parity matrix
collects results across multiple codes for the 15 demo systems
(commit 39c5309).
For ad-hoc validation, the typical workflow is:
Write the same system as a vibe-qc Python file and a CRYSTAL14
.d12.vq submit input.pyandvq submit -- bash run-crystal.sh(see queue § CRYSTAL14 workflows).Compare the two
.outfiles’ total energies.
For 3D crystals at multi-k, expect vibe-qc multi-k Ewald-3D to
match CRYSTAL’s SHRINK 8 8 to within a few mHa per cell at the
same basis (the gauge convention is the same up to the Madelung
self-image correction; the multipole-far-pair branch is the
remaining piece).
See also¶
user_guide/bipole — BIPOLE periodic-RHF driver status + Saunders-Roetti-1992 references.
user_guide/external_codes § “CRYSTAL14 — periodic regression reference” — the subprocess runner pattern.
user_guide/queue § CRYSTAL14 workflows — how to submit CRYSTAL14 jobs through the same
vqqueue used for vibe-qc.user_guide/basis_sets § “CRYSTAL-format basis parser” — drop a CRYSTAL
.basfile undercustom/.tutorial 16 — pob-TZVP — why CRYSTAL-style basis sets matter for periodic calculations.
tutorial 33 — MgO from Materials Project — end-to-end periodic SCF using a Materials Project / CIF starting structure.