ADC: Ab Initio Polarization Propagator¶
Section author: Michael F. Herbst
Module: Keywords, PSI Variables
Algebraicdiagrammatic construction methods for the polarization propagator (ADC) determine correlated excitation energies by investigating the pole structure of said propagator. For this the propagator is expressed in a representation constructed from socalled intermediate states, which in turn are based upon a correlated Møller–Plesset (MP) ground state. The original derivation of the ADC scheme was purely diagrammatic [Schirmer:1982] and the connect to the intermediate states was developed only later [Trofimov:2006]. In general \(n\)th order ADC theory, ADC(\(n\)), is constructed upon an \(n\)th order MP ground state. In this sense one can consider an ADC(\(n\)) treatment of excited states consistent to an MP(\(n\)) perturbation expansion of the ground state.
In ADC methods the residue calculus of the propagator is translated into an eigenvalue problem with respect to the socalled shifted Hamiltonian or ADC matrix. Denoting this matrix as \(\mathbf{A}\), the eigenproblem can be written in terms of several blocks
where S refers to the single and D to the double excitation manifolds. This matrix is typically sparse and thus may be diagonalised iteratively, for example using Davidson’s method [Dreuw:2014:82]. An alternative viewpoint has been addressed for example in [Haettig:2002], where ADC(2) is related to other response theories such as CC2LR, CIS(D) and CIS(D\(_n\)). In this sense one may consider the ADC matrix the correlated response matrix to a response problem based on CIS and apply the simultaneous expansion method (SEM), in which the σvectors (ADC matrixvector products) are constructed several times.
The structure and order of the blocks in the equation above depend on the ADC level employed. With this also the computational cost changes. The key computational step, namely the formation of the matrixvector products scales as \({\cal O}(N^5)\) for ADC(2) and \({\cal O}(N^6)\) for ADC(2)x and ADC(3). Several additional approximations, such as frozencore, frozenvirtual may be applied to reduce the cost of the problem. Using the corevalence separation (CVS) approximation one may specifically target corevalenceexcitations at a substantial reduction in cost. With the spinflip modification fewreference ground states can be tackled starting from a triplet reference by simultaneously exciting an electron and flipping its spin. A more detailed overview of such modifications gives [Dreuw:2014:82] and the adcc theory documentation.
Available ADC methods¶
Section author: Michael F. Herbst
Several ADC methods are available in PSI4 for the computation of excited states, see ADC capabilities of Psi4. The methods are available via an interface to the adcc python module. After a more general introduction, specific aspects of the implementation will be highlighted in section Interface to adcc.
Method 
References 
Exc. Energies 
Props 
Supported values for kind keyword 

ADC(1) 
RHF, UHF 
yes 
yes 
any, singlet, triplet, spin_flip 
ADC(2) 
RHF, UHF 
yes 
yes 
any, singlet, triplet, spin_flip 
ADC(2)x 
RHF, UHF 
yes 
yes 
any, singlet, triplet, spin_flip 
ADC(3) 
RHF, UHF 
yes 
yes  any, singlet, triplet, spin_flip 

CVSADC(1) 
RHF, UHF 
yes 
yes  any, singlet, triplet 

CVSADC(2) 
RHF, UHF 
yes 
yes 
any, singlet, triplet 
CVSADC(2)x 
RHF, UHF 
yes 
yes 
any, singlet, triplet 
CVSADC(3) 
RHF, UHF 
yes 
yes 
any, singlet, triplet 
The leftmost column of table ADC capabilities of Psi4 provides the supported ADC methods.
If only excitation energies are desired, one can simply pass one
of the listed method strings to the function energy()
.
For example, energy('adc(2)x')
will compute
excitation energies at ADC(2)x level.
Properties such as oscillator strengths, transition or state dipole moments
are available by calling the function properties()
with appropriate arguments.
Most commonly users will want to compute at least oscillator strengths
along with the excitation energies,
resulting in a call like properties('adc(2)', properties=["oscillator_strength"])
.
Running ADC calculations¶
Section author: Michael F. Herbst
Running an ADC calculation with PSI4 requires
the call to properties()
as discussed above
as well as one or more mandatory keyword arguments.
The most important keyword argument is ROOTS_PER_IRREP, which is an array with the number of excited states desired for each irreducible representation. Most ADC methods are only supported at C1 symmetry at the moment, such that this option should in most cases be set to an array with a single element only. For example one can run an ADC(2) calculation for 10 (singlet) excited states using:
set roots_per_irrep [10]
properties('adc(2)', properties=["oscillator_strength"])
where the molecule
section was dropped for brevity.
Selecting the excitation manifold.
To select between the possible excitation manifolds,
use the KIND keyword. For restricted references
by default only singlet excited states are computed,
corresponding to the keyword value 'singlet'
.
To compute triplet states, select 'triplet'
.
To compute both without making a spin distinction, select 'any'
.
The latter is default for unrestricted references.
The special KIND value 'spin_flip'
selects
a spinflip computation where a simultaneous flip of spin
and excitation is performed. This is only available
for unrestricted references and not for CVSADC(n)
methods,
see table ADC capabilities of Psi4.
Using the corevalence separation.
For tackling corevalence excitations using the CVSADC(n)
methods, the keyword argument NUM_CORE_ORBITALS
is additionally required. It is used to specify the number of
(spatial) orbitals to put into the core space and thus select
as target orbitals for a corevalence excitation process.
A value of 2
indicates, for example,
that the two lowestenergy \(\alpha\) and the two
lowestenergy \(\beta\) orbitals are placed in the core space.
Since the implemented ADC procedures tackle the
lowestenergy excitations, the value should be specified
such that the targeted core orbital is just inside the core space.
Example: Consider furane, \(C_4H_4O\). In order to tackle
the oxygen 1s edge, i.e simulate a O 1s XAS spectrum, one may
just set NUM_CORE_ORBITALS to 1
. This will select the
oxygen 1s orbital for the core space as it is energetically the lowest.
For C 1s core excitations the NUM_CORE_ORBITALS value needs
to be set to 5
, such that both the O 1s and all four C 1s orbitals
are part of the core space.
Other keywords and examples. Apart from the mentioned keywords, the following are common:
REFERENCE¶
Reference wavefunction type
Type: string
Possible Values: RHF, UHF
Default: RHF
R_CONVERGENCE¶
Convergence threshold for ADC matrix diagonalisation. Negative values keep the * adcc default (1e6)
Type: conv double
Default: 1
NUM_GUESSES¶
Number of guess vectors to generate and use. Negative values keep * the adcc default (currently 2 * ROOTS_PER_IRREP). This option is only available for the adcc backend.
Type: integer
Default: 1
CUTOFF_AMPS_PRINT¶
Tolerance for extracted or printed amplitudes. This option is only available for the adcc backend.
Type: double
Default: 0.01
The full list is provided in appendix ADC and many more sample input files can be found in the adc and adcc subfolders of psi4/samples. Note, that not all keywords are supported by all backends.
Interface to adcc¶
Code author: Michael F. Herbst
Section author: Michael F. Herbst
For most implemented ADC methods PSI4 relies on an interface to the adcc python package. The approach of adcc is to directly diagonalise the ADC matrix \(\mathbf{A}\) in an iterative diagonalisation procedure, usually a Jacobipreconditioned Davidson. Expensive parts of the ADC matrixvector product are precomputed and stored in memory. This approach is general in the sense that it can be applied to a large range of ADC methods and variants. So far levels up to ADC(3) and CVSADC(3) are available and additional approximations such as FREEZE_CORE and NUM_FROZEN_UOCC are supported with all ADC methods using the adcc backend.
Currently adcc is only capable of performing incore calculations, for which, however, permutational symmetry and spin symmetry is taken into account for both tensor computations and tensor storage. Inside adcc some heuristic checks for overly excessive memory requirements are implemented, resulting in a warning in case a successful execution is unlikely. There are no guarantees for the memory to be sufficient in case such a warning is not displayed.
More detailed documentation about adcc and its features can be found at https://adcconnect.org, especially the theory section. If you are using adcc from PSI4 for your calculations, please cite both PSI4 as well as adcc [Herbst2020] in your published work.
The ADC wavefunction object.
After running the ADC calculation in adcc, the interface code sets
a number of variables in the returned Wavefunction
in case they are computed.
In the following the <method>
prefix refers to the ADC method (such as adc(1)
,
adc(3)
, cvsadc(2)x
).
Ground state energy terms like
MP2 correlation energy
,MP3 correlation energy
,MP2 total energy
,MP3 total energy
,current correlation energy
andcurrent energy
.MP2 dipole X
and the other components: Ground state dipole moments at MP(2) level.number of iterations
: The number of iterations the iterative solver required to converge.number of excited states
: The number of excited states, which were computed.More variables are summarized in PSI Variables by Alpha.
The following attribute is set on returned wavefunctions:
adcc_state
: The adcc.ExcitedStates object used by adcc to store the ADC(n) excitation energies and all precomputed data in the format used by adcc. Provides direct access to analysis and plotting capabilities from adcc. For exampleadcc_state.plot_spectrum()
plots a broadened excited states spectrum in matplotlib. See the adcc calculations documentation for details.
Tips for convergence issues. If you encounter convergence issues inside adcc, the following parameters are worth tweaking:
MAX_NUM_VECS: Specifies the maximal number of subspace vectors in the JacobiDavidson scheme before a restart occurs. The defaults are usually good, but do not be shy to increase this value if you encounter convergence problems.
NUM_GUESSES: By default adcc uses twice as many guess vectors as states to be computed. Sometimes increasing this value by a few vectors can be helpful. If you encounter a convergence to zero eigenvalues, than decreasing this parameter might solve the problems.