conspire/physics/molecular/potential/harmonic/
mod.rs1use crate::{
2 math::{Quantity, Scalar},
3 physics::molecular::potential::Potential,
4 units::{Energy, Force, ForcePerLength, Length, ReciprocalForcePerLength, Stress},
5};
6
7#[derive(Clone, Debug)]
9pub struct Harmonic {
10 pub rest_length: Scalar,
12 pub stiffness: Scalar,
14}
15
16impl Potential for Harmonic {
17 fn energy(&self, length: Quantity<Length>) -> Quantity<Energy> {
21 let delta = length - self.rest_length();
22 0.5 * self.stiffness_quantity() * (delta * delta)
23 }
24 fn force(&self, length: Quantity<Length>) -> Quantity<Force> {
28 self.stiffness_quantity() * (length - self.rest_length())
29 }
30 fn forces_at_energy(&self, energy: Quantity<Energy>) -> [Quantity<Force>; 2] {
34 let force = Quantity::new((2.0 * self.stiffness * energy.value()).sqrt());
35 [force, -force]
36 }
37 fn stiffness(&self, _length: Quantity<Length>) -> Quantity<ForcePerLength> {
41 self.stiffness_quantity()
42 }
43 fn anharmonicity(&self, _length: Quantity<Length>) -> Quantity<Stress> {
47 Quantity::new(0.0)
48 }
49 fn extension(&self, force: Quantity<Force>) -> Quantity<Length> {
53 force / self.stiffness_quantity()
54 }
55 fn extensions_at_energy(&self, energy: Quantity<Energy>) -> [Quantity<Length>; 2] {
59 let extension = Quantity::new((2.0 * energy.value() / self.stiffness).sqrt());
60 [extension, -extension]
61 }
62 fn compliance(&self, _force: Quantity<Force>) -> Quantity<ReciprocalForcePerLength> {
66 1.0 / self.stiffness_quantity()
67 }
68 fn peak(&self) -> Quantity<Length> {
72 Quantity::new(Scalar::INFINITY)
73 }
74 fn peak_force(&self) -> Quantity<Force> {
78 Quantity::new(Scalar::INFINITY)
79 }
80 fn rest_length(&self) -> Quantity<Length> {
84 Quantity::new(self.rest_length)
85 }
86}
87
88impl Harmonic {
89 fn stiffness_quantity(&self) -> Quantity<ForcePerLength> {
91 Quantity::new(self.stiffness)
92 }
93}