Screamer Project  V3.3.1
Screamer Structure
 All Files Functions Variables
magswmdl.f
Go to the documentation of this file.
1  subroutine smagsw_model (rdt, inew, parms, dldt, dlidi, lvar)
2 c
3 c Define passed variables
4 c
5  real rdt, inew, parms(*), dldt, dlidi, lvar
6 c
7 c December 10, 1992; hnw
8 c 2014-02-06 RBS: Changed real*4 to real
9 c
10 c Magnetic switch model of a saturable core inductor.
11 c Note: We have just solved for the current at the last time step (Tnew).
12 c The timestep previous to that is Told.
13 c T1/2 is the last half-timestep: 0.5 * (Tnew + Told)
14 c T-1/2 is the half timestep previous to that: T1/2 - timestep
15 c Input:
16 c rdt = 1 / timestep
17 c inew = current through inductor at last time step.
18 c parms = array of parameters for each inductor.
19 c 1: old switch current
20 c 2: max switch current
21 c 3: old problem current
22 c 4: old inductance
23 c 5: inner radius (m)
24 c 6: outer radius (m)
25 c 7: 1/ri
26 c 8: 1/ro
27 c 9: ro-ri
28 c 10: ln (ro/ri)
29 c 11: test current for hysteresis
30 c 12: tpi*h1
31 c 13: tpi*hsat
32 c 14: tpi*hrev
33 c 15: 1/tpi*h1
34 c 16: 1/tpi*hsat
35 c 17: 1/tpi*hrev
36 c 18: rel. permeability of core
37 c 19: mu*ln(ro/ri)
38 c 20: mu-1
39 c 21: 1-mu
40 c 22: width*mu0/tpi
41 c Output:
42 c Inductance at T1/2, lvar.
43 c Time rate of change of inductance, dldt = d(inductance)/d(time)).
44 c Change in flux with respect to change in current,
45 c dlidi = d(flux)/d(current)
46 c
47 c
48 c ***** Valid for I > 0 only (we will take the absolute value of the current
49 c and set it to some small positive value if it is zero.
50 c For dI/dt < 0 & I = 0, L has singularity.
51 c
52 c Define internal variables
53 c
54  real lvarold, iold, ihalf
55 c
56 c Set the switch parameters to constants, always need these,
57 c only set the rest if we need them in the if block.
58 c
59  ziaold = parms(1)
60  ziamax = parms(2)
61  iold = parms(3)
62  lvarold = parms(4)
63  ri = parms(5)
64  ro = parms(6)
65  ziatest = parms(11)
66 c
67 c Find the current at T1/2 and make sure it is positive.
68 c
69  ihalf = 0.5 * (inew + iold)
70  zia = amax1(1.0e-20, abs(ihalf))
71 c
72 c Reset the maximum current so far, if necessary.
73 c
74  ziamax = amax1(ziamax, ziaold)
75 c
76 c
77 c ***** Max current not to point where L will come down different path
78 c for dI/dt < 0 (no hysteresis effect) or max current is past this
79 c point but current is still increasing.
80 c
81  if ((ziamax .le. ziatest) .or.
82  & ((ziamax .gt. ziatest) .and. (zia .ge. ziamax))) then
83  rtpih1 = parms(15)
84  rtpihsat = parms(16)
85  rc1 = zia * rtpih1
86  rc2 = zia * rtpihsat
87 c ----------------------------------------
88  if (rc1 .le. ri) then
89 c
90 c --- rc2 < rc1 <= ri < ro
91 c
92  alogrori = parms(10)
93  dlidi = alogrori
94  lvar = dlidi
95 c ----------------------------------------
96  else if (rc1 .le. ro) then
97  if (rc2 .le. ri) then
98 c
99 c --- rc2 < ri < rc1 <= ro
100 c
101  rri = parms(7)
102  tpih1 = parms(12)
103  zmue = parms(18)
104  zmue1m = parms(21)
105  rzia = 1.0 / zia
106  rrc1 = rzia * tpih1
107  dlidi = zmue*alog(rc1*rri) + alog(ro*rrc1)
108  lvar = dlidi + zmue1m*(1.0-ri*rrc1)
109 c ----------------------------------------
110  else
111 c
112 c --- ri < rc2 < rc1 <= ro
113 c
114  rri = parms(7)
115  tpih1 = parms(12)
116  tpihsat = parms(13)
117  zmue = parms(18)
118  zmue1m = parms(21)
119  rzia = 1.0 / zia
120  rrc1 = rzia * tpih1
121  rrc2 = rzia * tpihsat
122  dlidi = alog(ro*rrc1*rc2*rri) + zmue*alog(rc1*rrc2)
123  lvar = dlidi + zmue1m*ri*(rrc2-rrc1)
124  end if
125 c ----------------------------------------
126  else
127  if (rc2 .le. ri) then
128 c
129 c --- rc2 < ri < ro < rc1
130 c
131  rori = parms(9)
132  tpih1 = parms(12)
133  zmuelog = parms(19)
134  zmue1m = parms(21)
135  rzia = 1.0 / zia
136  rrc1 = rzia * tpih1
137  dlidi = zmuelog
138  lvar = dlidi + zmue1m*rori*rrc1
139 c ----------------------------------------
140  else if (rc2 .le. ro) then
141 c
142 c --- ri <= rc2 <= ro < rc1
143 c
144  rri = parms(7)
145  tpih1 = parms(12)
146  tpihsat = parms(13)
147  zmue = parms(18)
148  zmuem1 = parms(20)
149  rzia = 1.0 / zia
150  rrc1 = rzia * tpih1
151  rrc2 = rzia * tpihsat
152  dlidi = alog(rc2*rri) + zmue*alog(ro*rrc2)
153  lvar = dlidi + zmuem1*(ri*(rrc1-rrc2) + (1.0-rrc1*ro))
154 c ----------------------------------------
155  else
156 c
157 c --- ri < ro < rc2 < rc1
158 c
159  rori = parms(9)
160  alogrori = parms(10)
161  tpih1 = parms(12)
162  tpihsat = parms(13)
163  zmuem1 = parms(20)
164  rzia = 1.0 / zia
165  rrc1 = rzia * tpih1
166  rrc2 = rzia * tpihsat
167  dlidi = alogrori
168  lvar = dlidi + zmuem1*(rrc2-rrc1)*rori
169  end if
170 c ----------------------------------------
171  end if
172 c ----------------------------------------
173 c
174 c ***** Max current past point where L will come down different path
175 c for dI/dt < 0 and current is decreasing. This is the
176 c hysteresis effect section.
177 c
178  else
179  rtpihrev = parms(17)
180  rc3 = zia * rtpihrev
181 c ----------------------------------------
182  if (rc3 .le. ri) then
183 c
184 c --- rc3 < ri < ro
185 c
186  rori = parms(9)
187  tpih1 = parms(12)
188  tpihsat = parms(13)
189  tpihrev = parms(14)
190  zmuelog = parms(19)
191  zmue1m = parms(21)
192  rzia = 1.0 / zia
193  rrc1 = rzia * tpih1
194  rrc2 = rzia * tpihsat
195  rrc3 = rzia * tpihrev
196  dlidi = zmuelog
197  lvar = dlidi + (rrc1-rrc2+rrc3)*zmue1m*rori
198 c ----------------------------------------
199  else if (rc3 .le. ro) then
200 c
201 c --- ri <= rc3 < ro
202 c
203  rri = parms(7)
204  rori = parms(9)
205  tpih1 = parms(12)
206  tpihsat = parms(13)
207  tpihrev = parms(14)
208  zmue = parms(18)
209  zmuem1 = parms(20)
210  rzia = 1.0 / zia
211  rrc1 = rzia * tpih1
212  rrc2 = rzia * tpihsat
213  rrc3 = rzia * tpihrev
214  dlidi = alog(rc3*rri) + zmue*alog(ro*rrc3)
215  lvar = dlidi + zmuem1*((rrc2-rrc1)*rori-(ro-rc3)*rrc3)
216 c ----------------------------------------
217  else
218 c
219 c --- rc3 >= ro
220 c
221  rori = parms(9)
222  alogrori = parms(10)
223  tpih1 = parms(12)
224  tpihsat = parms(13)
225  zmuem1 = parms(20)
226  rzia = 1.0 / zia
227  rrc1 = rzia * tpih1
228  rrc2 = rzia * tpihsat
229  dlidi = alogrori
230  lvar = dlidi + zmuem1*(rrc2-rrc1)*rori
231 c ----------------------------------------
232  end if
233 c ----------------------------------------
234  end if
235 c
236 c Now multiply by wmu0 to get actual values.
237 c
238  wmu0 = parms(22)
239  lvar = lvar * wmu0
240  dlidi = dlidi * wmu0
241 c
242 c Reset parameters for the next call.
243 c
244  parms(1) = zia
245  parms(2) = ziamax
246  parms(3) = inew
247  parms(4) = lvar
248 c
249 c Now find dL/dt
250 c
251  dldt = (lvar - lvarold) * rdt
252 c
253  return
254  end
subroutine smagsw_model(rdt, inew, parms, dldt, dlidi, lvar)
Definition: magswmdl.f:1