DLPNO methods (MP2, CCSD, CCSD(T))¶
DLPNO-MP2 is local second-order Møller-Plesset theory in the domain-based pair-natural-orbital framework of Pinski, Riplinger, Valeev and Neese (J. Chem. Phys. 143, 034108 (2015)). Occupied orbitals are Foster-Boys localised, every occupied pair gets a compact virtual space of pair natural orbitals built inside its own projected atomic-orbital domain, and the MP2 residual equations are solved with the localised-orbital Fock coupling. The result tracks canonical RI-MP2 at a fraction of the asymptotic cost, with controllable truncation thresholds.
At a glance¶
Entry point |
|
Reference |
closed-shell RHF (open-shell DLPNO is on the roadmap) |
Auxiliary basis |
auto-resolved correlation (“ri”) fit of the orbital basis |
Options |
|
Accuracy (defaults) |
≥ 99.8 % of canonical RI-MP2 E_corr (TCutPNO = 1e-8) |
Exactness limit |
thresholds → 0 reproduces canonical RI-MP2 to ≤ 1 µHa |
Quick start¶
from vibeqc import run_job
from vibeqc._vibeqc_core import Atom, Molecule
mol = Molecule(
[
Atom(8, [0.000, 0.000, 0.000]),
Atom(1, [0.000, 1.499, -1.160]),
Atom(1, [0.000, -1.499, -1.160]),
], # bohr
charge=0,
multiplicity=1,
)
result = run_job(mol, basis="def2-svp", method="dlpno-mp2", output="h2o")
print(result.dlpno_mp2.e_corr) # DLPNO-MP2 correlation energy (Ha)
print(result.energy_total) # RHF + correlation
The .out file reports the energy decomposition — iterated pair
energies, the semicanonical PNO-truncation correction, and the
distant-pair dipole estimate:
DLPNO-MP2 (Pinski 2015; RI: def2-svp-rifit)
------------------------------------------------------------------------------
E(RHF reference) = -75.9547597194 Ha
pairs kept / screened = 15 / 0 (frozen core: 0)
avg PNOs per pair = 14.9
E(iterated pairs) = -0.2062668853 Ha
E(PNO truncation corr) = -0.0000032714 Ha
E(distant-pair est.) = 0.0000000000 Ha
E(DLPNO-MP2 corr) = -0.2062701567 Ha
E(DLPNO-MP2 total) = -76.1610298761 Ha
Thresholds and options¶
from vibeqc.dlpno.mp2 import DLPNOMP2Options
opts = DLPNOMP2Options(
n_frozen=1, # freeze core orbitals (before localisation)
tcut_pno=1e-9, # tighter PNO truncation (default 1e-8)
tcut_pairs=1e-6, # screen distant pairs via the dipole estimate
)
result = run_job(mol, basis="def2-svp", method="dlpno-mp2",
dlpno_options=opts, output="h2o_tight")
Option |
Default |
Meaning |
|---|---|---|
|
1e-8 |
PNO occupation cutoff (strong pairs). Tighter = more PNOs = closer to canonical. 1e-8 recovers ≈ 99.87 % of E_corr on H₂O/def2-SVP, 1e-9 ≈ 99.93 %. |
|
1e-7 |
PNO cutoff for weak pairs. |
|
1e-3 |
Mulliken threshold for domain atoms (0 = full domains). |
|
0 (off) |
Distant-pair screening on the semicanonical dipole-dipole estimate; screened pairs contribute through |
|
0 |
Frozen-core orbitals, validated against a canonical frozen-core reference. |
|
|
|
Setting every threshold to zero is a supported validation mode: the
energy then reproduces canonical RI-MP2 with the same fitting basis to
≤ 1 µHa (this is asserted in tests/test_dlpno_mp2.py).
Result object¶
result.dlpno_mp2 carries the full decomposition:
e_corr = e_corr_iterated + e_pno_correction + e_distant, per-pair
energies (pair_energies, absolute occupied indices), PNO counts per
pair (pno_per_pair), screening statistics, and the iteration trace.
DLPNO-CCSD and DLPNO-CCSD(T) — correctness pilot¶
method="dlpno-ccsd" / method="dlpno-ccsd(t)" run the Riplinger-2013
PNO coupled-cluster ansatz through vibe-qc’s FCI-anchored spin-orbital
engine. The physics is exact and gated (tests/test_dlpno_ccsd.py):
the untruncated limit reproduces canonical CCSD to < 1 µHa, the (T)
correction vanishes identically for two-electron systems and lands
between CCSD and full CI on H₂O, and PNO truncation at TCutPNO = 1e-8
recovers 99.86 % of the correlation energy.
The cost is pilot-grade — O(N⁶) in the full space — so jobs are
hard-capped at 64 basis functions (DLPNOCCSDPilotOptions.max_nbf)
until the reduced-scaling per-pair engine lands. Use it for
validation-scale molecules and benchmark anchors, not production runs:
from vibeqc import run_job
from vibeqc.dlpno.ccsd import DLPNOCCSDPilotOptions
result = run_job(mol, basis="def2-svp", method="dlpno-ccsd(t)",
dlpno_ccsd_options=DLPNOCCSDPilotOptions(tcut_pno=1e-8),
output="h2o_cc")
r = result.dlpno_ccsd
print(r.e_corr, r.e_t, result.energy_total)
Current limitations¶
Closed-shell RHF references only.
Energies only — no analytic gradients.
CCSD/CCSD(T) are the O(N⁶) correctness pilot (64-bf cap); the reduced-scaling production engine is in progress (see
HANDOVER_DLPNO.md, milestone M3c).
Citations¶
Jobs running dlpno-mp2 emit the method papers into the
.references / .bibtex outputs automatically: Møller-Plesset 1934,
Feyereisen 1993 (RI), Pinski 2015 (DLPNO-MP2), and Foster-Boys 1960
(localisation).
See also¶
Tutorial 51 — Local correlation with DLPNO — worked walkthrough with the TCutPNO convergence experiment.
examples/molecular/input-h2o-dlpno-mp2.pyand…-dlpno-ccsd-t.py— ready-to-run scripts.MP2 and double hybrids — canonical MP2, SCS/SOS variants, double-hybrid functionals.
Density fitting — auxiliary-basis families and auto-resolution.