1- use core:: ops:: { Add , BitOr , Neg } ;
21use core:: fmt;
2+ use core:: ops:: { Add , BitOr , Neg } ;
33
44use crate :: units:: * ;
55
66#[ derive( Debug , Copy , Clone ) ]
77pub enum Cct {
8- Thevenin ( Volt , Ohm ) ,
9- Norton ( Amp , Siemen )
8+ Thevenin ( Volt , Ohm ) ,
9+ Norton ( Amp , Siemen ) ,
1010}
1111use self :: Cct :: * ;
1212
1313impl Cct {
14- pub fn i_short ( self ) -> Amp {
14+ pub fn i_short ( self ) -> Amp {
1515 match self {
16- Thevenin ( v, r) => v/ r,
17- Norton ( i, _) => i
16+ Thevenin ( v, r) => v / r,
17+ Norton ( i, _) => i,
1818 }
1919 }
20- pub fn v_open ( self ) -> Volt {
20+ pub fn v_open ( self ) -> Volt {
2121 match self {
2222 Thevenin ( v, _) => v,
23- Norton ( i, g) => i* ( 1.0 /g )
23+ Norton ( i, g) => i * ( 1.0 / g ) ,
2424 }
2525 }
26- pub fn r_equiv ( self ) -> Ohm {
26+ pub fn r_equiv ( self ) -> Ohm {
2727 match self {
2828 Thevenin ( _, r) => r,
29- Norton ( _, g) => 1.0 /g
29+ Norton ( _, g) => 1.0 / g ,
3030 }
3131 }
32- pub fn g_equiv ( self ) -> Siemen {
32+ pub fn g_equiv ( self ) -> Siemen {
3333 match self {
34- Thevenin ( _, r) => 1.0 / r,
35- Norton ( _, g) => g
34+ Thevenin ( _, r) => 1.0 / r,
35+ Norton ( _, g) => g,
3636 }
3737 }
3838}
3939
4040fn norton_wins ( lhs : Cct , rhs : Cct ) -> bool {
4141 match ( lhs, rhs) {
4242 ( Thevenin ( _, _) , Thevenin ( _, _) ) => false ,
43- ( Norton ( _, _) , Norton ( _, _) ) => true ,
44- ( Norton ( _, g) , _) if g. 0 < n => true ,
45- ( _, Norton ( _, g) ) if g. 0 < n => true ,
46- _ => false
43+ ( Norton ( _, _) , Norton ( _, _) ) => true ,
44+ ( Norton ( _, g) , _) if g. 0 < n => true ,
45+ ( _, Norton ( _, g) ) if g. 0 < n => true ,
46+ _ => false ,
4747 }
4848}
4949
@@ -54,12 +54,11 @@ impl BitOr<Cct> for Cct {
5454 let ge = self . g_equiv ( ) + rhs. g_equiv ( ) ;
5555 let ie = self . i_short ( ) + rhs. i_short ( ) ;
5656 Norton ( ie, ge)
57- }
58- else {
57+ } else {
5958 let re = self . r_equiv ( ) | rhs. r_equiv ( ) ;
6059 let rs = self . r_equiv ( ) + rhs. r_equiv ( ) ;
61- let n1 = rhs. r_equiv ( ) / rs;
62- let n2 = self . r_equiv ( ) / rs;
60+ let n1 = rhs. r_equiv ( ) / rs;
61+ let n2 = self . r_equiv ( ) / rs;
6362 let ve = self . v_open ( ) * n1 + rhs. v_open ( ) * n2;
6463 Thevenin ( ve, re)
6564 }
@@ -72,12 +71,11 @@ impl Add<Cct> for Cct {
7271 if norton_wins ( self , rhs) {
7372 let ge = self . g_equiv ( ) | rhs. g_equiv ( ) ;
7473 let gp = self . g_equiv ( ) + rhs. g_equiv ( ) ;
75- let n1 = rhs. g_equiv ( ) / gp;
76- let n2 = self . g_equiv ( ) / gp;
74+ let n1 = rhs. g_equiv ( ) / gp;
75+ let n2 = self . g_equiv ( ) / gp;
7776 let ie = self . i_short ( ) * n1 + rhs. i_short ( ) * n2;
7877 Norton ( ie, ge)
79- }
80- else {
78+ } else {
8179 let re = self . r_equiv ( ) + rhs. r_equiv ( ) ;
8280 let ve = self . v_open ( ) + rhs. v_open ( ) ;
8381 Thevenin ( ve, re)
@@ -90,7 +88,7 @@ impl Neg for Cct {
9088 fn neg ( self ) -> Cct {
9189 match self {
9290 Thevenin ( v, r) => Thevenin ( -v, r) ,
93- Norton ( i, g) => Norton ( -i, g)
91+ Norton ( i, g) => Norton ( -i, g) ,
9492 }
9593 }
9694}
@@ -99,77 +97,86 @@ impl fmt::Display for Cct {
9997 fn fmt ( & self , dst : & mut fmt:: Formatter ) -> fmt:: Result {
10098 match self {
10199 Thevenin ( v, r) => write ! ( dst, "{} + {}" , v, r) ,
102- Norton ( i, g) => write ! ( dst, "{} | {}" , i, g) ,
100+ Norton ( i, g) => write ! ( dst, "{} | {}" , i, g) ,
103101 }
104-
105102 }
106103}
107104
108105// Conversions from elec units to Cct
109106
110107impl Add < Ohm > for Volt {
111108 type Output = Cct ;
112- fn add ( self , rhs : Ohm ) -> Cct { Thevenin ( self , rhs) }
109+ fn add ( self , rhs : Ohm ) -> Cct {
110+ Thevenin ( self , rhs)
111+ }
113112}
114113
115114impl BitOr < Siemen > for Amp {
116115 type Output = Cct ;
117- fn bitor ( self , rhs : Siemen ) -> Cct { Norton ( self , rhs) }
116+ fn bitor ( self , rhs : Siemen ) -> Cct {
117+ Norton ( self , rhs)
118+ }
118119}
119120
120121impl BitOr < Ohm > for Cct {
121122 type Output = Cct ;
122- fn bitor ( self , rhs : Ohm ) -> Cct { self | Thevenin ( Volt ( 0.0 ) , rhs) }
123+ fn bitor ( self , rhs : Ohm ) -> Cct {
124+ self | Thevenin ( Volt ( 0.0 ) , rhs)
125+ }
123126}
124127
125128impl Add < Ohm > for Cct {
126129 type Output = Cct ;
127- fn add ( self , rhs : Ohm ) -> Cct { self + Thevenin ( Volt ( 0.0 ) , rhs) }
130+ fn add ( self , rhs : Ohm ) -> Cct {
131+ self + Thevenin ( Volt ( 0.0 ) , rhs)
132+ }
128133}
129134
130135impl BitOr < Siemen > for Cct {
131136 type Output = Cct ;
132- fn bitor ( self , rhs : Siemen ) -> Cct { self | Norton ( Amp ( 0.0 ) , rhs) }
137+ fn bitor ( self , rhs : Siemen ) -> Cct {
138+ self | Norton ( Amp ( 0.0 ) , rhs)
139+ }
133140}
134141
135142impl Add < Siemen > for Cct {
136143 type Output = Cct ;
137- fn add ( self , rhs : Siemen ) -> Cct { self + Norton ( Amp ( 0.0 ) , rhs) }
144+ fn add ( self , rhs : Siemen ) -> Cct {
145+ self + Norton ( Amp ( 0.0 ) , rhs)
146+ }
138147}
139148
140149#[ test]
141150fn open_evse_cp_example ( ) {
142- let r7 = 200.0 * Ohm ( k) ;
143- let r6 = 100.0 * Ohm ( k) ;
144- let r5 = 56.0 * Ohm ( k) ;
151+ let r7 = 200.0 * Ohm ( k) ;
152+ let r6 = 100.0 * Ohm ( k) ;
153+ let r5 = 56.0 * Ohm ( k) ;
145154
146155 let vcc = Volt ( 5.0 ) ;
147156 let v_cp_hi = Volt ( 12.0 ) ;
148157 let gnd = Volt ( 0.0 ) ;
149158
150- let cct = v_cp_hi + r7 | gnd + r6 | vcc + r5;
151-
159+ let cct = v_cp_hi + r7 | gnd + r6 | vcc + r5;
160+
152161 fn divider3 ( v1 : Volt , r1 : Ohm , v2 : Volt , r2 : Ohm , v3 : Volt , r3 : Ohm ) -> Volt {
153- ( v1/ r1 + v2/ r2 + v3/ r3) * ( r1|r2| r3)
162+ ( v1 / r1 + v2 / r2 + v3 / r3) * ( r1 | r2 | r3)
154163 }
155164
156165 let v1 = cct. v_open ( ) ;
157- let v2 = divider3 ( v_cp_hi, r7, gnd, r6, vcc, r5) ;
166+ let v2 = divider3 ( v_cp_hi, r7, gnd, r6, vcc, r5) ;
158167
159- assert_eq ! ( v1, v2 )
168+ assert_eq ! ( v1, v2)
160169}
161170
162171#[ test]
163172fn doc_example ( ) {
164173 let vcc = Volt ( 5.0 ) ;
165- let r1 = Ohm ( 10.0 * k) ;
166- let r2 = Ohm ( 5.0 * k) ;
167-
168- let circuit =
169- vcc + r1 // A voltage source vcc in series with resistor r1 forms a Cct,
170- | r2; // which is extended by resistor r2 in parallel
171-
174+ let r1 = Ohm ( 10.0 * k) ;
175+ let r2 = Ohm ( 5.0 * k) ;
176+
177+ let circuit = vcc + r1 // A voltage source vcc in series with resistor r1 forms a Cct,
178+ | r2; // which is extended by resistor r2 in parallel
179+
172180 let v1 = circuit. v_open ( ) ; // v1 is the voltage produced
173- assert_eq ! ( v1, r2/( r1 + r2) * vcc)
174-
181+ assert_eq ! ( v1, r2 / ( r1 + r2) * vcc)
175182}
0 commit comments