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/magnetics.h>
11
12 int
zsl_phy_magn_force(zsl_real_t q,zsl_real_t v,zsl_real_t b,zsl_real_t theta,zsl_real_t * f)13 zsl_phy_magn_force(zsl_real_t q, zsl_real_t v, zsl_real_t b, zsl_real_t theta,
14 zsl_real_t *f)
15 {
16 if (v < 0 || b < 0) {
17 *f = NAN;
18 return -EINVAL;
19 }
20
21 *f = q * v * b * ZSL_SIN(theta);
22
23 return 0;
24 }
25
26 int
zsl_phy_magn_force_wire(zsl_real_t i,zsl_real_t l,zsl_real_t b,zsl_real_t theta,zsl_real_t * f)27 zsl_phy_magn_force_wire(zsl_real_t i, zsl_real_t l, zsl_real_t b,
28 zsl_real_t theta, zsl_real_t *f)
29 {
30 if (l < 0 || b < 0) {
31 *f = NAN;
32 return -EINVAL;
33 }
34
35 *f = i * l * b * ZSL_SIN(theta);
36
37 return 0;
38 }
39
40 int
zsl_phy_magn_torque_loop(zsl_real_t i,zsl_real_t a,zsl_real_t b,zsl_real_t theta,zsl_real_t * tor)41 zsl_phy_magn_torque_loop(zsl_real_t i, zsl_real_t a, zsl_real_t b,
42 zsl_real_t theta, zsl_real_t *tor)
43 {
44 if (a < 0 || b < 0) {
45 *tor = NAN;
46 return -EINVAL;
47 }
48
49 *tor = i * a * b * ZSL_SIN(theta);
50
51 return 0;
52 }
53
54 int
zsl_phy_magn_pot_dipole(zsl_real_t mom,zsl_real_t b,zsl_real_t theta,zsl_real_t * u)55 zsl_phy_magn_pot_dipole(zsl_real_t mom, zsl_real_t b, zsl_real_t theta,
56 zsl_real_t *u)
57 {
58 if (mom < 0 || b < 0) {
59 *u = NAN;
60 return -EINVAL;
61 }
62
63 *u = -mom * b * ZSL_COS(theta);
64
65 return 0;
66 }
67
68 int
zsl_phy_magn_orb_radius(zsl_real_t q,zsl_real_t v,zsl_real_t b,zsl_real_t m,zsl_real_t * r)69 zsl_phy_magn_orb_radius(zsl_real_t q, zsl_real_t v, zsl_real_t b, zsl_real_t m,
70 zsl_real_t *r)
71 {
72 if (q == 0 || b == 0 || m < 0) {
73 *r = NAN;
74 return -EINVAL;
75 }
76
77 *r = (m * v) / (q * b);
78
79 if (*r < 0) {
80 *r = NAN;
81 return -EINVAL;
82 }
83
84 return 0;
85 }
86
87 int
zsl_phy_magn_flux(zsl_real_t a,zsl_real_t b,zsl_real_t theta,zsl_real_t * fl)88 zsl_phy_magn_flux(zsl_real_t a, zsl_real_t b, zsl_real_t theta, zsl_real_t *fl)
89 {
90 if (a < 0 || b < 0) {
91 *fl = NAN;
92 return -EINVAL;
93 }
94
95 *fl = a * b * ZSL_COS(theta);
96
97 return 0;
98 }
99
100 int
zsl_phy_magn_mom(zsl_real_t i,zsl_real_t a,zsl_real_t * mom)101 zsl_phy_magn_mom(zsl_real_t i, zsl_real_t a, zsl_real_t *mom)
102 {
103 if (a < 0) {
104 *mom = NAN;
105 return -EINVAL;
106 }
107
108 *mom = i * a;
109
110 return 0;
111 }
112