Generalize Racah reduction formula
This commit is contained in:
parent
ab010f84a3
commit
725443c03b
|
|
@ -163,10 +163,14 @@ function get_jacobi_V2_matrix(V_of_r, E_max, Λ, μω_global; atol=10^-6, maxeva
|
||||||
end
|
end
|
||||||
|
|
||||||
function get_2p_p1p2_matrix(n1s, l1s, n2s, l2s, Λ, μ1ω1, μ2ω2; dtype=Float64)
|
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))
|
mat = zeros(dtype, length(n1s), length(n1s))
|
||||||
Threads.@threads for idx in CartesianIndices(mat)
|
Threads.@threads for idx in CartesianIndices(mat)
|
||||||
(i, j) = Tuple(idx)
|
(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
|
if !(val ≈ 0); mat[idx] = val; end
|
||||||
end
|
end
|
||||||
return sparse(mat)
|
return sparse(mat)
|
||||||
|
|
|
||||||
18
math.jl
18
math.jl
|
|
@ -22,26 +22,26 @@ double_factorial(n::Int) = Iterators.prod(big, n:-2:1)
|
||||||
"Gaussian integral for n ∈ Integers (Ref: Wolfram MathWorld + simplifications)"
|
"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)
|
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)"
|
"Gives ∫dp p u' u where u' and u are HO functions with different l (Ref: worked out in Mathematica)"
|
||||||
function integral(np, lp, n, l, μω)
|
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)]
|
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)
|
return 2 * sqrt(μω) * better_sum(s)
|
||||||
end
|
end
|
||||||
|
|
||||||
"Gives <n' l'|| p ||n l> for the HO basis"
|
"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, μω)::ComplexF64
|
function reduced_matrix_element(np, lp, n, l, integral)::ComplexF64
|
||||||
wig::Float64 = wigner3j(Float64, lp, 1, l, 0, 0, 0)
|
wig::Float64 = wigner3j(Float64, lp, 1, l, 0, 0, 0)
|
||||||
if wig == 0
|
if wig == 0
|
||||||
return 0
|
return 0
|
||||||
else
|
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
|
||||||
end
|
end
|
||||||
|
|
||||||
"Matrix element <n1p l1p n2p l2p| p1⋅p2 |n1 l1 n2 l2> (Ref: de-Shalit & Talmi, Eq 15.5)"
|
"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, Λ, μ1ω1, μ2ω2)
|
function racahs_reduction_formula(n1p, l1p, n2p, l2p, n1, l1, n2, l2, Λ, integral1, integral2)
|
||||||
val = wigner6j(Float64, l1p, l2p, Λ, l2, l1, 1)
|
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(n1p, l1p, n1, l1, integral1); end
|
||||||
if val != 0; val *= reduced_matrix_element(n2p, l2p, n2, l2, μ2ω2); end
|
if val != 0; val *= reduced_matrix_element(n2p, l2p, n2, l2, integral2); end
|
||||||
return (-1)^(l1 + l2p + Λ) * val
|
return (-1)^(l1 + l2p + Λ) * val
|
||||||
end
|
end
|
||||||
Loading…
Reference in New Issue