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);
195 void SetPRadpsIC(double tt) { p = tt; }
196 void SetQRadpsIC(double tt) { q = tt; }
197 void SetRRadpsIC(double tt) { r = tt; }
199 void SetWindNEDFpsIC(double wN, double wE, double wD);
201 void SetWindMagKtsIC(double mag);
202 void SetWindDirDegIC(double dir);
204 void SetHeadWindKtsIC(double head);
205 void SetCrossWindKtsIC(double cross);// positive from left
207 void SetWindDownKtsIC(double wD);
209 void SetClimbRateFpsIC(double tt);
210 inline double GetVgroundFpsIC(void) const { return vg; }
211 inline double GetVtrueFpsIC(void) const { return vt; }
212 inline double GetWindUFpsIC(void) const { return uw; }
213 inline double GetWindVFpsIC(void) const { return vw; }
214 inline double GetWindWFpsIC(void) const { return ww; }
215 inline double GetWindNFpsIC(void) const { return wnorth; }
216 inline double GetWindEFpsIC(void) const { return weast; }
217 inline double GetWindDFpsIC(void) const { return wdown; }
218 inline double GetWindFpsIC(void) const { return sqrt(wnorth*wnorth + weast*weast); }
219 double GetWindDirDegIC(void);
220 inline double GetClimbRateFpsIC(void) const { return hdot; }
221 double GetUBodyFpsIC(void) const;
222 double GetVBodyFpsIC(void) const;
223 double GetWBodyFpsIC(void) const;
224 double GetPRadpsIC() const { return p; }
225 double GetQRadpsIC() const { return q; }
226 double GetRRadpsIC() const { return r; }
227 void SetFlightPathAngleRadIC(double tt);
228 void SetAlphaRadIC(double tt);
229 void SetPitchAngleRadIC(double tt);
230 void SetBetaRadIC(double tt);
231 void SetRollAngleRadIC(double tt);
232 void SetTrueHeadingRadIC(double tt);
233 inline void SetLatitudeRadIC(double tt) { latitude=tt; }
234 inline void SetLongitudeRadIC(double tt) { longitude=tt; }
235 inline double GetFlightPathAngleRadIC(void) const { return gamma; }
236 inline double GetAlphaRadIC(void) const { return alpha; }
237 inline double GetPitchAngleRadIC(void) const { return theta; }
238 inline double GetBetaRadIC(void) const { return beta; }
239 inline double GetRollAngleRadIC(void) const { return phi; }
240 inline double GetHeadingRadIC(void) const { return psi; }
241 inline double GetLatitudeRadIC(void) const { return latitude; }
242 inline double GetLongitudeRadIC(void) const { return longitude; }
243 inline double GetThetaRadIC(void) const { return theta; }
244 inline double GetPhiRadIC(void) const { return phi; }
245 inline double GetPsiRadIC(void) const { return psi; }
247 inline speedset GetSpeedSet(void) { return lastSpeedSet; }
248 inline windset GetWindSet(void) { return lastWindSet; }
250 bool Load(string rstname, bool useStoredPath = true );
259 double altitude,hdot;
260 double latitude,longitude;
264 double vnorth,veast,vdown;
265 double wnorth,weast,wdown;
266 double whead, wcross, wdir, wmag;
267 double sea_level_radius;
268 double terrain_altitude;
269 double radius_to_vehicle;
271 double alpha, beta, theta, phi, psi, gamma;
272 double salpha,sbeta,stheta,sphi,spsi,sgamma;
273 double calpha,cbeta,ctheta,cphi,cpsi,cgamma;
275 double xlo, xhi,xmin,xmax;
277 typedef double (FGInitialCondition::*fp)(double x);
280 speedset lastSpeedSet;
284 FGPropertyManager *PropertyManager;
288 bool getMachFromVcas(double *Mach,double vcas);
290 double GammaEqOfTheta(double Theta);
291 double GammaEqOfAlpha(double Alpha);
292 double calcVcas(double Mach);
293 void calcUVWfromNED(void);
294 void calcWindUVW(void);
296 bool findInterval(double x,double guess);
297 bool solve(double *y, double x);
298 void Debug(int from);