Yes I am considering Ferromagnetic Heisenberg model on hexagonal lattice. Here is my code
Code: Select all
from tenpy.algorithms import dmrg
import numpy as np
from mps import MPS
from tenpy.models.lattice import Lattice, get_order, _parse_sites,Honeycomb
from tenpy.networks.site import SpinHalfSite
from tenpy.models.model import MultiCouplingModel, CouplingMPOModel
from tenpy.tools.params import asConfig
from tenpy.tools.misc import any_nonzero
class Heisenberg(CouplingMPOModel, MultiCouplingModel):
def init_sites(self, model_params):
conserve = model_params.get('conserve', 'parity')
#conserve = model_params.get('conserve', None)
site = SpinHalfSite(conserve)
return site
def init_lattice(self, model_params):
site = self.init_sites(model_params)
Lx = model_params.get('Lx', 2)
Ly = model_params.get('Ly', 2)
order = model_params.get('order', 'Cstyle')
bc_MPS = model_params.get('bc_MPS', 'infinite')
bc_x = 'periodic' if bc_MPS == 'infinite' else 'open'
bc_x = model_params.get('bc_x', bc_x)
bc_y = model_params.get('bc_y', 'periodic')
assert bc_y in ['open', 'periodic']
bc = [bc_x, bc_y]
lat = Honeycomb(Lx, Ly, site, order=order, bc=bc, bc_MPS=bc_MPS)
return lat
def init_terms(self, model_params):
J = model_params.get('J', -1.0)
# Heisenberg interaction on one type of bond #
self.add_multi_coupling(J, [('Sigmay', [0, 0], 0),
('Sigmay', [0, 0], 1)])
self.add_multi_coupling(J, [('Sigmax', [0, 0], 0),
('Sigmax', [0, 0], 1)])
self.add_multi_coupling(J, [('Sigmaz', [0, 0], 0),
('Sigmaz', [0, 0], 1)])
# Heisenberg interaction on second type of bond #
self.add_multi_coupling(J, [('Sigmaz', [0, 0], 1),
('Sigmaz', [1, 0], 0)])
self.add_multi_coupling(J, [('Sigmax', [0, 0], 1),
('Sigmax', [1, 0], 0)])
self.add_multi_coupling(J, [('Sigmay', [0, 0], 1),
('Sigmay', [1, 0], 0)])
# Heisenberg interaction on third type of bond #
self.add_multi_coupling(J, [('Sigmax', [0, 0], 1),
('Sigmax', [0, 1], 0)])
self.add_multi_coupling(J, [('Sigmay', [0, 0], 1),
('Sigmay', [0, 1], 0)])
self.add_multi_coupling(J, [('Sigmaz', [0, 0], 1),
('Sigmaz', [0, 1], 0)])
def example():
model_params = dict(Lx=4, Ly=4,J=-1,
verbose= 1)
M = Heisenberg(model_params)
product_state=[0]*M.lat.N_sites
psi = MPS.from_product_state(M.lat.mps_sites(), product_state, bc =M.lat.bc_MPS)
dmrg_params = {
'mixer': True, # setting this to True helps to escape local minima
'trunc_params': {
'chi_max': 10,
'svd_min': 1.e-10,
},
'max_E_err': 1.e-10,
'verbose': 1,
}
results = dmrg.run(psi, M, dmrg_params)
print("Energy per site: ", results['E'])
print(psi.entanglement_entropy_segment([1]))
print("expectation_Value",psi.expectation_value_term([('Sigmax',1)]))
print("expectation_Value",psi.expectation_value_term([('Sigmaz',1)]))
print("expectation_Value",psi.expectation_value_term([('Sigmay',1)]))
if __name__ == "__main__":
example()
So if I don't conserve parity, what makes my state to all spin up. In principle state should be symmetric.