Basis sets¶
vibe-qc ships two categories of Gaussian basis sets:
Standard molecular bases — the 90 Pople, Dunning, def2, Sapporo, ANO, and core-valence sets bundled with libint. Accessed by the standard name (
"sto-3g","6-31g*","cc-pvdz","def2-tzvp", …).pob-* basis sets from the Peintinger-Vilela-Oliveira-Bredow family — triple- and double-zeta bases designed to avoid the small-exponent linear-dependency problem that afflicts standard molecular bases in periodic calculations. Accessed by the names
"pob-tzvp","pob-tzvp-rev2", and"pob-dzvp-rev2".
Using a basis set¶
from vibeqc import BasisSet
basis = BasisSet(mol, "pob-tzvp")
print(basis.nbasis()) # number of basis functions
pob-* basis sets in detail¶
The pob-* sets were designed around the CRYSTAL code’s requirements for solid-state calculations. Standard molecular TZVP bases contain very diffuse functions that, when periodic images overlap across unit cells, produce near-linear-dependent basis sets — SCF convergence suffers or fails outright. The pob family tightens those functions to make them usable in solids.
Coverage¶
Name |
Elements |
Reference |
|---|---|---|
pob-TZVP |
H–Br (32) |
Peintinger, Vilela Oliveira, Bredow, J. Comput. Chem. 34, 451 (2013) |
pob-TZVP-rev2 |
H–Br (32) |
Vilela Oliveira, Laun, Peintinger, Bredow, J. Comput. Chem. 40, 2364 (2019) |
pob-DZVP-rev2 |
subset (19) |
(same as above) |
Heavy elements¶
The pob-* archives for Rb–I (up to Z=53), Cs–Po (to Z=84), and
La–Lu (Z=57–71) require effective core potentials. vibe-qc’s CRYSTAL
parser recognises the ECP blocks in those files but the integral
engine currently handles only all-electron shells. Running one of
these bases raises NotImplementedError until the
libecpint integration lands.
See the roadmap (libecpint lands in v0.4.0).
Re-fetching the pob-* library¶
Because we ship the .g94 conversions in the repository, a fresh
clone already has them under basis_library/custom/. If you want to
re-fetch from the Bredow group server (e.g. for a future revision):
python -m vibeqc.basis_crystal fetch
./scripts/setup_basis_library.sh
The fetcher writes to basis_library/custom/; the setup script
assembles basis_library/basis/ from libint’s stock set plus those
customs.
Parsing a CRYSTAL-format basis directly¶
from vibeqc.basis_crystal import parse_crystal_atom_basis_file, emit_g94
atom = parse_crystal_atom_basis_file("path/to/06_C")
print(atom.element_symbol, len(atom.shells))
with open("my-basis.g94", "w") as f:
f.write(emit_g94([atom]))
Drop the resulting my-basis.g94 into basis_library/custom/ and
run ./scripts/setup_basis_library.sh to pick it up.
CRYSTAL format in one page¶
The per-element files that Bredow, CRYSTAL’s library, and most other solid-state QC projects distribute use CRYSTAL’s native input format:
Z NSHELL ← header: atomic number, shell count
ITYPE LAT NG CHE SCAL ← shell 1 header
exp₁ coef₁ ← NG primitive lines
exp₂ coef₂
...
ITYPE LAT NG CHE SCAL ← shell 2 header
...
Each shell header has:
Token |
Meaning |
|---|---|
|
Format code; |
|
Shell angular-momentum code: |
|
Number of primitive Gaussians in the contraction. |
|
Formal occupancy of the shell (electrons). |
|
Scale factor; primitive exponents are multiplied by \(\text{SCAL}^2\). |
For ECP-bearing atoms (heavy elements, Rb–I and beyond in the pob
family), the first line uses 200+Z and an INPUT block follows the
header describing the ECP. vibe-qc’s parser recognises these files but
raises NotImplementedError until the libecpint integration lands
(tracked in v0.4.0 on the roadmap).
vibeqc.basis_crystal.parse_crystal_atom_basis_file(path) returns a
dataclass that mirrors this structure:
>>> atom = parse_crystal_atom_basis_file("pob-TZVP/06_C")
>>> atom.Z, atom.element_symbol
(6, 'C')
>>> atom.shells[0].shell_type, atom.shells[0].n_primitives
('S', 6)
>>> atom.shells[0].exponents[:2]
[13575.349682, 2035.2333680]
emit_g94(list_of_atom_basis) renders them to libint’s .g94
(NWChem-format) text.