def renormNQt_S0I(dmrg,isite,ncsite,flst,flstN,site,status): if status == 'L': # Excited states if dmrg.comm.rank == 0 and dmrg.ifex: for iref in range(dmrg.nref): fket = dmrg.wfex[iref] ksite = mpo_dmrg_io.loadSite(fket,isite,dmrg.ifQt) if not dmrg.ifs2proj: fL = flst[1][2*iref] fN = flstN[1][iref] # SOP tmp = fL['mat'].value tmp = numpy.tensordot(site.conj(),tmp,axes=([0],[0])) tmp = numpy.tensordot(tmp,ksite,axes=([0,2],[1,0])) fN['mat'] = tmp # POP else: fLp = flst[1][2*iref] fNp = flstN[1][iref] nop = dmrg.npts for iop in range(nop): cop = dmrg.fpop['op'+str(iop)].value lop = fLp['opers'+str(iop)].value tmp = numpy.tensordot(site.conj(),lop,axes=([0],[1])) tmp = numpy.tensordot(cop,tmp,axes=([0,2],[2,0])) tmp = numpy.tensordot(tmp,ksite,axes=([1,3],[1,0])) fNp['opers'+str(iop)] = tmp elif status == 'R': jsite = isite+ncsite-1 # Excited states if dmrg.comm.rank == 0 and dmrg.ifex: for iref in range(dmrg.nref): fket = dmrg.wfex[iref] ksite = mpo_dmrg_io.loadSite(fket,jsite,dmrg.ifQt) if not dmrg.ifs2proj: fR = flst[1][2*iref+1] fN = flstN[1][iref] # SOP tmp = fR['mat'].value tmp = numpy.tensordot(site.conj(),tmp,axes=([2],[0])) tmp = numpy.tensordot(tmp,ksite,axes=([1,2],[1,2])) fN['mat'] = tmp # POP else: fRp = flst[1][2*iref+1] fNp = flstN[1][iref] nop = dmrg.npts for iop in range(nop): cop = dmrg.fpop['op'+str(iop)].value rop = fRp['opers'+str(iop)].value tmp = numpy.tensordot(site.conj(),rop,axes=([2],[1])) tmp = numpy.tensordot(cop,tmp,axes=([1,2],[2,1])) tmp = numpy.tensordot(tmp,ksite,axes=([1,3],[1,2])) fNp['opers'+str(iop)] = tmp return 0
def PBasPopsNQt(info,ndim0,prjmap,nref): dmrg,isite,ncsite,flst,status,ifsym = info ldim,cdim,rdim,ndim = dmrg.dims vt = numpy.zeros((nref,ndim0),dtype=dmrg_dtype) nop = dmrg.npts if ncsite == 1: for iref in range(nref): fLp = flst[1][2*iref] fRp = flst[1][2*iref+1] fket = dmrg.wfex[iref] vtensor = mpo_dmrg_io.loadSite(fket,isite,dmrg.ifQt) # Loop over operators for iop in range(nop): # / | \ # L *== W[p] ==* R # \ | / # ----*---- # Ket cop = dmrg.fpop['op'+str(iop)].value lop = fLp['opers'+str(iop)].value rop = fRp['opers'+str(iop)].value tmp = numpy.tensordot(lop,vtensor,axes=([2],[0])) # L[pia]*B[anb]=>T[pinb] tmp = numpy.tensordot(tmp,cop,axes=([0,2],[0,3])) # T[pinb]*W[pqmn]=>T[ibqm] tmp = numpy.tensordot(tmp,rop,axes=([1,2],[2,0])) # T[ibqm]*R[qjb]=>T[imj] vt[iref] += dmrg.qwts[iop]*tmp.reshape(ndim)[prjmap] elif ncsite == 2: assert cdim == 4*4 for iref in range(nref): fLp = flst[1][2*iref] fRp = flst[1][2*iref+1] fket = dmrg.wfex[iref] ksite1 = mpo_dmrg_io.loadSite(fket,isite,dmrg.ifQt) ksite2 = mpo_dmrg_io.loadSite(fket,isite+1,dmrg.ifQt) vtensor = numpy.tensordot(ksite1,ksite2,axes=([2],[0])) # Loop over operators for iop in range(nop): cop = dmrg.fpop['op'+str(iop)].value lop = fLp['opers'+str(iop)].value rop = fRp['opers'+str(iop)].value tmp = numpy.tensordot(lop,vtensor,axes=([2],[0])) # L[pia]*B[anmb]=>T[pinmb] (a) tmp = numpy.tensordot(tmp,cop,axes=([0,2],[0,3])) # T[pinmb]*W[pqen]=>T[imbqe] (p,n) tmp = numpy.tensordot(tmp,cop,axes=([1,3],[3,0])) # T[imbqe]*W[qrfm]=>T[iberf] (m,q) tmp = numpy.tensordot(tmp,rop,axes=([1,3],[2,0])) # T[iberf]*R[rjb]=>T[iefj] (b,r) vt[iref] += dmrg.qwts[iop]*tmp.reshape(ndim)[prjmap] return vt
def renormNQt_H0I(dmrg,isite,ncsite,flst,flstN,site,status,iHd=0,thresh=1.e-12): nop = dmrg.fhop['nops'].value if status == 'L': # Hamiltoinan operators for PT. if dmrg.ifpt: for iref in range(dmrg.nref): if iHd == 0: if abs(dmrg.coef[iref])<thresh: continue fL = flst[2][2*iref] fN = flstN[2][iref] elif iHd == 1: fL = flst[3][2*iref] fN = flstN[3][iref] fket = dmrg.wfex[iref] ksite = mpo_dmrg_io.loadSite(fket,isite,dmrg.ifQt) for iop in range(nop): cop = dmrg.fhop['site'+str(isite)+'/op'+str(iop)].value lop = fL['opers'+str(iop)].value tmp = numpy.tensordot(site.conj(),lop,axes=([0],[1])) tmp = numpy.tensordot(cop,tmp,axes=([0,2],[2,0])) tmp = numpy.tensordot(tmp,ksite,axes=([1,3],[1,0])) fN['opers'+str(iop)] = tmp elif status == 'R': jsite = isite+ncsite-1 # Hamiltoinan operators for PT. if dmrg.ifpt: for iref in range(dmrg.nref): if iHd == 0: if abs(dmrg.coef[iref])<thresh: continue fR = flst[2][2*iref+1] fN = flstN[2][iref] elif iHd == 1: fR = flst[3][2*iref+1] fN = flstN[3][iref] fket = dmrg.wfex[iref] ksite = mpo_dmrg_io.loadSite(fket,jsite,dmrg.ifQt) for iop in range(nop): cop = dmrg.fhop['site'+str(jsite)+'/op'+str(iop)].value rop = fR['opers'+str(iop)].value tmp = numpy.tensordot(site.conj(),rop,axes=([2],[1])) tmp = numpy.tensordot(cop,tmp,axes=([1,2],[2,1])) tmp = numpy.tensordot(tmp,ksite,axes=([1,3],[1,2])) fN['opers'+str(iop)] = tmp return 0
def PBasSopsNQt(info,ndim0,prjmap,nref): dmrg,isite,ncsite,flst,status,ifsym = info ldim,cdim,rdim,ndim = dmrg.dims vt = numpy.zeros((nref,ndim0),dtype=dmrg_dtype) if ncsite == 1: for iref in range(nref): fL = flst[1][2*iref] fR = flst[1][2*iref+1] lop = fL['mat'].value rop = fR['mat'].value fket = dmrg.wfex[iref] ksite1 = mpo_dmrg_io.loadSite(fket,isite,dmrg.ifQt) # L[u1,b]*A[b,n,c]*R[u2,c] = vec[u1,n,u2] tmp1 = numpy.tensordot(lop,ksite1,axes=([1],[0])) # LA[u1,n,c] tmp = numpy.tensordot(tmp1,rop,axes=([2],[1])) # LAR[u1,n,u2] vt[iref] = tmp.reshape(ndim)[prjmap] elif ncsite == 2: assert cdim == 4*4 for iref in range(nref): fL = flst[1][2*iref] fR = flst[1][2*iref+1] lop = fL['mat'].value rop = fR['mat'].value fket = dmrg.wfex[iref] ksite1 = mpo_dmrg_io.loadSite(fket,isite,dmrg.ifQt) ksite2 = mpo_dmrg_io.loadSite(fket,isite+1,dmrg.ifQt) # L[u1,b]*A[b,n,c]*B[c,m,d]*R[u2,d] = vec[u1,n,m,u2] tmp1 = numpy.tensordot(lop,ksite1,axes=([1],[0])) # LA[u1,n,c] tmp2 = numpy.tensordot(ksite2,rop,axes=([2],[1])) # BR[c,m,u2] tmp = numpy.tensordot(tmp1,tmp2,axes=([2],[0])) # LABR[u1,n,m,u2] vt[iref] = tmp.reshape(ndim)[prjmap] return vt
def genGuess(dmrg,isite,ncsite,actlst,civecs,srotR,status): if ncsite == 2: # R: --**, -**=, **== if status == 'R': # Boundary case - simply copy for the left sweep if isite == actlst[-1]: dmrg.psi0 = civecs.copy() elif 'site'+str(isite-1) in dmrg.flmps: for ieig in range(dmrg.neig): # Move (L*Vs)*U #tmp = numpy.einsum('abc,cde->abde',dmrg.lmps[isite-1],srotR[ieig]) tmp = mpo_dmrg_io.loadSite(dmrg.flmps,isite-1,dmrg.ifQt) if dmrg.ifQt: tmp = tmp.toDenseTensor(tmp.idlst) tmp = numpy.tensordot(tmp,srotR[ieig],axes=([2],[0])) s = numpy.prod(tmp.shape) if ieig == 0: dmrg.psi0 = numpy.zeros((dmrg.neig,s),dtype=dmrg_dtype) dmrg.psi0[ieig] = tmp.reshape(s).copy() # L: **--, =**-, ==** elif status == 'L': if isite == actlst[-1]: dmrg.psi0 = civecs.copy() elif 'site'+str(isite+2) in dmrg.frmps: for ieig in range(dmrg.neig): # Move U*(sV*R) #tmp = numpy.einsum('abc,cde->abde',srotR[ieig],dmrg.rmps[isite+2]) tmp = mpo_dmrg_io.loadSite(dmrg.frmps,isite+2,dmrg.ifQt) if dmrg.ifQt: tmp = tmp.toDenseTensor(tmp.idlst) tmp = numpy.tensordot(srotR[ieig],tmp,axes=([2],[0])) s = numpy.prod(tmp.shape) if ieig == 0: dmrg.psi0 = numpy.zeros((dmrg.neig,s),dtype=dmrg_dtype) dmrg.psi0[ieig] = tmp.reshape(s).copy() elif ncsite == 1: # R: ---*, --*=, -*==, *=== if status == 'R': # Boundary case if isite == actlst[-1]: dmrg.psi0 = civecs.copy() elif 'site'+str(isite-1) in dmrg.flmps: for ieig in range(dmrg.neig): # Move (L*Vs)*U #tmp = numpy.einsum('abc,cde->abde',dmrg.lmps[isite-1],srotR[ieig]) tmp = mpo_dmrg_io.loadSite(dmrg.flmps,isite-1,dmrg.ifQt) if dmrg.ifQt: tmp = tmp.toDenseTensor(tmp.idlst) tmp = numpy.tensordot(tmp,srotR[ieig],axes=([2],[0])) s = numpy.prod(tmp.shape) if ieig == 0: dmrg.psi0 = numpy.zeros((dmrg.neig,s),dtype=dmrg_dtype) dmrg.psi0[ieig] = tmp.reshape(s).copy() # L: *---, =*--, ==*-, ===* elif status == 'L': if isite == actlst[-1]: dmrg.psi0 = civecs.copy() elif 'site'+str(isite+1) in dmrg.frmps: for ieig in range(dmrg.neig): # Move U*(sV*R) #tmp = numpy.einsum('abc,cde->abde',srotR[ieig],dmrg.rmps[isite+1]) tmp = mpo_dmrg_io.loadSite(dmrg.frmps,isite+1,dmrg.ifQt) if dmrg.ifQt: tmp = tmp.toDenseTensor(tmp.idlst) tmp = numpy.tensordot(srotR[ieig],tmp,axes=([2],[0])) s = numpy.prod(tmp.shape) if ieig == 0: dmrg.psi0 = numpy.zeros((dmrg.neig,s),dtype=dmrg_dtype) dmrg.psi0[ieig] = tmp.reshape(s).copy() return 0
def BVecNQt(info,ndim0,prjmap,iHd,thresh=1.e-12): dmrg,isite,ncsite,flst,status,ifsym = info ldim,cdim,rdim,ndim = dmrg.dims nop = dmrg.nops if iHd == 0: bvec = numpy.zeros(ndim0,dtype=dmrg_dtype) elif iHd == 1: bvec = numpy.zeros((dmrg.nref,ndim0),dtype=dmrg_dtype) if ncsite == 1: for iref in range(dmrg.nref): if iHd == 0: if abs(dmrg.coef[iref])<thresh: continue fL = flst[2][2*iref] fR = flst[2][2*iref+1] elif iHd == 1: fL = flst[3][2*iref] fR = flst[3][2*iref+1] fket = dmrg.wfex[iref] qvec = mpo_dmrg_io.loadSite(fket,isite,dmrg.ifQt) hvec = numpy.zeros((ldim,cdim,rdim),dtype=dmrg_dtype) # Loop over operators for iop in range(nop): porb,ipop = dmrg.opers[iop] cop = dmrg.fhop['site'+str(isite)+'/op'+str(iop)].value # lop[a,bdim1,kdim1]*cop[a,b,ndim,ndim']*rop[b,bdim2,kdim2] lop = fL['opers'+str(iop)].value rop = fR['opers'+str(iop)].value tmp = numpy.tensordot(lop,qvec,axes=([2],[0])) # L[pia]*B[anb]=>T[pinb] tmp = numpy.tensordot(tmp,cop,axes=([0,2],[0,3])) # T[pinb]*W[pqmn]=>T[ibqm] tmp = numpy.tensordot(tmp,rop,axes=([1,2],[2,0])) # T[ibqm]*R[qjb]=>T[imj] hvec += dmrg.hpwts[iop]*tmp if iHd == 0: bvec += hvec.reshape(ndim)[prjmap]*dmrg.coef[iref] elif iHd == 1: bvec[iref] = hvec.reshape(ndim)[prjmap] elif ncsite == 2: jsite = isite+1 assert cdim == 4*4 for iref in range(dmrg.nref): if iHd == 0: if abs(dmrg.coef[iref])<thresh: continue fL = flst[2][2*iref] fR = flst[2][2*iref+1] elif iHd == 1: fL = flst[3][2*iref] fR = flst[3][2*iref+1] fket = dmrg.wfex[iref] ksite1 = mpo_dmrg_io.loadSite(fket,isite,dmrg.ifQt) ksite2 = mpo_dmrg_io.loadSite(fket,isite+1,dmrg.ifQt) qvec = numpy.tensordot(ksite1,ksite2,axes=([2],[0])) hvec = numpy.zeros((ldim,4,4,rdim),dtype=dmrg_dtype) # Loop over operators for iop in range(nop): porb,ipop = dmrg.opers[iop] cop = dmrg.fhop['site'+str(isite)+'/op'+str(iop)].value wop = dmrg.fhop['site'+str(jsite)+'/op'+str(iop)].value # lop[a,bdim1,kdim1]*cop[a,b,ndim,ndim']*rop[b,bdim2,kdim2] lop = fL['opers'+str(iop)].value rop = fR['opers'+str(iop)].value tmp = numpy.tensordot(lop,qvec,axes=([2],[0])) # L[pia]*B[anmb]=>T[pinmb] (a) tmp = numpy.tensordot(tmp,cop,axes=([0,2],[0,3])) # T[pinmb]*W[pqen]=>T[imbqe] (p,n) tmp = numpy.tensordot(tmp,wop,axes=([1,3],[3,0])) # T[imbqe]*W[qrfm]=>T[iberf] (m,q) tmp = numpy.tensordot(tmp,rop,axes=([1,3],[2,0])) # T[iberf]*R[rjb]=>T[iefj] (b,r) hvec += dmrg.hpwts[iop]*tmp if iHd == 0: bvec += hvec.reshape(ndim)[prjmap]*dmrg.coef[iref] elif iHd == 1: bvec[iref] = hvec.reshape(ndim)[prjmap] return bvec
def genHopsNQt(dmrg, fbmps, fkmps, fname, status, debug=False): if dmrg.comm.rank == 0: print '[mpo_dmrg_init.genHopsNQt] status=', status print ' fname = ', fname t0 = time.time() opIndices = dmrg.opers nop = dmrg.fhop['nops'].value # sites bnsite = fbmps['nsite'].value knsite = fkmps['nsite'].value assert bnsite == knsite nsite = bnsite prefix = fname + '_site_' if debug: print ' opIndices = ', opIndices print ' fname = ', fname print ' nop = ', nop print ' nsite = ', nsite # L->R sweeps if status == 'L': genBopsNQt(fname, nop, -1) for isite in range(0, nsite): if debug: print ' isite=', isite, ' of nsite=', nsite ti = time.time() f0 = h5py.File(prefix + str(isite - 1), "r") f1name = prefix + str(isite) f1 = h5py.File(f1name, "w") bsite = mpo_dmrg_io.loadSite(fbmps, isite, dmrg.ifQt) ksite = mpo_dmrg_io.loadSite(fkmps, isite, dmrg.ifQt) if isite == nsite - 1: exphop = numpy.zeros(nop, dtype=dmrg_dtype) for iop in range(nop): if debug: print ' iop=', iop, ' of nop=', nop cop = dmrg.fhop['site' + str(isite) + '/op' + str(iop)].value tmp = f0['opers' + str(iop)].value #--- kernel --- tmp = numpy.tensordot(bsite.conj(), tmp, axes=([0], [1])) # imj,pia->mjpa tmp = numpy.tensordot(cop, tmp, axes=([0, 2], [2, 0])) # pqmn,mjpa->qnja tmp = numpy.tensordot(tmp, ksite, axes=([1, 3], [1, 0])) # qnja,anb->qjb #--- kernel --- f1['opers' + str(iop)] = tmp # Get the expectation value <psi|Hx|psi> at the boundary if isite == nsite - 1: exphop[iop] = tmp[0, 0, 0] f0.close() f1.close() # final isite tf = time.time() if dmrg.comm.rank == 0: print ' isite =',os.path.split(f1name)[-1],\ ' nop =',nop,' t = %.2f s'%(tf-ti) elif status == 'R': genBopsNQt(fname, nop, nsite) for isite in range(nsite - 1, -1, -1): if debug: print ' isite=', isite, ' of nsite=', nsite ti = time.time() f0 = h5py.File(prefix + str(isite + 1), "r") f1name = prefix + str(isite) f1 = h5py.File(f1name, "w") bsite = mpo_dmrg_io.loadSite(fbmps, isite, dmrg.ifQt) ksite = mpo_dmrg_io.loadSite(fkmps, isite, dmrg.ifQt) if isite == 0: exphop = numpy.zeros(nop, dtype=dmrg_dtype) for iop in range(nop): if debug: print ' iop=', iop, ' of nop=', nop cop = dmrg.fhop['site' + str(isite) + '/op' + str(iop)].value tmp = f0['opers' + str(iop)].value #--- kernel --- tmp = numpy.tensordot(bsite.conj(), tmp, axes=([2], [1])) # imj,qjb->imqb tmp = numpy.tensordot(cop, tmp, axes=([1, 2], [2, 1])) # pqmn,imqb->pnib tmp = numpy.tensordot(tmp, ksite, axes=([1, 3], [1, 2])) # pnib,anb->pia #--- kernel --- f1['opers' + str(iop)] = tmp # Get the expectation value <psi|Hx|psi> at the boundary if isite == 0: exphop[iop] = tmp[0, 0, 0] f0.close() f1.close() # final isite tf = time.time() if dmrg.comm.rank == 0: print ' isite =',os.path.split(f1name)[-1],\ ' nop =',nop,' t = %.2f s'%(tf-ti) t1 = time.time() dmrg.comm.Barrier() print ' time for genHops = %.2f s' % (t1 - t0), ' rank =', dmrg.comm.rank return exphop
def genSopsNQt(dmrg, fbmps, fkmps, fname, status, debug=False): if dmrg.comm.rank == 0: print '[mpo_dmrg_init.genSopsNQt] status=', status print ' fname = ', fname t0 = time.time() # sites bnsite = fbmps['nsite'].value knsite = fkmps['nsite'].value assert bnsite == knsite nsite = bnsite prefix = fname + '_site_' if debug: print ' fname = ', fname print ' nsite = ', nsite # L->R sweeps if status == 'L': genBmatNQt(fname, -1) for isite in range(0, nsite): if debug: print ' isite=', isite, ' of nsite=', nsite ti = time.time() f0 = h5py.File(prefix + str(isite - 1), "r") f1name = prefix + str(isite) f1 = h5py.File(f1name, "w") bsite = mpo_dmrg_io.loadSite(fbmps, isite, dmrg.ifQt) ksite = mpo_dmrg_io.loadSite(fkmps, isite, dmrg.ifQt) # # i-------j # / | # * |m # \ | # a-------b # tmp = f0['mat'].value #--- kernel --- tmp = numpy.tensordot(tmp, bsite.conj(), axes=([0], [0])) # ia,imj->amj tmp = numpy.tensordot(tmp, ksite, axes=([0, 1], [0, 1])) # amj,amb->jb #--- kernel --- f1['mat'] = tmp # Get the expectation value <psi|Hx|psi> at the boundary, # Here, unlike the exphop, expsop is just a scalar <l|r>. if isite == nsite - 1: expsop = tmp[0, 0] f0.close() f1.close() # final isite tf = time.time() if dmrg.comm.rank == 0: print ' isite =',os.path.split(f1name)[-1],\ ' t = %.2f s'%(tf-ti) elif status == 'R': genBmatNQt(fname, nsite) for isite in range(nsite - 1, -1, -1): if debug: print ' isite=', isite, ' of nsite=', nsite ti = time.time() f0 = h5py.File(prefix + str(isite + 1), "r") f1name = prefix + str(isite) f1 = h5py.File(f1name, "w") bsite = mpo_dmrg_io.loadSite(fbmps, isite, dmrg.ifQt) ksite = mpo_dmrg_io.loadSite(fkmps, isite, dmrg.ifQt) # # i-------j # | \ # m| * # | / # a-------b # tmp = f0['mat'].value #--- kenerl --- tmp = numpy.tensordot(bsite.conj(), tmp, axes=([2], [0])) # imj,jb->imb tmp = numpy.tensordot(tmp, ksite, axes=([1, 2], [1, 2])) # imb,amb->ia #--- kenerl --- f1['mat'] = tmp # Get the expectation value <psi|Hx|psi> at the boundary if isite == 0: expsop = tmp[0, 0] f0.close() f1.close() # final isite tf = time.time() if dmrg.comm.rank == 0: print ' isite =',os.path.split(f1name)[-1],\ ' t = %.2f s'%(tf-ti) t1 = time.time() print ' time for genSops = %.2f s' % (t1 - t0), ' rank =', dmrg.comm.rank return expsop