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

Fix animation

This commit is contained in:
Mo 2022-09-25 23:34:38 +02:00
parent ce7ce0a731
commit 615cccb46c
6 changed files with 206 additions and 186 deletions

View file

@ -1190,7 +1190,7 @@ version = "0.4.3"
[[deps.ReCo]] [[deps.ReCo]]
deps = ["CellListMap", "Dates", "Distributions", "Flux", "Intervals", "JLD2", "LaTeXStrings", "LinearAlgebra", "ProgressMeter", "Random", "ReinforcementLearning", "StaticArrays", "UnicodePlots"] deps = ["CellListMap", "Dates", "Distributions", "Flux", "Intervals", "JLD2", "LaTeXStrings", "LinearAlgebra", "ProgressMeter", "Random", "ReinforcementLearning", "StaticArrays", "UnicodePlots"]
git-tree-sha1 = "7b7f1cf73718423fa293397ce7796055549a0686" git-tree-sha1 = "50559f3f3d0a26055675cd78776b8bafe1bada3a"
repo-rev = "main" repo-rev = "main"
repo-url = ".." repo-url = ".."
uuid = "b25f7548-fcc9-4c91-bc24-841b54f4dd54" uuid = "b25f7548-fcc9-4c91-bc24-841b54f4dd54"

View file

@ -1149,7 +1149,7 @@ version = "0.4.3"
[[deps.ReCo]] [[deps.ReCo]]
deps = ["CellListMap", "Dates", "Distributions", "Flux", "Intervals", "JLD2", "LaTeXStrings", "LinearAlgebra", "ProgressMeter", "Random", "ReinforcementLearning", "StaticArrays", "UnicodePlots"] deps = ["CellListMap", "Dates", "Distributions", "Flux", "Intervals", "JLD2", "LaTeXStrings", "LinearAlgebra", "ProgressMeter", "Random", "ReinforcementLearning", "StaticArrays", "UnicodePlots"]
git-tree-sha1 = "7b7f1cf73718423fa293397ce7796055549a0686" git-tree-sha1 = "50559f3f3d0a26055675cd78776b8bafe1bada3a"
repo-rev = "main" repo-rev = "main"
repo-url = "../.." repo-url = "../.."
uuid = "b25f7548-fcc9-4c91-bc24-841b54f4dd54" uuid = "b25f7548-fcc9-4c91-bc24-841b54f4dd54"

View file

@ -944,7 +944,7 @@ version = "1.5.3"
[[deps.ReCo]] [[deps.ReCo]]
deps = ["CellListMap", "Dates", "Distributions", "Flux", "Intervals", "JLD2", "LaTeXStrings", "LinearAlgebra", "ProgressMeter", "Random", "ReinforcementLearning", "StaticArrays", "UnicodePlots"] deps = ["CellListMap", "Dates", "Distributions", "Flux", "Intervals", "JLD2", "LaTeXStrings", "LinearAlgebra", "ProgressMeter", "Random", "ReinforcementLearning", "StaticArrays", "UnicodePlots"]
git-tree-sha1 = "7b7f1cf73718423fa293397ce7796055549a0686" git-tree-sha1 = "50559f3f3d0a26055675cd78776b8bafe1bada3a"
repo-rev = "main" repo-rev = "main"
repo-url = "../.." repo-url = "../.."
uuid = "b25f7548-fcc9-4c91-bc24-841b54f4dd54" uuid = "b25f7548-fcc9-4c91-bc24-841b54f4dd54"

View file

@ -978,7 +978,7 @@ version = "1.5.3"
[[deps.ReCo]] [[deps.ReCo]]
deps = ["CellListMap", "Dates", "Distributions", "Flux", "Intervals", "JLD2", "LaTeXStrings", "LinearAlgebra", "ProgressMeter", "Random", "ReinforcementLearning", "StaticArrays", "UnicodePlots"] deps = ["CellListMap", "Dates", "Distributions", "Flux", "Intervals", "JLD2", "LaTeXStrings", "LinearAlgebra", "ProgressMeter", "Random", "ReinforcementLearning", "StaticArrays", "UnicodePlots"]
git-tree-sha1 = "7b7f1cf73718423fa293397ce7796055549a0686" git-tree-sha1 = "50559f3f3d0a26055675cd78776b8bafe1bada3a"
repo-rev = "main" repo-rev = "main"
repo-url = ".." repo-url = ".."
uuid = "b25f7548-fcc9-4c91-bc24-841b54f4dd54" uuid = "b25f7548-fcc9-4c91-bc24-841b54f4dd54"

View file

@ -2,10 +2,11 @@ module Animation
export animate export animate
using GLMakie
using ColorSchemes: ColorSchemes using ColorSchemes: ColorSchemes
using LaTeXStrings: @L_str using GLMakie
using JLD2: JLD2 using JLD2: JLD2
using LaTeXStrings: @L_str
using Observables: Observables
using ProgressMeter: ProgressMeter using ProgressMeter: ProgressMeter
using ReCo: ReCo using ReCo: ReCo
@ -19,15 +20,12 @@ const DEFAULT_SHOW_SKIN_CIRCLE = false
const DEFAULT_SHOW_FRAME_DIFF = false const DEFAULT_SHOW_FRAME_DIFF = false
const DEFAULT_SHOW_PROGRESS = false const DEFAULT_SHOW_PROGRESS = false
function animate_bundle!(args, sim_consts::ReCo.SimConsts) function update_values!(
bundle_t = args.bundle.t args, sim_consts::ReCo.SimConsts, bundle::ReCo.Bundle, bundle_snapshot::Integer
bundle_c = args.bundle.c )
bundle_φ = args.bundle.φ
for bundle_snapshot in 1:length(bundle_t)
@simd for particle_ind in 1:(sim_consts.n_particles) @simd for particle_ind in 1:(sim_consts.n_particles)
c = bundle_c[particle_ind, bundle_snapshot] c = bundle.c[particle_ind, bundle_snapshot]
φ = bundle_φ[particle_ind, bundle_snapshot] φ = bundle.φ[particle_ind, bundle_snapshot]
args.particle_xs[][particle_ind] = c[1] args.particle_xs[][particle_ind] = c[1]
args.particle_ys[][particle_ind] = c[2] args.particle_ys[][particle_ind] = c[2]
@ -44,16 +42,37 @@ function animate_bundle!(args, sim_consts::ReCo.SimConsts)
if args.show_skin_circle if args.show_skin_circle
args.skin_colors[][particle_ind] = ColorSchemes.ColorTypes.RGBA(color, 0.04) args.skin_colors[][particle_ind] = ColorSchemes.ColorTypes.RGBA(color, 0.04)
end end
if args.show_frame_diff
first_ind = 2 * particle_ind - 1
second_ind = 2 * particle_ind
first_bundle_snapshot = bundle_snapshot - 1
second_bundle_snapshot = bundle_snapshot
if bundle_snapshot == 1
first_bundle_snapshot = 1
end
args.segment_xs[][first_ind] = bundle.c[particle_ind, first_bundle_snapshot][1]
args.segment_xs[][second_ind] = bundle.c[particle_ind, second_bundle_snapshot][1]
args.segment_ys[][first_ind] = bundle.c[particle_ind, first_bundle_snapshot][2]
args.segment_ys[][second_ind] = bundle.c[particle_ind, second_bundle_snapshot][2]
end
end end
if args.show_center_of_mass if args.show_center_of_mass
center_of_mass = ReCo.center_of_mass( center_of_mass = ReCo.center_of_mass(
view(bundle_c, :, bundle_snapshot), sim_consts.half_box_len view(bundle.c, :, bundle_snapshot), sim_consts.half_box_len
) )
args.center_of_mass_point[] = Point(center_of_mass) args.center_of_mass_point[] = Point(center_of_mass)
end end
end
function init_animation(args, sim_consts::ReCo.SimConsts, first_bundle::ReCo.Bundle)
update_values!(args, sim_consts, first_bundle, 1)
if args.n_bundle == 1 && bundle_snapshot == 1
scatter!( scatter!(
args.ax, args.ax,
args.particle_xs, args.particle_xs,
@ -95,54 +114,49 @@ function animate_bundle!(args, sim_consts::ReCo.SimConsts)
) )
end end
println("Recording started!") if args.show_frame_diff
else linesegments!(args.ax, args.segment_xs, args.segment_ys; color=args.particle_colors)
if args.show_frame_diff && bundle_snapshot > 1
@simd for i in 1:(sim_consts.n_particles)
first_ind = 2 * i - 1
second_ind = 2 * i
frame_min_1 = bundle_snapshot - 1
args.segment_xs[][first_ind] = bundle_c[i, frame_min_1][1]
args.segment_xs[][second_ind] = bundle_c[i, bundle_snapshot][1]
args.segment_ys[][first_ind] = bundle_c[i, frame_min_1][2]
args.segment_ys[][second_ind] = bundle_c[i, bundle_snapshot][2]
end end
if bundle_snapshot == 2 return nothing
linesegments!( end
args.ax,
args.segment_xs, function animate_bundle!(
args.segment_ys; args,
color=args.particle_colors, sim_consts::ReCo.SimConsts,
io,
bundle::ReCo.Bundle,
skip_first_bundle_snapshot::Bool,
) )
for bundle_snapshot in 1:length(bundle.t)
if !skip_first_bundle_snapshot
update_values!(args, sim_consts, bundle, bundle_snapshot)
if args.show_frame_diff
Observables.notify(args.segment_xs)
Observables.notify(args.segment_ys)
end end
notify(args.segment_xs) Observables.notify(args.particle_xs)
notify(args.segment_ys) Observables.notify(args.particle_ys)
end Observables.notify(args.particle_colors)
notify(args.particle_xs)
notify(args.particle_ys)
notify(args.particle_colors)
if args.show_center_of_mass if args.show_center_of_mass
notify(args.center_of_mass_point) Observables.notify(args.center_of_mass_point)
end end
if args.show_interaction_circle if args.show_interaction_circle
notify(args.interaction_colors) Observables.notify(args.interaction_colors)
end end
if args.show_skin_circle if args.show_skin_circle
notify(args.skin_colors) Observables.notify(args.skin_colors)
end end
end end
args.ax.title = "t = $(round(bundle_t[bundle_snapshot], digits=3))" args.ax.title = "t = $(round(bundle.t[bundle_snapshot], digits=3))"
recordframe!(args.io) recordframe!(io)
end end
return nothing return nothing
@ -190,7 +204,6 @@ function animate(
animation_path = "$sim_dir/animation.mkv" animation_path = "$sim_dir/animation.mkv"
record(fig, animation_path; framerate=framerate) do io
particle_xs = Observable(Vector{Float64}(undef, n_particles)) particle_xs = Observable(Vector{Float64}(undef, n_particles))
particle_ys = Observable(Vector{Float64}(undef, n_particles)) particle_ys = Observable(Vector{Float64}(undef, n_particles))
@ -233,15 +246,6 @@ function animate(
segment_ys = Observable(zeros(Float64, 2 * n_particles)) segment_ys = Observable(zeros(Float64, 2 * n_particles))
end end
bundle_paths = ReCo.sorted_bundle_paths(sim_dir)
progress = ProgressMeter.Progress(
length(bundle_paths); dt=2, enabled=show_progress, desc="Animation: "
)
for (n_bundle, bundle_path) in enumerate(bundle_paths)
bundle::ReCo.Bundle = JLD2.load_object(bundle_path)
args = (; args = (;
# Input # Input
show_center_of_mass, show_center_of_mass,
@ -249,9 +253,7 @@ function animate(
show_skin_circle, show_skin_circle,
show_frame_diff, show_frame_diff,
# Internal # Internal
io,
ax, ax,
bundle,
particle_xs, particle_xs,
particle_ys, particle_ys,
particle_colors, particle_colors,
@ -265,10 +267,28 @@ function animate(
interaction_colors, interaction_colors,
skin_colors, skin_colors,
color_scheme, color_scheme,
n_bundle,
) )
animate_bundle!(args, sim_consts) bundle_paths = ReCo.sorted_bundle_paths(sim_dir)
bundle::ReCo.Bundle = JLD2.load_object(bundle_paths[1])
init_animation(args, sim_consts, bundle)
progress = ProgressMeter.Progress(
length(bundle_paths); dt=2, enabled=show_progress, desc="Animation: "
)
record(fig, animation_path; framerate=framerate) do io
println("Started recording!")
for (n_bundle, bundle_path) in enumerate(bundle_paths)
if n_bundle != 1
bundle = JLD2.load_object(bundle_path)
end
skip_first_bundle_snapshot = n_bundle == 1
animate_bundle!(args, sim_consts, io, bundle, skip_first_bundle_snapshot)
ProgressMeter.next!(progress) ProgressMeter.next!(progress)
end end

View file

@ -1185,7 +1185,7 @@ version = "0.4.3"
[[deps.ReCo]] [[deps.ReCo]]
deps = ["CellListMap", "Dates", "Distributions", "Flux", "Intervals", "JLD2", "LaTeXStrings", "LinearAlgebra", "ProgressMeter", "Random", "ReinforcementLearning", "StaticArrays", "UnicodePlots"] deps = ["CellListMap", "Dates", "Distributions", "Flux", "Intervals", "JLD2", "LaTeXStrings", "LinearAlgebra", "ProgressMeter", "Random", "ReinforcementLearning", "StaticArrays", "UnicodePlots"]
git-tree-sha1 = "7b7f1cf73718423fa293397ce7796055549a0686" git-tree-sha1 = "50559f3f3d0a26055675cd78776b8bafe1bada3a"
repo-rev = "main" repo-rev = "main"
repo-url = ".." repo-url = ".."
uuid = "b25f7548-fcc9-4c91-bc24-841b54f4dd54" uuid = "b25f7548-fcc9-4c91-bc24-841b54f4dd54"