# 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.OrbitalType
struct 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
source
AtomicLevels.RelativisticOrbitalType
struct 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 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.ℓ
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-
source
AtomicLevels.AbstractOrbitalType
abstract type AbstractOrbital

Abstract supertype of all orbital types.

When broadcasting, orbital objects behave like scalars.

source

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.SpinOrbitalType
struct SpinOrbital{O<:Orbital} <: AbstractOrbital

Spin orbitals are fully characterized orbitals, i.e. the projections of all angular momenta are specified.

source

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_strMacro
@o_str -> Orbital

A string macro to construct an Orbital from the canonical string representation.

julia> o"1s"
1s

julia> o"Fd"
Fd
source
AtomicLevels.@so_strMacro
@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₁β
source
AtomicLevels.@rso_strMacro
@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)
source
AtomicLevels.@os_strMacro
@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
kn
source
AtomicLevels.@sos_strMacro
@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₁β
source
AtomicLevels.@ros_strMacro
@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-
kd
source
AtomicLevels.@rsos_strMacro
@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)
source

## Methods

Base.islessFunction
isless(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
source
AtomicLevels.degeneracyFunction
degeneracy(orbital::Orbital)

Returns the degeneracy of orbital which is 2(2ℓ+1)

Examples

julia> degeneracy(o"1s")
2

julia> degeneracy(o"2p")
6
source
AtomicLevels.parityMethod
parity(orbital::Orbital)

Returns the parity of orbital, defined as (-1)^ℓ.

Examples

julia> parity(o"1s")
even

julia> parity(o"2p")
odd
source
AtomicLevels.isboundFunction
isbound(::Orbital)

Returns true is the main quantum number is an integer, false otherwise.

julia> isbound(o"1s")
true

julia> isbound(o"ks")
false
source
AtomicLevels.angular_momentaFunction
angular_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)
source
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,)
source
AtomicLevels.angular_momentum_rangesFunction
angular_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)
source
AtomicLevels.spin_orbitalsFunction
spin_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)
source
AtomicLevels.nonrelorbitalFunction
nonrelorbital(o)

Return the non-relativistic orbital corresponding to o.

Examples

julia> nonrelorbital(o"2p")
2p

julia> nonrelorbital(ro"2p-")
2p
source