def genPmpo(n, a, tau): # ai_a^+*aj_a + ai_b^+*aj_b # [ai]*[bj]*[ck]*[dl]=[abcd,ijkl] tijAA = reduce(numpy.kron, (cret, sgn, ann, idn)) tijBB = reduce(numpy.kron, (idn, cret, sgn, ann)) # -d^2/dx^2 [off-diagonal] tij = tijAA + tijBB tij = -0.5 * (tij + tij.T) e, v = scipy.linalg.eigh(tij) eij = numpy.einsum('ik,k,jk->ij', v, numpy.exp(-tau / a**2 * e), v) # (abcdijkl)->(abij,cdkl) eij = eij.reshape((2, 2, 2, 2, 2, 2, 2, 2)) eij = eij.transpose(0, 1, 4, 5, 2, 3, 6, 7) eij = eij.reshape((16, 16)) # not symmetric in bipartition u, s, vt = scipy.linalg.svd(eij) vl = u.reshape((4, 4, 16)) vl = vl.transpose((2, 0, 1)) vl = vl.reshape((1, 16, 4, 4)) vr = numpy.einsum('k,kj->kj', s, vt) vr = vr.reshape((16, 1, 4, 4)) # generate MPO prj_empo = genEvenOdd(n, 0, vl, vr) prj_ompo = genEvenOdd(n, 1, vl, vr) # apply t[diag]=exp(-tau/a^2*ni) tmp = numpy.identity(2) tmp[1, 1] = numpy.exp(-tau / a**2) tmp = tmp.reshape((1, 1, 2, 2)) wfacs = [tmp] * (2 * n) prj_dmpo = mpo_class.class_mpo(2 * n, sites=wfacs) prj_dmpo = prj_dmpo.merge([[2 * i, 2 * i + 1] for i in range(n)]) return prj_empo, prj_ompo, prj_dmpo
def genEVmpo(n, a, ng=40): # Quadrature sfac = 1.0 / (1.0 + 0.5 * kappa**2 * a**2) xts, wts = numpy.polynomial.hermite.hermgauss(ng) wij = numpy.exp(sfac * numpy.einsum('i,j->ij', xts, xts)) wij = numpy.einsum('i,ij,j->ij', numpy.sqrt(wts), wij, numpy.sqrt(wts)) # Wij = V[i,k]e[k]V[j,k] = A[i,k]A[j,k] => BAD for large ng !!! eig, v = scipy.linalg.eigh(wij) print 'ng=', ng print eig eig[numpy.argwhere(eig < 0.0)] = 0.0 wka = numpy.einsum('ik,k->ik', v, numpy.sqrt(eig)) # OBC tij = numpy.diag([1.0] * n) for i in range(n - 1): tij[i, i + 1] = tij[i + 1, i] = -0.5 * sfac cfac = 2.0 * kappa nfac = numpy.power(cfac*numpy.sqrt(numpy.linalg.det(tij)),1.0/n)/ \ numpy.sqrt(numpy.pi) # A,B,D A0 = nfac * numpy.einsum('k,ka->a', numpy.sqrt(wts), wka) B0 = nfac * numpy.einsum('k,ka->a', numpy.sqrt(wts) * xts, wka) * numpy.sqrt(sfac * a) D0 = nfac * numpy.einsum('k,ka->a', numpy.sqrt(wts) * xts * xts, wka) * (sfac * a) A1 = nfac * numpy.einsum('ka,kb->ab', wka, wka) B1 = nfac * numpy.einsum('k,ka,kb->ab', xts, wka, wka) * numpy.sqrt( sfac * a) D1 = nfac * numpy.einsum('k,ka,kb->ab', xts * xts, wka, wka) * (sfac * a) # Construction of MPOs idn = numpy.identity(4) nii = numpy.zeros((4, 4)) nii[1, 1] = 1.0 nii[2, 2] = 1.0 nud = numpy.zeros((4, 4)) nud[3, 3] = 1.0 # first [A0,B0,D0] site0 = numpy.zeros((1, 3 * ng, 4, 4)) site0[0, :ng] = numpy.einsum('a,mn->amn', A0, idn) site0[0, ng:2 * ng] = numpy.einsum('a,mn->amn', B0, nii) site0[0, 2 * ng:] = numpy.einsum('a,mn->amn', D0, nud) # last [D0,B0,A0] site1 = numpy.zeros((3 * ng, 1, 4, 4)) site1[:ng, 0] = numpy.einsum('a,mn->amn', D0, nud) site1[ng:2 * ng, 0] = numpy.einsum('a,mn->amn', B0, nii) site1[2 * ng:, 0] = numpy.einsum('a,mn->amn', A0, idn) # centeral # [A1,B1,D1] # [ 0,A1,B1] # [ 0, 0,A1] site2 = numpy.zeros((3 * ng, 3 * ng, 4, 4)) site2[:ng, :ng] = numpy.einsum('ab,mn->abmn', A1, idn) site2[ng:2 * ng, ng:2 * ng] = numpy.einsum('ab,mn->abmn', A1, idn) site2[2 * ng:, 2 * ng:] = numpy.einsum('ab,mn->abmn', A1, idn) site2[:ng, ng:2 * ng] = numpy.einsum('ab,mn->abmn', B1, nii) site2[ng:2 * ng, 2 * ng:] = numpy.einsum('ab,mn->abmn', B1, nii) site2[:ng, 2 * ng:] = numpy.einsum('ab,mn->abmn', D1, nud) sites = [site0] + [site2] * (n - 2) + [site1] vmpo = class_mpo(n, sites) return vmpo
def genHmpo(n, a, vne): wfacs = [] for i in range(n): t = 0.5 / a**2 U = 1.0 / a**2 + vne[i] tmp = mpo_dmrg_model.genHubbardSpatial(n, i, t, U) wfacs.append(tmp) tmpo = mpo_class.class_mpo(n, sites=wfacs) return tmpo
def genLmpo(n, tau, vi): wfacs = [] for i in range(2 * n): tmp = numpy.identity(2) tmp[1, 1] = numpy.exp(-tau * vi[i]) tmp = tmp.reshape((1, 1, 2, 2)) wfacs.append(tmp) lmpo = mpo_class.class_mpo(2 * n, sites=wfacs) lmpo = lmpo.merge([[2 * i, 2 * i + 1] for i in range(n)]) return lmpo
def genEvenOdd(n, iop, vl, vr): io = numpy.zeros((1, 1, 4, 4)) io[0, 0] = numpy.identity(4) if iop == 0: # apply t[even] if n % 2 == 0: wfacs = [vl, vr] * (n / 2) prj_mpo = mpo_class.class_mpo(n, sites=wfacs) else: wfacs = [vl, vr] * (n / 2) + [io] prj_mpo = mpo_class.class_mpo(n, sites=wfacs) else: # apply t[odd] if n % 2 == 0: wfacs = [io] + [vl, vr] * (n / 2) + [io] prj_mpo = mpo_class.class_mpo(n, sites=wfacs) else: wfacs = [io] + [vl, vr] * (n / 2) prj_mpo = mpo_class.class_mpo(n, sites=wfacs) return prj_mpo
def genGMPO(n,left,right,middle,ifnormalize=False): A0,B0,D0 = left A2,C2,D2 = right A1,B1,C1,D1 = middle ng = A0.shape[0] # Construction of MPOs idn = numpy.identity(4) nii = numpy.zeros((4,4)) nii[1,1] = 1.0 nii[2,2] = 1.0 nud = numpy.zeros((4,4)) nud[3,3] = 1.0 # first [A0,B0,D0] site0 = numpy.zeros((1,3*ng,4,4)) site0[0,:ng] = numpy.einsum('a,mn->amn',A0,idn) site0[0,ng:2*ng] = numpy.einsum('a,mn->amn',B0,nii) site0[0,2*ng:] = numpy.einsum('a,mn->amn',D0,nud) # last [D0,B0,A0] site1 = numpy.zeros((3*ng,1,4,4)) site1[:ng,0] = numpy.einsum('a,mn->amn',D2,nud) site1[ng:2*ng,0] = numpy.einsum('a,mn->amn',C2,nii) site1[2*ng:,0] = numpy.einsum('a,mn->amn',A2,idn) # centeral # [A1,B1,D1] # [ 0,A1,C1] # [ 0, 0,A1] site2 = numpy.zeros((3*ng,3*ng,4,4)) site2[:ng,:ng] = numpy.einsum('ab,mn->abmn',A1,idn) site2[ng:2*ng,ng:2*ng] = numpy.einsum('ab,mn->abmn',A1,idn) site2[2*ng:,2*ng:] = numpy.einsum('ab,mn->abmn',A1,idn) site2[:ng,ng:2*ng] = numpy.einsum('ab,mn->abmn',B1,nii) site2[ng:2*ng,2*ng:] = numpy.einsum('ab,mn->abmn',C1,nii) site2[:ng,2*ng:] = numpy.einsum('ab,mn->abmn',D1,nud) sites = [site0]+[site2]*(n-2)+[site1] # Normalization if ifnormalize: Z0 = reduce(numpy.dot,[A0]+[A1]*(n-2)+[A2]) scale = numpy.power(Z0,-1.0/n) print ' Z0=',Z0,' n=',n,' scale=',scale sites = map(lambda x:x*scale,sites) vmpo = class_mpo(n,sites) return vmpo
def genEVmpoTaylor(n,a,ng=40,iop=0): # Quadrature sfac = 1.0/(1.0+0.5*kappa0**2*a**2) # OBC tij = numpy.diag([1.0]*n) for i in range(n-1): tij[i,i+1] = tij[i+1,i] = -0.5*sfac cfac = Aref*2.0*kappa0 nfac = numpy.power(cfac*numpy.sqrt(numpy.linalg.det(tij)),1.0/n)/ \ numpy.sqrt(numpy.pi) import math def denorm(n1,n2=None): if n2 == None: return 1.0/math.sqrt(float(math.factorial(n1))) else: return 1.0/math.sqrt(float(math.factorial(n1))*float(math.factorial(n2))) A0 = numpy.array([0.5*(1+(-1)**n1)*sfac**(n1/2.0)*math.gamma((n1+1.0)/2.0)\ *denorm(n1) for n1 in range(ng)]) A1 = numpy.array([[0.5*(1+(-1)**(n1+n2))*sfac**((n1+n2)/2.0)*math.gamma((n1+n2+1.0)/2.0)\ *denorm(n1,n2) for n1 in range(ng)] for n2 in range(ng)]) nfac1 = numpy.power(cfac/reduce(numpy.dot,[A0]+[A1]*(n-2)+[A0.T]),1.0/n) print 'n=',n,reduce(numpy.dot,[A0]+[A1]*(n-2)+[A0.T]),\ numpy.pi**(n/2.0)/numpy.sqrt(numpy.linalg.det(tij)),\ nfac,nfac1 # New normalization factor if iop == 1: nfac = nfac1 # A,B,D A0 = nfac*numpy.array([0.5*(1+(-1)**n1)*sfac**(n1/2.0)*math.gamma((n1+1.0)/2.0)\ *denorm(n1) for n1 in range(ng)]) B0 = nfac*numpy.array([0.5*(1-(-1)**n1)*sfac**(n1/2.0)*math.gamma((n1+2.0)/2.0)\ *denorm(n1) for n1 in range(ng)])*numpy.sqrt(sfac*a) D0 = nfac*numpy.array([0.5*(1+(-1)**n1)*sfac**(n1/2.0)*math.gamma((n1+3.0)/2.0)\ *denorm(n1) for n1 in range(ng)])*(sfac*a) A1 = nfac*numpy.array([[0.5*(1+(-1)**(n1+n2))*sfac**((n1+n2)/2.0)*math.gamma((n1+n2+1.0)/2.0)\ *denorm(n1,n2) for n1 in range(ng)] for n2 in range(ng)]) B1 = nfac*numpy.array([[0.5*(1-(-1)**(n1+n2))*sfac**((n1+n2)/2.0)*math.gamma((n1+n2+2.0)/2.0)\ *denorm(n1,n2) for n1 in range(ng)] for n2 in range(ng)])*numpy.sqrt(sfac*a) D1 = nfac*numpy.array([[0.5*(1+(-1)**(n1+n2))*sfac**((n1+n2)/2.0)*math.gamma((n1+n2+3.0)/2.0)\ *denorm(n1,n2) for n1 in range(ng)] for n2 in range(ng)])*(sfac*a) # Construction of MPOs idn = numpy.identity(4) nii = numpy.zeros((4,4)) nii[1,1] = 1.0 nii[2,2] = 1.0 nud = numpy.zeros((4,4)) nud[3,3] = 1.0 # first [A0,B0,D0] site0 = numpy.zeros((1,3*ng,4,4)) site0[0,:ng] = numpy.einsum('a,mn->amn',A0,idn) site0[0,ng:2*ng] = numpy.einsum('a,mn->amn',B0,nii) site0[0,2*ng:] = numpy.einsum('a,mn->amn',D0,nud) # last [D0,B0,A0] site1 = numpy.zeros((3*ng,1,4,4)) site1[:ng,0] = numpy.einsum('a,mn->amn',D0,nud) site1[ng:2*ng,0] = numpy.einsum('a,mn->amn',B0,nii) site1[2*ng:,0] = numpy.einsum('a,mn->amn',A0,idn) # centeral # [A1,B1,D1] # [ 0,A1,B1] # [ 0, 0,A1] site2 = numpy.zeros((3*ng,3*ng,4,4)) site2[:ng,:ng] = numpy.einsum('ab,mn->abmn',A1,idn) site2[ng:2*ng,ng:2*ng] = numpy.einsum('ab,mn->abmn',A1,idn) site2[2*ng:,2*ng:] = numpy.einsum('ab,mn->abmn',A1,idn) site2[:ng,ng:2*ng] = numpy.einsum('ab,mn->abmn',B1,nii) site2[ng:2*ng,2*ng:] = numpy.einsum('ab,mn->abmn',B1,nii) site2[:ng,2*ng:] = numpy.einsum('ab,mn->abmn',D1,nud) sites = [site0]+[site2]*(n-2)+[site1] vmpo = class_mpo(n,sites) return vmpo
site1[:ng, 0] = numpy.einsum('a,mn->amn', D0, nii) / 2 site1[ng:2 * ng, 0] = numpy.einsum('a,mn->amn', B0, nii) site1[2 * ng:, 0] = numpy.einsum('a,mn->amn', A0, idn) # centeral # [A1,B1,D1] # [ 0,A1,B1] # [ 0, 0,A1] site2 = numpy.zeros((3 * ng, 3 * ng, 2, 2)) site2[:ng, :ng] = numpy.einsum('ab,mn->abmn', A1, idn) site2[ng:2 * ng, ng:2 * ng] = numpy.einsum('ab,mn->abmn', A1, idn) site2[2 * ng:, 2 * ng:] = numpy.einsum('ab,mn->abmn', A1, idn) site2[:ng, ng:2 * ng] = numpy.einsum('ab,mn->abmn', B1, nii) site2[ng:2 * ng, 2 * ng:] = numpy.einsum('ab,mn->abmn', B1, nii) site2[:ng, 2 * ng:] = numpy.einsum('ab,mn->abmn', D1, nii) / 2 sites = [site0] + [site2] * (n - 2) + [site1] mpo = class_mpo(n, sites) # Simpler MPO: # [1 sqrt(a) 1 ] # [0 a sqrt(a)] a=exp(-alpha*e)/(2*alpha)**(1/n) # [0 0 1 ] afac = numpy.exp(-alpha * e) site0 = numpy.zeros((1, 3, 2, 2)) site0[0, 0] = idn site0[0, 1] = numpy.sqrt(afac) * nii site0[0, 2] = nii / 2.0 site1 = numpy.zeros((3, 1, 2, 2)) site1[0, 0] = nii / 2.0 site1[1, 0] = numpy.sqrt(afac) * nii site1[2, 0] = idn site2 = numpy.zeros((3, 3, 2, 2))
mps, qnum = mpo_dmrg_io.loadMPS(fmps, icase=1) nsite = len(mps) # Hamiltonian fhop = h5py.File('./cal1/hop') nops = fhop['nops'].value assert nops == 1 wfacs = [0] * nsite for isite in range(nsite): gname = 'site' + str(isite) grp = fhop[gname] for iop in range(nops): wfacs[isite] = grp['op' + str(iop)].value + 0.j # H-MPO hmpo = mpo_class.class_mpo(nsite, sites=wfacs) # DM[i,i] mps0 = mps_class.class_mps(nsite, sites=mps, iop=1) e0 = mps0.dot(hmpo.dotMPS(mps0)) print('e0=', e0) maxM = 100 ttotal = 500. nstep = 5000 iorder = 4 prefix = './dataOrder' + str(iorder) tau = ttotal / nstep print('nstep=', nstep) slst = [0] #,1,2,3] #range(nsite)