def genMPO_Local2Rpt(nsite,ig,jg,ikey,jkey,fac,fname,xts,ifQt,debug=False): if debug: print('\n[mpo_dmrg_propsMPORpt.genMPO_Local2Rpt] fname=',fname) if debug: print(' ig=',ig,' jg=',jg,' ikey/jkey=',(ikey,jkey)) t0 = time.time() fop = h5py.File(fname,'w') npt = len(xts) nop = 1*npt fop['nop'] = nop for isite in range(nsite): ti = time.time() gname = 'site'+str(isite) grp = fop.create_group(gname) if not ifQt: cop = mpo_dmrg_spinopers.genLocal2Spatial(nsite,isite,ig,jg,ikey,jkey,fac) for ipt in range(npt): rop = mpo_dmrg_opers.genExpISyPhiMat(xts[ipt]) wop = numpy.tensordot(cop,rop,axes=([3],[0])) grp['op'+str(ipt)] = wop else: for ipt in range(npt): cop = qtensor_spinopers.genLocal2RSpatialQt(nsite,isite,ig,jg,ikey,jkey,fac,xts[ipt]) cop.dump(grp,'op'+str(ipt)) tf = time.time() if debug: print(' isite =',isite,' time = %.2f s'%(tf-ti)) t1 = time.time() if debug: print(' time for genMPO_Local2Rpt = %.2f s'%(t1-t0)) return fop
def genLocalRSpatialQt(nsite,isite,ig,key,phi): isym = 2 # (D,D,4,4) [D<=2] cop = mpo_dmrg_spinopers.genLocalSpatial(nsite,isite,ig,key) rop = mpo_dmrg_opers.genExpISyPhiMat(phi) site = numpy.tensordot(cop,rop,axes=([3],[0])) # Status qt = qtensor.qtensor([False,True,False,True]) # Site physical indices qu,qd = qtensor_opers.genQphys(isym,isite) ql,qr = genSpinOpersQnums(nsite,isite,key) # Reduce symmetry qu = qtensor_util.reduceQnumsToN(qu) qd = qtensor_util.reduceQnumsToN(qd) ql = qtensor_util.reduceQnumsToN(ql) qr = qtensor_util.reduceQnumsToN(qr) qt.fromDenseTensor(site,[ql,qr,qu,qd],ifcollect=[0,0,0,0]) return qt
def genElemProductRSpatialQt(oplst, isite, phi): isym = 2 # (1,1,4,4) cop = mpo_dmrg_opers.genElemProductSpatial(oplst, isite) rop = mpo_dmrg_opers.genExpISyPhiMat(phi) site = numpy.tensordot(cop, rop, axes=([3], [0])) # Status qt = qtensor.qtensor([False, True, False, True]) # Site physical indices qu, qd = genQphys(isym, isite) # Orbital dependent part ql, qr = genElemProductQnums(oplst, isite) # Reduce symmetry: local spin rotation do not change particle number qu = qtensor_util.reduceQnumsToN(qu) qd = qtensor_util.reduceQnumsToN(qd) ql = qtensor_util.reduceQnumsToN(ql) qr = qtensor_util.reduceQnumsToN(qr) # Final conversion qt.fromDenseTensor(site, [ql, qr, qu, qd], ifcollect=[0, 0, 0, 0]) return qt
def genLocal2RSpatialQt(nsite,isite,ig,jg,ikey,jkey,fac,phi): isym = 2 # (D,D,4,4) [D<=2] cop = mpo_dmrg_spinopers.genLocal2Spatial(nsite,isite,ig,jg,ikey,jkey,fac) rop = mpo_dmrg_opers.genExpISyPhiMat(phi) site = numpy.tensordot(cop,rop,axes=([3],[0])) # Status qt = qtensor.qtensor([False,True,False,True]) # Site physical indices qu,qd = qtensor_opers.genQphys(isym,isite) qli,qri = genSpinOpersQnums(nsite,isite,ikey) qlj,qrj = genSpinOpersQnums(nsite,isite,jkey) # Direct product of quantum numbers ql = [q1+q2 for q1,q2 in itertools.product(qli,qlj)] qr = [q1+q2 for q1,q2 in itertools.product(qri,qrj)] # Reduce symmetry qu = qtensor_util.reduceQnumsToN(qu) qd = qtensor_util.reduceQnumsToN(qd) ql = qtensor_util.reduceQnumsToN(ql) qr = qtensor_util.reduceQnumsToN(qr) qt.fromDenseTensor(site,[ql,qr,qu,qd],ifcollect=[0,0,0,0]) return qt