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