Getting Started

Installation

PyCC runs on top of Psi4, which supplies the reference wavefunction and the integrals. The simplest way to get a working environment is with conda (Psi4 is most easily installed that way). You will need:

With those in place, install PyCC in developer mode from the repository root:

pip install -e .

Usage

PyCC starts from a converged Psi4 RHF reference wavefunction; every method is built on top of it. The examples below are self-contained.

Coupled-cluster energy

import psi4
import pycc

psi4.geometry("""
O
H 1 0.96
H 1 0.96 2 104.5
""")
psi4.set_options({'basis': 'cc-pVDZ'})
_, wfn = psi4.energy('SCF', return_wfn=True)

# model can be 'CCD', 'CC2', 'CCSD', 'CCSD(T)', or 'CC3'
cc = pycc.CCwfn(wfn, model='CCSD')
ecc = cc.solve_cc(e_conv=1e-8, r_conv=1e-7, maxiter=75)

Lambda amplitudes and densities

Once the ground-state amplitudes are converged, build the similarity-transformed Hamiltonian, solve the lambda equations, and form the one- and two-particle reduced density matrices:

hbar = pycc.cchbar(cc)
cclambda = pycc.cclambda(cc, hbar)
lcc = cclambda.solve_lambda(e_conv=1e-8, r_conv=1e-7)
density = pycc.ccdensity(cc, cclambda)

MP2 energy

emp2 = pycc.MPwfn(wfn).compute_energy()

Hartree-Fock derivative properties

HFwfn provides MO-basis analytic derivative properties of the RHF reference – the ingredients for IR and VCD spectra:

hf = pycc.HFwfn(wfn)
grad  = hf.gradient()              # nuclear gradient             (natom, 3)
hess  = hf.hessian()               # nuclear Hessian              (3*natom, 3*natom)
alpha = hf.polarizability()        # static dipole polarizability (3, 3)
apt   = hf.dipole_derivatives()    # atomic polar tensors         (natom, 3, 3)
aat   = hf.atomic_axial_tensors()  # atomic axial tensors         (natom, 3, 3)

The nuclear coupled-perturbed Hartree-Fock (CPHF) response is solved once and cached, so computing the Hessian and then the dipole/axial tensors does not repeat that work.

GPU and mixed precision

The canonical ground-state and real-time CC methods can run on a GPU and/or in single precision (PyTorch required):

cc = pycc.ccwfn(wfn, device='GPU', precision='SP')