nec2++  1.7.0
c_geometry.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2004-2011 Timothy C.A. Molteno
3 
4  This program is free software; you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation; either version 2 of the License, or
7  (at your option) any later version.
8 
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with this program; if not, write to the Free Software
16  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 */
18 #ifndef __c_geometry__
19 #define __c_geometry__
20 #include "math_util.h"
21 #include <vector>
22 #include <iostream>
23 
24 /* Replaces the "10000" limit used to */
25 /* identify segment/patch connections */
26 #define PCHCON 100000
27 
28 class nec_context;
29 #include "nec_output.h"
30 #include "nec_wire.h"
31 
32 
33 
52 {
53 public:
54  c_geometry();
55  void set_context(nec_context* m_context);
56 
57 
65  void wire( int tag_id, int segment_count,
66  nec_float xw1, nec_float yw1, nec_float zw1, // first co-ordinate
67  nec_float xw2, nec_float yw2, nec_float zw2, // second co-ordinate
68  nec_float rad,
69  nec_float rdel, nec_float rrad);
70 
71 
72  void arc( int tag_id, int segment_count, nec_float rada,
73  nec_float ang1, nec_float ang2, nec_float rad );
74 
75  void helix( nec_float s, nec_float hl, nec_float a1, nec_float b1,
76  nec_float a2, nec_float b2, nec_float rad, int segment_count, int tag_id );
77 
78  void move( nec_float rox, nec_float roy, nec_float roz, nec_float xs,
79  nec_float ys, nec_float zs, int its, int nrpt, int itgi );
80 
88  void reflect(int ix, int iy, int iz, int itx) {
89  int nop = 100*ix + 10*iy + iz;
90  return self->reflect(ix, iy, iz, itx, nop);
91  }
92 
98  void generate_cylindrical_structure(int itx, int nop)
99  {
100  return self->reflect(-1, 0, 0, itx, nop);
101  }
102 
103  void reflect( int ix, int iy, int iz, int itx, int nop );
104 
106  void scale( nec_float xw1);
107 
108  void patch( int nx, int ny,
109  nec_float ax1, nec_float ay1, nec_float az1,
110  nec_float ax2, nec_float ay2, nec_float az2,
111  nec_float ax3, nec_float ay3, nec_float az3,
112  nec_float ax4, nec_float ay4, nec_float az4 );
113 
114 
115  void sp_card( int ns,
116  nec_float in_x1, nec_float in_y1, nec_float in_z1,
117  nec_float in_x2, nec_float in_y2, nec_float in_z2);
118 
119  void sc_card( int i2,
120  nec_float x3, nec_float y3, nec_float z3,
121  nec_float x4, nec_float y4, nec_float z4);
122  void sc_multiple_card(int i2,
123  nec_float x3, nec_float y3, nec_float z3,
124  nec_float x4, nec_float y4, nec_float z4);
125 
126  void gx_card(int card_int_1, int card_int_2);
127 
131  void geometry_complete(nec_context* m_context, int gpflag);
132 
133 
134 
137  void parse_geometry(nec_context* m_context, FILE* input_fp);
138 
139 
142  int test_ek_approximation(int seg1, int seg2);
143 
144  int get_segment_number( int in_tag, int m);
145 
146 
147  void frequency_scale(nec_float freq_mhz);
148 
149  void tbf( int i, int icap);
150  void trio( int j );
151 
152  void get_current_coefficients(nec_float wavelength, complex_array& curx,
153  real_array& air, real_array& aii,
154  real_array& bir, real_array& bii,
155  real_array& cir, real_array& cii,
156  complex_array& vqds, int nqds,
157  int_array& iqds);
158 
159  nec_float patch_angle(int patch_index, nec_float in_ax, nec_float in_ay, nec_float in_az);
160 
163  void fflds(nec_float rox, nec_float roy, nec_float roz,
164  complex_array& scur,
165  nec_complex *in_ex, nec_complex *in_ey, nec_complex *in_ez );
166 
167  int n_segments; // The number of segments
168  int np;
169  int_array segment_tags;
170  real_array x, y, z, segment_length, segment_radius;
171  real_array x2, y2, z2;
172  real_array cab, sab, salp;
173 
174  int m, mp; // The number of patches
175  int m_ipsym;
176 
177  real_array t1x, t1y, t1z, t2x, t2y, t2z; // t1, t2 basis co-ordinates?
178  real_array px, py, pz, pbi, psalp; // patch data
179 
180 
181  int_array icon1, icon2;
182  // Connected Segment Information (was common /segj/ in FORTRAN code)
183  int jsno, nscon, maxcon; /* Max. no. connections */
184  int_array jco;
185  real_array ax, bx, cx;
186 
187  inline int n_plus_m(void) const {
188  return n_segments + m;
189  }
190  int n_plus_2m, n_plus_3m; /* n+m,n+2m,n+3m */
191 private:
192  // The geometry data measured in meters is stored in these arrays
193  // and the x,y,z,si,bi arrays are then scaled for each frequency
194  real_array x_unscaled, y_unscaled, z_unscaled, si_unscaled, bi_unscaled;
195  real_array px_unscaled, py_unscaled, pz_unscaled, pbi_unscaled;
196 
197  void sbf( int i, int is, nec_float *aa, nec_float *bb, nec_float *cc );
198 
199  void divide_patch( int nx );
200 
201  void connect_segments( int ignd );
202 
203  void read_geometry_card(FILE* input_fp, char *gm,
204  int *i1, int *i2,
205  nec_float *x1, nec_float *y1,nec_float *z1,
206  nec_float *x2, nec_float *y2, nec_float *z2,
207  nec_float *rad );
208 
209  nec_context* m_context;
210  nec_output_file* m_output;
211 
212  std::vector<nec_wire> m_wires;
213 
214  int patch_type;
215  nec_3vector patch_x1, patch_x2, patch_x3, patch_x4;
216  bool _prev_sc;
217 };
218 
219 
220 #endif /* __c_geometry__ */
int get_segment_number(int in_tag, int m)
Get a segment number for a specified tag.
Definition: c_geometry.cpp:59
void reflect(int ix, int iy, int iz, int itx)
Reflects partial structure along x,y, or z axes.
Definition: c_geometry.h:88
void generate_cylindrical_structure(int itx, int nop)
Rotates structure along Z-axis to generate a copies in a cylindrical array.
Definition: c_geometry.h:98
void wire(int tag_id, int segment_count, nec_float xw1, nec_float yw1, nec_float zw1, nec_float xw2, nec_float yw2, nec_float zw2, nec_float rad, nec_float rdel, nec_float rrad)
Generates segment geometry for a straingt wire.
Definition: c_geometry.cpp:657
Definition: nec_output.h:56
A Class for handling 3 dimensional vectors.
Definition: math_util.h:196
void geometry_complete(nec_context *m_context, int gpflag)
Geometry is complete If there is an error with the geometry.
Definition: c_geometry.cpp:477
void patch(int nx, int ny, nec_float ax1, nec_float ay1, nec_float az1, nec_float ax2, nec_float ay2, nec_float az2, nec_float ax3, nec_float ay3, nec_float az3, nec_float ax4, nec_float ay4, nec_float az4)
patch generates and modifies patch geometry data.
Definition: c_geometry.cpp:2093
int test_ek_approximation(int seg1, int seg2)
Helper method to decide whether extended. thin-wire approximation can be used.
Definition: c_geometry.cpp:3303
Definition: c_geometry.h:51
void scale(nec_float xw1)
Scale all dimensions of a structure by a constant.
Definition: c_geometry.cpp:1463
void parse_geometry(nec_context *m_context, FILE *input_fp)
Parse an NEC geometry description contained in the file input_fp.
Definition: c_geometry.cpp:105
void fflds(nec_float rox, nec_float roy, nec_float roz, complex_array &scur, nec_complex *in_ex, nec_complex *in_ey, nec_complex *in_ez)
Calculate the xyz components of the electric field due to surface currents.
Definition: c_geometry.cpp:3273
Container for an nec2++ simulation.
Definition: nec_context.h:60