Common N-body operators
A few N-body operators that are common in quantum mechanics. It is possible to form a composite Hamiltonian thus:
julia> H = OneBodyHamiltonian() + CoulombInteraction()
ĥ + ĝ
If then define a set of Slater determinants, we can easily form the energy expression:
julia> slaters = SlaterDeterminant.([[:a, :b], [:c, :d], [:a, :c]])
3-element Array{SlaterDeterminant{Symbol},1}:
|a b|
|c d|
|a c|
julia> Matrix(H, slaters)
3×3 Array{EnergyExpressions.NBodyMatrixElement,2}:
(a|a) + (b|b) - G(a,b) + F(a,b) - [a b|d c] + [a b|c d] (b|c) - [a b|c a] + [a b|a c]
- [c d|b a] + [c d|a b] (c|c) + (d|d) - G(c,d) + F(c,d) - (d|a) - [c d|c a] + [c d|a c]
(c|b) - [a c|b a] + [a c|a b] - (a|d) - [a c|d c] + [a c|c d] (a|a) + (c|c) - G(a,c) + F(a,c)
An energy expression like this can then be used to derive the multi-configurational Hartree–Fock equations for the orbitals a,b,c,d
.
We can also specify that e.g. the orbitals b
and c
are non-orthogonal, and thus derive a slightly different energy expression, that takes this into account:
julia> Matrix(H, slaters, [OrbitalOverlap(:b,:c)])
3×3 Array{EnergyExpressions.NBodyMatrixElement,2}:
(a|a) + (b|b) - G(a,b) + F(a,b) - ⟨b|c⟩(a|d) - [a b|d c] + [a b|c d] ⟨b|c⟩(a|a) + (b|c) - [a b|c a] + [a b|a c]
- ⟨c|b⟩(d|a) - [c d|b a] + [c d|a b] (c|c) + (d|d) - G(c,d) + F(c,d) - (d|a) - [c d|c a] + [c d|a c]
⟨c|b⟩(a|a) + (c|b) - [a c|b a] + [a c|a b] - (a|d) - [a c|d c] + [a c|c d] (a|a) + (c|c) - G(a,c) + F(a,c)
Beware that the computational complexity grows factorially with the amount of non-orthogonal orbitals!
EnergyExpressions.OneBodyHamiltonian
— TypeOneBodyHamiltonian
The one-body Hamiltonian, may include external fields. It is diagonal in spin, i.e. it does not couple orbitals of opposite spin.
EnergyExpressions.FieldFreeOneBodyHamiltonian
— TypeFieldFreeOneBodyHamiltonian
The one-body Hamiltonian, with no external fields. It is diagonal in the orbital symmetry.
EnergyExpressions.CoulombInteraction
— TypeCoulombInteraction
Two-body Hamiltonian, representing the mutual Coulombic repulsion between two electrons. Is diagonal in spin, i.e. the spin of the orbitals associated with the same coordinate must be the same.
Examples
julia> EnergyExpressions.OrbitalMatrixElement((:a,:b), CoulombInteraction(), (:c,:d))
[a b|c d]
julia> EnergyExpressions.OrbitalMatrixElement((:a,:b), CoulombInteraction(), (:b,:a))
G(a,b)
Base.iszero
— Functioniszero(me::EnergyExpressions.OrbitalMatrixElement{1,<:SpinOrbital{<:Orbital},OneBodyHamiltonian,<:SpinOrbital{<:Orbital}})
The matrix element vanishes if the spin-orbitals do not have the same spin.
iszero(me::EnergyExpressions.OrbitalMatrixElement{2,<:SpinOrbital{<:Orbital},CoulombInteraction,<:SpinOrbital{<:Orbital}})
The matrix element vanishes if the (non-relativistic) spin-orbitals associated with the same coordinate do not have the same spin.