Page 2 of 2

### 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 `get_sshint_model` funciton obsolete:

Code: Select all

``````class SSHIntModel(CouplingMPOModel, NearestNeighborModel):
...
``````
Regarding the charges, your model should work perfectly fine with `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())
``````
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 `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

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

Posted: 17 Jun 2020, 03:38
Hi Johannes,

Thank you so much! Using charge_sector = None and pulling the most recent commit from TeNPy, I am now able to extract both the Polarization and the TM eigs when using charges='same'. Also switched to using DMRG for the ground state as you suggested. Everything works perfectly

Thanks for bearing with me and helping solve this issue. I really appreciate it!

Best,
Jacob