Skip to content

Basis Sets

Everything generated, nothing tabulated

A Hamiltonian starts on a real-space grid, not in a lookup table. Localized orbitals and the integrals between them are all built at run time by Mandacaru itself — the algorithms that consume the resulting Hamiltonian are on the Algorithms page.

Localized basis sets, seven families

A basis set is the list of single-particle functions the molecular Hamiltonian is written in — one qubit per spin-orbital, so its size *is* the qubit count. FAO orbitals are closed-form and analytic; the numerical and Gaussian families are solved or fit at run time — every one generated, none looked up in a tabulated library.

  • FAO — hydrogen-like orbitals of the actual nuclear charge, analytic and exact; the cheapest reference basis
  • NAO — numerical orbitals confined in a hard sphere set by an energy shift, in the SIESTA/Sankey style, with SZ/DZ/DZP/TZP/TZ2P/QZP multi-zeta and polarized variants
  • NAO-AE — all-electron numerical orbitals: the LDA atom's own shells, core included, under a smooth exponential-wall confinement, plus hydrogen-like polarization and diffuse tiers sized from the atom's valence radius
  • STO-nG — the minimal Gaussian family, STO-3G to STO-6G, built by least-squares fitting n Gaussians to the Slater orbital of each occupied shell
  • Pople, Dunning and Karlsruhe — the standard named Gaussian sets, generated from the structure their names encode (next card)
  • Virtual orbitals on demand: virtual_orbitals=k appends the k lowest unoccupied subshells of each atom — H gains 2s, carbon 3s — giving a correlated method room above the occupied levels; the default 0 is the minimal basis, unchanged
  • One basis per element where a molecule needs it: basis={"O": {"name": "NAO", "size": "DZP"}, "*": "FAO"} — the dry run, BlochCalculator and the pseudopotential path all read the same mapping

In the program

Mandacaru(basis="FAO") · basis={"name": "FAO", "virtual_orbitals": 1} · basis={"name": "NAO", "size": "DZP"} · basis={"name": "NAO-AE", "tier": 1} · basis="STO-4G"

Named Gaussian sets: Pople, Dunning, Karlsruhe

The standard basis-set names are accepted as they are written in the literature. A name like 6-311+G(2df,2p) or aug-cc-pVTZ encodes a structure — how many primitives contract each core shell, how the valence is split, which polarization, diffuse and core-correlating functions are added and on which atoms — and Mandacaru parses that structure and generates the exponents and contraction coefficients for the atom at hand from its own Slater-orbital fits. The result has the published shell structure and function count (cc-pVTZ carbon is 4s3p2d1f, 30 functions) with Mandacaru's own exponents rather than the molecule-optimized literature values.

  • Pople — 3-21G, 3-21G*, 3-21G**, 3-21+G, 3-21++G, 3-21+G*, 3-21+G**, 4-21G, 4-31G, 6-21G, 6-31G, 6-31G*, 6-31+G*, 6-31G(3df,3pd), 6-311G, 6-311G*, 6-311+G*, 6-311+G(2df,2p), and any other K-NL[M][+|++]G[*|**|(…)] name
  • Dunning correlation-consistent — cc-pVDZ, cc-pVTZ, cc-pVQZ, cc-pV5Z, the diffuse-augmented aug-cc-pVDZ and the core-correlating cc-pCVDZ, and any [aug-]cc-p[C]VXZ
  • Karlsruhe def2 — def2-SV(P), def2-SVP, def2-SVPD, def2-TZVP, def2-TZVPD, def2-TZVPP, def2-TZVPPD, def2-QZVP, def2-QZVPD, def2-QZVPP, def2-QZVPPD
  • Shells are spherical (5 d, 7 f), so 6-31G* carbon has 14 functions; Pople's 3-21G* polarizes second-row atoms only, exactly as published
  • Sized like their namesakes, so the dry run gives the real qubit budget of a literature basis: water in aug-cc-pVDZ with the oxygen 1s frozen needs 80 qubits

In the program

Mandacaru(basis="cc-pVDZ") · basis="def2-TZVP" · basis="6-311+G(2df,2p)" · BasisSet.build("aug-cc-pVDZ").notation("C") → "[4s3p2d]"

Frozen core: fewer qubits, same chemistry

The core orbitals of a heavier atom are doubly occupied in every state that matters chemically. The frozen-core approximation keeps them at their Hartree–Fock occupation, folds their effect into a constant energy plus an effective one-body potential, and removes them from the active space — so the ansatz, the operator pool and the qubit count all shrink.

  • frozen_core=True freezes the chemical (noble-gas) core; an integer freezes that many lowest molecular orbitals; frozen_orbitals=[...] names them explicitly
  • Water goes from 14 qubits to 12 with the oxygen 1s frozen; the reduced Hamiltonian is what the solver sees, nothing else changes
  • The dry run reports the count after freezing, so the saving is visible before anything runs

In the program

Mandacaru(basis="FAO", frozen_core=True) · mandacaru water.xyz --frozen-core --dry-run

Pseudopotentials: NCPP, ONCVPSP and PAW, as a basis

A pseudopotential removes an atom's core electrons and the singular −Z/r potential, leaving a smooth valence-only problem that a real-space grid can resolve at a practical spacing. Mandacaru ships three families, every dataset generated from scratch by its own LDA radial atomic solver, and a family is selected exactly like any other basis — the family is the basis, and the multiple-zeta size hierarchy is its option.

  • NCPP — norm-conserving Troullier–Martins potentials in Kleinman–Bylander separable form, one projector per channel; the bundled library covers every element up to uranium (aliases TM, NCPP-TM)
  • ONCVPSP — Hamann's optimized norm-conserving Vanderbilt potentials: two projectors per channel with a 2×2 coupling block and a polynomial local potential (alias ONCV)
  • PAW — Blöchl's projector augmented wave: two partial waves and projectors per channel, an overlap correction S + C q C†, monopole compensation charges and frozen one-center terms
  • A per-element mapping gives each atom its own size within one family; frozen_core is refused as redundant, and a family registered with register_family becomes a basis name with no driver change
  • The ONCVPSP and PAW datasets (H–U) live in the mandacaru-oncvpsp and mandacaru-paw repositories, cloned once and linked in with mandacaru --link-paw <dir> or --link-oncvpsp <dir>

In the program

Mandacaru(basis="NCPP") · basis="ONCVPSP" · basis={"name": "PAW", "size": "DZP"} · mandacaru H2O --cell 8 --basis PAW --dry-run

A basis-agnostic, C-accelerated integral engine

One- and two-body integrals are evaluated on real-space grids — cubic, anisotropic or non-orthogonal — through a C/OpenMP backend that never sees an orbital's analytic form, only its sampled values, with an automatic NumPy fallback. Any basis that can be sampled on a grid drops in with no change to the integral core.

  • The two-electron Coulomb integral is solved via FFT, O(N log N), not the naive O(N²) real-space sum
  • libmandacaru_integrals compiles once (CMake ≥ 3.15) and is picked up automatically by _backend.py
  • The same BasisFunction.evaluate(x, y, z) contract works for every basis family above

In the program

Mandacaru(h=0.20) — the grid spacing in Å; the box comes from atoms.cell, centred on the molecule

Keep reading

ADAPT-VQE, VQE, excited states and periodic systems — every solver sharing one driver, and a dry run before any of them.

The same algorithm compiled and executed on Qiskit, Amazon Braket and Cirq — one keyword, one unitary, machine-precision agreement.

Cross-backend validation to 3.5×10⁻⁶ eV, real QPU execution through Amazon Braket, and what still doesn't work.

Try it on your own structure

Install it, or read the manual first.