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} <: AbstractOrbital
Label 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)
Kd
AtomicLevels.RelativisticOrbital
— Typestruct RelativisticOrbital{N <: AtomicLevels.MQ} <: AbstractOrbital
Label 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 RelativisticOrbital
s, 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.ℓ
4
Constructors
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 AbstractOrbital
Abstract 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} <: AbstractOrbital
Spin 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 -> Orbital
A string macro to construct an Orbital
from the canonical string representation.
julia> o"1s"
1s
julia> o"Fd"
Fd
AtomicLevels.@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 -> RelativisticOrbital
A 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 Orbital
s.
Examples
julia> os"5[d] 6[s-p] k[7-10]"
7-element Vector{Orbital}:
5d
6s
6p
kk
kl
km
kn
AtomicLevels.@sos_str
— Macro@sos_str -> Vector{<:SpinOrbital{<:Orbital}}
Can be used to easily construct a list of SpinOrbital
s.
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 RelativisticOrbital
s.
Examples
julia> ros"2[s-p] 3[p] k[0-d]"
10-element Vector{RelativisticOrbital}:
2s
2p-
2p
3p-
3p
ks
kp-
kp
kd-
kd
AtomicLevels.@rsos_str
— Macro@rsos_str -> Vector{<:SpinOrbital{<:RelativisticOrbital}}
Can be used to easily construct a list of SpinOrbital
s.
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"
false
AtomicLevels.degeneracy
— Functiondegeneracy(orbital::Orbital)
Returns the degeneracy of orbital
which is 2(2ℓ+1)
Examples
julia> degeneracy(o"1s")
2
julia> degeneracy(o"2p")
6
AtomicLevels.parity
— Methodparity(orbital::Orbital)
Returns the parity of orbital
, defined as (-1)^ℓ
.
Examples
julia> parity(o"1s")
even
julia> parity(o"2p")
odd
AtomicLevels.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")
false
AtomicLevels.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-")
2p
Index
AtomicLevels.AbstractOrbital
AtomicLevels.Orbital
AtomicLevels.RelativisticOrbital
AtomicLevels.SpinOrbital
AtomicLevels.angular_momenta
AtomicLevels.angular_momentum_ranges
AtomicLevels.degeneracy
AtomicLevels.isbound
AtomicLevels.nonrelorbital
AtomicLevels.parity
AtomicLevels.spin_orbitals
AtomicLevels.symmetry
Base.isless
AtomicLevels.@o_str
AtomicLevels.@os_str
AtomicLevels.@ro_str
AtomicLevels.@ros_str
AtomicLevels.@rso_str
AtomicLevels.@rsos_str
AtomicLevels.@so_str
AtomicLevels.@sos_str