I am trying to solve the same ODE for multiple parameters on the GPU, however as you can see in the provided code, the size of the solution trajectories is not the expected one. I get solution that are of the size 7*6, but i want the solutions to be saved at all time points in time_points. Does anybody know where the mistake is? I already varied the batchsize because of the synchronized time stepping, but that didn’t help.
using DiffEqGPU, OrdinaryDiffEq
function Glucose_Yeast(du,u,p,t)
du[1] = p[1] - p[2] * u[1] * u[6] / (1 + u[6] / (p[11]^p[10]))
du[2] = 2 * p[2] * u[1] * u[6] / (1 + u[6] / (p[11]^p[10])) - p[3]*u[2]*(p[12]-u[5]) - p[7]*u[2]*u[5]
du[3] = p[3]*u[2]*(p[12]-u[5]) - p[4]*u[3]*(p[13] - u[6])
du[4] = p[4]*u[3]*(p[13] - u[6]) - p[5]*u[4]*u[5] - p[9]*(u[4]-u[7])
du[5] = p[3]*u[2]*(p[12]-u[5]) - p[5]*u[4]*u[5] - p[7] * u[2] * u[5]
du[6] = -2 * p[2] * u[1] * u[6] / (1 + u[6] / (p[11]^p[10])) + 2 * p[4]*u[3]*(p[13] - u[6]) - p[6] * u[6]
du[7] = p[14]*p[9] * (u[4] - u[7]) - p[9] * u[7]
end
time_points = [5, 15, 23,30, 35, 50, 65, 75, 99, 120, 140, 150, 170, 175, 198, 200]
parameters = [2.5, 100, 6, 16, 100,1.28, 12, 1.8, 13, 4, 0.52, 1, 4, 0.1]
no_samples = 1000
tr = (0,200)
u0 = [0.8328305840762804, 0.07874494552628386, 0.29149315284561084, 0.7805647100582624, 0.7934642151447182, 0.14760486012152874, 0.4416625406969794]
num_pars = length(parameters)
lbs = zeros(num_pars)
ubs = zeros(num_pars)
for j in 1:num_pars
lbs[j] = 1e-8
ubs[j] = 2*parameters[j]
end
s = SobolSeq(lbs, ubs)
s = Sobol.skip(s, no_samples)
Pre_Sobol_Matrix = zeros((num_pars, no_samples))
for j in 1:no_samples
Pre_Sobol_Matrix[:,j] = Sobol.next!(s)
end
function GPU_solver(ODE, parameters, u0, tr, Pre_Sobol_Matrix, no_samples, time_points)
prob = ODEProblem(ODE,u0,tr, parameters[1])
function prob_func(prob,l,repeat)
#Create a new parameter set
new_p = collect(Pre_Sobol_Matrix[:,l])
#Launch a new trajectory
remake(prob, p = new_p)
end
monteprob = EnsembleProblem(prob, prob_func = prob_func)
println("Start solving")
@time sol = solve(
monteprob,
Tsit5(),
EnsembleGPUArray(),
trajectories = no_samples,
batchsize = 100,
rtol=1e-6,
atol=1e-6,
saveat = time_points
)
return sol
end
sol = GPU_solver(Glucose_Yeast, parameters, u0, tr, Pre_Sobol_Matrix, no_samples, time_points)
for i in 1:no_samples
println(size(sol[:,:,i]))
end