4. Coupled-Cluster
Coupled cluster methods are among the most accurate electronic structure methods available today. Its wave function ansatz is usually written in exponential form:
Where the cluster operator \(\hat{T}\) is defined as the sum of \(\hat{T}_{i}\) generates all possible determinants having the i-th excitations from the reference.
the first few components of cluster operator are
apply a similarity transformation, multiplying the CC Schrödinger equation in the form
the amplitudes should be optimized to determine the CC wave function. Unlike Hartree–Fock or CI wave function is optimized by variational principle, CC wave function is optimized by projecting.
by solving the nonlinear equations, the CC energy and amplitudes are determined.
4.1. Algorithm
Step 1: Build the Integral
The pre–computed quantities for the SCF algorithm include:
The nuclear repulsion energy \(E_{nuc}\).
One–electron integrals overlap \(\mathbf{S}\), kinetic energy \(\mathbf{T}\), and nuclear attraction \(\mathbf{V}\).
Two–electron integral, the electron repulsion \((\mu\nu\vert\lambda\sigma)\).
Please check out the Hamiltonian section for further information to learn more about the pre–computed quantities.
Step 2: Optimization of Molecular Orbital Coefficients
The Hartree-Fock method is an uncorrelated mean-field theory that offers a qualitative description of chemical systems. Although Hartree-Fock theory is only qualitatively correct, it forms the basis for more accurate models and becomes the cornerstone of ab initio quantum chemistry.
Please check out the Hartree-Fock section for further information.
Step 3: Transformation of Atomic Orbital to Molecular Orbital
With the optimized LCAO_MO coefficients, we can transform the operators from the atomic orbital basis to the molecular orbital basis.
For the one electron operators:
For the two electron operators:
Step 4: Build the Initial-Guess Cluster Amplitudes
For Hartree-Fock reference determinants, the most common initial guess for the cluster amplitudes are the Moller-Plesset first-order perturbed wave function:
Step 5: Calculate the CC Intermediates
The definition of three two–index intermediates \(\mathcal{F}\):
The definition of three four–index intermediates \(\mathcal{W}\):
The definition of effective double excitation operaotrs \(\tau\) and \(\tilde{\tau}\)
The denominator arrays are defined by
Step 6: Compute the Updated Cluster Amplitudes
Equation to compute the T1 cluster amplitudes.
Equation to compute the T2 cluster amplitudes.
Check for Convergence and Iterate Calculate the current CC correlation energy:
Compare energies and cluster amplitudes between iterations to check for convergence to some specified cutoff. If convergence is reached, you’re done; if not, return to third step and continue.
Step 7: Find the Perturbative Triples Correction
the disconnected and connected T3 have to be calculated. The disconnected is found as:
And the connected is found as:
In the above equations the following definitions is used:
The energy correction can now be found as:
4.2. Examples
CCSD
Truncating the cluster operator \(\hat{T}\) at doubles leads to the coupled cluster singles and doubles method(CCSD). By keeping only \(\hat{T}_1\) and \(\hat{T}_2\), we reach the balance between accuracy and computational time.
from moha import *
mol,orbs = IOSystem.from_file('../data/water.xyz','sto-3g.nwchem')
ham = ChemicalHamiltonian.build(mol,orbs)
wfn = HFWaveFunction(10,7,{'alpha':5,'beta':5})
scfsolver = PlainSCFSolver(ham,wfn)
hf_results = scfsolver.kernel()
ccsolver = CCSDSolver(ham,wfn,hf_results)
cc_results = ccsolver.kernel()
CCSD(T)
Based on CCSD, the addition of perturbative triple correction gives the CCSD(T) method the “gold standard” in computational chemistry. It is now one of the most accurate methods applicable to reasonably large molecules.
from moha import *
mol,orbs = IOSystem.from_file('../data/water.xyz','sto-3g.nwchem')
ham = ChemicalHamiltonian.build(mol,orbs)
wfn = HFWaveFunction(10,7,{'alpha':5,'beta':5})
scfsolver = PlainSCFSolver(ham,wfn)
hf_results = scfsolver.kernel()
ccsolver = CCSD_TSolver(ham,wfn,hf_results)
cc_results = ccsolver.kernel()