def get_mps(K,Jp,J1=1.,J2=0.2412,nsite=30,which='finite',data_file=None): ''' Run finite-DMFT/lanczos for two impurity Kondo model to get the Ground state energy. Parameters: :J1/J2/K/Jp: float, the parameters defining the model. :nsite: integer, the number of sites, must be even. :which: 'finite'/'lanczos', select the method to solve the chain, 'finite dmrg' or 'lanczos'. ''' assert(which=='finite' or which=='lanczos') assert(nsite%2==0) model=TIKM(J1=J1,J2=J2,K=K,Jp=Jp,nsite=nsite) hgen=SpinHGen(spaceconfig=model.spaceconfig,evolutor=MaskedEvolutor(hndim=model.spaceconfig.hndim) if which=='finite' else NullEvolutor(hndim=2)) dmrgegn=DMRGEngine(hchain=model.H_serial,hgen=hgen,tol=0) if which=='lanczos': H=get_H(H=model.H_serial,hgen=hgen) EG,EV=eigsh(H,k=1) mps=state2MPS(EV[:,0]) else: EG=dmrgegn.run_finite(endpoint=(2,'<-',0),maxN=[10,20],tol=0)[-1] mps=dmrgegn.get_mps(direction='<-') #right normalized initial state if data_file is not None: mps.save(data_file) return mps
def test_dmrg_infinite(self): '''test for infinite dmrg.''' maxiter=100 model=self.get_model(maxiter+2,1) hgen=SpinHGen(spaceconfig=SpinSpaceConfig([2,1]),evolutor=MaskedEvolutor(hndim=2)) dmrgegn=DMRGEngine(hchain=model.H_serial,hgen=hgen,tol=0) EG=dmrgegn.run_infinite(maxiter=maxiter,maxN=20,tol=0)[-1] assert_almost_equal(EG,0.25-log(2),decimal=2)
def dmrgrun(self,model): '''Get the result from DMRG''' #run dmrg to get the initial guess. hgen=ExpandGenerator(spaceconfig=model.spaceconfig,H=model.H_serial,evolutor_type='masked') dmrgegn=DMRGEngine(hgen=hgen,tol=0,reflect=True) dmrgegn.use_U1_symmetry('M',target_block=zeros(1)) EG,mps=dmrgegn.run_finite(endpoint=(5,'<-',0),maxN=30,tol=1e-12) return EG,mps
def test_dmrg_infinite(self): '''test for infinite dmrg.''' maxiter=100 model=self.get_model(maxiter+2,1) hgen=RGHGen(spaceconfig=SpinSpaceConfig([2,1]),H=model.H_serial,evolutor_type='masked') dmrgegn=DMRGEngine(hgen=hgen,tol=0,reflect=True) dmrgegn.use_U1_symmetry('M',target_block=0) EG=dmrgegn.run_infinite(maxiter=maxiter,maxN=20,tol=0)[0] assert_almost_equal(EG,0.25-log(2),decimal=2)
def test_dmrg_infinite(self): '''test for infinite dmrg.''' maxiter = 100 model = self.get_model(maxiter + 2, 1) hgen = ExpandGenerator(spaceconfig=SpinSpaceConfig([1, 2]), H=model.H_serial, evolutor_type='masked') dmrgegn = DMRGEngine(hgen=hgen, tol=0, reflect=True, iprint=10) dmrgegn.use_U1_symmetry('M', target_block=zeros(1)) EG = dmrgegn.run_infinite(maxiter=maxiter, maxN=20, tol=0)[0] assert_almost_equal(EG, 0.25 - log(2), decimal=2)
def test_dmrg_finite(self): ''' Run iDMFT for heisenberg model. ''' model=self.get_model(10,1) hgen1=SpinHGen(spaceconfig=SpinSpaceConfig([2,1]),evolutor=NullEvolutor(hndim=2)) hgen2=SpinHGen(spaceconfig=SpinSpaceConfig([2,1]),evolutor=MaskedEvolutor(hndim=2)) dmrgegn=DMRGEngine(hchain=model.H_serial,hgen=hgen1,tol=0) EG1=dmrgegn.direct_solve() dmrgegn=DMRGEngine(hchain=model.H_serial,hgen=hgen2,tol=0) EG2=dmrgegn.run_finite(endpoint=(5,'<-',0),maxN=[10,20,30,40,40],tol=0)[-1] assert_almost_equal(EG1,EG2,decimal=4)
def test_dmrg_finite(self): ''' Run iDMFT for heisenberg model. ''' nsite=10 model=self.get_model(nsite,1) hgen1=RGHGen(spaceconfig=SpinSpaceConfig([2,1]),H=model.H_serial,evolutor_type='null') hgen2=RGHGen(spaceconfig=SpinSpaceConfig([2,1]),H=model.H_serial,evolutor_type='masked') H=get_H(hgen1) EG1=eigsh(H,k=1,which='SA')[0] dmrgegn=DMRGEngine(hgen=hgen2,tol=0,reflect=True) dmrgegn.use_U1_symmetry('M',target_block=0) EG2=dmrgegn.run_finite(endpoint=(5,'<-',0),maxN=[10,20,30,40,40],tol=0)[0] assert_almost_equal(EG1,EG2,decimal=4)
def test_vmps(self): ''' Run vMPS for Heisenberg model. ''' nsite=10 filename='mps_heisenberg_%s.dat'%(nsite) model=self.get_model(nsite,which=1) #mps=MPS.load(filename) #run dmrg to get the initial guess. hgen=RGHGen(spaceconfig=SpinSpaceConfig([2,1]),H=model.H_serial,evolutor_type='masked') dmrgegn=DMRGEngine(hgen=hgen,tol=0,reflect=True) dmrgegn.use_U1_symmetry('M',target_block=0) EG,mps=dmrgegn.run_finite(endpoint=(1,'<-',0),maxN=40,tol=1e-12) mps.save(filename) #run vmps vegn=VMPSEngine(H=model.H,k0=mps) vegn.run()
def test_vmps(self): ''' Run vMPS for Heisenberg model. ''' nsite=10 filename='mps_heisenberg_%s.dat'%(nsite) model=self.get_model(nsite,which=1) #mps=MPS.load(filename) #run dmrg to get the initial guess. hgen=SpinHGen(spaceconfig=SpinSpaceConfig([2,1]),evolutor=MaskedEvolutor(hndim=2)) dmrgegn=DMRGEngine(hchain=model.H_serial,hgen=hgen,tol=0) dmrgegn.run_finite(endpoint=(1,'<-',0),maxN=40,tol=1e-12) #hgen=dmrgegn.query('r',nsite-1) mps=dmrgegn.get_mps() #right normalized initial state mps.save(filename) #run vmps vegn=VMPSEngine(H=model.H,k0=mps) vegn.run()
def spin1_vmps(J, Jz, h, nsite, append=False): """ Run vMPS for Heisenberg model. """ filename = "mps_heisenberg_%s.dat" % (nsite) model = Spin1Model(J=J, Jz=Jz, h=h, nsite=nsite) if append: mps = MPS.load(filename) else: # run dmrg to get the initial guess. hgen = RGHGen(spaceconfig=SpinSpaceConfig([2, 1]), H=model.H_serial, evolutor_type="masked") dmrgegn = DMRGEngine(hgen=hgen, tol=0) EG = dmrgegn.run_finite(endpoint=(1, "<-", 0), maxN=10, tol=0)[-1] # hgen=dmrgegn.query('r',nsite-1) mps = dmrgegn.get_mps(direction="<-") # right normalized initial state mps.save(filename) # run vmps vegn = VMPSEngine(H=model.H, k0=mps) vegn.run()
def test_dmrg_finite(self): ''' Run iDMFT for heisenberg model. ''' nsite = 10 model = self.get_model(nsite, 1) hgen1 = ExpandGenerator(spaceconfig=SpinSpaceConfig([1, 2]), H=model.H_serial, evolutor_type='null') hgen2 = ExpandGenerator(spaceconfig=SpinSpaceConfig([1, 2]), H=model.H_serial, evolutor_type='masked') H = get_H(hgen1) EG1 = eigsh(H, k=1, which='SA')[0] dmrgegn = DMRGEngine(hgen=hgen2, tol=0, reflect=True) dmrgegn.use_U1_symmetry('M', target_block=zeros(1)) EG2 = dmrgegn.run_finite(endpoint=(5, '<-', 0), maxN=[10, 20, 40, 40, 40], tol=0)[0] assert_almost_equal(EG1, EG2, decimal=4)
def heisenberg_vmps(J,Jz,h,nsite,append=False): ''' Run vMPS for Heisenberg model. ''' filename='mps_heisenberg_%s.dat'%(nsite) model=HeisenbergModel(J=J,Jz=Jz,h=h,nsite=nsite) if append: mps=MPS.load(filename) else: #run dmrg to get the initial guess. hgen=RGHGen(spaceconfig=model.spaceconfig,H=model.H_serial,evolutor_type='masked') dmrgegn=DMRGEngine(hgen=hgen,tol=0) EG=dmrgegn.run_finite(endpoint=(1,'<-',0),maxN=10,tol=0)[-1] #hgen=dmrgegn.query('r',nsite-1) mps=dmrgegn.get_mps(direction='<-') #right normalized initial state mps.save(filename) #run vmps vegn=VMPSEngine(H=model.H,k0=mps) vegn.run()
def spin1_dmrg(J, Jz, h, nsite=10, which="finite", J2=0, J2z=None): """ Run iDMFT for heisenberg model. """ if J2 == 0: model = Spin1Model(J=J, Jz=Jz, h=h, nsite=nsite) else: model = Spin1Model(J=J, Jz=Jz, J2=J2, J2z=J2z, h=h, nsite=nsite) hgen = RGHGen(spaceconfig=SpinSpaceConfig([2, 1]), H=model.H_serial, evolutor_type="masked") dmrgegn = DMRGEngine(hgen=hgen, tol=0, reflect=True) dmrgegn.use_U1_symmetry("M", target_block=0) if which == "infinite": dmrgegn.run_infinite(maxiter=50, maxN=20, tol=0) elif which == "lanczos": dmrgegn.direct_solve() else: dmrgegn.run_finite(endpoint=(5, "<-", 0), maxN=[10, 20, 30, 40, 40], tol=0) pdb.set_trace()
def test_lanczos(self): '''test for directly construct and solve the ground state energy.''' model = self.get_model(10, 1) hgen1 = ExpandGenerator(spaceconfig=SpinSpaceConfig([1, 2]), H=model.H_serial, evolutor_type='null') hgen2 = ExpandGenerator(spaceconfig=SpinSpaceConfig([1, 2]), H=model.H_serial, evolutor_type='normal') dmrgegn = DMRGEngine(hgen=hgen1, tol=0, iprint=10) H = get_H(hgen=hgen1) H2, bm2 = get_H_bm(hgen=hgen2, bstr='M') Emin = eigsh(H, k=1)[0] Emin2 = eigsh(bm2.extract_block(H2, (zeros(1), zeros(1)), uselabel=True), k=1)[0] print 'The Ground State Energy is %s, tolerence %s.' % (Emin, Emin - Emin2) assert_almost_equal(Emin, Emin2)
def solve1(J,Jz,h,target_block,nsite=10,parity=None,nspin=2): ''' Run iDMFT for heisenberg model. ''' model=HeisenbergModel(J=J,Jz=Jz,h=h,nsite=nsite,nspin=nspin) suffix='%s_%s%s.dat'%(model.get_str(),target_block,parity) filename_mps='data/mps_'+suffix filename_eng='data/eng_'+suffix parity=None hgen=RGHGen(spaceconfig=model.spaceconfig,H=model.H_serial,evolutor_type='masked') dmrgegn=DMRGEngine(hgen=hgen,tol=0,reflect=parity is not None,eigen_solver='JD') dmrgegn.use_U1_symmetry('M',target_block=target_block) if parity is not None: dmrgegn.use_disc_symmetry({'C':parity}) t0=time.time() Emin,mps=dmrgegn.run_finite(endpoint=(5,'<-',0),maxN=[10,20,40,80,80],tol=1e-8) t1=time.time() print 'The Ground State Energy for %s: %s, Elapse %s.'%(model,Emin,t1-t0) print 'FIN - CORE:%s'%RANK mps.save(filename_mps) savetxt(filename_eng,Emin) return Emin,mps
def test_fsfermi(): dmrg=DMRGEngine(fslhgen,fsrhgen) dmrg.finite(mwarmup=10,mlist=[10,20,30,40,40])
def test_isfermi(): dmrg=DMRGEngine(fslhgen,fsrhgen) dmrg.infinite(m=40)
def test_ifermi(): dmrg=DMRGEngine(flhgen,frhgen) dmrg.infinite(m=40)
def test_fspin(): dmrg=DMRGEngine(lhgen,rhgen) dmrg.finite(mwarmup=10,mlist=[10,20,30,40,40])
def test_ispin(): dmrg=DMRGEngine(lhgen,rhgen) dmrg.infinite(m=20)
def test_tomps(): dmrg=DMRGEngine(lhgen,rhgen) dmrg.finite(mwarmup=10,mlist=[10]) dmps=dmrg.tomps() return dmps