Atomic orbitals
Atomic orbitals, i.e. single particle states with well-defined orbital or total angular momentum, are usually the basic building blocks of atomic states. AtomicLevels provides various types and methods to conveniently label the orbitals.
Orbital types
AtomicLevels provides two basic types for labelling atomic orbitals: Orbital and RelativisticOrbital. Stricly speaking, these types do not label orbitals, but groups of orbitals with the same angular symmetry and radial behaviour (i.e. a subshell).
All orbitals are subtypes of AbstractOrbital. Types and methods that work on generic orbitals can dispatch on that.
AtomicLevels.Orbital — Typestruct Orbital{N <: AtomicLevels.MQ} <: AbstractOrbitalLabel for an atomic orbital with a principal quantum number n::N and orbital angular momentum ℓ.
The type parameter N has to be such that it can represent a proper principal quantum number (i.e. a subtype of AtomicLevels.MQ).
Properties
The following properties are part of the public API:
.n :: N– principal quantum number $n$.ℓ :: Int– the orbital angular momentum $\ell$
Constructors
Orbital(n::Int, ℓ::Int)
Orbital(n::Symbol, ℓ::Int)Construct an orbital label with principal quantum number n and orbital angular momentum ℓ. If the principal quantum number n is an integer, it has to positive and the angular momentum must satisfy 0 <= ℓ < n.
julia> Orbital(1, 0)
1s
julia> Orbital(:K, 2)
KdAtomicLevels.RelativisticOrbital — Typestruct RelativisticOrbital{N <: AtomicLevels.MQ} <: AbstractOrbitalLabel for an atomic orbital with a principal quantum number n::N and well-defined total angular momentum $j$. The angular component of the orbital is labelled by the $(\ell, j)$ pair, conventionally written as $\ell_j$ (e.g. $p_{3/2}$).
The $\ell$ and $j$ can not be arbitrary, but must satisfy $j = \ell \pm 1/2$. Internally, the $\kappa$ quantum number, which is a unique integer corresponding to every physical $(\ell, j)$ pair, is used to label each allowed pair. When $j = \ell \pm 1/2$, the corresponding $\kappa = \mp(j + 1/2)$.
When printing and parsing RelativisticOrbitals, the notation nℓ and nℓ- is used (e.g. 2p and 2p-), corresponding to the orbitals with $j = \ell + 1/2$ and $j = \ell - 1/2$, respectively.
The type parameter N has to be such that it can represent a proper principal quantum number (i.e. a subtype of AtomicLevels.MQ).
Properties
The following properties are part of the public API:
.n :: N– principal quantum number $n$.κ :: Int– $\kappa$ quantum number.ℓ :: Int– the orbital angular momentum label $\ell$.j :: HalfInteger– total angular momentum $j$
julia> orb = ro"5g-"
5g-
julia> orb.n
5
julia> orb.j
7/2
julia> orb.ℓ
4Constructors
RelativisticOrbital(n::Integer, κ::Integer)
RelativisticOrbital(n::Symbol, κ::Integer)
RelativisticOrbital(n, ℓ::Integer, j::Real)Construct an orbital label with the quantum numbers n and κ. If the principal quantum number n is an integer, it has to positive and the orbital angular momentum must satisfy 0 <= ℓ < n. Instead of κ, valid ℓ and j values can also be specified instead.
julia> RelativisticOrbital(1, 0, 1//2)
1s
julia> RelativisticOrbital(2, -1)
2s
julia> RelativisticOrbital(:K, 2, 3//2)
Kd-AtomicLevels.AbstractOrbital — Typeabstract type AbstractOrbitalAbstract supertype of all orbital types.
When broadcasting, orbital objects behave like scalars.
The SpinOrbital type can be used to fully qualify all the quantum numbers (that is, also $m_\ell$ and $m_s$) of an Orbital. It represent a since, distinct orbital.
AtomicLevels.SpinOrbital — Typestruct SpinOrbital{O<:Orbital} <: AbstractOrbitalSpin orbitals are fully characterized orbitals, i.e. the projections of all angular momenta are specified.
The string macros @o_str and @ro_str can be used to conveniently construct orbitals, while @os_str, @sos_str, @ros_str, and @rsos_str can be used to construct whole lists of them very easily.
AtomicLevels.@o_str — Macro@o_str -> OrbitalA string macro to construct an Orbital from the canonical string representation.
julia> o"1s"
1s
julia> o"Fd"
FdAtomicLevels.@so_str — Macro@so_str -> SpinOrbital{<:Orbital}String macro to quickly construct a non-relativistic spin-orbital; it is similar to @o_str, with the added specification of the magnetic quantum numbers $m_ℓ$ and $m_s$.
Examples
julia> so"1s(0,α)"
1s₀α
julia> so"kd(2,β)"
kd₂β
julia> so"2p(1,0.5)"
2p₁α
julia> so"2p(1,-1/2)"
2p₁βAtomicLevels.@ro_str — Macro@ro_str -> RelativisticOrbitalA string macro to construct an RelativisticOrbital from the canonical string representation.
julia> ro"1s"
1s
julia> ro"2p-"
2p-
julia> ro"Kf-"
Kf-AtomicLevels.@rso_str — Macro@rso_str -> SpinOrbital{<:RelativisticOrbital}String macro to quickly construct a relativistic spin-orbital; it is similar to @o_str, with the added specification of the magnetic quantum number $m_j$.
Examples
julia> rso"2p-(1/2)"
2p-(1/2)
julia> rso"2p(-3/2)"
2p(-3/2)
julia> rso"3d(2.5)"
3d(5/2)AtomicLevels.@os_str — Macro@os_str -> Vector{Orbital}Can be used to easily construct a list of Orbitals.
Examples
julia> os"5[d] 6[s-p] k[7-10]"
7-element Vector{Orbital}:
5d
6s
6p
kk
kl
km
knAtomicLevels.@sos_str — Macro@sos_str -> Vector{<:SpinOrbital{<:Orbital}}Can be used to easily construct a list of SpinOrbitals.
Examples
julia> sos"3[s-p]"
8-element Vector{SpinOrbital{Orbital{Int64}, Tuple{Int64, HalfIntegers.Half{Int64}}}}:
3s₀α
3s₀β
3p₋₁α
3p₋₁β
3p₀α
3p₀β
3p₁α
3p₁βAtomicLevels.@ros_str — Macro@ros_str -> Vector{RelativisticOrbital}Can be used to easily construct a list of RelativisticOrbitals.
Examples
julia> ros"2[s-p] 3[p] k[0-d]"
10-element Vector{RelativisticOrbital}:
2s
2p-
2p
3p-
3p
ks
kp-
kp
kd-
kdAtomicLevels.@rsos_str — Macro@rsos_str -> Vector{<:SpinOrbital{<:RelativisticOrbital}}Can be used to easily construct a list of SpinOrbitals.
Examples
julia> rsos"3[s-p]"
8-element Vector{SpinOrbital{RelativisticOrbital{Int64}, Tuple{HalfIntegers.Half{Int64}}}}:
3s(-1/2)
3s(1/2)
3p-(-1/2)
3p-(1/2)
3p(-3/2)
3p(-1/2)
3p(1/2)
3p(3/2)Methods
Base.isless — Functionisless(a::Orbital, b::Orbital)Compares the orbitals a and b to decide which one comes before the other in a configuration.
Examples
julia> o"1s" < o"2s"
true
julia> o"1s" < o"2p"
true
julia> o"ks" < o"2p"
falseAtomicLevels.degeneracy — Functiondegeneracy(orbital::Orbital)Returns the degeneracy of orbital which is 2(2ℓ+1)
Examples
julia> degeneracy(o"1s")
2
julia> degeneracy(o"2p")
6AtomicLevels.parity — Methodparity(orbital::Orbital)Returns the parity of orbital, defined as (-1)^ℓ.
Examples
julia> parity(o"1s")
even
julia> parity(o"2p")
oddAtomicLevels.symmetry — Functionsymmetry(orbital::Orbital)Returns the symmetry for orbital which is simply ℓ.
AtomicLevels.isbound — Functionisbound(::Orbital)Returns true is the main quantum number is an integer, false otherwise.
julia> isbound(o"1s")
true
julia> isbound(o"ks")
falseAtomicLevels.angular_momenta — Functionangular_momenta(orbital)Returns the angular momentum quantum numbers of orbital.
Examples
julia> angular_momenta(o"2s")
(0, 1/2)
julia> angular_momenta(o"3d")
(2, 1/2)angular_momenta(orbital)Returns the angular momentum quantum numbers of orbital.
Examples
julia> angular_momenta(ro"2p-")
(1/2,)
julia> angular_momenta(ro"3d")
(5/2,)AtomicLevels.angular_momentum_ranges — Functionangular_momentum_ranges(orbital)Return the valid ranges within which projections of each of the angular momentum quantum numbers of orbital must fall.
Examples
julia> angular_momentum_ranges(o"2s")
(0:0, -1/2:1/2)
julia> angular_momentum_ranges(o"4f")
(-3:3, -1/2:1/2)AtomicLevels.spin_orbitals — Functionspin_orbitals(orbital)Generate all permissible spin-orbitals for a given orbital, e.g. 2p -> 2p ⊗ mℓ = {-1,0,1} ⊗ ms = {α,β}
Examples
julia> spin_orbitals(o"2p")
6-element Vector{SpinOrbital{Orbital{Int64}, Tuple{Int64, HalfIntegers.Half{Int64}}}}:
2p₋₁α
2p₋₁β
2p₀α
2p₀β
2p₁α
2p₁β
julia> spin_orbitals(ro"2p-")
2-element Vector{SpinOrbital{RelativisticOrbital{Int64}, Tuple{HalfIntegers.Half{Int64}}}}:
2p-(-1/2)
2p-(1/2)
julia> spin_orbitals(ro"2p")
4-element Vector{SpinOrbital{RelativisticOrbital{Int64}, Tuple{HalfIntegers.Half{Int64}}}}:
2p(-3/2)
2p(-1/2)
2p(1/2)
2p(3/2)AtomicLevels.nonrelorbital — Functionnonrelorbital(o)Return the non-relativistic orbital corresponding to o.
Examples
julia> nonrelorbital(o"2p")
2p
julia> nonrelorbital(ro"2p-")
2pIndex
AtomicLevels.AbstractOrbitalAtomicLevels.OrbitalAtomicLevels.RelativisticOrbitalAtomicLevels.SpinOrbitalAtomicLevels.angular_momentaAtomicLevels.angular_momentum_rangesAtomicLevels.degeneracyAtomicLevels.isboundAtomicLevels.nonrelorbitalAtomicLevels.parityAtomicLevels.spin_orbitalsAtomicLevels.symmetryBase.islessAtomicLevels.@o_strAtomicLevels.@os_strAtomicLevels.@ro_strAtomicLevels.@ros_strAtomicLevels.@rso_strAtomicLevels.@rsos_strAtomicLevels.@so_strAtomicLevels.@sos_str