10.1. adc — Algebraic diagrammatic construction (ADC) scheme

The adc module is an implementation of algebraic diagrammatic construction theory for computation of spectroscopic properties. At the present moment the adc module supports computation of ionization potentials (IP) and electron affinties (EA) using three ADC approximations: ADC(2), ADC(2)-X, and ADC(3).

Computations using the adc module should be performed in three steps:

  1. Carry out a mean-field computation using the scf module to obtain ground-state (reference) molecular orbitals.

  2. Compute the ADC(n) ground-state energy and amplitudes. For the ADC(n) method, the ground-state energy and amplitudes correspond to those of the \(n\)-th order Møller–Plesset perturbation theory (MPn).

  3. Compute the ADC(n) spectroscopic properties (e.g., electron attachment energies and the corrresponding transition intensities)

An example of IP and EA computation using the default ADC method (ADC(2)) is shown below:

from pyscf import gto, scf, adc
mol = gto.M(atom='H 0 0 0; F 0 0 1', basis='ccpvdz')
mf = scf.RHF(mol).run()
myadc = adc.ADC(mf)
myadc.kernel()
e_ip,v_ip,p_ip = myadc.ip_adc(nroots=3)
e_ea,v_ea,p_ea = myadc.ea_adc(nroots=3)

Here, the kernel() function executes computation of the ADC(2) ground-state energy and amplitudes, which are used to perform calculation of the three lowest-energy IP and EA. Other methods of the ADC family can be requested by setting the method variable to ADC(2)-X or ADC(3), e.g.:

from pyscf import gto, scf, adc
mol = gto.M(atom='H 0 0 0; F 0 0 1', basis='ccpvdz')
mf = scf.RHF(mol).run()
myadc = adc.ADC(mf)
myadc.method = "adc(3)"
myadc.kernel()
e_ip,v_ip,p_ip = myadc.ip_adc(nroots=1)
e_ea,v_ea,p_ea = myadc.ea_adc(nroots=1)

An alternative way to run ADC computations is to directly call the kernel function of the corresponding ADC classes:

myadc = adc.ADC(mf)
myadc.kernel()
myadcip = adc.uadc.UADCIP(myadc)
myadcea = adc.uadc.UADCEA(myadc)
e_ip,v_ip,p_ip = myadcip.kernel(nroots=3)
e_ea,v_ea,p_ea = myadcea.kernel(nroots=3)

The ADC implementation in Pyscf can be used to perform calculations of electron affinities (EA) and ionization potentials (IP) for closed- and open-shell molecules starting with the RHF, ROHF, or UHF reference SCF wavefunctions, e.g.:

from pyscf import gto, scf, adc
mol = gto.M(atom='H 0 0 0; F 0 0 1', basis='ccpvdz', charge = 1, spin = 1)
mf = scf.UHF(mol).run()
myadc = adc.ADC(mf)
myadc.method = "adc(3)"
myadc.kernel()
e_ip,v_ip,p_ip = myadc.ip_adc(nroots=1)
e_ea,v_ea,p_ea = myadc.ea_adc(nroots=1)

When using results of this code for publications, please cite the following paper: “Third-order algebraic diagrammatic construction theory for electron attachment and ionization energies: Conventional and Green’s function implementation”, S. Banerjee and A.Y. Sokolov, J. Chem. Phys. 151, 224112 (2019).

10.1.1. Examples

examples/adc/01-closed_shell.py examples/adc/02-open_shell.py examples/adc/03-closed_shell_different_setup.py

10.1.2. Program reference

10.1.2.1. Algebraic Diagrammatic Construction

pyscf.adc.ADC(mf, frozen=None, mo_coeff=None, mo_occ=None)[source]

Ground state calculations

Attributes:
verboseint

Print level. Default value equals to Mole.verbose

max_memoryfloat or int

Allowed memory in MB. Default value equals to Mole.max_memory

incore_completebool

Avoid all I/O. Default is False.

methodstring

nth-order ADC method. Options are : ADC(2), ADC(2)-X, ADC(3). Default is ADC(2).

>>> mol = gto.M(atom = 'H 0 0 0; F 0 0 1.1', basis = 'ccpvdz')
>>> mf = scf.RHF(mol).run()
>>> myadc = adc.UADC(mf).run()

Saved results

e_corrfloat

MPn correlation correction

e_totfloat

Total energy (HF + correlation)

t1, t2 :

T amplitudes t1[i,a], t2[i,j,a,b] (i,j in occ, a,b in virt)

pyscf.adc.UADC(mf, frozen=None, mo_coeff=None, mo_occ=None)[source]

Ground state calculations

Attributes:
verboseint

Print level. Default value equals to Mole.verbose

max_memoryfloat or int

Allowed memory in MB. Default value equals to Mole.max_memory

incore_completebool

Avoid all I/O. Default is False.

methodstring

nth-order ADC method. Options are : ADC(2), ADC(2)-X, ADC(3). Default is ADC(2).

>>> mol = gto.M(atom = 'H 0 0 0; F 0 0 1.1', basis = 'ccpvdz')
>>> mf = scf.RHF(mol).run()
>>> myadc = adc.UADC(mf).run()

Saved results

e_corrfloat

MPn correlation correction

e_totfloat

Total energy (HF + correlation)

t1, t2 :

T amplitudes t1[i,a], t2[i,j,a,b] (i,j in occ, a,b in virt)

10.1.2.2. adc.uadc module and UADC class

The pyscf.adc.uadc.UADC class is the object to hold the unrestricted ADC environment attributes and results. The environment attributes are the parameters for the ground state as well as the excited state calculations.

Unrestricted algebraic diagrammatic construction

class pyscf.adc.uadc.UADC(mf, frozen=None, mo_coeff=None, mo_occ=None)[source]

Ground state calculations

Attributes:
verboseint

Print level. Default value equals to Mole.verbose

max_memoryfloat or int

Allowed memory in MB. Default value equals to Mole.max_memory

incore_completebool

Avoid all I/O. Default is False.

methodstring

nth-order ADC method. Options are : ADC(2), ADC(2)-X, ADC(3). Default is ADC(2).

>>> mol = gto.M(atom = 'H 0 0 0; F 0 0 1.1', basis = 'ccpvdz')
>>> mf = scf.RHF(mol).run()
>>> myadc = adc.UADC(mf).run()

Saved results

e_corrfloat

MPn correlation correction

e_totfloat

Total energy (HF + correlation)

t1, t2 :

T amplitudes t1[i,a], t2[i,j,a,b] (i,j in occ, a,b in virt)

kernel()[source]

Kernel function is the main driver of a method. Every method should define the kernel function as the entry of the calculation. Note the return value of kernel function is not strictly defined. It can be anything related to the method (such as the energy, the wave-function, the DFT mesh grids etc.).

class pyscf.adc.uadc.UADCEA(adc)[source]

unrestricted ADC for EA energies and spectroscopic amplitudes

Attributes:
verboseint

Print level. Default value equals to Mole.verbose

max_memoryfloat or int

Allowed memory in MB. Default value equals to Mole.max_memory

incore_completebool

Avoid all I/O. Default is False.

methodstring

nth-order ADC method. Options are : ADC(2), ADC(2)-X, ADC(3). Default is ADC(2).

conv_tolfloat

Convergence threshold for Davidson iterations. Default is 1e-12.

max_cycleint

Number of Davidson iterations. Default is 50.

max_spaceint

Space size to hold trial vectors for Davidson iterative diagonalization. Default is 12.

Kwargs:
nrootsint

Number of roots (eigenvalues) requested. Default value is 1.

>>> myadc = adc.UADC(mf).run()
>>> myadcea = adc.UADC(myadc).run()

Saved results

e_eafloat or list of floats

EA energy (eigenvalue). For nroots = 1, it is a single float number. If nroots > 1, it is a list of floats for the lowest nroots eigenvalues.

v_iparray

Eigenvectors for each EA transition.

p_eafloat

Spectroscopic amplitudes for each EA transition.

class pyscf.adc.uadc.UADCIP(adc)[source]

unrestricted ADC for IP energies and spectroscopic amplitudes

Attributes:
verboseint

Print level. Default value equals to Mole.verbose

max_memoryfloat or int

Allowed memory in MB. Default value equals to Mole.max_memory

incore_completebool

Avoid all I/O. Default is False.

methodstring

nth-order ADC method. Options are : ADC(2), ADC(2)-X, ADC(3). Default is ADC(2).

conv_tolfloat

Convergence threshold for Davidson iterations. Default is 1e-12.

max_cycleint

Number of Davidson iterations. Default is 50.

max_spaceint

Space size to hold trial vectors for Davidson iterative diagonalization. Default is 12.

Kwargs:
nrootsint

Number of roots (eigenvalues) requested. Default value is 1.

>>> myadc = adc.UADC(mf).run()
>>> myadcip = adc.UADC(myadc).run()

Saved results

e_ipfloat or list of floats

IP energy (eigenvalue). For nroots = 1, it is a single float number. If nroots > 1, it is a list of floats for the lowest nroots eigenvalues.

v_iparray

Eigenvectors for each IP transition.

p_ipfloat

Spectroscopic amplitudes for each IP transition.