From d7ad9c3354555746a22d489ae01c62ecb41ca79d Mon Sep 17 00:00:00 2001 From: MoBit Date: Thu, 2 Dec 2021 23:13:54 +0100 Subject: [PATCH] Center of mass graphics --- Project.toml | 11 ++++ README.md | 3 + graphics/center_of_mass.jl | 129 +++++++++++++++++++++++++++++++++++++ src/Particle.jl | 3 + src/ReCo.jl | 35 +++------- src/animation.jl | 5 +- src/data.jl | 4 ++ src/run.jl | 3 + src/setup.jl | 4 ++ src/simulation.jl | 8 ++- 10 files changed, 178 insertions(+), 27 deletions(-) create mode 100644 README.md create mode 100644 graphics/center_of_mass.jl diff --git a/Project.toml b/Project.toml index da1455e..50f05e9 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,13 @@ +name = "ReCo" +uuid = "b25f7548-fcc9-4c91-bc24-841b54f4dd54" +authors = ["MoBit "] +version = "0.1.0" + [deps] BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" ColorSchemes = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" GLMakie = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a" JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" @@ -9,8 +15,13 @@ JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" JuliaFormatter = "98e50ef6-434e-11e9-1051-2b60c6c9e899" LaTeXStrings = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" LoopVectorization = "bdcacae8-1622-11e9-2a5c-532679323890" +Luxor = "ae8d54c2-7ccd-5906-9d76-62fc9837b5bc" ProfileView = "c46f51b8-102a-5cf2-8d2c-8597cb0e0da7" ProgressMeter = "92933f4c-e287-5a05-a399-4b506db050ca" +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" ReinforcementLearning = "158674fc-8238-5cab-b5ba-03dfc80d1318" Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[compat] +julia = "1.6" diff --git a/README.md b/README.md new file mode 100644 index 0000000..35fc46f --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# ReCo + +[![Code Style: Blue](https://img.shields.io/badge/code%20style-blue-4495d1.svg)](https://github.com/invenia/BlueStyle) diff --git a/graphics/center_of_mass.jl b/graphics/center_of_mass.jl new file mode 100644 index 0000000..628b00b --- /dev/null +++ b/graphics/center_of_mass.jl @@ -0,0 +1,129 @@ +using Luxor +using StaticArrays + +using ReCo: restrict_coordinate + +## + +function project(x, L) + φ = (x + L) * π / L + return Point(cos(φ), -sin(φ)) +end + +function project_back(θ, L) + return θ * L / π - L +end + +## + +box_length = 100 +box_height = 100 + +L = 0.35 * box_length + +R = 0.35 * box_length + +A = -0.9 * L +B = 0.65 * L +pr = 0.03 * L + +Ap = project(A, L) +Bp = project(B, L) + +M = R * ((Ap + Bp) / 2) + +θ = atan(-M[2], M[1]) + +COM = restrict_coordinate(project_back(θ, L); l=L) +COMp = R * Point(cos(θ), -sin(θ)) + +## + +graphics_export_dir = "exports/graphics" +mkpath(graphics_export_dir) + +Drawing(box_length, box_height, "$graphics_export_dir/line.pdf") +origin() + +setcolor("black") +arrow(Point(-1.1 * L, 0), Point(1.2 * L, 0); arrowheadlength=0.1 * L, linewidth=0.8) + +green_orange = blend(Point(-1.5 * L, 0), Point(1.5 * L, 0)) +addstop(green_orange, 0.0, "orange") +addstop(green_orange, (L) / (3 * L), "green") +addstop(green_orange, (2 * L) / (3 * L), "orange") +addstop(green_orange, 1.0, "green") +setblend(green_orange) +setline(0.8) +line(Point(-L, 0), Point(L, 0), :stroke) + +setcolor("red") +setline(0.5) +for x in SVector(-L, L) + line(Point(x, 0.05 * L), Point(x, -0.05 * L), :stroke) +end + +setcolor("cyan3") +line(Point(0, 0.05 * L), Point(0, -0.05 * L), :stroke) + +setcolor("blue") +for p in SVector(A, B) + circle(Point(p, 0), pr, :fill) +end + +setcolor("brown") +circle(Point(COM, 0), pr, :fill) + +setcolor("black") +fontsize(5) +text("x", Point(1.2 * L, 0.035 * L)) +text("-L", Point(-L - 0.08 * L, 0.18 * L)) +text("0", Point(0 - 0.035 * L, 0.18 * L)) +text("+L", Point(L - 0.08 * L, 0.18 * L)) +text("A", Point(A - 0.04 * L, -0.06 * L)) +text("B", Point(B - 0.04 * L, -0.06 * L)) +text("COM", Point(COM - 0.125 * L, -0.06 * L)) + +finish() + +## + +Drawing(box_length, box_height, "$graphics_export_dir/circle.pdf") +origin() + +arrow(Point(-1.2 * R, 0), Point(1.2 * R, 0); arrowheadlength=0.1 * R, linewidth=0.8) +arrow(Point(0, 1.2 * R), Point(0, -1.2 * R); arrowheadlength=0.1 * R, linewidth=0.8) + +setcolor("black") +fontsize(5) +text("α", Point(1.22 * R, 0.035 * R)) +text("β", Point(-0.04 * R, -1.23 * R)) + +orange_green = blend(Point(0, -R), Point(0, R), "green", "orange") +setblend(orange_green) +setline(0.8) +circle(Point(0, 0), R, :stroke) + +setcolor("red") +setline(0.5) +line(Point(1.05 * R, 0), Point(0.95 * R, 0), :stroke) +setcolor("cyan3") +line(Point(-1.05 * R, 0), Point(-0.95 * R, 0), :stroke) + +setcolor("blue") +for pp in SVector(Ap, Bp) + circle(R * pp, pr, :fill) +end + +setcolor("black") +setdash("dot") +line(R * Ap, R * Bp, :stroke) +line(Point(0, 0), COMp, :stroke) + +setcolor("purple1") +circle(M, pr, :fill) + +setcolor("brown") +circle(COMp, pr, :fill) + +finish() \ No newline at end of file diff --git a/src/Particle.jl b/src/Particle.jl index 5267825..be0d9d2 100644 --- a/src/Particle.jl +++ b/src/Particle.jl @@ -1,3 +1,6 @@ +using StaticArrays: SVector +using LoopVectorization: @turbo + mutable struct Particle id::Int64 diff --git a/src/ReCo.jl b/src/ReCo.jl index 48333b3..d62d12f 100644 --- a/src/ReCo.jl +++ b/src/ReCo.jl @@ -1,28 +1,13 @@ -using Pkg -Pkg.activate(".") +module ReCo -using Random, Distributions -using ProgressMeter -using GLMakie, ColorSchemes, LaTeXStrings -using StaticArrays -using LoopVectorization: @turbo, @tturbo -using JLD2: JLD2 -using JSON3: JSON3 +export init_sim, run_sim -import Dates: now, CompoundPeriod, canonicalize -import Base: push!, iterate, wait - -# BEGIN dev deps -using Revise -using BenchmarkTools -# END - -set_theme!(theme_black()) - -includet("PreVector.jl") -includet("Particle.jl") -includet("setup.jl") -includet("simulation.jl") -includet("data.jl") +include("PreVector.jl") +include("Particle.jl") +include("setup.jl") +include("simulation.jl") +include("data.jl") # includet("animation.jl") -includet("run.jl") \ No newline at end of file +include("run.jl") + +end # module \ No newline at end of file diff --git a/src/animation.jl b/src/animation.jl index 5572321..5144991 100644 --- a/src/animation.jl +++ b/src/animation.jl @@ -1,4 +1,7 @@ -function animate(directory::String, sol::Solution, variables; framerate=0) +using GLMakie, ColorSchemes +using LaTeXStrings: @L_str + +function animate(dir::String; framerate=0) println("Generating animation...") fig = Figure(; resolution=(1080, 1080)) diff --git a/src/data.jl b/src/data.jl index 320a02a..ecd2bf6 100644 --- a/src/data.jl +++ b/src/data.jl @@ -1,3 +1,7 @@ +using StaticArrays: SVector +using LoopVectorization: @turbo +using JLD2: JLD2 + struct Bundle t::Vector{Float64} c::Matrix{Vector{Float64}} diff --git a/src/run.jl b/src/run.jl index 108733f..4f8696e 100644 --- a/src/run.jl +++ b/src/run.jl @@ -1,3 +1,6 @@ +using Random: Random +using JSON3: JSON3 + function run_sim( dir::String; duration::Float64, diff --git a/src/setup.jl b/src/setup.jl index 4e26d5a..d1f724f 100644 --- a/src/setup.jl +++ b/src/setup.jl @@ -1,3 +1,7 @@ +using Distributions: Uniform +using Dates: now +using JSON3: JSON3 + function initial_particle_grid_pos(i, j; grid_box_width, l) term = -0.5 * grid_box_width - l return [k * grid_box_width + term for k in (i, j)] diff --git a/src/simulation.jl b/src/simulation.jl index f6c9085..2a85a77 100644 --- a/src/simulation.jl +++ b/src/simulation.jl @@ -1,3 +1,9 @@ +using ProgressMeter: @showprogress +using LoopVectorization: @turbo +using Distributions: Normal +using Dates: Dates, now +import Base: wait + rand_normal01() = rand(Normal(0, 1)) function update_verlet_list!(args) @@ -115,7 +121,7 @@ function simulate( end end_time = now() - elapsed_time = canonicalize(CompoundPeriod(end_time - start_time)) + elapsed_time = Dates.canonicalize(Dates.CompoundPeriod(end_time - start_time)) println("Simulation done at $end_time and took $elapsed_time.") return nothing