12.2. The Configuration Interaction Module on top of RHF

12.2.1. Summary of keyword arguments

The RCIS, RCID, and RCISD modules support various keyword arguments that allow the user to steer the process of the RCIS/RCID/RCISD Hamiltonian diagonalization. In the following, all supported keyword arguments are listed together with their default values. Please note that the default values should be sufficient to reach convergence in simple systems.

nroot

(int) The number of states (default: 1; ground state for RCID/RCISD; first excited state for RCIS)

nguessv

(int) Total number of guess vectors (default: (nroot-1)*4+1)

tolerance

(float) Tolerance for energies (default: 1e-6)

tolerancev

(float) Tolerance for eigenvectors (default: 1e-5)

maxiter

(int) Maximum number of iterations (default: 200).

threshold

(float) Printing tolerance for contributions of RCI wave function (default: 0.1).

maxvectors

(int) Maximum number of Davidson vectors (default: nroot*10)

scc

(boolean) Determines whether a size-consistency correction is to be calculated (default: True)

threshold_c_0

A threshold that helps to verify the accuracy of Davidson-type corrections

print_csf

(boolean) Decides in which variant (True: CSF; False: SD) the results will be printed (default: False)

12.2.2. Relation between Configuration State Function and Slater Determinant

A Configuration State Function (CSF) is a symmetry-adapted linear combination of Slater determinants (SD). Below, we illustrate the exact relations between CSF and SD for singly- and doubly-excited configurations. To distinguish between the SD and CSF representation, the individual components of an SD will be denoted with normal size letters, while capitalized letters are used for CSFs.

The relation for single excitations is as follows

(12.1)\[\vert ^{\textrm{A}} _{\textrm{I}}\rangle = \frac{1}{\sqrt{2}} (\vert ^a_i \rangle + \vert ^{\bar{a}} _{\bar{i}} \rangle),\]

while the relation for double excitations is more complicated and can be expressed as a set of equations

(12.2)\[\vert ^{\textrm{A} \textrm{A}} _{\textrm{I}\textrm{I}}\rangle = \vert ^{a \bar{a}} _{i\bar{i}}\rangle\]
(12.3)\[\vert ^{\textrm{A} \textrm{B}} _{\textrm{I} \textrm{I}}\rangle = \frac{1}{\sqrt{2}} (\vert ^{a \bar{b}} _{i\bar{i}} \rangle + \vert ^{b \bar{a}} _{i\bar{i}} \rangle),\]
(12.4)\[\vert ^{\textrm{A} \textrm{A}} _{\textrm{I} \textrm{J}}\rangle = \frac{1}{\sqrt{2}} (\vert ^{a \bar{a}} _{i\bar{j}} \rangle + \vert ^{a \bar{a}} _{j\bar{i}} \rangle),\]
(12.5)\[_{A}\vert ^{\textrm{A} \textrm{B}} _{\textrm{I} \textrm{J}}\rangle = \frac{1}{\sqrt{12}} (\vert ^{ab} _{ij} \rangle + \vert ^{\bar{a} \bar{b}} _{\bar{i}\bar{j}} \rangle + \vert ^{a \bar{b}} _{i\bar{j}} \rangle + \vert ^{b \bar{a}} _{j\bar{i}} \rangle - \vert ^{a \bar{b}} _{j\bar{i}} \rangle - \vert ^{b \bar{a}} _{i\bar{j}} \rangle),\]
(12.6)\[_{B}\vert ^{\textrm{A} \textrm{B}} _{\textrm{I} \textrm{J}}\rangle = \frac{1}{2} (\vert ^{a \bar{b}} _{i\bar{j}} \rangle + \vert ^{b \bar{a}} _{j\bar{i}} \rangle + \vert ^{a \bar{b}} _{j\bar{i}} \rangle + \vert ^{b \bar{a}} _{i\bar{j}} \rangle),\]

12.2.3. Setting up calculations using CSFs and SDs

By default, all variants of RCI classes perform a calculation using the CSF representation. To change this and use an SD basis instead, the csf argument has to be set to False at the creation of an instance of the chosen RCI class. The following code snippet shows how to use this option

rcis = RCIS(lf, occ_model, csf=False)

rcid = RCID(lf, occ_model, csf=False)

rcisd = RCISD(lf, occ_model, csf=False)

12.2.4. Frozen core RCI

By default, all core orbitals are frozen. To freeze some specific (occupied) orbitals, the number of frozen cores has to be specified during the instantiation of some occupation module class. The code snippet below shows how to freeze the first (occupied) orbital in a RCIS, RCID, RCISD calculation, by specifying the ncore argument during the instantiation of the chosen occupation model

# Select one frozen core orbital
#-------------------------------
occ_model = AufbauOccModel(basis, ncore=1)
# Perform CI calculation, ncore is stored in occ_model
#-----------------------------------------------------
rcis = RCIS(lf, occ_model)
rcis_output = rcis(kin, ne, eri, hf_output)

rcid = RCID(lf, occ_model)
rcid_output = rcid(kin, ne, eri, hf_output)

rcisd = RCISD(lf, occ_model)
rcisd_output = rcisd(kin, ne, eri, hf_output)

12.2.5. Core-valence separation approximation RCI

The RCI module enables the calculation of X-ray absorption spectra by making use of the core-valence separation (CVS) approximation. The CVS approximation is currently only available in the RCIS class. To make use of CVS, one has to first specify a set of active core orbitals at the instantiation of the AufbauOccModel. Additionally, the cvs option has to be set to True when instantiating the RCIS object. The code snippet below shows how to set the N 1s orbitals of uracil (C4H4N2O2) as the active core orbitals and perform a CVS-RCIS calculation. In this example, the O 1s orbitals (lower in energy compared to N 1s) will be frozen, while the C 1s orbitals (higher in energy compared to N 1s) will be treated as part of the valence shell. In CVS-RCIS, the excitation space is restricted to excitations from the active core orbitals. This means that the lowest energy eigenvectors obtained by diagonalizing the Hamiltonian will correspond to core-excited states.

# Select two frozen core orbitals and two active core orbitals
#-------------------------------------------------------------
occ_model = AufbauOccModel(basis, ncore=2, nactc=2)
# Perform CI calculation, ncore and nactc are stored in occ_model
#----------------------------------------------------------------
rcis = RCIS(lf, occ_model, cvs=True)
rcis_output = rcis(kin, ne, eri, hf_output)

12.2.6. Size-consistency Corrections

The RCI module allows you to calculate Davidson-type corrections for the ground state. The following variants of Davidson-type corrections are supported

  • Davidson: [davidson-corr]

    (12.7)\[E_{DC}=(1-{c_{0}}^2)(E_{RCI} - E_{RF})\]
  • Renormalized Davidson: [scc-overview]

    (12.8)\[E_{RDC}=\left(\frac{1-{c_{0}}^2}{{c_{0}}^2}\right)(E_{RCI} - E_{RF})\]
  • Modified Pople: [scc-overview]

    (12.9)\[E_{PC}=E_{RDC}\left(1-\frac{2}{n_e}\right)\]
  • Meissner: [meissner-overview]

    (12.10)\[E_{MC}=E_{RDC}\left( \frac{(n_e-2)(n_e-3)}{n_e(n_e-1)} \right)\]
  • Duch and Diercksen: [duch1994]

    (12.11)\[E_{DDC}=E_{RCI}\left(\frac{1-{c_{0}}^2}{2\left(\frac{n_e-1}{n_e-2}\right)c_0^2-1} \right),\]

where \(E_{RCI}\) indicates the total energy of the RCI method, \(E_{RF}\) is the energy of the reference method, \(c_0\) is the contribution of the reference determinant of the reference method, and \(n_e\) denotes the total number of electrons in the system.

Note

Please note that PyBEST supports size-consistency calculations for two variants of the RCI module: RCID and RCISD. The size-consistency corrections are calculated directly by setting the scc keyword argument to True (see also Summary of keyword arguments). By default, all size-consistency corrections are calculated.