# DF-MP2: Density-Fitted 2nd-Order Møller–Plesset Perturbation Theory¶

Code author: Robert M. Parrish

Section author: Robert M. Parrish

Module: Keywords, PSI Variables, DFMP2

## Introduction¶

Second-order Møller–Plesset Perturbation Theory (MP2) occupies a unique role in quantum chemistry due to its small-prefactor $${\cal O}(N^5)$$ treatment of dynamic electron correlation. This unusually cheap ab initio treatment of electron correlation may be made even more efficient by means of the Density-Fitting (DF) approximation (also known as Resolution-of-the-Identity or RI), wherein the quadratic $$ov$$ products in the bra- and ket- of the $$(ov|ov)$$-type Electron Repulsion Integrals (ERIs) appearing in MP2 are cast onto a linear-scaling auxiliary basis by least-squares fitting. Substitution of the DF factorization into the MP2 equations results in a formal scaling and prefactor reduction of MP2, and further speed gains are possible due to heavy utilization of matrix-multiplication kernels and minimal storage requirements in a DF approach. The method has been found to be quite robust and accurate, and it should be preferred unless extreme accuracy is required or a fitting basis is not defined for the primary basis and atom type encountered. In particular, we have found excellent efficiency and tractability gains when using DF-MP2 in concert with a DF-SCF reference. An efficient, threaded, disk-based DF-MP2 code is available in PSI4 for all single reference types available in the SCF module. MP2 defaults in PSI4 to the density-fitted code. See MP2_TYPE for performing a MP2 with conventional integrals.

An example utilization of the code is:

molecule h2o {
0 1
O
H 1 1.0
H 1 1.0 2 104.5
}

set basis cc-pvdz
set scf_type df
set freeze_core True

energy('mp2')


The energy('mp2') call to energy() executes the predefined DF-MP2 procedure, first calling the SCF module with a default RHF reference and DF algorithm for the two-electron integrals. When the orbitals are converged, the DF-MP2 module is launched, which forms the density-fitted $$(Q|ov)$$ integrals and then builds the full $$(ov|ov)$$ tensor in blocks, evaluating the contributions to the MP2 energy as it goes. A RHF-MP2 wavefunction is selected automatically due to the RHF reference. In this example, we freeze the core, both for efficiency and because split-valence bases like cc-pVDZ do not contain core correlation functions. The result looks something like:

-----------------------------------------------------------
==================> DF-MP2 Energies <====================
-----------------------------------------------------------
Reference Energy          =     -76.0213974638823942 [Eh]
Singles Energy            =      -0.0000000000000001 [Eh]
Same-Spin Energy          =      -0.0512503270216563 [Eh]
Opposite-Spin Energy      =      -0.1534098175176923 [Eh]
Correlation Energy        =      -0.2046601445393486 [Eh]
Total Energy              =     -76.2260576084217405 [Eh]
-----------------------------------------------------------
================> DF-SCS-MP2 Energies <==================
-----------------------------------------------------------
SCS Same-Spin Scale       =       0.3333333333333333 [-]
SCS Opposite-Spin Scale   =       1.2000000000000000 [-]
SCS Same-Spin Energy      =      -0.0170834423405521 [Eh]
SCS Opposite-Spin Energy  =      -0.1840917810212307 [Eh]
SCS Correlation Energy    =      -0.2011752233617829 [Eh]
SCS Total Energy          =     -76.2225726872441811 [Eh]
-----------------------------------------------------------


The theory, breakdown of results, and common keywords used in DF-MP2 are presented below.

## Theory¶

Møller–Plesset Theory (MPn) or Many-Body Perturbation Theory (MBPT) through second order has the spin-orbital formula:

(1)$E_{\mathrm{total}}^{(2)} = E_{\mathrm{Reference}} - \frac{f_{ia} f_{ia}}{\epsilon_a - \epsilon_i} - \frac{1}{4} \frac{\langle ij||ab\rangle^2}{\epsilon_a + \epsilon_b - \epsilon_i - \epsilon_j}$

Here $$i$$ and $$j$$ are occupied spin orbitals, $$a$$ and $$b$$ are virtual spin orbitals, $$f_{ia}$$ are the $$ov$$ Fock Matrix elements, $$\epsilon$$ are the orbital eigenvalues, and $$\langle ij||ab\rangle$$ are the antisymmetrized physicist’s ERIs. For converged RHF and UHF references, the singles correction,

$E_{\mathrm{MBPT}}^{(1)} = - \frac{f_{ia} f_{ia}}{\epsilon_a - \epsilon_i},$

is zero due to the Brillioun Condition, and the first contribution to the perturbation series is at the second order:

$E_{\mathrm{MBPT}}^{(2)} = - \frac{1}{4} \frac{\langle ij|ab\rangle^2}{\epsilon_a + \epsilon_b - \epsilon_i - \epsilon_j}.$

In the DFMP2 module, the first-order contribution, or “singles energy” is always evaluated. This term is a significant contributor to the total second-order energy if a ROHF reference is used. In this case, we have chosen to use the ROHF-MBPT(2) ansatz, in which the ROHF orbitals are semicanonicalized, the resultant nonzero Fock matrix elements $$f_{ia}$$ are used to form the singles amplitudes, and then the second-order amplitudes are formed with the semicanonical spin orbitals via the same machinery as a UHF-MP2. Note that the singles energy should be very close to zero for RHF and UHF references; if it is not, there is a good chance your orbitals are not well converged. Tighten the SCF E_CONVERGENCE and/or D_CONVERGENCE keywords and try again.

To increase the efficiency of MP2 energy evaluation, spin integration and simplification is carried out. This also allows for the identification of Same-Spin (SS) and Opposite-Spin (OS) terms for use in Grimme’s Spin-Component Scaled (SCS) MP2. For RHF-MP2 (also labeled as RMP2), the spin-free equations are (note that the integrals are now chemist’s integrals over spatial orbitals)

$E_{\mathrm{MBPT,OS}}^{(2)} = - \frac{(ia|jb)(ia|jb)}{\epsilon_a + \epsilon_b - \epsilon_i - \epsilon_j}$

and

$E_{\mathrm{MBPT,SS}}^{(2)} = - \frac{[(ia|jb)-(ib|ja)](ia|jb)}{\epsilon_a + \epsilon_b - \epsilon_i - \epsilon_j}.$

For UHF-MP2 (also labeled as UMP2) and the second-order contribution to ROHF-MBPT(2) using semicanonical orbitals, the spin-free equations are

$E_{\mathrm{MBPT,OS}}^{(2)} = - \frac{(ia^\alpha|jb^\beta)(ia^\alpha|jb^\beta)}{\epsilon_a + \epsilon_b - \epsilon_i - \epsilon_j}$

and

$E_{\mathrm{MBPT,SS}}^{(2)} = - \frac{1}{2}\frac{[(ia^\alpha|jb^\alpha)-(ib^\alpha|ja^\alpha)](ia^\alpha|jb^\alpha)} {\epsilon_a + \epsilon_b - \epsilon_i - \epsilon_j} - \frac{1}{2}\frac{[(ia^\beta|jb^\beta)-(ib^\beta|ja^\beta)](ia^\beta|jb^\beta)} {\epsilon_a + \epsilon_b - \epsilon_i - \epsilon_j}.$

Note that the UHF-MP2 equations use three classes of integrals, while the RHF-MP2 equations use only one class. Because of this, a UHF-MP2 or ROHF-MBPT(2) energy should take roughly three times as long as an RHF-MP2 energy.

## Recommendations¶

All-in-all, DFMP2 should be a simple module to use, with few keywords (fully documented in the Appendix DFMP2). Some basic recommendations are included below:

• DFMP2 should be run with the $$ov$$-type RI or MP2FIT auxiliary basis sets, not the -JKFIT basis sets. The automatic basis selector should work fine for most all bases (exceptions are less common elements at higher than quadruple-zeta). Generally, it is always better to specify only the orbital basis set and let the auxiliary bases be chosen automatically. If you want to specify manually, use the DF_BASIS_MP2 keyword.

• DFMP2 likes memory. At a minimum, $$2Q^2$$ doubles are required, where $$Q$$ is the size of the auxiliary basis set. However, there is one disk transpose of the $$(Q|ov)$$ tensor in the RHF-MP2 algorithm [two for UHF-MP2 and ROHF-MBPT(2)], so more memory will reduce seek times. If you notice DFMP2 using more memory than allowed, it is possible that the threaded three-index ERI computers are using too much overhead memory. Set the DF_INTS_NUM_THREADS to a smaller number to prevent this in this section (does not affect threaded efficiency in the rest of the code).

• DFMP2 likes disk. At a minimum, $$2Qov$$ doubles are required for RHF-MP2, and $$4Qov$$ doubles are required for UHF-MP2.

• DFMP2 likes threads. Some of the formation of the $$(Q|ov)$$ tensor relies on threaded BLAS (such as MKL) for efficiency. The main $${\cal O}(N^5)$$ step is done via small/medium-sized DGEMMs inside of OpenMP, so make sure to set the OMP_NESTED environment variable to FALSE to prevent thread thrash (or just as well, do not define OMP_NESTED at all).

• Freezing core is good for both efficiency and correctness purposes. Freezing virtuals is not recommended. The DFMP2 module will remind you how many frozen/active orbitals it is using in a section just below the title.

• ROHF-MBPT(2) may be preferred to UHF-MP2, as the latter can suffer from severe spin contamination in some cases.

• MP2 is not suitable for systems with multireference character. The orbital energies will come together and an explosion will occur.