1 /**********************************************************************
3 FILENAME: uiuc_menu.cpp
5 ----------------------------------------------------------------------
7 DESCRIPTION: reads input file for specified aircraft and creates
8 approporiate data storage space
10 ----------------------------------------------------------------------
14 ----------------------------------------------------------------------
16 REFERENCES: based on "menu reader" format of Michael Selig
18 ----------------------------------------------------------------------
20 HISTORY: 01/29/2000 initial release
21 02/18/2000 (JS) added 1D data file capability for
22 CL(a) and CD(a) -- calls
24 02/22/2000 (JS) added ice map functions
25 02/29/2000 (JS) added 2D data file capability for
26 CL(a,de), CD(a,de), Cm(a,de), CY(a,da),
27 CY(beta,dr), Cl(a,da), Cl(beta,dr),
28 Cn(a,da), Cn(beta,dr) -- calls
30 02/02/2000 (JS) added record options for 1D and
31 2D interpolated variables
32 03/28/2000 (JS) streamlined conversion factors for
33 file readers -- since they are global
34 variables, it is not necessary to put
35 them in the function calls
36 03/29/2000 (JS) added Cmfa and Weight flags;
37 added misc map; added Dx_cg (etc) to init
39 04/01/2000 (JS) added throttle, longitudinal, lateral,
40 and rudder inputs to record map
41 04/05/2000 (JS) added Altitude to init and record
42 maps; added zero_Long_trim to
44 03/09/2001 (DPM) added support for gear.
45 06/18/2001 (RD) Added Alpha, Beta, U_body,
46 V_body, and W_body to init map. Added
47 aileron_input, rudder_input, pilot_elev_no,
48 pilot_ail_no, and pilot_rud_no to
49 controlSurface map. Added Throttle_pct_input
50 to engine map. Added CZfa to CL map.
51 07/05/2001 (RD) Changed pilot_elev_no = true to pilot_
52 elev_no_check=false. This is to allow pilot
53 to fly aircraft after input files have been
55 08/27/2001 (RD) Added xxx_init_true and xxx_init for
56 P_body, Q_body, R_body, Phi, Theta, Psi,
57 U_body, V_body, and W_body to help in
58 starting the A/C at an initial condition.
59 10/25/2001 (RD) Added new variables needed for the non-
60 linear Twin Otter model at zero flaps
62 11/12/2001 (RD) Added new variables needed for the non-
63 linear Twin Otter model with flaps
64 (Cxfxxf). Removed zero flap variables.
65 Added minmaxfind() which is needed for non-
67 01/11/2002 (AP) Added keywords for bootTime
68 02/13/2002 (RD) Added variables so linear aero model
69 values can be recorded
70 02/18/2002 (RD) Added variables necessary to use the
71 uiuc_3Dinterp_quick() function. Takes
72 advantage of data in a "nice" form (data
73 that are in a rectangular matrix).
74 03/13/2002 (RD) Added aircraft_directory so full path
75 is no longer needed in the aircraft.dat file
76 04/02/2002 (RD) Removed minmaxfind() since it was no
77 longer needed. Added d_2_to_3(),
78 d_1_to_2(), and i_1_to_2() so uiuc_menu()
79 will compile with certain compilers.
80 08/29/2002 (RD) Separated each primary keyword into its
81 own function to speed up compile time
82 08/29/2002 (RD w/ help from CO) Made changes to shorten
83 compile time. [] RD to add more comments here.
84 08/29/2003 (MSS) Adding new keywords for new engine model
85 and slipstream effects on tail.
86 03/02/2003 (RD) Changed Cxfxxf areas so that there is a
87 conversion factor for flap angle
88 03/03/2003 (RD) Added flap_cmd_record
89 03/16/2003 (RD) Added trigger record flags
90 04/02/2003 (RD) Tokens are now equal to 0 when no value
91 is given in the input file
92 04/04/2003 (RD) To speed up compile time on this file,
93 each first level token now goes to its
94 own file uiuc_menu_*.cpp
96 ----------------------------------------------------------------------
98 AUTHOR(S): Bipin Sehgal <bsehgal@uiuc.edu>
99 Jeff Scott http://www.jeffscott.net/
100 Robert Deters <rdeters@uiuc.edu>
101 Michael Selig <m-selig@uiuc.edu>
102 David Megginson <david@megginson.com>
103 Ann Peedikayil <peedikay@uiuc.edu>
104 ----------------------------------------------------------------------
108 ----------------------------------------------------------------------
112 ----------------------------------------------------------------------
116 ----------------------------------------------------------------------
118 CALLED BY: uiuc_wrapper.cpp
120 ----------------------------------------------------------------------
122 CALLS TO: aircraft.dat
123 tabulated data files (if needed)
127 uiuc_menu_controlSurface()
141 ----------------------------------------------------------------------
143 COPYRIGHT: (C) 2000 by Michael Selig
145 This program is free software; you can redistribute it and/or
146 modify it under the terms of the GNU General Public License
147 as published by the Free Software Foundation.
149 This program is distributed in the hope that it will be useful,
150 but WITHOUT ANY WARRANTY; without even the implied warranty of
151 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
152 GNU General Public License for more details.
154 You should have received a copy of the GNU General Public License
155 along with this program; if not, write to the Free Software
156 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
158 **********************************************************************/
160 #include <simgear/compiler.h>
162 #if defined( __MWERKS__ )
163 // -dw- optimizer chokes (big-time) trying to optimize humongous
164 // loop/switch statements
165 #pragma optimization_level 0
170 #include STL_IOSTREAM
172 #include "uiuc_menu.h"
182 void uiuc_menu( string aircraft_name )
184 string aircraft_directory;
187 int token_value_recordRate;
188 int token_value_convert1, token_value_convert2, token_value_convert3;
201 /* the following default setting should eventually be moved to a default or uiuc_init routine */
203 recordRate = 1; /* record every time step, default */
204 recordStartTime = 0; /* record from beginning of simulation */
206 /* set speed at which dynamic pressure terms will be accounted for,
207 since if velocity is too small, coefficients will go to infinity */
208 dyn_on_speed = 33; /* 20 kts (33 ft/sec), default */
209 dyn_on_speed_zero = 0.5 * dyn_on_speed; /* only used if use_dyn_on_speed_curve1 is used */
210 bootindex = 0; // the index for the bootTime
212 /* Read the file and get the list of commands */
213 airplane = new ParseFile(aircraft_name); /* struct that includes all lines of the input file */
214 command_list = airplane -> getCommands();
215 /* structs to include all parts included in the input file for specific keyword groups */
216 initParts = new ParseFile();
217 geometryParts = new ParseFile();
218 massParts = new ParseFile();
219 engineParts = new ParseFile();
220 aeroDragParts = new ParseFile();
221 aeroLiftParts = new ParseFile();
222 aeroPitchParts = new ParseFile();
223 aeroSideforceParts = new ParseFile();
224 aeroRollParts = new ParseFile();
225 aeroYawParts = new ParseFile();
226 gearParts = new ParseFile();
227 recordParts = new ParseFile();
229 if (command_list.begin() == command_list.end())
231 cerr << "UIUC ERROR: File " << aircraft_name <<" does not exist" << endl;
235 //construct aircraft-directory
236 aircraft_directory = aircraft_name;
237 int index_aircraft_dat = aircraft_directory.find("aircraft.dat");
238 aircraft_directory.erase(index_aircraft_dat,12);
240 for (LIST command_line = command_list.begin(); command_line!=command_list.end(); ++command_line)
242 cout << *command_line << endl;
244 linetoken1 = airplane -> getToken (*command_line, 1);
245 linetoken2 = airplane -> getToken (*command_line, 2);
248 linetoken3 = airplane -> getToken (*command_line, 3);
251 linetoken4 = airplane -> getToken (*command_line, 4);
254 linetoken5 = airplane -> getToken (*command_line, 5);
257 linetoken6 = airplane -> getToken (*command_line, 6);
260 linetoken7 = airplane -> getToken (*command_line, 7);
263 linetoken8 = airplane -> getToken (*command_line, 8);
266 linetoken9 = airplane -> getToken (*command_line, 9);
269 linetoken10 = airplane -> getToken (*command_line, 10);
273 //cout << linetoken1 << endl;
274 //cout << linetoken2 << endl;
275 //cout << linetoken3 << endl;
276 //cout << linetoken4 << endl;
277 //cout << linetoken5 << endl;
278 //cout << linetoken6 << endl;
279 //cout << linetoken7 << endl;
280 //cout << linetoken8 << endl;
281 //cout << linetoken9 << endl;
282 //cout << linetoken10 << endl;
284 //istrstream token3(linetoken3.c_str());
285 //istrstream token4(linetoken4.c_str());
286 //istrstream token5(linetoken5.c_str());
287 //istrstream token6(linetoken6.c_str());
288 //istrstream token7(linetoken7.c_str());
289 //istrstream token8(linetoken8.c_str());
290 //istrstream token9(linetoken9.c_str());
291 //istrstream token10(linetoken10.c_str());
293 switch (Keyword_map[linetoken1])
297 parse_init( linetoken2, linetoken3, linetoken4,
298 linetoken5, linetoken6, linetoken7,
299 linetoken8, linetoken9, linetoken10,
300 aircraft_directory, command_line );
307 parse_geometry( linetoken2, linetoken3, linetoken4,
308 linetoken5, linetoken6, linetoken7,
309 linetoken8, linetoken9, linetoken10,
310 aircraft_directory, command_line );
312 } // end geometry map
315 case controlSurface_flag:
317 parse_controlSurface( linetoken2, linetoken3, linetoken4,
318 linetoken5, linetoken6, linetoken7,
319 linetoken8, linetoken9, linetoken10,
320 aircraft_directory, command_line );
322 } // end controlSurface map
327 parse_mass( linetoken2, linetoken3, linetoken4,
328 linetoken5, linetoken6, linetoken7,
329 linetoken8, linetoken9, linetoken10,
330 aircraft_directory, command_line );
337 parse_engine( linetoken2, linetoken3, linetoken4,
338 linetoken5, linetoken6, linetoken7,
339 linetoken8, linetoken9, linetoken10,
340 aircraft_directory, command_line );
347 parse_CD( linetoken2, linetoken3, linetoken4,
348 linetoken5, linetoken6, linetoken7,
349 linetoken8, linetoken9, linetoken10,
350 aircraft_directory, command_line );
357 parse_CL( linetoken2, linetoken3, linetoken4,
358 linetoken5, linetoken6, linetoken7,
359 linetoken8, linetoken9, linetoken10,
360 aircraft_directory, command_line );
367 parse_Cm( linetoken2, linetoken3, linetoken4,
368 linetoken5, linetoken6, linetoken7,
369 linetoken8, linetoken9, linetoken10,
370 aircraft_directory, command_line );
377 parse_CY( linetoken2, linetoken3, linetoken4,
378 linetoken5, linetoken6, linetoken7,
379 linetoken8, linetoken9, linetoken10,
380 aircraft_directory, command_line );
387 parse_Cl( linetoken2, linetoken3, linetoken4,
388 linetoken5, linetoken6, linetoken7,
389 linetoken8, linetoken9, linetoken10,
390 aircraft_directory, command_line );
397 parse_Cn( linetoken2, linetoken3, linetoken4,
398 linetoken5, linetoken6, linetoken7,
399 linetoken8, linetoken9, linetoken10,
400 aircraft_directory, command_line );
407 parse_gear( linetoken2, linetoken3, linetoken4,
408 linetoken5, linetoken6, linetoken7,
409 linetoken8, linetoken9, linetoken10,
410 aircraft_directory, command_line );
417 parse_ice( linetoken2, linetoken3, linetoken4,
418 linetoken5, linetoken6, linetoken7,
419 linetoken8, linetoken9, linetoken10,
420 aircraft_directory, command_line );
427 parse_fog( linetoken2, linetoken3, linetoken4,
428 linetoken5, linetoken6, linetoken7,
429 linetoken8, linetoken9, linetoken10,
430 aircraft_directory, command_line );
437 static int fout_flag=0;
441 fout.open("uiuc_record.dat");
443 parse_record( linetoken2, linetoken3, linetoken4,
444 linetoken5, linetoken6, linetoken7,
445 linetoken8, linetoken9, linetoken10,
446 aircraft_directory, command_line );
453 parse_misc( linetoken2, linetoken3, linetoken4,
454 linetoken5, linetoken6, linetoken7,
455 linetoken8, linetoken9, linetoken10,
456 aircraft_directory, command_line );
465 if (ignore_unknown_keywords) {
468 // print error message
469 uiuc_warnings_errors(2, *command_line);