+2 votes
asked by (190 points)


I have already implemented a new SiteSet to describe alternating spin 1/2:s/truncated soft bosons on every other site. It works fine together with DMRG code for finite chains. I would now like to assume translational invariance and calculate entanglement entropy and correlation lengths to extract critical exponents by scaling relations.

Although there is example code for the iDMRG algorithm I cannot find any documentation, specifically how to use it together with AutoMPO... What is the recommended way to do this?


1 Answer

+1 vote
answered by (52.6k points)

Hi Axel,
Great to hear about the new SiteSet you implemented. Was it using the latest master branch of ITensor (post v2.0.11)? I made the SiteSet system a lot nicer since then.

Right now, AutoMPO can't make the kind of MPO's needed for infinite DMRG. The reason is that while AutoMPO can leave the boundary indices of the MPO open so they can connect to neighboring unit cells, we'd have to work out some additional logic about putting in the interactions crossing over unit-cell boundaries. Also how to input the Hamiltonian for an infinite system (the interface of AutoMPO for the infinite case) requires some thought.

So for infinite DMRG you have to make an MPO "by hand". I have provided an example in the sample/ folder (the file Heisenberg.h). I do understand it's not the easiest thing to follow and some documentation would help but I have a lot of time constraints, so for the moment just send me any specific questions you have (here or by email) and I will answer them.

The basic idea of the Heisenberg.h code is that it makes an MPO by thinking of each MPO tensor as a matrix of operators. First the code makes all of the IQIndices connecting the MPO tensors together. Then it puts in the operators into specific positions within each MPO "matrix" following patterns explained in papers by e.g. Ian McCulloch about "lower triangular" MPOs. Additional care is needed to make sure that the operators are placed in the correct blocks of IQTensors so that the total "flux" or "divergence" of each IQMPO IQTensor is zero (that is our convention for Hermitian IQMPO's). The flux of an IQTensor block is defined as the sum of the QN value of each IQIndex sector corresponding to offset/position of the block, weighted by the arrow direction of each IQIndex (+1 for Out, -1 for In).


commented by (190 points)
edited by
Ok, so in the file Heisenberg.h from line 94, the multiplication of two IQIndices (one In, one Out) with an IQTensor/ITensor yields a 4-tensor with only the block corresponding to that particular operator and all other blocks empty? And these are then added to form the full MPO? I am familiar with this form of the MPO but not familiar with McCullough's articles (yet).

What I cannot get is that is the Heisenberg example the MPO has a dimension of (5,5,(2*1 + 1), (2*1 + 1)) since S=1. But you already know that the MPO will have dimension 5 from the number and size of the sectors. For example in the Ising model (spin 1/2), the MPO should have dimension 3 (I suppose?), but I dont know where to put the elements. I may be missing something crucial theory-wise, since I am very new to MPS!

Also, I'm not sure from what you write how I should find the flux. Each "block" has two indices (I assume that you are talking about the operators in each "cell" of the matrix of operators, when the MPO is viewed as a matrix given by doing a kronecker product over indices 1,3 and 2,4 respectively).
commented by (160 points)
Hi Miles,
I think that iDMRG is very useful. But when I run the idmrg.cc in your sample, I find it hard to converge to the right energy compared to the result in PRB 48, 3844 (1993), and I will get different answer every time I run the program. I don't know how to adjust the parameter to get the right answer. Should I change m, sweeps or the value of nuc?

Also, I find it hard to construct an MPO for other models. For example, in Hubbard model, do I need to consider both the Sz and Nf quantum number that changed by an operator?  What's more, for spinful fermions we should use Jordan-Wigner transformations. The outcome is that two operators (such as Aup and F) will appear on the same site, how to implement them in MPO?  I think that sites_.op("Aup*F",n) is not useful. Thank you very much!

Welcome to ITensor Support Q&A, where you can ask questions and receive answers from other members of the community.

Formatting Tips:
  • To format code, indent by four spaces
  • To format inline LaTeX, surround it by @@ on both sides
  • To format LaTeX on its own line, surround it by $$ above and below
  • For LaTeX, it may be necessary to backslash-escape underscore characters to obtain proper formatting. So for example writing \sum\_i to represent a sum over i.
If you cannot register due to firewall issues (e.g. you cannot see the capcha box) please email Miles Stoudenmire to ask for an account.

To report ITensor bugs, please use the issue tracker.