Generalize Racah reduction formula

This commit is contained in:
Nuwan Yapa 2024-12-04 13:32:57 -05:00
parent ab010f84a3
commit 725443c03b
2 changed files with 14 additions and 10 deletions

View File

@ -163,10 +163,14 @@ function get_jacobi_V2_matrix(V_of_r, E_max, Λ, μω_global; atol=10^-6, maxeva
end
function get_2p_p1p2_matrix(n1s, l1s, n2s, l2s, Λ, μ1ω1, μ2ω2; dtype=Float64)
# TODO: Cache for integrals
integral1(np, lp, n, l) = integral_HO(np, lp, n, l, μ1ω1)
integral2(np, lp, n, l) = integral_HO(np, lp, n, l, μ2ω2)
mat = zeros(dtype, length(n1s), length(n1s))
Threads.@threads for idx in CartesianIndices(mat)
(i, j) = Tuple(idx)
val = racahs_reduction_formula(n1s[i], l1s[i], n2s[i], l2s[i], n1s[j], l1s[j], n2s[j], l2s[j], Λ, μ1ω1, μ2ω2)
val = racahs_reduction_formula(n1s[i], l1s[i], n2s[i], l2s[i], n1s[j], l1s[j], n2s[j], l2s[j], Λ, integral1, integral2)
if !(val 0); mat[idx] = val; end
end
return sparse(mat)

18
math.jl
View File

@ -22,26 +22,26 @@ double_factorial(n::Int) = Iterators.prod(big, n:-2:1)
"Gaussian integral for n ∈ Integers (Ref: Wolfram MathWorld + simplifications)"
gauss_int(a, n) = double_factorial(n - 1) / (2.0 * a)^((n + 1)/2) * (iseven(n) ? sqrt(π / 2) : 1)
"Gives ∫dp p u' u where u' and u' may have different l (Ref: worked out in Mathematica)"
function integral(np, lp, n, l, μω)
"Gives ∫dp p u' u where u' and u are HO functions with different l (Ref: worked out in Mathematica)"
function integral_HO(np, lp, n, l, μω)
s = [(-1)^(m + mp) * gauss_int(1, 2 * m + 2 * mp + l + lp + 3) * N_lnk(l, n, m) * N_lnk(lp, np, mp) for (m, mp) in Iterators.product(0:n, 0:np)]
return 2 * sqrt(μω) * better_sum(s)
end
"Gives <n' l'|| p ||n l> for the HO basis"
function reduced_matrix_element(np, lp, n, l, μω)::ComplexF64
"Gives <n' l'|| p ||n l> for the HO basis, where integral(np, lp, n, l) is a function that returns ∫dp p u' u"
function reduced_matrix_element(np, lp, n, l, integral)::ComplexF64
wig::Float64 = wigner3j(Float64, lp, 1, l, 0, 0, 0)
if wig == 0
return 0
else
return (-1)^lp * sqrt(2*lp + 1) * sqrt(2*l + 1) * wig * integral(np, lp, n, l, μω)
return (-1)^lp * sqrt(2*lp + 1) * sqrt(2*l + 1) * wig * integral(np, lp, n, l)
end
end
"Matrix element <n1p l1p n2p l2p| p1⋅p2 |n1 l1 n2 l2> (Ref: de-Shalit & Talmi, Eq 15.5)"
function racahs_reduction_formula(n1p, l1p, n2p, l2p, n1, l1, n2, l2, Λ, μ1ω1, μ2ω2)
"Matrix element <n1p l1p n2p l2p| p1⋅p2 |n1 l1 n2 l2> (Ref: de-Shalit & Talmi, Eq 15.5), where integral(np, lp, n, l) is a function that returns ∫dp p u' u"
function racahs_reduction_formula(n1p, l1p, n2p, l2p, n1, l1, n2, l2, Λ, integral1, integral2)
val = wigner6j(Float64, l1p, l2p, Λ, l2, l1, 1)
if val != 0; val *= reduced_matrix_element(n1p, l1p, n1, l1, μ1ω1); end
if val != 0; val *= reduced_matrix_element(n2p, l2p, n2, l2, μ2ω2); end
if val != 0; val *= reduced_matrix_element(n1p, l1p, n1, l1, integral1); end
if val != 0; val *= reduced_matrix_element(n2p, l2p, n2, l2, integral2); end
return (-1)^(l1 + l2p + Λ) * val
end