Spherical Harmonic Convention

Is the spherical harmonics convention for basis sets in Psi4 documented anywhere? I have gathered that they happen to not be the same as those in Scipy (Y_00 = (1/2)*sqrt(1/pi) in Scipy, but I surmise that Y_00 = 1 in Psi4). Where can I find this documentation for all real spherical harmonics in Psi4?


A simpler way of asking, is what normalization does Psi4 use? Is it orthonormal, 4-pi normalized or Schmidt semi-normalized?

See “Normalization” section of the following:

There is a tiny explanation and link to a paper given here under SO:

This Schlegel paper looks like it uses orthonormal convention.

Else psi4 follows largely the CCA integral convention https://onlinelibrary.wiley.com/doi/abs/10.1002/jcc.20815

Others, like @andysim would know more.

Psi’s spherical AOs are fully normalized. For an easy demonstration, run wfn.S().np.diagonal() and look at all the 1’s. S is the overlap matrix.

The same is not true of Cartesians (there CCA applies), which can lead to headaches when writing data to external programs, as I have experienced multiple times.

Thanks for the quick answers @jmisiewicz and @hokru!

Both of you said or gave references that say “fully normalized”. I’m assuming that this means the “orthonormalized” convention in my original link. Is it correct that the equations for RSH in Psi4 are exactly the same as those in the Wikipedia article?

The psi4 gaussianshell object has an attribute called “coef”. I think this returns the normalization scalar for the entire AO, including both the radial and RSH normalization components. Is that correct?

Orthonormal if they are on the same atom, yes. It looks like that’s the same as the Wikipedia article, but I’m not going to do the detailed dive into the integrals code to confirm that.

GaussianShell.coef() returns the normalized contraction coefficient of a particular Gaussian primitive, exactly as the method’s docstring says.

Did you check the Schlegel paper that is mentioned in the link i gave?
It should have a table with explicit expressions.

Fair enough. Is there any way to get the normalization constants for the radial and angular parts separately?

The Schlegel paper does not spell out the real form, but assuming the normalization is the same as the complex form, then the “orthonormal” normalization is what is being used there.

I am still confused, though, because under the “orthonormal” convention, Y_00 = sqrt(1/(4 Pi)), but I have verified that in psi4, Y_00 = 1. The test for this is to print out the GaussianShell.coef() for an s-function. For this, the value returned = (2 alpha/Pi)^0.75, where alpha is the Gaussian width. This is the formula for the normalization of a Gaussian, so it must mean that Y_00 = 1.

Perhaps helpful is a python implementation of the spherical harmonics (stolen from @andysim) here: https://github.com/dgasmith/gau2grid/blob/master/gau2grid/RSH.py

Perhaps too difficult to unwind, but we use the quantities directly in Psi4 so we are certain they are valid.