mirror of
https://gitlab.rlp.net/mobitar/ReCo.jl.git
synced 2024-12-21 00:51:21 +00:00
Added elliptical distance
This commit is contained in:
parent
380c4cc3d5
commit
f446c7fbc3
1 changed files with 29 additions and 3 deletions
32
src/Shape.jl
32
src/Shape.jl
|
@ -1,20 +1,23 @@
|
|||
module Shape
|
||||
|
||||
export center_of_mass, gyration_tensor_eigvals_ratio
|
||||
export center_of_mass,
|
||||
gyration_tensor_eigvals_ratio, gyration_tensor_eigvecs, elliptical_distance
|
||||
|
||||
using StaticArrays: SVector, SMatrix
|
||||
using LinearAlgebra: eigvals, Hermitian
|
||||
using LinearAlgebra: eigvals, eigvecs, Hermitian, dot
|
||||
|
||||
using ..ReCo: Particle, restrict_coordinate, restrict_coordinates
|
||||
|
||||
function project_to_unit_circle(x::Float64, half_box_len::Float64)
|
||||
φ = (x + half_box_len) * π / half_box_len
|
||||
si, co = sincos(φ)
|
||||
|
||||
return SVector(co, si)
|
||||
end
|
||||
|
||||
function project_back_from_unit_circle(θ::T, half_box_len::Float64) where {T<:Real}
|
||||
x = θ * half_box_len / π - half_box_len
|
||||
|
||||
return restrict_coordinate(x, half_box_len)
|
||||
end
|
||||
|
||||
|
@ -87,8 +90,31 @@ function gyration_tensor(particles::Vector{Particle}, half_box_len::Float64)
|
|||
end
|
||||
|
||||
function gyration_tensor_eigvals_ratio(particles::Vector{Particle}, half_box_len::Float64)
|
||||
ev = eigvals(gyration_tensor(particles, half_box_len)) # Eigenvalues are sorted
|
||||
g_tensor = gyration_tensor(particles, half_box_len)
|
||||
ev = eigvals(g_tensor) # Eigenvalues are sorted
|
||||
return ev[1] / ev[2]
|
||||
end
|
||||
|
||||
function gyration_tensor_eigvecs(particles::Vector{Particle}, half_box_len::Float64)
|
||||
g_tensor = gyration_tensor(particles, half_box_len)
|
||||
eig_vecs = eigvecs(g_tensor)
|
||||
|
||||
v1 = eig_vecs[:, 1]
|
||||
v2 = eig_vecs[:, 2]
|
||||
|
||||
return (v1, v2)
|
||||
end
|
||||
|
||||
function elliptical_distance(
|
||||
particle::Particle,
|
||||
gyration_tensor_eigvec_to_smaller_eigval::SVector{2,Float64},
|
||||
gyration_tensor_eigvec_to_bigger_eigval::SVector{2,Float64},
|
||||
goal_gyration_tensor_eigvals_ratio::Float64,
|
||||
)
|
||||
cx′ = dot(particle.c, gyration_tensor_eigvec_to_bigger_eigval)
|
||||
cy′ = dot(particle.c, gyration_tensor_eigvec_to_smaller_eigval)
|
||||
|
||||
return cx′^2 + (cy′ / goal_gyration_tensor_eigvals_ratio)^2
|
||||
end
|
||||
|
||||
end # module
|
Loading…
Reference in a new issue