Page 1 of 1

Heisenberg XXZ chain with stagger interaction

Posted: 23 Jul 2021, 08:24
by ling
Hi, happy new day!
I try to use tenpy to calculate the entropy of Heisenberg XXZ chain (open boundary) with alternating interaction.
Hailtonian:\(H=\sum_{i=1}^{L} {J ( 1 + \gamma (-1)^{i} ) (S_{i}^{x} S_{i+1}^{x} + S_{i}^{y} S_{i+1}^{y} + J_{z} S_{i}^{z} S_{i+1}^{z})}\)
This is my program.

Code: Select all

from tenpy.models.lattice import Site, Chain
from tenpy.models.model import CouplingModel, MPOModel, CouplingMPOModel, NearestNeighborModel
from tenpy.tools.params import asConfig
from tenpy.networks.site import SpinHalfSite
from tenpy.linalg import np_conserved as npc
import numpy as np

from lattice import StaggerLadder

class StaggerLineModel(CouplingMPOModel):
    def __init__(self, model_params={}):
        model_params = asConfig(model_params, "StaggerLadderModel")
        L = model_params.get('L', 4)
        bc_MPS = model_params.get('bc_MPS', 'finite')
        site = SpinHalfSite(conserve=None)
        bc = 'periodic' if bc_MPS == 'infinite' else 'open'
        lat = StaggerLadder(L, site, bc=bc, bc_MPS=bc_MPS)
        model_params.setdefault('lattice', lat)
        self.params = model_params
        CouplingMPOModel.__init__(self, model_params)

    def init_sites(self, model_params):
        return SpinHalfSite(conserve=None)

    def init_terms(self, model_params):
        J = model_params.get('J', 1.)
        Jz = model_params.get('Jz', 1.)
        gamma = model_params.get('gamma', 0.2)
        h = model_params.get('hz', 0.)
        # add terms
        for u1, u2, dx in self.lat.pairs['J1']:
            self.add_coupling((1 - gamma)*(J) , u1, 'Sx', u2, 'Sx', dx)
            self.add_coupling((1 - gamma)*(J) , u1, 'Sy', u2, 'Sy', dx)
            self.add_coupling((1 - gamma)*Jz*J, u1, 'Sz', u2, 'Sz', dx)        
        for u1, u2, dx in self.lat.pairs['J2']:
            self.add_coupling((1 + gamma)*(J) , u1, 'Sx', u2, 'Sx', dx)
            self.add_coupling((1 + gamma)*(J) , u1, 'Sy', u2, 'Sy', dx)
            self.add_coupling((1 + gamma)*Jz*J, u1, 'Sz', u2, 'Sz', dx)        
        for u in range(len(self.lat.unit_cell)):
            self.add_onsite(h, u, 'Sz')

 
I find that when the anosptropic parameter J_{z} increases to more bigger value (e.g. J_{z}=3.4), an error will occur. Is this because my program parameter setting is wrong? Or is it because the symmetry of the system makes it impossible to find the correct ground state? What should I do?
Looking forward to your reply.

Re: Heisenberg XXZ chain with stagger interaction

Posted: 11 Aug 2021, 17:34
by Johannes
What error do you get? Can you please include the error traceback? Otherwise I can only guess what the problem might be....

It seems strange that it works for smaller J_z, but not for larger one.

By the way, you can actually do this without implementing a custom lattice/model, just based on the tenpy SpinChain.
The coupling strengths can be a numpy array that varies spatially, so you can do something like

Code: Select all

alternate = np.ones(L-1)  # there 
alternate[::2] = -1
Jx = Jy = J*(1+gamma*alternate)
Jz = J*Jz *(1+gamma*alternate)
hz = 1.
model_params = {'L': L, 'bc_MPS': 'finite', 'Jx': Jx, 'Jy': Jy, 'Jz': Jz, 'hz': hz}
model = SpinChain(model_params)

Re: Heisenberg XXZ chain with stagger interaction

Posted: 25 Sep 2021, 08:29
by ling
Tnanks for your reply! :D

I'm sorry that I didn't clarify the errors last time.

Following the description in the previous post, The errors are as follows:
The magnetization \((\sum_{i}(-1)^{i}<S_{i}^{z}>)/L\) is no longer equal to 0 when \(J_{z}\) is more larger, and the entanglement on the first bond does not change smoothly with \(J_{z}\).

The image is pasted below:
Image

I don't know what causes this phenomenon and how to avoid it.

Looking forward to your reply!

Re: Heisenberg XXZ chain with stagger interaction

Posted: 10 Oct 2021, 08:38
by Johannes
What you see here is a symmetry breaking transition; I think it's physic and not a bug in TeNPy. For large Jz, the ground state is an anti-ferromagnet forming an Neel state |up down up down ...>, but by symmetry (product of X on each site), the |down up down up ...> has the same energy. Which one it chooses, is somewhat random, and you see it fluctuate between the two solutions. In general, it could also form a superposition of the two with total (staggered) magnetization zero; but DMRG usually disfavors that due to truncation (because it requires a larger bond dimension).

Really, you should look at the correlation functions \(C(r) = (-1)^r S^z_{i} S^z_{i+r}\), which should show a clear transition.