use crate::{
math::{Scalar, ScalarList},
physics::molecular::potential::Potential,
};
#[derive(Clone, Debug)]
pub struct Harmonic {
pub rest_length: Scalar,
pub stiffness: Scalar,
}
impl Potential for Harmonic {
fn energy(&self, length: Scalar) -> Scalar {
0.5 * self.stiffness * (length - self.rest_length).powi(2)
}
fn force(&self, length: Scalar) -> Scalar {
self.stiffness * (length - self.rest_length)
}
fn forces_at_energy(&self, energy: Scalar) -> ScalarList<2> {
let force = (2.0 * self.stiffness * energy).sqrt();
[force, -force].into()
}
fn stiffness(&self, _length: Scalar) -> Scalar {
self.stiffness
}
fn anharmonicity(&self, _length: Scalar) -> Scalar {
0.0
}
fn extension(&self, force: Scalar) -> Scalar {
force / self.stiffness
}
fn extensions_at_energy(&self, energy: Scalar) -> ScalarList<2> {
let extension = (2.0 * energy / self.stiffness).sqrt();
[extension, -extension].into()
}
fn compliance(&self, _force: Scalar) -> Scalar {
1.0 / self.stiffness
}
fn peak(&self) -> Scalar {
Scalar::INFINITY
}
fn peak_force(&self) -> Scalar {
Scalar::INFINITY
}
fn rest_length(&self) -> Scalar {
self.rest_length
}
}