SphericalHarmonicModes.jl
SphericalHarmonicModes.FullRange — TypeFullRange(l::Int)The range -l:l for an l ≥ 0.
SphericalHarmonicModes.L1L2Triangle — TypeL1L2Triangle(l1_min::Int, l1_max::Int, Δl_max::Int, l2_min::Int = max(0, l1_min - Δl_max), l2_max = l1_max + Δl_max)
L1L2Triangle(l1_range::AbstractUnitRange{Int}, Δl_max::Int, l2_range::AbstractUnitRange{Int})Return an iterator that loops over pairs of (l1,l2) where l1 lies in l1_range, l2 lies in l2_range, and l2 and l1 obey the triangle condition max(0, l1 - Δl_max) ⩽ l2 ⩽ l1 + Δl_max. If l2_range is not specified, it defaults to the maximal range permissible.
The ranges l1_range and l2_range will be curtailed to the minimal permissible subsets.
Examples
julia> L1L2Triangle(1:2, 2) |> collect
9-element Vector{Tuple{Int64, Int64}}:
(1, 0)
(1, 1)
(1, 2)
(1, 3)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
julia> L1L2Triangle(2:3, 1) |> collect
6-element Vector{Tuple{Int64, Int64}}:
(2, 1)
(2, 2)
(2, 3)
(3, 2)
(3, 3)
(3, 4)
julia> L1L2Triangle(2:3, 1, 2:3) |> collect
4-element Vector{Tuple{Int64, Int64}}:
(2, 2)
(2, 3)
(3, 2)
(3, 3)SphericalHarmonicModes.L2L1Triangle — TypeL2L1Triangle(l1_min::Int, l1_max::Int, Δl_max::Int, l2_min::Int = max(0, l1_min - Δl_max), l2_max = l1_max + Δl_max)
L2L1Triangle(l1_range::AbstractUnitRange{Int}, Δl_max::Int, l2_range::AbstractUnitRange{Int})Return an iterator that loops over pairs of (l2,l1) where l1 lies in l1_range, l2 lies in l2_range, and l2 and l1 obey the triangle condition max(0, l1 - Δl_max) ⩽ l2 ⩽ l1 + Δl_max. If l2_range is not specified, it defaults to the maximal range permissible.
The ranges l1_range and l2_range will be curtailed to the minimal permissible subsets.
Examples
julia> L2L1Triangle(1:2, 2) |> collect
9-element Vector{Tuple{Int64, Int64}}:
(0, 1)
(1, 1)
(2, 1)
(3, 1)
(0, 2)
(1, 2)
(2, 2)
(3, 2)
(4, 2)
julia> L2L1Triangle(2:3, 1) |> collect
6-element Vector{Tuple{Int64, Int64}}:
(1, 2)
(2, 2)
(3, 2)
(2, 3)
(3, 3)
(4, 3)
julia> L2L1Triangle(2:3, 1, 2:3) |> collect
4-element Vector{Tuple{Int64, Int64}}:
(2, 2)
(3, 2)
(2, 3)
(3, 3)SphericalHarmonicModes.LM — TypeLM(l_range::Union{Integer, AbstractUnitRange{<:Integer}}, m_range::Union{Integer, AbstractUnitRange{<:Integer}})
LM(l_range::Union{Integer, AbstractUnitRange{<:Integer}}, [T = FullRange]) where T<:Union{FullRange, ZeroTo, ToZero}Return an iterator that loops over pairs of spherical harmonic modes (l,m), with l increasing faster than m. The loop runs over all the valid modes that may be obtained from the ranges provided. If m_range is not specified, the loop runs over all valid values of m for each l. Neither l_range nor m_range may be empty.
Optionally m_range may be provided implicitly using the range specifiers FullRange, ZeroTo and ToZero, or as a SingleValuedRange type. Additionally, l_range may be of type ZeroTo or SingleValuedRange. Iterators constructed using these special types would often permit optimizations.
An overlarge l_range will be curtailed to match the valid range compatible with m_range. A smaller l_range than that compatible with m_range will raise an error.
Examples
julia> LM(0:1) |> collect
4-element Vector{Tuple{Int64, Int64}}:
(1, -1)
(0, 0)
(1, 0)
(1, 1)
julia> LM(0:1, 1:1) |> collect
1-element Vector{Tuple{Int64, Int64}}:
(1, 1)
julia> r = LM(ZeroTo(1), FullRange);
julia> r |> collect
4-element Vector{Tuple{Int64, Int64}}:
(1, -1)
(0, 0)
(1, 0)
(1, 1)See also: ML
SphericalHarmonicModes.ML — TypeML(l_range::Union{Integer, AbstractUnitRange{<:Integer}}, m_range::Union{Integer, AbstractUnitRange{<:Integer}})
ML(l_range::Union{Integer, AbstractUnitRange{<:Integer}}, [T = FullRange]) where T<:Union{FullRange, ZeroTo, ToZero}Return an iterator that loops over pairs of spherical harmonic modes (l,m), with m increasing faster than l. The loop runs over all the valid modes that may be obtained from the ranges provided. If m_range is not specified, the loop runs over all valid values of m for each l. Neither l_range nor m_range may be empty.
Optionally m_range may be provided implicitly using the range specifiers FullRange, ZeroTo and ToZero, or as a SingleValuedRange type. Additionally l_range may be of type ZeroTo or SingleValuedRange. Iterators constructed using these special types would often permit optimizations.
An overlarge l_range will be curtailed to match the valid range compatible with m_range. A smaller l_range than that compatible with m_range will raise an error.
Examples
julia> ML(0:1) |> collect
4-element Vector{Tuple{Int64, Int64}}:
(0, 0)
(1, -1)
(1, 0)
(1, 1)
julia> ML(0:1, 1:1) |> collect
1-element Vector{Tuple{Int64, Int64}}:
(1, 1)
julia> r = ML(ZeroTo(1), FullRange);
julia> r |> collect
4-element Vector{Tuple{Int64, Int64}}:
(0, 0)
(1, -1)
(1, 0)
(1, 1)See also: LM
SphericalHarmonicModes.ModeRange — TypeSphericalHarmonicModes.ModeRangeAbstract type whose subtypes are iterators over combinations of spherical harmonic modes. This is the topmost node in the type hierarchy defined in this package.
Direct subtypes of ModeRange are SHModeRange and L2L1Triangle.
SphericalHarmonicModes.SHModeRange — TypeSphericalHarmonicModes.SHModeRange <: SphericalHarmonicModes.ModeRangeAbstract supertype of iterators that loop over (l,m) pairs. The types LM and ML are subtypes of this.
SphericalHarmonicModes.SingleValuedRange — TypeSingleValuedRange(n::Int)The range n:n.
SphericalHarmonicModes.ToZero — TypeToZero(l::Int)The range -l:0 for an l ≥ 0.
SphericalHarmonicModes.ZeroTo — TypeZeroTo(l::Int)The range 0:l for an l ≥ 0.
SphericalHarmonicModes.flip — MethodSphericalHarmonicModes.flip(mr::SphericalHarmonicModes.SHModeRange)Return an iterator that flips the order in which the modes (l,m) are iterated over. flip(::LM) will return an ML iterator and vice versa.
Examples
julia> LM(0:1) |> collect
4-element Vector{Tuple{Int64, Int64}}:
(1, -1)
(0, 0)
(1, 0)
(1, 1)
julia> SphericalHarmonicModes.flip(LM(0:1)) |> collect
4-element Vector{Tuple{Int64, Int64}}:
(0, 0)
(1, -1)
(1, 0)
(1, 1)
julia> SphericalHarmonicModes.flip(LM(0:1)) == ML(0:1)
trueSphericalHarmonicModes.l1_range — Methodl1_range(mr::L2L1Triangle)Return the range of l1 spanned by the iterator.
SphericalHarmonicModes.l2_range — Methodl2_range(mr::L2L1Triangle, l1::Integer)Return a subsection of the range of l2 spanned by the iterator for which (l1,l2) satisfy l1 - mr.Δl_max ⩽ l2 ⩽ l1 + mr.Δl_max.
Examples
julia> r = L2L1Triangle(1:2, 1);
julia> collect(r)
6-element Vector{Tuple{Int64, Int64}}:
(0, 1)
(1, 1)
(2, 1)
(1, 2)
(2, 2)
(3, 2)
julia> l2_range(r, 1)
0:2
julia> l2_range(r, 2)
1:3SphericalHarmonicModes.l2_range — Methodl2_range(mr::L2L1Triangle)Return the range of l2 spanned by the iterator.
SphericalHarmonicModes.l_range — Methodl_range(mr::SphericalHarmonicModes.SHModeRange, m::Integer)Return the subsection of the range of l spanned by the iterator for which (l,m) is a valid spherical harmonic mode.
Examples
julia> r = LM(1:2, 1:2);
julia> collect(r)
3-element Vector{Tuple{Int64, Int64}}:
(1, 1)
(2, 1)
(2, 2)
julia> l_range(r, 1)
1:2
julia> l_range(r, 2)
2:2SphericalHarmonicModes.l_range — Methodl_range(mr::SphericalHarmonicModes.SHModeRange)Return the range of l spanned by the iterator.
SphericalHarmonicModes.m_range — Methodm_range(mr::SphericalHarmonicModes.SHModeRange, l::Integer)Return the subsection of the range of m spanned by the iterator for which (l,m) is a valid spherical harmonic mode.
Examples
julia> r = LM(1:2, 1:2);
julia> collect(r)
3-element Vector{Tuple{Int64, Int64}}:
(1, 1)
(2, 1)
(2, 2)
julia> m_range(r, 1)
1:1
julia> m_range(r, 2)
1:2SphericalHarmonicModes.m_range — Methodm_range(mr::SphericalHarmonicModes.SHModeRange)Return the range of m spanned by the iterator.
SphericalHarmonicModes.modeindex — Methodmodeindex(mr::SphericalHarmonicModes.ModeRange, mode::Tuple)Return the index of mode in the iterator mr. Raise an error if mode is not present in mr.
Examples
julia> r = LM(1:2, 1:2);
julia> collect(r)
3-element Vector{Tuple{Int64, Int64}}:
(1, 1)
(2, 1)
(2, 2)
julia> modeindex(r, (2,1))
2
julia> modeindex(r, (3,2))
ERROR: Mode with (l=3,m=2) is not included in the range given by LM(1:2, 1:2)SphericalHarmonicModes.ofordering — MethodSphericalHarmonicModes.ofordering(S, m)Convert m to the ordering of S.
Examples
julia> SphericalHarmonicModes.ofordering(LM(0:1), ML(0:1)) |> collect
4-element Vector{Tuple{Int64, Int64}}:
(1, -1)
(0, 0)
(1, 0)
(1, 1)
julia> SphericalHarmonicModes.ofordering(ML(0:1), ML(0:1)) |> collect
4-element Vector{Tuple{Int64, Int64}}:
(0, 0)
(1, -1)
(1, 0)
(1, 1)