@@ -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 : 2 n];
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 : 2 n];
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)
335338end
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 : 2 n];
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 : 2 n];
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