Heisenberg XXZ chain with stagger interaction

General discussions on the ideas behind the algorithm.
Post Reply
ling
Posts: 6
Joined: 23 Jul 2021, 06:42

Heisenberg XXZ chain with stagger interaction

Post 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.
User avatar
Johannes
Site Admin
Posts: 456
Joined: 21 Jul 2018, 12:52
Location: TU Munich

Re: Heisenberg XXZ chain with stagger interaction

Post 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

Python: 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)
ling
Posts: 6
Joined: 23 Jul 2021, 06:42

Re: Heisenberg XXZ chain with stagger interaction

Post 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!
Attachments
L64errors.jpg
L64errors.jpg (110.74 KiB) Viewed 15725 times
User avatar
Johannes
Site Admin
Posts: 456
Joined: 21 Jul 2018, 12:52
Location: TU Munich

Re: Heisenberg XXZ chain with stagger interaction

Post 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.
Post Reply