def check_wfs(): newdf=check_singularity( wf=ExponentSlaterWF(1.0), ham=Hamiltonian(Z=2) ) newdf['wf']='slater unopt.' resdf=newdf resdf['electron-nucleus'] newdf=check_singularity( wf=ExponentSlaterWF(2.0), ham=Hamiltonian(Z=2) ) newdf['wf']='slater opt.' resdf=pd.concat([resdf,newdf]) newdf=check_singularity( wf=MultiplyWF(ExponentSlaterWF(2.0),JastrowWF(0.5)), ham=Hamiltonian(Z=2) ) newdf['wf']='slater-jastrow' resdf=pd.concat([resdf,newdf]) return resdf
def compare_optimal(): wf = ExponentSlaterWF(1.7) slater_dist = pair_distribution(wf) wf = MultiplyWF(ExponentSlaterWF(1.9), JastrowWF(0.3)) slaterjastrow_dist = pair_distribution(wf) print("Slater", slater_dist) print("Slater-Jastrow", slaterjastrow_dist)
def compare_samealpha(): wf = ExponentSlaterWF(2.0) slater_dist = pair_distribution(wf) wf = MultiplyWF(ExponentSlaterWF(2.0), JastrowWF(0.5)) slaterjastrow_dist = pair_distribution(wf) print("Slater", slater_dist) print("Slater-Jastrow", slaterjastrow_dist)
def test_dmc( dmc_method, trial_wf=JastrowWF(100., Z=2.0), nconf=10000, # number of walkers proj_time=5., # projection time in a.u. tau_list=[0.16, 0.08, 0.04]): # hard-code He nelec = 2 ndim = 3 Zcharge = 2 # initialize hamiltonian he_ham = Hamiltonian(Z=Zcharge) # use VMC to start sample configurations from trial_wf pos0 = np.random.randn(nelec, ndim, nconf) pos_vmc, acc_vmc = metropolis_sample(pos0, trial_wf, tau=0.5, nstep=100) # run DMC to project the VMC wavefunction to ground state data = [] pos_last = pos_vmc.copy() weights_last = np.ones(nconf) for tau in tau_list: nstep = int(round(proj_time / tau)) half = int(round(nstep / 2)) # assume equilibration at half time pos_dmc, weights_dmc, acc_dmc, traces = dmc_method( pos_last, trial_wf, he_ham, weights=weights_last, weight_desire=nconf, tau=tau, nstep=nstep) print("tau={tau:6.3f}: {acc:d}% {emean:10.6f} +- {err:10.6f}".format( tau=tau, acc=int(round(acc_dmc * 100)), emean=np.mean(traces[half:, 0]), err=error(traces[half:, 0]))) data.append(traces) # restart with current walkers weights_last = weights_dmc pos_last = pos_dmc return np.concatenate(data, axis=0)
vion = [] vele = [] potential = [] eloc = [] acc = [] virial = [] vele = [] venu = [] alph = [] bet = [] # Best Slater-Jastrow. for alpha in alphas: for beta in betas: alph.append(alpha) bet.append(beta) wf = MultiplyWF(ExponentSlaterWF(alpha), JastrowWF(beta)) pos = np.random.randn(nelec, ndim, nconfig) pos, _ = metropolis_sample(pos=pos, wf=wf, tau=tau, nstep=nstep) acc.append(_) ke.append(np.mean(-0.5 * np.sum(wf.laplacian(pos), axis=0))) vele.append(np.mean(ham.pot_ee(pos))) venu.append(np.mean(ham.pot_en(pos))) potential.append(np.mean(ham.pot(pos))) eloc.append(ke[-1] + potential[-1]) virial.append(potential[-1] / ke[-1]) df = pd.DataFrame.from_dict({ 'kinetic': ke, 'electron-electron': vele, 'electron-nucleus': venu, 'potential': potential,
"acceptance", acc_ratio) df['step'].append(istep) df['elocal'].append(np.mean(eloc)) df['weight'].append(np.mean(weight)) df['elocalvar'].append(np.std(eloc)) df['weightvar'].append(np.std(weight)) df['eref'].append(eref) df['tau'].append(tau) weight.fill(wavg) return pd.DataFrame(df) ##################################### if __name__ == '__main__': from slaterwf import ExponentSlaterWF from wavefunction import MultiplyWF, JastrowWF from hamiltonian import Hamiltonian nconfig = 50000 dfs = [] for tau in [.01, .005, .0025]: dfs.append( simple_dmc(MultiplyWF(ExponentSlaterWF(2.0), JastrowWF(0.5)), Hamiltonian(), pos=np.random.randn(2, 3, nconfig), tau=tau, nstep=10000)) df = pd.concat(dfs) df.to_csv("dmc.csv", index=False)
import numpy as np from slaterwf import ExponentSlaterWF from wavefunction import MultiplyWF, JastrowWF from metropolis import metropolis_sample def pair_distribution(wf): nelec = 2 ndim = 3 nconfig = 1000 nstep = 100 tau = 0.2 sample, acc = metropolis_sample(np.random.randn(nelec, ndim, nconfig), wf, tau=tau, nstep=nstep) dist = np.mean((sample[0] - sample[1])**2)**0.5 print(dist) if __name__ == '__main__': wf = ExponentSlaterWF(1.0) pair_distribution(wf) wf = MultiplyWF(ExponentSlaterWF(1.0), JastrowWF(0.5)) pair_distribution(wf)
ke = -0.5 * np.sum(wf.laplacian(sample), axis=0) vion = ham.pot_en(sample) vee = ham.pot_ee(sample) for i in range(nconfig): for nm, quant in zip(quantities, [ke, vion, vee]): df[nm].append(quant[i]) df['alpha'].append(alpha) df['beta'].append(beta) df['acceptance'].append(acc) # Best Slater-Jastrow. for alpha in np.linspace(1.5, 2.5, 11): for beta in np.linspace(-0.5, 1.5, 11): wf = MultiplyWF(ExponentSlaterWF(alpha=alpha), JastrowWF(a_ee=beta)) sample, acc = metropolis_sample(np.random.randn( nelec, ndim, nconfig), wf, tau=tau, nstep=nstep) ke = -0.5 * np.sum(wf.laplacian(sample), axis=0) vion = ham.pot_en(sample) vee = ham.pot_ee(sample) for i in range(nconfig): for nm, quant in zip(quantities, [ke, vion, vee]): df[nm].append(quant[i]) df['alpha'].append(alpha) df['beta'].append(beta)