JSBSim Flight Dynamics Model  1.1.11 (13 Feb 2022)
An Open Source Flight Dynamics and Control Software Library in C++
FGStandardAtmosphere.h
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2 
3  Header: FGStandardAtmosphere.h
4  Author: Jon Berndt
5  Date started: 5/2011
6 
7  ------------- Copyright (C) 2011 Jon S. Berndt (jon@jsbsim.org) -------------
8 
9  This program is free software; you can redistribute it and/or modify it under
10  the terms of the GNU Lesser General Public License as published by the Free
11  Software Foundation; either version 2 of the License, or (at your option) any
12  later version.
13 
14  This program is distributed in the hope that it will be useful, but WITHOUT
15  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16  FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
17  details.
18 
19  You should have received a copy of the GNU Lesser General Public License along
20  with this program; if not, write to the Free Software Foundation, Inc., 59
21  Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 
23  Further information about the GNU Lesser General Public License can also be
24  found on the world wide web at http://www.gnu.org.
25 
26 HISTORY
27 --------------------------------------------------------------------------------
28 5/2011 JSB Created
29 
30 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
31 SENTRY
32 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
33 
34 #ifndef FGSTANDARDATMOSPHERE_H
35 #define FGSTANDARDATMOSPHERE_H
36 
37 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
38 INCLUDES
39 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
40 
41 #include <vector>
42 
43 #include "math/FGTable.h"
44 #include "models/FGAtmosphere.h"
45 
46 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
47 FORWARD DECLARATIONS
48 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
49 
50 namespace JSBSim {
51 
52 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
53 CLASS DOCUMENTATION
54 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
55 
94 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
95 CLASS DECLARATION
96 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
97 
99 public:
102 
104  virtual ~FGStandardAtmosphere();
105 
106  bool InitModel(void) override;
107 
108  // *************************************************************************
118  // @{
123  double GetTemperature(double altitude) const override;
124 
131  virtual double GetStdTemperature(double altitude) const;
132 
135  virtual double GetStdTemperatureSL() const { return StdSLtemperature; }
136 
139  virtual double GetStdTemperatureRatio(double h) const { return GetStdTemperature(h)/StdSLtemperature; }
140 
142  virtual double GetTemperatureBias(eTemperature to) const
143  { if (to == eCelsius || to == eKelvin) return TemperatureBias/1.80; else return TemperatureBias; }
144 
148  { if (to == eCelsius || to == eKelvin) return TemperatureDeltaGradient/1.80; else return TemperatureDeltaGradient; }
149 
159  void SetTemperatureSL(double t, eTemperature unit=eFahrenheit) override;
160 
172  void SetTemperature(double t, double h, eTemperature unit=eFahrenheit) override;
173 
183  virtual void SetTemperatureBias(eTemperature unit, double t);
184 
198  virtual void SetSLTemperatureGradedDelta(eTemperature unit, double t);
199 
207  virtual void SetTemperatureGradedDelta(double t, double h, eTemperature unit=eFahrenheit);
208 
213  virtual void ResetSLTemperature();
215 
216  // *************************************************************************
218 
219  double GetPressure(double altitude) const override;
221 
223  virtual double GetStdPressure(double altitude) const;
224 
231  void SetPressureSL(ePressure unit, double pressure) override;
232 
235  virtual void ResetSLPressure();
237 
238  // *************************************************************************
240 
241  virtual double GetStdDensity(double altitude) const;
244 
245  // *************************************************************************
247 
248 
252  void SetDewPoint(eTemperature unit, double dewpoint);
255  double GetDewPoint(eTemperature to) const;
260  void SetVaporPressure(ePressure unit, double Pv);
264  double GetVaporPressure(ePressure to) const;
268  double GetSaturatedVaporPressure(ePressure to) const;
271  void SetRelativeHumidity(double RH);
273  double GetRelativeHumidity(void) const;
276  void SetVaporMassFractionPPM(double frac);
278  double GetVaporMassFractionPPM(void) const;
280 
282  virtual void PrintStandardAtmosphereTable();
283 
284 protected:
286  double StdSLtemperature, StdSLdensity, StdSLpressure, StdSLsoundspeed;
287 
288  double TemperatureBias;
289  double TemperatureDeltaGradient;
290  double GradientFadeoutAltitude;
291  double VaporMassFraction;
292  double SaturatedVaporPressure;
293 
294  FGTable StdAtmosTemperatureTable;
295  FGTable MaxVaporMassFraction;
296  std::vector<double> LapseRates;
297  std::vector<double> PressureBreakpoints;
298  std::vector<double> StdPressureBreakpoints;
299  std::vector<double> StdDensityBreakpoints;
300  std::vector<double> StdLapseRates;
301 
302  void Calculate(double altitude) override;
303 
308  void CalculateLapseRates();
309 
312  void CalculatePressureBreakpoints(double SLpress);
313 
317 
319  double GeopotentialAltitude(double geometalt) const { return (geometalt * EarthRadius) / (EarthRadius + geometalt); }
320 
322  double GeometricAltitude(double geopotalt) const { return (geopotalt * EarthRadius) / (EarthRadius - geopotalt); }
323 
333  double CalculateDensityAltitude(double density, double geometricAlt) override;
334 
343  double CalculatePressureAltitude(double pressure, double geometricAlt) override;
344 
346  double CalculateVaporPressure(double temperature);
347 
349  void ValidateVaporMassFraction(double geometricAlt);
350 
352  void CalculateSLDensity(void) { SLdensity = SLpressure / (Reng * SLtemperature); }
353 
356 
357  void bind(void) override;
358  void Debug(int from) override;
359 
361  static constexpr double EarthRadius = 6356766.0 / fttom;
365  static constexpr double a = 611.2/psftopa; // psf
366  static constexpr double b = 17.62; // 1/degC
367  static constexpr double c = 243.12; // degC
369  static constexpr double Mwater = 18.016 * kgtoslug / 1000.0;
370  static constexpr double Rdry = Rstar / Mair;
371  static constexpr double Rwater = Rstar / Mwater;
372 };
373 
374 } // namespace JSBSim
375 
376 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
377 #endif
JSBSim::FGFDMExec
Encapsulates the JSBSim simulation executive.
Definition: FGFDMExec.h:185
JSBSim::FGAtmosphere::eTemperature
eTemperature
Enums for specifying temperature units.
Definition: FGAtmosphere.h:80
JSBSim::FGStandardAtmosphere::CalculateVaporPressure
double CalculateVaporPressure(double temperature)
Calculate the pressure of water vapor with the Magnus formula.
Definition: FGStandardAtmosphere.cpp:557
JSBSim::FGStandardAtmosphere::EarthRadius
static constexpr double EarthRadius
Earth radius in ft as defined for ISA 1976.
Definition: FGStandardAtmosphere.h:361
JSBSim::FGStandardAtmosphere::Mwater
static constexpr double Mwater
Mean molecular weight for water - slug/mol.
Definition: FGStandardAtmosphere.h:369
JSBSim::FGStandardAtmosphere::CalculateSLSoundSpeedAndDensity
void CalculateSLSoundSpeedAndDensity(void)
Calculate the SL density and sound speed.
Definition: FGStandardAtmosphere.cpp:234
JSBSim::FGStandardAtmosphere::ResetSLPressure
virtual void ResetSLPressure()
Resets the sea level to the Standard sea level pressure, and recalculates dependent parameters so tha...
Definition: FGStandardAtmosphere.cpp:476
JSBSim::FGAtmosphere::GetPressure
virtual double GetPressure(void) const
Returns the pressure in psf.
Definition: FGAtmosphere.h:144
JSBSim::FGStandardAtmosphere::SetTemperatureGradedDelta
virtual void SetTemperatureGradedDelta(double t, double h, eTemperature unit=eFahrenheit)
Sets the temperature delta value at the supplied altitude/elevation above sea level,...
Definition: FGStandardAtmosphere.cpp:383
JSBSim::FGStandardAtmosphere::SetTemperature
void SetTemperature(double t, double h, eTemperature unit=eFahrenheit) override
Sets the temperature at the supplied altitude, if it is to be different than the standard temperature...
Definition: FGStandardAtmosphere.cpp:327
JSBSim::FGStandardAtmosphere::FGStandardAtmosphere
FGStandardAtmosphere(FGFDMExec *)
Constructor.
Definition: FGStandardAtmosphere.cpp:59
JSBSim::FGAtmosphere::ePressure
ePressure
Enums for specifying pressure units.
Definition: FGAtmosphere.h:83
JSBSim::FGStandardAtmosphere::GetStdTemperatureSL
virtual double GetStdTemperatureSL() const
Returns the standard sea level temperature in degrees Rankine.
Definition: FGStandardAtmosphere.h:135
JSBSim::FGStandardAtmosphere::GetSaturatedVaporPressure
double GetSaturatedVaporPressure(ePressure to) const
Returns the saturated pressure of water vapor.
Definition: FGStandardAtmosphere.cpp:630
JSBSim::FGStandardAtmosphere::SetVaporPressure
void SetVaporPressure(ePressure unit, double Pv)
Sets the partial pressure of water vapor.
Definition: FGStandardAtmosphere.cpp:612
JSBSim::FGStandardAtmosphere::SetVaporMassFractionPPM
void SetVaporMassFractionPPM(double frac)
Sets the vapor mass per million of dry air mass units.
Definition: FGStandardAtmosphere.cpp:662
JSBSim::FGTable
Lookup table class.
Definition: FGTable.h:233
JSBSim::FGAtmosphere::Rstar
static constexpr double Rstar
Universal gas constant - ft*lbf/R/mol.
Definition: FGAtmosphere.h:260
JSBSim::FGStandardAtmosphere::CalculateDensityAltitude
double CalculateDensityAltitude(double density, double geometricAlt) override
Calculates the density altitude given any temperature or pressure bias.
Definition: FGStandardAtmosphere.cpp:494
JSBSim::FGStandardAtmosphere::CalculatePressureAltitude
double CalculatePressureAltitude(double pressure, double geometricAlt) override
Calculates the pressure altitude given any temperature or pressure bias.
Definition: FGStandardAtmosphere.cpp:525
JSBSim::FGStandardAtmosphere::GeometricAltitude
double GeometricAltitude(double geopotalt) const
Convert a geopotential altitude to a geometric altitude.
Definition: FGStandardAtmosphere.h:322
JSBSim::FGStandardAtmosphere::CalculateStdDensityBreakpoints
void CalculateStdDensityBreakpoints()
Calculate the atmospheric density breakpoints at the altitudes in the standard temperature table.
Definition: FGStandardAtmosphere.cpp:485
JSBSim::FGAtmosphere::Reng
static double Reng
Specific gas constant for air - ft*lbf/slug/R.
Definition: FGAtmosphere.h:270
JSBSim::FGStandardAtmosphere::Calculate
void Calculate(double altitude) override
Calculate the atmosphere for the given altitude.
Definition: FGStandardAtmosphere.cpp:179
JSBSim::FGStandardAtmosphere::StdSLtemperature
double StdSLtemperature
Standard sea level conditions.
Definition: FGStandardAtmosphere.h:286
JSBSim::FGStandardAtmosphere::PrintStandardAtmosphereTable
virtual void PrintStandardAtmosphereTable()
Prints the U.S. Standard Atmosphere table.
Definition: FGStandardAtmosphere.cpp:398
JSBSim::FGAtmosphere
Models an empty, abstract base atmosphere class.
Definition: FGAtmosphere.h:76
JSBSim::FGStandardAtmosphere::ResetSLTemperature
virtual void ResetSLTemperature()
This function resets the model to apply no bias or delta gradient to the temperature.
Definition: FGStandardAtmosphere.cpp:464
JSBSim::FGStandardAtmosphere::SetTemperatureBias
virtual void SetTemperatureBias(eTemperature unit, double t)
Sets the temperature bias to be added to the standard temperature at all altitudes.
Definition: FGStandardAtmosphere.cpp:345
JSBSim::FGStandardAtmosphere::GetVaporPressure
double GetVaporPressure(ePressure to) const
Returns the partial pressure of water vapor.
Definition: FGStandardAtmosphere.cpp:622
JSBSim::FGStandardAtmosphere::CalculateSLDensity
void CalculateSLDensity(void)
Calculate the SL density.
Definition: FGStandardAtmosphere.h:352
JSBSim::FGStandardAtmosphere::SetTemperatureSL
void SetTemperatureSL(double t, eTemperature unit=eFahrenheit) override
Sets the Sea Level temperature, if it is to be different than the standard.
Definition: FGStandardAtmosphere.cpp:363
JSBSim::FGStandardAtmosphere::~FGStandardAtmosphere
virtual ~FGStandardAtmosphere()
Destructor.
Definition: FGStandardAtmosphere.cpp:145
JSBSim::FGStandardAtmosphere::SetDewPoint
void SetDewPoint(eTemperature unit, double dewpoint)
Sets the dew point.
Definition: FGStandardAtmosphere.cpp:585
JSBSim::FGStandardAtmosphere::GeopotentialAltitude
double GeopotentialAltitude(double geometalt) const
Convert a geometric altitude to a geopotential altitude.
Definition: FGStandardAtmosphere.h:319
JSBSim::FGStandardAtmosphere::GetStdPressure
virtual double GetStdPressure(double altitude) const
Returns the standard pressure at the specified altitude.
Definition: FGStandardAtmosphere.cpp:285
JSBSim::FGStandardAtmosphere::GetRelativeHumidity
double GetRelativeHumidity(void) const
Returns the relative humidity in percent.
Definition: FGStandardAtmosphere.cpp:637
JSBSim::FGStandardAtmosphere::GetStdTemperature
virtual double GetStdTemperature(double altitude) const
Returns the standard temperature in degrees Rankine at a specified altitude.
Definition: FGStandardAtmosphere.cpp:273
JSBSim::FGStandardAtmosphere::ValidateVaporMassFraction
void ValidateVaporMassFraction(double geometricAlt)
Validate the value of the vapor mass fraction.
Definition: FGStandardAtmosphere.cpp:565
JSBSim::FGAtmosphere::GetTemperature
virtual double GetTemperature() const
Returns the actual, modeled temperature at the current altitude in degrees Rankine.
Definition: FGAtmosphere.h:109
JSBSim::FGStandardAtmosphere::SetSLTemperatureGradedDelta
virtual void SetSLTemperatureGradedDelta(eTemperature unit, double t)
Sets a Sea Level temperature delta that is ramped out by 86 km.
Definition: FGStandardAtmosphere.cpp:371
JSBSim::FGStandardAtmosphere::GetDewPoint
double GetDewPoint(eTemperature to) const
Returns the dew point.
Definition: FGStandardAtmosphere.cpp:595
JSBSim::FGStandardAtmosphere::GetTemperatureBias
virtual double GetTemperatureBias(eTemperature to) const
Returns the temperature bias over the sea level value in degrees Rankine.
Definition: FGStandardAtmosphere.h:142
JSBSim::FGStandardAtmosphere::a
static constexpr double a
Sonntag constants based on ref [2].
Definition: FGStandardAtmosphere.h:365
JSBSim::FGStandardAtmosphere::SetRelativeHumidity
void SetRelativeHumidity(double RH)
Sets the relative humidity.
Definition: FGStandardAtmosphere.cpp:645
JSBSim::FGStandardAtmosphere::GetStdDensity
virtual double GetStdDensity(double altitude) const
Returns the standard density at a specified altitude.
Definition: FGStandardAtmosphere.cpp:320
JSBSim::FGAtmosphere::Mair
static constexpr double Mair
Mean molecular weight for air - slug/mol.
Definition: FGAtmosphere.h:262
JSBSim::FGStandardAtmosphere::GetTemperatureDeltaGradient
virtual double GetTemperatureDeltaGradient(eTemperature to)
Returns the temperature gradient to be applied on top of the standard temperature gradient.
Definition: FGStandardAtmosphere.h:147
JSBSim::FGStandardAtmosphere::GetVaporMassFractionPPM
double GetVaporMassFractionPPM(void) const
Returns the vapor mass per million of dry air mass units (ppm).
Definition: FGStandardAtmosphere.cpp:655
JSBSim::FGStandardAtmosphere::CalculateLapseRates
void CalculateLapseRates()
Recalculate the lapse rate vectors when the temperature profile is altered in a way that would change...
Definition: FGStandardAtmosphere.cpp:422
JSBSim::FGStandardAtmosphere
Models the 1976 U.S.
Definition: FGStandardAtmosphere.h:98
JSBSim::FGStandardAtmosphere::CalculatePressureBreakpoints
void CalculatePressureBreakpoints(double SLpress)
Calculate (or recalculate) the atmospheric pressure breakpoints at the altitudes in the standard temp...
Definition: FGStandardAtmosphere.cpp:439
JSBSim::FGStandardAtmosphere::SetPressureSL
void SetPressureSL(ePressure unit, double pressure) override
Sets the sea level pressure for modeling an off-standard pressure profile.
Definition: FGStandardAtmosphere.cpp:225
JSBSim::FGStandardAtmosphere::GetStdTemperatureRatio
virtual double GetStdTemperatureRatio(double h) const
Returns the ratio of the standard temperature at the supplied altitude over the standard sea level te...
Definition: FGStandardAtmosphere.h:139