\(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_diffPython: 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())


