use serde::{Deserialize, Serialize};
use super::AnisotropicEnergy;
use crate::{MaximumInteractionRange, SitePairEnergy};
use hoomd_microstate::property::{Orientation, Position};
use hoomd_vector::{Rotate, Rotation, Vector};
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct Anisotropic<E> {
pub interaction: E,
pub r_cut: f64,
}
impl<P, R, S, E> SitePairEnergy<S> for Anisotropic<E>
where
S: Position<Position = P> + Orientation<Rotation = R>,
P: Vector,
R: Rotation + Rotate<P>,
E: AnisotropicEnergy<P, R>,
{
#[inline]
fn site_pair_energy(&self, site_properties_i: &S, site_properties_j: &S) -> f64 {
let r = site_properties_i
.position()
.distance(site_properties_j.position());
if r >= self.r_cut {
return 0.0;
}
let (r_ab, o_ab) = hoomd_vector::pair_system_to_local(
site_properties_i.position(),
site_properties_i.orientation(),
site_properties_j.position(),
site_properties_j.orientation(),
);
self.interaction.energy(&r_ab, &o_ab)
}
}
impl<E> MaximumInteractionRange for Anisotropic<E> {
#[inline]
fn maximum_interaction_range(&self) -> f64 {
self.r_cut
}
}