1
0
Fork 0
mirror of https://gitlab.rlp.net/mobitar/ReCo.jl.git synced 2024-09-19 19:01:17 +00:00
ReCo.jl/src/simulation.jl

96 lines
2.3 KiB
Julia
Raw Normal View History

2021-11-10 14:41:04 +00:00
rand_normal01() = rand(Normal(0, 1))
function update_verlet_list!(args)
@simd for pv in args.verlet_list
reset!(pv)
end
2021-11-11 00:25:06 +00:00
2021-11-10 14:41:04 +00:00
for i in 1:(args.N - 1)
for j in (i + 1):args.N
p1 = args.particles[i]
p2 = args.particles[j]
overlapping, r⃗₁₂, distance² = are_overlapping(p1, p2, args.skin_r², args.l)
if overlapping
push!(args.verlet_list[i], j)
end
end
end
end
function euler!(args)
2021-11-11 00:25:06 +00:00
for i in 1:(args.N - 1)
p = args.particles[i]
2021-11-10 14:41:04 +00:00
verlet_list = args.verlet_list[p.id]
2021-11-11 00:25:06 +00:00
for j in 1:verlet_list.last_ind
p2 = args.particles[verlet_list.v[j]]
2021-11-10 14:41:04 +00:00
overlapping, r⃗₁₂, distance² = are_overlapping(p, p2, args.interaction_r², args.l)
if overlapping
c = args.c₁ / (distance²^4) * (args.c₂ / (distance²^3) - 1)
2021-11-11 00:25:06 +00:00
@simd for k in 1:2
dck = c * r⃗₁₂[k]
p.tmp_c[k] -= dck
p2.tmp_c[k] += dck
2021-11-10 14:41:04 +00:00
end
end
end
2021-11-11 00:25:06 +00:00
end
2021-11-10 14:41:04 +00:00
2021-11-11 00:25:06 +00:00
@simd for p in args.particles
2021-11-10 14:41:04 +00:00
e = SVector(cos(p.φ), sin(p.φ))
@simd for i in 1:2
p.tmp_c[i] += args.vδt * e[i] + args.c₃ * rand_normal01()
end
p.φ += args.c₄ * rand_normal01()
restrict_coordinates!(p; l=args.l)
2021-11-11 00:25:06 +00:00
update!(p)
2021-11-10 14:41:04 +00:00
end
return nothing
end
2021-11-10 23:24:07 +00:00
function simulate(args,
δt::Float64,
T::Float64,
n_steps_before_verlet_list_update::Int64,
n_steps_before_save::Int64,
)
2021-11-10 14:41:04 +00:00
sol = Solution(args.N, args.n_frames)
2021-11-10 23:24:07 +00:00
frame = 0
frame = save_frame!(sol, frame, 0.0, args.particles)
2021-11-10 14:41:04 +00:00
start_time = now()
println("Started simulation at $start_time.")
2021-11-10 23:24:07 +00:00
@showprogress 0.2 for (integration_step, t) in enumerate(0:δt:T)
if integration_step % n_steps_before_save == 0
frame = save_frame!(sol, frame, t, args.particles)
2021-11-10 14:41:04 +00:00
end
2021-11-10 23:24:07 +00:00
if integration_step % n_steps_before_verlet_list_update == 0
2021-11-10 14:41:04 +00:00
update_verlet_list!(args)
end
euler!(args)
end
end_time = now()
elapsed_time = canonicalize(CompoundPeriod(end_time - start_time))
println("Done simulation at $end_time and took $elapsed_time.")
return (sol, end_time)
end