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