15.1. Quick Guide

Before reading this section, please read the general introduction mentioned in General Remarks concerning Post-Hartree-Fock Calculations. This part of the Documentation builds upon it. The current version of PyBEST offers ionization potential (IP) calculations with a RpCCD (see The pCCD module) reference function using the Equation of Motion (EOM) formalism. The IP module is explained in greater detail below.

15.1.1. Supported features

The IP module supports spin-restricted orbitals and the DenseLinalgFactory and CholeskyLinalgFactory.

15.1.2. How to: RIP

This is a short introduction to the RIP module. More information on the input and output structure can be found in the following sections. Similar to the previous modules, we will assume the following names for all PyBEST objects

lf:

A LinalgFactory instance (see Preliminaries).

occ_model:

An Aufbau occupation model of the AufbauOccModel class

kin:

The kinetic energy integrals

ne:

The nucleus-electron attraction integrals

eri:

The two-electron repulsion integrals

Note

In all IP modules, only the spin projection is defined, that is, only the number of excess \(\alpha\) electrons over \(\beta\) electrons is defined.

15.1.2.1. RHF reference function

This version of PyBEST supports single IP-CCD, IP-CCSD, IP-LCCD, and IP-LCCSD with two different excitation operators

  • IP-CCD (RIPCCD):
    1. 1 hole (1h) operators

    2. 2 hole, 1 particle (2h1p) operators

  • IP-CCSD (RIPCCSD):
    1. 1 hole (1h) operators

    2. 2 hole, 1 particle (2h1p) operators

  • IP-LCCD (RIPLCCD):
    1. 1 hole (1h) operators

    2. 2 hole, 1 particle (2h1p) operators

  • IP-LCCSD (RIPLCCSD):
    1. 1 hole (1h) operators

    2. 2 hole, 1 particle (2h1p) operators

Complete examples can be found in the following subsections (Example Python scripts).

15.1.2.2. RpCCD reference function

This version of PyBEST supports single IP-pCCD, IP-fpCCD, IP-fpCCSD, IP-fpLCCD, and IP-fpLCCSD and double DIP-pCCD calculations with two different excitation operators

  • IP-pCCD (RIPpCCD):
    1. 1 hole (1h) operators

    2. 2 hole, 1 particle (2h1p) operators

  • IP-fpCCD (RIPfpCCD):
    1. 1 hole (1h) operators

    2. 2 hole, 1 particle (2h1p) operators

  • IP-fpCCSD (RIPfpCCSD):
    1. 1 hole (1h) operators

    2. 2 hole, 1 particle (2h1p) operators

  • IP-fpLCCD (RIPfpLCCD):
    1. 1 hole (1h) operators

    2. 2 hole, 1 particle (2h1p) operators

  • IP-fpLCCSD (RIPfpLCCSD):
    1. 1 hole (1h) operators

    2. 2 hole, 1 particle (2h1p) operators

  • DIP-pCCD (RDIPpCCD):
    1. 2 hole (2h) operators

    2. 3 hole, 1 particle (3h1p) operators

Complete examples can be found in the following subsections (Example Python scripts).

15.1.2.2.1. IP-CCD/IP-CCSD/IP-LCCD/IP-LCCSD: Doublet and quartet states

If you use this module, please cite [galynska2024].

We assume that you have performed a restricted CC calculation, whose results are stored in the IOData container cc_output (see The linearized coupled cluster module for LCC flavors and The restricted coupled-cluster module for conventional CC). The code snippet below shows how to perform a RIPCCSD calculation. The current version supports the optimization of doublet and quartet states. Both states can be optimized by setting the keyword argument alpha to 1 when creating an instance of RIPCCSD. The number of targeted states is passed through the nroot keyword argument in the function call.

# Calculate 3 lowest-lying roots for 1 unpaired electron (S_z=0.5)
# Both doublet and quartet states can be targeted
ip = RIPCCSD(lf, occ_model, alpha=1)
ip_output = ip(kin, ne, eri, cc_output, nroot=3)

The results are returned as a IOData container, while all results are saved to the pybest-results/checkpoint_IP-EOM-CCSD.h5 file. Specifically, the IOData container contains (amongst others) the following attributes

e_ip:

The ionization energies in \(E_h\)

civ_ip_alpha:

The CI vectors (that is, the eigenvectors) for each state (column) for a given alpha value

The eigenvalues and eigenvectors are stored as numpy arrays, not as instances of the LinalgFactory. Since for one spin projection \(S_z\), several spin multiplets are accessible, PyBEST suggests the multiplicity for each targeted state in the output file.

By default, RIPCCSD includes up to 2h1p terms. For alpha=1, the 2h1p terms can be neglected and only the 1h terms are considered during the diagonalization. The number of hole/particle operators is specified by the keyword argument nhole. The following code snippet shows how to perform a RIPCCSD calculation for 1 unpaired electron including only 1h terms,

# Calculate 3 lowest-lying roots for 1 unpaired electron (S_z=0.5) and 1h terms
# Both doublet and quartet states can be targeted
ip = RIPCCSD(lf, occ_model, alpha=1)
ip_output = ip(kin, ne, eri, cc_output, nroot=3, nhole=1)

Note

All remaining flavors (RIPCCD, RIPLCCD, and RIPLCCSD) are accessible in a similar way. To choose a different IP-CC flavor, simply change the RIPCCSD class to the desired CC model,

  • RIPCCD for IP-CCD

  • RIPLCCD for IP-LCCD

  • RIPLCCSD for IP-LCCSD

Note

A spin-free implementation is also available. It might help to eliminate convergence difficulties in some cases. If set to True, only doublet state can be targeted.

# Calculate 3 lowest-lying roots for 1 unpaired electron (S_z=0.5)
# Only doublet states can be targeted
ip = RIPCCSD(lf, occ_model, alpha=1, spinfree=True)
ip_output = ip(kin, ne, eri, cc_output, nroot=3)

15.1.2.2.2. IP-pCCD: Doublet and quartet states

If you use this module, please cite [boguslawski2021].

We assume that you have performed a restricted pCCD calculation (either with or without orbital optimization), whose results are stored in the IOData container pccd_output (see The pCCD module). The code snippet below shows how to perform a RIPpCCD calculation. The current version supports the optimization of doublet and quartet states and just quartet states. The former can be optimized by setting the keyword argument alpha to 1 when creating an instance of RIPpCCD, while the latter are accessible by choosing alpha=3. The number of targeted states is passed through the nroot keyword argument in the function call.

# Calculate 3 lowest-lying roots for 1 unpaired electron (S_z=0.5)
# Both doublet and quartet states can be targeted
ip = RIPpCCD(lf, occ_model, alpha=1)
ip_output = ip(kin, ne, eri, pccd_output, nroot=3)

The results are returned as a IOData container, while all results are saved to the pybest-results/checkpoint_IP-EOM-pCCD.h5 file. Specifically, the IOData container contains (amongst others) the following attributes

e_ip:

The ionization energies in \(E_h\)

civ_ip_alpha:

The CI vectors (that is, the eigenvectors) for each state (column) for a given alpha value

The eigenvalues and eigenvectors are stored as numpy arrays, not as instances of the LinalgFactory. Since for one spin projection \(S_z\), several spin multiplets are accessible, PyBEST suggests the multiplicity for each targeted state in the output file.

By default, RIPpCCD includes up to 2h1p terms. For alpha=1, the 2h1p terms can be neglected and only the 1h terms are considered during the diagonalization. The number of hole/particle operators is specified by the keyword argument nhole. The following code snippet shows how to perform a RIPpCCD calculation for 1 unpaired electron including only 1h terms,

# Calculate 3 lowest-lying roots for 1 unpaired electron (S_z=0.5) and 1h terms
# Both doublet and quartet states can be targeted
ip = RIPpCCD(lf, occ_model, alpha=1)
ip_output = ip(kin, ne, eri, pccd_output, nroot=3, nhole=1)

Note

For three unpaired electrons, only 2h1p terms are supported. Specifying nhole=1 will raise an error.

Note

A spin-free implementation is also available. It might help to eliminate convergence difficulties in some cases. If set to True, only doublet state can be targeted.

# Calculate 3 lowest-lying roots for 1 unpaired electron (S_z=0.5)
# Only doublet states can be targeted
ip = RIPCCSD(lf, occ_model, alpha=1, spinfree=True)
ip_output = ip(kin, ne, eri, cc_output, nroot=3)

15.1.2.2.3. IP-fpCCD/IP-fpCCSD/IP-fpLCCD/IP-fpLCCSD: Doublet and quartet states

If you use this module, please cite [galynska2024].

We assume that you have performed a restricted frozen-pair (fp)CC calculation, whose results are stored in the IOData container cc_output (see The linearized coupled cluster module for LCC flavors on top of pCCD and The restricted frozen-pair coupled-cluster module for supported fpCC models). The code snippet below shows how to perform a RIPfpCCSD calculation. The current version supports the optimization of doublet and quartet states. Both states can be optimized by setting the keyword argument alpha to 1 when creating an instance of RIPfpCCSD. The number of targeted states is passed through the nroot keyword argument in the function call.

# Calculate 3 lowest-lying roots for 1 unpaired electron (S_z=0.5)
# Both doublet and quartet states can be targeted
ip = RIPfpCCSD(lf, occ_model, alpha=1)
ip_output = ip(kin, ne, eri, cc_output, nroot=3)

The results are returned as a IOData container, while all results are saved to the pybest-results/checkpoint_IP-EOM-fpCCSD.h5 file. Specifically, the IOData container contains (amongst others) the following attributes

e_ip:

The ionization energies in \(E_h\)

civ_ip_alpha:

The CI vectors (that is, the eigenvectors) for each state (column) for a given alpha value

The eigenvalues and eigenvectors are stored as numpy arrays, not as instances of the LinalgFactory. Since for one spin projection \(S_z\), several spin multiplets are accessible, PyBEST suggests the multiplicity for each targeted state in the output file.

By default, RIPfpCCSD includes up to 2h1p terms. For alpha=1, the 2h1p terms can be neglected and only the 1h terms are considered during the diagonalization. The number of hole/particle operators is specified by the keyword argument nhole. The following code snippet shows how to perform a RIPfpCCSD calculation for 1 unpaired electron including only 1h terms,

# Calculate 3 lowest-lying roots for 1 unpaired electron (S_z=0.5) and 1h terms
# Both doublet and quartet states can be targeted
ip = RIPfpCCSD(lf, occ_model, alpha=1)
ip_output = ip(kin, ne, eri, cc_output, nroot=3, nhole=1)

Note

All remaining flavors (RIPfpCCD, RIPfpLCCD, and RIPfpLCCSD) are accessible in a similar way. To choose a different IP-CC flavor, simply change the RIPfpCCSD class to the desired CC model,

  • RIPfpCCD for IP-fpCCD

  • RIPfpLCCD for IP-fpLCCD

  • RIPfpLCCSD for IP-fpLCCSD

Note

A spin-free implementation is also available. It might help to eliminate convergence difficulties in some cases. If set to True, only doublet state can be targeted.

# Calculate 3 lowest-lying roots for 1 unpaired electron (S_z=0.5)
# Only doublet states can be targeted
ip = RIPfpCCSD(lf, occ_model, alpha=1, spinfree=True)
ip_output = ip(kin, ne, eri, cc_output, nroot=3)

15.1.2.2.4. DIP-pCCD: Singlet, triplet, and quintet states

If you use this module, please cite [boguslawski2021].

We assume that you have performed a restricted pCCD calculation (either with or without orbital optimization), whose results are stored in the IOData container pccd_output (see The pCCD module). The code snippet below shows how to perform a RDIPpCCD calculation. The current version supports the optimization of singlet, triplet, and quintet states, triplet and quintet states, or just quintet states. The first case can be optimized by setting the keyword argument alpha to 0 when creating an instance of RDIPpCCD, the second case is accessible by choosing alpha=2, while the last spin multiplicity can be chosen by setting alpha=4. The number of targeted states is passed through the nroot keyword argument in the function call.

# Calculate 3 lowest-lying roots for 0 unpaired electron (S_z=0.0)
# Singlet, triplet, and quintet states can be targeted
ip = RDIPpCCD(lf, occ_model, alpha=0)
ip_output = ip(kin, ne, eri, pccd_output, nroot=3)

The results are returned as a IOData container, while all results are saved to the pybest-results/checkpoint_DIP-EOM-pCCD.h5 file. Specifically, the IOData container contains (amongst others) the following attributes

e_ip:

The ionization energies in \(E_h\)

civ_ip_alpha:

The CI vectors (that is, the eigenvectors) for each state (column) for a given alpha value

The eigenvalues and eigenvectors are stored as numpy arrays, not as instances of the LinalgFactory. Since for one spin projection \(S_z\), several spin multiplets are accessible, PyBEST suggests the multiplicity for each targeted state in the output file.

By default, RDIPpCCD includes up to 3h1p terms. For alpha=0 and alpha=2, the 3h1p terms can be neglected so that only the 2h terms are considered during the diagonalization. The number of hole/particle operators is specified by the keyword argument nhole. The following code snippet shows how to perform a RDIPpCCD calculation for 0 unpaired electron including only 2h terms,

# Calculate 3 lowest-lying roots for 1 unpaired electron (S_z=0.0) and 2h terms
# Singlet and triplet states can be targeted
ip = RDIPpCCD(lf, occ_model, alpha=0)
ip_output = ip(kin, ne, eri, pccd_output, nroot=3, nhole=2)

Note

For four unpaired electrons (qunitet states), only 3h1p terms are supported. Specifying nhole=2 will raise an error.

15.1.2.3. Defining a frozen core

By default, all core orbitals are frozen. If a frozen core has been selected in the CC reference calculation, the same orbitals have to be frozen in the chosen IP flavor. To freeze some specific (occupied) orbitals, the number of frozen cores has to be specified when an instance of some OccupationModel class is created. For instance, if you wish to freeze the first 4 (occupied) orbitals in an IP-pCCD calculation, specify the ncore argument during the initialization of some occupation model class,

# Select 4 frozen core orbital
#-----------------------------
occ_model = AufbauOccModel(gobasis, ncore=4)
# Perform IP-CC calculation for 1 unpaired electron (S_z=0.5),
# ncore is stored in occ_model
#-------------------------------------------------------------
ip = RIPpCCD(lf, occ_model, alpha=1)
ip_output = ip(kin, ne, eri, pccd_output)

This syntax is working for all IP modules mentioned above.

15.1.2.4. Restart options

Restart options are not supported yet.