Py SCF 1.4 Manual

User Manual:

Open the PDF directly: View PDF PDF.
Page Count: 275

DownloadPy SCF-1.4 Manual
Open PDF In BrowserView PDF
PySCF Documentation
Release 1.4.0

Qiming Sun 

Oct 12, 2017

CONTENTS

1

Contents
1.1 An overview of PySCF . . . . . . . . . . .
1.2 Tutorial . . . . . . . . . . . . . . . . . . .
1.3 Advanced topics . . . . . . . . . . . . . .
1.4 Installation . . . . . . . . . . . . . . . . .
1.5 gto — Molecular structure and GTO basis .
1.6 lib . . . . . . . . . . . . . . . . . . . . . .
1.7 scf . . . . . . . . . . . . . . . . . . . . .
1.8 ao2mo . . . . . . . . . . . . . . . . . . .
1.9 mcscf . . . . . . . . . . . . . . . . . . . .
1.10 fci . . . . . . . . . . . . . . . . . . . . . .
1.11 symm . . . . . . . . . . . . . . . . . . . .
1.12 df — density fitting . . . . . . . . . . . . .
1.13 dft . . . . . . . . . . . . . . . . . . . . . .
1.14 tools . . . . . . . . . . . . . . . . . . . .
1.15 Benchmark . . . . . . . . . . . . . . . . .
1.16 General . . . . . . . . . . . . . . . . . . .
1.17 Version history . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

3
3
5
18
27
29
74
80
128
137
150
156
158
159
173
176
176
178

Python Module Index

179

Index

181

i

ii

PySCF Documentation, Release 1.4.0

PySCF is a collection of electronic structure programs powered by Python. The package aims to provide a simple,
light-weight, and efficient platform for quantum chemistry calculations and code development. The program is developed with the following principles:
• Easy to install, to use, to extend and to be embedded;
• Minimal requirements on libraries (no Boost or MPI) and computing resources (perhaps sacrificing efficiency
to reduce I/O);
• 90/10 Python/C (only computational hot spots are written in C);
• 90/10 functional/OOP (unless performance critical, functions are pure).

CONTENTS

1

PySCF Documentation, Release 1.4.0

2

CONTENTS

CHAPTER

ONE

CONTENTS

1.1 An overview of PySCF
Python-based simulations of chemistry framework (PYSCF) is a general-purpose electronic structure platform designed from the ground up to emphasize code simplicity, so as to facilitate new method development and enable
flexible computational workflows. The package provides a wide range of tools to support simulations of finite-size
systems, extended systems with periodic boundary conditions, low-dimensional periodic systems, and custom Hamiltonians, using mean-field and post-mean-field methods with standard Gaussian basis functions. To ensure ease of
extensibility, PYSCF uses the Python language to implement almost all of its features, while computationally critical
paths are implemented with heavily optimized C routines. Using this combined Python/C implementation, the package
is as efficient as the best existing C or Fortran- based quantum chemistry programs.

1.1.1 Features
• Hartree-Fock (up to ~5000 basis)
– Non-relativistic restricted open-shell, unrestricted HF
– Scalar relativistic HF
– 2-component relativistic HF
– 4-component relativistic Dirac-Hartree-Fock
– Density fitting HF
– Second order SCF
– General JK contraction function
– DIIS, EDIIS, ADIIS and second order solver
– SCF wavefunction stability analysis
– Generalized Hartree-Fock (GHF)
• DFT (up to ~5000 basis)
– Non-relativistic restricted, restricted open-shell, unrestricted Kohn-Sham
– Scalar relativistic DFT
– Density fitting DFT
– General XC functional evaluator (for Libxc or XcFun)
– General AO evaluator
• TDDFT
3

PySCF Documentation, Release 1.4.0

– TDHF (and density-fitting TDHF)
– TDDFT (and density-fitting TDDFT)
– TDHF gradients
– TDDFT gradients
• General CASCI/CASSCF solver (up to ~3000 basis)
– State-average CASCI/CASSCF
– State-specific CASCI/CASSCF for excited states
– Multiple roots CASCI
– Support DMRG as plugin CI solver to do DMRG-CASSCF
– Support FCIQMC as plugin CI solver to do FCIQMC-CASSCF
– UHF-based UCASSCF
– Density-fitting CASSCF
– DMET-CAS and AVAS active space constructor
• MP2 (up to ~200 occupied, ~2000 virtual orbitals)
– Canonical MP2
– Density-fitting MP2
– MP2-F12
• CCSD (up to ~100 occupied, ~1500 virtual orbitals)
– canonical RCCSD, UCCSD
– canonical RCCSD, UCCSD lambda solver
– RCCSD and UCCSD 1-particle and 2-particle density matrices
– CCSD gradients
– EOM-IP/EA/EE-CCSD
– RCC2
– Density-fitting CCSD
• CCSD(T)
– Canonical RCCSD(T) and UCCSD(T)
– Canonical RCCSD(T) 1- and 2-particle density matrices
– Canonical RCCSD(T) gradients
• CI
– RCISD and UCISD
– RCISD and UCISD 1, 2-particle density matrices
– Selected-CI
– Selected-CI 1, 2-particle density matrices
• Full CI
– Direct-CI solver for spin degenerated Hamiltonian

4

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

– Direct-CI solver for spin non-degenerated Hamiltonian
– 1, and 2-particle transition density matrices
– 1, 2, 3, and 4-particle density matrices
– CI wavefunction overlap
• Gradients
– Non-relativistic RHF gradients
– 4-component DHF gradients
– Non-relativistic DFT gradients
– Non-relativistic CCSD gradients
– Non-relativistic TDHF and TDDFT gradients
• Hessian
– Non-relativistic RHF hessian
– Non-relativistic RKS hessian
• Properties
– Non-relativistic RHF, UHF, RKS, UKS NMR shielding
– 4-component DHF NMR shielding
– Non-relativistic RHF, UHF spin-spin coupling
– 4-component DHF spin-spin coupling
– Non-relativistic UHF, UKS hyperfine coupling
– 4-component DHF hyperfine coupling
– Non-relativistic UHF, UKS g-tensor
– 4-component DHF g-tensor
– Non-relativistic UHF zero-field splitting
– Molecular electrostatic potential (MEP)
• MRPT
– Strongly contracted NEVPT2
– DMRG-NEVPT2
– IC-MPS-PT2
• Extended systems with periodic boundary condition
– gamma point RHF, UHF, RKS, UKS
– gamma point TDDFT, MP2, CCSD
– PBC RHF, UHF, RKS, UKS with k-point sampling
– PBC RCCSD and UCCSD with k-point sampling
– PBC k-point EOM-IP/EA-CCSD
– PBC AO integrals
– PBC MO integral transformation

1.1. An overview of PySCF

5

PySCF Documentation, Release 1.4.0

– PBC density fitting
– Smearing for mean-field calculation
– Low-dimensional (0D, 1D, 2D) PBC systems
– TDHF and TDDFT with k-point sampling
• AO integrals
– Interface to call Libcint library
– 1-electron real-GTO and spinor-GTO integrals
– 2-electron real-GTO and spinor-GTO integrals
– 3-center 1-electron real-GTO and spinor-GTO integrals
– 3-center 2-electron real-GTO and spinor-GTO integrals
– General basis value evaluator (for numeric integration)
– PBC 1-electron integrals
– PBC 2-electron integrals
– F12 integrals
• MO integrals
– 2-electron integral transformation for any integrals provided by Libcint library
– Support for 4-index integral transformation with 4 different orbitals
– PBC 2-electron MO integrals
• Localizer
– Boys
– Edmiston
– Meta-Lowdin
– Natural atomic orbital (NAO)
– Intrinsic atomic orbital (IAO)
– Pipek-Mezey
• Geometry optimization
– RHF, RKS, RCCSD with pyberny geometry optimizer
• D2h symmetry and linear molecule symmetry
– Molecule symmetry detection
– Symmetry adapted basis
– Label orbital symmetry on the fly
– Hot update symmetry information
– Function to symmetrize given orbital space
• Tools
– fcidump
– molden

6

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

– cubegen
– Molpro XML reader
• Interface to integral package Libcint
• Interface to DMRG CheMPS2
• Interface to DMRG Block
• Interface to FCIQMC NECI
• Interface to XC functional library XCFun
• Interface to XC functional library Libxc
PySCF Python-based simulations of chemistry framework
How to use
There are two ways to access the documentation: the docstrings come with the code, and an online program reference,
available from http://www.sunqm.net/pyscf/index.html
We recommend the enhanced Python interpreter IPython and the web-based Python IDE Ipython notebook to try out
the package:
>>> from pyscf import gto, scf
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1.2', basis='cc-pvdz')
>>> mol.apply(scf.RHF).run()
converged SCF energy = -1.06111199785749
-1.06111199786

Pure function and Class
Class are designed to hold only the final results and the control parameters such as maximum number of iterations,
convergence threshold, etc. The intermediate status are not saved in the class. If the .kernel() function is finished
without any errors, the solution will be saved in the class (see documentation).
Most useful functions are implemented at module level, and can be accessed in both class and module, e.g.
scf.hf.get_jk(mol,dm) and SCF(mol).get_jk(mol,dm) have the same functionality. As a result, most
functions and class are pure, i.e. no status are saved, and the argument are not changed inplace. Exceptions (destructive functions and methods) are suffixed with underscore in the function name, eg mcscf.state_average_(mc)
changes the attribute of its argument mc
Stream functions
For most methods, there are three stream functions to pipe computing stream:
1 .set function to update object attributes, eg mf = scf.RHF(mol).set(conv_tol=1e-5) is identical to
proceed in two steps mf = scf.RHF(mol); mf.conv_tol=1e-5
2 .run function to execute the kernel function (the function arguments are passed to kernel function). If keyword
arguments is given, it will first call .set function to update object attributes then execute the kernel function. Eg mf
= scf.RHF(mol).run(dm_init,conv_tol=1e-5) is identical to three steps mf = scf.RHF(mol);
mf.conv_tol=1e-5; mf.kernel(dm_init)

1.1. An overview of PySCF

7

PySCF Documentation, Release 1.4.0

3 .apply function to apply the given function/class to the current object
tion
arguments
and
keyword
arguments
are
passed
to
the
given
function).
mol.apply(scf.RHF).run().apply(mcscf.CASSCF,6,4,frozen=4) is identical to
scf.RHF(mol); mf.kernel(); mcscf.CASSCF(mf,6,4,frozen=4)

(funcEg
mf =

1.2 Tutorial
1.2.1 Quick setup
The prerequisites of PySCF include cmake, numpy, scipy, and h5py. On the Ubuntu host, you can quickly install
them:
$ sudo apt-get install python-h5py python-scipy cmake

Then download the latest version of pyscf and build C extensions in pyscf/lib:
$
$
$
$
$
$

git clone https://github.com/sunqm/pyscf
cd pyscf/lib
mkdir build
cd build
cmake ..
make

Finally, update the Python runtime path PYTHONPATH (assuming pyscf is put in /home/abc, replace it with your own
path):
$ echo 'export PYTHONPATH=/home/abc:$PYTHONPATH' >> ~/.bashrc
$ source ~/.bashrc

To ensure the installation is successed, start a Python shell, and type:
>>> import pyscf

If you got errors like:
ImportError: No module named pyscf

It’s very possible that you put /home/abc/pyscf in PYTHONPATH. You need to remove the /pyscf in that string
and try import pyscf in the python shell again.
Note: The quick setup does not provide the best performance. Please see Installation for the installation with
optimized libraries.

1.2.2 A simple example
Here is an example to run HF calculation for hydrogen molecule:
>>>
>>>
>>>
>>>

8

from pyscf import gto, scf
mol = gto.M(atom='H 0 0 0; H 0 0 1.2', basis='ccpvdz')
mf = scf.RHF(mol)
mf.kernel()

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

converged SCF energy = -1.06111199785749
-1.06111199786

1.2.3 Initializing a molecule
There are three ways to define and initialize a molecule. The first is to use the keyword arguments of Mole.build()
to initialize a molecule:
>>> from pyscf import gto
>>> mol = gto.Mole()
>>> mol.build(
...
atom = '''O 0 0 0; H
...
basis = 'sto-3g')

0 1 0; H 0 0 1''',

The second way is to assign the geometry, basis etc. to Mole object, then call build() function to initialize the
molecule:
>>>
>>>
>>>
>>>

mol = gto.Mole()
mol.atom = '''O 0 0 0; H
mol.basis = 'sto-3g'
mol.build()

0 1 0; H 0 0 1'''

The third way is to use the shortcut function Mole.M(). This function pass all arguments to Mole.build():
>>> from pyscf import gto
>>> mol = gto.M(
...
atom = '''O 0 0 0; H
...
basis = 'sto-3g')

0 1 0; H 0 0 1''',

Either way, you may have noticed two keywords atom and basis. They are used to hold the molecular geometry
and basis sets.
Geometry
Molecular geometry can be input in Cartesian format:
>>> mol = gto.Mole()
>>> mol.atom = '''O 0, 0, 0
... H
0 1 0; H 0, 0, 1'''

The atoms in the molecule are represented by an element symbol plus three numbers for coordinates. Different atoms
should be separated by ; or line break. In the same atom, , can be used to separate different items. Z-matrix input
format is also supported by the input parser:
>>> mol = gto.Mole()
>>> mol.atom = '''O
... H, 1, 1.2; H
1 1.2

2 105'''

Similarly, different atoms need to be separated by ; or line break. If you need to label an atom to distinguish it from the
rest, you can prefix or suffix number or special characters 1234567890~!@#$%^&*()_+.?:<>[]{}| (except ,
and ;) to an atomic symbol. With this decoration, you can specify different basis sets, or masses, or nuclear models
for different atoms:

1.2. Tutorial

9

PySCF Documentation, Release 1.4.0

>>> mol = gto.Mole()
>>> mol.atom = '''8 0 0 0; h:1 0 1 0; H@2 0 0'''
>>> mol.basis = {'O': 'sto-3g', 'H': 'cc-pvdz', 'H@2': '6-31G'}
>>> mol.build()
>>> print(mol._atom)
[['O', [0.0, 0.0, 0.0]], ['H:1', [0.0, 1.0, 0.0]], ['H@2', [0.0, 0.0]]]

Basis set
The simplest way is to assign a string of basis name to mol.basis:
mol.basis = 'sto3g'

This input will apply the specified basis set to all atoms. The basis name in the string is case insensitive. White space,
dash and underscore in the basis name are all ignored. If different basis sets are required for different elements, a
python dict can be assigned to the basis attribute:
mol.basis = {'O': 'sto3g', 'H': '6-31g'}

You can find more examples in section input_basis and in the file examples/gto/04-input_basis.py.
Other parameters
You can assign more informations to the molecular object:
mol.symmetry = 1
mol.charge = 1
mol.spin = 1
mol.nucmod = {'O1': 1}
mol.mass = {'O1': 18, 'H': 2}

Note: Mole.spin is 2S, the alpha and beta electron number difference.
Mole also defines some global parameters. You can control the print level globally with verbose:
mol.verbose = 4

The print level can be 0 (quite, no output) to 9 (very noise). Mostly, the useful messages are printed at level 4 (info),
and 5 (debug). You can also specify the place where to write the output messages:
mol.output = 'path/to/my_log.txt'

Without assigning this variable, messages will be dumped to sys.stdout. You can control the maximum memory
usage globally:
mol.max_memory = 1000 # MB

The default size can be defined with shell environment variable PYSCF_MAX_MEMORY
output and max_memory can be assigned from command line:
$ python example.py -o /path/to/my_log.txt -m 1000

10

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

1.2.4 Initializing a crystal
Initialization a crystal unit cell is very similar to the initialization molecular object. Here, pyscf.pbc.gto.Cell
class should be used instead of the pyscf.gto.Mole class:
>>>
>>>
>>>
>>>
>>>
>>>
>>>

from pyscf.pbc import gto
cell = gto.Cell()
cell.atom = '''H 0 0 0; H 1 1 1'''
cell.basis = 'gth-dzvp'
cell.pseudo = 'gth-pade'
cell.a = numpy.eye(3) * 2
cell.build()

The crystal initialization requires an extra parameter cell.a which represents the lattice vectors. In the above
example, we specified cell.pseudo for the pseudo-potential of the system which is an optional parameter. The
input format of basis set is the same to that of Mole object. The other attributes of Mole object such as verbose,
max_memory, spin can also be used in the crystal systems. More details of the crystal Cell object and the relevant
input parameters are documented in pbc.gto — Crystal cell structure.
1D and 2D systems
PySCF PBC module supports the low-dimensional PBC systems. You can initialize the attribute cell.dimension
to specify the dimension of the system:
>>>
>>>
>>>
>>>
>>>
>>>
>>>

from pyscf.pbc import gto
cell = gto.Cell()
cell.atom = '''H 0 0 0; H 1 1 0'''
cell.basis = 'sto3g'
cell.dimension = 2
cell.a = numpy.eye(3) * 2
cell.build()

When cell.dimension is specified, a vacuum of infinite size will be applied on certain dimension(s). More
specifically, when cell.dimension is 2, the z-direction will be treated as infinite large and the xy-plane constitutes
the periodic surface. When cell.dimension is 1, y and z axes are treated as vacuum thus wire is placed on the
x axis. When cell.dimension is 0, all three directions are vacuum. The PBC system is actually the same to the
molecular system.

1.2.5 HF, MP2, MCSCF
Hartree-Fock
Now we are ready to study electronic structure theory with pyscf. Let’s take oxygen molecule as the first example:
>>>
>>>
>>>
>>>
>>>
>>>
>>>

from pyscf import gto
mol = gto.Mole()
mol.verbose = 5
mol.output = 'o2.log'
mol.atom = 'O 0 0 0; O 0 0 1.2'
mol.basis = 'ccpvdz'
mol.build()

Apply non-relativistic Hartree-Fock:

1.2. Tutorial

11

PySCF Documentation, Release 1.4.0

>>> from pyscf import scf
>>> m = scf.RHF(mol)
>>> print('E(HF) = %g' % m.kernel())
E(HF) = -149.544214749

The ground state of oxygen molecule should be triplet. So we change the spin to 2 (2 more alpha electrons than beta
electrons):
>>> o2_tri = mol.copy()
>>> o2_tri.spin = 2
>>> o2_tri.build(0, 0) # two "0"s to prevent dumping input and parsing command line
>>> rhf3 = scf.RHF(o2_tri)
>>> print(rhf3.kernel())
-149.609461122

Run UHF:
>>> uhf3 = scf.UHF(o2_tri)
>>> print(uhf3.scf())
-149.628992314
>>> print('S^2 = %f, 2S+1 = %f' % uhf3.spin_square())
S^2 = 2.032647, 2S+1 = 3.021686

where we called mf.scf(), which is an alias name of mf.kernel. You can impose symmetry:
>>> o2_sym = mol.copy()
>>> o2_sym.spin = 2
>>> o2_sym.symmetry = 1
>>> o2_sym.build(0, 0)
>>> rhf3_sym = scf.RHF(o2_sym)
>>> print(rhf3_sym.kernel())
-149.609461122

Here we rebuild the molecule because we need to initialize the point group symmetry information, symmetry adapted
orbitals. We can check the occupancy for each irreducible representations:
>>> import numpy
>>> from pyscf import symm
>>> def myocc(mf):
...
mol = mf.mol
...
irrep_id = mol.irrep_id
...
so = mol.symm_orb
...
orbsym = symm.label_orb_symm(mol, irrep_id, so, mf.mo_coeff)
...
doccsym = numpy.array(orbsym)[mf.mo_occ==2]
...
soccsym = numpy.array(orbsym)[mf.mo_occ==1]
...
for ir,irname in enumerate(mol.irrep_name):
...
print('%s, double-occ = %d, single-occ = %d' %
...
(irname, sum(doccsym==ir), sum(soccsym==ir)))
>>> myocc(rhf3_sym)
Ag, double-occ = 3, single-occ = 0
B1g, double-occ = 0, single-occ = 0
B2g, double-occ = 0, single-occ = 1
B3g, double-occ = 0, single-occ = 1
Au, double-occ = 0, single-occ = 0
B1u, double-occ = 2, single-occ = 0
B2u, double-occ = 1, single-occ = 0
B3u, double-occ = 1, single-occ = 0

12

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

To label the irreducible representation of given orbitals, symm.label_orb_symm() needs the information of
the point group symmetry which are initialized in mol object, including the id of irreducible representations
Mole.irrep_id and the symmetry adapted basis Mole.symm_orb. For each irrep_id, Mole.irrep_name
gives the associated irrep symbol (A1, B1 ...). In the SCF calculation, you can control the symmetry of the wave function by assigning the number of alpha electrons and beta electrons (alpha,beta) for some irreps:
>>> rhf3_sym.irrep_nelec = {'B2g': (1,1), 'B3g': (1,1), 'B2u': (1,0), 'B3u': (1,0)}
>>> rhf3_sym.kernel()
>>> print(rhf3_sym.kernel())
-148.983117701
>>> rhf3_sym.get_irrep_nelec()
{'Ag' : (3, 3), 'B1g': (0, 0), 'B2g': (1, 1), 'B3g': (1, 1), 'Au' : (0, 0), 'B1u':
˓→(1, 0), 'B2u': (0, 1), 'B3u': (1, 0)}

More informations of the calculation can be found in the output file o2.log.
MP2 and MO integral transformation
Next, we compute the correlation energy with mp.mp2:
>>> from pyscf import mp
>>> mp2 = mp.MP2(m)
>>> print('E(MP2) = %.9g' % mp2.kernel()[0])
E(MP2) = -0.379359288

This is the correlation energy of singlet ground state. For the triplet state, we can write a function to compute the
correlation energy
𝐸𝑐𝑜𝑟𝑟 =

1 ∑︁ ⟨𝑖𝑗||𝑎𝑏⟩⟨𝑎𝑏||𝑖𝑗⟩
4
𝜖𝑖 + 𝜖𝑗 − 𝜖𝑎 − 𝜖𝑏
𝑖𝑗𝑎𝑏

def myump2(mf):
import numpy
from pyscf import ao2mo
# As UHF objects, mo_energy, mo_occ, mo_coeff are two-item lists
# (the first item for alpha spin, the second for beta spin).
mo_energy = mf.mo_energy
mo_occ = mf.mo_occ
mo_coeff = mf.mo_coeff
o = numpy.hstack((mo_coeff[0][:,mo_occ[0]>0] ,mo_coeff[1][:,mo_occ[1]>0]))
v = numpy.hstack((mo_coeff[0][:,mo_occ[0]==0],mo_coeff[1][:,mo_occ[1]==0]))
eo = numpy.hstack((mo_energy[0][mo_occ[0]>0] ,mo_energy[1][mo_occ[1]>0]))
ev = numpy.hstack((mo_energy[0][mo_occ[0]==0],mo_energy[1][mo_occ[1]==0]))
no = o.shape[1]
nv = v.shape[1]
noa = sum(mo_occ[0]>0)
nva = sum(mo_occ[0]==0)
eri = ao2mo.general(mf.mol, (o,v,o,v)).reshape(no,nv,no,nv)
eri[:noa,nva:] = eri[noa:,:nva] = eri[:,:,:noa,nva:] = eri[:,:,noa:,:nva] = 0
g = eri - eri.transpose(0,3,2,1)
eov = eo.reshape(-1,1) - ev.reshape(-1)
de = 1/(eov.reshape(-1,1) + eov.reshape(-1)).reshape(g.shape)
emp2 = .25 * numpy.einsum('iajb,iajb,iajb->', g, g, de)
return emp2

1.2. Tutorial

13

PySCF Documentation, Release 1.4.0

>>> print('E(UMP2) = %.9g' % myump2(uhf3))
-0.346926068

In this example, we concatenate 𝛼 and 𝛽 orbitals to mimic the spin-orbitals. After integral transformation, we zeroed
out the integrals of different spin. Here, the ao2mo module provides the general 2-electron MO integral transformation. Using this module, you are able to do arbitrary integral transformation for arbitrary integrals. For example, the
following code gives the (ov|vv) type integrals:
>>> from pyscf import ao2mo
>>> import h5py
>>> mocc = m.mo_coeff[:,m.mo_occ>0]
>>> mvir = m.mo_coeff[:,m.mo_occ==0]
>>> ao2mo.general(mol, (mocc,mvir,mvir,mvir), 'tmp.h5', compact=False)
>>> feri = h5py.File('tmp.h5')
>>> ovvv = numpy.array(feri['eri_mo'])
>>> print(ovvv.shape)
(160, 400)

We pass compact=False to ao2mo.general() to prevent the function using the permutation symmetry between
the virtual-virtual pair of |vv). So the shape of ovvv corresponds to 8 occupied orbitals by 20 virtual orbitals for
electron 1 (ov| and 20 by 20 for electron 2 |vv). In the following example, we transformed the analytical gradients
of 2-electron integrals
𝜕
⟨(
𝜙𝑖 )𝜙𝑘 |𝜙𝑗 𝜙𝑙 ⟩ =
𝜕𝑅
>>>
>>>
>>>
>>>
>>>
>>>
>>>
(3,

∫︁

𝜕𝜙𝑖 (𝑟1 )
𝜕𝑅 𝜙𝑗 (𝑟1 )𝜙𝑘 (𝑟2 )𝜙𝑙 (𝑟2 )

|𝑟1 − 𝑟2 |

𝑑𝑟1 𝑑𝑟2

nocc = mol.nelectron // 2
co = mf.mo_coeff[:,:nocc]
cv = mf.mo_coeff[:,nocc:]
nvir = cv.shape[1]
eri = ao2mo.general(mol, (co,cv,co,cv), intor='int2e_ip1_sph', comp=3)
eri = eri.reshape(3, nocc, nvir, nocc, nvir)
print(eri.shape)
8, 20, 8, 20)

CASCI and CASSCF
The two classes mcscf.CASCI and mcscf.CASSCF provided by mcscf have the same initialization interface:
>>> from pyscf import mcscf
>>> mc = mcscf.CASCI(m, 4, 6)
>>> print('E(CASCI) = %.9g' % mc.casci()[0])
E(CASCI) = -149.601051
>>> mc = mcscf.CASSCF(m, 4, 6)
>>> print('E(CASSCF) = %.9g' % mc.kernel()[0])
E(CASSCF) = -149.613191

In this example, the CAS space is (6e, 4o): the third argument for CASCI/CASSCF is the size of CAS space; the
fourth argument is the number of electrons. By default, the CAS solver determines the alpha-electron number and
beta-electron number based on the attribute Mole.spin. In the above example, the number of alpha electrons is
equal to the number of beta electrons, since the mol object is initialized with spin=0. The spin multiplicity of the
CASSCF/CASCI solver can be changed by the fourth argument:

14

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

>>> mc = mcscf.CASSCF(m, 4, (4,2))
>>> print('E(CASSCF) = %.9g' % mc.kernel()[0])
E(CASSCF) = -149.609461
>>> print('S^2 = %.7f, 2S+1 = %.7f' % mcscf.spin_square(mc))
S^2 = 2.0000000, 2S+1 = 3.0000000

The two integers in the tuple represent the number of alpha and beta electrons. Although it is a triplet state, the solution
might not be correct since the CASSCF is based on the incorrect singlet HF ground state. Starting from the ROHF
ground state, we have:
>>> mc = mcscf.CASSCF(rhf3, 4, 6)
>>> print('E(CASSCF) = %.9g' % mc.kernel()[0])
E(CASSCF) = -149.646746

The energy is lower than the RHF initial guess. .. We can also use the UHF ground .. state to start a CASSCF
calculation:: .. .. >>> mc = mcscf.CASSCF(uhf3, 4, 6) .. >>> print(‘E(CASSCF) = %.9g’ % mc.kernel()[0]) ..
E(CASSCF) = -149.661324 .. >>> print(‘S^2 = %.7f, 2S+1 = %.7f’ % mcscf.spin_square(mc)) .. S^2 = 3.9713105,
2S+1 = 4.1091656 .. .. Woo, the total energy is even lower. But the spin is contaminated.

1.2.6 Restore an old calculation
There is no restart mechanism available in PySCF package. Calculations can be “restarted” by the proper initial guess.
For SCF, the initial guess can be prepared in many ways. One is to read the chkpoint file which is generated in the
previous or other calculations:
>>>
>>>
>>>
>>>
>>>

from pyscf import scf
mf = scf.RHF(mol)
mf.chkfile = '/path/to/chkfile'
mf.init_guess = 'chkfile'
mf.kernel()

/path/to/chkfile can be found in the output in the calculation (if mol.verbose >= 4, the filename of the
chkfile will be dumped in the output). By setting chkfile and init_guess, the SCF module can read the
molecular orbitals from the given chkfile and rotate them to representation of the required basis. The example
examples/scf/15-initial_guess.py records other methods to generate SCF initial guess.
Initial guess can be fed to the calculation directly. For example, we can read the initial guess form a chkfile and achieve
the same effects as the on in the previous example:
>>>
>>>
>>>
>>>

from pyscf import scf
mf = scf.RHF(mol)
dm = scf.hf.from_chk(mol, '/path/to/chkfile')
mf.kernel(dm)

scf.hf.from_chk() reads the chkpoint file and generates the corresponding density matrix represented in the
required basis.
Initial guess chkfile is not limited to the calculation based on the same molecular and same basis set. One can
first do a cheap SCF (with small basis sets) or a model SCF (dropping a few atoms, or charged system), then use
scf.hf.from_chk() to project the results to the target basis sets.
To restart a CASSCF calculation, you need prepare either CASSCF orbitals or CI coefficients (not that useful unless
doing a DMRG-CASSCF calculation) or both. For example:
#!/usr/bin/env python
#

1.2. Tutorial

15

PySCF Documentation, Release 1.4.0

# Author: Qiming Sun 
#
import tempfile
from pyscf import gto, scf, mcscf
from pyscf import lib
'''
Restart CASSCF from previous calculation.
There is no "restart" keyword for CASSCF solver. The CASSCF solver is
completely controlled by initial guess. So we can mimic the restart feature
by providing proper initial guess from previous calculation.
We need assign the .chkfile a string to indicate the file where to save the
CASSCF intermediate results. Then we can "restart" the calculation from the
intermediate results.
'''
tmpchk = tempfile.NamedTemporaryFile()
mol = gto.Mole()
mol.atom = 'C 0 0 0; C 0 0 1.2'
mol.basis = 'ccpvdz'
mol.build()
mf = scf.RHF(mol)
mf.kernel()
mc = mcscf.CASSCF(mf, 6, 6)
mc.chkfile = tmpchk.name
mc.max_cycle_macro = 1
mc.kernel()
#######################################################################
#
# Assuming the CASSCF was interrupted. Intermediate data were saved in
# tmpchk file. Here we read the chkfile to restart the previous calculation.
#
#######################################################################
mol = gto.Mole()
mol.atom = 'C 0 0 0; C 0 0 1.2'
mol.basis = 'ccpvdz'
mol.build()
mc = mcscf.CASSCF(scf.RHF(mol), 6, 6)
mo = lib.chkfile.load(tmpchk.name, 'mcscf/mo_coeff')
mc.kernel(mo)

1.2.7 Access AO integrals
molecular integrals
PySCF uses Libcint library as the AO integral engine. It provides simple interface function getints_by_shell()
to evaluate integrals. The following example evaluates 3-center 2-electron integrals with this function:

16

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

import numpy
from pyscf import gto, scf, df
mol = gto.M(atom='O 0 0 0; h 0 -0.757 0.587; h 0 0.757 0.587', basis='cc-pvdz')
auxmol = gto.M(atom='O 0 0 0; h 0 -0.757 0.587; h 0 0.757 0.587', basis='weigend')
pmol = mol + auxmol
nao = mol.nao_nr()
naux = auxmol.nao_nr()
eri3c = numpy.empty((nao,nao,naux))
pi = 0
for i in range(mol.nbas):
pj = 0
for j in range(mol.nbas):
pk = 0
for k in range(mol.nbas, mol.nbas+auxmol.nbas):
shls = (i, j, k)
buf = pmol.intor_by_shell('int3c2e_sph', shls)
di, dj, dk = buf.shape
eri3c[pi:pi+di,pj:pj+dj,pk:pk+dk] = buf
pk += dk
pj += dj
pi += di

Here we load the Weigend density fitting basis to auxmol and append the basis to normal orbital basis which was initialized in mol. In the result pmol object, the first mol.nbas shells are the orbital basis and the next auxmol.nbas
are auxiliary basis. The three nested loops run over all integrals for the three index integral (ij|K). Similarly, we can
compute the two center Coulomb integrals:
eri2c = numpy.empty((naux,naux))
pk = 0
for k in range(mol.nbas, mol.nbas+auxmol.nbas):
pl = 0
for l in range(mol.nbas, mol.nbas+auxmol.nbas):
shls = (k, l)
buf = pmol.intor_by_shell('int2c2e_sph', shls)
dk, dl = buf.shape
eri2c[pk:pk+dk,pl:pl+dl] = buf
pl += dl
pk += dk

Now we can use the two-center integrals and three-center integrals to implement the density fitting Hartree-Fock code.
def get_vhf(mol, dm, *args, **kwargs):
naux = eri2c.shape[0]
nao = mol.nao_nr()
rho = numpy.einsum('ijp,ij->p', eri3c, dm)
rho = numpy.linalg.solve(eri2c, rho)
jmat = numpy.einsum('p,ijp->ij', rho, eri3c)
kpj = numpy.einsum('ijp,jk->ikp', eri3c, dm)
pik = numpy.linalg.solve(eri2c, kpj.reshape(-1,naux).T)
kmat = numpy.einsum('pik,kjp->ij', pik.reshape(naux,nao,nao), eri3c)
return jmat - kmat * .5
mf = scf.RHF(mol)
mf.verbose = 0
mf.get_veff = get_vhf
print('E(DF-HF) = %.12f, ref = %.12f' % (mf.kernel(), scf.density_fit(mf).kernel()))

Your screen should output
1.2. Tutorial

17

PySCF Documentation, Release 1.4.0

E(DF-HF) = -76.025936299702, ref = -76.025936299702
Evaluating the integrals with nested loops and mol.intor_by_shell() method is inefficient. It is preferred to
load integrals in bulk and this can be done with mol.intor() method:
eri2c = auxmol.intor('int2c2e_sph')
eri3c = pmol.intor('int3c2e_sph', shls_slice=(0,mol.nbas,0,mol.nbas,mol.nbas,mol.
˓→nbas+auxmol.nbas))
eri3c = eri3c.reshape(mol.nao_nr(), mol.nao_nr(), -1)

mol.intor() method can be used to evaluate one-electron integrals, two-electron integrals:
hcore = mol.intor('int1e_nuc_sph') + mol.intor('int1e_kin_sph')
overlap = mol.intor('int1e_ovlp_sph')
eri = mol.intor('int2e_sph')

There is a long list of supported AO integrals. See moleintor.
PBC AO integrals
mol.intor() can only be used to evaluate the integrals with open boundary conditions. When the periodic boundary conditions of crystal systems are studied, you need to use pbc.Cell.pbc_intor() function to evaluate the
integrals of short-range operators, such as the overlap, kinetic matrix:
from pyscf.pbc import gto
cell = gto.Cell()
cell.atom = 'H 0 0 0; H 1 1 1'
cell.a = numpy.eye(3) * 2.
cell.build()
overlap = cell.pbc_intor('int1e_ovlp_sph')

By default, pbc.Cell.pbc_intor() function returns the Γ-point integrals. If k-points are specified, function
pbc.Cell.pbc_intor() can also evaluate the k-point integrals:
kpts = cell.make_kpts([2,2,2]) # 8 k-points
overlap = cell.pbc_intor('int1e_ovlp_sph', kpts=kpts)

Note: pbc.Cell.pbc_intor() can only be used to evaluate the short-range integrals. PBC density fitting
method has to be used to compute the long-range operator such as nuclear attraction integrals, Coulomb integrals.
The two-electron Coulomb integrals can be evaluated with PBC density fitting methods:
from pyscf.pbc import df
eri = df.DF(cell).get_eri()

See also pbc.df — PBC denisty fitting for more details of the PBC density fitting module.

1.2.8 Other features
Density fitting

18

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

#!/usr/bin/env python
#
# Author: Qiming Sun 
#
from pyscf import gto
from pyscf import scf
'''
Density fitting method by decorating the scf object with scf.density_fit function.
There is no flag to control the program to do density fitting for 2-electron
integration. The way to call density fitting is to decorate the existed scf
object with scf.density_fit function.
NOTE scf.density_fit function generates a new object, which works exactly the
same way as the regular scf method. The density fitting scf object is an
independent object to the regular scf object which is to be decorated. By
doing so, density fitting can be applied anytime, anywhere in your script
without affecting the exsited scf object.
See also:
examples/df/00-with_df.py
examples/df/01-auxbasis.py
'''
mol = gto.Mole()
mol.build(
verbose = 0,
atom = '''8 0 0.
0
1 0 -0.757 0.587
1 0 0.757 0.587''',
basis = 'ccpvdz',
)
mf = scf.density_fit(scf.RHF(mol))
energy = mf.kernel()
print('E = %.12f, ref = -76.026744737355' % energy)
#
# Stream style: calling .density_fit method to return a DF-SCF object.
#
mf = scf.RHF(mol).density_fit()
energy = mf.kernel()
print('E = %.12f, ref = -76.026744737355' % energy)
#
# By default optimal auxiliary basis (if possible) or even-tempered gaussian
# functions are used fitting basis. You can assign with_df.auxbasis to change
# the change the fitting basis.
#
mol.spin = 1
mol.charge = 1
mol.build(0, 0)
mf = scf.UKS(mol).density_fit()
mf.with_df.auxbasis = 'cc-pvdz-jkfit'
energy = mf.kernel()
print('E = %.12f, ref = -75.390366559552' % energy)

1.2. Tutorial

19

PySCF Documentation, Release 1.4.0

Customizing Hamiltonian
#!/usr/bin/env python
#
# Author: Qiming Sun 
#
import numpy
from pyscf import gto, scf, ao2mo
'''
Customizing Hamiltonian for SCF module.
Three steps to define Hamiltonian for SCF:
1. Specify the number of electrons. (Note mole object must be "built" before doing
˓→this step)
2. Overwrite three attributes of scf object
.get_hcore
.get_ovlp
._eri
3. Specify initial guess (to overwrite the default atomic density initial guess)
Note you will see warning message on the screen:
overwrite keys get_ovlp get_hcore of 
'''
mol = gto.M()
n = 10
mol.nelectron = n
mf = scf.RHF(mol)
h1 = numpy.zeros((n,n))
for i in range(n-1):
h1[i,i+1] = h1[i+1,i] = -1.0
h1[n-1,0] = h1[0,n-1] = -1.0 # PBC
eri = numpy.zeros((n,n,n,n))
for i in range(n):
eri[i,i,i,i] = 4.0
mf.get_hcore = lambda *args: h1
mf.get_ovlp = lambda *args: numpy.eye(n)
# ao2mo.restore(8, eri, n) to get 8-fold permutation symmetry of the integrals
# ._eri only supports the two-electron integrals in 4-fold or 8-fold symmetry.
mf._eri = ao2mo.restore(8, eri, n)
mf.kernel()

Symmetry in CASSCF
#!/usr/bin/env python
#

20

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

# Author: Qiming Sun 
#
from pyscf import gto, scf, mcscf
'''
Symmetry is not immutable
In PySCF, symmetry is not built-in data structure. Orbitals are stored in C1
symmetry. The irreps and symmetry information are generated on the fly.
We can switch on symmetry for CASSCF solver even the Hartree-Fock is not
optimized with symmetry.
'''
mol = gto.Mole()
mol.build(
atom = [['O' , (0. , 0.
, 0.)],
[1
, (0. , -0.757 , 0.587)],
[1
, (0. , 0.757 , 0.587)]],
basis = 'cc-pvdz',
)
mf = scf.RHF(mol)
mf.kernel()
mol.build(0, 0, symmetry = 'C2v')
mc = mcscf.CASSCF(mf, 6, 8)
mc.kernel()

1.3 Installation
We provide three ways to install PySCF package.

1.3.1 Installation with conda
If you have Anaconda environment, PySCF package can be installed with:
$ conda install -c pyscf pyscf

1.3.2 Installation with pip
You have to first install the dependent libraries (due to the missing of build-time dependency in pip PEP 518):
$ pip install numpy scipy h5py

Then install PySCF:
$ pip install pyscf

Note: libxc library is not available in the PyPI repository. pyscf.dft module is not working unless the libxc library
was installed in the system. You can download libxc library from http://octopus-code.org/wiki/Libxc:download. You

1.3. Installation

21

PySCF Documentation, Release 1.4.0

need to add –enable-shared when compiling the libxc library. Before calling pip, the path where the libxc library is
installed needs to be added to the environment variable PYSCF_INC_DIR

1.3.3 Manual installation from github repo
You can manually install PySCF from the PySCF github repo. Manual installation requires cmake, numpy, scipy and
h5py libraries. You can download the latest PySCF version (or the development branch) from github:
$ git clone https://github.com/sunqm/pyscf
$ cd pyscf
$ git checkout dev # optional if you'd like to try out the development branch

Build the C extensions in pyscf/lib:
$
$
$
$
$

cd pyscf/lib
mkdir build
cd build
cmake ..
make

This will automatically download the analytical GTO integral library libcint and the DFT exchange correlation functional libraries libxc and xcfun. Finally, to make Python able to find the pyscf package, add the top-level pyscf
directory (not the pyscf/pyscf subdirectory) to PYTHONPATH. For example, if pyscf is installed in /opt,
PYTHONPATH should be like:
export PYTHONPATH=/opt/pyscf:$PYTHONPATH

To ensure the installation is successful, start a Python shell, and type:
>>> import pyscf

For Mac OS X/macOS, you may get an import error if your OS X/macOS version is 10.11 or later:
OSError: dlopen(xxx/pyscf/pyscf/lib/libcgto.dylib, 6): Library not loaded: libcint.3.
˓→0.dylib
Referenced from: xxx/pyscf/pyscf/lib/libcgto.dylib
Reason: unsafe use of relative rpath libcint.3.0.dylib in xxx/pyscf/pyscf/lib/libcgto.
˓→dylib with restricted binary

This
is
caused
by
the
RPATH.
It
can
be
fixed
by
pyscf/lib/_runme_to_fix_dylib_osx10.11.sh in pyscf/lib directory:

running

the

script

cd pyscf/lib
sh _runme_to_fix_dylib_osx10.11.sh

Note: RPATH has been built in the dynamic library. This may cause library loading error on some systems.
You can run pyscf/lib/_runme_to_remove_rpath.sh to remove the rpath code from the library head.
Another workaround is to set -DCMAKE_SKIP_RPATH=1 and -DCMAKE_MACOSX_RPATH=0 in cmake command line. When the RPATH was removed, you need to add pyscf/lib and pyscf/lib/deps/lib in
LD_LIBRARY_PATH.
A useful last step is to set the scratch directory. The default scratch directory of PySCF is controlled by environment
variable PYSCF_TMPDIR. If it’s not specified, the system wide temporary directory TMPDIR will be used as the
scratch directory.
22

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

1.3.4 Installation without network
If you have problems downloading the external libraries on your computer, you can manually build the libraries, as
shown in the following instructions. First, you need to install libcint, libxc or xcfun libraries. libcint cint3 branch and
xcfun stable-1.x branch are required by PySCF. They can be downloaded from github:
$
$
$
$

git clone https://github.com/sunqm/libcint.git
cd libcint
git checkout origin/cint3
cd .. && tar czf libcint.tar.gz libcint

$
$
$
$

git clone https://github.com/sunqm/xcfun.git
cd xcfun
git checkout origin/stable-1.x
cd .. && tar czf xcfun.tar.gz xcfun

libxc-3.* can be found in http://octopus-code.org/wiki/Main_Page or here. Assuming /opt is the place where these
libraries will be installed, these packages should be compiled with the flags:
$
$
$
$

tar xvzf libcint.tar.gz
cd libcint
mkdir build && cd build
cmake -DWITH_F12=1 -DWITH_RANGE_COULOMB=1 -DWITH_COULOMB_ERF=1 \
-DCMAKE_INSTALL_PREFIX:PATH=/opt -DCMAKE_INSTALL_LIBDIR:PATH=lib ..
$ make && make install
$
$
$
$

tar xvzf libxc-3.0.0.tar.gz
cd libxc-0.0.0
mkdir build && cd build
../configure --prefix=/opt --libdir=/opt/lib --enable-shared --disable-fortran
˓→LIBS=-lm
$ make && make install
$
$
$
$

tar xvzf xcfun.tar.gz
cd xcfun
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_SHARED_LIBS=1 -DXC_MAX_ORDER=3 -DXCFUN_
˓→ENABLE_TESTS=0 \
-DCMAKE_INSTALL_PREFIX:PATH=/opt -DCMAKE_INSTALL_LIBDIR:PATH=lib ..
$ make && make install

Next compile PySCF:
$ cd pyscf/pyscf/lib
$ mkdir build && cd build
$ cmake -DBUILD_LIBCINT=0 -DBUILD_LIBXC=0 -DBUILD_XCFUN=0 -DCMAKE_INSTALL_PREFIX:
˓→PATH=/opt ..
$ make

Finally update the PYTHONPATH environment for Python interpreter.

1.3.5 Using optimized BLAS
The default installation does not require the user to identify external linear algebra libraries, but instead tries to find
them automatically. This automated setup script may only find and link to slow BLAS/LAPACK libraries. To improve
performance, users can install the package with other BLAS vendors, such as the Intel Math Kernel Library (MKL),
which can provide 10x speedup in many modules:
1.3. Installation

23

PySCF Documentation, Release 1.4.0

$ cd pyscf/lib/build
$ cmake -DBLA_VENDOR=Intel10_64lp_seq ..
$ make

If you are using Anaconda as your Python-side platform, you can link PySCF to the MKL library coming with Anaconda package:
$
$
$
$
$

export MKLROOT=/path/to/anaconda2
export LD_LIBRARY_PATH=$MKLROOT/lib:$LD_LIBRARY_PATH
cd pyscf/lib/build
cmake -DBLA_VENDOR=Intel10_64lp_seq ..
make

You can link to other BLAS libraries by setting BLA_VENDOR, eg BLA_VENDOR=ATLAS,
BLA_VENDOR=IBMESSL. Please refer to cmake mannual for more details of the use of FindBLAS macro.
If the cmake BLA_VENDOR cannot find the right BLAS library as you expected, you can assign the libraries to the
variable BLAS_LIBRARIES in lib/CMakeLists.txt:
set(BLAS_LIBRARIES
set(BLAS_LIBRARIES
set(BLAS_LIBRARIES
set(BLAS_LIBRARIES

"${BLAS_LIBRARIES};/path/to/mkl/lib/intel64/libmkl_intel_lp64.so")
"${BLAS_LIBRARIES};/path/to/mkl/lib/intel64/libmkl_sequential.so")
"${BLAS_LIBRARIES};/path/to/mkl/lib/intel64/libmkl_core.so")
"${BLAS_LIBRARIES};/path/to/mkl/lib/intel64/libmkl_avx.so")

1.3.6 Using optimized integral library
The default integral library used by PySCF is libcint (https://github.com/sunqm/libcint). To ensure the compatibility
on various high performance computer systems, PySCF does not use the fast integral library by default. For X86-64
platforms, libcint library has an efficient implementation Qcint https://github.com/sunqm/qcint.git which is heavily
optimized against SSE3 instructions. To replace the default libcint library with qcint library, edit the URL of the
integral library in lib/CMakeLists.txt file:
ExternalProject_Add(libcint
GIT_REPOSITORY
https://github.com/sunqm/qcint.git
...

1.3.7 Plugins
nao
pyscf/nao module includes the basic functions of numerical atomic orbitals (NAO) and the (nao based) TDDFT
methods. This module was contributed by Marc Barbry and Peter Koval. You can enable this module with a cmake
flag:
$ cmake -DENABLE_NAO=1 ..

More information of the compilcation can be found in pyscf/lib/nao/README.md.
DMRG solver
Density matrix renormalization group (DMRG) implementations Block (http://chemists.princeton.edu/chan/software/
block-code-for-dmrg) and CheMPS2 (http://sebwouters.github.io/CheMPS2/index.html) are efficient DMRG solvers
24

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

for ab initio quantum chemistry problem. Installing Block requires C++11 compiler. If C++11 is not supported
by your compiler, you can register and download the precompiled Block binary from http://chemists.princeton.
edu/chan/software/block-code-for-dmrg. Before using the Block or CheMPS2, you need create a config file future/dmrgscf/settings.py (as shown by settings.py.example) to store the path where the DMRG solver was installed.
FCIQMC
NECI (https://github.com/ghb24/NECI_STABLE) is FCIQMC code developed by George Booth and Ali Alavi.
PySCF has an interface to call FCIQMC solver NECI. To use NECI, you need create a config file future/fciqmc/settings.py to store the path where NECI was installed.
Libxc
By default, building PySCF will automatically download and install Libxc 2.2.2. pyscf.dft.libxc module provided a general interface to access Libxc functionals.
Xcfun
By default, building PySCF will automatically download and install latest xcfun code from https://github.com/dftlibs/
xcfun. pyscf.dft.xcfun module provided a general interface to access Libxc functionals.
XianCI
XianCI is a spin-adapted MRCI program. “Bingbing Suo”  is the main developer of XianCI
program.

1.4 gto — Molecular structure and GTO basis
This module provides the functions to parse the command line options, the molecular geometry and format the basic
functions for libcint integral library. In mole, a basic class Mole is defined to hold the global parameters, which will
be used throughout the package.

1.4.1 Input
Geometry
There are multiple ways to input molecular geometry. The internal format of Mole.atom is a python list:
atom = [[atom1, (x, y, z)],
[atom2, (x, y, z)],
...
[atomN, (x, y, z)]]

You can input the geometry in this format. You can use Python script to construct the geometry:
>>> mol = gto.Mole()
>>> mol.atom = [['O',(0, 0, 0)], ['H',(0, 1, 0)], ['H',(0, 0, 1)]]
>>> mol.atom.extend([['H', (i, i, i)] for i in range(1,5)])

1.4. gto — Molecular structure and GTO basis

25

PySCF Documentation, Release 1.4.0

Besides Python list, tuple and numpy.ndarray are all supported by the internal format:
>>> mol.atom = (('O',numpy.zeros(3)), ['H', 0, 1, 0], ['H',[0, 0, 1]])

Also, atom can be a string of Cartesian format or Z-matrix format:
>>>
>>>
>>>
>>>
>>>
>>>

mol = gto.Mole()
mol.atom = '''
O 0 0 0
H 0 1 0
H 0 0 1;
'''

There are a few requirements for the string format. The string input takes ; or \n to partition atoms. White space and
, are used to divide items for each atom. Blank lines or lines started with # will be ignored:
>>>
...
...
...
...
...
...
>>>
2

mol = gto.M(
mol.atom = '''
#O 0 0 0
H 0 1 0
H 0 0 1;
''')
mol.natm

The geometry string is case-insensitive. It also supports to input the nuclear charges of elements:
>>> mol = gto.Mole()
>>> mol.atom = [[8,(0, 0, 0)], ['h',(0, 1, 0)], ['H',(0, 0, 1)]]

If you need to label an atom to distinguish it from the rest, you can prefix or suffix number or special characters
1234567890~!@#$%^&*()_+.?:<>[]{}| (except , and ;) to an atomic symbol. With this decoration, you
can specify different basis sets, or masses, or nuclear models for different atoms:
>>> mol = gto.Mole()
>>> mol.atom = '''8 0 0 0; h:1 0 1 0; H@2 0 0'''
>>> mol.basis = {'O': 'sto-3g', 'H': 'cc-pvdz', 'H@2': '6-31G'}
>>> mol.build()
>>> print(mol.atom)
[['O', [0.0, 0.0, 0.0]], ['H:1', [0.0, 1.0, 0.0]], ['H@2', [0.0, 0.0]]]

No matter which format or symbols were used in the input, Mole.build() will convert Mole.atom to the internal
format:
>>> mol.atom = '''
O
0,
0, 0

; 1 0.0 1 0

H@2,0 0 1
'''
>>> mol.build()
>>> print(mol.atom)
[['O', [0.0, 0.0, 0.0]], ['H', [0.0, 1.0, 0.0]], ['H@2', [0.0, 0.0, 1.0]]]

Input Basis
There are various ways to input basis sets. Besides the input of universal basis string and basis dict:

26

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

mol.basis = 'sto3g'
mol.basis = {'O': 'sto3g', 'H': '6-31g'}

basis can be input with helper functions. Function basis.parse() can parse a basis string of NWChem format
(https://bse.pnl.gov/bse/portal):
mol.basis = {'O': gto.basis.parse('''
C
S
71.6168370
0.15432897
13.0450960
0.53532814
3.5305122
0.44463454
C
SP
2.9412494
-0.09996723
0.6834831
0.39951283
0.2222899
0.70011547
''')}

0.15591627
0.60768372
0.39195739

Functions basis.load() can be load arbitrary basis from the database, even the basis which does not match the
element.
mol.basis = {‘H’: gto.basis.load(‘sto3g’, ‘C’)}
Both basis.parse() and basis.load() return the basis set in the internal format (See the basis_internal_format).
Basis parser supports “Ghost” atom:
mol.basis = {'GHOST': gto.basis.load('cc-pvdz', 'O'), 'H': 'sto3g'}

More examples of inputing ghost atoms can be found in examples/gto/03-ghost_atom.py
Like the requirements of geometry input, you can use atomic symbol (case-insensitive) or the atomic nuclear charge,
as the keyword of the basis dict. Prefix and suffix of numbers and special characters are allowed. If the decorated
atomic symbol is appeared in atom but not basis, the basis parser will remove all decorations then seek the pure
atomic symbol in basis dict. In the following example, 6-31G basis will be assigned to the second H atom, but
STO-3G will be used for the third atom:
mol.atom = '8 0 0 0; h1 0 1 0; H2 0 0 1'
mol.basis = {'O': 'sto-3g', 'H': 'sto3g', 'H1': '6-31G'}

Command line
Some of the input variables can be passed from command line:
$ python example.py -o /path/to/my_log.txt -m 1000

This command line specifies the output file and the maximum of memory for the calculation. By default, command
line has the highest priority, which means our settings in the script will be overwritten by the command line arguments.
To make the input parser ignore the command line arguments, you can call the Mole.build() with:
mol.build(0, 0)

The first 0 prevent build() dumping the input file. The second 0 prevent build() parsing command line.

1.4. gto — Molecular structure and GTO basis

27

PySCF Documentation, Release 1.4.0

1.4.2 Program reference
mole
Mole class handles three layers: input, internal format, libcint arguments. The relationship of the three layers are:
.atom (input) <=> ._atom (for python) <=> ._atm (for libcint)
.basis (input) <=> ._basis (for python) <=> ._bas (for libcint)

input layer does not talk to libcint directly. Data are held in python internal fomrat layer. Most of methods defined in this class only operates on the internal format. Exceptions are make_env, make_atm_env, make_bas_env,
set_common_orig_(), set_rinv_orig_() which are used to manipulate the libcint arguments.
pyscf.gto.mole.M(**kwargs)
This is a shortcut to build up Mole object.
Args: Same to Mole.build()
Examples:
>>> from pyscf import gto
>>> mol = gto.M(atom='H 0 0 0; F 0 0 1', basis='6-31g')

class pyscf.gto.mole.Mole(**kwargs)
Basic class to hold molecular structure and global options
Attributes:
verbose [int] Print level
output [str or None] Output file, default is None which dumps msg to sys.stdout
max_memory [int, float] Allowed memory in MB
charge [int] Charge of molecule. It affects the electron numbers
spin [int] 2S, num. alpha electrons - num. beta electrons
symmetry [bool or str] Whether to use symmetry. When this variable is set to True, the molecule will be
rotated and the highest rotation axis will be placed z-axis. If a string is given as the name of point
group, the given point group symmetry will be used. Note that the input molecular coordinates will
not be changed in this case.
symmetry_subgroup [str] subgroup
atom [list or str] To define molecluar structure. The internal format is

atom = [[atom1, (x, y, z)],
[atom2, (x, y, z)],
...
[atomN, (x, y, z)]]

unit [str] Angstrom or Bohr
basis [dict or str] To define basis set.
nucmod [dict or str] Nuclear model. Set it to 0, None or False for point nuclear model. Any other values
will enable Gaussian nuclear model. Default is point nuclear model.

28

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

cart [boolean] Using Cartesian GTO basis and integrals (6d,10f,15g)
** Following attributes are generated by Mole.build() **
stdout [file object] Default is sys.stdout if Mole.output is not set
groupname [str] One of D2h, C2h, C2v, D2, Cs, Ci, C2, C1
nelectron [int] sum of nuclear charges - Mole.charge
symm_orb [a list of numpy.ndarray] Symmetry adapted basis. Each element is a set of symm-adapted
orbitals for one irreducible representation. The list index does not correspond to the id of irreducible
representation.
irrep_id [a list of int] Each element is one irreducible representation id associated with the basis stored in
symm_orb. One irrep id stands for one irreducible representation symbol. The irrep symbol and the
relevant id are defined in symm.param.IRREP_ID_TABLE
irrep_name [a list of str] Each element is one irreducible representation symbol associated with the basis
stored in symm_orb. The irrep symbols are defined in symm.param.IRREP_ID_TABLE
_built [bool] To label whether Mole.build() has been called. It ensures some functions being initialized once.
_basis [dict] like Mole.basis,
format_basis()

the internal format which is returned from the parser

_keys [a set of str] Store the keys appeared in the module. It is used to check misinput attributes
** Following attributes are arguments used by libcint library **
_atm : [[charge,ptr-of-coord,nuc-model,ptr-zeta,0,0],[...]]
reperesents one atom

each element

natm : number of atoms

_bas : [[atom-id,angular-momentum,num-primitive-GTO,num-contracted-GTO,0,ptr-of-exps,
each element reperesents one shell
nbas : number of shells
_env : list of floats to store the coordinates, GTO exponents, contract-coefficients
Examples:
>>> mol = Mole(atom='H^2 0 0 0; H 0 0 1.1', basis='sto3g').build()
>>> print(mol.atom_symbol(0))
H^2
>>> print(mol.atom_pure_symbol(0))
H
>>> print(mol.nao_nr())
2
>>> print(mol.intor('int1e_ovlp_sph'))
[[ 0.99999999 0.43958641]
[ 0.43958641 0.99999999]]
>>> mol.charge = 1
>>> mol.build()
 has no attributes Charge

ao_labels(mol, fmt=True)
Labels for AO basis functions
Kwargs: fmt : str or bool if fmt is boolean, it controls whether to format the labels and the default format
is “%d%3s %s%-4s”. if fmt is string, the string will be used as the print format.

1.4. gto — Molecular structure and GTO basis

29

PySCF Documentation, Release 1.4.0

Returns: List of [(atom-id, symbol-str, nl-str, str-of-AO-notation)] or formatted strings based on the argument “fmt”
ao_loc_2c(mol)
Offset of every shell in the spinor basis function spectrum
Returns: list, each entry is the corresponding start id of spinor function
Examples:
>>> mol = gto.M(atom='O 0 0 0; C 0 0 1', basis='6-31g')
>>> gto.ao_loc_2c(mol)
[0, 2, 4, 6, 12, 18, 20, 22, 24, 30, 36]

ao_loc_nr(mol, cart=False)
Offset of every shell in the spherical basis function spectrum
Returns: list, each entry is the corresponding start basis function id
Examples:
>>> mol = gto.M(atom='O 0 0 0; C 0 0 1', basis='6-31g')
>>> gto.ao_loc_nr(mol)
[0, 1, 2, 3, 6, 9, 10, 11, 12, 15, 18]

aoslice_2c_by_atom(mol)
2-component AO offset for each atom. Return a list, each item of the list gives (start-shell-id, stop-shell-id,
start-AO-id, stop-AO-id)
aoslice_by_atom(mol, ao_loc=None)
AO offsets for each atom. Return a list, each item of the list gives (start-shell-id, stop-shell-id, start-AO-id,
stop-AO-id)
aoslice_nr_by_atom(mol, ao_loc=None)
AO offsets for each atom. Return a list, each item of the list gives (start-shell-id, stop-shell-id, start-AO-id,
stop-AO-id)
atom_charge(atm_id)
Nuclear effective charge of the given atom id Note “atom_charge /= _charge(atom_symbol)” when ECP is
enabled. Number of electrons screened by ECP can be obtained by _charge(atom_symbol)-atom_charge
Args:
atm_id [int] 0-based
Examples:
>>> mol.build(atom='H 0 0 0; Cl 0 0 1.1')
>>> mol.atom_charge(1)
17

atom_charges()
np.asarray([mol.atom_charge(i) for i in range(mol.natm)])
atom_coord(atm_id)
Coordinates (ndarray) of the given atom id
Args:
atm_id [int] 0-based
Examples:

30

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

>>> mol.build(atom='H 0 0 0; Cl 0 0 1.1')
>>> mol.atom_coord(1)
[ 0.
0.
2.07869874]

atom_coords()
np.asarray([mol.atom_coords(i) for i in range(mol.natm)])
atom_nelec_core(atm_id)
Number of core electrons for pseudo potential.
atom_nshells(atm_id)
Number of basis/shells of the given atom
Args:
atm_id [int] 0-based
Examples:
>>> mol.build(atom='H 0 0 0; Cl 0 0 1.1')
>>> mol.atom_nshells(1)
5

atom_pure_symbol(atm_id)
For the given atom id, return the standard symbol (striping special characters)
Args:
atm_id [int] 0-based
Examples:
>>> mol.build(atom='H^2 0 0 0; H 0 0 1.1')
>>> mol.atom_symbol(0)
H

atom_shell_ids(atm_id)
A list of the shell-ids of the given atom
Args:
atm_id [int] 0-based
Examples:
>>> mol.build(atom='H 0 0 0; Cl 0 0 1.1', basis='cc-pvdz')
>>> mol.atom_shell_ids(1)
[3, 4, 5, 6, 7]

atom_symbol(atm_id)
For the given atom id, return the input symbol (without striping special characters)
Args:
atm_id [int] 0-based
Examples:
>>> mol.build(atom='H^2 0 0 0; H 0 0 1.1')
>>> mol.atom_symbol(0)
H^2

1.4. gto — Molecular structure and GTO basis

31

PySCF Documentation, Release 1.4.0

bas_angular(bas_id)
The angular momentum associated with the given basis
Args:
bas_id [int] 0-based
Examples:
>>> mol.build(atom='H 0 0 0; Cl 0 0 1.1', basis='cc-pvdz')
>>> mol.bas_atom(7)
2

bas_atom(bas_id)
The atom (0-based id) that the given basis sits on
Args:
bas_id [int] 0-based
Examples:
>>> mol.build(atom='H 0 0 0; Cl 0 0 1.1', basis='cc-pvdz')
>>> mol.bas_atom(7)
1

bas_coord(bas_id)
Coordinates (ndarray) associated with the given basis id
Args:
bas_id [int] 0-based
Examples:
>>> mol.build(atom='H 0 0 0; Cl 0 0 1.1')
>>> mol.bas_coord(1)
[ 0.
0.
2.07869874]

bas_ctr_coeff(bas_id)
Contract coefficients (ndarray) of the given shell
Args:
bas_id [int] 0-based
Examples:
>>> mol.M(atom='H 0 0 0; Cl 0 0 1.1', basis='cc-pvdz')
>>> mol.bas_ctr_coeff(0)
[[ 10.03400444]
[ 4.1188704 ]
[ 1.53971186]]

bas_exp(bas_id)
exponents (ndarray) of the given shell
Args:
bas_id [int] 0-based
Examples:

32

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

>>> mol.build(atom='H 0 0 0; Cl 0 0 1.1', basis='cc-pvdz')
>>> mol.bas_kappa(0)
[ 13.01
1.962
0.4446]

bas_kappa(bas_id)
Kappa (if l < j, -l-1, else l) of the given shell
Args:
bas_id [int] 0-based
Examples:
>>> mol.build(atom='H 0 0 0; Cl 0 0 1.1', basis='cc-pvdz')
>>> mol.bas_kappa(3)
0

bas_len_cart(bas_id)
The number of Cartesian function associated with given basis
bas_len_spinor(bas_id)
The number of spinor associated with given basis If kappa is 0, return 4l+2
bas_nctr(bas_id)
The number of contracted GTOs for the given shell
Args:
bas_id [int] 0-based
Examples:
>>> mol.build(atom='H 0 0 0; Cl 0 0 1.1', basis='cc-pvdz')
>>> mol.bas_atom(3)
3

bas_nprim(bas_id)
The number of primitive GTOs for the given shell
Args:
bas_id [int] 0-based
Examples:
>>> mol.build(atom='H 0 0 0; Cl 0 0 1.1', basis='cc-pvdz')
>>> mol.bas_atom(3)
11

build(dump_input=True, parse_arg=True, verbose=None, output=None, max_memory=None,
atom=None, basis=None, unit=None, nucmod=None, ecp=None, charge=None, spin=None,
symmetry=None, symmetry_subgroup=None, cart=None)
Setup moleclue and initialize some control parameters. Whenever you change the value of the attributes
of Mole, you need call this function to refresh the internal data of Mole.
Kwargs:
dump_input [bool] whether to dump the contents of input file in the output file
parse_arg [bool] whether to read the sys.argv and overwrite the relevant parameters
verbose [int] Print level. If given, overwrite Mole.verbose

1.4. gto — Molecular structure and GTO basis

33

PySCF Documentation, Release 1.4.0

output [str or None] Output file. If given, overwrite Mole.output
max_memory [int, float] Allowd memory in MB. If given, overwrite Mole.max_memory
atom [list or str] To define molecluar structure.
basis [dict or str] To define basis set.
nucmod [dict or str] Nuclear model. If given, overwrite Mole.nucmod
charge [int] Charge of molecule. It affects the electron numbers If given, overwrite Mole.charge
spin [int] 2S, num. alpha electrons - num. beta electrons If given, overwrite Mole.spin
symmetry [bool or str] Whether to use symmetry. If given a string of point group name, the given
point group symmetry will be used.
cart2sph_coeff(normalized=’sp’)
Transformation matrix to transform the Cartesian GTOs to spherical GTOs
Kwargs:
normalized [string or boolean] How the Cartesian GTOs are normalized. Except s and p functions,
Cartesian GTOs do not have the universal normalization coefficients for the different components
of the same shell. The value of this argument can be one of ‘sp’, ‘all’, None. ‘sp’ means the
Cartesian s and p basis are normalized. ‘all’ means all Cartesian functions are normalized. None
means none of the Cartesian functions are normalized.
Examples:
>>>
>>>
>>>
>>>
>>>
>>>

mol = gto.M(atom='H 0 0 0; F 0 0 1', basis='ccpvtz')
c = mol.cart2sph_coeff()
s0 = mol.intor('int1e_ovlp_sph')
s1 = c.T.dot(mol.intor('int1e_ovlp_cart')).dot(c)
print(abs(s1-s0).sum())
4.58676826646e-15

cart_labels(fmt=False)
Labels for Cartesian GTO functions
Kwargs: fmt : str or bool if fmt is boolean, it controls whether to format the labels and the default format
is “%d%3s %s%-4s”. if fmt is string, the string will be used as the print format.
Returns: List of [(atom-id, symbol-str, nl-str, str-of-xyz-notation)] or formatted strings based on the argument “fmt”
condense_to_shell(mol, mat, compressor=)
The given matrix is first partitioned to blocks, based on AO shell as delimiter. Then call compressor
function to abstract each block.
dumps(mol)
Serialize Mole object to a JSON formatted str.
energy_nuc(mol, charges=None, coords=None)
Compute nuclear repulsion energy (AU) or static Coulomb energy
Returns float
etbs(etbs)
Generate even tempered basis. See also expand_etb()
Args: etbs = [(l, n, alpha, beta), (l, n, alpha, beta),...]
Returns: Formated basis

34

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

Examples:
>>> gto.expand_etbs([(0, 2, 1.5, 2.), (1, 2, 1, 2.)])
[[0, [6.0, 1]], [0, [3.0, 1]], [1, [1., 1]], [1, [2., 1]]]

eval_gto(mol, eval_name, coords, comp=1, shls_slice=None, non0tab=None, ao_loc=None,
out=None)
Evaluate AO function value on the given grids,
Args: eval_name : str
Function
“GTOval_sph”
“GTOval_ip_sph”
“GTOval_ig_sph”
“GTOval_ipig_sph”
“GTOval_cart”
“GTOval_ip_cart”
“GTOval_ig_cart”

Expression
|AO>
nabla |AO>
(#C(0 1) g) |AO>
(#C(0 1) nabla g) |AO>
|AO>
nabla |AO>
(#C(0 1) g)|AO>

atm [int32 ndarray] libcint integral function argument
bas [int32 ndarray] libcint integral function argument
env [float64 ndarray] libcint integral function argument
coords [2D array, shape (N,3)] The coordinates of the grids.
Kwargs:
shls_slice [2-element list] (shl_start, shl_end). If given, only part of AOs (shl_start <= shell_id <
shl_end) are evaluated. By default, all shells defined in mol will be evaluated.
non0tab [2D bool array] mask array to indicate whether the AO values are zero. The mask array can
be obtained by calling make_mask()
out [ndarray] If provided, results are written into this array.
Returns: 2D array of shape (N,nao) Or 3D array of shape (*,N,nao) for AO values
Examples:
>>> mol = gto.M(atom='O 0 0 0; H 0 0 1; H 0 1 0', basis='ccpvdz')
>>> coords = numpy.random.random((100,3)) # 100 random points
>>> ao_value = mol.eval_gto("GTOval_sph", coords)
>>> print(ao_value.shape)
(100, 24)
>>> ao_value = mol.eval_gto("GTOval_ig_sph", coords, comp=3)
>>> print(ao_value.shape)
(3, 100, 24)

expand_etb(l, n, alpha, beta)
Generate the exponents of even tempered basis for Mole.basis. .. math:
e = e^{-\alpha * \beta^{i-1}} for i = 1 .. n

Args:
l [int] Angular momentum

1.4. gto — Molecular structure and GTO basis

35

PySCF Documentation, Release 1.4.0

n [int] Number of GTOs
Returns: Formated basis
Examples:
>>> gto.expand_etb(1, 3, 1.5, 2)
[[1, [6.0, 1]], [1, [3.0, 1]], [1, [1.5, 1]]]

expand_etbs(etbs)
Generate even tempered basis. See also expand_etb()
Args: etbs = [(l, n, alpha, beta), (l, n, alpha, beta),...]
Returns: Formated basis
Examples:
>>> gto.expand_etbs([(0, 2, 1.5, 2.), (1, 2, 1, 2.)])
[[0, [6.0, 1]], [0, [3.0, 1]], [1, [1., 1]], [1, [2., 1]]]

format_atom(atom, origin=0, axes=None, unit=’Ang’)
Convert the input Mole.atom to the internal data format. Including, changing the nuclear charge to atom
symbol, converting the coordinates to AU, rotate and shift the molecule. If the atom is a string, it takes ”;”
and “n” for the mark to separate atoms; ”,” and arbitrary length of blank space to spearate the individual
terms for an atom. Blank line will be ignored.
Args:
atoms [list or str] the same to Mole.atom
Kwargs:
origin [ndarray] new axis origin.
axes [ndarray] (new_x, new_y, new_z), each entry is a length-3 array
unit [str or number] If unit is one of strings (B, b, Bohr, bohr, AU, au), the coordinates of the input
atoms are the atomic unit; If unit is one of strings (A, a, Angstrom, angstrom, Ang, ang), the
coordinates are in the unit of angstrom; If a number is given, the number are considered as the
Bohr value (in angstrom), which should be around 0.53
Returns: “atoms” in the internal format as _atom
Examples:
>>> gto.format_atom('9,0,0,0; h@1 0 0 1', origin=(1,1,1))
[['F', [-1.0, -1.0, -1.0]], ['H@1', [-1.0, -1.0, 0.0]]]
>>> gto.format_atom(['9,0,0,0', (1, (0, 0, 1))], origin=(1,1,1))
[['F', [-1.0, -1.0, -1.0]], ['H', [-1, -1, 0]]]

format_basis(basis_tab)
Convert the input Mole.basis to the internal data format.
‘‘{ atom: [(l, ((-exp, c_1, c_2, ..),
(-exp, c_1, c_2, ..))),
(l, ((-exp, c_1, c_2, ..), (-exp, c_1, c_2, ..)))], ... }‘‘
Args:
basis_tab [dict] Similar to Mole.basis, it cannot be a str
36

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

Returns: Formated basis
Examples:
>>> gto.format_basis({'H':'sto-3g', 'H^2': '3-21g'})
{'H': [[0,
[3.4252509099999999, 0.15432897000000001],
[0.62391373000000006, 0.53532813999999995],
[0.16885539999999999, 0.44463454000000002]]],
'H^2': [[0,
[5.4471780000000001, 0.15628500000000001],
[0.82454700000000003, 0.90469100000000002]],
[0, [0.18319199999999999, 1.0]]]}

format_ecp(ecp_tab)
Convert the input ecp (dict) to the internal data format:
{ atom: (nelec,

# core electrons

((l, # l=-1 for UL, l>=0 for Ul to indicate |l>>> print gto_norm(0, 1)
2.5264751109842591

has_ecp()
Whether pesudo potential is used in the system.
intor(intor, comp=1, hermi=0, aosym=’s1’, out=None, shls_slice=None)
Integral generator.
Args:

1.4. gto — Molecular structure and GTO basis

37

PySCF Documentation, Release 1.4.0

intor [str] Name of the 1e or 2e AO integrals. Ref to getints() for the complete list of available
1-electron integral names
Kwargs:
comp [int] Components of the integrals, e.g. int1e_ipovlp_sph has 3 components.
hermi [int] Symmetry of the integrals

0 : no symmetry assumed (default)
1 : hermitian
2 : anti-hermitian

Returns: ndarray of 1-electron integrals, can be either 2-dim or 3-dim, depending on comp
Examples:
>>> mol.build(atom='H 0 0 0; H 0 0 1.1', basis='sto-3g')
>>> mol.intor('int1e_ipnuc_sph', comp=3) # 
[[[ 0.
0.
]
[ 0.
0.
]]
[[ 0.
0.
]
[ 0.
0.
]]
[[ 0.10289944 0.48176097]
[-0.48176097 -0.10289944]]]
>>> mol.intor('int1e_nuc_spinor')
[[-1.69771092+0.j 0.00000000+0.j -0.67146312+0.j 0.00000000+0.j]
[ 0.00000000+0.j -1.69771092+0.j 0.00000000+0.j -0.67146312+0.j]
[-0.67146312+0.j 0.00000000+0.j -1.69771092+0.j 0.00000000+0.j]
[ 0.00000000+0.j -0.67146312+0.j 0.00000000+0.j -1.69771092+0.j]]

intor_asymmetric(intor, comp=1)
One-electron integral generator. The integrals are assumed to be anti-hermitian
Args:
intor [str] Name of the 1-electron integral. Ref to getints() for the complete list of available
1-electron integral names
Kwargs:
comp [int] Components of the integrals, e.g. int1e_ipovlp has 3 components.
Returns: ndarray of 1-electron integrals, can be either 2-dim or 3-dim, depending on comp
Examples:
>>> mol.build(atom='H 0 0 0; H 0 0 1.1', basis='sto-3g')
>>> mol.intor_asymmetric('int1e_nuc_spinor')
[[-1.69771092+0.j 0.00000000+0.j 0.67146312+0.j 0.00000000+0.j]
[ 0.00000000+0.j -1.69771092+0.j 0.00000000+0.j 0.67146312+0.j]
[-0.67146312+0.j 0.00000000+0.j -1.69771092+0.j 0.00000000+0.j]
[ 0.00000000+0.j -0.67146312+0.j 0.00000000+0.j -1.69771092+0.j]]

intor_by_shell(intor, shells, comp=1)
For given 2, 3 or 4 shells, interface for libcint to get 1e, 2e, 2-center-2e or 3-center-2e integrals
Args:
intor_name [str] See also getints() for the supported intor_name
38

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

shls [list of int] The AO shell-ids of the integrals
atm [int32 ndarray] libcint integral function argument
bas [int32 ndarray] libcint integral function argument
env [float64 ndarray] libcint integral function argument
Kwargs:
comp [int] Components of the integrals, e.g. int1e_ipovlp has 3 components.
Returns: ndarray of 2-dim to 5-dim, depending on the integral type (1e, 2e, 3c-2e, 2c2e) and the value
of comp
Examples: The gradients of the spherical 2e integrals
>>> mol.build(atom='H 0 0 0; H 0 0 1.1', basis='sto-3g')
>>> gto.getints_by_shell('int2e_ip1_sph', (0,1,0,1), mol._atm, mol._bas, mol.
˓→_env, comp=3)
[[[[[-0.
]]]]
[[[[-0.
]]]]
[[[[-0.08760462]]]]]

intor_symmetric(intor, comp=1)
One-electron integral generator. The integrals are assumed to be hermitian
Args:
intor [str] Name of the 1-electron integral. Ref to getints() for the complete list of available
1-electron integral names
Kwargs:
comp [int] Components of the integrals, e.g. int1e_ipovlp_sph has 3 components.
Returns: ndarray of 1-electron integrals, can be either 2-dim or 3-dim, depending on comp
Examples:
>>> mol.build(atom='H 0 0 0; H 0 0 1.1', basis='sto-3g')
>>> mol.intor_symmetric('int1e_nuc_spinor')
[[-1.69771092+0.j 0.00000000+0.j -0.67146312+0.j 0.00000000+0.j]
[ 0.00000000+0.j -1.69771092+0.j 0.00000000+0.j -0.67146312+0.j]
[-0.67146312+0.j 0.00000000+0.j -1.69771092+0.j 0.00000000+0.j]
[ 0.00000000+0.j -0.67146312+0.j 0.00000000+0.j -1.69771092+0.j]]

kernel(dump_input=True, parse_arg=True, verbose=None, output=None, max_memory=None,
atom=None, basis=None, unit=None, nucmod=None, ecp=None, charge=None, spin=None,
symmetry=None, symmetry_subgroup=None, cart=None)
Setup moleclue and initialize some control parameters. Whenever you change the value of the attributes
of Mole, you need call this function to refresh the internal data of Mole.
Kwargs:
dump_input [bool] whether to dump the contents of input file in the output file
parse_arg [bool] whether to read the sys.argv and overwrite the relevant parameters
verbose [int] Print level. If given, overwrite Mole.verbose
output [str or None] Output file. If given, overwrite Mole.output
max_memory [int, float] Allowd memory in MB. If given, overwrite Mole.max_memory

1.4. gto — Molecular structure and GTO basis

39

PySCF Documentation, Release 1.4.0

atom [list or str] To define molecluar structure.
basis [dict or str] To define basis set.
nucmod [dict or str] Nuclear model. If given, overwrite Mole.nucmod
charge [int] Charge of molecule. It affects the electron numbers If given, overwrite Mole.charge
spin [int] 2S, num. alpha electrons - num. beta electrons If given, overwrite Mole.spin
symmetry [bool or str] Whether to use symmetry. If given a string of point group name, the given
point group symmetry will be used.
loads(molstr)
Deserialize a str containing a JSON document to a Mole object.
nao_2c(mol)
Total number of contracted spinor GTOs for the given Mole object
nao_2c_range(mol, bas_id0, bas_id1)
Lower and upper boundary of contracted spinor basis functions associated with the given shell range
Args:
mol : Mole object
bas_id0 [int] start shell id, 0-based
bas_id1 [int] stop shell id, 0-based
Returns: tupel of start basis function id and the stop function id
Examples:
>>> mol = gto.M(atom='O 0 0 0; C 0 0 1', basis='6-31g')
>>> gto.nao_2c_range(mol, 2, 4)
(4, 12)

nao_cart(mol)
Total number of contracted cartesian GTOs for the given Mole object
nao_nr(mol, cart=False)
Total number of contracted spherical GTOs for the given Mole object
nao_nr_range(mol, bas_id0, bas_id1)
Lower and upper boundary of contracted spherical basis functions associated with the given shell range
Args:
mol : Mole object
bas_id0 [int] start shell id
bas_id1 [int] stop shell id
Returns: tupel of start basis function id and the stop function id
Examples:
>>> mol = gto.M(atom='O 0 0 0; C 0 0 1', basis='6-31g')
>>> gto.nao_nr_range(mol, 2, 4)
(2, 6)

npgto_nr(mol, cart=False)
Total number of primitive spherical GTOs for the given Mole object

40

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

offset_2c_by_atom(mol)
2-component AO offset for each atom. Return a list, each item of the list gives (start-shell-id, stop-shell-id,
start-AO-id, stop-AO-id)
offset_ao_by_atom(mol, ao_loc=None)
AO offsets for each atom. Return a list, each item of the list gives (start-shell-id, stop-shell-id, start-AO-id,
stop-AO-id)
offset_nr_by_atom(mol, ao_loc=None)
AO offsets for each atom. Return a list, each item of the list gives (start-shell-id, stop-shell-id, start-AO-id,
stop-AO-id)
pack(mol)
Pack the input args of Mole to a dict.
Note this function only pack the input arguments (not the entire Mole class). Modifications to mol._atm,
mol._bas, mol._env are not tracked. Use dumps() to serialize the entire Mole object.
search_ao_label(mol, label)
Find the index of the AO basis function based on the given ao_label
Args:
ao_label [string or a list of strings] The regular expression pattern to match the orbital labels returned by mol.ao_labels()
Returns: A list of index for the AOs that matches the given ao_label RE pattern
Examples:
>>>
>>>
[19
>>>
[19
>>>
[25

mol = gto.M(atom='H 0 0 0; Cl 0 0 1', basis='ccpvtz')
mol.parse_aolabel('Cl.*p')
20 21 22 23 24 25 26 27 28 29 30]
mol.parse_aolabel('Cl 2p')
20 21]
mol.parse_aolabel(['Cl.*d', 'Cl 4p'])
26 27 31 32 33 34 35 36 37 38 39 40]

search_ao_nr(mol, atm_id, l, m, atmshell)
Search the first basis function id (not the shell id) which matches the given atom-id, angular momentum
magnetic angular momentum, principal shell.
Args:
atm_id [int] atom id, 0-based
l [int] angular momentum
m [int] magnetic angular momentum
atmshell [int] principal quantum number
Returns: basis function id, 0-based. If not found, return None
Examples:
>>> mol = gto.M(atom='H 0 0 0; Cl 0 0 1', basis='sto-3g')
>>> mol.search_ao_nr(1, 1, -1, 3) # Cl 3px
7

set_common_orig(coord)
Update common origin which held in :class‘Mole‘._env. Note the unit is Bohr
Examples:
1.4. gto — Molecular structure and GTO basis

41

PySCF Documentation, Release 1.4.0

>>> mol.set_common_orig(0)
>>> mol.set_common_orig((1,0,0))

set_common_orig_(coord)
Update common origin which held in :class‘Mole‘._env. Note the unit is Bohr
Examples:
>>> mol.set_common_orig(0)
>>> mol.set_common_orig((1,0,0))

set_common_origin(coord)
Update common origin which held in :class‘Mole‘._env. Note the unit is Bohr
Examples:
>>> mol.set_common_orig(0)
>>> mol.set_common_orig((1,0,0))

set_common_origin_(coord)
Update common origin which held in :class‘Mole‘._env. Note the unit is Bohr
Examples:
>>> mol.set_common_orig(0)
>>> mol.set_common_orig((1,0,0))

set_f12_zeta(zeta)
Set zeta for YP exp(-zeta r12)/r12 or STG exp(-zeta r12) type integrals
set_geom_(atoms, unit=’Angstrom’, symmetry=None)
Replace geometry
set_nuc_mod(atm_id, zeta)
Change the nuclear charge distribution of the given atom ID. The charge distribution is defined as: rho(r) =
nuc_charge * Norm * exp(-zeta * r^2). This function can only be called after .build() method is executed.
Examples:
>>> for ia in range(mol.natm):
...
zeta = gto.filatov_nuc_mod(mol.atom_charge(ia))
...
mol.set_nuc_mod(ia, zeta)

set_nuc_mod_(atm_id, zeta)
Change the nuclear charge distribution of the given atom ID. The charge distribution is defined as: rho(r) =
nuc_charge * Norm * exp(-zeta * r^2). This function can only be called after .build() method is executed.
Examples:
>>> for ia in range(mol.natm):
...
zeta = gto.filatov_nuc_mod(mol.atom_charge(ia))
...
mol.set_nuc_mod(ia, zeta)

set_range_coulomb(omega)
Apply the long range part of range-separated Coulomb operator for all 2e integrals erf(omega r12) / r12
set omega to 0 to siwtch off the range-separated Coulomb
set_range_coulomb_(omega)
Apply the long range part of range-separated Coulomb operator for all 2e integrals erf(omega r12) / r12
set omega to 0 to siwtch off the range-separated Coulomb
42

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

set_rinv_orig(coord)
Update origin for operator

1
|𝑟−𝑅𝑂 | .

Note the unit is Bohr

Examples:
>>> mol.set_rinv_orig(0)
>>> mol.set_rinv_orig((0,1,0))

set_rinv_orig_(coord)
Update origin for operator

1
|𝑟−𝑅𝑂 | .

Note the unit is Bohr

Examples:
>>> mol.set_rinv_orig(0)
>>> mol.set_rinv_orig((0,1,0))

set_rinv_origin(coord)
Update origin for operator

1
|𝑟−𝑅𝑂 | .

Note the unit is Bohr

Examples:
>>> mol.set_rinv_orig(0)
>>> mol.set_rinv_orig((0,1,0))

set_rinv_origin_(coord)
1
. Note the unit is Bohr
Update origin for operator |𝑟−𝑅
𝑂|
Examples:
>>> mol.set_rinv_orig(0)
>>> mol.set_rinv_orig((0,1,0))

set_rinv_zeta(zeta)
Assume the charge distribution on the “rinv_orig”. zeta is the parameter to control the charge distribution: rho(r) = Norm * exp(-zeta * r^2). Be careful when call this function. It affects the behavior of
int1e_rinv_* functions. Make sure to set it back to 0 after using it!
set_rinv_zeta_(zeta)
Assume the charge distribution on the “rinv_orig”. zeta is the parameter to control the charge distribution: rho(r) = Norm * exp(-zeta * r^2). Be careful when call this function. It affects the behavior of
int1e_rinv_* functions. Make sure to set it back to 0 after using it!
spheric_labels(fmt=False)
Labels for spherical GTO functions
Kwargs: fmt : str or bool if fmt is boolean, it controls whether to format the labels and the default format
is “%d%3s %s%-4s”. if fmt is string, the string will be used as the print format.
Returns: List of [(atom-id, symbol-str, nl-str, str-of-real-spherical-notation] or formatted strings based
on the argument “fmt”
Examples:
>>> mol = gto.M(atom='H 0 0 0; Cl 0 0 1', basis='sto-3g')
>>> gto.spherical_labels(mol)
[(0, 'H', '1s', ''), (1, 'Cl', '1s', ''), (1, 'Cl', '2s', ''), (1, 'Cl', '3s
˓→', ''), (1, 'Cl', '2p', 'x'), (1, 'Cl', '2p', 'y'), (1, 'Cl', '2p', 'z'),
˓→(1, 'Cl', '3p', 'x'), (1, 'Cl', '3p', 'y'), (1, 'Cl', '3p', 'z')]

spherical_labels(fmt=False)
Labels for spherical GTO functions
1.4. gto — Molecular structure and GTO basis

43

PySCF Documentation, Release 1.4.0

Kwargs: fmt : str or bool if fmt is boolean, it controls whether to format the labels and the default format
is “%d%3s %s%-4s”. if fmt is string, the string will be used as the print format.
Returns: List of [(atom-id, symbol-str, nl-str, str-of-real-spherical-notation] or formatted strings based
on the argument “fmt”
Examples:
>>> mol = gto.M(atom='H 0 0 0; Cl 0 0 1', basis='sto-3g')
>>> gto.spherical_labels(mol)
[(0, 'H', '1s', ''), (1, 'Cl', '1s', ''), (1, 'Cl', '2s', ''), (1, 'Cl', '3s
˓→', ''), (1, 'Cl', '2p', 'x'), (1, 'Cl', '2p', 'y'), (1, 'Cl', '2p', 'z'),
˓→(1, 'Cl', '3p', 'x'), (1, 'Cl', '3p', 'y'), (1, 'Cl', '3p', 'z')]

time_reversal_map(mol)
The index to map the spinor functions and its time reversal counterpart. The returned indices have postive
or negative values. For the i-th basis function, if the returned j = idx[i] < 0, it means 𝑇 |𝑖⟩ = −|𝑗⟩,
otherwise 𝑇 |𝑖⟩ = |𝑗⟩
tot_electrons(mol)
Total number of electrons for the given molecule
Returns: electron number in integer
Examples:
>>> mol = gto.M(atom='H 0 1 0; C 0 0 1', charge=1)
>>> mol.tot_electrons()
6

unpack(moldic)
Unpack a dict which is packed by pack(), to generate the input arguments for Mole object.
pyscf.gto.mole.ao_labels(mol, fmt=True)
Labels for AO basis functions
Kwargs: fmt : str or bool if fmt is boolean, it controls whether to format the labels and the default format is
“%d%3s %s%-4s”. if fmt is string, the string will be used as the print format.
Returns: List of [(atom-id, symbol-str, nl-str, str-of-AO-notation)] or formatted strings based on the argument
“fmt”
pyscf.gto.mole.ao_loc_2c(mol)
Offset of every shell in the spinor basis function spectrum
Returns: list, each entry is the corresponding start id of spinor function
Examples:
>>> mol = gto.M(atom='O 0 0 0; C 0 0 1', basis='6-31g')
>>> gto.ao_loc_2c(mol)
[0, 2, 4, 6, 12, 18, 20, 22, 24, 30, 36]

pyscf.gto.mole.ao_loc_nr(mol, cart=False)
Offset of every shell in the spherical basis function spectrum
Returns: list, each entry is the corresponding start basis function id
Examples:

44

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

>>> mol = gto.M(atom='O 0 0 0; C 0 0 1', basis='6-31g')
>>> gto.ao_loc_nr(mol)
[0, 1, 2, 3, 6, 9, 10, 11, 12, 15, 18]

pyscf.gto.mole.aoslice_by_atom(mol, ao_loc=None)
AO offsets for each atom. Return a list, each item of the list gives (start-shell-id, stop-shell-id, start-AO-id,
stop-AO-id)
pyscf.gto.mole.atom_types(atoms, basis=None)
symmetry inequivalent atoms
pyscf.gto.mole.cart2j_kappa(kappa, l=None, normalized=None)
Cartesian to spinor, indexed by kappa
Kwargs:
normalized : How the Cartesian GTOs are normalized. ‘sp’ means the s and p functions are normalized.
pyscf.gto.mole.cart2j_l(l, normalized=None)
Cartesian to spinor, indexed by l
pyscf.gto.mole.cart2sph(l)
Cartesian to real spherical transformation matrix
pyscf.gto.mole.cart2zmat(coord)

>>> c = numpy.array((
(0.000000000000, 1.889726124565, 0.000000000000),
(0.000000000000, 0.000000000000, -1.889726124565),
(1.889726124565, -1.889726124565, 0.000000000000),
(1.889726124565, 0.000000000000, 1.133835674739)))
>>> print cart2zmat(c)
1
1 2.67247631453057
1 4.22555607338457 2 50.7684795164077
1 2.90305235726773 2 79.3904651036893 3 6.20854462618583

pyscf.gto.mole.cart_labels(mol, fmt=True)
Labels for Cartesian GTO functions
Kwargs: fmt : str or bool if fmt is boolean, it controls whether to format the labels and the default format is
“%d%3s %s%-4s”. if fmt is string, the string will be used as the print format.
Returns: List of [(atom-id, symbol-str, nl-str, str-of-xyz-notation)] or formatted strings based on the argument
“fmt”
pyscf.gto.mole.chiral_mol(mol1, mol2=None)
Detect whether the given molelcule is chiral molecule or two molecules are chiral isomers.
pyscf.gto.mole.conc_env(atm1, bas1, env1, atm2, bas2, env2)
Concatenate two Mole’s integral parameters. This function can be used to construct the environment for cross
integrals like
⟨𝜇|𝜈⟩, 𝜇 ∈ 𝑚𝑜𝑙1, 𝜈 ∈ 𝑚𝑜𝑙2
Returns: Concatenated atm, bas, env
Examples: Compute the overlap between H2 molecule and O atom

1.4. gto — Molecular structure and GTO basis

45

PySCF Documentation, Release 1.4.0

>>> mol1 = gto.M(atom='H 0 1 0; H 0 0 1', basis='sto3g')
>>> mol2 = gto.M(atom='O 0 0 0', basis='sto3g')
>>> atm3, bas3, env3 = gto.conc_env(mol1._atm, mol1._bas, mol1._env,
...
mol2._atm, mol2._bas, mol2._env)
>>> gto.moleintor.getints('int1e_ovlp_sph', atm3, bas3, env3, range(2),
˓→range(2,5))
[[ 0.04875181 0.44714688 0.
0.37820346 0.
]
[ 0.04875181 0.44714688 0.
0.
0.37820346]]

pyscf.gto.mole.conc_mol(mol1, mol2)
Concatenate two Mole objects.
pyscf.gto.mole.condense_to_shell(mol, mat, compressor=)
The given matrix is first partitioned to blocks, based on AO shell as delimiter. Then call compressor function to
abstract each block.
pyscf.gto.mole.copy(mol)
Deepcopy of the given Mole object
pyscf.gto.mole.dumps(mol)
Serialize Mole object to a JSON formatted str.
pyscf.gto.mole.dyall_nuc_mod(mass, c=137.03599967994)
Generate the nuclear charge distribution parameter zeta rho(r) = nuc_charge * Norm * exp(-zeta * r^2)
Ref. L. Visscher and K. Dyall, At. Data Nucl. Data Tables, 67, 207 (1997)
pyscf.gto.mole.energy_nuc(mol, charges=None, coords=None)
Compute nuclear repulsion energy (AU) or static Coulomb energy
Returns float
pyscf.gto.mole.etbs(etbs)
Generate even tempered basis. See also expand_etb()
Args: etbs = [(l, n, alpha, beta), (l, n, alpha, beta),...]
Returns: Formated basis
Examples:
>>> gto.expand_etbs([(0, 2, 1.5, 2.), (1, 2, 1, 2.)])
[[0, [6.0, 1]], [0, [3.0, 1]], [1, [1., 1]], [1, [2., 1]]]

pyscf.gto.mole.expand_etb(l, n, alpha, beta)
Generate the exponents of even tempered basis for Mole.basis. .. math:
e = e^{-\alpha * \beta^{i-1}} for i = 1 .. n

Args:
l [int] Angular momentum
n [int] Number of GTOs
Returns: Formated basis
Examples:
>>> gto.expand_etb(1, 3, 1.5, 2)
[[1, [6.0, 1]], [1, [3.0, 1]], [1, [1.5, 1]]]

46

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

pyscf.gto.mole.expand_etbs(etbs)
Generate even tempered basis. See also expand_etb()
Args: etbs = [(l, n, alpha, beta), (l, n, alpha, beta),...]
Returns: Formated basis
Examples:
>>> gto.expand_etbs([(0, 2, 1.5, 2.), (1, 2, 1, 2.)])
[[0, [6.0, 1]], [0, [3.0, 1]], [1, [1., 1]], [1, [2., 1]]]

pyscf.gto.mole.filatov_nuc_mod(nuc_charge, c=137.03599967994)
Generate the nuclear charge distribution parameter zeta rho(r) = nuc_charge * Norm * exp(-zeta * r^2)
Ref. M. Filatov and D. Cremer, Theor. Chem. Acc. 108, 168 (2002)
13. Filatov and D. Cremer, Chem. Phys. Lett. 351, 259 (2002)
pyscf.gto.mole.format_atom(atoms, origin=0, axes=None, unit=’Ang’)
Convert the input Mole.atom to the internal data format. Including, changing the nuclear charge to atom
symbol, converting the coordinates to AU, rotate and shift the molecule. If the atom is a string, it takes ”;” and
“n” for the mark to separate atoms; ”,” and arbitrary length of blank space to spearate the individual terms for
an atom. Blank line will be ignored.
Args:
atoms [list or str] the same to Mole.atom
Kwargs:
origin [ndarray] new axis origin.
axes [ndarray] (new_x, new_y, new_z), each entry is a length-3 array
unit [str or number] If unit is one of strings (B, b, Bohr, bohr, AU, au), the coordinates of the input atoms
are the atomic unit; If unit is one of strings (A, a, Angstrom, angstrom, Ang, ang), the coordinates
are in the unit of angstrom; If a number is given, the number are considered as the Bohr value (in
angstrom), which should be around 0.53
Returns: “atoms” in the internal format as _atom
Examples:
>>> gto.format_atom('9,0,0,0; h@1 0 0 1', origin=(1,1,1))
[['F', [-1.0, -1.0, -1.0]], ['H@1', [-1.0, -1.0, 0.0]]]
>>> gto.format_atom(['9,0,0,0', (1, (0, 0, 1))], origin=(1,1,1))
[['F', [-1.0, -1.0, -1.0]], ['H', [-1, -1, 0]]]

pyscf.gto.mole.format_basis(basis_tab)
Convert the input Mole.basis to the internal data format.
‘‘{ atom: [(l, ((-exp, c_1, c_2, ..),
(-exp, c_1, c_2, ..))),
(l, ((-exp, c_1, c_2, ..), (-exp, c_1, c_2, ..)))], ... }‘‘
Args:
basis_tab [dict] Similar to Mole.basis, it cannot be a str
Returns: Formated basis

1.4. gto — Molecular structure and GTO basis

47

PySCF Documentation, Release 1.4.0

Examples:
>>> gto.format_basis({'H':'sto-3g', 'H^2': '3-21g'})
{'H': [[0,
[3.4252509099999999, 0.15432897000000001],
[0.62391373000000006, 0.53532813999999995],
[0.16885539999999999, 0.44463454000000002]]],
'H^2': [[0,
[5.4471780000000001, 0.15628500000000001],
[0.82454700000000003, 0.90469100000000002]],
[0, [0.18319199999999999, 1.0]]]}

pyscf.gto.mole.format_ecp(ecp_tab)
Convert the input ecp (dict) to the internal data format:
{ atom: (nelec,

# core electrons

((l, # l=-1 for UL, l>=0 for Ul to indicate |l>>> a = """H
H 1 2.67247631453057
H 1 4.22555607338457 2 50.7684795164077
H 1 2.90305235726773 2 79.3904651036893
>>> for x in zmat2cart(a): print x
['H', array([ 0., 0., 0.])]
['H', array([ 2.67247631, 0.
,
['H', array([ 2.67247631, 0.
,
['H', array([ 0.53449526, 0.30859098,

3 6.20854462618583"""

0.
])]
3.27310166])]
2.83668811])]

pyscf.gto.mole.gto_norm(l, expnt)
2
Normalized factor for GTO radial part 𝑔 = 𝑟𝑙 𝑒−𝛼𝑟
√︃
22𝑙+3 (𝑙 + 1)!(2𝑎)𝑙+1.5
1
√︁∫︀
√
=
(2𝑙 + 2)! 𝜋
𝑔 2 𝑟2 𝑑𝑟
Ref: H. B. Schlegel and M. J. Frisch, Int. J. Quant. Chem., 54(1995), 83-87.
Args:
l (int): angular momentum
expnt : exponent 𝛼
Returns: normalization factor
Examples:

48

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

>>> print gto_norm(0, 1)
2.5264751109842591

pyscf.gto.mole.intor_cross(intor, mol1, mol2, comp=1)
1-electron integrals from two molecules like
⟨𝜇|𝑖𝑛𝑡𝑜𝑟|𝜈⟩, 𝜇 ∈ 𝑚𝑜𝑙1, 𝜈 ∈ 𝑚𝑜𝑙2
Args:
intor [str] Name of the 1-electron integral, such as int1e_ovlp_sph (spherical overlap), int1e_nuc_cart
(cartesian nuclear attraction), int1e_ipovlp_spinor (spinor overlap gradients), etc. Ref to
getints() for the full list of available 1-electron integral names
mol1, mol2: Mole objects
Kwargs:
comp [int] Components of the integrals, e.g. int1e_ipovlp_sph has 3 components
Returns: ndarray of 1-electron integrals, can be either 2-dim or 3-dim, depending on comp
Examples: Compute the overlap between H2 molecule and O atom
>>> mol1 = gto.M(atom='H 0 1 0; H 0 0 1', basis='sto3g')
>>> mol2 = gto.M(atom='O 0 0 0', basis='sto3g')
>>> gto.intor_cross('int1e_ovlp_sph', mol1, mol2)
[[ 0.04875181 0.44714688 0.
0.37820346 0.
]
[ 0.04875181 0.44714688 0.
0.
0.37820346]]

pyscf.gto.mole.is_same_mol(mol1, mol2, tol=1e-05, cmp_basis=True, ignore_chiral=False)
Compare the two molecules whether they have the same structure.
Kwargs:
tol [float] In Bohr
cmp_basis [bool] Whether to compare basis functions for the two molecules
pyscf.gto.mole.len_cart(l)
The number of Cartesian function associated with given angular momentum.
pyscf.gto.mole.len_spinor(l, kappa)
The number of spinor associated with given angular momentum and kappa. If kappa is 0, return 4l+2
pyscf.gto.mole.loads(molstr)
Deserialize a str containing a JSON document to a Mole object.
pyscf.gto.mole.make_atm_env(atom, ptr=0)
Convert the internal format Mole._atom to the format required by libcint integrals
pyscf.gto.mole.make_bas_env(basis_add, atom_id=0, ptr=0)
Convert Mole.basis to the argument bas for libcint integrals
pyscf.gto.mole.make_env(atoms, basis, pre_env=[], nucmod={})
Generate the input arguments for libcint library based on internal format Mole._atom and
Mole._basis
pyscf.gto.mole.nao_2c(mol)
Total number of contracted spinor GTOs for the given Mole object
pyscf.gto.mole.nao_2c_range(mol, bas_id0, bas_id1)
Lower and upper boundary of contracted spinor basis functions associated with the given shell range
1.4. gto — Molecular structure and GTO basis

49

PySCF Documentation, Release 1.4.0

Args:
mol : Mole object
bas_id0 [int] start shell id, 0-based
bas_id1 [int] stop shell id, 0-based
Returns: tupel of start basis function id and the stop function id
Examples:
>>> mol = gto.M(atom='O 0 0 0; C 0 0 1', basis='6-31g')
>>> gto.nao_2c_range(mol, 2, 4)
(4, 12)

pyscf.gto.mole.nao_cart(mol)
Total number of contracted cartesian GTOs for the given Mole object
pyscf.gto.mole.nao_nr(mol, cart=False)
Total number of contracted spherical GTOs for the given Mole object
pyscf.gto.mole.nao_nr_range(mol, bas_id0, bas_id1)
Lower and upper boundary of contracted spherical basis functions associated with the given shell range
Args:
mol : Mole object
bas_id0 [int] start shell id
bas_id1 [int] stop shell id
Returns: tupel of start basis function id and the stop function id
Examples:
>>> mol = gto.M(atom='O 0 0 0; C 0 0 1', basis='6-31g')
>>> gto.nao_nr_range(mol, 2, 4)
(2, 6)

pyscf.gto.mole.npgto_nr(mol, cart=False)
Total number of primitive spherical GTOs for the given Mole object
pyscf.gto.mole.offset_2c_by_atom(mol)
2-component AO offset for each atom. Return a list, each item of the list gives (start-shell-id, stop-shell-id,
start-AO-id, stop-AO-id)
pyscf.gto.mole.offset_nr_by_atom(mol, ao_loc=None)
AO offsets for each atom. Return a list, each item of the list gives (start-shell-id, stop-shell-id, start-AO-id,
stop-AO-id)
pyscf.gto.mole.pack(mol)
Pack the input args of Mole to a dict.
Note this function only pack the input arguments (not the entire Mole class). Modifications to mol._atm,
mol._bas, mol._env are not tracked. Use dumps() to serialize the entire Mole object.
pyscf.gto.mole.same_mol(mol1, mol2, tol=1e-05, cmp_basis=True, ignore_chiral=False)
Compare the two molecules whether they have the same structure.
Kwargs:
tol [float] In Bohr

50

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

cmp_basis [bool] Whether to compare basis functions for the two molecules
pyscf.gto.mole.search_ao_label(mol, label)
Find the index of the AO basis function based on the given ao_label
Args:
ao_label [string or a list of strings] The regular expression pattern to match the orbital labels returned by
mol.ao_labels()
Returns: A list of index for the AOs that matches the given ao_label RE pattern
Examples:
>>>
>>>
[19
>>>
[19
>>>
[25

mol = gto.M(atom='H 0 0 0; Cl 0 0 1', basis='ccpvtz')
mol.parse_aolabel('Cl.*p')
20 21 22 23 24 25 26 27 28 29 30]
mol.parse_aolabel('Cl 2p')
20 21]
mol.parse_aolabel(['Cl.*d', 'Cl 4p'])
26 27 31 32 33 34 35 36 37 38 39 40]

pyscf.gto.mole.search_ao_nr(mol, atm_id, l, m, atmshell)
Search the first basis function id (not the shell id) which matches the given atom-id, angular momentum magnetic angular momentum, principal shell.
Args:
atm_id [int] atom id, 0-based
l [int] angular momentum
m [int] magnetic angular momentum
atmshell [int] principal quantum number
Returns: basis function id, 0-based. If not found, return None
Examples:
>>> mol = gto.M(atom='H 0 0 0; Cl 0 0 1', basis='sto-3g')
>>> mol.search_ao_nr(1, 1, -1, 3) # Cl 3px
7

pyscf.gto.mole.search_shell_id(mol, atm_id, l)
Search the first basis/shell id (not the basis function id) which matches the given atom-id and angular momentum
Args:
atm_id [int] atom id, 0-based
l [int] angular momentum
Returns: basis id, 0-based. If not found, return None
Examples:
>>> mol = gto.M(atom='H 0 0 0; Cl 0 0 1', basis='sto-3g')
>>> mol.search_shell_id(1, 1) # Cl p shell
4
>>> mol.search_shell_id(1, 2) # Cl d shell
None

1.4. gto — Molecular structure and GTO basis

51

PySCF Documentation, Release 1.4.0

pyscf.gto.mole.spheric_labels(mol, fmt=True)
Labels for spherical GTO functions
Kwargs: fmt : str or bool if fmt is boolean, it controls whether to format the labels and the default format is
“%d%3s %s%-4s”. if fmt is string, the string will be used as the print format.
Returns: List of [(atom-id, symbol-str, nl-str, str-of-real-spherical-notation] or formatted strings based on the
argument “fmt”
Examples:
>>> mol = gto.M(atom='H 0 0 0; Cl 0 0 1', basis='sto-3g')
>>> gto.spherical_labels(mol)
[(0, 'H', '1s', ''), (1, 'Cl', '1s', ''), (1, 'Cl', '2s', ''), (1, 'Cl', '3s', '
˓→'), (1, 'Cl', '2p', 'x'), (1, 'Cl', '2p', 'y'), (1, 'Cl', '2p', 'z'), (1, 'Cl',
˓→'3p', 'x'), (1, 'Cl', '3p', 'y'), (1, 'Cl', '3p', 'z')]

pyscf.gto.mole.spherical_labels(mol, fmt=True)
Labels for spherical GTO functions
Kwargs: fmt : str or bool if fmt is boolean, it controls whether to format the labels and the default format is
“%d%3s %s%-4s”. if fmt is string, the string will be used as the print format.
Returns: List of [(atom-id, symbol-str, nl-str, str-of-real-spherical-notation] or formatted strings based on the
argument “fmt”
Examples:
>>> mol = gto.M(atom='H 0 0 0; Cl 0 0 1', basis='sto-3g')
>>> gto.spherical_labels(mol)
[(0, 'H', '1s', ''), (1, 'Cl', '1s', ''), (1, 'Cl', '2s', ''), (1, 'Cl', '3s', '
˓→'), (1, 'Cl', '2p', 'x'), (1, 'Cl', '2p', 'y'), (1, 'Cl', '2p', 'z'), (1, 'Cl',
˓→'3p', 'x'), (1, 'Cl', '3p', 'y'), (1, 'Cl', '3p', 'z')]

pyscf.gto.mole.time_reversal_map(mol)
The index to map the spinor functions and its time reversal counterpart. The returned indices have postive or
negative values. For the i-th basis function, if the returned j = idx[i] < 0, it means 𝑇 |𝑖⟩ = −|𝑗⟩, otherwise
𝑇 |𝑖⟩ = |𝑗⟩
pyscf.gto.mole.tot_electrons(mol)
Total number of electrons for the given molecule
Returns: electron number in integer
Examples:
>>> mol = gto.M(atom='H 0 1 0; C 0 0 1', charge=1)
>>> mol.tot_electrons()
6

pyscf.gto.mole.uncontract(_basis)
Uncontract internal format _basis
Examples:
>>> gto.uncontract_basis(gto.load('sto3g', 'He'))
[[0, [6.3624213899999997, 1]], [0, [1.1589229999999999, 1]], [0, [0.
˓→31364978999999998, 1]]]

pyscf.gto.mole.uncontract_basis(_basis)
Uncontract internal format _basis

52

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

Examples:
>>> gto.uncontract_basis(gto.load('sto3g', 'He'))
[[0, [6.3624213899999997, 1]], [0, [1.1589229999999999, 1]], [0, [0.
˓→31364978999999998, 1]]]

pyscf.gto.mole.unpack(moldic)
Unpack a dict which is packed by pack(), to generate the input arguments for Mole object.
pyscf.gto.mole.zmat(atomstr)

>>> a = """H
H 1 2.67247631453057
H 1 4.22555607338457 2 50.7684795164077
H 1 2.90305235726773 2 79.3904651036893
>>> for x in zmat2cart(a): print x
['H', array([ 0., 0., 0.])]
['H', array([ 2.67247631, 0.
,
['H', array([ 2.67247631, 0.
,
['H', array([ 0.53449526, 0.30859098,

3 6.20854462618583"""

0.
])]
3.27310166])]
2.83668811])]

pyscf.gto.mole.zmat2cart(atomstr)

>>> a = """H
H 1 2.67247631453057
H 1 4.22555607338457 2 50.7684795164077
H 1 2.90305235726773 2 79.3904651036893
>>> for x in zmat2cart(a): print x
['H', array([ 0., 0., 0.])]
['H', array([ 2.67247631, 0.
,
['H', array([ 2.67247631, 0.
,
['H', array([ 0.53449526, 0.30859098,

3 6.20854462618583"""

0.
])]
3.27310166])]
2.83668811])]

class pyscf.gto.mole.Mole(**kwargs)
Basic class to hold molecular structure and global options
Attributes:
verbose [int] Print level
output [str or None] Output file, default is None which dumps msg to sys.stdout
max_memory [int, float] Allowed memory in MB
charge [int] Charge of molecule. It affects the electron numbers
spin [int] 2S, num. alpha electrons - num. beta electrons
symmetry [bool or str] Whether to use symmetry. When this variable is set to True, the molecule will be
rotated and the highest rotation axis will be placed z-axis. If a string is given as the name of point
group, the given point group symmetry will be used. Note that the input molecular coordinates will
not be changed in this case.
symmetry_subgroup [str] subgroup
atom [list or str] To define molecluar structure. The internal format is

atom = [[atom1, (x, y, z)],

1.4. gto — Molecular structure and GTO basis

53

PySCF Documentation, Release 1.4.0

[atom2, (x, y, z)],
...
[atomN, (x, y, z)]]

unit [str] Angstrom or Bohr
basis [dict or str] To define basis set.
nucmod [dict or str] Nuclear model. Set it to 0, None or False for point nuclear model. Any other values
will enable Gaussian nuclear model. Default is point nuclear model.
cart [boolean] Using Cartesian GTO basis and integrals (6d,10f,15g)
** Following attributes are generated by Mole.build() **
stdout [file object] Default is sys.stdout if Mole.output is not set
groupname [str] One of D2h, C2h, C2v, D2, Cs, Ci, C2, C1
nelectron [int] sum of nuclear charges - Mole.charge
symm_orb [a list of numpy.ndarray] Symmetry adapted basis. Each element is a set of symm-adapted
orbitals for one irreducible representation. The list index does not correspond to the id of irreducible
representation.
irrep_id [a list of int] Each element is one irreducible representation id associated with the basis stored
in symm_orb. One irrep id stands for one irreducible representation symbol. The irrep symbol and
the relevant id are defined in symm.param.IRREP_ID_TABLE
irrep_name [a list of str] Each element is one irreducible representation symbol associated with the basis
stored in symm_orb. The irrep symbols are defined in symm.param.IRREP_ID_TABLE
_built [bool] To label whether Mole.build() has been called. It ensures some functions being initialized once.
_basis [dict] like Mole.basis,
format_basis()

the internal format which is returned from the parser

_keys [a set of str] Store the keys appeared in the module. It is used to check misinput attributes
** Following attributes are arguments used by libcint library **
_atm : [[charge,ptr-of-coord,nuc-model,ptr-zeta,0,0],[...]]
reperesents one atom

each element

natm : number of atoms

_bas : [[atom-id,angular-momentum,num-primitive-GTO,num-contracted-GTO,0,ptr-of-exps
each element reperesents one shell
nbas : number of shells
_env : list of floats to store the coordinates, GTO exponents, contract-coefficients
Examples:
>>>
>>>
H^2
>>>
H
>>>
2

54

mol = Mole(atom='H^2 0 0 0; H 0 0 1.1', basis='sto3g').build()
print(mol.atom_symbol(0))
print(mol.atom_pure_symbol(0))
print(mol.nao_nr())

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

>>> print(mol.intor('int1e_ovlp_sph'))
[[ 0.99999999 0.43958641]
[ 0.43958641 0.99999999]]
>>> mol.charge = 1
>>> mol.build()
 has no attributes Charge

ao_labels(mol, fmt=True)
Labels for AO basis functions
Kwargs: fmt : str or bool if fmt is boolean, it controls whether to format the labels and the default format
is “%d%3s %s%-4s”. if fmt is string, the string will be used as the print format.
Returns: List of [(atom-id, symbol-str, nl-str, str-of-AO-notation)] or formatted strings based on the
argument “fmt”
ao_loc_2c(mol)
Offset of every shell in the spinor basis function spectrum
Returns: list, each entry is the corresponding start id of spinor function
Examples:
>>> mol = gto.M(atom='O 0 0 0; C 0 0 1', basis='6-31g')
>>> gto.ao_loc_2c(mol)
[0, 2, 4, 6, 12, 18, 20, 22, 24, 30, 36]

ao_loc_nr(mol, cart=False)
Offset of every shell in the spherical basis function spectrum
Returns: list, each entry is the corresponding start basis function id
Examples:
>>> mol = gto.M(atom='O 0 0 0; C 0 0 1', basis='6-31g')
>>> gto.ao_loc_nr(mol)
[0, 1, 2, 3, 6, 9, 10, 11, 12, 15, 18]

aoslice_2c_by_atom(mol)
2-component AO offset for each atom. Return a list, each item of the list gives (start-shell-id, stop-shell-id,
start-AO-id, stop-AO-id)
aoslice_by_atom(mol, ao_loc=None)
AO offsets for each atom. Return a list, each item of the list gives (start-shell-id, stop-shell-id, start-AO-id,
stop-AO-id)
aoslice_nr_by_atom(mol, ao_loc=None)
AO offsets for each atom. Return a list, each item of the list gives (start-shell-id, stop-shell-id, start-AO-id,
stop-AO-id)
atom_charge(atm_id)
Nuclear effective charge of the given atom id Note “atom_charge /= _charge(atom_symbol)” when ECP is
enabled. Number of electrons screened by ECP can be obtained by _charge(atom_symbol)-atom_charge
Args:
atm_id [int] 0-based
Examples:

1.4. gto — Molecular structure and GTO basis

55

PySCF Documentation, Release 1.4.0

>>> mol.build(atom='H 0 0 0; Cl 0 0 1.1')
>>> mol.atom_charge(1)
17

atom_charges()
np.asarray([mol.atom_charge(i) for i in range(mol.natm)])
atom_coord(atm_id)
Coordinates (ndarray) of the given atom id
Args:
atm_id [int] 0-based
Examples:
>>> mol.build(atom='H 0 0 0; Cl 0 0 1.1')
>>> mol.atom_coord(1)
[ 0.
0.
2.07869874]

atom_coords()
np.asarray([mol.atom_coords(i) for i in range(mol.natm)])
atom_nelec_core(atm_id)
Number of core electrons for pseudo potential.
atom_nshells(atm_id)
Number of basis/shells of the given atom
Args:
atm_id [int] 0-based
Examples:
>>> mol.build(atom='H 0 0 0; Cl 0 0 1.1')
>>> mol.atom_nshells(1)
5

atom_pure_symbol(atm_id)
For the given atom id, return the standard symbol (striping special characters)
Args:
atm_id [int] 0-based
Examples:
>>> mol.build(atom='H^2 0 0 0; H 0 0 1.1')
>>> mol.atom_symbol(0)
H

atom_shell_ids(atm_id)
A list of the shell-ids of the given atom
Args:
atm_id [int] 0-based
Examples:

56

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

>>> mol.build(atom='H 0 0 0; Cl 0 0 1.1', basis='cc-pvdz')
>>> mol.atom_shell_ids(1)
[3, 4, 5, 6, 7]

atom_symbol(atm_id)
For the given atom id, return the input symbol (without striping special characters)
Args:
atm_id [int] 0-based
Examples:
>>> mol.build(atom='H^2 0 0 0; H 0 0 1.1')
>>> mol.atom_symbol(0)
H^2

bas_angular(bas_id)
The angular momentum associated with the given basis
Args:
bas_id [int] 0-based
Examples:
>>> mol.build(atom='H 0 0 0; Cl 0 0 1.1', basis='cc-pvdz')
>>> mol.bas_atom(7)
2

bas_atom(bas_id)
The atom (0-based id) that the given basis sits on
Args:
bas_id [int] 0-based
Examples:
>>> mol.build(atom='H 0 0 0; Cl 0 0 1.1', basis='cc-pvdz')
>>> mol.bas_atom(7)
1

bas_coord(bas_id)
Coordinates (ndarray) associated with the given basis id
Args:
bas_id [int] 0-based
Examples:
>>> mol.build(atom='H 0 0 0; Cl 0 0 1.1')
>>> mol.bas_coord(1)
[ 0.
0.
2.07869874]

bas_ctr_coeff(bas_id)
Contract coefficients (ndarray) of the given shell
Args:
bas_id [int] 0-based

1.4. gto — Molecular structure and GTO basis

57

PySCF Documentation, Release 1.4.0

Examples:
>>> mol.M(atom='H 0 0 0; Cl 0 0 1.1', basis='cc-pvdz')
>>> mol.bas_ctr_coeff(0)
[[ 10.03400444]
[ 4.1188704 ]
[ 1.53971186]]

bas_exp(bas_id)
exponents (ndarray) of the given shell
Args:
bas_id [int] 0-based
Examples:
>>> mol.build(atom='H 0 0 0; Cl 0 0 1.1', basis='cc-pvdz')
>>> mol.bas_kappa(0)
[ 13.01
1.962
0.4446]

bas_kappa(bas_id)
Kappa (if l < j, -l-1, else l) of the given shell
Args:
bas_id [int] 0-based
Examples:
>>> mol.build(atom='H 0 0 0; Cl 0 0 1.1', basis='cc-pvdz')
>>> mol.bas_kappa(3)
0

bas_len_cart(bas_id)
The number of Cartesian function associated with given basis
bas_len_spinor(bas_id)
The number of spinor associated with given basis If kappa is 0, return 4l+2
bas_nctr(bas_id)
The number of contracted GTOs for the given shell
Args:
bas_id [int] 0-based
Examples:
>>> mol.build(atom='H 0 0 0; Cl 0 0 1.1', basis='cc-pvdz')
>>> mol.bas_atom(3)
3

bas_nprim(bas_id)
The number of primitive GTOs for the given shell
Args:
bas_id [int] 0-based
Examples:

58

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

>>> mol.build(atom='H 0 0 0; Cl 0 0 1.1', basis='cc-pvdz')
>>> mol.bas_atom(3)
11

build(dump_input=True, parse_arg=True, verbose=None, output=None, max_memory=None,
atom=None, basis=None, unit=None, nucmod=None, ecp=None, charge=None, spin=None,
symmetry=None, symmetry_subgroup=None, cart=None)
Setup moleclue and initialize some control parameters. Whenever you change the value of the attributes
of Mole, you need call this function to refresh the internal data of Mole.
Kwargs:
dump_input [bool] whether to dump the contents of input file in the output file
parse_arg [bool] whether to read the sys.argv and overwrite the relevant parameters
verbose [int] Print level. If given, overwrite Mole.verbose
output [str or None] Output file. If given, overwrite Mole.output
max_memory [int, float] Allowd memory in MB. If given, overwrite Mole.max_memory
atom [list or str] To define molecluar structure.
basis [dict or str] To define basis set.
nucmod [dict or str] Nuclear model. If given, overwrite Mole.nucmod
charge [int] Charge of molecule. It affects the electron numbers If given, overwrite Mole.charge
spin [int] 2S, num. alpha electrons - num. beta electrons If given, overwrite Mole.spin
symmetry [bool or str] Whether to use symmetry. If given a string of point group name, the given
point group symmetry will be used.
cart2sph_coeff(normalized=’sp’)
Transformation matrix to transform the Cartesian GTOs to spherical GTOs
Kwargs:
normalized [string or boolean] How the Cartesian GTOs are normalized. Except s and p functions,
Cartesian GTOs do not have the universal normalization coefficients for the different components of the same shell. The value of this argument can be one of ‘sp’, ‘all’, None. ‘sp’ means
the Cartesian s and p basis are normalized. ‘all’ means all Cartesian functions are normalized.
None means none of the Cartesian functions are normalized.
Examples:
>>>
>>>
>>>
>>>
>>>
>>>

mol = gto.M(atom='H 0 0 0; F 0 0 1', basis='ccpvtz')
c = mol.cart2sph_coeff()
s0 = mol.intor('int1e_ovlp_sph')
s1 = c.T.dot(mol.intor('int1e_ovlp_cart')).dot(c)
print(abs(s1-s0).sum())
4.58676826646e-15

cart_labels(fmt=False)
Labels for Cartesian GTO functions
Kwargs: fmt : str or bool if fmt is boolean, it controls whether to format the labels and the default format
is “%d%3s %s%-4s”. if fmt is string, the string will be used as the print format.
Returns: List of [(atom-id, symbol-str, nl-str, str-of-xyz-notation)] or formatted strings based on the
argument “fmt”

1.4. gto — Molecular structure and GTO basis

59

PySCF Documentation, Release 1.4.0

condense_to_shell(mol, mat, compressor=)
The given matrix is first partitioned to blocks, based on AO shell as delimiter. Then call compressor
function to abstract each block.
dumps(mol)
Serialize Mole object to a JSON formatted str.
energy_nuc(mol, charges=None, coords=None)
Compute nuclear repulsion energy (AU) or static Coulomb energy
Returns float
etbs(etbs)
Generate even tempered basis. See also expand_etb()
Args: etbs = [(l, n, alpha, beta), (l, n, alpha, beta),...]
Returns: Formated basis
Examples:
>>> gto.expand_etbs([(0, 2, 1.5, 2.), (1, 2, 1, 2.)])
[[0, [6.0, 1]], [0, [3.0, 1]], [1, [1., 1]], [1, [2., 1]]]

eval_gto(mol, eval_name, coords, comp=1, shls_slice=None, non0tab=None, ao_loc=None,
out=None)
Evaluate AO function value on the given grids,
Args: eval_name : str
Function
“GTOval_sph”
“GTOval_ip_sph”
“GTOval_ig_sph”
“GTOval_ipig_sph”
“GTOval_cart”
“GTOval_ip_cart”
“GTOval_ig_cart”

Expression
|AO>
nabla |AO>
(#C(0 1) g) |AO>
(#C(0 1) nabla g) |AO>
|AO>
nabla |AO>
(#C(0 1) g)|AO>

atm [int32 ndarray] libcint integral function argument
bas [int32 ndarray] libcint integral function argument
env [float64 ndarray] libcint integral function argument
coords [2D array, shape (N,3)] The coordinates of the grids.
Kwargs:
shls_slice [2-element list] (shl_start, shl_end). If given, only part of AOs (shl_start <= shell_id <
shl_end) are evaluated. By default, all shells defined in mol will be evaluated.
non0tab [2D bool array] mask array to indicate whether the AO values are zero. The mask array
can be obtained by calling make_mask()
out [ndarray] If provided, results are written into this array.
Returns: 2D array of shape (N,nao) Or 3D array of shape (*,N,nao) for AO values
Examples:

60

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

>>> mol = gto.M(atom='O 0 0 0; H 0 0 1; H 0 1 0', basis='ccpvdz')
>>> coords = numpy.random.random((100,3)) # 100 random points
>>> ao_value = mol.eval_gto("GTOval_sph", coords)
>>> print(ao_value.shape)
(100, 24)
>>> ao_value = mol.eval_gto("GTOval_ig_sph", coords, comp=3)
>>> print(ao_value.shape)
(3, 100, 24)

expand_etb(l, n, alpha, beta)
Generate the exponents of even tempered basis for Mole.basis. .. math:
e = e^{-\alpha * \beta^{i-1}} for i = 1 .. n

Args:
l [int] Angular momentum
n [int] Number of GTOs
Returns: Formated basis
Examples:
>>> gto.expand_etb(1, 3, 1.5, 2)
[[1, [6.0, 1]], [1, [3.0, 1]], [1, [1.5, 1]]]

expand_etbs(etbs)
Generate even tempered basis. See also expand_etb()
Args: etbs = [(l, n, alpha, beta), (l, n, alpha, beta),...]
Returns: Formated basis
Examples:
>>> gto.expand_etbs([(0, 2, 1.5, 2.), (1, 2, 1, 2.)])
[[0, [6.0, 1]], [0, [3.0, 1]], [1, [1., 1]], [1, [2., 1]]]

format_atom(atom, origin=0, axes=None, unit=’Ang’)
Convert the input Mole.atom to the internal data format. Including, changing the nuclear charge to
atom symbol, converting the coordinates to AU, rotate and shift the molecule. If the atom is a string, it
takes ”;” and “n” for the mark to separate atoms; ”,” and arbitrary length of blank space to spearate the
individual terms for an atom. Blank line will be ignored.
Args:
atoms [list or str] the same to Mole.atom
Kwargs:
origin [ndarray] new axis origin.
axes [ndarray] (new_x, new_y, new_z), each entry is a length-3 array
unit [str or number] If unit is one of strings (B, b, Bohr, bohr, AU, au), the coordinates of the input
atoms are the atomic unit; If unit is one of strings (A, a, Angstrom, angstrom, Ang, ang), the
coordinates are in the unit of angstrom; If a number is given, the number are considered as the
Bohr value (in angstrom), which should be around 0.53
Returns: “atoms” in the internal format as _atom

1.4. gto — Molecular structure and GTO basis

61

PySCF Documentation, Release 1.4.0

Examples:
>>> gto.format_atom('9,0,0,0; h@1 0 0 1', origin=(1,1,1))
[['F', [-1.0, -1.0, -1.0]], ['H@1', [-1.0, -1.0, 0.0]]]
>>> gto.format_atom(['9,0,0,0', (1, (0, 0, 1))], origin=(1,1,1))
[['F', [-1.0, -1.0, -1.0]], ['H', [-1, -1, 0]]]

format_basis(basis_tab)
Convert the input Mole.basis to the internal data format.
‘‘{ atom: [(l, ((-exp, c_1, c_2, ..),
(-exp, c_1, c_2, ..))),
(l, ((-exp, c_1, c_2, ..), (-exp, c_1, c_2, ..)))], ... }‘‘
Args:
basis_tab [dict] Similar to Mole.basis, it cannot be a str
Returns: Formated basis
Examples:
>>> gto.format_basis({'H':'sto-3g', 'H^2': '3-21g'})
{'H': [[0,
[3.4252509099999999, 0.15432897000000001],
[0.62391373000000006, 0.53532813999999995],
[0.16885539999999999, 0.44463454000000002]]],
'H^2': [[0,
[5.4471780000000001, 0.15628500000000001],
[0.82454700000000003, 0.90469100000000002]],
[0, [0.18319199999999999, 1.0]]]}

format_ecp(ecp_tab)
Convert the input ecp (dict) to the internal data format:
{ atom: (nelec,

# core electrons

((l, # l=-1 for UL, l>=0 for Ul to indicate |l>>> print gto_norm(0, 1)
2.5264751109842591

has_ecp()
Whether pesudo potential is used in the system.
intor(intor, comp=1, hermi=0, aosym=’s1’, out=None, shls_slice=None)
Integral generator.
Args:
intor [str] Name of the 1e or 2e AO integrals. Ref to getints() for the complete list of available
1-electron integral names
Kwargs:
comp [int] Components of the integrals, e.g. int1e_ipovlp_sph has 3 components.
hermi [int] Symmetry of the integrals

0 : no symmetry assumed (default)
1 : hermitian
2 : anti-hermitian

Returns: ndarray of 1-electron integrals, can be either 2-dim or 3-dim, depending on comp
Examples:
>>> mol.build(atom='H 0 0 0; H 0 0 1.1', basis='sto-3g')
>>> mol.intor('int1e_ipnuc_sph', comp=3) # 
[[[ 0.
0.
]
[ 0.
0.
]]
[[ 0.
0.
]
[ 0.
0.
]]
[[ 0.10289944 0.48176097]
[-0.48176097 -0.10289944]]]
>>> mol.intor('int1e_nuc_spinor')
[[-1.69771092+0.j 0.00000000+0.j -0.67146312+0.j 0.00000000+0.j]
[ 0.00000000+0.j -1.69771092+0.j 0.00000000+0.j -0.67146312+0.j]
[-0.67146312+0.j 0.00000000+0.j -1.69771092+0.j 0.00000000+0.j]
[ 0.00000000+0.j -0.67146312+0.j 0.00000000+0.j -1.69771092+0.j]]

intor_asymmetric(intor, comp=1)
One-electron integral generator. The integrals are assumed to be anti-hermitian
Args:
intor [str] Name of the 1-electron integral. Ref to getints() for the complete list of available
1-electron integral names

1.4. gto — Molecular structure and GTO basis

63

PySCF Documentation, Release 1.4.0

Kwargs:
comp [int] Components of the integrals, e.g. int1e_ipovlp has 3 components.
Returns: ndarray of 1-electron integrals, can be either 2-dim or 3-dim, depending on comp
Examples:
>>> mol.build(atom='H 0 0 0; H 0 0 1.1', basis='sto-3g')
>>> mol.intor_asymmetric('int1e_nuc_spinor')
[[-1.69771092+0.j 0.00000000+0.j 0.67146312+0.j 0.00000000+0.j]
[ 0.00000000+0.j -1.69771092+0.j 0.00000000+0.j 0.67146312+0.j]
[-0.67146312+0.j 0.00000000+0.j -1.69771092+0.j 0.00000000+0.j]
[ 0.00000000+0.j -0.67146312+0.j 0.00000000+0.j -1.69771092+0.j]]

intor_by_shell(intor, shells, comp=1)
For given 2, 3 or 4 shells, interface for libcint to get 1e, 2e, 2-center-2e or 3-center-2e integrals
Args:
intor_name [str] See also getints() for the supported intor_name
shls [list of int] The AO shell-ids of the integrals
atm [int32 ndarray] libcint integral function argument
bas [int32 ndarray] libcint integral function argument
env [float64 ndarray] libcint integral function argument
Kwargs:
comp [int] Components of the integrals, e.g. int1e_ipovlp has 3 components.
Returns: ndarray of 2-dim to 5-dim, depending on the integral type (1e, 2e, 3c-2e, 2c2e) and the value
of comp
Examples: The gradients of the spherical 2e integrals
>>> mol.build(atom='H 0 0 0; H 0 0 1.1', basis='sto-3g')
>>> gto.getints_by_shell('int2e_ip1_sph', (0,1,0,1), mol._atm, mol._bas, mol.
˓→_env, comp=3)
[[[[[-0.
]]]]
[[[[-0.
]]]]
[[[[-0.08760462]]]]]

intor_symmetric(intor, comp=1)
One-electron integral generator. The integrals are assumed to be hermitian
Args:
intor [str] Name of the 1-electron integral. Ref to getints() for the complete list of available
1-electron integral names
Kwargs:
comp [int] Components of the integrals, e.g. int1e_ipovlp_sph has 3 components.
Returns: ndarray of 1-electron integrals, can be either 2-dim or 3-dim, depending on comp
Examples:
>>> mol.build(atom='H 0 0 0; H 0 0 1.1', basis='sto-3g')
>>> mol.intor_symmetric('int1e_nuc_spinor')
[[-1.69771092+0.j 0.00000000+0.j -0.67146312+0.j 0.00000000+0.j]

64

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

[ 0.00000000+0.j -1.69771092+0.j 0.00000000+0.j -0.67146312+0.j]
[-0.67146312+0.j 0.00000000+0.j -1.69771092+0.j 0.00000000+0.j]
[ 0.00000000+0.j -0.67146312+0.j 0.00000000+0.j -1.69771092+0.j]]

kernel(dump_input=True, parse_arg=True, verbose=None, output=None, max_memory=None,
atom=None, basis=None, unit=None, nucmod=None, ecp=None, charge=None, spin=None,
symmetry=None, symmetry_subgroup=None, cart=None)
Setup moleclue and initialize some control parameters. Whenever you change the value of the attributes
of Mole, you need call this function to refresh the internal data of Mole.
Kwargs:
dump_input [bool] whether to dump the contents of input file in the output file
parse_arg [bool] whether to read the sys.argv and overwrite the relevant parameters
verbose [int] Print level. If given, overwrite Mole.verbose
output [str or None] Output file. If given, overwrite Mole.output
max_memory [int, float] Allowd memory in MB. If given, overwrite Mole.max_memory
atom [list or str] To define molecluar structure.
basis [dict or str] To define basis set.
nucmod [dict or str] Nuclear model. If given, overwrite Mole.nucmod
charge [int] Charge of molecule. It affects the electron numbers If given, overwrite Mole.charge
spin [int] 2S, num. alpha electrons - num. beta electrons If given, overwrite Mole.spin
symmetry [bool or str] Whether to use symmetry. If given a string of point group name, the given
point group symmetry will be used.
loads(molstr)
Deserialize a str containing a JSON document to a Mole object.
nao_2c(mol)
Total number of contracted spinor GTOs for the given Mole object
nao_2c_range(mol, bas_id0, bas_id1)
Lower and upper boundary of contracted spinor basis functions associated with the given shell range
Args:
mol : Mole object
bas_id0 [int] start shell id, 0-based
bas_id1 [int] stop shell id, 0-based
Returns: tupel of start basis function id and the stop function id
Examples:
>>> mol = gto.M(atom='O 0 0 0; C 0 0 1', basis='6-31g')
>>> gto.nao_2c_range(mol, 2, 4)
(4, 12)

nao_cart(mol)
Total number of contracted cartesian GTOs for the given Mole object
nao_nr(mol, cart=False)
Total number of contracted spherical GTOs for the given Mole object

1.4. gto — Molecular structure and GTO basis

65

PySCF Documentation, Release 1.4.0

nao_nr_range(mol, bas_id0, bas_id1)
Lower and upper boundary of contracted spherical basis functions associated with the given shell range
Args:
mol : Mole object
bas_id0 [int] start shell id
bas_id1 [int] stop shell id
Returns: tupel of start basis function id and the stop function id
Examples:
>>> mol = gto.M(atom='O 0 0 0; C 0 0 1', basis='6-31g')
>>> gto.nao_nr_range(mol, 2, 4)
(2, 6)

npgto_nr(mol, cart=False)
Total number of primitive spherical GTOs for the given Mole object
offset_2c_by_atom(mol)
2-component AO offset for each atom. Return a list, each item of the list gives (start-shell-id, stop-shell-id,
start-AO-id, stop-AO-id)
offset_ao_by_atom(mol, ao_loc=None)
AO offsets for each atom. Return a list, each item of the list gives (start-shell-id, stop-shell-id, start-AO-id,
stop-AO-id)
offset_nr_by_atom(mol, ao_loc=None)
AO offsets for each atom. Return a list, each item of the list gives (start-shell-id, stop-shell-id, start-AO-id,
stop-AO-id)
pack(mol)
Pack the input args of Mole to a dict.
Note this function only pack the input arguments (not the entire Mole class). Modifications to mol._atm,
mol._bas, mol._env are not tracked. Use dumps() to serialize the entire Mole object.
search_ao_label(mol, label)
Find the index of the AO basis function based on the given ao_label
Args:
ao_label [string or a list of strings] The regular expression pattern to match the orbital labels returned by mol.ao_labels()
Returns: A list of index for the AOs that matches the given ao_label RE pattern
Examples:
>>>
>>>
[19
>>>
[19
>>>
[25

mol = gto.M(atom='H 0 0 0; Cl 0 0 1', basis='ccpvtz')
mol.parse_aolabel('Cl.*p')
20 21 22 23 24 25 26 27 28 29 30]
mol.parse_aolabel('Cl 2p')
20 21]
mol.parse_aolabel(['Cl.*d', 'Cl 4p'])
26 27 31 32 33 34 35 36 37 38 39 40]

search_ao_nr(mol, atm_id, l, m, atmshell)
Search the first basis function id (not the shell id) which matches the given atom-id, angular momentum
magnetic angular momentum, principal shell.

66

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

Args:
atm_id [int] atom id, 0-based
l [int] angular momentum
m [int] magnetic angular momentum
atmshell [int] principal quantum number
Returns: basis function id, 0-based. If not found, return None
Examples:
>>> mol = gto.M(atom='H 0 0 0; Cl 0 0 1', basis='sto-3g')
>>> mol.search_ao_nr(1, 1, -1, 3) # Cl 3px
7

set_common_orig(coord)
Update common origin which held in :class‘Mole‘._env. Note the unit is Bohr
Examples:
>>> mol.set_common_orig(0)
>>> mol.set_common_orig((1,0,0))

set_common_orig_(coord)
Update common origin which held in :class‘Mole‘._env. Note the unit is Bohr
Examples:
>>> mol.set_common_orig(0)
>>> mol.set_common_orig((1,0,0))

set_common_origin(coord)
Update common origin which held in :class‘Mole‘._env. Note the unit is Bohr
Examples:
>>> mol.set_common_orig(0)
>>> mol.set_common_orig((1,0,0))

set_common_origin_(coord)
Update common origin which held in :class‘Mole‘._env. Note the unit is Bohr
Examples:
>>> mol.set_common_orig(0)
>>> mol.set_common_orig((1,0,0))

set_f12_zeta(zeta)
Set zeta for YP exp(-zeta r12)/r12 or STG exp(-zeta r12) type integrals
set_geom_(atoms, unit=’Angstrom’, symmetry=None)
Replace geometry
set_nuc_mod(atm_id, zeta)
Change the nuclear charge distribution of the given atom ID. The charge distribution is defined as: rho(r) =
nuc_charge * Norm * exp(-zeta * r^2). This function can only be called after .build() method is executed.
Examples:

1.4. gto — Molecular structure and GTO basis

67

PySCF Documentation, Release 1.4.0

>>> for ia in range(mol.natm):
...
zeta = gto.filatov_nuc_mod(mol.atom_charge(ia))
...
mol.set_nuc_mod(ia, zeta)

set_nuc_mod_(atm_id, zeta)
Change the nuclear charge distribution of the given atom ID. The charge distribution is defined as: rho(r) =
nuc_charge * Norm * exp(-zeta * r^2). This function can only be called after .build() method is executed.
Examples:
>>> for ia in range(mol.natm):
...
zeta = gto.filatov_nuc_mod(mol.atom_charge(ia))
...
mol.set_nuc_mod(ia, zeta)

set_range_coulomb(omega)
Apply the long range part of range-separated Coulomb operator for all 2e integrals erf(omega r12) / r12
set omega to 0 to siwtch off the range-separated Coulomb
set_range_coulomb_(omega)
Apply the long range part of range-separated Coulomb operator for all 2e integrals erf(omega r12) / r12
set omega to 0 to siwtch off the range-separated Coulomb
set_rinv_orig(coord)
Update origin for operator

1
|𝑟−𝑅𝑂 | .

Note the unit is Bohr

Examples:
>>> mol.set_rinv_orig(0)
>>> mol.set_rinv_orig((0,1,0))

set_rinv_orig_(coord)
Update origin for operator

1
|𝑟−𝑅𝑂 | .

Note the unit is Bohr

Examples:
>>> mol.set_rinv_orig(0)
>>> mol.set_rinv_orig((0,1,0))

set_rinv_origin(coord)
Update origin for operator

1
|𝑟−𝑅𝑂 | .

Note the unit is Bohr

Examples:
>>> mol.set_rinv_orig(0)
>>> mol.set_rinv_orig((0,1,0))

set_rinv_origin_(coord)
1
. Note the unit is Bohr
Update origin for operator |𝑟−𝑅
𝑂|
Examples:
>>> mol.set_rinv_orig(0)
>>> mol.set_rinv_orig((0,1,0))

set_rinv_zeta(zeta)
Assume the charge distribution on the “rinv_orig”. zeta is the parameter to control the charge distribution: rho(r) = Norm * exp(-zeta * r^2). Be careful when call this function. It affects the behavior of
int1e_rinv_* functions. Make sure to set it back to 0 after using it!

68

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

set_rinv_zeta_(zeta)
Assume the charge distribution on the “rinv_orig”. zeta is the parameter to control the charge distribution: rho(r) = Norm * exp(-zeta * r^2). Be careful when call this function. It affects the behavior of
int1e_rinv_* functions. Make sure to set it back to 0 after using it!
spheric_labels(fmt=False)
Labels for spherical GTO functions
Kwargs: fmt : str or bool if fmt is boolean, it controls whether to format the labels and the default format
is “%d%3s %s%-4s”. if fmt is string, the string will be used as the print format.
Returns: List of [(atom-id, symbol-str, nl-str, str-of-real-spherical-notation] or formatted strings based
on the argument “fmt”
Examples:
>>> mol = gto.M(atom='H 0 0 0; Cl 0 0 1', basis='sto-3g')
>>> gto.spherical_labels(mol)
[(0, 'H', '1s', ''), (1, 'Cl', '1s', ''), (1, 'Cl', '2s', ''), (1, 'Cl', '3s
˓→', ''), (1, 'Cl', '2p', 'x'), (1, 'Cl', '2p', 'y'), (1, 'Cl', '2p', 'z'),
˓→(1, 'Cl', '3p', 'x'), (1, 'Cl', '3p', 'y'), (1, 'Cl', '3p', 'z')]

spherical_labels(fmt=False)
Labels for spherical GTO functions
Kwargs: fmt : str or bool if fmt is boolean, it controls whether to format the labels and the default format
is “%d%3s %s%-4s”. if fmt is string, the string will be used as the print format.
Returns: List of [(atom-id, symbol-str, nl-str, str-of-real-spherical-notation] or formatted strings based
on the argument “fmt”
Examples:
>>> mol = gto.M(atom='H 0 0 0; Cl 0 0 1', basis='sto-3g')
>>> gto.spherical_labels(mol)
[(0, 'H', '1s', ''), (1, 'Cl', '1s', ''), (1, 'Cl', '2s', ''), (1, 'Cl', '3s
˓→', ''), (1, 'Cl', '2p', 'x'), (1, 'Cl', '2p', 'y'), (1, 'Cl', '2p', 'z'),
˓→(1, 'Cl', '3p', 'x'), (1, 'Cl', '3p', 'y'), (1, 'Cl', '3p', 'z')]

time_reversal_map(mol)
The index to map the spinor functions and its time reversal counterpart. The returned indices have postive
or negative values. For the i-th basis function, if the returned j = idx[i] < 0, it means 𝑇 |𝑖⟩ = −|𝑗⟩,
otherwise 𝑇 |𝑖⟩ = |𝑗⟩
tot_electrons(mol)
Total number of electrons for the given molecule
Returns: electron number in integer
Examples:
>>> mol = gto.M(atom='H 0 1 0; C 0 0 1', charge=1)
>>> mol.tot_electrons()
6

unpack(moldic)
Unpack a dict which is packed by pack(), to generate the input arguments for Mole object.

1.4. gto — Molecular structure and GTO basis

69

PySCF Documentation, Release 1.4.0

moleintor
pyscf.gto.moleintor.ascint3(intor_name)
convert cint2 function name to cint3 function name
pyscf.gto.moleintor.getints(intor_name, atm, bas, env, shls_slice=None, comp=1, hermi=0,
aosym=’s1’, ao_loc=None, cintopt=None, out=None)
1e and 2e integral generator.
Args: intor_name : str
Function Expression
“int1e_ovlp_sph”
(|)
“int1e_nuc_sph”
( | nuc | )
“int1e_kin_sph”
(.5 | p dot p)
“int1e_ia01p_sph”
(#C(0 1) | nabla-rinv | cross p)
“int1e_giao_irjxp_sph”
(#C(0 1) | r cross p)
“int1e_cg_irxp_sph”
(#C(0 1) | rc cross p)
“int1e_giao_a11part_sph” (-.5 | nabla-rinv | r)
“int1e_cg_a11part_sph”
(-.5 | nabla-rinv | rc)
“int1e_a01gp_sph”
(g | nabla-rinv cross p |)
“int1e_igkin_sph”
(#C(0 .5) g | p dot p)
“int1e_igovlp_sph”
(#C(0 1) g |)
“int1e_ignuc_sph”
(#C(0 1) g | nuc |)
“int1e_z_sph”
( | zc | )
“int1e_zz_sph”
( | zc zc | )
“int1e_r_sph”
( | rc | )
“int1e_r2_sph”
( | rc dot rc | )
“int1e_rr_sph”
( | rc rc | )
“int1e_pnucp_sph”
(p* | nuc dot p | )
“int1e_prinvxp_sph”
(p* | rinv cross p | )
“int1e_ovlp_spinor”
(|)
“int1e_nuc_spinor”
( | nuc |)
“int1e_srsr_spinor”
(sigma dot r | sigma dot r)
“int1e_sr_spinor”
(sigma dot r |)
“int1e_srsp_spinor”
(sigma dot r | sigma dot p)
“int1e_spsp_spinor”
(sigma dot p | sigma dot p)
“int1e_sp_spinor”
(sigma dot p |)
“int1e_spnucsp_spinor”
(sigma dot p | nuc | sigma dot p)
“int1e_srnucsr_spinor”
(sigma dot r | nuc | sigma dot r)
“int1e_govlp_spinor”
(g |)
“int1e_gnuc_spinor”
(g | nuc |)
“int1e_cg_sa10sa01_spinor”
(.5 sigma cross rc | sigma cross nabla-rinv |)
“int1e_cg_sa10sp_spinor”
(.5 rc cross sigma | sigma dot p)
“int1e_cg_sa10nucsp_spinor”
(.5 rc cross sigma | nuc | sigma dot p)
“int1e_giao_sa10sa01_spinor”
(.5 sigma cross r | sigma cross nabla-rinv |)
“int1e_giao_sa10sp_spinor”
(.5 r cross sigma | sigma dot p)
“int1e_giao_sa10nucsp_spinor” (.5 r cross sigma | nuc | sigma dot p)
“int1e_sa01sp_spinor”
(| nabla-rinv cross sigma | sigma dot p)
“int1e_spgsp_spinor”
(g sigma dot p | sigma dot p)
“int1e_spgnucsp_spinor”
(g sigma dot p | nuc | sigma dot p)
“int1e_spgsa01_spinor”
(g sigma dot p | nabla-rinv cross sigma |)
“int1e_spspsp_spinor”
(sigma dot p | sigma dot p sigma dot p)
Continued on next page
70

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

Table 1.1 – continued from previous page
Function Expression
“int1e_spnuc_spinor”
(sigma dot p | nuc |)
“int1e_ovlp_cart”
(|)
“int1e_nuc_cart”
( | nuc | )
“int1e_kin_cart”
(.5 | p dot p)
“int1e_ia01p_cart”
(#C(0 1) | nabla-rinv | cross p)
“int1e_giao_irjxp_cart”
(#C(0 1) | r cross p)
“int1e_cg_irxp_cart”
(#C(0 1) | rc cross p)
“int1e_giao_a11part_cart”
(-.5 | nabla-rinv | r)
“int1e_cg_a11part_cart”
(-.5 | nabla-rinv | rc)
“int1e_a01gp_cart”
(g | nabla-rinv cross p |)
“int1e_igkin_cart”
(#C(0 .5) g | p dot p)
“int1e_igovlp_cart”
(#C(0 1) g |)
“int1e_ignuc_cart”
(#C(0 1) g | nuc |)
“int1e_ipovlp_sph”
(nabla |)
“int1e_ipkin_sph”
(.5 nabla | p dot p)
“int1e_ipnuc_sph”
(nabla | nuc |)
“int1e_iprinv_sph”
(nabla | rinv |)
“int1e_rinv_sph”
(| rinv |)
“int1e_ipovlp_spinor”
(nabla |)
“int1e_ipkin_spinor”
(.5 nabla | p dot p)
“int1e_ipnuc_spinor”
(nabla | nuc |)
“int1e_iprinv_spinor”
(nabla | rinv |)
“int1e_ipspnucsp_spinor”
(nabla sigma dot p | nuc | sigma dot p)
“int1e_ipsprinvsp_spinor”
(nabla sigma dot p | rinv | sigma dot p)
“int1e_ipovlp_cart”
(nabla |)
“int1e_ipkin_cart”
(.5 nabla | p dot p)
“int1e_ipnuc_cart”
(nabla | nuc |)
“int1e_iprinv_cart”
(nabla | rinv |)
“int1e_rinv_cart”
(| rinv |)
“int2e_p1vxp1_sph”
( p* , cross p | , ) ; SSO
“int2e_sph”
(,|,)
“int2e_ig1_sph”
(#C(0 1) g , | , )
“int2e_spinor”
(, | , )
“int2e_spsp1_spinor”
(sigma dot p , sigma dot p | , )
“int2e_spsp1spsp2_spinor”
(sigma dot p , sigma dot p | sigma dot p , sigma dot p )
“int2e_srsr1_spinor”
(sigma dot r , sigma dot r | ,)
“int2e_srsr1srsr2_spinor”
(sigma dot r , sigma dot r | sigma dot r , sigma dot r)
“int2e_cg_sa10sp1_spinor”
(.5 rc cross sigma , sigma dot p | ,)
“int2e_cg_sa10sp1spsp2_spinor” (.5 rc cross sigma , sigma dot p | sigma dot p , sigma dot p )
“int2e_giao_sa10sp1_spinor”
(.5 r cross sigma , sigma dot p | ,)
“int2e_giao_sa10sp1spsp2_spinor” (.5 r cross sigma , sigma dot p | sigma dot p , sigma dot p )
“int2e_g1_spinor”
(g , | ,)
“int2e_spgsp1_spinor”
(g sigma dot p , sigma dot p | ,)
“int2e_g1spsp2_spinor”
(g , | sigma dot p , sigma dot p)
“int2e_spgsp1spsp2_spinor”
(g sigma dot p , sigma dot p | sigma dot p , sigma dot p)
“int2e_spv1_spinor”
(sigma dot p , | ,)
“int2e_vsp1_spinor”
(, sigma dot p | ,)
“int2e_spsp2_spinor”
(, | sigma dot p , sigma dot p)
“int2e_spv1spv2_spinor”
(sigma dot p , | sigma dot p ,)
Continued on next page

1.4. gto — Molecular structure and GTO basis

71

PySCF Documentation, Release 1.4.0

Table 1.1 – continued from previous page
Function Expression
“int2e_vsp1spv2_spinor”
(, sigma dot p | sigma dot p ,)
“int2e_spv1vsp2_spinor”
(sigma dot p , | , sigma dot p)
“int2e_vsp1vsp2_spinor”
(, sigma dot p | , sigma dot p)
“int2e_spv1spsp2_spinor”
(sigma dot p , | sigma dot p , sigma dot p)
“int2e_vsp1spsp2_spinor”
(, sigma dot p | sigma dot p , sigma dot p)
“int2e_ig1_cart”
(#C(0 1) g , | , )
“int2e_ip1_sph”
(nabla , | ,)
“int2e_ip1_spinor”
(nabla , | ,)
“int2e_ipspsp1_spinor”
(nabla sigma dot p , sigma dot p | ,)
“int2e_ip1spsp2_spinor”
(nabla , | sigma dot p , sigma dot p)
“int2e_ipspsp1spsp2_spinor”
(nabla sigma dot p , sigma dot p | sigma dot p , sigma dot p)
“int2e_ipsrsr1_spinor”
(nabla sigma dot r , sigma dot r | ,)
“int2e_ip1srsr2_spinor”
(nabla , | sigma dot r , sigma dot r)
“int2e_ipsrsr1srsr2_spinor”
(nabla sigma dot r , sigma dot r | sigma dot r , sigma dot r)
“int2e_ip1_cart”
(nabla , | ,)
“int2e_ssp1ssp2_spinor”
( , sigma dot p | gaunt | , sigma dot p)
“int2e_cg_ssa10ssp2_spinor”
(rc cross sigma , | gaunt | , sigma dot p)
“int2e_giao_ssa10ssp2_spinor”
(r cross sigma , | gaunt | , sigma dot p)
“int2e_gssp1ssp2_spinor”
(g , sigma dot p | gaunt | , sigma dot p)
“int2e_ipip1_sph”
( nabla nabla , | , )
“int2e_ipvip1_sph”
( nabla , nabla | , )
“int2e_ip1ip2_sph”
( nabla , | nabla , )
“int3c2e_ip1_sph”
(nabla , | )
“int3c2e_ip2_sph”
( , | nabla)
“int2c2e_ip1_sph”
(nabla | r12 | )
“int3c2e_spinor”
(nabla , | )
“int3c2e_spsp1_spinor”
(nabla , | )
“int3c2e_ip1_spinor”
(nabla , | )
“int3c2e_ip2_spinor”
( , | nabla)
“int3c2e_ipspsp1_spinor”
(nabla sigma dot p , sigma dot p | )
“int3c2e_spsp1ip2_spinor”
(sigma dot p , sigma dot p | nabla )

atm [int32 ndarray] libcint integral function argument
bas [int32 ndarray] libcint integral function argument
env [float64 ndarray] libcint integral function argument
Kwargs:
shls_slice [8-element list] (ish_start, ish_end, jsh_start, jsh_end, ksh_start, ksh_end, lsh_start, lsh_end)
comp [int] Components of the integrals, e.g. int1e_ipovlp has 3 components.
hermi [int (1e integral only)] Symmetry of the 1e integrals

0 : no symmetry assumed (default)
1 : hermitian
2 : anti-hermitian

72

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

aosym [str (2e integral only)] Symmetry of the 2e integrals

4 or ‘4’ or ‘s4’: 4-fold symmetry (default)
‘2ij’ or ‘s2ij’ : symmetry between i, j in (ij|kl)
‘2kl’ or ‘s2kl’ : symmetry between k, l in (ij|kl)
1 or ‘1’ or ‘s1’: no symmetry

out [ndarray (2e integral only)] array to store the 2e AO integrals
Returns: ndarray of 1-electron integrals, can be either 2-dim or 3-dim, depending on comp
Examples:
>>> mol.build(atom='H 0 0 0; H 0 0 1.1', basis='sto-3g')
>>> gto.getints('int1e_ipnuc_sph', mol._atm, mol._bas, mol._env, comp=3) # 
[[[ 0.
0.
]
[ 0.
0.
]]
[[ 0.
0.
]
[ 0.
0.
]]
[[ 0.10289944 0.48176097]
[-0.48176097 -0.10289944]]]

pyscf.gto.moleintor.getints_by_shell(intor_name, shls, atm, bas, env, comp=1)
For given 2, 3 or 4 shells, interface for libcint to get 1e, 2e, 2-center-2e or 3-center-2e integrals
Args:
intor_name [str] See also getints() for the supported intor_name
shls [list of int] The AO shell-ids of the integrals
atm [int32 ndarray] libcint integral function argument
bas [int32 ndarray] libcint integral function argument
env [float64 ndarray] libcint integral function argument
Kwargs:
comp [int] Components of the integrals, e.g. int1e_ipovlp has 3 components.
Returns: ndarray of 2-dim to 5-dim, depending on the integral type (1e, 2e, 3c-2e, 2c2e) and the value of comp
Examples: The gradients of the spherical 2e integrals
>>> mol.build(atom='H 0 0 0; H 0 0 1.1', basis='sto-3g')
>>> gto.getints_by_shell('int2e_ip1_sph', (0,1,0,1), mol._atm, mol._bas, mol._
˓→env, comp=3)
[[[[[-0.
]]]]
[[[[-0.
]]]]
[[[[-0.08760462]]]]]

1.4. gto — Molecular structure and GTO basis

73

PySCF Documentation, Release 1.4.0

basis
Internal format
This module loads basis set and ECP data from basis database and parse the basis (mostly in NWChem format) and
finally convert to internal format. The internal format of basis set is:
basis = {atom_type1:[[angular_momentum
(GTO-exp1, contract-coeff11,
(GTO-exp2, contract-coeff21,
(GTO-exp3, contract-coeff31,
...],
[angular_momentum
(GTO-exp1, contract-coeff11,
...],
...],
atom_type2:[[angular_momentum, (...),],
...],

contract-coeff12),
contract-coeff22),
contract-coeff32),

contract-coeff12),

For example:
mol.basis = {'H': [[0,
(19.2406000, 0.0328280),
(2.8992000, 0.2312080),
(0.6534000, 0.8172380),],
[0,
(0.1776000, 1.0000000),],
[1,
(1.0000000, 1.0000000),]],
}

Some basis sets, e.g. pyscf/gto/basis/dzp_dunning.py, are saved in the internal format.
pyscf.gto.basis.load(filename_or_basisname, symb)
Convert the basis of the given symbol to internal format
Args:
filename_or_basisname [str] Case insensitive basis set name. Special characters will be removed. or a
string of “path/to/file” which stores the basis functions
symb [str] Atomic symbol, Special characters will be removed.
Examples: Load STO 3G basis of carbon to oxygen atom
>>> mol = gto.Mole()
>>> mol.basis = {'O': load('sto-3g', 'C')}

pyscf.gto.basis.load_ecp(filename_or_basisname, symb)
Convert the basis of the given symbol to internal format
pyscf.gto.basis.parse(string, symb=None)
Parse the NWChem format basis or ECP text, return an internal basis (ECP) format which can be assigned to
Mole.basis or Mole.ecp
Args: string : Blank linke and the lines of “BASIS SET” and “END” will be ignored
Examples:

74

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

>>>
>>>
...
...
...
...
...
...
...
...
...
...

mol = gto.Mole()
mol.basis = {'O': gto.basis.parse("""
#BASIS SET: (6s,3p) -> [2s,1p]
C
S
71.6168370
0.15432897
13.0450960
0.53532814
3.5305122
0.44463454
C
SP
2.9412494
-0.09996723
0.6834831
0.39951283
0.2222899
0.70011547
""")}

0.15591627
0.60768372
0.39195739

1.5 lib — Helper functions, parameters, and C extensions
C code and some fundamental functions

1.5.1 parameters
Some PySCF environment parameters are defined in this module.
Scratch directory
The PySCF scratch directory is specified by TMPDIR. Its default value is the same to the system environment variable
TMPDIR. It can be overwritten by the system environment variable PYSCF_TMPDIR.
Maximum memory
The variable MAX_MEMORY defines the maximum memory that PySCF can be used in the calculation. Its unit is MB.
The default value is 4000 MB. It can be overwritten by the system environment variable PYSCF_MAX_MEMORY.
Note: Some calculations may exceed the max_memory limit, especially when the incore_anyway of Mole object
was set.

1.5. lib — Helper functions, parameters, and C extensions

75

PySCF Documentation, Release 1.4.0

1.5.2 logger
Logging system
Log level
Level
DEBUG4
DEBUG3
DEBUG2
DEBUG1
DEBUG
INFO
NOTE
WARN
ERROR
QUIET

number
9
8
7
6
5
4
3
2
1
0

Big verbose value means more noise in the output file.
Note: At log level 1 (ERROR) and 2 (WARN), the messages are also output to stderr.
Each Logger object has its own output destination and verbose level. So multiple Logger objects can be created
to manage the message system without affecting each other. The methods provided by Logger class has the direct
connection to the log level. E.g. info() print messages if the verbose level >= 4 (INFO):
>>> import sys
>>> from pyscf import lib
>>> log = lib.logger.Logger(sys.stdout, 4)
>>> log.info('info level')
info level
>>> log.verbose = 3
>>> log.info('info level')
>>> log.note('note level')
note level

timer
Logger object provides timer method for timing. Set TIMER_LEVEL to control which level to output the timing. It is
5 (DEBUG) by default.
>>>
>>>
>>>
>>>
>>>
>>>
>>>

76

import sys, time
from pyscf import lib
log = lib.logger.Logger(sys.stdout, 4)
t0 = time.clock()
log.timer('test', t0)
lib.logger.TIMER_LEVEL = 4
log.timer('test', t0)
CPU time for test
0.00 sec

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

1.5.3 numpy helper
pyscf.lib.numpy_helper.asarray(a, dtype=None, order=None)
Convert a list of N-dim arrays to a (N+1) dim array. It is equivalent to numpy.asarray function but more efficient.
pyscf.lib.numpy_helper.cartesian_prod(arrays, out=None)
Generate a cartesian product of input arrays.
http://stackoverflow.com/questions/1208118/
using-numpy-to-build-an-array-of-all-combinations-of-two-arrays
Args:
arrays [list of array-like] 1-D arrays to form the cartesian product of.
out [ndarray] Array to place the cartesian product in.
Returns:
out [ndarray] 2-D array of shape (M, len(arrays)) containing cartesian products formed of input arrays.
Examples:
>>> cartesian_prod(([1, 2, 3], [4, 5], [6, 7]))
array([[1, 4, 6],
[1, 4, 7],
[1, 5, 6],
[1, 5, 7],
[2, 4, 6],
[2, 4, 7],
[2, 5, 6],
[2, 5, 7],
[3, 4, 6],
[3, 4, 7],
[3, 5, 6],
[3, 5, 7]])

pyscf.lib.numpy_helper.cond(x, p=None)
Compute the condition number
pyscf.lib.numpy_helper.condense(opname, a, locs)
nd = loc[-1]
out = numpy.empty((nd,nd))
for i,i0 in enumerate(loc):
i1 = loc[i+1]
for j,j0 in enumerate(loc):
j1 = loc[j+1]
out[i,j] = op(a[i0:i1,j0:j1])
return out

pyscf.lib.numpy_helper.ddot(a, b, alpha=1, c=None, beta=0)
Matrix-matrix multiplication for double precision arrays
pyscf.lib.numpy_helper.direct_sum(subscripts, *operands)
Apply the summation over many operands with the einsum fashion.
Examples:
>>> a = numpy.random((6,5))
>>> b = numpy.random((4,3,2))
>>> direct_sum('ij,klm->ijklm', a, b).shape

1.5. lib — Helper functions, parameters, and C extensions

77

PySCF Documentation, Release 1.4.0

(6,
>>>
(6,
>>>
(2,
>>>
(6,
>>>
(6,
>>>
(2,
>>>
>>>
>>>
0.0

5, 4, 3, 2)
direct_sum('ij,klm', a, b).shape
5, 4, 3, 2)
direct_sum('i,j,klm->mjlik', a[0], a[:,0], b).shape
6, 3, 5, 4)
direct_sum('ij-klm->ijklm', a, b).shape
5, 4, 3, 2)
direct_sum('ij+klm', a, b).shape
5, 4, 3, 2)
direct_sum('-i-j+klm->mjlik', a[0], a[:,0], b).shape
6, 3, 5, 4)
c = numpy.random((3,5))
z = direct_sum('ik+jk->kij', a, c).shape # This is slow
abs(a.T.reshape(5,6,1) + c.reshape(5,1,3) - z).sum()

pyscf.lib.numpy_helper.einsum(idx_str, *tensors)
Perform a more efficient einsum via reshaping to a matrix multiply.
Current differences compared to numpy.einsum: This assumes that each repeated index is actually summed (i.e.
no ‘i,i->i’) and appears only twice (i.e. no ‘ij,ik,il->jkl’). The output indices must be explicitly specified (i.e.
‘ij,j->i’ and not ‘ij,j’).
pyscf.lib.numpy_helper.hermi_sum(a, axes=None, hermi=1, inplace=False, out=None)
a + a.T for better memory efficiency
Examples:
>>> transpose_sum(numpy.arange(4.).reshape(2,2))
[[ 0. 3.]
[ 3. 6.]]

pyscf.lib.numpy_helper.hermi_triu(mat, hermi=1, inplace=True)
Use the elements of the lower triangular part to fill the upper triangular part.
Kwargs: filltriu : int
1 (default) return a hermitian matrix
2 return an anti-hermitian matrix
Examples:
>>> unpack_row(numpy.arange(9.).reshape(3,3), 1)
[[ 0. 3. 6.]
[ 3. 4. 7.]
[ 6. 7. 8.]]
>>> unpack_row(numpy.arange(9.).reshape(3,3), 2)
[[ 0. -3. -6.]
[ 3. 4. -7.]
[ 6. 7. 8.]]

pyscf.lib.numpy_helper.norm(x, ord=None, axis=None)
numpy.linalg.norm for numpy 1.6.*
pyscf.lib.numpy_helper.pack_tril(mat, axis=-1, out=None)
flatten the lower triangular part of a matrix. Given mat, it returns mat[...,numpy.tril_indices(mat.shape[0])]
Examples:

78

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

>>> pack_tril(numpy.arange(9).reshape(3,3))
[0 3 4 6 7 8]

pyscf.lib.numpy_helper.solve_lineq_by_SVD(a, b)
a*x=b
pyscf.lib.numpy_helper.take_2d(a, idx, idy, out=None)
a(idx,idy)
Examples:
>>> out = numpy.arange(9.).reshape(3,3)
>>> take_2d(a, [0,2], [0,2])
[[ 0. 2.]
[ 6. 8.]]

pyscf.lib.numpy_helper.takebak_2d(out, a, idx, idy)
Reverse operation of take_2d. out(idx,idy) += a
Examples:
>>> out = numpy.zeros((3,3))
>>> takebak_2d(out, numpy.ones((2,2)), [0,2], [0,2])
[[ 1. 0. 1.]
[ 0. 0. 0.]
[ 1. 0. 1.]]

pyscf.lib.numpy_helper.transpose(a, axes=None, inplace=False, out=None)
Transpose array for better memory efficiency
Examples:
>>> transpose(numpy.ones((3,2)))
[[ 1. 1. 1.]
[ 1. 1. 1.]]

pyscf.lib.numpy_helper.transpose_sum(a, inplace=False, out=None)
a + a.T for better memory efficiency
Examples:
>>> transpose_sum(numpy.arange(4.).reshape(2,2))
[[ 0. 3.]
[ 3. 6.]]

pyscf.lib.numpy_helper.unpack_row(tril, row_id)
Extract one row of the lower triangular part of a matrix. It is equivalent to unpack_tril(a)[row_id]
Examples:
>>> unpack_row(numpy.arange(6.), 0)
[ 0. 1. 3.]
>>> unpack_tril(numpy.arange(6.))[0]
[ 0. 1. 3.]

pyscf.lib.numpy_helper.unpack_tril(tril, filltriu=1, axis=-1, out=None)
Reverse operation of pack_tril.
Kwargs: filltriu : int

1.5. lib — Helper functions, parameters, and C extensions

79

PySCF Documentation, Release 1.4.0

0 Do not fill the upper triangular part, random number may appear in the upper triangular part
1 (default) Transpose the lower triangular part to fill the upper triangular part
2 Similar to filltriu=1, negative of the lower triangular part is assign to the upper triangular
part to make the matrix anti-hermitian
Examples:
>>> unpack_tril(numpy.arange(6.))
[[ 0. 1. 3.]
[ 1. 2. 4.]
[ 3. 4. 5.]]
>>> unpack_tril(numpy.arange(6.), 0)
[[ 0. 0. 0.]
[ 1. 2. 0.]
[ 3. 4. 5.]]
>>> unpack_tril(numpy.arange(6.), 2)
[[ 0. -1. -3.]
[ 1. 2. -4.]
[ 3. 4. 5.]]

pyscf.lib.numpy_helper.zdot(a, b, alpha=1, c=None, beta=0)
Matrix-matrix multiplication for double complex arrays using Gauss’s complex multiplication algorithm
Extension to scipy.linalg module
pyscf.lib.linalg_helper.cho_solve(a, b)
Solve ax = b, where a is hermitian matrix
pyscf.lib.linalg_helper.davidson(aop, x0, precond, tol=1e-12, max_cycle=50, max_space=12,
lindep=1e-14, max_memory=2000, dot=, callback=None, nroots=1, lessio=False, verbose=2,
follow_state=False)
Davidson diagonalization method to solve a c = e c. Ref [1] E.R. Davidson, J. Comput. Phys. 17 (1), 87-94
(1975). [2] http://people.inf.ethz.ch/arbenz/ewp/Lnotes/chapter11.pdf
Args:
aop [function(x) => array_like_x] aop(x) to mimic the matrix vector multiplication
argument is a 1D array. The returned value is a 1D array.

∑︀

𝑗

𝑎𝑖𝑗 * 𝑥𝑗 . The

x0 [1D array or a list of 1D array] Initial guess. The initial guess vector(s) are just used as the initial
subspace bases. If the subspace is smaller than “nroots”, eg 10 roots and one initial guess, all eigenvectors are chosen as the eigenvectors during the iterations. The first iteration has one eigenvector,
the next iteration has two, the third iterastion has 4, ..., until the subspace size > nroots.
precond [function(dx, e, x0) => array_like_dx] Preconditioner to generate new trial vector. The argument
dx is a residual vector a*x0-e*x0; e is the current eigenvalue; x0 is the current eigenvector.
Kwargs:
tol [float] Convergence tolerance.
max_cycle [int] max number of iterations.
max_space [int] space size to hold trial vectors.
lindep [float] Linear dependency threshold. The function is terminated when the smallest eigenvalue of
the metric of the trial vectors is lower than this threshold.
max_memory [int or float] Allowed memory in MB.
dot [function(x, y) => scalar] Inner product

80

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

callback [function(envs_dict) => None] callback function takes one dict as the argument which is generated by the builtin function locals(), so that the callback function can access all local variables
in the current envrionment.
nroots [int] Number of eigenvalues to be computed. When nroots > 1, it affects the shape of the return
value
lessio [bool] How to compute a*x0 for current eigenvector x0. There are two ways to compute a*x0. One
is to assemble the existed a*x. The other is to call aop(x0). The default is the first method which
needs more IO and less computational cost. When IO is slow, the second method can be considered.
follow_state [bool] If the solution dramatically changes in two iterations, clean the subspace and restart
the iteration with the old solution. It can help to improve numerical stability. Default is False.
Returns:
e [float or list of floats] Eigenvalue. By default it’s one float number. If nroots > 1, it is a list of floats
for the lowest nroots eigenvalues.
c [1D array or list of 1D arrays] Eigenvector. By default it’s a 1D array. If nroots > 1, it is a list of
arrays for the lowest nroots eigenvectors.
Examples:
>>>
>>>
>>>
>>>
>>>
>>>
>>>

from pyscf import lib
a = numpy.random.random((10,10))
a = a + a.T
aop = lambda x: numpy.dot(a,x)
precond = lambda dx, e, x0: dx/(a.diagonal()-e)
x0 = a[0]
e, c = lib.davidson(aop, x0, precond)

pyscf.lib.linalg_helper.davidson1(aop,
x0,
precond,
tol=1e-12,
max_cycle=50,
max_space=12,
lindep=1e-14,
max_memory=2000,
dot=, callback=None, nroots=1,
lessio=False, verbose=2, follow_state=False)
Davidson diagonalization method to solve a c = e c. Ref [1] E.R. Davidson, J. Comput. Phys. 17 (1), 87-94
(1975). [2] http://people.inf.ethz.ch/arbenz/ewp/Lnotes/chapter11.pdf
Args:
aop [function([x]) => [array_like_x]] Matrix vector multiplication 𝑦𝑘𝑖 =

∑︀

𝑗

𝑎𝑖𝑗 * 𝑥𝑗𝑘 .

x0 [1D array or a list of 1D array] Initial guess. The initial guess vector(s) are just used as the initial
subspace bases. If the subspace is smaller than “nroots”, eg 10 roots and one initial guess, all eigenvectors are chosen as the eigenvectors during the iterations. The first iteration has one eigenvector,
the next iteration has two, the third iterastion has 4, ..., until the subspace size > nroots.
precond [function(dx, e, x0) => array_like_dx] Preconditioner to generate new trial vector. The argument
dx is a residual vector a*x0-e*x0; e is the current eigenvalue; x0 is the current eigenvector.
Kwargs:
tol [float] Convergence tolerance.
max_cycle [int] max number of iterations.
max_space [int] space size to hold trial vectors.
lindep [float] Linear dependency threshold. The function is terminated when the smallest eigenvalue of
the metric of the trial vectors is lower than this threshold.
max_memory [int or float] Allowed memory in MB.

1.5. lib — Helper functions, parameters, and C extensions

81

PySCF Documentation, Release 1.4.0

dot [function(x, y) => scalar] Inner product
callback [function(envs_dict) => None] callback function takes one dict as the argument which is generated by the builtin function locals(), so that the callback function can access all local variables
in the current envrionment.
nroots [int] Number of eigenvalues to be computed. When nroots > 1, it affects the shape of the return
value
lessio [bool] How to compute a*x0 for current eigenvector x0. There are two ways to compute a*x0. One
is to assemble the existed a*x. The other is to call aop(x0). The default is the first method which
needs more IO and less computational cost. When IO is slow, the second method can be considered.
follow_state [bool] If the solution dramatically changes in two iterations, clean the subspace and restart
the iteration with the old solution. It can help to improve numerical stability. Default is False.
Returns:
conv [bool] Converged or not
e [list of floats] The lowest nroots eigenvalues.
c [list of 1D arrays] The lowest nroots eigenvectors.
Examples:
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
2

from pyscf import lib
a = numpy.random.random((10,10))
a = a + a.T
aop = lambda xs: [numpy.dot(a,x) for x in xs]
precond = lambda dx, e, x0: dx/(a.diagonal()-e)
x0 = a[0]
e, c = lib.davidson(aop, x0, precond, nroots=2)
len(e)

pyscf.lib.linalg_helper.davidson_nosym(aop, x0, precond, tol=1e-12, max_cycle=50,
max_space=12, lindep=1e-14, max_memory=2000,
dot=, callback=None,
nroots=1, lessio=False, left=False, pick=, verbose=2, follow_state=False)
Davidson diagonalization to solve the non-symmetric eigenvalue problem
Args:
aop [function([x]) => [array_like_x]] Matrix vector multiplication 𝑦𝑘𝑖 =

∑︀

𝑗

𝑎𝑖𝑗 * 𝑥𝑗𝑘 .

x0 [1D array or a list of 1D array] Initial guess. The initial guess vector(s) are just used as the initial
subspace bases. If the subspace is smaller than “nroots”, eg 10 roots and one initial guess, all eigenvectors are chosen as the eigenvectors during the iterations. The first iteration has one eigenvector,
the next iteration has two, the third iterastion has 4, ..., until the subspace size > nroots.
precond [function(dx, e, x0) => array_like_dx] Preconditioner to generate new trial vector. The argument
dx is a residual vector a*x0-e*x0; e is the current eigenvalue; x0 is the current eigenvector.
Kwargs:
tol [float] Convergence tolerance.
max_cycle [int] max number of iterations.
max_space [int] space size to hold trial vectors.

82

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

lindep [float] Linear dependency threshold. The function is terminated when the smallest eigenvalue of
the metric of the trial vectors is lower than this threshold.
max_memory [int or float] Allowed memory in MB.
dot [function(x, y) => scalar] Inner product
callback [function(envs_dict) => None] callback function takes one dict as the argument which is generated by the builtin function locals(), so that the callback function can access all local variables
in the current envrionment.
nroots [int] Number of eigenvalues to be computed. When nroots > 1, it affects the shape of the return
value
lessio [bool] How to compute a*x0 for current eigenvector x0. There are two ways to compute a*x0. One
is to assemble the existed a*x. The other is to call aop(x0). The default is the first method which
needs more IO and less computational cost. When IO is slow, the second method can be considered.
left [bool] Whether to calculate and return left eigenvectors. Default is False.
pick [function(w,v,nroots) => (e[idx], w[:,idx], idx)] Function to filter eigenvalues and eigenvectors.
follow_state [bool] If the solution dramatically changes in two iterations, clean the subspace and restart
the iteration with the old solution. It can help to improve numerical stability. Default is False.
Returns:
conv [bool] Converged or not
e [list of eigenvalues] The eigenvalues can be sorted real or complex, depending on the return value of
pick function.
vl [list of 1D arrays] Left eigenvectors. Only returned if left=True.
c [list of 1D arrays] Right eigenvectors.
Examples:
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
2

from pyscf import lib
a = numpy.random.random((10,10))
a = a
aop = lambda xs: [numpy.dot(a,x) for x in xs]
precond = lambda dx, e, x0: dx/(a.diagonal()-e)
x0 = a[0]
e, vl, vr = lib.davidson(aop, x0, precond, nroots=2, left=True)
len(e)

pyscf.lib.linalg_helper.dgeev(abop, x0, precond, type=1, tol=1e-12, max_cycle=50,
max_space=12, lindep=1e-14, max_memory=2000, dot=, callback=None, nroots=1, lessio=False,
verbose=2)
Davidson diagonalization method to solve A c = e B c.
Args:
abop [function(x) => (array_like_x, array_like_x)] abop applies two matrix vector multiplications and
returns tuple (Ax, Bx)
x0 [1D array] Initial guess
precond [function(dx, e, x0) => array_like_dx] Preconditioner to generate new trial vector. The argument
dx is a residual vector a*x0-e*x0; e is the current eigenvalue; x0 is the current eigenvector.
Kwargs:
1.5. lib — Helper functions, parameters, and C extensions

83

PySCF Documentation, Release 1.4.0

tol [float] Convergence tolerance.
max_cycle [int] max number of iterations.
max_space [int] space size to hold trial vectors.
lindep [float] Linear dependency threshold. The function is terminated when the smallest eigenvalue of
the metric of the trial vectors is lower than this threshold.
max_memory [int or float] Allowed memory in MB.
dot [function(x, y) => scalar] Inner product
callback [function(envs_dict) => None] callback function takes one dict as the argument which is generated by the builtin function locals(), so that the callback function can access all local variables
in the current envrionment.
nroots [int] Number of eigenvalues to be computed. When nroots > 1, it affects the shape of the return
value
lessio [bool] How to compute a*x0 for current eigenvector x0. There are two ways to compute a*x0. One
is to assemble the existed a*x. The other is to call aop(x0). The default is the first method which
needs more IO and less computational cost. When IO is slow, the second method can be considered.
Returns:
e [list of floats] The lowest nroots eigenvalues.
c [list of 1D arrays] The lowest nroots eigenvectors.
pyscf.lib.linalg_helper.dgeev1(abop, x0, precond, type=1, tol=1e-12, max_cycle=50,
max_space=12, lindep=1e-14, max_memory=2000, dot=, callback=None, nroots=1, lessio=False,
verbose=2)
Davidson diagonalization method to solve A c = e B c.
Args:
abop [function([x]) => ([array_like_x], [array_like_x])] abop applies two matrix vector multiplications
and returns tuple (Ax, Bx)
x0 [1D array] Initial guess
precond [function(dx, e, x0) => array_like_dx] Preconditioner to generate new trial vector. The argument
dx is a residual vector a*x0-e*x0; e is the current eigenvalue; x0 is the current eigenvector.
Kwargs:
tol [float] Convergence tolerance.
max_cycle [int] max number of iterations.
max_space [int] space size to hold trial vectors.
lindep [float] Linear dependency threshold. The function is terminated when the smallest eigenvalue of
the metric of the trial vectors is lower than this threshold.
max_memory [int or float] Allowed memory in MB.
dot [function(x, y) => scalar] Inner product
callback [function(envs_dict) => None] callback function takes one dict as the argument which is generated by the builtin function locals(), so that the callback function can access all local variables
in the current envrionment.
nroots [int] Number of eigenvalues to be computed. When nroots > 1, it affects the shape of the return
value
84

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

lessio [bool] How to compute a*x0 for current eigenvector x0. There are two ways to compute a*x0. One
is to assemble the existed a*x. The other is to call aop(x0). The default is the first method which
needs more IO and less computational cost. When IO is slow, the second method can be considered.
Returns:
conv [bool] Converged or not
e [list of floats] The lowest nroots eigenvalues.
c [list of 1D arrays] The lowest nroots eigenvectors.
pyscf.lib.linalg_helper.dsolve(aop, b, precond, tol=1e-12, max_cycle=30, dot=, lindep=1e-16, verbose=0)
Davidson iteration to solve linear equation. It works bad.
pyscf.lib.linalg_helper.eig(aop, x0, precond, tol=1e-12, max_cycle=50, max_space=12,
lindep=1e-14, max_memory=2000, dot=,
callback=None, nroots=1, lessio=False, left=False, pick=, verbose=2, follow_state=False)
Davidson diagonalization to solve the non-symmetric eigenvalue problem
Args:
aop [function([x]) => [array_like_x]] Matrix vector multiplication 𝑦𝑘𝑖 =

∑︀

𝑗

𝑎𝑖𝑗 * 𝑥𝑗𝑘 .

x0 [1D array or a list of 1D array] Initial guess. The initial guess vector(s) are just used as the initial
subspace bases. If the subspace is smaller than “nroots”, eg 10 roots and one initial guess, all eigenvectors are chosen as the eigenvectors during the iterations. The first iteration has one eigenvector,
the next iteration has two, the third iterastion has 4, ..., until the subspace size > nroots.
precond [function(dx, e, x0) => array_like_dx] Preconditioner to generate new trial vector. The argument
dx is a residual vector a*x0-e*x0; e is the current eigenvalue; x0 is the current eigenvector.
Kwargs:
tol [float] Convergence tolerance.
max_cycle [int] max number of iterations.
max_space [int] space size to hold trial vectors.
lindep [float] Linear dependency threshold. The function is terminated when the smallest eigenvalue of
the metric of the trial vectors is lower than this threshold.
max_memory [int or float] Allowed memory in MB.
dot [function(x, y) => scalar] Inner product
callback [function(envs_dict) => None] callback function takes one dict as the argument which is generated by the builtin function locals(), so that the callback function can access all local variables
in the current envrionment.
nroots [int] Number of eigenvalues to be computed. When nroots > 1, it affects the shape of the return
value
lessio [bool] How to compute a*x0 for current eigenvector x0. There are two ways to compute a*x0. One
is to assemble the existed a*x. The other is to call aop(x0). The default is the first method which
needs more IO and less computational cost. When IO is slow, the second method can be considered.
left [bool] Whether to calculate and return left eigenvectors. Default is False.
pick [function(w,v,nroots) => (e[idx], w[:,idx], idx)] Function to filter eigenvalues and eigenvectors.
follow_state [bool] If the solution dramatically changes in two iterations, clean the subspace and restart
the iteration with the old solution. It can help to improve numerical stability. Default is False.
1.5. lib — Helper functions, parameters, and C extensions

85

PySCF Documentation, Release 1.4.0

Returns:
conv [bool] Converged or not
e [list of eigenvalues] The eigenvalues can be sorted real or complex, depending on the return value of
pick function.
vl [list of 1D arrays] Left eigenvectors. Only returned if left=True.
c [list of 1D arrays] Right eigenvectors.
Examples:
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
2

from pyscf import lib
a = numpy.random.random((10,10))
a = a
aop = lambda xs: [numpy.dot(a,x) for x in xs]
precond = lambda dx, e, x0: dx/(a.diagonal()-e)
x0 = a[0]
e, vl, vr = lib.davidson(aop, x0, precond, nroots=2, left=True)
len(e)

pyscf.lib.linalg_helper.eigh_by_blocks(h, s=None, labels=None)
Solve an ordinary or generalized eigenvalue problem for diagonal blocks. The diagonal blocks are extracted
based on the given basis “labels”. The rows and columns which have the same labels are put in the same
block. One common scenario one needs the block-wise diagonalization is to diagonalize the matrix in symmetry
adapted basis, in which “labels” is the irreps of each basis.
Args:
h, s [2D array] Complex Hermitian or real symmetric matrix.
Kwargs: labels : list
Returns: w, v. w is the eigenvalue vector; v is the eigenfunction array; seig is the eigenvalue vector of the
metric s.
Examples:
>>> from pyscf import lib
>>> a = numpy.ones((4,4))
>>> a[0::3,0::3] = 0
>>> a[1::3,1::3] = 2
>>> a[2::3,2::3] = 4
>>> labels = ['a', 'b', 'c', 'a']
>>> lib.eigh_by_blocks(a, labels)
(array([ 0., 0., 2., 4.]),
array([[ 1., 0., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.],
[ 0., 1., 0., 0.]]))
>>> numpy.linalg.eigh(a)
(array([ -8.82020545e-01, -1.81556477e-16,
array([[ 6.40734630e-01, -7.07106781e-01,
[ -3.80616542e-01,
9.40505244e-17,
[ -1.84524565e-01,
9.40505244e-17,
[ 6.40734630e-01,
7.07106781e-01,
˓→01]]))

86

1.77653793e+00,
1.68598330e-01,
8.19944479e-01,
-5.20423152e-01,
1.68598330e-01,

5.10548262e+00]),
-2.47050070e-01],
-4.27577008e-01],
-8.33732828e-01],
-2.47050070e-

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

>>> from pyscf import gto, lib, symm
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1', basis='ccpvdz', symmetry=True)
>>> c = numpy.hstack(mol.symm_orb)
>>> vnuc_so = reduce(numpy.dot, (c.T, mol.intor('int1e_nuc_sph'), c))
>>> orbsym = symm.label_orb_symm(mol, mol.irrep_name, mol.symm_orb, c)
>>> lib.eigh_by_blocks(vnuc_so, labels=orbsym)
(array([-4.50766885, -1.80666351, -1.7808565 , -1.7808565 , -1.74189134,
-0.98998583, -0.98998583, -0.40322226, -0.30242374, -0.07608981]),
...)

pyscf.lib.linalg_helper.krylov(aop, b, x0=None, tol=1e-10, max_cycle=30, dot=, lindep=1e-15, callback=None, hermi=False, verbose=2)
Krylov subspace method to solve (1+a) x = b. Ref: J. A. Pople et al, Int. J. Quantum. Chem. Symp. 13, 225
(1979).
Args:
aop [function(x) => array_like_x] aop(x) to mimic the matrix vector multiplication
ment is a 1D array. The returned value is a 1D array.

∑︀

𝑗

𝑎𝑖𝑗 𝑥𝑗 . The argu-

Kwargs:
x0 [1D array] Initial guess
tol [float] Tolerance to terminate the operation aop(x).
max_cycle [int] max number of iterations.
lindep [float] Linear dependency threshold. The function is terminated when the smallest eigenvalue of
the metric of the trial vectors is lower than this threshold.
dot [function(x, y) => scalar] Inner product
callback [function(envs_dict) => None] callback function takes one dict as the argument which is generated by the builtin function locals(), so that the callback function can access all local variables
in the current envrionment.
Returns: x : 1D array like b
Examples:
>>> from pyscf import lib
>>> a = numpy.random.random((10,10)) * 1e-2
>>> b = numpy.random.random(10)
>>> aop = lambda x: numpy.dot(a,x)
>>> x = lib.krylov(aop, b)
>>> numpy.allclose(numpy.dot(a,x)+x, b)
True

pyscf.lib.linalg_helper.safe_eigh(h, s, lindep=1e-15)
Solve generalized eigenvalue problem h v = w s v.
Note: The number of eigenvalues and eigenvectors might be less than the matrix dimension if linear dependency
is found in metric s.

Args:
h, s [2D array] Complex Hermitian or real symmetric matrix.

1.5. lib — Helper functions, parameters, and C extensions

87

PySCF Documentation, Release 1.4.0

Kwargs:
lindep [float] Linear dependency threshold. By diagonalizing the metric s, we consider the eigenvectors
are linearly dependent subsets if their eigenvalues are smaller than this threshold.
Returns: w, v, seig. w is the eigenvalue vector; v is the eigenfunction array; seig is the eigenvalue vector of the
metric s.

1.5.4 chkfile
pyscf.lib.chkfile.dump(chkfile, key, value)
Save array(s) in chkfile
Args:
chkfile [str] Name of chkfile.
key : str
value [array, vector ... or dict] If value is a python dict, the key/value of the dict will be saved recursively
as the HDF5 group/dataset
Returns: No return value
Examples:
>>> import h5py
>>> from pyscf import lib
>>> ci = {'Ci' : {'op': ('E', 'i'), 'irrep': ('Ag', 'Au')}}
>>> lib.chkfile.save('symm.chk', 'symm', ci)
>>> f = h5py.File('symm.chk')
>>> f.keys()
['symm']
>>> f['symm'].keys()
['Ci']
>>> f['symm/Ci'].keys()
['op', 'irrep']
>>> f['symm/Ci/op']


pyscf.lib.chkfile.dump_mol(mol, chkfile)
Save Mole object in chkfile
Args: mol : an instance of Mole.
chkfile [str] Name of chkfile.
Returns: No return value
pyscf.lib.chkfile.load(chkfile, key)
Load array(s) from chkfile
Args:
chkfile [str] Name of chkfile. The chkfile needs to be saved in HDF5 format.
key [str] HDF5.dataset name or group name. If key is the HDF5 group name, the group will be loaded
into an Python dict, recursively
Returns: whatever read from chkfile
Examples:

88

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

>>> from pyscf import gto, scf, lib
>>> mol = gto.M(atom='He 0 0 0')
>>> mf = scf.RHF(mol)
>>> mf.chkfile = 'He.chk'
>>> mf.kernel()
>>> mo_coeff = lib.chkfile.load('He.chk', 'scf/mo_coeff')
>>> mo_coeff.shape
(1, 1)
>>> scfdat = lib.chkfile.load('He.chk', 'scf')
>>> scfdat.keys()
['e_tot', 'mo_occ', 'mo_energy', 'mo_coeff']

pyscf.lib.chkfile.load_mol(chkfile)
Load Mole object from chkfile. The save_mol/load_mol operation can be used a serialization method for Mole
object.
Args:
chkfile [str] Name of chkfile.
Returns: A (initialized/built) Mole object
Examples:
>>> from pyscf import gto, lib
>>> mol = gto.M(atom='He 0 0 0')
>>> lib.chkfile.save_mol(mol, 'He.chk')
>>> lib.chkfile.load_mol('He.chk')


pyscf.lib.chkfile.save_mol(mol, chkfile)
Save Mole object in chkfile
Args: mol : an instance of Mole.
chkfile [str] Name of chkfile.
Returns: No return value
Fast load
The results of SCF and MCSCF methods are saved as a Python dictionary in the chkfile. One can fast load the results
and update the SCF and MCSCF objects using the python built in methods .__dict__.update, eg:
from pyscf import gto, scf, mcscf, lib
mol = gto.M(atom='N 0 0 0; N 1 1 1', basis='ccpvdz')
mf = mol.apply(scf.RHF).set(chkfile='n2.chk).run()
mc = mcscf.CASSCF(mf, 6, 6).set(chkfile='n2.chk').run()
# load SCF results
mf = scf.RHF(mol)
mf.__dict__.update(lib.chkfile.load('n2.chk', 'scf'))
# load MCSCF results
mc = mcscf.CASCI(mf, 6, 6)
mc.__dict__.update(lib.chkfile.load('n2.chk', 'mcscf'))
mc.kernel()

1.5. lib — Helper functions, parameters, and C extensions

89

PySCF Documentation, Release 1.4.0

1.6 scf — Mean-field methods
1.6.1 Stability analysis
1.6.2 Addons
Special treatments may be required to the SCF methods in some situations. These special treatments cannot be universally applied for all SCF models. They were defined in the scf.addons module. For example, in an UHF
calculation, we may want the 𝑆𝑧 value to be changed (the numbers of alpha and beta electrons not conserved) during
SCF iteration while conserving the total number of electrons. scf.addons.dynamic_sz_() can provide this
functionality:
from pyscf import gto, scf
mol = gto.M(atom='O 0 0 0; O 0 0 1')
mf = scf.UHF(mol)
mf.verbose=4
mf = scf.addons.dynamic_sz_(mf)
mf.kernel()
print('S^2 = %s, 2S+1 = %s' % mf.spin_square())

This function automatically converges the ground sate of oxygen molecule to triplet state although we didn’t specify
spin state in the mol object.
Note: Function scf.addons.dynamic_sz_() has side effects. It changes the underlying mean-field object.
The addons mechanism increases the flexibility of PySCf program. You can define various addons to customize the
default behaviour of pyscf program. For example, if you’d like to track the changes of the density (the diagonal term
of density matrix) of certain basis during the SCF iteration, you can write the following addon to output the required
density:
def output_density(mf, basis_label):
ao_labels = mf.mol.ao_labels()
old_make_rdm1 = mf.make_rdm1
def make_rdm1(mo_coeff, mo_occ):
dm = old_make_rdm1(mo_coeff, mo_occ)
print('AO
alpha
beta')
for i,s in enumerate(ao_labels):
if basis_label in s:
print(s, dm[0][i,i], dm[1][i,i])
return dm
mf.make_rdm1 = make_rdm1
return mf
from pyscf import gto, scf
mol = gto.M(atom='O 0 0 0; O 0 0 1')
mf = scf.UHF(mol)
mf.verbose=4
mf = scf.addons.dynamic_sz_(mf)
mf = output_density(mf, 'O 2p')
mf.kernel()

90

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

1.6.3 Caching two-electron integrals
When memory is enough (specified by the max_memory of SCF object), the SCF object generates all
two-electron integrals in memory and cache them in _eri array. The default max_memory (defined in
lib.parameters.MAX_MEMORY, see Maximum memory) is 4 GB. It roughly corresponds to two-electron real
integrals for 250 orbitals. For small systems, the cached integrals usually provide the best performance. If you have
enough main memory in your computer, you can increase the max_memory of SCF object to cache the integrals in
memory.
The cached integrals _eri are treated as a dense tensor. When system becomes larger and the two-electron integral
tensor becomes sparse, caching integrals may lose performance advantage. This is mainly due to the fact that the
implementation of J/K build for the cached integrals did not utilize the sparsity of the integral tensor. Also, the data
locality was not considered in the implementation which sometimes leads to bad OpenMP multi-threading speed up.
For large system, the AO-driven direct SCF method is more favorable.

1.6.4 Customizing Hamiltonian
This integral object _eri is not merely used by the mean-field calculation. Along with the get_hcore() method,
this two-electron integral object will be treated as the Hamiltonian in the post-SCF code whenever possible. This
mechanism provides a way to model arbitrary fermion system in PySCF. You can customize a system by changing the
1-electron Hamiltonian and the mean-field _eri attribute. For example, the following code solves a model system:
import numpy
from pyscf import gto, scf, ao2mo, ccsd
mol = gto.M()
n = 10
mol.nelectron = 10
mf = scf.RHF(mol)
t = numpy.zeros((n,n))
for i in range(n-1):
t[i,i+1] = t[i+1,i] = -1.0
t[n-1,0] = t[0,n-1] = 1.0 # anti-PBC
eri = numpy.zeros((n,n,n,n))
for i in range(n):
eri[i,i,i,i] = 4.0
mf.get_hcore = lambda *args: t
mf.get_ovlp = lambda *args: numpy.eye(n)
# ao2mo.restore(8, eri, n) to get 8-fold symmetry of the integrals
# ._eri only supports the 2-electron integrals in 4-fold or 8-fold symmetry.
mf._eri = ao2mo.restore(8, eri, n)
mf.kernel()
mycc = ccsd.RCCSD(mf).run()
e,v = mycc.ipccsd(nroots=3)
print('IP = ', e)
e,v = mycc.eaccsd(nroots=3)
print('EA = ', e)

Some post-SCF methods require the 4-index MO integrals. Depending the available memory (affected by the value
of max_memory in each class), these methods may not use the “AO integrals” cached in _eri. To ensure the post
mean-field methods to use the _eri integrals no matter whether the actual memory usage is over the max_memory
limite, you can set the flag incore_anyway in Mole class to True before calling the kernel() function of the

1.6. scf — Mean-field methods

91

PySCF Documentation, Release 1.4.0

post-SCF methods. In the following example, without setting incore_anyway=True, the CCSD calculations will
crash:
import numpy
from pyscf import gto, scf, ao2mo, ccsd
mol = gto.M()
n = 10
mol.nelectron = n
mol.max_memory = 0
mf = scf.RHF(mol)
t = numpy.zeros((n,n))
for i in range(n-1):
t[i,i+1] = t[i+1,i] = 1.0
t[n-1,0] = t[0,n-1] = -1.0
eri = numpy.zeros((n,n,n,n))
for i in range(n):
eri[i,i,i,i] = 4.0
mf.get_hcore = lambda *args: t
mf.get_ovlp = lambda *args: numpy.eye(n)
mf._eri = ao2mo.restore(8, eri, n)
mf.kernel()
mol.incore_anyway = True
mycc = ccsd.RCCSD(mf).run()
e,v = mycc.ipccsd(nroots=3)
print('IP = ', e)
e,v = mycc.eaccsd(nroots=3)
print('EA = ', e)

Holding the entire two-particle interactions matrix elements in memory often leads to high memory usage. In the
SCF calculation, the memory usage can be optimized if _eri is sparse. The SCF iterations requires only the Fock
matrix which in turn calls the J/K build function SCF.get_jk() to compute the Coulomb and HF-exchange matrix.
Overwriting the SCF.get_jk() function can reduce the memory footprint of the SCF part in the above example:
import numpy
from pyscf import gto, scf, ao2mo, ccsd
mol = gto.M()
n = 10
mol.nelectron = n
mol.max_memory = 0
mf = scf.RHF(mol)
t = numpy.zeros((n,n))
for i in range(n-1):
t[i,i+1] = t[i+1,i] = 1.0
t[n-1,0] = t[0,n-1] = -1.0
mf.get_hcore = lambda *args: t
mf.get_ovlp = lambda *args: numpy.eye(n)
def get_jk(mol, dm, *args):
j = numpy.diag(dm.diagonal()) * 4.
k = numpy.diag(dm.diagonal()) * 4.
return j, k
mf.get_jk = get_jk
mf.kernel()

92

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

Another way to handle the two-particle interactions of large model system is to use the density fitting/Cholesky decomposed integrals. See also Saving/Loading DF integral tensor.

1.6.5 Program reference
Non-relativistic and relativistic Hartree-Fock
Simple usage:
>>> from pyscf import gto, scf
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1')
>>> mf = scf.RHF(mol).run()

scf.RHF() returns an instance of SCF class. There are some parameters to control the SCF method.
verbose [int] Print level. Default value equals to Mole.verbose
max_memory [float or int] Allowed memory in MB. Default value equals to Mole.max_memory
chkfile [str] checkpoint file to save MOs, orbital energies etc.
conv_tol [float] converge threshold. Default is 1e-10
max_cycle [int] max number of iterations. Default is 50
init_guess [str] initial guess method. It can be one of ‘minao’, ‘atom’, ‘1e’, ‘chkfile’. Default is ‘minao’
DIIS [class listed in scf.diis] Default is diis.SCF_DIIS. Set it to None/False to turn off DIIS.
diis [bool] whether to do DIIS. Default is True.
diis_space [int] DIIS space size. By default, 8 Fock matrices and errors vector are stored.
diis_start_cycle [int] The step to start DIIS. Default is 0.
level_shift_factor [float or int] Level shift (in AU) for virtual space. Default is 0.
direct_scf [bool] Direct SCF is used by default.
direct_scf_tol [float] Direct SCF cutoff threshold. Default is 1e-13.
callback [function] callback function takes one dict as the argument which is generated by the builtin
function locals(), so that the callback function can access all local variables in the current
envrionment.
conv_check [bool] An extra cycle to check convergence after SCF iterations.
nelec [(int,int), for UHF/ROHF class] freeze the number of (alpha,beta) electrons.
irrep_nelec [dict, for symmetry- RHF/ROHF/UHF class only] to indicate the number of electrons for
each irreps. In RHF, give {‘ir_name’:int, ...} ; In ROHF/UHF, give {‘ir_name’:(int,int), ...} . It is
effective when Mole.symmetry is set True.
auxbasis [str, for density fitting SCF only] Auxiliary basis for density fitting.
>>> mf = scf.density_fit(scf.UHF(mol))
>>> mf.scf()

Density fitting can be applied to all non-relativistic HF class.
with_ssss [bool, for Dirac-Hartree-Fock only] If False, ignore small component integrals (SS|SS). Default is True.
with_gaunt [bool, for Dirac-Hartree-Fock only] If False, ignore Gaunt interaction. Default is False.
1.6. scf — Mean-field methods

93

PySCF Documentation, Release 1.4.0

Saved results
converged [bool] SCF converged or not
e_tot [float] Total HF energy (electronic energy plus nuclear repulsion)
mo_energy [] Orbital energies
mo_occ Orbital occupancy
mo_coeff Orbital coefficients
Non-relativistic Hartree-Fock
class pyscf.scf.hf.SCF(mol)
SCF base class. non-relativistic RHF.
Attributes:
verbose [int] Print level. Default value equals to Mole.verbose
max_memory [float or int] Allowed memory in MB. Default equals to Mole.max_memory
chkfile [str] checkpoint file to save MOs, orbital energies etc.
conv_tol [float] converge threshold. Default is 1e-10
conv_tol_grad [float] gradients converge threshold. Default is sqrt(conv_tol)
max_cycle [int] max number of iterations. Default is 50
init_guess [str] initial guess method. It can be one of ‘minao’, ‘atom’, ‘1e’, ‘chkfile’. Default is ‘minao’
diis [boolean or object of DIIS class listed in scf.diis] Default is diis.SCF_DIIS. Set it to None
to turn off DIIS.
diis_space [int] DIIS space size. By default, 8 Fock matrices and errors vector are stored.
diis_start_cycle [int] The step to start DIIS. Default is 1.
diis_file: ‘str’ File to store DIIS vectors and error vectors.
level_shift [float or int] Level shift (in AU) for virtual space. Default is 0.
direct_scf [bool] Direct SCF is used by default.
direct_scf_tol [float] Direct SCF cutoff threshold. Default is 1e-13.
callback [function(envs_dict) => None] callback function takes one dict as the argument which is generated by the builtin function locals(), so that the callback function can access all local variables
in the current envrionment.
conv_check [bool] An extra cycle to check convergence after SCF iterations.
Saved results
converged [bool] SCF converged or not
e_tot [float] Total HF energy (electronic energy plus nuclear repulsion)
mo_energy : Orbital energies
mo_occ Orbital occupancy
mo_coeff Orbital coefficients
Examples:

94

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

>>> mol = gto.M(atom='H 0 0 0; H 0 0 1.1', basis='cc-pvdz')
>>> mf = scf.hf.SCF(mol)
>>> mf.verbose = 0
>>> mf.level_shift = .4
>>> mf.scf()
-1.0811707843775884

analyze(verbose=None, **kwargs)
Analyze the given SCF object: print orbital energies, occupancies; print orbital coefficients; Mulliken
population analysis; Diople moment.
as_scanner(mf )
Generating a scanner/solver for HF PES.
The returned solver is a function. This function requires one argument “mol” as input and returns total
HF energy.
The solver will automatically use the results of last calculation as the initial guess of the new calculation.
All parameters assigned in the SCF object (DIIS, conv_tol, max_memory etc) are automatically applied
in the solver.
Note scanner has side effects. It may change many underlying objects (_scf, with_df, with_x2c, ...) during
calculation.
Examples:
>>> from pyscf import gto, scf
>>> hf_scanner = scf.RHF(gto.Mole().set(verbose=0)).as_scanner()
>>> hf_scanner(gto.M(atom='H 0 0 0; F 0 0 1.1'))
-98.552190448277955
>>> hf_scanner(gto.M(atom='H 0 0 0; F 0 0 1.5'))
-98.414750424294368

canonicalize(mf, mo_coeff, mo_occ, fock=None)
Canonicalization diagonalizes the Fock matrix within occupied, open, virtual subspaces separatedly (without change occupancy).
dip_moment(mol=None, dm=None, unit_symbol=None, verbose=3)
Dipole moment calculation
∑︁ ∑︁
∑︁
𝜇𝑥 = −
𝑃𝜇𝜈 (𝜈|𝑥|𝜇) +
𝑄𝐴 𝑋𝐴
𝜇

𝜇𝑦 = −

𝜇

𝜇𝑧 = −

𝜈

∑︁ ∑︁

𝑃𝜇𝜈 (𝜈|𝑦|𝜇) +

𝜈

∑︁ ∑︁
𝜇

𝐴

∑︁

𝑄𝐴 𝑌𝐴

𝐴

𝑃𝜇𝜈 (𝜈|𝑧|𝜇) +

𝜈

∑︁

𝑄𝐴 𝑍𝐴

𝐴

where 𝜇𝑥 , 𝜇𝑦 , 𝜇𝑧 are the x, y and z components of dipole moment
Args: mol: an instance of Mole dm : a 2D ndarrays density matrices
Return: A list: the dipole moment on x, y and z component
eig(h, s)
Solver for generalized eigenvalue problem
𝐻𝐶 = 𝑆𝐶𝐸

1.6. scf — Mean-field methods

95

PySCF Documentation, Release 1.4.0

energy_elec(mf, dm=None, h1e=None, vhf=None)
Electronic part of Hartree-Fock energy, for given core hamiltonian and HF potential
... math:
E = \sum_{ij}h_{ij} \gamma_{ji}
+ \frac{1}{2}\sum_{ijkl} \gamma_{ji}\gamma_{lk} \langle ik||jl\rangle

Args: mf : an instance of SCF class
Kwargs:
dm [2D ndarray] one-partical density matrix
h1e [2D ndarray] Core hamiltonian
vhf [2D ndarray] HF potential
Returns: Hartree-Fock electronic energy and the Coulomb energy
Examples:
>>> from pyscf import gto, scf
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1.1')
>>> mf = scf.RHF(mol)
>>> mf.scf()
>>> dm = mf.make_rdm1()
>>> scf.hf.energy_elec(mf, dm)
(-1.5176090667746334, 0.60917167853723675)

energy_tot(mf, dm=None, h1e=None, vhf=None)
Total Hartree-Fock energy, electronic part plus nuclear repulstion See scf.hf.energy_elec() for
the electron part
from_chk(chkfile=None, project=True)
Read the HF results from checkpoint file, then project it to the basis defined by mol
Returns: Density matrix, 2D ndarray
get_fock(mf,
h1e=None,
s1e=None,
vhf=None,
dm=None,
cycle=-1,
diis_start_cycle=None, level_shift_factor=None, damp_factor=None)
F = h^{core} + V^{HF}

diis=None,

Special treatment (damping, DIIS, or level shift) will be applied to the Fock matrix if diis and cycle is
specified (The two parameters are passed to get_fock function during the SCF iteration)
Args:
h1e [2D ndarray] Core hamiltonian
s1e [2D ndarray] Overlap matrix, for DIIS
vhf [2D ndarray] HF potential matrix
dm [2D ndarray] Density matrix, for DIIS
Kwargs:
cycle [int] Then present SCF iteration step, for DIIS
diis [an object of SCF.DIIS class] DIIS object to hold intermediate Fock and error vectors
diis_start_cycle [int] The step to start DIIS. Default is 0.
level_shift_factor [float or int] Level shift (in AU) for virtual space. Default is 0.
96

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

get_grad(mo_coeff, mo_occ, fock=None)
RHF Gradients
Args:
mo_coeff [2D ndarray] Obital coefficients
mo_occ [1D ndarray] Orbital occupancy
fock_ao [2D ndarray] Fock matrix in AO representation
Returns: Gradients in MO representation. It’s a num_occ*num_vir vector.
get_j(mol=None, dm=None, hermi=1)
Compute J matrix for the given density matrix.
get_jk(mol=None, dm=None, hermi=1)
Compute J, K matrices for the given density matrix
Args: mol : an instance of Mole
dm [ndarray or list of ndarrays] A density matrix or a list of density matrices
Kwargs:
hermi [int] Whether J, K matrix is hermitian

0 : no hermitian or symmetric
1 : hermitian
2 : anti-hermitian

vhfopt : A class which holds precomputed quantities to optimize the computation of J, K matrices
Returns: Depending on the given dm, the function returns one J and one K matrix, or a list of J matrices
and a list of K matrices, corresponding to the input density matrices.
Examples:
>>>
>>>
>>>
>>>
>>>
>>>
(3,

from pyscf import gto, scf
from pyscf.scf import _vhf
mol = gto.M(atom='H 0 0 0; H 0 0 1.1')
dms = numpy.random.random((3,mol.nao_nr(),mol.nao_nr()))
j, k = scf.hf.get_jk(mol, dms, hermi=0)
print(j.shape)
2, 2)

get_k(mol=None, dm=None, hermi=1)
Compute K matrix for the given density matrix.
get_occ(mf, mo_energy=None, mo_coeff=None)
Label the occupancies for each orbital
Kwargs:
mo_energy [1D ndarray] Obital energies
mo_coeff [2D ndarray] Obital coefficients
Examples:

1.6. scf — Mean-field methods

97

PySCF Documentation, Release 1.4.0

>>> from pyscf import gto, scf
>>> mol = gto.M(atom='H 0 0 0; F 0 0 1.1')
>>> mf = scf.hf.SCF(mol)
>>> energy = numpy.array([-10., -1., 1, -2., 0, -3])
>>> mf.get_occ(energy)
array([2, 2, 0, 2, 2, 2])

get_veff(mol=None, dm=None, dm_last=0, vhf_last=0, hermi=1)
Hartree-Fock potential matrix for the given density matrix
Args: mol : an instance of Mole
dm [ndarray or list of ndarrays] A density matrix or a list of density matrices
Kwargs:
dm_last [ndarray or a list of ndarrays or 0] The density matrix baseline. If not 0, this function
computes the increment of HF potential w.r.t. the reference HF potential matrix.
vhf_last [ndarray or a list of ndarrays or 0] The reference HF potential matrix.
hermi [int] Whether J, K matrix is hermitian

0 : no hermitian or symmetric
1 : hermitian
2 : anti-hermitian

vhfopt : A class which holds precomputed quantities to optimize the computation of J, K matrices
Returns: matrix Vhf = 2*J - K. Vhf can be a list matrices, corresponding to the input density matrices.
Examples:
>>> import numpy
>>> from pyscf import gto, scf
>>> from pyscf.scf import _vhf
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1.1')
>>> dm0 = numpy.random.random((mol.nao_nr(),mol.nao_nr()))
>>> vhf0 = scf.hf.get_veff(mol, dm0, hermi=0)
>>> dm1 = numpy.random.random((mol.nao_nr(),mol.nao_nr()))
>>> vhf1 = scf.hf.get_veff(mol, dm1, hermi=0)
>>> vhf2 = scf.hf.get_veff(mol, dm1, dm_last=dm0, vhf_last=vhf0, hermi=0)
>>> numpy.allclose(vhf1, vhf2)
True

init_guess_by_1e(mol=None)
Generate initial guess density matrix from core hamiltonian
Returns: Density matrix, 2D ndarray
init_guess_by_atom(mol=None)
Generate initial guess density matrix from superposition of atomic HF density matrix. The atomic HF is
occupancy averaged RHF
Returns: Density matrix, 2D ndarray
init_guess_by_chkfile(chkfile=None, project=True)
Read the HF results from checkpoint file, then project it to the basis defined by mol

98

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

Returns: Density matrix, 2D ndarray
init_guess_by_minao(mol=None)
Generate initial guess density matrix based on ANO basis, then project the density matrix to the basis set
defined by mol
Returns: Density matrix, 2D ndarray
Examples:
>>> from pyscf import gto, scf
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1.1')
>>> scf.hf.init_guess_by_minao(mol)
array([[ 0.94758917, 0.09227308],
[ 0.09227308, 0.94758917]])

kernel(dm0=None)
main routine for SCF
Kwargs:
dm0 [ndarray] If given, it will be used as the initial guess density matrix
Examples:
>>> import numpy
>>> from pyscf import gto, scf
>>> mol = gto.M(atom='H 0 0 0; F 0 0 1.1')
>>> mf = scf.hf.SCF(mol)
>>> dm_guess = numpy.eye(mol.nao_nr())
>>> mf.kernel(dm_guess)
converged SCF energy = -98.5521904482821
-98.552190448282104

make_rdm1(mo_coeff=None, mo_occ=None)
One-particle density matrix in AO representation
Args:
mo_coeff [2D ndarray] Orbital coefficients. Each column is one orbital.
mo_occ [1D ndarray] Occupancy
mulliken_meta(mol=None, dm=None, verbose=5, pre_orth_method=’ANO’, s=None)
Mulliken population analysis, based on meta-Lowdin AOs. In the meta-lowdin, the AOs are grouped in
three sets: core, valence and Rydberg, the orthogonalization are carreid out within each subsets.
Args: mol : an instance of Mole
dm [ndarray or 2-item list of ndarray] Density matrix. ROHF dm is a 2-item list of 2D array
Kwargs: verbose : int or instance of lib.logger.Logger
pre_orth_method [str] Pre-orthogonalization, which localized GTOs for each atom. To obtain the
occupied and unoccupied atomic shells, there are three methods

‘ano’ : Project GTOs to ANO basis
‘minao’ : Project GTOs to MINAO basis
‘scf’ : Fraction-averaged RHF

1.6. scf — Mean-field methods

99

PySCF Documentation, Release 1.4.0

mulliken_pop(mol=None, dm=None, s=None, verbose=5)
Mulliken population analysis
𝑀𝑖𝑗 = 𝐷𝑖𝑗 𝑆𝑗𝑖
Mulliken charges
𝛿𝑖 =

∑︁

𝑀𝑖𝑗

𝑗

pop(*args, **kwargs)
Mulliken population analysis, based on meta-Lowdin AOs. In the meta-lowdin, the AOs are grouped in
three sets: core, valence and Rydberg, the orthogonalization are carreid out within each subsets.
Args: mol : an instance of Mole
dm [ndarray or 2-item list of ndarray] Density matrix. ROHF dm is a 2-item list of 2D array
Kwargs: verbose : int or instance of lib.logger.Logger
pre_orth_method [str] Pre-orthogonalization, which localized GTOs for each atom. To obtain the
occupied and unoccupied atomic shells, there are three methods

‘ano’ : Project GTOs to ANO basis
‘minao’ : Project GTOs to MINAO basis
‘scf’ : Fraction-averaged RHF

scf(dm0=None)
main routine for SCF
Kwargs:
dm0 [ndarray] If given, it will be used as the initial guess density matrix
Examples:
>>> import numpy
>>> from pyscf import gto, scf
>>> mol = gto.M(atom='H 0 0 0; F 0 0 1.1')
>>> mf = scf.hf.SCF(mol)
>>> dm_guess = numpy.eye(mol.nao_nr())
>>> mf.kernel(dm_guess)
converged SCF energy = -98.5521904482821
-98.552190448282104

update(chkfile=None)
Read attributes from the chkfile then replace the attributes of current object. See also mf.update_from_chk

class pyscf.scf.hf.RHF(mol)
SCF base class. non-relativistic RHF.
Attributes:
verbose [int] Print level. Default value equals to Mole.verbose
max_memory [float or int] Allowed memory in MB. Default equals to Mole.max_memory

100

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

chkfile [str] checkpoint file to save MOs, orbital energies etc.
conv_tol [float] converge threshold. Default is 1e-10
conv_tol_grad [float] gradients converge threshold. Default is sqrt(conv_tol)
max_cycle [int] max number of iterations. Default is 50
init_guess [str] initial guess method. It can be one of ‘minao’, ‘atom’, ‘1e’, ‘chkfile’. Default is ‘minao’
diis [boolean or object of DIIS class listed in scf.diis] Default is diis.SCF_DIIS. Set it to None
to turn off DIIS.
diis_space [int] DIIS space size. By default, 8 Fock matrices and errors vector are stored.
diis_start_cycle [int] The step to start DIIS. Default is 1.
diis_file: ‘str’ File to store DIIS vectors and error vectors.
level_shift [float or int] Level shift (in AU) for virtual space. Default is 0.
direct_scf [bool] Direct SCF is used by default.
direct_scf_tol [float] Direct SCF cutoff threshold. Default is 1e-13.
callback [function(envs_dict) => None] callback function takes one dict as the argument which is generated by the builtin function locals(), so that the callback function can access all local variables
in the current envrionment.
conv_check [bool] An extra cycle to check convergence after SCF iterations.
Saved results
converged [bool] SCF converged or not
e_tot [float] Total HF energy (electronic energy plus nuclear repulsion)
mo_energy : Orbital energies
mo_occ Orbital occupancy
mo_coeff Orbital coefficients
Examples:
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1.1', basis='cc-pvdz')
>>> mf = scf.hf.SCF(mol)
>>> mf.verbose = 0
>>> mf.level_shift = .4
>>> mf.scf()
-1.0811707843775884

convert_from_(mf )
Convert given mean-field object to RHF/ROHF
get_jk(mol=None, dm=None, hermi=1)
Compute J, K matrices for the given density matrix
Args: mol : an instance of Mole
dm [ndarray or list of ndarrays] A density matrix or a list of density matrices
Kwargs:
hermi [int] Whether J, K matrix is hermitian

1.6. scf — Mean-field methods

101

PySCF Documentation, Release 1.4.0

0 : no hermitian or symmetric
1 : hermitian
2 : anti-hermitian

vhfopt : A class which holds precomputed quantities to optimize the computation of J, K matrices
Returns: Depending on the given dm, the function returns one J and one K matrix, or a list of J matrices
and a list of K matrices, corresponding to the input density matrices.
Examples:
>>>
>>>
>>>
>>>
>>>
>>>
(3,

from pyscf import gto, scf
from pyscf.scf import _vhf
mol = gto.M(atom='H 0 0 0; H 0 0 1.1')
dms = numpy.random.random((3,mol.nao_nr(),mol.nao_nr()))
j, k = scf.hf.get_jk(mol, dms, hermi=0)
print(j.shape)
2, 2)

class pyscf.scf.rohf.ROHF(mol)
SCF base class. non-relativistic RHF.
Attributes:
verbose [int] Print level. Default value equals to Mole.verbose
max_memory [float or int] Allowed memory in MB. Default equals to Mole.max_memory
chkfile [str] checkpoint file to save MOs, orbital energies etc.
conv_tol [float] converge threshold. Default is 1e-10
conv_tol_grad [float] gradients converge threshold. Default is sqrt(conv_tol)
max_cycle [int] max number of iterations. Default is 50
init_guess [str] initial guess method. It can be one of ‘minao’, ‘atom’, ‘1e’, ‘chkfile’. Default is ‘minao’
diis [boolean or object of DIIS class listed in scf.diis] Default is diis.SCF_DIIS. Set it to None
to turn off DIIS.
diis_space [int] DIIS space size. By default, 8 Fock matrices and errors vector are stored.
diis_start_cycle [int] The step to start DIIS. Default is 1.
diis_file: ‘str’ File to store DIIS vectors and error vectors.
level_shift [float or int] Level shift (in AU) for virtual space. Default is 0.
direct_scf [bool] Direct SCF is used by default.
direct_scf_tol [float] Direct SCF cutoff threshold. Default is 1e-13.
callback [function(envs_dict) => None] callback function takes one dict as the argument which is generated by the builtin function locals(), so that the callback function can access all local variables
in the current envrionment.
conv_check [bool] An extra cycle to check convergence after SCF iterations.
Saved results
converged [bool] SCF converged or not

102

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

e_tot [float] Total HF energy (electronic energy plus nuclear repulsion)
mo_energy : Orbital energies
mo_occ Orbital occupancy
mo_coeff Orbital coefficients
Examples:
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1.1', basis='cc-pvdz')
>>> mf = scf.hf.SCF(mol)
>>> mf.verbose = 0
>>> mf.level_shift = .4
>>> mf.scf()
-1.0811707843775884

analyze(verbose=None, **kwargs)
Analyze the given SCF object: print orbital energies, occupancies; print orbital coefficients; Mulliken
population analysis
canonicalize(mf, mo_coeff, mo_occ, fock=None)
Canonicalization diagonalizes the Fock matrix within occupied, open, virtual subspaces separatedly (without change occupancy).
eig(fock, s)
Solver for generalized eigenvalue problem
𝐻𝐶 = 𝑆𝐶𝐸
get_fock(mf,
h1e=None,
s1e=None,
vhf=None,
dm=None,
cycle=-1,
diis=None,
diis_start_cycle=None, level_shift_factor=None, damp_factor=None)
Build fock matrix based on Roothaan’s effective fock. See also get_roothaan_fock()
get_grad(mo_coeff, mo_occ, fock=None)
ROHF gradients is the off-diagonal block [co + cv + ov], where [ cc co cv ] [ oc oo ov ] [ vc vo vv ]
get_occ(mf, mo_energy=None, mo_coeff=None)
Label the occupancies for each orbital. NOTE the occupancies are not assigned based on the orbital
energy ordering. The first N orbitals are assigned to be occupied orbitals.
Examples:
>>> mol = gto.M(atom='H 0 0 0; O 0 0 1.1', spin=1)
>>> mf = scf.hf.SCF(mol)
>>> energy = numpy.array([-10., -1., 1, -2., 0, -3])
>>> mf.get_occ(energy)
array([2, 2, 2, 2, 1, 0])

get_veff(mol=None, dm=None, dm_last=0, vhf_last=0, hermi=1)
Unrestricted Hartree-Fock potential matrix of alpha and beta spins, for the given density matrix
∑︁
∑︁
𝛽
𝛼
𝛼
𝑉𝑖𝑗𝛼 =
(𝑖𝑗|𝑘𝑙)(𝛾𝑙𝑘
+ 𝛾𝑙𝑘
)−
(𝑖𝑙|𝑘𝑗)𝛾𝑙𝑘
𝑘𝑙

𝑉𝑖𝑗𝛽

𝑘𝑙

∑︁
∑︁
𝛽
𝛽
𝛼
=
(𝑖𝑗|𝑘𝑙)(𝛾𝑙𝑘
+ 𝛾𝑙𝑘
)−
(𝑖𝑙|𝑘𝑗)𝛾𝑙𝑘
𝑘𝑙

𝑘𝑙

Args: mol : an instance of Mole
dm [a list of ndarrays] A list of density matrices, stored as (alpha,alpha,...,beta,beta,...)

1.6. scf — Mean-field methods

103

PySCF Documentation, Release 1.4.0

Kwargs:
dm_last [ndarray or a list of ndarrays or 0] The density matrix baseline. When it is not 0, this
function computes the increment of HF potential w.r.t. the reference HF potential matrix.
vhf_last [ndarray or a list of ndarrays or 0] The reference HF potential matrix.
hermi [int] Whether J, K matrix is hermitian

0 : no hermitian or symmetric
1 : hermitian
2 : anti-hermitian

vhfopt : A class which holds precomputed quantities to optimize the computation of J, K matrices
Returns: 𝑉ℎ𝑓 = (𝑉 𝛼 , 𝑉 𝛽 ). 𝑉 𝛼 (and 𝑉 𝛽 ) can be a list matrices, corresponding to the input density
matrices.
Examples:
>>>
>>>
>>>
>>>
>>>
>>>
>>>
(6,
>>>
>>>
(3,
>>>
(3,

import numpy
from pyscf import gto, scf
mol = gto.M(atom='H 0 0 0; H 0 0 1.1')
dmsa = numpy.random.random((3,mol.nao_nr(),mol.nao_nr()))
dmsb = numpy.random.random((3,mol.nao_nr(),mol.nao_nr()))
dms = numpy.vstack((dmsa,dmsb))
dms.shape
2, 2)
vhfa, vhfb = scf.uhf.get_veff(mol, dms, hermi=0)
vhfa.shape
2, 2)
vhfb.shape
2, 2)

make_rdm1(mo_coeff=None, mo_occ=None)
One-particle densit matrix. mo_occ is a 1D array, with occupancy 1 or 2.

class pyscf.scf.uhf.UHF(mol)
SCF base class. non-relativistic RHF.
Attributes:
verbose [int] Print level. Default value equals to Mole.verbose
max_memory [float or int] Allowed memory in MB. Default equals to Mole.max_memory
chkfile [str] checkpoint file to save MOs, orbital energies etc.
conv_tol [float] converge threshold. Default is 1e-10
conv_tol_grad [float] gradients converge threshold. Default is sqrt(conv_tol)
max_cycle [int] max number of iterations. Default is 50
init_guess [str] initial guess method. It can be one of ‘minao’, ‘atom’, ‘1e’, ‘chkfile’. Default is ‘minao’
diis [boolean or object of DIIS class listed in scf.diis] Default is diis.SCF_DIIS. Set it to None
to turn off DIIS.

104

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

diis_space [int] DIIS space size. By default, 8 Fock matrices and errors vector are stored.
diis_start_cycle [int] The step to start DIIS. Default is 1.
diis_file: ‘str’ File to store DIIS vectors and error vectors.
level_shift [float or int] Level shift (in AU) for virtual space. Default is 0.
direct_scf [bool] Direct SCF is used by default.
direct_scf_tol [float] Direct SCF cutoff threshold. Default is 1e-13.
callback [function(envs_dict) => None] callback function takes one dict as the argument which is generated by the builtin function locals(), so that the callback function can access all local variables
in the current envrionment.
conv_check [bool] An extra cycle to check convergence after SCF iterations.
Saved results
converged [bool] SCF converged or not
e_tot [float] Total HF energy (electronic energy plus nuclear repulsion)
mo_energy : Orbital energies
mo_occ Orbital occupancy
mo_coeff Orbital coefficients
Examples:
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1.1', basis='cc-pvdz')
>>> mf = scf.hf.SCF(mol)
>>> mf.verbose = 0
>>> mf.level_shift = .4
>>> mf.scf()
-1.0811707843775884

Attributes for UHF:
nelec [(int, int)] If given, freeze the number of (alpha,beta) electrons to the given value.
level_shift [number or two-element list] level shift (in Eh) for alpha and beta Fock if two-element list is
given.
Examples:
>>> mol = gto.M(atom='O 0 0 0; H 0 0 1; H 0 1 0', basis='ccpvdz', charge=1,
˓→spin=1, verbose=0)
>>> mf = scf.UHF(mol)
>>> mf.kernel()
-75.623975516256706
>>> print('S^2 = %.7f, 2S+1 = %.7f' % mf.spin_square())
S^2 = 0.7570150, 2S+1 = 2.0070027

canonicalize(mf, mo_coeff, mo_occ, fock=None)
Canonicalization diagonalizes the UHF Fock matrix within occupied, virtual subspaces separatedly (without change occupancy).
det_ovlp(mo1, mo2, occ1, occ2, ovlp=None)
Calculate the overlap between two different determinants. It is the product of single values of molecular

1.6. scf — Mean-field methods

105

PySCF Documentation, Release 1.4.0

orbital overlap matrix.
𝑆12 = ⟨Ψ𝐴 |Ψ𝐵 ⟩ = (detU)(detV† )

2𝑁
∏︁

𝜆𝑖𝑖

𝑖=1

where U, V, 𝜆 are unitary matrices and single values generated by single value decomposition(SVD) of
the overlap matrix O which is the overlap matrix of two sets of molecular orbitals:
U† OV = Λ
Args:
mo1, mo2 [2D ndarrays] Molecualr orbital coefficients
occ1, occ2: 2D ndarrays occupation numbers
Return:
A list: the product of single values: float x_a, x_b: 1D ndarrays UΛ−1 V† They are used to calculate asymmetric density matrix
dip_moment(mol=None, dm=None, unit_symbol=None, verbose=3)
Dipole moment calculation
∑︁ ∑︁
∑︁
𝜇𝑥 = −
𝑃𝜇𝜈 (𝜈|𝑥|𝜇) +
𝑄𝐴 𝑋𝐴
𝜇

𝜇𝑦 = −

𝜇

𝜇𝑧 = −

𝜈

∑︁ ∑︁

𝑃𝜇𝜈 (𝜈|𝑦|𝜇) +

𝜈

∑︁ ∑︁
𝜇

𝐴

∑︁

𝑄𝐴 𝑌𝐴

𝐴

𝑃𝜇𝜈 (𝜈|𝑧|𝜇) +

𝜈

∑︁

𝑄𝐴 𝑍𝐴

𝐴

where 𝜇𝑥 , 𝜇𝑦 , 𝜇𝑧 are the x, y and z components of dipole moment
Args: mol: an instance of Mole
dm [a list of 2D ndarrays] a list of density matrices
Return: A list: the dipole moment on x, y and z component
energy_elec(mf, dm=None, h1e=None, vhf=None)
Electronic energy of Unrestricted Hartree-Fock
Returns: Hartree-Fock electronic energy and the 2-electron part contribution
get_jk(mol=None, dm=None, hermi=1)
Coulomb (J) and exchange (K)
Args:
dm [a list of 2D arrays or a list of 3D arrays] (alpha_dm, beta_dm) or (alpha_dms, beta_dms)
get_veff(mol=None, dm=None, dm_last=0, vhf_last=0, hermi=1)
Unrestricted Hartree-Fock potential matrix of alpha and beta spins, for the given density matrix
∑︁
∑︁
𝛽
𝛼
𝛼
𝑉𝑖𝑗𝛼 =
(𝑖𝑗|𝑘𝑙)(𝛾𝑙𝑘
+ 𝛾𝑙𝑘
)−
(𝑖𝑙|𝑘𝑗)𝛾𝑙𝑘
𝑘𝑙

𝑉𝑖𝑗𝛽 =

𝑘𝑙

∑︁
∑︁
𝛽
𝛽
𝛼
(𝑖𝑗|𝑘𝑙)(𝛾𝑙𝑘
+ 𝛾𝑙𝑘
)−
(𝑖𝑙|𝑘𝑗)𝛾𝑙𝑘
𝑘𝑙

𝑘𝑙

Args: mol : an instance of Mole
dm [a list of ndarrays] A list of density matrices, stored as (alpha,alpha,...,beta,beta,...)
106

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

Kwargs:
dm_last [ndarray or a list of ndarrays or 0] The density matrix baseline. When it is not 0, this
function computes the increment of HF potential w.r.t. the reference HF potential matrix.
vhf_last [ndarray or a list of ndarrays or 0] The reference HF potential matrix.
hermi [int] Whether J, K matrix is hermitian

0 : no hermitian or symmetric
1 : hermitian
2 : anti-hermitian

vhfopt : A class which holds precomputed quantities to optimize the computation of J, K matrices
Returns: 𝑉ℎ𝑓 = (𝑉 𝛼 , 𝑉 𝛽 ). 𝑉 𝛼 (and 𝑉 𝛽 ) can be a list matrices, corresponding to the input density
matrices.
Examples:
>>>
>>>
>>>
>>>
>>>
>>>
>>>
(6,
>>>
>>>
(3,
>>>
(3,

import numpy
from pyscf import gto, scf
mol = gto.M(atom='H 0 0 0; H 0 0 1.1')
dmsa = numpy.random.random((3,mol.nao_nr(),mol.nao_nr()))
dmsb = numpy.random.random((3,mol.nao_nr(),mol.nao_nr()))
dms = numpy.vstack((dmsa,dmsb))
dms.shape
2, 2)
vhfa, vhfb = scf.uhf.get_veff(mol, dms, hermi=0)
vhfa.shape
2, 2)
vhfb.shape
2, 2)

init_guess_by_minao(mol=None, breaksym=True)
Initial guess in terms of the overlap to minimal basis.
make_asym_dm(mo1, mo2, occ1, occ2, x)
One-particle asymmetric density matrix
Args:
mo1, mo2 [2D ndarrays] Molecualr orbital coefficients
occ1, occ2: 2D ndarrays Occupation numbers
x: 2D ndarrays UΛ−1 V† . See also det_ovlp()
Return: A list of 2D ndarrays for alpha and beta spin
Examples:
>>>
>>>
>>>
>>>
>>>
>>>
(2,

mf1 = scf.UHF(gto.M(atom='H 0 0 0; F 0 0 1.3', basis='ccpvdz')).run()
mf2 = scf.UHF(gto.M(atom='H 0 0 0; F 0 0 1.4', basis='ccpvdz')).run()
s = gto.intor_cross('int1e_ovlp_sph', mf1.mol, mf2.mol)
det, x = det_ovlp(mf1.mo_coeff, mf1.mo_occ, mf2.mo_coeff, mf2.mo_occ, s)
adm = make_asym_dm(mf1.mo_coeff, mf1.mo_occ, mf2.mo_coeff, mf2.mo_occ, x)
adm.shape
19, 19)

1.6. scf — Mean-field methods

107

PySCF Documentation, Release 1.4.0

make_rdm1(mo_coeff=None, mo_occ=None)
One-particle density matrix
Returns: A list of 2D ndarrays for alpha and beta spins
spin_square(mo_coeff=None, s=None)
Spin of the given UHF orbitals
𝑆2 =

1
(𝑆+ 𝑆− + 𝑆− 𝑆+ ) + 𝑆𝑧2
2

∑︀
∑︀
where 𝑆+ = 𝑖 𝑆𝑖+ is effective for all beta occupied orbitals; 𝑆− = 𝑖 𝑆𝑖− is effective for all alpha
occupied orbitals.
1.There are two possibilities for 𝑆+ 𝑆−
∑︀
(a) same electron 𝑆+ 𝑆− = 𝑖 𝑠𝑖+ 𝑠𝑖− ,
∑︁
∑︁
⟨𝑈 𝐻𝐹 |𝑠𝑖+ 𝑠𝑖− |𝑈 𝐻𝐹 ⟩ =
⟨𝑝|𝑠+ 𝑠− |𝑞⟩𝛾𝑞𝑝 = 𝑛𝛼
𝑝𝑞

𝑖

2) different electrons 𝑆+ 𝑆− =
two-particle operator,

∑︀

𝑠𝑖+ 𝑠𝑗− , (𝑖 ̸= 𝑗). There are in total 𝑛(𝑛 − 1) terms. As a

⟨𝑆+ 𝑆− ⟩ = ⟨𝑖𝑗|𝑠+ 𝑠− |𝑖𝑗⟩ − ⟨𝑖𝑗|𝑠+ 𝑠− |𝑗𝑖⟩ = −⟨𝑖𝛼 |𝑗 𝛽 ⟩⟨𝑗 𝛽 |𝑖𝛼 ⟩
2.Similarly, for 𝑆− 𝑆+
(a) same electron
∑︁

⟨𝑠𝑖− 𝑠𝑖+ ⟩ = 𝑛𝛽

𝑖

(a) different electrons
⟨𝑆− 𝑆+ ⟩ = −⟨𝑖𝛽 |𝑗 𝛼 ⟩⟨𝑗 𝛼 |𝑖𝛽 ⟩
2.For 𝑆𝑧2
(a) same electron
⟨𝑠2𝑧 ⟩ =

1
(𝑛𝛼 + 𝑛𝛽 )
4

(a) different electrons
1 ∑︁
(⟨𝑖𝑗|2𝑠𝑧1 𝑠𝑧2 |𝑖𝑗⟩ − ⟨𝑖𝑗|2𝑠𝑧1 𝑠𝑧2 |𝑗𝑖⟩)
2 𝑖𝑗
1 𝛼 𝛼 𝛼 𝛼
(⟨𝑖 |𝑖 ⟩⟨𝑗 |𝑗 ⟩ − ⟨𝑖𝛼 |𝑖𝛼 ⟩⟨𝑗 𝛽 |𝑗 𝛽 ⟩ − ⟨𝑖𝛽 |𝑖𝛽 ⟩⟨𝑗 𝛼 |𝑗 𝛼 ⟩ + ⟨𝑖𝛽 |𝑖𝛽 ⟩⟨𝑗 𝛽 |𝑗 𝛽 ⟩)
4
1
− (⟨𝑖𝛼 |𝑗 𝛼 ⟩⟨𝑗 𝛼 |𝑖𝛼 ⟩ + ⟨𝑖𝛽 |𝑗 𝛽 ⟩⟨𝑗 𝛽 |𝑖𝛽 ⟩)
4
1
1
= (𝑛2𝛼 − 𝑛𝛼 𝑛𝛽 − 𝑛𝛽 𝑛𝛼 + 𝑛2𝛽 ) − (𝑛𝛼 + 𝑛𝛽 )
4
4
1
= ((𝑛𝛼 − 𝑛𝛽 )2 − (𝑛𝛼 + 𝑛𝛽 ))
4
=

In total
⟨𝑆 2 ⟩ =

108

∑︁
∑︁
1
1
(𝑛𝛼 −
⟨𝑖𝛼 |𝑗 𝛽 ⟩⟨𝑗 𝛽 |𝑖𝛼 ⟩ + 𝑛𝛽 −
⟨𝑖𝛽 |𝑗 𝛼 ⟩⟨𝑗 𝛼 |𝑖𝛽 ⟩) + (𝑛𝛼 − 𝑛𝛽 )2
2
4
𝑖𝑗
𝑖𝑗

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

Args:
mo [a list of 2 ndarrays] Occupied alpha and occupied beta orbitals
Kwargs:
s [ndarray] AO overlap
Returns: A list of two floats. The first is the expectation value of S^2. The second is the corresponding
2S+1
Examples:
>>> mol = gto.M(atom='O 0 0 0; H 0 0 1; H 0 1 0', basis='ccpvdz', charge=1,
˓→spin=1, verbose=0)
>>> mf = scf.UHF(mol)
>>> mf.kernel()
-75.623975516256706
>>> mo = (mf.mo_coeff[0][:,mf.mo_occ[0]>0], mf.mo_coeff[1][:,mf.mo_occ[1]>0])
>>> print('S^2 = %.7f, 2S+1 = %.7f' % spin_square(mo, mol.intor('int1e_ovlp_
˓→sph')))
S^2 = 0.7570150, 2S+1 = 2.0070027

Hartree-Fock
class pyscf.scf.hf.RHF(mol)
SCF base class. non-relativistic RHF.
Attributes:
verbose [int] Print level. Default value equals to Mole.verbose
max_memory [float or int] Allowed memory in MB. Default equals to Mole.max_memory
chkfile [str] checkpoint file to save MOs, orbital energies etc.
conv_tol [float] converge threshold. Default is 1e-10
conv_tol_grad [float] gradients converge threshold. Default is sqrt(conv_tol)
max_cycle [int] max number of iterations. Default is 50
init_guess [str] initial guess method. It can be one of ‘minao’, ‘atom’, ‘1e’, ‘chkfile’. Default is ‘minao’
diis [boolean or object of DIIS class listed in scf.diis] Default is diis.SCF_DIIS. Set it to None
to turn off DIIS.
diis_space [int] DIIS space size. By default, 8 Fock matrices and errors vector are stored.
diis_start_cycle [int] The step to start DIIS. Default is 1.
diis_file: ‘str’ File to store DIIS vectors and error vectors.
level_shift [float or int] Level shift (in AU) for virtual space. Default is 0.
direct_scf [bool] Direct SCF is used by default.
direct_scf_tol [float] Direct SCF cutoff threshold. Default is 1e-13.
callback [function(envs_dict) => None] callback function takes one dict as the argument which is generated by the builtin function locals(), so that the callback function can access all local variables
in the current envrionment.
conv_check [bool] An extra cycle to check convergence after SCF iterations.

1.6. scf — Mean-field methods

109

PySCF Documentation, Release 1.4.0

Saved results
converged [bool] SCF converged or not
e_tot [float] Total HF energy (electronic energy plus nuclear repulsion)
mo_energy : Orbital energies
mo_occ Orbital occupancy
mo_coeff Orbital coefficients
Examples:
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1.1', basis='cc-pvdz')
>>> mf = scf.hf.SCF(mol)
>>> mf.verbose = 0
>>> mf.level_shift = .4
>>> mf.scf()
-1.0811707843775884

convert_from_(mf )
Convert given mean-field object to RHF/ROHF
get_jk(mol=None, dm=None, hermi=1)
Compute J, K matrices for the given density matrix
Args: mol : an instance of Mole
dm [ndarray or list of ndarrays] A density matrix or a list of density matrices
Kwargs:
hermi [int] Whether J, K matrix is hermitian

0 : no hermitian or symmetric
1 : hermitian
2 : anti-hermitian

vhfopt : A class which holds precomputed quantities to optimize the computation of J, K matrices
Returns: Depending on the given dm, the function returns one J and one K matrix, or a list of J matrices
and a list of K matrices, corresponding to the input density matrices.
Examples:
>>>
>>>
>>>
>>>
>>>
>>>
(3,

from pyscf import gto, scf
from pyscf.scf import _vhf
mol = gto.M(atom='H 0 0 0; H 0 0 1.1')
dms = numpy.random.random((3,mol.nao_nr(),mol.nao_nr()))
j, k = scf.hf.get_jk(mol, dms, hermi=0)
print(j.shape)
2, 2)

class pyscf.scf.hf.SCF(mol)
SCF base class. non-relativistic RHF.
Attributes:
verbose [int] Print level. Default value equals to Mole.verbose

110

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

max_memory [float or int] Allowed memory in MB. Default equals to Mole.max_memory
chkfile [str] checkpoint file to save MOs, orbital energies etc.
conv_tol [float] converge threshold. Default is 1e-10
conv_tol_grad [float] gradients converge threshold. Default is sqrt(conv_tol)
max_cycle [int] max number of iterations. Default is 50
init_guess [str] initial guess method. It can be one of ‘minao’, ‘atom’, ‘1e’, ‘chkfile’. Default is ‘minao’
diis [boolean or object of DIIS class listed in scf.diis] Default is diis.SCF_DIIS. Set it to None
to turn off DIIS.
diis_space [int] DIIS space size. By default, 8 Fock matrices and errors vector are stored.
diis_start_cycle [int] The step to start DIIS. Default is 1.
diis_file: ‘str’ File to store DIIS vectors and error vectors.
level_shift [float or int] Level shift (in AU) for virtual space. Default is 0.
direct_scf [bool] Direct SCF is used by default.
direct_scf_tol [float] Direct SCF cutoff threshold. Default is 1e-13.
callback [function(envs_dict) => None] callback function takes one dict as the argument which is generated by the builtin function locals(), so that the callback function can access all local variables
in the current envrionment.
conv_check [bool] An extra cycle to check convergence after SCF iterations.
Saved results
converged [bool] SCF converged or not
e_tot [float] Total HF energy (electronic energy plus nuclear repulsion)
mo_energy : Orbital energies
mo_occ Orbital occupancy
mo_coeff Orbital coefficients
Examples:
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1.1', basis='cc-pvdz')
>>> mf = scf.hf.SCF(mol)
>>> mf.verbose = 0
>>> mf.level_shift = .4
>>> mf.scf()
-1.0811707843775884

analyze(verbose=None, **kwargs)
Analyze the given SCF object: print orbital energies, occupancies; print orbital coefficients; Mulliken
population analysis; Diople moment.
as_scanner(mf )
Generating a scanner/solver for HF PES.
The returned solver is a function. This function requires one argument “mol” as input and returns total
HF energy.
The solver will automatically use the results of last calculation as the initial guess of the new calculation.
All parameters assigned in the SCF object (DIIS, conv_tol, max_memory etc) are automatically applied
in the solver.
1.6. scf — Mean-field methods

111

PySCF Documentation, Release 1.4.0

Note scanner has side effects. It may change many underlying objects (_scf, with_df, with_x2c, ...) during
calculation.
Examples:
>>> from pyscf import gto, scf
>>> hf_scanner = scf.RHF(gto.Mole().set(verbose=0)).as_scanner()
>>> hf_scanner(gto.M(atom='H 0 0 0; F 0 0 1.1'))
-98.552190448277955
>>> hf_scanner(gto.M(atom='H 0 0 0; F 0 0 1.5'))
-98.414750424294368

canonicalize(mf, mo_coeff, mo_occ, fock=None)
Canonicalization diagonalizes the Fock matrix within occupied, open, virtual subspaces separatedly (without change occupancy).
dip_moment(mol=None, dm=None, unit_symbol=None, verbose=3)
Dipole moment calculation
∑︁ ∑︁
∑︁
𝜇𝑥 = −
𝑃𝜇𝜈 (𝜈|𝑥|𝜇) +
𝑄𝐴 𝑋𝐴
𝜇

𝜇𝑦 = −

𝜇

𝜇𝑧 = −

𝜈

∑︁ ∑︁

𝑃𝜇𝜈 (𝜈|𝑦|𝜇) +

𝜈

∑︁ ∑︁
𝜇

𝐴

∑︁

𝑄𝐴 𝑌𝐴

𝐴

𝑃𝜇𝜈 (𝜈|𝑧|𝜇) +

𝜈

∑︁

𝑄𝐴 𝑍𝐴

𝐴

where 𝜇𝑥 , 𝜇𝑦 , 𝜇𝑧 are the x, y and z components of dipole moment
Args: mol: an instance of Mole dm : a 2D ndarrays density matrices
Return: A list: the dipole moment on x, y and z component
eig(h, s)
Solver for generalized eigenvalue problem
𝐻𝐶 = 𝑆𝐶𝐸
energy_elec(mf, dm=None, h1e=None, vhf=None)
Electronic part of Hartree-Fock energy, for given core hamiltonian and HF potential
... math:
E = \sum_{ij}h_{ij} \gamma_{ji}
+ \frac{1}{2}\sum_{ijkl} \gamma_{ji}\gamma_{lk} \langle ik||jl\rangle

Args: mf : an instance of SCF class
Kwargs:
dm [2D ndarray] one-partical density matrix
h1e [2D ndarray] Core hamiltonian
vhf [2D ndarray] HF potential
Returns: Hartree-Fock electronic energy and the Coulomb energy
Examples:

112

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

>>> from pyscf import gto, scf
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1.1')
>>> mf = scf.RHF(mol)
>>> mf.scf()
>>> dm = mf.make_rdm1()
>>> scf.hf.energy_elec(mf, dm)
(-1.5176090667746334, 0.60917167853723675)

energy_tot(mf, dm=None, h1e=None, vhf=None)
Total Hartree-Fock energy, electronic part plus nuclear repulstion See scf.hf.energy_elec() for
the electron part
from_chk(chkfile=None, project=True)
Read the HF results from checkpoint file, then project it to the basis defined by mol
Returns: Density matrix, 2D ndarray
get_fock(mf,
h1e=None,
s1e=None,
vhf=None,
dm=None,
cycle=-1,
diis_start_cycle=None, level_shift_factor=None, damp_factor=None)
F = h^{core} + V^{HF}

diis=None,

Special treatment (damping, DIIS, or level shift) will be applied to the Fock matrix if diis and cycle is
specified (The two parameters are passed to get_fock function during the SCF iteration)
Args:
h1e [2D ndarray] Core hamiltonian
s1e [2D ndarray] Overlap matrix, for DIIS
vhf [2D ndarray] HF potential matrix
dm [2D ndarray] Density matrix, for DIIS
Kwargs:
cycle [int] Then present SCF iteration step, for DIIS
diis [an object of SCF.DIIS class] DIIS object to hold intermediate Fock and error vectors
diis_start_cycle [int] The step to start DIIS. Default is 0.
level_shift_factor [float or int] Level shift (in AU) for virtual space. Default is 0.
get_grad(mo_coeff, mo_occ, fock=None)
RHF Gradients
Args:
mo_coeff [2D ndarray] Obital coefficients
mo_occ [1D ndarray] Orbital occupancy
fock_ao [2D ndarray] Fock matrix in AO representation
Returns: Gradients in MO representation. It’s a num_occ*num_vir vector.
get_j(mol=None, dm=None, hermi=1)
Compute J matrix for the given density matrix.
get_jk(mol=None, dm=None, hermi=1)
Compute J, K matrices for the given density matrix
Args: mol : an instance of Mole
dm [ndarray or list of ndarrays] A density matrix or a list of density matrices

1.6. scf — Mean-field methods

113

PySCF Documentation, Release 1.4.0

Kwargs:
hermi [int] Whether J, K matrix is hermitian

0 : no hermitian or symmetric
1 : hermitian
2 : anti-hermitian

vhfopt : A class which holds precomputed quantities to optimize the computation of J, K matrices
Returns: Depending on the given dm, the function returns one J and one K matrix, or a list of J matrices
and a list of K matrices, corresponding to the input density matrices.
Examples:
>>>
>>>
>>>
>>>
>>>
>>>
(3,

from pyscf import gto, scf
from pyscf.scf import _vhf
mol = gto.M(atom='H 0 0 0; H 0 0 1.1')
dms = numpy.random.random((3,mol.nao_nr(),mol.nao_nr()))
j, k = scf.hf.get_jk(mol, dms, hermi=0)
print(j.shape)
2, 2)

get_k(mol=None, dm=None, hermi=1)
Compute K matrix for the given density matrix.
get_occ(mf, mo_energy=None, mo_coeff=None)
Label the occupancies for each orbital
Kwargs:
mo_energy [1D ndarray] Obital energies
mo_coeff [2D ndarray] Obital coefficients
Examples:
>>> from pyscf import gto, scf
>>> mol = gto.M(atom='H 0 0 0; F 0 0 1.1')
>>> mf = scf.hf.SCF(mol)
>>> energy = numpy.array([-10., -1., 1, -2., 0, -3])
>>> mf.get_occ(energy)
array([2, 2, 0, 2, 2, 2])

get_veff(mol=None, dm=None, dm_last=0, vhf_last=0, hermi=1)
Hartree-Fock potential matrix for the given density matrix
Args: mol : an instance of Mole
dm [ndarray or list of ndarrays] A density matrix or a list of density matrices
Kwargs:
dm_last [ndarray or a list of ndarrays or 0] The density matrix baseline. If not 0, this function
computes the increment of HF potential w.r.t. the reference HF potential matrix.
vhf_last [ndarray or a list of ndarrays or 0] The reference HF potential matrix.
hermi [int] Whether J, K matrix is hermitian

114

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

0 : no hermitian or symmetric
1 : hermitian
2 : anti-hermitian

vhfopt : A class which holds precomputed quantities to optimize the computation of J, K matrices
Returns: matrix Vhf = 2*J - K. Vhf can be a list matrices, corresponding to the input density matrices.
Examples:
>>> import numpy
>>> from pyscf import gto, scf
>>> from pyscf.scf import _vhf
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1.1')
>>> dm0 = numpy.random.random((mol.nao_nr(),mol.nao_nr()))
>>> vhf0 = scf.hf.get_veff(mol, dm0, hermi=0)
>>> dm1 = numpy.random.random((mol.nao_nr(),mol.nao_nr()))
>>> vhf1 = scf.hf.get_veff(mol, dm1, hermi=0)
>>> vhf2 = scf.hf.get_veff(mol, dm1, dm_last=dm0, vhf_last=vhf0, hermi=0)
>>> numpy.allclose(vhf1, vhf2)
True

init_guess_by_1e(mol=None)
Generate initial guess density matrix from core hamiltonian
Returns: Density matrix, 2D ndarray
init_guess_by_atom(mol=None)
Generate initial guess density matrix from superposition of atomic HF density matrix. The atomic HF is
occupancy averaged RHF
Returns: Density matrix, 2D ndarray
init_guess_by_chkfile(chkfile=None, project=True)
Read the HF results from checkpoint file, then project it to the basis defined by mol
Returns: Density matrix, 2D ndarray
init_guess_by_minao(mol=None)
Generate initial guess density matrix based on ANO basis, then project the density matrix to the basis set
defined by mol
Returns: Density matrix, 2D ndarray
Examples:
>>> from pyscf import gto, scf
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1.1')
>>> scf.hf.init_guess_by_minao(mol)
array([[ 0.94758917, 0.09227308],
[ 0.09227308, 0.94758917]])

kernel(dm0=None)
main routine for SCF
Kwargs:
dm0 [ndarray] If given, it will be used as the initial guess density matrix
Examples:

1.6. scf — Mean-field methods

115

PySCF Documentation, Release 1.4.0

>>> import numpy
>>> from pyscf import gto, scf
>>> mol = gto.M(atom='H 0 0 0; F 0 0 1.1')
>>> mf = scf.hf.SCF(mol)
>>> dm_guess = numpy.eye(mol.nao_nr())
>>> mf.kernel(dm_guess)
converged SCF energy = -98.5521904482821
-98.552190448282104

make_rdm1(mo_coeff=None, mo_occ=None)
One-particle density matrix in AO representation
Args:
mo_coeff [2D ndarray] Orbital coefficients. Each column is one orbital.
mo_occ [1D ndarray] Occupancy
mulliken_meta(mol=None, dm=None, verbose=5, pre_orth_method=’ANO’, s=None)
Mulliken population analysis, based on meta-Lowdin AOs. In the meta-lowdin, the AOs are grouped in
three sets: core, valence and Rydberg, the orthogonalization are carreid out within each subsets.
Args: mol : an instance of Mole
dm [ndarray or 2-item list of ndarray] Density matrix. ROHF dm is a 2-item list of 2D array
Kwargs: verbose : int or instance of lib.logger.Logger
pre_orth_method [str] Pre-orthogonalization, which localized GTOs for each atom. To obtain the
occupied and unoccupied atomic shells, there are three methods

‘ano’ : Project GTOs to ANO basis
‘minao’ : Project GTOs to MINAO basis
‘scf’ : Fraction-averaged RHF

mulliken_pop(mol=None, dm=None, s=None, verbose=5)
Mulliken population analysis
𝑀𝑖𝑗 = 𝐷𝑖𝑗 𝑆𝑗𝑖
Mulliken charges
𝛿𝑖 =

∑︁

𝑀𝑖𝑗

𝑗

pop(*args, **kwargs)
Mulliken population analysis, based on meta-Lowdin AOs. In the meta-lowdin, the AOs are grouped in
three sets: core, valence and Rydberg, the orthogonalization are carreid out within each subsets.
Args: mol : an instance of Mole
dm [ndarray or 2-item list of ndarray] Density matrix. ROHF dm is a 2-item list of 2D array
Kwargs: verbose : int or instance of lib.logger.Logger
pre_orth_method [str] Pre-orthogonalization, which localized GTOs for each atom. To obtain the
occupied and unoccupied atomic shells, there are three methods

116

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

‘ano’ : Project GTOs to ANO basis
‘minao’ : Project GTOs to MINAO basis
‘scf’ : Fraction-averaged RHF

scf(dm0=None)
main routine for SCF
Kwargs:
dm0 [ndarray] If given, it will be used as the initial guess density matrix
Examples:
>>> import numpy
>>> from pyscf import gto, scf
>>> mol = gto.M(atom='H 0 0 0; F 0 0 1.1')
>>> mf = scf.hf.SCF(mol)
>>> dm_guess = numpy.eye(mol.nao_nr())
>>> mf.kernel(dm_guess)
converged SCF energy = -98.5521904482821
-98.552190448282104

update(chkfile=None)
Read attributes from the chkfile then replace the attributes of current object. See also mf.update_from_chk
pyscf.scf.hf.analyze(mf, verbose=5, **kwargs)
Analyze the given SCF object: print orbital energies, occupancies; print orbital coefficients; Mulliken population
analysis; Diople moment.
pyscf.scf.hf.as_scanner(mf )
Generating a scanner/solver for HF PES.
The returned solver is a function. This function requires one argument “mol” as input and returns total HF
energy.
The solver will automatically use the results of last calculation as the initial guess of the new calculation. All
parameters assigned in the SCF object (DIIS, conv_tol, max_memory etc) are automatically applied in the
solver.
Note scanner has side effects. It may change many underlying objects (_scf, with_df, with_x2c, ...) during
calculation.
Examples:
>>> from pyscf import gto, scf
>>> hf_scanner = scf.RHF(gto.Mole().set(verbose=0)).as_scanner()
>>> hf_scanner(gto.M(atom='H 0 0 0; F 0 0 1.1'))
-98.552190448277955
>>> hf_scanner(gto.M(atom='H 0 0 0; F 0 0 1.5'))
-98.414750424294368

pyscf.scf.hf.canonicalize(mf, mo_coeff, mo_occ, fock=None)
Canonicalization diagonalizes the Fock matrix within occupied, open, virtual subspaces separatedly (without
change occupancy).
pyscf.scf.hf.dip_moment(mol, dm, unit_symbol=’Debye’, verbose=3)

1.6. scf — Mean-field methods

117

PySCF Documentation, Release 1.4.0

Dipole moment calculation
𝜇𝑥 = −

∑︁ ∑︁
𝜇

𝜇𝑦 = −

𝑄𝐴 𝑋𝐴

𝐴

𝑃𝜇𝜈 (𝜈|𝑦|𝜇) +

𝜈

∑︁ ∑︁
𝜇

∑︁

𝜈

∑︁ ∑︁
𝜇

𝜇𝑧 = −

𝑃𝜇𝜈 (𝜈|𝑥|𝜇) +

∑︁

𝑄𝐴 𝑌𝐴

𝐴

𝑃𝜇𝜈 (𝜈|𝑧|𝜇) +

𝜈

∑︁

𝑄𝐴 𝑍𝐴

𝐴

where 𝜇𝑥 , 𝜇𝑦 , 𝜇𝑧 are the x, y and z components of dipole moment
Args: mol: an instance of Mole dm : a 2D ndarrays density matrices
Return: A list: the dipole moment on x, y and z component
pyscf.scf.hf.dot_eri_dm(eri, dm, hermi=0)
Compute J, K matrices in terms of the given 2-electron integrals and density matrix:
J ~ numpy.einsum(‘pqrs,qp->rs’, eri, dm) K ~ numpy.einsum(‘pqrs,qr->ps’, eri, dm)
Args:
eri [ndarray] 8-fold or 4-fold ERIs
dm [ndarray or list of ndarrays] A density matrix or a list of density matrices
Kwargs:
hermi [int] Whether J, K matrix is hermitian

0 : no hermitian or symmetric
1 : hermitian
2 : anti-hermitian

Returns: Depending on the given dm, the function returns one J and one K matrix, or a list of J matrices and a
list of K matrices, corresponding to the input density matrices.
Examples:
>>>
>>>
>>>
>>>
>>>
>>>
>>>
(3,

from pyscf import gto, scf
from pyscf.scf import _vhf
mol = gto.M(atom='H 0 0 0; H 0 0 1.1')
eri = _vhf.int2e_sph(mol._atm, mol._bas, mol._env)
dms = numpy.random.random((3,mol.nao_nr(),mol.nao_nr()))
j, k = scf.hf.dot_eri_dm(eri, dms, hermi=0)
print(j.shape)
2, 2)

pyscf.scf.hf.eig(h, s)
Solver for generalized eigenvalue problem
𝐻𝐶 = 𝑆𝐶𝐸
pyscf.scf.hf.energy_elec(mf, dm=None, h1e=None, vhf=None)
Electronic part of Hartree-Fock energy, for given core hamiltonian and HF potential
... math:

118

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

E = \sum_{ij}h_{ij} \gamma_{ji}
+ \frac{1}{2}\sum_{ijkl} \gamma_{ji}\gamma_{lk} \langle ik||jl\rangle

Args: mf : an instance of SCF class
Kwargs:
dm [2D ndarray] one-partical density matrix
h1e [2D ndarray] Core hamiltonian
vhf [2D ndarray] HF potential
Returns: Hartree-Fock electronic energy and the Coulomb energy
Examples:
>>> from pyscf import gto, scf
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1.1')
>>> mf = scf.RHF(mol)
>>> mf.scf()
>>> dm = mf.make_rdm1()
>>> scf.hf.energy_elec(mf, dm)
(-1.5176090667746334, 0.60917167853723675)

pyscf.scf.hf.energy_tot(mf, dm=None, h1e=None, vhf=None)
Total Hartree-Fock energy, electronic part plus nuclear repulstion See scf.hf.energy_elec() for the
electron part
pyscf.scf.hf.get_fock(mf, h1e=None, s1e=None, vhf=None, dm=None, cycle=-1, diis=None,
diis_start_cycle=None, level_shift_factor=None, damp_factor=None)
F = h^{core} + V^{HF}
Special treatment (damping, DIIS, or level shift) will be applied to the Fock matrix if diis and cycle is specified
(The two parameters are passed to get_fock function during the SCF iteration)
Args:
h1e [2D ndarray] Core hamiltonian
s1e [2D ndarray] Overlap matrix, for DIIS
vhf [2D ndarray] HF potential matrix
dm [2D ndarray] Density matrix, for DIIS
Kwargs:
cycle [int] Then present SCF iteration step, for DIIS
diis [an object of SCF.DIIS class] DIIS object to hold intermediate Fock and error vectors
diis_start_cycle [int] The step to start DIIS. Default is 0.
level_shift_factor [float or int] Level shift (in AU) for virtual space. Default is 0.
pyscf.scf.hf.get_grad(mo_coeff, mo_occ, fock_ao)
RHF Gradients
Args:
mo_coeff [2D ndarray] Obital coefficients
mo_occ [1D ndarray] Orbital occupancy

1.6. scf — Mean-field methods

119

PySCF Documentation, Release 1.4.0

fock_ao [2D ndarray] Fock matrix in AO representation
Returns: Gradients in MO representation. It’s a num_occ*num_vir vector.
pyscf.scf.hf.get_hcore(mol)
Core Hamiltonian
Examples:
>>> from pyscf import gto, scf
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1.1')
>>> scf.hf.get_hcore(mol)
array([[-0.93767904, -0.59316327],
[-0.59316327, -0.93767904]])

pyscf.scf.hf.get_init_guess(mol, key=’minao’)
Pick a init_guess method
Kwargs:
key [str] One of ‘minao’, ‘atom’, ‘1e’, ‘chkfile’.
pyscf.scf.hf.get_jk(mol, dm, hermi=1, vhfopt=None)
Compute J, K matrices for the given density matrix
Args: mol : an instance of Mole
dm [ndarray or list of ndarrays] A density matrix or a list of density matrices
Kwargs:
hermi [int] Whether J, K matrix is hermitian

0 : no hermitian or symmetric
1 : hermitian
2 : anti-hermitian

vhfopt : A class which holds precomputed quantities to optimize the computation of J, K matrices
Returns: Depending on the given dm, the function returns one J and one K matrix, or a list of J matrices and a
list of K matrices, corresponding to the input density matrices.
Examples:
>>>
>>>
>>>
>>>
>>>
>>>
(3,

from pyscf import gto, scf
from pyscf.scf import _vhf
mol = gto.M(atom='H 0 0 0; H 0 0 1.1')
dms = numpy.random.random((3,mol.nao_nr(),mol.nao_nr()))
j, k = scf.hf.get_jk(mol, dms, hermi=0)
print(j.shape)
2, 2)

pyscf.scf.hf.get_occ(mf, mo_energy=None, mo_coeff=None)
Label the occupancies for each orbital
Kwargs:
mo_energy [1D ndarray] Obital energies
mo_coeff [2D ndarray] Obital coefficients

120

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

Examples:
>>> from pyscf import gto, scf
>>> mol = gto.M(atom='H 0 0 0; F 0 0 1.1')
>>> mf = scf.hf.SCF(mol)
>>> energy = numpy.array([-10., -1., 1, -2., 0, -3])
>>> mf.get_occ(energy)
array([2, 2, 0, 2, 2, 2])

pyscf.scf.hf.get_ovlp(mol)
Overlap matrix
pyscf.scf.hf.get_veff(mol, dm, dm_last=None, vhf_last=None, hermi=1, vhfopt=None)
Hartree-Fock potential matrix for the given density matrix
Args: mol : an instance of Mole
dm [ndarray or list of ndarrays] A density matrix or a list of density matrices
Kwargs:
dm_last [ndarray or a list of ndarrays or 0] The density matrix baseline. If not 0, this function computes
the increment of HF potential w.r.t. the reference HF potential matrix.
vhf_last [ndarray or a list of ndarrays or 0] The reference HF potential matrix.
hermi [int] Whether J, K matrix is hermitian

0 : no hermitian or symmetric
1 : hermitian
2 : anti-hermitian

vhfopt : A class which holds precomputed quantities to optimize the computation of J, K matrices
Returns: matrix Vhf = 2*J - K. Vhf can be a list matrices, corresponding to the input density matrices.
Examples:
>>> import numpy
>>> from pyscf import gto, scf
>>> from pyscf.scf import _vhf
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1.1')
>>> dm0 = numpy.random.random((mol.nao_nr(),mol.nao_nr()))
>>> vhf0 = scf.hf.get_veff(mol, dm0, hermi=0)
>>> dm1 = numpy.random.random((mol.nao_nr(),mol.nao_nr()))
>>> vhf1 = scf.hf.get_veff(mol, dm1, hermi=0)
>>> vhf2 = scf.hf.get_veff(mol, dm1, dm_last=dm0, vhf_last=vhf0, hermi=0)
>>> numpy.allclose(vhf1, vhf2)
True

pyscf.scf.hf.init_guess_by_1e(mol)
Generate initial guess density matrix from core hamiltonian
Returns: Density matrix, 2D ndarray
pyscf.scf.hf.init_guess_by_atom(mol)
Generate initial guess density matrix from superposition of atomic HF density matrix. The atomic HF is occupancy averaged RHF

1.6. scf — Mean-field methods

121

PySCF Documentation, Release 1.4.0

Returns: Density matrix, 2D ndarray
pyscf.scf.hf.init_guess_by_chkfile(mol, chkfile_name, project=True)
Read the HF results from checkpoint file, then project it to the basis defined by mol
Returns: Density matrix, 2D ndarray
pyscf.scf.hf.init_guess_by_minao(mol)
Generate initial guess density matrix based on ANO basis, then project the density matrix to the basis set defined
by mol
Returns: Density matrix, 2D ndarray
Examples:
>>> from pyscf import gto, scf
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1.1')
>>> scf.hf.init_guess_by_minao(mol)
array([[ 0.94758917, 0.09227308],
[ 0.09227308, 0.94758917]])

pyscf.scf.hf.kernel(mf, conv_tol=1e-10, conv_tol_grad=None, dump_chk=True, dm0=None, callback=None, conv_check=True, **kwargs)
kernel: the SCF driver.
Args:
mf [an instance of SCF class] To hold the flags to control SCF. Besides the control parameters, one can
modify its function members to change the behavior of SCF. The member functions which are called
in kernel are

mf.get_init_guess
mf.get_hcore
mf.get_ovlp
mf.get_fock
mf.get_grad
mf.eig
mf.get_occ
mf.make_rdm1
mf.energy_tot
mf.dump_chk

Kwargs:
conv_tol [float] converge threshold.
conv_tol_grad [float] gradients converge threshold.
dump_chk [bool] Whether to save SCF intermediate results in the checkpoint file
dm0 [ndarray] Initial guess density matrix. If not given (the default), the kernel takes the density matrix
generated by mf.get_init_guess.
callback [function(envs_dict) => None] callback function takes one dict as the argument which is generated by the builtin function locals(), so that the callback function can access all local variables
in the current envrionment.
Returns: A list : scf_conv, e_tot, mo_energy, mo_coeff, mo_occ
122

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

scf_conv [bool] True means SCF converged
e_tot [float] Hartree-Fock energy of last iteration
mo_energy [1D float array] Orbital energies. Depending the eig function provided by mf object, the
orbital energies may NOT be sorted.
mo_coeff [2D array] Orbital coefficients.
mo_occ [1D array] Orbital occupancies. The occupancies may NOT be sorted from large to small.
Examples:
>>> from pyscf import gto, scf
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1.1', basis='cc-pvdz')
>>> conv, e, mo_e, mo, mo_occ = scf.hf.kernel(scf.hf.SCF(mol), dm0=numpy.eye(mol.
˓→nao_nr()))
>>> print('conv = %s, E(HF) = %.12f' % (conv, e))
conv = True, E(HF) = -1.081170784378

pyscf.scf.hf.level_shift(s, d, f, factor)
Apply level shift ∆ to virtual orbitals
𝐹 𝐶 = 𝑆𝐶𝐸

(1.1)
†

𝐹 = 𝐹 + 𝑆𝐶Λ𝐶 𝑆
{︃
𝛿𝑖𝑗 ∆ 𝑖 ∈ virtual
Λ𝑖𝑗 =
0
otherwise

(1.2)
(1.3)

Returns: New Fock matrix, 2D ndarray
pyscf.scf.hf.make_rdm1(mo_coeff, mo_occ)
One-particle density matrix in AO representation
Args:
mo_coeff [2D ndarray] Orbital coefficients. Each column is one orbital.
mo_occ [1D ndarray] Occupancy
pyscf.scf.hf.mulliken_meta(mol, dm, verbose=5, pre_orth_method=’ANO’, s=None)
Mulliken population analysis, based on meta-Lowdin AOs. In the meta-lowdin, the AOs are grouped in three
sets: core, valence and Rydberg, the orthogonalization are carreid out within each subsets.
Args: mol : an instance of Mole
dm [ndarray or 2-item list of ndarray] Density matrix. ROHF dm is a 2-item list of 2D array
Kwargs: verbose : int or instance of lib.logger.Logger
pre_orth_method [str] Pre-orthogonalization, which localized GTOs for each atom. To obtain the occupied and unoccupied atomic shells, there are three methods

‘ano’ : Project GTOs to ANO basis
‘minao’ : Project GTOs to MINAO basis
‘scf’ : Fraction-averaged RHF

1.6. scf — Mean-field methods

123

PySCF Documentation, Release 1.4.0

pyscf.scf.hf.mulliken_pop(mol, dm, s=None, verbose=5)
Mulliken population analysis
𝑀𝑖𝑗 = 𝐷𝑖𝑗 𝑆𝑗𝑖
Mulliken charges
𝛿𝑖 =

∑︁

𝑀𝑖𝑗

𝑗

pyscf.scf.hf.mulliken_pop_meta_lowdin_ao(mol, dm, verbose=5, pre_orth_method=’ANO’,
s=None)
Mulliken population analysis, based on meta-Lowdin AOs. In the meta-lowdin, the AOs are grouped in three
sets: core, valence and Rydberg, the orthogonalization are carreid out within each subsets.
Args: mol : an instance of Mole
dm [ndarray or 2-item list of ndarray] Density matrix. ROHF dm is a 2-item list of 2D array
Kwargs: verbose : int or instance of lib.logger.Logger
pre_orth_method [str] Pre-orthogonalization, which localized GTOs for each atom. To obtain the occupied and unoccupied atomic shells, there are three methods

‘ano’ : Project GTOs to ANO basis
‘minao’ : Project GTOs to MINAO basis
‘scf’ : Fraction-averaged RHF

class pyscf.scf.uhf.UHF(mol)
SCF base class. non-relativistic RHF.
Attributes:
verbose [int] Print level. Default value equals to Mole.verbose
max_memory [float or int] Allowed memory in MB. Default equals to Mole.max_memory
chkfile [str] checkpoint file to save MOs, orbital energies etc.
conv_tol [float] converge threshold. Default is 1e-10
conv_tol_grad [float] gradients converge threshold. Default is sqrt(conv_tol)
max_cycle [int] max number of iterations. Default is 50
init_guess [str] initial guess method. It can be one of ‘minao’, ‘atom’, ‘1e’, ‘chkfile’. Default is ‘minao’
diis [boolean or object of DIIS class listed in scf.diis] Default is diis.SCF_DIIS. Set it to None
to turn off DIIS.
diis_space [int] DIIS space size. By default, 8 Fock matrices and errors vector are stored.
diis_start_cycle [int] The step to start DIIS. Default is 1.
diis_file: ‘str’ File to store DIIS vectors and error vectors.
level_shift [float or int] Level shift (in AU) for virtual space. Default is 0.
direct_scf [bool] Direct SCF is used by default.

124

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

direct_scf_tol [float] Direct SCF cutoff threshold. Default is 1e-13.
callback [function(envs_dict) => None] callback function takes one dict as the argument which is generated by the builtin function locals(), so that the callback function can access all local variables
in the current envrionment.
conv_check [bool] An extra cycle to check convergence after SCF iterations.
Saved results
converged [bool] SCF converged or not
e_tot [float] Total HF energy (electronic energy plus nuclear repulsion)
mo_energy : Orbital energies
mo_occ Orbital occupancy
mo_coeff Orbital coefficients
Examples:
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1.1', basis='cc-pvdz')
>>> mf = scf.hf.SCF(mol)
>>> mf.verbose = 0
>>> mf.level_shift = .4
>>> mf.scf()
-1.0811707843775884

Attributes for UHF:
nelec [(int, int)] If given, freeze the number of (alpha,beta) electrons to the given value.
level_shift [number or two-element list] level shift (in Eh) for alpha and beta Fock if two-element list is
given.
Examples:
>>> mol = gto.M(atom='O 0 0 0; H 0 0 1; H 0 1 0', basis='ccpvdz', charge=1,
˓→spin=1, verbose=0)
>>> mf = scf.UHF(mol)
>>> mf.kernel()
-75.623975516256706
>>> print('S^2 = %.7f, 2S+1 = %.7f' % mf.spin_square())
S^2 = 0.7570150, 2S+1 = 2.0070027

canonicalize(mf, mo_coeff, mo_occ, fock=None)
Canonicalization diagonalizes the UHF Fock matrix within occupied, virtual subspaces separatedly (without change occupancy).
det_ovlp(mo1, mo2, occ1, occ2, ovlp=None)
Calculate the overlap between two different determinants. It is the product of single values of molecular
orbital overlap matrix.
𝑆12 = ⟨Ψ𝐴 |Ψ𝐵 ⟩ = (detU)(detV† )

2𝑁
∏︁

𝜆𝑖𝑖

𝑖=1

where U, V, 𝜆 are unitary matrices and single values generated by single value decomposition(SVD) of
the overlap matrix O which is the overlap matrix of two sets of molecular orbitals:
U† OV = Λ
1.6. scf — Mean-field methods

125

PySCF Documentation, Release 1.4.0

Args:
mo1, mo2 [2D ndarrays] Molecualr orbital coefficients
occ1, occ2: 2D ndarrays occupation numbers
Return:
A list: the product of single values: float x_a, x_b: 1D ndarrays UΛ−1 V† They are used to calculate asymmetric density matrix
dip_moment(mol=None, dm=None, unit_symbol=None, verbose=3)
Dipole moment calculation
∑︁ ∑︁
∑︁
𝜇𝑥 = −
𝑃𝜇𝜈 (𝜈|𝑥|𝜇) +
𝑄𝐴 𝑋𝐴
𝜇

𝜇𝑦 = −

𝜇

𝜇𝑧 = −

𝜈

∑︁ ∑︁

𝑃𝜇𝜈 (𝜈|𝑦|𝜇) +

𝜈

∑︁ ∑︁
𝜇

𝐴

∑︁

𝑄𝐴 𝑌𝐴

𝐴

𝑃𝜇𝜈 (𝜈|𝑧|𝜇) +

𝜈

∑︁

𝑄𝐴 𝑍𝐴

𝐴

where 𝜇𝑥 , 𝜇𝑦 , 𝜇𝑧 are the x, y and z components of dipole moment
Args: mol: an instance of Mole
dm [a list of 2D ndarrays] a list of density matrices
Return: A list: the dipole moment on x, y and z component
energy_elec(mf, dm=None, h1e=None, vhf=None)
Electronic energy of Unrestricted Hartree-Fock
Returns: Hartree-Fock electronic energy and the 2-electron part contribution
get_jk(mol=None, dm=None, hermi=1)
Coulomb (J) and exchange (K)
Args:
dm [a list of 2D arrays or a list of 3D arrays] (alpha_dm, beta_dm) or (alpha_dms, beta_dms)
get_veff(mol=None, dm=None, dm_last=0, vhf_last=0, hermi=1)
Unrestricted Hartree-Fock potential matrix of alpha and beta spins, for the given density matrix
∑︁
∑︁
𝛽
𝛼
𝛼
𝑉𝑖𝑗𝛼 =
(𝑖𝑗|𝑘𝑙)(𝛾𝑙𝑘
+ 𝛾𝑙𝑘
)−
(𝑖𝑙|𝑘𝑗)𝛾𝑙𝑘
𝑘𝑙

𝑉𝑖𝑗𝛽

𝑘𝑙

∑︁
∑︁
𝛽
𝛽
𝛼
=
(𝑖𝑗|𝑘𝑙)(𝛾𝑙𝑘
+ 𝛾𝑙𝑘
)−
(𝑖𝑙|𝑘𝑗)𝛾𝑙𝑘
𝑘𝑙

𝑘𝑙

Args: mol : an instance of Mole
dm [a list of ndarrays] A list of density matrices, stored as (alpha,alpha,...,beta,beta,...)
Kwargs:
dm_last [ndarray or a list of ndarrays or 0] The density matrix baseline. When it is not 0, this
function computes the increment of HF potential w.r.t. the reference HF potential matrix.
vhf_last [ndarray or a list of ndarrays or 0] The reference HF potential matrix.
hermi [int] Whether J, K matrix is hermitian

0 : no hermitian or symmetric
126

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

1 : hermitian
2 : anti-hermitian

vhfopt : A class which holds precomputed quantities to optimize the computation of J, K matrices
Returns: 𝑉ℎ𝑓 = (𝑉 𝛼 , 𝑉 𝛽 ). 𝑉 𝛼 (and 𝑉 𝛽 ) can be a list matrices, corresponding to the input density
matrices.
Examples:
>>>
>>>
>>>
>>>
>>>
>>>
>>>
(6,
>>>
>>>
(3,
>>>
(3,

import numpy
from pyscf import gto, scf
mol = gto.M(atom='H 0 0 0; H 0 0 1.1')
dmsa = numpy.random.random((3,mol.nao_nr(),mol.nao_nr()))
dmsb = numpy.random.random((3,mol.nao_nr(),mol.nao_nr()))
dms = numpy.vstack((dmsa,dmsb))
dms.shape
2, 2)
vhfa, vhfb = scf.uhf.get_veff(mol, dms, hermi=0)
vhfa.shape
2, 2)
vhfb.shape
2, 2)

init_guess_by_minao(mol=None, breaksym=True)
Initial guess in terms of the overlap to minimal basis.
make_asym_dm(mo1, mo2, occ1, occ2, x)
One-particle asymmetric density matrix
Args:
mo1, mo2 [2D ndarrays] Molecualr orbital coefficients
occ1, occ2: 2D ndarrays Occupation numbers
x: 2D ndarrays UΛ−1 V† . See also det_ovlp()
Return: A list of 2D ndarrays for alpha and beta spin
Examples:
>>>
>>>
>>>
>>>
>>>
>>>
(2,

mf1 = scf.UHF(gto.M(atom='H 0 0 0; F 0 0 1.3', basis='ccpvdz')).run()
mf2 = scf.UHF(gto.M(atom='H 0 0 0; F 0 0 1.4', basis='ccpvdz')).run()
s = gto.intor_cross('int1e_ovlp_sph', mf1.mol, mf2.mol)
det, x = det_ovlp(mf1.mo_coeff, mf1.mo_occ, mf2.mo_coeff, mf2.mo_occ, s)
adm = make_asym_dm(mf1.mo_coeff, mf1.mo_occ, mf2.mo_coeff, mf2.mo_occ, x)
adm.shape
19, 19)

make_rdm1(mo_coeff=None, mo_occ=None)
One-particle density matrix
Returns: A list of 2D ndarrays for alpha and beta spins
spin_square(mo_coeff=None, s=None)
Spin of the given UHF orbitals
𝑆2 =

1.6. scf — Mean-field methods

1
(𝑆+ 𝑆− + 𝑆− 𝑆+ ) + 𝑆𝑧2
2

127

PySCF Documentation, Release 1.4.0

∑︀
∑︀
where 𝑆+ = 𝑖 𝑆𝑖+ is effective for all beta occupied orbitals; 𝑆− = 𝑖 𝑆𝑖− is effective for all alpha
occupied orbitals.
1.There are two possibilities for 𝑆+ 𝑆−
∑︀
(a) same electron 𝑆+ 𝑆− = 𝑖 𝑠𝑖+ 𝑠𝑖− ,
∑︁
∑︁
⟨𝑈 𝐻𝐹 |𝑠𝑖+ 𝑠𝑖− |𝑈 𝐻𝐹 ⟩ =
⟨𝑝|𝑠+ 𝑠− |𝑞⟩𝛾𝑞𝑝 = 𝑛𝛼
𝑝𝑞

𝑖

2) different electrons 𝑆+ 𝑆− =
two-particle operator,

∑︀

𝑠𝑖+ 𝑠𝑗− , (𝑖 ̸= 𝑗). There are in total 𝑛(𝑛 − 1) terms. As a

⟨𝑆+ 𝑆− ⟩ = ⟨𝑖𝑗|𝑠+ 𝑠− |𝑖𝑗⟩ − ⟨𝑖𝑗|𝑠+ 𝑠− |𝑗𝑖⟩ = −⟨𝑖𝛼 |𝑗 𝛽 ⟩⟨𝑗 𝛽 |𝑖𝛼 ⟩
2.Similarly, for 𝑆− 𝑆+
(a) same electron
∑︁

⟨𝑠𝑖− 𝑠𝑖+ ⟩ = 𝑛𝛽

𝑖

(a) different electrons
⟨𝑆− 𝑆+ ⟩ = −⟨𝑖𝛽 |𝑗 𝛼 ⟩⟨𝑗 𝛼 |𝑖𝛽 ⟩
2.For 𝑆𝑧2
(a) same electron
⟨𝑠2𝑧 ⟩ =

1
(𝑛𝛼 + 𝑛𝛽 )
4

(a) different electrons
1 ∑︁
(⟨𝑖𝑗|2𝑠𝑧1 𝑠𝑧2 |𝑖𝑗⟩ − ⟨𝑖𝑗|2𝑠𝑧1 𝑠𝑧2 |𝑗𝑖⟩)
2 𝑖𝑗
1 𝛼 𝛼 𝛼 𝛼
(⟨𝑖 |𝑖 ⟩⟨𝑗 |𝑗 ⟩ − ⟨𝑖𝛼 |𝑖𝛼 ⟩⟨𝑗 𝛽 |𝑗 𝛽 ⟩ − ⟨𝑖𝛽 |𝑖𝛽 ⟩⟨𝑗 𝛼 |𝑗 𝛼 ⟩ + ⟨𝑖𝛽 |𝑖𝛽 ⟩⟨𝑗 𝛽 |𝑗 𝛽 ⟩)
4
1
− (⟨𝑖𝛼 |𝑗 𝛼 ⟩⟨𝑗 𝛼 |𝑖𝛼 ⟩ + ⟨𝑖𝛽 |𝑗 𝛽 ⟩⟨𝑗 𝛽 |𝑖𝛽 ⟩)
4
1
1
= (𝑛2𝛼 − 𝑛𝛼 𝑛𝛽 − 𝑛𝛽 𝑛𝛼 + 𝑛2𝛽 ) − (𝑛𝛼 + 𝑛𝛽 )
4
4
1
= ((𝑛𝛼 − 𝑛𝛽 )2 − (𝑛𝛼 + 𝑛𝛽 ))
4
=

In total
⟨𝑆 2 ⟩ =

∑︁
∑︁
1
1
(𝑛𝛼 −
⟨𝑖𝛼 |𝑗 𝛽 ⟩⟨𝑗 𝛽 |𝑖𝛼 ⟩ + 𝑛𝛽 −
⟨𝑖𝛽 |𝑗 𝛼 ⟩⟨𝑗 𝛼 |𝑖𝛽 ⟩) + (𝑛𝛼 − 𝑛𝛽 )2
2
4
𝑖𝑗
𝑖𝑗

Args:
mo [a list of 2 ndarrays] Occupied alpha and occupied beta orbitals
Kwargs:
s [ndarray] AO overlap
Returns: A list of two floats. The first is the expectation value of S^2. The second is the corresponding
2S+1
Examples:

128

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

>>> mol = gto.M(atom='O 0 0 0; H 0 0 1; H 0 1 0', basis='ccpvdz', charge=1,
˓→spin=1, verbose=0)
>>> mf = scf.UHF(mol)
>>> mf.kernel()
-75.623975516256706
>>> mo = (mf.mo_coeff[0][:,mf.mo_occ[0]>0], mf.mo_coeff[1][:,mf.mo_occ[1]>0])
>>> print('S^2 = %.7f, 2S+1 = %.7f' % spin_square(mo, mol.intor('int1e_ovlp_
˓→sph')))
S^2 = 0.7570150, 2S+1 = 2.0070027

pyscf.scf.uhf.analyze(mf, verbose=5, **kwargs)
Analyze the given SCF object: print orbital energies, occupancies; print orbital coefficients; Mulliken population
analysis; Dipole moment
pyscf.scf.uhf.canonicalize(mf, mo_coeff, mo_occ, fock=None)
Canonicalization diagonalizes the UHF Fock matrix within occupied, virtual subspaces separatedly (without
change occupancy).
pyscf.scf.uhf.det_ovlp(mo1, mo2, occ1, occ2, ovlp)
Calculate the overlap between two different determinants. It is the product of single values of molecular orbital
overlap matrix.
𝑆12 = ⟨Ψ𝐴 |Ψ𝐵 ⟩ = (detU)(detV† )

2𝑁
∏︁

𝜆𝑖𝑖

𝑖=1

where U, V, 𝜆 are unitary matrices and single values generated by single value decomposition(SVD) of the
overlap matrix O which is the overlap matrix of two sets of molecular orbitals:
U† OV = Λ
Args:
mo1, mo2 [2D ndarrays] Molecualr orbital coefficients
occ1, occ2: 2D ndarrays occupation numbers
Return:
A list: the product of single values: float x_a, x_b: 1D ndarrays UΛ−1 V† They are used to calculate
asymmetric density matrix
pyscf.scf.uhf.dip_moment(mol, dm, unit_symbol=’Debye’, verbose=3)
Dipole moment calculation
∑︁ ∑︁
∑︁
𝜇𝑥 = −
𝑃𝜇𝜈 (𝜈|𝑥|𝜇) +
𝑄𝐴 𝑋𝐴
𝜇

𝜇𝑦 = −

𝜇

𝜇𝑧 = −

𝜈

∑︁ ∑︁

𝑃𝜇𝜈 (𝜈|𝑦|𝜇) +

𝜈

∑︁ ∑︁
𝜇

𝐴

∑︁

𝑄𝐴 𝑌𝐴

𝐴

𝑃𝜇𝜈 (𝜈|𝑧|𝜇) +

𝜈

∑︁

𝑄𝐴 𝑍𝐴

𝐴

where 𝜇𝑥 , 𝜇𝑦 , 𝜇𝑧 are the x, y and z components of dipole moment
Args: mol: an instance of Mole
dm [a list of 2D ndarrays] a list of density matrices
Return: A list: the dipole moment on x, y and z component

1.6. scf — Mean-field methods

129

PySCF Documentation, Release 1.4.0

pyscf.scf.uhf.energy_elec(mf, dm=None, h1e=None, vhf=None)
Electronic energy of Unrestricted Hartree-Fock
Returns: Hartree-Fock electronic energy and the 2-electron part contribution
pyscf.scf.uhf.get_grad(mo_coeff, mo_occ, fock_ao)
UHF Gradients
pyscf.scf.uhf.get_veff(mol, dm, dm_last=0, vhf_last=0, hermi=1, vhfopt=None)
Unrestricted Hartree-Fock potential matrix of alpha and beta spins, for the given density matrix
∑︁
∑︁
𝛽
𝛼
𝛼
𝑉𝑖𝑗𝛼 =
(𝑖𝑗|𝑘𝑙)(𝛾𝑙𝑘
+ 𝛾𝑙𝑘
)−
(𝑖𝑙|𝑘𝑗)𝛾𝑙𝑘
𝑘𝑙

𝑉𝑖𝑗𝛽

=

∑︁

𝑘𝑙
𝛼
(𝑖𝑗|𝑘𝑙)(𝛾𝑙𝑘

𝑘𝑙

+

𝛽
𝛾𝑙𝑘
)

−

∑︁

𝛽
(𝑖𝑙|𝑘𝑗)𝛾𝑙𝑘

𝑘𝑙

Args: mol : an instance of Mole
dm [a list of ndarrays] A list of density matrices, stored as (alpha,alpha,...,beta,beta,...)
Kwargs:
dm_last [ndarray or a list of ndarrays or 0] The density matrix baseline. When it is not 0, this function
computes the increment of HF potential w.r.t. the reference HF potential matrix.
vhf_last [ndarray or a list of ndarrays or 0] The reference HF potential matrix.
hermi [int] Whether J, K matrix is hermitian

0 : no hermitian or symmetric
1 : hermitian
2 : anti-hermitian

vhfopt : A class which holds precomputed quantities to optimize the computation of J, K matrices
Returns: 𝑉ℎ𝑓 = (𝑉 𝛼 , 𝑉 𝛽 ). 𝑉 𝛼 (and 𝑉 𝛽 ) can be a list matrices, corresponding to the input density matrices.
Examples:
>>>
>>>
>>>
>>>
>>>
>>>
>>>
(6,
>>>
>>>
(3,
>>>
(3,

import numpy
from pyscf import gto, scf
mol = gto.M(atom='H 0 0 0; H 0 0 1.1')
dmsa = numpy.random.random((3,mol.nao_nr(),mol.nao_nr()))
dmsb = numpy.random.random((3,mol.nao_nr(),mol.nao_nr()))
dms = numpy.vstack((dmsa,dmsb))
dms.shape
2, 2)
vhfa, vhfb = scf.uhf.get_veff(mol, dms, hermi=0)
vhfa.shape
2, 2)
vhfb.shape
2, 2)

pyscf.scf.uhf.init_guess_by_minao(mol, breaksym=True)
Generate initial guess density matrix based on ANO basis, then project the density matrix to the basis set defined
by mol
Returns: Density matrices, a list of 2D ndarrays for alpha and beta spins

130

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

pyscf.scf.uhf.make_asym_dm(mo1, mo2, occ1, occ2, x)
One-particle asymmetric density matrix
Args:
mo1, mo2 [2D ndarrays] Molecualr orbital coefficients
occ1, occ2: 2D ndarrays Occupation numbers
x: 2D ndarrays UΛ−1 V† . See also det_ovlp()
Return: A list of 2D ndarrays for alpha and beta spin
Examples:
>>>
>>>
>>>
>>>
>>>
>>>
(2,

mf1 = scf.UHF(gto.M(atom='H 0 0 0; F 0 0 1.3', basis='ccpvdz')).run()
mf2 = scf.UHF(gto.M(atom='H 0 0 0; F 0 0 1.4', basis='ccpvdz')).run()
s = gto.intor_cross('int1e_ovlp_sph', mf1.mol, mf2.mol)
det, x = det_ovlp(mf1.mo_coeff, mf1.mo_occ, mf2.mo_coeff, mf2.mo_occ, s)
adm = make_asym_dm(mf1.mo_coeff, mf1.mo_occ, mf2.mo_coeff, mf2.mo_occ, x)
adm.shape
19, 19)

pyscf.scf.uhf.make_rdm1(mo_coeff, mo_occ)
One-particle density matrix
Returns: A list of 2D ndarrays for alpha and beta spins
pyscf.scf.uhf.mulliken_meta(mol, dm_ao, verbose=5, pre_orth_method=’ANO’, s=None)
Mulliken population analysis, based on meta-Lowdin AOs.
pyscf.scf.uhf.mulliken_pop(mol, dm, s=None, verbose=5)
Mulliken population analysis
pyscf.scf.uhf.mulliken_pop_meta_lowdin_ao(mol,
dm_ao,
verbose=5,
pre_orth_method=’ANO’, s=None)
Mulliken population analysis, based on meta-Lowdin AOs.
pyscf.scf.uhf.rhf_to_uhf(mf )
Create UHF object based on the RHF object
pyscf.scf.uhf.spin_square(mo, s=1)
Spin of the given UHF orbitals
1
(𝑆+ 𝑆− + 𝑆− 𝑆+ ) + 𝑆𝑧2
2
∑︀
∑︀
where 𝑆+ = 𝑖 𝑆𝑖+ is effective for all beta occupied orbitals; 𝑆− = 𝑖 𝑆𝑖− is effective for all alpha occupied
orbitals.
𝑆2 =

1.There are two possibilities for 𝑆+ 𝑆−
∑︀
(a) same electron 𝑆+ 𝑆− = 𝑖 𝑠𝑖+ 𝑠𝑖− ,
∑︁
∑︁
⟨𝑈 𝐻𝐹 |𝑠𝑖+ 𝑠𝑖− |𝑈 𝐻𝐹 ⟩ =
⟨𝑝|𝑠+ 𝑠− |𝑞⟩𝛾𝑞𝑝 = 𝑛𝛼
𝑝𝑞

𝑖

2) different electrons 𝑆+ 𝑆− =
particle operator,

∑︀

𝑠𝑖+ 𝑠𝑗− , (𝑖 ̸= 𝑗). There are in total 𝑛(𝑛 − 1) terms. As a two-

⟨𝑆+ 𝑆− ⟩ = ⟨𝑖𝑗|𝑠+ 𝑠− |𝑖𝑗⟩ − ⟨𝑖𝑗|𝑠+ 𝑠− |𝑗𝑖⟩ = −⟨𝑖𝛼 |𝑗 𝛽 ⟩⟨𝑗 𝛽 |𝑖𝛼 ⟩
2.Similarly, for 𝑆− 𝑆+

1.6. scf — Mean-field methods

131

PySCF Documentation, Release 1.4.0

(a) same electron
∑︁

⟨𝑠𝑖− 𝑠𝑖+ ⟩ = 𝑛𝛽

𝑖

(a) different electrons
⟨𝑆− 𝑆+ ⟩ = −⟨𝑖𝛽 |𝑗 𝛼 ⟩⟨𝑗 𝛼 |𝑖𝛽 ⟩
2.For 𝑆𝑧2
(a) same electron
⟨𝑠2𝑧 ⟩ =

1
(𝑛𝛼 + 𝑛𝛽 )
4

(a) different electrons
1 ∑︁
(⟨𝑖𝑗|2𝑠𝑧1 𝑠𝑧2 |𝑖𝑗⟩ − ⟨𝑖𝑗|2𝑠𝑧1 𝑠𝑧2 |𝑗𝑖⟩)
2 𝑖𝑗
1 𝛼 𝛼 𝛼 𝛼
(⟨𝑖 |𝑖 ⟩⟨𝑗 |𝑗 ⟩ − ⟨𝑖𝛼 |𝑖𝛼 ⟩⟨𝑗 𝛽 |𝑗 𝛽 ⟩ − ⟨𝑖𝛽 |𝑖𝛽 ⟩⟨𝑗 𝛼 |𝑗 𝛼 ⟩ + ⟨𝑖𝛽 |𝑖𝛽 ⟩⟨𝑗 𝛽 |𝑗 𝛽 ⟩)
4
1
− (⟨𝑖𝛼 |𝑗 𝛼 ⟩⟨𝑗 𝛼 |𝑖𝛼 ⟩ + ⟨𝑖𝛽 |𝑗 𝛽 ⟩⟨𝑗 𝛽 |𝑖𝛽 ⟩)
4
1
1
= (𝑛2𝛼 − 𝑛𝛼 𝑛𝛽 − 𝑛𝛽 𝑛𝛼 + 𝑛2𝛽 ) − (𝑛𝛼 + 𝑛𝛽 )
4
4
1
= ((𝑛𝛼 − 𝑛𝛽 )2 − (𝑛𝛼 + 𝑛𝛽 ))
4
=

In total
⟨𝑆 2 ⟩ =

∑︁
∑︁
1
1
(𝑛𝛼 −
⟨𝑖𝛼 |𝑗 𝛽 ⟩⟨𝑗 𝛽 |𝑖𝛼 ⟩ + 𝑛𝛽 −
⟨𝑖𝛽 |𝑗 𝛼 ⟩⟨𝑗 𝛼 |𝑖𝛽 ⟩) + (𝑛𝛼 − 𝑛𝛽 )2
2
4
𝑖𝑗
𝑖𝑗

Args:
mo [a list of 2 ndarrays] Occupied alpha and occupied beta orbitals
Kwargs:
s [ndarray] AO overlap
Returns: A list of two floats. The first is the expectation value of S^2. The second is the corresponding 2S+1
Examples:
>>> mol = gto.M(atom='O 0 0 0; H 0 0 1; H 0 1 0', basis='ccpvdz', charge=1,
˓→spin=1, verbose=0)
>>> mf = scf.UHF(mol)
>>> mf.kernel()
-75.623975516256706
>>> mo = (mf.mo_coeff[0][:,mf.mo_occ[0]>0], mf.mo_coeff[1][:,mf.mo_occ[1]>0])
>>> print('S^2 = %.7f, 2S+1 = %.7f' % spin_square(mo, mol.intor('int1e_ovlp_sph
˓→')))
S^2 = 0.7570150, 2S+1 = 2.0070027

Non-relativistic restricted Hartree-Fock with point group symmetry.
The symmetry are not handled in a separate data structure. Note that during the SCF iteration, the orbitals are
grouped in terms of symmetry irreps. But the orbitals in the result are sorted based on the orbital energies. Function symm.label_orb_symm can be used to detect the symmetry of the molecular orbitals.
132

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

class pyscf.scf.hf_symm.RHF(mol)
SCF base class. non-relativistic RHF.
Attributes:
verbose [int] Print level. Default value equals to Mole.verbose
max_memory [float or int] Allowed memory in MB. Default equals to Mole.max_memory
chkfile [str] checkpoint file to save MOs, orbital energies etc.
conv_tol [float] converge threshold. Default is 1e-10
conv_tol_grad [float] gradients converge threshold. Default is sqrt(conv_tol)
max_cycle [int] max number of iterations. Default is 50
init_guess [str] initial guess method. It can be one of ‘minao’, ‘atom’, ‘1e’, ‘chkfile’. Default is ‘minao’
diis [boolean or object of DIIS class listed in scf.diis] Default is diis.SCF_DIIS. Set it to None
to turn off DIIS.
diis_space [int] DIIS space size. By default, 8 Fock matrices and errors vector are stored.
diis_start_cycle [int] The step to start DIIS. Default is 1.
diis_file: ‘str’ File to store DIIS vectors and error vectors.
level_shift [float or int] Level shift (in AU) for virtual space. Default is 0.
direct_scf [bool] Direct SCF is used by default.
direct_scf_tol [float] Direct SCF cutoff threshold. Default is 1e-13.
callback [function(envs_dict) => None] callback function takes one dict as the argument which is generated by the builtin function locals(), so that the callback function can access all local variables
in the current envrionment.
conv_check [bool] An extra cycle to check convergence after SCF iterations.
Saved results
converged [bool] SCF converged or not
e_tot [float] Total HF energy (electronic energy plus nuclear repulsion)
mo_energy : Orbital energies
mo_occ Orbital occupancy
mo_coeff Orbital coefficients
Examples:
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1.1', basis='cc-pvdz')
>>> mf = scf.hf.SCF(mol)
>>> mf.verbose = 0
>>> mf.level_shift = .4
>>> mf.scf()
-1.0811707843775884

Attributes for symmetry allowed RHF:
irrep_nelec [dict] Specify the number of electrons for particular irrep {‘ir_name’:int,...}. For the irreps
not listed in this dict, the program will choose the occupancy based on the orbital energies.

1.6. scf — Mean-field methods

133

PySCF Documentation, Release 1.4.0

Examples:
>>> mol = gto.M(atom='O 0 0
˓→verbose=0)
>>> mf = scf.RHF(mol)
>>> mf.scf()
-76.016789472074251
>>> mf.get_irrep_nelec()
{'A1': 6, 'A2': 0, 'B1': 2,
>>> mf.irrep_nelec = {'A2':
>>> mf.scf()
-72.768201804695622
>>> mf.get_irrep_nelec()
{'A1': 6, 'A2': 2, 'B1': 2,

0; H 0 0 1; H 0 1 0', basis='ccpvdz', symmetry=True,

'B2': 2}
2}

'B2': 0}

canonicalize(mf, mo_coeff, mo_occ, fock=None)
Canonicalization diagonalizes the Fock matrix in occupied, open, virtual subspaces separatedly (without
change occupancy).
eig(mf, h, s)
Solve generalized eigenvalue problem, for each irrep. The eigenvalues and eigenvectors are not sorted to
ascending order. Instead, they are grouped based on irreps.
get_irrep_nelec(mol=None, mo_coeff=None, mo_occ=None, s=None)
Electron numbers for each irreducible representation.
Args:
mol [an instance of Mole] To provide irrep_id, and spin-adapted basis
mo_coeff [2D ndarray] Regular orbital coefficients, without grouping for irreps
mo_occ [1D ndarray] Regular occupancy, without grouping for irreps
Returns:
irrep_nelec [dict] The number of electrons for each irrep {‘ir_name’:int,...}.
Examples:
>>> mol = gto.M(atom='O 0 0 0; H 0 0 1; H 0 1 0', basis='ccpvdz',
˓→symmetry=True, verbose=0)
>>> mf = scf.RHF(mol)
>>> mf.scf()
-76.016789472074251
>>> scf.hf_symm.get_irrep_nelec(mol, mf.mo_coeff, mf.mo_occ)
{'A1': 6, 'A2': 0, 'B1': 2, 'B2': 2}

get_occ(mo_energy=None, mo_coeff=None)
We assumed mo_energy are grouped by symmetry irreps, (see function self.eig). The orbitals are sorted
after SCF.
class pyscf.scf.hf_symm.ROHF(mol)
SCF base class. non-relativistic RHF.
Attributes:
verbose [int] Print level. Default value equals to Mole.verbose
max_memory [float or int] Allowed memory in MB. Default equals to Mole.max_memory
chkfile [str] checkpoint file to save MOs, orbital energies etc.

134

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

conv_tol [float] converge threshold. Default is 1e-10
conv_tol_grad [float] gradients converge threshold. Default is sqrt(conv_tol)
max_cycle [int] max number of iterations. Default is 50
init_guess [str] initial guess method. It can be one of ‘minao’, ‘atom’, ‘1e’, ‘chkfile’. Default is ‘minao’
diis [boolean or object of DIIS class listed in scf.diis] Default is diis.SCF_DIIS. Set it to None
to turn off DIIS.
diis_space [int] DIIS space size. By default, 8 Fock matrices and errors vector are stored.
diis_start_cycle [int] The step to start DIIS. Default is 1.
diis_file: ‘str’ File to store DIIS vectors and error vectors.
level_shift [float or int] Level shift (in AU) for virtual space. Default is 0.
direct_scf [bool] Direct SCF is used by default.
direct_scf_tol [float] Direct SCF cutoff threshold. Default is 1e-13.
callback [function(envs_dict) => None] callback function takes one dict as the argument which is generated by the builtin function locals(), so that the callback function can access all local variables
in the current envrionment.
conv_check [bool] An extra cycle to check convergence after SCF iterations.
Saved results
converged [bool] SCF converged or not
e_tot [float] Total HF energy (electronic energy plus nuclear repulsion)
mo_energy : Orbital energies
mo_occ Orbital occupancy
mo_coeff Orbital coefficients
Examples:
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1.1', basis='cc-pvdz')
>>> mf = scf.hf.SCF(mol)
>>> mf.verbose = 0
>>> mf.level_shift = .4
>>> mf.scf()
-1.0811707843775884

Attributes for symmetry allowed ROHF:
irrep_nelec [dict] Specify the number of alpha/beta electrons for particular irrep {‘ir_name’:(int,int), ...}.
For the irreps not listed in these dicts, the program will choose the occupancy based on the orbital
energies.
Examples:
>>> mol = gto.M(atom='O 0 0 0; H 0 0 1; H 0 1 0', basis='ccpvdz', symmetry=True,
˓→charge=1, spin=1, verbose=0)
>>> mf = scf.RHF(mol)
>>> mf.scf()
-75.619358861084052
>>> mf.get_irrep_nelec()
{'A1': (3, 3), 'A2': (0, 0), 'B1': (1, 1), 'B2': (1, 0)}

1.6. scf — Mean-field methods

135

PySCF Documentation, Release 1.4.0

>>> mf.irrep_nelec = {'B1': (1, 0)}
>>> mf.scf()
-75.425669486776457
>>> mf.get_irrep_nelec()
{'A1': (3, 3), 'A2': (0, 0), 'B1': (1, 0), 'B2': (1, 1)}

canonicalize(mo_coeff, mo_occ, fock=None)
Canonicalization diagonalizes the Fock matrix in occupied, open, virtual subspaces separatedly (without
change occupancy).
eig(mf, h, s)
Solve generalized eigenvalue problem, for each irrep. The eigenvalues and eigenvectors are not sorted to
ascending order. Instead, they are grouped based on irreps.
pyscf.scf.hf_symm.analyze(mf, verbose=5, **kwargs)
Analyze the given SCF object: print orbital energies, occupancies; print orbital coefficients; Occupancy for each
irreps; Mulliken population analysis
pyscf.scf.hf_symm.canonicalize(mf, mo_coeff, mo_occ, fock=None)
Canonicalization diagonalizes the Fock matrix in occupied, open, virtual subspaces separatedly (without change
occupancy).
pyscf.scf.hf_symm.eig(mf, h, s)
Solve generalized eigenvalue problem, for each irrep. The eigenvalues and eigenvectors are not sorted to ascending order. Instead, they are grouped based on irreps.
pyscf.scf.hf_symm.get_irrep_nelec(mol, mo_coeff, mo_occ, s=None)
Electron numbers for each irreducible representation.
Args:
mol [an instance of Mole] To provide irrep_id, and spin-adapted basis
mo_coeff [2D ndarray] Regular orbital coefficients, without grouping for irreps
mo_occ [1D ndarray] Regular occupancy, without grouping for irreps
Returns:
irrep_nelec [dict] The number of electrons for each irrep {‘ir_name’:int,...}.
Examples:
>>> mol = gto.M(atom='O 0 0 0; H 0 0 1; H 0 1 0', basis='ccpvdz', symmetry=True,
˓→verbose=0)
>>> mf = scf.RHF(mol)
>>> mf.scf()
-76.016789472074251
>>> scf.hf_symm.get_irrep_nelec(mol, mf.mo_coeff, mf.mo_occ)
{'A1': 6, 'A2': 0, 'B1': 2, 'B2': 2}

pyscf.scf.hf_symm.so2ao_mo_coeff(so, irrep_mo_coeff )
Transfer the basis of MO coefficients, from spin-adapted basis to AO basis

Non-relativistic unrestricted Hartree-Fock with point group symmetry.
class pyscf.scf.uhf_symm.UHF(mol)
SCF base class. non-relativistic RHF.
Attributes:

136

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

verbose [int] Print level. Default value equals to Mole.verbose
max_memory [float or int] Allowed memory in MB. Default equals to Mole.max_memory
chkfile [str] checkpoint file to save MOs, orbital energies etc.
conv_tol [float] converge threshold. Default is 1e-10
conv_tol_grad [float] gradients converge threshold. Default is sqrt(conv_tol)
max_cycle [int] max number of iterations. Default is 50
init_guess [str] initial guess method. It can be one of ‘minao’, ‘atom’, ‘1e’, ‘chkfile’. Default is ‘minao’
diis [boolean or object of DIIS class listed in scf.diis] Default is diis.SCF_DIIS. Set it to None
to turn off DIIS.
diis_space [int] DIIS space size. By default, 8 Fock matrices and errors vector are stored.
diis_start_cycle [int] The step to start DIIS. Default is 1.
diis_file: ‘str’ File to store DIIS vectors and error vectors.
level_shift [float or int] Level shift (in AU) for virtual space. Default is 0.
direct_scf [bool] Direct SCF is used by default.
direct_scf_tol [float] Direct SCF cutoff threshold. Default is 1e-13.
callback [function(envs_dict) => None] callback function takes one dict as the argument which is generated by the builtin function locals(), so that the callback function can access all local variables
in the current envrionment.
conv_check [bool] An extra cycle to check convergence after SCF iterations.
Saved results
converged [bool] SCF converged or not
e_tot [float] Total HF energy (electronic energy plus nuclear repulsion)
mo_energy : Orbital energies
mo_occ Orbital occupancy
mo_coeff Orbital coefficients
Examples:
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1.1', basis='cc-pvdz')
>>> mf = scf.hf.SCF(mol)
>>> mf.verbose = 0
>>> mf.level_shift = .4
>>> mf.scf()
-1.0811707843775884

Attributes for UHF:
nelec [(int, int)] If given, freeze the number of (alpha,beta) electrons to the given value.
level_shift [number or two-element list] level shift (in Eh) for alpha and beta Fock if two-element list is
given.
Examples:

1.6. scf — Mean-field methods

137

PySCF Documentation, Release 1.4.0

>>> mol = gto.M(atom='O 0 0 0; H 0 0 1; H 0 1 0', basis='ccpvdz', charge=1,
˓→spin=1, verbose=0)
>>> mf = scf.UHF(mol)
>>> mf.kernel()
-75.623975516256706
>>> print('S^2 = %.7f, 2S+1 = %.7f' % mf.spin_square())
S^2 = 0.7570150, 2S+1 = 2.0070027

Attributes for symmetry allowed UHF:
irrep_nelec [dict] Specify the number of alpha/beta electrons for particular irrep {‘ir_name’:(int,int), ...}.
For the irreps not listed in these dicts, the program will choose the occupancy based on the orbital
energies.
Examples:
>>> mol = gto.M(atom='O 0 0 0; H 0 0 1; H 0 1 0', basis='ccpvdz', symmetry=True,
˓→charge=1, spin=1, verbose=0)
>>> mf = scf.RHF(mol)
>>> mf.scf()
-75.623975516256692
>>> mf.get_irrep_nelec()
{'A1': (3, 3), 'A2': (0, 0), 'B1': (1, 1), 'B2': (1, 0)}
>>> mf.irrep_nelec = {'B1': (1, 0)}
>>> mf.scf()
-75.429189192031131
>>> mf.get_irrep_nelec()
{'A1': (3, 3), 'A2': (0, 0), 'B1': (1, 0), 'B2': (1, 1)}

canonicalize(mf, mo_coeff, mo_occ, fock=None)
Canonicalization diagonalizes the UHF Fock matrix in occupied, virtual subspaces separatedly (without
change occupancy).
get_irrep_nelec(mol=None, mo_coeff=None, mo_occ=None, s=None)
Alpha/beta electron numbers for each irreducible representation.
Args:
mol [an instance of Mole] To provide irrep_id, and spin-adapted basis
mo_occ [a list of 1D ndarray] Regular occupancy, without grouping for irreps
mo_coeff [a list of 2D ndarray] Regular orbital coefficients, without grouping for irreps
Returns:
irrep_nelec [dict] The number of alpha/beta electrons for each irrep {‘ir_name’:(int,int), ...}.
Examples:
>>> mol = gto.M(atom='O 0 0 0; H 0 0 1; H 0 1 0', basis='ccpvdz',
˓→symmetry=True, charge=1, spin=1, verbose=0)
>>> mf = scf.UHF(mol)
>>> mf.scf()
-75.623975516256721
>>> scf.uhf_symm.get_irrep_nelec(mol, mf.mo_coeff, mf.mo_occ)
{'A1': (3, 3), 'A2': (0, 0), 'B1': (1, 1), 'B2': (1, 0)}

138

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

get_occ(mo_energy=None, mo_coeff=None)
We assumed mo_energy are grouped by symmetry irreps, (see function self.eig). The orbitals are sorted
after SCF.
pyscf.scf.uhf_symm.canonicalize(mf, mo_coeff, mo_occ, fock=None)
Canonicalization diagonalizes the UHF Fock matrix in occupied, virtual subspaces separatedly (without change
occupancy).
pyscf.scf.uhf_symm.get_irrep_nelec(mol, mo_coeff, mo_occ, s=None)
Alpha/beta electron numbers for each irreducible representation.
Args:
mol [an instance of Mole] To provide irrep_id, and spin-adapted basis
mo_occ [a list of 1D ndarray] Regular occupancy, without grouping for irreps
mo_coeff [a list of 2D ndarray] Regular orbital coefficients, without grouping for irreps
Returns:
irrep_nelec [dict] The number of alpha/beta electrons for each irrep {‘ir_name’:(int,int), ...}.
Examples:
>>> mol = gto.M(atom='O 0 0 0; H 0 0 1; H 0 1 0', basis='ccpvdz', symmetry=True,
˓→charge=1, spin=1, verbose=0)
>>> mf = scf.UHF(mol)
>>> mf.scf()
-75.623975516256721
>>> scf.uhf_symm.get_irrep_nelec(mol, mf.mo_coeff, mf.mo_occ)
{'A1': (3, 3), 'A2': (0, 0), 'B1': (1, 1), 'B2': (1, 0)}

Relativistic Hartree-Fock
Dirac Hartree-Fock
pyscf.scf.dhf.DHF
alias of UHF
class pyscf.scf.dhf.RHF(mol)
Dirac-RHF
make_rdm1(mo_coeff=None, mo_occ=None)
D/2 = psi_i^dagpsi_i = psi_{Ti}^dagpsi_{Ti} D(UHF) = psi_i^dagpsi_i + psi_{Ti}^dagpsi_{Ti} RHF
average the density of spin up and spin down: D(RHF) = (D(UHF) + T[D(UHF)])/2
class pyscf.scf.dhf.UHF(mol)
SCF base class. non-relativistic RHF.
Attributes:
verbose [int] Print level. Default value equals to Mole.verbose
max_memory [float or int] Allowed memory in MB. Default equals to Mole.max_memory
chkfile [str] checkpoint file to save MOs, orbital energies etc.
conv_tol [float] converge threshold. Default is 1e-10
conv_tol_grad [float] gradients converge threshold. Default is sqrt(conv_tol)
max_cycle [int] max number of iterations. Default is 50

1.6. scf — Mean-field methods

139

PySCF Documentation, Release 1.4.0

init_guess [str] initial guess method. It can be one of ‘minao’, ‘atom’, ‘1e’, ‘chkfile’. Default is ‘minao’
diis [boolean or object of DIIS class listed in scf.diis] Default is diis.SCF_DIIS. Set it to None
to turn off DIIS.
diis_space [int] DIIS space size. By default, 8 Fock matrices and errors vector are stored.
diis_start_cycle [int] The step to start DIIS. Default is 1.
diis_file: ‘str’ File to store DIIS vectors and error vectors.
level_shift [float or int] Level shift (in AU) for virtual space. Default is 0.
direct_scf [bool] Direct SCF is used by default.
direct_scf_tol [float] Direct SCF cutoff threshold. Default is 1e-13.
callback [function(envs_dict) => None] callback function takes one dict as the argument which is generated by the builtin function locals(), so that the callback function can access all local variables
in the current envrionment.
conv_check [bool] An extra cycle to check convergence after SCF iterations.
Saved results
converged [bool] SCF converged or not
e_tot [float] Total HF energy (electronic energy plus nuclear repulsion)
mo_energy : Orbital energies
mo_occ Orbital occupancy
mo_coeff Orbital coefficients
Examples:
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1.1', basis='cc-pvdz')
>>> mf = scf.hf.SCF(mol)
>>> mf.verbose = 0
>>> mf.level_shift = .4
>>> mf.scf()
-1.0811707843775884

Attributes for Dirac-Hartree-Fock
with_ssss [bool, for Dirac-Hartree-Fock only] If False, ignore small component integrals (SS|SS). Default is True.
with_gaunt [bool, for Dirac-Hartree-Fock only] Default is False.
with_breit [bool, for Dirac-Hartree-Fock only] Gaunt + gauge term. Default is False.
Examples:
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1', basis='ccpvdz', verbose=0)
>>> mf = scf.RHF(mol)
>>> e0 = mf.scf()
>>> mf = scf.DHF(mol)
>>> e1 = mf.scf()
>>> print('Relativistic effects = %.12f' % (e1-e0))
Relativistic effects = -0.000008854205

140

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

get_veff(mol=None, dm=None, dm_last=0, vhf_last=0, hermi=1)
Dirac-Coulomb
init_guess_by_minao(mol=None)
Initial guess in terms of the overlap to minimal basis.
pyscf.scf.dhf.get_grad(mo_coeff, mo_occ, fock_ao)
DHF Gradients
pyscf.scf.dhf.init_guess_by_1e(mol)
Initial guess from one electron system.
pyscf.scf.dhf.init_guess_by_atom(mol)
Initial guess from atom calculation.
pyscf.scf.dhf.init_guess_by_minao(mol)
Initial guess in terms of the overlap to minimal basis.
pyscf.scf.dhf.kernel(mf, conv_tol=1e-09, conv_tol_grad=None, dump_chk=True, dm0=None, callback=None, conv_check=True)
the modified SCF kernel for Dirac-Hartree-Fock. In this kernel, the SCF is carried out in three steps. First the 2electron part is approximated by large component integrals (LL|LL); Next, (SS|LL) the interaction between large
and small components are added; Finally, converge the SCF with the small component contributions (SS|SS)
pyscf.scf.dhf.time_reversal_matrix(mol, mat)
T(A_ij) = A[T(i),T(j)]^*
addons
pyscf.scf.addons.convert_to_rhf(mf, out=None, convert_df=None)
Convert the given mean-field object to the corresponding restricted HF/KS object
Args: mf : SCF object
Kwargs
convert_df [bool] Whether to convert the DF-SCF object to the normal SCF object. This conversion is
not applied by default.
Returns: An unrestricted SCF object
pyscf.scf.addons.convert_to_uhf(mf, out=None, convert_df=None)
Convert the given mean-field object to the corresponding unrestricted HF/KS object
Args: mf : SCF object
Kwargs
convert_df [bool] Whether to convert the DF-SCF object to the normal SCF object. This conversion is
not applied by default.
Returns: An unrestricted SCF object
pyscf.scf.addons.dynamic_level_shift(mf, factor=1.0)
Dynamically change the level shift in each SCF cycle. The level shift value is set to (HF energy change * factor)
pyscf.scf.addons.dynamic_level_shift_(mf, factor=1.0)
Dynamically change the level shift in each SCF cycle. The level shift value is set to (HF energy change * factor)
pyscf.scf.addons.dynamic_sz_(mf )
For UHF, allowing the Sz value being changed during SCF iteration. Determine occupation of alpha and beta
electrons based on energy spectrum

1.6. scf — Mean-field methods

141

PySCF Documentation, Release 1.4.0

pyscf.scf.addons.float_occ(mf )
For UHF, allowing the Sz value being changed during SCF iteration. Determine occupation of alpha and beta
electrons based on energy spectrum
pyscf.scf.addons.float_occ_(mf )
For UHF, allowing the Sz value being changed during SCF iteration. Determine occupation of alpha and beta
electrons based on energy spectrum
pyscf.scf.addons.mom_occ(mf, occorb, setocc)
Use maximum overlap method to determine occupation number for each orbital in every iteration. It can be
applied to unrestricted HF/KS and restricted open-shell HF/KS.
pyscf.scf.addons.mom_occ_(mf, occorb, setocc)
Use maximum overlap method to determine occupation number for each orbital in every iteration. It can be
applied to unrestricted HF/KS and restricted open-shell HF/KS.
pyscf.scf.addons.project_mo_nr2nr(mol1, mo1, mol2)
Project orbital coefficients
|𝜓1 >= |𝐴𝑂1 > 𝐶1
|𝜓2 >= 𝑃 |𝜓1 >= |𝐴𝑂2 > 𝑆

−1

< 𝐴𝑂2|𝐴𝑂1 > 𝐶1 = |𝐴𝑂2 > 𝐶2
𝐶2 = 𝑆 −1 < 𝐴𝑂2|𝐴𝑂1 > 𝐶1

pyscf.scf.addons.symm_allow_occ(mf, tol=0.001)
search the unoccupied orbitals, choose the lowest sets which do not break symmetry as the occupied orbitals
pyscf.scf.addons.symm_allow_occ_(mf, tol=0.001)
search the unoccupied orbitals, choose the lowest sets which do not break symmetry as the occupied orbitals

pyscf.scf.chkfile.dump_scf(mol, chkfile, e_tot,
write_mol=True)
save temporary results

mo_energy,

mo_coeff,

mo_occ,

over-

DIIS
class pyscf.scf.diis.ADIIS(dev=None, filename=None)
Ref: JCP, 132, 054109
class pyscf.scf.diis.EDIIS(dev=None, filename=None)
SCF-EDIIS Ref: JCP 116, 8255

1.7 ao2mo — Integral transformations
1.7.1 General Integral transformation module
Simple usage:
>>>
>>>
>>>
>>>

142

from pyscf import gto, scf, ao2mo
mol = gto.M(atom='H 0 0 0; F 0 0 1')
mf = scf.RHF(mol).run()
mo_ints = ao2mo.kernel(mol, mf.mo_coeff)

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

1.7.2 incore
pyscf.ao2mo.incore.full(eri_ao, mo_coeff, verbose=0, compact=True, **kwargs)
MO integral transformation for the given orbital.
Args:
eri_ao [ndarray] AO integrals, can be either 8-fold or 4-fold symmetry.
mo_coeff [ndarray] Transform (ij|kl) with the same set of orbitals.
Kwargs:
verbose [int] Print level
compact [bool] When compact is True, the returned MO integrals have 4-fold symmetry. Otherwise,
return the “plain” MO integrals.
Returns: 2D array of transformed MO integrals. The MO integrals may or may not have the permutation
symmetry (controlled by the kwargs compact)
Examples:
>>> from pyscf import gto
>>> from pyscf.scf import _vhf
>>> from pyscf import ao2mo
>>> mol = gto.M(atom='O 0 0 0; H 0 1 0; H 0 0 1', basis='sto3g')
>>> eri = mol.intor('int2e_sph', aosym='s8')
>>> mo1 = numpy.random.random((mol.nao_nr(), 10))
>>> eri1 = ao2mo.incore.full(eri, mo1)
>>> print(eri1.shape)
(55, 55)
>>> eri1 = ao2mo.incore.full(eri, mo1, compact=False)
>>> print(eri1.shape)
(100, 100)

pyscf.ao2mo.incore.general(eri_ao, mo_coeffs, verbose=0, compact=True, **kwargs)
For the given four sets of orbitals, transfer the 8-fold or 4-fold 2e AO integrals to MO integrals.
Args:
eri_ao [ndarray] AO integrals, can be either 8-fold or 4-fold symmetry.
mo_coeffs [4-item list of ndarray] Four sets of orbital coefficients, corresponding to the four indices of
(ij|kl)
Kwargs:
verbose [int] Print level
compact [bool] When compact is True, depending on the four oribital sets, the returned MO integrals
has (up to 4-fold) permutation symmetry. If it’s False, the function will abandon any permutation
symmetry, and return the “plain” MO integrals
Returns: 2D array of transformed MO integrals. The MO integrals may or may not have the permutation
symmetry, depending on the given orbitals, and the kwargs compact. If the four sets of orbitals are
identical, the MO integrals will at most have 4-fold symmetry.
Examples:
>>> from pyscf import gto
>>> from pyscf.scf import _vhf
>>> from pyscf import ao2mo

1.7. ao2mo — Integral transformations

143

PySCF Documentation, Release 1.4.0

>>> mol = gto.M(atom='O 0 0 0; H 0 1 0; H 0 0 1', basis='sto3g')
>>> eri = mol.intor('int2e_sph', aosym='s8')
>>> mo1 = numpy.random.random((mol.nao_nr(), 10))
>>> mo2 = numpy.random.random((mol.nao_nr(), 8))
>>> mo3 = numpy.random.random((mol.nao_nr(), 6))
>>> mo4 = numpy.random.random((mol.nao_nr(), 4))
>>> eri1 = ao2mo.incore.general(eri, (mo1,mo2,mo3,mo4))
>>> print(eri1.shape)
(80, 24)
>>> eri1 = ao2mo.incore.general(eri, (mo1,mo2,mo3,mo3))
>>> print(eri1.shape)
(80, 21)
>>> eri1 = ao2mo.incore.general(eri, (mo1,mo2,mo3,mo3), compact=False)
>>> print(eri1.shape)
(80, 36)
>>> eri1 = ao2mo.incore.general(eri, (mo1,mo1,mo2,mo2))
>>> print(eri1.shape)
(55, 36)
>>> eri1 = ao2mo.incore.general(eri, (mo1,mo2,mo1,mo2))
>>> print(eri1.shape)
(80, 80)

pyscf.ao2mo.incore.half_e1(eri_ao, mo_coeffs, compact=True)
Given two set of orbitals, half transform the (ij| pair of 8-fold or 4-fold AO integrals (ij|kl)
Args:
eri_ao [ndarray] AO integrals, can be either 8-fold or 4-fold symmetry.
mo_coeffs [list of ndarray] Two sets of orbital coefficients, corresponding to the i, j indices of (ij|kl)
Kwargs:
compact [bool] When compact is True, the returned MO integrals uses the highest possible permutation
symmetry. If it’s False, the function will abandon any permutation symmetry, and return the “plain”
MO integrals
Returns: ndarray of transformed MO integrals. The MO integrals may or may not have the permutation symmetry, depending on the given orbitals, and the kwargs compact.
Examples:
>>> from pyscf import gto
>>> from pyscf import ao2mo
>>> mol = gto.M(atom='O 0 0 0; H 0 1 0; H 0 0 1', basis='sto3g')
>>> eri = mol.intor('int2e_sph', aosym='s8')
>>> mo1 = numpy.random.random((mol.nao_nr(), 10))
>>> mo2 = numpy.random.random((mol.nao_nr(), 8))
>>> eri1 = ao2mo.incore.half_e1(eri, (mo1,mo2))
>>> eri1 = ao2mo.incore.half_e1(eri, (mo1,mo2))
>>> print(eri1.shape)
(80, 28)
>>> eri1 = ao2mo.incore.half_e1(eri, (mo1,mo2), compact=False)
>>> print(eri1.shape)
(80, 28)
>>> eri1 = ao2mo.incore.half_e1(eri, (mo1,mo1))
>>> print(eri1.shape)
(55, 28)

144

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

1.7.3 outcore
pyscf.ao2mo.outcore.full(mol, mo_coeff, erifile, dataname=’eri_mo’, tmpdir=None, intor=’int2e_sph’,
aosym=’s4’,
comp=1,
max_memory=2000,
ioblk_size=256, verbose=2, compact=True)
Transfer arbitrary spherical AO integrals to MO integrals for given orbitals
Args:
mol [Mole object] AO integrals will be generated in terms of mol._atm, mol._bas, mol._env
mo_coeff [ndarray] Transform (ij|kl) with the same set of orbitals.
erifile [str or h5py File or h5py Group object] To store the transformed integrals, in HDF5 format.
Kwargs:
dataname [str] The dataset name in the erifile (ref the hierarchy of HDF5 format http://www.hdfgroup.
org/HDF5/doc1.6/UG/09_Groups.html). By assigning different dataname, the existed integral file
can be reused. If the erifile contains the dataname, the new integrals data will overwrite the old one.
tmpdir [str] The directory where to temporarily store the intermediate data (the half-transformed integrals). By default, it’s controlled by shell environment variable TMPDIR. The disk space requirement is about comp*mo_coeffs[0].shape[1]*mo_coeffs[1].shape[1]*nao**2
intor [str] Name of the 2-electron integral. Ref to getints_by_shell() for the complete list of
available 2-electron integral names
aosym [int or str] Permutation symmetry for the AO integrals

4 or ‘4’ or ‘s4’: 4-fold symmetry (default)
‘2ij’ or ‘s2ij’ : symmetry between i, j in (ij|kl)
‘2kl’ or ‘s2kl’ : symmetry between k, l in (ij|kl)
1 or ‘1’ or ‘s1’: no symmetry
‘a4ij’ : 4-fold symmetry with anti-symmetry between i, j in (ij|kl) (TODO)
‘a4kl’ : 4-fold symmetry with anti-symmetry between k, l in (ij|kl) (TODO)
‘a2ij’ : anti-symmetry between i, j in (ij|kl) (TODO)
‘a2kl’ : anti-symmetry between k, l in (ij|kl) (TODO)

comp [int] Components of the integrals, e.g. int2e_ip_sph has 3 components.
max_memory [float or int] The maximum size of cache to use (in MB), large cache may not improve
performance.
ioblk_size [float or int] The block size for IO, large block size may not improve performance
verbose [int] Print level
compact [bool] When compact is True, depending on the four oribital sets, the returned MO integrals
has (up to 4-fold) permutation symmetry. If it’s False, the function will abandon any permutation
symmetry, and return the “plain” MO integrals
Returns: None
Examples:
>>> from pyscf import gto
>>> from pyscf import ao2mo
>>> import h5py

1.7. ao2mo — Integral transformations

145

PySCF Documentation, Release 1.4.0

>>> def view(h5file, dataname='eri_mo'):
...
f5 = h5py.File(h5file)
...
print('dataset %s, shape %s' % (str(f5.keys()), str(f5[dataname].shape)))
...
f5.close()
>>> mol = gto.M(atom='O 0 0 0; H 0 1 0; H 0 0 1', basis='sto3g')
>>> mo1 = numpy.random.random((mol.nao_nr(), 10))
>>> ao2mo.outcore.full(mol, mo1, 'full.h5')
>>> view('full.h5')
dataset ['eri_mo'], shape (55, 55)
>>> ao2mo.outcore.full(mol, mo1, 'full.h5', dataname='new', compact=False)
>>> view('full.h5', 'new')
dataset ['eri_mo', 'new'], shape (100, 100)
>>> ao2mo.outcore.full(mol, mo1, 'full.h5', intor='int2e_ip1_sph', aosym='s1',
˓→comp=3)
>>> view('full.h5')
dataset ['eri_mo', 'new'], shape (3, 100, 100)
>>> ao2mo.outcore.full(mol, mo1, 'full.h5', intor='int2e_ip1_sph', aosym='s2kl',
˓→comp=3)
>>> view('full.h5')
dataset ['eri_mo', 'new'], shape (3, 100, 55)

pyscf.ao2mo.outcore.full_iofree(mol, mo_coeff, intor=’int2e_sph’, aosym=’s4’, comp=1,
max_memory=2000, ioblk_size=256, verbose=2, compact=True)
Transfer arbitrary spherical AO integrals to MO integrals for given orbitals This function is a wrap for
ao2mo.outcore.general(). It’s not really IO free. The returned MO integrals are held in memory.
For backward compatibility, it is used to replace the non-existed function direct.full_iofree.
Args:
mol [Mole object] AO integrals will be generated in terms of mol._atm, mol._bas, mol._env
mo_coeff [ndarray] Transform (ij|kl) with the same set of orbitals.
erifile [str] To store the transformed integrals, in HDF5 format.
Kwargs
dataname [str] The dataset name in the erifile (ref the hierarchy of HDF5 format http://www.hdfgroup.
org/HDF5/doc1.6/UG/09_Groups.html). By assigning different dataname, the existed integral file
can be reused. If the erifile contains the dataname, the new integrals data will overwrite the old one.
tmpdir [str] The directory where to temporarily store the intermediate data (the half-transformed integrals). By default, it’s controlled by shell environment variable TMPDIR. The disk space requirement is about comp*mo_coeffs[0].shape[1]*mo_coeffs[1].shape[1]*nao**2
intor [str] Name of the 2-electron integral. Ref to getints_by_shell() for the complete list of
available 2-electron integral names
aosym [int or str] Permutation symmetry for the AO integrals

4 or ‘4’ or ‘s4’: 4-fold symmetry (default)
‘2ij’ or ‘s2ij’ : symmetry between i, j in (ij|kl)
‘2kl’ or ‘s2kl’ : symmetry between k, l in (ij|kl)
1 or ‘1’ or ‘s1’: no symmetry
‘a4ij’ : 4-fold symmetry with anti-symmetry between i, j in (ij|kl) (TODO)
‘a4kl’ : 4-fold symmetry with anti-symmetry between k, l in (ij|kl) (TODO)
‘a2ij’ : anti-symmetry between i, j in (ij|kl) (TODO)
146

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

‘a2kl’ : anti-symmetry between k, l in (ij|kl) (TODO)

comp [int] Components of the integrals, e.g. int2e_ip_sph has 3 components.
verbose [int] Print level
max_memory [float or int] The maximum size of cache to use (in MB), large cache may not improve
performance.
ioblk_size [float or int] The block size for IO, large block size may not improve performance
verbose [int] Print level
compact [bool] When compact is True, depending on the four oribital sets, the returned MO integrals
has (up to 4-fold) permutation symmetry. If it’s False, the function will abandon any permutation
symmetry, and return the “plain” MO integrals
Returns: 2D/3D MO-integral array. They may or may not have the permutation symmetry, depending on the
given orbitals, and the kwargs compact. If the four sets of orbitals are identical, the MO integrals will at
most have 4-fold symmetry.
Examples:
>>> from pyscf import gto
>>> from pyscf import ao2mo
>>> mol = gto.M(atom='O 0 0 0; H 0 1 0; H 0 0 1', basis='sto3g')
>>> mo1 = numpy.random.random((mol.nao_nr(), 10))
>>> eri1 = ao2mo.outcore.full_iofree(mol, mo1)
>>> print(eri1.shape)
(55, 55)
>>> eri1 = ao2mo.outcore.full_iofree(mol, mo1, compact=False)
>>> print(eri1.shape)
(100, 100)
>>> eri1 = ao2mo.outcore.full_iofree(mol, mo1, intor='int2e_ip1_sph', aosym='s1',
˓→comp=3)
>>> print(eri1.shape)
(3, 100, 100)
>>> eri1 = ao2mo.outcore.full_iofree(mol, mo1, intor='int2e_ip1_sph', aosym='s2kl
˓→', comp=3)
>>> print(eri1.shape)
(3, 100, 55)

pyscf.ao2mo.outcore.general(mol, mo_coeffs, erifile, dataname=’eri_mo’, tmpdir=None, intor=’int2e_sph’, aosym=’s4’, comp=1, max_memory=2000,
ioblk_size=256, verbose=2, compact=True)
For the given four sets of orbitals, transfer arbitrary spherical AO integrals to MO integrals on the fly.
Args:
mol [Mole object] AO integrals will be generated in terms of mol._atm, mol._bas, mol._env
mo_coeffs [4-item list of ndarray] Four sets of orbital coefficients, corresponding to the four indices of
(ij|kl)
erifile [str or h5py File or h5py Group object] To store the transformed integrals, in HDF5 format.
Kwargs
dataname [str] The dataset name in the erifile (ref the hierarchy of HDF5 format http://www.hdfgroup.
org/HDF5/doc1.6/UG/09_Groups.html). By assigning different dataname, the existed integral file
can be reused. If the erifile contains the dataname, the new integrals data will overwrite the old one.

1.7. ao2mo — Integral transformations

147

PySCF Documentation, Release 1.4.0

tmpdir [str] The directory where to temporarily store the intermediate data (the half-transformed integrals). By default, it’s controlled by shell environment variable TMPDIR. The disk space requirement is about comp*mo_coeffs[0].shape[1]*mo_coeffs[1].shape[1]*nao**2
intor [str] Name of the 2-electron integral. Ref to getints_by_shell() for the complete list of
available 2-electron integral names
aosym [int or str] Permutation symmetry for the AO integrals

4 or ‘4’ or ‘s4’: 4-fold symmetry (default)
‘2ij’ or ‘s2ij’ : symmetry between i, j in (ij|kl)
‘2kl’ or ‘s2kl’ : symmetry between k, l in (ij|kl)
1 or ‘1’ or ‘s1’: no symmetry
‘a4ij’ : 4-fold symmetry with anti-symmetry between i, j in (ij|kl) (TODO)
‘a4kl’ : 4-fold symmetry with anti-symmetry between k, l in (ij|kl) (TODO)
‘a2ij’ : anti-symmetry between i, j in (ij|kl) (TODO)
‘a2kl’ : anti-symmetry between k, l in (ij|kl) (TODO)

comp [int] Components of the integrals, e.g. int2e_ip_sph has 3 components.
max_memory [float or int] The maximum size of cache to use (in MB), large cache may not improve
performance.
ioblk_size [float or int] The block size for IO, large block size may not improve performance
verbose [int] Print level
compact [bool] When compact is True, depending on the four oribital sets, the returned MO integrals
has (up to 4-fold) permutation symmetry. If it’s False, the function will abandon any permutation
symmetry, and return the “plain” MO integrals
Returns: None
Examples:
>>> from pyscf import gto
>>> from pyscf import ao2mo
>>> import h5py
>>> def view(h5file, dataname='eri_mo'):
...
f5 = h5py.File(h5file)
...
print('dataset %s, shape %s' % (str(f5.keys()), str(f5[dataname].shape)))
...
f5.close()
>>> mol = gto.M(atom='O 0 0 0; H 0 1 0; H 0 0 1', basis='sto3g')
>>> mo1 = numpy.random.random((mol.nao_nr(), 10))
>>> mo2 = numpy.random.random((mol.nao_nr(), 8))
>>> mo3 = numpy.random.random((mol.nao_nr(), 6))
>>> mo4 = numpy.random.random((mol.nao_nr(), 4))
>>> ao2mo.outcore.general(mol, (mo1,mo2,mo3,mo4), 'oh2.h5')
>>> view('oh2.h5')
dataset ['eri_mo'], shape (80, 24)
>>> ao2mo.outcore.general(mol, (mo1,mo2,mo3,mo3), 'oh2.h5')
>>> view('oh2.h5')
dataset ['eri_mo'], shape (80, 21)
>>> ao2mo.outcore.general(mol, (mo1,mo2,mo3,mo3), 'oh2.h5', compact=False)
>>> view('oh2.h5')
dataset ['eri_mo'], shape (80, 36)
>>> ao2mo.outcore.general(mol, (mo1,mo1,mo2,mo2), 'oh2.h5')

148

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

>>> view('oh2.h5')
dataset ['eri_mo'], shape (55, 36)
>>> ao2mo.outcore.general(mol, (mo1,mo1,mo1,mo1), 'oh2.h5', dataname='new')
>>> view('oh2.h5', 'new')
dataset ['eri_mo', 'new'], shape (55, 55)
>>> ao2mo.outcore.general(mol, (mo1,mo1,mo1,mo1), 'oh2.h5', intor='int2e_ip1_sph
˓→', aosym='s1', comp=3)
>>> view('oh2.h5')
dataset ['eri_mo', 'new'], shape (3, 100, 100)
>>> ao2mo.outcore.general(mol, (mo1,mo1,mo1,mo1), 'oh2.h5', intor='int2e_ip1_sph
˓→', aosym='s2kl', comp=3)
>>> view('oh2.h5')
dataset ['eri_mo', 'new'], shape (3, 100, 55)

pyscf.ao2mo.outcore.general_iofree(mol, mo_coeffs, intor=’int2e_sph’, aosym=’s4’, comp=1,
max_memory=2000, ioblk_size=256, verbose=2, compact=True)
For the given four sets of orbitals, transfer arbitrary spherical AO integrals to MO integrals on the fly. This
function is a wrap for ao2mo.outcore.general(). It’s not really IO free. The returned MO integrals are
held in memory. For backward compatibility, it is used to replace the non-existed function direct.general_iofree.
Args:
mol [Mole object] AO integrals will be generated in terms of mol._atm, mol._bas, mol._env
mo_coeffs [4-item list of ndarray] Four sets of orbital coefficients, corresponding to the four indices of
(ij|kl)
Kwargs
intor [str] Name of the 2-electron integral. Ref to getints_by_shell() for the complete list of
available 2-electron integral names
aosym [int or str] Permutation symmetry for the AO integrals

4 or ‘4’ or ‘s4’: 4-fold symmetry (default)
‘2ij’ or ‘s2ij’ : symmetry between i, j in (ij|kl)
‘2kl’ or ‘s2kl’ : symmetry between k, l in (ij|kl)
1 or ‘1’ or ‘s1’: no symmetry
‘a4ij’ : 4-fold symmetry with anti-symmetry between i, j in (ij|kl) (TODO)
‘a4kl’ : 4-fold symmetry with anti-symmetry between k, l in (ij|kl) (TODO)
‘a2ij’ : anti-symmetry between i, j in (ij|kl) (TODO)
‘a2kl’ : anti-symmetry between k, l in (ij|kl) (TODO)

comp [int] Components of the integrals, e.g. int2e_ip_sph has 3 components.
verbose [int] Print level
compact [bool] When compact is True, depending on the four oribital sets, the returned MO integrals
has (up to 4-fold) permutation symmetry. If it’s False, the function will abandon any permutation
symmetry, and return the “plain” MO integrals
Returns: 2D/3D MO-integral array. They may or may not have the permutation symmetry, depending on the
given orbitals, and the kwargs compact. If the four sets of orbitals are identical, the MO integrals will at
most have 4-fold symmetry.

1.7. ao2mo — Integral transformations

149

PySCF Documentation, Release 1.4.0

Examples:
>>> from pyscf import gto
>>> from pyscf import ao2mo
>>> import h5py
>>> def view(h5file, dataname='eri_mo'):
...
f5 = h5py.File(h5file)
...
print('dataset %s, shape %s' % (str(f5.keys()), str(f5[dataname].shape)))
...
f5.close()
>>> mol = gto.M(atom='O 0 0 0; H 0 1 0; H 0 0 1', basis='sto3g')
>>> mo1 = numpy.random.random((mol.nao_nr(), 10))
>>> mo2 = numpy.random.random((mol.nao_nr(), 8))
>>> mo3 = numpy.random.random((mol.nao_nr(), 6))
>>> mo4 = numpy.random.random((mol.nao_nr(), 4))
>>> eri1 = ao2mo.outcore.general_iofree(mol, (mo1,mo2,mo3,mo4))
>>> print(eri1.shape)
(80, 24)
>>> eri1 = ao2mo.outcore.general_iofree(mol, (mo1,mo2,mo3,mo3))
>>> print(eri1.shape)
(80, 21)
>>> eri1 = ao2mo.outcore.general_iofree(mol, (mo1,mo2,mo3,mo3), compact=False)
>>> print(eri1.shape)
(80, 36)
>>> eri1 = ao2mo.outcore.general_iofree(mol, (mo1,mo1,mo1,mo1), intor='int2e_ip1_
˓→sph', aosym='s1', comp=3)
>>> print(eri1.shape)
(3, 100, 100)
>>> eri1 = ao2mo.outcore.general_iofree(mol, (mo1,mo1,mo1,mo1), intor='int2e_ip1_
˓→sph', aosym='s2kl', comp=3)
>>> print(eri1.shape)
(3, 100, 55)

pyscf.ao2mo.outcore.half_e1(mol, mo_coeffs, swapfile, intor=’int2e_sph’, aosym=’s4’, comp=1,
max_memory=2000, ioblk_size=256, verbose=2, compact=True,
ao2mopt=None)
Half transform arbitrary spherical AO integrals to MO integrals for the given two sets of orbitals
Args:
mol [Mole object] AO integrals will be generated in terms of mol._atm, mol._bas, mol._env
mo_coeff [ndarray] Transform (ij|kl) with the same set of orbitals.
swapfile [str or h5py File or h5py Group object] To store the transformed integrals, in HDF5 format. The
transformed integrals are saved in blocks.
Kwargs
intor [str] Name of the 2-electron integral. Ref to getints_by_shell() for the complete list of
available 2-electron integral names
aosym [int or str] Permutation symmetry for the AO integrals

4 or ‘4’ or ‘s4’: 4-fold symmetry (default)
‘2ij’ or ‘s2ij’ : symmetry between i, j in (ij|kl)
‘2kl’ or ‘s2kl’ : symmetry between k, l in (ij|kl)
1 or ‘1’ or ‘s1’: no symmetry
‘a4ij’ : 4-fold symmetry with anti-symmetry between i, j in (ij|kl) (TODO)

150

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

‘a4kl’ : 4-fold symmetry with anti-symmetry between k, l in (ij|kl) (TODO)
‘a2ij’ : anti-symmetry between i, j in (ij|kl) (TODO)
‘a2kl’ : anti-symmetry between k, l in (ij|kl) (TODO)

comp [int] Components of the integrals, e.g. int2e_ip_sph has 3 components.
verbose [int] Print level
max_memory [float or int] The maximum size of cache to use (in MB), large cache may not improve
performance.
ioblk_size [float or int] The block size for IO, large block size may not improve performance
verbose [int] Print level
compact [bool] When compact is True, depending on the four oribital sets, the returned MO integrals
has (up to 4-fold) permutation symmetry. If it’s False, the function will abandon any permutation
symmetry, and return the “plain” MO integrals
ao2mopt [AO2MOpt object] Precomputed data to improve perfomance
Returns: None

1.7.4 addons
class pyscf.ao2mo.addons.load(eri, dataname=’eri_mo’)
load 2e integrals from hdf5 file
Usage:
with load(erifile) as eri: print eri.shape
pyscf.ao2mo.addons.restore(symmetry, eri, norb, tao=None)
Convert the 2e integrals between different level of permutation symmetry (8-fold, 4-fold, or no symmetry)
Args:
symmetry [int or str] code to present the target symmetry of 2e integrals

‘s8’ or ‘8’ or 8 : 8-fold symmetry
‘s4’ or ‘4’ or 4 : 4-fold symmetry
‘s1’ or ‘1’ or 1 : no symmetry
‘s2ij’ or ‘2ij’ : symmetric ij pair for (ij|kl) (TODO)
‘s2ij’ or ‘2kl’ : symmetric kl pair for (ij|kl) (TODO)

eri [ndarray] The symmetry of eri is determined by the size of eri and norb
norb [int] The symmetry of eri is determined by the size of eri and norb
Returns: ndarray. The shape depends on the target symmetry.
8 : (norb*(norb+1)/2)*(norb*(norb+1)/2+1)/2
4 : (norb*(norb+1)/2, norb*(norb+1)/2)
1 : (norb, norb, norb, norb)
Examples:

1.7. ao2mo — Integral transformations

151

PySCF Documentation, Release 1.4.0

>>> from pyscf import gto
>>> from pyscf.scf import _vhf
>>> from pyscf import ao2mo
>>> mol = gto.M(atom='O 0 0 0; H
>>> eri = mol.intor('int2e')
>>> eri1 = ao2mo.restore(1, eri,
>>> eri4 = ao2mo.restore(4, eri,
>>> eri8 = ao2mo.restore(8, eri,
>>> print(eri1.shape)
(7, 7, 7, 7)
>>> print(eri1.shape)
(28, 28)
>>> print(eri1.shape)
(406,)

0 1 0; H 0 0 1', basis='sto3g')
mol.nao_nr())
mol.nao_nr())
mol.nao_nr())

1.8 mcscf — Multi-configurational self-consistent field
CASCI and CASSCF
Simple usage:
>>> from pyscf import gto, scf, mcscf
>>> mol = gto.M(atom='N 0 0 0; N 0 0 1', basis='ccpvdz', verbose=0)
>>> mf = scf.RHF(mol).run()
>>> mc = mcscf.CASCI(mf, 6, 6)
>>> mc.kernel()[0]
-108.980200816243354
>>> mc = mcscf.CASSCF(mf, 6, 6)
>>> mc.kernel()[0]
-109.044401882238134
>>> mc = mcscf.CASSCF(mf, 4, 4)
>>> cas_list = [5,6,8,9] # pick orbitals for CAS space, 1-based indices
>>> mo = mcscf.sort_mo(mc, mf.mo_coeff, cas_list)
>>> mc.kernel(mo)[0]
-109.007378939813691

mcscf.CASSCF() or mcscf.CASCI() returns a proper instance of CASSCF/CASCI class. There are some parameters to control the CASSCF/CASCI method.
verbose [int] Print level. Default value equals to Mole.verbose.
max_memory [float or int] Allowed memory in MB. Default value equals to Mole.max_memory.
ncas [int] Active space size.
nelecas [tuple of int] Active (nelec_alpha, nelec_beta)
ncore [int or tuple of int] Core electron number. In UHF-CASSCF, it’s a tuple to indicate the different
core eletron numbers.
natorb [bool] Whether to restore the natural orbital during CASSCF optimization. Default is not.
canonicalization [bool] Whether to canonicalize orbitals. Default is True.
fcisolver [an instance of FCISolver] The pyscf.fci module provides several FCISolver for different
scenario. Generally, fci.direct_spin1.FCISolver can be used for all RHF-CASSCF. However, a
proper FCISolver can provide better performance and better numerical stability. One can either use

152

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

fci.solver() function to pick the FCISolver by the program or manually assigen the FCISolver
to this attribute, e.g.
>>>
>>>
>>>
>>>

from pyscf import fci
mc = mcscf.CASSCF(mf, 4, 4)
mc.fcisolver = fci.solver(mol, singlet=True)
mc.fcisolver = fci.direct_spin1.FCISolver(mol)

You can control FCISolver by setting e.g.:
>>> mc.fcisolver.max_cycle = 30
>>> mc.fcisolver.conv_tol = 1e-7

For more details of the parameter for FCISolver, See fci.
By replacing this fcisolver, you can easily use the CASCI/CASSCF solver with other FCI replacements, such as DMRG, QMC. See dmrgscf and fciqmcscf.
The Following attributes are used for CASSCF
conv_tol [float] Converge threshold. Default is 1e-7
conv_tol_grad [float] Converge threshold for CI gradients and orbital rotation gradients. Default is 1e-4
max_stepsize [float] The step size for orbital rotation. Small step size is prefered. Default is 0.03.
(NOTE although the default step size is small enough for many systems, it happens that the orbital
optimizor crosses the barriar of local minimum and converge to the neighbour solution, e.g. the
CAS(4,4) for C2H4 in the test files. In these cases, one need to fine the optimization by reducing
max_stepsize, max_ci_stepsize and max_cycle_micro, max_cycle_micro_inner and ah_start_tol.)
>>>
>>>
>>>
>>>
>>>
>>>

mc = mcscf.CASSCF(mf, 6, 6)
mc.max_stepsize = .01
mc.max_cycle_micro = 1
mc.max_cycle_macro = 100
mc.max_cycle_micro_inner = 1
mc.ah_start_tol = 1e-6

max_ci_stepsize [float] The max size for approximate CI updates. The approximate updates are used in
1-step algorithm, to estimate the change of CI wavefunction wrt the orbital rotation. Small step size
is prefered. Default is 0.01.
max_cycle_macro [int] Max number of macro iterations. Default is 50.
max_cycle_micro [int] Max number of micro iterations in each macro iteration. Depending on systems,
increasing this value might reduce the total macro iterations. Generally, 2 - 3 steps should be
enough. Default is 2.
max_cycle_micro_inner [int] Max number of steps for the orbital rotations allowed for the augmented
hessian solver. It can affect the actual size of orbital rotation. Even with a small max_stepsize, a
few max_cycle_micro_inner can accumulate the rotation and leads to a significant change of the
CAS space. Depending on systems, increasing this value migh reduce the total number of macro
iterations. The value between 2 - 8 is preferred. Default is 4.
frozen [int or list] If integer is given, the inner-most orbitals are excluded from optimization. Given the
orbital indices (0-based) in a list, any doubly occupied core orbitals, active orbitals and external
orbitals can be frozen.
ah_level_shift [float, for AH solver.] Level shift for the Davidson diagonalization in AH solver. Default
is 0.

1.8. mcscf — Multi-configurational self-consistent field

153

PySCF Documentation, Release 1.4.0

ah_conv_tol [float, for AH solver.] converge threshold for Davidson diagonalization in AH solver. Default is 1e-8.
ah_max_cycle [float, for AH solver.] Max number of iterations allowd in AH solver. Default is 20.
ah_lindep [float, for AH solver.] Linear dependence threshold for AH solver. Default is 1e-16.
ah_start_tol [flat, for AH solver.] In AH solver, the orbital rotation is started without completely solving
the AH problem. This value is to control the start point. Default is 1e-4.
ah_start_cycle [int, for AH solver.] In AH solver, the orbital rotation is started without completely
solving the AH problem. This value is to control the start point. Default is 3.
ah_conv_tol, ah_max_cycle, ah_lindep, ah_start_tol and ah_start_cycle
can affect the accuracy and performance of CASSCF solver. Lower ah_conv_tol and
ah_lindep can improve the accuracy of CASSCF optimization, but slow down the performance.
>>> from pyscf import gto, scf, mcscf
>>> mol = gto.M(atom='N 0 0 0; N 0 0 1', basis='ccpvdz', verbose=0)
>>> mf = scf.UHF(mol)
>>> mf.scf()
>>> mc = mcscf.CASSCF(mf, 6, 6)
>>> mc.conv_tol = 1e-10
>>> mc.ah_conv_tol = 1e-5
>>> mc.kernel()
-109.044401898486001
>>> mc.ah_conv_tol = 1e-10
>>> mc.kernel()
-109.044401887945668

chkfile [str] Checkpoint file to save the intermediate orbitals during the CASSCF optimization. Default
is the checkpoint file of mean field object.
Saved results
e_tot [float] Total MCSCF energy (electronic energy plus nuclear repulsion)
ci [ndarray] CAS space FCI coefficients
converged [bool, for CASSCF only] It indicates CASSCF optimization converged or not.
mo_energy: ndarray, Diagonal elements of general Fock matrix
mo_coeff [ndarray, for CASSCF only] Optimized CASSCF orbitals coefficients Note the orbitals are
NOT natural orbitals by default. There are two inbuilt methods to convert the mo_coeff to natural
orbitals. 1. Set .natorb attribute. It can be used before calculation. 2. call .cas_natorb_ method after
the calculation to in-place convert the orbitals

154

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

1.8.1 CASSCF active space solver
DMRG solver
FCIQMC solver
State-average FCI solver
State-average with mixed solver

1.8.2 Symmetry broken
1.8.3 Initial guess
1.8.4 Program reference
CASCI
class pyscf.mcscf.casci.CASCI(mf, ncas, nelecas, ncore=None)
Attributes:
verbose [int] Print level. Default value equals to Mole.verbose.
max_memory [float or int] Allowed memory in MB. Default value equals to Mole.max_memory.
ncas [int] Active space size.
nelecas [tuple of int] Active (nelec_alpha, nelec_beta)
ncore [int or tuple of int] Core electron number. In UHF-CASSCF, it’s a tuple to indicate the different
core eletron numbers.
natorb [bool] Whether to restore the natural orbital in CAS space. Default is not. Be very careful to
set this parameter when CASCI/CASSCF are combined with DMRG solver because this parameter
changes the orbital ordering which DMRG relies on.
canonicalization [bool] Whether to canonicalize orbitals. Default is True.
fcisolver [an instance of FCISolver] The pyscf.fci module provides several FCISolver for different
scenario. Generally, fci.direct_spin1.FCISolver can be used for all RHF-CASSCF. However, a
proper FCISolver can provide better performance and better numerical stability. One can either use
fci.solver() function to pick the FCISolver by the program or manually assigen the FCISolver
to this attribute, e.g.
>>>
>>>
>>>
>>>

from pyscf import fci
mc = mcscf.CASSCF(mf, 4, 4)
mc.fcisolver = fci.solver(mol, singlet=True)
mc.fcisolver = fci.direct_spin1.FCISolver(mol)

You can control FCISolver by setting e.g.:
>>> mc.fcisolver.max_cycle = 30
>>> mc.fcisolver.conv_tol = 1e-7

For more details of the parameter for FCISolver, See fci.
Saved results

1.8. mcscf — Multi-configurational self-consistent field

155

PySCF Documentation, Release 1.4.0

e_tot [float] Total MCSCF energy (electronic energy plus nuclear repulsion)
ci [ndarray] CAS space FCI coefficients
Examples:
>>> from pyscf import gto, scf, mcscf
>>> mol = gto.M(atom='N 0 0 0; N 0 0 1', basis='ccpvdz', verbose=0)
>>> mf = scf.RHF(mol)
>>> mf.scf()
>>> mc = mcscf.CASCI(mf, 6, 6)
>>> mc.kernel()[0]
-108.980200816243354

canonicalize(mc, mo_coeff=None, ci=None,
casdm1=None, verbose=3)
Canonicalize CASCI/CASSCF orbitals

eris=None,

sort=False,

cas_natorb=False,

Args: mc : a CASSCF/CASCI object or RHF object
Returns: A tuple, (natural orbitals, CI coefficients, orbital energies) The orbital energies are the diagonal
terms of general Fock matrix.
canonicalize_(mo_coeff=None,
ci=None,
eris=None,
casdm1=None, verbose=None)
Canonicalize CASCI/CASSCF orbitals

sort=False,

cas_natorb=False,

Args: mc : a CASSCF/CASCI object or RHF object
Returns: A tuple, (natural orbitals, CI coefficients, orbital energies) The orbital energies are the diagonal
terms of general Fock matrix.
cas_natorb(mo_coeff=None, ci=None, eris=None, sort=False, casdm1=None, verbose=None)
Transform active orbitals to natrual orbitals, and update the CI wfn
Args: mc : a CASSCF/CASCI object or RHF object
Kwargs:
sort [bool] Sort natural orbitals wrt the occupancy. Be careful with this option since the resultant
natural orbitals might have the different symmetry to the irreps indicated by CASSCF.orbsym
Returns: A tuple, the first item is natural orbitals, the second is updated CI coefficients, the third is the
natural occupancy associated to the natural orbitals.
cas_natorb_(mo_coeff=None, ci=None, eris=None, sort=False, casdm1=None, verbose=None)
Transform active orbitals to natrual orbitals, and update the CI wfn
Args: mc : a CASSCF/CASCI object or RHF object
Kwargs:
sort [bool] Sort natural orbitals wrt the occupancy. Be careful with this option since the resultant
natural orbitals might have the different symmetry to the irreps indicated by CASSCF.orbsym
Returns: A tuple, the first item is natural orbitals, the second is updated CI coefficients, the third is the
natural occupancy associated to the natural orbitals.
fix_spin_(shift=0.2, ss=None)
Use level shift to control FCI solver spin.
(𝐻 + 𝑠ℎ𝑖𝑓 𝑡 * 𝑆 2 )|Ψ⟩ = 𝐸|Ψ⟩
Kwargs:

156

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

shift [float] Level shift for states which have different spin
ss [number] S^2 expection value == s*(s+1)
get_h1cas(mo_coeff=None, ncas=None, ncore=None)
CAS sapce one-electron hamiltonian
Args: casci : a CASSCF/CASCI object or RHF object
Returns: A tuple, the first is the effective one-electron hamiltonian defined in CAS space, the second is
the electronic energy from core.
get_h1eff(mo_coeff=None, ncas=None, ncore=None)
CAS sapce one-electron hamiltonian
Args: casci : a CASSCF/CASCI object or RHF object
Returns: A tuple, the first is the effective one-electron hamiltonian defined in CAS space, the second is
the electronic energy from core.
h1e_for_cas(mo_coeff=None, ncas=None, ncore=None)
CAS sapce one-electron hamiltonian
Args: casci : a CASSCF/CASCI object or RHF object
Returns: A tuple, the first is the effective one-electron hamiltonian defined in CAS space, the second is
the electronic energy from core.
make_rdm1(mo_coeff=None, ci=None, ncas=None, nelecas=None, ncore=None)
One-particle density matrix in AO representation
make_rdm1s(mo_coeff=None, ci=None, ncas=None, nelecas=None, ncore=None)
One-particle density matrices for alpha and beta spin
sort_mo(caslst, mo_coeff=None, base=1)
Select active space. See also pyscf.mcscf.addons.sort_mo()
state_average_(weights=(0.5, 0.5))
State average over the energy. The energy funcitonal is E = w1 + w2 + ...
Note we may need change the FCI solver to
mc.fcisolver = fci.solver(mol, False)
before calling state_average_(mc), to mix the singlet and triplet states
state_specific_(state=1)
For excited state
Kwargs: state : int 0 for ground state; 1 for first excited state.
pyscf.mcscf.casci.canonicalize(mc, mo_coeff=None, ci=None, eris=None,
cas_natorb=False, casdm1=None, verbose=3)
Canonicalize CASCI/CASSCF orbitals

sort=False,

Args: mc : a CASSCF/CASCI object or RHF object
Returns: A tuple, (natural orbitals, CI coefficients, orbital energies) The orbital energies are the diagonal terms
of general Fock matrix.
pyscf.mcscf.casci.cas_natorb(mc,
mo_coeff=None,
ci=None,
casdm1=None, verbose=None)
Transform active orbitals to natrual orbitals, and update the CI wfn

eris=None,

sort=False,

Args: mc : a CASSCF/CASCI object or RHF object
Kwargs:
1.8. mcscf — Multi-configurational self-consistent field

157

PySCF Documentation, Release 1.4.0

sort [bool] Sort natural orbitals wrt the occupancy. Be careful with this option since the resultant natural
orbitals might have the different symmetry to the irreps indicated by CASSCF.orbsym
Returns: A tuple, the first item is natural orbitals, the second is updated CI coefficients, the third is the natural
occupancy associated to the natural orbitals.
pyscf.mcscf.casci.get_fock(mc, mo_coeff=None, ci=None, eris=None, casdm1=None, verbose=None)
Generalized Fock matrix in AO representation
pyscf.mcscf.casci.h1e_for_cas(casci, mo_coeff=None, ncas=None, ncore=None)
CAS sapce one-electron hamiltonian
Args: casci : a CASSCF/CASCI object or RHF object
Returns: A tuple, the first is the effective one-electron hamiltonian defined in CAS space, the second is the
electronic energy from core.
pyscf.mcscf.casci.kernel(casci, mo_coeff=None, ci0=None, verbose=3)
CASCI solver
pyscf.mcscf.casci_uhf.h1e_for_cas(casci, mo_coeff=None, ncas=None, ncore=None)
CAS sapce one-electron hamiltonian for UHF-CASCI or UHF-CASSCF
Args: casci : a U-CASSCF/U-CASCI object or UHF object
pyscf.mcscf.casci_uhf.kernel(casci, mo_coeff=None, ci0=None, verbose=3)
UHF-CASCI solver
CASSCF
class pyscf.mcscf.mc1step.CASSCF(mf, ncas, nelecas, ncore=None, frozen=None)
Attributes:
verbose [int] Print level. Default value equals to Mole.verbose.
max_memory [float or int] Allowed memory in MB. Default value equals to Mole.max_memory.
ncas [int] Active space size.
nelecas [tuple of int] Active (nelec_alpha, nelec_beta)
ncore [int or tuple of int] Core electron number. In UHF-CASSCF, it’s a tuple to indicate the different
core eletron numbers.
natorb [bool] Whether to restore the natural orbital in CAS space. Default is not. Be very careful to
set this parameter when CASCI/CASSCF are combined with DMRG solver because this parameter
changes the orbital ordering which DMRG relies on.
canonicalization [bool] Whether to canonicalize orbitals. Default is True.
fcisolver [an instance of FCISolver] The pyscf.fci module provides several FCISolver for different
scenario. Generally, fci.direct_spin1.FCISolver can be used for all RHF-CASSCF. However, a
proper FCISolver can provide better performance and better numerical stability. One can either use
fci.solver() function to pick the FCISolver by the program or manually assigen the FCISolver
to this attribute, e.g.
>>>
>>>
>>>
>>>

158

from pyscf import fci
mc = mcscf.CASSCF(mf, 4, 4)
mc.fcisolver = fci.solver(mol, singlet=True)
mc.fcisolver = fci.direct_spin1.FCISolver(mol)

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

You can control FCISolver by setting e.g.:
>>> mc.fcisolver.max_cycle = 30
>>> mc.fcisolver.conv_tol = 1e-7

For more details of the parameter for FCISolver, See fci.
Saved results
e_tot [float] Total MCSCF energy (electronic energy plus nuclear repulsion)
ci [ndarray] CAS space FCI coefficients
Examples:
>>> from pyscf import gto, scf, mcscf
>>> mol = gto.M(atom='N 0 0 0; N 0 0 1', basis='ccpvdz', verbose=0)
>>> mf = scf.RHF(mol)
>>> mf.scf()
>>> mc = mcscf.CASCI(mf, 6, 6)
>>> mc.kernel()[0]
-108.980200816243354
CASSCF

Extra attributes for CASSCF:
conv_tol [float] Converge threshold. Default is 1e-7
conv_tol_grad [float] Converge threshold for CI gradients and orbital rotation gradients. Default
is 1e-4
max_stepsize [float] The step size for orbital rotation. Small step (0.005 - 0.05) is prefered. (see
notes in max_cycle_micro_inner attribute) Default is 0.03.
max_cycle_macro [int] Max number of macro iterations. Default is 50.
max_cycle_micro [int] Max number of micro iterations in each macro iteration. Depending on
systems, increasing this value might reduce the total macro iterations. Generally, 2 - 5 steps
should be enough. Default is 3.
ah_level_shift [float, for AH solver.] Level shift for the Davidson diagonalization in AH solver.
Default is 1e-8.
ah_conv_tol [float, for AH solver.] converge threshold for AH solver. Default is 1e-12.
ah_max_cycle [float, for AH solver.] Max number of iterations allowd in AH solver. Default is
30.
ah_lindep [float, for AH solver.] Linear dependence threshold for AH solver. Default is 1e-14.
ah_start_tol [flat, for AH solver.] In AH solver, the orbital rotation is started without completely
solving the AH problem. This value is to control the start point. Default is 0.2.
ah_start_cycle [int, for AH solver.] In AH solver, the orbital rotation is started without completely
solving the AH problem. This value is to control the start point. Default is 2.
ah_conv_tol,
ah_max_cycle,
ah_lindep,
ah_start_tol
and
ah_start_cycle can affect the accuracy and performance of CASSCF solver. Lower
ah_conv_tol and ah_lindep might improve the accuracy of CASSCF optimization, but
decrease the performance.
>>> from pyscf import gto, scf, mcscf
>>> mol = gto.M(atom='N 0 0 0; N 0 0 1', basis='ccpvdz', verbose=0)

1.8. mcscf — Multi-configurational self-consistent field

159

PySCF Documentation, Release 1.4.0

>>> mf = scf.UHF(mol)
>>> mf.scf()
>>> mc = mcscf.CASSCF(mf, 6, 6)
>>> mc.conv_tol = 1e-10
>>> mc.ah_conv_tol = 1e-5
>>> mc.kernel()
-109.044401898486001
>>> mc.ah_conv_tol = 1e-10
>>> mc.kernel()
-109.044401887945668

chkfile [str] Checkpoint file to save the intermediate orbitals during the CASSCF optimization.
Default is the checkpoint file of mean field object.
ci_response_space [int] subspace size to solve the CI vector response. Default is 3.
callback [function(envs_dict) => None] callback function takes one dict as the argument which is
generated by the builtin function locals(), so that the callback function can access all local
variables in the current envrionment.
Saved results
e_tot [float] Total MCSCF energy (electronic energy plus nuclear repulsion)
ci [ndarray] CAS space FCI coefficients
converged [bool] It indicates CASSCF optimization converged or not.
mo_coeff [ndarray] Optimized CASSCF orbitals coefficients
Examples:
>>> from pyscf import gto, scf, mcscf
>>> mol = gto.M(atom='N 0 0 0; N 0 0 1', basis='ccpvdz', verbose=0)
>>> mf = scf.RHF(mol)
>>> mf.scf()
>>> mc = mcscf.CASSCF(mf, 6, 6)
>>> mc.kernel()[0]
-109.044401882238134

rotate_mo(mo, u, log=None)
Rotate orbitals with the given unitary matrix
solve_approx_ci(h1, h2, ci0, ecore, e_ci, envs)
Solve CI eigenvalue/response problem approximately
pyscf.mcscf.mc1step.kernel(casscf, mo_coeff, tol=1e-07, conv_tol_grad=None, ci0=None, callback=None, verbose=3, dump_chk=True)
CASSCF solver
class pyscf.mcscf.mc1step_symm.CASSCF(mf, ncas, nelecas, ncore=None, frozen=None)
Attributes:
verbose [int] Print level. Default value equals to Mole.verbose.
max_memory [float or int] Allowed memory in MB. Default value equals to Mole.max_memory.
ncas [int] Active space size.
nelecas [tuple of int] Active (nelec_alpha, nelec_beta)
ncore [int or tuple of int] Core electron number. In UHF-CASSCF, it’s a tuple to indicate the different
core eletron numbers.
160

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

natorb [bool] Whether to restore the natural orbital in CAS space. Default is not. Be very careful to
set this parameter when CASCI/CASSCF are combined with DMRG solver because this parameter
changes the orbital ordering which DMRG relies on.
canonicalization [bool] Whether to canonicalize orbitals. Default is True.
fcisolver [an instance of FCISolver] The pyscf.fci module provides several FCISolver for different
scenario. Generally, fci.direct_spin1.FCISolver can be used for all RHF-CASSCF. However, a
proper FCISolver can provide better performance and better numerical stability. One can either use
fci.solver() function to pick the FCISolver by the program or manually assigen the FCISolver
to this attribute, e.g.
>>>
>>>
>>>
>>>

from pyscf import fci
mc = mcscf.CASSCF(mf, 4, 4)
mc.fcisolver = fci.solver(mol, singlet=True)
mc.fcisolver = fci.direct_spin1.FCISolver(mol)

You can control FCISolver by setting e.g.:
>>> mc.fcisolver.max_cycle = 30
>>> mc.fcisolver.conv_tol = 1e-7

For more details of the parameter for FCISolver, See fci.
Saved results
e_tot [float] Total MCSCF energy (electronic energy plus nuclear repulsion)
ci [ndarray] CAS space FCI coefficients
Examples:
>>> from pyscf import gto, scf, mcscf
>>> mol = gto.M(atom='N 0 0 0; N 0 0 1', basis='ccpvdz', verbose=0)
>>> mf = scf.RHF(mol)
>>> mf.scf()
>>> mc = mcscf.CASCI(mf, 6, 6)
>>> mc.kernel()[0]
-108.980200816243354
CASSCF

Extra attributes for CASSCF:
conv_tol [float] Converge threshold. Default is 1e-7
conv_tol_grad [float] Converge threshold for CI gradients and orbital rotation gradients. Default
is 1e-4
max_stepsize [float] The step size for orbital rotation. Small step (0.005 - 0.05) is prefered. (see
notes in max_cycle_micro_inner attribute) Default is 0.03.
max_cycle_macro [int] Max number of macro iterations. Default is 50.
max_cycle_micro [int] Max number of micro iterations in each macro iteration. Depending on
systems, increasing this value might reduce the total macro iterations. Generally, 2 - 5 steps
should be enough. Default is 3.
ah_level_shift [float, for AH solver.] Level shift for the Davidson diagonalization in AH solver.
Default is 1e-8.
ah_conv_tol [float, for AH solver.] converge threshold for AH solver. Default is 1e-12.

1.8. mcscf — Multi-configurational self-consistent field

161

PySCF Documentation, Release 1.4.0

ah_max_cycle [float, for AH solver.] Max number of iterations allowd in AH solver. Default is
30.
ah_lindep [float, for AH solver.] Linear dependence threshold for AH solver. Default is 1e-14.
ah_start_tol [flat, for AH solver.] In AH solver, the orbital rotation is started without completely
solving the AH problem. This value is to control the start point. Default is 0.2.
ah_start_cycle [int, for AH solver.] In AH solver, the orbital rotation is started without completely
solving the AH problem. This value is to control the start point. Default is 2.
ah_conv_tol,
ah_max_cycle,
ah_lindep,
ah_start_tol
and
ah_start_cycle can affect the accuracy and performance of CASSCF solver. Lower
ah_conv_tol and ah_lindep might improve the accuracy of CASSCF optimization, but
decrease the performance.
>>> from pyscf import gto, scf, mcscf
>>> mol = gto.M(atom='N 0 0 0; N 0 0 1', basis='ccpvdz', verbose=0)
>>> mf = scf.UHF(mol)
>>> mf.scf()
>>> mc = mcscf.CASSCF(mf, 6, 6)
>>> mc.conv_tol = 1e-10
>>> mc.ah_conv_tol = 1e-5
>>> mc.kernel()
-109.044401898486001
>>> mc.ah_conv_tol = 1e-10
>>> mc.kernel()
-109.044401887945668

chkfile [str] Checkpoint file to save the intermediate orbitals during the CASSCF optimization.
Default is the checkpoint file of mean field object.
ci_response_space [int] subspace size to solve the CI vector response. Default is 3.
callback [function(envs_dict) => None] callback function takes one dict as the argument which is
generated by the builtin function locals(), so that the callback function can access all local
variables in the current envrionment.
Saved results
e_tot [float] Total MCSCF energy (electronic energy plus nuclear repulsion)
ci [ndarray] CAS space FCI coefficients
converged [bool] It indicates CASSCF optimization converged or not.
mo_coeff [ndarray] Optimized CASSCF orbitals coefficients
Examples:
>>> from pyscf import gto, scf, mcscf
>>> mol = gto.M(atom='N 0 0 0; N 0 0 1', basis='ccpvdz', verbose=0)
>>> mf = scf.RHF(mol)
>>> mf.scf()
>>> mc = mcscf.CASSCF(mf, 6, 6)
>>> mc.kernel()[0]
-109.044401882238134

162

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

addons
pyscf.mcscf.addons.cas_natorb(casscf, mo_coeff=None, ci=None, sort=False)
Natrual orbitals in CAS space
pyscf.mcscf.addons.caslst_by_irrep(casscf, mo_coeff, cas_irrep_nocc, cas_irrep_ncore=None,
s=None, base=1)
Given number of active orbitals for each irrep, return the orbital indices of active space
Args: casscf : an CASSCF or CASCI object
cas_irrep_nocc [list or dict] Number of active orbitals for each irrep. It can be a dict, eg {‘A1’: 2, ‘B2’:
4} to indicate the active space size based on irrep names, or {0: 2, 3: 4} for irrep Id, or a list [2, 0,
0, 4] (identical to {0: 2, 3: 4}) in which the list index is served as the irrep Id.
Kwargs:
cas_irrep_ncore [list or dict] Number of closed shells for each irrep. It can be a dict, eg {‘A1’: 6, ‘B2’:
4} to indicate the closed shells based on irrep names, or {0: 6, 3: 4} for irrep Id, or a list [6, 0, 0, 4]
(identical to {0: 6, 3: 4}) in which the list index is served as the irrep Id. If cas_irrep_ncore is not
given, the program will generate a guess based on the lowest CASCI.ncore orbitals.
s [ndarray] overlap matrix
base [int] 0-based (C-like) or 1-based (Fortran-like) caslst
Returns: A list of orbital indices
Examples:
>>> from pyscf import gto, scf, mcscf
>>> mol = gto.M(atom='N 0 0 0; N 0 0 1', basis='ccpvtz', symmetry=True, verbose=0)
>>> mf = scf.RHF(mol)
>>> mf.kernel()
>>> mc = mcscf.CASSCF(mf, 12, 4)
>>> mcscf.caslst_by_irrep(mc, mf.mo_coeff, {'E1gx':4, 'E1gy':4, 'E1ux':2, 'E1uy':
˓→2})
[5, 7, 8, 10, 11, 14, 15, 20, 25, 26, 31, 32]

pyscf.mcscf.addons.get_fock(casscf, mo_coeff=None, ci=None)
Generalized Fock matrix in AO representation
pyscf.mcscf.addons.hot_tuning_(casscf, configfile=None)
Allow you to tune CASSCF parameters on the runtime
pyscf.mcscf.addons.make_rdm1(casscf, mo_coeff=None, ci=None)
One-particle densit matrix in AO representation
Args: casscf : an CASSCF or CASCI object
Kwargs:
ci [ndarray] CAS space FCI coefficients. If not given, take casscf.ci.
mo_coeff [ndarray] Orbital coefficients. If not given, take casscf.mo_coeff.
Examples:
>>>
>>>
>>>
>>>
>>>

import scipy.linalg
from pyscf import gto, scf, mcscf
mol = gto.M(atom='N 0 0 0; N 0 0 1', basis='sto-3g', verbose=0)
mf = scf.RHF(mol)
res = mf.scf()

1.8. mcscf — Multi-configurational self-consistent field

163

PySCF Documentation, Release 1.4.0

>>> mc = mcscf.CASSCF(mf, 6, 6)
>>> res = mc.kernel()
>>> natocc = numpy.linalg.eigh(mcscf.make_rdm1(mc), mf.get_ovlp(), type=2)[0]
>>> print(natocc)
[ 0.0121563
0.0494735
0.0494735
1.95040395 1.95040395 1.98808879
2.
2.
2.
2.
]

pyscf.mcscf.addons.make_rdm1s(casscf, mo_coeff=None, ci=None)
Alpha and beta one-particle densit matrices in AO representation
pyscf.mcscf.addons.map2hf(casscf, mf_mo=None, base=1, tol=0.5)
The overlap between the CASSCF optimized orbitals and the canonical HF orbitals.
pyscf.mcscf.addons.project_init_guess(casscf, init_mo, prev_mol=None)
Project the given initial guess to the current CASSCF problem. The projected initial guess has two parts. The
core orbitals are directly taken from the Hartree-Fock orbitals, and the active orbitals are projected from the
given initial guess.
Args: casscf : an CASSCF or CASCI object
init_mo [ndarray or list of ndarray] Initial guess orbitals which are not orth-normal for the current
molecule. When the casscf is UHF-CASSCF, the init_mo needs to be a list of two ndarrays, for
alpha and beta orbitals
Kwargs:
prev_mol [an instance of Mole] If given, the inital guess orbitals are associated to the geometry and
basis of prev_mol. Otherwise, the orbitals are based of the geometry and basis of casscf.mol
Returns: New orthogonal initial guess orbitals with the core taken from Hartree-Fock orbitals and projected
active space from original initial guess orbitals
Examples:
import numpy
from pyscf import gto, scf, mcscf
mol = gto.Mole()
mol.build(atom='H 0 0 0; F 0 0 0.8', basis='ccpvdz', verbose=0)
mf = scf.RHF(mol)
mf.scf()
mc = mcscf.CASSCF(mf, 6, 6)
mo = mcscf.sort_mo(mc, mf.mo_coeff, [3,4,5,6,8,9])
print('E(0.8) = %.12f' % mc.kernel(mo)[0])
init_mo = mc.mo_coeff
for b in numpy.arange(1.0, 3., .2):
mol.atom = [['H', (0, 0, 0)], ['F', (0, 0, b)]]
mol.build(0, 0)
mf = scf.RHF(mol)
mf.scf()
mc = mcscf.CASSCF(mf, 6, 6)
mo = mcscf.project_init_guess(mc, init_mo)
print('E(%2.1f) = %.12f' % (b, mc.kernel(mo)[0]))
init_mo = mc.mo_coeff

pyscf.mcscf.addons.sort_mo(casscf, mo_coeff, caslst, base=1)
Pick orbitals for CAS space
Args: casscf : an CASSCF or CASCI object
mo_coeff [ndarray or a list of ndarray] Orbitals for CASSCF initial guess. In the UHF-CASSCF, it’s a
list of two orbitals, for alpha and beta spin.
164

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

caslst [list of int or nested list of int] A list of orbital indices to represent the CAS space. In the UHFCASSCF, it’s consist of two lists, for alpha and beta spin.
Kwargs:
base [int] 0-based (C-style) or 1-based (Fortran-style) caslst
Returns: An reoreded mo_coeff, which put the orbitals given by caslst in the CAS space
Examples:
>>> from pyscf import gto, scf, mcscf
>>> mol = gto.M(atom='N 0 0 0; N 0 0 1', basis='ccpvdz', verbose=0)
>>> mf = scf.RHF(mol)
>>> mf.scf()
>>> mc = mcscf.CASSCF(mf, 4, 4)
>>> cas_list = [5,6,8,9] # pi orbitals
>>> mo = mc.sort_mo(cas_list)
>>> mc.kernel(mo)[0]
-109.007378939813691

pyscf.mcscf.addons.sort_mo_by_irrep(casscf,
mo_coeff,
cas_irrep_nocc,
cas_irrep_ncore=None, s=None)
Given number of active orbitals for each irrep, construct the mo initial guess for CASSCF
Args: casscf : an CASSCF or CASCI object
cas_irrep_nocc [list or dict] Number of active orbitals for each irrep. It can be a dict, eg {‘A1’: 2, ‘B2’:
4} to indicate the active space size based on irrep names, or {0: 2, 3: 4} for irrep Id, or a list [2, 0,
0, 4] (identical to {0: 2, 3: 4}) in which the list index is served as the irrep Id.
Kwargs:
cas_irrep_ncore [list or dict] Number of closed shells for each irrep. It can be a dict, eg {‘A1’: 6, ‘B2’:
4} to indicate the closed shells based on irrep names, or {0: 6, 3: 4} for irrep Id, or a list [6, 0, 0, 4]
(identical to {0: 6, 3: 4}) in which the list index is served as the irrep Id. If cas_irrep_ncore is not
given, the program will generate a guess based on the lowest CASCI.ncore orbitals.
s [ndarray] overlap matrix
Returns: sorted orbitals, ordered as [c,..,c,a,..,a,v,..,v]
Examples:
>>> from pyscf import gto, scf, mcscf
>>> mol = gto.M(atom='N 0 0 0; N 0 0 1', basis='ccpvtz', symmetry=True, verbose=0)
>>> mf = scf.RHF(mol)
>>> mf.kernel()
>>> mc = mcscf.CASSCF(mf, 12, 4)
>>> mo = mc.sort_mo_by_irrep({'E1gx':4, 'E1gy':4, 'E1ux':2, 'E1uy':2})
>>> # Same to mo = sort_mo_by_irrep(mc, mf.mo_coeff, {2: 4, 3: 4, 6: 2, 7: 2})
>>> # Same to mo = sort_mo_by_irrep(mc, mf.mo_coeff, [0, 0, 4, 4, 0, 0, 2, 2])
>>> mc.kernel(mo)[0]
-108.162863845084

pyscf.mcscf.addons.spin_square(casscf, mo_coeff=None, ci=None, ovlp=None)
Spin square of the UHF-CASSCF wavefunction
Returns: A list of two floats. The first is the expectation value of S^2. The second is the corresponding 2S+1
Examples:

1.8. mcscf — Multi-configurational self-consistent field

165

PySCF Documentation, Release 1.4.0

>>>
>>>
>>>
>>>
>>>
>>>
>>>
S^2

from pyscf import gto, scf, mcscf
mol = gto.M(atom='O 0 0 0; O 0 0 1', basis='sto-3g', spin=2, verbose=0)
mf = scf.UHF(mol)
res = mf.scf()
mc = mcscf.CASSCF(mf, 4, 6)
res = mc.kernel()
print('S^2 = %.7f, 2S+1 = %.7f' % mcscf.spin_square(mc))
= 3.9831589, 2S+1 = 4.1149284

pyscf.mcscf.addons.state_average(casscf, weights=(0.5, 0.5))
State average over the energy. The energy funcitonal is E = w1 + w2 + ...
Note we may need change the FCI solver to
mc.fcisolver = fci.solver(mol, False)
before calling state_average_(mc), to mix the singlet and triplet states
pyscf.mcscf.addons.state_average_(casscf, weights=(0.5, 0.5))
State average over the energy. The energy funcitonal is E = w1 + w2 + ...
Note we may need change the FCI solver to
mc.fcisolver = fci.solver(mol, False)
before calling state_average_(mc), to mix the singlet and triplet states
pyscf.mcscf.addons.state_average_mix(casscf, fcisolvers, weights=(0.5, 0.5))
State-average CASSCF over multiple FCI solvers.
pyscf.mcscf.addons.state_average_mix_(casscf, fcisolvers, weights=(0.5, 0.5))
State-average CASSCF over multiple FCI solvers.
pyscf.mcscf.addons.state_specific(casscf, state=1)
For excited state
Kwargs: state : int 0 for ground state; 1 for first excited state.
pyscf.mcscf.addons.state_specific_(casscf, state=1)
For excited state
Kwargs: state : int 0 for ground state; 1 for first excited state.

1.9 fci — Full configuration interaction
Different FCI solvers are implemented to support different type of symmetry. Symmetry
File Point group Spin singlet Real hermitian* Alpha/beta degeneracy direct_spin0_symm Yes Yes Yes Yes direct_spin1_symm Yes No Yes Yes direct_spin0 No Yes Yes Yes direct_spin1 No No Yes Yes direct_uhf No No Yes
No direct_nosym No No No** Yes
• Real hermitian Hamiltonian implies (ij|kl) = (ji|kl) = (ij|lk) = (ji|lk)
** Hamiltonian is real but not hermitian, (ij|kl) != (ji|kl) ...

1.9.1 direct CI
Full CI solver for spin-free Hamiltonian. This solver can be used to compute doublet, triplet,...

166

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

The CI wfn are stored as a 2D array [alpha,beta], where each row corresponds to an alpha string. For each row (alpha
string), there are total-num-beta-strings of columns. Each column corresponds to a beta string.
Different FCI solvers are implemented to support different type of symmetry. Symmetry
File Point group Spin singlet Real hermitian* Alpha/beta degeneracy direct_spin0_symm Yes Yes Yes Yes direct_spin1_symm Yes No Yes Yes direct_spin0 No Yes Yes Yes direct_spin1 No No Yes Yes direct_uhf No No Yes
No direct_nosym No No No** Yes
• Real hermitian Hamiltonian implies (ij|kl) = (ji|kl) = (ij|lk) = (ji|lk)
** Hamiltonian is real but not hermitian, (ij|kl) != (ji|kl) ...
pyscf.fci.direct_spin1.FCI
alias of FCISolver
class pyscf.fci.direct_spin1.FCISolver(mol=None)
Full CI solver
Attributes:
verbose [int] Print level. Default value equals to Mole.verbose.
max_cycle [int] Total number of iterations. Default is 100
max_space [tuple of int] Davidson iteration space size. Default is 14.
conv_tol [float] Energy convergence tolerance. Default is 1e-10.
level_shift [float] Level shift applied in the preconditioner to avoid singularity. Default is 1e-3
davidson_only [bool] By default, the entire Hamiltonian matrix will be constructed and diagonalized
if the system is small (see attribute pspace_size). Setting this parameter to True will enforce the
eigenvalue problems being solved by Davidson subspace algorithm. This flag should be enabled
when initial guess is given or particular spin symmetry or point-group symmetry is required because
the initial guess or symmetry are completely ignored in the direct diagonlization.
pspace_size [int] The dimension of Hamiltonian matrix over which Davidson iteration algorithm will be
used for the eigenvalue problem. Default is 400. This is roughly corresponding to a (6e,6o) system.
nroots [int] Number of states to be solved. Default is 1, the ground state.
spin [int or None] Spin (2S = nalpha-nbeta) of the system. If this attribute is None, spin will be determined by the argument nelec (number of electrons) of the kernel function.
wfnsym [str or int] Symmetry of wavefunction.
rect_spin0_symm solver.

It is used only in direct_spin1_symm and di-

Saved results
converged [bool] Whether davidson iteration is converged
Examples:
>>> from pyscf import gto, scf, ao2mo, fci
>>> mol = gto.M(atom='Li 0 0 0; Li 0 0 1', basis='sto-3g')
>>> mf = scf.RHF(mol).run()
>>> h1 = mf.mo_coeff.T.dot(mf.get_hcore()).dot(mf.mo_coeff)
>>> eri = ao2mo.kernel(mol, mf.mo_coeff)
>>> cisolver = fci.direct_spin1.FCI(mol)
>>> e, ci = cisolver.kernel(h1, eri, h1.shape[1], mol.nelec, ecore=mol.energy_
˓→nuc())
>>> print(e)
-14.4197890826

1.9. fci — Full configuration interaction

167

PySCF Documentation, Release 1.4.0

absorb_h1e(h1e, eri, norb, nelec, fac=1)
Modify 2e Hamiltonian to include 1e Hamiltonian contribution.
contract_1e(f1e, fcivec, norb, nelec, link_index=None, **kwargs)
Contract the 1-electron Hamiltonian with a FCI vector to get a new FCI vector.
contract_2e(eri, fcivec, norb, nelec, link_index=None, **kwargs)
Contract the 2-electron Hamiltonian with a FCI vector to get a new FCI vector.
Note the input arg eri is NOT the 2e hamiltonian matrix, the 2e hamiltonian is
ℎ2𝑒 = 𝑒𝑟𝑖𝑝𝑞,𝑟𝑠 𝑝+ 𝑞𝑟+ 𝑠
= (𝑝𝑞|𝑟𝑠)𝑝+ 𝑟+ 𝑠𝑞 − (𝑝𝑞|𝑟𝑠)𝛿𝑞𝑟 𝑝+ 𝑠
So eri is defined as
𝑒𝑟𝑖𝑝𝑞,𝑟𝑠 = (𝑝𝑞|𝑟𝑠) − (1/𝑁 𝑒𝑙𝑒𝑐)

∑︁
(𝑝𝑞|𝑞𝑠)
𝑞

to restore the symmetry between pq and rs,
∑︁
∑︁
𝑒𝑟𝑖𝑝𝑞,𝑟𝑠 = (𝑝𝑞|𝑟𝑠) − (.5/𝑁 𝑒𝑙𝑒𝑐)[ (𝑝𝑞|𝑞𝑠) +
(𝑝𝑞|𝑟𝑝)]
𝑞

𝑝

See also direct_spin1.absorb_h1e()
energy(h1e, eri, fcivec, norb, nelec, link_index=None)
Compute the FCI electronic energy for given Hamiltonian and FCI vector.
get_init_guess(norb, nelec, nroots, hdiag)
Initial guess is the single Slater determinant
make_hdiag(h1e, eri, norb, nelec)
Diagonal Hamiltonian for Davidson preconditioner
make_rdm1(fcivec, norb, nelec, link_index=None)
spin-traced 1-particle density matrix
make_rdm12(fcivec, norb, nelec, link_index=None, reorder=True)
Spin traced 1- and 2-particle density matrices,
NOTE the 2pdm is ⟨𝑝† 𝑞 † 𝑠𝑟⟩ but is stored as [p,r,q,s]
make_rdm12s(fcivec, norb, nelec, link_index=None, reorder=True)
Spin searated 1- and 2-particle density matrices, (alpha,beta) for 1-particle density matrices. (alpha,alpha,alpha,alpha), (alpha,alpha,beta,beta), (beta,beta,beta,beta) for 2-particle density matrices.
NOTE the 2pdm is ⟨𝑝† 𝑞 † 𝑠𝑟⟩ but is stored as [p,r,q,s]
make_rdm1s(fcivec, norb, nelec, link_index=None)
Spin searated 1-particle density matrices, (alpha,beta)
make_rdm2(fcivec, norb, nelec, link_index=None, reorder=True)
Spin traced 2-particle density matrice
NOTE the 2pdm is ⟨𝑝† 𝑞 † 𝑠𝑟⟩ but stored as [p,r,q,s]
pspace(h1e, eri, norb, nelec, hdiag=None, np=400)
pspace Hamiltonian to improve Davidson preconditioner. See, CPL, 169, 463
spin_square(fcivec, norb, nelec)
Spin square for RHF-FCI CI wfn only (obtained from spin-degenerated Hamiltonian)

168

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

trans_rdm1(cibra, ciket, norb, nelec, link_index=None)
Spin traced transition 1-particle density matrices
trans_rdm12(cibra, ciket, norb, nelec, link_index=None, reorder=True)
Spin traced transition 1- and 2-particle density matrices.
trans_rdm12s(cibra, ciket, norb, nelec, link_index=None, reorder=True)
Spin separated transition 1- and 2-particle density matrices.
trans_rdm1s(cibra, ciket, norb, nelec, link_index=None)
Spin separated transition 1-particle density matrices
pyscf.fci.direct_spin1.absorb_h1e(h1e, eri, norb, nelec, fac=1)
Modify 2e Hamiltonian to include 1e Hamiltonian contribution.
pyscf.fci.direct_spin1.contract_1e(f1e, fcivec, norb, nelec, link_index=None)
Contract the 1-electron Hamiltonian with a FCI vector to get a new FCI vector.
pyscf.fci.direct_spin1.contract_2e(eri, fcivec, norb, nelec, link_index=None)
Contract the 2-electron Hamiltonian with a FCI vector to get a new FCI vector.
Note the input arg eri is NOT the 2e hamiltonian matrix, the 2e hamiltonian is
ℎ2𝑒 = 𝑒𝑟𝑖𝑝𝑞,𝑟𝑠 𝑝+ 𝑞𝑟+ 𝑠
= (𝑝𝑞|𝑟𝑠)𝑝+ 𝑟+ 𝑠𝑞 − (𝑝𝑞|𝑟𝑠)𝛿𝑞𝑟 𝑝+ 𝑠
So eri is defined as
𝑒𝑟𝑖𝑝𝑞,𝑟𝑠 = (𝑝𝑞|𝑟𝑠) − (1/𝑁 𝑒𝑙𝑒𝑐)

∑︁
(𝑝𝑞|𝑞𝑠)
𝑞

to restore the symmetry between pq and rs,
∑︁
∑︁
𝑒𝑟𝑖𝑝𝑞,𝑟𝑠 = (𝑝𝑞|𝑟𝑠) − (.5/𝑁 𝑒𝑙𝑒𝑐)[ (𝑝𝑞|𝑞𝑠) +
(𝑝𝑞|𝑟𝑝)]
𝑞

𝑝

See also direct_spin1.absorb_h1e()
pyscf.fci.direct_spin1.energy(h1e, eri, fcivec, norb, nelec, link_index=None)
Compute the FCI electronic energy for given Hamiltonian and FCI vector.
pyscf.fci.direct_spin1.get_init_guess(norb, nelec, nroots, hdiag)
Initial guess is the single Slater determinant
pyscf.fci.direct_spin1.make_hdiag(h1e, eri, norb, nelec)
Diagonal Hamiltonian for Davidson preconditioner
pyscf.fci.direct_spin1.make_rdm1(fcivec, norb, nelec, link_index=None)
spin-traced 1-particle density matrix
pyscf.fci.direct_spin1.make_rdm12(fcivec, norb, nelec, link_index=None, reorder=True)
Spin traced 1- and 2-particle density matrices,
NOTE the 2pdm is ⟨𝑝† 𝑞 † 𝑠𝑟⟩ but is stored as [p,r,q,s]
pyscf.fci.direct_spin1.make_rdm12s(fcivec, norb, nelec, link_index=None, reorder=True)
Spin searated 1- and 2-particle density matrices, (alpha,beta) for 1-particle density matrices.
pha,alpha,alpha,alpha), (alpha,alpha,beta,beta), (beta,beta,beta,beta) for 2-particle density matrices.

(al-

NOTE the 2pdm is ⟨𝑝† 𝑞 † 𝑠𝑟⟩ but is stored as [p,r,q,s]
pyscf.fci.direct_spin1.make_rdm1s(fcivec, norb, nelec, link_index=None)
Spin searated 1-particle density matrices, (alpha,beta)

1.9. fci — Full configuration interaction

169

PySCF Documentation, Release 1.4.0

pyscf.fci.direct_spin1.pspace(h1e, eri, norb, nelec, hdiag=None, np=400)
pspace Hamiltonian to improve Davidson preconditioner. See, CPL, 169, 463
pyscf.fci.direct_spin1.trans_rdm1(cibra, ciket, norb, nelec, link_index=None)
Spin traced transition 1-particle density matrices
pyscf.fci.direct_spin1.trans_rdm12(cibra, ciket, norb, nelec, link_index=None, reorder=True)
Spin traced transition 1- and 2-particle density matrices.
pyscf.fci.direct_spin1.trans_rdm12s(cibra, ciket,
order=True)
Spin separated transition 1- and 2-particle density matrices.

norb,

nelec,

link_index=None,

re-

pyscf.fci.direct_spin1.trans_rdm1s(cibra, ciket, norb, nelec, link_index=None)
Spin separated transition 1-particle density matrices
Different FCI solvers are implemented to support different type of symmetry. Symmetry
File Point group Spin singlet Real hermitian* Alpha/beta degeneracy direct_spin0_symm Yes Yes Yes Yes direct_spin1_symm Yes No Yes Yes direct_spin0 No Yes Yes Yes direct_spin1 No No Yes Yes direct_uhf No No Yes
No direct_nosym No No No** Yes
• Real hermitian Hamiltonian implies (ij|kl) = (ji|kl) = (ij|lk) = (ji|lk)
** Hamiltonian is real but not hermitian, (ij|kl) != (ji|kl) ... FCI solver for Singlet state
Different FCI solvers are implemented to support different type of symmetry. Symmetry
File Point group Spin singlet Real hermitian* Alpha/beta degeneracy direct_spin0_symm Yes Yes Yes Yes direct_spin1_symm Yes No Yes Yes direct_spin0 No Yes Yes Yes direct_spin1 No No Yes Yes direct_uhf No No Yes
No direct_nosym No No No** Yes
• Real hermitian Hamiltonian implies (ij|kl) = (ji|kl) = (ij|lk) = (ji|lk)
** Hamiltonian is real but not hermitian, (ij|kl) != (ji|kl) ...
pyscf.fci.direct_spin0.contract_1e(f1e, fcivec, norb, nelec, link_index=None)
Contract the 1-electron Hamiltonian with a FCI vector to get a new FCI vector.
pyscf.fci.direct_spin0.contract_2e(eri, fcivec, norb, nelec, link_index=None)
Contract the 2-electron Hamiltonian with a FCI vector to get a new FCI vector.
Note the input arg eri is NOT the 2e hamiltonian matrix, the 2e hamiltonian is
ℎ2𝑒 = 𝑒𝑟𝑖𝑝𝑞,𝑟𝑠 𝑝+ 𝑞𝑟+ 𝑠
= (𝑝𝑞|𝑟𝑠)𝑝+ 𝑟+ 𝑠𝑞 − (𝑝𝑞|𝑟𝑠)𝛿𝑞𝑟 𝑝+ 𝑠
So eri is defined as
𝑒𝑟𝑖𝑝𝑞,𝑟𝑠 = (𝑝𝑞|𝑟𝑠) − (1/𝑁 𝑒𝑙𝑒𝑐)

∑︁
(𝑝𝑞|𝑞𝑠)
𝑞

to restore the symmetry between pq and rs,
∑︁
∑︁
𝑒𝑟𝑖𝑝𝑞,𝑟𝑠 = (𝑝𝑞|𝑟𝑠) − (.5/𝑁 𝑒𝑙𝑒𝑐)[ (𝑝𝑞|𝑞𝑠) +
(𝑝𝑞|𝑟𝑝)]
𝑞

𝑝

See also direct_spin1.absorb_h1e()
pyscf.fci.direct_spin0.make_hdiag(h1e, eri, norb, nelec)
Diagonal Hamiltonian for Davidson preconditioner
pyscf.fci.direct_spin0.make_rdm1(fcivec, norb, nelec, link_index=None)
spin-traced 1-particle density matrix
170

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

pyscf.fci.direct_spin0.make_rdm12(fcivec, norb, nelec, link_index=None, reorder=True)
Spin traced 1- and 2-particle density matrices,
NOTE the 2pdm is ⟨𝑝† 𝑞 † 𝑠𝑟⟩ but is stored as [p,r,q,s]
pyscf.fci.direct_spin0.make_rdm1s(fcivec, norb, nelec, link_index=None)
Spin searated 1-particle density matrices, (alpha,beta)
pyscf.fci.direct_spin0.trans_rdm1(cibra, ciket, norb, nelec, link_index=None)
Spin traced transition 1-particle density matrices
pyscf.fci.direct_spin0.trans_rdm12(cibra, ciket, norb, nelec, link_index=None, reorder=True)
Spin traced transition 1- and 2-particle density matrices.
pyscf.fci.direct_spin0.trans_rdm1s(cibra, ciket, norb, nelec, link_index=None)
Spin separated transition 1-particle density matrices
Different FCI solvers are implemented to support different type of symmetry. Symmetry
File Point group Spin singlet Real hermitian* Alpha/beta degeneracy direct_spin0_symm Yes Yes Yes Yes direct_spin1_symm Yes No Yes Yes direct_spin0 No Yes Yes Yes direct_spin1 No No Yes Yes direct_uhf No No Yes
No direct_nosym No No No** Yes
• Real hermitian Hamiltonian implies (ij|kl) = (ji|kl) = (ij|lk) = (ji|lk)
** Hamiltonian is real but not hermitian, (ij|kl) != (ji|kl) ...
Different FCI solvers are implemented to support different type of symmetry. Symmetry
File Point group Spin singlet Real hermitian* Alpha/beta degeneracy direct_spin0_symm Yes Yes Yes Yes direct_spin1_symm Yes No Yes Yes direct_spin0 No Yes Yes Yes direct_spin1 No No Yes Yes direct_uhf No No Yes
No direct_nosym No No No** Yes
• Real hermitian Hamiltonian implies (ij|kl) = (ji|kl) = (ij|lk) = (ji|lk)
** Hamiltonian is real but not hermitian, (ij|kl) != (ji|kl) ...

1.9.2 cistring
pyscf.fci.cistring.addr2str(norb, nelec, addr)
Convert CI determinant address to string
pyscf.fci.cistring.addrs2str(norb, nelec, addrs)
Convert a list of CI determinant address to string
pyscf.fci.cistring.gen_cre_str_index(orb_list, nelec)
linkstr_index to map between N electron string to N+1 electron string. It maps the given string to the address of
the string which is generated by the creation operator.
For given string str0, index[str0] is nvir x 4 array. Each entry [i(cre),–,str1,sign] means starting from str0,
creating i, to get str1.
pyscf.fci.cistring.gen_des_str_index(orb_list, nelec)
linkstr_index to map between N electron string to N-1 electron string. It maps the given string to the address of
the string which is generated by the annihilation operator.
For given string str0, index[str0] is nvir x 4 array. Each entry [–,i(des),str1,sign] means starting from str0,
annihilating i, to get str1.
pyscf.fci.cistring.gen_linkstr_index(orb_list, nocc, strs=None, tril=False)
Look up table, for the strings relationship in terms of a creation-annihilating operator pair.

1.9. fci — Full configuration interaction

171

PySCF Documentation, Release 1.4.0

For given string str0, index[str0] is (nocc+nocc*nvir) x 4 array. The first nocc rows [i(:occ),i(:occ),str0,sign]
are occupied-occupied excitations, which do not change the string.
The next nocc*nvir rows
[a(:vir),i(:occ),str1,sign] are occupied-virtual exciations, starting from str0, annihilating i, creating a, to get
str1.
pyscf.fci.cistring.gen_linkstr_index_trilidx(orb_list, nocc, strs=None)
Generate linkstr_index with the assumption that 𝑝+ 𝑞|0⟩ where 𝑝
>
𝑞.
So the resultant link_index has the structure [pq,*,str1,sign].
It is identical to a call to
reform_linkstr_index(gen_linkstr_index(...)).
pyscf.fci.cistring.gen_strings4orblist(orb_list, nelec)
Generate string from the given orbital list.
Returns: list of int64. One int64 element represents one string in binary format. The binary format takes the
convention that the one bit stands for one orbital, bit-1 means occupied and bit-0 means unoccupied. The
lowest (right-most) bit corresponds to the lowest orbital in the orb_list.
Exampels:
>>> [bin(x) for x in gen_strings4orblist((0,1,2,3),2)]
[0b11, 0b101, 0b110, 0b1001, 0b1010, 0b1100]
>>> [bin(x) for x in gen_strings4orblist((3,1,0,2),2)]
[0b1010, 0b1001, 0b11, 0b1100, 0b110, 0b101]

pyscf.fci.cistring.reform_linkstr_index(link_index)
Compress the (a, i) pair index in linkstr_index to a lower triangular index, to match the 4-fold symmetry of
integrals.
pyscf.fci.cistring.str2addr(norb, nelec, string)
Convert string to CI determinant address
pyscf.fci.cistring.strs2addr(norb, nelec, strings)
Convert a list of string to CI determinant address
pyscf.fci.cistring.tn_strs(norb, nelec, n)
Generate strings for Tn amplitudes. Eg n=1 (T1) has nvir*nocc strings, n=2 (T2) has nvir*(nvir-1)/2 *
nocc*(nocc-1)/2 strings.

1.9.3 spin operator
pyscf.fci.spin_op.contract_ss(fcivec, norb, nelec)
Contract spin square operator with FCI wavefunction 𝑆 2 |𝐶𝐼 >
pyscf.fci.spin_op.local_spin(fcivec, norb, nelec, mo_coeff=None, ovlp=1, aolst=[])
Local spin expectation value, which is defined as

For a complete list of AOs, I = sum |ao>
pyscf.fci.spin_op.spin_square(fcivec, norb, nelec, mo_coeff=None, ovlp=1)
General spin square operator.
... math:
 &= n_\alpha + \delta_{ik}\delta_{jl}Gamma_{i\alpha k\beta ,j\beta
˓→l\alpha } \\
 &= n_\beta + \delta_{ik}\delta_{jl}Gamma_{i\beta k\alpha ,j\alpha
˓→l\beta } \\
 &= \delta_{ik}\delta_{jl}(Gamma_{i\alpha k\alpha ,j\alpha l\alpha
˓→}

172

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

+
+

Gamma_{i\alpha k\alpha ,j\beta l\beta }
Gamma_{i\beta k\beta ,j\alpha l\alpha}
Gamma_{i\beta k\beta ,j\beta l\beta})
(n_\alpha+n_\beta)/4

Given the overlap betwen non-degenerate alpha and beta orbitals, this function can compute the expectation
value spin square operator for UHF-FCI wavefunction
pyscf.fci.spin_op.spin_square0(fcivec, norb, nelec)
Spin square for RHF-FCI CI wfn only (obtained from spin-degenerated Hamiltonian)

1.9.4 rdm
FCI 1, 2, 3, 4-particle density matrices.
pyscf.fci.rdm.make_dm123(fname, cibra, ciket, norb, nelec)
Spin traced 1, 2 and 3-particle density matrices.
Note: In this function, 2pdm is ⟨𝑝† 𝑞𝑟† 𝑠⟩; 3pdm is ⟨𝑝† 𝑞𝑟† 𝑠𝑡† 𝑢⟩. After calling reorder_dm123, the 2pdm and
3pdm are transformed to standard definition: 2pdm = ⟨𝑝† 𝑞 † 𝑟𝑠⟩ but is stored as [p,s,q,r]; 3pdm = ⟨𝑝† 𝑞 † 𝑟† 𝑠𝑡𝑢⟩,
stored as [p,u,q,t,r,s].
pyscf.fci.rdm.make_dm1234(fname, cibra, ciket, norb, nelec)
Spin traced 1, 2, 3 and 4-particle density matrices.
Note: In this function, 2pdm is ⟨𝑝† 𝑞𝑟† 𝑠⟩; 3pdm is ⟨𝑝† 𝑞𝑟† 𝑠𝑡† 𝑢⟩; 4pdm is ⟨𝑝† 𝑞𝑟† 𝑠𝑡† 𝑢𝑣 † 𝑤⟩. After calling
reorder_dm1234, the 2pdm and 3pdm and 4pdm are transformed to standard definition: 2pdm = ⟨𝑝† 𝑞 † 𝑠𝑟⟩ but
is stored as [p,r,q,s]; 3pdm = ⟨𝑝† 𝑞 † 𝑟† 𝑢𝑡𝑠⟩, stored as [p,s,q,t,r,u]; 4pdm = ⟨𝑝† 𝑞 † 𝑟† 𝑠𝑑 𝑎𝑔𝑔𝑒𝑟𝑤𝑣𝑢𝑡⟩, stored as
[p,t,q,u,r,v,s,w].

1.9.5 addons
pyscf.fci.addons.cre_a(ci0, norb, neleca_nelecb, ap_id)
Construct (N+1)-electron wavefunction by adding an alpha electron in the N-electron wavefunction.
... math:
|N+1\rangle = \hat{a}^+_p |N\rangle

Args:
ci0 [2D array] CI coefficients, row for alpha strings and column for beta strings.
norb [int] Number of orbitals.
(neleca,nelecb) [(int,int)] Number of (alpha, beta) electrons of the input CI function
ap_id [int] Orbital index (0-based), for the creation operator
Returns: 2D array, row for alpha strings and column for beta strings. Note it has different number of rows to
the input CI coefficients.

1.9. fci — Full configuration interaction

173

PySCF Documentation, Release 1.4.0

pyscf.fci.addons.cre_b(ci0, norb, neleca_nelecb, ap_id)
Construct (N+1)-electron wavefunction by adding a beta electron in the N-electron wavefunction.
Args:
ci0 [2D array] CI coefficients, row for alpha strings and column for beta strings.
norb [int] Number of orbitals.
(neleca,nelecb) [(int,int)] Number of (alpha, beta) electrons of the input CI function
ap_id [int] Orbital index (0-based), for the creation operator
Returns: 2D array, row for alpha strings and column for beta strings. Note it has different number of columns
to the input CI coefficients.
pyscf.fci.addons.des_a(ci0, norb, neleca_nelecb, ap_id)
Construct (N-1)-electron wavefunction by removing an alpha electron from the N-electron wavefunction.
... math:
|N-1\rangle = \hat{a}_p |N\rangle

Args:
ci0 [2D array] CI coefficients, row for alpha strings and column for beta strings.
norb [int] Number of orbitals.
(neleca,nelecb) [(int,int)] Number of (alpha, beta) electrons of the input CI function
ap_id [int] Orbital index (0-based), for the annihilation operator
Returns: 2D array, row for alpha strings and column for beta strings. Note it has different number of rows to
the input CI coefficients
pyscf.fci.addons.des_b(ci0, norb, neleca_nelecb, ap_id)
Construct (N-1)-electron wavefunction by removing a beta electron from N-electron wavefunction.
Args:
ci0 [2D array] CI coefficients, row for alpha strings and column for beta strings.
norb [int] Number of orbitals.
(neleca,nelecb) [(int,int)] Number of (alpha, beta) electrons of the input CI function
ap_id [int] Orbital index (0-based), for the annihilation operator
Returns: 2D array, row for alpha strings and column for beta strings. Note it has different number of columns
to the input CI coefficients.
pyscf.fci.addons.det_overlap(string1, string2, norb, s=None)
Determinants overlap on non-orthogonal one-particle basis
pyscf.fci.addons.energy(h1e, eri, fcivec, norb, nelec, link_index=None)
Compute the FCI electronic energy for given Hamiltonian and FCI vector.
pyscf.fci.addons.fix_spin_(fciobj, shift=0.2, ss=None, **kwargs)
If FCI solver cannot stick on spin eigenfunction, modify the solver by adding a shift on spin square operator
(𝐻 + 𝑠ℎ𝑖𝑓 𝑡 * 𝑆 2 )|Ψ⟩ = 𝐸|Ψ⟩
Args: fciobj : An instance of FCISolver

174

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

Kwargs:
shift [float] Level shift for states which have different spin
ss [number] S^2 expection value == s*(s+1)
Returns A modified FCI object based on fciobj.
pyscf.fci.addons.guess_wfnsym(ci, norb, nelec, orbsym)
Guess the wavefunction symmetry based on the non-zero elements in the given CI coefficients.
Args:
ci [2D array] CI coefficients, row for alpha strings and column for beta strings.
norb [int] Number of orbitals.
nelec [int or 2-item list] Number of electrons, or 2-item list for (alpha, beta) electrons
orbsym [list of int] The irrep ID for each orbital.
Returns: Irrep ID
pyscf.fci.addons.initguess_triplet(norb, nelec, binstring)
Generate a triplet initial guess for FCI solver
pyscf.fci.addons.large_ci(ci, norb, nelec, tol=0.1, return_strs=True)
Search for the largest CI coefficients
pyscf.fci.addons.overlap(bra, ket, norb, nelec, s=None)
Overlap between two CI wavefunctions
Args:
s [2D array or a list of 2D array] The overlap matrix of non-orthogonal one-particle basis
pyscf.fci.addons.reorder(ci, nelec, orbidxa, orbidxb=None)
Reorder the CI coefficients, to adapt the reordered orbitals (The relation of the reordered orbitals and original
orbitals is new = old[idx]). Eg.
The orbital ordering indices orbidx = [2,0,1] indicates the map old orbital a b c -> new orbital c a b. The
strings are reordered as old-strings 0b011, 0b101, 0b110 == (1,2), (1,3), (2,3) <= apply orbidx to get orb-strings
orb-strings (3,1), (3,2), (1,2) == 0B101, 0B110, 0B011 <= by gen_strings4orblist then argsort to translate the
string representation to the address [2(=0B011), 0(=0B101), 1(=0B110)]
pyscf.fci.addons.symm_initguess(norb, nelec, orbsym, wfnsym=0, irrep_nelec=None)
Generate CI wavefunction initial guess which has the given symmetry.
Args:
norb [int] Number of orbitals.
nelec [int or 2-item list] Number of electrons, or 2-item list for (alpha, beta) electrons
orbsym [list of int] The irrep ID for each orbital.
Kwags:
wfnsym [int] The irrep ID of target symmetry
irrep_nelec [dict] Freeze occupancy for certain irreps
Returns: CI coefficients 2D array which has the target symmetry.
pyscf.fci.addons.symmetrize_wfn(ci, norb, nelec, orbsym, wfnsym=0)
Symmetrize the CI wavefunction by zeroing out the determinants which do not have the right symmetry.
Args:

1.9. fci — Full configuration interaction

175

PySCF Documentation, Release 1.4.0

ci [2D array] CI coefficients, row for alpha strings and column for beta strings.
norb [int] Number of orbitals.
nelec [int or 2-item list] Number of electrons, or 2-item list for (alpha, beta) electrons
orbsym [list of int] The irrep ID for each orbital.
Kwags:
wfnsym [int] The irrep ID of target symmetry
Returns: 2D array which is the symmetrized CI coefficients
pyscf.fci.addons.transform_ci_for_orbital_rotation(ci, norb, nelec, u)
Transform CI coefficients to the representation in new one-particle basis. Solving CI problem for Hamiltonian
h1, h2 defined in old basis, CI_old = fci.kernel(h1, h2, ...) Given orbital rotation u, the CI problem can be either
solved by transforming the Hamiltonian, or transforming the coefficients. CI_new = fci.kernel(u^T*h1*u, ...) =
transform_ci_for_orbital_rotation(CI_old, u)
Args:
u [2D array or a list of 2D array] the orbital rotation to transform the old one-particle basis to new oneparticle basis

1.10 symm – Point group symmetry and spin symmetry
This module offers the functions to detect point group symmetry, basis symmetriziation, Clebsch-Gordon coefficients.
This module works as a plugin of PySCF package. Symmetry is not hard coded in each method.
PySCF supports D2h symmetry and linear molecule symmetry (Dooh and Coov). For D2h, the direct production of
representations are
D2h
A1g
B1g
B2g
B3g
A1u
B1u
B2u
B3u

A1g
A1g
B1g
B2g
B3g
A1u
B1u
B2u
B3u

B1g

B2g

B3g

A1u

B1u

B2u

B3u

A1g
B3g
B2g
B1u
A1u
B3u
B2u

A1g
B1g
B2u
B3u
A1u
B1u

A1g
B3u
B2u
B1u
A1u

A1g
B1g
B2g
B3g

A1g
B3g
B2g

A1g
B1g

A1g

The multiplication table for XOR operator is
XOR
000
001
010
011
100
101
110
111

000
000
001
010
011
100
101
110
111

001

010

011

100

101

110

111

000
011
010
101
100
111
110

000
001
110
111
100
101

000
111
110
101
100

000
001
010
011

000
011
010

000
001

000

Comparing the two table, we notice that the two tables can be changed to each other with the mapping

176

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

D2h
A1g
B1g
B2g
B3g
A1u
B1u
B2u
B3u

XOR
000
001
010
011
100
101
110
111

ID
0
1
2
3
4
5
6
7

The XOR operator and the D2h subgroups have the similar relationships. We therefore use the XOR operator ID to
assign the irreps (see pyscf/symm/param.py).
C2h
Ag
Bg
Au
Bu
Cs
A’
B”

XOR
00
01
10
11
XOR
0
1

ID
0
1
2
3
ID
0
1

C2v
A1
A2
B1
B2
Ci
Ag
Au

XOR
00
01
10
11
XOR
0
1

ID
0
1
2
3
ID
0
1

D2
A1
B1
B2
B3
C2
A
B

XOR
00
01
10
11
XOR
0
1

ID
0
1
2
3
ID
0
1

To easily get the relationship between the linear molecule symmetry and D2h/C2v, the ID for irreducible representations of linear molecule symmetry are chosen as (see pyscf/symm/basis.py)
𝐷∞ℎ
A1g
A2g
A1u
A2u
E1gx
E1gy
E1uy
E1ux
E2gx
E2gy
E2ux
E2uy
E3gx
E3gy
E3uy
E3ux
E4gx
E4gy
E4ux
E4uy
E5gx
E5gy
E5uy
E5ux

ID
0
1
5
4
2
3
6
7
10
11
15
14
12
13
16
17
20
21
25
24
22
23
26
27

𝐷2ℎ
Ag
B1g
B1u
Au
B2g
B3g
B2u
B3u
Ag
B1g
B1u
Au
B2g
B3g
B2u
B3u
Ag
B1g
B1u
Au
B2g
B3g
B2u
B3u

ID
0
1
5
4
2
3
6
7
0
1
5
4
2
3
6
7
0
1
5
4
2
3
6
7

and

1.10. symm – Point group symmetry and spin symmetry

177

PySCF Documentation, Release 1.4.0

𝐶∞𝑣
A1
A2
E1x
E1y
E2x
E2y
E3x
E3y
E4x
E4y
E5x
E5y

ID
0
1
2
3
10
11
12
13
20
21
22
23

𝐶2𝑣
A1
A2
B1
B2
A1
A2
B1
B2
A1
A2
B1
B2

ID
0
1
2
3
0
1
2
3
0
1
2
3

So that, the subduction from linear molecule symmetry to D2h/C2v can be achieved by the modular operation %10.
In many output messages, the irreducible representations are labeld with the IDs instead of the irreps’ symbols. We
can use symm.addons.irrep_id2name() to convert the ID to irreps’ symbol, e.g.:
>>> from pyscf import symm
>>> [symm.irrep_id2name('Dooh', x) for x in [7, 6, 0, 10, 11, 0, 5, 3, 2, 5, 15, 14]]
['E1ux', 'E1uy', 'A1g', 'E2gx', 'E2gy', 'A1g', 'A1u', 'E1gy', 'E1gx', 'A1u', 'E2ux',
˓→'E2uy']

1.10.1 Enabling symmetry in other module
• SCF
To control the HF determinant symmetry, one can assign occupancy for particular irreps, e.g.
#!/usr/bin/env python
#
# Author: Qiming Sun 
#
from pyscf import gto
from pyscf import scf
'''
Specify irrep_nelec to control the wave function symmetry
'''

mol = gto.Mole()
mol.build(
verbose = 0,
atom = '''
C
0.
0.
0.625
C
0.
0. -0.625 ''',
basis = 'cc-pVDZ',
spin = 0,
symmetry = True,
)
mf = scf.RHF(mol)
# Frozen occupancy

178

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

# 'A1g': 4 electrons
# 'E1gx': 2 electrons
# 'E1gy': 2 electrons
# Rest 4 electrons are put in irreps A1u, E1ux, E1uy ... based on Aufbau principle
mf.irrep_nelec = {'A1g': 4, 'E1gx': 2, 'E1gy': 2}
e = mf.kernel()
print('E = %.15g ref = -74.1112374269129' % e)

mol.symmetry = 'D2h'
mol.charge = 1
mol.spin = 1
mol.build(dump_input=False, parse_arg=False)
mf = scf.RHF(mol)
# Frozen occupancy
# 'Ag': 2 alpha, 1 beta electrons
# 'B1u': 4 electrons
# 'B2u': 2 electrons
# 'B3u': 2 electrons
mf.irrep_nelec = {'Ag': (2,1), 'B1u': 4, 'B2u': 2, 'B3u': 2,}
e = mf.kernel()
print('E = %.15g ref = -74.4026583773135' % e)
# Frozen occupancy
# 'Ag': 4 electrons
# 'B1u': 2 alpha, 1 beta electrons
# 'B2u': 2 electrons
# 'B3u': 2 electrons
mf.irrep_nelec = {'Ag': 4, 'B1u': (2,1), 'B2u': 2, 'B3u': 2,}
e = mf.kernel()
print('E = %.15g ref = -74.8971476600812' % e)

• FCI
FCI
wavefunction
symmetry
can
be
controlled
by
initial
guess.
fci.addons.symm_initguess() can generate the FCI initial guess with the right symmetry.

Function

• MCSCF
The symmetry of active space in the CASCI/CASSCF calculations can controlled
#!/usr/bin/env python
#
# Author: Qiming Sun 
#
'''
Active space can be adjusted by specifing the number of orbitals for each irrep.
'''
from pyscf import gto, scf, mcscf
mol = gto.Mole()
mol.build(
atom = 'N 0 0 0; N
basis = 'ccpvtz',
symmetry = True,
)

0

0

2',

1.10. symm – Point group symmetry and spin symmetry

179

PySCF Documentation, Release 1.4.0

myhf = scf.RHF(mol)
myhf.kernel()
mymc = mcscf.CASSCF(myhf, 8, 4)
mo = mcscf.sort_mo_by_irrep(mymc, myhf.mo_coeff,
{'E1gx':2, 'E1gy':2, 'E1ux':2, 'E1uy':2})
mymc.kernel(mo)

• MP2 and CCSD
Point group symmetry are not supported in CCSD, MP2.
Program reference

1.10.2 geom
pyscf.symm.geom.alias_axes(axes, ref )
Rename axes, make it as close as possible to the ref axes
pyscf.symm.geom.detect_symm(atoms, basis=None, verbose=2)
Detect the point group symmetry for given molecule.
Return group name, charge center, and nex_axis (three rows for x,y,z)
pyscf.symm.geom.rotation_mat(vec, theta)
rotate angle theta along vec new(x,y,z) = R * old(x,y,z)
pyscf.symm.geom.symm_identical_atoms(gpname, atoms)
Requires

1.10.3 basis
Generate symmetry adapted basis
pyscf.symm.basis.linearmole_symm_descent(gpname, irrepid)
Map irreps to D2h or C2v

1.10.4 addons
pyscf.symm.addons.eigh(h, orbsym)
Solve eigenvalue problem based on the symmetry information for basis. See also pyscf/lib/linalg_helper.py
eigh_by_blocks()
Examples:
>>> from pyscf import gto, symm
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1', basis='ccpvdz', symmetry=True)
>>> c = numpy.hstack(mol.symm_orb)
>>> vnuc_so = reduce(numpy.dot, (c.T, mol.intor('int1e_nuc_sph'), c))
>>> orbsym = symm.label_orb_symm(mol, mol.irrep_name, mol.symm_orb, c)
>>> symm.eigh(vnuc_so, orbsym)
(array([-4.50766885, -1.80666351, -1.7808565 , -1.7808565 , -1.74189134,
-0.98998583, -0.98998583, -0.40322226, -0.30242374, -0.07608981]),
...)

180

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

pyscf.symm.addons.irrep_id2name(gpname, irrep_id)
Convert the internal irrep ID to irrep symbol
Args:
gpname [str] The point group symbol
irrep_id [int] See IRREP_ID_TABLE in pyscf/symm/param.py
Returns: Irrep sybmol, str
pyscf.symm.addons.irrep_name2id(gpname, symb)
Convert the irrep symbol to internal irrep ID
Args:
gpname [str] The point group symbol
symb [str] Irrep symbol
Returns: Irrep ID, int
pyscf.symm.addons.label_orb_symm(mol, irrep_name, symm_orb, mo, s=None, check=True,
tol=1e-09)
Label the symmetry of given orbitals
irrep_name can be either the symbol or the ID of the irreducible representation. If the ID is provided, it returns
the numeric code associated with XOR operator, see symm.param.IRREP_ID_TABLE()
Args: mol : an instance of Mole
irrep_name [list of str or int] A list of irrep ID or name, it can be either mol.irrep_id or mol.irrep_name.
It can affect the return “label”.
symm_orb [list of 2d array] the symmetry adapted basis
mo [2d array] the orbitals to label
Returns: list of symbols or integers to represent the irreps for the given orbitals
Examples:
>>> from pyscf import gto, scf, symm
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1', basis='ccpvdz',verbose=0, symmetry=1)
>>> mf = scf.RHF(mol)
>>> mf.kernel()
>>> symm.label_orb_symm(mol, mol.irrep_name, mol.symm_orb, mf.mo_coeff)
['Ag', 'B1u', 'Ag', 'B1u', 'B2u', 'B3u', 'Ag', 'B2g', 'B3g', 'B1u']
>>> symm.label_orb_symm(mol, mol.irrep_id, mol.symm_orb, mf.mo_coeff)
[0, 5, 0, 5, 6, 7, 0, 2, 3, 5]

pyscf.symm.addons.route(target, nelec, orbsym)
Pick orbitals to form a determinant which has the right symmetry. If solution is not found, return []
pyscf.symm.addons.std_symb(gpname)
std_symb(‘d2h’) returns D2h; std_symb(‘D2H’) returns D2h
pyscf.symm.addons.symmetrize_orb(mol, mo, orbsym=None, s=None, check=False)
Symmetrize the given orbitals.
This function is different to the symmetrize_space(): In this function, each orbital is symmetrized by
removing non-symmetric components. symmetrize_space() symmetrizes the entire space by mixing different orbitals.
Note this function might return non-orthorgonal orbitals. Call symmetrize_space() to find the symmetrized orbitals that are close to the given orbitals.
1.10. symm – Point group symmetry and spin symmetry

181

PySCF Documentation, Release 1.4.0

Args:
mo [2D float array] The orbital space to symmetrize
Kwargs:
orbsym [integer list] Irrep id for each orbital.
label_orb_symm().

If not given, the irreps are guessed by calling

s [2D float array] Overlap matrix. If given, use this overlap than the the overlap of the input mol.
Returns: 2D orbital coefficients
Examples:
>>> from pyscf import gto, symm, scf
>>> mol = gto.M(atom = 'C 0 0 0; H 1 1 1; H -1 -1 1; H 1 -1 -1; H -1
˓→',
...
basis = 'sto3g')
>>> mf = scf.RHF(mol).run()
>>> mol.build(0, 0, symmetry='D2')
>>> mo = symm.symmetrize_orb(mol, mf.mo_coeff)
>>> print(symm.label_orb_symm(mol, mol.irrep_name, mol.symm_orb, mo))
['A', 'A', 'B1', 'B2', 'B3', 'A', 'B1', 'B2', 'B3']

1 -1

pyscf.symm.addons.symmetrize_space(mol, mo, s=None, check=True)
Symmetrize the given orbital space.
This function is different to the symmetrize_orb(): In this function, the given orbitals are mixed to reveal
the symmtery; symmetrize_orb() projects out non-symmetric components for each orbital.
Args:
mo [2D float array] The orbital space to symmetrize
Kwargs:
s [2D float array] Overlap matrix. If not given, overlap is computed with the input mol.
Returns: 2D orbital coefficients
Examples:
>>> from pyscf import gto, symm, scf
>>> mol = gto.M(atom = 'C 0 0 0; H 1 1 1; H -1 -1 1; H 1 -1 -1; H -1
˓→',
...
basis = 'sto3g')
>>> mf = scf.RHF(mol).run()
>>> mol.build(0, 0, symmetry='D2')
>>> mo = symm.symmetrize_space(mol, mf.mo_coeff)
>>> print(symm.label_orb_symm(mol, mol.irrep_name, mol.symm_orb, mo))
['A', 'A', 'A', 'B1', 'B1', 'B2', 'B2', 'B3', 'B3']

182

1 -1

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

1.10.5 Clebsch Gordon coefficients

1.11 df — Density fitting
1.11.1 Introduction
The df module provides the fundamental functions to handle the 3-index tensors required by the density fitting (DF)
method or the resolution of identity (RI) approximation. Specifically, it includes the functions to compute the 3-center
2-electron AO integrals, the DF/RI 3-index tensor in the form of Cholesky decomposed integral tensor ((𝑖𝑗|𝑘𝑙) =
𝑉𝑖𝑗,𝑥 𝑉𝑘𝑙,𝑥 ), the AO to MO integral transformation of the 3-index tensor, as well as the functions to generate the
density fitting basis.
The density_fit() method can utilize the DF method at SCF and MCSCF level:
from pyscf import gto, scf, mcscf
mol = gto.M(atom='N 0 0 0; N 0 0 1.2', basis='def2-tzvp')
mf = scf.RHF(mol).density_fit().run()
mc = mcscf.CASSCF(mf, 8, 10).density_fit().run()

Once the DF method is enabled at the SCF level, all the post-SCF methods will automatically enable the DF method,
for example:
from pyscf import gto, dft, tddft
mol = gto.M(atom='N 0 0 0; N 0 0 1.2', basis='def2-tzvp')
mf = dft.RKS(mol).density_fit().run()
td = tddft.TDA(mf).run()
print(td.e)

In PySCF, DF is implemented at different level of implementations for different methods. They are summarized in the
following table
Methods
HF/DFT
Generlized HF/DFT
Relativistic HF
TDDFT
RCCSD
UCCSD
RCCSD(T)
EOM-CCSD
RMP2
UMP2
PBC HF/DFT
PBC TDDFT
PBC Gamma-point CCSD
PBC k-points CCSD

Fake-ERI
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes

Native DF
Yes
No
Yes
Yes
Yes
No
No
No
No
No
Yes
Yes
Yes
No

Properties with DF

Fake-ERI means to mimic the 4-center 2-electron repulsion integrals (ERI) by precontracting the DF 3-index tensor.
This is the simplest way to enable DF integrals, although the fake-ERI mechanism may require huge amount of
memory also may be slow in performance. It provides the most convenient way to embed the DF integrals in the
existing code, thus it is supported by almost every method in PySCF. It is particularly important in the periodic code.
Using the fake-ERIs allows us to call all quantum chemistry methods developed at molecular level in the Γ-point
calculations without modifying any existing molecular code. See also the pbc.df — PBC denisty fitting module.
Some methods have native DF implementation. This means the performance of the DF technique has been considered

1.11. df — Density fitting

183

PySCF Documentation, Release 1.4.0

in the code. In these methods, DF approximation generally runs faster than the regular scheme without integral
approximation and also consumes less memory or disk space.
When density fitting is enabled in a method, a with_df object will be generated and attached to the method object.
with_df is the object to hold all DF relevant quantiles, such as the DF basis, the file to save the 3-index tensor, the
amount of memory to use etc. You can modify the attributes of with_df to get more control over the DF methods. In
the SCF and MCSCF methods, setting with_df to None will switch off the DF approximation. In the periodic code,
all two-electron integrals are evaluated by DF approximations. There are four different types of DF schemes (FFTDF,
AFTDF, GDF, MDF see pbc.df — PBC denisty fitting), available in the periodic code. By assigning different DF object
to with_df, different DF schemes can be applied in the PBC calculations.
DF auxiliary basis
The default auxiliary basis set are generated by function pyscf.df.addons.make_basis() based on the orbital
basis specified in the calculation according to the rules defined in pyscf.df.addons.DEFAULT_AUXBASIS.
Specifically, the jkfit basis in the first column is used for Hartree-Fock or DFT methods, and the ri basis in the second
column is used for correlation calculations. These optimized auxiliary basis sets are obtained from http://www.psicode.
org/psi4manual/master/basissets_byfamily.html If optimized auxiliary basis set was not found for the orbital basis set,
even-tempered Gaussian functions are generated automatically.
Specifying auxiliary basis is a common requirement in the real applications. For example, the default auxiliary basis
set for the pure DFT calculations may be over complete since it is designed to represent both the Coulomb and HF
exchange matrix. Coulomb fitting basis such as Weigend-cfit basis or Ahlrichs-cfit basis are often enough to obtain
chemical accuracy. To control the fitting basis in DF method, You can change the value of with_df.auxbasis
attribute. The input format of auxiliary fitting basis is exactly the same to the input format of orbital basis set. For
example:
from pyscf import gto, dft
mol = gto.M(atom='N 0 0 0; N 0 0 1.2', basis='def2-tzvp')
mf = dft.RKS(mol)
mf.xc = 'pbe,pbe'
mf.run() # -109.432313679876
mf = mf.density_fit()
mf.run() # -109.432329411505
mf.with_df.auxbasis = 'weigend'
mf.run() # -109.432334646584

More examples for inputing auxiliary
examples/df/01-auxbasis.py.

basis

in

the

DF

calculation

can

be

found

in

Even-tempered auxiliary Gaussian basis
The even-tempered auxiliary Gaussian basis is generated by function aug_etb():
from pyscf import gto, df
mol = gto.M(atom='N 0 0 0; N 0 0 1.2', basis='ccpvdz')
print(mol.nao_nr())
# 28
auxbasis = df.aug_etb(mol)
print(df.make_auxmol(mol, auxbasis).nao_nr()) # 200
auxbasis = df.aug_etb(mol, beta=1.6)
print(df.make_auxmol(mol, auxbasis).nao_nr()) # 338

Here the make_auxmol() function converts the auxbasis to a Mole object which can be used to evaluate the
analytical integrals the same way as the regular Mole object. The formula to generate the exponents 𝜁 of the even-

184

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

tempered auxiliary basis are
𝜙 = 𝑟𝑙 exp(−𝜁𝑖𝑙 𝑟2 ),

𝑖 = 0..𝑛

𝑖

𝜁𝑖𝑙 = 𝛼 × 𝛽 : 𝑙𝑎𝑏𝑒𝑙 : 𝑒𝑡𝑏
The default value of 𝛽 is 2.3. 𝛼 and the number of auxiliary basis 𝑛 is determined based on the orbital basis. Given
the orbital basis
𝜒 = 𝑟𝑙 exp(−𝛼𝑙 𝑟2 )
the orbital pair on the same center produces a new one-center basis
′

𝜒𝜒′ = 𝑟𝑙+𝑙 exp(−(𝛼𝑙 + 𝛼𝑙′ )𝑟2 ) = 𝑟𝐿 exp(−𝛼𝐿 𝑟2 )
The minimal 𝛼𝐿 in all orbital pairs is assigned to 𝛼 in (??). Then 𝑛 is estimated to make the largest auxiliary exponent
𝜁 as close as possible to the maximum 𝛼𝐿 . The size of generated even-tempered Gaussian basis is typically 5 - 10
times of the size of the orbital basis, or 2 - 3 times more than the optimized auxiliary basis. (Note the accuracy of
this even-tempered auxiliary basis is not fully benchmarked. The error is close to the optimized auxiliary basis in our
tests.)
Saving/Loading DF integral tensor
Although it is not expensive to compute DF integral tensor in the molecular calculation, saving/loading the 3-index
tensor is still useful since it provides an alternative way, different to the attribute _eri of mean-field object (see
Customizing Hamiltonian), to customize the Hamiltonian.
In the DF-SCF method, the 3-index tensor is held in the with_df object. The with_df object (see
pyscf.df.df.DF class) provides two attributes _cderi_to_save and _cderi to access the DF 3-index integrals.
If a DF integral tensor is assigned to _cderi, the integrals will be used in the DF calculation. The DF integral tensor
can be either a numpy array or an HDF5 file on disk. When the DF integrals are provided in the HDF5 file, the integral
needs to be stored under the dataset 'j3c':
import numpy
import h5py
from pyscf import gto, scf, df
mol = gto.M(atom='H 0 0 0; H 1 0 1; H 0 1 1; H 1 1 0', basis='sto3g')
nao = mol.nao_nr()
with h5py.File('df_ints.h5', 'w') as f:
f['j3c'] = numpy.random.random((10,nao*(nao+1)//2))
mf = scf.RHF(mol).density_fit()
mf.with_df._cderi = 'df_ints.h5'
mf.kernel()

As shown in the above example, the integral tensor 𝑉𝑥,𝑖𝑗 provided in _cderi should be a 2D array in C (row-major)
convention. Its first index corresponds to the auxiliary basis and the second combined index ij is the orbital pair index.
When load DF integrals, we assumed hermitian symmetry between the two orbital index, ie only the elements 𝑖 ≥ 𝑗
are left in the DF integral tensor. Thus the DF integral tensor should be a 2D array, with shape (M,N*(N+1)/2),
where M is the number of auxiliary functions, N is the number of orbitals.
If _cderi is not specified, the DF integral tensor will be generated during the calculation and stored to the file that
the attribute _cderi_to_save points to. By default, it is a random file and the random file will be deleted if
the calculation finishes successfully. You can find the filename in the output log (when with.verbose > 3, for
example:

1.11. df — Density fitting

185

PySCF Documentation, Release 1.4.0

********  flags ********
auxbasis = None
max_memory = 20000
_cderi_to_save = /scratch/tmp6rGrSD

If the calculation is terminated problematically with error or any other reasons, you can reuse the DF integrals in the
next calculation by assigning the integral file to _cderi. Overwriting _cderi_to_save with a filename will make
the program save the DF integrals in the given filename regardless whether the calculation is succeed or failed. See
also the example pyscf/examples/df/10-access_df_integrals.py.
Precomputing the DF integral tensor
The DF integral tensor can be computed without initialization the with_df object. Functions cholesky_eri()
defined in df.incore and df.outcore can generate DF integral tensor in memory or in a HDF5 file:
from pyscf import gto, df
mol = gto.M(atom='N 0 0 0; N 1 1 1', basis='ccpvdz')
cderi = df.incore.cholesky_eri(mol, auxbasis='ccpvdz-jkfit')
df.outcore.cholesky_eri(mol, 'df_ints.h5', auxbasis='ccpvdz-jkfit')

These cderi integrals has the same data structure as the one generated in with_df object. They can be directly
used in the DF type calculations:
from pyscf import scf
mf = scf.RHF(mol).density_fit()
mf.with_df._cderi = cderi
mf.kernel()
mf.with_df._cderi = 'df_ints.h5'
mf.kernel()

Approximating orbital hessian in SCF and MCSCF
Orbital hessian is required by the second order SCF solver or MCSCF solver. In many systems, approximating the
orbital hessian has negligible effects to the convergence and the solutions of the SCF or MCSCF orbital optimization
procedure. Using DF method to approximate the orbital hessian can improve the overall performance. For example,
the following code enables the DF approximation to the orbital hessian in SCF calculation:
from pyscf import gto, scf
mol = gto.M(atom='N 0 0 0; O 0 0 1.5', spin=1, basis='ccpvdz')
mf = scf.RHF(mol).newton().density_fit().run(verbose=4) # converged SCF energy = ˓→129.0896469563
mf = scf.RHF(mol).run(verbose=4)
# converged SCF energy = ˓→129.0896469563

The approximation to orbital hessian does not change the SCF result. In the above example, it produces the same
solution to the regular SCF result. Similarly, when the DF approximation is used with CASSCF orbital hessian, the
CASSCF result should not change. Continuing the above example, we can use the mcscf.approx_hessian()
function to change the orbital hessian of the given CASSCF object:
from pyscf import mcscf
mc = mcscf.approx_hessian(mcscf.CASSCF(mf, 8, 11)).run()
mc = mcscf.CASSCF(mf, 8, 11).run()

186

# -129.283077136
# -129.283077136

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

Note: In the second order SCF solver, the order to apply the density_fit and newton methods affects the character of
the resultant SCF object. For example, the statement mf = scf.RHF(mol).density_fit().newton() first
produces a DFHF object then enable the second order Newton solver for the DFHF object. The resultant SCF object
is a DFHF object. See more examples in examples/scf/23-decorate_scf.py

1.11.2 Program reference
DF class
class pyscf.df.df.DF(mol)
Object to hold 3-index tensor
Attributes:
auxbasis [str or dict] Same input format as Mole.basis
auxmol [Mole object] Read only Mole object to hold the auxiliary basis. auxmol is generated automatically in the initialization step based on the given auxbasis. It is used in the rest part of the code to
determine the problem size, the integral batches etc. This object should NOT be modified.
_cderi_to_save [str] If _cderi_to_save is specified, the DF integral tensor will be saved in this file.
_cderi [str or numpy array] If _cderi is specified, the DF integral tensor will be read from this HDF5 file
(or numpy array). When the DF integral tensor is provided from the HDF5 file, it has to be stored
under the dataset ‘j3c’. The DF integral tensor 𝑉𝑥,𝑖𝑗 should be a 2D array in C (row-major) convention, where x corresponds to index of auxiliary basis, and the combined index ij is the orbital pair
index. The hermitian symmetry is assumed for the combined ij index, ie the elements of 𝑉𝑥,𝑖,𝑗 with
𝑖 ≥ 𝑗 are existed in the DF integral tensor. Thus the shape of DF integral tensor is (M,N*(N+1)/2),
where M is the number of auxbasis functions and N is the number of basis functions of the orbital
basis.
blockdim [int] When reading DF integrals from disk the chunk size to load. It is used to improve the IO
performance.
df.incore
pyscf.df.incore.aux_e1(mol, auxmol, intor=’int3c2e_sph’, aosym=’s1’, comp=1, out=None)
3-center 2-electron AO integrals (L|ij), where L is the auxiliary basis.
pyscf.df.incore.aux_e2(mol, auxmol, intor=’int3c2e_sph’, aosym=’s1’, comp=1, out=None)
3-center AO integrals (ij|L), where L is the auxiliary basis.
pyscf.df.incore.cholesky_eri(mol, auxbasis=’weigend+etb’, auxmol=None, int3c=’int3c2e_sph’,
aosym=’s2ij’,
int2c=’int2c2e_sph’,
comp=1,
verbose=0,
fauxe2=)
Returns: 2D array of (naux,nao*(nao+1)/2) in C-contiguous
pyscf.df.incore.fill_2c2e(mol, auxmol, intor=’int2c2e_sph’, comp=1, hermi=1, out=None)
2-center 2-electron AO integrals for auxiliary basis (auxmol)
pyscf.df.incore.format_aux_basis(mol, auxbasis=’weigend+etb’)
See also pyscf.df.addons.make_auxmol.
This funciton is defined for backward compatibility.

1.11. df — Density fitting

187

PySCF Documentation, Release 1.4.0

df.outcore
pyscf.df.outcore.cholesky_eri(mol,
erifile,
auxbasis=’weigend+etb’,
dataname=’j3c’,
tmpdir=None,
int3c=’int3c2e_sph’,
aosym=’s2ij’,
int2c=’int2c2e_sph’,
comp=1,
max_memory=2000,
ioblk_size=256, auxmol=None, verbose=0)
3-center 2-electron AO integrals
pyscf.df.outcore.cholesky_eri_b(mol, erifile, auxbasis=’weigend+etb’, dataname=’j3c’,
int3c=’int3c2e_sph’, aosym=’s2ij’, int2c=’int2c2e_sph’,
comp=1, ioblk_size=256, auxmol=None, verbose=3)
3-center 2-electron AO integrals
pyscf.df.outcore.general(mol, mo_coeffs, erifile, auxbasis=’weigend+etb’, dataname=’eri_mo’,
tmpdir=None, int3c=’int3c2e_sph’, aosym=’s2ij’, int2c=’int2c2e_sph’,
comp=1, max_memory=2000, ioblk_size=256, verbose=0, compact=True)
Transform ij of (ij|L) to MOs.
df.addons
pyscf.df.addons.aug_etb(mol, beta=2.3)
To generate the even-tempered auxiliary Gaussian basis
pyscf.df.addons.aug_etb_for_dfbasis(mol, dfbasis=’weigend’, beta=2.3, start_at=’Rb’)
augment weigend basis with even-tempered gaussian basis exps = alpha*beta^i for i = 1..N
class pyscf.df.addons.load(eri, dataname=’j3c’)
load 3c2e integrals from hdf5 file. It can be used in the context manager:
with load(cderifile) as eri: print eri.shape
pyscf.df.addons.make_auxbasis(mol, mp2fit=False)
Depending on the orbital basis, generating even-tempered Gaussians or the optimized auxiliary basis defined in
DEFAULT_AUXBASIS
pyscf.df.addons.make_auxmol(mol, auxbasis=None)
Generate a fake Mole object which uses the density fitting auxbasis as the basis sets. If auxbasis is not
specified, the optimized auxiliary fitting basis set will be generated according to the rules recorded in
pyscf.df.addons.DEFAULT_AUXBASIS. If the optimized auxiliary basis is not available (either not specified in
DEFAULT_AUXBASIS or the basis set of the required elements not defined in the optimized auxiliary basis),
even-tempered Gaussian basis set will be generated.
See also the paper JCTC, 13, 554 about the generation of auxiliary fitting basis.

1.12 dft — Density functional theory
1.12.1 Customizing XC functional
XC functional of DFT methods can be customized. The simplest way to customize XC functional is to assigned a
string expression to mf.xc:
from pyscf import gto, dft
mol = gto.M(atom='H 0 0 0; F 0.9 0 0', basis='6-31g')
mf = dft.RKS(mol)
mf.xc = 'HF*0.2 + .08*LDA + .72*B88, .81*LYP + .19*VWN'

188

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

mf.kernel()
mf.xc = 'HF*0.5 + .08*LDA + .42*B88, .81*LYP + .19*VWN'
mf.kernel()
mf.xc = 'HF*0.8 + .08*LDA + .12*B88, .81*LYP + .19*VWN'
mf.kernel()
mf.xc = 'HF'
mf.kernel()

The XC functional string is parsed against the following rules.
• The given functional description must be a one-line string.
• The functional description is case-insensitive.
• The functional description string has two parts, separated by ,. The first part describes the exchange functional,
the second is the correlation functional. - If , was not appeared in string, the entire string is considered as
X functional.
– To neglect X functional (just apply C functional), leave blank in the first part, eg mf.xc=',vwn' for
pure VWN functional
• The functional name can be placed in arbitrary order. Two names needs to be separated by operators + or -.
Blank spaces are ignored. NOTE the parser only reads operators + -*. / is not supported.
• A functional name is associated with one factor. If the factor is not given, it is assumed equaling 1.
• String 'HF' stands for exact exchange (HF K matrix). It is allowed to put 'HF' in C (correlation) functional
part.
• Be careful with the libxc convention on GGA functional, in which the LDA contribution is included.
Another way to customize XC functional is to redefine the eval_xc() method of numerical integral class:
mol = gto.M(atom='H 0 0 0; F 0.9 0 0', basis = '6-31g')
mf = dft.RKS(mol)
def eval_xc(xc_code, rho, spin=0, relativity=0, deriv=1, verbose=None):
# A fictitious XC functional to demonstrate the usage
rho0, dx, dy, dz = rho
gamma = (dx**2 + dy**2 + dz**2)
exc = .01 * rho0**2 + .02 * (gamma+.001)**.5
vrho = .01 * 2 * rho0
vgamma = .02 * .5 * (gamma+.001)**(-.5)
vlapl = None
vtau = None
vxc = (vrho, vgamma, vlapl, vtau)
fxc = None # 2nd order functional derivative
kxc = None # 3rd order functional derivative
return exc, vxc, fxc, kxc
dft.libxc.define_xc_(mf._numint, eval_xc, xctype='GGA')
mf.kernel()

By calling dft.libxc.define_xc_() function, the customized eval_xc() function is patched to the numerical integration class mf._numint dynamically.
More examples of customizing DFT XC functional can be found in examples/dft/24-custom_xc_functional.py
and examples/dft/24-define_xc_functional.py.

1.12. dft — Density functional theory

189

PySCF Documentation, Release 1.4.0

1.12.2 Program reference
Non-relativistic restricted Kohn-Sham
class pyscf.dft.rks.RKS(mol)
Restricted Kohn-Sham SCF base class. non-relativistic RHF.
Attributes:
verbose [int] Print level. Default value equals to Mole.verbose
max_memory [float or int]
Mole.max_memory

Allowed

memory

in

MB.

Default

equals

to

chkfile [str] checkpoint file to save MOs, orbital energies etc.
conv_tol [float] converge threshold. Default is 1e-10
conv_tol_grad [float] gradients converge threshold. Default is sqrt(conv_tol)
max_cycle [int] max number of iterations. Default is 50
init_guess [str] initial guess method. It can be one of ‘minao’, ‘atom’, ‘1e’, ‘chkfile’. Default
is ‘minao’
diis [boolean or object of DIIS class listed in scf.diis] Default is diis.SCF_DIIS. Set
it to None to turn off DIIS.
diis_space [int] DIIS space size. By default, 8 Fock matrices and errors vector are stored.
diis_start_cycle [int] The step to start DIIS. Default is 1.
diis_file: ‘str’ File to store DIIS vectors and error vectors.
level_shift [float or int] Level shift (in AU) for virtual space. Default is 0.
direct_scf [bool] Direct SCF is used by default.
direct_scf_tol [float] Direct SCF cutoff threshold. Default is 1e-13.
callback [function(envs_dict) => None] callback function takes one dict as the argument
which is generated by the builtin function locals(), so that the callback function can
access all local variables in the current envrionment.
conv_check [bool] An extra cycle to check convergence after SCF iterations.
Saved results
converged [bool] SCF converged or not
e_tot [float] Total HF energy (electronic energy plus nuclear repulsion)
mo_energy : Orbital energies
mo_occ Orbital occupancy
mo_coeff Orbital coefficients
Examples:
>>> mol = gto.M(atom='H 0 0 0; H 0 0 1.1', basis='cc-pvdz')
>>> mf = scf.hf.SCF(mol)
>>> mf.verbose = 0
>>> mf.level_shift = .4
>>> mf.scf()
-1.0811707843775884

190

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

Attributes for RKS:
xc [str] ‘X_name,C_name’ for the XC functional. Default is ‘lda,vwn’
grids [Grids object] grids.level (0 - 9) big number for large mesh grids. Default is 3
radii_adjust
radi.treutler_atomic_radii_adjust (default)
radi.becke_atomic_radii_adjust
None : to switch off atomic radii adjustment
grids.atomic_radii
radi.BRAGG_RADII (default)
radi.COVALENT_RADII
None : to switch off atomic radii adjustment
grids.radi_method scheme for radial grids
radi.treutler (default)
radi.delley
radi.mura_knowles
radi.gauss_chebyshev
grids.becke_scheme weight partition function
gen_grid.original_becke (default)
gen_grid.stratmann
grids.prune scheme to reduce number of grids
gen_grid.nwchem_prune (default)
gen_grid.sg1_prune
gen_grid.treutler_prune
None : to switch off grids pruning
grids.symmetry True/False to symmetrize mesh grids (TODO)
grids.atom_grid Set (radial, angular) grids for particular atoms. Eg, grids.atom_grid =
{‘H’: (20,110)} will generate 20 radial grids and 110 angular grids for H atom.
small_rho_cutoff [float] Drop grids if their contribution to total electrons smaller than this
cutoff value. Default is 1e-7.
Examples:
>>> mol = gto.M(atom='O 0 0 0; H 0 0 1; H 0 1 0', basis='ccpvdz',
˓→verbose=0)
>>> mf = dft.RKS(mol)
>>> mf.xc = 'b3lyp'
>>> mf.kernel()
-76.415443079840458

energy_elec(ks, dm, h1e=None, vhf=None)
Electronic part of RKS energy.
Args: ks : an instance of DFT class
dm [2D ndarray] one-partical density matrix
h1e [2D ndarray] Core hamiltonian

1.12. dft — Density functional theory

191

PySCF Documentation, Release 1.4.0

Returns: RKS electronic energy and the 2-electron part contribution
get_veff(ks, mol=None, dm=None, dm_last=0, vhf_last=0, hermi=1)
Coulomb + XC functional
Note: This function will change the ks object.

Args:
ks [an instance of RKS] XC functional are controlled by ks.xc attribute. Attribute ks.grids might be
initialized.
dm [ndarray or list of ndarrays] A density matrix or a list of density matrices
Kwargs:
dm_last [ndarray or a list of ndarrays or 0] The density matrix baseline. If not 0, this function
computes the increment of HF potential w.r.t. the reference HF potential matrix.
vhf_last [ndarray or a list of ndarrays or 0] The reference Vxc potential matrix.
hermi [int] Whether J, K matrix is hermitian

0 : no hermitian or symmetric
1 : hermitian
2 : anti-hermitian

Returns: matrix Veff = J + Vxc. Veff can be a list matrices, if the input dm is a list of density matrices.
pyscf.dft.rks.energy_elec(ks, dm, h1e=None, vhf=None)
Electronic part of RKS energy.
Args: ks : an instance of DFT class
dm [2D ndarray] one-partical density matrix
h1e [2D ndarray] Core hamiltonian
Returns: RKS electronic energy and the 2-electron part contribution
pyscf.dft.rks.get_veff(ks, mol=None, dm=None, dm_last=0, vhf_last=0, hermi=1)
Coulomb + XC functional
Note: This function will change the ks object.

Args:
ks [an instance of RKS] XC functional are controlled by ks.xc attribute. Attribute ks.grids might be
initialized.
dm [ndarray or list of ndarrays] A density matrix or a list of density matrices
Kwargs:
dm_last [ndarray or a list of ndarrays or 0] The density matrix baseline. If not 0, this function computes
the increment of HF potential w.r.t. the reference HF potential matrix.

192

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

vhf_last [ndarray or a list of ndarrays or 0] The reference Vxc potential matrix.
hermi [int] Whether J, K matrix is hermitian

0 : no hermitian or symmetric
1 : hermitian
2 : anti-hermitian

Returns: matrix Veff = J + Vxc. Veff can be a list matrices, if the input dm is a list of density matrices.
Non-relativistic Unrestricted Kohn-Sham
class pyscf.dft.uks.UKS(mol)
Unrestricted Kohn-Sham See pyscf/dft/rks.py RKS class for the usage of the attributes
get_veff(ks, mol=None, dm=None, dm_last=0, vhf_last=0, hermi=1)
Coulomb + XC functional for UKS. See pyscf/dft/rks.py get_veff() fore more details.
pyscf.dft.uks.get_veff(ks, mol=None, dm=None, dm_last=0, vhf_last=0, hermi=1)
Coulomb + XC functional for UKS. See pyscf/dft/rks.py get_veff() fore more details.
Generate DFT grids and weights, based on the code provided by Gerald Knizia <>
Reference for Lebedev-Laikov grid: V. I. Lebedev, and D. N. Laikov “A quadrature formula for the sphere of the
131st algebraic order of accuracy”, Doklady Mathematics, 59, 477-481 (1999)
class pyscf.dft.gen_grid.Grids(mol)
DFT mesh grids
Attributes for Grids:
level [int (0 - 9)] big number for large mesh grids, default is 3
atomic_radii [1D array]
radi.BRAGG_RADII (default)
radi.COVALENT_RADII
None : to switch off atomic radii adjustment
radii_adjust [function(mol, atomic_radii) => (function(atom_id, atom_id, g) => array_like_g)]
Function to adjust atomic radii, can be one of | radi.treutler_atomic_radii_adjust |
radi.becke_atomic_radii_adjust | None : to switch off atomic radii adjustment
radi_method [function(n) => (rad_grids, rad_weights)] scheme for radial grids, can be one of |
radi.treutler (default) | radi.delley | radi.mura_knowles | radi.gauss_chebyshev
becke_scheme [function(v) => array_like_v] weight partition function,
gen_grid.original_becke (default) | gen_grid.stratmann

can be one of |

prune [function(nuc, rad_grids, n_ang) => list_n_ang_for_each_rad_grid] scheme to reduce number of grids, can be one of | gen_grid.nwchem_prune (default) | gen_grid.sg1_prune |
gen_grid.treutler_prune | None : to switch off grid pruning
symmetry [bool] whether to symmetrize mesh grids (TODO)
atom_grid [dict] Set (radial, angular) grids for particular atoms. Eg, grids.atom_grid = {‘H’: (20,110)}
will generate 20 radial grids and 110 angular grids for H atom.
level [int] To control the number of radial and angular grids. The default level 3 corresponds to (50,302)
for H, He; (75,302) for second row; (80~105,434) for rest.

1.12. dft — Density functional theory

193

PySCF Documentation, Release 1.4.0

Examples:
>>>
>>>
>>>
>>>

mol = gto.M(atom='H 0 0 0; H 0 0 1.1')
grids = dft.gen_grid.Grids(mol)
grids.level = 4
grids.build()

gen_atomic_grids(mol, atom_grid=None, radi_method=None, level=None, prune=None)
Generate number of radial grids and angular grids for the given molecule.
Returns: A dict, with the atom symbol for the dict key. For each atom type, the dict value has two items:
one is the meshgrid coordinates wrt the atom center; the second is the volume of that grid.
gen_partition(mol, atom_grids_tab, radii_adjust=None, atomic_radii=array([ 0., 0.66140414,
2.64561657, 2.74010288, 1.98421243, 1.60626721, 1.32280829, 1.22832198,
1.13383567, 0.94486306, 2.83458919, 3.40150702, 2.83458919, 2.36215766,
2.07869874, 1.88972612, 1.88972612, 1.88972612, 3.40150702, 4.15739747,
3.40150702, 3.0235618, 2.64561657, 2.55113027, 2.64561657, 2.64561657,
2.64561657, 2.55113027, 2.55113027, 2.55113027, 2.55113027, 2.45664396,
2.36215766, 2.17318504, 2.17318504, 2.17318504, 3.59047964, 4.44085639,
3.77945225, 3.40150702, 2.92907549, 2.74010288, 2.74010288, 2.55113027,
2.45664396, 2.55113027, 2.64561657, 3.0235618, 2.92907549, 2.92907549,
2.74010288, 2.74010288, 2.64561657, 2.64561657, 3.96842486, 4.91328792,
4.06291117, 3.68496594, 3.49599333, 3.49599333, 3.49599333, 3.49599333,
3.49599333, 3.49599333, 3.40150702, 3.30702072, 3.30702072, 3.30702072,
3.30702072, 3.30702072, 3.30702072, 3.30702072, 2.92907549, 2.74010288,
2.55113027, 2.55113027, 2.45664396, 2.55113027, 2.55113027, 2.55113027,
2.83458919, 3.59047964, 3.40150702, 3.0235618, 3.59047964, 2.74010288,
3.96842486, 3.40150702, 4.06291117, 3.68496594, 3.40150702, 3.40150702,
3.30702072, 3.30702072, 3.30702072, 3.30702072, 3.30702072, 3.30702072,
3.30702072, 3.30702072, 3.30702072, 3.30702072, 3.30702072, 3.30702072,
3.30702072, 3.30702072, 3.30702072, 3.30702072, 3.30702072, 3.30702072,
3.30702072, 3.30702072, 3.30702072, 3.30702072, 3.30702072, 3.30702072,
3.30702072, 3.30702072, 3.30702072, 3.30702072, 3.30702072, 3.30702072,
3.30702072, 3.30702072, 3.30702072, 3.30702072, 3.30702072, 3.30702072,
3.30702072, 3.30702072, 3.30702072]), becke_scheme=)
Generate the mesh grid coordinates and weights for DFT numerical integration. We can change
radii_adjust, becke_scheme functions to generate different meshgrid.
Returns: grid_coord and grid_weight arrays. grid_coord array has shape (N,3); weight 1D array has N
elements.
make_mask(mol=None, coords=None, relativity=0, shls_slice=None, verbose=None)
Mask to indicate whether a shell is zero on grid
Args: mol : an instance of Mole
coords [2D array, shape (N,3)] The coordinates of grids.
Kwargs:
relativity [bool] No effects.
shls_slice [2-element list] (shl_start, shl_end). If given, only part of AOs (shl_start <= shell_id <
shl_end) are evaluated. By default, all shells defined in mol will be evaluated.
verbose [int or object of Logger] No effects.
Returns: 2D mask array of shape (N,nbas), where N is the number of grids, nbas is the number of shells.

194

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

pyscf.dft.gen_grid.gen_atomic_grids(mol,
atom_grid={},
radi_method=,
level=3,
prune=)
Generate number of radial grids and angular grids for the given molecule.
Returns: A dict, with the atom symbol for the dict key. For each atom type, the dict value has two items: one
is the meshgrid coordinates wrt the atom center; the second is the volume of that grid.
pyscf.dft.gen_grid.gen_partition(mol,
atom_grids_tab,
radii_adjust=None,
atomic_radii=array([ 0.,
0.66140414,
2.64561657,
2.74010288,
1.98421243,
1.60626721,
1.32280829,
1.22832198,
1.13383567,
0.94486306,
2.83458919,
3.40150702,
2.83458919,
2.36215766,
2.07869874,
1.88972612,
1.88972612,
1.88972612,
3.40150702,
4.15739747,
3.40150702,
3.0235618,
2.64561657,
2.55113027,
2.64561657,
2.64561657,
2.64561657,
2.55113027,
2.55113027,
2.55113027,
2.55113027,
2.45664396,
2.36215766,
2.17318504,
2.17318504,
2.17318504,
3.59047964,
4.44085639,
3.77945225,
3.40150702,
2.92907549,
2.74010288,
2.74010288,
2.55113027,
2.45664396,
2.55113027,
2.64561657,
3.0235618,
2.92907549,
2.92907549,
2.74010288,
2.74010288,
2.64561657,
2.64561657,
3.96842486,
4.91328792,
4.06291117,
3.68496594,
3.49599333,
3.49599333,
3.49599333,
3.49599333,
3.49599333,
3.49599333,
3.40150702,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
2.92907549,
2.74010288,
2.55113027,
2.55113027,
2.45664396,
2.55113027,
2.55113027,
2.55113027,
2.83458919,
3.59047964,
3.40150702,
3.0235618,
3.59047964,
2.74010288,
3.96842486,
3.40150702,
4.06291117,
3.68496594,
3.40150702,
3.40150702,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072, 3.30702072, 3.30702072, 3.30702072]),
becke_scheme=)
Generate the mesh grid coordinates and weights for DFT numerical integration. We can change radii_adjust,
becke_scheme functions to generate different meshgrid.
Returns: grid_coord and grid_weight arrays. grid_coord array has shape (N,3); weight 1D array has N elements.
pyscf.dft.gen_grid.make_mask(mol, coords, relativity=0, shls_slice=None, verbose=None)
Mask to indicate whether a shell is zero on grid
Args: mol : an instance of Mole
coords [2D array, shape (N,3)] The coordinates of grids.
Kwargs:

1.12. dft — Density functional theory

195

PySCF Documentation, Release 1.4.0

relativity [bool] No effects.
shls_slice [2-element list] (shl_start, shl_end). If given, only part of AOs (shl_start <= shell_id < shl_end)
are evaluated. By default, all shells defined in mol will be evaluated.
verbose [int or object of Logger] No effects.
Returns: 2D mask array of shape (N,nbas), where N is the number of grids, nbas is the number of shells.
pyscf.dft.gen_grid.nwchem_prune(nuc, rads, n_ang, radii=array([ 0., 0.66140414, 2.64561657,
2.74010288,
1.98421243,
1.60626721,
1.32280829,
1.22832198,
1.13383567,
0.94486306,
2.83458919,
3.40150702,
2.83458919,
2.36215766,
2.07869874,
1.88972612,
1.88972612,
1.88972612,
3.40150702,
4.15739747,
3.40150702,
3.0235618,
2.64561657,
2.55113027,
2.64561657,
2.64561657,
2.64561657,
2.55113027,
2.55113027,
2.55113027,
2.55113027,
2.45664396,
2.36215766,
2.17318504,
2.17318504,
2.17318504,
3.59047964,
4.44085639,
3.77945225,
3.40150702,
2.92907549,
2.74010288,
2.74010288,
2.55113027,
2.45664396,
2.55113027,
2.64561657,
3.0235618,
2.92907549,
2.92907549,
2.74010288,
2.74010288,
2.64561657,
2.64561657,
3.96842486,
4.91328792,
4.06291117,
3.68496594,
3.49599333,
3.49599333,
3.49599333,
3.49599333,
3.49599333,
3.49599333,
3.40150702,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
2.92907549,
2.74010288,
2.55113027,
2.55113027,
2.45664396,
2.55113027,
2.55113027,
2.55113027,
2.83458919,
3.59047964,
3.40150702,
3.0235618,
3.59047964,
2.74010288,
3.96842486,
3.40150702,
4.06291117,
3.68496594,
3.40150702,
3.40150702,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072,
3.30702072, 3.30702072, 3.30702072, 3.30702072]))
NWChem
Args:
nuc [int] Nuclear charge.
rads [1D array] Grid coordinates on radical axis.
n_ang [int] Max number of grids over angular part.
Kwargs:
radii [1D array] radii (in Bohr) for atoms in periodic table
Returns: A list has the same length as rads. The list element is the number of grids over angular part for each
radial grid.

196

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

pyscf.dft.gen_grid.original_becke(g)
Becke, JCP, 88, 2547 (1988)
pyscf.dft.gen_grid.sg1_prune(nuc, rads, n_ang, radii=array([ 0., 1., 0.5882, 3.0769, 2.0513,
1.5385, 1.2308, 1.0256, 0.8791, 0.7692, 0.6838, 4.0909, 3.1579,
2.5714, 2.1687, 1.875, 1.6514, 1.4754, 1.3333]))
SG1, CPL, 209, 506
Args:
nuc [int] Nuclear charge.
rads [1D array] Grid coordinates on radical axis.
n_ang [int] Max number of grids over angular part.
Kwargs:
radii [1D array] radii (in Bohr) for atoms in periodic table
Returns: A list has the same length as rads. The list element is the number of grids over angular part for each
radial grid.
pyscf.dft.gen_grid.stratmann(g)
Stratmann, Scuseria, Frisch. CPL, 257, 213 (1996)
pyscf.dft.gen_grid.treutler_prune(nuc, rads, n_ang, radii=None)
Treutler-Ahlrichs
Args:
nuc [int] Nuclear charge.
rads [1D array] Grid coordinates on radical axis.
n_ang [int] Max number of grids over angular part.
Returns: A list has the same length as rads. The list element is the number of grids over angular part for each
radial grid.
pyscf.dft.numint.cache_xc_kernel(ni, mol, grids, xc_code, mo_coeff, mo_occ, spin=0,
max_memory=2000)
Compute the 0th order density, Vxc and fxc. They can be used in TDDFT, DFT hessian module etc.
pyscf.dft.numint.eval_ao(mol, coords, deriv=0, shls_slice=None, non0tab=None, out=None, verbose=None)
Evaluate AO function value on the given grids.
Args: mol : an instance of Mole
coords [2D array, shape (N,3)] The coordinates of the grids.
Kwargs:
deriv [int] AO derivative order. It affects the shape of the return array. If deriv=0, the returned AO values
are stored in a (N,nao) array. Otherwise the AO values are stored in an array of shape (M,N,nao).
Here N is the number of grids, nao is the number of AO functions, M is the size associated to the
derivative deriv.
relativity [bool] No effects.
shls_slice [2-element list] (shl_start, shl_end). If given, only part of AOs (shl_start <= shell_id < shl_end)
are evaluated. By default, all shells defined in mol will be evaluated.
non0tab [2D bool array] mask array to indicate whether the AO values are zero. The mask array can be
obtained by calling make_mask()

1.12. dft — Density functional theory

197

PySCF Documentation, Release 1.4.0

out [ndarray] If provided, results are written into this array.
verbose [int or object of Logger] No effects.
Returns: 2D array of shape (N,nao) for AO values if deriv = 0. Or 3D array of shape (:,N,nao) for AO values
and AO derivatives if deriv > 0. In the 3D array, the first (N,nao) elements are the AO values, followed
by (3,N,nao) for x,y,z compoents; Then 2nd derivatives (6,N,nao) for xx, xy, xz, yy, yz, zz; Then 3rd
derivatives (10,N,nao) for xxx, xxy, xxz, xyy, xyz, xzz, yyy, yyz, yzz, zzz; ...
Examples:
>>> mol = gto.M(atom='O 0 0 0; H 0 0 1; H 0 1 0', basis='ccpvdz')
>>> coords = numpy.random.random((100,3)) # 100 random points
>>> ao_value = eval_ao(mol, coords)
>>> print(ao_value.shape)
(100, 24)
>>> ao_value = eval_ao(mol, coords, deriv=1, shls_slice=(1,4))
>>> print(ao_value.shape)
(4, 100, 7)
>>> ao_value = eval_ao(mol, coords, deriv=2, shls_slice=(1,4))
>>> print(ao_value.shape)
(10, 100, 7)

pyscf.dft.numint.eval_mat(mol, ao, weight, rho, vxc, non0tab=None, xctype=’LDA’, spin=0, verbose=None)
Calculate XC potential matrix.
Args: mol : an instance of Mole
ao [([4/10,] ngrids, nao) ndarray] 2D array of shape (N,nao) for LDA, 3D array of shape (4,N,nao) for
GGA or (10,N,nao) for meta-GGA. N is the number of grids, nao is the number of AO functions. If
xctype is GGA, ao[0] is AO value and ao[1:3] are the real space gradients. If xctype is meta-GGA,
ao[4:10] are second derivatives of ao values.
weight [1D array] Integral weights on grids.
rho [([4/6,] ngrids) ndarray] Shape of ((,N)) for electron density (and derivatives) if spin = 0; Shape
of ((,N),(,N)) for alpha/beta electron density (and derivatives) if spin > 0; where N is number of grids. rho (,N) are ordered as (den,grad_x,grad_y,grad_z,laplacian,tau) where grad_x
= d/dx den, laplacian = nabla^2 den, tau = 1/2(nabla f)^2 In spin unrestricted case, rho is
((den_u,grad_xu,grad_yu,grad_zu,laplacian_u,tau_u)
(den_d,grad_xd,grad_yd,grad_zd,laplacian_d,tau_d))
vxc [([4,] ngrids) ndarray] XC potential value on each grid = (vrho, vsigma, vlapl, vtau) vsigma is GGA
potential value on each grid. If the kwarg spin is not 0, a list [vsigma_uu,vsigma_ud] is required.
Kwargs:
xctype [str] LDA/GGA/mGGA. It affects the shape of ao and rho
non0tab [2D bool array] mask array to indicate whether the AO values are zero. The mask array can be
obtained by calling make_mask()
spin [int] If not 0, the matrix is contracted with the spin non-degenerated UKS formula
Returns: XC potential matrix in 2D array of shape (nao,nao) where nao is the number of AO functions.
pyscf.dft.numint.eval_rho(mol, ao, dm, non0tab=None, xctype=’LDA’, hermi=0, verbose=None)
Calculate the electron density for LDA functional, and the density derivatives for GGA functional.
Args: mol : an instance of Mole

198

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

ao [2D array of shape (N,nao) for LDA, 3D array of shape (4,N,nao) for GGA] or (5,N,nao) for metaGGA. N is the number of grids, nao is the number of AO functions. If xctype is GGA, ao[0] is AO
value and ao[1:3] are the AO gradients. If xctype is meta-GGA, ao[4:10] are second derivatives of
ao values.
dm [2D array] Density matrix
Kwargs:
non0tab [2D bool array] mask array to indicate whether the AO values are zero. The mask array can be
obtained by calling make_mask()
xctype [str] LDA/GGA/mGGA. It affects the shape of the return density.
hermi [bool] dm is hermitian or not
verbose [int or object of Logger] No effects.
Returns: 1D array of size N to store electron density if xctype = LDA; 2D array of (4,N) to store density and
“density derivatives” for x,y,z components if xctype = GGA; (6,N) array for meta-GGA, where last two
rows are nabla^2 rho and tau = 1/2(nabla f)^2
Examples:
>>>
>>>
>>>
>>>
>>>
>>>

mol = gto.M(atom='O 0 0 0; H 0 0 1; H 0 1 0', basis='ccpvdz')
coords = numpy.random.random((100,3)) # 100 random points
ao_value = eval_ao(mol, coords, deriv=0)
dm = numpy.random.random((mol.nao_nr(),mol.nao_nr()))
dm = dm + dm.T
rho, dx_rho, dy_rho, dz_rho = eval_rho(mol, ao, dm, xctype='LDA')

pyscf.dft.numint.eval_rho2(mol, ao, mo_coeff, mo_occ, non0tab=None, xctype=’LDA’, verbose=None)
Calculate the electron density for LDA functional, and the density derivatives for GGA functional. This function
has the same functionality as eval_rho() except that the density are evaluated based on orbital coefficients
and orbital occupancy. It is more efficient than eval_rho() in most scenario.
Args: mol : an instance of Mole
ao [2D array of shape (N,nao) for LDA, 3D array of shape (4,N,nao) for GGA] or (5,N,nao) for metaGGA. N is the number of grids, nao is the number of AO functions. If xctype is GGA, ao[0] is AO
value and ao[1:3] are the AO gradients. If xctype is meta-GGA, ao[4:10] are second derivatives of
ao values.
dm [2D array] Density matrix
Kwargs:
non0tab [2D bool array] mask array to indicate whether the AO values are zero. The mask array can be
obtained by calling make_mask()
xctype [str] LDA/GGA/mGGA. It affects the shape of the return density.
verbose [int or object of Logger] No effects.
Returns: 1D array of size N to store electron density if xctype = LDA; 2D array of (4,N) to store density and
“density derivatives” for x,y,z components if xctype = GGA; (6,N) array for meta-GGA, where last two
rows are nabla^2 rho and tau = 1/2(nabla f)^2
pyscf.dft.numint.large_rho_indices(ni, mol, dm, grids, cutoff=1e-10, max_memory=2000)
Indices of density which are larger than given cutoff

1.12. dft — Density functional theory

199

PySCF Documentation, Release 1.4.0

pyscf.dft.numint.nr_fxc(mol, grids, xc_code, dm0, dms, spin=0, relativity=0, hermi=0, rho0=None,
vxc=None, fxc=None, max_memory=2000, verbose=None)
Contract XC kernel matrix with given density matrices
... math:
a_{pq} = f_{pq,rs} * x_{rs}

pyscf.dft.numint.nr_rks(ni, mol, grids, xc_code, dms, relativity=0, hermi=0, max_memory=2000,
verbose=None)
Calculate RKS XC functional and potential matrix on given meshgrids for a set of density matrices
Args: ni : an instance of _NumInt
mol : an instance of Mole
grids [an instance of Grids] grids.coords and grids.weights are needed for coordinates and weights of
meshgrids.
xc_code [str] XC functional description. See parse_xc() of pyscf/dft/libxc.py for more details.
dms [2D array a list of 2D arrays] Density matrix or multiple density matrices
Kwargs:
hermi [int] Input density matrices symmetric or not
max_memory [int or float] The maximum size of cache to use (in MB).
Returns: nelec, excsum, vmat. nelec is the number of electrons generated by numerical integration. excsum is
the XC functional value. vmat is the XC potential matrix in 2D array of shape (nao,nao) where nao is the
number of AO functions.
Examples:
>>>
>>>
>>>
>>>
>>>
>>>
>>>

from pyscf import gto, dft
mol = gto.M(atom='H 0 0 0; H 0 0 1.1')
grids = dft.gen_grid.Grids(mol)
grids.coords = numpy.random.random((100,3)) # 100 random points
grids.weights = numpy.random.random(100)
dm = numpy.random.random((mol.nao_nr(),mol.nao_nr()))
nelec, exc, vxc = dft.numint.nr_vxc(mol, grids, 'lda,vwn', dm)

pyscf.dft.numint.nr_rks_fxc(ni, mol, grids, xc_code, dm0, dms, relativity=0, hermi=0,
rho0=None, vxc=None, fxc=None, max_memory=2000, verbose=None)
Contract RKS XC (singlet hessian) kernel matrix with given density matrices
Args: ni : an instance of _NumInt
mol : an instance of Mole
grids [an instance of Grids] grids.coords and grids.weights are needed for coordinates and weights of
meshgrids.
xc_code [str] XC functional description. See parse_xc() of pyscf/dft/libxc.py for more details.
dms [2D array a list of 2D arrays] Density matrix or multiple density matrices
Kwargs:
hermi [int] Input density matrices symmetric or not
max_memory [int or float] The maximum size of cache to use (in MB).

200

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

rho0 [float array] Zero-order density (and density derivative for GGA). Giving kwargs rho0, vxc and fxc
to improve better performance.
vxc [float array] First order XC derivatives
fxc [float array] Second order XC derivatives
Returns: nelec, excsum, vmat. nelec is the number of electrons generated by numerical integration. excsum is
the XC functional value. vmat is the XC potential matrix in 2D array of shape (nao,nao) where nao is the
number of AO functions.
Examples:
pyscf.dft.numint.nr_rks_fxc_st(ni, mol, grids, xc_code, dm0, dms_alpha, relativity=0, singlet=True, rho0=None, vxc=None, fxc=None,
max_memory=2000, verbose=None)
Associated to singlet or triplet Hessian Note the difference to nr_rks_fxc, dms_alpha is the response density
matrices of alpha spin, alpha+/-beta DM is applied due to singlet/triplet coupling
Ref. CPL, 256, 454
pyscf.dft.numint.nr_rks_vxc(ni, mol, grids, xc_code, dms, relativity=0, hermi=0,
max_memory=2000, verbose=None)
Calculate RKS XC functional and potential matrix on given meshgrids for a set of density matrices
Args: ni : an instance of _NumInt
mol : an instance of Mole
grids [an instance of Grids] grids.coords and grids.weights are needed for coordinates and weights of
meshgrids.
xc_code [str] XC functional description. See parse_xc() of pyscf/dft/libxc.py for more details.
dms [2D array a list of 2D arrays] Density matrix or multiple density matrices
Kwargs:
hermi [int] Input density matrices symmetric or not
max_memory [int or float] The maximum size of cache to use (in MB).
Returns: nelec, excsum, vmat. nelec is the number of electrons generated by numerical integration. excsum is
the XC functional value. vmat is the XC potential matrix in 2D array of shape (nao,nao) where nao is the
number of AO functions.
Examples:
>>>
>>>
>>>
>>>
>>>
>>>
>>>

from pyscf import gto, dft
mol = gto.M(atom='H 0 0 0; H 0 0 1.1')
grids = dft.gen_grid.Grids(mol)
grids.coords = numpy.random.random((100,3)) # 100 random points
grids.weights = numpy.random.random(100)
dm = numpy.random.random((mol.nao_nr(),mol.nao_nr()))
nelec, exc, vxc = dft.numint.nr_vxc(mol, grids, 'lda,vwn', dm)

pyscf.dft.numint.nr_uks(ni, mol, grids, xc_code, dms, relativity=0, hermi=0, max_memory=2000,
verbose=None)
Calculate UKS XC functional and potential matrix on given meshgrids for a set of density matrices
Args: mol : an instance of Mole
grids [an instance of Grids] grids.coords and grids.weights are needed for coordinates and weights of
meshgrids.

1.12. dft — Density functional theory

201

PySCF Documentation, Release 1.4.0

xc_code [str] XC functional description. See parse_xc() of pyscf/dft/libxc.py for more details.
dms [a list of 2D arrays] A list of density matrices, stored as (alpha,alpha,...,beta,beta,...)
Kwargs:
hermi [int] Input density matrices symmetric or not
max_memory [int or float] The maximum size of cache to use (in MB).
Returns: nelec, excsum, vmat. nelec is the number of (alpha,beta) electrons generated by numerical integration.
excsum is the XC functional value. vmat is the XC potential matrix for (alpha,beta) spin.
pyscf.dft.numint.nr_uks_fxc(ni, mol, grids, xc_code, dm0, dms, relativity=0, hermi=0,
rho0=None, vxc=None, fxc=None, max_memory=2000, verbose=None)
Contract UKS XC kernel matrix with given density matrices
Args: ni : an instance of _NumInt
mol : an instance of Mole
grids [an instance of Grids] grids.coords and grids.weights are needed for coordinates and weights of
meshgrids.
xc_code [str] XC functional description. See parse_xc() of pyscf/dft/libxc.py for more details.
dms [2D array a list of 2D arrays] Density matrix or multiple density matrices
Kwargs:
hermi [int] Input density matrices symmetric or not
max_memory [int or float] The maximum size of cache to use (in MB).
rho0 [float array] Zero-order density (and density derivative for GGA). Giving kwargs rho0, vxc and fxc
to improve better performance.
vxc [float array] First order XC derivatives
fxc [float array] Second order XC derivatives
Returns: nelec, excsum, vmat. nelec is the number of electrons generated by numerical integration. excsum is
the XC functional value. vmat is the XC potential matrix in 2D array of shape (nao,nao) where nao is the
number of AO functions.
Examples:
pyscf.dft.numint.nr_uks_vxc(ni, mol, grids, xc_code, dms, relativity=0, hermi=0,
max_memory=2000, verbose=None)
Calculate UKS XC functional and potential matrix on given meshgrids for a set of density matrices
Args: mol : an instance of Mole
grids [an instance of Grids] grids.coords and grids.weights are needed for coordinates and weights of
meshgrids.
xc_code [str] XC functional description. See parse_xc() of pyscf/dft/libxc.py for more details.
dms [a list of 2D arrays] A list of density matrices, stored as (alpha,alpha,...,beta,beta,...)
Kwargs:
hermi [int] Input density matrices symmetric or not
max_memory [int or float] The maximum size of cache to use (in MB).

202

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

Returns: nelec, excsum, vmat. nelec is the number of (alpha,beta) electrons generated by numerical integration.
excsum is the XC functional value. vmat is the XC potential matrix for (alpha,beta) spin.
XC functional, the interface to libxc (http://www.tddft.org/programs/octopus/wiki/index.php/Libxc)
pyscf.dft.libxc.define_xc(ni, description)
Define XC functional. See also eval_xc() for the rules of input description.
Args: ni : an instance of _NumInt
description [str] A string to describe the linear combination of different XC functionals. The X and
C functional are separated by comma like ‘.8*LDA+.2*B86,VWN’. If “HF” was appeared in the
string, it stands for the exact exchange.
Examples:
>>> mol = gto.M(atom='O 0 0 0; H 0 0 1; H 0 1 0', basis='ccpvdz')
>>> mf = dft.RKS(mol)
>>> define_xc_(mf._numint, '.2*HF + .08*LDA + .72*B88, .81*LYP + .19*VWN')
>>> mf.kernel()
-76.3783361189611
>>> define_xc_(mf._numint, 'LDA*.08 + .72*B88 + .2*HF, .81*LYP + .19*VWN')
>>> mf.kernel()
-76.3783361189611
>>> def eval_xc(xc_code, rho, *args, **kwargs):
...
exc = 0.01 * rho**2
...
vrho = 0.01 * 2 * rho
...
vxc = (vrho, None, None, None)
...
fxc = None # 2nd order functional derivative
...
kxc = None # 3rd order functional derivative
...
return exc, vxc, fxc, kxc
>>> define_xc_(mf._numint, eval_xc, xctype='LDA')
>>> mf.kernel()
48.8525211046668

pyscf.dft.libxc.define_xc_(ni, description, xctype=’LDA’, hyb=0)
Define XC functional. See also eval_xc() for the rules of input description.
Args: ni : an instance of _NumInt
description [str] A string to describe the linear combination of different XC functionals. The X and
C functional are separated by comma like ‘.8*LDA+.2*B86,VWN’. If “HF” was appeared in the
string, it stands for the exact exchange.
Examples:
>>> mol = gto.M(atom='O 0 0 0; H 0 0 1; H 0 1 0', basis='ccpvdz')
>>> mf = dft.RKS(mol)
>>> define_xc_(mf._numint, '.2*HF + .08*LDA + .72*B88, .81*LYP + .19*VWN')
>>> mf.kernel()
-76.3783361189611
>>> define_xc_(mf._numint, 'LDA*.08 + .72*B88 + .2*HF, .81*LYP + .19*VWN')
>>> mf.kernel()
-76.3783361189611
>>> def eval_xc(xc_code, rho, *args, **kwargs):
...
exc = 0.01 * rho**2
...
vrho = 0.01 * 2 * rho
...
vxc = (vrho, None, None, None)
...
fxc = None # 2nd order functional derivative
...
kxc = None # 3rd order functional derivative
...
return exc, vxc, fxc, kxc

1.12. dft — Density functional theory

203

PySCF Documentation, Release 1.4.0

>>> define_xc_(mf._numint, eval_xc, xctype='LDA')
>>> mf.kernel()
48.8525211046668

pyscf.dft.libxc.eval_xc(xc_code, rho, spin=0, relativity=0, deriv=1, verbose=None)
Interface to call libxc library to evaluate XC functional, potential and functional derivatives.
•The given functional xc_code must be a one-line string.
•The functional xc_code is case-insensitive.
•The functional xc_code string has two parts, separated by ”,”. The first part describes the exchange
functional, the second is the correlation functional.
–If ”,” not appeared in string, the entire string is considered as X functional.
–To neglect X functional (just apply C functional), leave blank in the first part, eg description=’,vwn’
for pure VWN functional
•The functional name can be placed in arbitrary order. Two name needs to be separated by operators “+”
or “-”. Blank spaces are ignored. NOTE the parser only reads operators “+” “-” “*”. / is not in support.
•A functional name is associated with one factor. If the factor is not given, it is assumed equaling 1.
•String “HF” stands for exact exchange (HF K matrix). It is allowed to put in C functional part.
•Be careful with the libxc convention on GGA functional, in which the LDA contribution is included.
Args:
xc_code [str] A string to describe the linear combination of different XC functionals. The X and C
functional are separated by comma like ‘.8*LDA+.2*B86,VWN’. If “HF” was appeared in the string,
it stands for the exact exchange.
rho [ndarray] Shape of ((,N)) for electron density (and derivatives) if spin = 0; Shape of
((,N),(,N)) for alpha/beta electron density (and derivatives) if spin > 0; where N is number of grids. rho (,N) are ordered as (den,grad_x,grad_y,grad_z,laplacian,tau) where grad_x
= d/dx den, laplacian = nabla^2 den, tau = 1/2(nabla f)^2 In spin unrestricted case, rho is
((den_u,grad_xu,grad_yu,grad_zu,laplacian_u,tau_u)
(den_d,grad_xd,grad_yd,grad_zd,laplacian_d,tau_d))
Kwargs:
spin [int] spin polarized if spin > 0
relativity [int] No effects.
verbose [int or object of Logger] No effects.
Returns: ex, vxc, fxc, kxc
where
• vxc = (vrho, vsigma, vlapl, vtau) for restricted case
• vxc for unrestricted case | vrho[:,2] = (u, d) | vsigma[:,3] = (uu, ud, dd) | vlapl[:,2] = (u, d) | vtau[:,2]
= (u, d)
• fxc for restricted case: (v2rho2, v2rhosigma, v2sigma2, v2lapl2, vtau2, v2rholapl, v2rhotau,
v2lapltau, v2sigmalapl, v2sigmatau)
• fxc for unrestricted case: | v2rho2[:,3] = (u_u, u_d, d_d) | v2rhosigma[:,6] = (u_uu, u_ud, u_dd,
d_uu, d_ud, d_dd) | v2sigma2[:,6] = (uu_uu, uu_ud, uu_dd, ud_ud, ud_dd, dd_dd) | v2lapl2[:,3] |
vtau2[:,3] | v2rholapl[:,4] | v2rhotau[:,4] | v2lapltau[:,4] | v2sigmalapl[:,6] | v2sigmatau[:,6]
204

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

• kxc for restricted case: (v3rho3, v3rho2sigma, v3rhosigma2, v3sigma3)
• kxc for unrestricted case: | v3rho3[:,4] = (u_u_u, u_u_d, u_d_d, d_d_d) | v3rho2sigma[:,9] =
(u_u_uu, u_u_ud, u_u_dd, u_d_uu, u_d_ud, u_d_dd, d_d_uu, d_d_ud, d_d_dd) | v3rhosigma2[:,12]
= (u_uu_uu, u_uu_ud, u_uu_dd, u_ud_ud, u_ud_dd, u_dd_dd, d_uu_uu, d_uu_ud, d_uu_dd,
d_ud_ud, d_ud_dd, d_dd_dd) | v3sigma3[:,10] = (uu_uu_uu, uu_uu_ud, uu_uu_dd, uu_ud_ud,
uu_ud_dd, uu_dd_dd, ud_ud_ud, ud_ud_dd, ud_dd_dd, dd_dd_dd)
see also libxc_itrf.c
pyscf.dft.libxc.hybrid_coeff(xc_code, spin=0)
Support recursively defining hybrid functional
pyscf.dft.libxc.parse_xc(description)
Rules to input functional description:
•The given functional description must be a one-line string.
•The functional description is case-insensitive.
•The functional description string has two parts, separated by ”,”. The first part describes the exchange
functional, the second is the correlation functional.
–If ”,” was not appeared in string, the entire string is considered as X functional.
–To neglect X functional (just apply C functional), leave blank in the first part, eg description=’,vwn’
for pure VWN functional
•The functional name can be placed in arbitrary order. Two names need to be separated by operators “+”
or “-”. Blank spaces are ignored. NOTE the parser only reads operators “+” “-” “*”. “/” is not supported.
•A functional name is associated with one factor. If the factor is not given, it is assumed to equal 1.
•String “HF” stands for exact exchange (HF K matrix). It is allowed to in the C functional part.
•Be careful with the libxc convention on GGA functional, in which the LDA contribution is included.
pyscf.dft.libxc.parse_xc_name(xc_name=’LDA, VWN’)
Convert the XC functional name to libxc library internal ID.

1.13 tddft — Time dependent density functional theory
1.13.1 TDHF
pyscf.tddft.rhf.gen_tda_hop(mf,
fock_ao=None,
max_memory=2000)
(A+B)x

singlet=True,

wfnsym=None,

Kwargs:
wfnsym [int] Point group symmetry for excited CIS wavefunction.

1.13.2 TDDFT
class pyscf.tddft.rks.TDDFTNoHybrid(mf )
Solve (A-B)(A+B)(X+Y) = (X+Y)w^2
kernel(x0=None)
TDDFT diagonalization solver

1.13. tddft — Time dependent density functional theory

205

PySCF Documentation, Release 1.4.0

1.14 cc — Coupled cluster
The cc module implements the coupled cluster (CC) model to compute energies, analytical nuclear gradients, density
matrices, excited states, and relevant properties.
To compute the CC energy, one first needs to perform a mean-field calculation using the mean-field module scf. The
mean-field object defines the Hamiltonian and the problem size, which are used to initialize the CC object:
from pyscf import gto, scf, cc
mol = gto.M(atom='H 0 0 0; F 0 0 1', basis='ccpvdz')
mf = scf.RHF(mol).run()
mycc = cc.CCSD(mf)
mycc.kernel()

Unrelaxed density matrices are evaluated in the MO basis:
dm1 = mycc.make_rdm1()
dm2 = mycc.make_rdm2()

The CCSD(T) energy can be obtained by:
from pyscf.cc import ccsd_t
print(ccsd_t.kernel(mycc, mycc.ao2mo())[0])

Gradients are available:
from pyscf.cc import ccsd_grad
from pyscf import grad
grad_e = ccsd_grad.kernel(mycc)
grad_n = grad.grad_nuc(mol)
grad = grad_e + grad_nuc

Excited states can be calculated with ionization potential (IP), electron affinity (EA), and electronic excitation (EE)
equation-of-motion (EOM) CCSD:
mycc = cc.RCCSD(mf)
mycc.kernel()
e_ip, c_ip = mycc.ipccsd(nroots=1)
e_ea, c_ea = mycc.eaccsd(nroots=1)
e_ee, c_ee = mycc.eeccsd(nroots=1)
mycc = cc.UCCSD(mf)
mycc.kernel()
e_ip, c_ip = mycc.ipccsd(nroots=1)
e_ea, c_ea = mycc.eaccsd(nroots=1)
e_ee, c_ee = mycc.eeccsd(nroots=1)

All CC methods have two implementations. One is simple and highly readable (suffixed by _slow in the filename)
and the other is extensively optimized for computational efficiency. All code in the _slow versions is structured as
close as possible to the formulas documented in the literature. Pure Python/numpy data structures and functions are
used so that explicit memory management is avoided. It is easy to make modifications or develop new methods based
on the slow implementations.
The computationally efficient (outcore) version is the default implementation for the CC module. In this implementation, the CPU usage, memory footprint, memory efficiency, and IO overhead are carefully considered. To keep a
small memory footprint, most integral tensors are stored on disk. IO is one of the main bottlenecks in this implementation. Two techniques are used to reduce the IO overhead. One is the asynchronized IO to overlap the computation

206

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

and reading/writing of the 4-index tensors. The other is AO-driven for the contraction of T2 and (vv|vv) integrals
in CCSD and CCSD-lambda functions. These techniques allow the CC module to efficiently handle medium-sized
systems. In a test system with 25 occupied orbitals and 1500 virtual orbitals, each CCSD iteration takes about 2.5
hours. The program does not automatically switch to AO-driven CCSD for large systems. The user must manually set
the direct attribute to enable an AO-driven CCSD calculation:
mycc = cc.CCSD(mf)
mycc.direct = True
mycc.kernel()

Some of the CC methods have an efficient incore implementation, where all tensors are held in memory. The incore
implementation reduces the IO overhead and optimizes certain formulas to gain the best FLOPS. It is about 30% faster
than the outcore implementation. Depending on the available memory, the incore code can be used for systems with
up to approximately 250 orbitals.
Point group symmetry is not considered in the CCSD programs, but it is used in the CCSD(T) code to gain the best
performance.
Arbitrary frozen orbitals (not limited to frozen core) are supported by the CCSD, CCSD(T), density matrices, and
EOM-CCSD modules, but not in the analytical CCSD gradient module.

1.14.1 Examples
This section documents some examples about how to effectively use the CCSD module, and how to incorporate the
CCSD solver with other PySCF functions to perform advanced simulations. For a complete list of CC examples, see
pyscf/examples/cc.
A general solver for customized Hamiltonian
The CC module is not limited to molecular systems. The program is implemented as a general solver for arbitrary
Hamiltonians. It allows users to overwrite the default molecular Hamiltonian with their own effective Hamiltonians.
In this example, we create a Hubbard model and feed its Hamiltonian to the CCSD module.
#!/usr/bin/env python
'''
Six-site 1D U/t=2 Hubbard-like model system with PBC at half filling.
The model is gapped at the mean-field level
'''
import numpy
from pyscf import gto, scf, ao2mo, cc
mol = gto.M(verbose=4)
n = 6
mol.nelectron = n
# Setting incore_anyway=True to ensure the customized Hamiltonian (the _eri
# attribute) being used in post-HF calculations. Without this parameter, some
# post-HF method may ignore the customized Hamiltonian if memory is not
# enough.
mol.incore_anyway = True
h1 = numpy.zeros((n,n))
for i in range(n-1):
h1[i,i+1] = h1[i+1,i] = -1.0
h1[n-1,0] = h1[0,n-1] = -1.0

1.14. cc — Coupled cluster

207

PySCF Documentation, Release 1.4.0

eri = numpy.zeros((n,n,n,n))
for i in range(n):
eri[i,i,i,i] = 2.0
mf = scf.RHF(mol)
mf.get_hcore = lambda *args: h1
mf.get_ovlp = lambda *args: numpy.eye(n)
mf._eri = ao2mo.restore(8, eri, n)
mf.kernel()

# In PySCF, the customized Hamiltonian needs to be created once in mf object.
# The Hamiltonian will be used everywhere whenever possible. Here, the model
# Hamiltonian is passed to CCSD object via the mf object.
mycc = cc.RCCSD(mf)
mycc.kernel()
e,v = mycc.ipccsd(nroots=3)
print(e)

Using CCSD as CASCI active space solver
CCSD program can be wrapped as a Full CI solver, which can be combined with the CASCI solver to approximate the
multi-configuration calculation.
#!/usr/bin/env python
'''
Using the CCSD method as the active space solver to compute an approximate
CASCI energy.
A wrapper is required to adapt the CCSD solver to CASCI fcisolver interface.
Inside the wrapper function, the CCSD code is the same as the example
40-ccsd_with_given_hamiltonian.py
'''
import numpy
from pyscf import gto, scf, cc, ao2mo, mcscf
class AsFCISolver(object):
def __init__(self):
self.mycc = None
def kernel(self, h1, h2, norb, nelec, ci0=None, ecore=0, **kwargs):
fakemol = gto.M(verbose=0)
nelec = numpy.sum(nelec)
fakemol.nelectron = nelec
fake_hf = scf.RHF(fakemol)
fake_hf._eri = ao2mo.restore(8, h2, norb)
fake_hf.get_hcore = lambda *args: h1
fake_hf.get_ovlp = lambda *args: numpy.eye(norb)
fake_hf.kernel()
self.mycc = cc.CCSD(fake_hf)
self.eris = self.mycc.ao2mo()
e_corr, t1, t2 = self.mycc.kernel(eris=self.eris)
l1, l2 = self.mycc.solve_lambda(t1, t2, eris=self.eris)

208

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

e = fake_hf.e_tot + e_corr
return e+ecore, [t1,t2,l1,l2]
def make_rdm1(self, fake_ci, norb, nelec):
mo = self.mycc.mo_coeff
t1, t2, l1, l2 = fake_ci
dm1 = reduce(numpy.dot, (mo, self.mycc.make_rdm1(t1, t2, l1, l2), mo.T))
return dm1
def make_rdm12(self, fake_ci, norb, nelec):
mo = self.mycc.mo_coeff
nmo = mo.shape[1]
t1, t2, l1, l2 = fake_ci
dm2 = self.mycc.make_rdm2(t1, t2, l1, l2)
dm2 = numpy.dot(mo, dm2.reshape(nmo,-1))
dm2 = numpy.dot(dm2.reshape(-1,nmo), mo.T)
dm2 = dm2.reshape([nmo]*4).transpose(2,3,0,1)
dm2 = numpy.dot(mo, dm2.reshape(nmo,-1))
dm2 = numpy.dot(dm2.reshape(-1,nmo), mo.T)
dm2 = dm2.reshape([nmo]*4)
return self.make_rdm1(fake_ci, norb, nelec), dm2
def spin_square(self, fake_ci, norb, nelec):
return 0, 1
mol = gto.M(atom = 'H 0 0 0; F 0 0 1.2',
basis = 'ccpvdz',
verbose = 4)
mf = scf.RHF(mol).run()
norb = mf.mo_coeff.shape[1]
nelec = mol.nelectron
mc = mcscf.CASCI(mf, norb, nelec)
mc.fcisolver = AsFCISolver()
mc.kernel()

Gamma point CCSD with Periodic boundary condition
Integrals in Gamma point of periodic Hartree-Fock calculation are all real. You can feed the integrals into any pyscf
molecular module using the same operations as the above example. However, the interface between PBC code and
molecular code are more compatible. You can treat the crystal object and the molecule object in the same manner. In
this example, you can pass the PBC mean field method to CC module to have the gamma point CCSD correlation.
#!/usr/bin/env python
'''
Gamma point post-HF calculation needs only real integrals.
Methods implemented in finite-size system can be directly used here without
any modification.
'''
import numpy
from pyscf.pbc import gto, scf
cell = gto.M(
a = numpy.eye(3)*3.5668,

1.14. cc — Coupled cluster

209

PySCF Documentation, Release 1.4.0

atom = '''C
0.
C
0.8917
C
1.7834
C
2.6751
C
1.7834
C
2.6751
C
0.
C
0.8917
basis = '6-31g',
verbose = 4,

0.
0.8917
1.7834
2.6751
0.
0.8917
1.7834
2.6751

0.
0.8917
0.
0.8917
1.7834
2.6751
1.7834
2.6751''',

)
mf = scf.RHF(cell).density_fit()
mf.with_df.gs = [5]*3
mf.kernel()
#
# Import CC, TDDFT moduel from the molecular implementations
#
from pyscf import cc, tddft
mycc = cc.CCSD(mf)
mycc.kernel()
mytd = tddft.TDHF(mf)
mytd.nstates = 5
mytd.kernel()

CCSD with truncated MOs to avoid linear dependency
It is common to have linear dependence when one wants to systematically enlarge the AO basis set to approach
complete basis set limit. The numerical instability usually has noticeable effects on the CCSD convergence. An
effective way to remove this negative effects is to truncate the AO sets and allow the MO orbitals being less than AO
functions.
#!/usr/bin/env python
'''
:func:`scf.addons.remove_linear_dep_` discards the small eigenvalues of overlap
matrix. This reduces the number of MOs from 50 to 49. The problem size of
the following CCSD method is 49.
'''
from pyscf import gto, scf, cc
mol = gto.Mole()
mol.atom = [('H', 0, 0, .5*i) for i in range(20)]
mol.basis = 'ccpvdz'
mol.verbose = 4
mol.build()
mf = scf.RHF(mol).run()
mycc = cc.CCSD(mf).run()
mf = scf.addons.remove_linear_dep_(mf).run()
mycc = cc.CCSD(mf).run()

210

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

Response and un-relaxed CCSD density matrix
CCSD has two kinds of one-particle density matrices. The (second order) un-relaxed density matrix and the (relaxed)
response density matrix. The CCSD.make_rdm1() function computes the un-relaxed density matrix which is associated to the regular CCSD energy formula. The response density is mainly used to compute the first order response
quantities eg the analytical nuclear gradients. It is not recommended to use the response density matrix for population
analysis.
#!/usr/bin/env python
#
# Author: Qiming Sun 
#
'''
CCSD density matrix
'''
from pyscf import gto, scf, cc
mol = gto.M(
atom = 'H 0 0 0; F 0 0 1.1',
basis = 'ccpvdz')
mf = scf.RHF(mol).run()
mycc = cc.CCSD(mf).run()
#
# CCSD density matrix in MO basis
#
dm1 = mycc.make_rdm1()
dm2 = mycc.make_rdm2()
#
# Relaxed CCSD density matrix in MO basis
#
from pyscf.cc import ccsd_grad
dm1 += ccsd_grad.response_dm1(mycc, mycc.t1, mycc.t2, mycc.l1, mycc.l2)

Reusing integrals in CCSD and relevant calculations
By default the CCSD solver and the relevant CCSD lambda solver, CCSD(T), CCSD gradients program generate MO
integrals in their own runtime. But in most scenario, the same MO integrals can be generated once and reused in
the four modules. To remove the overhead of recomputing MO integrals, the three module support user to feed MO
integrals.
#!/usr/bin/env python
#
# Author: Qiming Sun 
#
'''
To avoid recomputing AO to MO integral transformation, integrals for CCSD,
CCSD(T), CCSD lambda equation etc can be reused.
'''
from pyscf import gto, scf, cc

1.14. cc — Coupled cluster

211

PySCF Documentation, Release 1.4.0

mol = gto.M(verbose = 4,
atom = 'H 0 0 0; F 0 0 1.1',
basis = 'ccpvdz')
mf = scf.RHF(mol).run()
mycc = cc.CCSD(mf)
#
# CCSD module allows you feed MO integrals
#
eris = mycc.ao2mo()
mycc.kernel(eris=eris)
#
# The same MO integrals can be used in CCSD lambda equation
#
mycc.solve_lambda(eris=eris)
#
# CCSD(T) module requires the same integrals used by CCSD module
#
from pyscf.cc import ccsd_t
ccsd_t.kernel(mycc, eris=eris)
#
# CCSD gradients need regular MO integrals to solve the relaxed 1-particle
# density matrix
#
from pyscf.cc import ccsd_grad
grad_e = ccsd_grad.kernel(mycc, eris=eris) # The electronic part only

Interfering CCSD-DIIS
Restart CCSD

1.14.2 Program reference
cc.ccsd module and CCSD class
The pyscf.cc.ccsd.CCSD class is the object to hold the restricted CCSD environment attributes and results. The
environment attributes are the parameters to control the runtime behavior of the CCSD module, e.g. the convergence
criteria, DIIS parameters, and so on. After the ground state CCSD calculation, correlation energy, T1 and T2 amplitudes are stored in the CCSD object. This class supports the calculation of CCSD 1- and 2-particle density matrices.
class pyscf.cc.ccsd.CCSD(mf, frozen=0, mo_coeff=None, mo_occ=None)
restricted CCSD
Attributes:
verbose [int] Print level. Default value equals to Mole.verbose
max_memory [float or int] Allowed memory in MB. Default value equals to Mole.max_memory
conv_tol [float] converge threshold. Default is 1e-7.

212

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

conv_tol_normt [float] converge threshold for norm(t1,t2). Default is 1e-5.
max_cycle [int] max number of iterations. Default is 50.
diis_space [int] DIIS space size. Default is 6.
diis_start_cycle [int] The step to start DIIS. Default is 0.
direct [bool] AO-direct CCSD. Default is False.
frozen [int or list] If integer is given, the inner-most orbitals are frozen from CC amplitudes. Given the
orbital indices (0-based) in a list, both occupied and virtual orbitals can be frozen in CC calculation.
>>>
>>>
>>>
>>>
>>>
>>>

mol = gto.M(atom = 'H 0 0 0; F 0 0 1.1', basis = 'ccpvdz')
mf = scf.RHF(mol).run()
# freeze 2 core orbitals
mycc = cc.CCSD(mf).set(frozen = 2).run()
# freeze 2 core orbitals and 3 high lying unoccupied orbitals
mycc.set(frozen = [0,1,16,17,18]).run()

Saved results
converged [bool] CCSD converged or not
e_corr [float] CCSD correlation correction
e_tot [float] Total CCSD energy (HF + correlation)
t1, t2 [] T amplitudes t1[i,a], t2[i,j,a,b] (i,j in occ, a,b in virt)
l1, l2 [] Lambda amplitudes l1[i,a], l2[i,j,a,b] (i,j in occ, a,b in virt)
pyscf.cc.ccsd.CC
alias of CCSD
class pyscf.cc.ccsd.CCSD(mf, frozen=0, mo_coeff=None, mo_occ=None)
restricted CCSD
Attributes:
verbose [int] Print level. Default value equals to Mole.verbose
max_memory [float or int] Allowed memory in MB. Default value equals to Mole.max_memory
conv_tol [float] converge threshold. Default is 1e-7.
conv_tol_normt [float] converge threshold for norm(t1,t2). Default is 1e-5.
max_cycle [int] max number of iterations. Default is 50.
diis_space [int] DIIS space size. Default is 6.
diis_start_cycle [int] The step to start DIIS. Default is 0.
direct [bool] AO-direct CCSD. Default is False.
frozen [int or list] If integer is given, the inner-most orbitals are frozen from CC amplitudes. Given the
orbital indices (0-based) in a list, both occupied and virtual orbitals can be frozen in CC calculation.
>>>
>>>
>>>
>>>
>>>
>>>

mol = gto.M(atom = 'H 0 0 0; F 0 0 1.1', basis = 'ccpvdz')
mf = scf.RHF(mol).run()
# freeze 2 core orbitals
mycc = cc.CCSD(mf).set(frozen = 2).run()
# freeze 2 core orbitals and 3 high lying unoccupied orbitals
mycc.set(frozen = [0,1,16,17,18]).run()

1.14. cc — Coupled cluster

213

PySCF Documentation, Release 1.4.0

Saved results
converged [bool] CCSD converged or not
e_corr [float] CCSD correlation correction
e_tot [float] Total CCSD energy (HF + correlation)
t1, t2 [] T amplitudes t1[i,a], t2[i,j,a,b] (i,j in occ, a,b in virt)
l1, l2 [] Lambda amplitudes l1[i,a], l2[i,j,a,b] (i,j in occ, a,b in virt)
as_scanner(cc)
Generating a scanner/solver for CCSD PES.
The returned solver is a function. This function requires one argument “mol” as input and returns total
CCSD energy.
The solver will automatically use the results of last calculation as the initial guess of the new calculation.
All parameters assigned in the CCSD and the underlying SCF objects (conv_tol, max_memory etc) are
automatically applied in the solver.
Note scanner has side effects. It may change many underlying objects (_scf, with_df, with_x2c, ...) during
calculation.
Examples:
>>>
>>>
>>>
>>>
>>>

from pyscf import gto, scf, cc
mol = gto.M(atom='H 0 0 0; F 0 0 1')
cc_scanner = cc.CCSD(scf.RHF(mol)).as_scanner()
e_tot, grad = cc_scanner(gto.M(atom='H 0 0 0; F 0 0 1.1'))
e_tot, grad = cc_scanner(gto.M(atom='H 0 0 0; F 0 0 1.5'))

energy(mycc, t1, t2, eris)
CCSD correlation energy
make_rdm1(t1=None, t2=None, l1=None, l2=None)
Un-relaxed 1-particle density matrix in MO space
make_rdm2(t1=None, t2=None, l1=None, l2=None)
2-particle density matrix in MO space. The density matrix is stored as
dm2[p,r,q,s] = 
pyscf.cc.ccsd.as_scanner(cc)
Generating a scanner/solver for CCSD PES.
The returned solver is a function. This function requires one argument “mol” as input and returns total CCSD
energy.
The solver will automatically use the results of last calculation as the initial guess of the new calculation. All parameters assigned in the CCSD and the underlying SCF objects (conv_tol, max_memory etc) are automatically
applied in the solver.
Note scanner has side effects. It may change many underlying objects (_scf, with_df, with_x2c, ...) during
calculation.
Examples:
>>>
>>>
>>>
>>>
>>>

214

from pyscf import gto, scf, cc
mol = gto.M(atom='H 0 0 0; F 0 0 1')
cc_scanner = cc.CCSD(scf.RHF(mol)).as_scanner()
e_tot, grad = cc_scanner(gto.M(atom='H 0 0 0; F 0 0 1.1'))
e_tot, grad = cc_scanner(gto.M(atom='H 0 0 0; F 0 0 1.5'))

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

pyscf.cc.ccsd.energy(mycc, t1, t2, eris)
CCSD correlation energy
cc.rccsd and RCCSD class
pyscf.cc.rccsd.RCCSD is also a class for restricted CCSD calculations, but different to the
pyscf.cc.ccsd.CCSD class. It uses different formula to compute the ground state CCSD solution. Although
slower than the implmentation in the pyscf.cc.ccsd.CCSD class, it supports the system with complex integrals.
Another difference is that this class supports EOM-CCSD methods, including EOM-IP-CCSD, EOM-EA-CCSD,
EOM-EE-CCSD, EOM-SF-CCSD.
class pyscf.cc.rccsd.RCCSD(mf, frozen=0, mo_coeff=None, mo_occ=None)
restricted CCSD with IP-EOM, EA-EOM, EE-EOM, and SF-EOM capabilities
Ground-state CCSD is performed in optimized ccsd.CCSD and EOM is performed here.
class pyscf.cc.rccsd.RCCSD(mf, frozen=0, mo_coeff=None, mo_occ=None)
restricted CCSD with IP-EOM, EA-EOM, EE-EOM, and SF-EOM capabilities
Ground-state CCSD is performed in optimized ccsd.CCSD and EOM is performed here.
ccsd(t1=None, t2=None, eris=None, mbpt2=False)
Ground-state CCSD.
Kwargs:
mbpt2 [bool] Use one-shot MBPT2 approximation to CCSD.
eaccsd(nroots=1, left=False, koopmans=False, guess=None, partition=None)
Calculate (N+1)-electron charged excitations via EA-EOM-CCSD.
Kwargs: See ipccd()
eeccsd(nroots=1, koopmans=False, guess=None)
Calculate N-electron neutral excitations via EE-EOM-CCSD.
Kwargs:
nroots [int] Number of roots (eigenvalues) requested
koopmans [bool] Calculate Koopmans’-like (1p1h) excitations only, targeting via overlap.
guess [list of ndarray] List of guess vectors to use for targeting via overlap.
eomsf_ccsd_matvec(vector)
Spin flip EOM-CCSD
ipccsd(nroots=1, left=False, koopmans=False, guess=None, partition=None)
Calculate (N-1)-electron charged excitations via IP-EOM-CCSD.
Kwargs:
nroots [int] Number of roots (eigenvalues) requested
partition [bool or str] Use a matrix-partitioning for the doubles-doubles block. Can be None, ‘mp’
(Moller-Plesset, i.e. orbital energies on the diagonal), or ‘full’ (full diagonal elements).
koopmans [bool] Calculate Koopmans’-like (quasiparticle) excitations only, targeting via overlap.
guess [list of ndarray] List of guess vectors to use for targeting via overlap.
pyscf.cc.rccsd.kernel(cc, eris, t1=None, t2=None, max_cycle=50, tol=1e-08, tolnormt=1e-06, verbose=4)
Exactly the same as pyscf.cc.ccsd.kernel, which calls a local energy() function.

1.14. cc — Coupled cluster

215

PySCF Documentation, Release 1.4.0

cc.uccsd and UCCSD class
pyscf.cc.uccsd.UCCSD class supports the CCSD calculation based on UHF wavefunction as well as the ROHF
wavefunction. Besides the ground state UCCSD calculation, UCCSD lambda equation, 1-particle and 2-particle density matrices, EOM-IP-CCSD, EOM-EA-CCSD, EOM-EE-CCSD are all available in this class. Note this class does
not support complex integrals.
class pyscf.cc.uccsd.UCCSD(mf, frozen=0, mo_coeff=None, mo_occ=None)
UCCSD with spatial integrals
pyscf.cc.uccsd.get_umoidx(cc)
Get MO boolean indices for unrestricted reference, accounting for frozen orbs.
pyscf.cc.uccsd.kernel(cc, eris, t1=None, t2=None, max_cycle=50, tol=1e-08, tolnormt=1e-06, verbose=4)
Exactly the same as pyscf.cc.ccsd.kernel, which calls a local energy() function.
pyscf.cc.uccsd.uspatial2spin(cc, moidx, mo_coeff )
Convert the results of an unrestricted mean-field calculation to spin-orbital form.
Spin-orbital ordering is determined by orbital energy without regard for spin.
Returns:
fock [(nso,nso) ndarray] The Fock matrix in the basis of spin-orbitals
so_coeff [(nao, nso) ndarray] The matrix of spin-orbital coefficients in the AO basis
spin [(nso,) ndarary] The spin (0 or 1) of each spin-orbital
cc.addons
Helper functions for CCSD, RCCSD and UCCSD modules are implemented in cc.addons
pyscf.cc.addons.spatial2spin(tx, orbspin=None)
Convert T1/T2 of spatial orbital representation to T1/T2 of spin-orbital representation
call orbspin_of_sorted_mo_energy to get orbspin
pyscf.cc.addons.spatial2spinorb(tx, orbspin=None)
Convert T1/T2 of spatial orbital representation to T1/T2 of spin-orbital representation
call orbspin_of_sorted_mo_energy to get orbspin
pyscf.cc.addons.spin2spatial(tx, orbspin)
call orbspin_of_sorted_mo_energy to get orbspin
CCSD(T)
CCSD gradients
pyscf.cc.ccsd_grad.as_scanner(cc)
Generating a scanner/solver for CCSD PES.
The returned solver is a function. This function requires one argument “mol” as input and returns total CCSD
energy.
The solver will automatically use the results of last calculation as the initial guess of the new calculation. All parameters assigned in the CCSD and the underlying SCF objects (conv_tol, max_memory etc) are automatically
applied in the solver.

216

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

Note scanner has side effects. It may change many underlying objects (_scf, with_df, with_x2c, ...) during
calculation.
Examples:
>>>
>>>
>>>
>>>
>>>

from pyscf import gto, scf, cc
mol = gto.M(atom='H 0 0 0; F 0 0 1')
cc_scanner = cc.CCSD(scf.RHF(mol)).as_scanner()
e_tot, grad = cc_scanner(gto.M(atom='H 0 0 0; F 0 0 1.1'))
e_tot, grad = cc_scanner(gto.M(atom='H 0 0 0; F 0 0 1.5'))

1.15 ci — Configuration interaction
The cc module implements the truncated CI model to compute energy.

1.16 dmrgscf
DMRG program interface.
There are two DMRG program interfaces available:
• Block interface provided the features including the DMRG-CASCI, the 1-step and 2-step DMRG-CASSCF,
second order pertubation for dynamic correlation. 1-, 2- and 3-particle density matrices.
• CheMPS2 interface provided the DMRG-CASCI and 2-step DMRG-CASSCF.
Simple usage:
>>> from pyscf import gto, scf, mcscf, dmrgscf, mrpt
>>> mol = gto.M(atom='C 0 0 0; C 0 0 1', basis='631g')
>>> mf = scf.RHF(mol).run()
>>> mc = dmrgscf.DMRGSCF(mf, 4, 4)
>>> mc.kernel()
-75.3374492511669
>>> mrpt.NEVPT(mc).compress_approx().kernel()
-0.10474250075684
>>> mc = mcscf.CASSCF(mf, 4, 4)
>>> mc.fcisolver = dmrgscf.CheMPS2(mol)
>>> mc.kernel()
-75.3374492511669

Note a few configurations in /path/to/dmrgscf/settings.py needs to be made before using the DMRG
interface code.

1.16.1 Block
DMRGCI is the main object to hold Block input parameters and results. DMRGSCF() is a shortcut function quickly
setup DMRG-CASSCF calculation. compress_approx() initializes the compressed MPS perturber for NEVPT2
calculation.
In DMRGCI object, you can set the following attributes to control Block program:
outputlevel [int] Noise level for Block program output.

1.15. ci — Configuration interaction

217

PySCF Documentation, Release 1.4.0

maxIter [int] Max DMRG sweeps
approx_maxIter [int] To control the DMRG-CASSCF approximate DMRG solver accuracy.
twodot_to_onedot [int] When to switch from two-dot algroithm to one-dot algroithm.
nroots [int] Number of states in the same irreducible representation to compute.
weights [list of floats] Use this attribute with “nroots” attribute to set state-average calculation.
restart [bool] To control whether to restart a DMRG calculation.
tol [float] DMRG convergence tolerence
maxM [int] Bond dimension
scheduleSweeps, scheduleMaxMs, scheduleTols, scheduleNoises [list] DMRG sweep scheduler. See
also Block documentation
wfnsym [str or int] Wave function irrep label or irrep ID
orbsym [list of int] irrep IDs of each orbital
groupname [str] groupname, orbsym together can control whether to employ symmetry in the calculation. “groupname = None and orbsym = []” requires the Block program using C1 symmetry.

1.16.2 CheMPS2
In CheMPS2, DMRG calculation can be controlled by:
wfn_irrep
dmrg_states
dmrg_noise
dmrg_e_convergence
dmrg_noise_factor
dmrg_maxiter_noise
dmrg_maxiter_silent
See http://sebwouters.github.io/CheMPS2/index.html for more detail usages of these keywords.

1.17 fciqmcscf
1.18 tools
1.18.1 FCIDUMP
pyscf.tools.fcidump.from_chkfile(output, chkfile, tol=1e-15, float_format=’ %.16g’)
Read SCF results from PySCF chkfile and transform 1-electron, 2-electron integrals using the SCF orbitals. The
transformed integrals is written to FCIDUMP
pyscf.tools.fcidump.from_integrals(output, h1e, h2e, nmo, nelec, nuc=0, ms=0, orbsym=[],
tol=1e-15, float_format=’ %.16g’)
Convert the given 1-electron and 2-electron integrals to FCIDUMP format
pyscf.tools.fcidump.read(filename)
Parse FCIDUMP. Return a dictionary to hold the integrals and parameters with keys: H1, H2, ECORE, NORB,
NELEC, MS, ORBSYM, ISYM

218

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

1.18.2 Molden
pyscf.tools.molden.load(moldenfile)
Extract mol and orbitals from molden file
pyscf.tools.molden.remove_high_l(mol, mo_coeff=None)
Remove high angular momentum (l >= 5) functions before dumping molden file. If molden function raised error
message RuntimeError l=5 is not supported, you can use this function to format orbitals.
Note the formated orbitals may have normalization problem. Some visualization tool will complain about the
orbital normalization error.
Examples:
>>> mol1, orb1 = remove_high_l(mol, mf.mo_coeff)
>>> molden.from_mo(mol1, outputfile, orb1)

1.18.3 GAMESS WFN
GAMESS WFN File format

1.18.4 Cubegen
pyscf.tools.cubegen.density(mol, outfile, dm, nx=80, ny=80, nz=80)
Calculates electron density.
Args: mol (Mole): Molecule to calculate the electron density for. outfile (str): Name of Cube file to be written.
dm (str): Density matrix of molecule. nx (int): Number of grid point divisions in x direction.
Note this is function of the molecule’s size; a larger molecule will have a coarser representation
than a smaller one for the same value.
ny (int): Number of grid point divisions in y direction. nz (int): Number of grid point divisions in z
direction.
pyscf.tools.cubegen.mep(mol, outfile, dm, nx=80, ny=80, nz=80)
Calculates the molecular electrostatic potential (MEP).
Args: mol (Mole): Molecule to calculate the MEP for. outfile (str): Name of Cube file to be written. dm (str):
Density matrix of molecule. nx (int): Number of grid point divisions in x direction.
Note this is function of the molecule’s size; a larger molecule will have a coarser representation
than a smaller one for the same value.
ny (int): Number of grid point divisions in y direction. nz (int): Number of grid point divisions in z
direction.

1.18.5 Print Matrix
pyscf.tools.dump_mat.dump_mo(mol, c, label=None, ncol=5, digits=5, start=1)
Format print for orbitals
Args:
stdout [file object] eg sys.stdout, or stdout = open(‘/path/to/file’) or mol.stdout if mol is an object initialized from gto.Mole
c [numpy.ndarray] Orbitals, each column is an orbital
1.18. tools

219

PySCF Documentation, Release 1.4.0

Kwargs:
label [list of strings] Row labels (default is AO labels)
Examples:
>>>
>>>
>>>
>>>
0
0
0
0
0
0
0
0
0

from pyscf import gto
mol = gto.M(atom='C 0 0 0')
mo = numpy.eye(mol.nao_nr())
dump_mo(mol, mo)
#0
#1
#2
C 1s
1.00
0.00
0.00
C 2s
0.00
1.00
0.00
C 3s
0.00
0.00
1.00
C 2px
0.00
0.00
0.00
C 2py
0.00
0.00
0.00
C 2pz
0.00
0.00
0.00
C 3px
0.00
0.00
0.00
C 3py
0.00
0.00
0.00
C 3pz
0.00
0.00
0.00

#3
0.00
0.00
0.00
1.00
0.00
0.00
0.00
0.00
0.00

#4
0.00
0.00
0.00
0.00
1.00
0.00
0.00
0.00
0.00

#5
0.00
0.00
0.00
0.00
0.00
1.00
0.00
0.00
0.00

#6
0.00
0.00
0.00
0.00
0.00
0.00
1.00
0.00
0.00

#7
0.00
0.00
0.00
0.00
0.00
0.00
0.00
1.00
0.00

#8
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
1.00

pyscf.tools.dump_mat.dump_rec(stdout, c, label=None, label2=None, ncol=5, digits=5, start=0)
Print an array in rectangular format
Args:
stdout [file object] eg sys.stdout, or stdout = open(‘/path/to/file’) or mol.stdout if mol is an object initialized from gto.Mole
c [numpy.ndarray] coefficients
Kwargs:
label [list of strings] Row labels (default is 1,2,3,4,...)
label2 [list of strings] Col labels (default is 1,2,3,4,...)
ncol [int] Number of columns in the format output (default 5)
digits [int] Number of digits of precision for floating point output (default 5)
start [int] The number to start to count the index (default 0)
Examples:
>>> import sys, numpy
>>> dm = numpy.eye(3)
>>> dump_rec(sys.stdout, dm)
#0
#1
#2
0
1.00000
0.00000
0.00000
1
0.00000
1.00000
0.00000
2
0.00000
0.00000
1.00000
>>> from pyscf import gto
>>> mol = gto.M(atom='C 0 0 0')
>>> dm = numpy.eye(mol.nao_nr())
>>> dump_rec(sys.stdout, dm, label=mol.ao_labels(), ncol=9, digits=2)
#0
#1
#2
#3
#4
#5
#6
#7
#8
0 C 1s
1.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0 C 2s
0.00
1.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0 C 3s
0.00
0.00
1.00
0.00
0.00
0.00
0.00
0.00
0.00
0 C 2px
0.00
0.00
0.00
1.00
0.00
0.00
0.00
0.00
0.00
0 C 2py
0.00
0.00
0.00
0.00
1.00
0.00
0.00
0.00
0.00
0 C 2pz
0.00
0.00
0.00
0.00
0.00
1.00
0.00
0.00
0.00

220

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

0
0
0

C 3px
C 3py
C 3pz

0.00
0.00
0.00

0.00
0.00
0.00

0.00
0.00
0.00

0.00
0.00
0.00

0.00
0.00
0.00

0.00
0.00
0.00

1.00
0.00
0.00

0.00
1.00
0.00

0.00
0.00
1.00

pyscf.tools.dump_mat.dump_tri(stdout, c, label=None, ncol=5, digits=5, start=0)
Format print for the lower triangular part of an array
Args:
stdout [file object] eg sys.stdout, or stdout = open(‘/path/to/file’) or mol.stdout if mol is an object initialized from gto.Mole
c [numpy.ndarray] coefficients
Kwargs:
label [list of strings] Row labels (default is 1,2,3,4,...)
ncol [int] Number of columns in the format output (default 5)
digits [int] Number of digits of precision for floating point output (default 5)
start [int] The number to start to count the index (default 0)
Examples:
>>> import sys, numpy
>>> dm = numpy.eye(3)
>>> dump_tri(sys.stdout, dm)
#0
#1
#2
0
1.00000
1
0.00000
1.00000
2
0.00000
0.00000
1.00000
>>> from pyscf import gto
>>> mol = gto.M(atom='C 0 0 0')
>>> dm = numpy.eye(mol.nao_nr())
>>> dump_tri(sys.stdout, dm, label=mol.ao_labels(), ncol=9, digits=2)
#0
#1
#2
#3
#4
#5
#6
#7
#8
0 C 1s
1.00
0 C 2s
0.00
1.00
0 C 3s
0.00
0.00
1.00
0 C 2px
0.00
0.00
0.00
1.00
0 C 2py
0.00
0.00
0.00
0.00
1.00
0 C 2pz
0.00
0.00
0.00
0.00
0.00
1.00
0 C 3px
0.00
0.00
0.00
0.00
0.00
0.00
1.00
0 C 3py
0.00
0.00
0.00
0.00
0.00
0.00
0.00
1.00
0 C 3pz
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
1.00

1.19 grad — Analytical nuclear gradients
1.19.1 Analytical nuclear gradients
Simple usage:
>>>
>>>
>>>
>>>

from pyscf import gto, scf, grad
mol = gto.M(atom='N 0 0 0; N 0 0 1', basis='ccpvdz')
mf = scf.RHF(mol).run()
grad.RHF(mf).kernel()

1.19. grad — Analytical nuclear gradients

221

PySCF Documentation, Release 1.4.0

1.20 hessian — Analytical nuclear Hessian
1.21 pbc — Periodic boundary conditions
The pbc module provides electronic structure implementations with periodic boundary conditions based on periodic
Gaussian basis functions. The PBC implementation supports both all-electron and pseudopotential descriptions.
In PySCF, the PBC implementation has a tight relation to the molecular implementation. The module names, function
names, and layouts of the PBC code are the same as (or as close as possible to) those of the molecular code. The PBC
code supports the use (and mixing) of basis sets, pseudopotentials, and effective core potentials developed accross
the materials science and quantum chemistry communites, offering great flexibility. Moreover, many post-mean-field
methods defined in the molecular code can be seamlessly mixed with PBC calculations performed at the gamma
point. For example, one can perform a gamma-point Hartree-Fock calculation in a supercell, followed by a CCSD(T)
calculation, which is implemented in the molecular code.
In the PBC k-point calculations, we make small changes to the gamma-point data structures and export KHF and
KDFT methods. On top of these KSCF methods, we have implemented k-point CCSD and k-point EOM-CCSD
methods. Other post-mean-field methods can be analogously written to explicitly enforce translational symmetry
through k-point sampling.
The list of modules described in this chapter is:

1.21.1 pbc.gto — Crystal cell structure
This module provides functions to setup the basic information of a PBC calculation. The pyscf.pbc.gto module is
analogous to the basic molecular pyscf.gto module. The Cell class for crystal structure unit cells is defined in this
module and is analogous to the basic molecular Mole class. Among other details, the basis set and pseudopotentials
are parsed in this module.
Cell class
The Cell class is defined as an extension of the molecular pyscf.gto.mole.Mole class. The Cell object offers
much of the same functionality as the Mole object. For example, one can use the Cell object to access the atomic
structure, basis functions, pseudopotentials, and certain analytical periodic integrals.
Similar to the input in a molecular calculation, one first creates a Cell object. After assigning the crystal parameters,
one calls build() to fully initialize the Cell object. A shortcut function M() is available at the module level to
simplify the input.
#!/usr/bin/env python
import numpy
import pyscf.lib
from pyscf.pbc import gto
#
# Simliar to the initialization of "Mole" object, here we need create a "Cell"
# object for periodic boundary systems.
#
cell = gto.Cell()
cell.atom = '''C
0.
0.
0.
C
0.8917 0.8917 0.8917
C
1.7834 1.7834 0.
C
2.6751 2.6751 0.8917

222

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

C
1.7834 0.
1.7834
C
2.6751 0.8917 2.6751
C
0.
1.7834 1.7834
C
0.8917 2.6751 2.6751'''
cell.basis = 'gth-szv'
cell.pseudo = 'gth-pade'
#
# Note the extra attribute ".a" in the "cell" initialization.
# .a is a matrix for lattice vectors. Each row of .a is a primitive vector.
#
cell.a = numpy.eye(3)*3.5668
cell.build()
#
# pbc.gto module provided a shortcut initialization function "gto.M", like the
# one of finite size problem
#
cell = gto.M(
atom = '''C
0.
0.
0.
C
0.8917 0.8917 0.8917
C
1.7834 1.7834 0.
C
2.6751 2.6751 0.8917
C
1.7834 0.
1.7834
C
2.6751 0.8917 2.6751
C
0.
1.7834 1.7834
C
0.8917 2.6751 2.6751''',
basis = 'gth-szv',
pseudo = 'gth-pade',
a = numpy.eye(3)*3.5668)

Beyond the basic parameters atom and basis, one needs to set the unit cell lattice vectors a (a 3x3 array, where
each row is a real-space primitive vector) and the numbers of grid points in the FFT-mesh in each positive direction
gs (a length-3 list or 1x3 array); the total number of grid points is 2 gs +1.
In certain cases, it is convenient to choose the FFT-mesh density based on the kinetic energy cutoff. The Cell class
offers an alternative attribute ke_cutoff that can be used to set the FFT-mesh. If ke_cutoff is set and gs is
None, the Cell
initialization function will convert the ke_cutoff to the equivalent FFT-mesh according to the
√
2𝐸cut 𝑇
relation g = 2𝜋 a and will overwrite the gs attribute.
Many PBC calculations are best performed using pseudopotentials, which are set via the pseudo attribute. Pseudopotentials alleviate the need for impractically dense FFT-meshes, although they represent a potentially uncontrolled
source of error. See Pseudo potential for further details and a list of available pseudopotentials.
The input parameters .a and .pseudo are immutable in the Cell object. We emphasize that the input format might
be different from the internal format used by PySCF. Similar to the convention in Mole, an internal Python data layer
is created to hold the formatted .a and .pseudo parameters used as input.
_pseudo The internal format to hold PBC pseudo potential parameters. It is represented with nested Python lists only.
Nuclear-nuclear interaction energies are evaluated by means of Ewald summation, which depends on three parameters:
the truncation radius for real-space lattice sums rcut, the Gaussian model charge ew_eta, and the energy cutoff
ew_cut. Although they can be set manually, these parameters are by default chosen automatically according to the
attribute precision, which likewise can be set manually or left to its default value.
Besides the methods and parameters provided by Mole class (see Chapter gto — Molecular structure and GTO basis),
there are some parameters frequently used in the code to access the information of the crystal.
kpts The scaled or absolute k-points (nkpts x 3 array). This variable is not held as an attribute in Cell object;

1.21. pbc — Periodic boundary conditions

223

PySCF Documentation, Release 1.4.0

instead, the Cell object provides functions to generate the k-points and convert the k-points between the scaled
(fractional) value and absolute value:
# Generate k-points
n_kpts_each_direction = [2,2,2]
abs_kpts = cell.make_kpts(n_kpts_each_direction)
# Convert k-points between two convention, the scaled and the absoulte values
scaled_kpts = cell.get_scaled_kpts(abs_kpts)
abs_kpts = cell.get_abs_kpts(scaled_kpts)

Gv The (N x 3) array of plane waves associated to gs. gs defines the number of FFT grids in each direction. Cell.Gv() or get_Gv() convert the FFT-mesh to the plane waves. Gv are the the plane
wave bases of 3D-FFT transformation. Given gs = [nx,ny,nz], the number of vectors in Gv is
(2*nx+1)*(2*ny+1)*(2*nz+1).
vol Cell.vol gives the volume of the unit cell (in atomic unit).
reciprocal_vectors A 3x3 array. Each row is a reciprocal space primitive vector.
energy_nuc Similar to the energy_nuc() provided by Mole class, this function also return the energy associated
to the nuclear repulsion. The nuclear repulsion energy is computed with Ewald summation technique. The
background contribution is removed from the nuclear repulsion energy otherwise this term is divergent.
pbc_intor PBC analytic integral driver. It allows user to compute the PBC integral array in bulk, for given integral
descriptor intor (see also Mole.intor() function moleintor). In the Cell object, we didn’t overload the
intor() method. So one can access both the periodic integrals and free-boundary integrals within the Cell
object. It allows you to input the cell object into the molecule program to run the free-boundary calculation (see
Connection to Mole class).
Note: pbc_intor() does not support Coulomb type integrals. Calling pbc_intor with Coulomb type integral
descriptor such as cint1e_nuc_sph leads to divergent integrals. The Coulomb type PBC integrals should be
evaluated with density fitting technique (see Chapter pbc.df — PBC denisty fitting).

Attributes and methods
class pyscf.pbc.gto.Cell(**kwargs)
A Cell object holds the basic information of a crystal.
Attributes:
a [(3,3) ndarray] Lattice primitive vectors. Each row represents a lattice vector Reciprocal lattice vectors
are given by b1,b2,b3 = 2 pi inv(a).T
gs [(3,) list of ints] The number of positive G-vectors along each direction. The default value is estimated
based on precision
pseudo [dict or str] To define pseudopotential.
precision [float] To control Ewald sums and lattice sums accuracy
rcut [float] Cutoff radius (unit Bohr) in lattice summation. The default value is estimated based on the
required precision.
ke_cutoff [float] If set, defines a spherical cutoff of planewaves, with .5 * G**2 < ke_cutoff The default
value is estimated based on precision
dimension [int] Default is 3

224

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

** Following attributes (for experts) are automatically generated. **
ew_eta, ew_cut [float] The Ewald ‘eta’ and ‘cut’ parameters. See get_ewald_params()
(See other attributes in Mole)
Examples:
>>>
>>>
>>>
>>>
C

mol = Mole(atom='H^2 0 0 0; H 0 0 1.1', basis='sto3g')
cl = Cell()
cl.build(a='3 0 0; 0 3 0; 0 0 3', gs=[8,8,8], atom='C 1 1 1', basis='sto3g')
print(cl.atom_symbol(0))

bas_rcut(cell, bas_id, precision=1e-08)
Estimate the largest distance between the function and its image to reach the precision in overlap
precision ~ int g(r-0) g(r-R)
build(dump_input=True, parse_arg=True, a=None, gs=None, ke_cutoff=None, precision=None,
nimgs=None, ew_eta=None, ew_cut=None, pseudo=None, basis=None, h=None, dimension=None, rcut=None, ecp=None, *args, **kwargs)
Setup Mole molecule and Cell and initialize some control parameters. Whenever you change the value of
the attributes of Cell, you need call this function to refresh the internal data of Cell.
Kwargs:
a [(3,3) ndarray] The real-space unit cell lattice vectors. Each row represents a lattice vector.
gs [(3,) ndarray of ints] The number of positive G-vectors along each direction.
pseudo [dict or str] To define pseudopotential. If given, overwrite Cell.pseudo
dumps(cell)
Serialize Cell object to a JSON formatted str.
energy_nuc(cell, ew_eta=None, ew_cut=None)
Perform real (R) and reciprocal (G) space Ewald sum for the energy.
Formulation of Martin, App. F2.
Returns:
float The Ewald energy consisting of overlap, self, and G-space sum.
See Also: pyscf.pbc.gto.get_ewald_params
ewald(cell, ew_eta=None, ew_cut=None)
Perform real (R) and reciprocal (G) space Ewald sum for the energy.
Formulation of Martin, App. F2.
Returns:
float The Ewald energy consisting of overlap, self, and G-space sum.
See Also: pyscf.pbc.gto.get_ewald_params
format_basis(basis_tab)
Convert the input Cell.basis to the internal data format:
{ atom: (l, kappa, ((-exp, c_1, c_2, ..), nprim, nctr, ptr-exps, ptr˓→contraction-coeff)), ... }

Args:

1.21. pbc — Periodic boundary conditions

225

PySCF Documentation, Release 1.4.0

basis_tab [dict] Similar to Cell.basis, it cannot be a str
Returns: Formated basis
Examples:
>>> pbc.format_basis({'H':'gth-szv'})
{'H': [[0,
(8.3744350009, -0.0283380461),
(1.8058681460, -0.1333810052),
(0.4852528328, -0.3995676063),
(0.1658236932, -0.5531027541)]]}

format_pseudo(pseudo_tab)
Convert the input Cell.pseudo (dict) to the internal data format:
{ atom: ( (nelec_s, nele_p, nelec_d, ...),
rloc, nexp, (cexp_1, cexp_2, ..., cexp_nexp),
nproj_types,
(r1, nproj1, ( (hproj1[1,1], hproj1[1,2], ..., hproj1[1,nproj1]),
(hproj1[2,1], hproj1[2,2], ..., hproj1[2,nproj1]),
...
(hproj1[nproj1,1], hproj1[nproj1,2], ...
) )),
(r2, nproj2, ( (hproj2[1,1], hproj2[1,2], ..., hproj2[1,nproj1]),
... ) )
)
... }

Args:
pseudo_tab [dict] Similar to Cell.pseudo (a dict), it cannot be a str
Returns: Formatted pseudo
Examples:
>>> pbc.format_pseudo({'H':'gth-blyp', 'He': 'gth-pade'})
{'H': [[1],
0.2, 2, [-4.19596147, 0.73049821], 0],
'He': [[2],
0.2, 2, [-9.1120234, 1.69836797], 0]}

from_ase(ase_atom)
Update cell based on given ase atom object
Examples:
>>> from ase.lattice import bulk
>>> cell.from_ase(bulk('C', 'diamond', a=LATTICE_CONST))

gen_uniform_grids(cell, gs=None)
Generate a uniform real-space grid consistent w/ samp thm; see MH (3.19).
Args: cell : instance of Cell
Returns:
coords [(ngx*ngy*ngz, 3) ndarray] The real-space grid point coordinates.

226

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

get_Gv(cell, gs=None)
Calculate three-dimensional G-vectors for the cell; see MH (3.8).
Indices along each direction go as [0...cell.gs, -cell.gs...-1] to follow FFT convention. Note that, for each
direction, ngs = 2*cell.gs+1.
Args: cell : instance of Cell
Returns:
Gv [(ngs, 3) ndarray of floats] The array of G-vectors.
get_Gv_weights(cell, gs=None)
Calculate G-vectors and weights.
Returns:
Gv [(ngs, 3) ndarray of floats] The array of G-vectors.
get_SI(cell, Gv=None)
Calculate the structure factor for all atoms; see MH (3.34).
Args: cell : instance of Cell
Gv [(N,3) array] G vectors
Returns:
SI [(natm, ngs) ndarray, dtype=np.complex128] The structure factor for each atom at each G-vector.
get_abs_kpts(scaled_kpts)
Get absolute k-points (in 1/Bohr), given “scaled” k-points in fractions of lattice vectors.
Args: scaled_kpts : (nkpts, 3) ndarray of floats
Returns: abs_kpts : (nkpts, 3) ndarray of floats
get_bounding_sphere(cell, rcut)
Finds all the lattice points within a sphere of radius rcut.
Defines a parallelipiped given by -N_x <= n_x <= N_x, with x in [1,3] See Martin p. 85
Args:
rcut [number] real space cut-off for interaction
Returns: cut : ndarray of 3 ints defining N_x
get_ewald_params(cell, precision=1e-08, gs=None)
Choose a reasonable value of Ewald ‘eta’ and ‘cut’ parameters.
Choice is based on largest G vector and desired relative precision.
The relative error in the G-space sum is given by
precision ~ 4pi Gmax^2 e^{(-Gmax^2)/(4 eta^2)}
which determines eta. Then, real-space cutoff is determined by (exp. factors only)
precision ~ erfc(eta*rcut) / rcut ~ e^{(-eta**2 rcut*2)}
Returns:
ew_eta, ew_cut [float] The Ewald ‘eta’ and ‘cut’ parameters.

1.21. pbc — Periodic boundary conditions

227

PySCF Documentation, Release 1.4.0

get_lattice_Ls(cell, nimgs=None, rcut=None, dimension=None)
Get the (Cartesian, unitful) lattice translation vectors for nearby images. The translation vectors can be
used for the lattice summation.
get_nimgs(cell, precision=None)
Choose number of basis function images in lattice sums to include for given precision in overlap, using
precision ~ int r^l e^{-alpha r^2} (r-rcut)^l e^{-alpha (r-rcut)^2} ~ (rcut^2/(2alpha))^l e^{alpha/2 rcut^2}
where alpha is the smallest exponent in the basis. Note that assumes an isolated exponent in the middle
of the box, so it adds one additional lattice vector to be safe.
get_scaled_kpts(abs_kpts)
Get scaled k-points, given absolute k-points in 1/Bohr.
Args: abs_kpts : (nkpts, 3) ndarray of floats
Returns: scaled_kpts : (nkpts, 3) ndarray of floats
has_ecp()
Whether pesudo potential is used in the system.
kernel(dump_input=True, parse_arg=True, a=None, gs=None, ke_cutoff=None, precision=None,
nimgs=None, ew_eta=None, ew_cut=None, pseudo=None, basis=None, h=None, dimension=None, rcut=None, ecp=None, *args, **kwargs)
Setup Mole molecule and Cell and initialize some control parameters. Whenever you change the value of
the attributes of Cell, you need call this function to refresh the internal data of Cell.
Kwargs:
a [(3,3) ndarray] The real-space unit cell lattice vectors. Each row represents a lattice vector.
gs [(3,) ndarray of ints] The number of positive G-vectors along each direction.
pseudo [dict or str] To define pseudopotential. If given, overwrite Cell.pseudo
lattice_vectors()
Convert the primitive lattice vectors.
Return 3x3 array in which each row represents one direction of the lattice vectors (unit in Bohr)
loads(molstr)
Deserialize a str containing a JSON document to a Cell object.
make_kpts(cell, nks, wrap_around=False, with_gamma_point=True)
Given number of kpoints along x,y,z , generate kpoints
Args: nks : (3,) ndarray
Kwargs:
wrap_around [bool] To ensure all kpts are in first Brillouin zone.
with_gamma_point [bool] Whether to shift Monkhorst-pack grid to include gamma-point.
Returns: kpts in absolute value (unit 1/Bohr). Gamma point is placed at the first place in the k-points list
Examples:
>>> cell.make_kpts((4,4,4))

pack(cell)
Pack the input args of Cell to a dict, which can be serialized with pickle
pbc_intor(intor, comp=1, hermi=0, kpts=None, kpt=None)
One-electron integrals with PBC. See also Mole.intor
228

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

reciprocal_vectors(norm_to=6.283185307179586)
a2 × a3
a1 · (a2 × a3 )
a3 × a1
(1.5)
b2 = 2𝜋
a2 · (a3 × a1 )
a1 × a2
b3 = 2𝜋
(1.6)
a3 · (a1 × a2 )

b1 = 2𝜋

(1.4)

to_mol()
Return a Mole object using the same atoms and basis functions as the Cell object.
unpack(moldic)
Convert the packed dict to a Cell object, to generate the input arguments for Cell object.
Connection to Mole class
Cell class is compatible with the molecule pyscf.gto.mole.Mole class. They shared most data structure and
methods. It gives the freedom to mix the finite size calculation and the PBC calculation. If you feed the cell object to
molecule module/functions, the molecule program will not check whether the given Mole object is the true Mole or
not. It simply treats the Cell object as the Mole object and run the finite size calculations. Because the same module
names were used in PBC program and molecule program, you should be careful with the imported modules since no
error message will be raised if you by mistake input the Cell object into the molecule program.
Although we reserve the flexibility to mix the Cell and Mole objects in the same code, it should be noted that the
serialization methods of the two objects are not completely compatible. When you dumps/loads the cell object in the
molecule program, informations of the Cell object or the faked Mole object may be lost.
Serialization
Cell class has two set of functions to serialize Cell object in different formats.
• JSON format is the default serialization format used by pyscf.lib.chkfile module. It can be serialized
by Cell.dumps() function and deserialized by Cell.loads() function.
• In the old version, Mole.pack() and Mole.unpack() functions are used to convert the Mole object to
and from Python dict. The Python dict is then serialized by pickle module. This serialization method is not used
anymore in the new PySCF code. To keep the backward compatibility, the two methods are defined in Cell
class.
Basis set
The pbc module supports all-electron calculation. The all-electron basis sets developed by quantum chemistry community can be directly used in the pbc calculation. The Cell class supports to mix the QC all-electron basis and PBC
basis in the same calculation.
#!/usr/bin/env python
'''
Basis can be input the same way as the finite-size system.
'''
#
# Note pbc.gto.parse does not support NWChem format.

1.21. pbc — Periodic boundary conditions

To parse NWChem format

229

PySCF Documentation, Release 1.4.0

# basis string, you need the molecule gto.parse function.
#
import numpy
from pyscf import gto
from pyscf.pbc import gto as pgto
cell = pgto.M(
atom = '''C
0.
0.
0.
C
0.8917 0.8917 0.8917
C
1.7834 1.7834 0.
C
2.6751 2.6751 0.8917
C
1.7834 0.
1.7834
C
2.6751 0.8917 2.6751
C
0.
1.7834 1.7834
C
0.8917 2.6751 2.6751''',
basis = {'C': gto.parse('''
# Parse NWChem format basis string (see https://bse.pnl.gov/bse/portal).
# Comment lines are ignored
#BASIS SET: (6s,3p) -> [2s,1p]
O
S
130.7093200
0.15432897
23.8088610
0.53532814
6.4436083
0.44463454
O
SP
5.0331513
-0.09996723
0.15591627
1.1695961
0.39951283
0.60768372
0.3803890
0.70011547
0.39195739
''')},
pseudo = 'gth-pade',
a = numpy.eye(3)*3.5668)

Note: The default PBC Coulomb type integrals are computed using FFT transformation. If the all-electron basis are
used, you might need very high energy cutoff to converge the integrals. It is recommended to use mixed density fitting
technique (pbc.df — PBC denisty fitting) to handle the all-electron calculations.

Pseudo potential
Quantum chemistry community developed a wide range of pseudo potentials (which are called ECP, effective core
potential) for heavy elements. ECP works quite successful in finite system. It has high flexibility to choose different
core size and relevant basis sets to satisfy different requirements on accuracy, efficiency in different simulation scenario. Extending ECP to PBC code enriches the pseudo potential database. PySCF PBC program supports both the
PBC conventional pseudo potential and ECP and the mix of the two kinds of potentials in the same calculation.
#!/usr/bin/env python
'''
Input pseudo potential using functions pbc.gto.pseudo.parse and pbc.gto.pseudo.load
It is allowed to mix the Quantum chemistry effective core potentail (ECP) with
crystal pseudo potential (PP). Input ECP with .ecp attribute and PP with
.pseudo attribute.
See also
pyscf/pbc/gto/pseudo/GTH_POTENTIALS for the GTH-potential format

230

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

pyscf/examples/gto/05-input_ecp.py for quantum chemistry ECP format
'''
import numpy
from pyscf.pbc import gto
cell = gto.M(atom='''
Si1 0 0 0
Si2 1 1 1''',
a = '''3
0
0
0
3
0
0
0
3''',
basis = {'Si1': 'gth-szv', # Goedecker, Teter and Hutter single zeta
˓→basis
'Si2': 'lanl2dz'},
pseudo = {'Si1': gto.pseudo.parse('''
Si
2
2
0.44000000
1
-6.25958674
2
0.44465247
2
8.31460936
-2.33277947
3.01160535
0.50279207
1
2.33241791
''')},
ecp = {'Si2': 'lanl2dz'}, # ECP for second Si atom
)
#
# Some elements have multiple PP definitions in GTH database.
# the basis name to load the specific PP.
#
cell = gto.M(
a = numpy.eye(3)*5,
gs = [4]*3,
atom = 'Mg1 0 0 0; Mg2 0 0 1',
pseudo = {'Mg1': 'gth-lda-q2', 'Mg2': 'gth-lda-q10'})

Add suffix in

#
# Allow mixing quantum chemistry ECP (or BFD PP) and crystal PP in the same
˓→calculation.
#
cell = gto.M(
a = '''4
0
0
0
4
0
0
0
4''',
atom = 'Cl 0 0 1; Na 0 1 0',
basis = {'na': 'gth-szv', 'Cl': 'bfd-vdz'},
ecp = {'Cl': 'bfd-pp'},
pseudo = {'Na': 'gthbp'})
#
# ECP can be input in the attribute .pseudo
#
cell = gto.M(
a = '''4
0
0
0
4
0
0
0
4''',
atom = 'Cl 0 0 1; Na 0 1 0',

1.21. pbc — Periodic boundary conditions

231

PySCF Documentation, Release 1.4.0

basis = {'na': 'gth-szv', 'Cl': 'bfd-vdz'},
pseudo = {'Na': 'gthbp', 'Cl': 'bfd-pp'})

1.21.2 pbc.scf — Mean-field with periodic boundary condition
This module is an analogy to molecular pyscf.scf module to handle mean-filed calculation with periodic boundary
condition.
Gamma point and single k-point calculation
The usage of gamma point Hartree-Fock program is very close to that of the molecular program. In the PBC gamma
point calculation, one needs intialize Cell object and the corresponding pyscf.pbc.scf.hf.RHF class:
from pyscf.pbc import gto, scf
cell = gto.M(
atom = '''H
0.
0.
H
0.8917 0.8917
basis = 'sto3g',
h = '''
0
1.7834 1.7834
1.7834 0
1.7834
1.7834 1.7834 0
''',
gs = [10]*3,
verbose = 4,
)
mf = scf.RHF(cell).run()

0.
0.8917''',

Comparing to the pyscf.scf.hf.RHF object for molecular calculation, the PBC-HF calculation with
pyscf.pbc.scf.hf.RHF or pyscf.pbc.scf.uhf.UHF has three differences
• psycf.pbc.scf.hf.RHF is the single k-point PBC HF class. By default, it creates the gamma point calculation. You can change to other k-point by setting the kpt attribute:
mf = scf.RHF(cell)
mf.kpt = cell.get_abs_kpts([.25,.25,.25])
mf.kernel()

# convert from scaled kpts

• The exchange integrals of the PBC Hartree-Fock method has slow convergence with respect to the number
of k-points. Proper treatments for the divergent part of exchange integrals can effectively improve the convergence. Attribute exxdive is used to control the method to handle exchange divergent term. The default
exxdiv='ewald' is favored in most scenario. However, if the molecular post-HF methods was mixed with
the gamma point HF method (see Mixing with molecular program for post-HF methods, you might need set
exxdiv=None to get consistent total energy (see Exchange divergence treatment).
• In the finite-size system, one can obtain right answer without considering the model to evaluate 2-electron
integrals. But the integral scheme might need to be updated in the PBC calculations. The default integral
scheme is accurate for pseudo-potential. In the all-electron calculation, you may need change the with_df
attribute to mixed density fitting (MDF) method for better accuracy (see with_df for density fitting). Here is an
example to update with_df
#!/usr/bin/env python
'''
Gamma point Hartree-Fock/DFT for all-electron calculation

232

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

The default FFT-based 2-electron integrals may not be accurate enough for
all-electron calculation. It's recommended to use MDF (mixed density fitting)
technique to improve the accuracy.
See also
examples/df/00-with_df.py
examples/df/01-auxbasis.py
examples/df/40-precomupte_df_ints.py
'''
import numpy
from pyscf.pbc import gto, scf, dft
cell = gto.M(
a = numpy.eye(3)*3.5668,
atom = '''C
0.
0.
C
0.8917 0.8917
C
1.7834 1.7834
C
2.6751 2.6751
C
1.7834 0.
C
2.6751 0.8917
C
0.
1.7834
C
0.8917 2.6751
basis = '6-31g',
verbose = 4,
)

0.
0.8917
0.
0.8917
1.7834
2.6751
1.7834
2.6751''',

mf = scf.RHF(cell).density_fit()
mf.kernel()
# Mixed density fitting is another option for all-electron calculations
mf = scf.RHF(cell).mix_density_fit()
mf.with_df.gs = [5]*3 # Tune #PWs in MDF for performance/accuracy balance
mf.kernel()
# Or use even-tempered Gaussian basis as auxiliary fitting functions.
# The following auxbasis is generated based on the expression
#
alpha = a * 1.7^i
i = 0..N
# where a and N are determined by the smallest and largest exponents of AO basis.
import pyscf.df
auxbasis = pyscf.df.aug_etb(cell, beta=1.7)
mf = scf.RHF(cell).density_fit(auxbasis=auxbasis)
mf.kernel()
#
# Second order SCF solver can be used in the PBC SCF code the same way in the
# molecular calculation
#
mf = dft.RKS(cell).density_fit(auxbasis='weigend')
mf.xc = 'bp86'
mf = scf.newton(mf)
mf.kernel()
#
# The computational costs to initialize PBC DF object is high. The density
# fitting integral tensor created in the initialization can be cached for
# future use. See also examples/df/40-precomupte_df_ints.py

1.21. pbc — Periodic boundary conditions

233

PySCF Documentation, Release 1.4.0

#
mf = dft.RKS(cell).density_fit(auxbasis='weigend')
mf.with_df._cderi_to_save = 'df_ints.h5'
mf.kernel()
#
# The DF integral tensor can be preloaded in an independent calculation.
#
mf = dft.RKS(cell).density_fit()
mf.with_df._cderi = 'df_ints.h5'
mf.kernel()

Mixing with molecular program for post-HF methods
The gamma point HF code adopts the same code structure, the function and method names and the arguments’ convention as the molecule SCF code. This desgin allows one mixing PBC HF object with the existed molecular post-HF
code for PBC electron correlation problems. A typical molecular post-HF calculation starts from the finite-size HF
method with the Mole object:
from pyscf import gto, scf
mol = gto.M(atom='H 0 0 0; H 0 0 1', basis='ccpvdz')
mf = scf.RHF(mol).run()
from pyscf import cc
cc.CCSD(mf).run()

The PBC gamma point post-HF calculation requires the Cell object and PBC HF object:
from pyscf.pbc import gto, scf
cell = gto.M(atom='H 0 0 0; H 0 0 1', basis='ccpvdz',
h=numpy.eye(3)*2, gs=[10,10,10])
mf = scf.RHF(cell).run()
from pyscf import cc
cc.CCSD(mf).run()

The differences are the the mol or cell object to create and the scf module to import. With the system-specific
mean-field object, one can carray out various post-HF methods (MP2, Coupled cluster, CISD, TDHF, TDDFT, ...)
using the same code for finite-size and extended systems. See Mixing PBC and molecular modules for more details of
the interface between PBC and molecular modules.
k-point sampling
Newton solver
Smearing
Exchange divergence treatment
The PBC Hartree-Fock has slow convergence of exchange integral with respect to the number of k-points. In the single
k-point calculation, Generally, exxdiv leads to a shift in the total energy and the spectrum of orbital energy. It should
not affect the following correlation energy in the post-HF calculation. In practice, when the gamma-point calculation
is mixed with molecular program eg the FCI solver, the exxdiv attribute may leads to inconsistency in the total energy.

234

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

with_df for density fitting
Placing the with_df attribute in SCF object to get the compatibility to molecule DF-SCF methods.
Stability analysis
Program reference
Hartree-Fock for periodic systems at a single k-point
See Also: pyscf.pbc.scf.khf.py : Hartree-Fock for periodic systems with k-point sampling
pyscf.pbc.scf.hf.RHF
alias of SCF
class pyscf.pbc.scf.hf.SCF(cell, kpt=array([ 0., 0., 0.]), exxdiv=’ewald’)
SCF class adapted for PBCs.
Attributes:
kpt [(3,) ndarray] The AO k-point in Cartesian coordinates, in units of 1/Bohr.
exxdiv [str] Exchange divergence treatment, can be one of

None : ignore G=0 contribution in exchange integral
‘ewald’ : Ewald summation for G=0 in exchange integral

with_df [density fitting object] Default is the FFT based DF model. For all-electron calculation, MDF
model is favored for better accuracy. See also pyscf.pbc.df.
direct_scf [bool] When this flag is set to true, the J/K matrices will be computed directly through the
underlying with_df methods. Otherwise, depending the available memory, the 4-index integrals
may be cached and J/K matrices are computed based on the 4-index integrals.
get_bands(mf, kpts_band, cell=None, dm=None, kpt=None)
Get energy bands at the given (arbitrary) ‘band’ k-points.
Returns:
mo_energy [(nmo,) ndarray or a list of (nmo,) ndarray] Bands energies E_n(k)
mo_coeff [(nao, nmo) ndarray or a list of (nao,nmo) ndarray] Band orbitals psi_n(k)
get_j(cell=None, dm=None, hermi=1, kpt=None, kpts_band=None)
Compute J matrix for the given density matrix.
get_jk(cell=None, dm=None, hermi=1, kpt=None, kpts_band=None)
Get Coulomb (J) and exchange (K) following scf.hf.RHF.get_jk_().
Note the incore version, which initializes an _eri array in memory.
get_jk_incore(cell=None, dm=None, hermi=1, verbose=5, kpt=None)
Get Coulomb (J) and exchange (K) following scf.hf.RHF.get_jk_().
Incore version of Coulomb and exchange build only. Currently RHF always uses PBC AO integrals
(unlike RKS), since exchange is currently computed by building PBC AO integrals.
get_k(cell=None, dm=None, hermi=1, kpt=None, kpts_band=None)
Compute K matrix for the given density matrix.

1.21. pbc — Periodic boundary conditions

235

PySCF Documentation, Release 1.4.0

get_veff(cell=None, dm=None, dm_last=0, vhf_last=0, hermi=1, kpt=None, kpts_band=None)
Hartree-Fock potential matrix for the given density matrix. See scf.hf.get_veff() and
scf.hf.RHF.get_veff()
pyscf.pbc.scf.hf.dot_eri_dm(eri, dm, hermi=0)
Compute J, K matrices in terms of the given 2-electron integrals and density matrix. eri or dm can be complex.
Args:
eri [ndarray] complex integral array with N^4 elements (N is the number of orbitals)
dm [ndarray or list of ndarrays] A density matrix or a list of density matrices
Kwargs:
hermi [int] Whether J, K matrix is hermitian

0 : no hermitian or symmetric
1 : hermitian
2 : anti-hermitian

Returns: Depending on the given dm, the function returns one J and one K matrix, or a list of J matrices and a
list of K matrices, corresponding to the input density matrices.
pyscf.pbc.scf.hf.get_bands(mf, kpts_band, cell=None, dm=None, kpt=None)
Get energy bands at the given (arbitrary) ‘band’ k-points.
Returns:
mo_energy [(nmo,) ndarray or a list of (nmo,) ndarray] Bands energies E_n(k)
mo_coeff [(nao, nmo) ndarray or a list of (nao,nmo) ndarray] Band orbitals psi_n(k)
pyscf.pbc.scf.hf.get_hcore(cell, kpt=array([ 0., 0., 0.]))
Get the core Hamiltonian AO matrix.
pyscf.pbc.scf.hf.get_j(cell, dm, hermi=1, vhfopt=None, kpt=array([ 0., 0., 0.]), kpts_band=None)
Get the Coulomb (J) AO matrix for the given density matrix.
Args:
dm [ndarray or list of ndarrays] A density matrix or a list of density matrices
Kwargs:
hermi [int] Whether J, K matrix is hermitian | 0 : no hermitian or symmetric | 1 : hermitian | 2 : antihermitian
vhfopt : A class which holds precomputed quantities to optimize the computation of J, K matrices
kpt [(3,) ndarray] The “inner” dummy k-point at which the DM was evaluated (or sampled).
kpts_band [(3,) ndarray or (*,3) ndarray] An arbitrary “band” k-point at which J is evaluated.
Returns: The function returns one J matrix, corresponding to the input density matrix (both order and shape).
pyscf.pbc.scf.hf.get_jk(mf, cell, dm, hermi=1, vhfopt=None, kpt=array([ 0., 0., 0.]),
kpts_band=None)
Get the Coulomb (J) and exchange (K) AO matrices for the given density matrix.
Args:
dm [ndarray or list of ndarrays] A density matrix or a list of density matrices

236

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

Kwargs:
hermi [int] Whether J, K matrix is hermitian | 0 : no hermitian or symmetric | 1 : hermitian | 2 : antihermitian
vhfopt : A class which holds precomputed quantities to optimize the computation of J, K matrices
kpt [(3,) ndarray] The “inner” dummy k-point at which the DM was evaluated (or sampled).
kpts_band [(3,) ndarray or (*,3) ndarray] An arbitrary “band” k-point at which J and K are evaluated.
Returns: The function returns one J and one K matrix, corresponding to the input density matrix (both order
and shape).
pyscf.pbc.scf.hf.get_nuc(cell, kpt=array([ 0., 0., 0.]))
Get the bare periodic nuc-el AO matrix, with G=0 removed.
See Martin (12.16)-(12.21).
pyscf.pbc.scf.hf.get_ovlp(cell, kpt=array([ 0., 0., 0.]))
Get the overlap AO matrix.
pyscf.pbc.scf.hf.get_t(cell, kpt=array([ 0., 0., 0.]))
Get the kinetic energy AO matrix.
pyscf.pbc.scf.hf.init_guess_by_chkfile(cell, chkfile_name, project=True, kpt=None)
Read the HF results from checkpoint file, then project it to the basis defined by cell
Returns: Density matrix, (nao,nao) ndarray
Unrestricted Hartree-Fock for periodic systems at a single k-point
See Also: pyscf.pbc.scf.khf.py : Hartree-Fock for periodic systems with k-point sampling
class pyscf.pbc.scf.uhf.UHF(cell, kpt=array([ 0., 0., 0.]), exxdiv=’ewald’)
UHF class for PBCs.
energy_tot(mf, dm=None, h1e=None, vhf=None)
Total Hartree-Fock energy, electronic part plus nuclear repulstion See scf.hf.energy_elec() for
the electron part
get_bands(kpts_band, cell=None, dm=None, kpt=None)
Get energy bands at the given (arbitrary) ‘band’ k-points.
Returns:
mo_energy [(nmo,) ndarray or a list of (nmo,) ndarray] Bands energies E_n(k)
mo_coeff [(nao, nmo) ndarray or a list of (nao,nmo) ndarray] Band orbitals psi_n(k)
get_j(cell=None, dm=None, hermi=1, kpt=None, kpts_band=None)
Compute J matrix for the given density matrix.
get_jk(cell=None, dm=None, hermi=1, kpt=None, kpts_band=None)
Get Coulomb (J) and exchange (K) following scf.hf.RHF.get_jk_().
Note the incore version, which initializes an _eri array in memory.
get_jk_incore(cell=None, dm=None, hermi=1, verbose=5, kpt=None)
Get Coulomb (J) and exchange (K) following scf.hf.RHF.get_jk_().
Incore version of Coulomb and exchange build only. Currently RHF always uses PBC AO integrals
(unlike RKS), since exchange is currently computed by building PBC AO integrals.
get_k(cell=None, dm=None, hermi=1, kpt=None, kpts_band=None)
Compute K matrix for the given density matrix.

1.21. pbc — Periodic boundary conditions

237

PySCF Documentation, Release 1.4.0

pyscf.pbc.scf.uhf.init_guess_by_chkfile(cell, chkfile_name, project=True, kpt=None)
Read the HF results from checkpoint file, then project it to the basis defined by cell
Returns: Density matrix, (nao,nao) ndarray
Hartree-Fock for periodic systems with k-point sampling
See Also: hf.py : Hartree-Fock for periodic systems at a single k-point
pyscf.pbc.scf.khf.KRHF
alias of KSCF
class pyscf.pbc.scf.khf.KSCF(cell, kpts=array([[ 0., 0., 0.]]), exxdiv=’ewald’)
SCF class with k-point sampling.
Compared to molecular SCF, some members such as mo_coeff, mo_occ now have an additional first dimension
for the k-points, e.g. mo_coeff is (nkpts, nao, nao) ndarray
Attributes:
kpts [(nks,3) ndarray] The sampling k-points in Cartesian coordinates, in units of 1/Bohr.
energy_elec(mf, dm_kpts=None, h1e_kpts=None, vhf_kpts=None)
Following pyscf.scf.hf.energy_elec()
get_bands(kpts_band, cell=None, dm_kpts=None, kpts=None)
Get energy bands at the given (arbitrary) ‘band’ k-points.
Returns:
mo_energy [(nmo,) ndarray or a list of (nmo,) ndarray] Bands energies E_n(k)
mo_coeff [(nao, nmo) ndarray or a list of (nao,nmo) ndarray] Band orbitals psi_n(k)
get_fermi(mf, mo_energy_kpts=None, mo_occ_kpts=None)
Fermi level
get_grad(mo_coeff_kpts, mo_occ_kpts, fock=None)
returns 1D array of gradients, like non K-pt version note that occ and virt indices of different k pts now
occur in sequential patches of the 1D array
get_occ(mf, mo_energy_kpts=None, mo_coeff_kpts=None)
Label the occupancies for each orbital for sampled k-points.
This is a k-point version of scf.hf.SCF.get_occ
get_ovlp(mf, cell=None, kpts=None)
Get the overlap AO matrices at sampled k-points.
Args: kpts : (nkpts, 3) ndarray
Returns: ovlp_kpts : (nkpts, nao, nao) ndarray
get_veff(cell=None,
dm_kpts=None,
dm_last=0,
vhf_last=0,
hermi=1,
kpts=None,
kpts_band=None)
Hartree-Fock potential matrix for the given density matrix. See scf.hf.get_veff() and
scf.hf.RHF.get_veff()
pyscf.pbc.scf.khf.analyze(mf, verbose=5, **kwargs)
Analyze the given SCF object: print orbital energies, occupancies; print orbital coefficients; Mulliken population
analysis; Dipole moment
pyscf.pbc.scf.khf.energy_elec(mf, dm_kpts=None, h1e_kpts=None, vhf_kpts=None)
Following pyscf.scf.hf.energy_elec()

238

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

pyscf.pbc.scf.khf.get_fermi(mf, mo_energy_kpts=None, mo_occ_kpts=None)
Fermi level
pyscf.pbc.scf.khf.get_grad(mo_coeff_kpts, mo_occ_kpts, fock)
returns 1D array of gradients, like non K-pt version note that occ and virt indices of different k pts now occur in
sequential patches of the 1D array
pyscf.pbc.scf.khf.get_hcore(mf, cell=None, kpts=None)
Get the core Hamiltonian AO matrices at sampled k-points.
Args: kpts : (nkpts, 3) ndarray
Returns: hcore : (nkpts, nao, nao) ndarray
pyscf.pbc.scf.khf.get_j(mf, cell, dm_kpts, kpts, kpts_band=None)
Get the Coulomb (J) AO matrix at sampled k-points.
Args:
dm_kpts [(nkpts, nao, nao) ndarray or a list of (nkpts,nao,nao) ndarray] Density matrix at each k-point. If
a list of k-point DMs, eg, UHF alpha and beta DM, the alpha and beta DMs are contracted separately.
Kwargs:
kpts_band [(k,3) ndarray] A list of arbitrary “band” k-points at which to evalute the matrix.
Returns: vj : (nkpts, nao, nao) ndarray or list of vj if the input dm_kpts is a list of DMs
pyscf.pbc.scf.khf.get_jk(mf, cell, dm_kpts, kpts, kpts_band=None)
Get the Coulomb (J) and exchange (K) AO matrices at sampled k-points.
Args:
dm_kpts [(nkpts, nao, nao) ndarray] Density matrix at each k-point
Kwargs:
kpts_band [(3,) ndarray] A list of arbitrary “band” k-point at which to evalute the matrix.
Returns: vj : (nkpts, nao, nao) ndarray vk : (nkpts, nao, nao) ndarray or list of vj and vk if the input dm_kpts
is a list of DMs
pyscf.pbc.scf.khf.get_occ(mf, mo_energy_kpts=None, mo_coeff_kpts=None)
Label the occupancies for each orbital for sampled k-points.
This is a k-point version of scf.hf.SCF.get_occ
pyscf.pbc.scf.khf.get_ovlp(mf, cell=None, kpts=None)
Get the overlap AO matrices at sampled k-points.
Args: kpts : (nkpts, 3) ndarray
Returns: ovlp_kpts : (nkpts, nao, nao) ndarray
pyscf.pbc.scf.khf.init_guess_by_chkfile(cell, chkfile_name, project=True, kpts=None)
Read the KHF results from checkpoint file, then project it to the basis defined by cell
Returns: Density matrix, 3D ndarray
pyscf.pbc.scf.khf.make_rdm1(mo_coeff_kpts, mo_occ_kpts)
One particle density matrices for all k-points.
Returns: dm_kpts : (nkpts, nao, nao) ndarray
pyscf.pbc.scf.khf.mulliken_meta(cell, dm_ao, verbose=5, pre_orth_method=’ANO’, s=None)
Mulliken population analysis, based on meta-Lowdin AOs.

1.21. pbc — Periodic boundary conditions

239

PySCF Documentation, Release 1.4.0

Note this function only computes the Mulliken population for the gamma point density matrix.
Hartree-Fock for periodic systems with k-point sampling
See Also: hf.py : Hartree-Fock for periodic systems at a single k-point
class pyscf.pbc.scf.kuhf.KUHF(cell, kpts=array([[ 0., 0., 0.]]), exxdiv=’ewald’)
UHF class with k-point sampling.
canonicalize(mf, mo_coeff_kpts, mo_occ_kpts, fock=None)
Canonicalization diagonalizes the UHF Fock matrix within occupied, virtual subspaces separatedly (without change occupancy).
energy_elec(mf, dm_kpts=None, h1e_kpts=None, vhf_kpts=None)
Following pyscf.scf.hf.energy_elec()
get_bands(kpts_band, cell=None, dm_kpts=None, kpts=None)
Get energy bands at the given (arbitrary) ‘band’ k-points.
Returns:
mo_energy [(nmo,) ndarray or a list of (nmo,) ndarray] Bands energies E_n(k)
mo_coeff [(nao, nmo) ndarray or a list of (nao,nmo) ndarray] Band orbitals psi_n(k)
get_occ(mf, mo_energy_kpts=None, mo_coeff_kpts=None)
Label the occupancies for each orbital for sampled k-points.
This is a k-point version of scf.hf.SCF.get_occ
get_ovlp(mf, cell=None, kpts=None)
Get the overlap AO matrices at sampled k-points.
Args: kpts : (nkpts, 3) ndarray
Returns: ovlp_kpts : (nkpts, nao, nao) ndarray
spin_square(mo_coeff=None, s=None)
Spin of the given UHF orbitals
𝑆2 =

1
(𝑆+ 𝑆− + 𝑆− 𝑆+ ) + 𝑆𝑧2
2

∑︀
∑︀
where 𝑆+ = 𝑖 𝑆𝑖+ is effective for all beta occupied orbitals; 𝑆− = 𝑖 𝑆𝑖− is effective for all alpha
occupied orbitals.
1.There are two possibilities for 𝑆+ 𝑆−
∑︀
(a) same electron 𝑆+ 𝑆− = 𝑖 𝑠𝑖+ 𝑠𝑖− ,
∑︁
∑︁
⟨𝑈 𝐻𝐹 |𝑠𝑖+ 𝑠𝑖− |𝑈 𝐻𝐹 ⟩ =
⟨𝑝|𝑠+ 𝑠− |𝑞⟩𝛾𝑞𝑝 = 𝑛𝛼
𝑝𝑞

𝑖

2) different electrons 𝑆+ 𝑆− =
two-particle operator,

∑︀

𝑠𝑖+ 𝑠𝑗− , (𝑖 ̸= 𝑗). There are in total 𝑛(𝑛 − 1) terms. As a

⟨𝑆+ 𝑆− ⟩ = ⟨𝑖𝑗|𝑠+ 𝑠− |𝑖𝑗⟩ − ⟨𝑖𝑗|𝑠+ 𝑠− |𝑗𝑖⟩ = −⟨𝑖𝛼 |𝑗 𝛽 ⟩⟨𝑗 𝛽 |𝑖𝛼 ⟩
2.Similarly, for 𝑆− 𝑆+
(a) same electron
∑︁

⟨𝑠𝑖− 𝑠𝑖+ ⟩ = 𝑛𝛽

𝑖

(a) different electrons
240

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

⟨𝑆− 𝑆+ ⟩ = −⟨𝑖𝛽 |𝑗 𝛼 ⟩⟨𝑗 𝛼 |𝑖𝛽 ⟩
2.For 𝑆𝑧2
(a) same electron
⟨𝑠2𝑧 ⟩ =

1
(𝑛𝛼 + 𝑛𝛽 )
4

(a) different electrons
1 ∑︁
(⟨𝑖𝑗|2𝑠𝑧1 𝑠𝑧2 |𝑖𝑗⟩ − ⟨𝑖𝑗|2𝑠𝑧1 𝑠𝑧2 |𝑗𝑖⟩)
2 𝑖𝑗
1 𝛼 𝛼 𝛼 𝛼
(⟨𝑖 |𝑖 ⟩⟨𝑗 |𝑗 ⟩ − ⟨𝑖𝛼 |𝑖𝛼 ⟩⟨𝑗 𝛽 |𝑗 𝛽 ⟩ − ⟨𝑖𝛽 |𝑖𝛽 ⟩⟨𝑗 𝛼 |𝑗 𝛼 ⟩ + ⟨𝑖𝛽 |𝑖𝛽 ⟩⟨𝑗 𝛽 |𝑗 𝛽 ⟩)
4
1
− (⟨𝑖𝛼 |𝑗 𝛼 ⟩⟨𝑗 𝛼 |𝑖𝛼 ⟩ + ⟨𝑖𝛽 |𝑗 𝛽 ⟩⟨𝑗 𝛽 |𝑖𝛽 ⟩)
4
1
1
= (𝑛2𝛼 − 𝑛𝛼 𝑛𝛽 − 𝑛𝛽 𝑛𝛼 + 𝑛2𝛽 ) − (𝑛𝛼 + 𝑛𝛽 )
4
4
1
= ((𝑛𝛼 − 𝑛𝛽 )2 − (𝑛𝛼 + 𝑛𝛽 ))
4
=

In total
⟨𝑆 2 ⟩ =

∑︁
∑︁
1
1
(𝑛𝛼 −
⟨𝑖𝛼 |𝑗 𝛽 ⟩⟨𝑗 𝛽 |𝑖𝛼 ⟩ + 𝑛𝛽 −
⟨𝑖𝛽 |𝑗 𝛼 ⟩⟨𝑗 𝛼 |𝑖𝛽 ⟩) + (𝑛𝛼 − 𝑛𝛽 )2
2
4
𝑖𝑗
𝑖𝑗

Args:
mo [a list of 2 ndarrays] Occupied alpha and occupied beta orbitals
Kwargs:
s [ndarray] AO overlap
Returns: A list of two floats. The first is the expectation value of S^2. The second is the corresponding
2S+1
Examples:
>>> mol = gto.M(atom='O 0 0 0; H 0 0 1; H 0 1 0', basis='ccpvdz', charge=1,
˓→spin=1, verbose=0)
>>> mf = scf.UHF(mol)
>>> mf.kernel()
-75.623975516256706
>>> mo = (mf.mo_coeff[0][:,mf.mo_occ[0]>0], mf.mo_coeff[1][:,mf.mo_occ[1]>0])
>>> print('S^2 = %.7f, 2S+1 = %.7f' % spin_square(mo, mol.intor('int1e_ovlp_
˓→sph')))
S^2 = 0.7570150, 2S+1 = 2.0070027

pyscf.pbc.scf.kuhf.canonicalize(mf, mo_coeff_kpts, mo_occ_kpts, fock=None)
Canonicalization diagonalizes the UHF Fock matrix within occupied, virtual subspaces separatedly (without
change occupancy).
pyscf.pbc.scf.kuhf.energy_elec(mf, dm_kpts=None, h1e_kpts=None, vhf_kpts=None)
Following pyscf.scf.hf.energy_elec()
pyscf.pbc.scf.kuhf.get_occ(mf, mo_energy_kpts=None, mo_coeff_kpts=None)
Label the occupancies for each orbital for sampled k-points.
This is a k-point version of scf.hf.SCF.get_occ

1.21. pbc — Periodic boundary conditions

241

PySCF Documentation, Release 1.4.0

pyscf.pbc.scf.kuhf.init_guess_by_chkfile(cell, chkfile_name, project=True, kpts=None)
Read the KHF results from checkpoint file, then project it to the basis defined by cell
Returns: Density matrix, 3D ndarray
pyscf.pbc.scf.kuhf.make_rdm1(mo_coeff_kpts, mo_occ_kpts)
Alpha and beta spin one particle density matrices for all k-points.
Returns: dm_kpts : (2, nkpts, nao, nao) ndarray
pyscf.pbc.scf.kuhf.mulliken_meta(cell, dm_ao_kpts, verbose=5, pre_orth_method=’ANO’,
s=None)
Mulliken population analysis, based on meta-Lowdin AOs.
Note this function only computes the Mulliken population for the gamma point density matrix.

1.21.3 pbc.dft
1.21.4 pbc.df — PBC denisty fitting
Introduction
The pbc.df module provides the fundamental functions to handle the density fitting (DF) integral tensors required by
the gamma-point and k-point PBC calculations. There are four types of DF methods available for PBC systems. They
are FFTDF (plane-wave density fitting with fast Fourier transformation), AFTDF (plane-wave density fitting with
analytical Fourier transformation), GDF (Gaussian density fitting) and MDF (mixed density fitting). The Coulomb
integrals and nuclear attraction integrals in the PBC calculations are all computed with DF technique. The default
scheme is FFTDF.
The characters of these PBC DF methods are summarized in the following table
Subject
Initialization
HF Coulomb matrix (J)
HF exchange matrix (K)
Building ERIs
All-electron calculation
Low-dimension system

FFTDF
No
Fast
Slow
Slow
Huge error
N/A

AFTDF
No
Slow
Slow
Slow
Large error
0D,1D,2D

GDF
Slow
Fast
Fast
Fast
Accurate
0D,1D,2D

MDF
Slow
Moderate
Moderate
Moderate
Most accurate
0D,1D,2D

FFTDF — FFT-based density fitting
FFTDF represents the method to compute electron repulsion integrals in reciprocal space with the Fourier transformed
Coulomb kernel
∑︁
4𝜋
(𝑖𝑗|𝑘𝑙) =
𝜌𝑖𝑗 (G) 2 𝜌𝑘𝑙 (−G)
𝐺
𝐺

G is the plane wave vector. 𝜌𝑖𝑗 (G) is the Fourier transformed orbital pair
∑︁
𝜌𝑖𝑗 (G) =
𝑒−G·r 𝜑𝑖 (r)𝜑𝑗 (r)
𝑟

Here are some examples to initialize FFTDF object:

242

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

>>> import numpy as np
>>> from pyscf.pbc import gto, df, scf
>>> cell = gto.M(atom='He 1 1 1', a=np.eye(3)*2, basis='3-21g')
>>> fftdf = df.FFTDF(cell)
>>> print(fftdf)

>>> mf = scf.RHF(cell)
>>> print(mf.with_df)


As the default integral scheme of PBC calculations, FFTDF is created when initializing the PBC mean-field object and
held in the attribute with_df.
Nuclear type integrals
PBC nuclear-electron interaction and pseudo-potential (PP) integrals can be computed with the FFTDF methods
FFTDF.get_nuc() and FFTDF.get_pp(). FFTDF.get_nuc() function only evaluates the integral of the
point charge. If PP was specified in the cell object, FFTDF.get_nuc() produces the integrals of the point nuclei
with the effective charges. If PP was not defined in the cell object, FFTDF.get_pp() and FFTDF.get_nuc()
produce the same integrals. Depending on the input k-point(s), the two functions can produce the nuclear-type integrals for a single k-point or a list of nuclear-type integrals for the k-points. By default, they compute the nuclear-type
integrals of Gamma point:
>>>
>>>
(2,
>>>
>>>
>>>
(8,
>>>
>>>
(2,

vnuc = fftdf.get_pp()
print(vnuc.shape)
2)
kpts = cell.make_kpts([2,2,2])
vnuc = fftdf.get_pp(kpts)
print(vnuc.shape)
2, 2)
vnuc = fftdf.get_pp(kpts)
print(vnuc.shape)
2)

Hartree-Fock Coulomb and exchange
FFTDF class provides a method FFTDF.get_jk() to compute Hartree-Fock Coulomb matrix (J) and exchange
matrix (K). This method can take one density matrix or a list of density matrices as input and return the J and K
matrices for each density matrix:
>>>
>>>
>>>
(2,
>>>
>>>
>>>
(3,

dm = numpy.random.random((2,2))
j, k = fftdf.get_jk(dm)
print(j.shape)
2)
dm = numpy.random.random((3,2,2))
j, k = fftdf.get_jk(dm)
print(j.shape)
2, 2)

When k-points are specified, the input density matrices should have the correct shape that matches the number of
k-points:
>>> kpts = cell.make_kpts([1,1,3])
>>> dm = numpy.random.random((3,2,2))

1.21. pbc — Periodic boundary conditions

243

PySCF Documentation, Release 1.4.0

>>>
>>>
(3,
>>>
>>>
>>>
(5,

j, k = fftdf.get_jk(dm, kpts=kpts)
print(j.shape)
2, 2)
dm = numpy.random.random((5,3,2,2))
j, k = fftdf.get_jk(dm, kpts=kpts)
print(j.shape)
3, 2, 2)

4-index ERI tensor and integral transformation
4-index electron repulsion integrals can be computed with FFTDF.get_eri() and FFTDF.ao2mo() methods.
Given 4 k-points(s) (corresponding to the 4 AO indices), FFTDF.get_eri() method produce the regular 4-index
ERIs (𝑖𝑗|𝑘𝑙) in AO basis. The 4 k-points should follow the law of momentum conservation
(k𝑗 − k𝑖 + k𝑙 − k𝑘 ) · 𝑎 = 2𝑛𝜋.
By default, four Γ-points are assigned to the four AO indices. As the format of molecular ERI tensor, the PBC ERI
tensor is reshaped to a 2D array:
>>>
>>>
(4,
>>>
>>>
(4,

eri = fftdf.get_eri()
print(eri.shape)
4)
eri = fftdf.get_eri([kpts[0],kpts[0],kpts[1],kpts[1]])
print(eri.shape)
4)

FFTDF.ao2mo() function applies integral transformation for the given four sets of orbital coefficients, four input
k-points. The four k-points need to follow the momentum conservation law. Similar to FFTDF.get_eri(), the
returned integral tensor is shaped to a 2D array:
>>>
>>>
>>>
(4,

orbs = numpy.random.random((4,2,2))
eri_mo = fftdf.get_eri(orbs, [kpts[0],kpts[0],kpts[1],kpts[1]])
print(eri_mo.shape)
4)

Kinetic energy cutoff
The accuracy of FFTDF integrals are affected by the kinetic energy cutoff. The default kinetic energy cutoff is a
conservative estimation based on the basis set and the lattice parameter. You can adjust the attribute FFTDF.gs (the
numbers of grid points in each positive direction) to change the kinetic energy cutoff. If any values in FFTDF.gs is
too small to reach the required accuracy cell.precision, FFTDF may output a warning message, eg:
WARN: ke_cutoff/gs (12.437 / [3, 4, 4]) is not enough for FFTDF to get integral
˓→accuracy 1e-08.
Coulomb integral error is ~ 2.6 Eh.
Recomended ke_cutoff/gs are 538.542 / [20 20 20].

In this warning message, Coulomb integral error is a rough estimation for the largest error of the matrix
elements of the two-electron Coulomb integrals. The overall computational error may be varied by 1 - 2 orders of
magnitude.

244

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

AFTDF — AFT-based density fitting
AFTDF mans that the Fourier transform of the orbital pair is computed analytically
∫︁
𝜌𝑖𝑗 (G) = 𝑒−G·r 𝜑𝑖 (r)𝜑𝑗 (r)𝑑3 r
To enable AFTDF in the calculation, AFTDF object can be initialized and assigned to with_df object of mean-field
object:
>>> import numpy as np
>>> from pyscf.pbc import gto, df, scf
>>> cell = gto.M(atom='He 1 1 1', a=np.eye(3)*2, basis='3-21g')
>>> aft = df.AFTDF(cell)
>>> print(aft)

>>> mf = scf.RHF(cell)
>>> mf.with_df = aft

Generally, AFTDF is slower than FFTDF method.
AFTDF class offers the same methods as the FFTDF class. Nuclear and PP integrals, Hartree-Fock J and K matrices, electron repulsion integrals and integral transformation can be computed with functions AFTDF.get_nuc(),
AFTDF.get_pp(), AFTDF.get_jk(), AFTDF.get_eri() and AFTDF.ao2mo() using the same calling
APIs as the analogy functions in FFTDF — FFT-based density fitting.
Kinetic energy cutoff
AFTDF also makes estimation on the kinetic energy cutoff. When the any values of AFTDF.gs are too small for
required accuracy cell.precision, this class also outputs the Coulomb integral error warning message
as the FFTDF class.
GDF — Gaussian density fitting
GDF is an analogy of the conventional density fitting method with periodic boundary condition. The auxiliary fitting
basis in PBC GDF is periodic Gaussian function (To ensure the long range Coulomb integrals converging in the real
space lattice summation, the multipoles are removed from the auxiliary basis). GDF object can be initialized and
enabled in the SCF calculation in two ways:
>>> import numpy as np
>>> from pyscf.pbc import gto, df, scf
>>> cell = gto.M(atom='He 1 1 1', a=np.eye(3)*2, basis='3-21g')
>>> gdf = df.GDF(cell)
>>> mf = scf.RHF(cell)
>>> mf.with_df = gdf
>>> mf.run()
>>> # Using SCF.density_fit method
>>> mf = scf.RHF(cell).density_fit().run()
>>> print(mf.with_df)


Similar to the molecular code, SCF.density_fit() method returns a mean-field object with GDF as the integral
engine.

1.21. pbc — Periodic boundary conditions

245

PySCF Documentation, Release 1.4.0

In the GDF method, the DF-integral tensor is precomputed and stored on disk. GDF method supports both the Γ-point
ERIs and the ERIs of different k-points. GDF.kpts should be specified before initializing GDF object. GDF class
provides the same APIs as the FFTDF class to compute nuclear integrals and electron Coulomb repulsion integrals:
>>>
>>>
>>>
>>>
>>>
>>>

import numpy as np
from pyscf.pbc import gto, df, scf
cell = gto.M(atom='He 1 1 1', a=np.eye(3)*2, basis='3-21g')
gdf = df.GDF(cell)
gdf.kpts = cell.make_kpts([2,2,2])
gdf.get_eri([kpts[0],kpts[0],kpts[1],kpts[1]])

In the mean-field calculation, assigning kpts attribute to mean-field object updates the kpts attribute of the underlying DF method:
>>>
>>>
>>>
>>>
>>>
>>>
>>>

import numpy as np
from pyscf.pbc import gto, df, scf
cell = gto.M(atom='He 1 1 1', a=np.eye(3)*2, basis='3-21g')
mf = scf.KRHF(cell).density_fit()
kpts = cell.make_kpts([2,2,2])
mf.kpts = kpts
mf.with_df.get_eri([kpts[0],kpts[0],kpts[1],kpts[1]])

Once the GDF integral tensor was initialized, the GDF can be only used with certain k-points calculations. An incorrect
kpts argument can lead to a runtime error:
>>> import numpy as np
>>> from pyscf.pbc import gto, df, scf
>>> cell = gto.M(atom='He 1 1 1', a=np.eye(3)*2, basis='3-21g')
>>> gdf = df.GDF(cell, kpts=cell.make_kpts([2,2,2]))
>>> kpt = np.random.random(3)
>>> gdf.get_eri([kpt,kpt,kpt,kpt])
RuntimeError: j3c for kpts [[ 0.53135523 0.06389596 0.19441766]
[ 0.53135523 0.06389596 0.19441766]] is not initialized.
You need to update the attribute .kpts then call .build() to initialize j3c.

The GDF initialization is very expensive. To reduce the initialization cost in a series of calculations, it would be useful
to cache the GDF integral tensor in a file then load them into the calculation when needed. The GDF integral tensor can
be saved and loaded the same way as we did for the molecular DF method (see Saving/Loading DF integral tensor):
import numpy as np
from pyscf.pbc import gto, df, scf
cell = gto.M(atom='He 1 1 1', a=np.eye(3)*2, basis='3-21g')
gdf = df.GDF(cell, kpts=cell.make_kpts([2,2,2]))
gdf._cderi_to_save = 'df_ints.h5' # To save the GDF integrals
gdf.build()
mf = scf.KRHF(cell, kpts=cell.make_kpts([2,2,2])).density_fit()
mf.with_df._cderi = 'df_ints.h5'
# To load the GDF integrals
mf.run()

Auxiliary Gaussian basis
GDF method requires a set of Gaussian functions as the density fitting auxiliary basis. See also DF auxiliary basis
and Even-tempered auxiliary Gaussian basis for the choices of DF auxiliary basis in PySCF GDF code. There are not
many optimized auxiliary basis sets available for PBC AO basis. You can use the even-tempered Gaussian functions
as the auxiliary basis in the PBC GDF method:

246

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

import numpy as np
from pyscf.pbc import gto, df, scf
cell = gto.M(atom='He 1 1 1', a=np.eye(3)*2, basis='3-21g')
gdf = df.GDF(cell, kpts=cell.make_kpts([2,2,2]))
gdf.auxbasis = df.aug_etb(cell, beta=2.0)
gdf.build()

Kinetic energy cutoff
GDF method does not require the specification of kinetic energy cutoff. cell.ke_cutoff and cell.gs are
ignored in the GDF class. Internally, a small set of planewaves is used in the GDF method to accelerate the convergence
of GDF integrals in the real space lattice summation. The estimated energy cutoff is generated in the GDF class and
stored in the attribute GDF.gs. It is not recommended to change this parameter.
MDF — mixed density fitting
MDF method combines the AFTDF and GDF in the same framework. The MDF auxiliary basis is Gaussian and
plane-wave mixed basis. MDF object can be created in two ways:
>>> import numpy as np
>>> from pyscf.pbc import gto, df, scf
>>> cell = gto.M(atom='He 1 1 1', a=np.eye(3)*2, basis='3-21g', ke_cutoff=10)
>>> mdf = df.MDF(cell)
>>> print(mdf)

>>> mf = scf.RHF(cell).mix_density_fit().run()
>>> print(mf.with_df)


The kinetic energy cutoff is specified in this example to constrain the number of planewaves. The number of
planewaves can also be controlled by through attribute MDF.gs.
In principle, the accuracy of MDF method can be increased by adding more plane waves in the auxiliary basis. In
practice, the linear dependency between plane waves and Gaussians may lead to numerical stability issue. The optimal
accuracy (with reasonable computational cost) requires a reasonable size of plan wave basis with a reasonable linear
dependency threshold. A threshold too large would remove many auxiliary functions while a threshold too small
would cause numerical instability. .. In our preliminary test, ke_cutoff=10 is able to produce 0.1 mEh accuracy in
.. total energy. The default linear dependency threshold is 1e-10. The threshold can be adjusted through the attribute
MDF.linear_dep_threshold.
Like the GDF method, it is also very demanding to initialize the 3-center Gaussian integrals in the MDF method. The
3-center Gaussian integral tensor can be cached in a file and loaded to MDF object at the runtime:
import numpy as np
from pyscf.pbc import gto, df, scf
cell = gto.M(atom='He 1 1 1', a=np.eye(3)*2, basis='3-21g')
mdf = df.MDF(cell, kpts=cell.make_kpts([2,2,2]))
mdf._cderi_to_save = 'df_ints.h5' # To save the GDF integrals
mdf.build()
mf = scf.KRHF(cell, kpts=cell.make_kpts([2,2,2])).mix_density_fit()
mf.with_df._cderi = 'df_ints.h5'
# To load the GDF integrals
mf.run()

1.21. pbc — Periodic boundary conditions

247

PySCF Documentation, Release 1.4.0

All-electron calculation
All-electron calculations with FFTDF or AFTDF methods requires high energy cutoff for most elements. It is recommended to use GDF or MDF methods in the all-electron calculations. In fact, GDF and MDF can also be used in PP
calculations to reduce the number of planewave basis if steep functions are existed in the AO basis.
Low-dimension system
AFTDF supports the systems with 0D (molecule), 1D and 2D periodic boundary conditions. When computing
the integrals of low-dimension systems, an infinite vacuum is placed on the free boundary. You can set the
cell.dimension, to enable the integral algorithms for low-dimension systems in AFTDF class:
import numpy as np
from pyscf.pbc import gto, df, scf
cell = gto.M(atom='He 1 1 1', a=np.eye(3)*2, basis='3-21g', dimension=1)
aft = df.AFTDF(cell)
aft.get_eri()

GDF and MDF all support the integrals of low-dimension system. Similar to the usage of AFTDF method, you need to
set cell.dimension for the low-dimension systems:
import numpy as np
from pyscf.pbc import gto, df, scf
cell = gto.M(atom='He 1 1 1', a=np.eye(3)*2, basis='3-21g', dimension=1)
gdf = df.GDF(cell)
gdf.get_eri()

See more examples in examples/pbc/31-low_dimensional_pbc.py
Interface to molecular DF-post-HF methods
PBC DF object is compatible to the molecular DF object. The Γ-point PBC SCF object can be directly passed to
molecular DF post-HF methods for an electron correlation calculations in PBC:
import numpy as np
from pyscf.pbc import gto, df, scf
from pyscf import cc as mol_cc
cell = gto.M(atom='He 1 1 1', a=np.eye(3)*2, basis='3-21g', dimension=1)
mf = scf.RHF(cell).density_fit()
mol_cc.RCCSD(mf).run()

Examples
DF relevant examples can be found in the PySCF examples directory:
examples/pbc/10-gamma_point_scf.py
examples/pbc/11-gamma_point_all_electron_scf.py
examples/pbc/12-gamma_point_post_hf.py
examples/pbc/20-k_points_scf.py
examples/pbc/21-k_points_all_electron_scf.py
examples/pbc/30-ao_integrals.py
examples/pbc/30-ao_value_on_grid.py
examples/pbc/30-mo_integrals.py
examples/pbc/31-low_dimensional_pbc.py

248

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

Program reference
FFTDF class
class pyscf.pbc.df.fft.FFTDF(cell, kpts=array([[ 0., 0., 0.]]))
Density expansion on plane waves
FFTDF helper functions
JK with discrete Fourier transformation Integral transformation with FFT
(ij|kl) = int dr1 dr2 i*(r1) j(r1) v(r12) k*(r2) l(r2) = (ij|G) v(G) (G|kl)
i*(r) j(r) = 1/N sum_G e^{iGr} (G|ij) = 1/N sum_G e^{-iGr} (ij|G)
“forward” FFT: (G|ij) = sum_r e^{-iGr} i*(r) j(r) = fft[ i*(r) j(r) ]
“inverse” FFT:
(ij|G) = sum_r e^{iGr} i*(r) j(r) = N * ifft[ i*(r) j(r) ] = conj[ sum_r e^{-iGr} j*(r) i(r) ]
AFTDF class
class pyscf.pbc.df.aft.AFTDF(cell, kpts=array([[ 0., 0., 0.]]))
Density expansion on plane waves
AFTDF helper functions
JK with analytic Fourier transformation Integral transformation with analytic Fourier transformation
GDF class
class pyscf.pbc.df.df.GDF(cell, kpts=array([[ 0., 0., 0.]]))
Gaussian density fitting
GDF helper functions
Density fitting with Gaussian basis Ref:
MDF class
class pyscf.pbc.df.mdf.MDF(cell, kpts=array([[ 0., 0., 0.]]))
Gaussian and planewaves mixed density fitting
MDF helper functions
Exact density fitting with Gaussian and planewaves Ref:
1.21. pbc — Periodic boundary conditions

249

PySCF Documentation, Release 1.4.0

1.21.5 pbc.cc — PBC coupled cluster
1.21.6 pbc.tools — PBC tools
Interface to ASE
The ASE (Atomic Simulation Environment) tool set offers useful database and functions to setup crystal structure and
analyze the results of crystal calculation.
Here are some examples to use the PySCF-ASE interface wrapper
"""
Take ASE Diamond structure, input into PySCF and run
"""
import numpy as np
import pyscf.pbc.gto as pbcgto
import pyscf.pbc.dft as pbcdft
from pyscf.pbc.tools import pyscf_ase
import ase
import ase.lattice
from ase.lattice.cubic import Diamond

ase_atom=Diamond(symbol='C', latticeconstant=3.5668)
print(ase_atom.get_volume())
cell = pbcgto.Cell()
cell.verbose = 5
cell.atom=pyscf_ase.ase_atoms_to_pyscf(ase_atom)
cell.a=ase_atom.cell
cell.basis = 'gth-szv'
cell.pseudo = 'gth-pade'
cell.build()
mf=pbcdft.RKS(cell)
mf.xc='lda,vwn'
print(mf.scf()) # [10,10,10]: -44.8811199336

"""
Take ASE structure, PySCF object,
and run through ASE calculator interface.
This allows other ASE methods to be used with PySCF;
here we try to compute an equation of state.
"""
import numpy as np
from pyscf.pbc.tools import pyscf_ase
import pyscf.pbc.gto as pbcgto
import pyscf.pbc.dft as pbcdft
import ase
import ase.lattice

250

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

from ase.lattice.cubic import Diamond
from ase.units import kJ
from ase.utils.eos import EquationOfState

ase_atom=Diamond(symbol='C', latticeconstant=3.5668)
# Set up a cell; everything except atom; the ASE calculator will
# set the atom variable
cell = pbcgto.Cell()
cell.a=ase_atom.cell
cell.basis = 'gth-szv'
cell.pseudo = 'gth-pade'
cell.verbose = 0
# Set up the kind of calculation to be done
# Additional variables for mf_class are passed through mf_dict
mf_class=pbcdft.RKS
mf_dict = { 'xc' : 'lda,vwn' }
# Once this is setup, ASE is used for everything from this point on
ase_atom.set_calculator(pyscf_ase.PySCF(molcell=cell, mf_class=mf_class, mf_dict=mf_
˓→dict))
print("ASE energy", ase_atom.get_potential_energy())
print("ASE energy (should avoid re-evaluation)", ase_atom.get_potential_energy())
# Compute equation of state
ase_cell=ase_atom.cell
volumes = []
energies = []
for x in np.linspace(0.95, 1.2, 5):
ase_atom.set_cell(ase_cell * x, scale_atoms = True)
print "[x: %f, E: %f]" % (x, ase_atom.get_potential_energy())
volumes.append(ase_atom.get_volume())
energies.append(ase_atom.get_potential_energy())
eos = EquationOfState(volumes, energies)
v0, e0, B = eos.fit()
print(B / kJ * 1.0e24, 'GPa')
eos.plot('eos.png')

1.21.7 Mixing PBC and molecular modules
The post-HF methods, as a standalone numerical solver, do not require the knowledge of the boundary condition. The
calculations of finite-size systems and extend systems are distinguished by the boundary condition of integrals (and
basis). The same post-HF solver can be used for both the finite-size problem and the periodic boundary problem if
they have the similar Hamiltonian structure.
In PySCF, many molecular post-HF solvers has two implementations: incore and outcore versions. They are differed
by the treatments on the 2-electron integrals. The incore solver takes the _eri (or with_df, see df — Density fitting)
from the underlying mean-field object as the two-electron interaction part of the Hamiltonian while the outcore solver
generates the 2-electron integrals (with free boundary condition) on the fly. To use the molecular post-HF solvers in
PBC code, we need ensure the incore version solver being called.
Generating _eri in mean-filed object is the straightforward way to trigger the incore post-HF solver. If the allowed
memory is big enough to hold the entire 2-electron integral array, the gamma point HF solver always generates and

1.21. pbc — Periodic boundary conditions

251

PySCF Documentation, Release 1.4.0

holds this array. A second choice is to set incore_anyway in cell which forces the program generating and
holding _eri in mean-field object.
Note: If the problem is big, incore_anyway may overflow the available physical memory.
Holding the full integral array _eri in memory limits the problem size one can treat. Using the density fitting object
with_df to hold the integrals can overcome this problem. This architecture has been bound to PBC and molecular
mean-field modules. But the relevant post-HF density fitting solvers are still in development thus this feature is not
available in PySCF 1.2 or older.
Aside from the 2-electron integrals, there are some attributes and methods required by the post-HF solver. They are
get_hcore(), and get_ovlp() for 1-electron integrals, _numint, grids for the numerical integration of DFT
exchange-correlation functionals. They are all overloaded in PBC mean-field object to produce the PBC integrals.
Examples
#!/usr/bin/env python
'''
Gamma point post-HF calculation needs only real integrals.
Methods implemented in finite-size system can be directly used here without
any modification.
'''
import numpy
from pyscf.pbc import gto, scf
cell = gto.M(
a = numpy.eye(3)*3.5668,
atom = '''C
0.
0.
C
0.8917 0.8917
C
1.7834 1.7834
C
2.6751 2.6751
C
1.7834 0.
C
2.6751 0.8917
C
0.
1.7834
C
0.8917 2.6751
basis = '6-31g',
verbose = 4,
)

0.
0.8917
0.
0.8917
1.7834
2.6751
1.7834
2.6751''',

mf = scf.RHF(cell).density_fit()
mf.with_df.gs = [5]*3
mf.kernel()
#
# Import CC, TDDFT moduel from the molecular implementations
#
from pyscf import cc, tddft
mycc = cc.CCSD(mf)
mycc.kernel()
mytd = tddft.TDHF(mf)
mytd.nstates = 5
mytd.kernel()

252

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

1.22 lo — Orbital localization
1.22.1 Foster-Boys, Edmiston-Ruedenberg, Pipek-Mezey localization
pyscf.lo.pipek.atomic_pops(mol, mo_coeff, method=’meta_lowdin’)
kwarg method can be one of mulliken, lowdin, meta_lowdin

1.22.2 Meta-Lowdin
1.22.3 Natural atomic orbitals
Natural atomic orbitals Ref:
6. Weinhold et al., J. Chem. Phys. 83(1985), 735-746
pyscf.lo.nao.set_atom_conf(element, description)
Change the default atomic core and valence configuration to the one given by “description”.
lo.nao.AOSHELL for the default configuration.

See

Args:
element [str or int] Element symbol or nuclear charge
description [str or a list of str]
“double p” : double p shell
“double d” : double d shell
“double f” : double f shell
“polarize” : add one polarized shell
“1s1d” : keep core unchanged and set 1 s 1 d shells for valence
(“3s2p”,”1d”) : 3 s, 2 p shells for core and 1 d shells for valence

1.22.4 Intrinsic Atomic Orbitals
Intrinsic Atomic Orbitals ref. JCTC, 9, 4834
pyscf.lo.iao.iao(mol, orbocc, minao=’minao’)
Intrinsic Atomic Orbitals. [Ref. JCTC, 9, 4834
Args:
orbocc [2D float array] occupied orbitals
Returns: non-orthogal IAO orbitals. Orthogonalize them as C (C^T S C)^{-1/2}, eg using orth.lowdin()
>>> orbocc = mf.mo_coeff[:,mf.mo_occ>0]
>>> c = iao(mol, orcc)
>>> numpy.dot(c, orth.lowdin(reduce(numpy.dot, (c.T,s,c))))

1.22. lo — Orbital localization

253

PySCF Documentation, Release 1.4.0

1.23 Miscellaneous
1.23.1 Decoration pipe
SCF
There are three decoration function for Hartree-Fock class density_fit(), sfx2c(), newton() to apply density fitting, scalar relativistic correction and second order SCF. The different ordering of the three decoration operations
have different effects. For example
#!/usr/bin/env python
#
# Author: Qiming Sun 
#
import numpy
from pyscf import gto
from pyscf import scf
'''
Mixing decoration, for density fitting, scalar relativistic effects, and
second order (Newton-Raphson) SCF.
Density fitting and scalar relativistic effects can be applied together,
regardless to the order you apply the decoration.
NOTE the second order SCF (New in version 1.1) decorating operation are not
commutable with scf.density_fit operation
[scf.density_fit, scf.sfx2c
] == 0
[scf.newton
, scf.sfx2c
] == 0
[scf.newton
, scf.density_fit] != 0
* scf.density_fit(scf.newton(scf.RHF(mol))) is the SOSCF for regular 2e
integrals, but with density fitting integrals for the Hessian. It's an
approximate SOSCF optimization method;
* scf.newton(scf.density_fit(scf.RHF(mol))) is the exact second order
optimization for the given scf object which is a density-fitted-scf method.
The SOSCF is not an approximate scheme.
* scf.density_fit(scf.newton(scf.density_fit(scf.RHF(mol))), auxbasis='ahlrichs')
is an approximate SOSCF scheme for the given density-fitted-scf method.
Here we use small density fitting basis (ahlrichs cfit basis) to approximate
the Hessian for the large-basis-density-fitted-scf scheme.
'''
mol = gto.Mole()
mol.build(
verbose = 0,
atom = '''8 0 0.
0
1 0 -0.757 0.587
1 0 0.757 0.587''',
basis = 'ccpvdz',
)
#
# 1. spin-free X2C-HF with density fitting approximation on 2E integrals
#
mf = scf.density_fit(scf.sfx2c(scf.RHF(mol)))
mf = scf.RHF(mol).x2c().density_fit() # Stream style

254

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

energy = mf.kernel()
print('E = %.12f, ref = -76.075408156180' % energy)
#
# 2. spin-free X2C correction for density-fitting HF. Since X2C correction is
# commutable with density fitting operation, it is fully equivalent to case 1.
#
mf = scf.sfx2c(scf.density_fit(scf.RHF(mol)))
mf = scf.RHF(mol).density_fit().x2c() # Stream style
energy = mf.kernel()
print('E = %.12f, ref = -76.075408156180' % energy)
#
# 3. Newton method for non-relativistic HF
#
mf = scf.newton(scf.RHF(mol))
mf = scf.RHF(mol).newton() # Stream style
energy = mf.kernel()
print('E = %.12f, ref = -76.026765673120' % energy)
#
# 4. Newton method for non-relativistic HF with density fitting for orbital
# hessian of newton solver. Note the answer is equal to case 3, but the
# solver "mf" is different.
#
mf = scf.density_fit(scf.newton(scf.RHF(mol)))
mf = scf.RHF(mol).newton().density_fit()
energy = mf.kernel()
print('E = %.12f, ref = -76.026765673120' % energy)
#
# 5. Newton method to solve the density-fitting approximated HF object. There
# is no approximation for newton method (orbital hessian). Note the density
# fitting is applied on HF object only. It does not affect the Newton solver.
#
mf = scf.newton(scf.density_fit(scf.RHF(mol)))
mf = scf.RHF(mol).density_fit().newton()
energy = mf.kernel()
print('E = %.12f, ref = -76.026744737357' % energy)
#
# 6. Newton method for density-fitting HF, and the hessian of Newton solver is
# also approximated with density fitting. Note the anwser is equivalent to
# case 5, but the solver "mf" is different. Here the fitting basis for HF and
# Newton solver are different. HF is approximated with the default density
# fitting basis (Weigend cfit basis). Newton solver is approximated with
# Ahlrichs cfit basis.
#
mf = scf.density_fit(scf.newton(scf.density_fit(scf.RHF(mol))), 'ahlrichs')
mf = scf.RHF(mol).density_fit().newton().density_fit(auxbasis='ahlrichs')
energy = mf.kernel()
print('E = %.12f, ref = -76.026744737357' % energy)

1.23. Miscellaneous

255

PySCF Documentation, Release 1.4.0

FCI
Direct FCI solver cannot guarantee the CI wave function to be the spin eigenfunction.
fci.addons.fix_spin_() can fix this issue.

Decoration function

CASSCF
mcscf.density_fit(), and scf.sfx2c() can be used to decorate CASSCF/CASCI class. Like the ordering
problem in SCF decoration operation, the density fitting for CASSCF solver only affect the CASSCF optimization
procedure. It does not change the 2e integrals for CASSCF Hamiltonian. For example
#!/usr/bin/env python
#
# Author: Qiming Sun 
#
from pyscf import gto, scf, mcscf
'''
Density fitting for orbital optimzation.
Note mcscf.density_fit function follows the same convention of decoration
ordering which is applied in the SCF decoration. See pyscf/mcscf/df.py for
more details and pyscf/example/scf/23-decorate_scf.py as an exmple.
'''
mol = gto.Mole()
mol.build(
atom = [
["C", (-0.65830719, 0.61123287, -0.00800148)],
["C", ( 0.73685281, 0.61123287, -0.00800148)],
["C", ( 1.43439081, 1.81898387, -0.00800148)],
["C", ( 0.73673681, 3.02749287, -0.00920048)],
["C", (-0.65808819, 3.02741487, -0.00967948)],
["C", (-1.35568919, 1.81920887, -0.00868348)],
["H", (-1.20806619, -0.34108413, -0.00755148)],
["H", ( 1.28636081, -0.34128013, -0.00668648)],
["H", ( 2.53407081, 1.81906387, -0.00736748)],
["H", ( 1.28693681, 3.97963587, -0.00925948)],
["H", (-1.20821019, 3.97969587, -0.01063248)],
["H", (-2.45529319, 1.81939187, -0.00886348)],],
basis = 'ccpvtz'
)
mf = scf.RHF(mol)
mf.conv_tol = 1e-8
e = mf.kernel()
#
# DFCASSCF uses density-fitting 2e integrals overall, regardless the
# underlying mean-filed object
#
mc = mcscf.DFCASSCF(mf, 6, 6)
mo = mc.sort_mo([17,20,21,22,23,30])
mc.kernel(mo)
print('E(CAS) = %.12f, ref = -230.845892901370' % mc.e_tot)

256

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

#
# Assign DF basis
#
mc = mcscf.DFCASSCF(mf, 6, 6, auxbasis='ccpvtzfit')
mo = mc.sort_mo([17,20,21,22,23,30])
mc.kernel(mo)
print('E(CAS) = %.12f, ref = -230.845892901370' % mc.e_tot)

1.23.2 Customizing Hamiltonian
PySCF supports user-defined Hamiltonian for many modules. To customize Hamiltonian for Hartree-Fock, CASSCF,
MP2, CCSD, etc, one need to replace the methods get_hcore(), get_ovlp() and attribute _eri of SCF class
for new Hamiltonian. E.g. the user-defined Hamiltonian for Hartree-Fock
#!/usr/bin/env python
#
# Author: Qiming Sun 
#
import numpy
from pyscf import gto, scf, ao2mo
'''
Customizing Hamiltonian for SCF module.
Three steps to define Hamiltonian for SCF:
1. Specify the number of electrons. (Note mole object must be "built" before doing
˓→this step)
2. Overwrite three attributes of scf object
.get_hcore
.get_ovlp
._eri
3. Specify initial guess (to overwrite the default atomic density initial guess)
Note you will see warning message on the screen:
overwrite keys get_ovlp get_hcore of 
'''
mol = gto.M()
n = 10
mol.nelectron = n
mf = scf.RHF(mol)
h1 = numpy.zeros((n,n))
for i in range(n-1):
h1[i,i+1] = h1[i+1,i] = -1.0
h1[n-1,0] = h1[0,n-1] = -1.0 # PBC
eri = numpy.zeros((n,n,n,n))
for i in range(n):
eri[i,i,i,i] = 4.0
mf.get_hcore = lambda *args: h1
mf.get_ovlp = lambda *args: numpy.eye(n)
# ao2mo.restore(8, eri, n) to get 8-fold permutation symmetry of the integrals

1.23. Miscellaneous

257

PySCF Documentation, Release 1.4.0

# ._eri only supports the two-electron integrals in 4-fold or 8-fold symmetry.
mf._eri = ao2mo.restore(8, eri, n)
mf.kernel()

and the user-defined Hamiltonian for CASSCF
#!/usr/bin/env python
#
# Author: Qiming Sun 
#
import numpy
from pyscf import gto, scf, ao2mo, mcscf
'''
User-defined Hamiltonian for CASSCF module.
Defining Hamiltonian once for SCF object, the derivate post-HF method get the
Hamiltonian automatically.
'''
mol = gto.M()
mol.nelectron = 6
#
# 1D anti-PBC Hubbard model at half filling
#
n = 12
h1 = numpy.zeros((n,n))
for i in range(n-1):
h1[i,i+1] = h1[i+1,i] = -1.0
h1[n-1,0] = h1[0,n-1] = -1.0
eri = numpy.zeros((n,n,n,n))
for i in range(n):
eri[i,i,i,i] = 2.0
mf = scf.RHF(mol)
mf.get_hcore = lambda *args: h1
mf.get_ovlp = lambda *args: numpy.eye(n)
mf._eri = ao2mo.restore(8, eri, n)
mf.init_guess = '1e'
mf.kernel()
mycas = mcscf.CASSCF(mf, 4, 4)
mycas.kernel()

1.24 qmmm — QM/MM interface
QM part interface
pyscf.qmmm.itrf.mm_charge(scf_method, coords, charges, unit=None)
Modify the QM method using the (non-relativistic) potential generated by MM charges.
Args: scf_method : a HF or DFT object

258

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

coords [2D array, shape (N,3)] MM particle coordinates
charges [1D array] MM particle charges
Kwargs:
unit [str] Bohr, AU, Ang (case insensitive). Default is the same to mol.unit
Returns: Same method object as the input scf_method with modified 1e Hamiltonian
Note: 1. if MM charge and X2C correction are used together, function mm_charge needs to be applied after X2C decoration (scf.sfx2c function), eg mf = mm_charge(scf.sfx2c(scf.RHF(mol)), [(0.5,0.6,0.8)],
[-0.5]). 2. Once mm_charge function is applied on the SCF object, it affects all the post-HF calculations
eg MP2, CCSD, MCSCF etc
Examples:
>>> mol = gto.M(atom='H 0 0 0; F 0 0 1', basis='ccpvdz', verbose=0)
>>> mf = mm_charge(dft.RKS(mol), [(0.5,0.6,0.8)], [-0.3])
>>> mf.kernel()
-101.940495711284

pyscf.qmmm.itrf.mm_charge_grad(scf_grad, coords, charges, unit=None)
Apply the MM charges in the QM gradients’ method. It affects both the electronic and nuclear parts of the QM
fragment.
Args:
scf_grad [a HF or DFT gradient object (grad.HF or grad.RKS etc)] Once mm_charge_grad function is
applied on the SCF object, it affects all post-HF calculations eg MP2, CCSD, MCSCF etc
coords [2D array, shape (N,3)] MM particle coordinates
charges [1D array] MM particle charges
Kwargs:
unit [str] Bohr, AU, Ang (case insensitive). Default is the same to mol.unit
Returns: Same gradeints method object as the input scf_grad method
Examples:
>>> from pyscf import gto, scf, grad
>>> mol = gto.M(atom='H 0 0 0; F 0 0 1', basis='ccpvdz', verbose=0)
>>> mf = mm_charge(scf.RHF(mol), [(0.5,0.6,0.8)], [-0.3])
>>> mf.kernel()
-101.940495711284
>>> hfg = mm_charge_grad(grad.hf.RHF(mf), coords, charges)
>>> hfg.kernel()
[[-0.25912357 -0.29235976 -0.38245077]
[-1.70497052 -1.89423883 1.2794798 ]]

1.25 mrpt — Multi-reference perturbation theory
1.25.1 N-electron valance perturbation theory (NEVPT2)
class pyscf.mrpt.nevpt2.NEVPT(mc, root=0)
Strongly contracted NEVPT2

1.25. mrpt — Multi-reference perturbation theory

259

PySCF Documentation, Release 1.4.0

Attributes:
root [int] To control which state to compute if multiple roots or state-average wfn were calculated in
CASCI/CASSCF
compressed_mps [bool] compressed MPS perturber method for DMRG-SC-NEVPT2
Examples:
>>> mf = gto.M('N 0 0 0; N 0 0 1.4', basis='6-31g').apply(scf.RHF).run()
>>> mc = mcscf.CASSCF(mf, 4, 4).run()
>>> NEVPT(mc).kernel()
-0.14058324991532101

compress_approx(maxM=500, compress_schedule=None, tol=1e-07, stored_integral=False)
SC-NEVPT2 with compressed perturber
Kwargs :
maxM [int] DMRG bond dimension
Examples:
>>> mf = gto.M('N 0 0 0; N 0 0 1.4', basis='6-31g').apply(scf.RHF).run()
>>> mc = dmrgscf.DMRGSCF(mf, 4, 4).run()
>>> NEVPT(mc, root=0).compress_approx(maxM=100).kernel()
-0.14058324991532101

load_ci(root=None)
Hack me to load CI wfn from disk

1.26 Benchmark
Platform
CPU
Memory
OS
BLAS
Compiler

4 Intel E5-2670 @ 2.6 GB
64 GB DDR3
Custom Redhat 6.6
MKL 11.0
Intel 13.0

Benzene, on 16 CPU cores
Basis
HF
density fit HF
B3LYP
MP2
CASSCF(6,6)
CCSD

6-31G**
0.55 s
3.56 s
3.84 s
0.21 s
2.88 s
18.24 s

cc-pVTZ
5.76 s
7.61 s
11.44 s
4.66 s
34.73 s
477.0 s

ANO-Roos-TZ
389.1 s
13.8 s
360.2 s
115.9 s
639.7 s
6721 s

C60, on 16 CPU cores
Basis
HF
SOSCF (newton)
density fit HF

6-31G**
1291 s
316.7 s

cc-pVTZ
189 m
77 m
43.3 m

Fe(II)-porphyrin (FeC20H12N4), on 16 CPU cores

260

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

Basis
SOSCF (newton)
CASSCF(10,10)
CASSCF(11,8)

cc-pVDZ
193.4 s
1808 s
763.8 s

cc-pVTZ
20.1 m
241 m
150.3 m

cc-pVQZ
127.1 m
1280 m

1.27 Code standard
• Code at least should work under python-2.7, gcc-4.8.
• 90/10 functional/OOP, unless performance critical, functions are pure.
• 90/10 Python/C, only computational hot spots were written in C.
• To extend python function with C/Fortran:
– Following C89 (gnu89) standard for C code. (complex? variable length array?) http://flash-gordon.me.
uk/ansi.c.txt
– Following Fortran 95 standard for Fortran code. http://j3-fortran.org/doc/standing/archive/007/97-007r2/
pdf/97-007r2.pdf
– Do not use other program languages (to keep the package light-weight).
• Conservative on advanced language feature.
• Minimal dependence principle
– Minimal requirements on 3rd party program or libraries.
– Loose-coupling between modules so that the failure of one module can have minimal effects on the other
modules.
• Not enforced but recommended - Compatibile with Python 2.6, 2.7, 3.2, 3.3, 3.4; - Following C89 (gnu89)
standard for C code; - Using ctypes to bridge C/python functions

1.27.1 Name convention
• The prefix or suffix underscore in the function names have special meanings
– functions with prefix-underscore like _fn are private functions. They are typically not documented, and
not recommended to use.
– functions with suffix-underscore like fn_ means that they have side effects. The side effects include the
change of the input argument, the runtime modification of the class definitions (attributes or members), or
module definitions (global variables or functions) etc.
– regular (pure) functions do not have underscore as the prefix or suffix.

1.27.2 API convention
• gto.Mole holds all global parameters, like the log level, the max memory usage etc. They are used as the
default value for all other classes.
• Method class.
– Most QC method classes (like HF, CASSCF, FCI, ...) directly take three attributes verbose, stdout
and max_memory from gto.Mole. Overwriting them only affects the behavior of the local instance
for that method class. In the following example, mf.verbose screens out the noises produced by RHF
method, and the output of MP2 is written in the log file example.log:
1.27. Code standard

261

PySCF Documentation, Release 1.4.0

>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>

from pyscf import gto, scf, mp
mol = gto.M(atom='H 0 0 0; H 0 0 1', verbose=5)
mf = scf.RHF(mol)
mf.verbose = 0
mf.kernel()
mp2 = mp.MP2(mf)
mp2.stdout = open('example.log', 'w')
mp2.kernel()

– Method class are only to hold the options or enviroments (like convergence threshold, max iterations,
...) to control the behavior/convergence of the method. The intermediate status are not supposed to be
saved in the method class (during the computation). However, the final results or solutions are kept in
the method object for convenience. Once the results are stored in the particular method class, they are
assumed to be read only, since many class member functions take them as the default arguments if the
caller didn’t provide enough parameters.
– In __init__ function, initialize/define the problem size. The problem size parameters (like num orbitals
etc) can be considered as enviroments. They are not supposed to be changed by other functions.
– Kernel functions Although the method classes have various entrance/main funtion, many of them provide
an entrance function called kernel. You can simply call the kernel function and it will guide the
program flow to the right main function.
– Default value of the class member functions’ arguments. Many member functions can take the results of
their class as the default arguments.
• Function arguments
– First argument is handler. The handler is one of gto.Mole object, a mean-field object, or a post-HartreeFock object.

262

Chapter 1. Contents

PySCF Documentation, Release 1.4.0

1.28 Version history
1.4
1.4 beta
1.4 alpha
1.3.5_
1.3.4
1.3.3
1.3.2
1.3.1
1.3
1.3 beta
1.3 alpha 2
1.3 alpha 1
1.2.3
1.2.2
1.2.1
1.2
1.2 beta
1.2 alpha
1.1
1.1 beta
1.1 alpha 2
1.1 alpha 1
1.0
1.0 rc1
1.0 beta 1
1.0 alpha 2
1.0 alpha 1

2017-10-05
2017-08-22 (feature freeze)
2017-06-24
2017-08-12
2017-08-09
2017-07-05
2017-06-05
2017-05-14
2017-04-25
2017-02-15 (feature freeze)
2017-01-04
2016-12-04
2017-04-24
2017-02-15
2017-01-26
2016-11-07
2016-09-13 (feature freeze)
2016-08-05
2016-06-04
2016-04-11 (feature freeze)
2016-03-08
2016-02-08
2015-10-07
2015-09-07
2015-08-02 (feature freeze)
2015-07-03
2015-04-07

You can also download the PDF version of this manual.

1.28. Version history

263

PySCF Documentation, Release 1.4.0

264

Chapter 1. Contents

PYTHON MODULE INDEX

c
cc, ??
ci, ??

d
df, ??

p
pbc.df, ??
pyscf, 3
pyscf.ao2mo, 128
pyscf.ao2mo.addons, 136
pyscf.ao2mo.incore, 128
pyscf.ao2mo.outcore, 130
pyscf.cc.addons, ??
pyscf.cc.ccsd, ??
pyscf.cc.ccsd_grad, ??
pyscf.cc.ccsd_t, ??
pyscf.cc.rccsd, ??
pyscf.cc.uccsd, ??
pyscf.df.addons, ??
pyscf.df.incore, 158
pyscf.df.outcore, ??
pyscf.dft.gen_grid, 162
pyscf.dft.libxc, 171
pyscf.dft.numint, 165
pyscf.dft.rks, 159
pyscf.dft.uks, 162
pyscf.fci, 150
pyscf.fci.addons, 153
pyscf.fci.cistring, 152
pyscf.fci.direct_spin0, 151
pyscf.fci.direct_spin0_symm, 152
pyscf.fci.direct_spin1, 150
pyscf.fci.direct_spin1_symm, 151
pyscf.fci.direct_uhf, 152
pyscf.fci.rdm, 153
pyscf.fci.spin_op, 153
pyscf.future.dmrgscf, ??
pyscf.future.fciqmcscf, ??
pyscf.grad, ??
pyscf.gto.basis, 73

pyscf.gto.mole, 29
pyscf.gto.moleintor, 67
pyscf.hessian, ??
pyscf.lib, 74
pyscf.lib.chkfile, ??
pyscf.lib.linalg_helper, 77
pyscf.lib.logger, 74
pyscf.lib.numpy_helper, 75
pyscf.lib.parameters, 74
pyscf.lo, ??
pyscf.lo.boys, ??
pyscf.lo.edmiston, ??
pyscf.lo.iao, ??
pyscf.lo.nao, ??
pyscf.lo.pipek, ??
pyscf.mcscf, 137
pyscf.mcscf.addons, 146
pyscf.mcscf.casci, 139
pyscf.mcscf.casci_symm, 141
pyscf.mcscf.casci_uhf, 141
pyscf.mcscf.mc1step, 142
pyscf.mcscf.mc1step_symm, 144
pyscf.mcscf.mc1step_uhf, 146
pyscf.mcscf.mc_ao2mo, 146
pyscf.mcscf.mc_ao2mo_uhf, 146
pyscf.mrpt, ??
pyscf.mrpt.nevpt2, ??
pyscf.pbc.df.aft_ao2mo, ??
pyscf.pbc.df.aft_jk, ??
pyscf.pbc.df.df_ao2mo, ??
pyscf.pbc.df.df_jk, ??
pyscf.pbc.df.fft_ao2mo, ??
pyscf.pbc.df.fft_jk, ??
pyscf.pbc.df.mdf_ao2mo, ??
pyscf.pbc.df.mdf_jk, ??
pyscf.pbc.dft, ??
pyscf.pbc.scf.hf, ??
pyscf.pbc.scf.khf, ??
pyscf.pbc.scf.kuhf, ??
pyscf.pbc.scf.uhf, ??
pyscf.qmmm.itrf, ??
pyscf.scf, 80

265

PySCF Documentation, Release 1.4.0

pyscf.scf.addons, 127
pyscf.scf.chkfile, 128
pyscf.scf.dhf, 126
pyscf.scf.diis, 128
pyscf.scf.hf, 96
pyscf.scf.hf_symm, 119
pyscf.scf.uhf, 111
pyscf.scf.uhf_symm, 123
pyscf.symm, 156
pyscf.symm.addons, 156
pyscf.symm.basis, 156
pyscf.symm.cg, 156
pyscf.symm.geom, 156
pyscf.tddft, ??
pyscf.tddft.rhf, ??
pyscf.tddft.rhf_grad, ??
pyscf.tddft.rks, ??
pyscf.tddft.rks_grad, ??
pyscf.tools, 173
pyscf.tools.cubegen, ??
pyscf.tools.dump_mat, 173
pyscf.tools.fcidump, 173
pyscf.tools.molden, 173
pyscf.tools.wfn_format, ??

s
scf, ??

266

Python Module Index

INDEX

A

canonicalize() (in module pyscf.scf.hf), 105
canonicalize() (in module pyscf.scf.hf_symm), 122
absorb_h1e() (in module pyscf.fci.direct_spin1), 150
canonicalize() (in module pyscf.scf.uhf), 115
addr2str() (in module pyscf.fci.cistring), 152
canonicalize() (in module pyscf.scf.uhf_symm), 125
alias_axes() (in module pyscf.symm.geom), 156
canonicalize() (pyscf.mcscf.casci.CASCI method), 140
analyze() (in module pyscf.scf.hf), 105
canonicalize() (pyscf.scf.hf.SCF method), 82, 99
analyze() (in module pyscf.scf.hf_symm), 122
canonicalize() (pyscf.scf.hf_symm.RHF method), 120
analyze() (in module pyscf.scf.uhf), 115
canonicalize() (pyscf.scf.hf_symm.ROHF method), 122
analyze() (pyscf.scf.hf.SCF method), 82, 99
canonicalize() (pyscf.scf.rohf.ROHF method), 91
analyze() (pyscf.scf.rohf.ROHF method), 91
canonicalize() (pyscf.scf.uhf.UHF method), 93, 112
ao_loc_2c() (in module pyscf.gto.mole), 45
canonicalize() (pyscf.scf.uhf_symm.UHF method), 124
ao_loc_2c() (pyscf.gto.mole.Mole method), 31, 53
canonicalize_() (pyscf.mcscf.casci.CASCI method), 140
ao_loc_nr() (in module pyscf.gto.mole), 45
cart2j_kappa() (in module pyscf.gto.mole), 45
ao_loc_nr() (pyscf.gto.mole.Mole method), 31, 54
cart2j_l() (in module pyscf.gto.mole), 45
atom_charge() (pyscf.gto.mole.Mole method), 31, 54
cart2sph() (in module pyscf.gto.mole), 45
atom_coord() (pyscf.gto.mole.Mole method), 31, 54
atom_nelec_core() (pyscf.gto.mole.Mole method), 32, 54 cart2zmat() (in module pyscf.gto.mole), 45
cart_labels() (in module pyscf.gto.mole), 45
atom_nshells() (pyscf.gto.mole.Mole method), 32, 54
atom_pure_symbol() (pyscf.gto.mole.Mole method), 32, cart_labels() (pyscf.gto.mole.Mole method), 35, 58
cartesian_prod() (in module pyscf.lib.numpy_helper), 75
54
cas_natorb() (in module pyscf.mcscf.addons), 146
atom_shell_ids() (pyscf.gto.mole.Mole method), 32, 55
cas_natorb() (in module pyscf.mcscf.casci), 141
atom_symbol() (pyscf.gto.mole.Mole method), 32, 55
CASCI (class in pyscf.mcscf.casci), 139
atom_types() (in module pyscf.gto.mole), 45
caslst_by_irrep() (in module pyscf.mcscf.addons), 146
aux_e1() (in module pyscf.df.incore), 158
CASSCF (class in pyscf.mcscf.mc1step), 142
aux_e2() (in module pyscf.df.incore), 158
CASSCF (class in pyscf.mcscf.mc1step_symm), 144
chiral_mol() (in module pyscf.gto.mole), 46
B
cho_solve() (in module pyscf.lib.linalg_helper), 77
bas_angular() (pyscf.gto.mole.Mole method), 32, 55
cholesky_eri() (in module pyscf.df.incore), 158
bas_atom() (pyscf.gto.mole.Mole method), 33, 55
conc_env() (in module pyscf.gto.mole), 46
bas_coord() (pyscf.gto.mole.Mole method), 33, 55
conc_mol() (in module pyscf.gto.mole), 46
bas_ctr_coeff() (pyscf.gto.mole.Mole method), 33, 56
cond() (in module pyscf.lib.numpy_helper), 75
bas_exp() (pyscf.gto.mole.Mole method), 33, 56
contract_1e() (in module pyscf.fci.direct_spin0), 151
bas_kappa() (pyscf.gto.mole.Mole method), 33, 56
contract_1e() (in module pyscf.fci.direct_spin1), 150
bas_len_cart() (pyscf.gto.mole.Mole method), 34, 56
contract_2e() (in module pyscf.fci.direct_spin0), 151
bas_len_spinor() (pyscf.gto.mole.Mole method), 34, 56
contract_2e() (in module pyscf.fci.direct_spin1), 150
bas_nctr() (pyscf.gto.mole.Mole method), 34, 56
contract_ss() (in module pyscf.fci.spin_op), 153
bas_nprim() (pyscf.gto.mole.Mole method), 34, 56
copy() (in module pyscf.gto.mole), 46
build() (pyscf.gto.mole.Mole method), 34, 57
cre_a() (in module pyscf.fci.addons), 153
build_() (pyscf.gto.mole.Mole method), 35, 57
cre_b() (in module pyscf.fci.addons), 154

C
cache_xc_kernel_() (in module pyscf.dft.numint), 165
canonicalize() (in module pyscf.mcscf.casci), 141

D
davidson() (in module pyscf.lib.linalg_helper), 77

267

PySCF Documentation, Release 1.4.0

davidson1() (in module pyscf.lib.linalg_helper), 78
define_xc() (in module pyscf.dft.libxc), 171
define_xc_() (in module pyscf.dft.libxc), 171
density_fit() (in module pyscf.scf.dfhf), 125
des_a() (in module pyscf.fci.addons), 154
des_b() (in module pyscf.fci.addons), 154
det_ovlp() (in module pyscf.scf.uhf), 116
det_ovlp() (pyscf.scf.uhf.UHF method), 93, 112
detect_symm() (in module pyscf.symm.geom), 156
direct_sum() (in module pyscf.lib.numpy_helper), 75
dot() (in module pyscf.lib.numpy_helper), 75
dot_eri_dm() (in module pyscf.scf.hf), 105
dsolve() (in module pyscf.lib.linalg_helper), 79
dump_mo() (in module pyscf.tools.dump_mat), 173
dump_rec() (in module pyscf.tools.dump_mat), 174
dump_scf() (in module pyscf.scf.chkfile), 128
dump_tri() (in module pyscf.tools.dump_mat), 175
dumps() (in module pyscf.gto.mole), 46
dumps() (pyscf.gto.mole.Mole method), 35, 58
dyall_nuc_mod() (in module pyscf.gto.mole), 46

E
eig() (in module pyscf.scf.hf), 106
eig() (pyscf.scf.hf.SCF method), 82, 99
eig() (pyscf.scf.hf_symm.RHF method), 120
energy() (in module pyscf.fci.addons), 154
energy() (in module pyscf.fci.direct_spin1), 150
energy_elec() (in module pyscf.dft.rks), 161
energy_elec() (in module pyscf.scf.hf), 106
energy_elec() (in module pyscf.scf.uhf), 116
energy_elec() (pyscf.dft.rks.RKS method), 160
energy_elec() (pyscf.scf.hf.SCF method), 82, 99
energy_elec() (pyscf.scf.uhf.UHF method), 94, 113
energy_nuc() (in module pyscf.gto.mole), 46
energy_tot() (in module pyscf.scf.hf), 106
energy_tot() (pyscf.scf.hf.SCF method), 83, 100
eval_ao() (in module pyscf.dft.numint), 165
eval_gto() (pyscf.gto.mole.Mole method), 35, 58
eval_mat() (in module pyscf.dft.numint), 166
eval_rho() (in module pyscf.dft.numint), 167
eval_rho2() (in module pyscf.dft.numint), 167
eval_xc() (in module pyscf.dft.libxc), 171
expand_etb() (in module pyscf.gto.mole), 46
expand_etb() (pyscf.gto.mole.Mole method), 36, 59
expand_etbs() (in module pyscf.gto.mole), 46
expand_etbs() (pyscf.gto.mole.Mole method), 36, 59

F
filatov_nuc_mod() (in module pyscf.gto.mole), 47
fill_2c2e() (in module pyscf.df.incore), 158
fix_spin_() (in module pyscf.fci.addons), 154
float_occ() (in module pyscf.scf.addons), 127
format_atom() (in module pyscf.gto.mole), 47
format_atom() (pyscf.gto.mole.Mole method), 36, 59
268

format_aux_basis() (in module pyscf.df.incore), 158
format_basis() (in module pyscf.gto.mole), 47
format_basis() (pyscf.gto.mole.Mole method), 37, 59
from_chk() (pyscf.scf.hf.SCF method), 83, 100
from_zmatrix() (in module pyscf.gto.mole), 48
full() (in module pyscf.ao2mo.incore), 128
full() (in module pyscf.ao2mo.outcore), 130
full_iofree() (in module pyscf.ao2mo.outcore), 131

G
gen_atomic_grids() (in module pyscf.dft.gen_grid), 163
gen_atomic_grids() (pyscf.dft.gen_grid.Grids method),
163
gen_cre_str_index() (in module pyscf.fci.cistring), 152
gen_des_str_index() (in module pyscf.fci.cistring), 152
gen_linkstr_index() (in module pyscf.fci.cistring), 152
gen_linkstr_index_trilidx() (in module pyscf.fci.cistring),
152
gen_strings4orblist() (in module pyscf.fci.cistring), 152
general() (in module pyscf.ao2mo.incore), 128
general() (in module pyscf.ao2mo.outcore), 132
general_iofree() (in module pyscf.ao2mo.outcore), 134
get_fock() (in module pyscf.mcscf.addons), 147
get_fock() (in module pyscf.mcscf.casci), 141
get_fock() (pyscf.scf.hf.SCF method), 83, 100
get_fock() (pyscf.scf.rohf.ROHF method), 91
get_fock_() (in module pyscf.scf.hf), 106
get_fock_() (pyscf.scf.hf.SCF method), 83, 100
get_fock_() (pyscf.scf.rohf.ROHF method), 91
get_grad() (in module pyscf.scf.dhf), 127
get_grad() (in module pyscf.scf.hf), 107
get_grad() (in module pyscf.scf.uhf), 116
get_grad() (pyscf.scf.hf.SCF method), 84, 101
get_grad() (pyscf.scf.rohf.ROHF method), 91
get_h1cas() (pyscf.mcscf.casci.CASCI method), 140
get_h1eff() (pyscf.mcscf.casci.CASCI method), 140
get_hcore() (in module pyscf.scf.hf), 107
get_init_guess() (in module pyscf.fci.direct_spin1), 150
get_init_guess() (in module pyscf.scf.hf), 107
get_irrep_nelec() (in module pyscf.scf.hf_symm), 122
get_irrep_nelec() (in module pyscf.scf.uhf_symm), 125
get_irrep_nelec() (pyscf.scf.hf_symm.RHF method), 120
get_irrep_nelec() (pyscf.scf.uhf_symm.UHF method),
124
get_j() (pyscf.scf.hf.SCF method), 84, 101
get_jk() (in module pyscf.scf.hf), 107
get_jk() (pyscf.scf.hf.SCF method), 84, 101
get_jk_() (pyscf.scf.hf.RHF method), 89, 97
get_jk_() (pyscf.scf.hf.SCF method), 84, 102
get_k() (pyscf.scf.hf.SCF method), 85, 102
get_occ() (in module pyscf.scf.hf), 108
get_occ() (pyscf.scf.hf.SCF method), 85, 102
get_occ() (pyscf.scf.hf_symm.RHF method), 121
get_occ() (pyscf.scf.rohf.ROHF method), 91
Index

PySCF Documentation, Release 1.4.0

get_occ() (pyscf.scf.uhf_symm.UHF method), 124
get_ovlp() (in module pyscf.scf.hf), 108
get_veff() (in module pyscf.scf.hf), 108
get_veff() (in module pyscf.scf.uhf), 116
get_veff() (pyscf.dft.rks.RKS method), 160
get_veff() (pyscf.dft.uks.UKS method), 162
get_veff() (pyscf.scf.dhf.UHF method), 127
get_veff() (pyscf.scf.hf.RHF method), 89, 98
get_veff() (pyscf.scf.hf.SCF method), 85, 102
get_veff() (pyscf.scf.rohf.ROHF method), 91
get_veff() (pyscf.scf.uhf.UHF method), 94, 113
get_veff_() (in module pyscf.dft.rks), 161
get_veff_() (in module pyscf.dft.uks), 162
getints() (in module pyscf.gto.moleintor), 67
getints_by_shell() (in module pyscf.gto.moleintor), 70
Grids (class in pyscf.dft.gen_grid), 162
gto_norm() (in module pyscf.gto.mole), 48
gto_norm() (pyscf.gto.mole.Mole method), 37, 60
guess_wfnsym() (in module pyscf.fci.addons), 155

H
h1e_for_cas() (in module pyscf.mcscf.casci), 141
h1e_for_cas() (in module pyscf.mcscf.casci_uhf), 141
h1e_for_cas() (pyscf.mcscf.casci.CASCI method), 141
half_e1() (in module pyscf.ao2mo.incore), 129
half_e1() (in module pyscf.ao2mo.outcore), 135
hermi_triu_() (in module pyscf.lib.numpy_helper), 75
hot_tuning_() (in module pyscf.mcscf.addons), 147
hybrid_coeff() (in module pyscf.dft.libxc), 172

I
init_guess_by_1e() (in module pyscf.scf.dhf), 127
init_guess_by_1e() (in module pyscf.scf.hf), 109
init_guess_by_1e() (pyscf.scf.hf.SCF method), 86, 103
init_guess_by_atom() (in module pyscf.scf.dhf), 127
init_guess_by_atom() (in module pyscf.scf.hf), 109
init_guess_by_atom() (pyscf.scf.hf.SCF method), 86, 103
init_guess_by_chkfile() (in module pyscf.scf.hf), 109
init_guess_by_chkfile() (pyscf.scf.hf.SCF method), 86,
103
init_guess_by_minao() (in module pyscf.scf.dhf), 127
init_guess_by_minao() (in module pyscf.scf.hf), 109
init_guess_by_minao() (in module pyscf.scf.uhf), 117
init_guess_by_minao() (pyscf.scf.dhf.UHF method), 127
init_guess_by_minao() (pyscf.scf.hf.SCF method), 86,
103
init_guess_by_minao() (pyscf.scf.uhf.UHF method), 95,
114
initguess_triplet() (in module pyscf.fci.addons), 155
intor() (pyscf.gto.mole.Mole method), 38, 60
intor_asymmetric() (pyscf.gto.mole.Mole method), 38, 61
intor_by_shell() (pyscf.gto.mole.Mole method), 39, 61
intor_cross() (in module pyscf.gto.mole), 48
intor_symmetric() (pyscf.gto.mole.Mole method), 41, 64
Index

irrep_id2name() (in module pyscf.symm.addons), 156
irrep_name2id() (in module pyscf.symm.addons), 156
is_same_mol() (in module pyscf.gto.mole), 49

K
kernel() (in module pyscf.mcscf.casci), 141
kernel() (in module pyscf.mcscf.casci_uhf), 142
kernel() (in module pyscf.mcscf.mc1step), 144
kernel() (in module pyscf.scf.dhf), 127
kernel() (in module pyscf.scf.hf), 109
kernel() (pyscf.gto.mole.Mole method), 42, 64
kernel() (pyscf.scf.hf.SCF method), 86, 103
krylov() (in module pyscf.lib.linalg_helper), 79

L
label_orb_symm() (in module pyscf.symm.addons), 157
large_ci() (in module pyscf.fci.addons), 155
large_rho_indices() (in module pyscf.dft.numint), 167
len_cart() (in module pyscf.gto.mole), 49
len_spinor() (in module pyscf.gto.mole), 49
level_shift() (in module pyscf.scf.hf), 110
librdm (in module pyscf.fci.rdm), 153
linearmole_symm_descent()
(in
module
pyscf.symm.basis), 156
load (class in pyscf.ao2mo.addons), 136
load() (in module pyscf.gto.basis), 73
load() (in module pyscf.tools.molden), 173
load_ecp() (in module pyscf.gto.basis), 73
loads() (in module pyscf.gto.mole), 49
loads() (pyscf.gto.mole.Mole method), 42, 65

M
M() (in module pyscf.gto.mole), 29
make_asym_dm() (in module pyscf.scf.uhf), 117
make_asym_dm() (pyscf.scf.uhf.UHF method), 95, 114
make_atm_env() (in module pyscf.gto.mole), 49
make_bas_env() (in module pyscf.gto.mole), 49
make_dm123() (in module pyscf.fci.rdm), 153
make_dm1234() (in module pyscf.fci.rdm), 153
make_env() (in module pyscf.gto.mole), 49
make_hdiag() (in module pyscf.fci.direct_spin0), 151
make_hdiag() (in module pyscf.fci.direct_spin1), 150
make_mask() (in module pyscf.dft.numint), 168
make_rdm1() (in module pyscf.fci.direct_spin0), 151
make_rdm1() (in module pyscf.fci.direct_spin1), 150
make_rdm1() (in module pyscf.mcscf.addons), 147
make_rdm1() (in module pyscf.scf.hf), 110
make_rdm1() (in module pyscf.scf.uhf), 117
make_rdm1() (pyscf.scf.dhf.RHF method), 126
make_rdm1() (pyscf.scf.hf.SCF method), 87, 104
make_rdm1() (pyscf.scf.rohf.ROHF method), 92
make_rdm1() (pyscf.scf.uhf.UHF method), 95, 114
make_rdm12() (in module pyscf.fci.direct_spin0), 151
make_rdm12() (in module pyscf.fci.direct_spin1), 150
269

PySCF Documentation, Release 1.4.0

make_rdm12s() (in module pyscf.fci.direct_spin1), 150
make_rdm1s() (in module pyscf.fci.direct_spin0), 151
make_rdm1s() (in module pyscf.fci.direct_spin1), 151
make_rdm1s() (in module pyscf.mcscf.addons), 147
map2hf() (in module pyscf.mcscf.addons), 147
map_rhf_to_uhf() (in module pyscf.scf.uhf), 117
Mole (class in pyscf.gto.mole), 29, 52
mom_occ() (in module pyscf.scf.addons), 127
mulliken_meta() (in module pyscf.scf.hf), 110
mulliken_meta() (in module pyscf.scf.uhf), 117
mulliken_meta() (pyscf.scf.hf.SCF method), 87, 104
mulliken_pop() (in module pyscf.scf.hf), 111
mulliken_pop() (in module pyscf.scf.uhf), 117
mulliken_pop() (pyscf.scf.hf.SCF method), 87, 104
mulliken_pop_meta_lowdin_ao()
(in
module
pyscf.scf.hf), 111
mulliken_pop_meta_lowdin_ao()
(in
module
pyscf.scf.uhf), 117

pop() (pyscf.scf.hf.SCF method), 87, 104
project_init_guess() (in module pyscf.mcscf.addons), 147
project_mo_nr2nr() (in module pyscf.scf.addons), 127
pspace() (in module pyscf.fci.direct_spin0), 151
pspace() (in module pyscf.fci.direct_spin1), 151
pyscf (module), 3
pyscf.ao2mo (module), 128
pyscf.ao2mo.addons (module), 136
pyscf.ao2mo.incore (module), 128
pyscf.ao2mo.outcore (module), 130
pyscf.df (module), 158
pyscf.df.incore (module), 158
pyscf.dft.gen_grid (module), 162
pyscf.dft.libxc (module), 171
pyscf.dft.numint (module), 165
pyscf.dft.rks (module), 159
pyscf.dft.uks (module), 162
pyscf.fci (module), 150
pyscf.fci.addons (module), 153
N
pyscf.fci.cistring (module), 152
pyscf.fci.direct_spin0 (module), 151
nao_2c() (in module pyscf.gto.mole), 49
pyscf.fci.direct_spin0_symm (module), 152
nao_2c() (pyscf.gto.mole.Mole method), 42, 65
pyscf.fci.direct_spin1 (module), 150
nao_2c_range() (in module pyscf.gto.mole), 49
pyscf.fci.direct_spin1_symm (module), 151
nao_2c_range() (pyscf.gto.mole.Mole method), 42, 65
pyscf.fci.direct_uhf (module), 152
nao_cart() (in module pyscf.gto.mole), 49
pyscf.fci.rdm (module), 153
nao_cart() (pyscf.gto.mole.Mole method), 43, 65
pyscf.fci.spin_op (module), 153
nao_nr() (in module pyscf.gto.mole), 49
pyscf.gto (module), 29
nao_nr() (pyscf.gto.mole.Mole method), 43, 65
pyscf.gto.basis (module), 73
nao_nr_range() (in module pyscf.gto.mole), 49
pyscf.gto.mole (module), 29
nao_nr_range() (pyscf.gto.mole.Mole method), 43, 65
pyscf.gto.moleintor (module), 67
npgto_nr() (in module pyscf.gto.mole), 50
pyscf.lib (module), 74
npgto_nr() (pyscf.gto.mole.Mole method), 43, 66
pyscf.lib.linalg_helper (module), 77
nr_fxc() (in module pyscf.dft.numint), 168
pyscf.lib.logger (module), 74
nr_rks() (in module pyscf.dft.numint), 168
pyscf.lib.numpy_helper (module), 75
nr_rks_fxc() (in module pyscf.dft.numint), 168
pyscf.lib.parameters (module), 74
nr_rks_vxc() (in module pyscf.dft.numint), 169
pyscf.mcscf (module), 137
nr_uks() (in module pyscf.dft.numint), 170
pyscf.mcscf.addons (module), 146
nr_uks_fxc() (in module pyscf.dft.numint), 170
pyscf.mcscf.casci (module), 139
nr_uks_vxc() (in module pyscf.dft.numint), 170
pyscf.mcscf.casci_symm (module), 141
pyscf.mcscf.casci_uhf (module), 141
O
pyscf.mcscf.mc1step (module), 142
offset_nr_by_atom() (in module pyscf.gto.mole), 50
offset_nr_by_atom() (pyscf.gto.mole.Mole method), 43, pyscf.mcscf.mc1step_symm (module), 144
pyscf.mcscf.mc1step_uhf (module), 146
66
pyscf.mcscf.mc_ao2mo (module), 146
original_becke() (in module pyscf.dft.gen_grid), 165
pyscf.mcscf.mc_ao2mo_uhf (module), 146
overlap() (in module pyscf.fci.addons), 155
pyscf.scf (module), 80
pyscf.scf.addons (module), 127
P
pyscf.scf.chkfile (module), 128
pack() (in module pyscf.gto.mole), 50
pyscf.scf.dfhf (module), 125
pack() (pyscf.gto.mole.Mole method), 43, 66
pyscf.scf.dhf (module), 126
pack_tril() (in module pyscf.lib.numpy_helper), 76
pyscf.scf.diis (module), 128
parse() (in module pyscf.gto.basis), 73
pyscf.scf.hf (module), 96
parse_xc() (in module pyscf.dft.libxc), 173
pyscf.scf.hf_symm (module), 119
parse_xc_name() (in module pyscf.dft.libxc), 173
270

Index

PySCF Documentation, Release 1.4.0

pyscf.scf.uhf (module), 111
pyscf.scf.uhf_symm (module), 123
pyscf.symm (module), 156
pyscf.symm.addons (module), 156
pyscf.symm.basis (module), 156
pyscf.symm.cg (module), 156
pyscf.symm.geom (module), 156
pyscf.tools (module), 173
pyscf.tools.dump_mat (module), 173
pyscf.tools.fcidump (module), 173
pyscf.tools.molden (module), 173

spin_square() (in module pyscf.scf.uhf), 118
spin_square() (pyscf.scf.uhf.UHF method), 95, 114
spin_square0() (in module pyscf.fci.spin_op), 153
state_average() (in module pyscf.mcscf.addons), 149
state_average_() (pyscf.mcscf.casci.CASCI method), 141
state_specific() (in module pyscf.mcscf.addons), 149
state_specific_() (pyscf.mcscf.casci.CASCI method), 141
std_symb() (in module pyscf.symm.addons), 157
str2addr() (in module pyscf.fci.cistring), 152
stratmann() (in module pyscf.dft.gen_grid), 165
symm_allow_occ() (in module pyscf.scf.addons), 128
symm_identical_atoms() (in module pyscf.symm.geom),
R
156
symm_initguess() (in module pyscf.fci.addons), 155
r_get_jk_() (in module pyscf.scf.dfhf), 125
reform_linkstr_index() (in module pyscf.fci.cistring), 152 symmetrize_orb() (in module pyscf.symm.addons), 157
symmetrize_space() (in module pyscf.symm.addons), 158
remove_high_l() (in module pyscf.tools.molden), 173
symmetrize_wfn() (in module pyscf.fci.addons), 155
reorder() (in module pyscf.fci.addons), 155
restore() (in module pyscf.ao2mo.addons), 136
T
RHF (class in pyscf.scf.dhf), 126
take_2d() (in module pyscf.lib.numpy_helper), 76
RHF (class in pyscf.scf.hf), 88, 96
takebak_2d_() (in module pyscf.lib.numpy_helper), 76
RHF (class in pyscf.scf.hf_symm), 119
time_reversal_map() (in module pyscf.gto.mole), 51
RKS (class in pyscf.dft.rks), 159
time_reversal_map() (pyscf.gto.mole.Mole method), 44,
ROHF (class in pyscf.scf.hf_symm), 121
67
ROHF (class in pyscf.scf.rohf), 90
time_reversal_matrix() (in module pyscf.scf.dhf), 127
rotation_mat() (in module pyscf.symm.geom), 156
tot_electrons() (in module pyscf.gto.mole), 51
route() (in module pyscf.symm.addons), 157
tot_electrons() (pyscf.gto.mole.Mole method), 44, 67
trans_rdm1() (in module pyscf.fci.direct_spin0), 151
S
trans_rdm1() (in module pyscf.fci.direct_spin1), 151
safe_eigh() (in module pyscf.lib.linalg_helper), 80
trans_rdm12() (in module pyscf.fci.direct_spin0), 151
same_mol() (in module pyscf.gto.mole), 50
trans_rdm12() (in module pyscf.fci.direct_spin1), 151
SCF (class in pyscf.scf.hf), 81, 98
trans_rdm12s() (in module pyscf.fci.direct_spin1), 151
scf() (pyscf.scf.hf.SCF method), 88, 105
trans_rdm1s() (in module pyscf.fci.direct_spin0), 152
search_ao_nr() (in module pyscf.gto.mole), 50
trans_rdm1s() (in module pyscf.fci.direct_spin1), 151
search_ao_nr() (pyscf.gto.mole.Mole method), 43, 66
transpose() (in module pyscf.lib.numpy_helper), 76
search_shell_id() (in module pyscf.gto.mole), 50
set_common_origin_() (pyscf.gto.mole.Mole method), transpose_sum() (in module pyscf.lib.numpy_helper), 76
treutler_prune() (in module pyscf.dft.gen_grid), 165
44, 66
set_nuc_mod_() (pyscf.gto.mole.Mole method), 44, 66
set_range_coulomb_() (pyscf.gto.mole.Mole method),
44, 66
set_rinv_origin_() (pyscf.gto.mole.Mole method), 44, 66
set_rinv_zeta_() (pyscf.gto.mole.Mole method), 44, 67
so2ao_mo_coeff() (in module pyscf.scf.hf_symm), 123
solve_approx_ci()
(pyscf.mcscf.mc1step.CASSCF
method), 144
solve_lineq_by_SVD()
(in
module
pyscf.lib.numpy_helper), 76
sort_mo() (in module pyscf.mcscf.addons), 148
sort_mo() (pyscf.mcscf.casci.CASCI method), 141
sort_mo_by_irrep() (in module pyscf.mcscf.addons), 149
spheric_labels() (in module pyscf.gto.mole), 51
spheric_labels() (pyscf.gto.mole.Mole method), 44, 67
spin_square() (in module pyscf.fci.spin_op), 153
spin_square() (in module pyscf.mcscf.addons), 149
Index

U
UHF (class in pyscf.scf.dhf), 126
UHF (class in pyscf.scf.uhf), 92, 111
UHF (class in pyscf.scf.uhf_symm), 123
UKS (class in pyscf.dft.uks), 162
uncontract() (in module pyscf.gto.mole), 51
uncontract_basis() (in module pyscf.gto.mole), 51
unpack() (in module pyscf.gto.mole), 51
unpack() (pyscf.gto.mole.Mole method), 45, 67
unpack_row() (in module pyscf.lib.numpy_helper), 77
unpack_tril() (in module pyscf.lib.numpy_helper), 77

Z
zdot() (in module pyscf.lib.numpy_helper), 77
zmat() (in module pyscf.gto.mole), 51
zmat2cart() (in module pyscf.gto.mole), 52
271



Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.5
Linearized                      : No
Page Count                      : 275
Page Mode                       : UseOutlines
Has XFA                         : No
Author                          : 
Title                           : 
Subject                         : 
Creator                         : LaTeX with hyperref package
Producer                        : pdfTeX-1.40.13
Create Date                     : 2017:10:12 01:40:13-07:00
Modify Date                     : 2018:06:20 15:57:05+08:00
Trapped                         : False
PTEX Fullbanner                 : This is pdfTeX, Version 3.1415926-2.4-1.40.13 (TeX Live 2012) kpathsea version 6.1.0
EXIF Metadata provided by EXIF.tools

Navigation menu