Esempio n. 1
0
    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)
Esempio n. 2
0
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
Esempio n. 3
0
    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()
Esempio n. 4
0
 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
Esempio n. 5
0
 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()
Esempio n. 6
0
    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()
Esempio n. 7
0
 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()
Esempio n. 8
0
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
Esempio n. 9
0
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
Esempio n. 10
0
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
Esempio n. 11
0
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
Esempio n. 12
0
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