1+ using  NBodySimulator
2+ 
3+ function  generate_bodies_in_cell_nodes (n:: Int , m:: Real , v_dev:: Real , L:: Real )
4+    
5+     rng =  MersenneTwister (n);
6+     velocities =  v_dev *  randn (rng, Float64, (3 , n))
7+     bodies =  MassBody[]
8+ 
9+     count =  1 
10+     dL =  L /  (ceil (n^ (1  /  3 )))
11+     for  x =  dL/ 2 : dL: L, y =  dL/ 2 : dL: L, z =  dL/ 2 : dL: L        
12+         if  count >  n
13+             break 
14+         end 
15+         r =  SVector (x, y, z)
16+         v =  SVector {3} (velocities[:,count])
17+         body =  MassBody (r, v, m)
18+         push! (bodies, body)
19+         count +=  1            
20+     end 
21+     return  bodies
22+ end 
23+ 
24+ function  generate_bodies_in_line (n:: Int , m:: Real , v_dev:: Real , L:: Real )
25+     dL =  L /  (ceil (n^ (1  /  3 )))
26+     n_line =  floor (Int, L /  dL)
27+     rng =  MersenneTwister (n);
28+     velocities =  v_dev *  randn (rng, Float64, (3 , n_line))
29+     bodies =  MassBody[]
30+     x =  y =  L /  2 
31+     for  i =  1 : n_line      
32+         r =  SVector (x, y, i *  dL)
33+         v =  SVector {3} (velocities[:,i])
34+         body =  MassBody (r, v, m)
35+         push! (bodies, body)  
36+     end 
37+     return  bodies
38+ end 
39+ 
40+ function  generate_random_directions (n:: Int )
41+     theta =  acos .(1  -  2  *  rand (n));
42+     phi =  2  *  pi  *  rand (n);
43+     directions =  [@SVector  [sin (theta[i]) .*  cos (phi[i]), sin (theta[i]) .*  sin (phi[i]), cos (theta[i])] for  i =  1 : n]
44+ end 
45+ 
46+ units =  :real 
47+ units =  :reduced 
48+ 
49+ const  T =  120.0  #  °K
50+ const  kb =  1.38e-23  #  J/K
51+ const  ϵ =  T *  kb
52+ const  σ =  3.4e-10  #  m
53+ const  ρ =  1374  #  kg/m^3
54+ const  m =  39.95  *  1.6747  *  1e-27  #  kg
55+ const  N =  125 # floor(Int, ρ * L^3 / m)
56+ const  L =  (m* N/ ρ)^ (1 / 3 )# 10.229σ
57+ const  R =  2.25 σ   
58+ const  v_dev =  sqrt (kb *  T /  m)
59+ const  τ =  1e-14  #  σ/v
60+ const  t1 =  0 τ
61+ const  t2 =  2000 τ
62+ # bodies = generate_bodies_randomly(N, m, v_dev, L)
63+ bodies =  generate_bodies_in_cell_nodes (N, m, v_dev, L)
64+ # bodies = generate_bodies_in_line(N, m, v_dev, L)
65+ jl_parameters =  LennardJonesParameters (ϵ, σ, R)
66+ pbc =  CubicPeriodicBoundaryConditions (L)
67+ thermostat =  AndersenThermostat (0.02 , T, kb)
68+ lj_system =  PotentialNBodySystem (bodies, Dict (:lennard_jones  =>  jl_parameters));
69+ simulation =  NBodySimulation (lj_system, (t1, t2), pbc, thermostat);
70+ # result = run_simulation(simulation, Tsit5())
71+ result =  @time  run_simulation (simulation, VelocityVerlet (), dt= τ)
72+ 
73+ #= 
74+ using Plots 
75+ import GR 
76+ (rs, grf) = rdf(result) 
77+ (ts, dr2) = msd(result) 
78+ plot(rs/σ, grf, xlim=[0, 0.4999L/σ], label=["Radial distribution function"],ylabel="g(r)", xlabel="r/sigma") 
79+ 
80+ using JLD 
81+ time_now = Dates.format(now(), "yyyy_mm_dd_HH_MM_SS") 
82+ Nactual = length(bodies) 
83+ timesteps = round(length(result.solution.t)) 
84+ #save("D:/water $Nactual molecules $timesteps steps.jld", "rs", rs, "grf", grf, "ts", ts, "dr2", dr2) 
85+ save("D:/liquid argon $Nactual molecules $timesteps steps $time_now.jld", "rs", rs, "grf", grf, "ts", ts, "dr2", dr2, "e_tot", e_tot, "e_kin", e_kin, "e_pot", e_pot) 
86+ =# 
87+ #= 
88+ using Plots 
89+ import GR 
90+ time_now = Dates.format(now(), "yyyy_mm_dd_HH_MM_SS") 
91+ Nactual = length(bodies) 
92+ timesteps = round(length(result.solution.t)) 
93+ @time animate(result, "D:/$Nactual liquid argon particles with $timesteps timesteps $time_now.gif") 
94+ 
95+ #plot(simulation) 
96+ =# 
0 commit comments