Extrapolation Techniques#
Various techniques to extrapolate energies or properties to converged results are available in the literature. Frequently used examples are completebasisset (CBS) or completePNOspace (CPS) extrapolations of DLPNOCCSD(T) energies. Such extrapolation techniques can improve the accuracy of the calculated property whenever quasiconverged technical settings are not feasible anymore. As these extrapolations typically require several calculations with different settings and a subsequent evaluation, they are an ideal case for automatization within Compound jobs. Many frequently used techniques can also be envoked by a simple keyword within ORCA. A list of currently available predefined Compound jobs can be found in the ORCA manual. Many more compound scripts are also available from the respective GitHub repository.
Example: CPS extrapolation#
CompletePNOspace extrapolation [Bistoni2020b] is useful for any DLPNO method including DLPNOCCSD(T), DLPNOMP2, or even DLPNOdouble hybrid DFT [Bursch2023]. In this case, the extrapolated correlation energy (E_{CORR, CPS}) is calculated as:
We exemplarily construct and employ a Compound job to perform CPS extrapolation for the πstacked Uracil dimer and its monomer fragments at the DLPNOCCSD(T1)/ccpVTZ level.
Let us start with constructing our compound job! First of all we want to define all desired variables for a CPS(5,6) extrapolation:
%compound
# Define variables
variable F = 1.5; # Empirical extrapolation factor
variable E_HF; # HartreeFock reference energy
variable E_X, E_Y; # Correlation energies at different TCutPNO thresholds
variable ECORR_CPS, E_CPS; # CPS correlation energy and the final CPS energy
variable basis_set = "ccpVTZ"; # Employed basis set
variable aux_basis = "ccpVTZ/C"; # Employed AUX/C basis
Variable highTCutPNO = 1e6; # high (more accurate) TCutPNO threshold
Variable lowTCutPNO = 1e5; # low (less accurate) TCutPNO threshold
Now, we setup the first calculation with the less accurate TCutPNO parameter set to 1e5 and read the resulting HarteeFock reference energy (E_HF) and the correlation energy using this threshold (E_X):
#
# (Calculation 1)
# The calculation with the less accurate TCutPNO threshold
New_Step
! DLPNOCCSD(T1) &{basis_set} &{aux_basis} VeryTightSCF
% MDCI
TCutPNO &{lowTCutPNO}
END
*xyzfile 0 1 uracil.xyz
STEP_END
# Read energies
read E_HF = MDCI_REF_ENERGY[1];
read E_X = MDCI_CORR_ENERGY[1];
The next part of our Compound job is the second calculation with tightened threshold set to 1e6:
#
# (Calculation 2)
# The calculation with the high (more accurate) TCutPNO threshold
New_Step
! DLPNOCCSD(T1) &{basis_set} &{aux_basis} VeryTightSCF
% MDCI
TCutPNO &{highTCutPNO}
END
*xyzfile 0 1 uracil.xyz
STEP_END
# Read energies
read E_Y = MDCI_CORR_ENERGY[2];
Finally, we compute the CPSextrapolated correlation energy (ECORR_CPS) and sum it up with the HF reference energy (E_HF) to obtain the final energy (E_CPS). For convenience, we can further add a detailed printout of all components of our CPS extrapolation:
#
ECORR_CPS = E_X+F*(E_YE_X);
E_CPS = E_HF + ECORR_CPS;
# CPS extrapolation printout
print(" \n");
print(" \n");
print(" COMPLETEPNOSPACE (CPS) EXTRAPOLATION \n");
print(" \n");
print(" \n");
print("CPS extrapolation via: ECORR_CPS = E_X+F*(E_YE_X) \n");
print("E_CPS = E_HF + ECORR_CPS \n");
print(" \n");
print("F parameter : %16.2lf \n", F);
print("E_X : %16.12lf \n", E_X);
print("E_Y : %16.12lf \n", E_Y);
print("E_HF : %16.12lf \n", E_HF);
print("ECORR_CPS : %16.12lf \n", ECORR_CPS);
print("E_CPS : %16.12lf \n", E_CPS);
print(" \n");
print(" \n");
print("FINAL CPS ENERGY : %16.12lf \n", E_CPS);
print(" \n");
print(" \n");
End
The full Compound script can be found in the dropdown:
Compound script  CPS extrapolation
%compound
# Define variables
variable F = 1.5; # Empirical extrapolation factor
variable E_HF; # HartreeFock reference energy
variable E_X, E_Y; # Correlation energies at different TCutPNO thresholds
variable ECORR_CPS, E_CPS; # CPS correlation energy and the final CPS energy
variable basis_set = "ccpVTZ"; # Employed basis set
variable aux_basis = "ccpVTZ/C"; # Employed AUX/C basis
Variable highTCutPNO = 1e6; # high (more accurate) TCutPNO threshold
Variable lowTCutPNO = 1e5; # low (less accurate) TCutPNO threshold
#
# (Calculation 1)
# The calculation with the less accurate TCutPNO threshold
New_Step
! DLPNOCCSD(T1) &{basis_set} &{aux_basis} VeryTightSCF
% MDCI
TCutPNO &{lowTCutPNO}
END
*xyzfile 0 1 uracil.xyz
STEP_END
# Read energies
read E_HF = MDCI_REF_ENERGY[1];
read E_X = MDCI_CORR_ENERGY[1];
#
# (Calculation 2)
# The calculation with the high (more accurate) TCutPNO threshold
New_Step
! DLPNOCCSD(T1) &{basis_set} &{aux_basis} VeryTightSCF
% MDCI
TCutPNO &{highTCutPNO}
END
*xyzfile 0 1 uracil.xyz
STEP_END
# Read energies
read E_Y = MDCI_CORR_ENERGY[2];
#
ECORR_CPS = E_X+F*(E_YE_X);
E_CPS = E_HF + ECORR_CPS;
# CPS extrapolation printout
print(" \n");
print(" \n");
print(" COMPLETEPNOSPACE (CPS) EXTRAPOLATION \n");
print(" \n");
print(" \n");
print("CPS extrapolation via: ECORR_CPS = E_X+F*(E_YE_X) \n");
print("E_CPS = E_HF + ECORR_CPS \n");
print(" \n");
print("F parameter : %16.2lf \n", F);
print("E_X : %16.12lf \n", E_X);
print("E_Y : %16.12lf \n", E_Y);
print("E_HF : %16.12lf \n", E_HF);
print("ECORR_CPS : %16.12lf \n", ECORR_CPS);
print("E_CPS : %16.12lf \n", E_CPS);
print(" \n");
print(" \n");
print("FINAL CPS ENERGY : %16.12lf \n", E_CPS);
print(" \n");
print(" \n");
End
We now use this compound script to calculated extrapolated energies for the uracil dimer and its monomers and compare them:
Method 
Threshold 
ΔE 

DLPNOCCSD(T1)/ccpVTZ 
10^{5} 
10.36 
DLPNOCCSD(T1)/ccpVTZ 
10^{6} 
10.72 
DLPNOCCSD(T1)/ccpVTZ 
CPS(5,6) 
10.90 
DLPNOCCSD(T1)/ccpVTZ 
10^{7} 
10.91 
DLPNOCCSD(T1)/ccpVTZ 
CPS(6,7) 
11.01 
We see, that the CPS(5,6) extrapolated value is very close to that obtained with the thighter and thus more expensive TCutPNO = 10^{7} threshold. CPS(6,7) extrapolation still improves the interaction energy slightly.
Important
Note that for CPS extrapolation, it is recommended to keep all other DLPNO thresholds the same. In this example NormalPNO
thresholds were used and only TCutPNO was varied.
For details on the other thresholds, see the ORCA manual.
Example: twopoint CBS extrapolation (EP1)#
The full Compound script can be found in the dropdown:
Compound script  CBS extrapolation
# Name: ExtrapolateEP1MDCI
#
# *************************************** DESCRIPTION ***********************************************
#
# This protocol estimates the complete basis limit (CBS) extrapolated electronic energy. It extrapolates
# separately the SCF part and the correlation part. For the correlation part it works for all single
# reference methods (e.g. DLPNOCCSD, CCSD(T), CEPA ...etc.). In the current case we chose DLPNOCCSD(T1).
#
# *************************************** LITERATURE ************************************************
#
# A description of the notation we use here : J. Phys. Chem. A 2012, 116, 19, 48014816
# The exponents used for the extrapolations : J. Chem. Theory Comput., 7, 3343 (2011)
# Original formulation of the SCF extrapolation : J. Chem. Phys. 2008, 129, 184116
# Original formulation of the correlation extrapolation : J. Chem. Phys. 1997, 106, 9639
#
# *************************************** DETAILS ************************************************
#
# This scheme needs 2 steps:
# In Step 1 We perform an MDCI calculation with a basis set X (in the current case we have chosen
# ccpVDZ).
# In Step 2 We perform an MDCI calculation with a basis set Y that has a cardinal number larger than
# the basis set X by 1 (in the current case we have chosen ccpVTZ).
#
# From calculations in Step 1 and Step 2 we get the HartreeFock energy and calculate the
# SCF extrapolated energy (CBS_SCF) using the two point extrapolation equation:
# SCF(X) = SCF(CBS)+Aexp(a*SQRT(X))
# Similarly From calculations in Step 2 and Step 3 we get the correlation energy and calculate
# the CBS extrapolated MDCI correlation energy (CBS_MDCI) using the two point extrapolation
# equation:
# CBS(MDCI)=(X^b*E_X(MDCI)Y^b*E_Y(MDCI))/(X^bY^b):
# And thus the extrapolation energy:
# CBS Total = CBS_SCF + CBS_MDCI
#
# ****************************************** NOTES ************************************************
# NOTE 1: The basis sets chosen can of course change. Nevertheless one should always take care to adjust
# all of them appropriately and then to also adjust the values of alpha and beta.
# NOTE 1: In this case we use the default DLPNOCCSD(T1) method. Of course one can change to whatever
# method he prefers. Nothing more needs. Of course one should take care to use the same method
# on both calculations.#
# ****************************************** METHOD ************************************************
#
#
#Define some variables
Variable X, Y; #The cardinal numbers
Variable alpha, beta; #The exponents
Variable SCF_X, SCF_Y; #The SCF energies
Variable eX, eY; #Useful temporary intermediates
Variable corr_X, corr_Y; #The correlation energies
Variable CBS_SCF, CBS_corr; #The extrapolated components
Variable CBS_Total; #The extrapolated total energy
#
#
#These values depend on the choice of the basis set
#that we need
X = 2; #Double zeta
Y = 3; #triple zeta
alpha = 4.420; #based on F. Neese et al. JCTC, 7,3343 (2011)
beta = 2.460;
#
#
#Calculation with small basis set
#(Calculation 1)
New_Step
!DLPNOCCSD(T1) ccpVDZ ccpVTZ/C VeryTightSCF
%MaxCore 10000
Step_End
#Read the values
Read SCF_X = MDCI_REF_ENERGY[1];
Read corr_X = MDCI_CORR_ENERGY[1];
eX = exp(alpha*sqrt(X));
#
#
#MP2Calculation with larger basis set
#(Calculation 2)
New_Step
!DLPNOCCSD(T1) ccpVTZ ccpVTZ/C VeryTightSCF
%MaxCore 10000
Step_End
#Read the values
Read SCF_Y = MDCI_REF_ENERGY[2];
Read corr_Y = MDCI_CORR_ENERGY[2];
eY = exp(alpha*sqrt(Y));
#
#
#Extrapolate SCF
CBS_SCF = (SCF_X*eY  SCF_Y*eX)/(eYeX);
#
#Extrapolate the correlation energy
CBS_corr = (X^beta*corr_X  Y^beta*corr_Y)/(X^betaY^beta);
#
#Sum up
CBS_Total = CBS_SCF + CBS_corr;
#
#Final end
End
#
Method 
Basis Set 
ΔE 

DLPNOCCSD(T1) 
ccpVDZ 

DLPNOCCSD(T1) 
ccpVTZ 

DLPNOCCSD(T1) 
CBS(2,3) 

DLPNOCCSD(T1) 
ccpVQZ 

DLPNOCCSD(T1) 
CBS(3,4) 
Note
The default EP1 twopoint extrapolation with DLPNOCCSD(T1) within the Compound framework can also be envoked via the !COMPOUND(EXTRAPOLATEEP1MDCI)
simple keyword.
As CBS extrapolations are very useful, ORCA provides some very convenient simple input keywords for CBS extrapolations with frequently used basis set families. The basic syntax is:
! Extrapolate(n/m, bas)
Here, n
is the cardinal number of the small basis set, m
that of the large basis set, and bas
the basis set family. For example, we can do a DLPNOCCSD(T1) ccpVDZ/ccpVTZ extrapolation by:
! DLPNOCCSD(T1) Extrapolate(2/3, cc) ccpVTZ/C
If we want to extrapolate within Ahlrich's def2XVP basis sets, e.g. def2TZVP/def2QZVP, this can be envoked by:
! DLPNOCCSD(T1) Extrapolate(3/4, def2) def2QZVPP/C
Note
Do not forget to choose a suitable auxiliary basis for your calculations.