\(H = -J\sum_{i=1}^L (S^x_i S^x_{i+1} + S^y_i S^y_{i+1} + v S^z_i S^z_{i+1})\)
When I sweep through v at a low bond dimension (plotting the correlation length), I see good convergence and a reasonable phase diagram. When I increase the bond dimension, however, many points do not appear to converge (see the attached image). I have increased the maximum number of sweeps without too much luck -- on one occasion a point that had not previously converged appeared to converge, but this isn't very reproducible. I also tried seeding subsequent runs with a nearby point that had converged, but this did not have any effect.
These runs lead to a warning:
Code: Select all
RuntimeWarning: divide by zero encountered in reciprocal
S = S**form_diff
Python: Select all
from tenpy.networks.mps import MPS
from tenpy.algorithms import dmrg
from tenpy.models.xxz_chain import XXZChain
def run_simulation(v, chi_max=200, psi=None):
L = 2
J = 1.0
model_params = dict(conserve='best',
Jxx = -J,
Jz = -J * v,
hz = 0,
bc_MPS = "infinite",
verbose = 1)
M = XXZChain(model_params)
pstate = ["up", "down"]
if psi is None:
psi = MPS.from_product_state(M.lat.mps_sites(), pstate, M.lat.bc_MPS)
dmrg_params = {"lanczos_params": {"N_min": 5, "N_max": 20, "reortho":True, "N_cache":22},
"mixer": True,
"chi_list": {0: 9, 10: 19, 20: 39, 30:69, 40:chi_max},
"trunc_params": {"svd_min": 1.e-14},
"mixer_params":
{"amplitude": 1.e-3, "decay":1.1, "disable_after":100},
"max_sweeps": 40000,
"verbose": 1,
"max_E_err": 1.e-14,
"max_S_err":1.e-14,
"active_sites": 2
}
info = dmrg.run(psi, M, dmrg_params)
return(psi.correlation_length())