Page 1 of 1

iDMRG is not working properly with next-nearest neighbor complex hopping in the Haldane model

Posted: 06 Sep 2019, 04:52
by DHIMAN002
Hi everyone,
I am trying to simulate a hard-bosonic Haldane model in the honeycomb lattice. The model is defined at Eq-2 of paper,arXiv:1603.04827. I have created the nearest neighbor bonds and next-nearest neighbor bonds as in the following way in a "Lattice"-class,

Code: Select all

        NN = [(0, 1, np.array([0, 0])), (0, 1, beta1), (0, 1, -beta3)]
        nNN=[(0,0,beta1),(0,0,beta2),(0,0,beta3),
             (1,1,-beta1),(1,1,-beta2),(1,1,-beta3)]
where, the "beta"-vectors are same as in Fig.1(a) of the paper arXiv:1603.04827. Again, basis-0 and basis-1 represent sublattice-A and sublattice-B in the same Figure, respectively. The lattice geometry and the 1D-chain along the honeycomb lattice is chosen same as in the Fig.1(a) of paperarXiv:1208.2623. Moreover, for infinite DMRG I have chosen 2-unitcells of stripe like geometry(I have chosen 3,4,6-unitcells as well and that give me the same result). The next nearest neighbor hopping term in the "init_terms"-function of "CouplingMPOModel"-type class is taken in two ways,

Way-I:

Code: Select all

for u1, u2, dx in self.lat.next_nearest_neighbors:
            self.add_coupling(1j*D,u1, 'Bd', u2, 'B', dx)
            self.add_coupling(-1j*D,u1, 'B', u2, 'Bd', dx)
This way of input produces fluctuating results after each sweep. The energy and entropy do not converge.

Way-II:

Code: Select all

for u1, u2, dx in self.lat.next_nearest_neighbors:
            self.add_coupling(1j*D,u1, 'Bd', u2, 'B', dx)
            self.add_coupling(-1j*D,u2, 'Bd', u1, 'B', dx)
This way of input produces the same result for D=0 and D=finite. But, it is expected that, results for D=0 and results for D=finite should be different.

Note:
(i) The both of the above way should produce same results.
(ii) The finite-DMRG does not show any bad behavior like the above. So, I guess, in the i-DMRG code there must be a problem in the environment update part. Because complex hopping is direction dependent, so may be the direction dependent situation is not encountered in the environment update part. It is just my guess :).
(iii) I know i-DMRG is not good for critical points when the correlation length is large. For my simulation, I have avoided those points in parameter space.

Sincerely,
Dhiman

Re: iDMRG is not working properly with next-nearest neighbor complex hopping in the Haldane model

Posted: 06 Sep 2019, 09:50
by DHIMAN002
Sorry, I realized that WAY-II is wrong. The net imaginary hopping in WAY-II is zero. That is why I got same results for D=0 and D=finite.
But, please suggest me, why WAY-I is giving fluctuating results after each sweep. One of my guess is given in the 2nd point in the NOTE, what I have mentioned.

Thanks,
Dhiman

Re: iDMRG is not working properly with next-nearest neighbor complex hopping in the Haldane model

Posted: 07 Sep 2019, 17:16
by DHIMAN002
I investigated more and found that the fluctuation of energy and entropy values after 10 sweeps(I fixed it) is changing for a certain parameter region of complex hopping amplitude above a critical value. But the code still works for complex hopping in parameter region less than a critical value, so it should not be the problem of the code. What I know about the ground state above critical value is that,
(i) The ground state is two-fold degenerate.
(ii) The ground state might not be described simply by using the two unit cells in a stripe like geometry of zigzag honeycomb lattice.

It must be one of the two above reasons that the ground state does not converge and fluctuate. But, the presence of degeneracy may not be the reason, because the DMRG should converge to minimum entangled state. The fact that ground state have to be described by more than one unit cell might be the reason. Secondly, may be chi_max need to be more for this states to capture the ground state.

So, for now I want suggestions, what is the reason behind the fluctuation of energy and entropy after 10 sweeps and how to avoid this fluctuation?

Thanks,
Dhiman

Re: iDMRG is not working properly with next-nearest neighbor complex hopping in the Haldane model

Posted: 13 Sep 2019, 15:30
by Johannes
Welcome Dhiman, and sorry for not answering earlier.

You might want to take a look at the tenpy.models.haldane.FermionicHaldaneModel and the tenpy.models.haldane.BosonicHaldaneModel.
Both are based on the Hamiltonian from the paper arXiv:1407.6985 discussing the fermionic model.
As far as I see from a quick glimpse, Equ. (2) of arXiv:1603.04827 should be equivalent to the tenpy.models.haldane.BosonicHaldaneModel with hard-core bosons (N_max=1).

Your way (i) and (ii) are different, and neither is correct for an arbitrary lattice. However, way (i) should be correct for your specific case of the Honeycomb lattice, where u1 and u2 of the next nearest neighbors are always equal.
The correct way to get the hermitian conjugate is mentioned in the the "Note" box of point 6 here. In your case, it would be

Code: Select all

for u1, u2, dx in self.lat.next_nearest_neighbors:
    self.add_coupling(1j*D,u1, 'Bd', u2, 'B', dx)
    self.add_coupling(np.conj(1j*D),u2, 'Bd', u1, 'B', dx) # h.c.
DHIMAN002 wrote: 06 Sep 2019, 04:52 I have created the nearest neighbor bonds and next-nearest neighbor bonds as in the following way in a "Lattice"-class,

Code: Select all

        NN = [(0, 1, np.array([0, 0])), (0, 1, beta1), (0, 1, -beta3)]
        nNN=[(0,0,beta1),(0,0,beta2),(0,0,beta3),
             (1,1,-beta1),(1,1,-beta2),(1,1,-beta3)]
How did you define beta1, beta2, beta3? For the (next_)nearest_neighbors, they should be specified in terms of the unit vectors of the lattice, i.e. have integer entries! (You can e.g. choose beta1 and beta2 as unit vectors of the lattice, then they would be:

Code: Select all

beta1 = [1, 0]
beta2 = [0, 1]
beta3 = [-1, -1]
DHIMAN002 wrote: 07 Sep 2019, 17:16 I investigated more and found that the fluctuation of energy and entropy values after 10 sweeps(I fixed it) is changing for a certain parameter region of complex hopping amplitude above a critical value. But the code still works for complex hopping in parameter region less than a critical value, so it should not be the problem of the code. What I know about the ground state above critical value is that,
(i) The ground state is two-fold degenerate.
(ii) The ground state might not be described simply by using the two unit cells in a stripe like geometry of zigzag honeycomb lattice.

It must be one of the two above reasons that the ground state does not converge and fluctuate. But, the presence of degeneracy may not be the reason, because the DMRG should converge to minimum entangled state. The fact that ground state have to be described by more than one unit cell might be the reason. Secondly, may be chi_max need to be more for this states to capture the ground state.

So, for now I want suggestions, what is the reason behind the fluctuation of energy and entropy after 10 sweeps and how to avoid this fluctuation?
I don't know much about the physics of this specific model.
First of all, to be fair, let me mention that we are aware that there are sometimes convergence problems with iDMRG, and we are not sure what is the reason ourselves and trying to fix it for quite some time by now. In fact, the rewriting of DMRG in Issue #39 and Issue #85 by [mention]Leon[/mention] was motivated by that as well; I'm not sure what his latest results on this issue are.

As you said, (i) should usually not be a problem; at least if the state is build up by gradually increasing the bond dimensions e.g. with the chi_list parameter of DMRG.
If (ii) is actually true, the problem is physical, and I would expect that iDMRG with the simple/wrong unit cell has problems to generate the correct state. You can try to see what DMRG on a large finite system does, and whether it builds some larger unit cells; it behaves a little bit better in that respect. Alternatively, you can simply try out different geometries/length for your unit cell, which might help. Apart from physical insigth, there is no way to know the correct unit cell a priori.

I hope this helps a little bit... Feel free to report further problems ;-)

Re: iDMRG is not working properly with next-nearest neighbor complex hopping in the Haldane model

Posted: 14 Sep 2019, 09:29
by DHIMAN002
Hi Johannes,
Thank you so much for your reply. Your answers clarified many things.
I will ask you again, If I get into any problem.
Thanks a lot again. :D :D

Re: iDMRG is not working properly with next-nearest neighbor complex hopping in the Haldane model

Posted: 17 Sep 2019, 14:50
by Leon
As [mention]Johannes[/mention] mentions, the rewrite of DMRG Issue #39 and Issue #85 formed part of an attempt to overcome convergence issues such as described above. The crucial new feature is the introduction of single-site DMRG updates, which we hope can overcome the bad convergence. I have unfortunately not had a chance (or a good test case) to see if this is indeed the case.

TeNPy uses two-site DMRG updates by default, so to see if single-site DMRG updates lead to better convergence, you have to either supply dmrg.run() with the argument active_sites = 1, or use the SingleSiteDMRGEngine directly. You can also try combining both types of updates by passing the results of a two-site DMRG run to the SingleSiteDMRGEngine.

If the convergence issues still persisted after Johannes' comments, you could give this a try. Do let us know what the outcome is!

Re: iDMRG is not working properly with next-nearest neighbor complex hopping in the Haldane model

Posted: 01 Oct 2019, 08:43
by DHIMAN002
Hi Leon, I had tried single site DMRG. It is faster than two site DMRG.
Because, my convergence problem is because of gapless ground state, so it can not help me.
Thanks for your suggestions. I checked the single site and double site DMRG both gives the same results. But single site DMRG is much faster, that is why I think it is more convenient to use.