qtrocket/sim/USStandardAtmosphere.cpp

109 lines
2.8 KiB
C++

/// \cond
// C headers
// C++ headers
#include <cmath>
// 3rd party headers
/// \endcond
// qtrocket headers
#include "sim/USStandardAtmosphere.h"
#include "utils/math/Constants.h"
#include "utils/math/UtilityMathFunctions.h"
using namespace utils::math;
namespace sim
{
// Populate static data
utils::BinMap initTemps()
{
utils::BinMap map;
map.insert(std::make_pair(0.0, 288.15));
map.insert(std::make_pair(11000.0, 216.65));
map.insert(std::make_pair(20000.0, 216.65));
map.insert(std::make_pair(32000.0, 228.65));
map.insert(std::make_pair(47000.0, 270.65));
map.insert(std::make_pair(51000.0, 270.65));
map.insert(std::make_pair(71000.0, 214.65));
return map;
}
utils::BinMap initLapseRates()
{
utils::BinMap map;
map.insert(std::make_pair(0.0, -0.0065));
map.insert(std::make_pair(11000.0, 0.0));
map.insert(std::make_pair(20000.0, 0.001));
map.insert(std::make_pair(32000.0, 0.0028));
map.insert(std::make_pair(47000.0, 0.0));
map.insert(std::make_pair(51000.0, -0.0028));
map.insert(std::make_pair(71000.0, -0.002));
return map;
}
utils::BinMap initDensities()
{
utils::BinMap map;
map.insert(std::make_pair(0.0, 1.225));
map.insert(std::make_pair(11000.0, 0.36391));
map.insert(std::make_pair(20000.0, 0.08803));
map.insert(std::make_pair(32000.0, 0.01322));
map.insert(std::make_pair(47000.0, 0.00143));
map.insert(std::make_pair(51000.0, 0.00086));
map.insert(std::make_pair(71000.0, 0.000064));
return map;
}
utils::BinMap USStandardAtmosphere::temperatureLapseRate(initLapseRates());
utils::BinMap USStandardAtmosphere::standardTemperature(initTemps());
utils::BinMap USStandardAtmosphere::standardDensity(initDensities());
USStandardAtmosphere::USStandardAtmosphere()
{
}
USStandardAtmosphere::~USStandardAtmosphere()
{
}
double USStandardAtmosphere::getDensity(double altitude)
{
if(utils::math::floatingPointEqual(temperatureLapseRate[altitude], 0.0))
{
return standardDensity[altitude] * std::exp((-Constants::g0 * Constants::airMolarMass * (altitude - standardDensity.getBinBase(altitude)))
/ (Constants::Rstar * standardTemperature[altitude]));
}
else
{
double base = (standardTemperature[altitude] - temperatureLapseRate[altitude] * (altitude - standardDensity.getBinBase(altitude))) / standardTemperature[altitude];
double exponent = (Constants::g0 * Constants::airMolarMass) /
(Constants::Rstar * temperatureLapseRate[altitude]) - 1.0;
return standardDensity[altitude] * std::pow(base, exponent);
}
}
double USStandardAtmosphere::getTemperature(double /*altitude*/)
{
return 0.0;
}
double USStandardAtmosphere::getPressure(double /* altitude */)
{
return 0.0;
}
} // namespace sim