Ejemplo n.º 1
0
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
Ejemplo n.º 2
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
Ejemplo n.º 3
0
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
Ejemplo n.º 4
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
Ejemplo n.º 5
0
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
Ejemplo n.º 6
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
Ejemplo n.º 7
0
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
Ejemplo n.º 8
0
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