aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/flow_rate.rs32
-rw-r--r--src/lib.rs14
-rw-r--r--src/main.rs16
-rw-r--r--src/mass.rs31
-rw-r--r--src/pressure.rs11
-rw-r--r--src/temperature.rs11
-rw-r--r--src/volume.rs23
7 files changed, 138 insertions, 0 deletions
diff --git a/src/flow_rate.rs b/src/flow_rate.rs
new file mode 100644
index 0000000..f8e15e0
--- /dev/null
+++ b/src/flow_rate.rs
@@ -0,0 +1,32 @@
+use crate::{mass::Mass, volume::Volume};
+use std::time::Duration;
+
+pub struct MassFlowRate {
+ pub mass: Mass,
+ pub duration: Duration,
+}
+
+impl MassFlowRate {
+ pub fn as_kilograms_per_minute(&self) -> f64 {
+ self.mass.as_kilograms() / (self.duration.as_secs() as f64 / 60.)
+ }
+
+ pub fn as_pounds_per_minute(&self) -> f64 {
+ self.mass.as_pounds() / (self.duration.as_secs() as f64 / 60.)
+ }
+}
+
+pub struct VolumetricFlowRate {
+ pub volume: Volume,
+ pub duration: Duration,
+}
+
+impl VolumetricFlowRate {
+ pub fn as_cubic_metres_per_second(&self) -> f64 {
+ self.volume.as_cubic_metres() / self.duration.as_secs() as f64
+ }
+
+ pub fn as_cubic_feet_per_minute(&self) -> f64 {
+ self.volume.as_cubic_feet() / (self.duration.as_secs() as f64 / 60.)
+ }
+}
diff --git a/src/lib.rs b/src/lib.rs
new file mode 100644
index 0000000..79dda37
--- /dev/null
+++ b/src/lib.rs
@@ -0,0 +1,14 @@
+pub mod flow_rate;
+pub mod mass;
+pub mod pressure;
+pub mod temperature;
+pub mod volume;
+
+use crate::{pressure::Pressure, temperature::Temperature, volume::Volume};
+
+const GAS_CONSTANT: f64 = 8.314472;
+const MOLAR_MASS_OF_AIR: f64 = 0.0289647; // Kg/mol
+
+fn moles_from_gas_law(pressure: Pressure, volume: Volume, temperature: Temperature) -> f64 {
+ (pressure.as_pascals() * volume.as_cubic_metres()) / (GAS_CONSTANT * temperature.as_kelvin())
+}
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..9c9692c
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,16 @@
+use std::time::Duration;
+use volute::{flow_rate::MassFlowRate, mass::Mass, pressure::Pressure};
+
+fn main() {
+ let mass = Mass::from_grams(1600.);
+ println!("{} Kg", mass.as_kilograms());
+
+ let mass_flow_rate = MassFlowRate {
+ mass: mass,
+ duration: Duration::from_secs(5),
+ };
+ println!("{:.2} Kg/min.", mass_flow_rate.as_kilograms_per_minute());
+
+ let pressure = Pressure::from_pascals(1500.52);
+ println!("{} Pa", pressure.as_pascals());
+}
diff --git a/src/mass.rs b/src/mass.rs
new file mode 100644
index 0000000..9c57f16
--- /dev/null
+++ b/src/mass.rs
@@ -0,0 +1,31 @@
+pub struct Mass(f64); // Base unit is grams
+
+impl Mass {
+ /* constructors */
+ pub fn from_grams(grams: f64) -> Mass {
+ Mass(grams)
+ }
+
+ pub fn from_kilograms(kilos: f64) -> Mass {
+ Mass(kilos / 1000.)
+ }
+
+ pub fn from_moles(moles: f64, molar_mass: f64) -> Mass {
+ let kilos = moles * molar_mass;
+ Mass::from_kilograms(kilos)
+ }
+
+ /* metric */
+ pub fn as_grams(&self) -> f64 {
+ self.0
+ }
+
+ pub fn as_kilograms(&self) -> f64 {
+ self.0 / 1000.
+ }
+
+ /* imperial */
+ pub fn as_pounds(&self) -> f64 {
+ self.0 * 0.002204623
+ }
+}
diff --git a/src/pressure.rs b/src/pressure.rs
new file mode 100644
index 0000000..f746186
--- /dev/null
+++ b/src/pressure.rs
@@ -0,0 +1,11 @@
+pub struct Pressure(f64); // Base unit is pascals
+
+impl Pressure {
+ pub fn from_pascals(pascals: f64) -> Self {
+ Self(pascals)
+ }
+
+ pub fn as_pascals(&self) -> f64 {
+ self.0
+ }
+}
diff --git a/src/temperature.rs b/src/temperature.rs
new file mode 100644
index 0000000..2eac48d
--- /dev/null
+++ b/src/temperature.rs
@@ -0,0 +1,11 @@
+pub struct Temperature(f64); // Base unit is kelvin
+
+impl Temperature {
+ pub fn from_kelvin(kelvin: f64) -> Temperature {
+ Temperature(kelvin)
+ }
+
+ pub fn as_kelvin(&self) -> f64 {
+ self.0
+ }
+}
diff --git a/src/volume.rs b/src/volume.rs
new file mode 100644
index 0000000..d6ef206
--- /dev/null
+++ b/src/volume.rs
@@ -0,0 +1,23 @@
+pub struct Volume(f64); // Base unit is cubic metres
+
+impl Volume {
+ pub fn from_cubic_metres(cubic_metres: f64) -> Volume {
+ Volume(cubic_metres)
+ }
+
+ pub fn from_cubic_centimetres(cubic_centimetres: f64) -> Volume {
+ Volume(cubic_centimetres / 1_000_000.)
+ }
+
+ pub fn as_cubic_metres(&self) -> f64 {
+ self.0
+ }
+
+ pub fn as_cubic_centimetres(&self) -> f64 {
+ self.0 * 1_000_000.
+ }
+
+ pub fn as_cubic_feet(&self) -> f64 {
+ self.0 * 35.3147
+ }
+}