diff --git a/ho_basis.jl b/ho_basis.jl index 1ba55a8..5e4bd99 100644 --- a/ho_basis.jl +++ b/ho_basis.jl @@ -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) diff --git a/math.jl b/math.jl index b51a39f..f4a6208 100644 --- a/math.jl +++ b/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)" 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 for the HO basis" -function reduced_matrix_element(np, lp, n, l, μω)::ComplexF64 +"Gives 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 (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 (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 \ No newline at end of file