added new eval using shortest-path + plotting removed compiler warnings for clean-code fixed some minor issues added new TeX code and new graphics
112 lines
4.1 KiB
C++
Executable File
112 lines
4.1 KiB
C++
Executable File
#define BAROMETRIC
|
|
|
|
#ifndef BAROMETRIC
|
|
#define BAROMETRIC
|
|
|
|
const static double mslp = 980.25; // mean sea level spressure
|
|
const static double int_lapse_rate = 0.0065; // a
|
|
const static double int_exponent = 5.255; // international barometric formular exponent calculated from (M * g) / (R * a)
|
|
|
|
//The height of the single floor levels.
|
|
const static double floor_height[5] = {0.0, 4.1, 3.4, 3.4, 3.4};
|
|
|
|
|
|
class BarometricFormular
|
|
{
|
|
private:
|
|
const double temperature; // T in Kelvin
|
|
|
|
const double universal_gas_constant; // R
|
|
const double molar_mass; // M
|
|
const double gravitational_acceleration; // g
|
|
const double lapse_rate; // a
|
|
double _exponent;
|
|
|
|
public:
|
|
|
|
/** ctor */
|
|
BarometricFormular(const double R, const double M, const double g, const double a, const double T):
|
|
universal_gas_constant(R), molar_mass(M), gravitational_acceleration(g), lapse_rate(a), temperature(T){
|
|
_exponent = (M * g) / (R * a);
|
|
}
|
|
|
|
/** ctor only with Temperature*/
|
|
BarometricFormular(const double T) :
|
|
universal_gas_constant(8.314), molar_mass(0.02896), gravitational_acceleration(9.80665), lapse_rate(0.0065), temperature(T){
|
|
_exponent = (molar_mass * gravitational_acceleration) / (universal_gas_constant * lapse_rate);
|
|
}
|
|
|
|
/** Atmospheric Pressure Calculation */
|
|
double getAtmosphericPressure(double p_0, double h_1) const{
|
|
return p_0 * std::pow((1.0 - ((lapse_rate * h_1)/temperature)), _exponent);
|
|
}
|
|
|
|
/** Atmospheric Pressure Calculation above sea level*/
|
|
double getAtmosphericPressure(double h_1) const{
|
|
return mslp * std::pow((1.0 - ((lapse_rate * h_1)/temperature)), _exponent);
|
|
}
|
|
|
|
//TODO:: Height from pressure for the general formular
|
|
|
|
//Static Functions
|
|
|
|
/** International Barometric Formular*/
|
|
static double s_getAtmosphericPressure(double p_0, double h_1, double kelvin){
|
|
return p_0 * std::pow((1.0 - ((int_lapse_rate * h_1)/kelvin)), int_exponent);
|
|
}
|
|
|
|
/** International Barometric Formular above Sea Level*/
|
|
static double s_getAtmosphericPressure(double h_1, double kelvin){
|
|
return mslp * std::pow((1.0 - ((int_lapse_rate * h_1)/kelvin)), int_exponent);
|
|
}
|
|
|
|
/** International Barometric Formular above Sea Level at 15 degree*/
|
|
static double s_getAtmosphericPressure(double height_above_sea_level){
|
|
return mslp * std::pow((1.0 - ((int_lapse_rate * height_above_sea_level)/288.15)), int_exponent);
|
|
}
|
|
|
|
/** Get the height above sea level using a pressure measurment above sea level*/
|
|
static double getHeightAboveSeaLevel(double p, double kelvin){
|
|
// http://www.wolframalpha.com/input/?i=solve+for+h+++p+%3D+980.25*%281+-+0.0065+*+h%2FT%29^5.255
|
|
return 41.4811 * ((3.70882 * kelvin) - (std::pow(p, 0.1902949571836346) * kelvin));
|
|
}
|
|
|
|
|
|
/** This is a helper Class only for gnupplot visualization for ipin2015*/
|
|
static double getHeightForVisualizationOnly(double p, double z_0, double kelvin){
|
|
|
|
// the height of the reference (first) pressure measurement
|
|
double h_0 = 0.0;
|
|
for(int i = 0; i <= z_0; i++){
|
|
h_0 += floor_height[i];
|
|
}
|
|
|
|
// pressure value of h_0 above sea level
|
|
// we define that the bottom of floor 0 is sea level ;).
|
|
double p_0 = s_getAtmosphericPressure(h_0, kelvin);
|
|
|
|
// pressure value of the current particle above floor 0 (sea level)
|
|
double p_height = p_0 + p;
|
|
|
|
// height of the particle above floor 0 (sea level)
|
|
return getHeightAboveSeaLevel(p_height, kelvin);
|
|
|
|
}
|
|
|
|
static double s_getSeaLevelPressure(){
|
|
return mslp;
|
|
}
|
|
|
|
static double getPressureOfFloorForVizualization(double z, double kelvin){
|
|
|
|
int i = z + 0.5;
|
|
double h_z = floor_height[i+1];
|
|
double p_z = s_getAtmosphericPressure(h_z, kelvin);
|
|
return std::abs(mslp - p_z);
|
|
}
|
|
|
|
};
|
|
|
|
#endif // BAROMETRIC
|
|
|