DMRG different results using SingleSiteEngine and TwoSiteEngine and how to keep certain filling
Posted: 31 Jul 2020, 07:40
Dear TeNPy community:
I have some questions on the different dmrg results using SingleSiteEngine and TwositeEngine, and on how to get dmrg results with certain filling.
For more details,
I am using the dmrg in tenpy to obtain ground state energy for fermi-hubbard model. And in particular I want to get some dmrg results with low bond dimension in order to benchmark and compare with some other optimization results I got.
My setup is as following:
Now I have two questions:
First, I noticed that for low bond dimension, I got different results between using SingleSiteEngine and TwoSiteEngine. For example, for bond dimension = 4, and t = 1, U =8, I got E = -0.209 using two site engine and E = -0.29 using single site engine. I am not sure which result is correct. I also noticed that in the doc it says two site engine sometimes have convergence issue, I am wondering whether this discrepancy is related that and if it is, whether there is some way to fix that (make sure get reasonable results using TwoSiteEngine).
Second, I am wondering how to use dmrg to get ground energy for certain filling. For example, for half-filling, previously I thought using cons_N = 'N' will enforce the half-filling for dmrg results, I checked by print out, and saw though in most case it is half-filling, there are also exceptions, for example using TwositeEngine for t=1,U=1 it gives , which is different from the desired half-filling [1, 1]; and in general SingleSiteEngine gets more results away from half filling than TwoSiteEngine.
So I am wondering if there any parameters to set/any ways to get the dmrg results with certain filling, for example half-filling or in general any filling.
Thank you for your time!
I have some questions on the different dmrg results using SingleSiteEngine and TwositeEngine, and on how to get dmrg results with certain filling.
For more details,
I am using the dmrg in tenpy to obtain ground state energy for fermi-hubbard model. And in particular I want to get some dmrg results with low bond dimension in order to benchmark and compare with some other optimization results I got.
My setup is as following:
Code: Select all
model_params = dict(L=2, t=t_value, U=U_value, mu=mu_value, bc_MPS = "infinite", cons_N = 'N', cons_Sz=None, verbose=True)
M = FermiHubbardChain(model_params)
site = SpinHalfFermionSite(cons_N = 'N', cons_Sz = None, filling = 1)
product_state = ["up", "down"] * (M.lat.N_sites // 2)
psi = MPS.from_product_state([site]*M.lat.N_sites, product_state, bc = M.lat.bc_MPS)
dmrg_params = {
'mixer': True,
'trunc_params':{
'chi_max':chi_value,
'svd_min':1.e-12,
},
'max_E_err':1e-12,
'verbose':True,
}
#eng = dmrg.SingleSiteDMRGEngine(psi, M, dmrg_params)
eng = dmrg.TwoSiteDMRGEngine(psi, M, dmrg_params)
E, psi = eng.run()
First, I noticed that for low bond dimension, I got different results between using SingleSiteEngine and TwoSiteEngine. For example, for bond dimension = 4, and t = 1, U =8, I got E = -0.209 using two site engine and E = -0.29 using single site engine. I am not sure which result is correct. I also noticed that in the doc it says two site engine sometimes have convergence issue, I am wondering whether this discrepancy is related that and if it is, whether there is some way to fix that (make sure get reasonable results using TwoSiteEngine).
Second, I am wondering how to use dmrg to get ground energy for certain filling. For example, for half-filling, previously I thought using cons_N = 'N' will enforce the half-filling for dmrg results, I checked by print out
Code: Select all
psi.expectation_value("Ntot")
Code: Select all
psi.expectation_value("Ntot") = [1.02346393 0.97653607]
So I am wondering if there any parameters to set/any ways to get the dmrg results with certain filling, for example half-filling or in general any filling.
Thank you for your time!