def DMRG_MPS_NEVPT(mc, root=0, fcisolver=None,maxm = 500, tol =1e-6, parallel= True): if (isinstance(mc, basestring)): fh5 = h5py.File(mc,'r') mol = eval(fh5['mol'].value) ncas = fh5['mc/ncas'].value ncore = fh5['mc/ncore'].value nvirt = fh5['mc/nvirt'].value nelecas = fh5['mc/nelecas'].value fh5.close() mc_chk = mc else : mol = mc.mol ncas = mc.ncas ncore = mc.ncore nvirt = mc.mo_coeff.shape[1] - mc.ncas-mc.ncore nelecas = mc.nelecas mc_chk = 'mc_chkfile' write_chk(mc,root,mc_chk) if fcisolver is None: fcisolver = DMRGCI(mol, maxm, tol) fcisolver.twopdm = False fcisolver.nroots = mc.fcisolver.nroots scratch = fcisolver.scratchDirectory fcisolver.scratchDirectory = '' #if (not parallel): # ci.extraline.append('restart_mps_nevpt %d %d %d'%(ncas,ncore, nvirt)) fcisolver.extraline.append('fullrestart') fcisolver.extraline.append('nevpt_state_num %d'%root) writeDMRGConfFile(nelecas[0], nelecas[1], False, fcisolver) fcisolver.scratchDirectory = scratch if fcisolver.verbose >= logger.DEBUG1: inFile = fcisolver.configFile #inFile = os.path.join(self.scratchDirectory,self.configFile) logger.debug1(fcisolver, 'Block Input conf') logger.debug1(fcisolver, open(inFile, 'r').read()) from subprocess import check_call import os full_path = os.path.realpath(__file__) check_call('%s %s/nevpt_mpi.py %s %s %s %s %s'%(fcisolver.mpiprefix, os.path.dirname(full_path), mc_chk, fcisolver.executable, fcisolver.configFile,fcisolver.outputFile, fcisolver.scratchDirectory), shell=True)
def DMRG_MPS_NEVPT(mc, maxM = 500, root=0, nevptsolver=None, tol =1e-7): import h5py if (isinstance(mc, basestring)): fh5 = h5py.File(mc,'r') mol = eval(fh5['mol'].value) ncas = fh5['mc/ncas'].value ncore = fh5['mc/ncore'].value nvirt = fh5['mc/nvirt'].value nelecas = fh5['mc/nelecas'].value nroots = fh5['mc/nroots'].value wfnsym = fh5['mc/wfnsym'].value fh5.close() mc_chk = mc else : mol = mc.mol ncas = mc.ncas ncore = mc.ncore nvirt = mc.mo_coeff.shape[1] - mc.ncas-mc.ncore nelecas = mc.nelecas nroots = mc.fcisolver.nroots wfnsym = mc.fcisolver.wfnsym mc_chk = 'mc_chkfile' write_chk(mc,root,mc_chk) if nevptsolver is None: nevptsolver = DMRGCI(mol, maxM, tol) nevptsolver.scheduleSweeps = [0, 4] nevptsolver.scheduleMaxMs = [maxM, maxM] nevptsolver.scheduleTols = [0.0001, tol] nevptsolver.scheduleNoises = [0.0001, 0.0] nevptsolver.twodot_to_onedot = 4 nevptsolver.maxIter = 6 nevptsolver.wfnsym = wfnsym nevptsolver.twopdm = False nevptsolver.nroots = nroots scratch = nevptsolver.scratchDirectory nevptsolver.scratchDirectory = '' nevptsolver.extraline.append('fullrestart') nevptsolver.extraline.append('nevpt_state_num %d'%root) writeDMRGConfFile(nelecas[0], nelecas[1], False, nevptsolver) nevptsolver.scratchDirectory = scratch if nevptsolver.verbose >= logger.DEBUG1: inFile = nevptsolver.configFile #inFile = os.path.join(self.scratchDirectory,self.configFile) logger.debug1(nevptsolver, 'Block Input conf') logger.debug1(nevptsolver, open(inFile, 'r').read()) t0 = (time.clock(), time.time()) from subprocess import check_call import os full_path = os.path.realpath(__file__) check_call('%s %s/nevpt_mpi.py %s %s %s %s %s'%(nevptsolver.mpiprefix, os.path.dirname(full_path), mc_chk, nevptsolver.executable, nevptsolver.configFile,nevptsolver.outputFile, nevptsolver.scratchDirectory), shell=True) if nevptsolver.verbose >= logger.DEBUG1: logger.debug1(nevptsolver, open(os.path.join(nevptsolver.scratchDirectory, '0/dmrg.out')).read()) import h5py fh5 = h5py.File('Perturbation_%d'%root,'r') Vi_e = fh5['Vi/energy'].value Vr_e = fh5['Vr/energy'].value fh5.close() logger.note(nevptsolver,'Nevpt Energy:') logger.note(nevptsolver,'Sr Subspace: E = %.14f'%( Vr_e)) logger.note(nevptsolver,'Si Subspace: E = %.14f'%( Vi_e)) logger.timer(nevptsolver,'MPS NEVPT calculation time', *t0)