Subversion Repositories Nec2c

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 mjames 1
#ifndef NEC2C_H
2
#define NEC2C_H 1
3
 
4
#include <complex.h>
5
#include <errno.h>
6
#include <fcntl.h>
7
#include <math.h>
8
#include <signal.h>
9
#include <stdio.h>
10
#include <stdlib.h>
11
#include <string.h>
12
#include <sys/time.h>
13
#include <sys/types.h>
14
#include <time.h>
15
#include <unistd.h>
16
 
17
#ifndef TRUE
18
#define TRUE 1
19
#endif
20
 
21
#ifndef FALSE
22
#define FALSE 0
23
#endif
24
 
25
/* commonly used complex constants */
26
#define CPLX_00 (0.0 + 0.0fj)
27
#define CPLX_01 (0.0 + 1.0fj)
28
#define CPLX_10 (1.0 + 0.0fj)
29
#define CPLX_11 (1.0 + 1.0fj)
30
 
31
/* common constants */
32
#define PI 3.141592654
33
#define POT 1.570796327
34
#define TP 6.283185308
35
#define PTP .6283185308
36
#define TPJ (0.0 + 6.283185308fj)
37
#define PI8 25.13274123
38
#define PI10 31.41592654
39
#define TA 1.745329252E-02
40
#define TD 57.29577951
41
#define ETA 376.73
42
#define CVEL 299.8
43
#define RETA 2.654420938E-3
44
#define TOSP 1.128379167
45
#define ACCS 1.E-12
46
#define SP 1.772453851
47
#define FPI 12.56637062
48
#define CCJ (0.0 - 0.01666666667fj)
49
#define CONST1 (0.0 + 4.771341189fj)
50
#define CONST2 4.771341188
51
#define CONST3 (0.0 - 29.97922085fj)
52
#define CONST4 (0.0 + 188.365fj)
53
#define GAMMA .5772156649
54
#define C1 -.02457850915
55
#define C2 .3674669052
56
#define C3 .7978845608
57
#define P10 .0703125
58
#define P20 .1121520996
59
#define Q10 .125
60
#define Q20 .0732421875
61
#define P11 .1171875
62
#define P21 .1441955566
63
#define Q11 .375
64
#define Q21 .1025390625
65
#define POF .7853981635
66
#define MAXH 20
67
#define CRIT 1.0E-4
68
#define NM 131072
69
#define NTS 4
70
#define SMIN 1.e-3
71
 
72
/* Replaces the "10000" limit used to */
73
/* identify segment/patch connections */
74
#define PCHCON 100000
75
 
76
/* carriage return and line feed */
77
#define CR 0x0d
78
#define LF 0x0a
79
 
80
/* max length of a line read from input file */
81
#define LINE_LEN 132
82
/* version of fortran source for the -v option */
83
#define version "nec2c 0.9"
84
 
85
/*** Structs encapsulating global ("common") variables ***/
86
/* common  /crnt/ */
87
typedef struct
88
{
89
        double *air, /* Ai/lambda, real part */
90
            *aii,    /* Ai/lambda, imaginary part */
91
            *bir,    /* Bi/lambda, real part */
92
            *bii,    /* Bi/lambda, imaginary part */
93
            *cir,    /* Ci/lambda, real part */
94
            *cii;    /* Ci/lambda, imaginary part */
95
 
96
        complex double *cur; /* Amplitude of basis function */
97
 
98
} crnt_t;
99
 
100
/* common  /data/ (geometry data) */
101
typedef struct
102
{
103
        int n,      /* Number of wire segments */
104
            np,     /* Number of wire segments in symmetry cell */
105
            m,      /* Number of surface patches */
106
            mp,     /* Number of surface patches in symmetry cell */
107
            npm,    /* = n+m  */
108
            np2m,   /* = n+2m */
109
            np3m,   /* = n+3m */
110
            ipsym,  /* Symmetry flag */
111
            *icon1, /* Segments end 1 connection */
112
            *icon2, /* Segments end 2 connection */
113
            *itag;  /* Segments tag number */
114
 
115
        /* Wire segment data */
116
        double *x1, *y1, *z1, /* End 1 coordinates of wire segments */
117
            *x2, *y2, *z2,    /* End 2 coordinates of wire segments */
118
            *x, *y, *z,       /* Coordinates of segment centers */
119
            *si, *bi,         /* Length and radius of segments  */
120
            *cab,             /* cos(a)*cos(b) */
121
            *sab,             /* cos(a)*sin(b) */
122
            *salp,            /* Z component - sin(a) */
123
 
124
            /* Surface patch data */
125
            *px, *py, *pz,    /* Coordinates of patch center */
126
            *t1x, *t1y, *t1z, /* Coordinates of t1 vector */
127
            *t2x, *t2y, *t2z, /* Coordinates of t2 vector */
128
            *pbi,             /* Patch surface area */
129
            *psalp,           /* Z component - sin(a) */
130
 
131
            /* Wavelength in meters */
132
            wlam;
133
 
134
} data_t;
135
 
136
/* common  /dataj/ */
137
typedef struct
138
{
139
        int iexk, ind1, indd1, ind2, indd2, ipgnd;
140
 
141
        double s, b, xj, yj, zj, cabj, sabj, salpj, rkh, t1xj, t1yj, t1zj, t2xj, t2yj, t2zj;
142
 
143
        complex double exk, eyk, ezk, exs, eys, ezs, exc, eyc, ezc;
144
 
145
} dataj_t;
146
 
147
/* common  /fpat/ */
148
typedef struct
149
{
150
        int near, nfeh, nrx, nry, nrz, nth, nph, ipd, iavp, inor, iax, ixtyp;
151
 
152
        double thets, phis, dth, dph, rfld, gnor, clt, cht, epsr2, sig2, xpr6, pinr, pnlr,
153
            ploss, xnr, ynr, znr, dxnr, dynr, dznr;
154
 
155
} fpat_t;
156
 
157
/*common  /ggrid/ */
158
typedef struct
159
{
160
        int nxa[3], nya[3];
161
 
162
        double dxa[3], dya[3], xsa[3], ysa[3];
163
 
164
        complex double epscf, *ar1, *ar2, *ar3;
165
 
166
} ggrid_t;
167
 
168
/* common  /gnd/ */
169
typedef struct
170
{
171
        int ksymp, /* Ground flag */
172
            ifar,  /* Int flag in RP card, for far field calculations */
173
            iperf, /* Type of ground flag */
174
            nradl; /* Number of radials in ground screen */
175
 
176
        double t2, /* Const for radial wire ground impedance */
177
            cl,    /* Distance in wavelengths of cliff edge from origin */
178
            ch,    /* Cliff height in wavelengths */
179
            scrwl, /* Wire length in radial ground screen normalized to w/length */
180
            scrwr; /* Radius of wires in screen in wavelengths */
181
 
182
        complex double zrati, /* Ground medium [Er-js/wE0]^-1/2 */
183
            zrati2,           /* As above for 2nd ground medium */
184
            t1,               /* Const for radial wire ground impedance */
185
            frati;            /* (k1^2-k2^2)/(k1^2+k2^2), k1=w(E0Mu0)^1/2, k1=k2/ZRATI */
186
 
187
} gnd_t;
188
 
189
/* common  /gwav/ */
190
typedef struct
191
{
192
        double r1, /* Distance from current element to point where field is evaluated  */
193
            r2,    /* Distance from image of element to point where field is evaluated */
194
            zmh,   /* Z-Z', Z is height of field evaluation point */
195
            zph;   /* Z+Z', Z' is height of current element */
196
 
197
        complex double u, /* (Er-jS/WE0)^-1/2 */
198
            u2,           /* u^2 */
199
            xx1,          /* G1*exp(jkR1.r[i])  */
200
            xx2;          /* G2*exp(jkR2.r'[i]) */
201
 
202
} gwav_t;
203
 
204
/* common  /incom/ */
205
typedef struct
206
{
207
        int isnor;
208
 
209
        double xo, yo, zo, sn, xsn, ysn;
210
 
211
} incom_t;
212
 
213
/* common  /matpar/ (matrix parameters) */
214
typedef struct
215
{
216
        int icase, /* Storage mode of primary matrix */
217
            npblk, /* Num of blocks in first (NBLOKS-1) blocks */
218
            nlast, /* Num of blocks in last block */
219
            imat;  /* Storage reserved in CM for primary NGF matrix A */
220
 
221
} matpar_t;
222
 
223
/* common  /netcx/ */
224
typedef struct
225
{
226
        int masym,                  /* Matrix symmetry flags */
227
            neq, npeq, neq2, nonet, /* Number of two-port networks */
228
            ntsol,                  /* "Network equations are solved" flag */
229
            nprint,                 /* Print control flag */
230
            *iseg1,                 /* Num of seg to which port 1 of network is connected */
231
            *iseg2,                 /* Num of seg to which port 2 of network is connected */
232
            *ntyp;                  /* Type of networks */
233
 
234
        double *x11r, /* Real and imaginary parts of network impedances */
235
            *x11i, *x12r, *x12i, *x22r, *x22i, pin, /* Total input power from sources */
236
            pnls;                                   /* Power lost in networks */
237
 
238
        complex double zped;
239
 
240
} netcx_t;
241
 
242
/* common  /plot/ */
243
typedef struct
244
{
245
        int
246
            /* Plot control flags */
247
            iplp1,
248
            iplp2, iplp3, iplp4;
249
 
250
} plot_t;
251
 
252
/* common  /save/ */
253
typedef struct
254
{
255
        int *ip; /* Vector of indices of pivot elements used to factor matrix */
256
 
257
        double epsr, /* Relative dielectric constant of ground */
258
            sig,     /* Conductivity of ground */
259
            scrwlt,  /* Length of radials in ground screen approximation */
260
            scrwrt,  /* Radius of wires in ground screen approximation */
261
            fmhz;    /* Frequency in MHz */
262
 
263
} save_t;
264
 
265
/* common  /segj/ */
266
typedef struct
267
{
268
        int *jco,   /* Stores connection data */
269
            jsno,   /* Total number of entries in ax, bx, cx */
270
            maxcon; /* Max. no. connections */
271
 
272
        double *ax, *bx, *cx; /* Store constants A, B, C used in current expansion */
273
 
274
} segj_t;
275
 
276
/* common  /smat/ */
277
typedef struct
278
{
279
        int nop; /* My addition */
280
 
281
        complex double *ssx;
282
 
283
} smat_t;
284
 
285
/* common  /tmi/ */
286
typedef struct
287
{
288
        int ij;
289
 
290
        double zpk, rkb2;
291
 
292
} tmi_t;
293
 
294
/*common  /tmh/ */
295
typedef struct
296
{
297
        double zpka, rhks;
298
 
299
} tmh_t;
300
 
301
/* common  /vsorc/ */
302
typedef struct
303
{
304
        int *isant, /* Num of segs on which an aplied field source is located */
305
            *ivqd,  /* Num of segs on which a current-slope discontinuity source is located */
306
            *iqds,  /* Same as above (?) */
307
            nsant,  /* Number of applied field voltage sources */
308
            nvqd,   /* Number of applied current-slope discontinuity sources */
309
            nqds;   /* Same as above (?) */
310
 
311
        complex double *vqd, /* Voltage of applied-current slope discontinuity sources */
312
            *vqds,           /* Same as above (?) */
313
            *vsant;          /* Voltages of applied field voltage sources */
314
 
315
} vsorc_t;
316
 
317
/* common  /yparm/ */
318
typedef struct
319
{
320
        int ncoup,  /* Num of segs between which coupling will be computed */
321
            icoup,  /* Num of segs in the coupling array that have been excited */
322
            *nctag, /* Tag number of segments */
323
            *ncseg; /* Num of segs in set of segs that have same tag number */
324
 
325
        complex double *y11a, /* Self admittance of segments */
326
            *y12a;            /* Mutual admittances stored in order 1,2 1,3 2,3 2,4 etc */
327
 
328
} yparm_t;
329
 
330
/* common  /zload/ */
331
typedef struct
332
{
333
        int nload; /* Number of loading networks */
334
 
335
        complex double *zarray; /* = Zi/(Di/lambda) */
336
 
337
} zload_t;
338
 
339
/* Returns the complex double of the arguments */
340
#define cmplx(r, i) ((r) + (i) *CPLX_01)
341
 
342
/*------------------------------------------------------------------------*/
343
 
344
/* Function prototypes produced by cproto */
345
/* calculations.c */
346
void cabc (complex double *curx);
347
void couple (complex double *cur, double wlam);
348
void load (
349
    int *ldtyp, int *ldtag, int *ldtagf, int *ldtagt, double *zlr, double *zli, double *zlc);
350
void gf (double zk, double *co, double *si);
351
double db10 (double x);
352
double db20 (double x);
353
void intrp (
354
    double x,
355
    double y,
356
    complex double *f1,
357
    complex double *f2,
358
    complex double *f3,
359
    complex double *f4);
360
void intx (double el1, double el2, double b, int ij, double *sgr, double *sgi);
361
int min (int a, int b);
362
void test (
363
    double f1r, double f2r, double *tr, double f1i, double f2i, double *ti, double dmin);
364
void sbf (int i, int is, double *aa, double *bb, double *cc);
365
void tbf (int i, int icap);
366
void trio (int j);
367
void zint (double sigl, double rolam, complex double *zt);
368
double cang (complex double z);
369
/* fields.c */
370
void efld (double xi, double yi, double zi, double ai, int ij);
371
void eksc (
372
    double s,
373
    double z,
374
    double rh,
375
    double xk,
376
    int ij,
377
    complex double *ezs,
378
    complex double *ers,
379
    complex double *ezc,
380
    complex double *erc,
381
    complex double *ezk,
382
    complex double *erk);
383
void ekscx (
384
    double bx,
385
    double s,
386
    double z,
387
    double rhx,
388
    double xk,
389
    int ij,
390
    int inx1,
391
    int inx2,
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
void gh (double zk, double *hr, double *hi);
399
void gwave (
400
    complex double *erv,
401
    complex double *ezv,
402
    complex double *erh,
403
    complex double *ezh,
404
    complex double *eph);
405
void gx (double zz, double rh, double xk, complex double *gz, complex double *gzp);
406
void gxx (
407
    double zz,
408
    double rh,
409
    double a,
410
    double a2,
411
    double xk,
412
    int ira,
413
    complex double *g1,
414
    complex double *g1p,
415
    complex double *g2,
416
    complex double *g2p,
417
    complex double *g3,
418
    complex double *gzp);
419
void hfk (double el1, double el2, double rhk, double zpkx, double *sgr, double *sgi);
420
void hintg (double xi, double yi, double zi);
421
void hsfld (double xi, double yi, double zi, double ai);
422
void hsflx (
423
    double s,
424
    double rh,
425
    double zpx,
426
    complex double *hpk,
427
    complex double *hps,
428
    complex double *hpc);
429
void nefld (
430
    double xob,
431
    double yob,
432
    double zob,
433
    complex double *ex,
434
    complex double *ey,
435
    complex double *ez);
436
void nfpat (void);
437
void nhfld (
438
    double xob,
439
    double yob,
440
    double zob,
441
    complex double *hx,
442
    complex double *hy,
443
    complex double *hz);
444
void pcint (
445
    double xi,
446
    double yi,
447
    double zi,
448
    double cabi,
449
    double sabi,
450
    double salpi,
451
    complex double *e);
452
void unere (double xob, double yob, double zob);
453
/* geometry.c */
454
void arc (int itg, int ns, double rada, double ang1, double ang2, double rad);
455
void conect (int ignd);
456
void datagn (void);
457
void helix (
458
    double s,
459
    double hl,
460
    double a1,
461
    double b1,
462
    double a2,
463
    double b2,
464
    double rad,
465
    int ns,
466
    int itg);
467
int isegno (int itagi, int mx);
468
void move (
469
    double rox,
470
    double roy,
471
    double roz,
472
    double xs,
473
    double ys,
474
    double zs,
475
    int its,
476
    int nrpt,
477
    int itgi);
478
void patch (
479
    int nx,
480
    int ny,
481
    double ax1,
482
    double ay1,
483
    double az1,
484
    double ax2,
485
    double ay2,
486
    double az2,
487
    double ax3,
488
    double ay3,
489
    double az3,
490
    double ax4,
491
    double ay4,
492
    double az4);
493
void subph (int nx, int ny);
494
void readgm (
495
    char *gm,
496
    int *i1,
497
    int *i2,
498
    double *x1,
499
    double *y1,
500
    double *z1,
501
    double *x2,
502
    double *y2,
503
    double *z2,
504
    double *rad);
505
void reflc (int ix, int iy, int iz, int itx, int nop);
506
void wire (
507
    double xw1,
508
    double yw1,
509
    double zw1,
510
    double xw2,
511
    double yw2,
512
    double zw2,
513
    double rad,
514
    double rdel,
515
    double rrad,
516
    int ns,
517
    int itg);
518
/* ground.c */
519
void rom2 (double a, double b, complex double *sum, double dmin);
520
void sflds (double t, complex double *e);
521
/* input.c */
522
void qdsrc (int is, complex double v, complex double *e);
523
void readmn (
524
    char *gm,
525
    int *i1,
526
    int *i2,
527
    int *i3,
528
    int *i4,
529
    double *f1,
530
    double *f2,
531
    double *f3,
532
    double *f4,
533
    double *f5,
534
    double *f6);
535
/* main.c */
536
int main (int argc, char **argv);
537
void Null_Pointers (void);
538
void prnt (
539
    int in1,
540
    int in2,
541
    int in3,
542
    double fl1,
543
    double fl2,
544
    double fl3,
545
    double fl4,
546
    double fl5,
547
    double fl6,
548
    char *ia,
549
    int ichar);
550
/* matrix.c */
551
void cmset (int nrow, complex double *cm, double rkhx, int iexkx);
552
void cmss (int j1, int j2, int im1, int im2, complex double *cm, int nrow, int itrp);
553
void cmsw (
554
    int j1,
555
    int j2,
556
    int i1,
557
    int i2,
558
    complex double *cm,
559
    complex double *cw,
560
    int ncw,
561
    int nrow,
562
    int itrp);
563
void cmws (
564
    int j, int i1, int i2, complex double *cm, int nr, complex double *cw, int nw, int itrp);
565
void cmww (
566
    int j, int i1, int i2, complex double *cm, int nr, complex double *cw, int nw, int itrp);
567
void etmns (
568
    double p1,
569
    double p2,
570
    double p3,
571
    double p4,
572
    double p5,
573
    double p6,
574
    int ipr,
575
    complex double *e);
576
void factr (int n, complex double *a, int *ip, int ndim);
577
void factrs (int np, int nrow, complex double *a, int *ip);
578
void fblock (int nrow, int ncol, int imax, int ipsym);
579
void solve (int n, complex double *a, int *ip, complex double *b, int ndim);
580
void solves (
581
    complex double *a,
582
    int *ip,
583
    complex double *b,
584
    int neq,
585
    int nrh,
586
    int np,
587
    int n,
588
    int mp,
589
    int m);
590
/* misc.c */
591
void usage (void);
592
void abort_on_error (int why);
593
void secnds (double *x);
594
int stop (int flag);
595
int load_line (char *buff, FILE *pfile);
596
void mem_alloc (void **ptr, long int req);
597
void mem_realloc (void **ptr, long int req);
598
void free_ptr (void **ptr);
599
/* network.c */
600
void netwk (complex double *cm, int *ip, complex double *einc);
601
/* radiation.c */
602
void ffld (double thet, double phi, complex double *eth, complex double *eph);
603
void fflds (
604
    double rox,
605
    double roy,
606
    double roz,
607
    complex double *scur,
608
    complex double *ex,
609
    complex double *ey,
610
    complex double *ez);
611
void gfld (
612
    double rho,
613
    double phi,
614
    double rz,
615
    complex double *eth,
616
    complex double *epi,
617
    complex double *erd,
618
    complex double ux,
619
    int ksymp);
620
void rdpat (void);
621
/* somnec.c */
622
void somnec (double epr, double sig, double fmhz);
623
void bessel (complex double z, complex double *j0, complex double *j0p);
624
void evlua (
625
    complex double *erv, complex double *ezv, complex double *erh, complex double *eph);
626
void fbar (complex double p, complex double *r);
627
void gshank (
628
    complex double start,
629
    complex double dela,
630
    complex double *sum,
631
    int nans,
632
    complex double *seed,
633
    int ibk,
634
    complex double bk,
635
    complex double delb);
636
void hankel (complex double z, complex double *h0, complex double *h0p);
637
void lambda (double t, complex double *xlam, complex double *dxlam);
638
void rom1 (int n, complex double *sum, int nx);
639
void saoa (double t, complex double *ans);
640
#endif
641
 
642
/* provide wrapper functions to allow change of the data type for printing */
643
static inline float print_creall (complex double x)
644
{
645
        return (float) creall (x);
646
};
647
static inline float print_cimagl (complex double x)
648
{
649
        return (float) cimagl (x);
650
};