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/momentum.h>
11
12 int
zsl_phy_mom_mom(zsl_real_t m,zsl_real_t v,zsl_real_t * p)13 zsl_phy_mom_mom(zsl_real_t m, zsl_real_t v, zsl_real_t *p)
14 {
15 if (m < 0) {
16 *p = NAN;
17 return -EINVAL;
18 }
19
20 *p = m * v;
21
22 return 0;
23 }
24
25 int
zsl_phy_mom_imp(zsl_real_t f,zsl_real_t time,zsl_real_t * imp)26 zsl_phy_mom_imp(zsl_real_t f, zsl_real_t time, zsl_real_t *imp)
27 {
28 if (time < 0) {
29 *imp = NAN;
30 return -EINVAL;
31 }
32
33 *imp = f * time;
34
35 return 0;
36 }
37
38 int
zsl_phy_mom_change(zsl_real_t m,zsl_real_t vi,zsl_real_t vf,zsl_real_t * p)39 zsl_phy_mom_change(zsl_real_t m, zsl_real_t vi, zsl_real_t vf, zsl_real_t *p)
40 {
41 if (m < 0) {
42 *p = NAN;
43 return -EINVAL;
44 }
45
46 *p = m * (vf - vi);
47
48 return 0;
49 }
50
51 int
zsl_phy_mom_elas(zsl_real_t m1,zsl_real_t vi1,zsl_real_t vf1,zsl_real_t m2,zsl_real_t vi2,zsl_real_t * vf2)52 zsl_phy_mom_elas(zsl_real_t m1, zsl_real_t vi1, zsl_real_t vf1, zsl_real_t m2,
53 zsl_real_t vi2, zsl_real_t *vf2)
54 {
55 if (m1 < 0 || m2 <= 0) {
56 *vf2 = NAN;
57 return -EINVAL;
58 }
59
60 /*
61 * m1 * vi1 + m2 * vi2 = m1 * vf1 + m2 * vf2
62 */
63
64 *vf2 = (m1 * (vi1 - vf1) + m2 * vi2) / m2;
65
66 return 0;
67 }
68
69 int
zsl_phy_mom_inelas(zsl_real_t m1,zsl_real_t vi1,zsl_real_t m2,zsl_real_t vi2,zsl_real_t * vf)70 zsl_phy_mom_inelas(zsl_real_t m1, zsl_real_t vi1, zsl_real_t m2, zsl_real_t vi2,
71 zsl_real_t *vf)
72 {
73 if (m1 < 0 || m2 < 0 || (m1 + m2) == 0) {
74 *vf = NAN;
75 return -EINVAL;
76 }
77
78 /*
79 * m1 * vi1 + m2 * vi2 = (m1 + m2) * vf
80 */
81
82 *vf = (m1 * vi1 + m2 * vi2) / (m1 + m2);
83
84 return 0;
85 }
86