@@ -12,6 +12,7 @@ using GradedArrays:
1212 SU2,
1313 SectorRange,
1414 SymmetryStyle,
15+ TrivialSector,
1516 dual,
1617 istrivial,
1718 quantum_dimension,
@@ -21,6 +22,7 @@ using GradedArrays:
2122 zero_odd
2223using TensorAlgebra: contract
2324using TensorProducts: ⊗
25+ import TensorKitSectors as TKS
2426
2527function symbol_1j (s:: SectorRange )
2628 cgt = clebsch_gordan_tensor (s, dual (s), trivial (s), 1 )
@@ -47,92 +49,19 @@ function clebsch_gordan_tensor(
4749 return cgt
4850end
4951
50- function clebsch_gordan_tensor (s1:: S , s2:: S , s3:: S , outer_mult_index:: Int ) where {S}
51- return clebsch_gordan_tensor (SymmetryStyle (S), s1, s2, s3, outer_mult_index)
52- end
53-
54- function clebsch_gordan_tensor (
55- :: AbelianStyle , s1:: S , s2:: S , s3:: S , outer_mult_index:: Int
56- ) where {S}
57- @assert outer_mult_index == 1
58- return s1 ⊗ s2 == s3 ? ones ((1 , 1 , 1 )) : zeros ((1 , 1 , 1 ))
59- end
60-
61- function clebsch_gordan_tensor (:: NotAbelianStyle , s1:: O2 , s2:: O2 , s3:: O2 , :: Int )
62- return clebsch_gordan_tensor (s1, s2, s3) # no outer multiplicity
63- end
64-
65- function clebsch_gordan_tensor (s1:: O2 , s2:: O2 , s3:: O2 )
66- d1 = quantum_dimension (s1)
67- d2 = quantum_dimension (s2)
68- d3 = quantum_dimension (s3)
69- cgt = zeros ((d1, d2, d3))
70- s3 ∉ sectors (s1 ⊗ s2) && return cgt
71-
72- # adapted from TensorKit
73- l1 = sector_label (s1)
74- l2 = sector_label (s2)
75- l3 = sector_label (s3)
76- if l3 <= 0 # 0even or 0odd
77- if l1 <= 0 && l2 <= 0
78- cgt[1 , 1 , 1 , 1 ] = 1.0
79- else
80- if istrivial (s3)
81- cgt[1 , 2 , 1 , 1 ] = 1.0 / sqrt (2 )
82- cgt[2 , 1 , 1 , 1 ] = 1.0 / sqrt (2 )
83- else
84- cgt[1 , 2 , 1 , 1 ] = 1.0 / sqrt (2 )
85- cgt[2 , 1 , 1 , 1 ] = - 1.0 / sqrt (2 )
86- end
87- end
88- elseif l1 <= 0 # 0even or 0odd
89- cgt[1 , 1 , 1 , 1 ] = 1.0
90- cgt[1 , 2 , 2 , 1 ] = s1 == zero_odd (O2) ? - 1.0 : 1.0
91- elseif l2 == 0
92- cgt[1 , 1 , 1 , 1 ] = 1.0
93- cgt[2 , 1 , 2 , 1 ] = s2 == zero_odd (O2) ? - 1.0 : 1.0
94- elseif l3 == l1 + l2
95- cgt[1 , 1 , 1 , 1 ] = 1.0
96- cgt[2 , 2 , 2 , 1 ] = 1.0
97- elseif l3 == l1 - l2
98- cgt[1 , 2 , 1 , 1 ] = 1.0
99- cgt[2 , 1 , 2 , 1 ] = 1.0
100- elseif l3 == l2 - l1
101- cgt[2 , 1 , 1 , 1 ] = 1.0
102- cgt[1 , 2 , 2 , 1 ] = 1.0
52+ function clebsch_gordan_tensor (s1:: S , s2:: S , s3:: S , outer_mult_index:: Int = 1 ) where {S}
53+ CGC = TKS. fusiontensor (GradedArrays. label .((s1, s2, s3))... )
54+ outer_mult_index ∈ axes (CGC, 4 ) || throw (ArgumentError (" invalid outer multiplicity index" ))
55+ if TKS. FusionStyle (S) === TKS. GenericFusion ()
56+ # TODO : do we want a view here?
57+ return CGC[:, :, :, outer_mult_index]
58+ else
59+ return dropdims (CGC; dims = 4 )
10360 end
104- return cgt
105- end
106-
107- function clebsch_gordan_tensor (:: NotAbelianStyle , s1:: SU2 , s2:: SU2 , s3:: SU2 , :: Int )
108- return clebsch_gordan_tensor (s1, s2, s3) # no outer multiplicity
10961end
11062
111- function clebsch_gordan_tensor (s1:: SU2 , s2:: SU2 , s3:: SU2 )
112- d1 = quantum_dimension (s1)
113- d2 = quantum_dimension (s2)
114- d3 = quantum_dimension (s3)
115- j1 = half (d1 - 1 )
116- j2 = half (d2 - 1 )
117- j3 = half (d3 - 1 )
118- cgtensor = Array {Float64, 3} (undef, (d1, d2, d3))
119- for (i, j, k) in Iterators. product (1 : d1, 1 : d2, 1 : d3)
120- m1 = j1 - i + 1
121- m2 = j2 - j + 1
122- m3 = j3 - k + 1
123- cgtensor[i, j, k] = clebschgordan (j1, m1, j2, m2, j3, m3)
124- end
125- return cgtensor
63+ # TODO : remove once TensorKitSectors fixes this
64+ function clebsch_gordan_tensor (s1:: TrivialSector , s2:: TrivialSector , s3:: TrivialSector , outer_mult_index:: Int = 1 )
65+ outer_mult_index == 1 || throw (ArgumentError (" invalid outer multiplicity index" ))
66+ return fill (1 , (1 , 1 , 1 ))
12667end
127-
128- # # TODO : Implement and move to `FusionTensorsSUNRepresentationsExt`.
129- # # function clebsch_gordan_tensor(
130- # # ::NotAbelianStyle, s1::SU{3}, s2::SU{3}, s3::SU{3}, outer_mult_index::Int
131- # # )
132- # # d1 = quantum_dimension(s1)
133- # # d2 = quantum_dimension(s2)
134- # # d3 = quantum_dimension(s3)
135- # # cgtensor = zeros(d1, d2, d3)
136- # # # dummy
137- # # return cgtensor
138- # # end
0 commit comments