Branch data Line data Source code
1 : : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2 : :
3 : : Header: FGInitialCondition.h
4 : : Author: Tony Peden
5 : : Date started: 7/1/99
6 : :
7 : : ------------- Copyright (C) 1999 Anthony K. Peden (apeden@earthlink.net) -------------
8 : :
9 : : This program is free software; you can redistribute it and/or modify it under
10 : : the terms of the GNU Lesser General Public License as published by the Free Software
11 : : Foundation; either version 2 of the License, or (at your option) any later
12 : : version.
13 : :
14 : : This program is distributed in the hope that it will be useful, but WITHOUT
15 : : ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16 : : FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
17 : : details.
18 : :
19 : : You should have received a copy of the GNU Lesser General Public License along with
20 : : this program; if not, write to the Free Software Foundation, Inc., 59 Temple
21 : : Place - Suite 330, Boston, MA 02111-1307, USA.
22 : :
23 : : Further information about the GNU Lesser General Public License can also be found on
24 : : the world wide web at http://www.gnu.org.
25 : :
26 : : HISTORY
27 : : --------------------------------------------------------------------------------
28 : : 7/1/99 TP Created
29 : :
30 : : FUNCTIONAL DESCRIPTION
31 : : --------------------------------------------------------------------------------
32 : :
33 : : The purpose of this class is to take a set of initial conditions and provide
34 : : a kinematically consistent set of body axis velocity components, euler
35 : : angles, and altitude. This class does not attempt to trim the model i.e.
36 : : the sim will most likely start in a very dynamic state (unless, of course,
37 : : you have chosen your IC's wisely) even after setting it up with this class.
38 : :
39 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
40 : : SENTRY
41 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
42 : :
43 : : #ifndef FGINITIALCONDITION_H
44 : : #define FGINITIALCONDITION_H
45 : :
46 : : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
47 : : INCLUDES
48 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
49 : :
50 : : #include "FGFDMExec.h"
51 : : #include "FGJSBBase.h"
52 : : #include "math/FGColumnVector3.h"
53 : : #include "input_output/FGXMLFileRead.h"
54 : :
55 : : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
56 : : DEFINITIONS
57 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
58 : :
59 : : #define ID_INITIALCONDITION "$Id: FGInitialCondition.h,v 1.20 2010/02/15 03:22:57 jberndt Exp $"
60 : :
61 : : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
62 : : FORWARD DECLARATIONS
63 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
64 : :
65 : : namespace JSBSim {
66 : :
67 : : typedef enum { setvt, setvc, setve, setmach, setuvw, setned, setvg } speedset;
68 : : typedef enum { setwned, setwmd, setwhc } windset;
69 : :
70 : : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
71 : : CLASS DOCUMENTATION
72 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
73 : :
74 : : /** Initializes the simulation run.
75 : : Takes a set of initial conditions (IC) and provide a kinematically consistent set
76 : : of body axis velocity components, euler angles, and altitude. This class
77 : : does not attempt to trim the model i.e. the sim will most likely start in a
78 : : very dynamic state (unless, of course, you have chosen your IC's wisely, or
79 : : started on the ground) even after setting it up with this class.
80 : :
81 : : <h3>Usage Notes</h3>
82 : :
83 : : With a valid object of FGFDMExec and an aircraft model loaded:
84 : :
85 : : @code
86 : : FGInitialCondition fgic=new FGInitialCondition(FDMExec);
87 : : fgic->SetVcalibratedKtsIC()
88 : : fgic->SetAltitudeAGLFtIC();
89 : :
90 : : // directly into Run
91 : : FDMExec->GetState()->Initialize(fgic)
92 : : delete fgic;
93 : : FDMExec->Run()
94 : :
95 : : //or to loop the sim w/o integrating
96 : : FDMExec->RunIC(fgic)
97 : : @endcode
98 : :
99 : : <h3>Speed</h3>
100 : :
101 : : Since vc, ve, vt, and mach all represent speed, the remaining
102 : : three are recalculated each time one of them is set (using the
103 : : current altitude). The most recent speed set is remembered so
104 : : that if and when altitude is reset, the last set speed is used
105 : : to recalculate the remaining three. Setting any of the body
106 : : components forces a recalculation of vt and vt then becomes the
107 : : most recent speed set.
108 : :
109 : : <h3>Alpha,Gamma, and Theta</h3>
110 : :
111 : : This class assumes that it will be used to set up the sim for a
112 : : steady, zero pitch rate condition. Since any two of those angles
113 : : specifies the third gamma (flight path angle) is favored when setting
114 : : alpha and theta and alpha is favored when setting gamma. i.e.
115 : :
116 : : - set alpha : recalculate theta using gamma as currently set
117 : : - set theta : recalculate alpha using gamma as currently set
118 : : - set gamma : recalculate theta using alpha as currently set
119 : :
120 : : The idea being that gamma is most interesting to pilots (since it
121 : : is indicative of climb rate).
122 : :
123 : : Setting climb rate is, for the purpose of this discussion,
124 : : considered equivalent to setting gamma.
125 : :
126 : : These are the items that can be set in an initialization file:
127 : :
128 : : - ubody (velocity, ft/sec)
129 : : - vbody (velocity, ft/sec)
130 : : - wbody (velocity, ft/sec)
131 : : - vnorth (velocity, ft/sec)
132 : : - veast (velocity, ft/sec)
133 : : - vdown (velocity, ft/sec)
134 : : - latitude (position, degrees)
135 : : - longitude (position, degrees)
136 : : - phi (orientation, degrees)
137 : : - theta (orientation, degrees)
138 : : - psi (orientation, degrees)
139 : : - alpha (angle, degrees)
140 : : - beta (angle, degrees)
141 : : - gamma (angle, degrees)
142 : : - roc (vertical velocity, ft/sec)
143 : : - elevation (local terrain elevation, ft)
144 : : - altitude (altitude AGL, ft)
145 : : - altitudeAGL (altitude AGL, ft)
146 : : - altitudeMSL (altitude MSL, ft)
147 : : - winddir (wind from-angle, degrees)
148 : : - vwind (magnitude wind speed, ft/sec)
149 : : - hwind (headwind speed, knots)
150 : : - xwind (crosswind speed, knots)
151 : : - vc (calibrated airspeed, ft/sec)
152 : : - mach (mach)
153 : : - vground (ground speed, ft/sec)
154 : : - running (0 or 1)
155 : :
156 : : <h3>Properties</h3>
157 : : @property ic/vc-kts (read/write) Calibrated airspeed initial condition in knots
158 : : @property ic/ve-kts (read/write) Knots equivalent airspeed initial condition
159 : : @property ic/vg-kts (read/write) Ground speed initial condition in knots
160 : : @property ic/vt-kts (read/write) True airspeed initial condition in knots
161 : : @property ic/mach (read/write) Mach initial condition
162 : : @property ic/roc-fpm (read/write) Rate of climb initial condition in feet/minute
163 : : @property ic/gamma-deg (read/write) Flightpath angle initial condition in degrees
164 : : @property ic/alpha-deg (read/write) Angle of attack initial condition in degrees
165 : : @property ic/beta-deg (read/write) Angle of sideslip initial condition in degrees
166 : : @property ic/theta-deg (read/write) Pitch angle initial condition in degrees
167 : : @property ic/phi-deg (read/write) Roll angle initial condition in degrees
168 : : @property ic/psi-true-deg (read/write) Heading angle initial condition in degrees
169 : : @property ic/lat-gc-deg (read/write) Latitude initial condition in degrees
170 : : @property ic/long-gc-deg (read/write) Longitude initial condition in degrees
171 : : @property ic/h-sl-ft (read/write) Height above sea level initial condition in feet
172 : : @property ic/h-agl-ft (read/write) Height above ground level initial condition in feet
173 : : @property ic/sea-level-radius-ft (read/write) Radius of planet at sea level in feet
174 : : @property ic/terrain-elevation-ft (read/write) Terrain elevation above sea level in feet
175 : : @property ic/vg-fps (read/write) Ground speed initial condition in feet/second
176 : : @property ic/vt-fps (read/write) True airspeed initial condition in feet/second
177 : : @property ic/vw-bx-fps (read/write) Wind velocity initial condition in Body X frame in feet/second
178 : : @property ic/vw-by-fps (read/write) Wind velocity initial condition in Body Y frame in feet/second
179 : : @property ic/vw-bz-fps (read/write) Wind velocity initial condition in Body Z frame in feet/second
180 : : @property ic/vw-north-fps (read/write) Wind northward velocity initial condition in feet/second
181 : : @property ic/vw-east-fps (read/write) Wind eastward velocity initial condition in feet/second
182 : : @property ic/vw-down-fps (read/write) Wind downward velocity initial condition in feet/second
183 : : @property ic/vw-mag-fps (read/write) Wind velocity magnitude initial condition in feet/sec.
184 : : @property ic/vw-dir-deg (read/write) Wind direction initial condition, in degrees from north
185 : : @property ic/roc-fps (read/write) Rate of climb initial condition, in feet/second
186 : : @property ic/u-fps (read/write) Body frame x-axis velocity initial condition in feet/second
187 : : @property ic/v-fps (read/write) Body frame y-axis velocity initial condition in feet/second
188 : : @property ic/w-fps (read/write) Body frame z-axis velocity initial condition in feet/second
189 : : @property ic/vn-fps (read/write) Local frame x-axis (north) velocity initial condition in feet/second
190 : : @property ic/ve-fps (read/write) Local frame y-axis (east) velocity initial condition in feet/second
191 : : @property ic/vd-fps (read/write) Local frame z-axis (down) velocity initial condition in feet/second
192 : : @property ic/gamma-rad (read/write) Flight path angle initial condition in radians
193 : : @property ic/alpha-rad (read/write) Angle of attack initial condition in radians
194 : : @property ic/theta-rad (read/write) Pitch angle initial condition in radians
195 : : @property ic/beta-rad (read/write) Angle of sideslip initial condition in radians
196 : : @property ic/phi-rad (read/write) Roll angle initial condition in radians
197 : : @property ic/psi-true-rad (read/write) Heading angle initial condition in radians
198 : : @property ic/lat-gc-rad (read/write) Geocentric latitude initial condition in radians
199 : : @property ic/long-gc-rad (read/write) Longitude initial condition in radians
200 : : @property ic/p-rad_sec (read/write) Roll rate initial condition in radians/second
201 : : @property ic/q-rad_sec (read/write) Pitch rate initial condition in radians/second
202 : : @property ic/r-rad_sec (read/write) Yaw rate initial condition in radians/second
203 : :
204 : : @author Tony Peden
205 : : @version "$Id: FGInitialCondition.h,v 1.20 2010/02/15 03:22:57 jberndt Exp $"
206 : : */
207 : :
208 : : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
209 : : CLASS DECLARATION
210 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
211 : :
212 : : class FGInitialCondition : public FGJSBBase, public FGXMLFileRead
213 : : {
214 : : public:
215 : : /// Constructor
216 : : FGInitialCondition(FGFDMExec *fdmex);
217 : : /// Destructor
218 : : ~FGInitialCondition();
219 : :
220 : : /** Set calibrated airspeed initial condition in knots.
221 : : @param vc Calibrated airspeed in knots */
222 : : void SetVcalibratedKtsIC(double vc);
223 : :
224 : : /** Set equivalent airspeed initial condition in knots.
225 : : @param ve Equivalent airspeed in knots */
226 : : void SetVequivalentKtsIC(double ve);
227 : :
228 : : /** Set true airspeed initial condition in knots.
229 : : @param vt True airspeed in knots */
230 : 1 : inline void SetVtrueKtsIC(double vt) { SetVtrueFpsIC(vt*ktstofps); }
231 : :
232 : : /** Set ground speed initial condition in knots.
233 : : @param vg Ground speed in knots */
234 : 0 : inline void SetVgroundKtsIC(double vg) { SetVgroundFpsIC(vg*ktstofps); }
235 : :
236 : : /** Set mach initial condition.
237 : : @param mach Mach number */
238 : : void SetMachIC(double mach);
239 : :
240 : : /** Sets angle of attack initial condition in degrees.
241 : : @param a Alpha in degrees */
242 : 0 : inline void SetAlphaDegIC(double a) { SetAlphaRadIC(a*degtorad); }
243 : :
244 : : /** Sets angle of sideslip initial condition in degrees.
245 : : @param B Beta in degrees */
246 : 0 : inline void SetBetaDegIC(double B) { SetBetaRadIC(B*degtorad);}
247 : :
248 : : /** Sets pitch angle initial condition in degrees.
249 : : @param theta Theta (pitch) angle in degrees */
250 : 1 : inline void SetThetaDegIC(double theta) { SetThetaRadIC(theta*degtorad); }
251 : :
252 : : /** Resets the IC data structure to new values
253 : : @param u, v, w, ... **/
254 : : void ResetIC(double u0, double v0, double w0, double p0, double q0, double r0,
255 : : double alpha0, double beta0, double phi0, double theta0, double psi0,
256 : : double latitudeRad0, double longitudeRad0, double altitudeAGL0,
257 : : double gamma0);
258 : :
259 : : /** Sets the roll angle initial condition in degrees.
260 : : @param phi roll angle in degrees */
261 : 1 : inline void SetPhiDegIC(double phi) { SetPhiRadIC(phi*degtorad);}
262 : :
263 : : /** Sets the heading angle initial condition in degrees.
264 : : @param psi Heading angle in degrees */
265 : 1 : inline void SetPsiDegIC(double psi){ SetPsiRadIC(psi*degtorad); }
266 : :
267 : : /** Sets the climb rate initial condition in feet/minute.
268 : : @param roc Rate of Climb in feet/minute */
269 : : void SetClimbRateFpmIC(double roc);
270 : :
271 : : /** Sets the flight path angle initial condition in degrees.
272 : : @param gamma Flight path angle in degrees */
273 : 0 : inline void SetFlightPathAngleDegIC(double gamma) { SetFlightPathAngleRadIC(gamma*degtorad); }
274 : :
275 : : /** Sets the altitude above sea level initial condition in feet.
276 : : @param altitudeASL Altitude above sea level in feet */
277 : : void SetAltitudeASLFtIC(double altitudeASL);
278 : :
279 : : /** Sets the initial Altitude above ground level.
280 : : @param agl Altitude above ground level in feet */
281 : : void SetAltitudeAGLFtIC(double agl);
282 : :
283 : : /** Sets the initial sea level radius from planet center
284 : : @param sl_rad sea level radius in feet */
285 : : void SetSeaLevelRadiusFtIC(double sl_rad);
286 : :
287 : : /** Sets the initial terrain elevation.
288 : : @param elev Initial terrain elevation in feet */
289 : : void SetTerrainElevationFtIC(double elev);
290 : :
291 : : /** Sets the initial latitude.
292 : : @param lat Initial latitude in degrees */
293 : 0 : inline void SetLatitudeDegIC(double lat) { latitude=lat*degtorad; }
294 : :
295 : : /** Sets the initial longitude.
296 : : @param lon Initial longitude in degrees */
297 : 0 : inline void SetLongitudeDegIC(double lon) { longitude=lon*degtorad; }
298 : :
299 : : /** Gets the initial calibrated airspeed.
300 : : @return Initial calibrated airspeed in knots */
301 : 1 : inline double GetVcalibratedKtsIC(void) const { return vc*fpstokts; }
302 : :
303 : : /** Gets the initial equivalent airspeed.
304 : : @return Initial equivalent airspeed in knots */
305 : 1 : inline double GetVequivalentKtsIC(void) const { return ve*fpstokts; }
306 : :
307 : : /** Gets the initial ground speed.
308 : : @return Initial ground speed in knots */
309 : 1 : inline double GetVgroundKtsIC(void) const { return vg*fpstokts; }
310 : :
311 : : /** Gets the initial true velocity.
312 : : @return Initial true airspeed in knots. */
313 : 1 : inline double GetVtrueKtsIC(void) const { return vt*fpstokts; }
314 : :
315 : : /** Gets the initial mach.
316 : : @return Initial mach number */
317 : 1 : inline double GetMachIC(void) const { return mach; }
318 : :
319 : : /** Gets the initial climb rate.
320 : : @return Initial climb rate in feet/minute */
321 : 1 : inline double GetClimbRateFpmIC(void) const { return hdot*60; }
322 : :
323 : : /** Gets the initial flight path angle.
324 : : @return Initial flight path angle in degrees */
325 : 1 : inline double GetFlightPathAngleDegIC(void)const { return gamma*radtodeg; }
326 : :
327 : : /** Gets the initial angle of attack.
328 : : @return Initial alpha in degrees */
329 : 1 : inline double GetAlphaDegIC(void) const { return alpha*radtodeg; }
330 : :
331 : : /** Gets the initial sideslip angle.
332 : : @return Initial beta in degrees */
333 : 1 : inline double GetBetaDegIC(void) const { return beta*radtodeg; }
334 : :
335 : : /** Gets the initial pitch angle.
336 : : @return Initial pitch angle in degrees */
337 : 1 : inline double GetThetaDegIC(void) const { return theta*radtodeg; }
338 : :
339 : : /** Gets the initial roll angle.
340 : : @return Initial phi in degrees */
341 : 1 : inline double GetPhiDegIC(void) const { return phi*radtodeg; }
342 : :
343 : : /** Gets the initial heading angle.
344 : : @return Initial psi in degrees */
345 : 1 : inline double GetPsiDegIC(void) const { return psi*radtodeg; }
346 : :
347 : : /** Gets the initial latitude.
348 : : @return Initial geocentric latitude in degrees */
349 : 54006 : inline double GetLatitudeDegIC(void) const { return latitude*radtodeg; }
350 : :
351 : : /** Gets the initial longitude.
352 : : @return Initial longitude in degrees */
353 : 54006 : inline double GetLongitudeDegIC(void) const { return longitude*radtodeg; }
354 : :
355 : : /** Gets the initial altitude above sea level.
356 : : @return Initial altitude in feet. */
357 : 2 : inline double GetAltitudeASLFtIC(void) const { return altitudeASL; }
358 : :
359 : : /** Gets the initial altitude above ground level.
360 : : @return Initial altitude AGL in feet */
361 : 1 : inline double GetAltitudeAGLFtIC(void) const { return altitudeASL - terrain_elevation; }
362 : :
363 : : /** Gets the initial sea level radius.
364 : : @return Initial sea level radius */
365 : 108013 : inline double GetSeaLevelRadiusFtIC(void) const { return sea_level_radius; }
366 : :
367 : : /** Gets the initial terrain elevation.
368 : : @return Initial terrain elevation in feet */
369 : 2 : inline double GetTerrainElevationFtIC(void) const { return terrain_elevation; }
370 : :
371 : : /** Sets the initial ground speed.
372 : : @param vg Initial ground speed in feet/second */
373 : : void SetVgroundFpsIC(double vg);
374 : :
375 : : /** Sets the initial true airspeed.
376 : : @param vt Initial true airspeed in feet/second */
377 : : void SetVtrueFpsIC(double vt);
378 : :
379 : : /** Sets the initial body axis X velocity.
380 : : @param ubody Initial X velocity in feet/second */
381 : : void SetUBodyFpsIC(double ubody);
382 : :
383 : : /** Sets the initial body axis Y velocity.
384 : : @param vbody Initial Y velocity in feet/second */
385 : : void SetVBodyFpsIC(double vbody);
386 : :
387 : : /** Sets the initial body axis Z velocity.
388 : : @param wbody Initial Z velocity in feet/second */
389 : : void SetWBodyFpsIC(double wbody);
390 : :
391 : : /** Sets the initial local axis north velocity.
392 : : @param vn Initial north velocity in feet/second */
393 : : void SetVNorthFpsIC(double vn);
394 : :
395 : : /** Sets the initial local axis east velocity.
396 : : @param ve Initial east velocity in feet/second */
397 : : void SetVEastFpsIC(double ve);
398 : :
399 : : /** Sets the initial local axis down velocity.
400 : : @param vd Initial down velocity in feet/second */
401 : : void SetVDownFpsIC(double vd);
402 : :
403 : : /** Sets the initial roll rate.
404 : : @param P Initial roll rate in radians/second */
405 : 0 : void SetPRadpsIC(double P) { p = P; }
406 : :
407 : : /** Sets the initial pitch rate.
408 : : @param Q Initial pitch rate in radians/second */
409 : 0 : void SetQRadpsIC(double Q) { q = Q; }
410 : :
411 : : /** Sets the initial yaw rate.
412 : : @param R initial yaw rate in radians/second */
413 : 0 : void SetRRadpsIC(double R) { r = R; }
414 : :
415 : : /** Sets the initial wind velocity.
416 : : @param wN Initial wind velocity in local north direction, feet/second
417 : : @param wE Initial wind velocity in local east direction, feet/second
418 : : @param wD Initial wind velocity in local down direction, feet/second */
419 : : void SetWindNEDFpsIC(double wN, double wE, double wD);
420 : :
421 : : /** Sets the initial total wind speed.
422 : : @param mag Initial wind velocity magnitude in knots */
423 : : void SetWindMagKtsIC(double mag);
424 : :
425 : : /** Sets the initial wind direction.
426 : : @param dir Initial direction wind is coming from in degrees */
427 : : void SetWindDirDegIC(double dir);
428 : :
429 : : /** Sets the initial headwind velocity.
430 : : @param head Initial headwind speed in knots */
431 : : void SetHeadWindKtsIC(double head);
432 : :
433 : : /** Sets the initial crosswind speed.
434 : : @param cross Initial crosswind speed, positive from left to right */
435 : : void SetCrossWindKtsIC(double cross);
436 : :
437 : : /** Sets the initial wind downward speed.
438 : : @param wD Initial downward wind speed in knots*/
439 : : void SetWindDownKtsIC(double wD);
440 : :
441 : : /** Sets the initial climb rate.
442 : : @param roc Initial Rate of climb in feet/second */
443 : : void SetClimbRateFpsIC(double roc);
444 : :
445 : : /** Gets the initial ground velocity.
446 : : @return Initial ground velocity in feet/second */
447 : 1 : inline double GetVgroundFpsIC(void) const { return vg; }
448 : :
449 : : /** Gets the initial true velocity.
450 : : @return Initial true velocity in feet/second */
451 : 1 : inline double GetVtrueFpsIC(void) const { return vt; }
452 : :
453 : : /** Gets the initial body axis X wind velocity.
454 : : @return Initial body axis X wind velocity in feet/second */
455 : 1 : inline double GetWindUFpsIC(void) const { return uw; }
456 : :
457 : : /** Gets the initial body axis Y wind velocity.
458 : : @return Initial body axis Y wind velocity in feet/second */
459 : 1 : inline double GetWindVFpsIC(void) const { return vw; }
460 : :
461 : : /** Gets the initial body axis Z wind velocity.
462 : : @return Initial body axis Z wind velocity in feet/second */
463 : 1 : inline double GetWindWFpsIC(void) const { return ww; }
464 : :
465 : : /** Gets the initial wind velocity in local frame.
466 : : @return Initial wind velocity toward north in feet/second */
467 : 2 : inline double GetWindNFpsIC(void) const { return wnorth; }
468 : :
469 : : /** Gets the initial wind velocity in local frame.
470 : : @return Initial wind velocity eastwards in feet/second */
471 : 2 : inline double GetWindEFpsIC(void) const { return weast; }
472 : :
473 : : /** Gets the initial wind velocity in local frame.
474 : : @return Initial wind velocity downwards in feet/second */
475 : 2 : inline double GetWindDFpsIC(void) const { return wdown; }
476 : :
477 : : /** Gets the initial total wind velocity in feet/sec.
478 : : @return Initial wind velocity in feet/second */
479 : 1 : inline double GetWindFpsIC(void) const { return sqrt(wnorth*wnorth + weast*weast); }
480 : :
481 : : /** Gets the initial wind direction.
482 : : @return Initial wind direction in feet/second */
483 : : double GetWindDirDegIC(void) const;
484 : :
485 : : /** Gets the initial climb rate.
486 : : @return Initial rate of climb in feet/second */
487 : 1 : inline double GetClimbRateFpsIC(void) const { return hdot; }
488 : :
489 : : /** Gets the initial body axis X velocity.
490 : : @return Initial body axis X velocity in feet/second. */
491 : : double GetUBodyFpsIC(void) const;
492 : :
493 : : /** Gets the initial body axis Y velocity.
494 : : @return Initial body axis Y velocity in feet/second. */
495 : : double GetVBodyFpsIC(void) const;
496 : :
497 : : /** Gets the initial body axis Z velocity.
498 : : @return Initial body axis Z velocity in feet/second. */
499 : : double GetWBodyFpsIC(void) const;
500 : :
501 : : /** Gets the initial local frame X (North) velocity.
502 : : @return Initial local frame X (North) axis velocity in feet/second. */
503 : 1 : double GetVNorthFpsIC(void) const {return vnorth;};
504 : :
505 : : /** Gets the initial local frame Y (East) velocity.
506 : : @return Initial local frame Y (East) axis velocity in feet/second. */
507 : 1 : double GetVEastFpsIC(void) const {return veast;};
508 : :
509 : : /** Gets the initial local frame Z (Down) velocity.
510 : : @return Initial local frame Z (Down) axis velocity in feet/second. */
511 : 1 : double GetVDownFpsIC(void) const {return vdown;};
512 : :
513 : : /** Gets the initial body axis roll rate.
514 : : @return Initial body axis roll rate in radians/second */
515 : 2 : double GetPRadpsIC() const { return p; }
516 : :
517 : : /** Gets the initial body axis pitch rate.
518 : : @return Initial body axis pitch rate in radians/second */
519 : 2 : double GetQRadpsIC() const { return q; }
520 : :
521 : : /** Gets the initial body axis yaw rate.
522 : : @return Initial body axis yaw rate in radians/second */
523 : 2 : double GetRRadpsIC() const { return r; }
524 : :
525 : : /** Sets the initial flight path angle.
526 : : @param gamma Initial flight path angle in radians */
527 : : void SetFlightPathAngleRadIC(double gamma);
528 : :
529 : : /** Sets the initial angle of attack.
530 : : @param alpha Initial angle of attack in radians */
531 : : void SetAlphaRadIC(double alpha);
532 : :
533 : : /** Sets the initial pitch angle.
534 : : @param theta Initial pitch angle in radians */
535 : : void SetThetaRadIC(double theta);
536 : :
537 : : /** Sets the initial sideslip angle.
538 : : @param beta Initial angle of sideslip in radians. */
539 : : void SetBetaRadIC(double beta);
540 : :
541 : : /** Sets the initial roll angle.
542 : : @param phi Initial roll angle in radians */
543 : : void SetPhiRadIC(double phi);
544 : :
545 : : /** Sets the initial heading angle.
546 : : @param psi Initial heading angle in radians */
547 : : void SetPsiRadIC(double psi);
548 : :
549 : : /** Sets the initial latitude.
550 : : @param lat Initial latitude in radians */
551 : 0 : inline void SetLatitudeRadIC(double lat) { latitude=lat; }
552 : :
553 : : /** Sets the initial longitude.
554 : : @param lon Initial longitude in radians */
555 : 0 : inline void SetLongitudeRadIC(double lon) { longitude=lon; }
556 : :
557 : : /** Sets the target normal load factor.
558 : : @param nlf Normal load factor*/
559 : 0 : inline void SetTargetNlfIC(double nlf) { targetNlfIC=nlf; }
560 : :
561 : : /** Gets the initial flight path angle.
562 : : @return Initial flight path angle in radians */
563 : 1 : inline double GetFlightPathAngleRadIC(void) const { return gamma; }
564 : :
565 : : /** Gets the initial angle of attack.
566 : : @return Initial alpha in radians */
567 : 1 : inline double GetAlphaRadIC(void) const { return alpha; }
568 : :
569 : : /** Gets the initial angle of sideslip.
570 : : @return Initial sideslip angle in radians */
571 : 1 : inline double GetBetaRadIC(void) const { return beta; }
572 : :
573 : : /** Gets the initial roll angle.
574 : : @return Initial roll angle in radians */
575 : 2 : inline double GetPhiRadIC(void) const { return phi; }
576 : :
577 : : /** Gets the initial latitude.
578 : : @return Initial latitude in radians */
579 : 2 : inline double GetLatitudeRadIC(void) const { return latitude; }
580 : :
581 : : /** Gets the initial longitude.
582 : : @return Initial longitude in radians */
583 : 2 : inline double GetLongitudeRadIC(void) const { return longitude; }
584 : :
585 : : /** Gets the initial pitch angle.
586 : : @return Initial pitch angle in radians */
587 : 2 : inline double GetThetaRadIC(void) const { return theta; }
588 : :
589 : : /** Gets the initial heading angle.
590 : : @return Initial heading angle in radians */
591 : 2 : inline double GetPsiRadIC(void) const { return psi; }
592 : :
593 : : /** Gets the initial speedset.
594 : : @return Initial speedset */
595 : : inline speedset GetSpeedSet(void) { return lastSpeedSet; }
596 : :
597 : : /** Gets the initial windset.
598 : : @return Initial windset */
599 : : inline windset GetWindSet(void) { return lastWindSet; }
600 : :
601 : : /** Gets the target normal load factor set from IC.
602 : : @return target normal load factor set from IC*/
603 : : inline double GetTargetNlfIC(void) { return targetNlfIC; }
604 : :
605 : : /** Loads the initial conditions.
606 : : @param rstname The name of an initial conditions file
607 : : @param useStoredPath true if the stored path to the IC file should be used
608 : : @return true if successful */
609 : : bool Load(string rstname, bool useStoredPath = true );
610 : :
611 : : /** Get init-file name
612 : : */
613 : : string GetInitFile(void) {return init_file_name;}
614 : : /** Set init-file name
615 : : */
616 : : void SetInitFile(string f) { init_file_name = f;}
617 : : void WriteStateFile(int num);
618 : :
619 : : private:
620 : : double vt,vc,ve,vg;
621 : : double mach;
622 : : double altitudeASL,hdot;
623 : : double latitude,longitude;
624 : : double u,v,w;
625 : : double p,q,r;
626 : : double uw,vw,ww;
627 : : double vnorth,veast,vdown;
628 : : double wnorth,weast,wdown;
629 : : double whead, wcross, wdir, wmag;
630 : : double sea_level_radius;
631 : : double terrain_elevation;
632 : : double radius_to_vehicle;
633 : : double targetNlfIC;
634 : :
635 : : double alpha, beta, theta, phi, psi, gamma;
636 : : double salpha,sbeta,stheta,sphi,spsi,sgamma;
637 : : double calpha,cbeta,ctheta,cphi,cpsi,cgamma;
638 : :
639 : : double xlo, xhi,xmin,xmax;
640 : :
641 : : typedef double (FGInitialCondition::*fp)(double x);
642 : : fp sfunc;
643 : :
644 : : speedset lastSpeedSet;
645 : : windset lastWindSet;
646 : :
647 : : FGFDMExec *fdmex;
648 : : FGPropertyManager *PropertyManager;
649 : :
650 : : bool Load_v1(void);
651 : : bool Load_v2(void);
652 : :
653 : : bool Constructing;
654 : : bool getAlpha(void);
655 : : bool getTheta(void);
656 : : bool getMachFromVcas(double *Mach,double vcas);
657 : :
658 : : double GammaEqOfTheta(double Theta);
659 : : void InitializeIC(void);
660 : : double GammaEqOfAlpha(double Alpha);
661 : : double calcVcas(double Mach);
662 : : void calcUVWfromNED(void);
663 : : void calcWindUVW(void);
664 : :
665 : : bool findInterval(double x,double guess);
666 : : bool solve(double *y, double x);
667 : : void bind(void);
668 : : void Debug(int from);
669 : :
670 : : string init_file_name;
671 : : };
672 : : }
673 : : #endif
674 : :
|