#!/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)
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), \
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)
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])
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])
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)
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')
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')
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):