Time evolution of MPS long range Hamiltonian.

Hello!
I am facing some problems in time-evolving a MPS with a long range Hamiltonian, by now I used exactApplyMPO, but it doesn't work very well, is there a more clever of doing it? I am not interested in huge systems, for this reason I am using MPO for long range.
Thank you very much

Hi, yes I have also found that MPO based evolution is less well behaved than other types (e.g. Trotter).

Could you say, though, what isn't working very well? Is it exactApplyMPO itself or the approximation of exp(-iHt) as an MPO? Does not working well mean that your results are not accurate or that it is too slow? How much have you explored the effects of choosing smaller and larger time steps? I'm asking in part so we can keep tabs on which parts of ITensor can be improved.

Within the approach of using an MPO approximation for the time evolution operator, I'm not sure the exact approach you are using but there may be some additional tricks which you haven't tried, such as using two complex time steps instead of one purely real or imaginary time step to get a better scaling with the time step size. (See https://arxiv.org/abs/1407.1832 for details.)

As far as other methods, yes the TDVP method (which is also similar to the older "time step targeting" methods) and I believe the Krylov method can handle long-range interactions since they can be formulated in terms of an MPO for the Hamiltonian directly (rather than an MPO approximation of the time-evolution operator).

Unfortunately ITensor doesn't currently have a TDVP, time-step targeting, or Krylov implementaion, but it does have all of the necessary pieces for you to write your own. I'm hoping someone will contribute such a code. Otherwise we will eventually post our own but we aren't working with these methods currently.

Best regards,
Miles

commented by (120 points)
Dear Miles,
thank you very much for you answer, the part of code that performs the time evolution is:
"auto expH = toExpH<ITensor> (ampo,dt*Cplx_i);
auto args = Args("Cutoff=", 1E-9, "Maxm=", 100)
psi = exactApplyMPO(expH, psi, args);
normalize(psi)"
I've essentially followed one tutorial example. The result are not accurate (I compared with ED for small systems).
Best regards,
Paolo
commented by (70.1k points)
Thanks for providing some more information. Did you try varying the size of dt, lowering the size of the Cutoff, and raising the size of Maxm?
commented by (120 points)
Hi!
Yes I tried varying all the parameters (dt, Maxm, and Cutoff), more in detail the issue is that when I turn on the long range term after a while there is a drop in the Maxm (Maxm=2) and the state does not evolve anymore (entropy between the bond in the middle (N/2)=0).
commented by (70.1k points)
Hi, ok thanks that sounds like a more serious issue than just a poor overall accuracy. It may even be a bug either in ITensor or in the part of your code where you defined the Hamiltonian. If you email me your code (a cleaned-up version please) then I can take a look and try it myself.

Also this method is definitely not the best method overall for time evolution. It helps a lot, for instance, to do the two complex time steps trick versus the simple single step version you wrote above.

But ultimately colleagues of mine studying the various methods have found that TDVP, time-step targeting, and Krylov are superior to MPO currently, barring some future improvements to the technique.
commented by (120 points)
Thank you very much.