Subversion Repositories Nec2c

Rev

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  /data/ */
29
extern data_t data;
30
 
31
/* common  /segj/ */
32
extern segj_t segj;
33
 
34
/* pointers to input/output files */
35
extern FILE *input_fp, *output_fp, *plot_fp;
36
 
37
/* common  /plot/ */
38
extern plot_t plot;
39
 
40
/*-------------------------------------------------------------------*/
41
 
42
/* arc generates segment geometry data for an arc of ns segments */
43
void arc (int itg, int ns, double rada, double ang1, double ang2, double rad)
44
{
45
        int ist, i, mreq;
46
        double ang, dang, xs1, xs2, zs1, zs2;
47
 
48
        ist = data.n;
49
        data.n += ns;
50
        data.np = data.n;
51
        data.mp = data.m;
52
        data.ipsym = 0;
53
 
54
        if (ns < 1)
55
                return;
56
 
57
        if (fabsl (ang2 - ang1) < 360.00001)
58
        {
59
                /* Reallocate tags buffer */
60
                mem_realloc ((void *) &data.itag, (data.n + data.m) * sizeof (int));
61
 
62
                /* Reallocate wire buffers */
63
                mreq = data.n * sizeof (double);
64
                mem_realloc ((void *) &data.x1, mreq);
65
                mem_realloc ((void *) &data.y1, mreq);
66
                mem_realloc ((void *) &data.z1, mreq);
67
                mem_realloc ((void *) &data.x2, mreq);
68
                mem_realloc ((void *) &data.y2, mreq);
69
                mem_realloc ((void *) &data.z2, mreq);
70
                mem_realloc ((void *) &data.bi, mreq);
71
 
72
                ang = ang1 * TA;
73
                dang = (ang2 - ang1) * TA / ns;
74
                xs1 = rada * cosl (ang);
75
                zs1 = rada * sinl (ang);
76
 
77
                for (i = ist; i < data.n; i++)
78
                {
79
                        ang += dang;
80
                        xs2 = rada * cosl (ang);
81
                        zs2 = rada * sinl (ang);
82
                        data.x1[i] = xs1;
83
 
84
                        data.y1[i] = 0.;
85
                        data.z1[i] = zs1;
86
                        data.x2[i] = xs2;
87
                        data.y2[i] = 0.;
88
                        data.z2[i] = zs2;
89
                        xs1 = xs2;
90
                        zs1 = zs2;
91
                        data.bi[i] = rad;
92
                        data.itag[i] = itg;
93
 
94
                } /* for( i = ist; i < data.n; i++ ) */
95
 
96
        } /* if( fabsl( ang2- ang1) < 360.00001) */
97
        else
98
        {
99
                fprintf (output_fp, "\n  ERROR -- ARC ANGLE EXCEEDS 360 DEGREES");
100
                stop (-1);
101
        }
102
 
103
        return;
104
}
105
 
106
/*-----------------------------------------------------------------------*/
107
 
108
/* connect sets up segment connection data in arrays icon1 and */
109
/* icon2 by searching for segment ends that are in contact. */
110
void conect (int ignd)
111
{
112
        int i, iz, ic, j, jx, ix, ixx, iseg, iend, jend, jump, ipf;
113
        // int nsflg;
114
        double sep = 0., xi1, yi1, zi1, xi2, yi2, zi2;
115
        double slen, xa, ya, za, xs, ys, zs;
116
 
117
        segj.maxcon = 1;
118
 
119
        if (ignd != 0)
120
        {
121
                fprintf (output_fp, "\n\n   GROUND PLANE SPECIFIED.\n");
122
 
123
                if (ignd > 0)
124
                        fprintf (
125
                            output_fp,
126
                            "\n     WHERE WIRE ENDS TOUCH GROUND, CURRENT WILL"
127
                            " BE INTERPOLATED TO IMAGE IN GROUND PLANE.\n");
128
 
129
                if (data.ipsym == 2)
130
                {
131
                        data.np = 2 * data.np;
132
                        data.mp = 2 * data.mp;
133
                }
134
 
135
                if (abs (data.ipsym) > 2)
136
                {
137
                        data.np = data.n;
138
                        data.mp = data.m;
139
                }
140
 
141
                /*** possibly should be error condition?? **/
142
                if (data.np > data.n)
143
                {
144
                        fprintf (output_fp, "\n ERROR: NP > N IN CONECT()");
145
                        stop (-1);
146
                }
147
 
148
                if ((data.np == data.n) && (data.mp == data.m))
149
                        data.ipsym = 0;
150
 
151
        } /* if( ignd != 0) */
152
 
153
        if (data.n != 0)
154
        {
155
                /* Allocate memory to connections */
156
                mem_realloc ((void *) &data.icon1, (data.n + data.m) * sizeof (int));
157
                mem_realloc ((void *) &data.icon2, (data.n + data.m) * sizeof (int));
158
 
159
                for (i = 0; i < data.n; i++)
160
                {
161
                        data.icon1[i] = data.icon2[i] = 0;
162
                        iz = i + 1;
163
                        xi1 = data.x1[i];
164
                        yi1 = data.y1[i];
165
                        zi1 = data.z1[i];
166
                        xi2 = data.x2[i];
167
                        yi2 = data.y2[i];
168
                        zi2 = data.z2[i];
169
                        slen = sqrtl (
170
                                   (xi2 - xi1) * (xi2 - xi1) + (yi2 - yi1) * (yi2 - yi1) +
171
                                   (zi2 - zi1) * (zi2 - zi1)) *
172
                               SMIN;
173
 
174
                        /* determine connection data for end 1 of segment. */
175
                        jump = FALSE;
176
                        if (ignd > 0)
177
                        {
178
                                if (zi1 <= -slen)
179
                                {
180
                                        fprintf (
181
                                            output_fp,
182
                                            "\n  GEOMETRY DATA ERROR -- SEGMENT"
183
                                            " %d EXTENDS BELOW GROUND",
184
                                            iz);
185
                                        stop (-1);
186
                                }
187
 
188
                                if (zi1 <= slen)
189
                                {
190
                                        data.icon1[i] = iz;
191
                                        data.z1[i] = 0.;
192
                                        jump = TRUE;
193
 
194
                                } /* if( zi1 <= slen) */
195
 
196
                        } /* if( ignd > 0) */
197
 
198
                        if (!jump)
199
                        {
200
                                ic = i;
201
                                for (j = 1; j < data.n; j++)
202
                                {
203
                                        ic++;
204
                                        if (ic >= data.n)
205
                                                ic = 0;
206
 
207
                                        sep = fabsl (xi1 - data.x1[ic]) +
208
                                              fabsl (yi1 - data.y1[ic]) +
209
                                              fabsl (zi1 - data.z1[ic]);
210
                                        if (sep <= slen)
211
                                        {
212
                                                data.icon1[i] = -(ic + 1);
213
                                                break;
214
                                        }
215
 
216
                                        sep = fabsl (xi1 - data.x2[ic]) +
217
                                              fabsl (yi1 - data.y2[ic]) +
218
                                              fabsl (zi1 - data.z2[ic]);
219
                                        if (sep <= slen)
220
                                        {
221
                                                data.icon1[i] = (ic + 1);
222
                                                break;
223
                                        }
224
 
225
                                } /* for( j = 1; j < data.n; j++) */
226
 
227
                        } /* if( ! jump ) */
228
 
229
                        /* determine connection data for end 2 of segment. */
230
                        if ((ignd > 0) || jump)
231
                        {
232
                                if (zi2 <= -slen)
233
                                {
234
                                        fprintf (
235
                                            output_fp,
236
                                            "\n  GEOMETRY DATA ERROR -- SEGMENT"
237
                                            " %d EXTENDS BELOW GROUND",
238
                                            iz);
239
                                        stop (-1);
240
                                }
241
 
242
                                if (zi2 <= slen)
243
                                {
244
                                        if (data.icon1[i] == iz)
245
                                        {
246
                                                fprintf (
247
                                                    output_fp,
248
                                                    "\n  GEOMETRY DATA ERROR -- SEGMENT"
249
                                                    " %d LIES IN GROUND PLANE",
250
                                                    iz);
251
                                                stop (-1);
252
                                        }
253
 
254
                                        data.icon2[i] = iz;
255
                                        data.z2[i] = 0.;
256
                                        continue;
257
 
258
                                } /* if( zi2 <= slen) */
259
 
260
                        } /* if( ignd > 0) */
261
 
262
                        ic = i;
263
                        for (j = 1; j < data.n; j++)
264
                        {
265
                                ic++;
266
                                if (ic >= data.n)
267
                                        ic = 0;
268
 
269
                                sep = fabsl (xi2 - data.x1[ic]) + fabsl (yi2 - data.y1[ic]) +
270
                                      fabsl (zi2 - data.z1[ic]);
271
                                if (sep <= slen)
272
                                {
273
                                        data.icon2[i] = (ic + 1);
274
                                        break;
275
                                }
276
 
277
                                sep = fabsl (xi2 - data.x2[ic]) + fabsl (yi2 - data.y2[ic]) +
278
                                      fabsl (zi2 - data.z2[ic]);
279
                                if (sep <= slen)
280
                                {
281
                                        data.icon2[i] = -(ic + 1);
282
                                        break;
283
                                }
284
 
285
                        } /* for( j = 1; j < data.n; j++ ) */
286
 
287
                } /* for( i = 0; i < data.n; i++ ) */
288
 
289
                /* find wire-surface connections for new patches */
290
                if (data.m != 0)
291
                {
292
                        ix = -1;
293
                        i = 0;
294
                        while (++i <= data.m)
295
                        {
296
                                ix++;
297
                                xs = data.px[ix];
298
                                ys = data.py[ix];
299
                                zs = data.pz[ix];
300
 
301
                                for (iseg = 0; iseg < data.n; iseg++)
302
                                {
303
                                        xi1 = data.x1[iseg];
304
                                        yi1 = data.y1[iseg];
305
                                        zi1 = data.z1[iseg];
306
                                        xi2 = data.x2[iseg];
307
                                        yi2 = data.y2[iseg];
308
                                        zi2 = data.z2[iseg];
309
 
310
                                        /* for first end of segment */
311
                                        slen = (fabsl (xi2 - xi1) + fabsl (yi2 - yi1) +
312
                                                fabsl (zi2 - zi1)) *
313
                                               SMIN;
314
                                        sep = fabsl (xi1 - xs) + fabsl (yi1 - ys) +
315
                                              fabsl (zi1 - zs);
316
 
317
                                        /* connection - divide patch into 4 patches at present
318
                                         * array loc. */
319
                                        if (sep <= slen)
320
                                        {
321
                                                data.icon1[iseg] = PCHCON + i;
322
                                                ic = 0;
323
                                                subph (i, ic);
324
                                                break;
325
                                        }
326
 
327
                                        sep = fabsl (xi2 - xs) + fabsl (yi2 - ys) +
328
                                              fabsl (zi2 - zs);
329
                                        if (sep <= slen)
330
                                        {
331
                                                data.icon2[iseg] = PCHCON + i;
332
                                                ic = 0;
333
                                                subph (i, ic);
334
                                                break;
335
                                        }
336
 
337
                                } /* for( iseg = 0; iseg < data.n; iseg++ ) */
338
 
339
                        } /* while( ++i <= data.m ) */
340
 
341
                } /* if( data.m != 0) */
342
 
343
        } /* if( data.n != 0) */
344
 
345
        fprintf (
346
            output_fp,
347
            "\n\n"
348
            "   TOTAL SEGMENTS USED=%5d     "
349
            "NO. SEG. IN A SYMMETRIC CELL=%5d"
350
            "     SYMMETRY FLAG=  %d\n",
351
            data.n,
352
            data.np,
353
            data.ipsym);
354
 
355
        if (data.m > 0)
356
                fprintf (
357
                    output_fp,
358
                    "\n"
359
                    "       TOTAL PATCHES USED: %d   PATCHES"
360
                    " IN A SYMMETRIC CELL: %d",
361
                    data.m,
362
                    data.mp);
363
 
364
        iseg = (data.n + data.m) / (data.np + data.mp);
365
        if (iseg != 1)
366
        {
367
                /*** may be error condition?? ***/
368
                if (data.ipsym == 0)
369
                {
370
                        fprintf (output_fp, "\n  ERROR: IPSYM=0 IN CONECT()");
371
                        stop (-1);
372
                }
373
 
374
                if (data.ipsym < 0)
375
                        fprintf (
376
                            output_fp,
377
                            "\n  STRUCTURE HAS %d FOLD ROTATIONAL SYMMETRY\n",
378
                            iseg);
379
                else
380
                {
381
                        ic = iseg / 2;
382
                        if (iseg == 8)
383
                                ic = 3;
384
                        fprintf (output_fp, "\n  STRUCTURE HAS %d PLANES OF SYMMETRY\n", ic);
385
                } /* if( data.ipsym < 0 ) */
386
 
387
        } /* if( iseg == 1) */
388
 
389
        if (data.n == 0)
390
                return;
391
 
392
        /* Allocate to connection buffers */
393
        mem_realloc ((void *) &segj.jco, segj.maxcon * sizeof (int));
394
 
395
        /* adjust connected seg. ends to exactly coincide.  print junctions */
396
        /* of 3 or more seg.  also find old seg. connecting to new seg. */
397
        iseg = 0;
398
        ipf = FALSE;
399
        for (j = 0; j < data.n; j++)
400
        {
401
                jx = j + 1;
402
                iend = -1;
403
                jend = -1;
404
                ix = data.icon1[j];
405
                ic = 1;
406
                segj.jco[0] = -jx;
407
                xa = data.x1[j];
408
                ya = data.y1[j];
409
                za = data.z1[j];
410
 
411
                while (TRUE)
412
                {
413
                        if ((ix != 0) && (ix != (j + 1)) && (ix <= PCHCON))
414
                        {
415
                                // nsflg=0;
416
 
417
                                do
418
                                {
419
                                        if (ix == 0)
420
                                        {
421
                                                fprintf (
422
                                                    output_fp,
423
                                                    "\n  CONNECT - SEGMENT CONNECTION ERROR "
424
                                                    "FOR SEGMENT: %d",
425
                                                    ix);
426
                                                stop (-1);
427
                                        }
428
 
429
                                        if (ix < 0)
430
                                                ix = -ix;
431
                                        else
432
                                                jend = -jend;
433
 
434
                                        jump = FALSE;
435
 
436
                                        if (ix == jx)
437
                                                break;
438
 
439
                                        if (ix < jx)
440
                                        {
441
                                                jump = TRUE;
442
                                                break;
443
                                        }
444
 
445
                                        /* Record max. no. of connections */
446
                                        ic++;
447
                                        if (ic >= segj.maxcon)
448
                                        {
449
                                                segj.maxcon = ic + 1;
450
                                                mem_realloc (
451
                                                    (void *) &segj.jco,
452
                                                    segj.maxcon * sizeof (int));
453
                                        }
454
                                        segj.jco[ic - 1] = ix * jend;
455
 
456
                                        /*if( ix > 0){
457
                                              //nsflg=1;
458
                                        }*/
459
                                        ixx = ix - 1;
460
                                        if (jend != 1)
461
                                        {
462
                                                xa = xa + data.x1[ixx];
463
                                                ya = ya + data.y1[ixx];
464
                                                za = za + data.z1[ixx];
465
                                                ix = data.icon1[ixx];
466
                                                continue;
467
                                        }
468
 
469
                                        xa = xa + data.x2[ixx];
470
                                        ya = ya + data.y2[ixx];
471
                                        za = za + data.z2[ixx];
472
                                        ix = data.icon2[ixx];
473
 
474
                                } /* do */
475
                                while (ix != 0);
476
 
477
                                if (jump && (iend == 1))
478
                                        break;
479
                                else if (jump)
480
                                {
481
                                        iend = 1;
482
                                        jend = 1;
483
                                        ix = data.icon2[j];
484
                                        ic = 1;
485
                                        segj.jco[0] = jx;
486
                                        xa = data.x2[j];
487
                                        ya = data.y2[j];
488
                                        za = data.z2[j];
489
                                        continue;
490
                                }
491
 
492
                                sep = (double) ic;
493
                                xa = xa / sep;
494
                                ya = ya / sep;
495
                                za = za / sep;
496
 
497
                                for (i = 0; i < ic; i++)
498
                                {
499
                                        ix = segj.jco[i];
500
                                        if (ix <= 0)
501
                                        {
502
                                                ix = -ix;
503
                                                ixx = ix - 1;
504
                                                data.x1[ixx] = xa;
505
                                                data.y1[ixx] = ya;
506
                                                data.z1[ixx] = za;
507
                                                continue;
508
                                        }
509
 
510
                                        ixx = ix - 1;
511
                                        data.x2[ixx] = xa;
512
                                        data.y2[ixx] = ya;
513
                                        data.z2[ixx] = za;
514
 
515
                                } /* for( i = 0; i < ic; i++ ) */
516
 
517
                                if (!ipf)
518
                                {
519
                                        fprintf (
520
                                            output_fp,
521
                                            "\n\n"
522
                                            "         - MULTIPLE WIRE JUNCTIONS -\n"
523
                                            " JUNCTION    SEGMENTS  (- FOR END 1, + FOR END "
524
                                            "2)");
525
 
526
                                        ipf = TRUE;
527
                                }
528
                                if (ic >= 3)
529
                                {
530
                                        iseg++;
531
                                        fprintf (output_fp, "\n %5d     ", iseg);
532
 
533
                                        for (i = 1; i <= ic; i++)
534
                                        {
535
                                                fprintf (output_fp, " %4d", segj.jco[i - 1]);
536
                                                if (!(i % 20))
537
                                                        fprintf (
538
                                                            output_fp, "\n              ");
539
                                        }
540
                                } /* if( ic >= 3) */
541
 
542
                        } /*if( (ix != 0) && (ix != j) && (ix <= PCHCON) ) */
543
 
544
                        if (iend == 1)
545
                                break;
546
 
547
                        iend = 1;
548
                        jend = 1;
549
                        ix = data.icon2[j];
550
                        ic = 1;
551
                        segj.jco[0] = jx;
552
                        xa = data.x2[j];
553
                        ya = data.y2[j];
554
                        za = data.z2[j];
555
 
556
                } /* while( TRUE ) */
557
 
558
        } /* for( j = 0; j < data.n; j++ ) */
559
          /* print NONE if nothing printed */
560
        if (ipf == 1 && iseg == 0)
561
        {
562
                fprintf (output_fp, "\n  NONE");
563
        }
564
 
565
        mem_realloc ((void *) &segj.ax, segj.maxcon * sizeof (double));
566
        mem_realloc ((void *) &segj.bx, segj.maxcon * sizeof (double));
567
        mem_realloc ((void *) &segj.cx, segj.maxcon * sizeof (double));
568
 
569
        return;
570
}
571
 
572
/*-----------------------------------------------------------------------*/
573
 
574
/* datagn is the main routine for input of geometry data. */
575
void datagn (void)
576
{
577
        char gm[3];
578
        char ifx[2] = {'*', 'X'}, ify[2] = {'*', 'Y'}, ifz[2] = {'*', 'Z'};
579
        char ipt[4] = {'P', 'R', 'T', 'Q'};
580
 
581
        /* input card mnemonic list */
582
        /* "XT" stands for "exit", added for testing */
583
#define GM_NUM 12
584
        char *atst[GM_NUM] = {
585
            "GW", "GX", "GR", "GS", "GE", "GM", "SP", "SM", "GA", "SC", "GH", "GF"};
586
 
587
        int nwire, isct, iphd, i1, i2, itg, iy, iz, mreq;
588
        int ix, i, ns, gm_num; /* geometry card id as a number */
589
        double rad, xs1, xs2, ys1, ys2, zs1, zs2, x4 = 0, y4 = 0, z4 = 0;
590
        double x3 = 0, y3 = 0, z3 = 0, xw1, xw2, yw1, yw2, zw1, zw2;
591
        double dummy;
592
 
593
        data.ipsym = 0;
594
        nwire = 0;
595
        data.n = 0;
596
        data.np = 0;
597
        data.m = 0;
598
        data.mp = 0;
599
        isct = 0;
600
        iphd = FALSE;
601
 
602
        /* read geometry data card and branch to */
603
        /* section for operation requested */
604
        do
605
        {
606
                readgm (gm, &itg, &ns, &xw1, &yw1, &zw1, &xw2, &yw2, &zw2, &rad);
607
 
608
                /* identify card id mnemonic */
609
                for (gm_num = 0; gm_num < GM_NUM; gm_num++)
610
                        if (strncmp (gm, atst[gm_num], 2) == 0)
611
                                break;
612
 
613
                if (iphd == FALSE)
614
                {
615
                        fprintf (
616
                            output_fp,
617
                            "\n\n\n\n"
618
                            "                                 "
619
                            "- - - STRUCTURE SPECIFICATION - - -\n\n"
620
                            "                                     "
621
                            "COORDINATES MUST BE INPUT IN\n"
622
                            "                                     "
623
                            "METERS OR BE SCALED TO METERS\n"
624
                            "                                     "
625
                            "BEFORE STRUCTURE INPUT IS ENDED\n");
626
 
627
                        fprintf (
628
                            output_fp,
629
                            "\n\n"
630
                            "  WIRE                                                          "
631
                            "                     NO. OF    FIRST  LAST     TAG\n"
632
                            "  NO.        X1         Y1         Z1          X2         Y2     "
633
                            "    Z2      RADIUS   SEG.     SEG.   SEG.     NO.");
634
 
635
                        iphd = 1;
636
                }
637
 
638
                if (gm_num != 10)
639
                        isct = 0;
640
 
641
                switch (gm_num)
642
                {
643
                case 0: /* "gw" card, generate segment data for straight wire. */
644
 
645
                        nwire++;
646
                        i1 = data.n + 1;
647
                        i2 = data.n + ns;
648
 
649
                        fprintf (
650
                            output_fp,
651
                            "\n"
652
                            " %5d %10.5f %10.5f %10.5f  %10.5f"
653
                            " %10.5f %10.5f %10.5f  %5d    %5d %5d   %5d",
654
                            nwire,
655
                            xw1,
656
                            yw1,
657
                            zw1,
658
                            xw2,
659
                            yw2,
660
                            zw2,
661
                            rad,
662
                            ns,
663
                            i1,
664
                            i2,
665
                            itg);
666
 
667
                        if (rad != 0)
668
                        {
669
                                xs1 = 1.;
670
                                ys1 = 1.;
671
                        }
672
                        else
673
                        {
674
                                readgm (
675
                                    gm,
676
                                    &ix,
677
                                    &iy,
678
                                    &xs1,
679
                                    &ys1,
680
                                    &zs1,
681
                                    &dummy,
682
                                    &dummy,
683
                                    &dummy,
684
                                    &dummy);
685
 
686
                                if (strcmp (gm, "GC") != 0)
687
                                {
688
                                        fprintf (output_fp, "\n  GEOMETRY DATA CARD ERROR");
689
                                        stop (-1);
690
                                }
691
 
692
                                fprintf (
693
                                    output_fp,
694
                                    "\n  ABOVE WIRE IS TAPERED.  SEGMENT LENGTH RATIO: %9.5f\n"
695
                                    "                                 "
696
                                    "RADIUS FROM: %9.5f TO: %9.5f",
697
                                    xs1,
698
                                    ys1,
699
                                    zs1);
700
 
701
                                if ((ys1 == 0) || (zs1 == 0))
702
                                {
703
                                        fprintf (output_fp, "\n  GEOMETRY DATA CARD ERROR");
704
                                        stop (-1);
705
                                }
706
 
707
                                rad = ys1;
708
                                ys1 = powl ((zs1 / ys1), (1. / (ns - 1.)));
709
                        }
710
 
711
                        wire (xw1, yw1, zw1, xw2, yw2, zw2, rad, xs1, ys1, ns, itg);
712
 
713
                        continue;
714
 
715
                        /* reflect structure along x,y, or z */
716
                        /* axes or rotate to form cylinder.  */
717
                case 1: /* "gx" card */
718
 
719
                        iy = ns / 10;
720
                        iz = ns - iy * 10;
721
                        ix = iy / 10;
722
                        iy = iy - ix * 10;
723
 
724
                        if (ix != 0)
725
                                ix = 1;
726
                        if (iy != 0)
727
                                iy = 1;
728
                        if (iz != 0)
729
                                iz = 1;
730
 
731
                        fprintf (
732
                            output_fp,
733
                            "\n  STRUCTURE REFLECTED ALONG THE AXES %c %c %c"
734
                            " - TAGS INCREMENTED BY %d\n",
735
                            ifx[ix],
736
                            ify[iy],
737
                            ifz[iz],
738
                            itg);
739
 
740
                        reflc (ix, iy, iz, itg, ns);
741
 
742
                        continue;
743
 
744
                case 2: /* "gr" card */
745
 
746
                        fprintf (
747
                            output_fp,
748
                            "\n  STRUCTURE ROTATED ABOUT Z-AXIS %d TIMES"
749
                            " - LABELS INCREMENTED BY %d\n",
750
                            ns,
751
                            itg);
752
 
753
                        ix = -1;
754
                        iz = 0;
755
                        reflc (ix, iy, iz, itg, ns);
756
 
757
                        continue;
758
 
759
                case 3: /* "gs" card, scale structure dimensions by factor xw1. */
760
 
761
                        if (data.n > 0)
762
                        {
763
                                for (i = 0; i < data.n; i++)
764
                                {
765
                                        data.x1[i] = data.x1[i] * xw1;
766
                                        data.y1[i] = data.y1[i] * xw1;
767
                                        data.z1[i] = data.z1[i] * xw1;
768
                                        data.x2[i] = data.x2[i] * xw1;
769
                                        data.y2[i] = data.y2[i] * xw1;
770
                                        data.z2[i] = data.z2[i] * xw1;
771
                                        data.bi[i] = data.bi[i] * xw1;
772
                                }
773
                        } /* if( data.n >= n2) */
774
 
775
                        if (data.m > 0)
776
                        {
777
                                yw1 = xw1 * xw1;
778
                                for (i = 0; i < data.m; i++)
779
                                {
780
                                        data.px[i] = data.px[i] * xw1;
781
                                        data.py[i] = data.py[i] * xw1;
782
                                        data.pz[i] = data.pz[i] * xw1;
783
                                        data.pbi[i] = data.pbi[i] * yw1;
784
                                }
785
                        } /* if( data.m >= m2) */
786
 
787
                        fprintf (output_fp, "\n      STRUCTURE SCALED BY FACTOR %10.5f", xw1);
788
 
789
                        continue;
790
 
791
                case 4: /* "ge" card, terminate structure geometry input. */
792
 
793
                        if (ns != 0)
794
                        {
795
                                plot.iplp1 = 1;
796
                                plot.iplp2 = 1;
797
                        }
798
 
799
                        conect (itg);
800
 
801
                        if (data.n != 0)
802
                        {
803
                                /* Allocate wire buffers */
804
                                mreq = data.n * sizeof (double);
805
                                mem_realloc ((void *) &data.si, mreq);
806
                                mem_realloc ((void *) &data.sab, mreq);
807
                                mem_realloc ((void *) &data.cab, mreq);
808
                                mem_realloc ((void *) &data.salp, mreq);
809
                                mem_realloc ((void *) &data.x, mreq);
810
                                mem_realloc ((void *) &data.y, mreq);
811
                                mem_realloc ((void *) &data.z, mreq);
812
 
813
                                fprintf (
814
                                    output_fp,
815
                                    "\n\n\n\n\n"
816
                                    "                                "
817
                                    " - - - - SEGMENTATION DATA - - - -\n\n"
818
                                    "                                       "
819
                                    " COORDINATES IN METERS\n\n"
820
                                    "                        "
821
                                    " I+ AND I- INDICATE THE SEGMENTS BEFORE AND AFTER I\n\n");
822
 
823
                                fprintf (
824
                                    output_fp,
825
                                    "\n"
826
                                    "  SEG.   COORDINATES OF SEG. CENTER     SEG.     "
827
                                    "ORIENTATION ANGLES    WIRE    CONNECTION DATA   TAG\n"
828
                                    "  NO.       X         Y         Z       LENGTH   "
829
                                    "  ALPHA     BETA      RADIUS    I-   I    I+    NO.");
830
 
831
                                for (i = 0; i < data.n; i++)
832
                                {
833
                                        xw1 = data.x2[i] - data.x1[i];
834
                                        yw1 = data.y2[i] - data.y1[i];
835
                                        zw1 = data.z2[i] - data.z1[i];
836
                                        data.x[i] = (data.x1[i] + data.x2[i]) / 2.;
837
                                        data.y[i] = (data.y1[i] + data.y2[i]) / 2.;
838
                                        data.z[i] = (data.z1[i] + data.z2[i]) / 2.;
839
                                        xw2 = xw1 * xw1 + yw1 * yw1 + zw1 * zw1;
840
                                        yw2 = sqrtl (xw2);
841
                                        yw2 = (xw2 / yw2 + yw2) * .5;
842
                                        data.si[i] = yw2;
843
                                        data.cab[i] = xw1 / yw2;
844
                                        data.sab[i] = yw1 / yw2;
845
                                        xw2 = zw1 / yw2;
846
 
847
                                        if (xw2 > 1.)
848
                                                xw2 = 1.;
849
                                        if (xw2 < -1.)
850
                                                xw2 = -1.;
851
 
852
                                        data.salp[i] = xw2;
853
                                        xw2 = asinl (xw2) * TD;
854
                                        yw2 = atan2l (yw1, xw1) * TD;
855
 
856
                                        fprintf (
857
                                            output_fp,
858
                                            "\n"
859
                                            " %5d%10.5f%10.5f%10.5f%10.5f"
860
                                            " %10.5f%10.5f%10.5f%7d%7d%7d%7d",
861
                                            i + 1,
862
                                            data.x[i],
863
                                            data.y[i],
864
                                            data.z[i],
865
                                            data.si[i],
866
                                            xw2,
867
                                            yw2,
868
                                            data.bi[i],
869
                                            data.icon1[i],
870
                                            i + 1,
871
                                            data.icon2[i],
872
                                            data.itag[i]);
873
 
874
                                        if (plot.iplp1 == 1)
875
                                                fprintf (
876
                                                    plot_fp,
877
                                                    "%12.5E %12.5E %12.5E "
878
                                                    "%12.5E %12.5E %12.5E %12.5E%7d%7d%7d\n",
879
                                                    data.x[i],
880
                                                    data.y[i],
881
                                                    data.z[i],
882
                                                    data.si[i],
883
                                                    xw2,
884
                                                    yw2,
885
                                                    data.bi[i],
886
                                                    data.icon1[i],
887
                                                    i + 1,
888
                                                    data.icon2[i]);
889
 
890
                                        if ((data.si[i] <= 1.e-20) || (data.bi[i] <= 0.))
891
                                        {
892
                                                fprintf (output_fp, "\n SEGMENT DATA ERROR");
893
                                                stop (-1);
894
                                        }
895
 
896
                                } /* for( i = 0; i < data.n; i++ ) */
897
 
898
                        } /* if( data.n != 0) */
899
 
900
                        fprintf (output_fp, "\n\n\n");
901
                        if (data.m != 0)
902
                        {
903
                                fprintf (
904
                                    output_fp,
905
                                    "\n\n\n"
906
                                    "                                   "
907
                                    " - - - - - SURFACE PATCH DATA - - - -\n"
908
                                    "                                            "
909
                                    " COORDINATES IN METERS\n\n"
910
                                    " PATCH      COORD. OF PATCH CENTER           UNIT NORMAL "
911
                                    "VECTOR      "
912
                                    " PATCH           COMPONENTS OF UNIT TANGENT VECTORS\n"
913
                                    "  No:       X          Y          Z          X        Y  "
914
                                    "      Z      "
915
                                    " AREA         X1       Y1       Z1        X2       Y2    "
916
                                    "  Z2");
917
 
918
                                for (i = 0; i < data.m; i++)
919
                                {
920
                                        xw1 = (data.t1y[i] * data.t2z[i] -
921
                                               data.t1z[i] * data.t2y[i]) *
922
                                              data.psalp[i];
923
                                        yw1 = (data.t1z[i] * data.t2x[i] -
924
                                               data.t1x[i] * data.t2z[i]) *
925
                                              data.psalp[i];
926
                                        zw1 = (data.t1x[i] * data.t2y[i] -
927
                                               data.t1y[i] * data.t2x[i]) *
928
                                              data.psalp[i];
929
 
930
                                        fprintf (
931
                                            output_fp,
932
                                            "\n"
933
                                            " %4d %10.5f %10.5f %10.5f  %8.5f %8.5f %8.5f"
934
                                            " %10.5f  %8.5f %8.5f %8.5f  %8.5f %8.5f %8.5f",
935
                                            i + 1,
936
                                            data.px[i],
937
                                            data.py[i],
938
                                            data.pz[i],
939
                                            xw1,
940
                                            yw1,
941
                                            zw1,
942
                                            data.pbi[i],
943
                                            data.t1x[i],
944
                                            data.t1y[i],
945
                                            data.t1z[i],
946
                                            data.t2x[i],
947
                                            data.t2y[i],
948
                                            data.t2z[i]);
949
 
950
                                } /* for( i = 0; i < data.m; i++ ) */
951
 
952
                        } /* if( data.m == 0) */
953
 
954
                        data.npm = data.n + data.m;
955
                        data.np2m = data.n + 2 * data.m;
956
                        data.np3m = data.n + 3 * data.m;
957
 
958
                        return;
959
 
960
                        /* "gm" card, move structure or reproduce */
961
                        /* original structure in new positions.   */
962
                case 5:
963
 
964
                        fprintf (
965
                            output_fp,
966
                            "\n     THE STRUCTURE HAS BEEN MOVED, MOVE DATA CARD IS:\n"
967
                            "   %3d %5d %10.5f %10.5f %10.5f %10.5f %10.5f %10.5f %10.5f",
968
                            itg,
969
                            ns,
970
                            xw1,
971
                            yw1,
972
                            zw1,
973
                            xw2,
974
                            yw2,
975
                            zw2,
976
                            rad);
977
 
978
                        xw1 = xw1 * TA;
979
                        yw1 = yw1 * TA;
980
                        zw1 = zw1 * TA;
981
 
982
                        move (xw1, yw1, zw1, xw2, yw2, zw2, (int) (rad + .5), ns, itg);
983
                        continue;
984
 
985
                case 6: /* "sp" card, generate single new patch */
986
 
987
                        i1 = data.m + 1;
988
                        ns++;
989
 
990
                        if (itg != 0)
991
                        {
992
                                fprintf (output_fp, "\n  PATCH DATA ERROR");
993
                                stop (-1);
994
                        }
995
 
996
                        fprintf (
997
                            output_fp,
998
                            "\n"
999
                            " %5d%c %10.5f %10.5f %10.5f %10.5f %10.5f %10.5f",
1000
                            i1,
1001
                            ipt[ns - 1],
1002
                            xw1,
1003
                            yw1,
1004
                            zw1,
1005
                            xw2,
1006
                            yw2,
1007
                            zw2);
1008
 
1009
                        if ((ns == 2) || (ns == 4))
1010
                                isct = 1;
1011
 
1012
                        if (ns > 1)
1013
                        {
1014
                                readgm (gm, &ix, &iy, &x3, &y3, &z3, &x4, &y4, &z4, &dummy);
1015
 
1016
                                if ((ns == 2) || (itg > 0))
1017
                                {
1018
                                        x4 = xw1 + x3 - xw2;
1019
                                        y4 = yw1 + y3 - yw2;
1020
                                        z4 = zw1 + z3 - zw2;
1021
                                }
1022
 
1023
                                fprintf (
1024
                                    output_fp,
1025
                                    "\n"
1026
                                    "      %11.5f %11.5f %11.5f %11.5f %11.5f %11.5f",
1027
                                    x3,
1028
                                    y3,
1029
                                    z3,
1030
                                    x4,
1031
                                    y4,
1032
                                    z4);
1033
 
1034
                                if (strcmp (gm, "SC") != 0)
1035
                                {
1036
                                        fprintf (output_fp, "\n  PATCH DATA ERROR");
1037
                                        stop (-1);
1038
                                }
1039
 
1040
                        } /* if( ns > 1) */
1041
                        else
1042
                        {
1043
                                xw2 = xw2 * TA;
1044
                                yw2 = yw2 * TA;
1045
                        }
1046
 
1047
                        patch (itg, ns, xw1, yw1, zw1, xw2, yw2, zw2, x3, y3, z3, x4, y4, z4);
1048
 
1049
                        continue;
1050
 
1051
                case 7: /* "sm" card, generate multiple-patch surface */
1052
 
1053
                        i1 = data.m + 1;
1054
                        fprintf (
1055
                            output_fp,
1056
                            "\n"
1057
                            " %5d%c %10.5f %11.5f %11.5f %11.5f %11.5f %11.5f"
1058
                            "     SURFACE - %d BY %d PATCHES",
1059
                            i1,
1060
                            ipt[1],
1061
                            xw1,
1062
                            yw1,
1063
                            zw1,
1064
                            xw2,
1065
                            yw2,
1066
                            zw2,
1067
                            itg,
1068
                            ns);
1069
 
1070
                        if ((itg < 1) || (ns < 1))
1071
                        {
1072
                                fprintf (output_fp, "\n  PATCH DATA ERROR");
1073
                                stop (-1);
1074
                        }
1075
 
1076
                        readgm (gm, &ix, &iy, &x3, &y3, &z3, &x4, &y4, &z4, &dummy);
1077
 
1078
                        if ((ns == 2) || (itg > 0))
1079
                        {
1080
                                x4 = xw1 + x3 - xw2;
1081
                                y4 = yw1 + y3 - yw2;
1082
                                z4 = zw1 + z3 - zw2;
1083
                        }
1084
 
1085
                        fprintf (
1086
                            output_fp,
1087
                            "\n"
1088
                            "      %11.5f %11.5f %11.5f %11.5f %11.5f %11.5f",
1089
                            x3,
1090
                            y3,
1091
                            z3,
1092
                            x4,
1093
                            y4,
1094
                            z4);
1095
 
1096
                        if (strcmp (gm, "SC") != 0)
1097
                        {
1098
                                fprintf (output_fp, "\n  PATCH DATA ERROR");
1099
                                stop (-1);
1100
                        }
1101
 
1102
                        patch (itg, ns, xw1, yw1, zw1, xw2, yw2, zw2, x3, y3, z3, x4, y4, z4);
1103
 
1104
                        continue;
1105
 
1106
                case 8: /* "ga" card, generate segment data for wire arc */
1107
 
1108
                        nwire++;
1109
                        i1 = data.n + 1;
1110
                        i2 = data.n + ns;
1111
 
1112
                        fprintf (
1113
                            output_fp,
1114
                            "\n"
1115
                            " %5d  ARC RADIUS: %9.5f  FROM: %8.3f TO: %8.3f DEGREES"
1116
                            "       %11.5f %5d %5d %5d %4d",
1117
                            nwire,
1118
                            xw1,
1119
                            yw1,
1120
                            zw1,
1121
                            xw2,
1122
                            ns,
1123
                            i1,
1124
                            i2,
1125
                            itg);
1126
 
1127
                        arc (itg, ns, xw1, yw1, zw1, xw2);
1128
 
1129
                        continue;
1130
 
1131
                case 9: /* "sc" card */
1132
 
1133
                        if (isct == 0)
1134
                        {
1135
                                fprintf (output_fp, "\n  PATCH DATA ERROR");
1136
                                stop (-1);
1137
                        }
1138
 
1139
                        i1 = data.m + 1;
1140
                        ns++;
1141
 
1142
                        if ((itg != 0) || ((ns != 2) && (ns != 4)))
1143
                        {
1144
                                fprintf (output_fp, "\n  PATCH DATA ERROR");
1145
                                stop (-1);
1146
                        }
1147
 
1148
                        xs1 = x4;
1149
                        ys1 = y4;
1150
                        zs1 = z4;
1151
                        xs2 = x3;
1152
                        ys2 = y3;
1153
                        zs2 = z3;
1154
                        x3 = xw1;
1155
                        y3 = yw1;
1156
                        z3 = zw1;
1157
 
1158
                        if (ns == 4)
1159
                        {
1160
                                x4 = xw2;
1161
                                y4 = yw2;
1162
                                z4 = zw2;
1163
                        }
1164
 
1165
                        xw1 = xs1;
1166
                        yw1 = ys1;
1167
                        zw1 = zs1;
1168
                        xw2 = xs2;
1169
                        yw2 = ys2;
1170
                        zw2 = zs2;
1171
 
1172
                        if (ns != 4)
1173
                        {
1174
                                x4 = xw1 + x3 - xw2;
1175
                                y4 = yw1 + y3 - yw2;
1176
                                z4 = zw1 + z3 - zw2;
1177
                        }
1178
 
1179
                        fprintf (
1180
                            output_fp,
1181
                            "\n"
1182
                            " %5d%c %10.5f %11.5f %11.5f %11.5f %11.5f %11.5f",
1183
                            i1,
1184
                            ipt[ns - 1],
1185
                            xw1,
1186
                            yw1,
1187
                            zw1,
1188
                            xw2,
1189
                            yw2,
1190
                            zw2);
1191
 
1192
                        fprintf (
1193
                            output_fp,
1194
                            "\n"
1195
                            "      %11.5f %11.5f %11.5f  %11.5f %11.5f %11.5f",
1196
                            x3,
1197
                            y3,
1198
                            z3,
1199
                            x4,
1200
                            y4,
1201
                            z4);
1202
 
1203
                        patch (itg, ns, xw1, yw1, zw1, xw2, yw2, zw2, x3, y3, z3, x4, y4, z4);
1204
 
1205
                        continue;
1206
 
1207
                case 10: /* "gh" card, generate helix */
1208
 
1209
                        nwire++;
1210
                        i1 = data.n + 1;
1211
                        i2 = data.n + ns;
1212
 
1213
                        fprintf (
1214
                            output_fp,
1215
                            "\n"
1216
                            " %5d HELIX STRUCTURE - SPACING OF TURNS: %8.3f AXIAL"
1217
                            " LENGTH: %8.3f  %8.3f %5d %5d %5d %4d\n      "
1218
                            " RADIUS X1:%8.3f Y1:%8.3f X2:%8.3f Y2:%8.3f ",
1219
                            nwire,
1220
                            xw1,
1221
                            yw1,
1222
                            rad,
1223
                            ns,
1224
                            i1,
1225
                            i2,
1226
                            itg,
1227
                            zw1,
1228
                            xw2,
1229
                            yw2,
1230
                            zw2);
1231
 
1232
                        helix (xw1, yw1, zw1, xw2, yw2, zw2, rad, ns, itg);
1233
 
1234
                        continue;
1235
 
1236
                case 11: /* "gf" card, not supported */
1237
                        abort_on_error (-5);
1238
                        continue;
1239
                default: /* error message */
1240
 
1241
                        fprintf (output_fp, "\n  GEOMETRY DATA CARD ERROR");
1242
                        fprintf (
1243
                            output_fp,
1244
                            "\n"
1245
                            " %2s %3d %5d %10.5f %10.5f %10.5f %10.5f %10.5f %10.5f %10.5f",
1246
                            gm,
1247
                            itg,
1248
                            ns,
1249
                            xw1,
1250
                            yw1,
1251
                            zw1,
1252
                            xw2,
1253
                            yw2,
1254
                            zw2,
1255
                            rad);
1256
 
1257
                        stop (-1);
1258
 
1259
                } /* switch( gm_num ) */
1260
 
1261
        } /* do */
1262
        while (TRUE);
1263
 
1264
        return;
1265
}
1266
 
1267
/*-----------------------------------------------------------------------*/
1268
 
1269
/* subroutine helix generates segment geometry */
1270
/* data for a helix of ns segments */
1271
void helix (
1272
    double s,
1273
    double hl,
1274
    double a1,
1275
    double b1,
1276
    double a2,
1277
    double b2,
1278
    double rad,
1279
    int ns,
1280
    int itg)
1281
{
1282
        int ist, i, mreq;
1283
        // double turns;
1284
        double zinc, copy, sangle, hdia, turn, pitch, hmaj, hmin;
1285
 
1286
        ist = data.n;
1287
        data.n += ns;
1288
        data.np = data.n;
1289
        data.mp = data.m;
1290
        data.ipsym = 0;
1291
 
1292
        if (ns < 1)
1293
                return;
1294
 
1295
        // turns= fabsl( hl/ s);
1296
        zinc = fabsl (hl / ns);
1297
 
1298
        /* Reallocate tags buffer */
1299
        mem_realloc ((void *) &data.itag, (data.n + data.m) * sizeof (int)); /*????*/
1300
 
1301
        /* Reallocate wire buffers */
1302
        mreq = data.n * sizeof (double);
1303
        mem_realloc ((void *) &data.x1, mreq);
1304
        mem_realloc ((void *) &data.y1, mreq);
1305
        mem_realloc ((void *) &data.z1, mreq);
1306
        mem_realloc ((void *) &data.x2, mreq);
1307
        mem_realloc ((void *) &data.y2, mreq);
1308
        mem_realloc ((void *) &data.z2, mreq);
1309
        mem_realloc ((void *) &data.bi, mreq);
1310
 
1311
        data.z1[ist] = 0.;
1312
        for (i = ist; i < data.n; i++)
1313
        {
1314
                data.bi[i] = rad;
1315
                data.itag[i] = itg;
1316
 
1317
                if (i != ist)
1318
                        data.z1[i] = data.z1[i - 1] + zinc;
1319
 
1320
                data.z2[i] = data.z1[i] + zinc;
1321
 
1322
                if (a2 == a1)
1323
                {
1324
                        if (b1 == 0.)
1325
                                b1 = a1;
1326
 
1327
                        data.x1[i] = a1 * cosl (2. * PI * data.z1[i] / s);
1328
                        data.y1[i] = b1 * sinl (2. * PI * data.z1[i] / s);
1329
                        data.x2[i] = a1 * cosl (2. * PI * data.z2[i] / s);
1330
                        data.y2[i] = b1 * sinl (2. * PI * data.z2[i] / s);
1331
                }
1332
                else
1333
                {
1334
                        if (b2 == 0.)
1335
                                b2 = a2;
1336
 
1337
                        data.x1[i] = (a1 + (a2 - a1) * data.z1[i] / fabsl (hl)) *
1338
                                     cosl (2. * PI * data.z1[i] / s);
1339
                        data.y1[i] = (b1 + (b2 - b1) * data.z1[i] / fabsl (hl)) *
1340
                                     sinl (2. * PI * data.z1[i] / s);
1341
                        data.x2[i] = (a1 + (a2 - a1) * data.z2[i] / fabsl (hl)) *
1342
                                     cosl (2. * PI * data.z2[i] / s);
1343
                        data.y2[i] = (b1 + (b2 - b1) * data.z2[i] / fabsl (hl)) *
1344
                                     sinl (2. * PI * data.z2[i] / s);
1345
 
1346
                } /* if( a2 == a1) */
1347
 
1348
                if (hl > 0.)
1349
                        continue;
1350
 
1351
                copy = data.x1[i];
1352
                data.x1[i] = data.y1[i];
1353
                data.y1[i] = copy;
1354
                copy = data.x2[i];
1355
                data.x2[i] = data.y2[i];
1356
                data.y2[i] = copy;
1357
 
1358
        } /* for( i = ist; i < data.n; i++ ) */
1359
 
1360
        if (a2 != a1)
1361
        {
1362
                sangle = atanl (a2 / (fabsl (hl) + (fabsl (hl) * a1) / (a2 - a1)));
1363
                fprintf (output_fp, "\n       THE CONE ANGLE OF THE SPIRAL IS %10.4f", sangle);
1364
                return;
1365
        }
1366
 
1367
        if (a1 == b1)
1368
        {
1369
                hdia = 2. * a1;
1370
                turn = hdia * PI;
1371
                pitch = atanl (s / (PI * hdia));
1372
                turn = turn / cosl (pitch);
1373
                pitch = 180. * pitch / PI;
1374
        }
1375
        else
1376
        {
1377
                if (a1 >= b1)
1378
                {
1379
                        hmaj = 2. * a1;
1380
                        hmin = 2. * b1;
1381
                }
1382
                else
1383
                {
1384
                        hmaj = 2. * b1;
1385
                        hmin = 2. * a1;
1386
                }
1387
 
1388
                hdia = sqrtl ((hmaj * hmaj + hmin * hmin) / 2 * hmaj);
1389
                turn = 2. * PI * hdia;
1390
                pitch = (180. / PI) * atanl (s / (PI * hdia));
1391
 
1392
        } /* if( a1 == b1) */
1393
 
1394
        fprintf (
1395
            output_fp,
1396
            "\n"
1397
            "       THE PITCH ANGLE IS: %.4f    THE LENGTH OF WIRE/TURN IS: %.4f",
1398
            pitch,
1399
            turn);
1400
 
1401
        return;
1402
}
1403
 
1404
/*-----------------------------------------------------------------------*/
1405
 
1406
/* isegno returns the segment number of the mth segment having the */
1407
/* tag number itagi.  if itagi=0 segment number m is returned. */
1408
int isegno (int itagi, int mx)
1409
{
1410
        int icnt, i, iseg;
1411
 
1412
        if (mx <= 0)
1413
        {
1414
                fprintf (
1415
                    output_fp,
1416
                    "\n  CHECK DATA, PARAMETER SPECIFYING SEGMENT"
1417
                    " POSITION IN A GROUP OF EQUAL TAGS MUST NOT BE ZERO");
1418
                stop (-1);
1419
        }
1420
 
1421
        icnt = 0;
1422
        if (itagi == 0)
1423
        {
1424
                iseg = mx;
1425
                return (iseg);
1426
        }
1427
 
1428
        if (data.n > 0)
1429
        {
1430
                for (i = 0; i < data.n; i++)
1431
                {
1432
                        if (data.itag[i] != itagi)
1433
                                continue;
1434
 
1435
                        icnt++;
1436
                        if (icnt == mx)
1437
                        {
1438
                                iseg = i + 1;
1439
                                return (iseg);
1440
                        }
1441
 
1442
                } /* for( i = 0; i < data.n; i++ ) */
1443
 
1444
        } /* if( data.n > 0) */
1445
 
1446
        fprintf (
1447
            output_fp,
1448
            "\n\n"
1449
            "  NO SEGMENT HAS AN ITAG OF %d",
1450
            itagi);
1451
        stop (-1);
1452
 
1453
        return (0);
1454
}
1455
 
1456
/*-----------------------------------------------------------------------*/
1457
 
1458
/* subroutine move moves the structure with respect to its */
1459
/* coordinate system or reproduces structure in new positions. */
1460
/* structure is rotated about x,y,z axes by rox,roy,roz */
1461
/* respectively, then shifted by xs,ys,zs */
1462
void move (
1463
    double rox,
1464
    double roy,
1465
    double roz,
1466
    double xs,
1467
    double ys,
1468
    double zs,
1469
    int its,
1470
    int nrpt,
1471
    int itgi)
1472
{
1473
        int nrp, ix, i1, k, ir, i, ii, mreq;
1474
        double sps, cps, sth, cth, sph, cph, xx, xy;
1475
        double xz, yx, yy, yz, zx, zy, zz, xi, yi, zi;
1476
 
1477
        if (fabsl (rox) + fabsl (roy) > 1.0e-10)
1478
                data.ipsym = data.ipsym * 3;
1479
 
1480
        sps = sinl (rox);
1481
        cps = cosl (rox);
1482
        sth = sinl (roy);
1483
        cth = cosl (roy);
1484
        sph = sinl (roz);
1485
        cph = cosl (roz);
1486
        xx = cph * cth;
1487
        xy = cph * sth * sps - sph * cps;
1488
        xz = cph * sth * cps + sph * sps;
1489
        yx = sph * cth;
1490
        yy = sph * sth * sps + cph * cps;
1491
        yz = sph * sth * cps - cph * sps;
1492
        zx = -sth;
1493
        zy = cth * sps;
1494
        zz = cth * cps;
1495
 
1496
        if (nrpt == 0)
1497
                nrp = 1;
1498
        else
1499
                nrp = nrpt;
1500
 
1501
        ix = 1;
1502
        if (data.n > 0)
1503
        {
1504
                i1 = isegno (its, 1);
1505
                if (i1 < 1)
1506
                        i1 = 1;
1507
 
1508
                ix = i1;
1509
                if (nrpt == 0)
1510
                        k = i1 - 1;
1511
                else
1512
                {
1513
                        k = data.n;
1514
                        /* Reallocate tags buffer */
1515
                        mreq = data.n + data.m + (data.n + 1 - i1) * nrpt;
1516
                        mem_realloc ((void *) &data.itag, mreq * sizeof (int));
1517
 
1518
                        /* Reallocate wire buffers */
1519
                        mreq = (data.n + (data.n + 1 - i1) * nrpt) * sizeof (double);
1520
                        mem_realloc ((void *) &data.x1, mreq);
1521
                        mem_realloc ((void *) &data.y1, mreq);
1522
                        mem_realloc ((void *) &data.z1, mreq);
1523
                        mem_realloc ((void *) &data.x2, mreq);
1524
                        mem_realloc ((void *) &data.y2, mreq);
1525
                        mem_realloc ((void *) &data.z2, mreq);
1526
                        mem_realloc ((void *) &data.bi, mreq);
1527
                }
1528
 
1529
                for (ir = 0; ir < nrp; ir++)
1530
                {
1531
                        for (i = i1 - 1; i < data.n; i++)
1532
                        {
1533
                                xi = data.x1[i];
1534
                                yi = data.y1[i];
1535
                                zi = data.z1[i];
1536
                                data.x1[k] = xi * xx + yi * xy + zi * xz + xs;
1537
                                data.y1[k] = xi * yx + yi * yy + zi * yz + ys;
1538
                                data.z1[k] = xi * zx + yi * zy + zi * zz + zs;
1539
                                xi = data.x2[i];
1540
                                yi = data.y2[i];
1541
                                zi = data.z2[i];
1542
                                data.x2[k] = xi * xx + yi * xy + zi * xz + xs;
1543
                                data.y2[k] = xi * yx + yi * yy + zi * yz + ys;
1544
                                data.z2[k] = xi * zx + yi * zy + zi * zz + zs;
1545
                                data.bi[k] = data.bi[i];
1546
                                data.itag[k] = data.itag[i];
1547
                                if (data.itag[i] != 0)
1548
                                        data.itag[k] = data.itag[i] + itgi;
1549
 
1550
                                k++;
1551
 
1552
                        } /* for( i = i1; i < data.n; i++ ) */
1553
 
1554
                        i1 = data.n + 1;
1555
                        data.n = k;
1556
 
1557
                } /* for( ir = 0; ir < nrp; ir++ ) */
1558
 
1559
        } /* if( data.n >= n2) */
1560
 
1561
        if (data.m > 0)
1562
        {
1563
                i1 = 0;
1564
                if (nrpt == 0)
1565
                        k = 0;
1566
                else
1567
                        k = data.m;
1568
 
1569
                /* Reallocate patch buffers */
1570
                mreq = data.m * (1 + nrpt) * sizeof (double);
1571
                mem_realloc ((void *) &data.px, mreq);
1572
                mem_realloc ((void *) &data.py, mreq);
1573
                mem_realloc ((void *) &data.pz, mreq);
1574
                mem_realloc ((void *) &data.t1x, mreq);
1575
                mem_realloc ((void *) &data.t1y, mreq);
1576
                mem_realloc ((void *) &data.t1z, mreq);
1577
                mem_realloc ((void *) &data.t2x, mreq);
1578
                mem_realloc ((void *) &data.t2y, mreq);
1579
                mem_realloc ((void *) &data.t2z, mreq);
1580
                mem_realloc ((void *) &data.pbi, mreq);
1581
                mem_realloc ((void *) &data.psalp, mreq);
1582
 
1583
                for (ii = 0; ii < nrp; ii++)
1584
                {
1585
                        for (i = i1; i < data.m; i++)
1586
                        {
1587
                                xi = data.px[i];
1588
                                yi = data.py[i];
1589
                                zi = data.pz[i];
1590
                                data.px[k] = xi * xx + yi * xy + zi * xz + xs;
1591
                                data.py[k] = xi * yx + yi * yy + zi * yz + ys;
1592
                                data.pz[k] = xi * zx + yi * zy + zi * zz + zs;
1593
                                xi = data.t1x[i];
1594
                                yi = data.t1y[i];
1595
                                zi = data.t1z[i];
1596
                                data.t1x[k] = xi * xx + yi * xy + zi * xz;
1597
                                data.t1y[k] = xi * yx + yi * yy + zi * yz;
1598
                                data.t1z[k] = xi * zx + yi * zy + zi * zz;
1599
                                xi = data.t2x[i];
1600
                                yi = data.t2y[i];
1601
                                zi = data.t2z[i];
1602
                                data.t2x[k] = xi * xx + yi * xy + zi * xz;
1603
                                data.t2y[k] = xi * yx + yi * yy + zi * yz;
1604
                                data.t2z[k] = xi * zx + yi * zy + zi * zz;
1605
                                data.psalp[k] = data.psalp[i];
1606
                                data.pbi[k] = data.pbi[i];
1607
                                k++;
1608
 
1609
                        } /* for( i = i1; i < data.m; i++ ) */
1610
 
1611
                        i1 = data.m;
1612
                        data.m = k;
1613
 
1614
                } /* for( ii = 0; ii < nrp; ii++ ) */
1615
 
1616
        } /* if( data.m >= m2) */
1617
 
1618
        if ((nrpt == 0) && (ix == 1))
1619
                return;
1620
 
1621
        data.np = data.n;
1622
        data.mp = data.m;
1623
        data.ipsym = 0;
1624
 
1625
        return;
1626
}
1627
 
1628
/*-----------------------------------------------------------------------*/
1629
 
1630
/* patch generates and modifies patch geometry data */
1631
void patch (
1632
    int nx,
1633
    int ny,
1634
    double ax1,
1635
    double ay1,
1636
    double az1,
1637
    double ax2,
1638
    double ay2,
1639
    double az2,
1640
    double ax3,
1641
    double ay3,
1642
    double az3,
1643
    double ax4,
1644
    double ay4,
1645
    double az4)
1646
{
1647
        int mi, ntp, iy, ix, mreq;
1648
        double s1x = 0., s1y = 0., s1z = 0., s2x = 0., s2y = 0., s2z = 0., xst = 0.;
1649
        double znv, xnv, ynv, xa, xn2, yn2, zn2, salpn, xs, ys, zs, xt, yt, zt;
1650
 
1651
        /* new patches.  for nx=0, ny=1,2,3,4 patch is (respectively) */
1652
        /* arbitrary, rectagular, triangular, or quadrilateral. */
1653
        /* for nx and ny  > 0 a rectangular surface is produced with */
1654
        /* nx by ny rectangular patches. */
1655
 
1656
        data.m++;
1657
        mi = data.m - 1;
1658
 
1659
        /* Reallocate patch buffers */
1660
        mreq = data.m * sizeof (double);
1661
        mem_realloc ((void *) &data.px, mreq);
1662
        mem_realloc ((void *) &data.py, mreq);
1663
        mem_realloc ((void *) &data.pz, mreq);
1664
        mem_realloc ((void *) &data.t1x, mreq);
1665
        mem_realloc ((void *) &data.t1y, mreq);
1666
        mem_realloc ((void *) &data.t1z, mreq);
1667
        mem_realloc ((void *) &data.t2x, mreq);
1668
        mem_realloc ((void *) &data.t2y, mreq);
1669
        mem_realloc ((void *) &data.t2z, mreq);
1670
        mem_realloc ((void *) &data.pbi, mreq);
1671
        mem_realloc ((void *) &data.psalp, mreq);
1672
 
1673
        if (nx > 0)
1674
                ntp = 2;
1675
        else
1676
                ntp = ny;
1677
 
1678
        if (ntp <= 1)
1679
        {
1680
                data.px[mi] = ax1;
1681
                data.py[mi] = ay1;
1682
                data.pz[mi] = az1;
1683
                data.pbi[mi] = az2;
1684
                znv = cosl (ax2);
1685
                xnv = znv * cosl (ay2);
1686
                ynv = znv * sinl (ay2);
1687
                znv = sinl (ax2);
1688
                xa = sqrtl (xnv * xnv + ynv * ynv);
1689
 
1690
                if (xa >= 1.0e-6)
1691
                {
1692
                        data.t1x[mi] = -ynv / xa;
1693
                        data.t1y[mi] = xnv / xa;
1694
                        data.t1z[mi] = 0.;
1695
                }
1696
                else
1697
                {
1698
                        data.t1x[mi] = 1.;
1699
                        data.t1y[mi] = 0.;
1700
                        data.t1z[mi] = 0.;
1701
                }
1702
 
1703
        } /* if( ntp <= 1) */
1704
        else
1705
        {
1706
                s1x = ax2 - ax1;
1707
                s1y = ay2 - ay1;
1708
                s1z = az2 - az1;
1709
                s2x = ax3 - ax2;
1710
                s2y = ay3 - ay2;
1711
                s2z = az3 - az2;
1712
 
1713
                if (nx != 0)
1714
                {
1715
                        s1x = s1x / nx;
1716
                        s1y = s1y / nx;
1717
                        s1z = s1z / nx;
1718
                        s2x = s2x / ny;
1719
                        s2y = s2y / ny;
1720
                        s2z = s2z / ny;
1721
                }
1722
 
1723
                xnv = s1y * s2z - s1z * s2y;
1724
                ynv = s1z * s2x - s1x * s2z;
1725
                znv = s1x * s2y - s1y * s2x;
1726
                xa = sqrtl (xnv * xnv + ynv * ynv + znv * znv);
1727
                xnv = xnv / xa;
1728
                ynv = ynv / xa;
1729
                znv = znv / xa;
1730
                xst = sqrtl (s1x * s1x + s1y * s1y + s1z * s1z);
1731
                data.t1x[mi] = s1x / xst;
1732
                data.t1y[mi] = s1y / xst;
1733
                data.t1z[mi] = s1z / xst;
1734
 
1735
                if (ntp <= 2)
1736
                {
1737
                        data.px[mi] = ax1 + .5 * (s1x + s2x);
1738
                        data.py[mi] = ay1 + .5 * (s1y + s2y);
1739
                        data.pz[mi] = az1 + .5 * (s1z + s2z);
1740
                        data.pbi[mi] = xa;
1741
                }
1742
                else
1743
                {
1744
                        if (ntp != 4)
1745
                        {
1746
                                data.px[mi] = (ax1 + ax2 + ax3) / 3.;
1747
                                data.py[mi] = (ay1 + ay2 + ay3) / 3.;
1748
                                data.pz[mi] = (az1 + az2 + az3) / 3.;
1749
                                data.pbi[mi] = .5 * xa;
1750
                        }
1751
                        else
1752
                        {
1753
                                s1x = ax3 - ax1;
1754
                                s1y = ay3 - ay1;
1755
                                s1z = az3 - az1;
1756
                                s2x = ax4 - ax1;
1757
                                s2y = ay4 - ay1;
1758
                                s2z = az4 - az1;
1759
                                xn2 = s1y * s2z - s1z * s2y;
1760
                                yn2 = s1z * s2x - s1x * s2z;
1761
                                zn2 = s1x * s2y - s1y * s2x;
1762
                                xst = sqrtl (xn2 * xn2 + yn2 * yn2 + zn2 * zn2);
1763
                                salpn = 1. / (3. * (xa + xst));
1764
                                data.px[mi] =
1765
                                    (xa * (ax1 + ax2 + ax3) + xst * (ax1 + ax3 + ax4)) * salpn;
1766
                                data.py[mi] =
1767
                                    (xa * (ay1 + ay2 + ay3) + xst * (ay1 + ay3 + ay4)) * salpn;
1768
                                data.pz[mi] =
1769
                                    (xa * (az1 + az2 + az3) + xst * (az1 + az3 + az4)) * salpn;
1770
                                data.pbi[mi] = .5 * (xa + xst);
1771
                                s1x = (xnv * xn2 + ynv * yn2 + znv * zn2) / xst;
1772
 
1773
                                if (s1x <= 0.9998)
1774
                                {
1775
                                        fprintf (
1776
                                            output_fp,
1777
                                            "\n  ERROR -- CORNERS OF QUADRILATERAL"
1778
                                            " PATCH DO NOT LIE IN A PLANE");
1779
                                        stop (-1);
1780
                                }
1781
 
1782
                        } /* if( ntp != 4) */
1783
 
1784
                } /* if( ntp <= 2) */
1785
 
1786
        } /* if( ntp <= 1) */
1787
 
1788
        data.t2x[mi] = ynv * data.t1z[mi] - znv * data.t1y[mi];
1789
        data.t2y[mi] = znv * data.t1x[mi] - xnv * data.t1z[mi];
1790
        data.t2z[mi] = xnv * data.t1y[mi] - ynv * data.t1x[mi];
1791
        data.psalp[mi] = 1.;
1792
 
1793
        if (nx != 0)
1794
        {
1795
                data.m += nx * ny - 1;
1796
 
1797
                /* Reallocate patch buffers */
1798
                mreq = data.m * sizeof (double);
1799
                mem_realloc ((void *) &data.px, mreq);
1800
                mem_realloc ((void *) &data.py, mreq);
1801
                mem_realloc ((void *) &data.pz, mreq);
1802
                mem_realloc ((void *) &data.t1x, mreq);
1803
                mem_realloc ((void *) &data.t1y, mreq);
1804
                mem_realloc ((void *) &data.t1z, mreq);
1805
                mem_realloc ((void *) &data.t2x, mreq);
1806
                mem_realloc ((void *) &data.t2y, mreq);
1807
                mem_realloc ((void *) &data.t2z, mreq);
1808
                mem_realloc ((void *) &data.pbi, mreq);
1809
                mem_realloc ((void *) &data.psalp, mreq);
1810
 
1811
                xn2 = data.px[mi] - s1x - s2x;
1812
                yn2 = data.py[mi] - s1y - s2y;
1813
                zn2 = data.pz[mi] - s1z - s2z;
1814
                xs = data.t1x[mi];
1815
                ys = data.t1y[mi];
1816
                zs = data.t1z[mi];
1817
                xt = data.t2x[mi];
1818
                yt = data.t2y[mi];
1819
                zt = data.t2z[mi];
1820
 
1821
                for (iy = 0; iy < ny; iy++)
1822
                {
1823
                        xn2 += s2x;
1824
                        yn2 += s2y;
1825
                        zn2 += s2z;
1826
 
1827
                        for (ix = 1; ix <= nx; ix++)
1828
                        {
1829
                                xst = (double) ix;
1830
                                data.px[mi] = xn2 + xst * s1x;
1831
                                data.py[mi] = yn2 + xst * s1y;
1832
                                data.pz[mi] = zn2 + xst * s1z;
1833
                                data.pbi[mi] = xa;
1834
                                data.psalp[mi] = 1.;
1835
                                data.t1x[mi] = xs;
1836
                                data.t1y[mi] = ys;
1837
                                data.t1z[mi] = zs;
1838
                                data.t2x[mi] = xt;
1839
                                data.t2y[mi] = yt;
1840
                                data.t2z[mi] = zt;
1841
                                mi++;
1842
                        } /* for( ix = 0; ix < nx; ix++ ) */
1843
 
1844
                } /* for( iy = 0; iy < ny; iy++ ) */
1845
 
1846
        } /* if( nx != 0) */
1847
 
1848
        data.ipsym = 0;
1849
        data.np = data.n;
1850
        data.mp = data.m;
1851
 
1852
        return;
1853
}
1854
 
1855
/*-----------------------------------------------------------------------*/
1856
 
1857
/*** this function was an 'entry point' (part of) 'patch()' ***/
1858
void subph (int nx, int ny)
1859
{
1860
        int mia, ix, iy, mi, mreq;
1861
        double xs, ys, zs, xa, xst, s1x, s1y, s1z, s2x, s2y, s2z, saln, xt, yt;
1862
 
1863
        /* Reallocate patch buffers */
1864
        if (ny == 0)
1865
                data.m += 3;
1866
        else
1867
                data.m += 4;
1868
 
1869
        mreq = data.m * sizeof (double);
1870
        mem_realloc ((void *) &data.px, mreq);
1871
        mem_realloc ((void *) &data.py, mreq);
1872
        mem_realloc ((void *) &data.pz, mreq);
1873
        mem_realloc ((void *) &data.t1x, mreq);
1874
        mem_realloc ((void *) &data.t1y, mreq);
1875
        mem_realloc ((void *) &data.t1z, mreq);
1876
        mem_realloc ((void *) &data.t2x, mreq);
1877
        mem_realloc ((void *) &data.t2y, mreq);
1878
        mem_realloc ((void *) &data.t2z, mreq);
1879
        mem_realloc ((void *) &data.pbi, mreq);
1880
        mem_realloc ((void *) &data.psalp, mreq);
1881
        mem_realloc ((void *) &data.icon1, (data.n + data.m) * sizeof (int));
1882
        mem_realloc ((void *) &data.icon2, (data.n + data.m) * sizeof (int));
1883
 
1884
        /* Shift patches to make room for new ones */
1885
        if ((ny == 0) && (nx != data.m))
1886
        {
1887
                for (iy = data.m - 1; iy > nx + 2; iy--)
1888
                {
1889
                        ix = iy - 3;
1890
                        data.px[iy] = data.px[ix];
1891
                        data.py[iy] = data.py[ix];
1892
                        data.pz[iy] = data.pz[ix];
1893
                        data.pbi[iy] = data.pbi[ix];
1894
                        data.psalp[iy] = data.psalp[ix];
1895
                        data.t1x[iy] = data.t1x[ix];
1896
                        data.t1y[iy] = data.t1y[ix];
1897
                        data.t1z[iy] = data.t1z[ix];
1898
                        data.t2x[iy] = data.t2x[ix];
1899
                        data.t2y[iy] = data.t2y[ix];
1900
                        data.t2z[iy] = data.t2z[ix];
1901
                }
1902
 
1903
        } /* if( (ny == 0) || (nx != m) ) */
1904
 
1905
        /* divide patch for connection */
1906
        mi = nx - 1;
1907
        xs = data.px[mi];
1908
        ys = data.py[mi];
1909
        zs = data.pz[mi];
1910
        xa = data.pbi[mi] / 4.;
1911
        xst = sqrtl (xa) / 2.;
1912
        s1x = data.t1x[mi];
1913
        s1y = data.t1y[mi];
1914
        s1z = data.t1z[mi];
1915
        s2x = data.t2x[mi];
1916
        s2y = data.t2y[mi];
1917
        s2z = data.t2z[mi];
1918
        saln = data.psalp[mi];
1919
        xt = xst;
1920
        yt = xst;
1921
 
1922
        if (ny == 0)
1923
                mia = mi;
1924
        else
1925
        {
1926
                data.mp++;
1927
                mia = data.m - 1;
1928
        }
1929
 
1930
        for (ix = 1; ix <= 4; ix++)
1931
        {
1932
                data.px[mia] = xs + xt * s1x + yt * s2x;
1933
                data.py[mia] = ys + xt * s1y + yt * s2y;
1934
                data.pz[mia] = zs + xt * s1z + yt * s2z;
1935
                data.pbi[mia] = xa;
1936
                data.t1x[mia] = s1x;
1937
                data.t1y[mia] = s1y;
1938
                data.t1z[mia] = s1z;
1939
                data.t2x[mia] = s2x;
1940
                data.t2y[mia] = s2y;
1941
                data.t2z[mia] = s2z;
1942
                data.psalp[mia] = saln;
1943
 
1944
                if (ix == 2)
1945
                        yt = -yt;
1946
 
1947
                if ((ix == 1) || (ix == 3))
1948
                        xt = -xt;
1949
 
1950
                mia++;
1951
        }
1952
 
1953
        if (nx <= data.mp)
1954
                data.mp += 3;
1955
 
1956
        if (ny > 0)
1957
                data.pz[mi] = 10000.;
1958
 
1959
        return;
1960
}
1961
 
1962
/*-----------------------------------------------------------------------*/
1963
 
1964
void readgm (
1965
    char *gm,
1966
    int *i1,
1967
    int *i2,
1968
    double *x1,
1969
    double *y1,
1970
    double *z1,
1971
    double *x2,
1972
    double *y2,
1973
    double *z2,
1974
    double *rad)
1975
{
1976
        char line_buf[134];
1977
        int nlin, i, line_idx;
1978
        int nint = 2, nflt = 7;
1979
        int iarr[2] = {0, 0};
1980
        double rarr[7] = {0., 0., 0., 0., 0., 0., 0.};
1981
 
1982
        /* read a line from input file */
1983
        load_line (line_buf, input_fp);
1984
        {
1985
                gm[0] = 'E';
1986
                gm[1] = 'N';
1987
                gm[2] = '\0';
1988
                nlin = 2;
1989
        }
1990
 
1991
        /* get line length */
1992
        nlin = strlen (line_buf);
1993
 
1994
        /* abort if card's mnemonic too short or missing */
1995
        if (nlin < 2)
1996
        {
1997
                fprintf (
1998
                    output_fp,
1999
                    "\n  GEOMETRY DATA CARD ERROR:"
2000
                    "\n  CARD'S MNEMONIC CODE TOO SHORT OR MISSING.");
2001
                stop (-1);
2002
        }
2003
 
2004
        /* extract card's mnemonic code */
2005
        /* was strncpy (gm, line_buf, 2) ; */
2006
        gm[0] = line_buf[0];
2007
        gm[1] = line_buf[1];
2008
        gm[2] = '\0';
2009
 
2010
        /* Exit if "XT" command read (for testing) */
2011
        if (strcmp (gm, "XT") == 0)
2012
        {
2013
                fprintf (stderr, "\nnec2c: Exiting after an \"XT\" command in readgm()\n");
2014
                fprintf (
2015
                    output_fp, "\n\n  nec2c: Exiting after an \"XT\" command in readgm()");
2016
                stop (0);
2017
        }
2018
 
2019
        /* Return if only mnemonic on card */
2020
        if (nlin == 2)
2021
        {
2022
                *i1 = *i2 = 0;
2023
                *x1 = *y1 = *z1 = *x2 = *y2 = *z2 = *rad = 0.;
2024
                return;
2025
        }
2026
 
2027
        /* read integers from line */
2028
        line_idx = 1;
2029
        for (i = 0; i < nint; i++)
2030
        {
2031
                /* Find first numerical character */
2032
                while (((line_buf[++line_idx] < '0') || (line_buf[line_idx] > '9')) &&
2033
                       (line_buf[line_idx] != '+') && (line_buf[line_idx] != '-'))
2034
                        if ((line_buf[line_idx] == '\0'))
2035
                        {
2036
                                *i1 = iarr[0];
2037
                                *i2 = iarr[1];
2038
                                *x1 = rarr[0];
2039
                                *y1 = rarr[1];
2040
                                *z1 = rarr[2];
2041
                                *x2 = rarr[3];
2042
                                *y2 = rarr[4];
2043
                                *z2 = rarr[5];
2044
                                *rad = rarr[6];
2045
                                return;
2046
                        }
2047
 
2048
                /* read an integer from line */
2049
                iarr[i] = atoi (&line_buf[line_idx]);
2050
 
2051
                /* traverse numerical field to next ' ' or ',' or '\0' */
2052
                line_idx--;
2053
                while ((line_buf[++line_idx] != ' ') && (line_buf[line_idx] != '        ') &&
2054
                       (line_buf[line_idx] != ',') && (line_buf[line_idx] != '\0'))
2055
                {
2056
                        /* test for non-numerical characters */
2057
                        if (((line_buf[line_idx] < '0') || (line_buf[line_idx] > '9')) &&
2058
                            (line_buf[line_idx] != '+') && (line_buf[line_idx] != '-'))
2059
                        {
2060
                                fprintf (
2061
                                    output_fp,
2062
                                    "\n  GEOMETRY DATA CARD \"%s\" ERROR:"
2063
                                    "\n  NON-NUMERICAL CHARACTER '%c' IN INTEGER FIELD AT "
2064
                                    "CHAR. %d\n",
2065
                                    gm,
2066
                                    line_buf[line_idx],
2067
                                    (line_idx + 1));
2068
                                stop (-1);
2069
                        }
2070
 
2071
                } /* while( (line_buff[++line_idx] ... */
2072
 
2073
                /* Return on end of line */
2074
                if (line_buf[line_idx] == '\0')
2075
                {
2076
                        *i1 = iarr[0];
2077
                        *i2 = iarr[1];
2078
                        *x1 = rarr[0];
2079
                        *y1 = rarr[1];
2080
                        *z1 = rarr[2];
2081
                        *x2 = rarr[3];
2082
                        *y2 = rarr[4];
2083
                        *z2 = rarr[5];
2084
                        *rad = rarr[6];
2085
                        return;
2086
                }
2087
 
2088
        } /* for( i = 0; i < nint; i++ ) */
2089
 
2090
        /* read doubles from line */
2091
        for (i = 0; i < nflt; i++)
2092
        {
2093
                /* Find first numerical character */
2094
                while (((line_buf[++line_idx] < '0') || (line_buf[line_idx] > '9')) &&
2095
                       (line_buf[line_idx] != '+') && (line_buf[line_idx] != '-') &&
2096
                       (line_buf[line_idx] != '.'))
2097
                        if ((line_buf[line_idx] == '\0'))
2098
                        {
2099
                                *i1 = iarr[0];
2100
                                *i2 = iarr[1];
2101
                                *x1 = rarr[0];
2102
                                *y1 = rarr[1];
2103
                                *z1 = rarr[2];
2104
                                *x2 = rarr[3];
2105
                                *y2 = rarr[4];
2106
                                *z2 = rarr[5];
2107
                                *rad = rarr[6];
2108
                                return;
2109
                        }
2110
 
2111
                /* read a double from line */
2112
                rarr[i] = atof (&line_buf[line_idx]);
2113
 
2114
                /* traverse numerical field to next ' ' or ',' or '\0' */
2115
                line_idx--;
2116
                while ((line_buf[++line_idx] != ' ') && (line_buf[line_idx] != '        ') &&
2117
                       (line_buf[line_idx] != ',') && (line_buf[line_idx] != '\0'))
2118
                {
2119
                        /* test for non-numerical characters */
2120
                        if (((line_buf[line_idx] < '0') || (line_buf[line_idx] > '9')) &&
2121
                            (line_buf[line_idx] != '.') && (line_buf[line_idx] != '+') &&
2122
                            (line_buf[line_idx] != '-') && (line_buf[line_idx] != 'E') &&
2123
                            (line_buf[line_idx] != 'e'))
2124
                        {
2125
                                fprintf (
2126
                                    output_fp,
2127
                                    "\n  GEOMETRY DATA CARD \"%s\" ERROR:"
2128
                                    "\n  NON-NUMERICAL CHARACTER '%c' IN FLOAT FIELD AT CHAR. "
2129
                                    "%d.\n",
2130
                                    gm,
2131
                                    line_buf[line_idx],
2132
                                    (line_idx + 1));
2133
                                stop (-1);
2134
                        }
2135
 
2136
                } /* while( (line_buff[++line_idx] ... */
2137
 
2138
                /* Return on end of line */
2139
                if (line_buf[line_idx] == '\0')
2140
                {
2141
                        *i1 = iarr[0];
2142
                        *i2 = iarr[1];
2143
                        *x1 = rarr[0];
2144
                        *y1 = rarr[1];
2145
                        *z1 = rarr[2];
2146
                        *x2 = rarr[3];
2147
                        *y2 = rarr[4];
2148
                        *z2 = rarr[5];
2149
                        *rad = rarr[6];
2150
                        return;
2151
                }
2152
 
2153
        } /* for( i = 0; i < nflt; i++ ) */
2154
 
2155
        *i1 = iarr[0];
2156
        *i2 = iarr[1];
2157
        *x1 = rarr[0];
2158
        *y1 = rarr[1];
2159
        *z1 = rarr[2];
2160
        *x2 = rarr[3];
2161
        *y2 = rarr[4];
2162
        *z2 = rarr[5];
2163
        *rad = rarr[6];
2164
 
2165
        return;
2166
}
2167
 
2168
/*-----------------------------------------------------------------------*/
2169
 
2170
/* reflc reflects partial structure along x,y, or z axes or rotates */
2171
/* structure to complete a symmetric structure. */
2172
void reflc (int ix, int iy, int iz, int itx, int nop)
2173
{
2174
        int iti, i, nx, itagi, k, mreq;
2175
        double e1, e2, fnop, sam, cs, ss, xk, yk;
2176
 
2177
        data.np = data.n;
2178
        data.mp = data.m;
2179
        data.ipsym = 0;
2180
        iti = itx;
2181
 
2182
        if (ix >= 0)
2183
        {
2184
                if (nop == 0)
2185
                        return;
2186
 
2187
                data.ipsym = 1;
2188
 
2189
                /* reflect along z axis */
2190
                if (iz != 0)
2191
                {
2192
                        data.ipsym = 2;
2193
 
2194
                        if (data.n > 0)
2195
                        {
2196
                                /* Reallocate tags buffer */
2197
                                mem_realloc (
2198
                                    (void *) &data.itag, (2 * data.n + data.m) * sizeof (int));
2199
 
2200
                                /* Reallocate wire buffers */
2201
                                mreq = 2 * data.n * sizeof (double);
2202
                                mem_realloc ((void *) &data.x1, mreq);
2203
                                mem_realloc ((void *) &data.y1, mreq);
2204
                                mem_realloc ((void *) &data.z1, mreq);
2205
                                mem_realloc ((void *) &data.x2, mreq);
2206
                                mem_realloc ((void *) &data.y2, mreq);
2207
                                mem_realloc ((void *) &data.z2, mreq);
2208
                                mem_realloc ((void *) &data.bi, mreq);
2209
 
2210
                                for (i = 0; i < data.n; i++)
2211
                                {
2212
                                        nx = i + data.n;
2213
                                        e1 = data.z1[i];
2214
                                        e2 = data.z2[i];
2215
 
2216
                                        if ((fabsl (e1) + fabsl (e2) <= 1.0e-5) ||
2217
                                            (e1 * e2 < -1.0e-6))
2218
                                        {
2219
                                                fprintf (
2220
                                                    output_fp,
2221
                                                    "\n  GEOMETRY DATA ERROR--SEGMENT %d"
2222
                                                    " LIES IN PLANE OF SYMMETRY",
2223
                                                    i + 1);
2224
                                                stop (-1);
2225
                                        }
2226
 
2227
                                        data.x1[nx] = data.x1[i];
2228
                                        data.y1[nx] = data.y1[i];
2229
                                        data.z1[nx] = -e1;
2230
                                        data.x2[nx] = data.x2[i];
2231
                                        data.y2[nx] = data.y2[i];
2232
                                        data.z2[nx] = -e2;
2233
                                        itagi = data.itag[i];
2234
 
2235
                                        if (itagi == 0)
2236
                                                data.itag[nx] = 0;
2237
                                        if (itagi != 0)
2238
                                                data.itag[nx] = itagi + iti;
2239
 
2240
                                        data.bi[nx] = data.bi[i];
2241
 
2242
                                } /* for( i = 0; i < data.n; i++ ) */
2243
 
2244
                                data.n = data.n * 2;
2245
                                iti = iti * 2;
2246
 
2247
                        } /* if( data.n > 0) */
2248
 
2249
                        if (data.m > 0)
2250
                        {
2251
                                /* Reallocate patch buffers */
2252
                                mreq = 2 * data.m * sizeof (double);
2253
                                mem_realloc ((void *) &data.px, mreq);
2254
                                mem_realloc ((void *) &data.py, mreq);
2255
                                mem_realloc ((void *) &data.pz, mreq);
2256
                                mem_realloc ((void *) &data.t1x, mreq);
2257
                                mem_realloc ((void *) &data.t1y, mreq);
2258
                                mem_realloc ((void *) &data.t1z, mreq);
2259
                                mem_realloc ((void *) &data.t2x, mreq);
2260
                                mem_realloc ((void *) &data.t2y, mreq);
2261
                                mem_realloc ((void *) &data.t2z, mreq);
2262
                                mem_realloc ((void *) &data.pbi, mreq);
2263
                                mem_realloc ((void *) &data.psalp, mreq);
2264
 
2265
                                for (i = 0; i < data.m; i++)
2266
                                {
2267
                                        nx = i + data.m;
2268
                                        if (fabsl (data.pz[i]) <= 1.0e-10)
2269
                                        {
2270
                                                fprintf (
2271
                                                    output_fp,
2272
                                                    "\n  GEOMETRY DATA ERROR--PATCH %d"
2273
                                                    " LIES IN PLANE OF SYMMETRY",
2274
                                                    i + 1);
2275
                                                stop (-1);
2276
                                        }
2277
 
2278
                                        data.px[nx] = data.px[i];
2279
                                        data.py[nx] = data.py[i];
2280
                                        data.pz[nx] = -data.pz[i];
2281
                                        data.t1x[nx] = data.t1x[i];
2282
                                        data.t1y[nx] = data.t1y[i];
2283
                                        data.t1z[nx] = -data.t1z[i];
2284
                                        data.t2x[nx] = data.t2x[i];
2285
                                        data.t2y[nx] = data.t2y[i];
2286
                                        data.t2z[nx] = -data.t2z[i];
2287
                                        data.psalp[nx] = -data.psalp[i];
2288
                                        data.pbi[nx] = data.pbi[i];
2289
                                }
2290
 
2291
                                data.m = data.m * 2;
2292
 
2293
                        } /* if( data.m >= m2) */
2294
 
2295
                } /* if( iz != 0) */
2296
 
2297
                /* reflect along y axis */
2298
                if (iy != 0)
2299
                {
2300
                        if (data.n > 0)
2301
                        {
2302
                                /* Reallocate tags buffer */
2303
                                mem_realloc (
2304
                                    (void *) &data.itag,
2305
                                    (2 * data.n + data.m) * sizeof (int)); /*????*/
2306
 
2307
                                /* Reallocate wire buffers */
2308
                                mreq = 2 * data.n * sizeof (double);
2309
                                mem_realloc ((void *) &data.x1, mreq);
2310
                                mem_realloc ((void *) &data.y1, mreq);
2311
                                mem_realloc ((void *) &data.z1, mreq);
2312
                                mem_realloc ((void *) &data.x2, mreq);
2313
                                mem_realloc ((void *) &data.y2, mreq);
2314
                                mem_realloc ((void *) &data.z2, mreq);
2315
                                mem_realloc ((void *) &data.bi, mreq);
2316
 
2317
                                for (i = 0; i < data.n; i++)
2318
                                {
2319
                                        nx = i + data.n;
2320
                                        e1 = data.y1[i];
2321
                                        e2 = data.y2[i];
2322
 
2323
                                        if ((fabsl (e1) + fabsl (e2) <= 1.0e-5) ||
2324
                                            (e1 * e2 < -1.0e-6))
2325
                                        {
2326
                                                fprintf (
2327
                                                    output_fp,
2328
                                                    "\n  GEOMETRY DATA ERROR--SEGMENT %d"
2329
                                                    " LIES IN PLANE OF SYMMETRY",
2330
                                                    i + 1);
2331
                                                stop (-1);
2332
                                        }
2333
 
2334
                                        data.x1[nx] = data.x1[i];
2335
                                        data.y1[nx] = -e1;
2336
                                        data.z1[nx] = data.z1[i];
2337
                                        data.x2[nx] = data.x2[i];
2338
                                        data.y2[nx] = -e2;
2339
                                        data.z2[nx] = data.z2[i];
2340
                                        itagi = data.itag[i];
2341
 
2342
                                        if (itagi == 0)
2343
                                                data.itag[nx] = 0;
2344
                                        if (itagi != 0)
2345
                                                data.itag[nx] = itagi + iti;
2346
 
2347
                                        data.bi[nx] = data.bi[i];
2348
 
2349
                                } /* for( i = n2-1; i < data.n; i++ ) */
2350
 
2351
                                data.n = data.n * 2;
2352
                                iti = iti * 2;
2353
 
2354
                        } /* if( data.n >= n2) */
2355
 
2356
                        if (data.m > 0)
2357
                        {
2358
                                /* Reallocate patch buffers */
2359
                                mreq = 2 * data.m * sizeof (double);
2360
                                mem_realloc ((void *) &data.px, mreq);
2361
                                mem_realloc ((void *) &data.py, mreq);
2362
                                mem_realloc ((void *) &data.pz, mreq);
2363
                                mem_realloc ((void *) &data.t1x, mreq);
2364
                                mem_realloc ((void *) &data.t1y, mreq);
2365
                                mem_realloc ((void *) &data.t1z, mreq);
2366
                                mem_realloc ((void *) &data.t2x, mreq);
2367
                                mem_realloc ((void *) &data.t2y, mreq);
2368
                                mem_realloc ((void *) &data.t2z, mreq);
2369
                                mem_realloc ((void *) &data.pbi, mreq);
2370
                                mem_realloc ((void *) &data.psalp, mreq);
2371
 
2372
                                for (i = 0; i < data.m; i++)
2373
                                {
2374
                                        nx = i + data.m;
2375
                                        if (fabsl (data.py[i]) <= 1.0e-10)
2376
                                        {
2377
                                                fprintf (
2378
                                                    output_fp,
2379
                                                    "\n  GEOMETRY DATA ERROR--PATCH %d"
2380
                                                    " LIES IN PLANE OF SYMMETRY",
2381
                                                    i + 1);
2382
                                                stop (-1);
2383
                                        }
2384
 
2385
                                        data.px[nx] = data.px[i];
2386
                                        data.py[nx] = -data.py[i];
2387
                                        data.pz[nx] = data.pz[i];
2388
                                        data.t1x[nx] = data.t1x[i];
2389
                                        data.t1y[nx] = -data.t1y[i];
2390
                                        data.t1z[nx] = data.t1z[i];
2391
                                        data.t2x[nx] = data.t2x[i];
2392
                                        data.t2y[nx] = -data.t2y[i];
2393
                                        data.t2z[nx] = data.t2z[i];
2394
                                        data.psalp[nx] = -data.psalp[i];
2395
                                        data.pbi[nx] = data.pbi[i];
2396
 
2397
                                } /* for( i = m2; i <= data.m; i++ ) */
2398
 
2399
                                data.m = data.m * 2;
2400
 
2401
                        } /* if( data.m >= m2) */
2402
 
2403
                } /* if( iy != 0) */
2404
 
2405
                /* reflect along x axis */
2406
                if (ix == 0)
2407
                        return;
2408
 
2409
                if (data.n > 0)
2410
                {
2411
                        /* Reallocate tags buffer */
2412
                        mem_realloc (
2413
                            (void *) &data.itag,
2414
                            (2 * data.n + data.m) * sizeof (int)); /*????*/
2415
 
2416
                        /* Reallocate wire buffers */
2417
                        mreq = 2 * data.n * sizeof (double);
2418
                        mem_realloc ((void *) &data.x1, mreq);
2419
                        mem_realloc ((void *) &data.y1, mreq);
2420
                        mem_realloc ((void *) &data.z1, mreq);
2421
                        mem_realloc ((void *) &data.x2, mreq);
2422
                        mem_realloc ((void *) &data.y2, mreq);
2423
                        mem_realloc ((void *) &data.z2, mreq);
2424
                        mem_realloc ((void *) &data.bi, mreq);
2425
 
2426
                        for (i = 0; i < data.n; i++)
2427
                        {
2428
                                nx = i + data.n;
2429
                                e1 = data.x1[i];
2430
                                e2 = data.x2[i];
2431
 
2432
                                if ((fabsl (e1) + fabsl (e2) <= 1.0e-5) || (e1 * e2 < -1.0e-6))
2433
                                {
2434
                                        fprintf (
2435
                                            output_fp,
2436
                                            "\n  GEOMETRY DATA ERROR--SEGMENT %d"
2437
                                            " LIES IN PLANE OF SYMMETRY",
2438
                                            i + 1);
2439
                                        stop (-1);
2440
                                }
2441
 
2442
                                data.x1[nx] = -e1;
2443
                                data.y1[nx] = data.y1[i];
2444
                                data.z1[nx] = data.z1[i];
2445
                                data.x2[nx] = -e2;
2446
                                data.y2[nx] = data.y2[i];
2447
                                data.z2[nx] = data.z2[i];
2448
                                itagi = data.itag[i];
2449
 
2450
                                if (itagi == 0)
2451
                                        data.itag[nx] = 0;
2452
                                if (itagi != 0)
2453
                                        data.itag[nx] = itagi + iti;
2454
 
2455
                                data.bi[nx] = data.bi[i];
2456
                        }
2457
 
2458
                        data.n = data.n * 2;
2459
 
2460
                } /* if( data.n > 0) */
2461
 
2462
                if (data.m == 0)
2463
                        return;
2464
 
2465
                /* Reallocate patch buffers */
2466
                mreq = 2 * data.m * sizeof (double);
2467
                mem_realloc ((void *) &data.px, mreq);
2468
                mem_realloc ((void *) &data.py, mreq);
2469
                mem_realloc ((void *) &data.pz, mreq);
2470
                mem_realloc ((void *) &data.t1x, mreq);
2471
                mem_realloc ((void *) &data.t1y, mreq);
2472
                mem_realloc ((void *) &data.t1z, mreq);
2473
                mem_realloc ((void *) &data.t2x, mreq);
2474
                mem_realloc ((void *) &data.t2y, mreq);
2475
                mem_realloc ((void *) &data.t2z, mreq);
2476
                mem_realloc ((void *) &data.pbi, mreq);
2477
                mem_realloc ((void *) &data.psalp, mreq);
2478
 
2479
                for (i = 0; i < data.m; i++)
2480
                {
2481
                        nx = i + data.m;
2482
                        if (fabsl (data.px[i]) <= 1.0e-10)
2483
                        {
2484
                                fprintf (
2485
                                    output_fp,
2486
                                    "\n  GEOMETRY DATA ERROR--PATCH %d"
2487
                                    " LIES IN PLANE OF SYMMETRY",
2488
                                    i + 1);
2489
                                stop (-1);
2490
                        }
2491
 
2492
                        data.px[nx] = -data.px[i];
2493
                        data.py[nx] = data.py[i];
2494
                        data.pz[nx] = data.pz[i];
2495
                        data.t1x[nx] = -data.t1x[i];
2496
                        data.t1y[nx] = data.t1y[i];
2497
                        data.t1z[nx] = data.t1z[i];
2498
                        data.t2x[nx] = -data.t2x[i];
2499
                        data.t2y[nx] = data.t2y[i];
2500
                        data.t2z[nx] = data.t2z[i];
2501
                        data.psalp[nx] = -data.psalp[i];
2502
                        data.pbi[nx] = data.pbi[i];
2503
                }
2504
 
2505
                data.m = data.m * 2;
2506
                return;
2507
 
2508
        } /* if( ix >= 0) */
2509
 
2510
        /* reproduce structure with rotation to form cylindrical structure */
2511
        fnop = (double) nop;
2512
        data.ipsym = -1;
2513
        sam = TP / fnop;
2514
        cs = cosl (sam);
2515
        ss = sinl (sam);
2516
 
2517
        if (data.n > 0)
2518
        {
2519
                data.n *= nop;
2520
                nx = data.np;
2521
 
2522
                /* Reallocate tags buffer */
2523
                mem_realloc ((void *) &data.itag, (data.n + data.m) * sizeof (int)); /*????*/
2524
 
2525
                /* Reallocate wire buffers */
2526
                mreq = data.n * sizeof (double);
2527
                mem_realloc ((void *) &data.x1, mreq);
2528
                mem_realloc ((void *) &data.y1, mreq);
2529
                mem_realloc ((void *) &data.z1, mreq);
2530
                mem_realloc ((void *) &data.x2, mreq);
2531
                mem_realloc ((void *) &data.y2, mreq);
2532
                mem_realloc ((void *) &data.z2, mreq);
2533
                mem_realloc ((void *) &data.bi, mreq);
2534
 
2535
                for (i = nx; i < data.n; i++)
2536
                {
2537
                        k = i - data.np;
2538
                        xk = data.x1[k];
2539
                        yk = data.y1[k];
2540
                        data.x1[i] = xk * cs - yk * ss;
2541
                        data.y1[i] = xk * ss + yk * cs;
2542
                        data.z1[i] = data.z1[k];
2543
                        xk = data.x2[k];
2544
                        yk = data.y2[k];
2545
                        data.x2[i] = xk * cs - yk * ss;
2546
                        data.y2[i] = xk * ss + yk * cs;
2547
                        data.z2[i] = data.z2[k];
2548
                        data.bi[i] = data.bi[k];
2549
                        itagi = data.itag[k];
2550
 
2551
                        if (itagi == 0)
2552
                                data.itag[i] = 0;
2553
                        if (itagi != 0)
2554
                                data.itag[i] = itagi + iti;
2555
                }
2556
 
2557
        } /* if( data.n >= n2) */
2558
 
2559
        if (data.m == 0)
2560
                return;
2561
 
2562
        data.m *= nop;
2563
        nx = data.mp;
2564
 
2565
        /* Reallocate patch buffers */
2566
        mreq = data.m * sizeof (double);
2567
        mem_realloc ((void *) &data.px, mreq);
2568
        mem_realloc ((void *) &data.py, mreq);
2569
        mem_realloc ((void *) &data.pz, mreq);
2570
        mem_realloc ((void *) &data.t1x, mreq);
2571
        mem_realloc ((void *) &data.t1y, mreq);
2572
        mem_realloc ((void *) &data.t1z, mreq);
2573
        mem_realloc ((void *) &data.t2x, mreq);
2574
        mem_realloc ((void *) &data.t2y, mreq);
2575
        mem_realloc ((void *) &data.t2z, mreq);
2576
        mem_realloc ((void *) &data.pbi, mreq);
2577
        mem_realloc ((void *) &data.psalp, mreq);
2578
 
2579
        for (i = nx; i < data.m; i++)
2580
        {
2581
                k = i - data.mp;
2582
                xk = data.px[k];
2583
                yk = data.py[k];
2584
                data.px[i] = xk * cs - yk * ss;
2585
                data.py[i] = xk * ss + yk * cs;
2586
                data.pz[i] = data.pz[k];
2587
                xk = data.t1x[k];
2588
                yk = data.t1y[k];
2589
                data.t1x[i] = xk * cs - yk * ss;
2590
                data.t1y[i] = xk * ss + yk * cs;
2591
                data.t1z[i] = data.t1z[k];
2592
                xk = data.t2x[k];
2593
                yk = data.t2y[k];
2594
                data.t2x[i] = xk * cs - yk * ss;
2595
                data.t2y[i] = xk * ss + yk * cs;
2596
                data.t2z[i] = data.t2z[k];
2597
                data.psalp[i] = data.psalp[k];
2598
                data.pbi[i] = data.pbi[k];
2599
 
2600
        } /* for( i = nx; i < data.m; i++ ) */
2601
 
2602
        return;
2603
}
2604
 
2605
/*-----------------------------------------------------------------------*/
2606
 
2607
/* subroutine wire generates segment geometry */
2608
/* data for a straight wire of ns segments. */
2609
void wire (
2610
    double xw1,
2611
    double yw1,
2612
    double zw1,
2613
    double xw2,
2614
    double yw2,
2615
    double zw2,
2616
    double rad,
2617
    double rdel,
2618
    double rrad,
2619
    int ns,
2620
    int itg)
2621
{
2622
        int ist, i, mreq;
2623
        double xd, yd, zd, delz, rd, fns, radz;
2624
        double xs1, ys1, zs1, xs2, ys2, zs2;
2625
 
2626
        ist = data.n;
2627
        data.n = data.n + ns;
2628
        data.np = data.n;
2629
        data.mp = data.m;
2630
        data.ipsym = 0;
2631
 
2632
        if (ns < 1)
2633
                return;
2634
 
2635
        /* Reallocate tags buffer */
2636
        mem_realloc ((void *) &data.itag, (data.n + data.m) * sizeof (int)); /*????*/
2637
 
2638
        /* Reallocate wire buffers */
2639
        mreq = data.n * sizeof (double);
2640
        mem_realloc ((void *) &data.x1, mreq);
2641
        mem_realloc ((void *) &data.y1, mreq);
2642
        mem_realloc ((void *) &data.z1, mreq);
2643
        mem_realloc ((void *) &data.x2, mreq);
2644
        mem_realloc ((void *) &data.y2, mreq);
2645
        mem_realloc ((void *) &data.z2, mreq);
2646
        mem_realloc ((void *) &data.bi, mreq);
2647
 
2648
        xd = xw2 - xw1;
2649
        yd = yw2 - yw1;
2650
        zd = zw2 - zw1;
2651
 
2652
        if (fabsl (rdel - 1.) >= 1.0e-6)
2653
        {
2654
                delz = sqrtl (xd * xd + yd * yd + zd * zd);
2655
                xd = xd / delz;
2656
                yd = yd / delz;
2657
                zd = zd / delz;
2658
                delz = delz * (1. - rdel) / (1. - powl (rdel, ns));
2659
                rd = rdel;
2660
        }
2661
        else
2662
        {
2663
                fns = ns;
2664
                xd = xd / fns;
2665
                yd = yd / fns;
2666
                zd = zd / fns;
2667
                delz = 1.;
2668
                rd = 1.;
2669
        }
2670
 
2671
        radz = rad;
2672
        xs1 = xw1;
2673
        ys1 = yw1;
2674
        zs1 = zw1;
2675
 
2676
        for (i = ist; i < data.n; i++)
2677
        {
2678
                data.itag[i] = itg;
2679
                xs2 = xs1 + xd * delz;
2680
                ys2 = ys1 + yd * delz;
2681
                zs2 = zs1 + zd * delz;
2682
                data.x1[i] = xs1;
2683
                data.y1[i] = ys1;
2684
                data.z1[i] = zs1;
2685
                data.x2[i] = xs2;
2686
                data.y2[i] = ys2;
2687
                data.z2[i] = zs2;
2688
                data.bi[i] = radz;
2689
                delz = delz * rd;
2690
                radz = radz * rrad;
2691
                xs1 = xs2;
2692
                ys1 = ys2;
2693
                zs1 = zs2;
2694
        }
2695
 
2696
        data.x2[data.n - 1] = xw2;
2697
        data.y2[data.n - 1] = yw2;
2698
        data.z2[data.n - 1] = zw2;
2699
 
2700
        return;
2701
}
2702
 
2703
/*-----------------------------------------------------------------------*/