Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2 | mjames | 1 | /*** Translated to the C language by N. Kyriazis 20 Aug 2003 *** |
2 | |||
3 | Program NEC(input,tape5=input,output,tape11,tape12,tape13,tape14, |
||
4 | tape15,tape16,tape20,tape21) |
||
5 | |||
6 | Numerical Electromagnetics Code (NEC2) developed at Lawrence |
||
7 | Livermore lab., Livermore, CA. (contact G. Burke at 415-422-8414 |
||
8 | for problems with the NEC code. For problems with the vax implem- |
||
9 | entation, contact J. Breakall at 415-422-8196 or E. Domning at 415 |
||
10 | 422-5936) |
||
11 | file created 4/11/80. |
||
12 | |||
13 | ***********Notice********** |
||
14 | This computer code material was prepared as an account of work |
||
15 | sponsored by the United States government. Neither the United |
||
16 | States nor the United States Department Of Energy, nor any of |
||
17 | their employees, nor any of their contractors, subcontractors, |
||
18 | or their employees, makes any warranty, express or implied, or |
||
19 | assumes any legal liability or responsibility for the accuracy, |
||
20 | completeness or usefulness of any information, apparatus, product |
||
21 | or process disclosed, or represents that its use would not infringe |
||
22 | privately-owned rights. |
||
23 | |||
24 | ******************************************************************/ |
||
25 | |||
26 | #include "nec2c.h" |
||
27 | |||
28 | /* common /dataj/ */ |
||
29 | dataj_t dataj; |
||
30 | |||
31 | /* common /gnd/ */ |
||
32 | extern gnd_t gnd; |
||
33 | |||
34 | /* common /incom/ */ |
||
35 | extern incom_t incom; |
||
36 | |||
37 | /* common /tmi/ */ |
||
38 | tmi_t tmi; |
||
39 | |||
40 | /*common /tmh/ */ |
||
41 | static tmh_t tmh; |
||
42 | |||
43 | /* common /gwav/ */ |
||
44 | extern gwav_t gwav; |
||
45 | |||
46 | /* common /data/ */ |
||
47 | extern data_t data; |
||
48 | |||
49 | /* common /crnt/ */ |
||
50 | extern crnt_t crnt; |
||
51 | |||
52 | /* common /fpat/ */ |
||
53 | extern fpat_t fpat; |
||
54 | |||
55 | /* common /plot/ */ |
||
56 | extern plot_t plot; |
||
57 | |||
58 | /* pointers to input/output files */ |
||
59 | extern FILE *input_fp, *output_fp, *plot_fp; |
||
60 | |||
61 | /*-------------------------------------------------------------------*/ |
||
62 | |||
63 | /* compute near e fields of a segment with sine, cosine, and */ |
||
64 | /* constant currents. ground effect included. */ |
||
65 | void efld (double xi, double yi, double zi, double ai, int ij) |
||
66 | { |
||
67 | #define txk egnd[0] |
||
68 | #define tyk egnd[1] |
||
69 | #define tzk egnd[2] |
||
70 | #define txs egnd[3] |
||
71 | #define tys egnd[4] |
||
72 | #define tzs egnd[5] |
||
73 | #define txc egnd[6] |
||
74 | #define tyc egnd[7] |
||
75 | #define tzc egnd[8] |
||
76 | |||
77 | int ip; |
||
78 | double xij, yij, ijx, rfl, salpr, zij, zp, rhox; |
||
79 | double rhoy, rhoz, rh, r, rmag, cth, px, py; |
||
80 | double xymag, xspec, yspec, rhospc, dmin, shaf; |
||
81 | complex double epx, epy, refs, refps, zrsin, zratx, zscrn; |
||
82 | complex double tezs, ters, tezc, terc, tezk, terk, egnd[9]; |
||
83 | |||
84 | xij = xi - dataj.xj; |
||
85 | yij = yi - dataj.yj; |
||
86 | ijx = ij; |
||
87 | rfl = -1.; |
||
88 | |||
89 | for (ip = 0; ip < gnd.ksymp; ip++) |
||
90 | { |
||
91 | if (ip == 1) |
||
92 | ijx = 1; |
||
93 | rfl = -rfl; |
||
94 | salpr = dataj.salpj * rfl; |
||
95 | zij = zi - rfl * dataj.zj; |
||
96 | zp = xij * dataj.cabj + yij * dataj.sabj + zij * salpr; |
||
97 | rhox = xij - dataj.cabj * zp; |
||
98 | rhoy = yij - dataj.sabj * zp; |
||
99 | rhoz = zij - salpr * zp; |
||
100 | |||
101 | rh = sqrtl (rhox * rhox + rhoy * rhoy + rhoz * rhoz + ai * ai); |
||
102 | if (rh <= 1.e-10) |
||
103 | { |
||
104 | rhox = 0.; |
||
105 | rhoy = 0.; |
||
106 | rhoz = 0.; |
||
107 | } |
||
108 | else |
||
109 | { |
||
110 | rhox = rhox / rh; |
||
111 | rhoy = rhoy / rh; |
||
112 | rhoz = rhoz / rh; |
||
113 | } |
||
114 | |||
115 | /* lumped current element approx. for large separations */ |
||
116 | r = sqrtl (zp * zp + rh * rh); |
||
117 | if (r >= dataj.rkh) |
||
118 | { |
||
119 | rmag = TP * r; |
||
120 | cth = zp / r; |
||
121 | px = rh / r; |
||
122 | txk = cmplx (cosl (rmag), -sinl (rmag)); |
||
123 | py = TP * r * r; |
||
124 | tyk = ETA * cth * txk * cmplx (1.0, -1.0 / rmag) / py; |
||
125 | tzk = ETA * px * txk * cmplx (1.0, rmag - 1.0 / rmag) / (2. * py); |
||
126 | tezk = tyk * cth - tzk * px; |
||
127 | terk = tyk * px + tzk * cth; |
||
128 | rmag = sinl (PI * dataj.s) / PI; |
||
129 | tezc = tezk * rmag; |
||
130 | terc = terk * rmag; |
||
131 | tezk = tezk * dataj.s; |
||
132 | terk = terk * dataj.s; |
||
133 | txs = CPLX_00; |
||
134 | tys = CPLX_00; |
||
135 | tzs = CPLX_00; |
||
136 | |||
137 | } /* if( r >= dataj.rkh) */ |
||
138 | |||
139 | if (r < dataj.rkh) |
||
140 | { |
||
141 | /* eksc for thin wire approx. or ekscx for extended t.w. approx. */ |
||
142 | if (dataj.iexk != 1) |
||
143 | eksc ( |
||
144 | dataj.s, |
||
145 | zp, |
||
146 | rh, |
||
147 | TP, |
||
148 | ijx, |
||
149 | &tezs, |
||
150 | &ters, |
||
151 | &tezc, |
||
152 | &terc, |
||
153 | &tezk, |
||
154 | &terk); |
||
155 | else |
||
156 | ekscx ( |
||
157 | dataj.b, |
||
158 | dataj.s, |
||
159 | zp, |
||
160 | rh, |
||
161 | TP, |
||
162 | ijx, |
||
163 | dataj.ind1, |
||
164 | dataj.ind2, |
||
165 | &tezs, |
||
166 | &ters, |
||
167 | &tezc, |
||
168 | &terc, |
||
169 | &tezk, |
||
170 | &terk); |
||
171 | |||
172 | txs = tezs * dataj.cabj + ters * rhox; |
||
173 | tys = tezs * dataj.sabj + ters * rhoy; |
||
174 | tzs = tezs * salpr + ters * rhoz; |
||
175 | |||
176 | } /* if( r < dataj.rkh) */ |
||
177 | |||
178 | txk = tezk * dataj.cabj + terk * rhox; |
||
179 | tyk = tezk * dataj.sabj + terk * rhoy; |
||
180 | tzk = tezk * salpr + terk * rhoz; |
||
181 | txc = tezc * dataj.cabj + terc * rhox; |
||
182 | tyc = tezc * dataj.sabj + terc * rhoy; |
||
183 | tzc = tezc * salpr + terc * rhoz; |
||
184 | |||
185 | if (ip == 1) |
||
186 | { |
||
187 | if (gnd.iperf <= 0) |
||
188 | { |
||
189 | zratx = gnd.zrati; |
||
190 | rmag = r; |
||
191 | xymag = sqrtl (xij * xij + yij * yij); |
||
192 | |||
193 | /* set parameters for radial wire ground screen. */ |
||
194 | if (gnd.nradl != 0) |
||
195 | { |
||
196 | xspec = |
||
197 | (xi * dataj.zj + zi * dataj.xj) / (zi + dataj.zj); |
||
198 | yspec = |
||
199 | (yi * dataj.zj + zi * dataj.yj) / (zi + dataj.zj); |
||
200 | rhospc = sqrtl ( |
||
201 | xspec * xspec + yspec * yspec + gnd.t2 * gnd.t2); |
||
202 | |||
203 | if (rhospc <= gnd.scrwl) |
||
204 | { |
||
205 | zscrn = |
||
206 | gnd.t1 * rhospc * logl (rhospc / gnd.t2); |
||
207 | zratx = (zscrn * gnd.zrati) / |
||
208 | (ETA * gnd.zrati + zscrn); |
||
209 | } |
||
210 | } /* if( gnd.nradl != 0) */ |
||
211 | |||
212 | /* calculation of reflection coefficients when ground is |
||
213 | * specified. */ |
||
214 | if (xymag <= 1.0e-6) |
||
215 | { |
||
216 | px = 0.; |
||
217 | py = 0.; |
||
218 | cth = 1.; |
||
219 | zrsin = CPLX_10; |
||
220 | } |
||
221 | else |
||
222 | { |
||
223 | px = -yij / xymag; |
||
224 | py = xij / xymag; |
||
225 | cth = zij / rmag; |
||
226 | zrsin = |
||
227 | csqrtl (1.0 - zratx * zratx * (1.0 - cth * cth)); |
||
228 | |||
229 | } /* if( xymag <= 1.0e-6) */ |
||
230 | |||
231 | refs = (cth - zratx * zrsin) / (cth + zratx * zrsin); |
||
232 | refps = -(zratx * cth - zrsin) / (zratx * cth + zrsin); |
||
233 | refps = refps - refs; |
||
234 | epy = px * txk + py * tyk; |
||
235 | epx = px * epy; |
||
236 | epy = py * epy; |
||
237 | txk = refs * txk + refps * epx; |
||
238 | tyk = refs * tyk + refps * epy; |
||
239 | tzk = refs * tzk; |
||
240 | epy = px * txs + py * tys; |
||
241 | epx = px * epy; |
||
242 | epy = py * epy; |
||
243 | txs = refs * txs + refps * epx; |
||
244 | tys = refs * tys + refps * epy; |
||
245 | tzs = refs * tzs; |
||
246 | epy = px * txc + py * tyc; |
||
247 | epx = px * epy; |
||
248 | epy = py * epy; |
||
249 | txc = refs * txc + refps * epx; |
||
250 | tyc = refs * tyc + refps * epy; |
||
251 | tzc = refs * tzc; |
||
252 | |||
253 | } /* if( gnd.iperf <= 0) */ |
||
254 | |||
255 | dataj.exk = dataj.exk - txk * gnd.frati; |
||
256 | dataj.eyk = dataj.eyk - tyk * gnd.frati; |
||
257 | dataj.ezk = dataj.ezk - tzk * gnd.frati; |
||
258 | dataj.exs = dataj.exs - txs * gnd.frati; |
||
259 | dataj.eys = dataj.eys - tys * gnd.frati; |
||
260 | dataj.ezs = dataj.ezs - tzs * gnd.frati; |
||
261 | dataj.exc = dataj.exc - txc * gnd.frati; |
||
262 | dataj.eyc = dataj.eyc - tyc * gnd.frati; |
||
263 | dataj.ezc = dataj.ezc - tzc * gnd.frati; |
||
264 | continue; |
||
265 | |||
266 | } /* if( ip == 1) */ |
||
267 | |||
268 | dataj.exk = txk; |
||
269 | dataj.eyk = tyk; |
||
270 | dataj.ezk = tzk; |
||
271 | dataj.exs = txs; |
||
272 | dataj.eys = tys; |
||
273 | dataj.ezs = tzs; |
||
274 | dataj.exc = txc; |
||
275 | dataj.eyc = tyc; |
||
276 | dataj.ezc = tzc; |
||
277 | |||
278 | } /* for( ip = 0; ip < gnd.ksymp; ip++ ) */ |
||
279 | |||
280 | if (gnd.iperf != 2) |
||
281 | return; |
||
282 | |||
283 | /* field due to ground using sommerfeld/norton */ |
||
284 | incom.sn = sqrtl (dataj.cabj * dataj.cabj + dataj.sabj * dataj.sabj); |
||
285 | if (incom.sn >= 1.0e-5) |
||
286 | { |
||
287 | incom.xsn = dataj.cabj / incom.sn; |
||
288 | incom.ysn = dataj.sabj / incom.sn; |
||
289 | } |
||
290 | else |
||
291 | { |
||
292 | incom.sn = 0.; |
||
293 | incom.xsn = 1.; |
||
294 | incom.ysn = 0.; |
||
295 | } |
||
296 | |||
297 | /* displace observation point for thin wire approximation */ |
||
298 | zij = zi + dataj.zj; |
||
299 | salpr = -dataj.salpj; |
||
300 | rhox = dataj.sabj * zij - salpr * yij; |
||
301 | rhoy = salpr * xij - dataj.cabj * zij; |
||
302 | rhoz = dataj.cabj * yij - dataj.sabj * xij; |
||
303 | rh = rhox * rhox + rhoy * rhoy + rhoz * rhoz; |
||
304 | |||
305 | if (rh <= 1.e-10) |
||
306 | { |
||
307 | incom.xo = xi - ai * incom.ysn; |
||
308 | incom.yo = yi + ai * incom.xsn; |
||
309 | incom.zo = zi; |
||
310 | } |
||
311 | else |
||
312 | { |
||
313 | rh = ai / sqrtl (rh); |
||
314 | if (rhoz < 0.) |
||
315 | rh = -rh; |
||
316 | incom.xo = xi + rh * rhox; |
||
317 | incom.yo = yi + rh * rhoy; |
||
318 | incom.zo = zi + rh * rhoz; |
||
319 | |||
320 | } /* if( rh <= 1.e-10) */ |
||
321 | |||
322 | r = xij * xij + yij * yij + zij * zij; |
||
323 | if (r <= .95) |
||
324 | { |
||
325 | /* field from interpolation is integrated over segment */ |
||
326 | incom.isnor = 1; |
||
327 | dmin = dataj.exk * conjl (dataj.exk) + dataj.eyk * conjl (dataj.eyk) + |
||
328 | dataj.ezk * conjl (dataj.ezk); |
||
329 | dmin = .01 * sqrtl (dmin); |
||
330 | shaf = .5 * dataj.s; |
||
331 | rom2 (-shaf, shaf, egnd, dmin); |
||
332 | } |
||
333 | else |
||
334 | { |
||
335 | /* norton field equations and lumped current element approximation */ |
||
336 | incom.isnor = 2; |
||
337 | sflds (0., egnd); |
||
338 | } /* if( r <= .95) */ |
||
339 | |||
340 | if (r > .95) |
||
341 | { |
||
342 | zp = xij * dataj.cabj + yij * dataj.sabj + zij * salpr; |
||
343 | rh = r - zp * zp; |
||
344 | if (rh <= 1.e-10) |
||
345 | dmin = 0.; |
||
346 | else |
||
347 | dmin = sqrtl (rh / (rh + ai * ai)); |
||
348 | |||
349 | if (dmin <= .95) |
||
350 | { |
||
351 | px = 1. - dmin; |
||
352 | terk = (txk * dataj.cabj + tyk * dataj.sabj + tzk * salpr) * px; |
||
353 | txk = dmin * txk + terk * dataj.cabj; |
||
354 | tyk = dmin * tyk + terk * dataj.sabj; |
||
355 | tzk = dmin * tzk + terk * salpr; |
||
356 | ters = (txs * dataj.cabj + tys * dataj.sabj + tzs * salpr) * px; |
||
357 | txs = dmin * txs + ters * dataj.cabj; |
||
358 | tys = dmin * tys + ters * dataj.sabj; |
||
359 | tzs = dmin * tzs + ters * salpr; |
||
360 | terc = (txc * dataj.cabj + tyc * dataj.sabj + tzc * salpr) * px; |
||
361 | txc = dmin * txc + terc * dataj.cabj; |
||
362 | tyc = dmin * tyc + terc * dataj.sabj; |
||
363 | tzc = dmin * tzc + terc * salpr; |
||
364 | |||
365 | } /* if( dmin <= .95) */ |
||
366 | |||
367 | } /* if( r > .95) */ |
||
368 | |||
369 | dataj.exk = dataj.exk + txk; |
||
370 | dataj.eyk = dataj.eyk + tyk; |
||
371 | dataj.ezk = dataj.ezk + tzk; |
||
372 | dataj.exs = dataj.exs + txs; |
||
373 | dataj.eys = dataj.eys + tys; |
||
374 | dataj.ezs = dataj.ezs + tzs; |
||
375 | dataj.exc = dataj.exc + txc; |
||
376 | dataj.eyc = dataj.eyc + tyc; |
||
377 | dataj.ezc = dataj.ezc + tzc; |
||
378 | |||
379 | return; |
||
380 | } |
||
381 | |||
382 | /*-----------------------------------------------------------------------*/ |
||
383 | |||
384 | /* compute e field of sine, cosine, and constant */ |
||
385 | /* current filaments by thin wire approximation. */ |
||
386 | void eksc ( |
||
387 | double s, |
||
388 | double z, |
||
389 | double rh, |
||
390 | double xk, |
||
391 | int ij, |
||
392 | complex double *ezs, |
||
393 | complex double *ers, |
||
394 | complex double *ezc, |
||
395 | complex double *erc, |
||
396 | complex double *ezk, |
||
397 | complex double *erk) |
||
398 | { |
||
399 | double rhk, sh, shk, ss, cs, z1a, z2a, cint, sint; |
||
400 | complex double gz1, gz2, gp1, gp2, gzp1, gzp2; |
||
401 | |||
402 | tmi.ij = ij; |
||
403 | tmi.zpk = xk * z; |
||
404 | rhk = xk * rh; |
||
405 | tmi.rkb2 = rhk * rhk; |
||
406 | sh = .5 * s; |
||
407 | shk = xk * sh; |
||
408 | ss = sinl (shk); |
||
409 | cs = cosl (shk); |
||
410 | z2a = sh - z; |
||
411 | z1a = -(sh + z); |
||
412 | gx (z1a, rh, xk, &gz1, &gp1); |
||
413 | gx (z2a, rh, xk, &gz2, &gp2); |
||
414 | gzp1 = gp1 * z1a; |
||
415 | gzp2 = gp2 * z2a; |
||
416 | *ezs = CONST1 * ((gz2 - gz1) * cs * xk - (gzp2 + gzp1) * ss); |
||
417 | *ezc = -CONST1 * ((gz2 + gz1) * ss * xk + (gzp2 - gzp1) * cs); |
||
418 | *erk = CONST1 * (gp2 - gp1) * rh; |
||
419 | intx (-shk, shk, rhk, ij, &cint, &sint); |
||
420 | *ezk = -CONST1 * (gzp2 - gzp1 + xk * xk * cmplx (cint, -sint)); |
||
421 | gzp1 = gzp1 * z1a; |
||
422 | gzp2 = gzp2 * z2a; |
||
423 | |||
424 | if (rh >= 1.0e-10) |
||
425 | { |
||
426 | *ers = -CONST1 * |
||
427 | ((gzp2 + gzp1 + gz2 + gz1) * ss - (z2a * gz2 - z1a * gz1) * cs * xk) / |
||
428 | rh; |
||
429 | *erc = -CONST1 * |
||
430 | ((gzp2 - gzp1 + gz2 - gz1) * cs + (z2a * gz2 + z1a * gz1) * ss * xk) / |
||
431 | rh; |
||
432 | return; |
||
433 | } |
||
434 | |||
435 | *ers = CPLX_00; |
||
436 | *erc = CPLX_00; |
||
437 | |||
438 | return; |
||
439 | } |
||
440 | |||
441 | /*-----------------------------------------------------------------------*/ |
||
442 | |||
443 | /* compute e field of sine, cosine, and constant current */ |
||
444 | /* filaments by extended thin wire approximation. */ |
||
445 | void ekscx ( |
||
446 | double bx, |
||
447 | double s, |
||
448 | double z, |
||
449 | double rhx, |
||
450 | double xk, |
||
451 | int ij, |
||
452 | int inx1, |
||
453 | int inx2, |
||
454 | complex double *ezs, |
||
455 | complex double *ers, |
||
456 | complex double *ezc, |
||
457 | complex double *erc, |
||
458 | complex double *ezk, |
||
459 | complex double *erk) |
||
460 | { |
||
461 | int ira; |
||
462 | double b, rh, sh, rhk, shk, ss, cs, z1a; |
||
463 | double z2a, a2, bk, bk2, cint, sint; |
||
464 | complex double gz1, gz2, gzp1, gzp2, gr1, gr2; |
||
465 | complex double grp1, grp2, grk1, grk2, gzz1, gzz2; |
||
466 | |||
467 | if (rhx >= bx) |
||
468 | { |
||
469 | rh = rhx; |
||
470 | b = bx; |
||
471 | ira = 0; |
||
472 | } |
||
473 | else |
||
474 | { |
||
475 | rh = bx; |
||
476 | b = rhx; |
||
477 | ira = 1; |
||
478 | } |
||
479 | |||
480 | sh = .5 * s; |
||
481 | tmi.ij = ij; |
||
482 | tmi.zpk = xk * z; |
||
483 | rhk = xk * rh; |
||
484 | tmi.rkb2 = rhk * rhk; |
||
485 | shk = xk * sh; |
||
486 | ss = sinl (shk); |
||
487 | cs = cosl (shk); |
||
488 | z2a = sh - z; |
||
489 | z1a = -(sh + z); |
||
490 | a2 = b * b; |
||
491 | |||
492 | if (inx1 != 2) |
||
493 | gxx (z1a, rh, b, a2, xk, ira, &gz1, &gzp1, &gr1, &grp1, &grk1, &gzz1); |
||
494 | else |
||
495 | { |
||
496 | gx (z1a, rhx, xk, &gz1, &grk1); |
||
497 | gzp1 = grk1 * z1a; |
||
498 | gr1 = gz1 / rhx; |
||
499 | grp1 = gzp1 / rhx; |
||
500 | grk1 = grk1 * rhx; |
||
501 | gzz1 = CPLX_00; |
||
502 | } |
||
503 | |||
504 | if (inx2 != 2) |
||
505 | gxx (z2a, rh, b, a2, xk, ira, &gz2, &gzp2, &gr2, &grp2, &grk2, &gzz2); |
||
506 | else |
||
507 | { |
||
508 | gx (z2a, rhx, xk, &gz2, &grk2); |
||
509 | gzp2 = grk2 * z2a; |
||
510 | gr2 = gz2 / rhx; |
||
511 | grp2 = gzp2 / rhx; |
||
512 | grk2 = grk2 * rhx; |
||
513 | gzz2 = CPLX_00; |
||
514 | } |
||
515 | |||
516 | *ezs = CONST1 * ((gz2 - gz1) * cs * xk - (gzp2 + gzp1) * ss); |
||
517 | *ezc = -CONST1 * ((gz2 + gz1) * ss * xk + (gzp2 - gzp1) * cs); |
||
518 | *ers = -CONST1 * ((z2a * grp2 + z1a * grp1 + gr2 + gr1) * ss - |
||
519 | (z2a * gr2 - z1a * gr1) * cs * xk); |
||
520 | *erc = -CONST1 * ((z2a * grp2 - z1a * grp1 + gr2 - gr1) * cs + |
||
521 | (z2a * gr2 + z1a * gr1) * ss * xk); |
||
522 | *erk = CONST1 * (grk2 - grk1); |
||
523 | intx (-shk, shk, rhk, ij, &cint, &sint); |
||
524 | bk = b * xk; |
||
525 | bk2 = bk * bk * .25; |
||
526 | *ezk = -CONST1 * (gzp2 - gzp1 + xk * xk * (1. - bk2) * cmplx (cint, -sint) - |
||
527 | bk2 * (gzz2 - gzz1)); |
||
528 | |||
529 | return; |
||
530 | } |
||
531 | |||
532 | /*-----------------------------------------------------------------------*/ |
||
533 | |||
534 | /* integrand for h field of a wire */ |
||
535 | void gh (double zk, double *hr, double *hi) |
||
536 | { |
||
537 | double rs, r, ckr, skr, rr2, rr3; |
||
538 | |||
539 | rs = zk - tmh.zpka; |
||
540 | rs = tmh.rhks + rs * rs; |
||
541 | r = sqrtl (rs); |
||
542 | ckr = cosl (r); |
||
543 | skr = sinl (r); |
||
544 | rr2 = 1. / rs; |
||
545 | rr3 = rr2 / r; |
||
546 | *hr = skr * rr2 + ckr * rr3; |
||
547 | *hi = ckr * rr2 - skr * rr3; |
||
548 | |||
549 | return; |
||
550 | } |
||
551 | |||
552 | /*-----------------------------------------------------------------------*/ |
||
553 | |||
554 | /* gwave computes the electric field, including ground wave, of a */ |
||
555 | /* current element over a ground plane using formulas of k.a. norton */ |
||
556 | /* (proc. ire, sept., 1937, pp.1203,1236.) */ |
||
557 | |||
558 | void gwave ( |
||
559 | complex double *erv, |
||
560 | complex double *ezv, |
||
561 | complex double *erh, |
||
562 | complex double *ezh, |
||
563 | complex double *eph) |
||
564 | { |
||
565 | double sppp, sppp2, cppp2, cppp, spp, spp2, cpp2, cpp; |
||
566 | complex double rk1, rk2, t1, t2, t3, t4, p1, rv; |
||
567 | complex double omr, w, f, q1, rh, v, g, xr1, xr2; |
||
568 | complex double x1, x2, x3, x4, x5, x6, x7; |
||
569 | |||
570 | sppp = gwav.zmh / gwav.r1; |
||
571 | sppp2 = sppp * sppp; |
||
572 | cppp2 = 1. - sppp2; |
||
573 | |||
574 | if (cppp2 < 1.0e-20) |
||
575 | cppp2 = 1.0e-20; |
||
576 | |||
577 | cppp = sqrtl (cppp2); |
||
578 | spp = gwav.zph / gwav.r2; |
||
579 | spp2 = spp * spp; |
||
580 | cpp2 = 1. - spp2; |
||
581 | |||
582 | if (cpp2 < 1.0e-20) |
||
583 | cpp2 = 1.0e-20; |
||
584 | |||
585 | cpp = sqrtl (cpp2); |
||
586 | rk1 = -TPJ * gwav.r1; |
||
587 | rk2 = -TPJ * gwav.r2; |
||
588 | t1 = 1. - gwav.u2 * cpp2; |
||
589 | t2 = csqrtl (t1); |
||
590 | t3 = (1. - 1. / rk1) / rk1; |
||
591 | t4 = (1. - 1. / rk2) / rk2; |
||
592 | p1 = rk2 * gwav.u2 * t1 / (2. * cpp2); |
||
593 | rv = (spp - gwav.u * t2) / (spp + gwav.u * t2); |
||
594 | omr = 1. - rv; |
||
595 | w = 1. / omr; |
||
596 | w = (4.0 + 0.0fj) * p1 * w * w; |
||
597 | fbar (w, &f); |
||
598 | q1 = rk2 * t1 / (2. * gwav.u2 * cpp2); |
||
599 | rh = (t2 - gwav.u * spp) / (t2 + gwav.u * spp); |
||
600 | v = 1. / (1. + rh); |
||
601 | v = (4.0 + 0.0fj) * q1 * v * v; |
||
602 | fbar (v, &g); |
||
603 | xr1 = gwav.xx1 / gwav.r1; |
||
604 | xr2 = gwav.xx2 / gwav.r2; |
||
605 | x1 = cppp2 * xr1; |
||
606 | x2 = rv * cpp2 * xr2; |
||
607 | x3 = omr * cpp2 * f * xr2; |
||
608 | x4 = gwav.u * t2 * spp * 2. * xr2 / rk2; |
||
609 | x5 = xr1 * t3 * (1. - 3. * sppp2); |
||
610 | x6 = xr2 * t4 * (1. - 3. * spp2); |
||
611 | *ezv = (x1 + x2 + x3 - x4 - x5 - x6) * (-CONST4); |
||
612 | x1 = sppp * cppp * xr1; |
||
613 | x2 = rv * spp * cpp * xr2; |
||
614 | x3 = cpp * omr * gwav.u * t2 * f * xr2; |
||
615 | x4 = spp * cpp * omr * xr2 / rk2; |
||
616 | x5 = 3. * sppp * cppp * t3 * xr1; |
||
617 | x6 = cpp * gwav.u * t2 * omr * xr2 / rk2 * .5; |
||
618 | x7 = 3. * spp * cpp * t4 * xr2; |
||
619 | *erv = -(x1 + x2 - x3 + x4 - x5 + x6 - x7) * (-CONST4); |
||
620 | *ezh = -(x1 - x2 + x3 - x4 - x5 - x6 + x7) * (-CONST4); |
||
621 | x1 = sppp2 * xr1; |
||
622 | x2 = rv * spp2 * xr2; |
||
623 | x4 = gwav.u2 * t1 * omr * f * xr2; |
||
624 | x5 = t3 * (1. - 3. * cppp2) * xr1; |
||
625 | x6 = t4 * (1. - 3. * cpp2) * (1. - gwav.u2 * (1. + rv) - gwav.u2 * omr * f) * xr2; |
||
626 | x7 = gwav.u2 * cpp2 * omr * (1. - 1. / rk2) * |
||
627 | (f * (gwav.u2 * t1 - spp2 - 1. / rk2) + 1. / rk2) * xr2; |
||
628 | *erh = (x1 - x2 - x4 - x5 + x6 + x7) * (-CONST4); |
||
629 | x1 = xr1; |
||
630 | x2 = rh * xr2; |
||
631 | x3 = (rh + 1.) * g * xr2; |
||
632 | x4 = t3 * xr1; |
||
633 | x5 = t4 * (1. - gwav.u2 * (1. + rv) - gwav.u2 * omr * f) * xr2; |
||
634 | x6 = |
||
635 | .5 * gwav.u2 * omr * (f * (gwav.u2 * t1 - spp2 - 1. / rk2) + 1. / rk2) * xr2 / rk2; |
||
636 | *eph = -(x1 - x2 + x3 - x4 + x5 + x6) * (-CONST4); |
||
637 | |||
638 | return; |
||
639 | } |
||
640 | |||
641 | /*-----------------------------------------------------------------------*/ |
||
642 | |||
643 | /* segment end contributions for thin wire approx. */ |
||
644 | void gx (double zz, double rh, double xk, complex double *gz, complex double *gzp) |
||
645 | { |
||
646 | double r, r2, rkz; |
||
647 | |||
648 | r2 = zz * zz + rh * rh; |
||
649 | r = sqrtl (r2); |
||
650 | rkz = xk * r; |
||
651 | *gz = cmplx (cosl (rkz), -sinl (rkz)) / r; |
||
652 | *gzp = -cmplx (1.0, rkz) * *gz / r2; |
||
653 | |||
654 | return; |
||
655 | } |
||
656 | |||
657 | /*-----------------------------------------------------------------------*/ |
||
658 | |||
659 | /* segment end contributions for ext. thin wire approx. */ |
||
660 | void gxx ( |
||
661 | double zz, |
||
662 | double rh, |
||
663 | double a, |
||
664 | double a2, |
||
665 | double xk, |
||
666 | int ira, |
||
667 | complex double *g1, |
||
668 | complex double *g1p, |
||
669 | complex double *g2, |
||
670 | complex double *g2p, |
||
671 | complex double *g3, |
||
672 | complex double *gzp) |
||
673 | { |
||
674 | double r, r2, r4, rk, rk2, rh2, t1, t2; |
||
675 | complex double gz, c1, c2, c3; |
||
676 | |||
677 | r2 = zz * zz + rh * rh; |
||
678 | r = sqrtl (r2); |
||
679 | r4 = r2 * r2; |
||
680 | rk = xk * r; |
||
681 | rk2 = rk * rk; |
||
682 | rh2 = rh * rh; |
||
683 | t1 = .25 * a2 * rh2 / r4; |
||
684 | t2 = .5 * a2 / r2; |
||
685 | c1 = cmplx (1.0, rk); |
||
686 | c2 = 3. * c1 - rk2; |
||
687 | c3 = cmplx (6.0, rk) * rk2 - 15. * c1; |
||
688 | gz = cmplx (cosl (rk), -sinl (rk)) / r; |
||
689 | *g2 = gz * (1. + t1 * c2); |
||
690 | *g1 = *g2 - t2 * c1 * gz; |
||
691 | gz = gz / r2; |
||
692 | *g2p = gz * (t1 * c3 - c1); |
||
693 | *gzp = t2 * c2 * gz; |
||
694 | *g3 = *g2p + *gzp; |
||
695 | *g1p = *g3 * zz; |
||
696 | |||
697 | if (ira != 1) |
||
698 | { |
||
699 | *g3 = (*g3 + *gzp) * rh; |
||
700 | *gzp = -zz * c1 * gz; |
||
701 | |||
702 | if (rh <= 1.0e-10) |
||
703 | { |
||
704 | *g2 = 0.; |
||
705 | *g2p = 0.; |
||
706 | return; |
||
707 | } |
||
708 | |||
709 | *g2 = *g2 / rh; |
||
710 | *g2p = *g2p * zz / rh; |
||
711 | return; |
||
712 | |||
713 | } /* if( ira != 1) */ |
||
714 | |||
715 | t2 = .5 * a; |
||
716 | *g2 = -t2 * c1 * gz; |
||
717 | *g2p = t2 * gz * c2 / r2; |
||
718 | *g3 = rh2 * *g2p - a * gz * c1; |
||
719 | *g2p = *g2p * zz; |
||
720 | *gzp = -zz * c1 * gz; |
||
721 | |||
722 | return; |
||
723 | } |
||
724 | |||
725 | /*-----------------------------------------------------------------------*/ |
||
726 | |||
727 | /* hfk computes the h field of a uniform current */ |
||
728 | /* filament by numerical integration */ |
||
729 | void hfk (double el1, double el2, double rhk, double zpkx, double *sgr, double *sgi) |
||
730 | { |
||
731 | int nx = 1, nma = 65536, nts = 4; |
||
732 | int ns, nt; |
||
733 | int flag = TRUE; |
||
734 | double rx = 1.0e-4; |
||
735 | double z, ze, s, ep, zend, dz = 0., zp, dzot = 0., t00r, g1r, g5r = 0, t00i; |
||
736 | double g1i, g5i = 0., t01r, g3r = 0, t01i, g3i = 0, t10r, t10i, te1i, te1r, t02r; |
||
737 | double g2r, g4r, t02i, g2i, g4i, t11r, t11i, t20r, t20i, te2i, te2r; |
||
738 | |||
739 | tmh.zpka = zpkx; |
||
740 | tmh.rhks = rhk * rhk; |
||
741 | z = el1; |
||
742 | ze = el2; |
||
743 | s = ze - z; |
||
744 | ep = s / (10. * nma); |
||
745 | zend = ze - ep; |
||
746 | *sgr = 0.0; |
||
747 | *sgi = 0.0; |
||
748 | ns = nx; |
||
749 | nt = 0; |
||
750 | gh (z, &g1r, &g1i); |
||
751 | |||
752 | while (TRUE) |
||
753 | { |
||
754 | if (flag) |
||
755 | { |
||
756 | dz = s / ns; |
||
757 | zp = z + dz; |
||
758 | |||
759 | if (zp > ze) |
||
760 | { |
||
761 | dz = ze - z; |
||
762 | if (fabsl (dz) <= ep) |
||
763 | { |
||
764 | *sgr = *sgr * rhk * .5; |
||
765 | *sgi = *sgi * rhk * .5; |
||
766 | return; |
||
767 | } |
||
768 | } |
||
769 | |||
770 | dzot = dz * .5; |
||
771 | zp = z + dzot; |
||
772 | gh (zp, &g3r, &g3i); |
||
773 | zp = z + dz; |
||
774 | gh (zp, &g5r, &g5i); |
||
775 | |||
776 | } /* if( flag ) */ |
||
777 | |||
778 | t00r = (g1r + g5r) * dzot; |
||
779 | t00i = (g1i + g5i) * dzot; |
||
780 | t01r = (t00r + dz * g3r) * 0.5; |
||
781 | t01i = (t00i + dz * g3i) * 0.5; |
||
782 | t10r = (4.0 * t01r - t00r) / 3.0; |
||
783 | t10i = (4.0 * t01i - t00i) / 3.0; |
||
784 | |||
785 | test (t01r, t10r, &te1r, t01i, t10i, &te1i, 0.); |
||
786 | if ((te1i <= rx) && (te1r <= rx)) |
||
787 | { |
||
788 | *sgr = *sgr + t10r; |
||
789 | *sgi = *sgi + t10i; |
||
790 | nt += 2; |
||
791 | |||
792 | z += dz; |
||
793 | if (z >= zend) |
||
794 | { |
||
795 | *sgr = *sgr * rhk * .5; |
||
796 | *sgi = *sgi * rhk * .5; |
||
797 | return; |
||
798 | } |
||
799 | |||
800 | g1r = g5r; |
||
801 | g1i = g5i; |
||
802 | if (nt >= nts) |
||
803 | if (ns > nx) |
||
804 | { |
||
805 | ns = ns / 2; |
||
806 | nt = 1; |
||
807 | } |
||
808 | flag = TRUE; |
||
809 | continue; |
||
810 | |||
811 | } /* if( (te1i <= rx) && (te1r <= rx) ) */ |
||
812 | |||
813 | zp = z + dz * 0.25; |
||
814 | gh (zp, &g2r, &g2i); |
||
815 | zp = z + dz * 0.75; |
||
816 | gh (zp, &g4r, &g4i); |
||
817 | t02r = (t01r + dzot * (g2r + g4r)) * 0.5; |
||
818 | t02i = (t01i + dzot * (g2i + g4i)) * 0.5; |
||
819 | t11r = (4.0 * t02r - t01r) / 3.0; |
||
820 | t11i = (4.0 * t02i - t01i) / 3.0; |
||
821 | t20r = (16.0 * t11r - t10r) / 15.0; |
||
822 | t20i = (16.0 * t11i - t10i) / 15.0; |
||
823 | |||
824 | test (t11r, t20r, &te2r, t11i, t20i, &te2i, 0.); |
||
825 | if ((te2i > rx) || (te2r > rx)) |
||
826 | { |
||
827 | nt = 0; |
||
828 | if (ns >= nma) |
||
829 | fprintf (output_fp, "\n STEP SIZE LIMITED AT Z= %10.5f", z); |
||
830 | else |
||
831 | { |
||
832 | ns = ns * 2; |
||
833 | dz = s / ns; |
||
834 | dzot = dz * 0.5; |
||
835 | g5r = g3r; |
||
836 | g5i = g3i; |
||
837 | g3r = g2r; |
||
838 | g3i = g2i; |
||
839 | |||
840 | flag = FALSE; |
||
841 | continue; |
||
842 | } |
||
843 | |||
844 | } /* if( (te2i > rx) || (te2r > rx) ) */ |
||
845 | |||
846 | *sgr = *sgr + t20r; |
||
847 | *sgi = *sgi + t20i; |
||
848 | nt++; |
||
849 | |||
850 | z += dz; |
||
851 | if (z >= zend) |
||
852 | { |
||
853 | *sgr = *sgr * rhk * .5; |
||
854 | *sgi = *sgi * rhk * .5; |
||
855 | return; |
||
856 | } |
||
857 | |||
858 | g1r = g5r; |
||
859 | g1i = g5i; |
||
860 | if (nt >= nts) |
||
861 | if (ns > nx) |
||
862 | { |
||
863 | ns = ns / 2; |
||
864 | nt = 1; |
||
865 | } |
||
866 | flag = TRUE; |
||
867 | |||
868 | } /* while( TRUE ) */ |
||
869 | } |
||
870 | |||
871 | /*-----------------------------------------------------------------------*/ |
||
872 | |||
873 | /* hintg computes the h field of a patch current */ |
||
874 | void hintg (double xi, double yi, double zi) |
||
875 | { |
||
876 | int ip; |
||
877 | double rx, ry, rfl, xymag, pxx, pyy, cth; |
||
878 | double rz, rsq, r, rk, cr, sr, t1zr, t2zr; |
||
879 | complex double gam, f1x, f1y, f1z, f2x, f2y, f2z, rrv, rrh; |
||
880 | |||
881 | rx = xi - dataj.xj; |
||
882 | ry = yi - dataj.yj; |
||
883 | rfl = -1.; |
||
884 | dataj.exk = CPLX_00; |
||
885 | dataj.eyk = CPLX_00; |
||
886 | dataj.ezk = CPLX_00; |
||
887 | dataj.exs = CPLX_00; |
||
888 | dataj.eys = CPLX_00; |
||
889 | dataj.ezs = CPLX_00; |
||
890 | |||
891 | for (ip = 1; ip <= gnd.ksymp; ip++) |
||
892 | { |
||
893 | rfl = -rfl; |
||
894 | rz = zi - dataj.zj * rfl; |
||
895 | rsq = rx * rx + ry * ry + rz * rz; |
||
896 | |||
897 | if (rsq < 1.0e-20) |
||
898 | continue; |
||
899 | |||
900 | r = sqrtl (rsq); |
||
901 | rk = TP * r; |
||
902 | cr = cosl (rk); |
||
903 | sr = sinl (rk); |
||
904 | gam = -(cmplx (cr, -sr) + rk * cmplx (sr, cr)) / (FPI * rsq * r) * dataj.s; |
||
905 | dataj.exc = gam * rx; |
||
906 | dataj.eyc = gam * ry; |
||
907 | dataj.ezc = gam * rz; |
||
908 | t1zr = dataj.t1zj * rfl; |
||
909 | t2zr = dataj.t2zj * rfl; |
||
910 | f1x = dataj.eyc * t1zr - dataj.ezc * dataj.t1yj; |
||
911 | f1y = dataj.ezc * dataj.t1xj - dataj.exc * t1zr; |
||
912 | f1z = dataj.exc * dataj.t1yj - dataj.eyc * dataj.t1xj; |
||
913 | f2x = dataj.eyc * t2zr - dataj.ezc * dataj.t2yj; |
||
914 | f2y = dataj.ezc * dataj.t2xj - dataj.exc * t2zr; |
||
915 | f2z = dataj.exc * dataj.t2yj - dataj.eyc * dataj.t2xj; |
||
916 | |||
917 | if (ip != 1) |
||
918 | { |
||
919 | if (gnd.iperf == 1) |
||
920 | { |
||
921 | f1x = -f1x; |
||
922 | f1y = -f1y; |
||
923 | f1z = -f1z; |
||
924 | f2x = -f2x; |
||
925 | f2y = -f2y; |
||
926 | f2z = -f2z; |
||
927 | } |
||
928 | else |
||
929 | { |
||
930 | xymag = sqrtl (rx * rx + ry * ry); |
||
931 | if (xymag <= 1.0e-6) |
||
932 | { |
||
933 | pxx = 0.; |
||
934 | pyy = 0.; |
||
935 | cth = 1.; |
||
936 | rrv = CPLX_10; |
||
937 | } |
||
938 | else |
||
939 | { |
||
940 | pxx = -ry / xymag; |
||
941 | pyy = rx / xymag; |
||
942 | cth = rz / r; |
||
943 | rrv = csqrtl ( |
||
944 | 1. - gnd.zrati * gnd.zrati * (1. - cth * cth)); |
||
945 | |||
946 | } /* if( xymag <= 1.0e-6) */ |
||
947 | |||
948 | rrh = gnd.zrati * cth; |
||
949 | rrh = (rrh - rrv) / (rrh + rrv); |
||
950 | rrv = gnd.zrati * rrv; |
||
951 | rrv = -(cth - rrv) / (cth + rrv); |
||
952 | gam = (f1x * pxx + f1y * pyy) * (rrv - rrh); |
||
953 | f1x = f1x * rrh + gam * pxx; |
||
954 | f1y = f1y * rrh + gam * pyy; |
||
955 | f1z = f1z * rrh; |
||
956 | gam = (f2x * pxx + f2y * pyy) * (rrv - rrh); |
||
957 | f2x = f2x * rrh + gam * pxx; |
||
958 | f2y = f2y * rrh + gam * pyy; |
||
959 | f2z = f2z * rrh; |
||
960 | |||
961 | } /* if( gnd.iperf == 1) */ |
||
962 | |||
963 | } /* if( ip != 1) */ |
||
964 | |||
965 | dataj.exk += f1x; |
||
966 | dataj.eyk += f1y; |
||
967 | dataj.ezk += f1z; |
||
968 | dataj.exs += f2x; |
||
969 | dataj.eys += f2y; |
||
970 | dataj.ezs += f2z; |
||
971 | |||
972 | } /* for( ip = 1; ip <= gnd.ksymp; ip++ ) */ |
||
973 | |||
974 | return; |
||
975 | } |
||
976 | |||
977 | /*-----------------------------------------------------------------------*/ |
||
978 | |||
979 | /* hsfld computes the h field for constant, sine, and */ |
||
980 | /* cosine current on a segment including ground effects. */ |
||
981 | void hsfld (double xi, double yi, double zi, double ai) |
||
982 | { |
||
983 | int ip; |
||
984 | double xij, yij, rfl, salpr, zij, zp, rhox, rhoy, rhoz, rh, phx; |
||
985 | double phy, phz, rmag, xymag, xspec, yspec, rhospc, px, py, cth; |
||
986 | complex double hpk, hps, hpc, qx, qy, qz, rrv, rrh, zratx; |
||
987 | |||
988 | xij = xi - dataj.xj; |
||
989 | yij = yi - dataj.yj; |
||
990 | rfl = -1.; |
||
991 | |||
992 | for (ip = 0; ip < gnd.ksymp; ip++) |
||
993 | { |
||
994 | rfl = -rfl; |
||
995 | salpr = dataj.salpj * rfl; |
||
996 | zij = zi - rfl * dataj.zj; |
||
997 | zp = xij * dataj.cabj + yij * dataj.sabj + zij * salpr; |
||
998 | rhox = xij - dataj.cabj * zp; |
||
999 | rhoy = yij - dataj.sabj * zp; |
||
1000 | rhoz = zij - salpr * zp; |
||
1001 | rh = sqrtl (rhox * rhox + rhoy * rhoy + rhoz * rhoz + ai * ai); |
||
1002 | |||
1003 | if (rh <= 1.0e-10) |
||
1004 | { |
||
1005 | dataj.exk = 0.; |
||
1006 | dataj.eyk = 0.; |
||
1007 | dataj.ezk = 0.; |
||
1008 | dataj.exs = 0.; |
||
1009 | dataj.eys = 0.; |
||
1010 | dataj.ezs = 0.; |
||
1011 | dataj.exc = 0.; |
||
1012 | dataj.eyc = 0.; |
||
1013 | dataj.ezc = 0.; |
||
1014 | continue; |
||
1015 | } |
||
1016 | |||
1017 | rhox = rhox / rh; |
||
1018 | rhoy = rhoy / rh; |
||
1019 | rhoz = rhoz / rh; |
||
1020 | phx = dataj.sabj * rhoz - salpr * rhoy; |
||
1021 | phy = salpr * rhox - dataj.cabj * rhoz; |
||
1022 | phz = dataj.cabj * rhoy - dataj.sabj * rhox; |
||
1023 | |||
1024 | hsflx (dataj.s, rh, zp, &hpk, &hps, &hpc); |
||
1025 | |||
1026 | if (ip == 1) |
||
1027 | { |
||
1028 | if (gnd.iperf != 1) |
||
1029 | { |
||
1030 | zratx = gnd.zrati; |
||
1031 | rmag = sqrtl (zp * zp + rh * rh); |
||
1032 | xymag = sqrtl (xij * xij + yij * yij); |
||
1033 | |||
1034 | /* set parameters for radial wire ground screen. */ |
||
1035 | if (gnd.nradl != 0) |
||
1036 | { |
||
1037 | xspec = |
||
1038 | (xi * dataj.zj + zi * dataj.xj) / (zi + dataj.zj); |
||
1039 | yspec = |
||
1040 | (yi * dataj.zj + zi * dataj.yj) / (zi + dataj.zj); |
||
1041 | rhospc = sqrtl ( |
||
1042 | xspec * xspec + yspec * yspec + gnd.t2 * gnd.t2); |
||
1043 | |||
1044 | if (rhospc <= gnd.scrwl) |
||
1045 | { |
||
1046 | rrv = gnd.t1 * rhospc * logl (rhospc / gnd.t2); |
||
1047 | zratx = (rrv * gnd.zrati) / |
||
1048 | (ETA * gnd.zrati + rrv); |
||
1049 | } |
||
1050 | } |
||
1051 | |||
1052 | /* calculation of reflection coefficients when ground is |
||
1053 | * specified. */ |
||
1054 | if (xymag <= 1.0e-6) |
||
1055 | { |
||
1056 | px = 0.; |
||
1057 | py = 0.; |
||
1058 | cth = 1.; |
||
1059 | rrv = CPLX_10; |
||
1060 | } |
||
1061 | else |
||
1062 | { |
||
1063 | px = -yij / xymag; |
||
1064 | py = xij / xymag; |
||
1065 | cth = zij / rmag; |
||
1066 | rrv = csqrtl (1. - zratx * zratx * (1. - cth * cth)); |
||
1067 | } |
||
1068 | |||
1069 | rrh = zratx * cth; |
||
1070 | rrh = -(rrh - rrv) / (rrh + rrv); |
||
1071 | rrv = zratx * rrv; |
||
1072 | rrv = (cth - rrv) / (cth + rrv); |
||
1073 | qy = (phx * px + phy * py) * (rrv - rrh); |
||
1074 | qx = qy * px + phx * rrh; |
||
1075 | qy = qy * py + phy * rrh; |
||
1076 | qz = phz * rrh; |
||
1077 | dataj.exk = dataj.exk - hpk * qx; |
||
1078 | dataj.eyk = dataj.eyk - hpk * qy; |
||
1079 | dataj.ezk = dataj.ezk - hpk * qz; |
||
1080 | dataj.exs = dataj.exs - hps * qx; |
||
1081 | dataj.eys = dataj.eys - hps * qy; |
||
1082 | dataj.ezs = dataj.ezs - hps * qz; |
||
1083 | dataj.exc = dataj.exc - hpc * qx; |
||
1084 | dataj.eyc = dataj.eyc - hpc * qy; |
||
1085 | dataj.ezc = dataj.ezc - hpc * qz; |
||
1086 | continue; |
||
1087 | |||
1088 | } /* if( gnd.iperf != 1 ) */ |
||
1089 | |||
1090 | dataj.exk = dataj.exk - hpk * phx; |
||
1091 | dataj.eyk = dataj.eyk - hpk * phy; |
||
1092 | dataj.ezk = dataj.ezk - hpk * phz; |
||
1093 | dataj.exs = dataj.exs - hps * phx; |
||
1094 | dataj.eys = dataj.eys - hps * phy; |
||
1095 | dataj.ezs = dataj.ezs - hps * phz; |
||
1096 | dataj.exc = dataj.exc - hpc * phx; |
||
1097 | dataj.eyc = dataj.eyc - hpc * phy; |
||
1098 | dataj.ezc = dataj.ezc - hpc * phz; |
||
1099 | continue; |
||
1100 | |||
1101 | } /* if( ip == 1 ) */ |
||
1102 | |||
1103 | dataj.exk = hpk * phx; |
||
1104 | dataj.eyk = hpk * phy; |
||
1105 | dataj.ezk = hpk * phz; |
||
1106 | dataj.exs = hps * phx; |
||
1107 | dataj.eys = hps * phy; |
||
1108 | dataj.ezs = hps * phz; |
||
1109 | dataj.exc = hpc * phx; |
||
1110 | dataj.eyc = hpc * phy; |
||
1111 | dataj.ezc = hpc * phz; |
||
1112 | |||
1113 | } /* for( ip = 0; ip < gnd.ksymp; ip++ ) */ |
||
1114 | |||
1115 | return; |
||
1116 | } |
||
1117 | |||
1118 | /*-----------------------------------------------------------------------*/ |
||
1119 | |||
1120 | /* calculates h field of sine cosine, and constant current of segment */ |
||
1121 | void hsflx ( |
||
1122 | double s, |
||
1123 | double rh, |
||
1124 | double zpx, |
||
1125 | complex double *hpk, |
||
1126 | complex double *hps, |
||
1127 | complex double *hpc) |
||
1128 | { |
||
1129 | double r1, r2, zp, z2a, hss, dh, z1; |
||
1130 | double rhz, dk, cdk, sdk, hkr, hki, rh2; |
||
1131 | complex double fjk, ekr1, ekr2, t1, t2, cons; |
||
1132 | |||
1133 | fjk = -TPJ; |
||
1134 | if (rh >= 1.0e-10) |
||
1135 | { |
||
1136 | if (zpx >= 0.) |
||
1137 | { |
||
1138 | zp = zpx; |
||
1139 | hss = 1.; |
||
1140 | } |
||
1141 | else |
||
1142 | { |
||
1143 | zp = -zpx; |
||
1144 | hss = -1.; |
||
1145 | } |
||
1146 | |||
1147 | dh = .5 * s; |
||
1148 | z1 = zp + dh; |
||
1149 | z2a = zp - dh; |
||
1150 | if (z2a >= 1.0e-7) |
||
1151 | rhz = rh / z2a; |
||
1152 | else |
||
1153 | rhz = 1.; |
||
1154 | |||
1155 | dk = TP * dh; |
||
1156 | cdk = cosl (dk); |
||
1157 | sdk = sinl (dk); |
||
1158 | hfk (-dk, dk, rh * TP, zp * TP, &hkr, &hki); |
||
1159 | *hpk = cmplx (hkr, hki); |
||
1160 | |||
1161 | if (rhz >= 1.0e-3) |
||
1162 | { |
||
1163 | rh2 = rh * rh; |
||
1164 | r1 = sqrtl (rh2 + z1 * z1); |
||
1165 | r2 = sqrtl (rh2 + z2a * z2a); |
||
1166 | ekr1 = cexp (fjk * r1); |
||
1167 | ekr2 = cexp (fjk * r2); |
||
1168 | t1 = z1 * ekr1 / r1; |
||
1169 | t2 = z2a * ekr2 / r2; |
||
1170 | *hps = (cdk * (ekr2 - ekr1) - CPLX_01 * sdk * (t2 + t1)) * hss; |
||
1171 | *hpc = -sdk * (ekr2 + ekr1) - CPLX_01 * cdk * (t2 - t1); |
||
1172 | cons = -CPLX_01 / (2. * TP * rh); |
||
1173 | *hps = cons * *hps; |
||
1174 | *hpc = cons * *hpc; |
||
1175 | return; |
||
1176 | |||
1177 | } /* if( rhz >= 1.0e-3) */ |
||
1178 | |||
1179 | ekr1 = cmplx (cdk, sdk) / (z2a * z2a); |
||
1180 | ekr2 = cmplx (cdk, -sdk) / (z1 * z1); |
||
1181 | t1 = TP * (1. / z1 - 1. / z2a); |
||
1182 | t2 = cexp (fjk * zp) * rh / PI8; |
||
1183 | *hps = t2 * (t1 + (ekr1 + ekr2) * sdk) * hss; |
||
1184 | *hpc = t2 * (-CPLX_01 * t1 + (ekr1 - ekr2) * cdk); |
||
1185 | return; |
||
1186 | |||
1187 | } /* if( rh >= 1.0e-10) */ |
||
1188 | |||
1189 | *hps = CPLX_00; |
||
1190 | *hpc = CPLX_00; |
||
1191 | *hpk = CPLX_00; |
||
1192 | |||
1193 | return; |
||
1194 | } |
||
1195 | |||
1196 | /*-----------------------------------------------------------------------*/ |
||
1197 | |||
1198 | /* nefld computes the near field at specified points in space after */ |
||
1199 | /* the structure currents have been computed. */ |
||
1200 | void nefld ( |
||
1201 | double xob, |
||
1202 | double yob, |
||
1203 | double zob, |
||
1204 | complex double *ex, |
||
1205 | complex double *ey, |
||
1206 | complex double *ez) |
||
1207 | { |
||
1208 | int i, ix, ipr, iprx, jc, ipa; |
||
1209 | double zp, xi, ax; |
||
1210 | complex double acx, bcx, ccx; |
||
1211 | |||
1212 | *ex = CPLX_00; |
||
1213 | *ey = CPLX_00; |
||
1214 | *ez = CPLX_00; |
||
1215 | ax = 0.; |
||
1216 | |||
1217 | if (data.n != 0) |
||
1218 | { |
||
1219 | for (i = 0; i < data.n; i++) |
||
1220 | { |
||
1221 | dataj.xj = xob - data.x[i]; |
||
1222 | dataj.yj = yob - data.y[i]; |
||
1223 | dataj.zj = zob - data.z[i]; |
||
1224 | zp = data.cab[i] * dataj.xj + data.sab[i] * dataj.yj + |
||
1225 | data.salp[i] * dataj.zj; |
||
1226 | |||
1227 | if (fabsl (zp) > 0.5001 * data.si[i]) |
||
1228 | continue; |
||
1229 | |||
1230 | zp = dataj.xj * dataj.xj + dataj.yj * dataj.yj + dataj.zj * dataj.zj - |
||
1231 | zp * zp; |
||
1232 | dataj.xj = data.bi[i]; |
||
1233 | |||
1234 | if (zp > 0.9 * dataj.xj * dataj.xj) |
||
1235 | continue; |
||
1236 | |||
1237 | ax = dataj.xj; |
||
1238 | break; |
||
1239 | |||
1240 | } /* for( i = 0; i < n; i++ ) */ |
||
1241 | |||
1242 | for (i = 0; i < data.n; i++) |
||
1243 | { |
||
1244 | ix = i + 1; |
||
1245 | dataj.s = data.si[i]; |
||
1246 | dataj.b = data.bi[i]; |
||
1247 | dataj.xj = data.x[i]; |
||
1248 | dataj.yj = data.y[i]; |
||
1249 | dataj.zj = data.z[i]; |
||
1250 | dataj.cabj = data.cab[i]; |
||
1251 | dataj.sabj = data.sab[i]; |
||
1252 | dataj.salpj = data.salp[i]; |
||
1253 | |||
1254 | if (dataj.iexk != 0) |
||
1255 | { |
||
1256 | ipr = data.icon1[i]; |
||
1257 | |||
1258 | if (ipr > PCHCON) |
||
1259 | dataj.ind1 = 2; |
||
1260 | else if (ipr < 0) |
||
1261 | { |
||
1262 | ipr = -ipr; |
||
1263 | iprx = ipr - 1; |
||
1264 | |||
1265 | if (-data.icon1[iprx] != ix) |
||
1266 | dataj.ind1 = 2; |
||
1267 | else |
||
1268 | { |
||
1269 | xi = fabsl ( |
||
1270 | dataj.cabj * data.cab[iprx] + |
||
1271 | dataj.sabj * data.sab[iprx] + |
||
1272 | dataj.salpj * data.salp[iprx]); |
||
1273 | if ((xi < 0.999999) || |
||
1274 | (fabsl (data.bi[iprx] / dataj.b - 1.) > |
||
1275 | 1.0e-6)) |
||
1276 | dataj.ind1 = 2; |
||
1277 | else |
||
1278 | dataj.ind1 = 0; |
||
1279 | } |
||
1280 | } /* if( ipr < 0 ) */ |
||
1281 | else if (ipr == 0) |
||
1282 | dataj.ind1 = 1; |
||
1283 | else |
||
1284 | { |
||
1285 | iprx = ipr - 1; |
||
1286 | |||
1287 | if (ipr != ix) |
||
1288 | { |
||
1289 | if (data.icon2[iprx] != ix) |
||
1290 | dataj.ind1 = 2; |
||
1291 | else |
||
1292 | { |
||
1293 | xi = fabsl ( |
||
1294 | dataj.cabj * data.cab[iprx] + |
||
1295 | dataj.sabj * data.sab[iprx] + |
||
1296 | dataj.salpj * data.salp[iprx]); |
||
1297 | if ((xi < 0.999999) || |
||
1298 | (fabsl ( |
||
1299 | data.bi[iprx] / dataj.b - |
||
1300 | 1.) > 1.0e-6)) |
||
1301 | dataj.ind1 = 2; |
||
1302 | else |
||
1303 | dataj.ind1 = 0; |
||
1304 | } |
||
1305 | } /* if( ipr != ix ) */ |
||
1306 | else |
||
1307 | { |
||
1308 | if (dataj.cabj * dataj.cabj + |
||
1309 | dataj.sabj * dataj.sabj > |
||
1310 | 1.0e-8) |
||
1311 | dataj.ind1 = 2; |
||
1312 | else |
||
1313 | dataj.ind1 = 0; |
||
1314 | } |
||
1315 | } /* else */ |
||
1316 | |||
1317 | ipr = data.icon2[i]; |
||
1318 | |||
1319 | if (ipr > PCHCON) |
||
1320 | dataj.ind2 = 2; |
||
1321 | else if (ipr < 0) |
||
1322 | { |
||
1323 | ipr = -ipr; |
||
1324 | iprx = ipr - 1; |
||
1325 | |||
1326 | if (-data.icon2[iprx] != ix) |
||
1327 | dataj.ind1 = 2; |
||
1328 | else |
||
1329 | { |
||
1330 | xi = fabsl ( |
||
1331 | dataj.cabj * data.cab[iprx] + |
||
1332 | dataj.sabj * data.sab[iprx] + |
||
1333 | dataj.salpj * data.salp[iprx]); |
||
1334 | if ((xi < 0.999999) || |
||
1335 | (fabsl (data.bi[iprx] / dataj.b - 1.) > |
||
1336 | 1.0e-6)) |
||
1337 | dataj.ind1 = 2; |
||
1338 | else |
||
1339 | dataj.ind1 = 0; |
||
1340 | } |
||
1341 | } /* if( ipr < 0 ) */ |
||
1342 | else if (ipr == 0) |
||
1343 | dataj.ind2 = 1; |
||
1344 | else |
||
1345 | { |
||
1346 | iprx = ipr - 1; |
||
1347 | |||
1348 | if (ipr != ix) |
||
1349 | { |
||
1350 | if (data.icon1[iprx] != ix) |
||
1351 | dataj.ind2 = 2; |
||
1352 | else |
||
1353 | { |
||
1354 | xi = fabsl ( |
||
1355 | dataj.cabj * data.cab[iprx] + |
||
1356 | dataj.sabj * data.sab[iprx] + |
||
1357 | dataj.salpj * data.salp[iprx]); |
||
1358 | if ((xi < 0.999999) || |
||
1359 | (fabsl ( |
||
1360 | data.bi[iprx] / dataj.b - |
||
1361 | 1.) > 1.0e-6)) |
||
1362 | dataj.ind2 = 2; |
||
1363 | else |
||
1364 | dataj.ind2 = 0; |
||
1365 | } |
||
1366 | } /* if( ipr != (i+1) ) */ |
||
1367 | else |
||
1368 | { |
||
1369 | if (dataj.cabj * dataj.cabj + |
||
1370 | dataj.sabj * dataj.sabj > |
||
1371 | 1.0e-8) |
||
1372 | dataj.ind1 = 2; |
||
1373 | else |
||
1374 | dataj.ind1 = 0; |
||
1375 | } |
||
1376 | |||
1377 | } /* else */ |
||
1378 | |||
1379 | } /* if( dataj.iexk != 0) */ |
||
1380 | |||
1381 | efld (xob, yob, zob, ax, 1); |
||
1382 | acx = cmplx (crnt.air[i], crnt.aii[i]); |
||
1383 | bcx = cmplx (crnt.bir[i], crnt.bii[i]); |
||
1384 | ccx = cmplx (crnt.cir[i], crnt.cii[i]); |
||
1385 | *ex += dataj.exk * acx + dataj.exs * bcx + dataj.exc * ccx; |
||
1386 | *ey += dataj.eyk * acx + dataj.eys * bcx + dataj.eyc * ccx; |
||
1387 | *ez += dataj.ezk * acx + dataj.ezs * bcx + dataj.ezc * ccx; |
||
1388 | |||
1389 | } /* for( i = 0; i < n; i++ ) */ |
||
1390 | |||
1391 | if (data.m == 0) |
||
1392 | return; |
||
1393 | |||
1394 | } /* if( n != 0) */ |
||
1395 | |||
1396 | jc = data.n - 1; |
||
1397 | for (i = 0; i < data.m; i++) |
||
1398 | { |
||
1399 | dataj.s = data.pbi[i]; |
||
1400 | dataj.xj = data.px[i]; |
||
1401 | dataj.yj = data.py[i]; |
||
1402 | dataj.zj = data.pz[i]; |
||
1403 | dataj.t1xj = data.t1x[i]; |
||
1404 | dataj.t1yj = data.t1y[i]; |
||
1405 | dataj.t1zj = data.t1z[i]; |
||
1406 | dataj.t2xj = data.t2x[i]; |
||
1407 | dataj.t2yj = data.t2y[i]; |
||
1408 | dataj.t2zj = data.t2z[i]; |
||
1409 | jc += 3; |
||
1410 | acx = dataj.t1xj * crnt.cur[jc - 2] + dataj.t1yj * crnt.cur[jc - 1] + |
||
1411 | dataj.t1zj * crnt.cur[jc]; |
||
1412 | bcx = dataj.t2xj * crnt.cur[jc - 2] + dataj.t2yj * crnt.cur[jc - 1] + |
||
1413 | dataj.t2zj * crnt.cur[jc]; |
||
1414 | |||
1415 | for (ipa = 0; ipa < gnd.ksymp; ipa++) |
||
1416 | { |
||
1417 | dataj.ipgnd = ipa + 1; |
||
1418 | unere (xob, yob, zob); |
||
1419 | *ex = *ex + acx * dataj.exk + bcx * dataj.exs; |
||
1420 | *ey = *ey + acx * dataj.eyk + bcx * dataj.eys; |
||
1421 | *ez = *ez + acx * dataj.ezk + bcx * dataj.ezs; |
||
1422 | } |
||
1423 | |||
1424 | } /* for( i = 0; i < m; i++ ) */ |
||
1425 | |||
1426 | return; |
||
1427 | } |
||
1428 | |||
1429 | /*-----------------------------------------------------------------------*/ |
||
1430 | |||
1431 | /* compute near e or h fields over a range of points */ |
||
1432 | void nfpat (void) |
||
1433 | { |
||
1434 | int i, j, kk; |
||
1435 | double znrt, cth = 0., sth = 0., ynrt, cph = 0., sph = 0., xnrt, xob, yob; |
||
1436 | double zob, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, xxx; |
||
1437 | complex double ex, ey, ez; |
||
1438 | |||
1439 | if (fpat.nfeh != 1) |
||
1440 | { |
||
1441 | fprintf ( |
||
1442 | output_fp, |
||
1443 | "\n\n\n" |
||
1444 | " " |
||
1445 | "-------- NEAR ELECTRIC FIELDS --------\n" |
||
1446 | " ------- LOCATION ------- ------- EX ------ ------- EY ------ " |
||
1447 | " ------- EZ ------\n" |
||
1448 | " X Y Z MAGNITUDE PHASE MAGNITUDE PHASE " |
||
1449 | " MAGNITUDE PHASE\n" |
||
1450 | " METERS METERS METERS VOLTS/M DEGREES VOLTS/M DEGREES " |
||
1451 | " VOLTS/M DEGREES"); |
||
1452 | } |
||
1453 | else |
||
1454 | { |
||
1455 | fprintf ( |
||
1456 | output_fp, |
||
1457 | "\n\n\n" |
||
1458 | " " |
||
1459 | "-------- NEAR MAGNETIC FIELDS ---------\n\n" |
||
1460 | " ------- LOCATION ------- ------- HX ------ ------- HY ------ " |
||
1461 | " ------- HZ ------\n" |
||
1462 | " X Y Z MAGNITUDE PHASE MAGNITUDE PHASE " |
||
1463 | " MAGNITUDE PHASE\n" |
||
1464 | " METERS METERS METERS AMPS/M DEGREES AMPS/M DEGREES " |
||
1465 | " AMPS/M DEGREES"); |
||
1466 | } |
||
1467 | |||
1468 | znrt = fpat.znr - fpat.dznr; |
||
1469 | for (i = 0; i < fpat.nrz; i++) |
||
1470 | { |
||
1471 | znrt += fpat.dznr; |
||
1472 | if (fpat.near != 0) |
||
1473 | { |
||
1474 | cth = cosl (TA * znrt); |
||
1475 | sth = sinl (TA * znrt); |
||
1476 | } |
||
1477 | |||
1478 | ynrt = fpat.ynr - fpat.dynr; |
||
1479 | for (j = 0; j < fpat.nry; j++) |
||
1480 | { |
||
1481 | ynrt += fpat.dynr; |
||
1482 | if (fpat.near != 0) |
||
1483 | { |
||
1484 | cph = cosl (TA * ynrt); |
||
1485 | sph = sinl (TA * ynrt); |
||
1486 | } |
||
1487 | |||
1488 | xnrt = fpat.xnr - fpat.dxnr; |
||
1489 | for (kk = 0; kk < fpat.nrx; kk++) |
||
1490 | { |
||
1491 | xnrt += fpat.dxnr; |
||
1492 | if (fpat.near != 0) |
||
1493 | { |
||
1494 | xob = xnrt * sth * cph; |
||
1495 | yob = xnrt * sth * sph; |
||
1496 | zob = xnrt * cth; |
||
1497 | } |
||
1498 | else |
||
1499 | { |
||
1500 | xob = xnrt; |
||
1501 | yob = ynrt; |
||
1502 | zob = znrt; |
||
1503 | } |
||
1504 | |||
1505 | tmp1 = xob / data.wlam; |
||
1506 | tmp2 = yob / data.wlam; |
||
1507 | tmp3 = zob / data.wlam; |
||
1508 | |||
1509 | if (fpat.nfeh != 1) |
||
1510 | nefld (tmp1, tmp2, tmp3, &ex, &ey, &ez); |
||
1511 | else |
||
1512 | nhfld (tmp1, tmp2, tmp3, &ex, &ey, &ez); |
||
1513 | |||
1514 | tmp1 = cabsl (ex); |
||
1515 | tmp2 = cang (ex); |
||
1516 | tmp3 = cabsl (ey); |
||
1517 | tmp4 = cang (ey); |
||
1518 | tmp5 = cabsl (ez); |
||
1519 | tmp6 = cang (ez); |
||
1520 | |||
1521 | fprintf ( |
||
1522 | output_fp, |
||
1523 | "\n" |
||
1524 | " %9.4f %9.4f %9.4f %11.4E %7.2f %11.4E %7.2f %11.4E " |
||
1525 | "%7.2f", |
||
1526 | xob, |
||
1527 | yob, |
||
1528 | zob, |
||
1529 | tmp1, |
||
1530 | tmp2, |
||
1531 | tmp3, |
||
1532 | tmp4, |
||
1533 | tmp5, |
||
1534 | tmp6); |
||
1535 | |||
1536 | if (plot.iplp1 != 2) |
||
1537 | continue; |
||
1538 | |||
1539 | if (plot.iplp4 < 0) |
||
1540 | xxx = xob; |
||
1541 | else if (plot.iplp4 == 0) |
||
1542 | xxx = yob; |
||
1543 | else |
||
1544 | xxx = zob; |
||
1545 | |||
1546 | if (plot.iplp2 == 2) |
||
1547 | { |
||
1548 | switch (plot.iplp3) |
||
1549 | { |
||
1550 | case 1: |
||
1551 | fprintf ( |
||
1552 | plot_fp, |
||
1553 | "%12.4E %12.4E %12.4E\n", |
||
1554 | xxx, |
||
1555 | tmp1, |
||
1556 | tmp2); |
||
1557 | break; |
||
1558 | case 2: |
||
1559 | fprintf ( |
||
1560 | plot_fp, |
||
1561 | "%12.4E %12.4E %12.4E\n", |
||
1562 | xxx, |
||
1563 | tmp3, |
||
1564 | tmp4); |
||
1565 | break; |
||
1566 | case 3: |
||
1567 | fprintf ( |
||
1568 | plot_fp, |
||
1569 | "%12.4E %12.4E %12.4E\n", |
||
1570 | xxx, |
||
1571 | tmp5, |
||
1572 | tmp6); |
||
1573 | break; |
||
1574 | case 4: |
||
1575 | fprintf ( |
||
1576 | plot_fp, |
||
1577 | "%12.4E %12.4E %12.4E %12.4E %12.4E " |
||
1578 | "%12.4E %12.4E\n", |
||
1579 | xxx, |
||
1580 | tmp1, |
||
1581 | tmp2, |
||
1582 | tmp3, |
||
1583 | tmp4, |
||
1584 | tmp5, |
||
1585 | tmp6); |
||
1586 | } |
||
1587 | continue; |
||
1588 | } |
||
1589 | |||
1590 | if (plot.iplp2 != 1) |
||
1591 | continue; |
||
1592 | |||
1593 | switch (plot.iplp3) |
||
1594 | { |
||
1595 | case 1: |
||
1596 | fprintf ( |
||
1597 | plot_fp, |
||
1598 | "%12.4E %12.4E %12.4E\n", |
||
1599 | xxx, |
||
1600 | print_creall (ex), |
||
1601 | print_cimagl (ex)); |
||
1602 | break; |
||
1603 | case 2: |
||
1604 | fprintf ( |
||
1605 | plot_fp, |
||
1606 | "%12.4E %12.4E %12.4E\n", |
||
1607 | xxx, |
||
1608 | print_creall (ey), |
||
1609 | print_cimagl (ey)); |
||
1610 | break; |
||
1611 | case 3: |
||
1612 | fprintf ( |
||
1613 | plot_fp, |
||
1614 | "%12.4E %12.4E %12.4E\n", |
||
1615 | xxx, |
||
1616 | print_creall (ez), |
||
1617 | print_cimagl (ez)); |
||
1618 | break; |
||
1619 | case 4: |
||
1620 | fprintf ( |
||
1621 | plot_fp, |
||
1622 | "%12.4E %12.4E %12.4E %12.4E %12.4E %12.4E " |
||
1623 | "%12.4E\n", |
||
1624 | xxx, |
||
1625 | print_creall (ex), |
||
1626 | print_cimagl (ex), |
||
1627 | print_creall (ey), |
||
1628 | print_cimagl (ey), |
||
1629 | print_creall (ez), |
||
1630 | print_cimagl (ez)); |
||
1631 | } |
||
1632 | } /* for( kk = 0; kk < fpat.nrx; kk++ ) */ |
||
1633 | |||
1634 | } /* for( j = 0; j < fpat.nry; j++ ) */ |
||
1635 | |||
1636 | } /* for( i = 0; i < fpat.nrz; i++ ) */ |
||
1637 | |||
1638 | return; |
||
1639 | } |
||
1640 | |||
1641 | /*-----------------------------------------------------------------------*/ |
||
1642 | |||
1643 | /* nhfld computes the near field at specified points in space after */ |
||
1644 | /* the structure currents have been computed. */ |
||
1645 | |||
1646 | void nhfld ( |
||
1647 | double xob, |
||
1648 | double yob, |
||
1649 | double zob, |
||
1650 | complex double *hx, |
||
1651 | complex double *hy, |
||
1652 | complex double *hz) |
||
1653 | { |
||
1654 | int i, jc; |
||
1655 | double ax, zp; |
||
1656 | complex double acx, bcx, ccx; |
||
1657 | |||
1658 | *hx = CPLX_00; |
||
1659 | *hy = CPLX_00; |
||
1660 | *hz = CPLX_00; |
||
1661 | ax = 0.; |
||
1662 | |||
1663 | if (data.n != 0) |
||
1664 | { |
||
1665 | for (i = 0; i < data.n; i++) |
||
1666 | { |
||
1667 | dataj.xj = xob - data.x[i]; |
||
1668 | dataj.yj = yob - data.y[i]; |
||
1669 | dataj.zj = zob - data.z[i]; |
||
1670 | zp = data.cab[i] * dataj.xj + data.sab[i] * dataj.yj + |
||
1671 | data.salp[i] * dataj.zj; |
||
1672 | |||
1673 | if (fabsl (zp) > 0.5001 * data.si[i]) |
||
1674 | continue; |
||
1675 | |||
1676 | zp = dataj.xj * dataj.xj + dataj.yj * dataj.yj + dataj.zj * dataj.zj - |
||
1677 | zp * zp; |
||
1678 | dataj.xj = data.bi[i]; |
||
1679 | |||
1680 | if (zp > 0.9 * dataj.xj * dataj.xj) |
||
1681 | continue; |
||
1682 | |||
1683 | ax = dataj.xj; |
||
1684 | break; |
||
1685 | } |
||
1686 | |||
1687 | for (i = 0; i < data.n; i++) |
||
1688 | { |
||
1689 | dataj.s = data.si[i]; |
||
1690 | dataj.b = data.bi[i]; |
||
1691 | dataj.xj = data.x[i]; |
||
1692 | dataj.yj = data.y[i]; |
||
1693 | dataj.zj = data.z[i]; |
||
1694 | dataj.cabj = data.cab[i]; |
||
1695 | dataj.sabj = data.sab[i]; |
||
1696 | dataj.salpj = data.salp[i]; |
||
1697 | hsfld (xob, yob, zob, ax); |
||
1698 | acx = cmplx (crnt.air[i], crnt.aii[i]); |
||
1699 | bcx = cmplx (crnt.bir[i], crnt.bii[i]); |
||
1700 | ccx = cmplx (crnt.cir[i], crnt.cii[i]); |
||
1701 | *hx += dataj.exk * acx + dataj.exs * bcx + dataj.exc * ccx; |
||
1702 | *hy += dataj.eyk * acx + dataj.eys * bcx + dataj.eyc * ccx; |
||
1703 | *hz += dataj.ezk * acx + dataj.ezs * bcx + dataj.ezc * ccx; |
||
1704 | } |
||
1705 | |||
1706 | if (data.m == 0) |
||
1707 | return; |
||
1708 | |||
1709 | } /* if( data.n != 0) */ |
||
1710 | |||
1711 | jc = data.n - 1; |
||
1712 | for (i = 0; i < data.m; i++) |
||
1713 | { |
||
1714 | dataj.s = data.pbi[i]; |
||
1715 | dataj.xj = data.px[i]; |
||
1716 | dataj.yj = data.py[i]; |
||
1717 | dataj.zj = data.pz[i]; |
||
1718 | dataj.t1xj = data.t1x[i]; |
||
1719 | dataj.t1yj = data.t1y[i]; |
||
1720 | dataj.t1zj = data.t1z[i]; |
||
1721 | dataj.t2xj = data.t2x[i]; |
||
1722 | dataj.t2yj = data.t2y[i]; |
||
1723 | dataj.t2zj = data.t2z[i]; |
||
1724 | hintg (xob, yob, zob); |
||
1725 | jc += 3; |
||
1726 | acx = dataj.t1xj * crnt.cur[jc - 2] + dataj.t1yj * crnt.cur[jc - 1] + |
||
1727 | dataj.t1zj * crnt.cur[jc]; |
||
1728 | bcx = dataj.t2xj * crnt.cur[jc - 2] + dataj.t2yj * crnt.cur[jc - 1] + |
||
1729 | dataj.t2zj * crnt.cur[jc]; |
||
1730 | *hx = *hx + acx * dataj.exk + bcx * dataj.exs; |
||
1731 | *hy = *hy + acx * dataj.eyk + bcx * dataj.eys; |
||
1732 | *hz = *hz + acx * dataj.ezk + bcx * dataj.ezs; |
||
1733 | } |
||
1734 | |||
1735 | return; |
||
1736 | } |
||
1737 | |||
1738 | /*-----------------------------------------------------------------------*/ |
||
1739 | |||
1740 | /* integrate over patches at wire connection point */ |
||
1741 | void pcint ( |
||
1742 | double xi, double yi, double zi, double cabi, double sabi, double salpi, complex double *e) |
||
1743 | { |
||
1744 | int nint, i1, i2; |
||
1745 | double d, ds, da, gcon, fcon, xxj, xyj, xzj, xs, s1; |
||
1746 | double xss, yss, zss, s2x, s2, g1, g2, g3, g4, f2, f1; |
||
1747 | complex double e1, e2, e3, e4, e5, e6, e7, e8, e9; |
||
1748 | |||
1749 | nint = 10; |
||
1750 | d = sqrtl (dataj.s) * .5; |
||
1751 | ds = 4. * d / (double) nint; |
||
1752 | da = ds * ds; |
||
1753 | gcon = 1. / dataj.s; |
||
1754 | fcon = 1. / (2. * TP * d); |
||
1755 | xxj = dataj.xj; |
||
1756 | xyj = dataj.yj; |
||
1757 | xzj = dataj.zj; |
||
1758 | xs = dataj.s; |
||
1759 | dataj.s = da; |
||
1760 | s1 = d + ds * .5; |
||
1761 | xss = dataj.xj + s1 * (dataj.t1xj + dataj.t2xj); |
||
1762 | yss = dataj.yj + s1 * (dataj.t1yj + dataj.t2yj); |
||
1763 | zss = dataj.zj + s1 * (dataj.t1zj + dataj.t2zj); |
||
1764 | s1 = s1 + d; |
||
1765 | s2x = s1; |
||
1766 | e1 = CPLX_00; |
||
1767 | e2 = CPLX_00; |
||
1768 | e3 = CPLX_00; |
||
1769 | e4 = CPLX_00; |
||
1770 | e5 = CPLX_00; |
||
1771 | e6 = CPLX_00; |
||
1772 | e7 = CPLX_00; |
||
1773 | e8 = CPLX_00; |
||
1774 | e9 = CPLX_00; |
||
1775 | |||
1776 | for (i1 = 0; i1 < nint; i1++) |
||
1777 | { |
||
1778 | s1 = s1 - ds; |
||
1779 | s2 = s2x; |
||
1780 | xss = xss - ds * dataj.t1xj; |
||
1781 | yss = yss - ds * dataj.t1yj; |
||
1782 | zss = zss - ds * dataj.t1zj; |
||
1783 | dataj.xj = xss; |
||
1784 | dataj.yj = yss; |
||
1785 | dataj.zj = zss; |
||
1786 | |||
1787 | for (i2 = 0; i2 < nint; i2++) |
||
1788 | { |
||
1789 | s2 = s2 - ds; |
||
1790 | dataj.xj = dataj.xj - ds * dataj.t2xj; |
||
1791 | dataj.yj = dataj.yj - ds * dataj.t2yj; |
||
1792 | dataj.zj = dataj.zj - ds * dataj.t2zj; |
||
1793 | unere (xi, yi, zi); |
||
1794 | dataj.exk = dataj.exk * cabi + dataj.eyk * sabi + dataj.ezk * salpi; |
||
1795 | dataj.exs = dataj.exs * cabi + dataj.eys * sabi + dataj.ezs * salpi; |
||
1796 | g1 = (d + s1) * (d + s2) * gcon; |
||
1797 | g2 = (d - s1) * (d + s2) * gcon; |
||
1798 | g3 = (d - s1) * (d - s2) * gcon; |
||
1799 | g4 = (d + s1) * (d - s2) * gcon; |
||
1800 | f2 = (s1 * s1 + s2 * s2) * TP; |
||
1801 | f1 = s1 / f2 - (g1 - g2 - g3 + g4) * fcon; |
||
1802 | f2 = s2 / f2 - (g1 + g2 - g3 - g4) * fcon; |
||
1803 | e1 = e1 + dataj.exk * g1; |
||
1804 | e2 = e2 + dataj.exk * g2; |
||
1805 | e3 = e3 + dataj.exk * g3; |
||
1806 | e4 = e4 + dataj.exk * g4; |
||
1807 | e5 = e5 + dataj.exs * g1; |
||
1808 | e6 = e6 + dataj.exs * g2; |
||
1809 | e7 = e7 + dataj.exs * g3; |
||
1810 | e8 = e8 + dataj.exs * g4; |
||
1811 | e9 = e9 + dataj.exk * f1 + dataj.exs * f2; |
||
1812 | |||
1813 | } /* for( i2 = 0; i2 < nint; i2++ ) */ |
||
1814 | |||
1815 | } /* for( i1 = 0; i1 < nint; i1++ ) */ |
||
1816 | |||
1817 | e[0] = e1; |
||
1818 | e[1] = e2; |
||
1819 | e[2] = e3; |
||
1820 | e[3] = e4; |
||
1821 | e[4] = e5; |
||
1822 | e[5] = e6; |
||
1823 | e[6] = e7; |
||
1824 | e[7] = e8; |
||
1825 | e[8] = e9; |
||
1826 | dataj.xj = xxj; |
||
1827 | dataj.yj = xyj; |
||
1828 | dataj.zj = xzj; |
||
1829 | dataj.s = xs; |
||
1830 | |||
1831 | return; |
||
1832 | } |
||
1833 | |||
1834 | /*-----------------------------------------------------------------------*/ |
||
1835 | |||
1836 | /* calculates the electric field due to unit current */ |
||
1837 | /* in the t1 and t2 directions on a patch */ |
||
1838 | void unere (double xob, double yob, double zob) |
||
1839 | { |
||
1840 | double zr, t1zr, t2zr, rx, ry, rz, r, tt1; |
||
1841 | double tt2, rt, xymag, px, py, cth, r2; |
||
1842 | complex double er, q1, q2, rrv, rrh, edp; |
||
1843 | |||
1844 | zr = dataj.zj; |
||
1845 | t1zr = dataj.t1zj; |
||
1846 | t2zr = dataj.t2zj; |
||
1847 | |||
1848 | if (dataj.ipgnd == 2) |
||
1849 | { |
||
1850 | zr = -zr; |
||
1851 | t1zr = -t1zr; |
||
1852 | t2zr = -t2zr; |
||
1853 | } |
||
1854 | |||
1855 | rx = xob - dataj.xj; |
||
1856 | ry = yob - dataj.yj; |
||
1857 | rz = zob - zr; |
||
1858 | r2 = rx * rx + ry * ry + rz * rz; |
||
1859 | |||
1860 | if (r2 <= 1.0e-20) |
||
1861 | { |
||
1862 | dataj.exk = CPLX_00; |
||
1863 | dataj.eyk = CPLX_00; |
||
1864 | dataj.ezk = CPLX_00; |
||
1865 | dataj.exs = CPLX_00; |
||
1866 | dataj.eys = CPLX_00; |
||
1867 | dataj.ezs = CPLX_00; |
||
1868 | return; |
||
1869 | } |
||
1870 | |||
1871 | r = sqrtl (r2); |
||
1872 | tt1 = -TP * r; |
||
1873 | tt2 = tt1 * tt1; |
||
1874 | rt = r2 * r; |
||
1875 | er = cmplx (sinl (tt1), -cosl (tt1)) * (CONST2 * dataj.s); |
||
1876 | q1 = cmplx (tt2 - 1., tt1) * er / rt; |
||
1877 | q2 = cmplx (3. - tt2, -3. * tt1) * er / (rt * r2); |
||
1878 | er = q2 * (dataj.t1xj * rx + dataj.t1yj * ry + t1zr * rz); |
||
1879 | dataj.exk = q1 * dataj.t1xj + er * rx; |
||
1880 | dataj.eyk = q1 * dataj.t1yj + er * ry; |
||
1881 | dataj.ezk = q1 * t1zr + er * rz; |
||
1882 | er = q2 * (dataj.t2xj * rx + dataj.t2yj * ry + t2zr * rz); |
||
1883 | dataj.exs = q1 * dataj.t2xj + er * rx; |
||
1884 | dataj.eys = q1 * dataj.t2yj + er * ry; |
||
1885 | dataj.ezs = q1 * t2zr + er * rz; |
||
1886 | |||
1887 | if (dataj.ipgnd == 1) |
||
1888 | return; |
||
1889 | |||
1890 | if (gnd.iperf == 1) |
||
1891 | { |
||
1892 | dataj.exk = -dataj.exk; |
||
1893 | dataj.eyk = -dataj.eyk; |
||
1894 | dataj.ezk = -dataj.ezk; |
||
1895 | dataj.exs = -dataj.exs; |
||
1896 | dataj.eys = -dataj.eys; |
||
1897 | dataj.ezs = -dataj.ezs; |
||
1898 | return; |
||
1899 | } |
||
1900 | |||
1901 | xymag = sqrtl (rx * rx + ry * ry); |
||
1902 | if (xymag <= 1.0e-6) |
||
1903 | { |
||
1904 | px = 0.; |
||
1905 | py = 0.; |
||
1906 | cth = 1.; |
||
1907 | rrv = CPLX_10; |
||
1908 | } |
||
1909 | else |
||
1910 | { |
||
1911 | px = -ry / xymag; |
||
1912 | py = rx / xymag; |
||
1913 | cth = rz / sqrtl (xymag * xymag + rz * rz); |
||
1914 | rrv = csqrtl (1. - gnd.zrati * gnd.zrati * (1. - cth * cth)); |
||
1915 | } |
||
1916 | |||
1917 | rrh = gnd.zrati * cth; |
||
1918 | rrh = (rrh - rrv) / (rrh + rrv); |
||
1919 | rrv = gnd.zrati * rrv; |
||
1920 | rrv = -(cth - rrv) / (cth + rrv); |
||
1921 | edp = (dataj.exk * px + dataj.eyk * py) * (rrh - rrv); |
||
1922 | dataj.exk = dataj.exk * rrv + edp * px; |
||
1923 | dataj.eyk = dataj.eyk * rrv + edp * py; |
||
1924 | dataj.ezk = dataj.ezk * rrv; |
||
1925 | edp = (dataj.exs * px + dataj.eys * py) * (rrh - rrv); |
||
1926 | dataj.exs = dataj.exs * rrv + edp * px; |
||
1927 | dataj.eys = dataj.eys * rrv + edp * py; |
||
1928 | dataj.ezs = dataj.ezs * rrv; |
||
1929 | |||
1930 | return; |
||
1931 | } |
||
1932 | |||
1933 | /*-----------------------------------------------------------------------*/ |