1 /*
2  * Copyright (c) 2019 Kevin Townsend (KTOWN)
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include <math.h>
8 #include <errno.h>
9 #include <zsl/zsl.h>
10 #include <zsl/physics/fluids.h>
11 
12 int
zsl_phy_fluid_dens(zsl_real_t m,zsl_real_t v,zsl_real_t * d)13 zsl_phy_fluid_dens(zsl_real_t m, zsl_real_t v, zsl_real_t *d)
14 {
15 	if (m < 0 || v <= 0) {
16 		*d = NAN;
17 		return -EINVAL;
18 	}
19 
20 	*d = m / v;
21 
22 	return 0;
23 }
24 
25 int
zsl_phy_fluid_simple_press(zsl_real_t f,zsl_real_t a,zsl_real_t * p)26 zsl_phy_fluid_simple_press(zsl_real_t f, zsl_real_t a, zsl_real_t *p)
27 {
28 	if (f < 0 || a <= 0) {
29 		*p = NAN;
30 		return -EINVAL;
31 	}
32 
33 	*p = f / a;
34 
35 	return 0;
36 }
37 
38 int
zsl_phy_fluid_press(zsl_real_t p0,zsl_real_t h,zsl_real_t d,zsl_real_t * p)39 zsl_phy_fluid_press(zsl_real_t p0, zsl_real_t h, zsl_real_t d, zsl_real_t *p)
40 {
41 	if (p0 < 0 || h < 0 || d < 0) {
42 		*p = NAN;
43 		return -EINVAL;
44 	}
45 
46 	*p = p0 + h * d * ZSL_GRAV_EARTH * 1.0E-3;
47 
48 	return 0;
49 }
50 
51 int
zsl_phy_fluid_bouyant_force(zsl_real_t v,zsl_real_t d,zsl_real_t * f)52 zsl_phy_fluid_bouyant_force(zsl_real_t v, zsl_real_t d, zsl_real_t *f)
53 {
54 	if (v < 0 || d < 0) {
55 		*f = NAN;
56 		return -EINVAL;
57 	}
58 
59 	*f = v * d * ZSL_GRAV_EARTH * 1.0E-3;
60 
61 	return 0;
62 }
63 
64 int
zsl_phy_fluid_flow_rate(zsl_real_t a1,zsl_real_t v1,zsl_real_t a2,zsl_real_t * v2)65 zsl_phy_fluid_flow_rate(zsl_real_t a1, zsl_real_t v1, zsl_real_t a2,
66 			zsl_real_t *v2)
67 {
68 	if (v1 < 0 || a1 < 0 || a2 <= 0) {
69 		*v2 = NAN;
70 		return -EINVAL;
71 	}
72 
73 	*v2 = (a1 * v1) / a2;
74 
75 	return 0;
76 }
77 
78 int
zsl_phy_fluid_force_prop(zsl_real_t a1,zsl_real_t f1,zsl_real_t a2,zsl_real_t * f2)79 zsl_phy_fluid_force_prop(zsl_real_t a1, zsl_real_t f1, zsl_real_t a2,
80 			 zsl_real_t *f2)
81 {
82 	if (f1 < 0 || a2 < 0 || a1 <= 0) {
83 		*f2 = NAN;
84 		return -EINVAL;
85 	}
86 
87 	*f2 = (a2 * f1) / a1;
88 
89 	return 0;
90 }
91 
92 int
zsl_phy_fluid_bernoulli(zsl_real_t d,zsl_real_t v1,zsl_real_t p1,zsl_real_t v2,zsl_real_t * p2)93 zsl_phy_fluid_bernoulli(zsl_real_t d, zsl_real_t v1, zsl_real_t p1,
94 			zsl_real_t v2, zsl_real_t *p2)
95 {
96 	if (v1 < 0 || v2 < 0 || p1 < 0 || d < 0) {
97 		*p2 = NAN;
98 		return -EINVAL;
99 	}
100 
101 	/* Bernoulli's principle:
102 	 * p1 + 0.5 * d * v1 * v1 = p2 + 0.5 * d * v2 * v2
103 	 */
104 
105 	*p2 = p1 + 0.5 * d * (v1 * v1 - v2 * v2) * 1.0E-3;
106 
107 	return 0;
108 }
109 
110 int
zsl_phy_fluid_volume_flow_rate(zsl_real_t vel,zsl_real_t a,zsl_real_t * v)111 zsl_phy_fluid_volume_flow_rate(zsl_real_t vel, zsl_real_t a, zsl_real_t *v)
112 {
113 	if (vel < 0 || a < 0) {
114 		*v = NAN;
115 		return -EINVAL;
116 	}
117 
118 	*v = vel * a;
119 
120 	return 0;
121 }
122