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