Bipartitioning infinite MPS into 2 semi-infinite chains

How do I use this algorithm? What does that parameter do?
User avatar
Johannes
Site Admin
Posts: 177
Joined: 21 Jul 2018, 12:52
Location: UC Berkeley

Re: Bipartitioning infinite MPS into 2 semi-infinite chains

Post by Johannes »

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 8-)

jamarks
Posts: 6
Joined: 01 May 2020, 19:14

Re: Bipartitioning infinite MPS into 2 semi-infinite chains

Post by jamarks »

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

Post Reply