Branch data Line data Source code
1 : : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2 : :
3 : : Header: FGAtmosphere.h
4 : : Author: Jon Berndt
5 : : Implementation of 1959 Standard Atmosphere added by Tony Peden
6 : : Date started: 11/24/98
7 : :
8 : : ------------- Copyright (C) 1999 Jon S. Berndt (jon@jsbsim.org) -------------
9 : :
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
13 : : version.
14 : :
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
18 : : details.
19 : :
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.
23 : :
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.
26 : :
27 : : HISTORY
28 : : --------------------------------------------------------------------------------
29 : : 11/24/98 JSB Created
30 : : 07/23/99 TP Added implementation of 1959 Standard Atmosphere
31 : : Moved calculation of Mach number to FGPropagate
32 : : Updated to '76 model
33 : :
34 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
35 : : SENTRY
36 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
37 : :
38 : : #ifndef FGAtmosphere_H
39 : : #define FGAtmosphere_H
40 : :
41 : : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
42 : : INCLUDES
43 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
44 : :
45 : : #include "FGModel.h"
46 : : #include "math/FGColumnVector3.h"
47 : :
48 : : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
49 : : DEFINITIONS
50 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
51 : :
52 : : #define ID_ATMOSPHERE "$Id: FGAtmosphere.h,v 1.22 2009/10/02 10:30:09 jberndt Exp $"
53 : :
54 : : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
55 : : FORWARD DECLARATIONS
56 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
57 : :
58 : : namespace JSBSim {
59 : :
60 : : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
61 : : CLASS DOCUMENTATION
62 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
63 : :
64 : : /** Models the 1976 Standard Atmosphere.
65 : : @author Tony Peden, Jon Berndt
66 : : @version $Id: FGAtmosphere.h,v 1.22 2009/10/02 10:30:09 jberndt Exp $
67 : : @see Anderson, John D. "Introduction to Flight, Third Edition", McGraw-Hill,
68 : : 1989, ISBN 0-07-001641-0
69 : : */
70 : :
71 : : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
72 : : CLASS DECLARATION
73 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
74 : :
75 : : class FGAtmosphere : public FGModel {
76 : : public:
77 : :
78 : : /// Constructor
79 : : FGAtmosphere(FGFDMExec*);
80 : : /// Destructor
81 : : ~FGAtmosphere();
82 : : /** Runs the Atmosphere model; called by the Executive
83 : : @return false if no error */
84 : : bool Run(void);
85 : : bool InitModel(void);
86 : : enum tType {ttNone, ttStandard, ttBerndt, ttCulp} turbType;
87 : :
88 : : /// Returns the temperature in degrees Rankine.
89 : 58915 : 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 : 166926 : double GetDensity(void) const {return *density;}
93 : : /// Returns the pressure in psf.
94 : 706976 : 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 : 216023 : double GetSoundSpeed(void) const {return soundspeed;}
103 : : /// Returns the absolute viscosity.
104 : 4909 : double GetAbsoluteViscosity(void) const {return intViscosity;}
105 : : /// Returns the kinematic viscosity.
106 : 58914 : double GetKinematicViscosity(void) const {return intKinematicViscosity;}
107 : :
108 : : /// Returns the sea level temperature in degrees Rankine.
109 : 1 : double GetTemperatureSL(void) const { return SLtemperature; }
110 : : /// Returns the sea level density in slugs/ft^3
111 : 54007 : double GetDensitySL(void) const { return SLdensity; }
112 : : /// Returns the sea level pressure in psf.
113 : 58916 : double GetPressureSL(void) const { return SLpressure; }
114 : : /// Returns the sea level speed of sound in ft/sec.
115 : 1 : double GetSoundSpeedSL(void) const { return SLsoundspeed; }
116 : :
117 : : /// Returns the ratio of at-altitude temperature over the sea level value.
118 : 1 : double GetTemperatureRatio(void) const { return (*temperature)*rSLtemperature; }
119 : : /// Returns the ratio of at-altitude density over the sea level value.
120 : 2 : double GetDensityRatio(void) const { return (*density)*rSLdensity; }
121 : : /// Returns the ratio of at-altitude pressure over the sea level value.
122 : 1 : double GetPressureRatio(void) const { return (*pressure)*rSLpressure; }
123 : : /// Returns the ratio of at-altitude sound speed over the sea level value.
124 : 1 : double GetSoundSpeedRatio(void) const { return soundspeed*rSLsoundspeed; }
125 : :
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; }
132 : :
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; }
139 : :
140 : : /// Sets the temperature deviation at sea-level in degrees Fahrenheit
141 : 0 : void SetSLTempDev(double d) { T_dev_sl = d; }
142 : : /// Gets the temperature deviation at sea-level in degrees Fahrenheit
143 : 1 : double GetSLTempDev(void) const { return T_dev_sl; }
144 : : /// Sets the current delta-T in degrees Fahrenheit
145 : 0 : void SetDeltaT(double d) { delta_T = d; }
146 : : /// Gets the current delta-T in degrees Fahrenheit
147 : 1 : 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 : 1 : double GetDensityAltitude(void) const { return density_altitude; }
152 : :
153 : : // TOTAL WIND access functions (wind + gust + turbulence)
154 : :
155 : : /// Retrieves the total wind components in NED frame.
156 : 58915 : FGColumnVector3& GetTotalWindNED(void) { return vTotalWindNED; }
157 : :
158 : : /// Retrieves a total wind component in NED frame.
159 : 3 : double GetTotalWindNED(int idx) const {return vTotalWindNED(idx);}
160 : :
161 : : // WIND access functions
162 : :
163 : : /// Sets the wind components in NED frame.
164 : 4 : void SetWindNED(double wN, double wE, double wD) { vWindNED(1)=wN; vWindNED(2)=wE; vWindNED(3)=wD;}
165 : :
166 : : /// Sets a wind component in NED frame.
167 : 0 : void SetWindNED(int idx, double wind) { vWindNED(idx)=wind;}
168 : :
169 : : /// Retrieves the wind components in NED frame.
170 : : FGColumnVector3& GetWindNED(void) { return vWindNED; }
171 : :
172 : : /// Retrieves a wind component in NED frame.
173 : 3 : double GetWindNED(int idx) const {return vWindNED(idx);}
174 : :
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 : 1 : double GetWindPsi(void) const { return psiw; }
179 : :
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);
187 : :
188 : : void SetWindspeed(double speed);
189 : :
190 : : double GetWindspeed(void) const;
191 : :
192 : : // GUST access functions
193 : :
194 : : /// Sets a gust component in NED frame.
195 : 0 : void SetGustNED(int idx, double gust) { vGustNED(idx)=gust;}
196 : :
197 : : /// Sets a turbulence component in NED frame.
198 : 0 : void SetTurbNED(int idx, double turb) { vTurbulenceNED(idx)=turb;}
199 : :
200 : : /// Sets the gust components in NED frame.
201 : : void SetGustNED(double gN, double gE, double gD) { vGustNED(eNorth)=gN; vGustNED(eEast)=gE; vGustNED(eDown)=gD;}
202 : :
203 : : /// Retrieves a gust component in NED frame.
204 : 3 : double GetGustNED(int idx) const {return vGustNED(idx);}
205 : :
206 : : /// Retrieves a turbulence component in NED frame.
207 : 3 : double GetTurbNED(int idx) const {return vTurbulenceNED(idx);}
208 : :
209 : : /// Retrieves the gust components in NED frame.
210 : : FGColumnVector3& GetGustNED(void) {return vGustNED;}
211 : :
212 : : /** Turbulence models available: ttNone, ttStandard, ttBerndt, ttCulp */
213 : 0 : void SetTurbType(tType tt) {turbType = tt;}
214 : 1 : tType GetTurbType() const {return turbType;}
215 : :
216 : 0 : void SetTurbGain(double tg) {TurbGain = tg;}
217 : 1 : double GetTurbGain() const {return TurbGain;}
218 : :
219 : 0 : void SetTurbRate(double tr) {TurbRate = tr;}
220 : 1 : double GetTurbRate() const {return TurbRate;}
221 : :
222 : 0 : void SetRhythmicity(double r) {Rhythmicity=r;}
223 : 1 : double GetRhythmicity() const {return Rhythmicity;}
224 : :
225 : 3 : double GetTurbPQR(int idx) const {return vTurbPQR(idx);}
226 : 4909 : double GetTurbMagnitude(void) const {return Magnitude;}
227 : 4909 : FGColumnVector3& GetTurbDirection(void) {return vDirection;}
228 : 54005 : FGColumnVector3& GetTurbPQR(void) {return vTurbPQR;}
229 : :
230 : : protected:
231 : : double rho;
232 : :
233 : : struct atmType {double Temperature; double Pressure; double Density;};
234 : : int lastIndex;
235 : : double h;
236 : : double htab[8];
237 : : double StdSLtemperature,StdSLdensity,StdSLpressure,StdSLsoundspeed;
238 : : double rSLtemperature,rSLdensity,rSLpressure,rSLsoundspeed; //reciprocals
239 : : double SLtemperature,SLdensity,SLpressure,SLsoundspeed;
240 : : double *temperature, *density, *pressure;
241 : : double soundspeed;
242 : : bool useExternal;
243 : : double exTemperature,exDensity,exPressure;
244 : : double intTemperature, intDensity, intPressure;
245 : : double SutherlandConstant, Beta, intViscosity, intKinematicViscosity;
246 : : double T_dev_sl, T_dev, delta_T, density_altitude;
247 : : atmType atmosphere;
248 : : bool StandardTempOnly;
249 : : bool first_pass;
250 : :
251 : : double MagnitudedAccelDt, MagnitudeAccel, Magnitude;
252 : : double TurbGain;
253 : : double TurbRate;
254 : : double Rhythmicity;
255 : : double wind_from_clockwise;
256 : : double spike, target_time, strength;
257 : : FGColumnVector3 vDirectiondAccelDt;
258 : : FGColumnVector3 vDirectionAccel;
259 : : FGColumnVector3 vDirection;
260 : : FGColumnVector3 vTurbulenceGrad;
261 : : FGColumnVector3 vBodyTurbGrad;
262 : : FGColumnVector3 vTurbPQR;
263 : :
264 : : double psiw;
265 : : FGColumnVector3 vTotalWindNED;
266 : : FGColumnVector3 vWindNED;
267 : : FGColumnVector3 vGustNED;
268 : : FGColumnVector3 vTurbulenceNED;
269 : :
270 : : /// Calculate the atmosphere for the given altitude, including effects of temperature deviation.
271 : : void Calculate(double altitude);
272 : : /// Calculate atmospheric properties other than the basic T, P and rho.
273 : : void CalculateDerived(void);
274 : : /// Get T, P and rho for a standard atmosphere at the given altitude.
275 : : void GetStdAtmosphere(double altitude);
276 : : void Turbulence(void);
277 : : void bind(void);
278 : : void Debug(int from);
279 : : };
280 : :
281 : : } // namespace JSBSim
282 : :
283 : : //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
284 : : #endif
285 : :
|