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)
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. alpha = 2.0 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) df['acceptance'].append(acc)