conspire/physics/molecular/potential/harmonic/
mod.rs1use crate::{
2 math::{Scalar, ScalarList},
3 physics::molecular::potential::Potential,
4};
5
6#[derive(Clone, Debug)]
8pub struct Harmonic {
9 pub rest_length: Scalar,
11 pub stiffness: Scalar,
13}
14
15impl Potential for Harmonic {
16 fn energy(&self, length: Scalar) -> Scalar {
20 0.5 * self.stiffness * (length - self.rest_length).powi(2)
21 }
22 fn force(&self, length: Scalar) -> Scalar {
26 self.stiffness * (length - self.rest_length)
27 }
28 fn forces_at_energy(&self, energy: Scalar) -> ScalarList<2> {
32 let force = (2.0 * self.stiffness * energy).sqrt();
33 [force, -force].into()
34 }
35 fn stiffness(&self, _length: Scalar) -> Scalar {
39 self.stiffness
40 }
41 fn anharmonicity(&self, _length: Scalar) -> Scalar {
45 0.0
46 }
47 fn extension(&self, force: Scalar) -> Scalar {
51 force / self.stiffness
52 }
53 fn extensions_at_energy(&self, energy: Scalar) -> ScalarList<2> {
57 let extension = (2.0 * energy / self.stiffness).sqrt();
58 [extension, -extension].into()
59 }
60 fn compliance(&self, _force: Scalar) -> Scalar {
64 1.0 / self.stiffness
65 }
66 fn peak(&self) -> Scalar {
70 Scalar::INFINITY
71 }
72 fn peak_force(&self) -> Scalar {
76 Scalar::INFINITY
77 }
78 fn rest_length(&self) -> Scalar {
82 self.rest_length
83 }
84}