I'm trying to implement the 3-state Potts Model, with Hamiltonian
H = \(\sum_i \Omega^{\dagger}_i\Omega_{i+1} + \Omega_i\Omega^{\dagger}_{i+1} + \sum_i [\Gamma_i^{(1)} + \Gamma_i^{(2)}]\)
with
\(\Omega_i = diag(1, e^{i2\pi/3}, e^{-i2\pi/3})\)
And \(\Gamma_i^{(1)}\) is a cyclic permutation of the 3 basis states, and \(\Gamma_i^{(2)}\) is the other cyclic permutation (not sure how to make matrices in HTML, hopefully what I'm saying is clear.)
This model has a \(\mathbb{Z}_3\) symmetry generated by \(\Gamma_i^{(1)}\), this is the generalization of the TFIM which has a \(\mathbb{Z}_2\) symmetry.
I'm confused on how to properly implement the charge conservation for this \(\mathbb{Z}_3\) symmetry. I don't fully understand the charge conservation idea in TeNPy. I defined a class
Code: Select all
class PottsSite(Site):
def __init__(self, conserve='Z3'):
if not conserve:
conserve = 'None'
if conserve not in ['None','Z3']:
raise ValueError("invalid `conserve`: " + repr(conserve))
qcharges = np.array([0,1,2])
Omega = [[1,0,0],[0,np.exp(1j*2*np.pi/3),0],[0,0,np.exp(-1j*2*np.pi/3)]]
Omegadag = [[1,0,0],[0,np.exp(-1j*2*np.pi/3),0],[0,0,np.exp(1j*2*np.pi/3)]]
Gamma1 = [[0,1,0],[0,0,1],[1,0,0]]
Gamma2 = [[0,0,1],[1,0,0],[0,1,0]]
ops = dict(Omega=Omega, Omegadag=Omegadag, Gamma1=Gamma1, Gamma2=Gamma2)
if conserve == 'Z3':
chinfo = npc.ChargeInfo([3], ['Z3_potts'])
leg = npc.LegCharge.from_qflat(chinfo, np.array(qcharges, dtype=np.int64))
else:
leg = npc.LegCharge.from_trivial(d)
self.conserve = conserve
names = [str(i) for i in range(3)]
Site.__init__(self, leg, names, **ops)
Code: Select all
ValueError: Arrays can't have different `qtotal`!
Best,
Nick