示例#1
0
文件: h2o.py 项目: peverati/tools
#!/usr/bin/env python

from pyscf import gto, scf
from pyscf.tools import wfn_format

name = 'h2o'

mol = gto.Mole()
mol.atom = '''
 O  0.0000  0.0000  0.1173
 H  0.0000  0.7572 -0.4692
 H  0.0000 -0.7572 -0.4692
'''
mol.basis = 'cc-pvdz'
mol.verbose = 4
mol.spin = 0
mol.symmetry = 1
mol.charge = 0
mol.build()

mf = scf.RHF(mol)
mf.kernel()

wfn_file = name + '.wfn'
nmo = mol.nelectron // 2
coef = mf.mo_coeff[:, :nmo]
occ = mf.mo_occ[:nmo]
ene = mf.mo_energy[:nmo]
with open(wfn_file, 'w') as f2:
    wfn_format.write_mo(f2, mol, coef, mo_occ=occ, mo_energy=ene)
示例#2
0
eri_mo = eri_mo.reshape(nocc, nvir, nocc, nvir)
e_denom = 1.0 / (eo.reshape(-1, 1, 1, 1) - ev.reshape(-1, 1, 1) +
                 eo.reshape(-1, 1) - ev)
t2 = numpy.zeros((nocc, nvir, nocc, nvir))
t2 = 2.0 * lib.einsum('iajb,iajb->iajb', eri_mo, e_denom)
t2 -= lib.einsum('ibja,iajb->iajb', eri_mo, e_denom)
e_mp2 = numpy.einsum('iajb,iajb->', eri_mo, t2, optimize=True)
lib.logger.info(mf, "!*** E(MP2): %12.8f" % e_mp2)
lib.logger.info(mf, "!**** E(HF+MP2): %12.8f" % (e_mp2 + ehf))

wfn_file = name + '.wfn'
ao_loc = cell.ao_loc_nr()
fspt = open(wfn_file, 'w')
wfn_format.write_mo(fspt,
                    cell,
                    mf.mo_coeff,
                    mo_occ=mf.mo_occ,
                    mo_energy=mf.mo_energy)
fspt.write('MP2\n')
fspt.write('1-RDM:\n')
occup = 2.0
norb = cell.nelectron // 2
for i in range(norb):
    fspt.write('%i %i %.8f\n' % ((i + 1), (i + 1), occup))
fspt.write('t2_iajb:\n')
for i in range(nocc):
    for j in range(nvir):
        for k in range(nocc):
            for l in range(nvir):
                if (abs(t2[i, j, k, l]) > 1e-8):
                    fspt.write('%i %i %i %i %.10f\n' % ((i+1+ncore), \
示例#3
0
rdm1, rdm2 = mcscf.addons._make_rdm12_on_mo(rdm1, rdm2, mc.ncore, mc.ncas, nmo)
lib.logger.info(mf,'Write rdm1-rdm2 on MO basis to HDF5 file')
dic = {'rdm1':rdm1,
       'rdm2':rdm2}
lib.chkfile.save(name+'.chk', 'pdm', dic)

natocc, natorb = numpy.linalg.eigh(-rdm1)
for i, k in enumerate(numpy.argmax(abs(natorb), axis=0)):
    if natorb[k,i] < 0:
        natorb[:,i] *= -1
natorb = numpy.dot(mc.mo_coeff[:,:nmo], natorb)
natocc = -natocc

wfn_file = name + '.wfn'
with open(wfn_file, 'w') as f2:
    wfn_format.write_mo(f2, cell, natorb, mo_occ=natocc)
    wfn_format.write_coeff(f2, cell, mc.mo_coeff[:,:nmo])
    wfn_format.write_ci(f2, mc.ci, mc.ncas, mc.nelecas, ncore=mc.ncore)

#c = mc.mo_coeff[:,:nmo]
#s = cell.pbc_intor('cint1e_ovlp_sph')
#t = cell.pbc_intor('cint1e_kin_sph')
#h = mc.get_hcore()
#s = reduce(numpy.dot, (c.T,s,c))
#t = reduce(numpy.dot, (c.T,t,c))
#h = reduce(numpy.dot, (c.T,h,c))
#enuc = cell.energy_nuc() 
#ekin = numpy.einsum('ij,ji->',t,rdm1)
#hcore = numpy.einsum('ij,ji->',h,rdm1)
#pop = numpy.einsum('ij,ji->',s,rdm1)
#print('Population : %s' % pop)
示例#4
0
diis_obj = scf.ADIIS()
diis_obj.diis_space = 24
diis_obj.diis_start_cycle = 14

# Guess
mf = scf.RHF(mol)
mf.verbose = 0
mf.kernel()
dm = mf.make_rdm1()

# Calc
mf = scf.RHF(mol)  #.newton()
mf.conv_tol = 1e-6
mf.max_cycle = 120
mf.diis = diis_obj
old_get_fock = mf.get_fock
mf.get_fock = get_cfock
mf.kernel(dm)
mf.analyze(with_meta_lowdin=False)
dm = mf.make_rdm1()
for i in range(natm):
    ia = atms[i]
    pop = numpy.einsum('ij,ji->', saom[i], dm)
    lib.logger.info(mol, 'Population atom %d : %f' % (ia, pop))

wfn_file = name + '.wfn'
idx = mf.mo_occ > 0
with open(wfn_file, 'w') as f2:
    wfn_format.write_mo(f2, mol, mf.mo_coeff[:,idx], \
    mo_occ=mf.mo_occ[idx], mo_energy=mf.mo_energy[idx])
示例#5
0
mol.symmetry = 0
mol.build()

mf = scf.RHF(mol)
mf.verbose = 4
mf.kernel()
mf.analyze(with_meta_lowdin=False)

dm = mf.make_rdm1()
multiplicadores = numpy.zeros(mol.natm)
multiplicadores = [0.0,0.2]

my_diis_obj = scf.ADIIS()
my_diis_obj.diis_space = 14
mf = scf.RHF(mol)
mf.conv_tol = 1e-6
mf.max_cycle = 120
mf.diis = my_diis_obj
old_get_fock = mf.get_fock
mf.get_fock = get_cfock 
#mf.verbose = 3
mf.kernel(dm0=dm)
mf.analyze(with_meta_lowdin=False)
dm = mf.make_rdm1()

wfn_file = name + '.wfn'
with open(wfn_file, 'w') as f2:
    wfn_format.write_mo(f2, mol, mf.mo_coeff[:,mf.mo_occ>0], \
    mo_occ=mf.mo_occ[mf.mo_occ>0], mo_energy=mf.mo_energy[mf.mo_occ>0])

示例#6
0
        f2.write('%i %i %.16f\n' % (i, j, rdm1[i,j]))
#        
rdm2_xc = numpy.zeros((nmo,nmo,nmo,nmo))
for i in range(nmo):
    for j in range(nmo):
        rdm2_xc[i,j,j,i] -= 2
x, y, z, w = rdm2_xc.nonzero()
nonzero = zip(x,y,z,w)
ifile = name + '.rdm2_xc'
with open(ifile, 'w') as f2:
    for i, j, k, l in nonzero:
        f2.write('%i %i %i %i %.16f\n' % (i, j, k, l, rdm2_xc[i,j,k,l]))

wfn_file = name + '.wfn'
with open(wfn_file, 'w') as f2:
    wfn_format.write_mo(f2, mol, coeff, occ)

##############################################################################
s = mol.intor('cint1e_ovlp_sph')
s = reduce(numpy.dot, (coeff.T,s,coeff))
x, y = s.nonzero()
nonzero = zip(x,y)
ifile = name + '.overlap'
with open(ifile, 'w') as f2:
    for i, j in nonzero:
        f2.write('%i %i %.16f\n' % (i, j, s[i,j]))
#       
t = mol.intor('cint1e_kin_sph')
t = reduce(numpy.dot, (coeff.T,t,coeff))
x, y = t.nonzero()
nonzero = zip(x,y)
示例#7
0
                   10]  # Tune PWs in MDF for performance/accuracy balance
mf = scf.addons.remove_linear_dep_(mf)
mf.kernel()

wfn_file = name + '.wfn'
fspt = open(wfn_file, 'w')
coeff = mf.mo_coeff[:, mf.mo_occ > 0]
occ = mf.mo_occ[mf.mo_occ > 0]
energy = mf.mo_energy[mf.mo_occ > 0]
a = cell.a
t = cell.get_lattice_Ls()
t = t[numpy.argsort(lib.norm(t, axis=1))]
kpts = numpy.asarray([0.0, 0.0, 0.0])
#expLk = numpy.exp(1j * numpy.asarray(numpy.dot(t, kpts.T), order='C'))

wfn_format.write_mo(fspt, cell, coeff, mo_energy=energy, mo_occ=occ)
fspt.write('CRYSTAL\n')
fspt.write('CELL\n')
fspt.write(' %11.8f %11.8f %11.8f\n' % (a[0][0], a[0][1], a[0][2]))
fspt.write(' %11.8f %11.8f %11.8f\n' % (a[1][0], a[1][1], a[1][2]))
fspt.write(' %11.8f %11.8f %11.8f\n' % (a[2][0], a[2][1], a[2][2]))
fspt.write('N-KPOINTS 1\n')
fspt.write(' %11.8f %11.8f %11.8f\n' % (kpts[0], kpts[1], kpts[2]))
fspt.write('T-VECTORS %3d\n' % len(t))
for i in range(len(t)):
    fspt.write(' %11.8f %11.8f %11.8f\n' % (t[i][0], t[i][1], t[i][2]))
fspt.close()

dm = mf.make_rdm1()

s = cell.pbc_intor('int1e_ovlp')
示例#8
0
def run(uparam, tparam):
    s = overlap(nsites)
    h1 = hop(tparam, nsites, pbc)
    eri = onsite(uparam, nsites)

    mol = gto.Mole()
    mol.nelectron = nelectrons
    mol.verbose = 0
    mol.spin = spin
    mol.symmetry = 0
    mol.charge = 0
    mol.incore_anyway = True
    mol.build()

    mf = scf.RHF(mol)
    mf = scf.addons.frac_occ(mf)
    mf.verbose = 0
    mf.conv_tol = 1e-8
    mf.max_cycle = 150
    mf.diis = True
    mf.diis_space = 12
    mf.get_hcore = lambda *args: h1
    mf.get_ovlp = lambda *args: s
    mf._eri = ao2mo.restore(8, eri, nsites)
    mf.kernel()

    mc = mcscf.CASCI(mf, nsites, nelectrons)
    mc.verbose = 4
    efci = mc.kernel()[0]
    rdm1, rdm2 = mc.fcisolver.make_rdm12(mc.ci, mc.ncas, mc.nelecas)
    rdm1, rdm2 = mcscf.addons._make_rdm12_on_mo(rdm1, rdm2, mc.ncore, mc.ncas,
                                                nsites)

    fs.write('%.7f %.7f ' % (-1.0 * uparam / tparam, efci))
    wfn_file = 'h4_%.4f.wfn' % (-1.0 * uparam / tparam)
    aom_file = 'h4_%.4f.wfn.aom' % (-1.0 * uparam / tparam)
    edf_file = 'h4_%.4f.edf' % (-1.0 * uparam / tparam)
    den2_file = 'h4_%.4f_2.den' % (-1.0 * uparam / tparam)
    den4_file = 'h4_%.4f_4.den' % (-1.0 * uparam / tparam)
    atms = []
    atms.append(('H', 0.0, 1.0, 0.0))
    atms.append(('H', 1.0, 1.0, 0.0))
    atms.append(('H', 1.0, 0.0, 0.0))
    atms.append(('H', 0.0, 0.0, 0.0))
    mol = gto.Mole()
    mol.nelectron = nelectrons
    mol.verbose = 0
    mol.spin = spin
    mol.symmetry = 0
    mol.charge = 0
    mol.basis = 'sto-1g'
    mol.atom = atms
    mol.build()
    nmo = mc.ncore + mc.ncas
    natocc, natorb = numpy.linalg.eigh(-rdm1)
    for i, k in enumerate(numpy.argmax(abs(natorb), axis=0)):
        if natorb[k, i] < 0:
            natorb[:, i] *= -1
    natorb = numpy.dot(mc.mo_coeff[:, :nmo], natorb)
    natocc = -natocc
    with open(wfn_file, 'w') as f2:
        wfn_format.write_mo(f2, mol, natorb, mo_occ=natocc)
        wfn_format.write_coeff(f2, mol, mc.mo_coeff[:, :nmo])
        wfn_format.write_ci_hubbard(f2,
                                    mc.ci,
                                    mc.ncas,
                                    mc.nelecas,
                                    ncore=mc.ncore)
    with open(edf_file, 'w') as f2:
        f2.write('0\n')
        f2.write('%s\n' % (aom_file))
        f2.write('%s\n' % (wfn_file))
        f2.write('norecur\n')
        f2.write('probcut 1d-3\n')
        f2.write('ngroup 4\n')
        f2.write('1 1\n')
        f2.write('1 2\n')
        f2.write('1 3\n')
        f2.write('1 4\n')
        f2.write('end\n')
    with open(den2_file, 'w') as f2:
        f2.write('0\n')
        f2.write('%s\n' % (aom_file))
        f2.write('%s\n' % (wfn_file))
        f2.write('ngroup 2\n')
        f2.write('1\n')
        f2.write('2\n')
        f2.write('end\n')
    with open(den4_file, 'w') as f2:
        f2.write('0\n')
        f2.write('%s\n' % (aom_file))
        f2.write('%s\n' % (wfn_file))
        f2.write('ngroup 4\n')
        f2.write('1\n')
        f2.write('2\n')
        f2.write('3\n')
        f2.write('4\n')
        f2.write('end\n')
    with open(aom_file, 'w') as f2:
        for k in range(nsites):  # Over atoms == over primitives
            f2.write("%5d <=== AOM within this center\n" % (k + 1))
            ij = 0
            for i in range(nsites):
                for j in range(i + 1):
                    f2.write(' %16.10f' %
                             (mc.mo_coeff[k, i] * mc.mo_coeff[k, j]))
                    ij += 1
                    if (ij % 6 == 0):
                        f2.write("\n")
            f2.write("\n")

    rdm2 = rdm2 - numpy.einsum('ij,kl->ijkl', rdm1, rdm1)
    rdm1 = reduce(numpy.dot, (mc.mo_coeff, rdm1, mc.mo_coeff.T))
    rdm2 = numpy.dot(mc.mo_coeff, rdm2.reshape(nsites, -1))
    rdm2 = numpy.dot(rdm2.reshape(-1, nsites), mc.mo_coeff.T)
    rdm2 = rdm2.reshape(nsites, nsites, nsites, nsites).transpose(2, 3, 0, 1)
    rdm2 = numpy.dot(mc.mo_coeff, rdm2.reshape(nsites, -1))
    rdm2 = numpy.dot(rdm2.reshape(-1, nsites), mc.mo_coeff.T)
    rdm2 = rdm2.reshape(nsites, nsites, nsites, nsites)
    rdm2 = -rdm2

    pairs2 = numpy.einsum('ijkl,ij,kl->ik', rdm2, s, s,
                          optimize=True) * 0.5  # XC
    ia = 3
    for ib in range(ia + 1):
        if (ia == ib):
            factor = 1.0
        if (ia != ib):
            factor = 2.0
        fs.write('%.7f ' % (2 * factor * pairs2[ia, ib]))

    fs.write('\n')
示例#9
0
dm_u = mf.make_rdm1(mo0, occ)
# Apply mom occupation principle
mf = scf.addons.mom_occ(mf, mo0, occ)
# Start new SCF with new density matrix
mf.scf(dm_u)

coeffa = mf.mo_coeff[0][:,mf.mo_occ[0]>0]
energya = mf.mo_energy[0][mf.mo_occ[0]>0]
occa = mf.mo_occ[0][mf.mo_occ[0]>0]

coeffb = mf.mo_coeff[1][:,mf.mo_occ[1]>0]
energyb = mf.mo_energy[1][mf.mo_occ[1]>0]
occb = mf.mo_occ[1][mf.mo_occ[1]>0]

with open(name+'.wfn', 'w') as f2:
    wfn_format.write_mo(f2, mol, coeffa, mo_energy=energya, mo_occ=occa)
    wfn_format.write_mo(f2, mol, coeffb, mo_energy=energyb, mo_occ=occb)
    
norb = mf.mo_energy[0].size
nmoa = energya.size
nmob = energyb.size

rdm1a = numpy.zeros((nmoa,nmoa))
rdm1b = numpy.zeros((nmob,nmob))

rdm2a = numpy.zeros((nmoa,nmoa,nmoa,nmoa))
rdm2b = numpy.zeros((nmob,nmob,nmob,nmob))
rdm2ab = numpy.zeros((nmoa,nmoa,nmob,nmob))
rdm2ba = numpy.zeros((nmob,nmob,nmoa,nmoa))

for i in range(energya.size):