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