Beispiel #1
0
def test_fft_kpq(nalpha):
    # Create regular grid.
    nmax = 2
    mesh = [2 * nmax + 1] * 2
    grid, eigs = generate_fft_grid(mesh)

    qmax = 2 * nmax
    qmesh = [2 * qmax + 1] * 2
    qgrid, qeigs = generate_fft_grid(qmesh)

    # Create wavefunction
    nbasis = len(grid)

    numpy.random.seed(7)

    psi = get_random_wavefunction((nalpha, nalpha), nbasis)
    I = get_random_wavefunction((nalpha, nalpha), nbasis)
    trial = I[:, :nalpha].conj()

    G, Gh = gab_mod(trial, psi[:, :nalpha])
    nqgrid = numpy.prod(qmesh)

    # Check by direct convolution f(q) = \sum_G Psi[G+Q] Gh[G].
    fq_direct = numpy.zeros(nqgrid, dtype=numpy.complex128)
    for i, q in enumerate(qgrid):
        for j, k in enumerate(grid):
            kpq = k + q
            ikpq = lookup(kpq, grid)
            if ikpq is not None:
                fq_direct[i] += trial[ikpq, 0] * Gh[0, j]

    trial_grid = numpy.flip(trial[:, 0]).reshape(mesh)
    Gh_grid = Gh[0, :].reshape(mesh)

    # Check by fft convolve
    # Compare to fq
    fq_conv = numpy.zeros(nqgrid, dtype=numpy.complex128)
    fq_conv += nqgrid * convolve(Gh_grid, trial_grid, mesh)
    fq_conv = numpy.flip(fq_conv)

    import scipy.signal
    fq_conv_sc = numpy.flip(
        scipy.signal.fftconvolve(Gh_grid, trial_grid).ravel())

    import matplotlib.pyplot as pl
    pl.plot(fq_conv, label='fft')
    pl.plot(fq_conv_sc, label='fft_scipy')
    pl.plot(fq_direct, label='direct')
    # pl.plot(fq, label='from_gf')
    pl.legend()
    pl.show()
Beispiel #2
0
def test_walker_energy():
    numpy.random.seed(7)
    nelec = (2, 2)
    nmo = 5
    h1e, chol, enuc, eri = generate_hamiltonian(nmo, nelec, cplx=False)
    system = Generic(nelec=nelec,
                     h1e=h1e,
                     chol=chol,
                     ecore=enuc,
                     inputs={'integral_tensor': False})
    (e0, ev), (d, oa, ob) = simple_fci(system, gen_dets=True)
    na = system.nup
    init = get_random_wavefunction(nelec, nmo)
    init[:, :na], R = reortho(init[:, :na])
    init[:, na:], R = reortho(init[:, na:])
    trial = MultiSlater(system, (ev[:, 0], oa, ob), init=init)
    trial.calculate_energy(system)
    walker = MultiDetWalker({}, system, trial)
    nume = 0
    deno = 0
    for i in range(trial.ndets):
        psia = trial.psi[i, :, :na]
        psib = trial.psi[i, :, na:]
        oa = numpy.dot(psia.conj().T, init[:, :na])
        ob = numpy.dot(psib.conj().T, init[:, na:])
        isa = numpy.linalg.inv(oa)
        isb = numpy.linalg.inv(ob)
        ovlp = numpy.linalg.det(oa) * numpy.linalg.det(ob)
        ga = numpy.dot(init[:, :system.nup], numpy.dot(isa, psia.conj().T)).T
        gb = numpy.dot(init[:, system.nup:], numpy.dot(isb, psib.conj().T)).T
        e = local_energy(system, numpy.array([ga, gb]), opt=False)[0]
        nume += trial.coeffs[i].conj() * ovlp * e
        deno += trial.coeffs[i].conj() * ovlp
    print(nume / deno, nume, deno, e0[0])
Beispiel #3
0
def test_fft_kmq(nalpha):
    # Create regular grid.
    nmax = 1
    mesh = [2 * nmax + 1] * 3
    grid, eigs = generate_fft_grid(mesh)
    qmax = 2 * nmax
    qmesh = [2 * qmax + 1] * 3
    qgrid, qeigs = generate_fft_grid(qmesh)
    # Create wavefunction
    nbasis = len(grid)
    # numpy.random.seed(7)
    psi = get_random_wavefunction((nalpha, nalpha), nbasis)
    I = get_random_wavefunction((nalpha, nalpha), nbasis)

    # Select lowest energy states for trial
    trial = I[:, :nalpha].conj()
    G, Gh = gab_mod(trial, psi[:, :nalpha])
    nqgrid = numpy.prod(qmesh)

    # # Check by direct convolution f(q) = \sum_G Psi[G-Q] Gh[G].
    fq_direct = numpy.zeros(nqgrid, dtype=numpy.complex128)
    for iq, q in enumerate(qgrid):
        for i, g in enumerate(grid):
            gmq = g - q
            igmq = lookup(gmq, grid)
            if igmq is not None:
                fq_direct[iq] += trial[igmq, 0] * Gh[0, i]

    trial_grid = trial[:, 0].reshape(mesh)
    Gh_grid = numpy.flip(Gh[0, :]).reshape(mesh)

    # Check by fft convolve
    # Compare to fq
    fq_conv = numpy.zeros(nqgrid, dtype=numpy.complex128)
    fq_conv += nqgrid * convolve(trial_grid, Gh_grid, mesh)
    fq_conv = numpy.flip(fq_conv)

    import scipy.signal
    fq_conv_sc = numpy.flip(
        scipy.signal.fftconvolve(trial_grid, Gh_grid).ravel())

    import matplotlib.pyplot as pl
    pl.plot(fq_conv, label='fft')
    pl.plot(fq_conv_sc, label='fft_scipy')
    pl.plot(fq_direct, label='direct')
    pl.legend()
    pl.show()
Beispiel #4
0
def test_fft_kpq(nalpha):
    # Create regular grid.
    nmax = 2
    mesh = [2*nmax+1]*1
    grid, eigs = generate_fft_grid(mesh)
    
    qmax = 2*nmax
    qmesh = [2*qmax+1]*1
    qgrid, qeigs = generate_fft_grid(qmesh)

    # Create wavefunction
    nbasis = len(grid)
    
    numpy.random.seed(7)

    psi = get_random_wavefunction((nalpha,nalpha), nbasis)
    I = numpy.eye(nbasis, dtype=numpy.complex128)
    # print(I.shape)
    I = get_random_wavefunction((nalpha,nalpha), nbasis)
    # print(I.shape)
    # exit()

    # Select lowest energy states for trial
    trial = I[:,:nalpha].conj()
    trial.imag[:] = 0
    G, Gh = gab_mod(trial,psi[:,:nalpha])
    nqgrid = numpy.prod(qmesh)

    # # Check by direct convolution f(q) = \sum_G Psi[G+Q] Gh[G].
    print(grid.shape)
    fq_direct = numpy.zeros(nqgrid, dtype=numpy.complex128)
    for iq, q in enumerate(qgrid):
        Gtrace_direct = 0
        # for a in range(nalpha):
        # compute \sum_G f_G(q)
        for i, k in enumerate(grid):
            kpq = k+q
            ikpq = lookup(kpq, grid)
            if ikpq is not None:
                Gtrace_direct += trial[ikpq,0] * Gh[0,i]
        fq_direct[iq] = Gtrace_direct

    # Check by fft convolve
    # Compare to fq
    fq_conv = numpy.zeros(nqgrid, dtype=numpy.complex128)
    trial_pq = trial[:,0].copy()
    Gh_pq = Gh[0,:].copy()

    fq_conv += nqgrid*convolve(Gh_pq, numpy.flip(trial_pq), mesh)
    fq_conv = numpy.flip(fq_conv)

    import scipy.signal
    fq_conv_sc = numpy.flip(scipy.signal.fftconvolve(
            Gh_pq,numpy.flip(trial_pq)).ravel())

    import matplotlib.pyplot as pl
    pl.plot(fq_conv, label='fft')
    pl.plot(fq_conv_sc, label='fft_scipy')
    pl.plot(fq_direct, label='direct')
    # pl.plot(fq, label='from_gf')
    pl.legend()
    pl.show()
Beispiel #5
0
def test_fft_kmq(nalpha):
    # Create regular grid.
    nmax = 2
    mesh = [2*nmax+1]*1
    grid, eigs = generate_fft_grid(mesh)
    
    qmax = 2*nmax
    qmesh = [2*qmax+1]*1
    qgrid, qeigs = generate_fft_grid(qmesh)

    # Create wavefunction
    nbasis = len(grid)
    
    numpy.random.seed(7)

    psi = get_random_wavefunction((nalpha,nalpha), nbasis)
    I = numpy.eye(nbasis, dtype=numpy.complex128)
    # print(I.shape)
    I = get_random_wavefunction((nalpha,nalpha), nbasis)
    # print(I.shape)
    # exit()

    # Select lowest energy states for trial
    trial = I[:,:nalpha].conj()
    trial.imag[:] = 0
    
    G, Gh = gab_mod(trial,psi[:,:nalpha])
    nqgrid = numpy.prod(qmesh)

    # # Check by direct convolution f(q) = \sum_G Psi[G+Q] Gh[G].
    print(grid.shape)
    fq_direct = numpy.zeros(nqgrid, dtype=numpy.complex128)
    for iq, q in enumerate(qgrid):
        Gtrace_direct = 0
        # for a in range(nalpha):
        # compute \sum_G f_G(q)
        for i, k in enumerate(grid):
            # kmq = q-k
            kmq = k-q
            ikmq = lookup(kmq, grid)
            # idx = numpy.argwhere(basis == q-k)
            # print(idx, ikmq)
            if ikmq is not None:
                Gtrace_direct += trial[i,0] * Gh[0,ikmq]
        fq_direct[iq] = Gtrace_direct
    print("trial[igmq,0] = {}".format(trial[:,0]))
    print("Gh[0,i] = {}".format(Gh[0,:]))
    # Check by fft convolve
    # Compare to fq
    fq_conv = numpy.zeros(nqgrid, dtype=numpy.complex128)
    trial_pq = trial[:,0].copy()
    Gh_pq = Gh[0,:].copy()

    # \sum_G f(G-Q) g(G)
    # -G-Q -> G'
    # \sum_G g(-G-Q) f(-G) = \sum_G g(G) f(G+Q)
    # trial_pq = numpy.conj(trial_pq)
    fq_conv += nqgrid*convolve(Gh_pq, numpy.flip(trial_pq), mesh)
    fq_conv = numpy.flip(fq_conv)

    import scipy.signal
    fq_conv_sc = numpy.flip(scipy.signal.fftconvolve(
            Gh_pq,numpy.flip(trial_pq)).ravel())

    # for i in range(qmesh[0]):
    #     target = fq_conv[i]
    #     print(numpy.abs(target))
    #     if (numpy.abs(target) > 1e-8):
    #         # print(target)
    #         idx = numpy.argwhere(numpy.abs(fq_direct - target) < 1e-8)
    #         # print(i, idx)


    import matplotlib.pyplot as pl
    pl.plot(fq_conv, label='fft')
    pl.plot(fq_conv_sc, label='fft_scipy')
    pl.plot(fq_direct, label='direct')
    # pl.plot(fq, label='from_gf')
    pl.legend()
    pl.show()