]> git.mxchange.org Git - flightgear.git/blob - src/FDM/UIUCModel/uiuc_menu.cpp
Merge branch 'next' of git://gitorious.org/fg/flightgear into next
[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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
157
158 **********************************************************************/
159
160 #include <simgear/compiler.h>
161
162
163 #include <cstdlib>
164 #include <string>
165 #include <iostream>
166
167 #include "uiuc_menu.h"
168
169 using std::cerr;
170 using std::cout;
171 using std::endl;
172
173 #ifndef _MSC_VER
174 using std::exit;
175 #endif
176
177 void uiuc_menu( string aircraft_name )
178 {
179   string aircraft_directory;
180   stack command_list;
181   
182   string linetoken1;
183   string linetoken2;
184   string linetoken3;
185   string linetoken4;
186   string linetoken5;
187   string linetoken6;
188   string linetoken7;
189   string linetoken8;
190   string linetoken9;
191   string linetoken10;
192   
193   /* the following default setting should eventually be moved to a default or uiuc_init routine */
194
195   recordRate = 1;       /* record every time step, default */
196   recordStartTime = 0;  /* record from beginning of simulation */
197
198 /* set speed at which dynamic pressure terms will be accounted for,
199    since if velocity is too small, coefficients will go to infinity */
200   dyn_on_speed      = 33;    /* 20 kts (33 ft/sec), default */
201   dyn_on_speed_zero = 0.5 * dyn_on_speed;    /* only used if use_dyn_on_speed_curve1 is used */
202   bootindex = 0;  // the index for the bootTime
203
204   /* Read the file and get the list of commands */
205   airplane = new ParseFile(aircraft_name); /* struct that includes all lines of the input file */
206   command_list = airplane -> getCommands();
207   /* structs to include all parts included in the input file for specific keyword groups */
208   initParts          = new ParseFile();
209   geometryParts      = new ParseFile();
210   massParts          = new ParseFile();
211   engineParts        = new ParseFile();
212   aeroDragParts      = new ParseFile();
213   aeroLiftParts      = new ParseFile();
214   aeroPitchParts     = new ParseFile();
215   aeroSideforceParts = new ParseFile();
216   aeroRollParts      = new ParseFile();
217   aeroYawParts       = new ParseFile();
218   gearParts          = new ParseFile();
219   recordParts        = new ParseFile();
220
221   if (command_list.begin() == command_list.end())
222   {
223     cerr << "UIUC ERROR: File " << aircraft_name <<" does not exist" << endl;
224     exit(-1);
225   }
226   
227   //construct aircraft-directory
228   aircraft_directory = aircraft_name;
229   int index_aircraft_dat = aircraft_directory.find("aircraft.dat");
230   aircraft_directory.erase(index_aircraft_dat,12);
231
232   for (LIST command_line = command_list.begin(); command_line!=command_list.end(); ++command_line)
233     {
234       cout << *command_line << endl;
235
236       linetoken1 = airplane -> getToken (*command_line, 1); 
237       linetoken2 = airplane -> getToken (*command_line, 2); 
238       if (linetoken2=="")
239         linetoken2="0";
240       linetoken3 = airplane -> getToken (*command_line, 3); 
241       if (linetoken3=="")
242         linetoken3="0";
243       linetoken4 = airplane -> getToken (*command_line, 4); 
244       if (linetoken4=="")
245         linetoken4="0";
246       linetoken5 = airplane -> getToken (*command_line, 5); 
247       if (linetoken5=="")
248         linetoken5="0";
249       linetoken6 = airplane -> getToken (*command_line, 6); 
250       if (linetoken6=="")
251         linetoken6="0";
252       linetoken7 = airplane -> getToken (*command_line, 7);
253       if (linetoken7=="")
254         linetoken7="0";
255       linetoken8 = airplane -> getToken (*command_line, 8);
256       if (linetoken8=="")
257         linetoken8="0";
258       linetoken9 = airplane -> getToken (*command_line, 9);
259       if (linetoken9=="")
260         linetoken9="0";
261       linetoken10 = airplane -> getToken (*command_line, 10);
262       if (linetoken10=="")
263         linetoken10="0";
264  
265       //cout << linetoken1 << endl;
266       //cout << linetoken2 << endl;
267       //cout << linetoken3 << endl;
268       //cout << linetoken4 << endl;
269       //cout << linetoken5 << endl;
270       //cout << linetoken6 << endl;
271       //cout << linetoken7 << endl;
272       //cout << linetoken8 << endl;
273       //cout << linetoken9 << endl;
274       //cout << linetoken10 << endl;
275      
276       //istrstream token3(linetoken3.c_str());
277       //istrstream token4(linetoken4.c_str());
278       //istrstream token5(linetoken5.c_str());
279       //istrstream token6(linetoken6.c_str());
280       //istrstream token7(linetoken7.c_str());
281       //istrstream token8(linetoken8.c_str());
282       //istrstream token9(linetoken9.c_str());
283       //istrstream token10(linetoken10.c_str());
284
285       switch (Keyword_map[linetoken1])
286         {
287         case init_flag:
288           {
289             parse_init( linetoken2, linetoken3, linetoken4, 
290                         linetoken5, linetoken6, linetoken7,
291                         linetoken8, linetoken9, linetoken10,
292                         aircraft_directory, command_line );
293             break;
294           } // end init map
295           
296       
297         case geometry_flag:
298           {
299             parse_geometry( linetoken2, linetoken3, linetoken4,
300                             linetoken5, linetoken6, linetoken7,
301                             linetoken8, linetoken9, linetoken10,
302                             aircraft_directory, command_line );
303             break;
304           } // end geometry map
305
306
307         case controlSurface_flag:
308           {
309             parse_controlSurface( linetoken2, linetoken3, linetoken4,
310                                   linetoken5, linetoken6, linetoken7,
311                                   linetoken8, linetoken9, linetoken10,
312                                   aircraft_directory, command_line );
313             break;
314           } // end controlSurface map
315
316
317         case mass_flag:
318           {
319             parse_mass( linetoken2, linetoken3, linetoken4,
320                         linetoken5, linetoken6, linetoken7,
321                         linetoken8, linetoken9, linetoken10,
322                         aircraft_directory, command_line );
323             break;
324           } // end mass map
325           
326           
327         case engine_flag:
328           {
329             parse_engine( linetoken2, linetoken3, linetoken4,
330                           linetoken5, linetoken6, linetoken7,
331                           linetoken8, linetoken9, linetoken10,
332                           aircraft_directory, command_line );
333             break;
334           } // end engine map
335           
336           
337         case CD_flag:
338           {
339             parse_CD( linetoken2, linetoken3, linetoken4,
340                       linetoken5, linetoken6, linetoken7,
341                       linetoken8, linetoken9, linetoken10,
342                       aircraft_directory, command_line );
343             break;
344           } // end CD map
345
346           
347         case CL_flag:
348           {
349             parse_CL( linetoken2, linetoken3, linetoken4,
350                       linetoken5, linetoken6, linetoken7,
351                       linetoken8, linetoken9, linetoken10,
352                       aircraft_directory, command_line );
353             break;
354           } // end CL map
355
356
357         case Cm_flag:
358           {
359             parse_Cm( linetoken2, linetoken3, linetoken4,
360                       linetoken5, linetoken6, linetoken7,
361                       linetoken8, linetoken9, linetoken10,
362                       aircraft_directory, command_line );
363             break;
364           } // end Cm map
365
366
367         case CY_flag:
368           {
369             parse_CY( linetoken2, linetoken3, linetoken4,
370                       linetoken5, linetoken6, linetoken7,
371                       linetoken8, linetoken9, linetoken10,
372                       aircraft_directory, command_line );
373             break;
374           } // end CY map
375
376
377         case Cl_flag:
378           {
379             parse_Cl( linetoken2, linetoken3, linetoken4,
380                       linetoken5, linetoken6, linetoken7,
381                       linetoken8, linetoken9, linetoken10,
382                       aircraft_directory, command_line );
383             break;
384           } // end Cl map
385
386
387         case Cn_flag:
388           {
389             parse_Cn( linetoken2, linetoken3, linetoken4,
390                       linetoken5, linetoken6, linetoken7,
391                       linetoken8, linetoken9, linetoken10,
392                       aircraft_directory, command_line );
393             break;
394           } // end Cn map
395           
396         
397         case gear_flag:
398           {
399             parse_gear( linetoken2, linetoken3, linetoken4,
400                         linetoken5, linetoken6, linetoken7,
401                         linetoken8, linetoken9, linetoken10,
402                         aircraft_directory, command_line );
403             break;
404           } // end gear map
405       
406
407         case ice_flag:
408           {
409             parse_ice( linetoken2, linetoken3, linetoken4,
410                        linetoken5, linetoken6, linetoken7,
411                        linetoken8, linetoken9, linetoken10,
412                        aircraft_directory, command_line );
413             break;
414           } // end ice map
415          
416
417         case fog_flag:
418           {
419             parse_fog( linetoken2, linetoken3, linetoken4,
420                        linetoken5, linetoken6, linetoken7,
421                        linetoken8, linetoken9, linetoken10,
422                        aircraft_directory, command_line );
423             break;
424           } // end fog map        
425           
426
427         case record_flag:
428           {
429             static int fout_flag=0;
430             if (fout_flag==0)
431             {
432               fout_flag=-1;
433               fout.open("uiuc_record.dat");
434             }
435             parse_record( linetoken2, linetoken3, linetoken4, 
436                           linetoken5, linetoken6, linetoken7,
437                           linetoken8, linetoken9, linetoken10,
438                           aircraft_directory, command_line );
439             break;
440           } // end record map               
441
442
443         case misc_flag:
444           {
445             parse_misc( linetoken2, linetoken3, linetoken4, 
446                         linetoken5, linetoken6, linetoken7,
447                         linetoken8, linetoken9, linetoken10,
448                         aircraft_directory, command_line );
449             break;
450           } // end misc map
451
452
453         default:
454           {
455             if (linetoken1=="*")
456                 return;
457             if (ignore_unknown_keywords) {
458               // do nothing
459             } else {
460               // print error message
461               uiuc_warnings_errors(2, *command_line);
462             }
463             break;
464           }
465         };
466     } // end keyword map
467   
468   delete airplane;
469 }
470
471 // end menu.cpp