How to add couplings correctly for iDMRG?

How do I use this algorithm? What does that parameter do?
Post Reply
hkorbmac
Posts: 1
Joined: 04 Apr 2024, 12:03

How to add couplings correctly for iDMRG?

Post by hkorbmac »

Hi everyone,

I have the following problem concerning iDMRG and in particular how to correctly add couplings.
Consider a 1D Hamiltonian like this \(H=-t\sum_i(b_i^\dagger b_{i+1}+\text{h.c.}) + \sum_i\sum_{r>0}^CV(r)n_in_{i+r}\), i.e. an extended (hard-core) Bose-Hubbard model with NN hopping and long-range interactions (up to some cutoff \(C\)). Let's say, I want to solve this by iDMRG using a unit cell of some (quite large) length \(L_\text{unit}\) (I simplify the model here, in my specific case, I have \(L_\text{unit}=24\) for reasons of translational symmetry and \(C=6\)).
Let us lable the sites with \(i=0,1,2,\dots,L_\text{unit}-1\). I want to do periodic boundary conditions. In TeNPy, do I add the terms of the Hamiltonian like

(1) \(-t\,b_{L_\text{unit}-1}^\dagger b_0\) and e.g. \(V(2)n_{L_\text{unit}-1}n_1\) or
(2) \(-t\,b_{L_\text{unit}-1}^\dagger b_{L_\text{unit}}\) and e.g. \(V(2)n_{L_\text{unit}-1}n_{L_\text{unit}+1}\)?

I.e. do I define my interactions directly in a PBC way or not? How does TeNPy handle this when adding unit cells in the iDMRG? Which way do I have to define the interactions, if I want TeNPy to "correctly implement" my Hamiltonian?

The way I understand it, method (1) creates uncoupled cells of \(L_\text{unit}\) which, in the iDMRG, are then repeated whereas case (2) creates the system the way "I really want it", i.e. the iDMRG simulates the thermodynamic limit of the system. What happens if I do a mixture? I add the interactions using (1) and hopping using (2). As hopping gives particle mobility, does this couple the cells? I am aware of the fact, that the interactions are different in the two cases, but this may be less relevant right now (as results for both cases are quite similar).

I am wondering about this, because my results do not converge (in some parameter region) using (1) for both interactions and hopping, while they converge and give reasonable results doing this mixture which are similar (but not the same!) to the results of (1) in some different parameter regime.

Thanks a lot in advance!
User avatar
Johannes
Site Admin
Posts: 428
Joined: 21 Jul 2018, 12:52
Location: TU Munich

Re: How to add couplings correctly for iDMRG?

Post by Johannes »

First of all, let me clarify, also for those finding this question later:
  • The system purely 1D / we ignore the y direction, right? I.e. when we talk about periodic boundary conditions, we don't talk about wrapping things on a cylinder or torus or plane, but about a chain (open boundary conditions, OBC) vs ring (PBC).
  • The indices we reference here are MPS indices.
    For an infinite MPS, we have sites inside the unit cell, but also outside the unit cell - formally an inifinte amount.
  • For infinite MPS, we have a translational invariance of the terms in the Hamiltonian H = sum_{n unit cells} sum_{i in unit cell} sum_r V(r) A_{n*L_unit + i} B_{n*L_unit + i + r)$, and similarly a translation invariance in the MPS tensors. You can still have non-trivial correlation <A_i B_{i+r}> at a distance of say r=40 sites, though, even if you have a 24-site translation-invariant unit cell, and those correlations need not be translation invariant in the r index by 24 sites - in fact, they decay with increasing distance r - but they are translation invariant in the i index by construction.
  • In the CouplingModel, we only add/store terms of H which start with the left-most index in the unit cell of n=0, i.e. the smalles MPS index i in the terms is always in 0,... L_unit -1.
    The TeNPy convention is that terms accross the MPS unit cells can have other indices outside the range 0, ... L_unit-1. e.g. a coupling between site -1 and 0 would be shifted by one unit cell to the right to a coupling between site L_unit -1 and L_unit, and stored as such in the coupling model.
  • You can print all terms in your hamiltonian with the snippet print(my_model.all_coupling_terms().to_TermList()) (documented [urlhttps://tenpy.readthedocs.io/en/latest/intro/model.html#some-random-remarks-on-models]at the end of the model intro[/url]).
  • The `add_coupling` method adds terms A_i B_{i+r} looping over all i that fit the lattice given the boundary conditions (of the lattice and MPS), and thus handles this "correctly" for infinite MPS.
    For this question, we talk about "manually" looping over i and j calling the lower-level add_coupling_term or
    add_local_term

This already answers that indeed, (1) is the wrong way that leads to couplings in a ring - that's how you would implement a PBC ring on a finite system. Doing this and setting bc_MPS='infinite', you inded get decoupled rings - really, you should do finite DMRG with PBC in that case (although PBC are generally a bad idea for MPS, because they require double the entropy and thus (almost) the square of the bond dimension to converge!).

Doing a mixture is a mixture of (2) for hopping and (1) for interaction is indeed a coupled, interacting system - but one of very strange (and I'd say unphysical) couplings.
Post Reply