From 6d052a578b1756ee8ca29ebb3d683b590f63cfcd Mon Sep 17 00:00:00 2001 From: Yue Zhengyuan Date: Wed, 5 Mar 2025 11:28:59 +0800 Subject: [PATCH 1/3] Add sigma t-J model --- src/models/hamiltonians.jl | 29 ++++++++++++++++++++--------- src/operators/tjoperators.jl | 36 +++++++++++++++++++++++------------- test/tjoperators.jl | 1 + 3 files changed, 44 insertions(+), 22 deletions(-) diff --git a/src/models/hamiltonians.jl b/src/models/hamiltonians.jl index 7da3a25..f6ecc97 100644 --- a/src/models/hamiltonians.jl +++ b/src/models/hamiltonians.jl @@ -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...) @@ -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, + 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) - diff --git a/src/operators/tjoperators.jl b/src/operators/tjoperators.jl index 96b796d..11fedf4 100644 --- a/src/operators/tjoperators.jl +++ b/src/operators/tjoperators.jl @@ -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) - + 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 diff --git a/test/tjoperators.jl b/test/tjoperators.jl index 9265a69..8c3f862 100644 --- a/test/tjoperators.jl +++ b/test/tjoperators.jl @@ -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) From cce76574b76d7684a3041fe339c6f76bf3ed24a0 Mon Sep 17 00:00:00 2001 From: Yue Zhengyuan Date: Thu, 6 Mar 2025 10:56:59 +0800 Subject: [PATCH 2/3] Separate sigmatj_model from tj_model --- src/models/hamiltonians.jl | 80 +++++++++++++++++++++++++++--------- src/operators/tjoperators.jl | 36 ++++++---------- test/tjoperators.jl | 1 - 3 files changed, 73 insertions(+), 44 deletions(-) diff --git a/src/models/hamiltonians.jl b/src/models/hamiltonians.jl index f6ecc97..1e74d89 100644 --- a/src/models/hamiltonians.jl +++ b/src/models/hamiltonians.jl @@ -383,25 +383,16 @@ end """ tj_model([elt::Type{<:Number}], [particle_symmetry::Type{<:Sector}], [spin_symmetry::Type{<:Sector}], [lattice::AbstractLattice]; - t, J, mu, slave_fermion::Bool=false, sigma::Bool=false) + t, J, mu, slave_fermion::Bool=false) -MPO for the hamiltonian of the t-J model or the sigma t-J model, +MPO for the hamiltonian of the t-J model, as defined by ```math -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 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 +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) + - \\mu \\sum_i n_i ``` -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. +where ``\\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...) @@ -418,11 +409,60 @@ 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, sigma::Bool=false) - hopping = TJOperators.e_plusmin(T, particle_symmetry, spin_symmetry; slave_fermion, - sigma) + - TJOperators.e_minplus(T, particle_symmetry, spin_symmetry; slave_fermion, - sigma) + 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) + num = TJOperators.e_number(T, particle_symmetry, spin_symmetry; slave_fermion) + heisenberg = TJOperators.S_exchange(T, particle_symmetry, spin_symmetry; + slave_fermion) - + (1 / 4) * (num ⊗ num) + return @mpoham begin + sum(nearest_neighbours(lattice)) do (i, j) + return (-t) * hopping{i,j} + J * heisenberg{i,j} + end + sum(vertices(lattice)) do i + return (-mu) * num{i} + end + end +end + +""" + sigmatj_model([elt::Type{<:Number}], [particle_symmetry::Type{<:Sector}], + [spin_symmetry::Type{<:Sector}], [lattice::AbstractLattice]; + t, J, mu, slave_fermion::Bool=false) + +MPO for the hamiltonian of the sigma t-J model (introduced in https://doi.org/10.1038/srep02586) +```math +H = -t \\sum_{\\langle i,j \\rangle, \\sigma} \\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) + - \\mu \\sum_i n_i +``` +where ``\\tilde{e}_{i,\\sigma}`` is the electron operator with spin ``\\sigma`` restrict to the no-double-occupancy subspace. +""" +function sigmatj_model end +function sigmatj_model(lattice::AbstractLattice; kwargs...) + return sigmatj_model(ComplexF64, Trivial, Trivial, lattice; kwargs...) +end +function sigmatj_model(particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector}; + kwargs...) + return sigmatj_model(ComplexF64, particle_symmetry, spin_symmetry; kwargs...) +end +function sigmatj_model(elt::Type{<:Number}, lattice::AbstractLattice; kwargs...) + return sigmatj_model(elt, Trivial, Trivial, lattice; kwargs...) +end +function sigmatj_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_up(T, particle_symmetry, spin_symmetry; + slave_fermion) - + TJOperators.e_plusmin_down(T, particle_symmetry, spin_symmetry; + slave_fermion) + + TJOperators.e_minplus_up(T, particle_symmetry, spin_symmetry; + slave_fermion) - + TJOperators.e_minplus_down(T, particle_symmetry, spin_symmetry; + slave_fermion)) num = TJOperators.e_number(T, particle_symmetry, spin_symmetry; slave_fermion) heisenberg = TJOperators.S_exchange(T, particle_symmetry, spin_symmetry; slave_fermion) - diff --git a/src/operators/tjoperators.jl b/src/operators/tjoperators.jl index 11fedf4..96b796d 100644 --- a/src/operators/tjoperators.jl +++ b/src/operators/tjoperators.jl @@ -212,43 +212,33 @@ end const e⁻e⁺ꜜ = e_minplus_down """ - e_plusmin(T, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector}; slave_fermion::Bool = false, sigma::Bool = false) + e_plusmin(T, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector}; slave_fermion::Bool = false) Return the two-body operator that creates a particle at the first site and annihilates a particle at the second. -This is defined as `e_plusmin_up + e_plusmin_down` when `sigma = false`, -or `e_plusmin_up - e_plusmin_down` when `sigma = true`. +This is the sum of `e_plusmin_up` and `e_plusmin_down`. """ -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) +function e_plusmin(P::Type{<:Sector}, S::Type{<:Sector}; slave_fermion::Bool=false) + return e_plusmin(ComplexF64, P, S; slave_fermion) end function e_plusmin(T, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector}; - slave_fermion::Bool=false, sigma::Bool=false) - return if sigma - e_plusmin_up(T, particle_symmetry, spin_symmetry; slave_fermion) - - 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 + 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) end const e⁺e⁻ = e_plusmin """ - e_minplus(T, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector}; slave_fermion::Bool = false, sigma::Bool = false) + e_minplus(T, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector}; slave_fermion::Bool = false) Return the two-body operator that annihilates a particle at the first site and creates a particle at the second. -This is defined as `e_minplus_up + e_minplus_down` when `sigma = false`, -or `e_minplus_up - e_minplus_down` when `sigma = true`. +This is the sum of `e_minplus_up` and `e_minplus_down`. """ -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) +function e_minplus(P::Type{<:Sector}, S::Type{<:Sector}; slave_fermion::Bool=false) + return e_minplus(ComplexF64, P, S; slave_fermion) end function e_minplus(T, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector}; - slave_fermion::Bool=false, sigma::Bool=false) - return copy(adjoint(e_plusmin(T, particle_symmetry, spin_symmetry; slave_fermion, - sigma))) + slave_fermion::Bool=false) + return copy(adjoint(e_plusmin(T, particle_symmetry, spin_symmetry; slave_fermion))) end const e⁻e⁺ = e_minplus diff --git a/test/tjoperators.jl b/test/tjoperators.jl index 8c3f862..9265a69 100644 --- a/test/tjoperators.jl +++ b/test/tjoperators.jl @@ -9,7 +9,6 @@ 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) From fee5997e479cacbc499a1979c8e7259abd11d26a Mon Sep 17 00:00:00 2001 From: Yue Zhengyuan Date: Thu, 6 Mar 2025 11:13:36 +0800 Subject: [PATCH 3/3] Export sigmatj_model --- src/MPSKitModels.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MPSKitModels.jl b/src/MPSKitModels.jl index e8b05f3..db84799 100644 --- a/src/MPSKitModels.jl +++ b/src/MPSKitModels.jl @@ -43,7 +43,7 @@ export quantum_potts export heisenberg_XXX, heisenberg_XXZ, heisenberg_XYZ export bilinear_biquadratic_model export hubbard_model, bose_hubbard_model -export tj_model +export tj_model, sigmatj_model export quantum_chemistry_hamiltonian export classical_ising