Basis sets

vibe-qc ships two categories of Gaussian basis sets:

  1. 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", …).

  2. 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

ITYPE

Format code; 0 = user-defined contracted Gaussians (what the Bredow files use).

LAT

Shell angular-momentum code: 0=S, 1=SP, 2=P, 3=D, 4=F, 5=G.

NG

Number of primitive Gaussians in the contraction.

CHE

Formal occupancy of the shell (electrons).

SCAL

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.