1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5 Implementation of 1959 Standard Atmosphere added by Tony Peden
8 ------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) -------------
10 This program is free software; you can redistribute it and/or modify it under
11 the terms of the GNU Lesser General Public License as published by the Free Software
12 Foundation; either version 2 of the License, or (at your option) any later
15 This program is distributed in the hope that it will be useful, but WITHOUT
16 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
20 You should have received a copy of the GNU Lesser General Public License along with
21 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
22 Place - Suite 330, Boston, MA 02111-1307, USA.
24 Further information about the GNU Lesser General Public License can also be found on
25 the world wide web at http://www.gnu.org.
28 --------------------------------------------------------------------------------
30 07/23/99 TP Added implementation of 1959 Standard Atmosphere
31 Moved calculation of Mach number to FGPropagate
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
36 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
38 #ifndef FGAtmosphere_H
39 #define FGAtmosphere_H
41 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
43 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
46 #include <math/FGColumnVector3.h>
48 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
50 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
52 #define ID_ATMOSPHERE "$Id$"
54 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
56 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
60 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
62 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
64 /** Models the 1976 Standard Atmosphere.
65 @author Tony Peden, Jon Berndt
67 @see Anderson, John D. "Introduction to Flight, Third Edition", McGraw-Hill,
68 1989, ISBN 0-07-001641-0
71 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
73 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
75 class FGAtmosphere : public FGModel {
79 FGAtmosphere(FGFDMExec*);
82 /** Runs the Atmosphere model; called by the Executive
83 @return false if no error */
86 enum tType {ttStandard, ttBerndt, ttCulp, ttNone} turbType;
88 /// Returns the temperature in degrees Rankine.
89 double GetTemperature(void) const {return *temperature;}
90 /** Returns the density in slugs/ft^3.
91 <i>This function may <b>only</b> be used if Run() is called first.</i> */
92 double GetDensity(void) const {return *density;}
93 /// Returns the pressure in psf.
94 double GetPressure(void) const {return *pressure;}
95 /// Returns the standard pressure at a specified altitude
96 double GetPressure(double altitude);
97 /// Returns the standard temperature at a specified altitude
98 double GetTemperature(double altitude);
99 /// Returns the standard density at a specified altitude
100 double GetDensity(double altitude);
101 /// Returns the speed of sound in ft/sec.
102 double GetSoundSpeed(void) const {return soundspeed;}
104 /// Returns the sea level temperature in degrees Rankine.
105 double GetTemperatureSL(void) const { return SLtemperature; }
106 /// Returns the sea level density in slugs/ft^3
107 double GetDensitySL(void) const { return SLdensity; }
108 /// Returns the sea level pressure in psf.
109 double GetPressureSL(void) const { return SLpressure; }
110 /// Returns the sea level speed of sound in ft/sec.
111 double GetSoundSpeedSL(void) const { return SLsoundspeed; }
113 /// Returns the ratio of at-altitude temperature over the sea level value.
114 double GetTemperatureRatio(void) const { return (*temperature)*rSLtemperature; }
115 /// Returns the ratio of at-altitude density over the sea level value.
116 double GetDensityRatio(void) const { return (*density)*rSLdensity; }
117 /// Returns the ratio of at-altitude pressure over the sea level value.
118 double GetPressureRatio(void) const { return (*pressure)*rSLpressure; }
119 /// Returns the ratio of at-altitude sound speed over the sea level value.
120 double GetSoundSpeedRatio(void) const { return soundspeed*rSLsoundspeed; }
122 /// Tells the simulator to use an externally calculated atmosphere model.
123 void UseExternal(void);
124 /// Tells the simulator to use the internal atmosphere model.
125 void UseInternal(void); //this is the default
126 /// Gets the boolean that tells if the external atmosphere model is being used.
127 bool External(void) { return useExternal; }
129 /// Provides the external atmosphere model with an interface to set the temperature.
130 void SetExTemperature(double t) { exTemperature=t; }
131 /// Provides the external atmosphere model with an interface to set the density.
132 void SetExDensity(double d) { exDensity=d; }
133 /// Provides the external atmosphere model with an interface to set the pressure.
134 void SetExPressure(double p) { exPressure=p; }
136 /// Sets the temperature deviation at sea-level in degrees Fahrenheit
137 void SetSLTempDev(double d) { T_dev_sl = d; }
138 /// Gets the temperature deviation at sea-level in degrees Fahrenheit
139 double GetSLTempDev(void) const { return T_dev_sl; }
140 /// Sets the current delta-T in degrees Fahrenheit
141 void SetDeltaT(double d) { delta_T = d; }
142 /// Gets the current delta-T in degrees Fahrenheit
143 double GetDeltaT(void) const { return delta_T; }
144 /// Gets the at-altitude temperature deviation in degrees Fahrenheit
145 double GetTempDev(void) const { return T_dev; }
146 /// Gets the density altitude in feet
147 double GetDensityAltitude(void) const { return density_altitude; }
149 // TOTAL WIND access functions (wind + gust + turbulence)
151 /// Retrieves the total wind components in NED frame.
152 FGColumnVector3& GetTotalWindNED(void) { return vTotalWindNED; }
154 /// Retrieves a total wind component in NED frame.
155 double GetTotalWindNED(int idx) const {return vTotalWindNED(idx);}
157 // WIND access functions
159 /// Sets the wind components in NED frame.
160 void SetWindNED(double wN, double wE, double wD) { vWindNED(1)=wN; vWindNED(2)=wE; vWindNED(3)=wD;}
162 /// Sets a wind component in NED frame.
163 void SetWindNED(int idx, double wind) { vWindNED(idx)=wind;}
165 /// Retrieves the wind components in NED frame.
166 FGColumnVector3& GetWindNED(void) { return vWindNED; }
168 /// Retrieves a wind component in NED frame.
169 double GetWindNED(int idx) const {return vWindNED(idx);}
171 /** Retrieves the direction that the wind is coming from.
172 The direction is defined as north=0 and increases counterclockwise.
173 The wind heading is returned in radians.*/
174 double GetWindPsi(void) const { return psiw; }
176 /** Sets the direction that the wind is coming from.
177 The direction is defined as north=0 and increases counterclockwise to 2*pi (radians). The
178 vertical component of wind is assumed to be zero - and is forcibly set to zero. This function
179 sets the vWindNED vector components based on the supplied direction. The magnitude of
180 the wind set in the vector is preserved (assuming the vertical component is non-zero).
181 @param dir wind direction in the horizontal plane, in radians.*/
182 void SetWindPsi(double dir);
184 void SetWindspeed(double speed);
186 double GetWindspeed(void) const;
188 // GUST access functions
190 /// Sets a gust component in NED frame.
191 void SetGustNED(int idx, double gust) { vGustNED(idx)=gust;}
193 /// Sets the gust components in NED frame.
194 void SetGustNED(double gN, double gE, double gD) { vGustNED(eNorth)=gN; vGustNED(eEast)=gE; vGustNED(eDown)=gD;}
196 /// Retrieves a gust component in NED frame.
197 double GetGustNED(int idx) const {return vGustNED(idx);}
199 /// Retrieves the gust components in NED frame.
200 FGColumnVector3& GetGustNED(void) {return vGustNED;}
202 /** Turbulence models available: ttStandard, ttBerndt, ttCulp, ttNone */
203 void SetTurbType(tType tt) {turbType = tt;}
204 tType GetTurbType() const {return turbType;}
206 void SetTurbGain(double tg) {TurbGain = tg;}
207 double GetTurbGain() const {return TurbGain;}
209 void SetTurbRate(double tr) {TurbRate = tr;}
210 double GetTurbRate() const {return TurbRate;}
212 void SetRhythmicity(double r) {Rhythmicity=r;}
213 double GetRhythmicity() const {return Rhythmicity;}
215 /** Sets wind vortex, clockwise as seen from a point in front of aircraft,
216 looking aft. Units are radians/second. */
217 void SetWindFromClockwise(double wC) { wind_from_clockwise=wC; }
218 double GetWindFromClockwise(void) const {return wind_from_clockwise;}
220 double GetTurbPQR(int idx) const {return vTurbPQR(idx);}
221 double GetTurbMagnitude(void) const {return Magnitude;}
222 FGColumnVector3& GetTurbDirection(void) {return vDirection;}
223 FGColumnVector3& GetTurbPQR(void) {return vTurbPQR;}
228 struct atmType {double Temperature; double Pressure; double Density;};
232 double StdSLtemperature,StdSLdensity,StdSLpressure,StdSLsoundspeed;
233 double rSLtemperature,rSLdensity,rSLpressure,rSLsoundspeed; //reciprocals
234 double SLtemperature,SLdensity,SLpressure,SLsoundspeed;
235 double *temperature, *density, *pressure;
238 double exTemperature,exDensity,exPressure;
239 double intTemperature, intDensity, intPressure;
240 double T_dev_sl, T_dev, delta_T, density_altitude;
242 bool StandardTempOnly;
245 double MagnitudedAccelDt, MagnitudeAccel, Magnitude;
249 double wind_from_clockwise;
250 double spike, target_time, strength;
251 FGColumnVector3 vDirectiondAccelDt;
252 FGColumnVector3 vDirectionAccel;
253 FGColumnVector3 vDirection;
254 FGColumnVector3 vTurbulenceGrad;
255 FGColumnVector3 vBodyTurbGrad;
256 FGColumnVector3 vTurbPQR;
259 FGColumnVector3 vTotalWindNED;
260 FGColumnVector3 vWindNED;
261 FGColumnVector3 vGustNED;
262 FGColumnVector3 vTurbulenceNED;
264 /// Calculate the atmosphere for the given altitude, including effects of temperature deviation.
265 void Calculate(double altitude);
266 /// Calculate atmospheric properties other than the basic T, P and rho.
267 void CalculateDerived(void);
268 /// Get T, P and rho for a standard atmosphere at the given altitude.
269 void GetStdAtmosphere(double altitude);
270 void Turbulence(void);
272 void Debug(int from);
275 } // namespace JSBSim
277 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%