1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 Header: FGInitialCondition.h
7 ------------- Copyright (C) 1999 Anthony K. Peden (apeden@earthlink.net) -------------
9 This program is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free Software
11 Foundation; either version 2 of the License, or (at your option) any later
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 General Public License for more
19 You should have received a copy of the GNU 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.
23 Further information about the GNU General Public License can also be found on
24 the world wide web at http://www.gnu.org.
27 --------------------------------------------------------------------------------
30 FUNCTIONAL DESCRIPTION
31 --------------------------------------------------------------------------------
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.
39 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
41 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
43 #ifndef FGINITIALCONDITION_H
44 #define FGINITIALCONDITION_H
46 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
48 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
50 #include "FGFDMExec.h"
51 #include "FGJSBBase.h"
52 #include "FGColumnVector3.h"
54 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
56 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
58 #define ID_INITIALCONDITION "$Id$"
60 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
62 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
66 typedef enum { setvt, setvc, setve, setmach, setuvw, setned, setvg } speedset;
67 typedef enum { setwned, setwmd, setwhc } windset;
69 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
71 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
73 /** Takes a set of initial conditions and provide a kinematically consistent set
74 of body axis velocity components, euler angles, and altitude. This class
75 does not attempt to trim the model i.e. the sim will most likely start in a
76 very dynamic state (unless, of course, you have chosen your IC's wisely)
77 even after setting it up with this class.
81 With a valid object of FGFDMExec and an aircraft model loaded
82 FGInitialCondition fgic=new FGInitialCondition(FDMExec);
83 fgic->SetVcalibratedKtsIC()
84 fgic->SetAltitudeFtIC();
86 //to directly into Run
87 FDMExec->GetState()->Initialize(fgic)
91 //or to loop the sim w/o integrating
96 Since vc, ve, vt, and mach all represent speed, the remaining
97 three are recalculated each time one of them is set (using the
98 current altitude). The most recent speed set is remembered so
99 that if and when altitude is reset, the last set speed is used
100 to recalculate the remaining three. Setting any of the body
101 components forces a recalculation of vt and vt then becomes the
102 most recent speed set.
104 Alpha,Gamma, and Theta:
106 This class assumes that it will be used to set up the sim for a
107 steady, zero pitch rate condition. Since any two of those angles
108 specifies the third gamma (flight path angle) is favored when setting
109 alpha and theta and alpha is favored when setting gamma. i.e.
111 - set alpha : recalculate theta using gamma as currently set
112 - set theta : recalculate alpha using gamma as currently set
113 - set gamma : recalculate theta using alpha as currently set
115 The idea being that gamma is most interesting to pilots (since it
116 is indicative of climb rate).
118 Setting climb rate is, for the purpose of this discussion,
119 considered equivalent to setting gamma.
124 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
126 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
128 class FGInitialCondition : public FGJSBBase
132 FGInitialCondition(FGFDMExec *fdmex);
134 ~FGInitialCondition();
136 void SetVcalibratedKtsIC(double tt);
137 void SetVequivalentKtsIC(double tt);
138 inline void SetVtrueKtsIC(double tt) { SetVtrueFpsIC(tt*ktstofps); }
139 inline void SetVgroundKtsIC(double tt) { SetVgroundFpsIC(tt*ktstofps); }
140 void SetMachIC(double tt);
142 inline void SetAlphaDegIC(double tt) { SetAlphaRadIC(tt*degtorad); }
143 inline void SetBetaDegIC(double tt) { SetBetaRadIC(tt*degtorad);}
145 inline void SetPitchAngleDegIC(double tt) { SetPitchAngleRadIC(tt*degtorad); }
146 inline void SetRollAngleDegIC(double tt) { SetRollAngleRadIC(tt*degtorad);}
147 inline void SetTrueHeadingDegIC(double tt){ SetTrueHeadingRadIC(tt*degtorad); }
149 void SetClimbRateFpmIC(double tt);
150 inline void SetFlightPathAngleDegIC(double tt) { SetFlightPathAngleRadIC(tt*degtorad); }
152 void SetAltitudeFtIC(double tt);
153 void SetAltitudeAGLFtIC(double tt);
155 void SetSeaLevelRadiusFtIC(double tt);
156 void SetTerrainAltitudeFtIC(double tt);
158 inline void SetLatitudeDegIC(double tt) { latitude=tt*degtorad; }
159 inline void SetLongitudeDegIC(double tt) { longitude=tt*degtorad; }
162 inline double GetVcalibratedKtsIC(void) const { return vc*fpstokts; }
163 inline double GetVequivalentKtsIC(void) const { return ve*fpstokts; }
164 inline double GetVgroundKtsIC(void) const { return vg*fpstokts; }
165 inline double GetVtrueKtsIC(void) const { return vt*fpstokts; }
166 inline double GetMachIC(void) const { return mach; }
168 inline double GetClimbRateFpmIC(void) const { return hdot*60; }
169 inline double GetFlightPathAngleDegIC(void)const { return gamma*radtodeg; }
171 inline double GetAlphaDegIC(void) const { return alpha*radtodeg; }
172 inline double GetBetaDegIC(void) const { return beta*radtodeg; }
174 inline double GetPitchAngleDegIC(void) const { return theta*radtodeg; }
175 inline double GetRollAngleDegIC(void) const { return phi*radtodeg; }
176 inline double GetHeadingDegIC(void) const { return psi*radtodeg; }
178 inline double GetLatitudeDegIC(void) const { return latitude*radtodeg; }
179 inline double GetLongitudeDegIC(void) const { return longitude*radtodeg; }
181 inline double GetAltitudeFtIC(void) const { return altitude; }
182 inline double GetAltitudeAGLFtIC(void) const { return altitude - terrain_altitude; }
184 inline double GetSeaLevelRadiusFtIC(void) const { return sea_level_radius; }
185 inline double GetTerrainAltitudeFtIC(void) const { return terrain_altitude; }
187 void SetVgroundFpsIC(double tt);
188 void SetVtrueFpsIC(double tt);
189 void SetUBodyFpsIC(double tt);
190 void SetVBodyFpsIC(double tt);
191 void SetWBodyFpsIC(double tt);
192 void SetVnorthFpsIC(double tt);
193 void SetVeastFpsIC(double tt);
194 void SetVdownFpsIC(double tt);
196 void SetWindNEDFpsIC(double wN, double wE, double wD);
198 void SetWindMagKtsIC(double mag);
199 void SetWindDirDegIC(double dir);
201 void SetHeadWindKtsIC(double head);
202 void SetCrossWindKtsIC(double cross);// positive from left
204 void SetWindDownKtsIC(double wD);
206 void SetClimbRateFpsIC(double tt);
207 inline double GetVgroundFpsIC(void) const { return vg; }
208 inline double GetVtrueFpsIC(void) const { return vt; }
209 inline double GetWindUFpsIC(void) const { return uw; }
210 inline double GetWindVFpsIC(void) const { return vw; }
211 inline double GetWindWFpsIC(void) const { return ww; }
212 inline double GetWindNFpsIC(void) const { return wnorth; }
213 inline double GetWindEFpsIC(void) const { return weast; }
214 inline double GetWindDFpsIC(void) const { return wdown; }
215 inline double GetWindFpsIC(void) const { return sqrt(wnorth*wnorth + weast*weast); }
216 double GetWindDirDegIC(void);
217 inline double GetClimbRateFpsIC(void) const { return hdot; }
218 double GetUBodyFpsIC(void);
219 double GetVBodyFpsIC(void);
220 double GetWBodyFpsIC(void);
221 void SetFlightPathAngleRadIC(double tt);
222 void SetAlphaRadIC(double tt);
223 void SetPitchAngleRadIC(double tt);
224 void SetBetaRadIC(double tt);
225 void SetRollAngleRadIC(double tt);
226 void SetTrueHeadingRadIC(double tt);
227 inline void SetLatitudeRadIC(double tt) { latitude=tt; }
228 inline void SetLongitudeRadIC(double tt) { longitude=tt; }
229 inline double GetFlightPathAngleRadIC(void) const { return gamma; }
230 inline double GetAlphaRadIC(void) const { return alpha; }
231 inline double GetPitchAngleRadIC(void) const { return theta; }
232 inline double GetBetaRadIC(void) const { return beta; }
233 inline double GetRollAngleRadIC(void) const { return phi; }
234 inline double GetHeadingRadIC(void) const { return psi; }
235 inline double GetLatitudeRadIC(void) const { return latitude; }
236 inline double GetLongitudeRadIC(void) const { return longitude; }
237 inline double GetThetaRadIC(void) const { return theta; }
238 inline double GetPhiRadIC(void) const { return phi; }
239 inline double GetPsiRadIC(void) const { return psi; }
241 inline speedset GetSpeedSet(void) { return lastSpeedSet; }
242 inline windset GetWindSet(void) { return lastWindSet; }
244 bool Load(string rstname, bool useStoredPath = true );
253 double altitude,hdot;
254 double latitude,longitude;
257 double vnorth,veast,vdown;
258 double wnorth,weast,wdown;
259 double whead, wcross, wdir, wmag;
260 double sea_level_radius;
261 double terrain_altitude;
262 double radius_to_vehicle;
264 double alpha, beta, theta, phi, psi, gamma;
265 double salpha,sbeta,stheta,sphi,spsi,sgamma;
266 double calpha,cbeta,ctheta,cphi,cpsi,cgamma;
268 double xlo, xhi,xmin,xmax;
270 typedef double (FGInitialCondition::*fp)(double x);
273 speedset lastSpeedSet;
277 FGPropertyManager *PropertyManager;
281 bool getMachFromVcas(double *Mach,double vcas);
283 double GammaEqOfTheta(double Theta);
284 double GammaEqOfAlpha(double Alpha);
285 double calcVcas(double Mach);
286 void calcUVWfromNED(void);
287 void calcWindUVW(void);
289 bool findInterval(double x,double guess);
290 bool solve(double *y, double x);
291 void Debug(int from);