Code: Select all
get_rho_segment([0], 1)Does anyone know how to bipartition an infinite MPS into 2 semi-infinite chains so that I can compute the Resta polarization?
Thank you in advance for the help

Code: Select all
get_rho_segment([0], 1)
0.123 and 1.123 are equivalent: we need to subtract (somewhat) arbitrary integer numbers of charges to get a finite value.examples/chern_insulators/chiral_pi_flux.py make a similar "experiment" of flux pumping and following the value of the average charge, you can probably base your code on that example.chiral_pi_flux_charge_pump.pdf, the equivalent of Fig. 4 in the paper you quote, and chiral_pi_flux_ent_spec_flow.pdf, the equivalent of Fig. 8.P from the paper is simply what's returned by average_charge.charge_sector=None, but then the charge conservation should have no effect on the eigenvalues of the transfer matrix.Code: Select all
from tenpy.models.model import NearestNeighborModel, CouplingMPOModel
from tenpy.models.lattice import Site, Chain
from tenpy.networks.site import FermionSite, GroupedSite
class SSHIntModel(CouplingMPOModel):
	def init_sites(self, model_params):
		fs = FermionSite(conserve = 'N')
		gs = GroupedSite([fs, fs], labels = ['A', 'B'], charges = 'drop')
		gs.add_op('Sz', gs.NA - gs.NB, False)
		return gs
	def init_lattice(self, model_params):
		bc_MPS = model_params.get('bc_MPS', 'infinite')
		bc = 'periodic' if bc_MPS == 'infinite' else 'open'
		nsys = model_params.get('nsys') if bc_MPS == 'finite' else 2
		self.L = nsys
		fs = self.init_sites(model_params)
		lat = Chain(nsys, fs, bc=bc, bc_MPS=bc_MPS)
		return lat
	def init_terms(self, model_params):
		J = model_params.get('J', 0.)
		d = model_params.get('d', 1.)
		tau = model_params.get('tau', 1.)
		V = model_params.get('V', 0.)
		dlt = model_params.get('dlt', 0.)
		#### Staggered Onsite Potential ####
		if dlt != 0.:
			self.add_onsite(dlt, 0, 'Sz')
		#### intracell hopping terms ####
		self.add_onsite(-J, 0, 'CdA CB')
		self.add_onsite(J, 0, 'CA CdB')
		#### intercell hopping terms ####
		hop_plus = (d + tau)/2.
		self.add_coupling(-hop_plus, 0, 'CdB', 0, 'CA', [1])
		self.add_coupling(-hop_plus, 0, 'CdA', 0, 'CB', [-1])
		hop_minus = (d - tau)/2.
		self.add_coupling(-hop_minus, 0, 'CdA', 0, 'CB', [1])
		self.add_coupling(-hop_minus, 0, 'CdB', 0, 'CA', [-1])
		#### interaction terms ####
		if V != 0:
			self.add_coupling(V, 0, 'NA', 0, 'NB', [1])
			self.add_coupling(V, 0, 'NB', 0, 'NA', [1])
def get_sshint_model(model_params):
	M = SSHIntModel(model_params)
	return NearestNeighborModel.from_MPOModel(M)			
"Adiabatically" implies that the time evolution is slow enough to always stay in the ground state of the system.arxiv 1810.07043, Sec. III a wrote: We define \(\theta = 2\pi t/T\), assume adiabaticity and work in the instantaneous eigenbasis of \(H(\theta)\). Hence, the charge transport becomes independent of the time scale \(T\).
get_sshint_model funciton obsolete:
Python: Select all
class SSHIntModel(CouplingMPOModel, NearestNeighborModel):
    ...
charges='same' for the GroupedSite.Python: 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())
charge_sector=0, which is the default and assumes that the dominant eigenvalue is in charge sector 0.charge_sector=None (which is the default if you use psi.overlap(other_psi), it checks *all* possible charge sectors.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.