X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FFDM%2FJSBSim%2Fmodels%2FFGAtmosphere.h;h=57c6f87f8a43ef016b0597a3bce6f1fc495956e1;hb=024ef128e3395e8c0e32b360abe19b4d345e4f80;hp=3dd6fa322b333b81417825d68f4905fd3151f9ad;hpb=674a295896a1e56d605f39874262d6f146a586a3;p=flightgear.git diff --git a/src/FDM/JSBSim/models/FGAtmosphere.h b/src/FDM/JSBSim/models/FGAtmosphere.h index 3dd6fa322..57c6f87f8 100644 --- a/src/FDM/JSBSim/models/FGAtmosphere.h +++ b/src/FDM/JSBSim/models/FGAtmosphere.h @@ -2,10 +2,9 @@ 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 @@ -26,10 +25,7 @@ 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 @@ -42,15 +38,14 @@ SENTRY INCLUDES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ -#include "FGModel.h" -#include "math/FGColumnVector3.h" -#include "math/FGTable.h" +#include +#include "models/FGModel.h" /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% DEFINITIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ -#define ID_ATMOSPHERE "$Id: FGAtmosphere.h,v 1.24 2010/11/18 12:38:06 jberndt Exp $" +#define ID_ATMOSPHERE "$Id: FGAtmosphere.h,v 1.30 2012/04/13 13:18:28 jberndt Exp $" /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% FORWARD DECLARATIONS @@ -62,62 +57,24 @@ namespace JSBSim { CLASS DOCUMENTATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ -/** Models the 1976 Standard Atmosphere. - @author Tony Peden, Jon Berndt - @version $Id: FGAtmosphere.h,v 1.24 2010/11/18 12:38:06 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 atmosphere/turb-type. 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 atmosphere/turb-type to 4 resp. 5, - and specify values for atmosphere/turbulence/milspec/windspeed_at_20ft_AGL-fps - and atmosphere/turbulence/milspec/severity (the latter corresponds to - the probability of exceedence curves from Fig. 7 of the milspec, allowable - range is 0 (disabled) to 7). atmosphere/psiw-rad 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): - - - - - - - - - - - - - -
Intensitywindspeed_at_20ft_AGL-fpsseverity
light25 (15 knots)3
moderate50 (30 knots)4
severe75 (45 knots)6
- - @see Yeager, Jessie C.: "Implementation and Testing of Turbulence Models for - the F18-HARV" ( - pdf), NASA CR-1998-206937, 1998 - - @see MIL-F-8785C: Military Specification: Flying Qualities of Piloted Aircraft - +/** Models an empty, abstract base atmosphere class. + +

Properties

+ @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 $ */ /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -127,218 +84,158 @@ CLASS DECLARATION 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 + model, which may need to be active to listen on a socket for the + "Resume" command to be given. @return false if no error */ - bool Run(void); + bool Run(bool Holding); + bool InitModel(void); - enum tType {ttNone, ttStandard, ttBerndt, ttCulp, ttMilspec, ttTustin} turbType; - /// Returns the temperature in degrees Rankine. - double GetTemperature(void) const {return *temperature;} - /** Returns the density in slugs/ft^3. - This function may only be used if Run() is called first. */ - 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. - double GetPressure(void) const {return *pressure;} - /// Returns the standard pressure at a specified altitude - double GetPressure(double altitude); - /// Returns the standard temperature at a specified altitude - double GetTemperature(double altitude); - /// Returns the standard density at a specified altitude - double GetDensity(double altitude); - /// Returns the speed of sound in ft/sec. - double GetSoundSpeed(void) const {return soundspeed;} - /// Returns the absolute viscosity. - double GetAbsoluteViscosity(void) const {return intViscosity;} - /// Returns the kinematic viscosity. - 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. - double GetTemperatureSL(void) const { return SLtemperature; } - /// Returns the sea level density in slugs/ft^3 - double GetDensitySL(void) const { return SLdensity; } /// Returns the sea level pressure in psf. - double GetPressureSL(void) const { return SLpressure; } - /// Returns the sea level speed of sound in ft/sec. - double GetSoundSpeedSL(void) const { return SLsoundspeed; } + virtual double GetPressureSL(void) const { return SLpressure; } - /// Returns the ratio of at-altitude temperature over the sea level value. - double GetTemperatureRatio(void) const { return (*temperature)*rSLtemperature; } - /// Returns the ratio of at-altitude density over the sea level value. - double GetDensityRatio(void) const { return (*density)*rSLdensity; } /// Returns the ratio of at-altitude pressure over the sea level value. - double GetPressureRatio(void) const { return (*pressure)*rSLpressure; } - /// Returns the ratio of at-altitude sound speed over the sea level value. - double GetSoundSpeedRatio(void) const { return soundspeed*rSLsoundspeed; } - - /// Tells the simulator to use an externally calculated atmosphere model. - void UseExternal(void); - /// Tells the simulator to use the internal atmosphere model. - void UseInternal(void); //this is the default - /// Gets the boolean that tells if the external atmosphere model is being used. - bool External(void) { return useExternal; } - - /// Provides the external atmosphere model with an interface to set the temperature. - void SetExTemperature(double t) { exTemperature=t; } - /// Provides the external atmosphere model with an interface to set the density. - void SetExDensity(double d) { exDensity=d; } - /// Provides the external atmosphere model with an interface to set the pressure. - void SetExPressure(double p) { exPressure=p; } - - /// Sets the temperature deviation at sea-level in degrees Fahrenheit - void SetSLTempDev(double d) { T_dev_sl = d; } - /// Gets the temperature deviation at sea-level in degrees Fahrenheit - double GetSLTempDev(void) const { return T_dev_sl; } - /// Sets the current delta-T in degrees Fahrenheit - void SetDeltaT(double d) { delta_T = d; } - /// Gets the current delta-T in degrees Fahrenheit - double GetDeltaT(void) const { return delta_T; } - /// Gets the at-altitude temperature deviation in degrees Fahrenheit - double GetTempDev(void) const { return T_dev; } - /// Gets the density altitude in feet - double GetDensityAltitude(void) const { return density_altitude; } - - // TOTAL WIND access functions (wind + gust + turbulence) - - /// Retrieves the total wind components in NED frame. - const FGColumnVector3& GetTotalWindNED(void) const { return vTotalWindNED; } - - /// Retrieves a total wind component in NED frame. - double GetTotalWindNED(int idx) const {return vTotalWindNED(idx);} - - // WIND access functions - - /// Sets the wind components in NED frame. - void SetWindNED(double wN, double wE, double wD) { vWindNED(1)=wN; vWindNED(2)=wE; vWindNED(3)=wD;} - - /// Sets a wind component in NED frame. - void SetWindNED(int idx, double wind) { vWindNED(idx)=wind;} - - /// Retrieves the wind components in NED frame. - FGColumnVector3& GetWindNED(void) { return vWindNED; } - - /// Retrieves a wind component in NED frame. - 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.*/ - 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.*/ - 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;} - void SetWindspeed(double speed); + /** Returns the density in slugs/ft^3 at a given altitude in ft. */ + virtual double GetDensity(double altitude) const; - 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. - 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. - 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. - 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. - 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. - 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. - FGColumnVector3& GetGustNED(void) {return vGustNED;} + virtual double GetDensityAltitude() const {return DensityAltitude;} - /** Turbulence models available: ttNone, ttStandard, ttBerndt, ttCulp, ttMilspec, ttTustin */ - void SetTurbType(tType tt) {turbType = tt;} - tType GetTurbType() const {return turbType;} + virtual double GetPressureAltitude() const {return PressureAltitude;} - void SetTurbGain(double tg) {TurbGain = tg;} - double GetTurbGain() const {return TurbGain;} + struct Inputs { + double altitudeASL; + } in; - void SetTurbRate(double tr) {TurbRate = tr;} - 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 - void SetRhythmicity(double r) {Rhythmicity=r;} - double GetRhythmicity() const {return Rhythmicity;} + double PressureAltitude; + double DensityAltitude; - double GetTurbPQR(int idx) const {return vTurbPQR(idx);} - double GetTurbMagnitude(void) const {return Magnitude;} - const FGColumnVector3& GetTurbDirection(void) const {return vDirection;} - const FGColumnVector3& GetTurbPQR(void) const {return vTurbPQR;} + const double SutherlandConstant, Beta; + double Viscosity, KinematicViscosity; - void SetWindspeed20ft(double ws) { windspeed_at_20ft = ws;} - 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 - void SetProbabilityOfExceedence( int idx) {probability_of_exceedence_index = idx;} - 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); - void bind(void); + virtual void bind(void); void Debug(int from); };