Skip to content

Commit 11f3ef2

Browse files
Add all pair creation and annihilations operators for tJ/Hubbard (#21)
* Add all pair creation and annihilations operators for tJ/Hubbard * Add `singlet_plus` and redefine `singlet_min` as its adjoint --------- Co-authored-by: Sander De Meyer <[email protected]> Co-authored-by: sanderdemeyer <[email protected]>
1 parent 8a2a7ff commit 11f3ef2

File tree

4 files changed

+417
-29
lines changed

4 files changed

+417
-29
lines changed

src/hubbardoperators.jl

Lines changed: 171 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,20 @@ export S_x, S_y, S_z, S_plus, S_min
88
export u_plus_u_min, d_plus_d_min
99
export u_min_u_plus, d_min_d_plus
1010
export u_min_d_min, d_min_u_min
11-
export e_plus_e_min, e_min_e_plus, singlet_min, e_hopping
11+
export u_plus_d_plus, d_plus_u_plus
12+
export u_min_u_min, d_min_d_min
13+
export u_plus_u_plus, d_plus_d_plus
14+
export e_plus_e_min, e_min_e_plus, e_hopping
15+
export singlet_plus, singlet_min
1216
export S_plus_S_min, S_min_S_plus, S_exchange
1317

1418
export n, nꜛ, nꜜ, nꜛꜜ
1519
export Sˣ, Sʸ, Sᶻ, S⁺, S⁻
16-
export u⁺u⁻, d⁺d⁻, u⁻u⁺, d⁻d⁺, u⁻d⁻, d⁻u⁻
17-
export e⁺e⁻, e⁻e⁺, singlet⁻, e_hop
20+
export u⁺u⁻, d⁺d⁻, u⁻u⁺, d⁻d⁺
21+
export u⁻d⁻, d⁻u⁻, u⁺d⁺, d⁺u⁺
22+
export u⁻u⁻, u⁺u⁺, d⁻d⁻, d⁺d⁺
23+
export e⁺e⁻, e⁻e⁺, e_hop
24+
export singlet⁺, singlet⁻
1825
export S⁻S⁺, S⁺S⁻
1926

2027
"""
@@ -590,6 +597,21 @@ function u_min_d_min(elt::Type{<:Number}, ::Type{U1Irrep}, ::Type{SU2Irrep})
590597
end
591598
const u⁻d⁻ = u_min_d_min
592599

600+
@doc """
601+
u_plus_d_plus(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
602+
u⁺d⁺(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
603+
604+
Return the two-body operator ``e†_{1,↑} e†_{2,↓}`` that annihilates a spin-up particle at the first site and a spin-down particle at the second site.
605+
""" u_plus_d_plus
606+
function u_plus_d_plus(P::Type{<:Sector}, S::Type{<:Sector})
607+
return u_plus_d_plus(ComplexF64, P, S)
608+
end
609+
function u_plus_d_plus(elt::Type{<:Number}, particle_symmetry::Type{<:Sector},
610+
spin_symmetry::Type{<:Sector})
611+
return -copy(adjoint(u_min_d_min(elt, particle_symmetry, spin_symmetry)))
612+
end
613+
const u⁺d⁺ = u_plus_d_plus
614+
593615
@doc """
594616
d_min_u_min(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
595617
d⁻u⁻(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
@@ -633,19 +655,162 @@ function d_min_u_min(elt::Type{<:Number}, ::Type{U1Irrep}, ::Type{SU2Irrep})
633655
end
634656
const d⁻u⁻ = d_min_u_min
635657

658+
@doc """
659+
d_plus_u_plus(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
660+
d⁺u⁺(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
661+
662+
Return the two-body operator ``e†_{1,↓} e†_{2,↑}`` that creates a spin-down particle at the first site and a spin-up particle at the second site.
663+
""" d_plus_u_plus
664+
function d_plus_u_plus(P::Type{<:Sector}, S::Type{<:Sector})
665+
return d_plus_u_plus(ComplexF64, P, S)
666+
end
667+
function d_plus_u_plus(elt::Type{<:Number}, particle_symmetry::Type{<:Sector},
668+
spin_symmetry::Type{<:Sector})
669+
return -copy(adjoint(d_min_u_min(elt, particle_symmetry, spin_symmetry)))
670+
end
671+
const d⁺u⁺ = d_plus_u_plus
672+
673+
@doc """
674+
u_min_u_min(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
675+
u⁻u⁻(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
676+
677+
Return the two-body operator ``e_{1,↑} e_{2,↑}`` that annihilates a spin-up particle at both sites.
678+
The nonzero matrix elements are
679+
```
680+
-|0,0⟩ ↤ |↑,↑⟩, -|0,↓⟩ ↤ |↑,↑↓⟩
681+
+|↓,0⟩ ↤ |↑↓,↑⟩, +|↓,↓⟩ ↤ |↑↓,↑↓⟩
682+
```
683+
""" u_min_u_min
684+
function u_min_u_min(P::Type{<:Sector}, S::Type{<:Sector})
685+
return u_min_u_min(ComplexF64, P, S)
686+
end
687+
function u_min_u_min(elt::Type{<:Number}, ::Type{Trivial}, ::Type{Trivial})
688+
t = two_site_operator(elt, Trivial, Trivial)
689+
I = sectortype(t)
690+
t[(I(0), I(0), dual(I(1)), dual(I(1)))][1, 1, 1, 1] = -1
691+
t[(I(0), I(1), dual(I(1)), dual(I(0)))][1, 2, 1, 2] = -1
692+
t[(I(1), I(0), dual(I(0)), dual(I(1)))][2, 1, 2, 1] = 1
693+
t[(I(1), I(1), dual(I(0)), dual(I(0)))][2, 2, 2, 2] = 1
694+
return t
695+
end
696+
function u_min_u_min(elt::Type{<:Number}, ::Type{U1Irrep}, ::Type{<:Sector})
697+
throw(ArgumentError("`u_min_u_min` is not symmetric under `U1Irrep` particle symmetry"))
698+
end
699+
function u_min_u_min(elt::Type{<:Number}, ::Type{<:Sector}, ::Type{U1Irrep})
700+
throw(ArgumentError("`u_min_u_min` is not symmetric under `U1Irrep` spin symmetry"))
701+
end
702+
function u_min_u_min(elt::Type{<:Number}, ::Type{<:Sector}, ::Type{SU2Irrep})
703+
throw(ArgumentError("`u_min_u_min` is not symmetric under `SU2Irrep` spin symmetry"))
704+
end
705+
function u_min_u_min(elt::Type{<:Number}, ::Type{U1Irrep}, ::Type{U1Irrep})
706+
throw(ArgumentError("`u_min_u_min` is not symmetric under `U1Irrep` particle symmetry or under `U1Irrep` particle symmetry"))
707+
end
708+
function u_min_u_min(elt::Type{<:Number}, ::Type{U1Irrep}, ::Type{SU2Irrep})
709+
throw(ArgumentError("`u_min_u_min` is not symmetric under `U1Irrep` particle symmetry or under `SU2Irrep` particle symmetry"))
710+
end
711+
const u⁻u⁻ = u_min_u_min
712+
713+
@doc """
714+
u_plus_u_plus(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
715+
u⁺u⁺(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
716+
717+
Return the two-body operator ``e†_{1,↑} e†_{2,↑}`` that creates a spin-up particle at both sites.
718+
""" u_plus_u_plus
719+
function u_plus_u_plus(P::Type{<:Sector}, S::Type{<:Sector})
720+
return u_plus_u_plus(ComplexF64, P, S)
721+
end
722+
function u_plus_u_plus(elt::Type{<:Number}, particle_symmetry::Type{<:Sector},
723+
spin_symmetry::Type{<:Sector})
724+
return -copy(adjoint(u_min_u_min(elt, particle_symmetry, spin_symmetry)))
725+
end
726+
const u⁺u⁺ = u_plus_u_plus
727+
728+
@doc """
729+
d_min_d_min(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
730+
d⁻d⁻(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
731+
732+
Return the two-body operator ``e_{1,↓} e_{2,↓}`` that annihilates a spin-down particle at both sites.
733+
The nonzero matrix elements are
734+
```
735+
-|0,0⟩ ↤ |↓,↓⟩, +|0,↑⟩ ↤ |↓,↑↓⟩
736+
-|↑,0⟩ ↤ |↑↓,↓⟩, +|↑,↑⟩ ↤ |↑↓,↑↓⟩
737+
```
738+
""" d_min_d_min
739+
function d_min_d_min(P::Type{<:Sector}, S::Type{<:Sector})
740+
return d_min_d_min(ComplexF64, P, S)
741+
end
742+
function d_min_d_min(elt::Type{<:Number}, ::Type{Trivial}, ::Type{Trivial})
743+
t = two_site_operator(elt, Trivial, Trivial)
744+
I = sectortype(t)
745+
t[(I(0), I(0), dual(I(1)), dual(I(1)))][1, 1, 2, 2] = -1
746+
t[(I(0), I(1), dual(I(1)), dual(I(0)))][1, 1, 2, 2] = 1
747+
t[(I(1), I(0), dual(I(0)), dual(I(1)))][1, 1, 2, 2] = -1
748+
t[(I(1), I(1), dual(I(0)), dual(I(0)))][1, 1, 2, 2] = 1
749+
return t
750+
end
751+
function d_min_d_min(elt::Type{<:Number}, ::Type{U1Irrep}, ::Type{<:Sector})
752+
throw(ArgumentError("`d_min_d_min` is not symmetric under `U1Irrep` particle symmetry"))
753+
end
754+
function d_min_d_min(elt::Type{<:Number}, ::Type{<:Sector}, ::Type{U1Irrep})
755+
throw(ArgumentError("`d_min_d_min` is not symmetric under `U1Irrep` spin symmetry"))
756+
end
757+
function d_min_d_min(elt::Type{<:Number}, ::Type{<:Sector}, ::Type{SU2Irrep})
758+
throw(ArgumentError("`d_min_d_min` is not symmetric under `SU2Irrep` spin symmetry"))
759+
end
760+
function d_min_d_min(elt::Type{<:Number}, ::Type{U1Irrep}, ::Type{U1Irrep})
761+
throw(ArgumentError("`d_min_d_min` is not symmetric under `U1Irrep` particle symmetry or under `U1Irrep` particle symmetry"))
762+
end
763+
function d_min_d_min(elt::Type{<:Number}, ::Type{U1Irrep}, ::Type{SU2Irrep})
764+
throw(ArgumentError("`d_min_d_min` is not symmetric under `U1Irrep` particle symmetry or under `SU2Irrep` particle symmetry"))
765+
end
766+
const d⁻d⁻ = d_min_d_min
767+
768+
@doc """
769+
d_plus_d_plus(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
770+
d⁺d⁺(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
771+
772+
Return the two-body operator ``e†_{1,↓} e†_{2,↓}`` that creates a spin-down particle at both sites.
773+
The nonzero matrix elements are
774+
""" d_plus_d_plus
775+
function d_plus_d_plus(P::Type{<:Sector}, S::Type{<:Sector})
776+
return d_plus_d_plus(ComplexF64, P, S)
777+
end
778+
function d_plus_d_plus(elt::Type{<:Number}, particle_symmetry::Type{<:Sector},
779+
spin_symmetry::Type{<:Sector})
780+
return -copy(adjoint(d_min_d_min(elt, particle_symmetry, spin_symmetry)))
781+
end
782+
const d⁺d⁺ = d_plus_d_plus
783+
784+
@doc """
785+
singlet_plus(elt, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
786+
singlet⁺(elt, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
787+
788+
Return the two-body singlet operator ``(e^†_{1,↑} e^†_{2,↓} - e^†_{1,↓} e^†_{2,↑}) / sqrt(2)``,
789+
which creates the singlet state when acting on vaccum.
790+
""" singlet_plus
791+
function singlet_plus(P::Type{<:Sector}, S::Type{<:Sector})
792+
return singlet_plus(ComplexF64, P, S)
793+
end
794+
function singlet_plus(elt::Type{<:Number}, particle_symmetry::Type{<:Sector},
795+
spin_symmetry::Type{<:Sector})
796+
return (u_plus_d_plus(elt, particle_symmetry, spin_symmetry) -
797+
d_plus_u_plus(elt, particle_symmetry, spin_symmetry)) / sqrt(2)
798+
end
799+
const singlet⁺ = singlet_plus
800+
636801
@doc """
637802
singlet_min(elt, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
638803
singlet⁻(elt, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
639804
640-
Return the two-body singlet operator ``(e_{1,↓} e_{2,↑} - e_{1,↓} e_{2,↑}) / sqrt(2)``.
805+
Return the adjoint of `singlet_plus` operator, which is
806+
``(-e_{1,↑} e_{2,↓} + e_{1,↓} e_{2,↑}) / sqrt(2)``
641807
""" singlet_min
642808
function singlet_min(P::Type{<:Sector}, S::Type{<:Sector})
643809
return singlet_min(ComplexF64, P, S)
644810
end
645811
function singlet_min(elt::Type{<:Number}, particle_symmetry::Type{<:Sector},
646812
spin_symmetry::Type{<:Sector})
647-
return (u_min_d_min(elt, particle_symmetry, spin_symmetry) -
648-
d_min_u_min(elt, particle_symmetry, spin_symmetry)) / sqrt(2)
813+
return copy(adjoint(singlet_plus(elt, particle_symmetry, spin_symmetry)))
649814
end
650815
const singlet⁻ = singlet_min
651816

0 commit comments

Comments
 (0)