Skip to content

Commit c4ef1c7

Browse files
Merge pull request #5 from JuliaDiffEq/improving_tests
Improved testing
2 parents c0e64e3 + ea11f8a commit c4ef1c7

17 files changed

+492
-253
lines changed

examples/liquid_argon.jl

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,4 @@
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
1+
using NBodySimulator, StaticArrays
232

243
function generate_bodies_in_line(n::Int, m::Real, v_dev::Real, L::Real)
254
dL = L / (ceil(n^(1 / 3)))
@@ -47,26 +26,27 @@ units = :real
4726
units = :reduced
4827

4928
const T = 120.0 # °K
29+
const T0 = 90.0
5030
const kb = 1.38e-23 # J/K
5131
const ϵ = T * kb
5232
const σ = 3.4e-10 # m
5333
const ρ = 1374 # kg/m^3
5434
const m = 39.95 * 1.6747 * 1e-27 # kg
55-
const N = 125#floor(Int, ρ * L^3 / m)
35+
const N = 216#floor(Int, ρ * L^3 / m)
5636
const L = (m*N/ρ)^(1/3)#10.229σ
57-
const R = 2.25σ
37+
const R = 0.5*L
5838
const v_dev = sqrt(kb * T / m)
59-
const τ = 1e-14 # σ/v
39+
const τ = 0.5e-15 # σ/v
6040
const t1 = 0τ
61-
const t2 = 2000τ
41+
const t2 = 30000τ
6242
#bodies = generate_bodies_randomly(N, m, v_dev, L)
6343
bodies = generate_bodies_in_cell_nodes(N, m, v_dev, L)
6444
#bodies = generate_bodies_in_line(N, m, v_dev, L)
6545
jl_parameters = LennardJonesParameters(ϵ, σ, R)
6646
pbc = CubicPeriodicBoundaryConditions(L)
67-
thermostat = AndersenThermostat(0.02, T, kb)
47+
#thermostat = AndersenThermostat(0.02, T, kb)
6848
lj_system = PotentialNBodySystem(bodies, Dict(:lennard_jones => jl_parameters));
69-
simulation = NBodySimulation(lj_system, (t1, t2), pbc, thermostat);
49+
simulation = NBodySimulation(lj_system, (t1, t2), pbc, kb);
7050
#result = run_simulation(simulation, Tsit5())
7151
result = @time run_simulation(simulation, VelocityVerlet(), dt=τ)
7252

@@ -93,4 +73,26 @@ timesteps = round(length(result.solution.t))
9373
@time animate(result, "D:/$Nactual liquid argon particles with $timesteps timesteps $time_now.gif")
9474
9575
#plot(simulation)
76+
=#
77+
78+
#=
79+
(rs, grf) = rdf(result)
80+
(ts, dr2) = msd(result)
81+
82+
t = t1:τ:result.solution.t[end-1]
83+
temper = temperature.(result, t)
84+
85+
time_now = Dates.format(now(), "yyyy_mm_dd_HH_MM_SS")
86+
Nactual = length(bodies)
87+
timesteps = round(length(result.solution.t))
88+
89+
using MAT
90+
file = matopen("d:/liquid argon SI units and $timesteps timesteps_$time_now.mat", "w")
91+
write(file, "t", collect(t))
92+
write(file, "temper", temper)
93+
write(file, "rs", rs)
94+
write(file, "ts", ts)
95+
write(file, "grf", grf)
96+
write(file, "dr2", dr2)
97+
close(file)
9698
=#

examples/liquid_argon_omm_units.jl

Lines changed: 53 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,40 @@
11
using NBodySimulator
22
using StochasticDiffEq
33

4-
T = 120.0 # °K
5-
T0 = 90.0 # °K
6-
kb = 8.3144598e-3 # kJ/(K*mol)
7-
ϵ = T * kb
8-
σ = 0.34 # nm
9-
ρ = 1374/1.6747# Da/nm^3
10-
m = 39.95# Da
11-
N = 216
12-
L = (m*N/ρ)^(1/3)#10.229σ
13-
R = 0.5*L
14-
v_dev = sqrt(kb * T / m)
15-
bodies = generate_bodies_in_cell_nodes(N, m, v_dev, L)
16-
17-
τ = 0.5e-3 # ps or 1e-12 s
18-
t1 = 0.0
19-
t2 = 2000τ
20-
21-
parameters = LennardJonesParameters(ϵ, σ, R)
22-
lj_system = PotentialNBodySystem(bodies, Dict(:lennard_jones => parameters));
23-
thermostat = AndersenThermostat(90, 0.01/τ)
4+
const T = 120.0 # °K
5+
const T0 = 90.0 # °K
6+
const kb = 8.3144598e-3 # kJ/(K*mol)
7+
const ϵ = T * kb
8+
const σ = 0.34 # nm
9+
const ρ = 1374/1.6747# Da/nm^3
10+
const m = 39.95# Da
11+
const N = 8
12+
const L = (m*N/ρ)^(1/3)#10.229σ
13+
const R = 0.5*L
14+
const v_dev = sqrt(kb * T / m)
15+
const bodies = generate_bodies_in_cell_nodes(N, m, v_dev, L)
16+
17+
const τ = 0.5e-4 # ps or 1e-12 s
18+
const t1 = 0.0
19+
const t2 = 3τ
20+
21+
const parameters = LennardJonesParameters(ϵ, σ, R)
22+
const lj_system = PotentialNBodySystem(bodies, Dict(:lennard_jones => parameters));
23+
#const thermostat = AndersenThermostat(90, 0.01/τ)
2424
#thermostat = BerendsenThermostat(90, 2000τ)
25-
#thermostat = LangevinThermostat(90, 0.00)
25+
const thermostat = LangevinThermostat(70, 10.0)
2626
#thermostat = NoseHooverThermostat(T0, 200τ)
27-
pbc = CubicPeriodicBoundaryConditions(L)
28-
simulation = NBodySimulation(lj_system, (t1, t2), pbc, thermostat, kb);
29-
result = @time run_simulation(simulation, VelocityVerlet(), dt=τ)
27+
const pbc = CubicPeriodicBoundaryConditions(L)
28+
const simulation = NBodySimulation(lj_system, (t1, t2), pbc, thermostat, kb);
29+
#result = @time run_simulation(simulation, VelocityVerlet(), dt=τ)
3030
#result = @time run_simulation_sde(simulation, ISSEM(symplectic=true,theta=0.5))
31+
result = @time run_simulation(simulation, EM(), dt=τ)
32+
33+
#(rs, grf) = rdf(result)
34+
#(ts, dr2) = msd(result)
3135

32-
#t = t1:τ:result.solution.t[end-1]
33-
#temper = temperature.(result, t)
36+
t = t1:τ:result.solution.t[end-1]
37+
temper = @time temperature.(result, t)
3438

3539

3640
#using Plots
@@ -41,13 +45,33 @@ result = @time run_simulation(simulation, VelocityVerlet(), dt=τ)
4145
#plot!(pl, title="Nose-Hoover thermostat at tau=$(thermostat.τ) ps")
4246

4347

44-
#time_now = Dates.format(now(), "yyyy_mm_dd_HH_MM_SS")
45-
#Nactual = length(bodies)
46-
#timesteps = round(length(result.solution.t))
48+
time_now = Dates.format(now(), "yyyy_mm_dd_HH_MM_SS")
49+
Nactual = length(bodies)
50+
timesteps = round(length(result.solution.t))
4751

4852
#@time save_to_pdb(result, "D:/liquid argon simulation $Nactual molecules and $timesteps steps $time_now.pdb" )
4953

5054
#using JLD
5155
#save("d:/nosehoover thermostat for water liquid argon $T0 and $(thermostat.τ) _$time_now.jld", "t",t, "temper", temper, "T0", T0, "τ", thermostat.τ)
5256

5357

58+
#=
59+
using MAT
60+
61+
time_now = Dates.format(now(), "yyyy_mm_dd_HH_MM_SS")
62+
Nactual = length(bodies)
63+
timesteps = round(length(result.solution.t))
64+
65+
file = matopen("d:/liquid argon $(length(bodies)) omm units at temperature $T0 andgamma $(thermostat.γ) $timesteps timesteps $T0 _$time_now.mat", "w")
66+
write(file, "t", collect(t))
67+
write(file, "temper", temper)
68+
write(file, "T0", T0)
69+
if thermostat isa LangevinThermostat
70+
write(file, "gamma", thermostat.γ)
71+
end
72+
#write(file, "rs", rs)
73+
#write(file, "ts", ts)
74+
#write(file, "grf", grf)
75+
#write(file, "dr2", dr2)
76+
close(file)
77+
=#

examples/liquid_argon_reduced.jl

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,5 @@
11
using NBodySimulator
22

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-
243
const T = 120.0 # °K
254
const kb = 1.38e-23 # J/K
265
const ϵ = T * kb

examples/water_spc_fw.jl

Lines changed: 32 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,5 @@
11
using NBodySimulator
22

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-
#for x = 1.5*dL:2dL:5.6*dL, y = 1.5*dL:2dL:5.6*dL, z = 1.5*dL:2dL:5.6*dL
13-
if count > n
14-
break
15-
end
16-
r = SVector(x, y, z)
17-
v = SVector{3}(velocities[:,count])
18-
body = MassBody(r, v, m)
19-
push!(bodies, body)
20-
count += 1
21-
end
22-
return bodies
23-
end
24-
253
function generate_bodies_in_line(n::Int, m::Real, v_dev::Real, L::Real)
264
dL = L / (ceil(n^(1 / 3)))
275
n_line = floor(Int, L / dL)
@@ -41,10 +19,11 @@ end
4119
const qe = 1.6e-19
4220
const Na = 6.022e23
4321
const T = 298.16 # °K
22+
const T0 = 275 # °K
4423
const kb = 1.38e-23 # J/K
4524
const ϵOO = 0.1554253*4184/Na
4625
const σOO = 3.165492e-10 # m
47-
const ρ = 1000 # kg/m^3
26+
const ρ = 216 # kg/m^3
4827
const mO = 15.999 * 1.6747 * 1e-27 # kg
4928
const mH = 1.00794 * 1.6747 * 1e-27#
5029
const mH2O = mO+2*mH
@@ -55,32 +34,26 @@ const Rel = 0.49*L
5534
const v_dev = sqrt(kb * T /mH2O)
5635
const τ = 0.5e-15 # σ/v
5736
const t1 = 0τ
58-
const t2 = 6.5e-9
37+
const t2 = 6000τ
5938
const k_bond = 1059.162*4184*1e20/Na # J/m^2
6039
const k_angle = 75.90*4184/Na # J/rad^2
6140
const rOH = 1.012e-10 # m
6241
const ∠HOH = 113.24*pi/180 # rad
6342
const qH = 0.41*qe
6443
const qO = -0.82*qe
6544
const k = 9e9 #
66-
bodies = generate_bodies_in_cell_nodes(N, mH2O, v_dev, L)
67-
#bodies = generate_bodies_in_line(N, mH2O, v_dev, L)
45+
#bodies = generate_bodies_in_cell_nodes(N, mH2O, v_dev, L)
46+
bodies = load_water_molecules_from_pdb("C:/Users/Michael/Desktop/GSoC/pdbs/output_4.pdb")
6847
jl_parameters = LennardJonesParameters(ϵOO, σOO, R)
6948
e_parameters = ElectrostaticParameters(k, Rel)
7049
spc_paramters = SPCFwParameters(rOH, ∠HOH, k_bond, k_angle)
7150
pbc = CubicPeriodicBoundaryConditions(L)
7251
water = WaterSPCFw(bodies, mH, mO, qH, qO, jl_parameters, e_parameters, spc_paramters);
73-
simulation = NBodySimulation(water, (t1, t2), pbc);
52+
#thermostat = BerendsenThermostat(T0, 200τ)
53+
simulation = NBodySimulation(water, (t1, t2), pbc, kb);
7454
#result = run_simulation(simulation, Tsit5())
75-
result = @time run_simulation(simulation, VelocityVerlet(), dt=τ, saveat=0.5e-12)
76-
77-
78-
time_now = Dates.format(now(), "yyyy_mm_dd_HH_MM_SS")
79-
Nactual = length(bodies)
80-
timesteps = round(length(result.solution.t))
55+
result = @time run_simulation(simulation, VelocityVerlet(), dt=τ)
8156

82-
(rs, grf) = @time rdf(result)
83-
(ts, dr2) = @time msd(result)
8457

8558
#using JLD
8659
#save("D:/water $Nactual molecules $timesteps steps $time_now.jld", "rs", rs, "grf", grf, "ts", ts, "dr2", dr2)
@@ -91,3 +64,27 @@ timesteps = round(length(result.solution.t))
9164
#plot(rs/1e-10, grf, xlim=[0, 0.4999L/1e-10], label=["Radial distribution function"],ylabel="g(r)", xlabel="r, Å")
9265

9366
#@time animate(result, "D:/$Nactual H20 particles with $timesteps timesteps $time_now.gif")
67+
68+
#=
69+
(rs, grf) = rdf(result)
70+
(ts, dr2) = msd(result)
71+
72+
t = t1:τ:result.solution.t[end-1]
73+
temper = temperature.(result, t)
74+
75+
time_now = Dates.format(now(), "yyyy_mm_dd_HH_MM_SS")
76+
Nactual = length(bodies)
77+
timesteps = round(length(result.solution.t))
78+
79+
using MAT
80+
file = matopen("d:/water real units without thermostat and $timesteps timesteps_$time_now.mat", "w")
81+
write(file, "t", collect(t))
82+
write(file, "temper", temper)
83+
write(file, "rs", rs)
84+
write(file, "ts", ts)
85+
write(file, "grf", grf)
86+
write(file, "dr2", dr2)
87+
close(file)
88+
89+
@time NBodySimulator.save_to_pdb(result, "d:/water in real units from PDB $timesteps timesteps $time_now.pdb" )
90+
=#

0 commit comments

Comments
 (0)