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

run_job(method="dlpno-mp2")

Reference

closed-shell RHF (open-shell DLPNO is on the roadmap)

Auxiliary basis

auto-resolved correlation (“ri”) fit of the orbital basis

Options

dlpno_options=DLPNOMP2Options(...)

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

tcut_pno

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

tcut_pno_weak

1e-7

PNO cutoff for weak pairs.

tcut_mkn

1e-3

Mulliken threshold for domain atoms (0 = full domains).

tcut_pairs

0 (off)

Distant-pair screening on the semicanonical dipole-dipole estimate; screened pairs contribute through e_distant. Pairs closer than dipole_r_min (8 bohr) are never screened.

n_frozen

0

Frozen-core orbitals, validated against a canonical frozen-core reference.

localise

"boys"

"none" keeps canonical occupieds (diagnostic).

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