Skip to content

Commit 3bf5c1b

Browse files
Merge pull request #43 from SciML/type
type stable function calling
2 parents 4dcd476 + 51dcfc1 commit 3bf5c1b

File tree

1 file changed

+31
-26
lines changed

1 file changed

+31
-26
lines changed

src/nbody_to_ode.jl

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -296,15 +296,17 @@ function DiffEqBase.ODEProblem(simulation::NBodySimulation{<:PotentialNBodySyste
296296

297297
acceleration_functions = gather_accelerations_for_potentials(simulation)
298298

299-
function ode_system!(du, u, p, t)
300-
du[:, 1:n] = @view u[:, n + 1:2n];
301-
302-
@inbounds for i = 1:n
303-
a = MVector(0.0, 0.0, 0.0)
304-
for acceleration! in acceleration_functions
305-
acceleration!(a, u[:, 1:n], u[:, n + 1:end], t, i);
299+
ode_system! = let acceleration_functions = tuple(acceleration_functions...)
300+
function ode_system!(du, u, p, t)
301+
du[:, 1:n] = @view u[:, n + 1:2n];
302+
303+
@inbounds for i = 1:n
304+
a = MVector(0.0, 0.0, 0.0)
305+
for acceleration! in acceleration_functions
306+
acceleration!(a, u[:, 1:n], u[:, n + 1:end], t, i);
307+
end
308+
du[:, n + i] .= a
306309
end
307-
du[:, n + i] .= a
308310
end
309311
end
310312

@@ -318,19 +320,20 @@ function DiffEqBase.SecondOrderODEProblem(simulation::NBodySimulation{<:Potentia
318320
acceleration_functions = gather_accelerations_for_potentials(simulation)
319321
simultaneous_acceleration = gather_simultaneous_acceleration(simulation)
320322

321-
function soode_system!(dv, v, u, p, t)
322-
@inbounds for i = 1:n
323-
a = MVector(0.0, 0.0, 0.0)
324-
for acceleration! in acceleration_functions
325-
acceleration!(a, u, v, t, i);
323+
soode_system! = let acceleration_functions = tuple(acceleration_functions...), simultaneous_acceleration = tuple(simultaneous_acceleration...)
324+
function soode_system!(dv, v, u, p, t)
325+
@inbounds for i = 1:n
326+
a = MVector(0.0, 0.0, 0.0)
327+
for acceleration! in acceleration_functions
328+
acceleration!(a, u, v, t, i);
329+
end
330+
dv[:, i] .= a
331+
end
332+
for acceleration! in simultaneous_acceleration
333+
acceleration!(dv, u, v, t);
326334
end
327-
dv[:, i] .= a
328-
end
329-
for acceleration! in simultaneous_acceleration
330-
acceleration!(dv, u, v, t);
331335
end
332336
end
333-
334337
SecondOrderODEProblem(soode_system!, v0, u0, simulation.tspan)
335338
end
336339

@@ -391,17 +394,19 @@ function DiffEqBase.SDEProblem(simulation::NBodySimulation{<:PotentialNBodySyste
391394

392395
therm = simulation.thermostat
393396

394-
function deterministic_acceleration!(du, u, p, t)
395-
du[:, 1:n] = @view u[:, n + 1:2n];
397+
deterministic_acceleration! = let acceleration_functions = tuple(acceleration_functions...)
398+
function deterministic_acceleration!(du, u, p, t)
399+
du[:, 1:n] = @view u[:, n + 1:2n];
396400

397-
@inbounds for i = 1:n
398-
a = MVector(0.0, 0.0, 0.0)
399-
for acceleration! in acceleration_functions
400-
acceleration!(a, (@view u[:, 1:n]), (@view u[:, n + 1:end]), t, i);
401+
@inbounds for i = 1:n
402+
a = MVector(0.0, 0.0, 0.0)
403+
for acceleration! in acceleration_functions
404+
acceleration!(a, (@view u[:, 1:n]), (@view u[:, n + 1:end]), t, i);
405+
end
406+
du[:, n + i] .= a
401407
end
402-
du[:, n + i] .= a
408+
@. du[:, n + 1:end] -= therm.γ*u[:, n + 1:end]
403409
end
404-
@. du[:, n + 1:end] -= therm.γ*u[:, n + 1:end]
405410
end
406411

407412
σ = sqrt(2*therm.γ*simulation.kb*therm.T/simulation.system.bodies[1].m)

0 commit comments

Comments
 (0)