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/eleccomp.h>
11 
12 int
zsl_phy_ecmp_capac_cpv(zsl_real_t q,zsl_real_t v,zsl_real_t * c)13 zsl_phy_ecmp_capac_cpv(zsl_real_t q, zsl_real_t v, zsl_real_t *c)
14 {
15 	if (v == 0) {
16 		*c = NAN;
17 		return -EINVAL;
18 	}
19 
20 	*c = q / v;
21 
22 	return 0;
23 }
24 
25 int
zsl_phy_ecmp_capac_ad(zsl_real_t a,zsl_real_t d,zsl_real_t * c)26 zsl_phy_ecmp_capac_ad(zsl_real_t a, zsl_real_t d, zsl_real_t *c)
27 {
28 	if (d == 0) {
29 		*c = NAN;
30 		return -EINVAL;
31 	}
32 
33 	*c = ZSL_PERM_FREE_SPACE * (a / d);
34 
35 	return 0;
36 }
37 
38 int
zsl_phy_ecmp_ener_capac(zsl_real_t c,zsl_real_t v,zsl_real_t * u)39 zsl_phy_ecmp_ener_capac(zsl_real_t c, zsl_real_t v, zsl_real_t *u)
40 {
41 	*u = 0.5 * c * v * v;
42 
43 	return 0;
44 }
45 
46 int
zsl_phy_ecmp_ener_induc(zsl_real_t l,zsl_real_t i,zsl_real_t * u)47 zsl_phy_ecmp_ener_induc(zsl_real_t l, zsl_real_t i, zsl_real_t *u)
48 {
49 	*u = 0.5 * l * i * i;
50 
51 	return 0;
52 }
53 
54 int
zsl_phy_ecmp_trans(uint8_t t1,zsl_real_t v1,uint8_t t2,zsl_real_t * v2)55 zsl_phy_ecmp_trans(uint8_t t1, zsl_real_t v1, uint8_t t2, zsl_real_t *v2)
56 {
57 	if (t1 == 0) {
58 		*v2 = NAN;
59 		return -EINVAL;
60 	}
61 
62 	*v2 = (v1 * (zsl_real_t) t2) / (zsl_real_t) t1;
63 
64 	return 0;
65 }
66 
67 int
zsl_phy_ecmp_rlc_volt(zsl_real_t vr,zsl_real_t vl,zsl_real_t vc,zsl_real_t * v)68 zsl_phy_ecmp_rlc_volt(zsl_real_t vr, zsl_real_t vl, zsl_real_t vc,
69 		      zsl_real_t *v)
70 {
71 	*v = ZSL_SQRT(vr * vr + ZSL_POW(vl - vc, 2.0));
72 
73 	return 0;
74 }
75 
76 int
zsl_phy_ecmp_rc_charg_i(zsl_real_t r,zsl_real_t c,zsl_real_t t,zsl_real_t i0,zsl_real_t * i)77 zsl_phy_ecmp_rc_charg_i(zsl_real_t r, zsl_real_t c, zsl_real_t t, zsl_real_t i0,
78 			zsl_real_t *i)
79 {
80 	if ((r * c) <= 0 || i0 < 0 || t < 0) {
81 		*i = NAN;
82 		return -EINVAL;
83 	}
84 
85 	*i = i0 * ZSL_EXP(-t / (r * c));
86 
87 	return 0;
88 }
89 
90 int
zsl_phy_ecmp_rc_charg_q(zsl_real_t r,zsl_real_t c,zsl_real_t t,zsl_real_t q0,zsl_real_t * q)91 zsl_phy_ecmp_rc_charg_q(zsl_real_t r, zsl_real_t c, zsl_real_t t, zsl_real_t q0,
92 			zsl_real_t *q)
93 {
94 	if ((r * c) <= 0 || q0 < 0 || t < 0) {
95 		*q = NAN;
96 		return -EINVAL;
97 	}
98 
99 	*q = q0 * (1.0 - ZSL_EXP(-t / (r * c)));
100 
101 	return 0;
102 }
103 
104 int
zsl_phy_ecmp_rc_discharg_i(zsl_real_t r,zsl_real_t c,zsl_real_t t,zsl_real_t i0,zsl_real_t * i)105 zsl_phy_ecmp_rc_discharg_i(zsl_real_t r, zsl_real_t c, zsl_real_t t,
106 			   zsl_real_t i0, zsl_real_t *i)
107 {
108 	if ((r * c) <= 0 || i0 < 0 || t < 0) {
109 		*i = NAN;
110 		return -EINVAL;
111 	}
112 
113 	*i = -i0 * ZSL_EXP(-t / (r * c));
114 
115 	return 0;
116 }
117 
118 int
zsl_phy_ecmp_rc_discharg_q(zsl_real_t r,zsl_real_t c,zsl_real_t t,zsl_real_t q0,zsl_real_t * q)119 zsl_phy_ecmp_rc_discharg_q(zsl_real_t r, zsl_real_t c, zsl_real_t t,
120 			   zsl_real_t q0, zsl_real_t *q)
121 {
122 	if ((r * c) <= 0 || q0 < 0 || t < 0) {
123 		*q = NAN;
124 		return -EINVAL;
125 	}
126 
127 	*q = q0 * ZSL_EXP(-t / (r * c));
128 
129 	return 0;
130 }
131 
132 int
zsl_phy_ecmp_rl_current(zsl_real_t r,zsl_real_t l,zsl_real_t t,zsl_real_t i0,zsl_real_t * i)133 zsl_phy_ecmp_rl_current(zsl_real_t r, zsl_real_t l, zsl_real_t t, zsl_real_t i0,
134 			zsl_real_t *i)
135 {
136 	if (l <= 0 || i0 < 0 || t < 0 || r < 0) {
137 		*i = NAN;
138 		return -EINVAL;
139 	}
140 
141 	*i = i0 * (1.0 - ZSL_EXP(-(r * t) / l));
142 
143 	return 0;
144 }
145