Source code for ed_lgt.models.Z2_FermiHubbard_model

from ed_lgt.operators import (
    Z2_FermiHubbard_dressed_site_operators,
    Z2_FermiHubbard_gauge_invariant_states,
)
from ed_lgt.modeling import LocalTerm, TwoBodyTerm, QMB_hamiltonian
from ed_lgt.modeling import check_link_symmetry
from .quantum_model import QuantumModel


__all__ = ["Z2_FermiHubbard_Model"]


[docs] class Z2_FermiHubbard_Model(QuantumModel): def __init__(self, **kwargs): # Initialize base class with the common parameters super().__init__(**kwargs) # Acquire operators self.ops = Z2_FermiHubbard_dressed_site_operators(lattice_dim=self.dim) # Acquire gauge invariant basis and states self.gauge_basis, self.gauge_states = Z2_FermiHubbard_gauge_invariant_states( lattice_dim=self.dim ) # Acquire local dimension and lattice label self.get_local_site_dimensions()
[docs] def build_Hamiltonian(self, coeffs): # Hamiltonian Coefficients self.coeffs = coeffs # CONSTRUCT THE HAMILTONIAN self.H = QMB_hamiltonian(0, self.lvals, self.loc_dims) h_terms = {} # ------------------------------------------------------------------------------- # COULOMB POTENTIAL op_name = "N_pair_half" h_terms["V"] = LocalTerm(self.ops[op_name], op_name, **self.def_params) self.H.Ham += h_terms["V"].get_Hamiltonian(strength=self.coeffs["U"]) # ------------------------------------------------------------------------------- # HOPPING for d in self.directions: for s in ["up", "down"]: # Define the list of the 2 non trivial operators op_names_list = [f"Q{s}_p{d}_dag", f"Q{s}_m{d}"] op_list = [self.ops[op] for op in op_names_list] # Define the Hamiltonian term h_terms[f"{d}_hop_{s}"] = TwoBodyTerm( d, op_list, op_names_list, **self.def_params ) self.H.Ham += h_terms[f"{d}_hop_{s}"].get_Hamiltonian( strength=self.coeffs["t"], add_dagger=True )
[docs] def check_symmetries(self): # CHECK LINK SYMMETRIES for ax in self.directions: check_link_symmetry( ax, self.obs_list[f"n_p{ax}"], self.obs_list[f"n_m{ax}"], value=0, sign=-1, )