### Re: Bipartitioning infinite MPS into 2 semi-infinite chains

Posted:

**16 Jun 2020, 05:29**I see. Sorry, if I appeared rude; I just wasn't sure what you wanted to do.

I'd still recommend running DMRG to find the ground state, which gives you an MPS, and then just take that as initial state for the TEBD, as outlined below.

On a side note, you can derive your model directly from the NearestNeighborModel, making the
Regarding the charges, your model should work perfectly fine with

After these changes, I can run
Doing that, I noticed that there was indeed an issue with the gauge fixing of the charge values, basically increasing the charge numbers on each bond with each TEBD update.

(It only affected the infinite case with non-zero qtotal in the unit cell.)

Anyways, I've fixed in in f93f27b63d89a9669e95f2553afbde8d6ac140d7.

After this commit, the average charge stays constant -0.5, as expected.

This was probably also the reason why you got only zero eigenvalues for the transfer matrix, if you have initialized it with

If you would have put

While

I hope this settles the problems

I'd still recommend running DMRG to find the ground state, which gives you an MPS, and then just take that as initial state for the TEBD, as outlined below.

On a side note, you can derive your model directly from the NearestNeighborModel, making the

`get_sshint_model`

funciton obsolete:
Code: Select all

```
class SSHIntModel(CouplingMPOModel, NearestNeighborModel):
...
```

`charges='same'`

for the GroupedSite.After these changes, I can run

Code: Select all

```
from tenpy.networks.mps import MPS
from tenpy.algorithms import dmrg, tebd
# SSHIntModel defined above, with charges='same'
M = SSHIntModel({'bc_MPS': 'infinite', 'tau': 1., 'nsys': 4})
pstate = ['empty_A full_B'] * M.lat.N_sites
psi = MPS.from_product_state(M.lat.mps_sites(), pstate, bc=M.lat.bc_MPS)
print("before dmrg:", psi.average_charge())
dmrg.run(psi, M, {})
print("after dmrg:", psi.average_charge())
eng = tebd.Engine(psi, M, {'dt': 0.001, 'N_steps':1, 'order': 2})
for i in range(5):
eng.run()
print("t =", eng.evolved_time, "average charge =", psi.average_charge())
```

(It only affected the infinite case with non-zero qtotal in the unit cell.)

Anyways, I've fixed in in f93f27b63d89a9669e95f2553afbde8d6ac140d7.

After this commit, the average charge stays constant -0.5, as expected.

This was probably also the reason why you got only zero eigenvalues for the transfer matrix, if you have initialized it with

`charge_sector=0`

, which is the default and **assumes**that the dominant eigenvalue is in charge sector 0.If you would have put

`charge_sector=None`

(which is the default if you use `psi.overlap(other_psi)`

, it checks *all* possible charge sectors.While

`charge_sector=0`

probably works after the fix, I think you should check for large eingenvalues in the other charge sectors as well; I'd expect that if you do a flux pump such that `psi.average_charge()`

changes by one, the charge sector of the dominant eigenvector of the mixed transfer matrix will also change.I hope this settles the problems