# Copyright 2014-2022 The PySCF Developers. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Author: Abdelrahman Ahmed <>
# Samragni Banerjee <samragnibanerjee4@gmail.com>
# James Serna <jamcar456@gmail.com>
# Terrence Stahl <>
# Alexander Sokolov <alexander.y.sokolov@gmail.com>
#
'''
Unrestricted algebraic diagrammatic construction
'''
import numpy as np
from pyscf import lib, symm
from pyscf.lib import logger
from pyscf.adc import uadc_ao2mo
from pyscf.adc import radc_ao2mo
from pyscf.adc import dfadc
from pyscf.adc.radc_amplitudes import _create_t2_h5cache
from pyscf import __config__
from pyscf import df
from pyscf import scf
[docs]
def compute_amplitudes_energy(myadc, eris, verbose=None):
t1, t2, myadc.imds.t2_1_vvvv = myadc.compute_amplitudes(eris)
e_corr = myadc.compute_energy(t1, t2, eris)
return e_corr, t1, t2
[docs]
def compute_amplitudes(myadc, eris):
cput0 = (logger.process_clock(), logger.perf_counter())
log = logger.Logger(myadc.stdout, myadc.verbose)
if myadc.method not in ("adc(2)", "adc(2)-x", "adc(3)"):
raise NotImplementedError(myadc.method)
nocc_a = myadc._nocc[0]
nocc_b = myadc._nocc[1]
nvir_a = myadc._nvir[0]
nvir_b = myadc._nvir[1]
eris_oovv = eris.oovv
eris_OOVV = eris.OOVV
eris_ooVV = eris.ooVV
eris_OOvv = eris.OOvv
eris_ovoo = eris.ovoo
eris_OVoo = eris.OVoo
eris_ovOO = eris.ovOO
eris_OVOO = eris.OVOO
eris_ovvo = eris.ovvo
eris_OVVO = eris.OVVO
eris_ovVO = eris.ovVO
e_a = myadc.mo_energy_a
e_b = myadc.mo_energy_b
ab_ind_a = np.tril_indices(nvir_a, k=-1)
ab_ind_b = np.tril_indices(nvir_b, k=-1)
# Compute first-order doubles t2 (tijab)
v2e_oovv = eris_ovvo[:].transpose(0,3,1,2).copy()
v2e_oovv -= eris_ovvo[:].transpose(0,3,2,1).copy()
d_ij_a = e_a[:nocc_a][:,None] + e_a[:nocc_a]
d_ab_a = e_a[nocc_a:][:,None] + e_a[nocc_a:]
D2_a = d_ij_a.reshape(-1,1) - d_ab_a.reshape(-1)
D2_a = D2_a.reshape((nocc_a,nocc_a,nvir_a,nvir_a))
t2_1_a = v2e_oovv/D2_a
h5cache_t2 = _create_t2_h5cache()
if not isinstance(eris.oooo, np.ndarray):
t2_1_a = h5cache_t2.create_dataset('t2_1_a', data=t2_1_a)
del v2e_oovv
del D2_a
v2e_OOVV = eris_OVVO[:].transpose(0,3,1,2).copy()
v2e_OOVV -= eris_OVVO[:].transpose(0,3,2,1).copy()
d_ij_b = e_b[:nocc_b][:,None] + e_b[:nocc_b]
d_ab_b = e_b[nocc_b:][:,None] + e_b[nocc_b:]
D2_b = d_ij_b.reshape(-1,1) - d_ab_b.reshape(-1)
D2_b = D2_b.reshape((nocc_b,nocc_b,nvir_b,nvir_b))
t2_1_b = v2e_OOVV/D2_b
if not isinstance(eris.oooo, np.ndarray):
t2_1_b = h5cache_t2.create_dataset('t2_1_b', data=t2_1_b)
del v2e_OOVV
del D2_b
v2e_oOvV = eris_ovVO[:].transpose(0,3,1,2).copy()
d_ij_ab = e_a[:nocc_a][:,None] + e_b[:nocc_b]
d_ab_ab = e_a[nocc_a:][:,None] + e_b[nocc_b:]
D2_ab = d_ij_ab.reshape(-1,1) - d_ab_ab.reshape(-1)
D2_ab = D2_ab.reshape((nocc_a,nocc_b,nvir_a,nvir_b))
t2_1_ab = v2e_oOvV/D2_ab
if not isinstance(eris.oooo, np.ndarray):
t2_1_ab = h5cache_t2.create_dataset('t2_1_ab', data=t2_1_ab)
del v2e_oOvV
del D2_ab
D1_a = e_a[:nocc_a][:None].reshape(-1,1) - e_a[nocc_a:].reshape(-1)
D1_b = e_b[:nocc_b][:None].reshape(-1,1) - e_b[nocc_b:].reshape(-1)
D1_a = D1_a.reshape((nocc_a,nvir_a))
D1_b = D1_b.reshape((nocc_b,nvir_b))
cput0 = log.timer_debug1("Completed t2_1 amplitude calculation", *cput0)
t1_1 = (None,)
if isinstance(myadc._scf, scf.rohf.ROHF):
f_ov_a, f_ov_b = myadc.f_ov
t1_1_a = f_ov_a/D1_a
t1_1_b = f_ov_b/D1_b
t1_1 = (t1_1_a, t1_1_b)
else:
f_ov_a = np.zeros((nocc_a, nvir_a))
f_ov_b = np.zeros((nocc_b, nvir_b))
t1_1_a = np.zeros((nocc_a, nvir_a))
t1_1_b = np.zeros((nocc_b, nvir_b))
t1_2 = (None,)
if myadc.approx_trans_moments is False or myadc.method == "adc(3)":
# Compute second-order singles t1 (tij)
t1_2_a = np.zeros((nocc_a,nvir_a))
t1_2_b = np.zeros((nocc_b,nvir_b))
if isinstance(eris.ovvv, type(None)):
chnk_size = uadc_ao2mo.calculate_chunk_size(myadc)
a = 0
for p in range(0,nocc_a,chnk_size):
eris_ovvv = dfadc.get_ovvv_spin_df(
myadc, eris.Lov, eris.Lvv, p, chnk_size).reshape(-1,nvir_a,nvir_a,nvir_a)
k = eris_ovvv.shape[0]
t1_2_a += 0.5*lib.einsum('kdac,ikcd->ia',eris_ovvv,t2_1_a[:,a:a+k],optimize=True)
t1_2_a -= 0.5*lib.einsum('kcad,ikcd->ia',eris_ovvv,t2_1_a[:,a:a+k],optimize=True)
del eris_ovvv
a += k
else :
eris_ovvv = radc_ao2mo.unpack_eri_1(eris.ovvv, nvir_a)
t1_2_a += 0.5*lib.einsum('kdac,ikcd->ia',eris_ovvv,t2_1_a[:],optimize=True)
t1_2_a -= 0.5*lib.einsum('kcad,ikcd->ia',eris_ovvv,t2_1_a[:],optimize=True)
del eris_ovvv
t1_2_a -= 0.5*lib.einsum('lcki,klac->ia',eris_ovoo,t2_1_a[:],optimize=True)
t1_2_a += 0.5*lib.einsum('kcli,klac->ia',eris_ovoo,t2_1_a[:],optimize=True)
if isinstance(myadc._scf, scf.rohf.ROHF):
t1_2_a += lib.einsum('d,ld,ilad->ia',e_a[nocc_a:],t1_1_a,t2_1_a[:], optimize = True)
t1_2_a += lib.einsum('d,ld,ilad->ia',e_b[nocc_b:],t1_1_b,t2_1_ab[:], optimize = True)
t1_2_a -= lib.einsum('l,ld,ilad->ia',e_a[:nocc_a],t1_1_a,t2_1_a[:], optimize = True)
t1_2_a -= lib.einsum('l,ld,ilad->ia',e_b[:nocc_b],t1_1_b,t2_1_ab[:], optimize = True)
t1_2_a += 0.5*lib.einsum('a,ld,ilad->ia',e_a[nocc_a:],t1_1_a,t2_1_a[:], optimize = True)
t1_2_a += 0.5*lib.einsum('a,ld,ilad->ia',
e_a[nocc_a:],t1_1_b,t2_1_ab[:], optimize = True)
t1_2_a -= 0.5*lib.einsum('i,ld,ilad->ia',e_a[:nocc_a],t1_1_a,t2_1_a[:], optimize = True)
t1_2_a -= 0.5*lib.einsum('i,ld,ilad->ia',
e_a[:nocc_a],t1_1_b,t2_1_ab[:], optimize = True)
t1_2_a += lib.einsum('ld,ilad->ia',f_ov_a,t2_1_a[:], optimize = True)
t1_2_a += lib.einsum('ld,ilad->ia',f_ov_b,t2_1_ab[:], optimize = True)
t1_2_a += lib.einsum('ld,iadl->ia',t1_1_a, eris.ovvo, optimize = True)
t1_2_a -= lib.einsum('ld,idal->ia',t1_1_a, eris.ovvo, optimize = True)
t1_2_a += lib.einsum('ld,iadl->ia',t1_1_b, eris.ovVO, optimize = True)
t1_2_a += lib.einsum('ld,iadl->ia',t1_1_a,eris.ovvo, optimize = True)
t1_2_a -= lib.einsum('ld,liad->ia',t1_1_a,eris.oovv, optimize = True)
t1_2_a += lib.einsum('ld,iadl->ia',t1_1_b,eris.ovVO, optimize = True)
if isinstance(eris.OVvv, type(None)):
chnk_size = uadc_ao2mo.calculate_chunk_size(myadc)
a = 0
for p in range(0,nocc_b,chnk_size):
eris_OVvv = dfadc.get_ovvv_spin_df(
myadc, eris.LOV, eris.Lvv, p, chnk_size).reshape(-1,nvir_b,nvir_a,nvir_a)
k = eris_OVvv.shape[0]
t1_2_a += lib.einsum('kdac,ikcd->ia',eris_OVvv,t2_1_ab[:,a:a+k],optimize=True)
del eris_OVvv
a += k
else :
eris_OVvv = radc_ao2mo.unpack_eri_1(eris.OVvv, nvir_a)
t1_2_a += lib.einsum('kdac,ikcd->ia',eris_OVvv,t2_1_ab[:],optimize=True)
del eris_OVvv
if isinstance(eris.ovVV, type(None)):
chnk_size = uadc_ao2mo.calculate_chunk_size(myadc)
a = 0
for p in range(0,nocc_a,chnk_size):
eris_ovVV = dfadc.get_ovvv_spin_df(
myadc, eris.Lov, eris.LVV, p, chnk_size).reshape(-1,nvir_a,nvir_b,nvir_b)
k = eris_ovVV.shape[0]
t1_2_b += lib.einsum('kdac,kidc->ia',eris_ovVV,t2_1_ab[a:a+k],optimize=True)
del eris_ovVV
a += k
else :
eris_ovVV = radc_ao2mo.unpack_eri_1(eris.ovVV, nvir_b)
t1_2_b += lib.einsum('kdac,kidc->ia',eris_ovVV,t2_1_ab[:],optimize=True)
del eris_ovVV
t1_2_a -= lib.einsum('lcki,klac->ia',eris_OVoo,t2_1_ab[:],optimize=True)
t1_2_b -= lib.einsum('lcki,lkca->ia',eris_ovOO,t2_1_ab[:],optimize=True)
if isinstance(myadc._scf, scf.rohf.ROHF):
t1_2_b += lib.einsum('d,ld,ilad->ia',e_b[nocc_b:],t1_1_b,t2_1_b[:], optimize = True)
t1_2_b += lib.einsum('d,ld,lida->ia',e_a[nocc_a:],t1_1_a,t2_1_ab[:], optimize = True)
t1_2_b -= lib.einsum('l,ld,ilad->ia',e_b[:nocc_b],t1_1_b,t2_1_b[:], optimize = True)
t1_2_b -= lib.einsum('l,ld,lida->ia',e_a[:nocc_a],t1_1_a,t2_1_ab[:], optimize = True)
t1_2_b += 0.5*lib.einsum('a,ld,ilad->ia',e_b[nocc_b:],t1_1_b,t2_1_b[:], optimize = True)
t1_2_b += 0.5*lib.einsum('a,ld,lida->ia',
e_b[nocc_b:],t1_1_a,t2_1_ab[:], optimize = True)
t1_2_b -= 0.5*lib.einsum('i,ld,ilad->ia',e_b[:nocc_b],t1_1_b,t2_1_b[:], optimize = True)
t1_2_b -= 0.5*lib.einsum('i,ld,lida->ia',
e_b[:nocc_b],t1_1_a,t2_1_ab[:], optimize = True)
t1_2_b += lib.einsum('ld,ilad->ia',f_ov_b,t2_1_b[:], optimize = True)
t1_2_b += lib.einsum('ld,lida->ia',f_ov_a,t2_1_ab[:], optimize = True)
t1_2_b += lib.einsum('ld,iadl->ia',t1_1_b, eris.OVVO, optimize = True)
t1_2_b -= lib.einsum('ld,idal->ia',t1_1_b, eris.OVVO, optimize = True)
t1_2_b += lib.einsum('ld,ldai->ia',t1_1_a, eris.ovVO, optimize = True)
t1_2_b += lib.einsum('ld,iadl->ia',t1_1_b,eris.OVVO, optimize = True)
t1_2_b -= lib.einsum('ld,liad->ia',t1_1_b,eris.OOVV, optimize = True)
t1_2_b += lib.einsum('ld,ldai->ia',t1_1_a,eris.ovVO, optimize = True)
if isinstance(eris.OVVV, type(None)):
chnk_size = uadc_ao2mo.calculate_chunk_size(myadc)
a = 0
for p in range(0,nocc_b,chnk_size):
eris_OVVV = dfadc.get_ovvv_spin_df(
myadc, eris.LOV, eris.LVV, p, chnk_size).reshape(-1,nvir_b,nvir_b,nvir_b)
k = eris_OVVV.shape[0]
t1_2_b += 0.5*lib.einsum('kdac,ikcd->ia',eris_OVVV,t2_1_b[:,a:a+k],optimize=True)
t1_2_b -= 0.5*lib.einsum('kcad,ikcd->ia',eris_OVVV,t2_1_b[:,a:a+k],optimize=True)
del eris_OVVV
a += k
else :
eris_OVVV = radc_ao2mo.unpack_eri_1(eris.OVVV, nvir_b)
t1_2_b += 0.5*lib.einsum('kdac,ikcd->ia',eris_OVVV,t2_1_b[:],optimize=True)
t1_2_b -= 0.5*lib.einsum('kcad,ikcd->ia',eris_OVVV,t2_1_b[:],optimize=True)
del eris_OVVV
t1_2_b -= 0.5*lib.einsum('lcki,klac->ia',eris_OVOO,t2_1_b[:],optimize=True)
t1_2_b += 0.5*lib.einsum('kcli,klac->ia',eris_OVOO,t2_1_b[:],optimize=True)
t1_2_a = t1_2_a/D1_a
t1_2_b = t1_2_b/D1_b
cput0 = log.timer_debug1("Completed t1_2 amplitude calculation", *cput0)
t1_2 = (t1_2_a , t1_2_b)
t2_2 = (None,)
t1_3 = (None,)
t2_1_vvvv = (None,)
if (myadc.method == "adc(2)-x" and myadc.approx_trans_moments is False) or (myadc.method == "adc(3)"):
# Compute second-order doubles t2 (tijab)
eris_oooo = eris.oooo
eris_OOOO = eris.OOOO
eris_ooOO = eris.ooOO
eris_ovvo = eris.ovvo
eris_OVVO = eris.OVVO
eris_OVvo = eris.OVvo
eris_ovVO = eris.ovVO
if isinstance(eris.vvvv_p, np.ndarray):
eris_vvvv = eris.vvvv_p
temp = np.ascontiguousarray(
t2_1_a[:,:,ab_ind_a[0],ab_ind_a[1]]).reshape(nocc_a*nocc_a,-1)
temp = np.dot(temp,eris_vvvv.T).reshape(nocc_a, nocc_a, -1)
t2_1_vvvv_a = np.zeros((nocc_a,nocc_a,nvir_a,nvir_a))
t2_1_vvvv_a[:,:,ab_ind_a[0],ab_ind_a[1]] = temp
t2_1_vvvv_a[:,:,ab_ind_a[1],ab_ind_a[0]] = -temp
del eris_vvvv
elif isinstance(eris.vvvv_p, list):
t2_1_vvvv_a = contract_ladder_antisym(myadc,t2_1_a[:], eris.vvvv_p, pack = False)
else:
t2_1_vvvv_a = contract_ladder(myadc, t2_1_a[:], (eris.Lvv, eris.Lvv))
if not isinstance(eris.oooo, np.ndarray):
t2_1_vvvv_a = h5cache_t2.create_dataset('t2_1_vvvv_a', data=t2_1_vvvv_a)
t2_2_a = t2_1_vvvv_a[:].copy()
t2_2_a += 0.5*lib.einsum('kilj,klab->ijab', eris_oooo, t2_1_a[:],optimize=True)
t2_2_a -= 0.5*lib.einsum('kjli,klab->ijab', eris_oooo, t2_1_a[:],optimize=True)
temp = lib.einsum('kcbj,kica->ijab',eris_ovvo,t2_1_a[:],optimize=True)
temp -= lib.einsum('kjbc,kica->ijab',eris_oovv,t2_1_a[:],optimize=True)
temp_1 = lib.einsum('kcbj,ikac->ijab',eris_OVvo,t2_1_ab[:],optimize=True)
t2_2_a += temp - temp.transpose(1,0,2,3) - temp.transpose(0,1,3,2) + temp.transpose(1,0,3,2)
t2_2_a += temp_1 - temp_1.transpose(1,0,2,3) - \
temp_1.transpose(0,1,3,2) + temp_1.transpose(1,0,3,2)
del temp
del temp_1
if isinstance(myadc._scf, scf.rohf.ROHF):
t2_2_a += lib.einsum('la,ibjl->ijab',t1_1_a,eris.ovoo, optimize = True)
t2_2_a -= lib.einsum('la,jbil->ijab',t1_1_a,eris.ovoo, optimize = True)
t2_2_a -= lib.einsum('lb,iajl->ijab',t1_1_a,eris.ovoo, optimize = True)
t2_2_a += lib.einsum('lb,jail->ijab',t1_1_a,eris.ovoo, optimize = True)
if isinstance(eris.ovvv, type(None)):
chnk_size = uadc_ao2mo.calculate_chunk_size(myadc)
a = 0
for p in range(0,nocc_a,chnk_size):
eris_ovvv = dfadc.get_ovvv_spin_df(
myadc, eris.Lov, eris.Lvv, p, chnk_size).reshape(-1,nvir_a,nvir_a,nvir_a)
k = eris_ovvv.shape[0]
t2_2_a[:,a:a+k] += lib.einsum('id,jbad->ijab',t1_1_a,eris_ovvv, optimize = True)
t2_2_a[:,a:a+k] -= lib.einsum('id,jabd->ijab',t1_1_a,eris_ovvv, optimize = True)
t2_2_a[a:a+k] -= lib.einsum('jd,ibad->ijab',t1_1_a,eris_ovvv, optimize = True)
t2_2_a[a:a+k] += lib.einsum('jd,iabd->ijab',t1_1_a,eris_ovvv, optimize = True)
del eris_ovvv
a += k
else:
eris_ovvv = uadc_ao2mo.unpack_eri_1(eris.ovvv, nvir_a)
t2_2_a += lib.einsum('id,jbad->ijab',t1_1_a,eris_ovvv, optimize = True)
t2_2_a -= lib.einsum('id,jabd->ijab',t1_1_a,eris_ovvv, optimize = True)
t2_2_a -= lib.einsum('jd,ibad->ijab',t1_1_a,eris_ovvv, optimize = True)
t2_2_a += lib.einsum('jd,iabd->ijab',t1_1_a,eris_ovvv, optimize = True)
del eris_ovvv
if isinstance(eris.VVVV_p, np.ndarray):
eris_VVVV = eris.VVVV_p
temp = np.ascontiguousarray(
t2_1_b[:,:,ab_ind_b[0],ab_ind_b[1]]).reshape(nocc_b*nocc_b,-1)
temp = np.dot(temp,eris_VVVV.T).reshape(nocc_b, nocc_b, -1)
t2_1_vvvv_b = np.zeros((nocc_b,nocc_b,nvir_b,nvir_b))
t2_1_vvvv_b[:,:,ab_ind_b[0],ab_ind_b[1]] = temp
t2_1_vvvv_b[:,:,ab_ind_b[1],ab_ind_b[0]] = -temp
del eris_VVVV
elif isinstance(eris.VVVV_p, list) :
t2_1_vvvv_b = contract_ladder_antisym(myadc,t2_1_b[:],eris.VVVV_p, pack = False)
else:
t2_1_vvvv_b = contract_ladder(myadc, t2_1_b[:], (eris.LVV, eris.LVV))
if not isinstance(eris.oooo, np.ndarray):
t2_1_vvvv_b = h5cache_t2.create_dataset('t2_1_vvvv_b', data=t2_1_vvvv_b)
t2_2_b = t2_1_vvvv_b[:].copy()
t2_2_b += 0.5*lib.einsum('kilj,klab->ijab', eris_OOOO, t2_1_b[:],optimize=True)
t2_2_b -= 0.5*lib.einsum('kjli,klab->ijab', eris_OOOO, t2_1_b[:],optimize=True)
temp = lib.einsum('kcbj,kica->ijab',eris_OVVO,t2_1_b[:],optimize=True)
temp -= lib.einsum('kjbc,kica->ijab',eris_OOVV,t2_1_b[:],optimize=True)
temp_1 = lib.einsum('kcbj,kica->ijab',eris_ovVO,t2_1_ab[:],optimize=True)
t2_2_b += temp - temp.transpose(1,0,2,3) - temp.transpose(0,1,3,2) + temp.transpose(1,0,3,2)
t2_2_b += temp_1 - temp_1.transpose(1,0,2,3) - \
temp_1.transpose(0,1,3,2) + temp_1.transpose(1,0,3,2)
del temp
del temp_1
if isinstance(myadc._scf, scf.rohf.ROHF):
t2_2_b += lib.einsum('la,ibjl->ijab',t1_1_b,eris.OVOO, optimize = True)
t2_2_b -= lib.einsum('la,jbil->ijab',t1_1_b,eris.OVOO, optimize = True)
t2_2_b -= lib.einsum('lb,iajl->ijab',t1_1_b,eris.OVOO, optimize = True)
t2_2_b += lib.einsum('lb,jail->ijab',t1_1_b,eris.OVOO, optimize = True)
if isinstance(eris.OVVV, type(None)):
chnk_size = uadc_ao2mo.calculate_chunk_size(myadc)
a = 0
for p in range(0,nocc_b,chnk_size):
eris_OVVV = dfadc.get_ovvv_spin_df(
myadc, eris.LOV, eris.LVV, p, chnk_size).reshape(-1,nvir_b,nvir_b,nvir_b)
k = eris_OVVV.shape[0]
t2_2_b[:,a:a+k] += lib.einsum('id,jbad->ijab',t1_1_b,eris_OVVV, optimize = True)
t2_2_b[:,a:a+k] -= lib.einsum('id,jabd->ijab',t1_1_b,eris_OVVV, optimize = True)
t2_2_b[a:a+k] -= lib.einsum('jd,ibad->ijab',t1_1_b,eris_OVVV, optimize = True)
t2_2_b[a:a+k] += lib.einsum('jd,iabd->ijab',t1_1_b,eris_OVVV, optimize = True)
del eris_OVVV
a += k
else:
eris_OVVV = uadc_ao2mo.unpack_eri_1(eris.OVVV, nvir_b)
t2_2_b += lib.einsum('id,jbad->ijab',t1_1_b,eris_OVVV, optimize = True)
t2_2_b -= lib.einsum('id,jabd->ijab',t1_1_b,eris_OVVV, optimize = True)
t2_2_b -= lib.einsum('jd,ibad->ijab',t1_1_b,eris_OVVV, optimize = True)
t2_2_b += lib.einsum('jd,iabd->ijab',t1_1_b,eris_OVVV, optimize = True)
del eris_OVVV
if isinstance(eris.vVvV_p, np.ndarray):
temp = t2_1_ab.reshape(nocc_a*nocc_b,nvir_a*nvir_b)
eris_vVvV = eris.vVvV_p
t2_1_vvvv_ab = np.dot(temp,eris_vVvV.T).reshape(nocc_a,nocc_b,nvir_a,nvir_b)
elif isinstance(eris.vVvV_p, list):
t2_1_vvvv_ab = contract_ladder(myadc,t2_1_ab[:],eris.vVvV_p)
else:
t2_1_vvvv_ab = contract_ladder(myadc,t2_1_ab[:],(eris.Lvv,eris.LVV))
if not isinstance(eris.oooo, np.ndarray):
t2_1_vvvv_ab = h5cache_t2.create_dataset('t2_1_vvvv_ab', data=t2_1_vvvv_ab)
t2_2_ab = t2_1_vvvv_ab[:].copy()
t2_2_ab += lib.einsum('kilj,klab->ijab',eris_ooOO,t2_1_ab[:],optimize=True)
t2_2_ab += lib.einsum('kcbj,kica->ijab',eris_ovVO,t2_1_a[:],optimize=True)
t2_2_ab += lib.einsum('kcbj,ikac->ijab',eris_OVVO,t2_1_ab[:],optimize=True)
t2_2_ab -= lib.einsum('kjbc,ikac->ijab',eris_OOVV,t2_1_ab[:],optimize=True)
t2_2_ab -= lib.einsum('kibc,kjac->ijab',eris_ooVV,t2_1_ab[:],optimize=True)
t2_2_ab -= lib.einsum('kjac,ikcb->ijab',eris_OOvv,t2_1_ab[:],optimize=True)
t2_2_ab += lib.einsum('kcai,kjcb->ijab',eris_OVvo,t2_1_b[:],optimize=True)
t2_2_ab += lib.einsum('kcai,kjcb->ijab',eris_ovvo,t2_1_ab[:],optimize=True)
t2_2_ab -= lib.einsum('kiac,kjcb->ijab',eris_oovv,t2_1_ab[:],optimize=True)
if isinstance(myadc._scf, scf.rohf.ROHF):
t2_2_ab -= lib.einsum('la,jbil->ijab',t1_1_a,eris.OVoo, optimize = True)
t2_2_ab -= lib.einsum('lb,iajl->ijab',t1_1_b,eris.ovOO, optimize = True)
if isinstance(eris.OVvv, type(None)):
chnk_size = uadc_ao2mo.calculate_chunk_size(myadc)
a = 0
for p in range(0,nocc_b,chnk_size):
eris_OVvv = dfadc.get_ovvv_spin_df(
myadc, eris.LOV, eris.Lvv, p, chnk_size).reshape(-1,nvir_b,nvir_a,nvir_a)
k = eris_OVvv.shape[0]
t2_2_ab[:, a:a+k] += lib.einsum('id,jbad->ijab',
t1_1_a,eris_OVvv, optimize = True)
del eris_OVvv
a += k
else:
eris_OVvv = uadc_ao2mo.unpack_eri_1(eris.OVvv, nvir_a)
t2_2_ab += lib.einsum('id,jbad->ijab',t1_1_a,eris_OVvv, optimize = True)
del eris_OVvv
if isinstance(eris.ovVV, type(None)):
chnk_size = uadc_ao2mo.calculate_chunk_size(myadc)
a = 0
for p in range(0,nocc_a,chnk_size):
eris_ovVV = dfadc.get_ovvv_spin_df(
myadc, eris.Lov, eris.LVV, p, chnk_size).reshape(-1,nvir_a,nvir_b,nvir_b)
k = eris_ovVV.shape[0]
t2_2_ab[a:a+k] += lib.einsum('jd,iabd->ijab',t1_1_b,eris_ovVV, optimize = True)
del eris_ovVV
a += k
else:
eris_ovVV = uadc_ao2mo.unpack_eri_1(eris.ovVV, nvir_b)
t2_2_ab += lib.einsum('jd,iabd->ijab',t1_1_b,eris_ovVV, optimize = True)
del eris_ovVV
D2_a = d_ij_a.reshape(-1,1) - d_ab_a.reshape(-1)
D2_a = D2_a.reshape((nocc_a,nocc_a,nvir_a,nvir_a))
t2_2_a = t2_2_a/D2_a
if not isinstance(eris.oooo, np.ndarray):
t2_2_a = h5cache_t2.create_dataset('t2_2_a', data=t2_2_a)
del D2_a
D2_b = d_ij_b.reshape(-1,1) - d_ab_b.reshape(-1)
D2_b = D2_b.reshape((nocc_b,nocc_b,nvir_b,nvir_b))
t2_2_b = t2_2_b/D2_b
if not isinstance(eris.oooo, np.ndarray):
t2_2_b = h5cache_t2.create_dataset('t2_2_b', data=t2_2_b)
del D2_b
D2_ab = d_ij_ab.reshape(-1,1) - d_ab_ab.reshape(-1)
D2_ab = D2_ab.reshape((nocc_a,nocc_b,nvir_a,nvir_b))
t2_2_ab = t2_2_ab/D2_ab
if not isinstance(eris.oooo, np.ndarray):
t2_2_ab = h5cache_t2.create_dataset('t2_2_ab', data=t2_2_ab)
del D2_ab
cput0 = log.timer_debug1("Completed t2_2 amplitude calculation", *cput0)
if (myadc.method == "adc(3)" and myadc.approx_trans_moments is False):
# Compute third-order singles (tij)
eris_ovoo = eris.ovoo
eris_OVOO = eris.OVOO
eris_OVoo = eris.OVoo
eris_ovOO = eris.ovOO
t1_3 = (None,)
t1_3_a = lib.einsum('d,ilad,ld->ia',e_a[nocc_a:],t2_1_a[:],t1_2_a,optimize=True)
t1_3_a += lib.einsum('d,ilad,ld->ia',e_b[nocc_b:],t2_1_ab[:],t1_2_b,optimize=True)
t1_3_b = lib.einsum('d,ilad,ld->ia',e_b[nocc_b:],t2_1_b[:], t1_2_b,optimize=True)
t1_3_b += lib.einsum('d,lida,ld->ia',e_a[nocc_a:],t2_1_ab[:],t1_2_a,optimize=True)
t1_3_a -= lib.einsum('l,ilad,ld->ia',e_a[:nocc_a],t2_1_a[:], t1_2_a,optimize=True)
t1_3_a -= lib.einsum('l,ilad,ld->ia',e_b[:nocc_b],t2_1_ab[:],t1_2_b,optimize=True)
t1_3_b -= lib.einsum('l,ilad,ld->ia',e_b[:nocc_b],t2_1_b[:], t1_2_b,optimize=True)
t1_3_b -= lib.einsum('l,lida,ld->ia',e_a[:nocc_a],t2_1_ab[:],t1_2_a,optimize=True)
t1_3_a += 0.5*lib.einsum('a,ilad,ld->ia',e_a[nocc_a:],t2_1_a[:], t1_2_a,optimize=True)
t1_3_a += 0.5*lib.einsum('a,ilad,ld->ia',e_a[nocc_a:],t2_1_ab[:],t1_2_b,optimize=True)
t1_3_b += 0.5*lib.einsum('a,ilad,ld->ia',e_b[nocc_b:],t2_1_b[:], t1_2_b,optimize=True)
t1_3_b += 0.5*lib.einsum('a,lida,ld->ia',e_b[nocc_b:],t2_1_ab[:],t1_2_a,optimize=True)
t1_3_a -= 0.5*lib.einsum('i,ilad,ld->ia',e_a[:nocc_a],t2_1_a[:], t1_2_a,optimize=True)
t1_3_a -= 0.5*lib.einsum('i,ilad,ld->ia',e_a[:nocc_a],t2_1_ab[:],t1_2_b,optimize=True)
t1_3_b -= 0.5*lib.einsum('i,ilad,ld->ia',e_b[:nocc_b],t2_1_b[:], t1_2_b,optimize=True)
t1_3_b -= 0.5*lib.einsum('i,lida,ld->ia',e_b[:nocc_b],t2_1_ab[:],t1_2_a,optimize=True)
t1_3_a += lib.einsum('ld,iadl->ia',t1_2_a,eris_ovvo,optimize=True)
t1_3_a -= lib.einsum('ld,ladi->ia',t1_2_a,eris_ovvo,optimize=True)
t1_3_a += lib.einsum('ld,iadl->ia',t1_2_b,eris_ovVO,optimize=True)
t1_3_b += lib.einsum('ld,iadl->ia',t1_2_b,eris_OVVO ,optimize=True)
t1_3_b -= lib.einsum('ld,ladi->ia',t1_2_b,eris_OVVO ,optimize=True)
t1_3_b += lib.einsum('ld,ldai->ia',t1_2_a,eris_ovVO,optimize=True)
t1_3_a += lib.einsum('ld,ldai->ia',t1_2_a,eris_ovvo ,optimize=True)
t1_3_a -= lib.einsum('ld,liad->ia',t1_2_a,eris_oovv ,optimize=True)
t1_3_a += lib.einsum('ld,ldai->ia',t1_2_b,eris_OVvo,optimize=True)
t1_3_b += lib.einsum('ld,ldai->ia',t1_2_b,eris_OVVO ,optimize=True)
t1_3_b -= lib.einsum('ld,liad->ia',t1_2_b,eris_OOVV ,optimize=True)
t1_3_b += lib.einsum('ld,ldai->ia',t1_2_a,eris_ovVO,optimize=True)
t1_3_a -= 0.5*lib.einsum('lmad,mdli->ia',t2_2_a,eris_ovoo,optimize=True)
t1_3_a += 0.5*lib.einsum('lmad,ldmi->ia',t2_2_a,eris_ovoo,optimize=True)
t1_3_a -= lib.einsum('lmad,mdli->ia',t2_2_ab,eris_OVoo,optimize=True)
t1_3_b -= 0.5*lib.einsum('lmad,mdli->ia',t2_2_b,eris_OVOO,optimize=True)
t1_3_b += 0.5*lib.einsum('lmad,ldmi->ia',t2_2_b,eris_OVOO,optimize=True)
t1_3_b -= lib.einsum('mlda,mdli->ia',t2_2_ab,eris_ovOO,optimize=True)
if isinstance(eris.ovvv, type(None)):
chnk_size = uadc_ao2mo.calculate_chunk_size(myadc)
a = 0
for p in range(0,nocc_a,chnk_size):
eris_ovvv = dfadc.get_ovvv_spin_df(
myadc, eris.Lov, eris.Lvv, p, chnk_size).reshape(-1,nvir_a,nvir_a,nvir_a)
k = eris_ovvv.shape[0]
t1_3_a += 0.5*lib.einsum('ilde,lead->ia',t2_2_a[:,a:a+k],eris_ovvv,optimize=True)
t1_3_a -= 0.5*lib.einsum('ilde,ldae->ia',t2_2_a[:,a:a+k],eris_ovvv,optimize=True)
t1_3_a -= lib.einsum('ildf,mefa,lmde->ia',
t2_1_a[:], eris_ovvv, t2_1_a[:,a:a+k] ,optimize=True)
t1_3_a += lib.einsum('ildf,mafe,lmde->ia',
t2_1_a[:], eris_ovvv, t2_1_a[:,a:a+k] ,optimize=True)
t1_3_a += lib.einsum('ilfd,mefa,mled->ia',
t2_1_ab[:],eris_ovvv, t2_1_ab[a:a+k],optimize=True)
t1_3_a -= lib.einsum('ilfd,mafe,mled->ia',
t2_1_ab[:],eris_ovvv, t2_1_ab[a:a+k],optimize=True)
t1_3_a += 0.5*lib.einsum('ilaf,mefd,lmde->ia',
t2_1_a[:],eris_ovvv,t2_1_a[:,a:a+k],optimize=True)
t1_3_a -= 0.5*lib.einsum('ilaf,mdfe,lmde->ia',
t2_1_a[:],eris_ovvv,t2_1_a[:,a:a+k],optimize=True)
t1_3_b += 0.5*lib.einsum('lifa,mefd,lmde->ia',
t2_1_ab[:],eris_ovvv,t2_1_a[:,a:a+k],optimize=True)
t1_3_b -= 0.5*lib.einsum('lifa,mdfe,lmde->ia',
t2_1_ab[:],eris_ovvv,t2_1_a[:,a:a+k],optimize=True)
t1_3_a[a:a+k] += 0.5*lib.einsum('lmdf,iaef,lmde->ia',
t2_1_a[:],eris_ovvv,t2_1_a[:],optimize=True)
t1_3_a[a:a+k] -= 0.5*lib.einsum('lmdf,ifea,lmde->ia',
t2_1_a[:],eris_ovvv,t2_1_a[:],optimize=True)
t1_3_a[a:a+k] += lib.einsum('mlfd,iaef,mled->ia',t2_1_ab[:],
eris_ovvv,t2_1_ab[:],optimize=True)
t1_3_a[a:a+k] -= lib.einsum('mlfd,ifea,mled->ia',t2_1_ab[:],
eris_ovvv,t2_1_ab[:],optimize=True)
t1_3_a[a:a+k] -= 0.25*lib.einsum('lmef,iedf,lmad->ia',
t2_1_a[:],eris_ovvv,t2_1_a[:],optimize=True)
t1_3_a[a:a+k] += 0.25*lib.einsum('lmef,ifde,lmad->ia',
t2_1_a[:],eris_ovvv,t2_1_a[:],optimize=True)
del eris_ovvv
a += k
else :
eris_ovvv = radc_ao2mo.unpack_eri_1(eris.ovvv, nvir_a)
t1_3_a += 0.5*lib.einsum('ilde,lead->ia',t2_2_a[:],eris_ovvv,optimize=True)
t1_3_a -= 0.5*lib.einsum('ilde,ldae->ia',t2_2_a[:],eris_ovvv,optimize=True)
t1_3_a -= lib.einsum('ildf,mefa,lmde->ia',
t2_1_a[:], eris_ovvv, t2_1_a[:] ,optimize=True)
t1_3_a += lib.einsum('ildf,mafe,lmde->ia',
t2_1_a[:], eris_ovvv, t2_1_a[:] ,optimize=True)
t1_3_a += lib.einsum('ilfd,mefa,mled->ia',
t2_1_ab[:],eris_ovvv, t2_1_ab[:],optimize=True)
t1_3_a -= lib.einsum('ilfd,mafe,mled->ia',
t2_1_ab[:],eris_ovvv, t2_1_ab[:],optimize=True)
t1_3_a += 0.5*lib.einsum('ilaf,mefd,lmde->ia',
t2_1_a[:],eris_ovvv,t2_1_a[:],optimize=True)
t1_3_a -= 0.5*lib.einsum('ilaf,mdfe,lmde->ia',
t2_1_a[:],eris_ovvv,t2_1_a[:],optimize=True)
t1_3_b += 0.5*lib.einsum('lifa,mefd,lmde->ia',
t2_1_ab[:],eris_ovvv,t2_1_a[:],optimize=True)
t1_3_b -= 0.5*lib.einsum('lifa,mdfe,lmde->ia',
t2_1_ab[:],eris_ovvv,t2_1_a[:],optimize=True)
t1_3_a += 0.5*lib.einsum('lmdf,iaef,lmde->ia',
t2_1_a[:],eris_ovvv,t2_1_a[:],optimize=True)
t1_3_a -= 0.5*lib.einsum('lmdf,ifea,lmde->ia',
t2_1_a[:],eris_ovvv,t2_1_a[:],optimize=True)
t1_3_a += lib.einsum('mlfd,iaef,mled->ia',t2_1_ab[:],eris_ovvv,t2_1_ab[:],optimize=True)
t1_3_a -= lib.einsum('mlfd,ifea,mled->ia',t2_1_ab[:],eris_ovvv,t2_1_ab[:],optimize=True)
t1_3_a -= 0.25*lib.einsum('lmef,iedf,lmad->ia',
t2_1_a[:],eris_ovvv,t2_1_a[:],optimize=True)
t1_3_a += 0.25*lib.einsum('lmef,ifde,lmad->ia',
t2_1_a[:],eris_ovvv,t2_1_a[:],optimize=True)
del eris_ovvv
if isinstance(eris.OVVV, type(None)):
chnk_size = uadc_ao2mo.calculate_chunk_size(myadc)
a = 0
for p in range(0,nocc_b,chnk_size):
eris_OVVV = dfadc.get_ovvv_spin_df(
myadc, eris.LOV, eris.LVV, p, chnk_size).reshape(-1,nvir_b,nvir_b,nvir_b)
k = eris_OVVV.shape[0]
t1_3_b += 0.5*lib.einsum('ilde,lead->ia',t2_2_b[:,a:a+k],eris_OVVV,optimize=True)
t1_3_b -= 0.5*lib.einsum('ilde,ldae->ia',t2_2_b[:,a:a+k],eris_OVVV,optimize=True)
t1_3_b -= lib.einsum('ildf,mefa,lmde->ia',
t2_1_b[:],eris_OVVV,t2_1_b[:,a:a+k],optimize=True)
t1_3_b += lib.einsum('ildf,mafe,lmde->ia',
t2_1_b[:],eris_OVVV,t2_1_b[:,a:a+k],optimize=True)
t1_3_b += lib.einsum('lidf,mefa,lmde->ia',
t2_1_ab[:],eris_OVVV,t2_1_ab[:,a:a+k],optimize=True)
t1_3_b -= lib.einsum('lidf,mafe,lmde->ia',
t2_1_ab[:],eris_OVVV,t2_1_ab[:,a:a+k],optimize=True)
t1_3_a += 0.5*lib.einsum('ilaf,mefd,lmde->ia',
t2_1_ab[:],eris_OVVV,t2_1_b[:,a:a+k],optimize=True)
t1_3_a -= 0.5*lib.einsum('ilaf,mdfe,lmde->ia',
t2_1_ab[:],eris_OVVV,t2_1_b[:,a:a+k],optimize=True)
t1_3_b += 0.5*lib.einsum('ilaf,mefd,lmde->ia',
t2_1_b[:],eris_OVVV,t2_1_b[:,a:a+k],optimize=True)
t1_3_b -= 0.5*lib.einsum('ilaf,mdfe,lmde->ia',
t2_1_b[:],eris_OVVV,t2_1_b[:,a:a+k],optimize=True)
t1_3_b[a:a+k] += 0.5*lib.einsum('lmdf,iaef,lmde->ia',
t2_1_b[:],eris_OVVV,t2_1_b[:],optimize=True)
t1_3_b[a:a+k] -= 0.5*lib.einsum('lmdf,ifea,lmde->ia',
t2_1_b[:],eris_OVVV,t2_1_b[:],optimize=True)
t1_3_b[a:a+k] += lib.einsum('lmdf,iaef,lmde->ia',t2_1_ab[:],
eris_OVVV,t2_1_ab[:],optimize=True)
t1_3_b[a:a+k] -= lib.einsum('lmdf,ifea,lmde->ia',t2_1_ab[:],
eris_OVVV,t2_1_ab[:],optimize=True)
t1_3_b[a:a+k] -= 0.25*lib.einsum('lmef,iedf,lmad->ia',
t2_1_b[:],eris_OVVV,t2_1_b[:],optimize=True)
t1_3_b[a:a+k] += 0.25*lib.einsum('lmef,ifde,lmad->ia',
t2_1_b[:],eris_OVVV,t2_1_b[:],optimize=True)
del eris_OVVV
a += k
else :
eris_OVVV = radc_ao2mo.unpack_eri_1(eris.OVVV, nvir_b)
t1_3_b += 0.5*lib.einsum('ilde,lead->ia',t2_2_b[:],eris_OVVV,optimize=True)
t1_3_b -= 0.5*lib.einsum('ilde,ldae->ia',t2_2_b[:],eris_OVVV,optimize=True)
t1_3_b -= lib.einsum('ildf,mefa,lmde->ia',t2_1_b[:],eris_OVVV,t2_1_b[:],optimize=True)
t1_3_b += lib.einsum('ildf,mafe,lmde->ia',t2_1_b[:],eris_OVVV,t2_1_b[:],optimize=True)
t1_3_b += lib.einsum('lidf,mefa,lmde->ia',t2_1_ab[:],eris_OVVV,t2_1_ab[:],optimize=True)
t1_3_b -= lib.einsum('lidf,mafe,lmde->ia',t2_1_ab[:],eris_OVVV,t2_1_ab[:],optimize=True)
t1_3_a += 0.5*lib.einsum('ilaf,mefd,lmde->ia',
t2_1_ab[:],eris_OVVV,t2_1_b[:],optimize=True)
t1_3_a -= 0.5*lib.einsum('ilaf,mdfe,lmde->ia',
t2_1_ab[:],eris_OVVV,t2_1_b[:],optimize=True)
t1_3_b += 0.5*lib.einsum('ilaf,mefd,lmde->ia',
t2_1_b[:],eris_OVVV,t2_1_b[:],optimize=True)
t1_3_b -= 0.5*lib.einsum('ilaf,mdfe,lmde->ia',
t2_1_b[:],eris_OVVV,t2_1_b[:],optimize=True)
t1_3_b += 0.5*lib.einsum('lmdf,iaef,lmde->ia',
t2_1_b[:],eris_OVVV,t2_1_b[:],optimize=True)
t1_3_b -= 0.5*lib.einsum('lmdf,ifea,lmde->ia',
t2_1_b[:],eris_OVVV,t2_1_b[:],optimize=True)
t1_3_b += lib.einsum('lmdf,iaef,lmde->ia',t2_1_ab[:],eris_OVVV,t2_1_ab[:],optimize=True)
t1_3_b -= lib.einsum('lmdf,ifea,lmde->ia',t2_1_ab[:],eris_OVVV,t2_1_ab[:],optimize=True)
t1_3_b -= 0.25*lib.einsum('lmef,iedf,lmad->ia',
t2_1_b[:],eris_OVVV,t2_1_b[:],optimize=True)
t1_3_b += 0.25*lib.einsum('lmef,ifde,lmad->ia',
t2_1_b[:],eris_OVVV,t2_1_b[:],optimize=True)
del eris_OVVV
if isinstance(eris.ovVV, type(None)):
chnk_size = uadc_ao2mo.calculate_chunk_size(myadc)
a = 0
for p in range(0,nocc_a,chnk_size):
eris_ovVV = dfadc.get_ovvv_spin_df(
myadc, eris.Lov, eris.LVV, p, chnk_size).reshape(-1,nvir_a,nvir_b,nvir_b)
k = eris_ovVV.shape[0]
t1_3_b += lib.einsum('lied,lead->ia',t2_2_ab[a:a+k],eris_ovVV,optimize=True)
t1_3_a -= lib.einsum('ildf,mafe,mlde->ia',
t2_1_ab[:],eris_ovVV,t2_1_ab[a:a+k],optimize=True)
t1_3_b -= lib.einsum('ildf,mefa,mled->ia',
t2_1_b[:],eris_ovVV,t2_1_ab[a:a+k],optimize=True)
t1_3_b += lib.einsum('lidf,mefa,lmde->ia',
t2_1_ab[:],eris_ovVV,t2_1_a[:,a:a+k],optimize=True)
t1_3_a += lib.einsum('ilaf,mefd,mled->ia',
t2_1_ab[:],eris_ovVV,t2_1_ab[a:a+k],optimize=True)
t1_3_b += lib.einsum('ilaf,mefd,mled->ia',
t2_1_b[:],eris_ovVV,t2_1_ab[a:a+k],optimize=True)
t1_3_a[a:a+k] += 0.5*lib.einsum('lmdf,iaef,lmde->ia',
t2_1_b[:],eris_ovVV,t2_1_b[:],optimize=True)
t1_3_a[a:a+k] += lib.einsum('lmdf,iaef,lmde->ia',t2_1_ab[:],
eris_ovVV,t2_1_ab[:],optimize=True)
t1_3_a[a:a+k] -= lib.einsum('lmef,iedf,lmad->ia',t2_1_ab[:],
eris_ovVV,t2_1_ab[:],optimize=True)
del eris_ovVV
a += k
else :
eris_ovVV = radc_ao2mo.unpack_eri_1(eris.ovVV, nvir_b)
t1_3_b += lib.einsum('lied,lead->ia',t2_2_ab[:],eris_ovVV,optimize=True)
t1_3_a -= lib.einsum('ildf,mafe,mlde->ia',t2_1_ab[:],eris_ovVV,t2_1_ab[:],optimize=True)
t1_3_b -= lib.einsum('ildf,mefa,mled->ia',t2_1_b[:],eris_ovVV,t2_1_ab[:],optimize=True)
t1_3_b += lib.einsum('lidf,mefa,lmde->ia',t2_1_ab[:],eris_ovVV,t2_1_a[:],optimize=True)
t1_3_a += lib.einsum('ilaf,mefd,mled->ia',t2_1_ab[:],eris_ovVV,t2_1_ab[:],optimize=True)
t1_3_b += lib.einsum('ilaf,mefd,mled->ia',t2_1_b[:],eris_ovVV,t2_1_ab[:],optimize=True)
t1_3_a += 0.5*lib.einsum('lmdf,iaef,lmde->ia',
t2_1_b[:],eris_ovVV,t2_1_b[:],optimize=True)
t1_3_a += lib.einsum('lmdf,iaef,lmde->ia',t2_1_ab[:],eris_ovVV,t2_1_ab[:],optimize=True)
t1_3_a -= lib.einsum('lmef,iedf,lmad->ia',t2_1_ab[:],eris_ovVV,t2_1_ab[:],optimize=True)
del eris_ovVV
if isinstance(eris.OVvv, type(None)):
chnk_size = uadc_ao2mo.calculate_chunk_size(myadc)
a = 0
for p in range(0,nocc_b,chnk_size):
eris_OVvv = dfadc.get_ovvv_spin_df(
myadc, eris.LOV, eris.Lvv, p, chnk_size).reshape(-1,nvir_b,nvir_a,nvir_a)
k = eris_OVvv.shape[0]
t1_3_a += lib.einsum('ilde,lead->ia',t2_2_ab[:,a:a+k],eris_OVvv,optimize=True)
t1_3_a -= lib.einsum('ildf,mefa,lmde->ia',
t2_1_a[:],eris_OVvv, t2_1_ab[:,a:a+k],optimize=True)
t1_3_a += lib.einsum('ilfd,mefa,lmde->ia',
t2_1_ab[:],eris_OVvv,t2_1_b[:,a:a+k] ,optimize=True)
t1_3_b -= lib.einsum('lifd,mafe,lmed->ia',
t2_1_ab[:],eris_OVvv,t2_1_ab[:,a:a+k],optimize=True)
t1_3_a += lib.einsum('ilaf,mefd,lmde->ia',
t2_1_a[:],eris_OVvv,t2_1_ab[:,a:a+k],optimize=True)
t1_3_b += lib.einsum('lifa,mefd,lmde->ia',
t2_1_ab[:],eris_OVvv,t2_1_ab[:,a:a+k],optimize=True)
t1_3_b[a:a+k] += 0.5*lib.einsum('lmdf,iaef,lmde->ia',
t2_1_a[:],eris_OVvv,t2_1_a[:],optimize=True)
t1_3_b[a:a+k] += lib.einsum('mlfd,iaef,mled->ia',t2_1_ab[:],
eris_OVvv,t2_1_ab[:],optimize=True)
t1_3_b[a:a+k] -= lib.einsum('mlfe,iedf,mlda->ia',t2_1_ab[:],
eris_OVvv,t2_1_ab[:],optimize=True)
del eris_OVvv
a += k
else :
eris_OVvv = radc_ao2mo.unpack_eri_1(eris.OVvv, nvir_a)
t1_3_a += lib.einsum('ilde,lead->ia',t2_2_ab[:],eris_OVvv,optimize=True)
t1_3_a -= lib.einsum('ildf,mefa,lmde->ia',t2_1_a[:], eris_OVvv,t2_1_ab[:],optimize=True)
t1_3_a += lib.einsum('ilfd,mefa,lmde->ia',t2_1_ab[:],eris_OVvv,t2_1_b[:] ,optimize=True)
t1_3_b -= lib.einsum('lifd,mafe,lmed->ia',t2_1_ab[:],eris_OVvv,t2_1_ab[:],optimize=True)
t1_3_a += lib.einsum('ilaf,mefd,lmde->ia',t2_1_a[:],eris_OVvv,t2_1_ab[:],optimize=True)
t1_3_b += lib.einsum('lifa,mefd,lmde->ia',t2_1_ab[:],eris_OVvv,t2_1_ab[:],optimize=True)
t1_3_b += 0.5*lib.einsum('lmdf,iaef,lmde->ia',
t2_1_a[:],eris_OVvv,t2_1_a[:],optimize=True)
t1_3_b += lib.einsum('mlfd,iaef,mled->ia',t2_1_ab[:],eris_OVvv,t2_1_ab[:],optimize=True)
t1_3_b -= lib.einsum('mlfe,iedf,mlda->ia',t2_1_ab[:],eris_OVvv,t2_1_ab[:],optimize=True)
del eris_OVvv
t1_3_a += 0.25*lib.einsum('inde,lamn,lmde->ia',t2_1_a[:],eris_ovoo,t2_1_a[:],optimize=True)
t1_3_a -= 0.25*lib.einsum('inde,maln,lmde->ia',t2_1_a[:],eris_ovoo,t2_1_a[:],optimize=True)
t1_3_a += lib.einsum('inde,lamn,lmde->ia',t2_1_ab[:],eris_ovOO,t2_1_ab[:],optimize=True)
t1_3_b += 0.25*lib.einsum('inde,lamn,lmde->ia',t2_1_b[:],eris_OVOO,t2_1_b[:],optimize=True)
t1_3_b -= 0.25*lib.einsum('inde,maln,lmde->ia',t2_1_b[:],eris_OVOO,t2_1_b[:],optimize=True)
t1_3_b += lib.einsum('nied,lamn,mled->ia',t2_1_ab[:],eris_OVoo,t2_1_ab[:],optimize=True)
t1_3_a += 0.5*lib.einsum('inad,lemn,lmde->ia',t2_1_a[:],eris_ovoo,t2_1_a[:],optimize=True)
t1_3_a -= 0.5*lib.einsum('inad,meln,lmde->ia',t2_1_a[:],eris_ovoo,t2_1_a[:],optimize=True)
t1_3_a -= 0.5 * lib.einsum('inad,lemn,mlde->ia',
t2_1_a[:],eris_OVoo,t2_1_ab[:],optimize=True)
t1_3_a -= 0.5 * lib.einsum('inad,meln,lmde->ia',
t2_1_a[:],eris_OVoo,t2_1_ab[:],optimize=True)
t1_3_a -= 0.5 *lib.einsum('inad,lemn,lmed->ia',
t2_1_ab[:],eris_ovOO,t2_1_ab[:],optimize=True)
t1_3_a -= 0.5*lib.einsum('inad,meln,mled->ia',t2_1_ab[:],eris_ovOO,t2_1_ab[:],optimize=True)
t1_3_a += 0.5*lib.einsum('inad,lemn,lmde->ia',t2_1_ab[:],eris_OVOO,t2_1_b[:],optimize=True)
t1_3_a -= 0.5*lib.einsum('inad,meln,lmde->ia',t2_1_ab[:],eris_OVOO,t2_1_b[:],optimize=True)
t1_3_b += 0.5*lib.einsum('inad,lemn,lmde->ia',t2_1_b[:],eris_OVOO,t2_1_b[:],optimize=True)
t1_3_b -= 0.5*lib.einsum('inad,meln,lmde->ia',t2_1_b[:],eris_OVOO,t2_1_b[:],optimize=True)
t1_3_b -= 0.5 * lib.einsum('inad,meln,mled->ia',
t2_1_b[:],eris_ovOO,t2_1_ab[:],optimize=True)
t1_3_b -= 0.5 * lib.einsum('inad,lemn,lmed->ia',
t2_1_b[:],eris_ovOO,t2_1_ab[:],optimize=True)
t1_3_b -= 0.5 *lib.einsum('nida,meln,lmde->ia',
t2_1_ab[:],eris_OVoo,t2_1_ab[:],optimize=True)
t1_3_b -= 0.5*lib.einsum('nida,lemn,mlde->ia',t2_1_ab[:],eris_OVoo,t2_1_ab[:],optimize=True)
t1_3_b += 0.5*lib.einsum('nida,lemn,lmde->ia',t2_1_ab[:],eris_ovoo,t2_1_a[:],optimize=True)
t1_3_b -= 0.5*lib.einsum('nida,meln,lmde->ia',t2_1_ab[:],eris_ovoo,t2_1_a[:],optimize=True)
t1_3_a -= 0.5*lib.einsum('lnde,ianm,lmde->ia',t2_1_a[:],eris_ovoo,t2_1_a[:],optimize=True)
t1_3_a += 0.5*lib.einsum('lnde,naim,lmde->ia',t2_1_a[:],eris_ovoo,t2_1_a[:],optimize=True)
t1_3_a -= lib.einsum('nled,ianm,mled->ia',t2_1_ab[:],eris_ovoo,t2_1_ab[:],optimize=True)
t1_3_a += lib.einsum('nled,naim,mled->ia',t2_1_ab[:],eris_ovoo,t2_1_ab[:],optimize=True)
t1_3_a -= 0.5*lib.einsum('lnde,ianm,lmde->ia',t2_1_b[:],eris_ovOO,t2_1_b[:],optimize=True)
t1_3_a -= lib.einsum('lnde,ianm,lmde->ia',t2_1_ab[:],eris_ovOO,t2_1_ab[:],optimize=True)
t1_3_b -= 0.5*lib.einsum('lnde,ianm,lmde->ia',t2_1_b[:],eris_OVOO,t2_1_b[:],optimize=True)
t1_3_b += 0.5*lib.einsum('lnde,naim,lmde->ia',t2_1_b[:],eris_OVOO,t2_1_b[:],optimize=True)
t1_3_b -= lib.einsum('lnde,ianm,lmde->ia',t2_1_ab[:],eris_OVOO,t2_1_ab[:],optimize=True)
t1_3_b += lib.einsum('lnde,naim,lmde->ia',t2_1_ab[:],eris_OVOO,t2_1_ab[:],optimize=True)
t1_3_b -= 0.5*lib.einsum('lnde,ianm,lmde->ia',t2_1_a[:],eris_OVoo,t2_1_a[:],optimize=True)
t1_3_b -= lib.einsum('nled,ianm,mled->ia',t2_1_ab[:],eris_OVoo,t2_1_ab[:],optimize=True)
t1_3_a -= lib.einsum('lnde,ienm,lmad->ia',t2_1_a[:],eris_ovoo,t2_1_a[:],optimize=True)
t1_3_a += lib.einsum('lnde,neim,lmad->ia',t2_1_a[:],eris_ovoo,t2_1_a[:],optimize=True)
t1_3_a += lib.einsum('lnde,neim,lmad->ia',t2_1_ab[:],eris_OVoo,t2_1_a[:],optimize=True)
t1_3_a += lib.einsum('nled,ienm,mlad->ia',t2_1_ab[:],eris_ovoo,t2_1_ab[:],optimize=True)
t1_3_a -= lib.einsum('nled,neim,mlad->ia',t2_1_ab[:],eris_ovoo,t2_1_ab[:],optimize=True)
t1_3_a += lib.einsum('lned,ienm,lmad->ia',t2_1_ab[:],eris_ovOO,t2_1_ab[:],optimize=True)
t1_3_a -= lib.einsum('lnde,neim,mlad->ia',t2_1_b[:],eris_OVoo,t2_1_ab[:],optimize=True)
t1_3_b -= lib.einsum('lnde,ienm,lmad->ia',t2_1_b[:],eris_OVOO,t2_1_b[:],optimize=True)
t1_3_b += lib.einsum('lnde,neim,lmad->ia',t2_1_b[:],eris_OVOO,t2_1_b[:],optimize=True)
t1_3_b += lib.einsum('nled,neim,lmad->ia',t2_1_ab[:],eris_ovOO,t2_1_b[:],optimize=True)
t1_3_b += lib.einsum('lnde,ienm,lmda->ia',t2_1_ab[:],eris_OVOO,t2_1_ab[:],optimize=True)
t1_3_b -= lib.einsum('lnde,neim,lmda->ia',t2_1_ab[:],eris_OVOO,t2_1_ab[:],optimize=True)
t1_3_b += lib.einsum('nlde,ienm,mlda->ia',t2_1_ab[:],eris_OVoo,t2_1_ab[:],optimize=True)
t1_3_b -= lib.einsum('lnde,neim,lmda->ia',t2_1_a[:],eris_ovOO,t2_1_ab[:],optimize=True)
t1_3_a = t1_3_a/D1_a
t1_3_b = t1_3_b/D1_b
t1_3 = (t1_3_a, t1_3_b)
del D1_a, D1_b
t2_1 = (t2_1_a , t2_1_ab, t2_1_b)
if (myadc.method == "adc(2)-x" and myadc.approx_trans_moments is False) or (myadc.method == "adc(3)"):
t2_2 = (t2_2_a , t2_2_ab, t2_2_b)
t2_1_vvvv = (t2_1_vvvv_a, t2_1_vvvv_ab, t2_1_vvvv_b)
t1 = (t1_2, t1_3, t1_1)
t2 = (t2_1, t2_2)
cput0 = log.timer_debug1("Completed amplitude calculation", *cput0)
return t1, t2, t2_1_vvvv
[docs]
def compute_energy(myadc, t1, t2, eris):
cput0 = (logger.process_clock(), logger.perf_counter())
log = logger.Logger(myadc.stdout, myadc.verbose)
if myadc.method not in ("adc(2)", "adc(2)-x", "adc(3)"):
raise NotImplementedError(myadc.method)
eris_ovvo = eris.ovvo
eris_OVVO = eris.OVVO
eris_ovVO = eris.ovVO
#Compute MPn correlation energy
t2_a = t2[0][0][:].copy()
if (myadc.method == "adc(3)"):
t2_a += t2[1][0][:]
e_mp = 0.25 * lib.einsum('ijab,iabj', t2_a, eris_ovvo)
e_mp -= 0.25 * lib.einsum('ijab,ibaj', t2_a, eris_ovvo)
del t2_a
t2_ab = t2[0][1][:].copy()
if (myadc.method == "adc(3)"):
t2_ab += t2[1][1][:]
e_mp += lib.einsum('ijab,iabj', t2_ab, eris_ovVO)
del t2_ab
t2_b = t2[0][2][:].copy()
if (myadc.method == "adc(3)"):
t2_b += t2[1][2][:]
e_mp += 0.25 * lib.einsum('ijab,iabj', t2_b, eris_OVVO)
e_mp -= 0.25 * lib.einsum('ijab,ibaj', t2_b, eris_OVVO)
del t2_b
logger.info(myadc, "Reference correlation energy (doubles): %.8f", e_mp)
if isinstance(myadc._scf, scf.rohf.ROHF):
f_ov_a = myadc.f_ov[0]
f_ov_b = myadc.f_ov[1]
t1_1_a = t1[2][0].copy()
t1_1_b = t1[2][1].copy()
if (myadc.method == "adc(3)"):
t1_1_a += t1[0][0]
t1_1_b += t1[0][1]
singles = lib.einsum('ia,ia', f_ov_a, t1_1_a)
singles += lib.einsum('ia,ia', f_ov_b, t1_1_b)
e_mp += singles
logger.info(myadc, "Reference correlation energy (singles): %.8f", singles)
cput0 = log.timer_debug1("Completed energy calculation", *cput0)
return e_mp
[docs]
def contract_ladder(myadc,t_amp,vvvv_p, prefactor = 1.0, pack = False):
nocc_a = t_amp.shape[0]
nocc_b = t_amp.shape[1]
nvir_a = t_amp.shape[2]
nvir_b = t_amp.shape[3]
tril_idx = np.tril_indices(nvir_a, k=-1)
t_amp_t = np.ascontiguousarray(t_amp.reshape(nocc_a*nocc_b,-1).T)
t = np.zeros((nvir_a,nvir_b, nocc_a*nocc_b))
chnk_size = uadc_ao2mo.calculate_chunk_size(myadc)
a = 0
if isinstance(vvvv_p, list):
for dataset in vvvv_p:
k = dataset.shape[0]
dataset = dataset[:].reshape(-1,nvir_a * nvir_b)
t[a:a+k] = np.dot(dataset,t_amp_t).reshape(-1,nvir_b,nocc_a*nocc_b)
a += k
elif getattr(myadc, 'with_df', None):
for p in range(0,nvir_a,chnk_size):
Lvv = vvvv_p[0]
LVV = vvvv_p[1]
vvvv = dfadc.get_vVvV_df(myadc, Lvv, LVV, p, chnk_size)
k = vvvv.shape[0]
vvvv = vvvv.reshape(-1,nvir_a*nvir_b)
t[a:a+k] = np.dot(vvvv,t_amp_t).reshape(-1,nvir_b,nocc_a*nocc_b)
del vvvv
a += k
else:
raise Exception("Unknown vvvv type")
t = prefactor * np.ascontiguousarray(t.transpose(2,0,1)).reshape(nocc_a, nocc_b, nvir_a, nvir_b)
if pack:
t = t[:, :, tril_idx[0], tril_idx[1]]
return t
[docs]
def contract_ladder_antisym(myadc,t_amp,vvvv_d, pack = True):
nocc = t_amp.shape[0]
nvir = t_amp.shape[2]
nv_pair = nvir * (nvir - 1) // 2
tril_idx = np.tril_indices(nvir, k=-1)
t_amp = t_amp[:,:,tril_idx[0],tril_idx[1]]
t_amp_t = np.ascontiguousarray(t_amp.reshape(nocc*nocc,-1).T)
t = np.zeros((nvir,nvir, nocc*nocc))
chnk_size = uadc_ao2mo.calculate_chunk_size(myadc)
a = 0
if isinstance(vvvv_d, list):
for dataset in vvvv_d:
k = dataset.shape[0]
dataset = dataset[:].reshape(-1,nv_pair)
t[a:a+k] = np.dot(dataset,t_amp_t).reshape(-1,nvir,nocc*nocc)
a += k
elif getattr(myadc, 'with_df', None):
for p in range(0,nvir,chnk_size):
vvvv = dfadc.get_vvvv_antisym_df(myadc, vvvv_d, p, chnk_size)
k = vvvv.shape[0]
vvvv = vvvv.reshape(-1,nv_pair)
t[a:a+k] = np.dot(vvvv,t_amp_t).reshape(-1,nvir,nocc*nocc)
del vvvv
a += k
else:
raise Exception("Unknown vvvv type")
t = np.ascontiguousarray(t.transpose(2,0,1)).reshape(nocc, nocc, nvir, nvir)
if pack:
t = t[:, :, tril_idx[0], tril_idx[1]]
return t