46#include "FGAtmosphere.h"
58 StdDaySLsoundspeed(sqrt(SHRatio*Reng0*StdDaySLtemperature))
60 Name =
"FGAtmosphere";
64 atmosphere_node = root->
getNode(
"atmosphere");
66 assert(atmosphere_node);
79bool FGAtmosphere::InitModel(
void)
81 if (!FGModel::InitModel())
return false;
83 SLtemperature = Temperature = StdDaySLtemperature;
84 SLpressure = Pressure = StdDaySLpressure;
85 SLdensity = Density = Pressure/(Reng*Temperature);
86 SLsoundspeed = Soundspeed = StdDaySLsoundspeed;
97 if (Holding)
return false;
110 const double MinPressure =
ConvertToPSF(1E-15, ePascals);
111 if (p < MinPressure) {
113 cerr << msg <<
" " << p <<
" is too low." << endl
114 << msg <<
" is capped to " << MinPressure << endl;
131 if (t < minUniverseTemperature) {
133 cerr << msg <<
" " << t <<
" is too low." << endl
134 << msg <<
" is capped to " << minUniverseTemperature << endl;
136 return minUniverseTemperature;
148 if (!override_node) override_node = atmosphere_node->getNode(
"override");
152 if (!override_temperature_node)
153 override_temperature_node = override_node->getNode(
"temperature");
155 if (override_temperature_node)
156 t = override_temperature_node->getDoubleValue();
160 if (!override_pressure_node)
161 override_pressure_node = override_node->getNode(
"pressure");
163 if (override_pressure_node)
164 p = override_pressure_node->getDoubleValue();
177 if (!override_density_node)
178 override_density_node = override_node->getNode(
"density");
180 if (override_density_node)
181 Density = override_density_node->getDoubleValue();
183 Density = Pressure/(Reng*Temperature);
186 Density = Pressure/(Reng*Temperature);
188 Soundspeed = sqrt(SHRatio*Reng*Temperature);
192 Viscosity = Beta * pow(Temperature, 1.5) / (SutherlandConstant + Temperature);
193 KinematicViscosity = Viscosity / Density;
243 targetTemp = t + 459.67;
246 targetTemp = (t + 273.15) * 1.8;
269 targetTemp = t - 459.67;
272 targetTemp = t/1.8 - 273.15;
291 double targetPressure=0;
298 targetPressure = p*2.08854342;
301 targetPressure = p*0.0208854342;
304 targetPressure = p*70.7180803;
310 return targetPressure;
317 double targetPressure=0;
324 targetPressure = p/2.08854342;
327 targetPressure = p/0.0208854342;
330 targetPressure = p/70.7180803;
336 return targetPressure;
341void FGAtmosphere::bind(
void)
354 PropertyManager->Tie(
"atmosphere/density-altitude",
this, &FGAtmosphere::GetDensityAltitude);
355 PropertyManager->Tie(
"atmosphere/pressure-altitude",
this, &FGAtmosphere::GetPressureAltitude);
377void FGAtmosphere::Debug(
int from)
379 if (debug_lvl <= 0)
return;
385 if (debug_lvl & 2 ) {
386 if (from == 0) std::cout <<
"Instantiated: FGAtmosphere" << std::endl;
387 if (from == 1) std::cout <<
"Destroyed: FGAtmosphere" << std::endl;
389 if (debug_lvl & 4 ) {
391 if (debug_lvl & 8 ) {
393 if (debug_lvl & 16) {
395 if (debug_lvl & 128) {
397 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.