Skip to content

Commit

Permalink
Add sigma t-J model
Browse files Browse the repository at this point in the history
  • Loading branch information
Yue-Zhengyuan committed Mar 5, 2025
1 parent b2c370e commit 6d052a5
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 22 deletions.
29 changes: 20 additions & 9 deletions src/models/hamiltonians.jl
Original file line number Diff line number Diff line change
Expand Up @@ -383,16 +383,25 @@ end
"""
tj_model([elt::Type{<:Number}], [particle_symmetry::Type{<:Sector}],
[spin_symmetry::Type{<:Sector}], [lattice::AbstractLattice];
t, J, mu, slave_fermion::Bool=false)
t, J, mu, slave_fermion::Bool=false, sigma::Bool=false)
MPO for the hamiltonian of the t-J model, as defined by
MPO for the hamiltonian of the t-J model or the sigma t-J model,
```math
H = -t \\sum_{\\langle i,j \\rangle, \\sigma}
(\\tilde{e}^\\dagger_{i,\\sigma} \\tilde{e}_{j,\\sigma} + h.c.)
+ J \\sum_{\\langle i,j \\rangle}(\\mathbf{S}_i \\cdot \\mathbf{S}_j - \\frac{1}{4} n_i n_j)
H = H_t + 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`` restrict to the no-double-occupancy subspace.
where the hopping term is
```math
H_t = -t \\sum_{\\langle i,j \\rangle, \\sigma}
(\\tilde{e}^\\dagger_{i,\\sigma} \\tilde{e}_{j,\\sigma} + h.c.)
```
for the t-J model (with `sigma = false`), or
```math
H = -t \\sum_{\\langle i,j \\rangle, \\sigma} \\sigma
(\\tilde{e}^\\dagger_{i,\\sigma} \\tilde{e}_{j,\\sigma} + h.c.)
```
for the sigma t-J model (with `sigma = true`, introduced in https://doi.org/10.1038/srep02586).
In both cases, ``\\tilde{e}_{i,\\sigma}`` is the electron operator with spin ``\\sigma`` restrict to the no-double-occupancy subspace.
"""
function tj_model end
function tj_model(lattice::AbstractLattice; kwargs...)
Expand All @@ -409,9 +418,11 @@ function tj_model(T::Type{<:Number}=ComplexF64,
particle_symmetry::Type{<:Sector}=Trivial,
spin_symmetry::Type{<:Sector}=Trivial,
lattice::AbstractLattice=InfiniteChain(1);
t=2.5, J=1.0, mu=0.0, slave_fermion::Bool=false)
hopping = TJOperators.e_plusmin(T, particle_symmetry, spin_symmetry; slave_fermion) +
TJOperators.e_minplus(T, particle_symmetry, spin_symmetry; slave_fermion)
t=2.5, J=1.0, mu=0.0, slave_fermion::Bool=false, sigma::Bool=false)
hopping = TJOperators.e_plusmin(T, particle_symmetry, spin_symmetry; slave_fermion,

Check warning on line 422 in src/models/hamiltonians.jl

View check run for this annotation

Codecov / codecov/patch

src/models/hamiltonians.jl#L422

Added line #L422 was not covered by tests
sigma) +
TJOperators.e_minplus(T, particle_symmetry, spin_symmetry; slave_fermion,
sigma)
num = TJOperators.e_number(T, particle_symmetry, spin_symmetry; slave_fermion)
heisenberg = TJOperators.S_exchange(T, particle_symmetry, spin_symmetry;
slave_fermion) -
Expand Down
36 changes: 23 additions & 13 deletions src/operators/tjoperators.jl
Original file line number Diff line number Diff line change
Expand Up @@ -212,33 +212,43 @@ end
const e⁻e⁺ꜜ = e_minplus_down

"""
e_plusmin(T, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector}; slave_fermion::Bool = false)
e_plusmin(T, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector}; slave_fermion::Bool = false, sigma::Bool = false)
Return the two-body operator that creates a particle at the first site and annihilates a particle at the second.
This is the sum of `e_plusmin_up` and `e_plusmin_down`.
This is defined as `e_plusmin_up + e_plusmin_down` when `sigma = false`,
or `e_plusmin_up - e_plusmin_down` when `sigma = true`.
"""
function e_plusmin(P::Type{<:Sector}, S::Type{<:Sector}; slave_fermion::Bool=false)
return e_plusmin(ComplexF64, P, S; slave_fermion)
function e_plusmin(P::Type{<:Sector}, S::Type{<:Sector}; slave_fermion::Bool=false,
sigma::Bool=false)
return e_plusmin(ComplexF64, P, S; slave_fermion, sigma)
end
function e_plusmin(T, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector};
slave_fermion::Bool=false)
return e_plusmin_up(T, particle_symmetry, spin_symmetry; slave_fermion) +
e_plusmin_down(T, particle_symmetry, spin_symmetry; slave_fermion)
slave_fermion::Bool=false, sigma::Bool=false)
return if sigma
e_plusmin_up(T, particle_symmetry, spin_symmetry; slave_fermion) -

Check warning on line 228 in src/operators/tjoperators.jl

View check run for this annotation

Codecov / codecov/patch

src/operators/tjoperators.jl#L228

Added line #L228 was not covered by tests
e_plusmin_down(T, particle_symmetry, spin_symmetry; slave_fermion)
else
e_plusmin_up(T, particle_symmetry, spin_symmetry; slave_fermion) +
e_plusmin_down(T, particle_symmetry, spin_symmetry; slave_fermion)
end
end
const e⁺e⁻ = e_plusmin

"""
e_minplus(T, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector}; slave_fermion::Bool = false)
e_minplus(T, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector}; slave_fermion::Bool = false, sigma::Bool = false)
Return the two-body operator that annihilates a particle at the first site and creates a particle at the second.
This is the sum of `e_minplus_up` and `e_minplus_down`.
This is defined as `e_minplus_up + e_minplus_down` when `sigma = false`,
or `e_minplus_up - e_minplus_down` when `sigma = true`.
"""
function e_minplus(P::Type{<:Sector}, S::Type{<:Sector}; slave_fermion::Bool=false)
return e_minplus(ComplexF64, P, S; slave_fermion)
function e_minplus(P::Type{<:Sector}, S::Type{<:Sector}; slave_fermion::Bool=false,
sigma::Bool=false)
return e_minplus(ComplexF64, P, S; slave_fermion, sigma)
end
function e_minplus(T, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector};
slave_fermion::Bool=false)
return copy(adjoint(e_plusmin(T, particle_symmetry, spin_symmetry; slave_fermion)))
slave_fermion::Bool=false, sigma::Bool=false)
return copy(adjoint(e_plusmin(T, particle_symmetry, spin_symmetry; slave_fermion,
sigma)))
end
const e⁻e⁺ = e_minplus

Expand Down
1 change: 1 addition & 0 deletions test/tjoperators.jl
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ implemented_symmetries = [(Trivial, Trivial),
(U1Irrep, U1Irrep)]
@testset "basic properties" begin
for slave_fermion in (false, true),
sigma in (false, true),
particle_symmetry in (Trivial, U1Irrep),
spin_symmetry in (Trivial, U1Irrep, SU2Irrep)

Expand Down

0 comments on commit 6d052a5

Please sign in to comment.