Header: FGAtmosphere.h
Author: Jon Berndt
- Implementation of 1959 Standard Atmosphere added by Tony Peden
- Date started: 11/24/98
+ Date started: 6/2011
- ------------- Copyright (C) 1999 Jon S. Berndt (jon@jsbsim.org) -------------
+ ------------- Copyright (C) 2011 Jon S. Berndt (jon@jsbsim.org) -------------
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the Free Software
HISTORY
--------------------------------------------------------------------------------
-11/24/98 JSB Created
-07/23/99 TP Added implementation of 1959 Standard Atmosphere
- Moved calculation of Mach number to FGPropagate
- Updated to '76 model
+5/2011 JSB Created
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SENTRY
INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-#include "FGModel.h"
-#include "math/FGColumnVector3.h"
-#include "math/FGTable.h"
+#include <vector>
+#include "models/FGModel.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-#define ID_ATMOSPHERE "$Id: FGAtmosphere.h,v 1.26 2011/05/20 03:18:36 jberndt Exp $"
+#define ID_ATMOSPHERE "$Id: FGAtmosphere.h,v 1.30 2012/04/13 13:18:28 jberndt Exp $"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FORWARD DECLARATIONS
CLASS DOCUMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-/** Models the 1976 Standard Atmosphere.
- @author Tony Peden, Jon Berndt
- @version $Id: FGAtmosphere.h,v 1.26 2011/05/20 03:18:36 jberndt Exp $
- @see Anderson, John D. "Introduction to Flight, Third Edition", McGraw-Hill,
- 1989, ISBN 0-07-001641-0
-
- Additionally, various turbulence models are available. They are specified
- via the property <tt>atmosphere/turb-type</tt>. The following models are
- available:
- - 0: ttNone (turbulence disabled)
- - 1: ttStandard
- - 2: ttBerndt
- - 3: ttCulp
- - 4: ttMilspec (Dryden spectrum)
- - 5: ttTustin (Dryden spectrum)
-
- The Milspec and Tustin models are described in the Yeager report cited below.
- They both use a Dryden spectrum model whose parameters (scale lengths and intensities)
- are modelled according to MIL-F-8785C. Parameters are modelled differently
- for altitudes below 1000ft and above 2000ft, for altitudes in between they
- are interpolated linearly.
-
- The two models differ in the implementation of the transfer functions
- described in the milspec.
-
- To use one of these two models, set <tt>atmosphere/turb-type</tt> to 4 resp. 5,
- and specify values for <tt>atmosphere/turbulence/milspec/windspeed_at_20ft_AGL-fps<tt>
- and <tt>atmosphere/turbulence/milspec/severity<tt> (the latter corresponds to
- the probability of exceedence curves from Fig. 7 of the milspec, allowable
- range is 0 (disabled) to 7). <tt>atmosphere/psiw-rad</tt> is respected as well;
- note that you have to specify a positive wind magnitude to prevent psiw from
- being reset to zero.
-
- Reference values (cf. figures 7 and 9 from the milspec):
- <table>
- <tr><td><b>Intensity</b></td>
- <td><b><tt>windspeed_at_20ft_AGL-fps</tt></b></td>
- <td><b><tt>severity</tt></b></td></tr>
- <tr><td>light</td>
- <td>25 (15 knots)</td>
- <td>3</td></tr>
- <tr><td>moderate</td>
- <td>50 (30 knots)</td>
- <td>4</td></tr>
- <tr><td>severe</td>
- <td>75 (45 knots)</td>
- <td>6</td></tr>
- </table>
-
- @see Yeager, Jessie C.: "Implementation and Testing of Turbulence Models for
- the F18-HARV" (<a
- href="http://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19980028448_1998081596.pdf">
- pdf</a>), NASA CR-1998-206937, 1998
-
- @see MIL-F-8785C: Military Specification: Flying Qualities of Piloted Aircraft
-
+/** Models an empty, abstract base atmosphere class.
+
+ <h2> Properties </h2>
+ @property atmosphere/T-R The current modeled temperature in degrees Rankine.
+ @property atmosphere/rho-slugs_ft3
+ @property atmosphere/P-psf
+ @property atmosphere/a-fps
+ @property atmosphere/T-sl-R
+ @property atmosphere/rho-sl-slugs_ft3
+ @property atmosphere/P-sl-psf
+ @property atmosphere/a-sl-fps
+ @property atmosphere/theta
+ @property atmosphere/sigma
+ @property atmosphere/delta
+ @property atmosphere/a-ratio
+
+ @author Jon Berndt
+ @version $Id: FGAtmosphere.h,v 1.30 2012/04/13 13:18:28 jberndt Exp $
*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
class FGAtmosphere : public FGModel {
public:
+ /// Enums for specifying temperature units.
+ enum eTemperature {eNoTempUnit=0, eFahrenheit, eCelsius, eRankine, eKelvin};
+
+ /// Enums for specifying pressure units.
+ enum ePressure {eNoPressUnit=0, ePSF, eMillibars, ePascals, eInchesHg};
+
/// Constructor
FGAtmosphere(FGFDMExec*);
+
/// Destructor
- ~FGAtmosphere();
- /** Runs the Atmosphere model; called by the Executive
+ virtual ~FGAtmosphere();
+
+ /** Runs the atmosphere forces model; called by the Executive.
Can pass in a value indicating if the executive is directing the simulation to Hold.
@param Holding if true, the executive has been directed to hold the sim from
advancing time. Some models may ignore this flag, such as the Input
"Resume" command to be given.
@return false if no error */
bool Run(bool Holding);
+
bool InitModel(void);
- enum tType {ttNone, ttStandard, ttCulp, ttMilspec, ttTustin} turbType;
- /// Returns the temperature in degrees Rankine.
- virtual double GetTemperature(void) const {return *temperature;}
- /** Returns the density in slugs/ft^3.
- <i>This function may <b>only</b> be used if Run() is called first.</i> */
- virtual double GetDensity(void) const {return *density;}
+ // *************************************************************************
+ /// @name Temperature access functions.
+ /// There are several ways to get the temperature, and several modeled temperature
+ /// values that can be retrieved.
+ // @{
+ /// Returns the actual, modeled temperature at the current altitude in degrees Rankine.
+ /// @return Modeled temperature in degrees Rankine.
+ virtual double GetTemperature() const {return Temperature;}
+
+ /// Returns the actual modeled temperature in degrees Rankine at a specified altitude.
+ /// @param altitude The altitude above sea level (ASL) in feet.
+ /// @return Modeled temperature in degrees Rankine at the specified altitude.
+ virtual double GetTemperature(double altitude) const = 0;
+
+ /// Returns the actual, modeled sea level temperature in degrees Rankine.
+ /// @return The modeled temperature in degrees Rankine at sea level.
+ virtual double GetTemperatureSL() const { return GetTemperature(0.0); }
+
+ /// Returns the ratio of the at-current-altitude temperature as modeled
+ /// over the sea level value.
+ virtual double GetTemperatureRatio() const { return GetTemperature()*rSLtemperature; }
+
+ /// Returns the ratio of the temperature as modeled at the supplied altitude
+ /// over the sea level value.
+ virtual double GetTemperatureRatio(double h) const { return GetTemperature(h)*rSLtemperature; }
+
+ /// Sets the Sea Level temperature.
+ /// @param t the temperature value in the unit provided.
+ /// @param unit the unit of the temperature.
+ virtual void SetTemperatureSL(double t, eTemperature unit=eFahrenheit);
+
+ /// Sets the temperature at the supplied altitude.
+ /// @param t The temperature value in the unit provided.
+ /// @param h The altitude in feet above sea level.
+ /// @param unit The unit of the temperature.
+ virtual void SetTemperature(double t, double h, eTemperature unit=eFahrenheit) = 0;
+ //@}
+
+ // *************************************************************************
+ /// @name Pressure access functions.
+ //@{
/// Returns the pressure in psf.
- virtual double GetPressure(void) const {return *pressure;}
- /// Returns the standard pressure at a specified altitude
- virtual double GetPressure(double altitude);
- /// Returns the standard temperature at a specified altitude
- virtual double GetTemperature(double altitude);
- /// Returns the standard density at a specified altitude
- virtual double GetDensity(double altitude);
- /// Returns the speed of sound in ft/sec.
- virtual double GetSoundSpeed(void) const {return soundspeed;}
- /// Returns the absolute viscosity.
- virtual double GetAbsoluteViscosity(void) const {return intViscosity;}
- /// Returns the kinematic viscosity.
- virtual double GetKinematicViscosity(void) const {return intKinematicViscosity;}
+ virtual double GetPressure(void) const {return Pressure;}
+
+ /// Returns the pressure at a specified altitude in psf.
+ virtual double GetPressure(double altitude) const = 0;
- /// Returns the sea level temperature in degrees Rankine.
- virtual double GetTemperatureSL(void) const { return SLtemperature; }
- /// Returns the sea level density in slugs/ft^3
- virtual double GetDensitySL(void) const { return SLdensity; }
/// Returns the sea level pressure in psf.
virtual double GetPressureSL(void) const { return SLpressure; }
- /// Returns the sea level speed of sound in ft/sec.
- virtual double GetSoundSpeedSL(void) const { return SLsoundspeed; }
- /// Returns the ratio of at-altitude temperature over the sea level value.
- virtual double GetTemperatureRatio(void) const { return (*temperature)*rSLtemperature; }
- /// Returns the ratio of at-altitude density over the sea level value.
- virtual double GetDensityRatio(void) const { return (*density)*rSLdensity; }
/// Returns the ratio of at-altitude pressure over the sea level value.
- virtual double GetPressureRatio(void) const { return (*pressure)*rSLpressure; }
- /// Returns the ratio of at-altitude sound speed over the sea level value.
- virtual double GetSoundSpeedRatio(void) const { return soundspeed*rSLsoundspeed; }
-
- /// Tells the simulator to use an externally calculated atmosphere model.
- virtual void UseExternal(void);
- /// Tells the simulator to use the internal atmosphere model.
- virtual void UseInternal(void); //this is the default
- /// Gets the boolean that tells if the external atmosphere model is being used.
- virtual bool External(void) { return useExternal; }
-
- /// Provides the external atmosphere model with an interface to set the temperature.
- virtual void SetExTemperature(double t) { exTemperature=t; }
- /// Provides the external atmosphere model with an interface to set the density.
- virtual void SetExDensity(double d) { exDensity=d; }
- /// Provides the external atmosphere model with an interface to set the pressure.
- virtual void SetExPressure(double p) { exPressure=p; }
-
- /// Sets the temperature deviation at sea-level in degrees Fahrenheit
- virtual void SetSLTempDev(double d) { T_dev_sl = d; }
- /// Gets the temperature deviation at sea-level in degrees Fahrenheit
- virtual double GetSLTempDev(void) const { return T_dev_sl; }
- /// Sets the current delta-T in degrees Fahrenheit
- virtual void SetDeltaT(double d) { delta_T = d; }
- /// Gets the current delta-T in degrees Fahrenheit
- virtual double GetDeltaT(void) const { return delta_T; }
- /// Gets the at-altitude temperature deviation in degrees Fahrenheit
- virtual double GetTempDev(void) const { return T_dev; }
- /// Gets the density altitude in feet
- virtual double GetDensityAltitude(void) const { return density_altitude; }
-
- // TOTAL WIND access functions (wind + gust + turbulence)
-
- /// Retrieves the total wind components in NED frame.
- virtual const FGColumnVector3& GetTotalWindNED(void) const { return vTotalWindNED; }
-
- /// Retrieves a total wind component in NED frame.
- virtual double GetTotalWindNED(int idx) const {return vTotalWindNED(idx);}
-
- // WIND access functions
-
- /// Sets the wind components in NED frame.
- virtual void SetWindNED(double wN, double wE, double wD) { vWindNED(1)=wN; vWindNED(2)=wE; vWindNED(3)=wD;}
-
- /// Sets a wind component in NED frame.
- virtual void SetWindNED(int idx, double wind) { vWindNED(idx)=wind;}
-
- /// Retrieves the wind components in NED frame.
- virtual FGColumnVector3& GetWindNED(void) { return vWindNED; }
-
- /// Retrieves a wind component in NED frame.
- virtual double GetWindNED(int idx) const {return vWindNED(idx);}
-
- /** Retrieves the direction that the wind is coming from.
- The direction is defined as north=0 and increases counterclockwise.
- The wind heading is returned in radians.*/
- virtual double GetWindPsi(void) const { return psiw; }
-
- /** Sets the direction that the wind is coming from.
- The direction is defined as north=0 and increases counterclockwise to 2*pi (radians). The
- vertical component of wind is assumed to be zero - and is forcibly set to zero. This function
- sets the vWindNED vector components based on the supplied direction. The magnitude of
- the wind set in the vector is preserved (assuming the vertical component is non-zero).
- @param dir wind direction in the horizontal plane, in radians.*/
- virtual void SetWindPsi(double dir);
+ virtual double GetPressureRatio(void) const { return Pressure*rSLpressure; }
+
+ /** Sets the sea level pressure for modeling.
+ @param pressure The pressure in the units specified.
+ @param unit the unit of measure that the specified pressure is
+ supplied in.*/
+ virtual void SetPressureSL(ePressure unit, double pressure);
+ //@}
+
+ // *************************************************************************
+ /// @name Density access functions.
+ //@{
+ /** Returns the density in slugs/ft^3.
+ This function may only be used if Run() is called first. */
+ virtual double GetDensity(void) const {return Density;}
- virtual void SetWindspeed(double speed);
+ /** Returns the density in slugs/ft^3 at a given altitude in ft. */
+ virtual double GetDensity(double altitude) const;
- virtual double GetWindspeed(void) const;
+ /// Returns the sea level density in slugs/ft^3
+ virtual double GetDensitySL(void) const { return SLdensity; }
- // GUST access functions
+ /// Returns the ratio of at-altitude density over the sea level value.
+ virtual double GetDensityRatio(void) const { return Density*rSLdensity; }
+ //@}
- /// Sets a gust component in NED frame.
- virtual void SetGustNED(int idx, double gust) { vGustNED(idx)=gust;}
+ // *************************************************************************
+ /// @name Speed of sound access functions.
+ //@{
+ /// Returns the speed of sound in ft/sec.
+ virtual double GetSoundSpeed(void) const {return Soundspeed;}
- /// Sets a turbulence component in NED frame.
- virtual void SetTurbNED(int idx, double turb) { vTurbulenceNED(idx)=turb;}
+ /// Returns the sea level speed of sound in ft/sec.
+ virtual double GetSoundSpeedSL(void) const { return SLsoundspeed; }
- /// Sets the gust components in NED frame.
- virtual void SetGustNED(double gN, double gE, double gD) { vGustNED(eNorth)=gN; vGustNED(eEast)=gE; vGustNED(eDown)=gD;}
+ /// Returns the ratio of at-altitude sound speed over the sea level value.
+ virtual double GetSoundSpeedRatio(void) const { return Soundspeed*rSLsoundspeed; }
+ //@}
- /// Retrieves a gust component in NED frame.
- virtual double GetGustNED(int idx) const {return vGustNED(idx);}
+ // *************************************************************************
+ /// @name Viscosity access functions.
+ //@{
+ /// Returns the absolute viscosity.
+ virtual double GetAbsoluteViscosity(void) const {return Viscosity;}
- /// Retrieves a turbulence component in NED frame.
- virtual double GetTurbNED(int idx) const {return vTurbulenceNED(idx);}
+ /// Returns the kinematic viscosity.
+ virtual double GetKinematicViscosity(void) const {return KinematicViscosity;}
+ //@}
- /// Retrieves the gust components in NED frame.
- virtual FGColumnVector3& GetGustNED(void) {return vGustNED;}
+ virtual double GetDensityAltitude() const {return DensityAltitude;}
- /** Turbulence models available: ttNone, ttStandard, ttBerndt, ttCulp, ttMilspec, ttTustin */
- virtual void SetTurbType(tType tt) {turbType = tt;}
- virtual tType GetTurbType() const {return turbType;}
+ virtual double GetPressureAltitude() const {return PressureAltitude;}
- virtual void SetTurbGain(double tg) {TurbGain = tg;}
- virtual double GetTurbGain() const {return TurbGain;}
+ struct Inputs {
+ double altitudeASL;
+ } in;
- virtual void SetTurbRate(double tr) {TurbRate = tr;}
- virtual double GetTurbRate() const {return TurbRate;}
+protected:
+ double SLtemperature, SLdensity, SLpressure, SLsoundspeed; // Sea level conditions
+ double Temperature, Density, Pressure, Soundspeed; // Current actual conditions at altitude
+ double rSLtemperature, rSLdensity, rSLpressure, rSLsoundspeed; // Reciprocal of sea level conditions
- virtual void SetRhythmicity(double r) {Rhythmicity=r;}
- virtual double GetRhythmicity() const {return Rhythmicity;}
+ double PressureAltitude;
+ double DensityAltitude;
- virtual double GetTurbPQR(int idx) const {return vTurbPQR(idx);}
- virtual double GetTurbMagnitude(void) const {return Magnitude;}
- virtual const FGColumnVector3& GetTurbDirection(void) const {return vDirection;}
- virtual const FGColumnVector3& GetTurbPQR(void) const {return vTurbPQR;}
+ const double SutherlandConstant, Beta;
+ double Viscosity, KinematicViscosity;
- virtual void SetWindspeed20ft(double ws) { windspeed_at_20ft = ws;}
- virtual double GetWindspeed20ft() const { return windspeed_at_20ft;}
+ /// Calculate the atmosphere for the given altitude.
+ void Calculate(double altitude);
- /// allowable range: 0-7, 3=light, 4=moderate, 6=severe turbulence
- virtual void SetProbabilityOfExceedence( int idx) {probability_of_exceedence_index = idx;}
- virtual int GetProbabilityOfExceedence() const { return probability_of_exceedence_index;}
+ // Converts to Rankine from one of several unit systems.
+ virtual double ConvertToRankine(double t, eTemperature unit) const;
+
+ // Converts to PSF (pounds per square foot) from one of several unit systems.
+ virtual double ConvertToPSF(double t, ePressure unit=ePSF) const;
-protected:
- double rho;
-
- struct atmType {double Temperature; double Pressure; double Density;};
- int lastIndex;
- double h;
- double htab[8];
- double StdSLtemperature,StdSLdensity,StdSLpressure,StdSLsoundspeed;
- double rSLtemperature,rSLdensity,rSLpressure,rSLsoundspeed; //reciprocals
- double SLtemperature,SLdensity,SLpressure,SLsoundspeed;
- double *temperature, *density, *pressure;
- double soundspeed;
- bool useExternal;
- double exTemperature,exDensity,exPressure;
- double intTemperature, intDensity, intPressure;
- double SutherlandConstant, Beta, intViscosity, intKinematicViscosity;
- double T_dev_sl, T_dev, delta_T, density_altitude;
- atmType atmosphere;
- bool StandardTempOnly;
- bool first_pass;
-
- double MagnitudedAccelDt, MagnitudeAccel, Magnitude;
- double TurbGain;
- double TurbRate;
- double Rhythmicity;
- double wind_from_clockwise;
- double spike, target_time, strength;
- FGColumnVector3 vDirectiondAccelDt;
- FGColumnVector3 vDirectionAccel;
- FGColumnVector3 vDirection;
- FGColumnVector3 vTurbulenceGrad;
- FGColumnVector3 vBodyTurbGrad;
- FGColumnVector3 vTurbPQR;
-
- // Dryden turbulence model
- double windspeed_at_20ft; ///< in ft/s
- int probability_of_exceedence_index; ///< this is bound as the severity property
- FGTable *POE_Table; ///< probability of exceedence table
-
- double psiw;
- FGColumnVector3 vTotalWindNED;
- FGColumnVector3 vWindNED;
- FGColumnVector3 vGustNED;
- FGColumnVector3 vTurbulenceNED;
-
- /// Calculate the atmosphere for the given altitude, including effects of temperature deviation.
- void Calculate(double altitude);
- /// Calculate atmospheric properties other than the basic T, P and rho.
- void CalculateDerived(void);
- /// Get T, P and rho for a standard atmosphere at the given altitude.
- void GetStdAtmosphere(double altitude);
- void Turbulence(void);
virtual void bind(void);
void Debug(int from);
};