Skip to content

Commit 6d052a5

Browse files
committed
Add sigma t-J model
1 parent b2c370e commit 6d052a5

File tree

3 files changed

+44
-22
lines changed

3 files changed

+44
-22
lines changed

src/models/hamiltonians.jl

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -383,16 +383,25 @@ end
383383
"""
384384
tj_model([elt::Type{<:Number}], [particle_symmetry::Type{<:Sector}],
385385
[spin_symmetry::Type{<:Sector}], [lattice::AbstractLattice];
386-
t, J, mu, slave_fermion::Bool=false)
386+
t, J, mu, slave_fermion::Bool=false, sigma::Bool=false)
387387
388-
MPO for the hamiltonian of the t-J model, as defined by
388+
MPO for the hamiltonian of the t-J model or the sigma t-J model,
389389
```math
390-
H = -t \\sum_{\\langle i,j \\rangle, \\sigma}
391-
(\\tilde{e}^\\dagger_{i,\\sigma} \\tilde{e}_{j,\\sigma} + h.c.)
392-
+ J \\sum_{\\langle i,j \\rangle}(\\mathbf{S}_i \\cdot \\mathbf{S}_j - \\frac{1}{4} n_i n_j)
390+
H = H_t + J \\sum_{\\langle i,j \\rangle}(\\mathbf{S}_i \\cdot \\mathbf{S}_j - \\frac{1}{4} n_i n_j)
393391
- \\mu \\sum_i n_i
394392
```
395-
where ``\\tilde{e}_{i,\\sigma}`` is the electron operator with spin ``\\sigma`` restrict to the no-double-occupancy subspace.
393+
where the hopping term is
394+
```math
395+
H_t = -t \\sum_{\\langle i,j \\rangle, \\sigma}
396+
(\\tilde{e}^\\dagger_{i,\\sigma} \\tilde{e}_{j,\\sigma} + h.c.)
397+
```
398+
for the t-J model (with `sigma = false`), or
399+
```math
400+
H = -t \\sum_{\\langle i,j \\rangle, \\sigma} \\sigma
401+
(\\tilde{e}^\\dagger_{i,\\sigma} \\tilde{e}_{j,\\sigma} + h.c.)
402+
```
403+
for the sigma t-J model (with `sigma = true`, introduced in https://doi.org/10.1038/srep02586).
404+
In both cases, ``\\tilde{e}_{i,\\sigma}`` is the electron operator with spin ``\\sigma`` restrict to the no-double-occupancy subspace.
396405
"""
397406
function tj_model end
398407
function tj_model(lattice::AbstractLattice; kwargs...)
@@ -409,9 +418,11 @@ function tj_model(T::Type{<:Number}=ComplexF64,
409418
particle_symmetry::Type{<:Sector}=Trivial,
410419
spin_symmetry::Type{<:Sector}=Trivial,
411420
lattice::AbstractLattice=InfiniteChain(1);
412-
t=2.5, J=1.0, mu=0.0, slave_fermion::Bool=false)
413-
hopping = TJOperators.e_plusmin(T, particle_symmetry, spin_symmetry; slave_fermion) +
414-
TJOperators.e_minplus(T, particle_symmetry, spin_symmetry; slave_fermion)
421+
t=2.5, J=1.0, mu=0.0, slave_fermion::Bool=false, sigma::Bool=false)
422+
hopping = TJOperators.e_plusmin(T, particle_symmetry, spin_symmetry; slave_fermion,
423+
sigma) +
424+
TJOperators.e_minplus(T, particle_symmetry, spin_symmetry; slave_fermion,
425+
sigma)
415426
num = TJOperators.e_number(T, particle_symmetry, spin_symmetry; slave_fermion)
416427
heisenberg = TJOperators.S_exchange(T, particle_symmetry, spin_symmetry;
417428
slave_fermion) -

src/operators/tjoperators.jl

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -212,33 +212,43 @@ end
212212
const e⁻e⁺ꜜ = e_minplus_down
213213

214214
"""
215-
e_plusmin(T, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector}; slave_fermion::Bool = false)
215+
e_plusmin(T, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector}; slave_fermion::Bool = false, sigma::Bool = false)
216216
217217
Return the two-body operator that creates a particle at the first site and annihilates a particle at the second.
218-
This is the sum of `e_plusmin_up` and `e_plusmin_down`.
218+
This is defined as `e_plusmin_up + e_plusmin_down` when `sigma = false`,
219+
or `e_plusmin_up - e_plusmin_down` when `sigma = true`.
219220
"""
220-
function e_plusmin(P::Type{<:Sector}, S::Type{<:Sector}; slave_fermion::Bool=false)
221-
return e_plusmin(ComplexF64, P, S; slave_fermion)
221+
function e_plusmin(P::Type{<:Sector}, S::Type{<:Sector}; slave_fermion::Bool=false,
222+
sigma::Bool=false)
223+
return e_plusmin(ComplexF64, P, S; slave_fermion, sigma)
222224
end
223225
function e_plusmin(T, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector};
224-
slave_fermion::Bool=false)
225-
return e_plusmin_up(T, particle_symmetry, spin_symmetry; slave_fermion) +
226-
e_plusmin_down(T, particle_symmetry, spin_symmetry; slave_fermion)
226+
slave_fermion::Bool=false, sigma::Bool=false)
227+
return if sigma
228+
e_plusmin_up(T, particle_symmetry, spin_symmetry; slave_fermion) -
229+
e_plusmin_down(T, particle_symmetry, spin_symmetry; slave_fermion)
230+
else
231+
e_plusmin_up(T, particle_symmetry, spin_symmetry; slave_fermion) +
232+
e_plusmin_down(T, particle_symmetry, spin_symmetry; slave_fermion)
233+
end
227234
end
228235
const e⁺e⁻ = e_plusmin
229236

230237
"""
231-
e_minplus(T, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector}; slave_fermion::Bool = false)
238+
e_minplus(T, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector}; slave_fermion::Bool = false, sigma::Bool = false)
232239
233240
Return the two-body operator that annihilates a particle at the first site and creates a particle at the second.
234-
This is the sum of `e_minplus_up` and `e_minplus_down`.
241+
This is defined as `e_minplus_up + e_minplus_down` when `sigma = false`,
242+
or `e_minplus_up - e_minplus_down` when `sigma = true`.
235243
"""
236-
function e_minplus(P::Type{<:Sector}, S::Type{<:Sector}; slave_fermion::Bool=false)
237-
return e_minplus(ComplexF64, P, S; slave_fermion)
244+
function e_minplus(P::Type{<:Sector}, S::Type{<:Sector}; slave_fermion::Bool=false,
245+
sigma::Bool=false)
246+
return e_minplus(ComplexF64, P, S; slave_fermion, sigma)
238247
end
239248
function e_minplus(T, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector};
240-
slave_fermion::Bool=false)
241-
return copy(adjoint(e_plusmin(T, particle_symmetry, spin_symmetry; slave_fermion)))
249+
slave_fermion::Bool=false, sigma::Bool=false)
250+
return copy(adjoint(e_plusmin(T, particle_symmetry, spin_symmetry; slave_fermion,
251+
sigma)))
242252
end
243253
const e⁻e⁺ = e_minplus
244254

test/tjoperators.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ implemented_symmetries = [(Trivial, Trivial),
99
(U1Irrep, U1Irrep)]
1010
@testset "basic properties" begin
1111
for slave_fermion in (false, true),
12+
sigma in (false, true),
1213
particle_symmetry in (Trivial, U1Irrep),
1314
spin_symmetry in (Trivial, U1Irrep, SU2Irrep)
1415

0 commit comments

Comments
 (0)