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
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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,
Ejemplo n.º 6
0
              "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)