Is that possible to print overlap integral with nuclear derivative <mu_A| d/dX_B | nu_B>?


I am interested in the following type integral <mu_A| d/dX_B | nu_B>, where A and B are the centers of contracted Gaussian basis, mu_A and nu_B, e.g., mu_A = \sum_i c_i exp( -\alpha_i (x - X_A)**2 ), X_B stands for the X,Y,Z three components of the nuclear coordinates.

I found in MintsHelper

overlap_grad(*self: [psi4.core.MintsHelper]
First nuclear derivative overlap integrals

I am not sure if this is dS/dX, the derivative on the overlap integral itself. dS/dX = <d/dX_B mu_A| | nu_B> + <mu_A| d/dX_B | nu_B>, if R_A = R_B, the first term <d/dX_B mu_A| | nu_B> will not vanish.

There is also an ao_overlap_half_deriv1, I tried to load it as asarray(mints.ao_overlap_half_deriv1(), order='F') and got

TypeError: ao_overlap_half_deriv1(): incompatible function arguments. The following argument types are supported:
    1. (self: psi4.core.MintsHelper, side: str, atom: int) -> List[psi4.core.Matrix]

Invoked with: <psi4.core.MintsHelper object at 0x7f4776ce01b0>

in psi4 version 1.5. Thank you so much.

Here is a minimal reproducible example

import psi4
import numpy as np

psi4.set_output_file("output.dat", False)

geom = """
H 0. 0. 0. 
F 0. 0. 1.

psi4.set_options({"BASIS": "cc-pVDZ"})

print ('geom', geom )

mol = psi4.geometry(geom)

print ('mol', mol)
wfn =, psi4.core.get_global_option('BASIS'))
mints = psi4.core.MintsHelper(wfn.basisset())

T = np.asarray(mints.ao_kinetic(), order='F')
V = np.asarray(mints.ao_potential(), order='F')

S = np.asarray(mints.ao_overlap(), order='F')

dS1 = np.asarray(mints.overlap_grad(), order='F')

dS2 = np.asarray(mints.ao_overlap_half_deriv1(), order='F')

That function should really be documented better…

In analytic gradient theory, the overlap contribution to the gradient always appears as - (S^x)_pq W_pw where W is known as the energy-weighted density matrix. The function overlap_grad takes in W as a psi4.core.Matrix object and performs the contraction (S^x)_pq W_pq, summing over all centers x and excluding the minus sign.

To get the (S^x)_pq for a given x, use mints.ao_oei_deriv1("OVERLAP", x). You can, in principle, see this in action in Psi4Numpy RHF gradients, but the code is rather opaque!

overlap_half_deriv is needed for some response theory that the Crawford group is working on, I believe VCD.

Let me know if that answers the question.

Thanks a lot.

I am not sure about the expression S^x_pq, is this d/dX_A[<p|q>]?
If p=exp(-1.0 (x-X_A)**2 -1.0 (y-Y_A)**2 -1.0 (z-Z_A)**2 )
q=exp(-2.0 (x-X_A)**2 -2.0 (y-Y_A)**2 -2.0 (z-Z_A)**2 )
d/dX_A[<p|q>] = <dp/dX_A|q> + <p|dq/dX_A> (1)

I need <p|dq/dX_A>, only the second term at the right-hand side of Eq.(1). Or am I misunderstood at some stage? And is there any sanity check if I have loaded the right integrals? Compare with other programs or write some Mathematica code?

More properly, S^A_pq is d/dX_A[<p|q>], where <p|q> is the AO overlap integral.

ao_overlap_half_deriv indeed applies the nuclear position derivative to either the bra (“LEFT”) AO or the ket (“RIGHT”) AO. The first argument is “LEFT” or “RIGHT”, and the second is the index/number of the center.

The correctness test we have on these integrals in Psi is exactly your (1), albeit in the MO basis rather than the AO basis.

Can I ask what your background is? That should hopefully make it easier for me to help if you need more exotic integrals. Clearly, my initial assumption that you were interested in nuclear gradients was wrong.

This topic was automatically closed 60 days after the last reply. New replies are no longer allowed.