def test_nonint(self): #get the exact solution. h_exact=self.model_exact.hgen.H() E_excit=eigvalsh(h_exact) Emin_exact=sum(E_excit[E_excit<0]) #the solution in occupation representation. h_occ=self.model_occ.hgen.H() Emin=eigsh(h_occ,which='SA',k=1)[0] print 'The Ground State Energy for hexagon(t = %s, t2 = %s) is %s, tolerence %s.'%(self.t,self.t2,Emin,Emin-Emin_exact) assert_almost_equal(Emin_exact,Emin) #the solution through updates H_serial=op2collection(op=self.model_occ.hgen.get_opH()) H=get_H(H=H_serial,hgen=self.expander) H2,bm2=get_H_bm(H=H_serial,hgen=self.expander2,bstr='QM') Emin=eigsh(H,k=1,which='SA')[0] Emin2=eigsh(H2,k=1,which='SA')[0] print 'The Ground State Energy is %s, tolerence %s.'%(Emin,Emin-Emin2) assert_almost_equal(Emin_exact,Emin) assert_almost_equal(Emin_exact,Emin2) #the solution through dmrg. bmgen=get_bmgen(self.expander3.spaceconfig,'QM') dmrgegn=DMRGEngine(hchain=H_serial,hgen=self.expander3,tol=0,bmg=bmgen,symmetric=True) EG2=dmrgegn.run_finite(endpoint=(5,'<-',0),maxN=[10,20,30,40,40],tol=0)[-1] assert_almost_equal(Emin_exact,EG2*H_serial.nsite,decimal=4)
def get_solving_system(K1,K2,U,nsite,mu=0.,t=1.,evolutor_type='null',periodic=False,perturb=None): ''' Set the parameters and get the solving system. Parameters: :K1,K2,U,mu,t: float, the parameters. :evolutor_type: str, * 'null', do not perform any unitary and truncation during expansion of sites. * 'full', do blockize and unitary but no truncation is allowed. * 'masked', use kpmask to identify truncation. Return: tuple of (model, expander) ''' assert(evolutor_type in ['null','full','masked']) model=BizardModel(K1=K1,K2=K2,U=U,t=t,mu=mu,nsite=nsite,periodic=periodic) if perturb is not None: if 'bSDW' in perturb.keys(): model.perturb_bSDW(sites=perturb['bSDW']) elif 'mu' in perturb.keys(): model.perturb_mu(sites=perturb['mu'][0],lamb=perturb['mu'][1]) if evolutor_type=='null': return model,None else: spaceconfig=SuperSpaceConfig(chorder([model.hgen.spaceconfig.nspin,1,model.hgen.spaceconfig.norbit])) H_serial=op2collection(op=model.hgen.get_opH()) expander=RGHGen(spaceconfig=spaceconfig,H=H_serial,evolutor_type=evolutor_type) #ion() #H_serial.show_advanced() #pdb.set_trace() return model,expander
def get_opc(self): ''' Construct <OpCollection> for a chain. Return: <OpCollection>, the operator collection. ''' impurity=self.impurity bath=self.bath nsite=bath.nsite+1 spaceconfig1=impurity.spaceconfig config=list(spaceconfig1.config) config[-2]=nsite spaceconfig=SuperSpaceConfig(config) elist,tlist=self.elist_rescaled,self.tlist_rescaled tlist2=swapaxes(tlist.conj(),-1,-2) ebonds=[Bond(zeros(2),i,i) for i in xrange(len(elist))] tbonds=[Bond([1.,0],i,i+1) for i in xrange(len(tlist))] tbonds2=[Bond([-1.,0],i+1,i) for i in xrange(len(tlist))] opc=op_on_bond('E',spaceconfig=spaceconfig,mats=elist,bonds=ebonds) opc=opc+op_on_bond('T',spaceconfig=spaceconfig,mats=concatenate([tlist2,tlist],axis=0),bonds=tbonds2+tbonds) opc.label='H' opc+=impurity.get_interaction() return op2collection(opc).compactify()
def test_site_image(self): H_serial = op2collection(op=self.model_occ.hgen.get_opH()) H_serial.insert_Zs(spaceconfig=self.spaceconfig1) H2 = site_image(H_serial, care_sign=False, NL=0, NR=self.model_exact.nsite) print H_serial print H2
def test_disc_symm(self,nsite=40): ''' The parameters are adapted from PRB 54. 7598 ''' self.set_params(U=4.,t=1.,mu=0.,t2=0.,nsite=nsite) H_serial=op2collection(op=self.model_occ.hgen.get_opH()) bmgen=get_bmgen(self.expander3.spaceconfig,'QM') dmrgegn=DMRGEngine(hchain=H_serial,hgen=self.expander3,tol=0,bmg=bmgen,symmetric=True,disc_symm='C') EG2=dmrgegn.run_finite(endpoint=(4,'->',nsite-2),maxN=[10,20,30,40,40],tol=0,block_params={'target_block':(0,0),'target_sector':{'C':-1}})[-1] print EG2*nsite pdb.set_trace()
def test_nonint(self): #get the exact solution. spaceconfig = self.spaceconfig1 self.set_params(U=0., t=1., mu=0.2, t2=0., nsite=6) h_exact = self.model_exact.hgen.H() E_excit = eigvalsh(h_exact) Emin_exact = sum(E_excit[E_excit < 0]) #the solution in occupation representation. h_occ = self.model_occ.hgen.H() Emin, Vmin1 = eigsh(h_occ, which='SA', k=1) print 'The Ground State Energy for hexagon(t = %s, t2 = %s) is %s, tolerence %s.' % ( self.t, self.t2, Emin, Emin - Emin_exact) assert_almost_equal(Emin_exact, Emin) #the solution through updates H_serial = op2collection(op=self.model_occ.hgen.get_opH()) H_serial_Z = copy.copy(H_serial) H_serial_Z.insert_Zs(spaceconfig=spaceconfig) expander = ExpandGenerator(spaceconfig=spaceconfig, H=H_serial_Z, evolutor_type='null', use_zstring=True) H = get_H(hgen=expander) expander2 = ExpandGenerator(spaceconfig=spaceconfig, H=H_serial_Z, evolutor_type='normal', use_zstring=True) H2, bm2 = get_H_bm(hgen=expander2, bstr='QM') Emin = eigsh(H, k=1, which='SA')[0] Emin2 = eigsh(H2, k=1, which='SA')[0] print 'The Ground State Energy is %s, tolerence %s.' % (Emin, Emin - Emin2) assert_almost_equal(Emin_exact, Emin) assert_almost_equal(Emin_exact, Emin2) #the solution through dmrg. expander3 = ExpandGenerator(spaceconfig=spaceconfig, H=H_serial, evolutor_type='masked', use_zstring=True) dmrgegn = DMRGEngine(hgen=expander3, tol=0, reflect=False) dmrgegn.use_U1_symmetry('QM', target_block=(0, 0)) EG2, Vmin2 = dmrgegn.run_finite(endpoint=(5, '<-', 0), maxN=[10, 30, 60, 100, 100], tol=0) Vmin2 = fix_tail(Vmin2, expander3.spaceconfig, 0) #check for states. assert_almost_equal(Emin_exact, EG2, decimal=4) Vmin1 = Vmin1[:, 0] assert_almost_equal(abs(Vmin2.state), abs(Vmin1), decimal=3) print(Vmin2.state / Vmin1)[abs(Vmin1) > 1e-2] pdb.set_trace()
def test_disc_symm(self, nsite=40): ''' The parameters are adapted from PRB 54. 7598 ''' self.set_params(U=2., t=1., mu=1., t2=0., nsite=nsite) spaceconfig = self.spaceconfig1 H_serial = op2collection(op=self.model_occ.hgen.get_opH()) expander3 = ExpandGenerator(spaceconfig=spaceconfig, H=H_serial, evolutor_type='masked', use_zstring=True) dmrgegn = DMRGEngine(hgen=expander3, tol=0, reflect=True) dmrgegn.use_U1_symmetry('QM', target_block=(0, 0)) for c in [-1, 1]: dmrgegn.use_disc_symmetry(target_sector={'C': c}, detect_scope=4) EG2, EV2 = dmrgegn.run_finite(endpoint=(5, '<-', 0), maxN=[20, 40, 100, 100, 100], tol=0) print 'Get gound state energy for C2 -> %s: %s.' % (c, EG2) #the result is -36.1372 for C=-1, and -36.3414 for C=1 pdb.set_trace()
def solve_update(model,expander,k=10,target_block=None,**kwargs): ''' Solve using chain updates. ''' H_serial=op2collection(op=model.hgen.get_opH()) #ion() #H_serial.show_advanced() #pdb.set_trace() t0=time.time() if isinstance(expander.evolutor,NullEvolutor): H=get_H(H=H_serial,hgen=expander) Emin,Evec=eigsh(H,k=k,which='SA',maxiter=5000,v0=random.random(H.shape[0])) else: H2,bm2=get_H_bm(H=H_serial,hgen=expander,bstr=model.qnumber) if target_block is not None: if hasattr(target_block,'__call__'): target_block=target_block(model.nsite) H2=bm2.lextract_block(H2,target_block) Emin,Evec=eigsh(H2,k=k,which='SA',v0=random.random(H2.shape[0])) t1=time.time() print 'The Ground State Energy for %s: %s, Elapse %s.'%(model,array(sorted(Emin)),t1-t0) return Emin,Evec
def get_solving_system(alpha,Vz,Delta,U,nsite,mu=0.,t=1.,evolutor_type='null',periodic=True): ''' Set the parameters and get the solving system. Parameters: :alpha,Vz,Delta,U,mu,t: float, the parameters. :evolutor_type: str, * 'null', do not perform any unitary and truncation during expansion of sites. * 'full', do blockize and unitary but no truncation is allowed. * 'masked', use kpmask to identify truncation. Return: tuple of (model, expander) ''' assert(evolutor_type in ['null','full','masked']) model=RashbaModel(alpha=alpha,Vz=Vz,U=U,Delta=Delta,t=t,mu=mu,nsite=nsite,periodic=periodic,occ=True,kspace=False) spaceconfig=model.hgen.spaceconfig spaceconfig1=SuperSpaceConfig(chorder([1,spaceconfig.nspin,1,spaceconfig.norbit])) H_serial=op2collection(op=model.hgen.get_opH()) expander=RGHGen(H=H_serial,spaceconfig=spaceconfig1,evolutor_type=evolutor_type,use_zstring=True) return model,expander
def solve_update(model,expander,k=1): ''' Solve using chain updates. ''' H_serial=op2collection(op=model.hgen.get_opH()) ion() #H_serial.show_advanced() t0=time.time() if isinstance(expander.evolutor,NullEvolutor): H=get_H(H=H_serial,hgen=expander) Emin,Evec=eigsh(H,k=k,which='SA',tol=1e-12) else: H2,bm2=get_H_bm(H=H_serial,hgen=expander,bstr='P') print bm2.check_blockdiag(H2) H_even=bm2.lextract_block(H2,0) H_odd=bm2.lextract_block(H2,1) Emin_even,Evec_even=eigsh(H_even,k=k,which='SA',tol=1e-12) Emin_odd,Evec_odd=eigsh(H_odd,k=k,which='SA',tol=1e-12) #Emin,Evec=eigsh(H2,k=k,which='SA',tol=1e-12) t1=time.time() print 'The Ground State Energy for model %s is %s(even),%s(odd): diff -> %s, Elapse -> %s.'%( model,Emin_even.min(),Emin_odd.min(),Emin_odd.min()-Emin_even.min(),t1-t0) return Emin_even,Evec_even,Emin_odd,Evec_odd
def solve1(delta,target_block,nsite,override=True,C2parity=None,t=1.,mu=0.): '''Get and store the eigen vectors and eigen values for ground state.''' model=SSHModel(delta=delta,t=t,mu=mu,nsite=nsite,manybody=True) suffix='%s_%s.dat'%(model.get_str(),target_block) filename_mps='data/mps3_'+suffix filename_eng='data/eng3_'+suffix if not override and os.path.isfile(filename_mps): Ei=loadtxt(filename_eng)[0] return Ei,MPS.load(filename_mps) spaceconfig=SuperSpaceConfig(chorder([model.hgen.spaceconfig.nspin,1,model.hgen.spaceconfig.norbit])) H_serial=op2collection(op=model.hgen.get_opH()) expander=RGHGen(spaceconfig=spaceconfig,H=H_serial,evolutor_type='masked') t0=time.time() dmrgegn=DMRGEngine(hgen=expander,tol=1e-7,reflect=False,eigen_solver='JD') #we can not use reflect here, because SOC do not meet reflection condition! dmrgegn.use_U1_symmetry('PM',target_block=target_block) Emin,mps=dmrgegn.run_finite(endpoint=(5,'<-',0),maxN=[10,25,50,70,70,70,70],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 solve_dmrg(model,expander,target_block,maxsweep=None,maxN=None,nlevel=1,C2parity=None,**kwargs): ''' Solve using DMRG. ''' nsite=model.nsite if nsite<=60:mN=100 if nsite<=80:mN=150 else: mN=200 #not accurate any more! if maxN is None: maxN=[25,40,80,80,80] if not ONSV else [25,60,80,100,mN,mN,mN,mN] if maxsweep is None: maxsweep=4 if not ONSV else 7 t0=time.time() H_serial=op2collection(op=model.hgen.get_opH()) dmrgegn=DMRGEngine(hgen=expander,tol=1e-10,reflect=C2parity is not None,eigen_solver='JD') dmrgegn.use_U1_symmetry(model.qnumber,target_block=target_block) if C2parity is not None: dmrgegn.use_disc_symmetry(target_sector={'C':C2parity},detect_scope=2) Emin,Vmin=dmrgegn.run_finite(endpoint=(maxsweep,'<-',0),maxN=maxN,\ tol=1e-7,nlevel=nlevel,call_before=kwargs.get('call_before'),call_after=kwargs.get('call_after')) Emin=Emin[0] t1=time.time() print 'The Ground State Energy for %s, C2 -> %s: %s, Elapse %s.'%(model,C2parity,Emin,t1-t0) return Emin,Vmin