Page 1 of 1

Applying different time evolution to different subsystems with TEBD

Posted: 17 Apr 2024, 22:52
by vmen
Hello,

I have an MPS for which I want to simulate time evolution, but the time evolution I seek is by evolving under two different Hamiltonians \(H_1\) and \(H_2\). I want to evolve under \(U_1=exp(-iH_1t)\) on the subsystem composed of sites 0,2,4,...L-1, and \(U_2=exp(-iH_2t)\) on the subsystem composed of sites 1,3,5...L. Is there a way I can do this with tenpy if I have H1 and H2 as model objects, using the TEBD framework? Any help is appreciated, thank you!

Re: Applying different time evolution to different subsystems with TEBD

Posted: 18 Apr 2024, 05:49
by Jakob
Hi,
This can not be done out of the box.
TEBD will also be difficult, since your gates are not nearest neighbour (even if H_i are NN on their subsystem, they are NNN on the full system).

You could force TEBD by grouping sites to a nearest neighbour model.

I would go for MPO time evolution though. You have some extra structure here, where U_1 can be written as an MPO that acts only on some of the sites. This is not currently supported out of the box and doing it cleanly will be quite a lot of work and will need to be fine tuned to this situation. I also do not expect that much oerformance to be gained there. I would first see how far you can go by forgetting the extra structure and defining H_1 + H_2 as a CouplingMPOModel and doing ExpMPOTimeEvolution.
Only if you reach real performance barriers there would i think about exploiting the extra structure.

Re: Applying different time evolution to different subsystems with TEBD

Posted: 07 May 2024, 07:43
by Johannes
Jakob is totally right, of course.

Let me just mention that it wouldn't be too hard to extend TEBD to work with this.
Define a new LadderTEBDEngine, which takes the two models as input, and define 2 separate TEBD engines for them.
Then overwrite:

Python: Select all

def evolve(...):
    # start with site order 
    # A0 B0 A1 B1 A2 B2 A3 B3 ...
    # swap neigbors on even rungs
    # B0 A0 A1 B1 B2 A2 A3 B3 ....
    # [iterate generalized suzuki-trotter until all even/odd steps are applied]
      # evolve time step with even A bonds, odd B bonds
      # swap neighbors on all rungs
      # A0 B0 B1 A1 A2 B2 B3 A3 ....
      # evolve time step with even B bonds, odd A bonds 
      # swap neighbors on all rungs if not ending the loop
    # finally swap neighbors on odd rungs to get back to original order
    # A0 B0 A1 B1 A2 B2 A3 B3 ....
For full Ladder systems with interactions on the rungs and not just correlations in the initial state, you would additionally put an evolution step on the rungs.
Suzuki-trotter decomposition is a little bit more complicated in that case, because you would decompose into three parts.