pub struct Isotropic<E> {
pub interaction: E,
pub r_cut: f64,
}Expand description
Compute isotropic interactions between a pair of sites.
Isotropic provides a single implementation that computes pairwise
interactions that are a function only of the distance between sites. It
fills the gap between traits like SitePairEnergy / SitePairForceAndVirial
which operate on site properties and UnivariateEnergy /
UnivariateForce which is a function only of the separation distance.
Isotropic cuts all interactions off when the distance between sites
is greater than or equal to r_cut:
U_{ij} =
\begin{cases}
U(r_{ij}) & r_{ij} < r_\mathrm{cut} \\
0 & r_{ij} \ge r_\mathrm{cut}
\end{cases}\vec{F_{ij}} =
\begin{cases}
-\frac{\mathrm{d} U}{\mathrm{d} r} \biggr\rvert_{r=r_{ji}} \hat{r}_{ji} & r_{ij} < r_\mathrm{cut} \\
\vec{0} & r_{ij} \ge r_\mathrm{cut}
\end{cases}where $U$ is given by E’s UnivariateEnergy implementation and
$-\frac{\mathrm{d} U}{\mathrm{d} r}$ is given by E’s UnivariateForce
implementation.
Use Isotropic with PairwiseCutoff in MD and MC simulations.
§Example
use approxim::assert_relative_eq;
use hoomd_interaction::{
SitePairEnergy, SitePairForceAndVirial, pairwise::Isotropic,
univariate::LennardJones,
};
use hoomd_microstate::property::Point;
use hoomd_vector::Cartesian;
let a = Point {
position: Cartesian::from([0.0, 0.0]),
};
let b = Point {
position: Cartesian::from([0.0, 2.0 * 2.0_f64.powf(1.0 / 6.0)]),
};
let lennard_jones: LennardJones = LennardJones {
epsilon: 1.5,
sigma: 2.0,
};
let lennard_jones = Isotropic {
interaction: lennard_jones,
r_cut: 2.5,
};
let energy = lennard_jones.site_pair_energy(&a, &b);
let (force_ab, virial_ab) =
lennard_jones.site_pair_force_and_virial(&a, &b);
let (force_ba, virial_ba) =
lennard_jones.site_pair_force_and_virial(&b, &a);
assert_eq!(energy, -1.5);
assert_eq!(force_ab, -force_ba);
assert_relative_eq!(force_ab, Cartesian::from([0.0, 0.0]), epsilon = 1e-14);
Fields§
§interaction: EThe site-site interaction.
r_cut: f64Maximum distance between two interacting sites.
Trait Implementations§
Source§impl<'de, E> Deserialize<'de> for Isotropic<E>where
E: Deserialize<'de>,
impl<'de, E> Deserialize<'de> for Isotropic<E>where
E: Deserialize<'de>,
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl<E> MaximumInteractionRange for Isotropic<E>
impl<E> MaximumInteractionRange for Isotropic<E>
Source§fn maximum_interaction_range(&self) -> f64
fn maximum_interaction_range(&self) -> f64
The maximum interaction range for Isotropic is the given r_cut.
§Example
use hoomd_interaction::{
MaximumInteractionRange, pairwise::Isotropic, univariate::LennardJones,
};
let lennard_jones: LennardJones = LennardJones {
epsilon: 1.5,
sigma: 2.0,
};
let lennard_jones = Isotropic {
interaction: lennard_jones,
r_cut: 2.5,
};
assert_eq!(lennard_jones.maximum_interaction_range(), 2.5);Source§impl<P, S, E> SitePairEnergy<S> for Isotropic<E>
impl<P, S, E> SitePairEnergy<S> for Isotropic<E>
Source§fn site_pair_energy(&self, site_properties_i: &S, site_properties_j: &S) -> f64
fn site_pair_energy(&self, site_properties_i: &S, site_properties_j: &S) -> f64
Compute the energy contribution from a pair of sites.
U_{ij} =
\begin{cases}
U(r_{ij}) & r_{ij} < r_\mathrm{cut} \\
0 & r_{ij} \ge r_\mathrm{cut}
\end{cases}where $U$ is given by E’s UnivariateEnergy implementation.
§Example
use approxim::assert_relative_eq;
use hoomd_interaction::{
SitePairEnergy, pairwise::Isotropic, univariate::LennardJones,
};
use hoomd_microstate::property::Point;
use hoomd_vector::Cartesian;
let a = Point {
position: Cartesian::from([0.0, 0.0]),
};
let b = Point {
position: Cartesian::from([0.0, 2.0 * 2.0_f64.powf(1.0 / 6.0)]),
};
let lennard_jones: LennardJones = LennardJones {
epsilon: 1.5,
sigma: 2.0,
};
let lennard_jones = Isotropic {
interaction: lennard_jones,
r_cut: 2.5,
};
let energy = lennard_jones.site_pair_energy(&a, &b);
assert_eq!(energy, -1.5);
Source§fn site_pair_energy_initial(
&self,
site_properties_i: &S,
site_properties_j: &S,
) -> f64
fn site_pair_energy_initial( &self, site_properties_i: &S, site_properties_j: &S, ) -> f64
Source§fn is_only_infinite_or_zero() -> bool
fn is_only_infinite_or_zero() -> bool
Source§impl<V, S, E> SitePairForceAndVirial<S> for Isotropic<E>where
V: Default + InnerProduct + Outer,
S: Position<Position = V>,
E: UnivariateForce,
V::Tensor: Default,
impl<V, S, E> SitePairForceAndVirial<S> for Isotropic<E>where
V: Default + InnerProduct + Outer,
S: Position<Position = V>,
E: UnivariateForce,
V::Tensor: Default,
Source§fn site_pair_force_and_virial(
&self,
site_properties_i: &S,
site_properties_j: &S,
) -> (Self::Force, <Self::Force as Outer>::Tensor)
fn site_pair_force_and_virial( &self, site_properties_i: &S, site_properties_j: &S, ) -> (Self::Force, <Self::Force as Outer>::Tensor)
Evaluate the force and virial on site i caused by site j.
Isotropic forces always act along the radial direction:
\vec{F_{ij}} =
\begin{cases}
-\frac{\mathrm{d} U}{\mathrm{d} r} \biggr\rvert_{r=r_{ji}} \hat{r}_{ji} & r_{ij} < r_\mathrm{cut} \\
\vec{0} & r_{ij} \ge r_\mathrm{cut}
\end{cases}where $-\frac{\mathrm{d} U}{\mathrm{d} r}$ is given by E’s UnivariateForce
implementation.
§Example
use approxim::assert_relative_eq;
use hoomd_interaction::{
SitePairForceAndVirial, pairwise::Isotropic, univariate::LennardJones,
};
use hoomd_microstate::property::Point;
use hoomd_vector::Cartesian;
let a = Point {
position: Cartesian::from([0.0, 0.0]),
};
let b = Point {
position: Cartesian::from([0.0, 2.0 * 2.0_f64.powf(1.0 / 6.0)]),
};
let lennard_jones: LennardJones = LennardJones {
epsilon: 1.5,
sigma: 2.0,
};
let lennard_jones = Isotropic {
interaction: lennard_jones,
r_cut: 2.5,
};
let (force_ab, virial_ab) =
lennard_jones.site_pair_force_and_virial(&a, &b);
let (force_ba, virial_ba) =
lennard_jones.site_pair_force_and_virial(&b, &a);
assert_eq!(force_ab, -force_ba);
assert_relative_eq!(force_ab, Cartesian::from([0.0, 0.0]), epsilon = 1e-14);Source§impl<V, S, E> SitePairForceVirialAndTorque<S> for Isotropic<E>where
V: Default + InnerProduct + Wedge + Outer,
V::Bivector: Default,
S: Position<Position = V>,
E: UnivariateForce,
V::Tensor: Default,
impl<V, S, E> SitePairForceVirialAndTorque<S> for Isotropic<E>where
V: Default + InnerProduct + Wedge + Outer,
V::Bivector: Default,
S: Position<Position = V>,
E: UnivariateForce,
V::Tensor: Default,
Source§fn site_pair_force_virial_and_torque(
&self,
site_properties_i: &S,
site_properties_j: &S,
) -> (V, <Self::Force as Outer>::Tensor, V::Bivector)
fn site_pair_force_virial_and_torque( &self, site_properties_i: &S, site_properties_j: &S, ) -> (V, <Self::Force as Outer>::Tensor, V::Bivector)
Evaluate the force, virial, and torque on site i caused by site j.
Isotropic forces always act along the radial direction:
\vec{F_{ij}} =
\begin{cases}
-\frac{\mathrm{d} U}{\mathrm{d} r} \biggr\rvert_{r=r_{ji}} \hat{r}_{ji} & r_{ij} < r_\mathrm{cut} \\
\vec{0} & r_{ij} \ge r_\mathrm{cut}
\end{cases}where $-\frac{\mathrm{d} U}{\mathrm{d} r}$ is given by E’s UnivariateForce
implementation.
Radial forces produce zero torque.
impl<E> StructuralPartialEq for Isotropic<E>
Auto Trait Implementations§
impl<E> Freeze for Isotropic<E>where
E: Freeze,
impl<E> RefUnwindSafe for Isotropic<E>where
E: RefUnwindSafe,
impl<E> Send for Isotropic<E>where
E: Send,
impl<E> Sync for Isotropic<E>where
E: Sync,
impl<E> Unpin for Isotropic<E>where
E: Unpin,
impl<E> UnsafeUnpin for Isotropic<E>where
E: UnsafeUnpin,
impl<E> UnwindSafe for Isotropic<E>where
E: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more