1
0
Fork 0
mirror of https://gitlab.rlp.net/mobitar/ReCo.jl.git synced 2024-12-21 00:51:21 +00:00
ReCo.jl/src/data.jl

134 lines
3.3 KiB
Julia
Raw Normal View History

struct SimConsts
n_particles::Int64
v₀::Float64
δt::Float64
packing_ratio::Float64
2022-01-23 15:14:37 +00:00
μₜ::Float64
Dₜ::Float64
particle_radius::Float64
Dᵣ::Float64
σ::Float64
ϵ::Float64
interaction_r::Float64
skin_r::Float64
n_steps_before_verlet_list_update::Int64
grid_n::Int64
half_box_len::Float64
grid_box_width::Float64
end
struct RunParams
duration::Float64
snapshot_at::Float64
seed::Int64
n_bundle_snapshots::Int64
integration_steps::Int64
n_steps_before_snapshot::Int64
n_snapshots::Int64
T::Float64
T0::Float64
start_datetime::Dates.DateTime
end
struct SimState
n_bundles::Int64
T::Float64
end
2021-11-26 05:55:27 +00:00
struct Bundle
2021-11-10 14:41:04 +00:00
t::Vector{Float64}
2021-12-07 04:52:10 +00:00
c::Matrix{SVector{2,Float64}}
2021-11-10 14:41:04 +00:00
φ::Matrix{Float64}
2022-01-24 19:43:37 +00:00
n_particles::Int64
n_snapshots::Int64
2021-11-26 05:55:27 +00:00
end
2021-11-10 14:41:04 +00:00
2021-12-10 02:16:18 +00:00
function Bundle(n_particles::Int64, n_snapshots::Int64)
2021-11-26 05:55:27 +00:00
return Bundle(
2021-12-07 04:52:10 +00:00
Vector{Float64}(undef, n_snapshots),
2021-12-10 02:16:18 +00:00
Matrix{SVector{2,Float64}}(undef, (n_particles, n_snapshots)),
Matrix{Float64}(undef, (n_particles, n_snapshots)),
2022-01-24 19:43:37 +00:00
n_particles,
n_snapshots,
2021-11-26 05:55:27 +00:00
)
end
function first_n_snapshots(bundle::Bundle, n::Int64)
2022-01-24 19:43:37 +00:00
return Bundle(bundle.t[1:n], bundle.c[:, 1:n], bundle.φ[:, 1:n], bundle.n_particles, n)
2021-11-10 14:41:04 +00:00
end
2021-11-26 05:55:27 +00:00
function save_snapshot!(
bundle::Bundle, n_snapshot::Int64, t::Float64, particles::Vector{Particle}
)
bundle.t[n_snapshot] = t
2021-11-10 23:24:07 +00:00
@simd for p in particles
2021-12-07 04:52:10 +00:00
bundle.c[p.id, n_snapshot] = p.c
2021-11-10 23:24:07 +00:00
2021-12-07 04:52:10 +00:00
bundle.φ[p.id, n_snapshot] = p.φ
2021-11-10 23:24:07 +00:00
end
2021-11-26 05:55:27 +00:00
return nothing
2021-11-10 23:24:07 +00:00
end
function save_bundle(dir::String, bundle::Bundle, n_bundle::Int64, T::Float64)
2021-12-12 14:29:08 +00:00
bundles_dir = "$dir/bundles"
mkpath(bundles_dir)
2022-01-24 20:27:43 +00:00
JLD2.save_object("$bundles_dir/$n_bundle.jld2", bundle)
2021-12-12 14:29:08 +00:00
JLD2.save_object("$dir/sim_state.jld2", SimState(n_bundle, round(T; digits=3)))
2021-11-17 19:03:07 +00:00
return nothing
2022-01-23 02:04:10 +00:00
end
2022-01-24 19:43:37 +00:00
function sorted_bundle_paths(dir::String; rev::Bool=false)
2022-01-24 20:27:43 +00:00
bundles_dir = "$dir/bundles"
bundle_paths = readdir(bundles_dir; join=true, sort=false)
2022-01-23 02:04:10 +00:00
n_bundles = length(bundle_paths)
bundle_nums = Vector{Int64}(undef, n_bundles)
2022-01-24 20:27:43 +00:00
@simd for bundle_ind in 1:n_bundles
bundle_path = bundle_paths[bundle_ind]
bundle_name = splitdir(bundle_path)[2]
bundle_num_string = splitext(bundle_name)[1]
bundle_nums[bundle_ind] = parse(Int64, bundle_num_string)
2022-01-23 02:04:10 +00:00
end
2022-01-24 19:43:37 +00:00
sort_perm = sortperm(bundle_nums; rev=rev)
2022-01-23 02:04:10 +00:00
return bundle_paths[sort_perm]
2022-01-24 19:43:37 +00:00
end
function append_bundle_properties!(
vs::NTuple{N,Vector},
properties::NTuple{N,Symbol},
sim_dir::String;
particle_slice=nothing,
snapshot_slice,
first_bundle::Int64=1,
) where {N}
bundle_paths = ReCo.sorted_bundle_paths(sim_dir)
2022-01-24 20:27:43 +00:00
for bundle_ind in first_bundle:length(bundle_paths)
bundle::ReCo.Bundle = JLD2.load_object(bundle_paths[bundle_ind])
2022-01-24 19:43:37 +00:00
for (v_ind, v) in enumerat(vs)
property = properties[v_ind]
bundle_property = getproperty(bundle, property)
if !isnothing(particle_slice)
bundle_property_view = view(bundle_property, particle_slice, snapshot_slice)
else
bundle_property_view = view(bundle_property, snapshot_slice)
end
append!(v, bundle_property_view)
end
end
return nothing
2021-11-17 19:03:07 +00:00
end