aboutsummaryrefslogtreecommitdiffstats
path: root/mass.go
diff options
context:
space:
mode:
authorsam-anthony <samanthony6@protonmail.com>2022-03-26 19:39:39 -0230
committersam-anthony <samanthony6@protonmail.com>2022-03-26 19:39:39 -0230
commit722ab14ee5c2bc70b880c4dec74d1b546ae144b2 (patch)
tree243b8e4fc2327b4ad1269a2761b23454d681bd29 /mass.go
parent42f2f6419bbff03931654e52a885b0600eec9b9b (diff)
downloadvolute-722ab14ee5c2bc70b880c4dec74d1b546ae144b2.zip
mass flow rate
Diffstat (limited to 'mass.go')
-rw-r--r--mass.go86
1 files changed, 86 insertions, 0 deletions
diff --git a/mass.go b/mass.go
new file mode 100644
index 0000000..0b97020
--- /dev/null
+++ b/mass.go
@@ -0,0 +1,86 @@
+package main
+
+import (
+ "errors"
+ "fmt"
+ "time"
+)
+
+type massUnit float32
+
+const (
+ gram massUnit = 1
+ kilogram massUnit = 1_000
+ pound massUnit = 453.5924
+)
+
+type mass struct {
+ val float32
+ unit massUnit
+}
+
+func (m mass) asUnit(u massUnit) float32 {
+ g := m.val * float32(m.unit) // Convert to grams.
+ return g / float32(u) // Convert to desired unit.
+}
+
+type massFlowRateUnit float32
+
+const (
+ kilogramsPerSecond massFlowRateUnit = 1
+ poundsPerMinute massFlowRateUnit = 0.007_559_872_833
+)
+
+// massFlowRateUnitStrings returns a slice of strings, each representing a
+// massFlowRateUnit.
+// This is necessary because giu.Combo only works with strings.
+func massFlowRateUnitStrings() []string {
+ return []string{"kg/s", "lb/min"}
+}
+
+const (
+ defaultMassFlowRateUnit massFlowRateUnit = kilogramsPerSecond
+ //Used to index massFlowRateUnitStrings
+ defaultMassFlowRateUnitIndex int32 = 0 // kg/s
+)
+
+func massFlowRateUnitFromString(s string) (massFlowRateUnit, error) {
+ // Each case corresponds to a value in massFlowRateUnitStrings.
+ switch s {
+ case "kg/s":
+ return kilogramsPerSecond, nil
+ case "lb/min":
+ return poundsPerMinute, nil
+ default:
+ return *new(massFlowRateUnit), errors.New(
+ fmt.Sprintf("invalid massFlowRateUnit: '%s'", s))
+ }
+}
+
+type massFlowRate struct {
+ val float32
+ unit massFlowRateUnit
+}
+
+func newMassFlowRate(m mass, t time.Duration, u massFlowRateUnit) (massFlowRate, error) {
+ switch u {
+ case kilogramsPerSecond:
+ return massFlowRate{
+ m.asUnit(kilogram) / float32(t.Seconds()),
+ u,
+ }, nil
+ case poundsPerMinute:
+ return massFlowRate{
+ m.asUnit(pound) / float32(t.Minutes()),
+ u,
+ }, nil
+ default:
+ return *new(massFlowRate), errors.New(
+ fmt.Sprintf("invalid massFlowRateUnit: '%v'", u))
+ }
+}
+
+func (fr massFlowRate) asUnit(u massFlowRateUnit) float32 {
+ kgps := fr.val * float32(fr.unit) // Convert to kilogramsPerSecond.
+ return kgps / float32(u) // Convert to desired unit.
+}