Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
chunks=(int(min(nao_pair,4e8/blksize)),blksize))
for p0, p1 in lib.prange(0, nao_pair, blksize):
buf1 = numpy.zeros((p1-p0,nmoa,nmoa))
buf1[:,nocca:,nocca:] = lib.unpack_tril(_cp(v_aa[p0:p1]))
buf1[:,:,:nocca] = o_aa[:,:,p0:p1].transpose(2,0,1)
buf2 = _trans(buf1, mo_a, (0,nmoa,0,nmoa))
if p0 > 0:
buf1 = _cp(dm2a[:p0,p0:p1])
buf1[:p0,:p1-p0] += buf2[:p1-p0,:p0].T
buf2[:p1-p0,:p0] = buf1[:p0,:p1-p0].T
dm2a[:p0,p0:p1] = buf1
lib.transpose_sum(buf2[:,p0:p1], inplace=True)
dm2a[p0:p1] = buf2
buf1 = buf2 = None
for p0, p1 in lib.prange(0, nao_pair, blksize):
buf1 = numpy.zeros((p1-p0,nmob,nmob))
buf1[:,noccb:,noccb:] = lib.unpack_tril(_cp(v_bb[p0:p1]))
buf1[:,:,:noccb] = o_bb[:,:,p0:p1].transpose(2,0,1)
buf2 = _trans(buf1, mo_b, (0,nmob,0,nmob))
if p0 > 0:
buf1 = _cp(dm2b[:p0,p0:p1])
buf1[:p0,:p1-p0] += buf2[:p1-p0,:p0].T
buf2[:p1-p0,:p0] = buf1[:p0,:p1-p0].T
dm2b[:p0,p0:p1] = buf1
lib.transpose_sum(buf2[:,p0:p1], inplace=True)
dm2b[p0:p1] = buf2
buf1 = buf2 = None
for p0, p1 in lib.prange(0, nao_pair, blksize):
buf1 = numpy.zeros((p1-p0,nmoa,nmoa))
buf1[:,nocca:,nocca:] = lib.unpack_tril(_cp(v_ba[p0:p1]))
orbo = mo_coeff[:,:nocc]
def fvind(x):
dm = numpy.einsum('pi,xij,qj->xpq', orbv, x, orbo)
v_ao = mf.get_veff(mol, (dm+dm.transpose(0,2,1)))*2
return numpy.einsum('pi,xpq,qj->xij', orbv, v_ao, orbo).reshape(3,-1)
h1 = rhf_grad.get_hcore(mol)
s1 = rhf_grad.get_ovlp(mol)
eri1 = -mol.intor('int2e_ip1', aosym='s1', comp=3)
eri1 = eri1.reshape(3,nao,nao,nao,nao)
eri0 = ao2mo.kernel(mol, mo_coeff)
eri0 = ao2mo.restore(1, eri0, nmo).reshape(nmo,nmo,nmo,nmo)
g = eri0 * 2 - eri0.transpose(0,3,2,1)
zeta = lib.direct_sum('i+j->ij', mo_energy, mo_energy) * .5
zeta[nocc:,:nocc] = mo_energy[:nocc]
zeta[:nocc,nocc:] = mo_energy[nocc:]
if atmlst is None:
atmlst = range(mol.natm)
offsetdic = mol.offset_nr_by_atom()
de = numpy.zeros((len(atmlst),3))
for k, ia in enumerate(atmlst):
shl0, shl1, p0, p1 = offsetdic[ia]
mol.set_rinv_origin(mol.atom_coord(ia))
h1ao = -mol.atom_charge(ia) * mol.intor('int1e_iprinv', comp=3)
h1ao[:,p0:p1] += h1[:,p0:p1]
h1ao = h1ao + h1ao.transpose(0,2,1)
h1mo = numpy.einsum('pi,xpq,qj->xij', mo_coeff, h1ao, mo_coeff)
s1mo = numpy.einsum('pi,xpq,qj->xij', mo_coeff[p0:p1], s1[:,p0:p1], mo_coeff)
def _get_vk_loc(k2, nthreads):
lib.num_threads(nthreads)
ao2T = ao2_kpts[k2]
if ao2T.size == 0:
#continue
return 0.
kpt2 = kd.bz_k[k2]
naoj = ao2T.shape[0]
if mo_coeff is None or nset > 1:
ao_dms = [lib.dot(dms[i,k2], ao2T.conj()) for i in range(nset)]
else:
ao_dms = [ao2T.conj()]
vk_kpts_loc = np.zeros_like(vk_kpts)
vR_dm_loc = np.empty((nset,nao,ngrids), dtype=vk_kpts_loc.dtype)
for k1, ao1T in enumerate(ao1_kpts):
kpt1 = kpts_band[k1]
# If we have an ewald exxdiv, we add the G=0 correction near the
# end of the function to bypass any discretization errors
# that arise from the FFT.
mydf.exxdiv = exxdiv
if exxdiv == 'ewald' or exxdiv is None:
coulG = tools.get_coulG(cell, kpt2-kpt1, False, mydf, mesh)
else:
coulG = tools.get_coulG(cell, kpt2-kpt1, True, mydf, mesh)
def vppnl_by_k(kpt):
Gk = Gv + kpt
G_rad = lib.norm(Gk, axis=1)
aokG = ft_ao.ft_ao(cell, Gv, kpt=kpt) * (ngs/cell.vol)
vppnl = 0
for ia in range(cell.natm):
symb = cell.atom_symbol(ia)
if symb not in cell._pseudo:
continue
pp = cell._pseudo[symb]
for l, proj in enumerate(pp[5:]):
rl, nl, hl = proj
if nl > 0:
hl = numpy.asarray(hl)
fakemol._bas[0,gto.ANG_OF] = l
fakemol._env[ptr+3] = .5*rl**2
fakemol._env[ptr+4] = rl**(l+1.5)*numpy.pi**1.25
pYlm_part = dft.numint.eval_ao(fakemol, Gk, deriv=0)
if mo_occ is None: mo_occ = self.base.mo_occ
if atmlst is None:
atmlst = self.atmlst
else:
self.atmlst = atmlst
de = self.hess_elec(mo_energy, mo_coeff, mo_occ, atmlst=atmlst)
self.de = de + self.hess_nuc(self.mol, atmlst=atmlst)
return self.de
hess = kernel
gen_hop = gen_hop
# Inject to RHF class
from pyscf import scf
scf.hf.RHF.Hessian = lib.class_as_method(Hessian)
if __name__ == '__main__':
from pyscf import gto
from pyscf import scf
mol = gto.Mole()
mol.verbose = 0
mol.output = None
mol.atom = [
[1 , (1. , 0. , 0.000)],
[1 , (0. , 1. , 0.000)],
[1 , (0. , -1.517 , 1.177)],
[1 , (0. , 1.517 , 1.177)] ]
mol.basis = '631g'
mol.unit = 'B'
l2tau = lib.einsum('ijcd,klcd->ijkl', l2, tau)
tau = None
l2t1 = lib.einsum('jidc,kc->ijkd', l2, t1)
max_memory = max(0, mycc.max_memory - lib.current_memory()[0])
unit = nocc*nvir**2*5
blksize = min(nocc, max(ccsd.BLKMIN, int(max_memory*.95e6/8/unit)))
log.debug1('block size = %d, nocc = %d is divided into %d blocks',
blksize, nocc, int((nocc+blksize-1)/blksize))
l1new -= numpy.einsum('jb,jiab->ia', l1, _cp(eris.oovv))
for p0, p1 in lib.prange(0, nvir, blksize):
eris_ovvv = eris.get_ovvv(slice(None), slice(p0,p1))
l1new[:,p0:p1] += numpy.einsum('iabc,bc->ia', eris_ovvv, mba1) * 2
l1new -= numpy.einsum('ibca,bc->ia', eris_ovvv, mba1[p0:p1])
l2new[:,:,p0:p1] += lib.einsum('jbac,ic->jiba', eris_ovvv, l1)
m4 = lib.einsum('ijkd,kadb->ijab', l2t1, eris_ovvv)
l2new[:,:,p0:p1] -= m4
l1new[:,p0:p1] -= numpy.einsum('ijab,jb->ia', m4, t1) * 2
l1new -= numpy.einsum('ijab,ia->jb', m4, t1[:,p0:p1]) * 2
l1new[:,p0:p1] += numpy.einsum('jiab,jb->ia', m4, t1)
l1new += numpy.einsum('jiab,ia->jb', m4, t1[:,p0:p1])
eris_ovvv = m4 = None
eris_voov = _cp(eris.ovvo[:,p0:p1].transpose(1,0,3,2))
l1new[:,p0:p1] += numpy.einsum('jb,aijb->ia', l1, eris_voov) * 2
l2new[:,:,p0:p1] += eris_voov.transpose(1,2,0,3) * .5
l2new[:,:,p0:p1] -= lib.einsum('bjic,ca->jiba', eris_voov, mba1)
l2new[:,:,p0:p1] -= lib.einsum('bjka,ik->jiba', eris_voov, mij1)
l1new[:,p0:p1] += numpy.einsum('aijb,jb->ia', eris_voov, mia1) * 2
l1new -= numpy.einsum('bija,jb->ia', eris_voov, mia1[:,p0:p1])
m4 = lib.einsum('ijkl,aklb->ijab', l2tau, eris_voov)
ftmp = lib.H5TmpFile()
ao2mo.full(mol, mo_coeff, ftmp, max_memory=max_memory, verbose=log)
eri = ftmp['eri_mo']
nocc_pair = nocc*(nocc+1)//2
tril2sq = lib.square_mat_in_trilu_indices(nmo)
oo = eri[:nocc_pair]
eris.oooo[:] = ao2mo.restore(1, oo[:,:nocc_pair], nocc)
oovv = lib.take_2d(oo, tril2sq[:nocc,:nocc].ravel(), tril2sq[nocc:,nocc:].ravel())
eris.oovv[:] = oovv.reshape(nocc,nocc,nvir,nvir)
oo = oovv = None
tril2sq = lib.square_mat_in_trilu_indices(nmo)
blksize = min(nvir, max(BLKMIN, int(max_memory*1e6/8/nmo**3/2)))
for p0, p1 in lib.prange(0, nvir, blksize):
q0, q1 = p0+nocc, p1+nocc
off0 = q0*(q0+1)//2
off1 = q1*(q1+1)//2
buf = lib.unpack_tril(eri[off0:off1])
tmp = buf[ tril2sq[q0:q1,:nocc] - off0 ]
eris.ovoo[:,p0:p1] = tmp[:,:,:nocc,:nocc].transpose(1,0,2,3)
eris.ovvo[:,p0:p1] = tmp[:,:,nocc:,:nocc].transpose(1,0,2,3)
eris.ovov[:,p0:p1] = tmp[:,:,:nocc,nocc:].transpose(1,0,2,3)
eris.ovvv[:,p0:p1] = tmp[:,:,nocc:,nocc:].transpose(1,0,2,3)
tmp = buf[ tril2sq[q0:q1,nocc:q1] - off0 ]
eris.vvvv[p0:p1,:p1] = tmp[:,:,nocc:,nocc:]
if p0 > 0:
eris.vvvv[:p0,p0:p1] = tmp[:,:p0,nocc:,nocc:].transpose(1,0,2,3)
buf = tmp = None
time1 = log.timer_debug1('_rdm2_mo2ao pass 3', *time1)
if incore:
return (fsave['dm2aa+ab'].value, fsave['dm2bb+ab'].value)
else:
return fsave
def _cp(a):
return numpy.array(a, copy=False, order='C')
class Gradients(ccsd_grad.Gradients):
grad_elec = grad_elec
Grad = Gradients
from pyscf.cc import uccsd
uccsd.UCCSD.Gradients = lib.class_as_method(Gradients)
if __name__ == '__main__':
from pyscf import gto
from pyscf import scf
from pyscf.cc import uccsd
mol = gto.M(
atom = [
["O" , (0. , 0. , 0.)],
[1 , (0. ,-0.757 , 0.587)],
[1 , (0. , 0.757 , 0.587)]],
basis = '631g',
spin = 2,
)
mf = scf.UHF(mol).run()
shls_slice = (ish0, ish1, ish0, ish1)
s1 = xmol.intor('int1e_ovlp_spinor', shls_slice=shls_slice)
t1 = xmol.intor('int1e_spsp_spinor', shls_slice=shls_slice) * .5
with xmol.with_rinv_as_nucleus(ia):
z = -xmol.atom_charge(ia)
v1 = z*xmol.intor('int1e_rinv_spinor', shls_slice=shls_slice)
w1 = z*xmol.intor('int1e_sprinvsp_spinor', shls_slice=shls_slice)
x[p0:p1,p0:p1] = _x2c1e_xmatrix(t1, v1, w1, s1, c)
h1 = _get_hcore_fw(t, v, w, s, x, c)
else:
h1 = _x2c1e_get_hcore(t, v, w, s, c)
if self.basis is not None:
s22 = xmol.intor_symmetric('int1e_ovlp_spinor')
s21 = mole.intor_cross('int1e_ovlp_spinor', xmol, mol)
c = lib.cho_solve(s22, s21)
h1 = reduce(numpy.dot, (c.T.conj(), h1, c))
elif self.xuncontract:
np, nc = contr_coeff_nr.shape
contr_coeff = numpy.zeros((np*2,nc*2))
contr_coeff[0::2,0::2] = contr_coeff_nr
contr_coeff[1::2,1::2] = contr_coeff_nr
h1 = reduce(numpy.dot, (contr_coeff.T.conj(), h1, contr_coeff))
return h1