@@ -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