Models

PEPSKit implements physical models as PEPSKit.LocalOperator structs. Here, we want to explain how users can define their own Hamiltonians and provide a list of already implemented models.

Implementing custom models

In order to define custom Hamiltonians, we leverage the operator building blocks provided by TensorKitTensors.jl, which offers pre-defined symmetric tensors for spin, boson, fermion, and Hubbard systems. In order to specify the lattice on which the Hamiltonian is defined, we construct two-dimensional lattices as subtypes of MPSKitModels.AbstractLattice. Note that so far, all models are defined on infinite square lattices, see InfiniteSquare, but in the future, we plan to support other lattice geometries as well. In order to specify tensors acting on particular lattice sites, there are a couple of handy methods that we want to point to: see vertices, nearest_neighbors and next_nearest_neighbors defined here.

For a simple example on how to implement a custom model, let's look at the implementation of the transverse_field_ising model:

using TensorKitTensors.SpinOperators
function transverse_field_ising(
    T::Type{<:Number},
    S::Union{Type{Trivial},Type{Z2Irrep}},
    lattice::InfiniteSquare;
    J=1.0,
    g=1.0,
)
    ZZ = rmul!(S_z_S_z(T, S), -4 * J)
    X = rmul!(σˣ(T, S), g * -J)
    spaces = fill(domain(X)[1], (lattice.Nrows, lattice.Ncols))
    return LocalOperator(
        spaces,
        (neighbor => ZZ for neighbor in nearest_neighbours(lattice))...,
        ([idx,] => X for idx in vertices(lattice))...,
    )
end

This provides a good recipe for defining a model:

  1. Define the locally-acting tensors as TensorMaps.
  2. Construct a matrix of the physical spaces these TensorMaps act on based on the lattice geometry.
  3. Return a LocalOperator where we specify on which sites (e.g. on-site, nearest neighbor, etc.) the local tensors act.

For more model implementations, check the PEPSKit repository.

Implemented models

PEPSKit provides a number of pre-defined models. The following model constructors are available and can be used directly with an InfiniteSquare lattice:

Models inherited from MPSKitModels.jl

MPSKitModels.transverse_field_isingMethod
transverse_field_ising(
    [T::Type{<:Number}], [S::Union{Type{Trivial}, Type{Z2Irrep}}],
    lattice::InfiniteSquare; J=1.0, g=1.0
)

LocalOperator for the transverse-field Ising model Hamiltonian on the square lattice,

\[H = -J\left(\sum_{\langle i,j \rangle} \sigma^z_i \sigma^z_j + g \sum_{i} \sigma^x_i \right)\]

where $\sigma^i$ are the spin-1/2 Pauli operators.

By default, it is defined with Trivial symmetry and ComplexF64 entries.

source
MPSKitModels.heisenberg_XYZMethod
heisenberg_XYZ([T::Type{<:Number}], [S::Type{<:Sector}], lattice::InfiniteSquare;
               Jx=-1.0, Jy=1.0, Jz=-1.0, spin=1//2)

LocalOperator for the XYZ Heisenberg model Hamiltonian on the square lattice,

\[H = \sum_{\langle i,j \rangle} \left( J_x S_i^x S_j^x + J_y S_i^y S_j^y + J_z S_i^z S_j^z \right)\]

By default, it is defined with Trivial symmetry and ComplexF64 entries.

See also heisenberg_XXZ.

source
MPSKitModels.heisenberg_XXZMethod
heisenberg_XXZ([T::Type{<:Number}], [S::Type{<:Sector}], lattice::InfiniteSquare;
               J=1.0, Delta=1.0, spin=1)

LocalOperator for the XXZ Heisenberg model Hamiltonian on the square lattice,

\[H = J \sum_{\langle i,j \rangle} \left( S_i^x S_j^x + S_i^y S_j^y + \Delta S_i^z S_j^z \right)\]

By default, it is defined with Trivial symmetry and ComplexF64 entries.

See also heisenberg_XYZ.

source
MPSKitModels.hubbard_modelMethod
hubbard_model([T::Type{<:Number}], [particle_symmetry::Type{<:Sector}],
              [spin_symmetry::Type{<:Sector}], lattice::InfiniteSquare;
              t=1.0, U=1.0, mu=0.0, n=0)

LocalOperator for the Fermi-Hubbard model Hamiltonian on the square lattice,

\[H = -t \sum_{\langle i,j \rangle} \sum_{\sigma} \left( e_{i,\sigma}^\dagger e_{j,\sigma} + \text{h.c.} \right) + U \sum_i n_{i,\uparrow} n_{i,\downarrow} - \mu \sum_i n_i\]

where $\sigma \in \{\uparrow, \downarrow\}$ is a spin index and $n$ is the fermionic number operator.

By default, it is defined without any symmetries and with ComplexF64 entries.

source
MPSKitModels.bose_hubbard_modelMethod
bose_hubbard_model([elt::Type{<:Number}], [symmetry::Type{<:Sector}],
                   lattice::InfiniteSquare; cutoff=5, t=1.0, U=1.0, mu=0.0, n=0)

LocalOperator for the Bose-Hubbard model Hamiltonian on the square lattice,

\[H = -t \sum_{\langle i,j \rangle} \left( a_i^\dagger a_j + \text{h.c.} \right) - \mu \sum_i N_i + \frac{U}{2} \sum_i N_i(N_i - 1)\]

where $N = a^\dagger a$ is the bosonic number operator.

The Hilbert space is truncated such that at maximum cutoff bosons can occupy a single site. If symmetry is U1Irrep, a fixed (half-integer) particle number density n can be imposed.

By default, it is defined with Trivial symmetry and ComplexF64 entries.

source
MPSKitModels.tj_modelMethod
tj_model([T::Type{<:Number}], [particle_symmetry::Type{<:Sector}],
         [spin_symmetry::Type{<:Sector}], lattice::InfiniteSquare;
         t=2.5, J=1.0, mu=0.0, slave_fermion=false)

LocalOperator for the t-J model Hamiltonian on the square lattice,

\[H = -t \sum_{\langle i,j \rangle, \sigma} (\tilde{e}^\dagger_{i,\sigma} \tilde{e}_{j,\sigma} + \text{h.c.}) + J \sum_{\langle i,j \rangle}(\mathbf{S}_i \cdot \mathbf{S}_j - \frac{1}{4} n_i n_j) - \mu \sum_i n_i\]

where $\tilde{e}_{i,\sigma}$ is the electron operator with spin $\sigma$ projected to the no-double-occupancy subspace.

By default, it is defined without any symmetries and with ComplexF64 entries.

source

Models introduced by PEPSKit.jl

PEPSKit.j1_j2_modelFunction
j1_j2_model([T::Type{<:Number}, S::Type{<:Sector},] lattice::InfiniteSquare;
            J1=1.0, J2=1.0, spin=1//2, sublattice=true)

LocalOperator for the $J_1\text{-}J_2$ model Hamiltonian on the square lattice,

\[H = J_1 \sum_{\langle i,j \rangle} \vec{S}_i \cdot \vec{S}_j + J_2 \sum_{\langle\langle i,j \rangle\rangle} \vec{S}_i \cdot \vec{S}_j,\]

where $\vec{S}_i = (S_i^x, S_i^y, S_i^z)$. The sublattice kwarg enables a single-site unit cell ground state via a unitary sublattice rotation.

source
PEPSKit.pwave_superconductorFunction
pwave_superconductor([T=ComplexF64,] lattice::InfiniteSquare; t=1, μ=2, Δ=1)

LocalOperator for the $(p - ip)$-wave superconductor Hamiltonian on the square lattice

\[ H = -\sum_{\langle i,j \rangle} \left( t c_i^\dagger c_j + \Delta_{ij} c_i c_j + \text{h.c.} \right) - \mu \sum_i n_i,\]

where $t$ is the hopping amplitude, $\Delta_{ij}$ specifies the superconducting gap, $\mu$ is the chemical potential, and $n_i = c_i^\dagger c_i$ is the fermionic number operator. For $(p - ip)$-wave, $\Delta_{ij} = \Delta$ on horizontal bonds, and $-i \Delta$ on vertical bonds.

source