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