]> git.mxchange.org Git - flightgear.git/blob - src/FDM/UIUCModel/uiuc_menu.cpp
Harald JOHNSEN:
[flightgear.git] / src / FDM / UIUCModel / uiuc_menu.cpp
1 /**********************************************************************
2                                                                        
3  FILENAME:     uiuc_menu.cpp
4
5 ----------------------------------------------------------------------
6
7  DESCRIPTION:  reads input file for specified aircraft and creates 
8                approporiate data storage space
9
10 ----------------------------------------------------------------------
11
12  STATUS:       alpha version
13
14 ----------------------------------------------------------------------
15
16  REFERENCES:   based on "menu reader" format of Michael Selig
17
18 ----------------------------------------------------------------------
19
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 
23                             uiuc_1DdataFileReader
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 
29                             uiuc_2DdataFileReader
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 
38                             map
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 
43                             controlSurface map
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
54                             used.
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
61                             (Cxfxxf0)
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-
66                             linear variables
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
95
96 ----------------------------------------------------------------------
97
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 ----------------------------------------------------------------------
105
106  VARIABLES:
107
108 ----------------------------------------------------------------------
109
110  INPUTS:       n/a
111
112 ----------------------------------------------------------------------
113
114  OUTPUTS:      n/a
115
116 ----------------------------------------------------------------------
117
118  CALLED BY:    uiuc_wrapper.cpp 
119
120 ----------------------------------------------------------------------
121
122  CALLS TO:     aircraft.dat
123                tabulated data files (if needed)
124                uiuc_menu_init()
125                uiuc_menu_geometry()
126                uiuc_menu_mass()
127                uiuc_menu_controlSurface()
128                uiuc_menu_CD()
129                uiuc_menu_CL()
130                uiuc_menu_Cm()
131                uiuc_menu_CY()
132                uiuc_menu_Cl()
133                uiuc_menu_Cn()
134                uiuc_menu_ice()
135                uiuc_menu_engine()
136                uiuc_menu_fog()
137                uiuc_menu_gear()
138                uiuc_menu_record()
139                uiuc_menu_misc()
140
141 ----------------------------------------------------------------------
142
143  COPYRIGHT:    (C) 2000 by Michael Selig
144
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.
148
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.
153
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
157  USA or view http://www.gnu.org/copyleft/gpl.html.
158
159 **********************************************************************/
160
161 #include <simgear/compiler.h>
162
163 #if defined( __MWERKS__ )
164 // -dw- optimizer chokes (big-time) trying to optimize humongous
165 // loop/switch statements
166 #pragma optimization_level 0
167 #endif
168
169 #include <cstdlib>
170 #include <string>
171 #include STL_IOSTREAM
172
173 #include "uiuc_menu.h"
174
175 SG_USING_STD(cerr);
176 SG_USING_STD(cout);
177 SG_USING_STD(endl);
178
179 #ifndef _MSC_VER
180 SG_USING_STD(exit);
181 #endif
182
183 void uiuc_menu( string aircraft_name )
184 {
185   string aircraft_directory;
186   stack command_list;
187   double token_value;
188   int token_value_recordRate;
189   int token_value_convert1, token_value_convert2, token_value_convert3;
190   
191   string linetoken1;
192   string linetoken2;
193   string linetoken3;
194   string linetoken4;
195   string linetoken5;
196   string linetoken6;
197   string linetoken7;
198   string linetoken8;
199   string linetoken9;
200   string linetoken10;
201   
202   /* the following default setting should eventually be moved to a default or uiuc_init routine */
203
204   recordRate = 1;       /* record every time step, default */
205   recordStartTime = 0;  /* record from beginning of simulation */
206
207 /* set speed at which dynamic pressure terms will be accounted for,
208    since if velocity is too small, coefficients will go to infinity */
209   dyn_on_speed      = 33;    /* 20 kts (33 ft/sec), default */
210   dyn_on_speed_zero = 0.5 * dyn_on_speed;    /* only used if use_dyn_on_speed_curve1 is used */
211   bootindex = 0;  // the index for the bootTime
212
213   /* Read the file and get the list of commands */
214   airplane = new ParseFile(aircraft_name); /* struct that includes all lines of the input file */
215   command_list = airplane -> getCommands();
216   /* structs to include all parts included in the input file for specific keyword groups */
217   initParts          = new ParseFile();
218   geometryParts      = new ParseFile();
219   massParts          = new ParseFile();
220   engineParts        = new ParseFile();
221   aeroDragParts      = new ParseFile();
222   aeroLiftParts      = new ParseFile();
223   aeroPitchParts     = new ParseFile();
224   aeroSideforceParts = new ParseFile();
225   aeroRollParts      = new ParseFile();
226   aeroYawParts       = new ParseFile();
227   gearParts          = new ParseFile();
228   recordParts        = new ParseFile();
229
230   if (command_list.begin() == command_list.end())
231   {
232     cerr << "UIUC ERROR: File " << aircraft_name <<" does not exist" << endl;
233     exit(-1);
234   }
235   
236   //construct aircraft-directory
237   aircraft_directory = aircraft_name;
238   int index_aircraft_dat = aircraft_directory.find("aircraft.dat");
239   aircraft_directory.erase(index_aircraft_dat,12);
240
241   for (LIST command_line = command_list.begin(); command_line!=command_list.end(); ++command_line)
242     {
243       cout << *command_line << endl;
244
245       linetoken1 = airplane -> getToken (*command_line, 1); 
246       linetoken2 = airplane -> getToken (*command_line, 2); 
247       if (linetoken2=="")
248         linetoken2="0";
249       linetoken3 = airplane -> getToken (*command_line, 3); 
250       if (linetoken3=="")
251         linetoken3="0";
252       linetoken4 = airplane -> getToken (*command_line, 4); 
253       if (linetoken4=="")
254         linetoken4="0";
255       linetoken5 = airplane -> getToken (*command_line, 5); 
256       if (linetoken5=="")
257         linetoken5="0";
258       linetoken6 = airplane -> getToken (*command_line, 6); 
259       if (linetoken6=="")
260         linetoken6="0";
261       linetoken7 = airplane -> getToken (*command_line, 7);
262       if (linetoken7=="")
263         linetoken7="0";
264       linetoken8 = airplane -> getToken (*command_line, 8);
265       if (linetoken8=="")
266         linetoken8="0";
267       linetoken9 = airplane -> getToken (*command_line, 9);
268       if (linetoken9=="")
269         linetoken9="0";
270       linetoken10 = airplane -> getToken (*command_line, 10);
271       if (linetoken10=="")
272         linetoken10="0";
273  
274       //cout << linetoken1 << endl;
275       //cout << linetoken2 << endl;
276       //cout << linetoken3 << endl;
277       //cout << linetoken4 << endl;
278       //cout << linetoken5 << endl;
279       //cout << linetoken6 << endl;
280       //cout << linetoken7 << endl;
281       //cout << linetoken8 << endl;
282       //cout << linetoken9 << endl;
283       //cout << linetoken10 << endl;
284      
285       //istrstream token3(linetoken3.c_str());
286       //istrstream token4(linetoken4.c_str());
287       //istrstream token5(linetoken5.c_str());
288       //istrstream token6(linetoken6.c_str());
289       //istrstream token7(linetoken7.c_str());
290       //istrstream token8(linetoken8.c_str());
291       //istrstream token9(linetoken9.c_str());
292       //istrstream token10(linetoken10.c_str());
293
294       switch (Keyword_map[linetoken1])
295         {
296         case init_flag:
297           {
298             parse_init( linetoken2, linetoken3, linetoken4, 
299                         linetoken5, linetoken6, linetoken7,
300                         linetoken8, linetoken9, linetoken10,
301                         aircraft_directory, command_line );
302             break;
303           } // end init map
304           
305       
306         case geometry_flag:
307           {
308             parse_geometry( linetoken2, linetoken3, linetoken4,
309                             linetoken5, linetoken6, linetoken7,
310                             linetoken8, linetoken9, linetoken10,
311                             aircraft_directory, command_line );
312             break;
313           } // end geometry map
314
315
316         case controlSurface_flag:
317           {
318             parse_controlSurface( linetoken2, linetoken3, linetoken4,
319                                   linetoken5, linetoken6, linetoken7,
320                                   linetoken8, linetoken9, linetoken10,
321                                   aircraft_directory, command_line );
322             break;
323           } // end controlSurface map
324
325
326         case mass_flag:
327           {
328             parse_mass( linetoken2, linetoken3, linetoken4,
329                         linetoken5, linetoken6, linetoken7,
330                         linetoken8, linetoken9, linetoken10,
331                         aircraft_directory, command_line );
332             break;
333           } // end mass map
334           
335           
336         case engine_flag:
337           {
338             parse_engine( linetoken2, linetoken3, linetoken4,
339                           linetoken5, linetoken6, linetoken7,
340                           linetoken8, linetoken9, linetoken10,
341                           aircraft_directory, command_line );
342             break;
343           } // end engine map
344           
345           
346         case CD_flag:
347           {
348             parse_CD( linetoken2, linetoken3, linetoken4,
349                       linetoken5, linetoken6, linetoken7,
350                       linetoken8, linetoken9, linetoken10,
351                       aircraft_directory, command_line );
352             break;
353           } // end CD map
354
355           
356         case CL_flag:
357           {
358             parse_CL( linetoken2, linetoken3, linetoken4,
359                       linetoken5, linetoken6, linetoken7,
360                       linetoken8, linetoken9, linetoken10,
361                       aircraft_directory, command_line );
362             break;
363           } // end CL map
364
365
366         case Cm_flag:
367           {
368             parse_Cm( linetoken2, linetoken3, linetoken4,
369                       linetoken5, linetoken6, linetoken7,
370                       linetoken8, linetoken9, linetoken10,
371                       aircraft_directory, command_line );
372             break;
373           } // end Cm map
374
375
376         case CY_flag:
377           {
378             parse_CY( linetoken2, linetoken3, linetoken4,
379                       linetoken5, linetoken6, linetoken7,
380                       linetoken8, linetoken9, linetoken10,
381                       aircraft_directory, command_line );
382             break;
383           } // end CY map
384
385
386         case Cl_flag:
387           {
388             parse_Cl( linetoken2, linetoken3, linetoken4,
389                       linetoken5, linetoken6, linetoken7,
390                       linetoken8, linetoken9, linetoken10,
391                       aircraft_directory, command_line );
392             break;
393           } // end Cl map
394
395
396         case Cn_flag:
397           {
398             parse_Cn( linetoken2, linetoken3, linetoken4,
399                       linetoken5, linetoken6, linetoken7,
400                       linetoken8, linetoken9, linetoken10,
401                       aircraft_directory, command_line );
402             break;
403           } // end Cn map
404           
405         
406         case gear_flag:
407           {
408             parse_gear( linetoken2, linetoken3, linetoken4,
409                         linetoken5, linetoken6, linetoken7,
410                         linetoken8, linetoken9, linetoken10,
411                         aircraft_directory, command_line );
412             break;
413           } // end gear map
414       
415
416         case ice_flag:
417           {
418             parse_ice( linetoken2, linetoken3, linetoken4,
419                        linetoken5, linetoken6, linetoken7,
420                        linetoken8, linetoken9, linetoken10,
421                        aircraft_directory, command_line );
422             break;
423           } // end ice map
424          
425
426         case fog_flag:
427           {
428             parse_fog( linetoken2, linetoken3, linetoken4,
429                        linetoken5, linetoken6, linetoken7,
430                        linetoken8, linetoken9, linetoken10,
431                        aircraft_directory, command_line );
432             break;
433           } // end fog map        
434           
435
436         case record_flag:
437           {
438             static int fout_flag=0;
439             if (fout_flag==0)
440             {
441               fout_flag=-1;
442               fout.open("uiuc_record.dat");
443             }
444             parse_record( linetoken2, linetoken3, linetoken4, 
445                           linetoken5, linetoken6, linetoken7,
446                           linetoken8, linetoken9, linetoken10,
447                           aircraft_directory, command_line );
448             break;
449           } // end record map               
450
451
452         case misc_flag:
453           {
454             parse_misc( linetoken2, linetoken3, linetoken4, 
455                         linetoken5, linetoken6, linetoken7,
456                         linetoken8, linetoken9, linetoken10,
457                         aircraft_directory, command_line );
458             break;
459           } // end misc map
460
461
462         default:
463           {
464             if (linetoken1=="*")
465                 return;
466             if (ignore_unknown_keywords) {
467               // do nothing
468             } else {
469               // print error message
470               uiuc_warnings_errors(2, *command_line);
471             }
472             break;
473           }
474         };
475     } // end keyword map
476   
477   delete airplane;
478 }
479
480 // end menu.cpp