conspire/physics/molecular/potential/
mod.rs1#[cfg(test)]
2mod test;
3
4mod harmonic;
5mod morse;
7
8pub use harmonic::Harmonic;
9pub use morse::Morse;
10
11use crate::{math::Scalar, physics::BOLTZMANN_CONSTANT};
12use std::fmt::Debug;
13
14pub trait Potential
15where
16 Self: Clone + Debug,
17{
18 fn energy(&self, length: Scalar) -> Scalar;
22 fn nondimensional_energy(&self, nondimensional_length: Scalar, temperature: Scalar) -> Scalar {
26 let length = self.rest_length() * nondimensional_length;
27 self.energy(length) / BOLTZMANN_CONSTANT / temperature
28 }
29 fn force(&self, length: Scalar) -> Scalar;
33 fn nondimensional_force(&self, nondimensional_length: Scalar, temperature: Scalar) -> Scalar {
37 let length = self.rest_length() * nondimensional_length;
38 self.force(length) * self.rest_length() / BOLTZMANN_CONSTANT / temperature
39 }
40 fn stiffness(&self, length: Scalar) -> Scalar;
44 fn nondimensional_stiffness(
48 &self,
49 nondimensional_length: Scalar,
50 temperature: Scalar,
51 ) -> Scalar {
52 let length = self.rest_length() * nondimensional_length;
53 self.stiffness(length) * self.rest_length().powi(2) / BOLTZMANN_CONSTANT / temperature
54 }
55 fn anharmonicity(&self, length: Scalar) -> Scalar;
59 fn nondimensional_anharmonicity(
63 &self,
64 nondimensional_length: Scalar,
65 temperature: Scalar,
66 ) -> Scalar {
67 let length = self.rest_length() * nondimensional_length;
68 self.anharmonicity(length) * self.rest_length().powi(3) / BOLTZMANN_CONSTANT / temperature
69 }
70 fn legendre(&self, force: Scalar) -> Scalar {
74 let extension = self.extension(force);
75 let length = self.rest_length() + extension;
76 self.energy(length) - force * extension
77 }
78 fn nondimensional_legendre(&self, nondimensional_force: Scalar, temperature: Scalar) -> Scalar {
82 let force = nondimensional_force / self.rest_length() * BOLTZMANN_CONSTANT * temperature;
83 self.legendre(force) / BOLTZMANN_CONSTANT / temperature
84 }
85 fn extension(&self, force: Scalar) -> Scalar;
89 fn nondimensional_extension(
93 &self,
94 nondimensional_force: Scalar,
95 temperature: Scalar,
96 ) -> Scalar {
97 let force = nondimensional_force / self.rest_length() * BOLTZMANN_CONSTANT * temperature;
98 self.extension(force) / self.rest_length()
99 }
100 fn compliance(&self, force: Scalar) -> Scalar;
104 fn nondimensional_compliance(
108 &self,
109 nondimensional_force: Scalar,
110 temperature: Scalar,
111 ) -> Scalar {
112 let force = nondimensional_force / self.rest_length() * BOLTZMANN_CONSTANT * temperature;
113 self.compliance(force) / self.rest_length().powi(2) * BOLTZMANN_CONSTANT * temperature
114 }
115 fn peak(&self) -> Scalar;
119 fn peak_force(&self) -> Scalar;
123 fn rest_length(&self) -> Scalar;
127}