def genHRfacSpatialQt(pindx,nsite,isite,int1e,qpts,maxslc=1,model_u=0.): p,ip = pindx iop = 1 isym = 2 status = 'L' isz = p%2 site = mpo_dmrg_opers1e.genHRfacSpatial(pindx,nsite,isite,int1e,qpts,model_u) # Site physical indices qu,qd = qtensor_opers.genQphys(isym,isite) # Orbital dependent part ql1e,qr1e = qtensor_opers.genElemQnums(p,2*isite ,iop,status) ql2e,qr2e = qtensor_opers.genElemQnums(p,2*isite+1,iop,status) ql1 = ql1e qr1 = qr2e ql1w,qr1w = genWfacQnums(nsite,2*isite ,isz,status) ql2w,qr2w = genWfacQnums(nsite,2*isite+1,isz,status) ql2 = ql1w qr2 = qr2w ql = [q1+q2 for q1,q2 in itertools.product(ql1,ql2)] qr = [q1+q2 for q1,q2 in itertools.product(qr1,qr2)] if abs(model_u)>1.e-12: if isite == 0: qr += [[0.,0.]] elif isite == nsite//2-1: ql += [[0.,0.]] else: ql += [[0.,0.]] qr += [[0.,0.]] # Reduce symmetry: local spin rotation do not change particle number if ip is not None: ql = qtensor_util.reduceQnumsToN(ql) qr = qtensor_util.reduceQnumsToN(qr) qu = qtensor_util.reduceQnumsToN(qu) qd = qtensor_util.reduceQnumsToN(qd) # # We sort the internal quantum number first # nql = len(ql) nqr = len(qr) idxl = qtensor_opers.sortQnums(ql) idxr = qtensor_opers.sortQnums(qr) ql = numpy.array(ql)[idxl] qr = numpy.array(qr)[idxr] site = site[numpy.ix_(idxl,idxr)].copy() # Slice operators if necessary qts = qtensor.Qt(2) qts.maxslc[0] = min(maxslc,nql) qts.maxslc[1] = min(maxslc,nqr) qts.genDic() for islc in range(qts.maxslc[0]): slc0 = parallel_util.partitionSites(nql,qts.maxslc[0],islc) for jslc in range(qts.maxslc[1]): slc1 = parallel_util.partitionSites(nqr,qts.maxslc[1],jslc) ijdx = qts.ravel([islc,jslc]) qts.dic[ijdx] = qtensor.qtensor([False,True,False,True]) # Note that the qsyms for the last two dimensions are not collected qts.dic[ijdx].fromDenseTensor(site[numpy.ix_(slc0,slc1)],[ql[slc0],qr[slc1],qu,qd],ifcollect=[1,1,0,0]) qts.size[ijdx] = qts.dic[ijdx].size_allowed return qts
def genGlobalSpatialQt(nsite, isite, key): isym = 2 # (D,D,4,4) [D<=2] site = mpo_dmrg_spinopers.genGlobalSpatial(nsite, isite, key) # Status qt = qtensor.qtensor([False, True, False, True]) # Site physical indices qu, qd = qtensor_opers.genQphys(isym, isite) ql, qr = genSpinOpersQnums(nsite, isite, key) qt.fromDenseTensor(site, [ql, qr, qu, qd]) return qt
def genLocal2SpatialQt(nsite, isite, ig, jg, ikey, jkey, fac): isym = 2 # (D,D,4,4) [D<=2] site = mpo_dmrg_spinopers.genLocal2Spatial(nsite, isite, ig, jg, ikey, jkey, fac) # 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)] qt.fromDenseTensor(site, [ql, qr, qu, qd]) return qt
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 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