@@ -2,7 +2,7 @@ function gather_bodies_initial_coordinates(simulation::NBodySimulation)
22 system = simulation. system
33 bodies = system. bodies;
44 len = n = length (bodies)
5-
5+
66 if simulation. thermostat isa NoseHooverThermostat
77 len += 1
88 end
@@ -11,9 +11,9 @@ function gather_bodies_initial_coordinates(simulation::NBodySimulation)
1111 v0 = zeros (3 , len)
1212
1313 for i = 1 : n
14- u0[:, i] = bodies[i]. r
14+ u0[:, i] = bodies[i]. r
1515 v0[:, i] = bodies[i]. v
16- end
16+ end
1717
1818 (u0, v0, n)
1919end
@@ -23,7 +23,7 @@ function gather_bodies_initial_coordinates(simulation::NBodySimulation{<:WaterSP
2323 molecules = system. bodies;
2424 n = length (molecules)
2525 len = 3 * n
26-
26+
2727 if simulation. thermostat isa NoseHooverThermostat
2828 len = 3 * n+ 1
2929 end
@@ -42,13 +42,13 @@ function gather_atom_coordinates(system::WaterSPCFw{<:MassBody}, len)
4242 for i = 1 : n
4343 p = system. scpfw_parameters
4444 indO, indH1, indH2 = 3 * (i - 1 ) + 1 , 3 * (i - 1 ) + 2 , 3 * (i - 1 ) + 3
45- u0[:, indO] = molecules[i]. r
45+ u0[:, indO] = molecules[i]. r
4646 u0[:, indH1] = molecules[i]. r .+ [p. rOH, 0.0 , 0.0 ]
4747 u0[:, indH2] = molecules[i]. r .+ [cos (p. aHOH) * p. rOH, 0.0 , sin (p. aHOH) * p. rOH]
4848 v0[:, indO] = molecules[i]. v
4949 v0[:, indH1] = molecules[i]. v
5050 v0[:, indH2] = molecules[i]. v
51- end
51+ end
5252 (u0, v0)
5353end
5454
@@ -61,7 +61,7 @@ function gather_atom_coordinates(system::WaterSPCFw{<:WaterMolecule}, len)
6161 for i = 1 : n
6262 p = system. scpfw_parameters
6363 indO, indH1, indH2 = 3 * (i - 1 ) + 1 , 3 * (i - 1 ) + 2 , 3 * (i - 1 ) + 3
64- u0[:, indO] = molecules[i]. O. r
64+ u0[:, indO] = molecules[i]. O. r
6565 u0[:, indH1] = molecules[i]. H1. r
6666 u0[:, indH2] = molecules[i]. H2. r
6767 v0[:, indO] = molecules[i]. O. v
7979
8080function gather_accelerations_for_potentials (simulation:: NBodySimulation{<:PotentialNBodySystem} )
8181 acceleration_functions = []
82-
82+
8383 for (potential, parameters) in simulation. system. potentials
8484 push! (acceleration_functions, get_accelerating_function (parameters, simulation))
8585 end
9090function gather_group_accelerations (simulation:: NBodySimulation{<:WaterSPCFw} )
9191 acelerations = []
9292 push! (acelerations, get_group_accelerating_function (simulation. system. scpfw_parameters, simulation))
93- acelerations
93+ acelerations
9494end
9595
9696function get_accelerating_function (parameters:: LennardJonesParameters , simulation:: NBodySimulation )
124124function obtain_data_for_harmonic_bond_interaction (system:: WaterSPCFw , p:: SPCFwParameters )
125125 neighbouhoods = Dict {Int, Vector{Tuple{Int,Float64}}} ()
126126 n = length (system. bodies)
127- ms = zeros (3 * n)
127+ ms = zeros (typeof ( first (system . bodies) . m), 3 * n)
128128 for i in 1 : n
129129 indO, indH1, indH2 = 3 * (i - 1 ) + 1 , 3 * (i - 1 ) + 2 , 3 * (i - 1 ) + 3
130130 ms[indO] = system. mO
@@ -143,56 +143,56 @@ function obtain_data_for_harmonic_bond_interaction(system::WaterSPCFw, p::SPCFwP
143143 neighbouhoods[indH1] = neighbours_h1
144144 neighbouhoods[indH2] = neighbours_h2
145145 end
146-
146+
147147 (ms, neighbouhoods)
148148end
149149
150150function obtain_data_for_lennard_jones_interaction (system:: PotentialNBodySystem )
151151 bodies = system. bodies
152152 n = length (bodies)
153- ms = zeros (Real , n)
154- indxs = zeros (Integer , n)
153+ ms = zeros (typeof ( first (bodies) . m) , n)
154+ indxs = zeros (Int , n)
155155 for i = 1 : n
156156 ms[i] = bodies[i]. m
157157 indxs[i] = i
158- end
158+ end
159159 return (ms, indxs)
160160end
161161
162162function obtain_data_for_lennard_jones_interaction (system:: WaterSPCFw )
163163 bodies = system. bodies
164164 n = length (bodies)
165- ms = zeros (Real , 3 * n)
166- indxs = zeros (Integer , n)
165+ ms = zeros (typeof ( first (bodies) . m) , 3 * n)
166+ indxs = zeros (Int , n)
167167 for i = 1 : n
168168 indxs[i] = 3 * (i - 1 ) + 1
169169 ms[3 * (i - 1 ) + 1 ] = system. mO
170170 ms[3 * (i - 1 ) + 2 ] = system. mH
171171 ms[3 * (i - 1 ) + 3 ] = system. mH
172- end
172+ end
173173 return (ms, indxs)
174174end
175175
176176function obtain_data_for_electrostatic_interaction (system:: PotentialNBodySystem )
177177 bodies = system. bodies
178178 n = length (bodies)
179- qs = zeros (Real , n)
180- ms = zeros (Real , n)
179+ qs = zeros (typeof ( first (bodies) . q) , n)
180+ ms = zeros (typeof ( first (bodies) . m) , n)
181181 indxs = collect (1 : n)
182182 exclude = Dict {Int, Vector{Int}} ()
183183 for i = 1 : n
184184 qs[i] = bodies[i]. q
185185 ms[i] = bodies[i]. m
186186 exclude[i] = [i]
187- end
187+ end
188188 return (qs, ms, indxs, exclude)
189189end
190190
191191function obtain_data_for_electrostatic_interaction (system:: WaterSPCFw )
192192 bodies = system. bodies
193193 n = length (bodies)
194- qs = zeros (Real , 3 * n)
195- ms = zeros (Real , 3 * n)
194+ qs = zeros (typeof ( first (bodies) . m) , 3 * n)
195+ ms = zeros (typeof ( first (bodies) . m) , 3 * n)
196196 indxs = collect (1 : 3 * n)
197197 exclude = Dict {Int, Vector{Int}} ()
198198 for i = 1 : n
@@ -206,30 +206,30 @@ function obtain_data_for_electrostatic_interaction(system::WaterSPCFw)
206206 exclude[Oind] = [Oind, Oind+ 1 , Oind+ 2 ,3 * n+ 1 ]
207207 exclude[Oind+ 1 ] = [Oind, Oind+ 1 , Oind+ 2 ,3 * n+ 1 ]
208208 exclude[Oind+ 2 ] = [Oind, Oind+ 1 , Oind+ 2 ,3 * n+ 1 ]
209- end
209+ end
210210 return (qs, ms, indxs, exclude)
211211end
212212
213213function obtain_data_for_electrostatic_interaction (system:: NBodySystem )
214214 bodies = system. bodies
215215 n = length (bodies)
216- qs = zeros (Real , n)
217- ms = zeros (Real , n)
216+ qs = zeros (typeof ( first (bodies) . m) , n)
217+ ms = zeros (typeof ( first (bodies) . m) , n)
218218 return (qs, ms)
219219end
220220
221221function obtain_data_for_valence_angle_harmonic_interaction (system:: WaterSPCFw )
222222 p = system. scpfw_parameters
223223 bonds = Vector {Tuple{Int, Int, Int, Float64, Float64}} ()
224224 n = length (system. bodies)
225- ms = zeros (Real , 3 * n)
225+ ms = zeros (typeof ( first (bodies) . m) , 3 * n)
226226 for i = 1 : n
227227 indO, indH1, indH2 = 3 * (i - 1 ) + 1 , 3 * (i - 1 ) + 2 , 3 * (i - 1 ) + 3
228228 ms[indO] = system. mO
229229 ms[indH1] = system. mH
230230 ms[indH2] = system. mH
231231 push! (bonds, (indH1, indO, indH2, p. aHOH, p. ka))
232- end
232+ end
233233 return (ms, bonds)
234234end
235235
@@ -293,77 +293,77 @@ end
293293
294294function DiffEqBase. ODEProblem (simulation:: NBodySimulation{<:PotentialNBodySystem} )
295295 (u0, v0, n) = gather_bodies_initial_coordinates (simulation)
296-
297- acceleration_functions = gather_accelerations_for_potentials (simulation)
296+
297+ acceleration_functions = gather_accelerations_for_potentials (simulation)
298298
299299 function ode_system! (du, u, p, t)
300300 du[:, 1 : n] = @view u[:, n + 1 : 2 n];
301301
302302 @inbounds for i = 1 : n
303303 a = MVector (0.0 , 0.0 , 0.0 )
304304 for acceleration! in acceleration_functions
305- acceleration! (a, u[:, 1 : n], u[:, n + 1 : end ], t, i);
305+ acceleration! (a, u[:, 1 : n], u[:, n + 1 : end ], t, i);
306306 end
307307 du[:, n + i] .= a
308- end
308+ end
309309 end
310310
311311 return ODEProblem (ode_system!, hcat (u0, v0), simulation. tspan)
312312end
313313
314314function DiffEqBase. SecondOrderODEProblem (simulation:: NBodySimulation{<:PotentialNBodySystem} )
315-
315+
316316 (u0, v0, n) = gather_bodies_initial_coordinates (simulation)
317317
318- acceleration_functions = gather_accelerations_for_potentials (simulation)
318+ acceleration_functions = gather_accelerations_for_potentials (simulation)
319319 simultaneous_acceleration = gather_simultaneous_acceleration (simulation)
320320
321321 function soode_system! (dv, v, u, p, t)
322322 @inbounds for i = 1 : n
323323 a = MVector (0.0 , 0.0 , 0.0 )
324324 for acceleration! in acceleration_functions
325- acceleration! (a, u, v, t, i);
325+ acceleration! (a, u, v, t, i);
326326 end
327327 dv[:, i] .= a
328- end
328+ end
329329 for acceleration! in simultaneous_acceleration
330- acceleration! (dv, u, v, t);
330+ acceleration! (dv, u, v, t);
331331 end
332332 end
333333
334334 SecondOrderODEProblem (soode_system!, v0, u0, simulation. tspan)
335335end
336336
337337function DiffEqBase. SecondOrderODEProblem (simulation:: NBodySimulation{<:WaterSPCFw} )
338-
338+
339339 (u0, v0, n) = gather_bodies_initial_coordinates (simulation)
340340
341341 (o_acelerations, h_acelerations) = gather_accelerations_for_potentials (simulation)
342- group_accelerations = gather_group_accelerations (simulation)
342+ group_accelerations = gather_group_accelerations (simulation)
343343 simultaneous_acceleration = gather_simultaneous_acceleration (simulation)
344344
345345 function soode_system! (dv, v, u, p, t)
346346 @inbounds for i = 1 : n
347347 a = MVector (0.0 , 0.0 , 0.0 )
348348 for acceleration! in o_acelerations
349- acceleration! (a, u, v, t, 3 * (i - 1 ) + 1 );
349+ acceleration! (a, u, v, t, 3 * (i - 1 ) + 1 );
350350 end
351351 dv[:, 3 * (i - 1 ) + 1 ] .= a
352352 end
353353 @inbounds for i in 1 : n, j in (2 , 3 )
354354 a = MVector (0.0 , 0.0 , 0.0 )
355355 for acceleration! in h_acelerations
356- acceleration! (a, u, v, t, 3 * (i - 1 ) + j);
356+ acceleration! (a, u, v, t, 3 * (i - 1 ) + j);
357357 end
358358 dv[:, 3 * (i - 1 ) + j] .= a
359- end
359+ end
360360 @inbounds for i = 1 : n
361361 for acceleration! in group_accelerations
362- acceleration! (dv, u, v, t, i);
362+ acceleration! (dv, u, v, t, i);
363363 end
364364 end
365365 for acceleration! in simultaneous_acceleration
366- acceleration! (dv, u, v, t);
366+ acceleration! (dv, u, v, t);
367367 end
368368 end
369369
373373function gather_accelerations_for_potentials (simulation:: NBodySimulation{<:WaterSPCFw} )
374374 o_acelerations = []
375375 h_acelerations = []
376-
376+
377377 push! (o_acelerations, get_accelerating_function (simulation. system. e_parameters, simulation))
378378 push! (o_acelerations, get_accelerating_function (simulation. system. scpfw_parameters, simulation))
379379 push! (o_acelerations, get_accelerating_function (simulation. system. lj_parameters, simulation))
386386
387387function DiffEqBase. SDEProblem (simulation:: NBodySimulation{<:PotentialNBodySystem} )
388388 (u0, v0, n) = gather_bodies_initial_coordinates (simulation)
389-
390- acceleration_functions = gather_accelerations_for_potentials (simulation)
389+
390+ acceleration_functions = gather_accelerations_for_potentials (simulation)
391391
392392 therm = simulation. thermostat
393393
@@ -397,7 +397,7 @@ function DiffEqBase.SDEProblem(simulation::NBodySimulation{<:PotentialNBodySyste
397397 @inbounds for i = 1 : n
398398 a = MVector (0.0 , 0.0 , 0.0 )
399399 for acceleration! in acceleration_functions
400- acceleration! (a, (@view u[:, 1 : n]), (@view u[:, n + 1 : end ]), t, i);
400+ acceleration! (a, (@view u[:, 1 : n]), (@view u[:, n + 1 : end ]), t, i);
401401 end
402402 du[:, n + i] .= a
403403 end
@@ -408,15 +408,15 @@ function DiffEqBase.SDEProblem(simulation::NBodySimulation{<:PotentialNBodySyste
408408 function noise! (du, u, p, t)
409409 @. du[:, n + 1 : end ] += σ
410410 end
411-
411+
412412 return SDEProblem (deterministic_acceleration!, noise!, hcat (u0, v0), simulation. tspan)
413413end
414414
415415function DiffEqBase. SDEProblem (simulation:: NBodySimulation{<:WaterSPCFw} )
416416 (u0, v0, n) = gather_bodies_initial_coordinates (simulation)
417-
417+
418418 (o_acelerations, h_acelerations) = gather_accelerations_for_potentials (simulation)
419- group_accelerations = gather_group_accelerations (simulation)
419+ group_accelerations = gather_group_accelerations (simulation)
420420 simultaneous_acceleration = gather_simultaneous_acceleration (simulation)
421421
422422 therm = simulation. thermostat
@@ -429,7 +429,7 @@ function DiffEqBase.SDEProblem(simulation::NBodySimulation{<:WaterSPCFw})
429429 @inbounds for i = 1 : n
430430 a = MVector (0.0 , 0.0 , 0.0 )
431431 for acceleration! in o_acelerations
432- acceleration! (a, (@view u[:, 1 : 3 * n]), (@view u[:, 3 * n+ 1 : 2 * 3 * n]), t, 3 * (i - 1 ) + 1 );
432+ acceleration! (a, (@view u[:, 1 : 3 * n]), (@view u[:, 3 * n+ 1 : 2 * 3 * n]), t, 3 * (i - 1 ) + 1 );
433433 end
434434 du[:, 3 * n+ 3 * (i - 1 ) + 1 ] .= a
435435
@@ -440,31 +440,31 @@ function DiffEqBase.SDEProblem(simulation::NBodySimulation{<:WaterSPCFw})
440440 @inbounds for i in 1 : n, j in (2 , 3 )
441441 a = MVector (0.0 , 0.0 , 0.0 )
442442 for acceleration! in h_acelerations
443- acceleration! (a, (@view u[:, 1 : 3 * n]), (@view u[:, 3 * n+ 1 : 2 * 3 * n]), t, 3 * (i - 1 ) + j);
443+ acceleration! (a, (@view u[:, 1 : 3 * n]), (@view u[:, 3 * n+ 1 : 2 * 3 * n]), t, 3 * (i - 1 ) + j);
444444 end
445445 du[:, 3 * n+ 3 * (i - 1 ) + j] .= a
446- end
446+ end
447447 @inbounds for i = 1 : n
448448 for acceleration! in group_accelerations
449- acceleration! ((@view du[ :, 3 * n+ 1 : 2 * 3 * n]), (@view u[:, 1 : 3 * n]), (@view u[:, 3 * n+ 1 : 2 * 3 * n]), t, i);
449+ acceleration! ((@view du[ :, 3 * n+ 1 : 2 * 3 * n]), (@view u[:, 1 : 3 * n]), (@view u[:, 3 * n+ 1 : 2 * 3 * n]), t, i);
450450 end
451451 end
452452 for acceleration! in simultaneous_acceleration
453- acceleration! ((@view du[:, 3 * n+ 1 : 2 * 3 * n]), (@view u[:, 1 : 3 * n]), (@view u[:, 3 * n+ 1 : 2 * 3 * n]), t);
453+ acceleration! ((@view du[:, 3 * n+ 1 : 2 * 3 * n]), (@view u[:, 1 : 3 * n]), (@view u[:, 3 * n+ 1 : 2 * 3 * n]), t);
454454 end
455455 @. du[:, 3 * n+ 1 : 2 * 3 * n] -= therm. γ* u[:, 3 * n+ 1 : 2 * 3 * n]
456456 end
457-
457+
458458 σO = sqrt (2 * therm. γ* simulation. kb* therm. T)/ mO
459459 σH = sqrt (2 * therm. γ* simulation. kb* therm. T)/ mH
460-
460+
461461 function noise! (du, u, p, t)
462462 @inbounds for i = 1 : n
463463 @. du[:, 3 * n+ 3 * (i - 1 ) + 1 ] += σO
464464 @. du[:, 3 * n+ 3 * (i - 1 ) + 2 ] += σH
465465 @. du[:, 3 * n+ 3 * (i - 1 ) + 3 ] += σH
466466 end
467467 end
468-
468+
469469 return SDEProblem (deterministic_acceleration!, noise!, hcat (u0, v0), simulation. tspan)
470- end
470+ end
0 commit comments