2021-12-02 22:13:54 +00:00
|
|
|
|
using Distributions: Uniform
|
|
|
|
|
using Dates: now
|
|
|
|
|
using JSON3: JSON3
|
|
|
|
|
|
2021-11-10 14:41:04 +00:00
|
|
|
|
function initial_particle_grid_pos(i, j; grid_box_width, l)
|
2021-11-26 05:55:27 +00:00
|
|
|
|
term = -0.5 * grid_box_width - l
|
|
|
|
|
return [k * grid_box_width + term for k in (i, j)]
|
2021-11-10 14:41:04 +00:00
|
|
|
|
end
|
|
|
|
|
|
2021-12-02 23:37:43 +00:00
|
|
|
|
function generate_particles(grid_n::Int64, grid_box_width::Float64, l::Float64)
|
2021-11-10 14:41:04 +00:00
|
|
|
|
particles = Vector{Particle}(undef, grid_n^2)
|
|
|
|
|
|
|
|
|
|
id = 1
|
|
|
|
|
|
|
|
|
|
for i in 1:grid_n
|
|
|
|
|
for j in 1:grid_n
|
|
|
|
|
particles[id] = Particle(;
|
|
|
|
|
id=id,
|
|
|
|
|
c=initial_particle_grid_pos(i, j; grid_box_width=grid_box_width, l=l),
|
|
|
|
|
φ=rand(Uniform(-π, π)),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
id += 1
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return particles
|
|
|
|
|
end
|
2021-11-26 05:55:27 +00:00
|
|
|
|
|
2021-12-02 23:37:43 +00:00
|
|
|
|
function generate_particles(bundle::Bundle, N::Int64)
|
|
|
|
|
particles = Vector{Particle}(undef, N)
|
|
|
|
|
|
|
|
|
|
for id in 1:N
|
|
|
|
|
particles[id] = Particle(; id=id, c=bundle.c[id, end], φ=bundle.φ[id, end])
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return particles
|
|
|
|
|
end
|
|
|
|
|
|
2021-11-26 05:55:27 +00:00
|
|
|
|
function init_sim(;
|
|
|
|
|
N::Int64, v::Float64, δt::Float64=1e-5, packing_ratio::Float64=0.5, comment::String=""
|
|
|
|
|
)
|
|
|
|
|
@assert N > 0
|
|
|
|
|
@assert v >= 0
|
|
|
|
|
@assert δt in 1e-7:1e-7:1e-4
|
|
|
|
|
@assert packing_ratio > 0
|
|
|
|
|
|
|
|
|
|
μ = 1.0
|
|
|
|
|
D₀ = 1.0
|
|
|
|
|
particle_diameter = 1.0
|
|
|
|
|
Dᵣ = 3 * D₀ / (particle_diameter^2)
|
|
|
|
|
σ = 1.0
|
|
|
|
|
ϵ = 100.0
|
|
|
|
|
interaction_r = 2^(1 / 6) * σ
|
|
|
|
|
|
|
|
|
|
grid_n = round(Int64, ceil(sqrt(N)))
|
|
|
|
|
|
|
|
|
|
N = grid_n^2
|
|
|
|
|
|
|
|
|
|
l = sqrt(N * π / packing_ratio) * σ / 4
|
|
|
|
|
grid_box_width = 2 * l / grid_n
|
|
|
|
|
|
|
|
|
|
sim_consts = (;
|
|
|
|
|
# Input
|
|
|
|
|
N,
|
|
|
|
|
v,
|
|
|
|
|
δt,
|
|
|
|
|
packing_ratio,
|
|
|
|
|
# Calculated
|
|
|
|
|
μ,
|
|
|
|
|
D₀,
|
|
|
|
|
particle_diameter,
|
|
|
|
|
Dᵣ,
|
|
|
|
|
σ,
|
|
|
|
|
ϵ,
|
|
|
|
|
interaction_r,
|
|
|
|
|
grid_n,
|
|
|
|
|
l,
|
|
|
|
|
grid_box_width,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
particles = generate_particles(grid_n, grid_box_width, l)
|
|
|
|
|
bundle = Bundle(N, 1)
|
|
|
|
|
save_snapshot!(bundle, 1, 0.0, particles)
|
|
|
|
|
|
|
|
|
|
dir = "exports/$(now())_N=$(N)_v=$(v)_#$(rand(1000:9999))$comment"
|
|
|
|
|
mkpath(dir)
|
|
|
|
|
|
|
|
|
|
open("$dir/sim_consts.json", "w") do f
|
|
|
|
|
JSON3.pretty(f, sim_consts)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
save_bundle(dir, bundle, 1, 0.0)
|
|
|
|
|
|
|
|
|
|
return dir
|
|
|
|
|
end
|