I currently have some code that looks like this:
for i = 1:Nₓ-1
if algorithm == "2S"
ψ[i+1, :] = T2(ψ[i, :], ω, dx, F, F̃)
elseif algorithm == "4S"
ψ[i+1, :] = T4S(ψ[i, :], ω, dx, F, F̃)
elseif algorithm == "6S"
ψ[i+1, :] = T6S(ψ[i, :], ω, dx, F, F̃)
elseif algorithm == "8S"
ψ[i+1, :] = T8S(ψ[i, :], ω, dx, F, F̃)
else
throw(ArgumentError("Algorithm type unknown, please check the documentation"))
end
end
Essentially the code uses the variable algorithm
to decide which function to use. The problem is that this is done repeatedly inside an extremely long loop, hence degrading performance according to the profiler. It is also somewhat ugly. Is there any way around this like there is in some other languages?
EDIT:
I am updating this to show the form of F
, F̃
and the function T2
:
F = plan_fft!(sim.ψ[1, :]) # Plan
F̃ = plan_ifft!(sim.ψ[1, :]) # Inverse Plan
function T2(ψ, ω, dx, F, F̃)
# Nonlinear (loop over vectorization for speed)
for i in 1:length(ψ)
ψ[i] *= exp(-im * dx/2 * (-1*abs2(ψ[i])))
end
# Kinetic
F*ψ
ψ .*= ifftshift(exp.(-im * dx * ω .^ 2 / 2))
F̃*ψ
# Nonlinear (loop over vectorization for speed)
for i in 1:length(ψ)
ψ[i] *= exp(-im * dx/2 * (-1*abs2(ψ[i])))
end
return ψ
end #T2