46#include "FGAtmosphere.h"
47#include "input_output/FGLog.h"
58 :
FGModel(fdmex,
"FGAtmosphere"),
59 StdDaySLsoundspeed(sqrt(SHRatio*Reng0*StdDaySLtemperature))
63 atmosphere_node = root->
getNode(
"atmosphere");
65 assert(atmosphere_node);
78bool FGAtmosphere::InitModel(
void)
80 if (!FGModel::InitModel())
return false;
82 SLtemperature = Temperature = StdDaySLtemperature;
83 SLpressure = Pressure = StdDaySLpressure;
84 SLdensity = Density = Pressure/(Reng*Temperature);
85 SLsoundspeed = Soundspeed = StdDaySLsoundspeed;
96 if (Holding)
return false;
109 const double MinPressure =
ConvertToPSF(1E-15, ePascals);
110 if (p < MinPressure) {
113 log << msg <<
" " << p <<
" is too low." << endl
114 << msg <<
" will be capped to " << MinPressure << endl;
131 if (t < minUniverseTemperature) {
134 log << msg <<
" " << t <<
" is too low." << endl
135 << msg <<
" will be capped to " << minUniverseTemperature << endl;
137 return minUniverseTemperature;
149 if (!override_node) override_node = atmosphere_node->getNode(
"override");
153 if (!override_temperature_node)
154 override_temperature_node = override_node->getNode(
"temperature");
156 if (override_temperature_node)
157 t = override_temperature_node->getDoubleValue();
161 if (!override_pressure_node)
162 override_pressure_node = override_node->getNode(
"pressure");
164 if (override_pressure_node)
165 p = override_pressure_node->getDoubleValue();
178 if (!override_density_node)
179 override_density_node = override_node->getNode(
"density");
181 if (override_density_node)
182 Density = override_density_node->getDoubleValue();
184 Density = Pressure/(Reng*Temperature);
187 Density = Pressure/(Reng*Temperature);
189 Soundspeed = sqrt(SHRatio*Reng*Temperature);
193 Viscosity = Beta * pow(Temperature, 1.5) / (SutherlandConstant + Temperature);
194 KinematicViscosity = Viscosity / Density;
244 targetTemp = t + 459.67;
247 targetTemp = (t + 273.15) * 1.8;
270 targetTemp = t - 459.67;
273 targetTemp = t/1.8 - 273.15;
292 double targetPressure=0;
299 targetPressure = p*2.08854342;
302 targetPressure = p*0.0208854342;
305 targetPressure = p*70.7180803;
311 return targetPressure;
318 double targetPressure=0;
325 targetPressure = p/2.08854342;
328 targetPressure = p/0.0208854342;
331 targetPressure = p/70.7180803;
337 return targetPressure;
342void FGAtmosphere::bind(
void)
355 PropertyManager->Tie(
"atmosphere/density-altitude",
this, &FGAtmosphere::GetDensityAltitude);
356 PropertyManager->Tie(
"atmosphere/pressure-altitude",
this, &FGAtmosphere::GetPressureAltitude);
378void FGAtmosphere::Debug(
int from)
380 if (debug_lvl <= 0)
return;
386 if (debug_lvl & 2 ) {
387 FGLogging log(LogLevel::DEBUG);
388 if (from == 0) log <<
"Instantiated: FGAtmosphere" << std::endl;
389 if (from == 1) log <<
"Destroyed: FGAtmosphere" << std::endl;
391 if (debug_lvl & 4 ) {
393 if (debug_lvl & 8 ) {
395 if (debug_lvl & 16) {
397 if (debug_lvl & 128) {
399 if (debug_lvl & 64) {
virtual double GetSoundSpeedRatio(void) const
Returns the ratio of at-altitude sound speed over the sea level value.
virtual double GetPressureRatio(void) const
Returns the ratio of at-altitude pressure over the sea level value.
double ConvertToRankine(double t, eTemperature unit) const
Converts to Rankine from one of several unit systems.
virtual double GetTemperatureRatio() const
Returns the ratio of the at-current-altitude temperature as modeled over the sea level value.
virtual double CalculatePressureAltitude(double pressure, double geometricAlt)
Calculates the pressure altitude given any temperature or pressure bias.
virtual void Calculate(double altitude)
Calculate the atmosphere for the given altitude.
double ConvertFromPSF(double t, ePressure unit=ePSF) const
Converts from PSF (pounds per square foot) to one of several unit systems.
virtual double GetPressure(void) const
Returns the pressure in psf.
virtual double GetSoundSpeedSL(void) const
Returns the sea level speed of sound in ft/sec.
eTemperature
Enums for specifying temperature units.
double ConvertFromRankine(double t, eTemperature unit) const
Converts from Rankine to one of several unit systems.
double ValidatePressure(double p, const std::string &msg, bool quiet=false) const
Check that the pressure is within plausible boundaries.
bool Run(bool Holding) override
Runs the atmosphere forces model; called by the Executive.
double ValidateTemperature(double t, const std::string &msg, bool quiet=false) const
Check that the temperature is within plausible boundaries.
double ConvertToPSF(double t, ePressure unit=ePSF) const
Converts to PSF (pounds per square foot) from one of several unit systems.
virtual double CalculateDensityAltitude(double density, double geometricAlt)
Calculates the density altitude given any temperature or pressure bias.
virtual double GetSoundSpeed(void) const
Returns the speed of sound in ft/sec.
virtual ~FGAtmosphere()
Destructor.
virtual double GetDensitySL(void) const
Returns the sea level density in slugs/ft^3.
ePressure
Enums for specifying pressure units.
virtual double GetTemperatureSL() const
Returns the actual, modeled sea level temperature in degrees Rankine.
virtual void SetPressureSL(ePressure unit, double pressure)
Sets the sea level pressure for modeling.
virtual void SetTemperatureSL(double t, eTemperature unit=eFahrenheit)
Sets the Sea Level temperature.
virtual double GetDensityRatio(void) const
Returns the ratio of at-altitude density over the sea level value.
FGAtmosphere(FGFDMExec *)
Constructor.
virtual double GetDensity(void) const
Returns the density in slugs/ft^3.
virtual double GetTemperature() const
Returns the actual, modeled temperature at the current altitude in degrees Rankine.
Encapsulates the JSBSim simulation executive.
static constexpr double KelvinToRankine(double kelvin)
Converts from degrees Kelvin to degrees Rankine.
Base class for all scheduled JSBSim models.
virtual bool Run(bool Holding)
Runs the model; called by the Executive.
A node in a property tree.
SGPropertyNode * getNode(const char *relative_path, bool create=false)
Get a pointer to another node by relative path.
Main namespace for the JSBSim Flight Dynamics Model.