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/Particle.jl

68 lines
1.5 KiB
Julia
Raw Normal View History

2021-12-02 22:13:54 +00:00
using StaticArrays: SVector
using LoopVectorization: @turbo
2021-11-10 14:41:04 +00:00
mutable struct Particle
id::Int64
2021-11-26 02:35:39 +00:00
2021-11-10 14:41:04 +00:00
c::Vector{Float64} # Center
tmp_c::Vector{Float64} # Temporary center
φ::Float64 # Angle
2021-11-26 02:35:39 +00:00
function Particle(; id::Int64, c::Vector{Float64}, φ::Float64)
2021-12-03 03:32:43 +00:00
return new(id, c, copy(c), φ)
2021-11-10 14:41:04 +00:00
end
end
function restrict_coordinate(value::Float64; l::Float64)
if value < -l
value += 2 * l
elseif value >= l
value -= 2 * l
end
return value
end
function restrict_coordinates!(p::Particle; l::Float64)
@simd for i in 1:2
p.tmp_c[i] = restrict_coordinate(p.tmp_c[i]; l=l)
end
return nothing
end
function minimum_image_coordinate(value::Float64; l::Float64)
if value <= -l
value += 2 * l
elseif value > l
value -= 2 * l
end
return value
end
function minimum_image(v::SVector{2,Float64}; l::Float64)
2021-11-17 18:47:05 +00:00
return SVector(minimum_image_coordinate(v[1]; l=l), minimum_image_coordinate(v[2]; l=l))
2021-11-10 14:41:04 +00:00
end
function are_overlapping(p1::Particle, p2::Particle, overlapping_r²::Float64, l::Float64)
2021-11-17 18:47:05 +00:00
r⃗₁₂ = SVector(p2.c[1] - p1.c[1], p2.c[2] - p1.c[2]) # 1 -> 2
2021-11-10 14:41:04 +00:00
r⃗₁₂ = minimum_image(r⃗₁₂; l=l)
distance² = r⃗₁₂[1]^2 + r⃗₁₂[2]^2
2021-11-17 18:47:05 +00:00
overlapping = distance² < overlapping_r²
return (; overlapping, r⃗₁₂, distance²)
2021-11-10 14:41:04 +00:00
end
function update!(p::Particle)
2021-11-19 00:21:41 +00:00
@turbo for i in 1:2
2021-11-10 14:41:04 +00:00
p.c[i] = p.tmp_c[i]
end
2021-11-19 00:21:41 +00:00
return nothing
2021-11-17 18:47:05 +00:00
end