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;}
103 /// Returns the absolute viscosity.
104 double GetAbsoluteViscosity(void) const {return intViscosity;}
105 /// Returns the kinematic viscosity.
106 double GetKinematicViscosity(void) const {return intKinematicViscosity;}
108 /// Returns the sea level temperature in degrees Rankine.
109 double GetTemperatureSL(void) const { return SLtemperature; }
110 /// Returns the sea level density in slugs/ft^3
111 double GetDensitySL(void) const { return SLdensity; }
112 /// Returns the sea level pressure in psf.
113 double GetPressureSL(void) const { return SLpressure; }
114 /// Returns the sea level speed of sound in ft/sec.
115 double GetSoundSpeedSL(void) const { return SLsoundspeed; }
117 /// Returns the ratio of at-altitude temperature over the sea level value.
118 double GetTemperatureRatio(void) const { return (*temperature)*rSLtemperature; }
119 /// Returns the ratio of at-altitude density over the sea level value.
120 double GetDensityRatio(void) const { return (*density)*rSLdensity; }
121 /// Returns the ratio of at-altitude pressure over the sea level value.
122 double GetPressureRatio(void) const { return (*pressure)*rSLpressure; }
123 /// Returns the ratio of at-altitude sound speed over the sea level value.
124 double GetSoundSpeedRatio(void) const { return soundspeed*rSLsoundspeed; }
126 /// Tells the simulator to use an externally calculated atmosphere model.
127 void UseExternal(void);
128 /// Tells the simulator to use the internal atmosphere model.
129 void UseInternal(void); //this is the default
130 /// Gets the boolean that tells if the external atmosphere model is being used.
131 bool External(void) { return useExternal; }
133 /// Provides the external atmosphere model with an interface to set the temperature.
134 void SetExTemperature(double t) { exTemperature=t; }
135 /// Provides the external atmosphere model with an interface to set the density.
136 void SetExDensity(double d) { exDensity=d; }
137 /// Provides the external atmosphere model with an interface to set the pressure.
138 void SetExPressure(double p) { exPressure=p; }
140 /// Sets the temperature deviation at sea-level in degrees Fahrenheit
141 void SetSLTempDev(double d) { T_dev_sl = d; }
142 /// Gets the temperature deviation at sea-level in degrees Fahrenheit
143 double GetSLTempDev(void) const { return T_dev_sl; }
144 /// Sets the current delta-T in degrees Fahrenheit
145 void SetDeltaT(double d) { delta_T = d; }
146 /// Gets the current delta-T in degrees Fahrenheit
147 double GetDeltaT(void) const { return delta_T; }
148 /// Gets the at-altitude temperature deviation in degrees Fahrenheit
149 double GetTempDev(void) const { return T_dev; }
150 /// Gets the density altitude in feet
151 double GetDensityAltitude(void) const { return density_altitude; }
153 // TOTAL WIND access functions (wind + gust + turbulence)
155 /// Retrieves the total wind components in NED frame.
156 FGColumnVector3& GetTotalWindNED(void) { return vTotalWindNED; }
158 /// Retrieves a total wind component in NED frame.
159 double GetTotalWindNED(int idx) const {return vTotalWindNED(idx);}
161 // WIND access functions
163 /// Sets the wind components in NED frame.
164 void SetWindNED(double wN, double wE, double wD) { vWindNED(1)=wN; vWindNED(2)=wE; vWindNED(3)=wD;}
166 /// Sets a wind component in NED frame.
167 void SetWindNED(int idx, double wind) { vWindNED(idx)=wind;}
169 /// Retrieves the wind components in NED frame.
170 FGColumnVector3& GetWindNED(void) { return vWindNED; }
172 /// Retrieves a wind component in NED frame.
173 double GetWindNED(int idx) const {return vWindNED(idx);}
175 /** Retrieves the direction that the wind is coming from.
176 The direction is defined as north=0 and increases counterclockwise.
177 The wind heading is returned in radians.*/
178 double GetWindPsi(void) const { return psiw; }
180 /** Sets the direction that the wind is coming from.
181 The direction is defined as north=0 and increases counterclockwise to 2*pi (radians). The
182 vertical component of wind is assumed to be zero - and is forcibly set to zero. This function
183 sets the vWindNED vector components based on the supplied direction. The magnitude of
184 the wind set in the vector is preserved (assuming the vertical component is non-zero).
185 @param dir wind direction in the horizontal plane, in radians.*/
186 void SetWindPsi(double dir);
188 void SetWindspeed(double speed);
190 double GetWindspeed(void) const;
192 // GUST access functions
194 /// Sets a gust component in NED frame.
195 void SetGustNED(int idx, double gust) { vGustNED(idx)=gust;}
197 /// Sets the gust components in NED frame.
198 void SetGustNED(double gN, double gE, double gD) { vGustNED(eNorth)=gN; vGustNED(eEast)=gE; vGustNED(eDown)=gD;}
200 /// Retrieves a gust component in NED frame.
201 double GetGustNED(int idx) const {return vGustNED(idx);}
203 /// Retrieves the gust components in NED frame.
204 FGColumnVector3& GetGustNED(void) {return vGustNED;}
206 /** Turbulence models available: ttStandard, ttBerndt, ttCulp, ttNone */
207 void SetTurbType(tType tt) {turbType = tt;}
208 tType GetTurbType() const {return turbType;}
210 void SetTurbGain(double tg) {TurbGain = tg;}
211 double GetTurbGain() const {return TurbGain;}
213 void SetTurbRate(double tr) {TurbRate = tr;}
214 double GetTurbRate() const {return TurbRate;}
216 void SetRhythmicity(double r) {Rhythmicity=r;}
217 double GetRhythmicity() const {return Rhythmicity;}
219 /** Sets wind vortex, clockwise as seen from a point in front of aircraft,
220 looking aft. Units are radians/second. */
221 void SetWindFromClockwise(double wC) { wind_from_clockwise=wC; }
222 double GetWindFromClockwise(void) const {return wind_from_clockwise;}
224 double GetTurbPQR(int idx) const {return vTurbPQR(idx);}
225 double GetTurbMagnitude(void) const {return Magnitude;}
226 FGColumnVector3& GetTurbDirection(void) {return vDirection;}
227 FGColumnVector3& GetTurbPQR(void) {return vTurbPQR;}
232 struct atmType {double Temperature; double Pressure; double Density;};
236 double StdSLtemperature,StdSLdensity,StdSLpressure,StdSLsoundspeed;
237 double rSLtemperature,rSLdensity,rSLpressure,rSLsoundspeed; //reciprocals
238 double SLtemperature,SLdensity,SLpressure,SLsoundspeed;
239 double *temperature, *density, *pressure;
242 double exTemperature,exDensity,exPressure;
243 double intTemperature, intDensity, intPressure;
244 double SutherlandConstant, Beta, intViscosity, intKinematicViscosity;
245 double T_dev_sl, T_dev, delta_T, density_altitude;
247 bool StandardTempOnly;
250 double MagnitudedAccelDt, MagnitudeAccel, Magnitude;
254 double wind_from_clockwise;
255 double spike, target_time, strength;
256 FGColumnVector3 vDirectiondAccelDt;
257 FGColumnVector3 vDirectionAccel;
258 FGColumnVector3 vDirection;
259 FGColumnVector3 vTurbulenceGrad;
260 FGColumnVector3 vBodyTurbGrad;
261 FGColumnVector3 vTurbPQR;
264 FGColumnVector3 vTotalWindNED;
265 FGColumnVector3 vWindNED;
266 FGColumnVector3 vGustNED;
267 FGColumnVector3 vTurbulenceNED;
269 /// Calculate the atmosphere for the given altitude, including effects of temperature deviation.
270 void Calculate(double altitude);
271 /// Calculate atmospheric properties other than the basic T, P and rho.
272 void CalculateDerived(void);
273 /// Get T, P and rho for a standard atmosphere at the given altitude.
274 void GetStdAtmosphere(double altitude);
275 void Turbulence(void);
277 void Debug(int from);
280 } // namespace JSBSim
282 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%