def build_Dvv(self,t1,t2,l1,l2): o = self.o v = self.v self.Dvv = ndot('ka,bk->ab',t1,l1) self.Dvv += ndot('klca,cbkl->ab',t2,l2) return self.Dvv
def build_Doo(self,t1,t2,l1,l2): o = self.o v = self.v self.Doo = ndot('jc,ci->ij',t1,l1,prefactor=-1) self.Doo -= ndot('kjcd,cdki->ij',t2,l2) return self.Doo
def build_Doo(self, t1=None,t2=None,l1=None,l2=None): if t1 is None: t1 = self.t1 if t2 is None: t2 = self.t2 if l1 is None: l1 = self.l1 if l2 is None: l2 = self.l2 self.Doo = ndot('jc,ci->ij',t1,l1,prefactor=-1) self.Doo -= ndot('kjcd,cdki->ij',t2,l2,prefactor=0.5) return self.Doo
def build_Dvv(self, t1=None,t2=None,l1=None,l2=None): if t1 is None: t1 = self.t1 if t2 is None: t2 = self.t2 if l1 is None: l1 = self.l1 if l2 is None: l2 = self.l2 self.Dvv = ndot('ka,bk->ab',t1,l1) self.Dvv += ndot('klca,cbkl->ab',t2,l2,prefactor=0.5) return self.Dvv
def compute_pseudoenergy(self, F=None,l1=None,l2=None): if F is None: F = self.F if l1 is None: l1 = self.l1 if l2 is None: l2 = self.l2 o = self.o v = self.v e = ndot('ai,ia->',l1,F[o,v]) e += ndot('abij,ijab->',l2,self.TEI[o,o,v,v],prefactor=0.25) return e
def build_Fme(self, F=None,t1=None): if F is None: F = self.F if t1 is None: t1 = self.t1 o = self.o v = self.v Fme = F[o,v].copy() + 1j*0.0 Fme += ndot('nf,mnef->me',t1,self.TEI[o,o,v,v],prefactor=2) Fme += ndot('nf,mnfe->me',t1,self.TEI[o,o,v,v],prefactor=-1) return Fme # Fme
def build_Dov(self,t1,t2,l1,l2): o = self.o v = self.v self.Dov = 2*t1.copy() self.Dov += ndot('ikac,ck->ia',t2,l1,prefactor=2) self.Dov -= ndot('ikca,ck->ia',t2,l1) tmp = ndot('ka,ck->ca',t1,l1) self.Dov -= ndot('ic,ca->ia',t1,tmp) self.Dov -= contract('la,kicd,cdkl->ia',t1,t2,l2) self.Dov -= contract('id,klca,cdkl->ia',t1,t2,l2) return self.Dov
def build_Foo(self, F=None,t1=None,t2=None): if F is None: F = self.F if t1 is None: t1 = self.t1 if t2 is None: t2 = self.t2 o = self.o v = self.v Foo = F[o,o].copy() + 1j*0.0 Foo += ndot('ie,me->mi',t1,F[o,v],prefactor=0.5) Foo += ndot('ne,mnie->mi',t1,self.TEI[o,o,o,v]) Foo += ndot('inef,mnef->mi',self.build_tau_tilde(t1,t2),self.TEI[o,o,v,v],prefactor=0.5) return Foo # Fmi
def build_Fvv(self, F=None,t1=None,t2=None): if F is None: F = self.F if t1 is None: t1 = self.t1 if t2 is None: t2 = self.t2 o = self.o v = self.v Fvv = F[v,v].copy() + 1j*0.0 Fvv -= ndot('ma,me->ae',t1,F[o,v],prefactor=0.5) Fvv += ndot('mf,mafe->ae',t1,self.TEI[o,v,v,v]) Fvv -= ndot('mnaf,mnef->ae',self.build_tau_tilde(t1,t2),self.TEI[o,o,v,v],prefactor=0.5) return Fvv # Fae
def build_Wmnij(self, t1=None,t2=None): if t1 is None: t1 = self.t1 if t2 is None: t2 = self.t2 o = self.o v = self.v W = self.TEI[o,o,o,o].copy() # V(ijkl) W = W + ndot('ijef,mnef->mnij',self.build_tau(t1,t2),self.TEI[o,o,v,v]) W += ndot('je,mnie->mnij',t1,self.TEI[o,o,o,v]) W += ndot('ie,mnej->mnij',t1,self.TEI[o,o,v,o]) ## test return W # Wmnij
def build_Dov(self, t1=None,t2=None,l1=None,l2=None): if t1 is None: t1 = self.t1 if t2 is None: t2 = self.t2 if l1 is None: l1 = self.l1 if l2 is None: l2 = self.l2 self.Dov = t1.copy() self.Dov += ndot('ikac,ck->ia',t2,l1) tmp = ndot('ka,ck->ca',t1,l1) self.Dov -= ndot('ic,ca->ia',t1,tmp) self.Dov -= 0.5*contract('la,kicd,cdkl->ia',t1,t2,l2) self.Dov -= 0.5*contract('id,klca,cdkl->ia',t1,t2,l2) return self.Dov
def build_Wabef(self,ccsd, t1=None,t2=None): # < ab | Hbar | ef > if t1 is None: t1 = self.t1 if t2 is None: t2 = self.t2 o = self.o v = self.v tau = ccsd.build_tau(t1,t2) W = self.TEI[v,v,v,v].copy() + 1j*0.0 W += ndot('mnab,mnef->abef',tau,self.TEI[o,o,v,v]) W -= ndot('mb,amef->abef',t1,self.TEI[v,o,v,v]) W -= ndot('ma,bmfe->abef',t1,self.TEI[v,o,v,v]) return W # Wabef
def compute_corr_energy(self, F=None,t1=None,t2=None): if F is None: F = self.F if t1 is None: t1 = self.t1 if t2 is None: t2 = self.t2 o = self.o v = self.v e = ndot('ia,ia->',F[o,v],t1) e += ndot('ijab,abij->',self.build_tau(t1,t2),self.TEI[v,v,o,o],prefactor=2) e += ndot('ijab,abji->',self.build_tau(t1,t2),self.TEI[v,v,o,o],prefactor=-1) self.e_ccsd = e.real self.E_ccsd = e.real + self.e_scf return e
def build_Wmbje(self, t1=None,t2=None): if t1 is None: t1 = self.t1 if t2 is None: t2 = self.t2 o = self.o v = self.v W = -1.0 * self.TEI[o,v,o,v].copy() # V(mbje) W = W - ndot('jf,mbfe->mbje',t1,self.TEI[o,v,v,v]) W += ndot('nb,mnje->mbje',t1,self.TEI[o,o,o,v]) tmp = 0.5 * t2 + ndot('jf,nb->jnfb',t1,t1) W += ndot('jnfb,mnfe->mbje',tmp,self.TEI[o,o,v,v]) return W # Wmbje
def build_Wmbje(self,ccsd, t1=None,t2=None): # < mb | Hbar | je > if t1 is None: t1 = self.t1 if t2 is None: t2 = self.t2 o = self.o v = self.v tau = ccsd.build_tau(t1,t2) W = self.TEI[o,v,o,v].copy() + 1j*0.0 W -= ndot('jnfb,nmef->mbje',tau,self.TEI[o,o,v,v]) W += ndot('jf,bmef->mbje',t1,self.TEI[v,o,v,v]) W -= ndot('nb,mnje->mbje',t1,self.TEI[o,o,o,v]) return W # Wmbje
def build_Woooo(self, t1=None,t2=None): if t1 is None: t1 = self.t1 if t2 is None: t2 = self.t2 o = self.o v = self.v W = self.TEI[o,o,o,o].copy() # V(ijkl) W = W + ndot('ijef,mnef->mnij',self.build_tau(t1,t2),self.TEI[o,o,v,v],prefactor=0.25) Pij = ndot('je,mnie->mnij',t1,self.TEI[o,o,o,v]) W += Pij W -= Pij.swapaxes(2,3) return W # Wmnij
def build_Wvvvv(self, t1=None,t2=None): if t1 is None: t1 = self.t1 if t2 is None: t2 = self.t2 o = self.o v = self.v W = self.TEI[v,v,v,v].copy() W = W + ndot('mnab,mnef->abef', self.build_tau(t1,t2), self.TEI[o,o,v,v], prefactor=0.25) Pab = ndot('mb,amef->abef', t1, self.TEI[v,o,v,v]) W -= Pab W += Pab.swapaxes(0, 1) return W # Wabef
def build_Fmi(self,ccsd, F=None,t1=None,t2=None): # < m | Hbar | i > if F is None: F = self.F if t1 is None: t1 = self.t1 if t2 is None: t2 = self.t2 o = self.o v = self.v Fmi = F[o,o].copy() + 1j*0.0 Fmi += ndot('ie,me->mi',t1,F[o,v]) Fmi += ndot('ne,mnie->mi',t1,self.TEI[o,o,o,v],prefactor=2) Fmi += ndot('ne,nmie->mi',t1,self.TEI[o,o,o,v],prefactor=-1) Fmi += ndot('inef,mnef->mi',ccsd.build_tau(t1,t2),self.TEI[o,o,v,v],prefactor=2) Fmi += ndot('inef,mnfe->mi',ccsd.build_tau(t1,t2),self.TEI[o,o,v,v],prefactor=-1) return Fmi # Fmi
def build_Fae(self, F=None,t1=None,t2=None): if F is None: F = self.F if t1 is None: t1 = self.t1 if t2 is None: t2 = self.t2 o = self.o v = self.v Fae = self.F[v,v].copy() + 1j*0.0 Fae -= ndot('ma,me->ae',t1,F[o,v],prefactor=0.5) Fae += ndot('mf,amef->ae',t1,self.TEI[v,o,v,v],prefactor=2) Fae += ndot('mf,amfe->ae',t1,self.TEI[v,o,v,v],prefactor=-1) Fae -= ndot('mnaf,mnef->ae',self.build_tau_tilde(t1,t2),self.TEI[o,o,v,v],prefactor=2) Fae -= ndot('mnaf,mnfe->ae',self.build_tau_tilde(t1,t2),self.TEI[o,o,v,v],prefactor=-1) return Fae # Fae
def build_Fae(self,ccsd, F=None,t1=None,t2=None): # < a | Hbar | e > if F is None: F = self.F if t1 is None: t1 = self.t1 if t2 is None: t2 = self.t2 o = self.o v = self.v Fae = F[v,v].copy() + 1j*0.0 Fae -= ndot('ma,me->ae',t1,F[o,v]) Fae += ndot('mf,amef->ae',t1,self.TEI[v,o,v,v],prefactor=2) Fae += ndot('mf,amfe->ae',t1,self.TEI[v,o,v,v],prefactor=-1) Fae -= ndot('mnfa,mnfe->ae',ccsd.build_tau(t1,t2),self.TEI[o,o,v,v],prefactor=2) Fae -= ndot('mnfa,mnef->ae',ccsd.build_tau(t1,t2),self.TEI[o,o,v,v],prefactor=-1) return Fae # Fae
def build_tau_tilde(self, t1=None,t2=None): if t1 is None: t1 = self.t1 if t2 is None: t2 = self.t2 tau = t2.copy() tau = tau + ndot('ia,jb->ijab',t1,t1,prefactor=0.5) return tau # Tau tilde (alpha/beta)
def build_Wovvo(self, t1=None,t2=None): if t1 is None: t1 = self.t1 if t2 is None: t2 = self.t2 o = self.o v = self.v W = self.TEI[o,v,v,o].copy() W = W + ndot('jf,mbef->mbej', t1, self.TEI[o,v,v,v]) W -= ndot('nb,mnej->mbej', t1, self.TEI[o,o,v,o]) tmp = (0.5 * t2) tmp += np.einsum('jf,nb->jnfb', t1, t1) W -= ndot('jnfb,mnef->mbej', tmp, self.TEI[o,o,v,v]) return W # Wmbej
def compute_hf_dipole(self,P): # Compute HF electronic dipole moments dipoles_elec = [] for n in range(3): mu = ndot('uv,vu->',np.asarray(self.ints[n]),self.P) dipoles_elec.append(mu) return dipoles_elec
def build_Wmbej(self,ccsd, t1=None,t2=None): # < mb | Hbar | ej > if t1 is None: t1 = self.t1 if t2 is None: t2 = self.t2 o = self.o v = self.v tau = ccsd.build_tau(t1,t2) W = self.TEI[o,v,v,o].copy() + 1j*0.0 W += ndot('jnbf,nmfe->mbej',t2,self.TEI[o,o,v,v],prefactor=2) W += ndot('jnbf,nmef->mbej',t2,self.TEI[o,o,v,v],prefactor=-1) W -= ndot('jnfb,nmfe->mbej',tau,self.TEI[o,o,v,v]) W += ndot('jf,mbef->mbej',t1,self.TEI[o,v,v,v]) W -= ndot('nb,mnej->mbej',t1,self.TEI[o,o,v,o]) return W # Wmbej
def build_tau(self, t1=None,t2=None): if t1 is None: t1 = self.t1 if t2 is None: t2 = self.t2 tau = t2.copy() tau = tau + ndot('ia,jb->ijab',t1,t1) return tau # Tau (alpha/beta)
def transform_Fvv(self,ccsd, F=None,t1=None,t2=None): if F is None: F = self.F if t1 is None: t1 = self.t1 if t2 is None: t2 = self.t2 Fvv = ccsd.build_Fvv(F,t1,t2).swapaxes(0,1) Fvv -= ndot('me,ma->ea',t1,self.Fov,prefactor=0.5) return Fvv # Fea
def transform_Foo(self,ccsd, F=None,t1=None,t2=None): if F is None: F = self.F if t1 is None: t1 = self.t1 if t2 is None: t2 = self.t2 Foo = ccsd.build_Foo(F,t1,t2).swapaxes(0,1) Foo -= ndot('me,ie->im',t1,self.Fov,prefactor=0.5) return Foo # Fim
def build_tau_tilde(self, t1=None,t2=None): if t1 is None: t1 = self.t1 if t2 is None: t2 = self.t2 tau = t2.copy() tmp = ndot('ia,jb->ijab',t1,t1,prefactor=0.5) tau += tmp - tmp.swapaxes(2,3) return tau # Tau tilde
def compute_ccsd_dipole(self,D): # Compute CCSD correlated dipole dipoles_elec = [] for n in range(3): d = contract('ui,uv,vj->ij',self.npC,np.asarray(self.ints[n]),self.npC) mu = ndot('ij,ji->',d,D) dipoles_elec.append(mu) return dipoles_elec
def residual_l1(self,ccsd, F,t1,t2,l1,l2): o = self.o v = self.v # compute intermediates independent of Lambda self.Fov = ccsd.build_Fov(F,t1) self.Foo = self.transform_Foo(ccsd, F,t1,t2) self.Fvv = self.transform_Fvv(ccsd, F,t1,t2) self.Wvoov = self.transform_Wovvo(ccsd, t1,t2) self.Wooov = self.build_Wooov(ccsd, F,t1,t2) self.Wvovv = self.build_Wvovv(ccsd, t1,t2) self.Wovoo = self.build_Wovoo(ccsd, t1,t2) self.Wvvvo = self.build_Wvvvo(ccsd, t1,t2) # compute lambda dependent intermediates Goo = self.build_Goo(t2,l2) Gvv = self.build_Gvv(t2,l2) #### Build RHS side of l1 equations rhs_L1 = self.Fov.swapaxes(0,1).copy() rhs_L1 += ndot('ei,ea->ai',l1,self.Fvv) rhs_L1 -= ndot('am,im->ai',l1,self.Foo) rhs_L1 += ndot('em,eima->ai',l1,self.Wvoov) rhs_L1 += ndot('efim,efam->ai',l2,self.Wvvvo,prefactor=0.5) rhs_L1 -= ndot('aemn,iemn->ai',l2,self.Wovoo,prefactor=0.5) rhs_L1 -= ndot('ef,eifa->ai',Gvv,self.Wvovv) rhs_L1 -= ndot('mn,mina->ai',Goo,self.Wooov) return rhs_L1