Ejemplo n.º 1
0
import numpy as np
import sys
sys.path.append('../../../../../code_v4/')

from hamiltonian import Heisenberg_LR, print_Hamiltonian
from mf import hom_mf_solution, hom_mf_state, hom_mf_energy, mf_solution, mf_state, mf_energy
from ite import ITE_FCI
from qite import QITE
from binary_functions import Bas2Int
nspin = 2
R = 0.50
db = 0.01
bmax = 4.00

H = Heisenberg_LR(nspin, R)
print_Hamiltonian(H)

# AFM initial guess

psi_0 = np.zeros(2**nspin, dtype=complex)
xvec = [0, 1] * (nspin / 2)
xind = Bas2Int(xvec, 2)
psi_0[xind] = 1.0

ITE_FCI(H, db, bmax, psi0=psi_0)
QITE(H, db, bmax, lanczos=False, psi0=psi_0, ncheck=10)
Ejemplo n.º 2
0
def QITE_step(H_, psi_, db, xv, check):

    import time

    nalpha = len(H_)
    dn_ = 1.0

    if (xv is None):
        xv = []
        for alpha in range(nalpha):
            (A, h, imp, gmp) = H_[alpha]
            nact = imp.shape[0]
            xv.append(np.zeros(nact))

    for alpha in range(nalpha):
        # ----- target state

        t0 = time.time()
        delta_alpha, dnalpha_ = ExpmbH_alpha(H_, psi_, alpha, db)
        delta_alpha -= psi_.copy()
        dn_ *= dnalpha_
        Xop = []
        # ----- pauli action
        (A, h, imp, gmp) = H_[alpha]
        nact = imp.shape[0]
        # print('active:',imp)
        Pmu_psi = np.zeros(imp.shape, dtype=complex)
        for m in range(nact):
            Pmu_psi[m, :] = gmp[m, imp[m, :]] * psi_[imp[m, :]]

        t1 = time.time()

        # ----- set linear system
        Amat = np.dot(np.conj(Pmu_psi), Pmu_psi.T)
        # print('Amat:\n',Amat)
        Amat = 2.0 * np.real(Amat)

        t2 = time.time()
        bvec = np.dot(Pmu_psi, np.conj(delta_alpha))
        bvec = -2.0 * np.imag(bvec)
        t3 = time.time()

        if (check):
            x = SciLA.lstsq(Amat, bvec)[0]
        else:
            zct = np.dot(bvec, Amat)

            def cost_fun(vct):
                return LA.norm(np.dot(Amat, vct) - bvec)**2

            def J_cost_fun(vct):
                wct = np.dot(Amat, vct)
                wct = np.dot(Amat.T, wct)
                return 2.0 * (wct - zct)

            import scipy
            x = scipy.optimize.minimize(cost_fun,
                                        x0=xv[alpha],
                                        method='Newton-CG',
                                        jac=J_cost_fun,
                                        tol=1e-8).x
            xv[alpha] = x.copy()

        print('Pauli Operator')
        Xop.append((A, x, imp, gmp))
        print_Hamiltonian(Xop)
        # print_Hamiltonian(xv)
        #print('\n wavefunction before\n',Pmu_psi)
        t4 = time.time()
        psi_ = Exp_ixP(x, psi_, imp, gmp)
        #print('\n wavefunction after\n', psi_,'\n')
        t5 = time.time()

        # print alpha,t5-t4,t4-t3,t3-t2,t2-t1,t1-t0
        import sys
        sys.stdout.flush()
    # print('op:\n',xv)
    return psi_, dn_, xv, Xop