5.2. Recovering Correlation Energy: B atom#
At the Hartree Fock level of theory, each electron experiences an average potential field of all the other electrons. In essence, it is a “mean field” approach that neglects individual electron-electron interactions or “electron correlation”. Thus, we define the difference between the self-consistent field energy and the exact energy as the correlation energy. Two fundamentally different approaches to account for electron correlation effects are available by selecting a Correlation method: Moller Plesset (MP) Perturbation theory and Coupled Cluster (CC) theory.
Exercise 1
Calculate the HF energy for Boron using the 6-311+G** basis set, then determine the value of the correlation energy for boron assuming an “experimental” energy of -24.608 Hartrees (Schaefer III, Henry F., and Frank E. Harris. “Electronic Structure of Atomic Boron.” Physical Review 167.1 (1968): 67).
Using the same basis set, perform an energy calculation with CISD and full CI.
Using the same basis set, perform an energy calculation with MP2, MP3 and MP5.
Using the same basis set, perform an energy calculation with CCSD and CCSD(T).
Determine the percentage of the correlation energy recovered for HF, MP2, MP5, CCSD, CCSD(T).
Compare the performances of the different methods. In particular, you will see that some of the methods seem to overestimate the correlation recovered. How is it possible? (Hint: Think both about the theoretical aspects of the methods and how we are computing the recovered correlation energy).
CCSD energy/mp2 energy
You may recover the CCSD energy from the CCSD(T) calculation, but you will have to look at the output file or by calculating both. In any case, the calculations for a single atom are quick.
The same is true for the MP2 energy which can be extracted from the MP5 calculation.
MP5 will require the use of the following options: psi4.set_options({"reference" :"rohf", "qc_module":"detci"})
as Psi4 does not have MP5 implemented using a RHF reference.
import psi4
import py3Dmol
import pandas as pd
import matplotlib.pyplot as plt
import sys
sys.path.append("..")
from helpers import *
psi4.set_num_threads(2)
psi4.set_memory('2 GB')
Threads set to 2 by Python driver.
2000000000
Memory set to 1.863 GiB by Python driver.
psi4.core.clean_options()
# define a single boron atom and set the correct multiplicity
boron_geometry = psi4.geometry("""""")
psi4.set_options({'reference' : "UHF"})
# Perform single-point calculation with requested method/basis
B_energy_hf = 0
drawXYZ(boron_geometry)
3Dmol.js failed to load for some reason. Please check your browser console for error messages.
#Experimental energy of Boron
B_exact_e = -24.608
correlation = None # Calculate the total amount of correlation energy that should be recovered using the B_exact_e
print(F"\n Electron correlation: {correlation} Hartrees")
# calculate energy for other methods
psi4.core.clean_options()
psi4.core.clean()
psi4.set_options({'reference' : "UHF"})
#MP2
e_mp2 = None
#MP3
e_mp3 = None
#CCSD
e_ccsd = None
#CCSD(T)
e_ccsd_t = None
#MP5
psi4.core.clean_options()
psi4.core.clean()
psi4.set_options({"reference" :"rohf",
"qc_module":"detci"})
e_mp5 = None
#CISD
e_cisd = None
#FCI
e_fci = None
correlations = {}
correlations['hf']= 0
correlations['mp2'] = None # calculate the % of correlation energy recovered here
correlations['mp3'] = None # calculate the % of correlation energy recovered here
correlations['mp5'] = None # calculate the % of correlation energy recovered here
correlations['ccsd'] = None # calculate the % of correlation energy recovered here
correlations['ccsd(t)'] = None # calculate the % of correlation energy recovered here
correlations['cisd'] = None # calculate the % of correlation energy recovered here
correlations['fci'] = None # calculate the % of correlation energy recovered here
pd.DataFrame.from_dict(correlations,orient='index',columns=['% correlation recovered'])