#!/usr/bin/env python
# Copyright 2017-2021 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.
import itertools
import numpy as np
from pyscf import lib
from pyscf.pbc.lib import kpts_helper
einsum = lib.einsum
#FIXME: the dtype of each intermediates. When the khf is at gamma point, the
# dtype is inconsistent between intermediates and t amplitudes
[docs]
def make_tau(cc, t2, t1, t1p, fac=1.):
t2aa, t2ab, t2bb = t2
nkpts = len(t2aa)
tauaa = t2aa.copy()
tauab = t2ab.copy()
taubb = t2bb.copy()
for ki in range(nkpts):
for kj in range(nkpts):
tauaa[ki,kj,ki] += einsum('ia,jb->ijab', fac*.5*t1[0][ki], t1p[0][kj])
tauaa[ki,kj,kj] -= einsum('ib,ja->ijab', fac*.5*t1[0][ki], t1p[0][kj])
tauaa[ki,kj,kj] -= einsum('ja,ib->ijab', fac*.5*t1[0][kj], t1p[0][ki])
tauaa[ki,kj,ki] += einsum('jb,ia->ijab', fac*.5*t1[0][kj], t1p[0][ki])
taubb[ki,kj,ki] += einsum('ia,jb->ijab', fac*.5*t1[1][ki], t1p[1][kj])
taubb[ki,kj,kj] -= einsum('ib,ja->ijab', fac*.5*t1[1][ki], t1p[1][kj])
taubb[ki,kj,kj] -= einsum('ja,ib->ijab', fac*.5*t1[1][kj], t1p[1][ki])
taubb[ki,kj,ki] += einsum('jb,ia->ijab', fac*.5*t1[1][kj], t1p[1][ki])
tauab[ki,kj,ki] += einsum('ia,jb->ijab', fac*.5*t1[0][ki], t1p[1][kj])
tauab[ki,kj,ki] += einsum('jb,ia->ijab', fac*.5*t1[1][kj], t1p[0][ki])
return tauaa, tauab, taubb
[docs]
def make_tau2(cc, t2, t1, t1p, fac=1.):
t2aa, t2ab, t2bb = t2
nkpts = len(t2aa)
tauaa = t2aa.copy()
tauab = t2ab.copy()
taubb = t2bb.copy()
for ki in range(nkpts):
for kj in range(nkpts):
tauaa[ki,kj,ki] += einsum('ia,jb->ijab', fac*.5*t1[0][ki], t1p[0][kj])
tauaa[ki,kj,ki] += einsum('jb,ia->ijab', fac*.5*t1[0][kj], t1p[0][ki])
taubb[ki,kj,ki] += einsum('ia,jb->ijab', fac*.5*t1[1][ki], t1p[1][kj])
taubb[ki,kj,ki] += einsum('jb,ia->ijab', fac*.5*t1[1][kj], t1p[1][ki])
tauab[ki,kj,ki] += einsum('ia,jb->ijab', fac*.5*t1[0][ki], t1p[1][kj])
tauab[ki,kj,ki] += einsum('jb,ia->ijab', fac*.5*t1[1][kj], t1p[0][ki])
return tauaa, tauab, taubb
[docs]
def cc_Fvv(cc, t1, t2, eris):
t1a, t1b = t1
t2aa, t2ab, t2bb = t2
nkpts, nocc_a, nvir_a = t1a.shape
nocc_b, nvir_b = t1b.shape[1:]
kconserv = cc.khelper.kconserv
fa = np.zeros((nkpts,nvir_a,nvir_a), dtype=np.complex128)
fb = np.zeros((nkpts,nvir_b,nvir_b), dtype=np.complex128)
tau_tildeaa,tau_tildeab,tau_tildebb=make_tau(cc,t2,t1,t1,fac=0.5)
fov = eris.fock[0][:,:nocc_a,nocc_a:]
fOV = eris.fock[1][:,:nocc_b,nocc_b:]
fvv = eris.fock[0][:,nocc_a:,nocc_a:]
fVV = eris.fock[1][:,nocc_b:,nocc_b:]
for ka in range(nkpts):
fa[ka]+=fvv[ka]
fb[ka]+=fVV[ka]
fa[ka]-=0.5*einsum('me,ma->ae',fov[ka],t1a[ka])
fb[ka]-=0.5*einsum('me,ma->ae',fOV[ka],t1b[ka])
for km in range(nkpts):
fa[ka]+=einsum('mf,fmea->ae',t1a[km], eris.vovv[km,km,ka].conj())
fa[ka]-=einsum('mf,emfa->ae',t1a[km], eris.vovv[ka,km,km].conj())
fa[ka]+=einsum('mf,fmea->ae',t1b[km], eris.VOvv[km,km,ka].conj())
fb[ka]+=einsum('mf,fmea->ae',t1b[km], eris.VOVV[km,km,ka].conj())
fb[ka]-=einsum('mf,emfa->ae',t1b[km], eris.VOVV[ka,km,km].conj())
fb[ka]+=einsum('mf,fmea->ae',t1a[km], eris.voVV[km,km,ka].conj())
for kn in range(nkpts):
kf = kconserv[km,ka,kn]
tmp = eris.ovov[km,ka,kn] - eris.ovov[km,kf,kn].transpose(0,3,2,1)
fa[ka] -= einsum('mnaf,menf->ae', tau_tildeaa[km,kn,ka], tmp) * .5
fa[ka] -= einsum('mNaF,meNF->ae', tau_tildeab[km,kn,ka], eris.ovOV[km,ka,kn])
tmp = eris.OVOV[km,ka,kn] - eris.OVOV[km,kf,kn].transpose(0,3,2,1)
fb[ka] -= einsum('mnaf,menf->ae', tau_tildebb[km,kn,ka], tmp) * .5
fb[ka] -= einsum('MnFa,MFne->ae', tau_tildeab[km,kn,kf], eris.ovOV[km,kf,kn])
return fa,fb
[docs]
def cc_Foo(cc, t1, t2, eris):
t1a, t1b = t1
t2aa, t2ab, t2bb = t2
nkpts, nocc_a, nvir_a = t1a.shape
nocc_b, nvir_b = t1b.shape[1:]
kconserv = cc.khelper.kconserv
fa = np.zeros((nkpts,nocc_a,nocc_a), dtype=np.complex128)
fb = np.zeros((nkpts,nocc_b,nocc_b), dtype=np.complex128)
tau_tildeaa,tau_tildeab,tau_tildebb=make_tau(cc,t2,t1,t1,fac=0.5)
fov = eris.fock[0][:,:nocc_a,nocc_a:]
fOV = eris.fock[1][:,:nocc_b,nocc_b:]
foo = eris.fock[0][:,:nocc_a,:nocc_a]
fOO = eris.fock[1][:,:nocc_b,:nocc_b]
for ka in range(nkpts):
fa[ka]+=foo[ka]
fb[ka]+=fOO[ka]
fa[ka]+=0.5*einsum('me,ne->mn',fov[ka],t1a[ka])
fb[ka]+=0.5*einsum('me,ne->mn',fOV[ka],t1b[ka])
for km in range(nkpts):
fa[ka]+=einsum('oa,mnoa->mn',t1a[km],eris.ooov[ka,ka,km])
fa[ka]+=einsum('oa,mnoa->mn',t1b[km],eris.ooOV[ka,ka,km])
fa[ka]-=einsum('oa,onma->mn',t1a[km],eris.ooov[km,ka,ka])
fb[ka]+=einsum('oa,mnoa->mn',t1b[km],eris.OOOV[ka,ka,km])
fb[ka]+=einsum('oa,mnoa->mn',t1a[km],eris.OOov[ka,ka,km])
fb[ka]-=einsum('oa,onma->mn',t1b[km],eris.OOOV[km,ka,ka])
for km in range(nkpts):
for kn in range(nkpts):
for ke in range(nkpts):
kf = kconserv[km,ke,kn]
tmp = eris.ovov[km,ke,kn] - eris.ovov[km,kf,kn].transpose(0,3,2,1)
fa[km] += einsum('inef,menf->mi', tau_tildeaa[km,kn,ke], tmp) * .5
fa[km] += einsum('iNeF,meNF->mi',tau_tildeab[km,kn,ke],eris.ovOV[km,ke,kn])
tmp = eris.OVOV[km,ke,kn] - eris.OVOV[km,kf,kn].transpose(0,3,2,1)
fb[km] += einsum('INEF,MENF->MI',tau_tildebb[km,kn,ke], tmp) * .5
fb[km] += einsum('nIeF,neMF->MI',tau_tildeab[kn,km,ke],eris.ovOV[kn,ke,km])
return fa,fb
[docs]
def cc_Fov(cc, t1, t2, eris):
t1a, t1b = t1
t2aa, t2ab, t2bb = t2
nkpts, nocc_a, nvir_a = t1a.shape
nocc_b, nvir_b = t1b.shape[1:]
fov = eris.fock[0][:,:nocc_a,nocc_a:]
fOV = eris.fock[1][:,:nocc_b,nocc_b:]
fa = np.zeros((nkpts,nocc_a,nvir_a), dtype=np.complex128)
fb = np.zeros((nkpts,nocc_b,nvir_b), dtype=np.complex128)
for km in range(nkpts):
fa[km]+=fov[km]
fb[km]+=fOV[km]
for kn in range(nkpts):
fa[km]+=einsum('nf,menf->me',t1a[kn],eris.ovov[km,km,kn])
fa[km]+=einsum('nf,menf->me',t1b[kn],eris.ovOV[km,km,kn])
fa[km]-=einsum('nf,mfne->me',t1a[kn],eris.ovov[km,kn,kn])
fb[km]+=einsum('nf,menf->me',t1b[kn],eris.OVOV[km,km,kn])
fb[km]+=einsum('nf,nfme->me',t1a[kn],eris.ovOV[kn,kn,km])
fb[km]-=einsum('nf,mfne->me',t1b[kn],eris.OVOV[km,kn,kn])
return fa,fb
[docs]
def cc_Woooo(cc, t1, t2, eris):
t1a, t1b = t1
t2aa, t2ab, t2bb = t2
nkpts, nocca, nvira = t1a.shape
noccb, nvirb = t1b.shape[1:]
dtype = np.result_type(t1a, t1b, t2aa, t2ab, t2bb)
Woooo = np.zeros(eris.oooo.shape, dtype=dtype)
WooOO = np.zeros(eris.ooOO.shape, dtype=dtype)
WOOOO = np.zeros(eris.OOOO.shape, dtype=dtype)
kconserv = cc.khelper.kconserv
tau_aa, tau_ab, tau_bb = make_tau(cc, t2, t1, t1)
for km in range(nkpts):
for kn in range(nkpts):
tmp_aaaaJ = einsum('xje, ymine->yxminj', t1a, eris.ooov[km,:,kn])
tmp_aaaaJ -= tmp_aaaaJ.transpose((1,0,2,5,4,3))
tmp_bbbbJ = einsum('xje, ymine->yxminj', t1b, eris.OOOV[km,:,kn])
tmp_bbbbJ -= tmp_bbbbJ.transpose((1,0,2,5,4,3))
tmp_aabbJ = einsum('xje, ymine->yxminj', t1b, eris.ooOV[km,:,kn])
tmp_baabJ = -einsum('yie,xmjne->yxminj', t1a, eris.OOov[km,:,kn])
Woooo[km,:,kn] += eris.oooo[km,:,kn]
WooOO[km,:,kn] += eris.ooOO[km,:,kn]
WOOOO[km,:,kn] += eris.OOOO[km,:,kn]
ki = range(nkpts)
kj = kconserv[km,ki,kn]
Woooo[km,ki,kn] += tmp_aaaaJ[ki,kj]
WOOOO[km,ki,kn] += tmp_bbbbJ[ki,kj]
WooOO[km,ki,kn] += tmp_aabbJ[ki,kj]
WooOO[kn,ki,km] -= tmp_baabJ[ki,kj].transpose(0,3,2,1,4)
Woooo[km,ki,kn] += 0.25*einsum('yxijef,xmenf->yminj', tau_aa[ki,kj], eris.ovov[km,:,kn])
WOOOO[km,ki,kn] += 0.25*einsum('yxijef,xmenf->yminj', tau_bb[ki,kj], eris.OVOV[km,:,kn])
WooOO[km,ki,kn] += 0.5*einsum('yxijef,xmenf->yminj', tau_ab[ki,kj], eris.ovOV[km,:,kn])
Woooo = Woooo - Woooo.transpose(2,1,0,5,4,3,6)
WOOOO = WOOOO - WOOOO.transpose(2,1,0,5,4,3,6)
return Woooo, WooOO, WOOOO
[docs]
def cc_Wvvvv(cc, t1, t2, eris):
t1a, t1b = t1
kconserv = cc.khelper.kconserv
#:wvvvv = eris.vvvv.copy()
#:Wvvvv += np.einsum('ymb,zyxemfa,zxyw->wzyaebf', t1a, eris.vovv.conj(), P)
#:Wvvvv -= np.einsum('ymb,xyzfmea,xzyw->wzyaebf', t1a, eris.vovv.conj(), P)
#:Wvvvv = Wvvvv - Wvvvv.transpose(2,1,0,5,4,3,6)
Wvvvv = np.zeros_like(eris.vvvv)
for ka, kb, ke in kpts_helper.loop_kkk(cc.nkpts):
kf = kconserv[ka,ke,kb]
aebf = eris.vvvv[ka,ke,kb].copy()
aebf += einsum('mb,emfa->aebf', t1a[kb], eris.vovv[ke,kb,kf].conj())
aebf -= einsum('mb,fmea->aebf', t1a[kb], eris.vovv[kf,kb,ke].conj())
Wvvvv[ka,ke,kb] += aebf
Wvvvv[kb,ke,ka] -= aebf.transpose(2,1,0,3)
#:WvvVV = eris.vvVV.copy()
#:WvvVV -= np.einsum('xma,zxwemFB,zwxy->xzyaeBF', t1a, eris.voVV.conj(), P)
#:WvvVV -= np.einsum('yMB,wyzFMea,wzyx->xzyaeBF', t1b, eris.VOvv.conj(), P)
WvvVV = np.empty_like(eris.vvVV)
for ka, kb, ke in kpts_helper.loop_kkk(cc.nkpts):
kf = kconserv[ka,ke,kb]
aebf = eris.vvVV[ka,ke,kb].copy()
aebf -= einsum('ma,emfb->aebf', t1a[ka], eris.voVV[ke,ka,kf].conj())
aebf -= einsum('mb,fmea->aebf', t1b[kb], eris.VOvv[kf,kb,ke].conj())
WvvVV[ka,ke,kb] = aebf
#:WVVVV = eris.VVVV.copy()
#:WVVVV += np.einsum('ymb,zyxemfa,zxyw->wzyaebf', t1b, eris.VOVV.conj(), P)
#:WVVVV -= np.einsum('ymb,xyzfmea,xzyw->wzyaebf', t1b, eris.VOVV.conj(), P)
#:WVVVV = WVVVV - WVVVV.transpose(2,1,0,5,4,3,6)
WVVVV = np.zeros_like(eris.VVVV)
for ka, kb, ke in kpts_helper.loop_kkk(cc.nkpts):
kf = kconserv[ka,ke,kb]
aebf = eris.VVVV[ka,ke,kb].copy()
aebf += einsum('mb,emfa->aebf', t1b[kb], eris.VOVV[ke,kb,kf].conj())
aebf -= einsum('mb,fmea->aebf', t1b[kb], eris.VOVV[kf,kb,ke].conj())
WVVVV[ka,ke,kb] += aebf
WVVVV[kb,ke,ka] -= aebf.transpose(2,1,0,3)
return Wvvvv, WvvVV, WVVVV
#TODO: merge cc_Wvvvv_half and cc_Wvvvv
[docs]
def cc_Wvvvv_half(cc, t1, t2, eris):
'''Similar to cc_Wvvvv, without anti-symmetrization'''
t1a, t1b = t1
kconserv = cc.khelper.kconserv
#:wvvvv = eris.vvvv.copy()
#:Wvvvv += np.einsum('ymb,zyxemfa,zxyw->wzyaebf', t1a, eris.vovv.conj(), P)
#:Wvvvv -= np.einsum('ymb,xyzfmea,xzyw->wzyaebf', t1a, eris.vovv.conj(), P)
#:Wvvvv = Wvvvv - Wvvvv.transpose(2,1,0,5,4,3,6)
Wvvvv = np.zeros_like(eris.vvvv)
for ka, kb, ke in kpts_helper.loop_kkk(cc.nkpts):
kf = kconserv[ka,ke,kb]
aebf = eris.vvvv[ka,ke,kb].copy()
aebf += einsum('mb,emfa->aebf', t1a[kb], eris.vovv[ke,kb,kf].conj())
aebf -= einsum('mb,fmea->aebf', t1a[kb], eris.vovv[kf,kb,ke].conj())
Wvvvv[ka,ke,kb] += aebf
#:WvvVV = eris.vvVV.copy()
#:WvvVV -= np.einsum('xma,zxwemFB,zwxy->xzyaeBF', t1a, eris.voVV.conj(), P)
#:WvvVV -= np.einsum('yMB,wyzFMea,wzyx->xzyaeBF', t1b, eris.VOvv.conj(), P)
WvvVV = np.empty_like(eris.vvVV)
for ka, kb, ke in kpts_helper.loop_kkk(cc.nkpts):
kf = kconserv[ka,ke,kb]
aebf = eris.vvVV[ka,ke,kb].copy()
aebf -= einsum('ma,emfb->aebf', t1a[ka], eris.voVV[ke,ka,kf].conj())
aebf -= einsum('mb,fmea->aebf', t1b[kb], eris.VOvv[kf,kb,ke].conj())
WvvVV[ka,ke,kb] = aebf
#:WVVVV = eris.VVVV.copy()
#:WVVVV += np.einsum('ymb,zyxemfa,zxyw->wzyaebf', t1b, eris.VOVV.conj(), P)
#:WVVVV -= np.einsum('ymb,xyzfmea,xzyw->wzyaebf', t1b, eris.VOVV.conj(), P)
#:WVVVV = WVVVV - WVVVV.transpose(2,1,0,5,4,3,6)
WVVVV = np.zeros_like(eris.VVVV)
for ka, kb, ke in kpts_helper.loop_kkk(cc.nkpts):
kf = kconserv[ka,ke,kb]
aebf = eris.VVVV[ka,ke,kb].copy()
aebf += einsum('mb,emfa->aebf', t1b[kb], eris.VOVV[ke,kb,kf].conj())
aebf -= einsum('mb,fmea->aebf', t1b[kb], eris.VOVV[kf,kb,ke].conj())
WVVVV[ka,ke,kb] += aebf
return Wvvvv, WvvVV, WVVVV
[docs]
def Wvvvv(cc, t1, t2, eris):
nkpts = cc.nkpts
kconserv = cc.khelper.kconserv
tauaa, tauab, taubb = make_tau(cc, t2, t1, t1)
Wvvvv, WvvVV, WVVVV = cc_Wvvvv(cc, t1, t2, eris)
for ka, kb, ke in kpts_helper.loop_kkk(cc.nkpts):
for km in range(nkpts):
kn = kconserv[ka,km,kb]
Wvvvv[ka,ke,kb] += einsum('mnab,menf->aebf', tauaa[km,kn,ka], eris.ovov[km,ke,kn])
WvvVV[ka,ke,kb] += einsum('mNaB,meNF->aeBF', tauab[km,kn,ka], eris.ovOV[km,ke,kn])
WVVVV[ka,ke,kb] += einsum('mnab,menf->aebf', taubb[km,kn,ka], eris.OVOV[km,ke,kn])
return Wvvvv, WvvVV, WVVVV
[docs]
def get_Wvvvv(cc, t1, t2, eris, ka, kb, kc):
t1a, t1b = t1
t2aa, t2ab, t2bb = t2
nocca, noccb = cc.nocc
nkpts = cc.nkpts
kconserv = cc.khelper.kconserv
kd = kconserv[ka, kc, kb]
if getattr(eris, 'Lpv', None) is not None:
# Using GDF to generate Wvvvv on the fly
Lpv = eris.Lpv
LPV = eris.LPV
Lac = (Lpv[ka,kc][:,nocca:] -
einsum('Lkc,ka->Lac', Lpv[ka,kc][:,:nocca], t1a[ka]))
Lbd = (Lpv[kb,kd][:,nocca:] -
einsum('Lkd,kb->Lbd', Lpv[kb,kd][:,:nocca], t1a[kb]))
Lbc = (Lpv[kb,kc][:,nocca:] -
einsum('Lkc,ka->Lac', Lpv[kb,kc][:,:nocca], t1a[kb]))
Lad = (Lpv[ka,kd][:,nocca:] -
einsum('Lkd,kb->Lbd', Lpv[ka,kd][:,:nocca], t1a[ka]))
LAC = (LPV[ka,kc][:,noccb:] -
einsum('Lkd,kb->Lbd', LPV[ka,kc][:,:noccb], t1b[ka]))
LBD = (LPV[kb,kd][:,noccb:] -
einsum('Lkd,kb->Lbd', LPV[kb,kd][:,:noccb], t1b[kb]))
LBC = (LPV[kb,kc][:,noccb:] -
einsum('Lkc,ka->Lac', LPV[kb,kc][:,:noccb], t1b[kb]))
LAD = (LPV[ka,kd][:,noccb:] -
einsum('Lkd,kb->Lbd', LPV[ka,kd][:,:noccb], t1b[ka]))
vvvv = einsum('Lac,Lbd->acbd', Lac, Lbd)
vvvv-= einsum('Lbc,Lad->acbd', Lbc, Lad)
vvVV = einsum('Lac,Lbd->acbd', Lac, LBD)
VVVV = einsum('Lac,Lbd->acbd', LAC, LBD)
VVVV-= einsum('Lbc,Lad->acbd', LBC, LAD)
vvvv *= (1./nkpts)
vvVV *= (1./nkpts)
VVVV *= (1./nkpts)
else:
vvvv = einsum('emfa,mb->aebf', eris.vovv[kc,kb,kd].conj(), t1a[kb])
vvvv -= einsum('fmea,mb->aebf', eris.vovv[kd,kb,kc].conj(), t1a[kb])
vvvv -= einsum('emfb,ma->aebf', eris.vovv[kc,ka,kd].conj(), t1a[ka])
vvvv += einsum('fmeb,ma->aebf', eris.vovv[kd,ka,kc].conj(), t1a[ka])
vvvv += eris.vvvv[ka,kc,kb]
vvvv -= eris.vvvv[kb,kc,ka].transpose(2,1,0,3)
vvvv += einsum('mcnf,ma,nb->acbf', eris.ovov[ka,kc,kb], t1a[ka], t1a[kb])
vvvv -= einsum('mcnf,mb,na->acbf', eris.ovov[kb,kc,ka], t1a[kb], t1a[ka])
vvVV = einsum('emfb,ma->aebf', eris.voVV[kc,ka,kd].conj(),-t1a[ka])
vvVV += einsum('fmea,mb->aebf', eris.VOvv[kd,kb,kc].conj(),-t1b[kb])
vvVV += einsum('mcnf,ma,nb->acbf', eris.ovOV[ka,kc,kb], t1a[ka], t1b[kb])
vvVV += eris.vvVV[ka,kc,kb]
VVVV = einsum('emfa,mb->aebf', eris.VOVV[kc,kb,kd].conj(), t1b[kb])
VVVV -= einsum('fmea,mb->aebf', eris.VOVV[kd,kb,kc].conj(), t1b[kb])
VVVV -= einsum('emfb,ma->aebf', eris.VOVV[kc,ka,kd].conj(), t1b[ka])
VVVV += einsum('fmeb,ma->aebf', eris.VOVV[kd,ka,kc].conj(), t1b[ka])
VVVV += eris.VVVV[ka,kc,kb]
VVVV -= eris.VVVV[kb,kc,ka].transpose(2,1,0,3)
VVVV += einsum('mcnf,ma,nb->acbf', eris.OVOV[ka,kc,kb], t1b[ka], t1b[kb])
VVVV -= einsum('mcnf,mb,na->acbf', eris.OVOV[kb,kc,ka], t1b[kb], t1b[ka])
for km in range(nkpts):
kn = kconserv[ka,km,kb]
vvvv += einsum('mnab,mcnf->acbf', t2aa[km,kn,ka], eris.ovov[km,kc,kn])
vvVV += einsum('mNaB,mcNF->acBF', t2ab[km,kn,ka], eris.ovOV[km,kc,kn])
VVVV += einsum('mnab,mcnf->acbf', t2bb[km,kn,ka], eris.OVOV[km,kc,kn])
return vvvv, vvVV, VVVV
[docs]
def cc_Wovvo(cc, t1, t2, eris):
t1a, t1b = t1
t2aa, t2ab, t2bb = t2
nkpts, nocca, nvira = t1a.shape
noccb, nvirb = t1b.shape[1:]
kconserv = kpts_helper.get_kconserv(cc._scf.cell, cc.kpts)
dtype = np.result_type(*t2)
Wovvo = np.zeros((nkpts,nkpts,nkpts,nocca,nvira,nvira,nocca), dtype)
WovVO = np.zeros((nkpts,nkpts,nkpts,nocca,nvira,nvirb,noccb), dtype)
WOVvo = np.zeros((nkpts,nkpts,nkpts,noccb,nvirb,nvira,nocca), dtype)
WOVVO = np.zeros((nkpts,nkpts,nkpts,noccb,nvirb,nvirb,noccb), dtype)
WoVVo = np.zeros((nkpts,nkpts,nkpts,nocca,nvirb,nvirb,nocca), dtype)
WOvvO = np.zeros((nkpts,nkpts,nkpts,noccb,nvira,nvira,noccb), dtype)
for ka, ki, kj in kpts_helper.loop_kkk(nkpts):
kb = kconserv[ka,ki,kj]
Wovvo[ki,ka,kb] += eris.voov[ka,ki,kj].conj().transpose(1,0,3,2)
WovVO[ki,ka,kb] += eris.voOV[ka,ki,kj].conj().transpose(1,0,3,2)
WOVvo[ki,ka,kb] += eris.voOV[kb,kj,ki].transpose(2,3,0,1)
WOVVO[ki,ka,kb] += eris.VOOV[ka,ki,kj].conj().transpose(1,0,3,2)
kb = kconserv[ki,kj,ka]
Wovvo[ki,kb,ka] -= eris.oovv[ki,kj,ka].transpose(0,3,2,1)
WOVVO[ki,kb,ka] -= eris.OOVV[ki,kj,ka].transpose(0,3,2,1)
WoVVo[ki,kb,ka] -= eris.ooVV[ki,kj,ka].transpose(0,3,2,1)
WOvvO[ki,kb,ka] -= eris.OOvv[ki,kj,ka].transpose(0,3,2,1)
tauaa, tauab, taubb = make_tau2(cc, t2, t1, t1,fac=2.0)
for km in range(nkpts):
for kb in range(nkpts):
for ke in range(nkpts):
kj = kconserv[km,ke,kb]
vovv = eris.vovv[ke,km,kj].conj()
VOVV = eris.VOVV[ke,km,kj].conj()
voVV = eris.voVV[ke,km,kj].conj()
VOvv = eris.VOvv[ke,km,kj].conj()
Wovvo[km,ke,kb] += einsum('jf, emfb->mebj', t1a[kj], vovv)
WOVVO[km,ke,kb] += einsum('jf, emfb->mebj', t1b[kj], VOVV)
WovVO[km,ke,kb] += einsum('jf, emfb->mebj', t1b[kj], voVV)
WOVvo[km,ke,kb] += einsum('jf, emfb->mebj', t1a[kj], VOvv)
##### warnings for Ks
Wovvo[km,kj,kb] -= einsum('je, emfb->mfbj', t1a[ke], vovv)
WOVVO[km,kj,kb] -= einsum('je, emfb->mfbj', t1b[ke], VOVV)
WOvvO[km,kj,kb] -= einsum('je, emfb->mfbj', t1b[ke], VOvv)
WoVVo[km,kj,kb] -= einsum('je, emfb->mfbj', t1a[ke], voVV)
WOVvo[km,ke,kb] -= einsum('nb, njme->mebj', t1a[kb], eris.ooOV[kb,kj,km])
WovVO[km,ke,kb] -= einsum('nb, njme->mebj', t1b[kb], eris.OOov[kb,kj,km])
WOvvO[km,ke,kb] += einsum('nb, mjne->mebj', t1a[kb], eris.OOov[km,kj,kb])
WoVVo[km,ke,kb] += einsum('nb, mjne->mebj', t1b[kb], eris.ooOV[km,kj,kb])
ooov_temp = eris.ooov[kb,kj,km] - eris.ooov[km,kj,kb].transpose((2,1,0,3))
Wovvo[km,ke,kb] -= einsum('nb, njme->mebj', t1a[kb], ooov_temp)
ooov_temp = None
OOOV_temp = eris.OOOV[kb,kj,km] - eris.OOOV[km,kj,kb].transpose((2,1,0,3))
WOVVO[km,ke,kb] -= einsum('nb, njme->mebj', t1b[kb], OOOV_temp)
OOOV_temp = None
Wovvo[km,ke,kb] += 0.5*einsum('xjnbf,xmenf->mebj', t2ab[kj,:,kb], eris.ovOV[km,ke,:])
WOvvO[km,ke,kb] += 0.5*einsum('xnjbf,xnemf->mebj', tauab[:,kj,kb], eris.ovOV[:,ke,km])
WovVO[km,ke,kb] -= 0.5*einsum('xnjbf,xmenf->mebj', taubb[:,kj,kb], eris.ovOV[km,ke,:])
temp_ovOV_1 = np.zeros([nkpts, nocca, nvira, noccb, nvirb], dtype=dtype)
temp_ovOV_2 = np.zeros([nkpts, nocca, nvira, noccb, nvirb], dtype=dtype)
for kn in range(nkpts):
kf = kconserv[km,ke,kn]
temp_ovOV_1[kn] += eris.ovOV[kn,kf,km].copy()
temp_ovOV_2[kn] += eris.ovOV[km,kf,kn].copy()
kn = range(nkpts)
kf = kconserv[km,ke][kn]
WOVVO[km,ke,kb] += 0.5*einsum('xnjfb,xnfme->mebj', t2ab[kn,kj,kf], temp_ovOV_1)
WOVvo[km,ke,kb] -= 0.5*einsum('xnjbf,xnfme->mebj', tauaa[:,kj,kb], temp_ovOV_1)
WoVVo[km,ke,kb] += 0.5*einsum('xjnfb,xmfne->mebj', tauab[kj,kn,kf], temp_ovOV_2)
temp_OVOV = eris.OVOV[km,ke,:] - eris.OVOV[:,ke,km].transpose((0,3,2,1,4))
WOVVO[km,ke,kb] -= 0.5*einsum('xnjbf,xmenf->mebj', taubb[:,kj,kb], temp_OVOV)
WOVvo[km,ke,kb] += 0.5*einsum('xjnbf,xmenf->mebj', t2ab[kj,:,kb], temp_OVOV)
temp_OVOV = None
temp_ovov = eris.ovov[:,ke,km] - eris.ovov[km,ke,:].transpose((0,3,2,1,4))
Wovvo[km,ke,kb] += 0.5*einsum('xnjbf,xnemf->mebj', tauaa[:,kj,kb], temp_ovov)
WovVO[km,ke,kb] -= 0.5*einsum('xnjfb,xnemf->mebj', t2ab[kn,kj,kf], temp_ovov)
temp_ovov = None
return Wovvo, WovVO, WOVvo, WOVVO, WoVVo, WOvvO
def _cc_Wovvo_k0k2(cc, t1, t2, eris, k0, k2):
t1a, t1b = t1
t2aa, t2ab, t2bb = t2
nkpts, nocca, nvira = t1a.shape
noccb, nvirb = t1b.shape[1:]
kconserv = kpts_helper.get_kconserv(cc._scf.cell, cc.kpts)
dtype = np.result_type(*t2)
Wovvo = np.zeros((nkpts,nocca,nvira,nvira,nocca), dtype)
WovVO = np.zeros((nkpts,nocca,nvira,nvirb,noccb), dtype)
WOVvo = np.zeros((nkpts,noccb,nvirb,nvira,nocca), dtype)
WOVVO = np.zeros((nkpts,noccb,nvirb,nvirb,noccb), dtype)
WoVVo = np.zeros((nkpts,nocca,nvirb,nvirb,nocca), dtype)
WOvvO = np.zeros((nkpts,noccb,nvira,nvira,noccb), dtype)
#:P = kconserv_mat(cc.nkpts, kconserv)
#:Wovvo = np.einsum('xyzaijb,xzyw->yxwiabj', eris.voov, P).conj()
#:WovVO = np.einsum('xyzaijb,xzyw->yxwiabj', eris.voOV, P).conj()
#:WOVvo = np.einsum('wzybjia,xzyw->yxwiabj', eris.voOV, P)
#:WOVVO = np.einsum('xyzaijb,xzyw->yxwiabj', eris.VOOV, P).conj()
#:Wovvo-= np.einsum('xyzijab,xzyw->xwzibaj', eris.oovv, P)
#:WOVVO-= np.einsum('xyzijab,xzyw->xwzibaj', eris.OOVV, P)
#:WoVVo = np.einsum('xyzijab,xzyw->xwzibaj', eris.ooVV, -P)
#:WOvvO = np.einsum('xyzijab,xzyw->xwzibaj', eris.OOvv, -P)
for kj in range(nkpts):
ka = kconserv[k2,kj,k0]
Wovvo[ka] += eris.voov[ka,k0,kj].conj().transpose(1,0,3,2)
WovVO[ka] += eris.voOV[ka,k0,kj].conj().transpose(1,0,3,2)
WOVvo[ka] += eris.voOV[k2,kj,k0].transpose(2,3,0,1)
WOVVO[ka] += eris.VOOV[ka,k0,kj].conj().transpose(1,0,3,2)
for kj in range(nkpts):
kb = kconserv[k0,kj,k2]
Wovvo[kb] -= eris.oovv[k0,kj,k2].transpose(0,3,2,1)
WOVVO[kb] -= eris.OOVV[k0,kj,k2].transpose(0,3,2,1)
WoVVo[kb] -= eris.ooVV[k0,kj,k2].transpose(0,3,2,1)
WOvvO[kb] -= eris.OOvv[k0,kj,k2].transpose(0,3,2,1)
for ke in range(nkpts):
kj = kconserv[k0,ke,k2]
vovv = eris.vovv[ke,k0,kj].conj()
VOVV = eris.VOVV[ke,k0,kj].conj()
voVV = eris.voVV[ke,k0,kj].conj()
VOvv = eris.VOvv[ke,k0,kj].conj()
Wovvo[ke] += einsum('jf, emfb->mebj', t1a[kj], vovv)
WOVVO[ke] += einsum('jf, emfb->mebj', t1b[kj], VOVV)
WovVO[ke] += einsum('jf, emfb->mebj', t1b[kj], voVV)
WOVvo[ke] += einsum('jf, emfb->mebj', t1a[kj], VOvv)
Wovvo[kj] -= einsum('je, emfb->mfbj', t1a[ke], vovv)
WOVVO[kj] -= einsum('je, emfb->mfbj', t1b[ke], VOVV)
WOvvO[kj] -= einsum('je, emfb->mfbj', t1b[ke], VOvv)
WoVVo[kj] -= einsum('je, emfb->mfbj', t1a[ke], voVV)
Wovvo[ke] -= einsum('nb, njme->mebj', t1a[k2], eris.ooov[k2,kj,k0])
WOVvo[ke] -= einsum('nb, njme->mebj', t1a[k2], eris.ooOV[k2,kj,k0])
WOVVO[ke] -= einsum('nb, njme->mebj', t1b[k2], eris.OOOV[k2,kj,k0])
WovVO[ke] -= einsum('nb, njme->mebj', t1b[k2], eris.OOov[k2,kj,k0])
Wovvo[ke] += einsum('nb, mjne->mebj', t1a[k2], eris.ooov[k0,kj,k2])
WOVVO[ke] += einsum('nb, mjne->mebj', t1b[k2], eris.OOOV[k0,kj,k2])
WoVVo[ke] += einsum('nb, mjne->mebj', t1b[k2], eris.ooOV[k0,kj,k2])
WOvvO[ke] += einsum('nb, mjne->mebj', t1a[k2], eris.OOov[k0,kj,k2])
for kn in range(nkpts):
kf = kconserv[k0,ke,kn]
tmp = eris.ovov[k0,ke,kn] - eris.ovov[kn,ke,k0].transpose(2,1,0,3)
Wovvo[ke] -= 0.5*einsum('jnfb,menf->mebj', t2aa[kj,kn,kf], tmp)
Wovvo[ke] += 0.5*einsum('jnbf,menf->mebj', t2ab[kj,kn,k2], eris.ovOV[k0,ke,kn])
tmp = eris.OVOV[k0,ke,kn] - eris.OVOV[kn,ke,k0].transpose(2,1,0,3)
WOVVO[ke] -= 0.5*einsum('jnfb,menf->mebj', t2bb[kj,kn,kf], tmp)
WOVVO[ke] += 0.5*einsum('njfb,nfme->mebj', t2ab[kn,kj,kf], eris.ovOV[kn,kf,k0])
tmp = eris.ovov[k0,ke,kn] - eris.ovov[kn,ke,k0].transpose(2,1,0,3)
WovVO[ke] += 0.5*einsum('njfb,menf->mebj', t2ab[kn,kj,kf], tmp)
WovVO[ke] -= 0.5*einsum('jnfb,menf->mebj', t2bb[kj,kn,kf], eris.ovOV[k0,ke,kn])
tmp = eris.OVOV[k0,ke,kn] - eris.OVOV[kn,ke,k0].transpose(2,1,0,3)
WOVvo[ke] += 0.5*einsum('jnbf,menf->mebj', t2ab[kj,kn,k2], tmp)
WOVvo[ke] -= 0.5*einsum('jnfb,nfme->mebj', t2aa[kj,kn,kf], eris.ovOV[kn,kf,k0])
WoVVo[ke] += 0.5*einsum('jnfb,mfne->mebj', t2ab[kj,kn,kf], eris.ovOV[k0,kf,kn])
WOvvO[ke] += 0.5*einsum('njbf,nemf->mebj', t2ab[kn,kj,k2], eris.ovOV[kn,ke,k0])
if kn == k2 and kf == kj:
tmp = einsum('menf,jf->menj', eris.ovov[k0,ke,kn], t1a[kj])
tmp-= einsum('nemf,jf->menj', eris.ovov[kn,ke,k0], t1a[kj])
Wovvo[ke] -= einsum('nb,menj->mebj', t1a[kn], tmp)
tmp = einsum('menf,jf->menj', eris.OVOV[k0,ke,kn], t1b[kj])
tmp-= einsum('nemf,jf->menj', eris.OVOV[kn,ke,k0], t1b[kj])
WOVVO[ke] -= einsum('nb,menj->mebj', t1b[kn], tmp)
WovVO[ke] -= einsum('jf,nb,menf->mebj',t1b[kj],t1b[kn], eris.ovOV[k0,ke,kn])
WOVvo[ke] -= einsum('jf,nb,nfme->mebj',t1a[kj],t1a[kn], eris.ovOV[kn,kf,k0])
WoVVo[ke] += einsum('jf,nb,mfne->mebj',t1a[kj],t1b[kn], eris.ovOV[k0,kf,kn])
WOvvO[ke] += einsum('jf,nb,nemf->mebj',t1b[kj],t1a[kn], eris.ovOV[kn,ke,k0])
return Wovvo, WovVO, WOVvo, WOVVO, WoVVo, WOvvO
[docs]
def kconserv_mat(nkpts, kconserv):
P = np.zeros((nkpts,nkpts,nkpts,nkpts))
for ki in range(nkpts):
for kj in range(nkpts):
for ka in range(nkpts):
kb = kconserv[ki,ka,kj]
P[ki,kj,ka,kb] = 1
return P
[docs]
def Foo(cc,t1,t2,eris):
t1a, t1b = t1
t2aa, t2ab, t2bb = t2
nkpts, nocca, noccb, nvira, nvirb = t2ab.shape[2:]
Fova, Fovb = cc_Fov(cc,t1,t2,eris)
Fooa, Foob = cc_Foo(cc,t1,t2,eris)
for ki in range(nkpts):
Fooa[ki] += 0.5*einsum('ie,me->mi',t1a[ki],Fova[ki])
Foob[ki] += 0.5*einsum('ie,me->mi',t1b[ki],Fovb[ki])
return Fooa, Foob
[docs]
def Fvv(cc,t1,t2,eris):
t1a, t1b = t1
t2aa, t2ab, t2bb = t2
nkpts, nocca, noccb, nvira, nvirb = t2ab.shape[2:]
Fova, Fovb = cc_Fov(cc,t1,t2,eris)
Fvva, Fvvb = cc_Fvv(cc,t1,t2,eris)
for ka in range(nkpts):
Fvva[ka] -= 0.5*lib.einsum('me,ma->ae', Fova[ka], t1a[ka])
Fvvb[ka] -= 0.5*lib.einsum('me,ma->ae', Fovb[ka], t1b[ka])
return Fvva, Fvvb
[docs]
def Fov(cc,t1,t2,eris):
Fme = cc_Fov(cc,t1,t2,eris)
return Fme
[docs]
def Wvvov(cc,t1,t2,eris):
kconserv = cc.khelper.kconserv
t1a, t1b = t1
t2aa, t2ab, t2bb = t2
nkpts, nocca, noccb, nvira, nvirb = t2ab.shape[2:]
Wvvov = np.zeros((nkpts,nkpts,nkpts,nvira,nvira,nocca,nvira),dtype=t1a.dtype)
WvvOV = np.zeros((nkpts,nkpts,nkpts,nvira,nvira,noccb,nvirb),dtype=t1a.dtype)
WVVov = np.zeros((nkpts,nkpts,nkpts,nvirb,nvirb,nocca,nvira),dtype=t1a.dtype)
WVVOV = np.zeros((nkpts,nkpts,nkpts,nvirb,nvirb,noccb,nvirb),dtype=t1a.dtype)
for kn, km, ke in itertools.product(range(nkpts),repeat=3):
kf = kconserv[kn, ke, km]
ka = kn
Wvvov[ka,ke,km] += eris.vovv[kf,km,ke].transpose(3,2,1,0).conj() - eris.vovv[ke,km,kf].transpose(3,0,1,2).conj()
WVVov[ka,ke,km] += eris.voVV[kf,km,ke].transpose(3,2,1,0).conj()
WvvOV[ka,ke,km] += eris.VOvv[kf,km,ke].transpose(3,2,1,0).conj()
WVVOV[ka,ke,km] += eris.VOVV[kf,km,ke].transpose(3,2,1,0).conj() - eris.VOVV[ke,km,kf].transpose(3,0,1,2).conj()
ovov = eris.ovov[kn, ke, km] - eris.ovov[kn, kf, km].transpose(0,3,2,1)
OVOV = eris.OVOV[kn, ke, km] - eris.OVOV[kn, kf, km].transpose(0,3,2,1)
Wvvov[ka,ke,km] += -lib.einsum('na,nemf->aemf',t1a[kn],ovov)
WvvOV[ka,ke,km] += -lib.einsum('na,neMF->aeMF',t1a[kn],eris.ovOV[kn,ke,km])
WVVov[ka,ke,km] += -lib.einsum('NA,NEmf->AEmf',t1b[kn],eris.OVov[kn,ke,km])
WVVOV[ka,ke,km] += -lib.einsum('NA,NEMF->AEMF',t1b[kn],OVOV)
return Wvvov, WvvOV, WVVov, WVVOV
[docs]
def Wvvvo(cc,t1,t2,eris):
kconserv = cc.khelper.kconserv
t1a, t1b = t1
t2aa, t2ab, t2bb = t2
nkpts, nocca, noccb, nvira, nvirb = t2ab.shape[2:]
fova, fovb = cc_Fov(cc, t1, t2, eris)
tauaa, tauab, taubb = make_tau(cc, t2, t1, t1)
Wvvvo = np.zeros((nkpts,nkpts,nkpts,nvira,nvira,nvira,nocca),dtype=t1a.dtype)
WvvVO = np.zeros((nkpts,nkpts,nkpts,nvira,nvira,nvirb,noccb),dtype=t1a.dtype)
WVVvo = np.zeros((nkpts,nkpts,nkpts,nvirb,nvirb,nvira,nocca),dtype=t1a.dtype)
WVVVO = np.zeros((nkpts,nkpts,nkpts,nvirb,nvirb,nvirb,noccb),dtype=t1a.dtype)
for ka, ke, kb in itertools.product(range(nkpts),repeat=3):
ki = kconserv[ka, ke, kb]
# - <mb||ef> t2(miaf)
for km in range(nkpts):
kf = kconserv[km,ke,kb]
ovvv = eris.vovv[ke,km,kf].transpose(1,0,3,2).conj() - eris.vovv[kf,km,ke].transpose(1,2,3,0).conj()
OVvv = eris.VOvv[ke,km,kf].transpose(1,0,3,2).conj()
ovVV = eris.voVV[ke,km,kf].transpose(1,0,3,2).conj()
OVVV = eris.VOVV[ke,km,kf].transpose(1,0,3,2).conj() - eris.VOVV[kf,km,ke].transpose(1,2,3,0).conj()
aebi = lib.einsum('mebf,miaf->aebi',ovvv,t2aa[km,ki,ka])
aebi += lib.einsum('MFbe,iMaF->aebi',eris.VOvv[kf,km,ke].transpose(1,0,3,2).conj(),t2ab[ki,km,ka])
Wvvvo[ka,ke,kb] -= aebi
# P(ab) for all alpha spin
Wvvvo[kb,ke,ka] += aebi.transpose(2,1,0,3)
WVVvo[ka,ke,kb] -= lib.einsum('MEbf,iMfA->AEbi',OVvv,t2ab[ki,km,kf])
WvvVO[ka,ke,kb] -= lib.einsum('meBF,mIaF->aeBI',ovVV,t2ab[km,ki,ka])
AEBI = lib.einsum('MEBF,MIAF->AEBI',OVVV,t2bb[km,ki,ka])
AEBI += lib.einsum('mfBE,mIfA->AEBI',eris.voVV[kf,km,ke].transpose(1,0,3,2).conj(),t2ab[km,ki,kf])
WVVVO[ka,ke,kb] -= AEBI
# P(ab) for all beta spin
WVVVO[kb,ke,ka] += AEBI.transpose(2,1,0,3)
# - t1(ma) (<mb||ei> - t2(nibf) <mn||ef>)
km = ka
ovvo = eris.voov[ke,km,ki].transpose(1,0,3,2).conj() - eris.oovv[km,ki,kb].transpose(0,3,2,1)
OVvo = eris.VOov[ke,km,ki].transpose(1,0,3,2).conj()
ovVO = eris.voOV[ke,km,ki].transpose(1,0,3,2).conj()
OVVO = eris.VOOV[ke,km,ki].transpose(1,0,3,2).conj() - eris.OOVV[km,ki,kb].transpose(0,3,2,1)
tmp1aa = np.zeros((nocca, nvira, nvira, nocca),dtype=t1a.dtype)
tmp1ab = np.zeros((nocca, nvira, nvirb, noccb),dtype=t1a.dtype)
tmp1ba = np.zeros((noccb, nvirb, nvira, nocca),dtype=t1a.dtype)
tmp1bb = np.zeros((noccb, nvirb, nvirb, noccb),dtype=t1a.dtype)
for kn in range(nkpts):
kf = kconserv[km,ke,kn]
ovov = eris.ovov[km,ke,kn] - eris.ovov[km,kf,kn].transpose(0,3,2,1)
OVov = eris.OVov[km,ke,kn]
ovOV = eris.ovOV[km,ke,kn]
OVOV = eris.OVOV[km,ke,kn] - eris.OVOV[km,kf,kn].transpose(0,3,2,1)
tmp1aa -= einsum('nibf,menf->mebi',t2aa[kn,ki,kb], ovov)
tmp1aa += einsum('iNbF,meNF->mebi',t2ab[ki,kn,kb], ovOV)
tmp1ab += einsum('nIfB,menf->meBI',t2ab[kn,ki,kf], ovov)
tmp1ab -= einsum('NIBF,meNF->meBI',t2bb[kn,ki,kb], ovOV)
tmp1ba += einsum('iNbF,MENF->MEbi',t2ab[ki,kn,kb], OVOV)
tmp1ba -= einsum('nibf,MEnf->MEbi',t2aa[kn,ki,kb], OVov)
tmp1bb -= einsum('NIBF,MENF->MEBI',t2bb[kn,ki,kb], OVOV)
tmp1bb += einsum('nIfB,MEnf->MEBI',t2ab[kn,ki,kf], OVov)
aebi = einsum('ma,mebi->aebi',t1a[km],(ovvo+tmp1aa))
Wvvvo[ka,ke,kb] -= aebi
WVVvo[ka,ke,kb] -= einsum('MA,MEbi->AEbi',t1b[km],OVvo+tmp1ba)
WvvVO[ka,ke,kb] -= einsum('ma,meBI->aeBI',t1a[km],ovVO+tmp1ab)
AEBI = einsum('MA,MEBI->AEBI',t1b[km],(OVVO+tmp1bb))
WVVVO[ka,ke,kb] -= AEBI
for ka, ke, kb in itertools.product(range(nkpts),repeat=3):
ki = kconserv[ka, ke, kb]
# P(ab) <mb||ef> t2(miaf) (alpha alpha beta beta) and (beta beta alpha alpha)
for km in range(nkpts):
kf = kconserv[km,ke,ka]
OVVV = (eris.VOVV[ke,km,kf].transpose(1,0,3,2).conj() -
eris.VOVV[kf,km,ke].transpose(1,2,3,0).conj())
ovvv = (eris.vovv[ke,km,kf].transpose(1,0,3,2).conj() -
eris.vovv[kf,km,ke].transpose(1,2,3,0).conj())
WVVvo[ka,ke,kb] -= lib.einsum('mfAE,mibf->AEbi',
eris.voVV[kf,km,ke].transpose(1,0,3,2).conj(), t2aa[km,ki,kb])
WVVvo[ka,ke,kb] -= lib.einsum('MEAF,iMbF->AEbi', OVVV, t2ab[ki,km,kb])
WvvVO[ka,ke,kb] -= lib.einsum('MFae,MIBF->aeBI',
eris.VOvv[kf,km,ke].transpose(1,0,3,2).conj(), t2bb[km,ki,kb])
WvvVO[ka,ke,kb] -= lib.einsum('meaf,mIfB->aeBI', ovvv, t2ab[km,ki,kf])
# P(ab) -t1(ma) (<mb||ei> - t2(nibf) <mn||ef>) for all spin configurations
km = kb
ovvo = (eris.voov[ke,km,ki].transpose(1,0,3,2).conj() -
eris.oovv[km,ki,ka].transpose(0,3,2,1))
OVVO = (eris.VOOV[ke,km,ki].transpose(1,0,3,2).conj() -
eris.OOVV[km,ki,ka].transpose(0,3,2,1))
tmp1aa = np.zeros((nocca, nvira, nvira, nocca),dtype=t1a.dtype)
tmp1ab = np.zeros((noccb, nvira, nvira, noccb),dtype=t1a.dtype)
tmp1ba = np.zeros((nocca, nvirb, nvirb, nocca),dtype=t1a.dtype)
tmp1bb = np.zeros((noccb, nvirb, nvirb, noccb),dtype=t1a.dtype)
for kn in range(nkpts):
kf = kconserv[km,ke,kn]
ovov = eris.ovov[km,ke,kn] - eris.ovov[km,kf,kn].transpose(0,3,2,1)
OVov = eris.OVov[km,ke,kn]
ovOV = eris.ovOV[km,ke,kn]
OVOV = eris.OVOV[km,ke,kn] - eris.OVOV[km,kf,kn].transpose(0,3,2,1)
tmp1aa -= einsum('niaf,menf->meai',t2aa[kn,ki,ka], ovov)
tmp1aa += einsum('iNaF,meNF->meai',t2ab[ki,kn,ka], ovOV)
tmp1ab += einsum('nIaF,MFne->MeaI',t2ab[kn,ki,ka], eris.OVov[km,kf,kn])
tmp1ba += einsum('iNfA,mfNE->mEAi',t2ab[ki,kn,kf], eris.ovOV[km,kf,kn])
tmp1bb -= einsum('NIAF,MENF->MEAI',t2bb[kn,ki,ka], OVOV)
tmp1bb += einsum('nIfA,MEnf->MEAI',t2ab[kn,ki,kf], OVov)
aebi = einsum('mb,meai->aebi',t1a[km],(ovvo+tmp1aa))
Wvvvo[ka,ke,kb] += aebi
WVVvo[ka,ke,kb] += einsum('mb,mEAi->AEbi',t1a[km], -eris.ooVV[km,ki,ka].transpose(0,3,2,1)+tmp1ba)
WvvVO[ka,ke,kb] += einsum('MB,MeaI->aeBI',t1b[km], -eris.OOvv[km,ki,ka].transpose(0,3,2,1)+tmp1ab)
AEBI = einsum('MB,MEAI->AEBI',t1b[km],(OVVO+tmp1bb))
WVVVO[ka,ke,kb] += AEBI
# Remaining terms
for ka, ke, kb in itertools.product(range(nkpts),repeat=3):
ki = kf = kconserv[ka, ke, kb]
Wvvvo[ka,ke,kb] += eris.vovv[kb,ki,ka].transpose(2,3,0,1) - eris.vovv[ka,ki,kb].transpose(0,3,2,1)
WVVvo[ka,ke,kb] += eris.voVV[kb,ki,ka].transpose(2,3,0,1)
WvvVO[ka,ke,kb] += eris.VOvv[kb,ki,ka].transpose(2,3,0,1)
WVVVO[ka,ke,kb] += eris.VOVV[kb,ki,ka].transpose(2,3,0,1) - eris.VOVV[ka,ki,kb].transpose(0,3,2,1)
Wvvvo[ka,ke,kb] -= lib.einsum('me,miab->aebi',fova[ke],t2aa[ke,ki,ka])
WVVvo[ka,ke,kb] -= lib.einsum('ME,iMbA->AEbi',fovb[ke],t2ab[ki,ke,kb])
WvvVO[ka,ke,kb] -= lib.einsum('me,mIaB->aeBI',fova[ke],t2ab[ke,ki,ka])
WVVVO[ka,ke,kb] -= lib.einsum('ME,MIAB->AEBI',fovb[ke],t2bb[ke,ki,ka])
Wvvvv, WvvVV, WVVVV = get_Wvvvv(cc, t1, t2, eris, ka, kb, ke)
Wvvvo[ka,ke,kb] += lib.einsum('if,aebf->aebi', t1a[ki], Wvvvv)
WVVvo[kb,kf,ka] += lib.einsum('ie,aeBF->BFai', t1a[ke], WvvVV)
WvvVO[ka,ke,kb] += lib.einsum('IF,aeBF->aeBI', t1b[ki], WvvVV)
WVVVO[ka,ke,kb] += lib.einsum('IF,AEBF->AEBI', t1b[ki], WVVVV)
for km in range(nkpts):
kn = kconserv[ka,km,kb]
ovoo = eris.ooov[kn,ki,km].transpose(2,3,0,1) - eris.ooov[km,ki,kn].transpose(0,3,2,1)
ovOO = eris.OOov[kn,ki,km].transpose(2,3,0,1)
ooOV = eris.ooOV[km,ki,kn]
OOov = eris.OOov[km,ki,kn]
OVoo = eris.ooOV[kn,ki,km].transpose(2,3,0,1)
OVOO = eris.OOOV[kn,ki,km].transpose(2,3,0,1) - eris.OOOV[km,ki,kn].transpose(0,3,2,1)
Wvvvo[ka,ke,kb] += 0.5*lib.einsum('meni,mnab->aebi',ovoo,tauaa[km,kn,ka])
WVVvo[ka,ke,kb] += 0.5*lib.einsum('MEni,nMbA->AEbi',OVoo,tauab[kn,km,kb])
WVVvo[ka,ke,kb] += 0.5*lib.einsum('miNE,mNbA->AEbi',ooOV,tauab[km,kn,kb])
WvvVO[ka,ke,kb] += 0.5*lib.einsum('meNI,mNaB->aeBI',ovOO,tauab[km,kn,ka])
WvvVO[ka,ke,kb] += 0.5*lib.einsum('MIne,nMaB->aeBI',OOov,tauab[kn,km,ka])
WVVVO[ka,ke,kb] += 0.5*lib.einsum('MENI,MNAB->AEBI',OVOO,taubb[km,kn,ka])
return Wvvvo, WvvVO, WVVvo, WVVVO
[docs]
def Woooo(cc,t1,t2,eris):
kconserv = cc.khelper.kconserv
t1a, t1b = t1
t2aa, t2ab, t2bb = t2
_, _, nkpts, nocca, noccb, nvira, nvirb = t2ab.shape
dtype = np.result_type(*t2)
Woooo = np.zeros(eris.oooo.shape, dtype=dtype)
WooOO = np.zeros(eris.ooOO.shape, dtype=dtype)
WOOOO = np.zeros(eris.OOOO.shape, dtype=dtype)
tau_aa, tau_ab, tau_bb = make_tau(cc, t2, t1, t1)
for km in range(nkpts):
for kn in range(nkpts):
tmp_aaaaJ = einsum('xje, ymine->yxminj', t1a, eris.ooov[km,:,kn])
tmp_aaaaJ-= einsum('yie, xmjne->yxminj', t1a, eris.ooov[km,:,kn])
tmp_bbbbJ = einsum('xje, ymine->yxminj', t1b, eris.OOOV[km,:,kn])
tmp_bbbbJ-= einsum('yie, xmjne->yxminj', t1b, eris.OOOV[km,:,kn])
#tmp_aabbJ = einsum('xje, ymine->yxminj', t1b, eris.ooOV[km,:,kn])
#tmp_bbaaJ = einsum('xje, ymine->yxminj', t1a, eris.OOov[km,:,kn])
#tmp_abbaJ = -einsum('yie,xmjne->yxminj', t1b, eris.ooOV[km,:,kn])
tmp_baabJ = -einsum('yie,xmjne->yxminj', t1a, eris.OOov[km,:,kn])
tmp_aabbJ = einsum('xje, ymine->yxminj', t1b, eris.ooOV[km,:,kn])
for ki in range(nkpts):
kj = kconserv[km,ki,kn]
Woooo[km,ki,kn] += tmp_aaaaJ[ki,kj]
WOOOO[km,ki,kn] += tmp_bbbbJ[ki,kj]
WooOO[km,ki,kn] += tmp_aabbJ[ki,kj]
WooOO[kn,ki,km] -= tmp_baabJ[ki,kj].transpose(2,1,0,3)
Woooo[km,ki,kn] += eris.oooo[km,ki,kn]
WooOO[km,ki,kn] += eris.ooOO[km,ki,kn]
WOOOO[km,ki,kn] += eris.OOOO[km,ki,kn]
Woooo = Woooo - Woooo.transpose(2,1,0,5,4,3,6)
WOOOO = WOOOO - WOOOO.transpose(2,1,0,5,4,3,6)
for km, ki, kn in itertools.product(range(nkpts), repeat=3):
kj = kconserv[km, ki, kn]
for ke in range(nkpts):
kf = kconserv[km, ke, kn]
ovov = eris.ovov[km, ke, kn] - eris.ovov[km, kf, kn].transpose(0,3,2,1)
OVOV = eris.OVOV[km, ke, kn] - eris.OVOV[km, kf, kn].transpose(0,3,2,1)
Woooo[km, ki, kn] += 0.5*lib.einsum('ijef,menf->minj', tau_aa[ki, kj, ke], ovov)
WOOOO[km, ki, kn] += 0.5*lib.einsum('IJEF,MENF->MINJ', tau_bb[ki, kj, ke], OVOV)
WooOO[km, ki, kn] += lib.einsum('iJeF,meNF->miNJ', tau_ab[ki, kj, ke], eris.ovOV[km, ke, kn])
WOOoo = None
return Woooo, WooOO, WOOoo, WOOOO
[docs]
def Woovo(cc,t1,t2,eris):
kconserv = cc.khelper.kconserv
t1a, t1b = t1
t2aa, t2ab, t2bb = t2
nkpts, nocca, noccb, nvira, nvirb = t2ab.shape[2:]
dtype = np.result_type(*t2)
Woovo = np.zeros((nkpts, nkpts, nkpts, nocca, nocca, nvira, nocca), dtype=dtype)
WooVO = np.zeros((nkpts, nkpts, nkpts, nocca, nocca, nvirb, noccb), dtype=dtype)
WOOvo = np.zeros((nkpts, nkpts, nkpts, noccb, noccb, nvira, nocca), dtype=dtype)
WOOVO = np.zeros((nkpts, nkpts, nkpts, noccb, noccb, nvirb, noccb), dtype=dtype)
for km, kb, ki in kpts_helper.loop_kkk(nkpts):
kj = kconserv[km, ki, kb]
Woovo[km,ki,kb] += eris.ooov[ki,km,kj].transpose(1,0,3,2).conj()
Woovo[km,ki,kb] -= eris.ooov[kj,km,ki].transpose(1,2,3,0).conj()
WooVO[km,ki,kb] += eris.ooOV[ki,km,kj].transpose(1,0,3,2).conj()
WOOvo[km,ki,kb] += eris.OOov[ki,km,kj].transpose(1,0,3,2).conj()
WOOVO[km,ki,kb] += eris.OOOV[ki,km,kj].transpose(1,0,3,2).conj()
WOOVO[km,ki,kb] -= eris.OOOV[kj,km,ki].transpose(1,2,3,0).conj()
for kn in range(nkpts):
ke = kconserv[km,ki,kn]
ooov = eris.ooov[km,ki,kn] - eris.ooov[kn,ki,km].transpose(2,1,0,3)
OOOV = eris.OOOV[km,ki,kn] - eris.OOOV[kn,ki,km].transpose(2,1,0,3)
Woovo[km,ki,kb] += einsum('mine,jnbe->mibj', ooov, t2aa[kj,kn,kb])
Woovo[km,ki,kb] += einsum('miNE,jNbE->mibj', eris.ooOV[km,ki,kn], t2ab[kj,kn,kb])
WooVO[km,ki,kb] += einsum('mine,nJeB->miBJ', ooov, t2ab[kn,kj,ke])
WooVO[km,ki,kb] += einsum('miNE,JNBE->miBJ', eris.ooOV[km,ki,kn], t2bb[kj,kn,kb])
WOOvo[km,ki,kb] += einsum('MINE,jNbE->MIbj', OOOV, t2ab[kj,kn,kb])
WOOvo[km,ki,kb] += einsum('MIne,jnbe->MIbj', eris.OOov[km,ki,kn], t2aa[kj,kn,kb])
WOOVO[km,ki,kb] += einsum('MINE,JNBE->MIBJ', OOOV, t2bb[kj,kn,kb])
WOOVO[km,ki,kb] += einsum('MIne,nJeB->MIBJ', eris.OOov[km,ki,kn], t2ab[kn,kj,ke])
# P(ij)
ke = kconserv[km,kj,kn]
ooov = eris.ooov[km,kj,kn] - eris.ooov[kn,kj,km].transpose(2,1,0,3)
OOOV = eris.OOOV[km,kj,kn] - eris.OOOV[kn,kj,km].transpose(2,1,0,3)
Woovo[km,ki,kb] -= einsum('mjne,inbe->mibj', ooov, t2aa[ki,kn,kb])
Woovo[km,ki,kb] -= einsum('mjNE,iNbE->mibj', eris.ooOV[km,kj,kn], t2ab[ki,kn,kb])
WooVO[km,ki,kb] -= einsum('NJme,iNeB->miBJ', eris.OOov[kn,kj,km], t2ab[ki,kn,ke])
WOOvo[km,ki,kb] -= einsum('njME,nIbE->MIbj', eris.ooOV[kn,kj,km], t2ab[kn,ki,kb])
WOOVO[km,ki,kb] -= einsum('MJNE,INBE->MIBJ', OOOV, t2bb[ki,kn,kb])
WOOVO[km,ki,kb] -= einsum('MJne,nIeB->MIBJ', eris.OOov[km,kj,kn], t2ab[kn,ki,ke])
ovvo = eris.voov[ki,km,kj].transpose(1,0,3,2).conj() - eris.oovv[km,kj,kb].transpose(0,3,2,1)
OVVO = eris.VOOV[ki,km,kj].transpose(1,0,3,2).conj() - eris.OOVV[km,kj,kb].transpose(0,3,2,1)
ovVO = eris.voOV[ki,km,kj].transpose(1,0,3,2).conj()
OVvo = eris.VOov[ki,km,kj].transpose(1,0,3,2).conj()
Woovo[km,ki,kb] += einsum('ie,mebj->mibj', t1a[ki], ovvo)
WooVO[km,ki,kb] += einsum('ie,meBJ->miBJ', t1a[ki], ovVO)
WOOvo[km,ki,kb] += einsum('IE,MEbj->MIbj', t1b[ki], OVvo)
WOOVO[km,ki,kb] += einsum('IE,MEBJ->MIBJ', t1b[ki], OVVO)
#P(ij)
ovvo = eris.voov[kj,km,ki].transpose(1,0,3,2).conj() - eris.oovv[km,ki,kb].transpose(0,3,2,1)
OVVO = eris.VOOV[kj,km,ki].transpose(1,0,3,2).conj() - eris.OOVV[km,ki,kb].transpose(0,3,2,1)
Woovo[km,ki,kb] -= einsum('je,mebi->mibj', t1a[kj], ovvo)
WooVO[km,ki,kb] -= -einsum('JE,miBE->miBJ', t1b[kj], eris.ooVV[km,ki,kb])
WOOvo[km,ki,kb] -= -einsum('je,MIbe->MIbj', t1a[kj], eris.OOvv[km,ki,kb])
WOOVO[km,ki,kb] -= einsum('JE,MEBI->MIBJ', t1b[kj], OVVO)
for kf in range(nkpts):
kn = kconserv[kb, kj, kf]
ovov = eris.ovov[km,ki,kn] - eris.ovov[km,kf,kn].transpose(0,3,2,1)
OVOV = eris.OVOV[km,ki,kn] - eris.OVOV[km,kf,kn].transpose(0,3,2,1)
Woovo[km,ki,kb] -= (einsum('ie,njbf,menf->mibj', t1a[ki], t2aa[kn,kj,kb], ovov) -
einsum('ie,jNbF,meNF->mibj', t1a[ki], t2ab[kj,kn,kb], eris.ovOV[km,ki,kn]))
WooVO[km,ki,kb] -= (-einsum('ie,nJfB,menf->miBJ', t1a[ki], t2ab[kn,kj,kf], ovov) +
einsum('ie,NJBF,meNF->miBJ', t1a[ki], t2bb[kn,kj,kb], eris.ovOV[km,ki,kn]))
WOOvo[km,ki,kb] -= (-einsum('IE,jNbF,MENF->MIbj', t1b[ki], t2ab[kj,kn,kb], OVOV) +
einsum('IE,njbf,MEnf->MIbj', t1b[ki], t2aa[kn,kj,kb], eris.OVov[km,ki,kn]))
WOOVO[km,ki,kb] -= (einsum('IE,NJBF,MENF->MIBJ', t1b[ki], t2bb[kn,kj,kb], OVOV) -
einsum('IE,nJfB,MEnf->MIBJ', t1b[ki], t2ab[kn,kj,kf], eris.OVov[km,ki,kn]))
#P(ij)
kn = kconserv[kb, ki, kf]
ovov = eris.ovov[km,kj,kn] - eris.ovov[km,kf,kn].transpose(0,3,2,1)
OVOV = eris.OVOV[km,kj,kn] - eris.OVOV[km,kf,kn].transpose(0,3,2,1)
Woovo[km,ki,kb] += (einsum('je,nibf,menf->mibj', t1a[kj], t2aa[kn,ki,kb], ovov) -
einsum('je,iNbF,meNF->mibj', t1a[kj], t2ab[ki,kn,kb], eris.ovOV[km,kj,kn]))
WooVO[km,ki,kb] += -einsum('JE,iNfB,mfNE->miBJ', t1b[kj], t2ab[ki,kn,kf], eris.ovOV[km, kf, kn])
WOOvo[km,ki,kb] += -einsum('je,nIbF,MFne->MIbj', t1a[kj], t2ab[kn,ki,kb], eris.OVov[km, kf, kn])
WOOVO[km,ki,kb] += (einsum('JE,NIBF,MENF->MIBJ', t1b[kj], t2bb[kn,ki,kb], OVOV) -
einsum('JE,nIfB,MEnf->MIBJ', t1b[kj], t2ab[kn,ki,kf], eris.OVov[km,kj,kn]))
Fme, FME = Fov(cc, t1, t2, eris)
Wminj, WmiNJ, WMInj, WMINJ = Woooo(cc,t1,t2,eris)
tauaa, tauab, taubb = make_tau(cc, t2, t1, t1, fac=1.)
for km, kb, ki in kpts_helper.loop_kkk(nkpts):
kj = kconserv[km, ki, kb]
Woovo[km,ki,kb] -= einsum('me,ijbe->mibj', Fme[km], t2aa[ki,kj,kb])
WooVO[km,ki,kb] -= -einsum('me,iJeB->miBJ', Fme[km], t2ab[ki,kj,km])
WOOvo[km,ki,kb] -= -einsum('ME,jIbE->MIbj', FME[km], t2ab[kj,ki,kb])
WOOVO[km,ki,kb] -= einsum('ME,IJBE->MIBJ', FME[km], t2bb[ki,kj,kb])
Woovo[km,ki,kb] -= einsum('nb, minj->mibj', t1a[kb], Wminj[km, ki, kb])
WooVO[km,ki,kb] -= einsum('NB, miNJ->miBJ', t1b[kb], WmiNJ[km, ki, kb])
WOOvo[km,ki,kb] -= einsum('nb, njMI->MIbj', t1a[kb], WmiNJ[kb, kj, km])
WOOVO[km,ki,kb] -= einsum('NB, MINJ->MIBJ', t1b[kb], WMINJ[km, ki, kb])
for km, kb, ki in kpts_helper.loop_kkk(nkpts):
kj = kconserv[km, ki, kb]
for ke in range(nkpts):
kf = kconserv[km,ke,kb]
ovvv = eris.vovv[ke,km,kf].transpose(1,0,3,2).conj() - eris.vovv[kf,km,ke].transpose(1,2,3,0).conj()
OVVV = eris.VOVV[ke,km,kf].transpose(1,0,3,2).conj() - eris.VOVV[kf,km,ke].transpose(1,2,3,0).conj()
ovVV = eris.voVV[ke,km,kf].transpose(1,0,3,2).conj()
OVvv = eris.VOvv[ke,km,kf].transpose(1,0,3,2).conj()
Woovo[km,ki,kb] += 0.5 * einsum('mebf,ijef->mibj', ovvv, tauaa[ki,kj,ke])
WooVO[km,ki,kb] += einsum('meBF,iJeF->miBJ', ovVV, tauab[ki,kj,ke])
WOOvo[km,ki,kb] += einsum('MEbf,jIfE->MIbj', OVvv, tauab[kj,ki,kf])
WOOVO[km,ki,kb] += 0.5 * einsum('MEBF,IJEF->MIBJ', OVVV, taubb[ki,kj,ke])
return Woovo, WooVO, WOOvo, WOOVO
[docs]
def Wooov(cc, t1, t2, eris, kconserv):
t1a, t1b = t1
Wooov = eris.ooov - np.asarray(eris.ooov).transpose(2,1,0,5,4,3,6)
WooOV = np.array(eris.ooOV, copy=True)
WOOov = np.array(eris.OOov, copy=True)
WOOOV = eris.OOOV - np.asarray(eris.OOOV).transpose(2,1,0,5,4,3,6)
Wooov += einsum('yif,xyzmfne->xyzmine', t1a, eris.ovov) - einsum('yif, zyxnfme->xyzmine', t1a, eris.ovov)
WooOV += einsum('yif,xyzmfNE->xyzmiNE', t1a, eris.ovOV)
WOOov += einsum('yIF,xyzMFne->xyzMIne', t1b, eris.OVov)
WOOOV += einsum('yIF,xyzMFNE->xyzMINE', t1b, eris.OVOV) - einsum('yIF, zyxNFME->xyzMINE', t1b, eris.OVOV)
return Wooov, WooOV, WOOov, WOOOV
[docs]
def Wovvo(cc, t1, t2, eris):
kconserv = cc.khelper.kconserv
t1a, t1b = t1
t2aa, t2ab, t2bb = t2
nkpts, nocca, noccb, nvira, nvirb = t2ab.shape[2:]
Wovvo, WovVO, WOVvo, WOVVO, WoVVo, WOvvO = cc_Wovvo(cc,t1,t2,eris)
for km, kb, ke in kpts_helper.loop_kkk(nkpts):
kj = kconserv[km, ke, kb]
for kn in range(nkpts):
kf = kconserv[km, ke, kn]
Wovvo[km,ke,kb] += 0.5 * einsum('jnbf,menf->mebj', t2aa[kj,kn,kb], eris.ovov[km,ke,kn])
Wovvo[km,ke,kb] -= 0.5 * einsum('jnbf,mfne->mebj', t2aa[kj,kn,kb], eris.ovov[km,kf,kn])
Wovvo[km,ke,kb] += 0.5 * einsum('jNbF,meNF->mebj', t2ab[kj,kn,kb], eris.ovOV[km,ke,kn])
WOVvo[km,ke,kb] += 0.5 * einsum('jNbF,MENF->MEbj', t2ab[kj,kn,kb], eris.OVOV[km,ke,kn])
WOVvo[km,ke,kb] -= 0.5 * einsum('jNbF,MFNE->MEbj', t2ab[kj,kn,kb], eris.OVOV[km,kf,kn])
WOVvo[km,ke,kb] += 0.5 * einsum('jnbf,MEnf->MEbj', t2aa[kj,kn,kb], eris.OVov[km,ke,kn])
WovVO[km,ke,kb] += 0.5 * einsum('nJfB,menf->meBJ', t2ab[kn,kj,kf], eris.ovov[km,ke,kn])
WovVO[km,ke,kb] -= 0.5 * einsum('nJfB,mfne->meBJ', t2ab[kn,kj,kf], eris.ovov[km,kf,kn])
WovVO[km,ke,kb] += 0.5 * einsum('JNBF,meNF->meBJ', t2bb[kj,kn,kb], eris.ovOV[km,ke,kn])
WOVVO[km,ke,kb] += 0.5 * einsum('JNBF,MENF->MEBJ', t2bb[kj,kn,kb], eris.OVOV[km,ke,kn])
WOVVO[km,ke,kb] -= 0.5 * einsum('JNBF,MFNE->MEBJ', t2bb[kj,kn,kb], eris.OVOV[km,kf,kn])
WOVVO[km,ke,kb] += 0.5 * einsum('nJfB,MEnf->MEBJ', t2ab[kn,kj,kf], eris.OVov[km,ke,kn])
return Wovvo, WovVO, WOVvo, WOVVO
[docs]
def W1oovv(cc, t1, t2, eris):
kconserv = cc.khelper.kconserv
dtype = np.result_type(*t1)
t1a, t1b = t1
t2aa, t2ab, t2bb = t2
nkpts, nocc, nvir = t1a.shape
Woovv = np.zeros(eris.oovv.shape, dtype=dtype)
WooVV = np.zeros(eris.ooVV.shape, dtype=dtype)
WOOvv = np.zeros(eris.OOvv.shape, dtype=dtype)
WOOVV = np.zeros(eris.OOVV.shape, dtype=dtype)
for kk in range(nkpts):
for ki in range(nkpts):
for kb in range(nkpts):
kd = kconserv[kk,ki,kb]
Woovv[kk,ki,kb] += eris.oovv[kk,ki,kb]
Woovv[kk,ki,kb] -= eris.voov[kb,ki,kk].transpose(2,1,0,3)
WooVV[kk,ki,kb] += eris.ooVV[kk,ki,kb]
WOOvv[kk,ki,kb] += eris.OOvv[kk,ki,kb]
WOOVV[kk,ki,kb] += eris.OOVV[kk,ki,kb]
WOOVV[kk,ki,kb] -= eris.VOOV[kb,ki,kk].transpose(2,1,0,3)
for kl in range(nkpts):
kc = kconserv[ki,kb,kl]
Woovv[kk,ki,kb] -= einsum('lckd,ilbc->kibd', eris.ovov[kl,kc,kk], t2aa[ki,kl,kb])
Woovv[kk,ki,kb] += einsum('ldkc,ilbc->kibd', eris.ovov[kl,kd,kk], t2aa[ki,kl,kb])
Woovv[kk,ki,kb] -= einsum('LCkd,iLbC->kibd', eris.OVov[kl,kc,kk], t2ab[ki,kl,kb])
WooVV[kk,ki,kb] -= einsum('kcLD,iLcB->kiBD', eris.ovOV[kk,kc,kl], t2ab[ki,kl,kc])
WOOvv[kk,ki,kb] -= einsum('KCld,lIbC->KIbd', eris.OVov[kk,kc,kl], t2ab[kl,ki,kb])
WOOVV[kk,ki,kb] -= einsum('LCKD,ILBC->KIBD', eris.OVOV[kl,kc,kk], t2bb[ki,kl,kb])
WOOVV[kk,ki,kb] += einsum('LDKC,ILBC->KIBD', eris.OVOV[kl,kd,kk], t2bb[ki,kl,kb])
WOOVV[kk,ki,kb] -= einsum('lcKD,lIcB->KIBD', eris.ovOV[kl,kc,kk], t2ab[kl,ki,kc])
return Woovv, WooVV, WOOvv, WOOVV
[docs]
def W2oovv(cc, t1, t2, eris):
kconserv = cc.khelper.kconserv
dtype = np.result_type(*t1)
t1a, t1b = t1
t2aa, t2ab, t2bb = t2
nkpts, nocc, nvir = t1a.shape
Woovv = np.zeros(eris.oovv.shape, dtype=dtype)
WooVV = np.zeros(eris.ooVV.shape, dtype=dtype)
WOOvv = np.zeros(eris.OOvv.shape, dtype=dtype)
WOOVV = np.zeros(eris.OOVV.shape, dtype=dtype)
WWooov, WWooOV, WWOOov, WWOOOV = Wooov(cc, t1, t2, eris, kconserv)
for kk in range(nkpts):
for ki in range(nkpts):
for kb in range(nkpts):
kd = kconserv[kk,ki,kb]
Woovv[kk,ki,kb] += einsum('kild,lb->kibd',WWooov[kk,ki,kb],-t1a[kb])
WooVV[kk,ki,kb] += einsum('kiLD,LB->kiBD',WWooOV[kk,ki,kb],-t1b[kb])
WOOvv[kk,ki,kb] += einsum('KIld,lb->KIbd',WWOOov[kk,ki,kb],-t1a[kb])
WOOVV[kk,ki,kb] += einsum('KILD,LB->KIBD',WWOOOV[kk,ki,kb],-t1b[kb])
Woovv[kk,ki,kb] += einsum('ckdb,ic->kibd', eris.vovv[ki,kk,kd].conj(), t1a[ki])
Woovv[kk,ki,kb] -= einsum('dkcb,ic->kibd', eris.vovv[kd,kk,ki].conj(), t1a[ki])
WooVV[kk,ki,kb] += einsum('ckDB,ic->kiBD', eris.voVV[ki,kk,kd].conj(), t1a[ki])
WOOvv[kk,ki,kb] += einsum('CKdb,IC->KIbd', eris.VOvv[ki,kk,kd].conj(), t1b[ki])
WOOVV[kk,ki,kb] += einsum('CKDB,IC->KIBD', eris.VOVV[ki,kk,kd].conj(), t1b[ki])
WOOVV[kk,ki,kb] -= einsum('DKCB,IC->KIBD', eris.VOVV[kd,kk,ki].conj(), t1b[ki])
return Woovv, WooVV, WOOvv, WOOVV
[docs]
def Woovv(cc, t1, t2, eris):
t1a, t1b = t1
nkpts, nocc, nvir = t1a.shape
Woovv, WooVV, WOOvv, WOOVV = W1oovv(cc, t1, t2, eris)
WWoovv, WWooVV, WWOOvv, WWOOVV = W2oovv(cc, t1, t2, eris)
for kk,ki,kb in itertools.product(range(nkpts), repeat=3):
Woovv[kk,ki,kb] = Woovv[kk,ki,kb] + WWoovv[kk,ki,kb]
WooVV[kk,ki,kb] = WooVV[kk,ki,kb] + WWooVV[kk,ki,kb]
WOOvv[kk,ki,kb] = WOOvv[kk,ki,kb] + WWOOvv[kk,ki,kb]
WOOVV[kk,ki,kb] = WOOVV[kk,ki,kb] + WWOOVV[kk,ki,kb]
return Woovv, WooVV, WOOvv, WOOVV
# vvvv is a string, ('oooo', 'ooov', ..., 'vvvv')
# orbspin can be accessed through general spin-orbital kintermediates eris
# orbspin = eris.mo_coeff.orbspin
def _eri_spin2spatial(chemist_eri_spin, vvvv, eris, nocc, orbspin, cross_ab=False):
nocc_a, nocc_b = nocc
nocc = nocc_a + nocc_b
nkpts = len(orbspin)
idxoa = [np.where(orbspin[k][:nocc] == 0)[0] for k in range(nkpts)]
idxob = [np.where(orbspin[k][:nocc] == 1)[0] for k in range(nkpts)]
idxva = [np.where(orbspin[k][nocc:] == 0)[0] for k in range(nkpts)]
idxvb = [np.where(orbspin[k][nocc:] == 1)[0] for k in range(nkpts)]
def select_idx(s):
if s.lower() == 'o':
return idxoa, idxob
else:
return idxva, idxvb
if len(vvvv) == 2:
idx1a, idx1b = select_idx(vvvv[0])
idx2a, idx2b = select_idx(vvvv[1])
fa = np.zeros((nkpts,len(idx1a[0]),len(idx2a[0])), dtype=np.complex128)
fb = np.zeros((nkpts,len(idx1b[0]),len(idx2b[0])), dtype=np.complex128)
for k in range(nkpts):
fa[k] = chemist_eri_spin[k, idx1a[k][:,None],idx2a[k]]
fb[k] = chemist_eri_spin[k, idx1b[k][:,None],idx2b[k]]
return fa, fb
idx1a, idx1b = select_idx(vvvv[0])
idx2a, idx2b = select_idx(vvvv[1])
idx3a, idx3b = select_idx(vvvv[2])
idx4a, idx4b = select_idx(vvvv[3])
eri_aaaa = np.zeros((nkpts,nkpts,nkpts,len(idx1a[0]),len(idx2a[0]),len(idx3a[0]),len(idx4a[0])), dtype=np.complex128) # noqa: E501
eri_aabb = np.zeros((nkpts,nkpts,nkpts,len(idx1a[0]),len(idx2a[0]),len(idx3b[0]),len(idx4b[0])), dtype=np.complex128) # noqa: E501
eri_bbaa = np.zeros((nkpts,nkpts,nkpts,len(idx1b[0]),len(idx2b[0]),len(idx3a[0]),len(idx4a[0])), dtype=np.complex128) # noqa: E501
eri_bbbb = np.zeros((nkpts,nkpts,nkpts,len(idx1b[0]),len(idx2b[0]),len(idx3b[0]),len(idx4b[0])), dtype=np.complex128) # noqa: E501
if cross_ab:
eri_abba = np.zeros((nkpts,nkpts,nkpts,len(idx1a[0]),len(idx2b[0]),len(idx3b[0]),len(idx4a[0])), dtype=np.complex128) # noqa: E501
eri_baab = np.zeros((nkpts,nkpts,nkpts,len(idx1b[0]),len(idx2a[0]),len(idx3a[0]),len(idx4b[0])), dtype=np.complex128) # noqa: E501
kconserv = kpts_helper.get_kconserv(eris.cell, eris.kpts)
for ki, kj, kk in kpts_helper.loop_kkk(nkpts):
kl = kconserv[ki, kj, kk]
eri_aaaa[ki,kj,kk] = chemist_eri_spin[ki,kj,kk, idx1a[ki][:,None,None,None],idx2a[kj][:,None,None],idx3a[kk][:,None],idx4a[kl]] # noqa: E501
eri_aabb[ki,kj,kk] = chemist_eri_spin[ki,kj,kk, idx1a[ki][:,None,None,None],idx2a[kj][:,None,None],idx3b[kk][:,None],idx4b[kl]] # noqa: E501
eri_bbaa[ki,kj,kk] = chemist_eri_spin[ki,kj,kk, idx1b[ki][:,None,None,None],idx2b[kj][:,None,None],idx3a[kk][:,None],idx4a[kl]] # noqa: E501
eri_bbbb[ki,kj,kk] = chemist_eri_spin[ki,kj,kk, idx1b[ki][:,None,None,None],idx2b[kj][:,None,None],idx3b[kk][:,None],idx4b[kl]] # noqa: E501
if cross_ab:
eri_abba[ki,kj,kk] = chemist_eri_spin[ki,kj,kk, idx1a[ki][:,None,None,None],idx2b[kj][:,None,None],idx3b[kk][:,None],idx4a[kl]] # noqa: E501
eri_baab[ki,kj,kk] = chemist_eri_spin[ki,kj,kk, idx1b[ki][:,None,None,None],idx2a[kj][:,None,None],idx3a[kk][:,None],idx4b[kl]] # noqa: E501
if cross_ab:
return eri_aaaa, eri_aabb, eri_bbaa, eri_bbbb, eri_abba, eri_baab
else:
return eri_aaaa, eri_aabb, eri_bbaa, eri_bbbb
def _eri_spatial2spin(eri_aa_ab_ba_bb, vvvv, eris, orbspin, cross_ab=False):
nocc_a, nocc_b = eris.nocc
nocc = nocc_a + nocc_b
nkpts = len(orbspin)
idxoa = [np.where(orbspin[k][:nocc] == 0)[0] for k in range(nkpts)]
idxob = [np.where(orbspin[k][:nocc] == 1)[0] for k in range(nkpts)]
idxva = [np.where(orbspin[k][nocc:] == 0)[0] for k in range(nkpts)]
idxvb = [np.where(orbspin[k][nocc:] == 1)[0] for k in range(nkpts)]
def select_idx(s):
if s.lower() == 'o':
return idxoa, idxob
else:
return idxva, idxvb
if len(vvvv) == 2:
idx1a, idx1b = select_idx(vvvv[0])
idx2a, idx2b = select_idx(vvvv[1])
fa, fb = eri_aa_ab_ba_bb
f = np.zeros((nkpts, len(idx1a[0])+len(idx1b[0]),
len(idx2a[0])+len(idx2b[0])), dtype=np.complex128)
for k in range(nkpts):
f[k, idx1a[k][:,None],idx2a[k]] = fa[k]
f[k, idx1b[k][:,None],idx2b[k]] = fb[k]
return f
idx1a, idx1b = select_idx(vvvv[0])
idx2a, idx2b = select_idx(vvvv[1])
idx3a, idx3b = select_idx(vvvv[2])
idx4a, idx4b = select_idx(vvvv[3])
if cross_ab:
eri_aaaa, eri_aabb, eri_bbaa, eri_bbbb, eri_abba, eri_baab = eri_aa_ab_ba_bb
else:
eri_aaaa, eri_aabb, eri_bbaa, eri_bbbb = eri_aa_ab_ba_bb
eri = np.zeros((nkpts,nkpts,nkpts, len(idx1a[0])+len(idx1b[0]),
len(idx2a[0])+len(idx2b[0]),
len(idx3a[0])+len(idx3b[0]),
len(idx4a[0])+len(idx4b[0])), dtype=np.complex128)
kconserv = kpts_helper.get_kconserv(eris.cell, eris.kpts)
for ki, kj, kk in kpts_helper.loop_kkk(nkpts):
kl = kconserv[ki, kj, kk]
eri[ki,kj,kk, idx1a[ki][:,None,None,None],idx2a[kj][:,None,None],idx3a[kk][:,None],idx4a[kl]] = eri_aaaa[ki,kj,kk] # noqa: E501
eri[ki,kj,kk, idx1a[ki][:,None,None,None],idx2a[kj][:,None,None],idx3b[kk][:,None],idx4b[kl]] = eri_aabb[ki,kj,kk] # noqa: E501
eri[ki,kj,kk, idx1b[ki][:,None,None,None],idx2b[kj][:,None,None],idx3a[kk][:,None],idx4a[kl]] = eri_bbaa[ki,kj,kk] # noqa: E501
eri[ki,kj,kk, idx1b[ki][:,None,None,None],idx2b[kj][:,None,None],idx3b[kk][:,None],idx4b[kl]] = eri_bbbb[ki,kj,kk] # noqa: E501
if cross_ab:
eri[ki,kj,kk, idx1a[ki][:,None,None,None],idx2b[kj][:,None,None],idx3b[kk][:,None],idx4a[kl]] = eri_abba[ki,kj,kk] # noqa: E501
eri[ki,kj,kk, idx1b[ki][:,None,None,None],idx2a[kj][:,None,None],idx3a[kk][:,None],idx4b[kl]] = eri_baab[ki,kj,kk] # noqa: E501
return eri