Skip to content

Zstar95/AtomicLevels.jl

 
 

Repository files navigation

AtomicLevels

https://travis-ci.org/JuliaAtoms/AtomicLevels.jl.svg?branch=master https://img.shields.io/appveyor/ci/juliaatoms/atomiclevels-jl.svg?logo=appveyor https://codecov.io/gh/JuliaAtoms/AtomicLevels.jl/branch/master/graph/badge.svg

https://img.shields.io/badge/docs-dev-blue.svg

Usage

using AtomicLevels

Electronic configurations

The ground state of hydrogen and helium:

c"1s",(c"1s2",c"[He]")
(1s, (1s², [He]ᶜ))

The ground state configuration of xenon, in relativistic notation:

Xe = rc"[Kr] 5s2 5p6"
[Kr]ᶜ 5s² 5p-² 5p⁴

As we see above, by default, the krypton core is declared “closed”. This is useful for calculations when the core should be frozen. We can “open” it by affixing *:

Xe = c"[Kr]* 5s2 5p6"
1s² 2s² 2p-² 2p⁴ 3s² 3p-² 3p⁴ 3d-⁴ 3d⁶ 4s² 4p-² 4p⁴ 5s² 5p-² 5p⁴

Note that the 5p shell was broken up into 2 5p- electrons and 4 5p electrons. If we are not filling the shell, occupancy of the spin-up and spin-down electrons has to be given separately:

Xe⁺ = rc"[Kr] 5s2 5p-2 5p3"
[Kr]ᶜ 5s² 5p-² 5p³

It is also possible to work with “continuum orbitals”, where the main quantum number is replaced by a Symbol:

Xe⁺e = rc"[Kr] 5s2 5p-2 5p3 ks"
[Kr]ᶜ 5s² 5p-² 5p³ ks

Orbitals

A single orbital is constructed this way:

o"2s",ro"5f-"
(2s, 5f-)

Their parities and degeneracies are given by

(parity(ro"2s"),degeneracy(ro"2s")),(parity(ro"5f-"),degeneracy(ro"5f-"))
((even, 2), (odd, 6))

It is possible to generate a range of orbitals quickly:

os"5[d] 6[s-p] k[7-10]"
7-element Array{Orbital,1}:
 5d
 6s
 6p
 kk
 kl
 km
 kn
ros"5[d] 6[s-p] k[7-10]"
13-element Array{RelativisticOrbital,1}:
 5d-
 5d
 6s
 6p-
 6p
 kk-
 kk
 kl-
 kl
 km-
 km
 kn-
 kn

Excitations

We can easily generate all possible excitations from a reference configuration. If no extra orbitals are specified, only those that are “open” within the reference set will be considered:

excited_configurations(rc"[Kr] 5s2 5p-2 5p3")
2-element Array{Configuration{RelativisticOrbital{Int64}},1}:
 [Kr]ᶜ 5s² 5p-² 5p³c
 [Kr]ᶜ 5s² 5p- 5p⁴

By appending virtual orbitals, we can generate excitations to configurations beyond those spanned by the reference set:

excited_configurations(rc"[Kr] 5s2 5p-2 5p3", ros"5[d] 6[s-p]"...)
64-element Array{Configuration{RelativisticOrbital{Int64}},1}:
 [Kr]ᶜ 5s² 5p-² 5p³
 [Kr]ᶜ 5s 5p-² 5p³ 5d-
 [Kr]ᶜ 5s 5p-² 5p³ 5d
 [Kr]ᶜ 5s 5p-² 5p³ 6s
 [Kr]ᶜ 5s² 5p- 5p⁴
 [Kr]ᶜ 5s² 5p- 5p³ 6p-
 [Kr]ᶜ 5s² 5p- 5p³ 6p
 [Kr]ᶜ 5s² 5p-² 5p² 6p-
 [Kr]ᶜ 5s² 5p-² 5p² 6p
 [Kr]ᶜ 5p-² 5p⁴ 6p-
 [Kr]ᶜ 5p-² 5p⁴ 6p
 [Kr]ᶜ 5s 5p- 5p⁴ 5d-
 [Kr]ᶜ 5s 5p- 5p⁴ 5d
 [Kr]ᶜ 5s 5p- 5p⁴ 6s
 [Kr]ᶜ 5p-² 5p³ 5d-²
 [Kr]ᶜ 5p-² 5p³ 5d- 5d
 [Kr]ᶜ 5p-² 5p³ 5d- 6s
 [Kr]ᶜ 5s 5p- 5p³ 5d- 6p-
 [Kr]ᶜ 5s 5p- 5p³ 5d- 6p
 [Kr]ᶜ 5s 5p-² 5p² 5d- 6p-
 [Kr]ᶜ 5s 5p-² 5p² 5d- 6p
 [Kr]ᶜ 5p-² 5p³ 5d²
 [Kr]ᶜ 5p-² 5p³ 5d 6s
 [Kr]ᶜ 5s 5p- 5p³ 5d 6p-
 [Kr]ᶜ 5s 5p- 5p³ 5d 6p
 [Kr]ᶜ 5s 5p-² 5p² 5d 6p-
 [Kr]ᶜ 5s 5p-² 5p² 5d 6p
 [Kr]ᶜ 5p-² 5p³ 6s²
 [Kr]ᶜ 5s 5p- 5p³ 6s 6p-
 [Kr]ᶜ 5s 5p- 5p³ 6s 6p
 [Kr]ᶜ 5s 5p-² 5p² 6s 6p-
 [Kr]ᶜ 5s 5p-² 5p² 6s 6p
 [Kr]ᶜ 5p-² 5p³ 6p-²
 [Kr]ᶜ 5p-² 5p³ 6p- 6p
 [Kr]ᶜ 5p-² 5p³ 6p²
 [Kr]ᶜ 5s² 5p⁴ 6p-
 [Kr]ᶜ 5s² 5p⁴ 6p
 [Kr]ᶜ 5s² 5p³ 5d-²
 [Kr]ᶜ 5s² 5p³ 5d- 5d
 [Kr]ᶜ 5s² 5p³ 5d- 6s
 [Kr]ᶜ 5s² 5p- 5p² 5d-²
 [Kr]ᶜ 5s² 5p- 5p² 5d- 5d
 [Kr]ᶜ 5s² 5p- 5p² 5d- 6s
 [Kr]ᶜ 5s² 5p³ 5d²
 [Kr]ᶜ 5s² 5p³ 5d 6s
 [Kr]ᶜ 5s² 5p- 5p² 5d²
 [Kr]ᶜ 5s² 5p- 5p² 5d 6s
 [Kr]ᶜ 5s² 5p³ 6s²
 [Kr]ᶜ 5s² 5p- 5p² 6s²
 [Kr]ᶜ 5s² 5p³ 6p-²
 [Kr]ᶜ 5s² 5p³ 6p- 6p
 [Kr]ᶜ 5s² 5p- 5p² 6p-²
 [Kr]ᶜ 5s² 5p- 5p² 6p- 6p
 [Kr]ᶜ 5s² 5p³ 6p²
 [Kr]ᶜ 5s² 5p- 5p² 6p²
 [Kr]ᶜ 5s² 5p-² 5p 5d-²
 [Kr]ᶜ 5s² 5p-² 5p 5d- 5d
 [Kr]ᶜ 5s² 5p-² 5p 5d- 6s
 [Kr]ᶜ 5s² 5p-² 5p 5d²
 [Kr]ᶜ 5s² 5p-² 5p 5d 6s
 [Kr]ᶜ 5s² 5p-² 5p 6s²
 [Kr]ᶜ 5s² 5p-² 5p 6p-²
 [Kr]ᶜ 5s² 5p-² 5p 6p- 6p
 [Kr]ᶜ 5s² 5p-² 5p 6p²

Again, using the “continuum orbitals”, it is possible to generate the state space accessible via one-photon transitions from the ground state:

Xe⁺e = excited_configurations(rc"[Kr] 5s2 5p6", ros"k[s-d]"...,
                              max_excitations=:singles,
                              keep_parity=false)
16-element Array{Configuration,1}:
 [Kr]ᶜ 5s² 5p-² 5p⁴
 [Kr]ᶜ 5s 5p-² 5p⁴ ks
 [Kr]ᶜ 5s 5p-² 5p⁴ kp-
 [Kr]ᶜ 5s 5p-² 5p⁴ kp
 [Kr]ᶜ 5s 5p-² 5p⁴ kd-
 [Kr]ᶜ 5s 5p-² 5p⁴ kd
 [Kr]ᶜ 5s² 5p- 5p⁴ ks
 [Kr]ᶜ 5s² 5p- 5p⁴ kp-
 [Kr]ᶜ 5s² 5p- 5p⁴ kp
 [Kr]ᶜ 5s² 5p- 5p⁴ kd-
 [Kr]ᶜ 5s² 5p- 5p⁴ kd
 [Kr]ᶜ 5s² 5p-² 5p³ ks
 [Kr]ᶜ 5s² 5p-² 5p³ kp-
 [Kr]ᶜ 5s² 5p-² 5p³ kp
 [Kr]ᶜ 5s² 5p-² 5p³ kd-
 [Kr]ᶜ 5s² 5p-² 5p³ kd

We can then query for the bound and continuum orbitals thus:

map(Xe⁺e) do c
    b = bound(c)
    num_electrons(b) => b
end
16-element Array{Pair{Int64,Configuration{RelativisticOrbital{Int64}}},1}:
 44 => [Kr]ᶜ 5s² 5p-² 5p⁴
 43 => [Kr]ᶜ 5s 5p-² 5p⁴
 43 => [Kr]ᶜ 5s 5p-² 5p⁴
 43 => [Kr]ᶜ 5s 5p-² 5p⁴
 43 => [Kr]ᶜ 5s 5p-² 5p⁴
 43 => [Kr]ᶜ 5s 5p-² 5p⁴
 43 => [Kr]ᶜ 5s² 5p- 5p⁴
 43 => [Kr]ᶜ 5s² 5p- 5p⁴
 43 => [Kr]ᶜ 5s² 5p- 5p⁴
 43 => [Kr]ᶜ 5s² 5p- 5p⁴
 43 => [Kr]ᶜ 5s² 5p- 5p⁴
 43 => [Kr]ᶜ 5s² 5p-² 5p³
 43 => [Kr]ᶜ 5s² 5p-² 5p³
 43 => [Kr]ᶜ 5s² 5p-² 5p³
 43 => [Kr]ᶜ 5s² 5p-² 5p³
 43 => [Kr]ᶜ 5s² 5p-² 5p³
map(Xe⁺e) do c
    b = continuum(c)
    num_electrons(b) => b
end
16-element Array{Pair{Int64,_1} where _1,1}:
 0 => ∅
 1 => ks
 1 => kp-
 1 => kp
 1 => kd-
 1 => kd
 1 => ks
 1 => kp-
 1 => kp
 1 => kd-
 1 => kd
 1 => ks
 1 => kp-
 1 => kp
 1 => kd-
 1 => kd

Term symbol calculation

Angular momentum coupling overview

LS coupling

This is done purely non-relativistic, i.e. 2p- is considered equivalent to 2p.

terms(c"1s")
1-element Array{Term{Int64},1}:
 ²S
terms(c"[Kr] 5s2 5p5")
1-element Array{Term{Int64},1}:
 ²Pᵒ
terms(c"[Kr] 5s2 5p4 6s 7g")
13-element Array{Term{Int64},1}:
 ¹D
 ¹F
 ¹G
 ¹H
 ¹I
 ³D
 ³F
 ³G
 ³H
 ³I
 ⁵F
 ⁵G
 ⁵H

jj coupling

jj coupling is implemented slightly differently, it calculates the possible J:s resulting from coupling n equivalent electrons in all combinations allowed by the Pauli principle.

intermediate_terms(ro"1s", 1)
1-element Array{Rational{Int64},1}:
 1//2
intermediate_terms(ro"5p", 2)
2-element Array{Rational{Int64},1}:
 0//1
 2//1
intermediate_terms(ro"7g", 3)
9-element Array{Rational{Int64},1}:
  3//2
  5//2
  7//2
  9//2
 11//2
 13//2
 15//2
 17//2
 21//2

Configuration state functions

CSFs are formed from electronic configurations and their possible term couplings (along with intermediate terms, resulting from unfilled subshells).:

sort(vcat(csfs(rc"3s 3p2")..., csfs(rc"3s 3p- 3p")...))
7-element Array{CSF{RelativisticOrbital,Rational{Int64}},1}:
 3s(1/2|1/2) 3p²(0|1/2)+
 3s(1/2|1/2) 3p-(1/2|1) 3p(3/2|1/2)+
 3s(1/2|1/2) 3p²(2|3/2)+
 3s(1/2|1/2) 3p-(1/2|0) 3p(3/2|3/2)+
 3s(1/2|1/2) 3p-(1/2|1) 3p(3/2|3/2)+
 3s(1/2|1/2) 3p²(2|5/2)+
 3s(1/2|1/2) 3p-(1/2|1) 3p(3/2|5/2)+

Ideas

  • [x] Generate configurations with cores; [He], [Ne], &.
  • [ ] Coefficient of fractional parentage
  • [ ] Seniority number
  • [-] Different coupling schemes
    • [X] LS-coupling
    • [ ] jk-coupling, e.g., Ne I, first excited state: 1s²2s²2p⁵(²P⁰₃.₂)3s ²[³/₂]⁰₀,₁
    • [x] jj-coupling

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Julia 100.0%