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