Integral transformation using abelian symmetry

Dear PSI4 community,

I have been working recently on a second order electron propagator methods python scripts in psi4. As long as I use symm=c1 everything works fine. However, if I use a higher symmetry things don’t work properly. For example, water molecule with c2v abelian group and sto-3g basis set gives a Ca matrix that is an array of 4 matrices (one for each irreducible representation or irrep). I generated a matrix with this blocks using np.block()
and gives this:
[[ 0.99413 0.23279 0.10317 0.13235 0. 0. 0. ]
[ 0.02656 -0.83358 -0.53681 -0.8843 0. 0. 0. ]
[ 0.00434 -0.12952 0.77666 -0.74235 0. 0. 0. ]
[-0.00844 -0.22444 0.39307 1.12708 0. 0. 0. ]
[ 0. 0. 0. 0. 1. 0. 0. ]
[ 0. 0. 0. 0. 0. 0.60645 0.99043]
[ 0. 0. 0. 0. 0. -0.62936 1.18578]]
Then, I try to transform the integrals using these lines:
aux1 = np.einsum(‘sS,pqrs->pqrS’,Ca,I)
aux2 = np.einsum(‘rR,pqrS->pqRS’,Ca,aux1)
aux1 = np.einsum(‘qQ,pqRS->pQRS’,Ca,aux2)
MO = np.einsum(‘pP,pQRS->PQRS’,Ca,aux1)
I is obtained from mints
I = np.array(mints.ao_eri())
I = I.reshape(nmo, nmo, nmo, nmo)
However, the results are not equal to the ones obtained are not equal to the ones obtained without symmetry.
I also tried using
MO_TEI = mints.mo_eri(wfn.Ca(), wfn.Ca(), wfn.Ca(), wfn.Ca())
but this gives an array of (4,4,4,4) inside a 1 dimension tuple instead of a (7,7,7,7)
array

Best regards and thank you for your help!
Manuel Diaz-Tinoco

You’re getting your one-particle basis sets confused.

Psi has molecular orbitals and atomic orbitals, but it also has symmetry orbitals. Symmetry orbitals are a linear combination of atomic orbitals that turn into +/- themselves under operations like rotation and reflection. (Within the abelian case.) When symmetry is enabled, the Ca matrix isn’t a linear transformation between molecular orbitals and atomic orbitals, but between molecular orbitals and symmetry orbitals. Trying to apply this C matrix to integrals in atomic orbitals, like ao_eri, will give you nonsense.

If you want the Ca matrix between molecular orbitals and atomic orbitals, use Ca_subset("AO", "ALL").

Thank you so much!
Indeed this Ca_subset worked for me!
Best wishes,
Manuel Diaz-Tinoco

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