mirror of
https://git.intern.spaceteamaachen.de/ALPAKA/sta-models.git
synced 2025-09-28 23:17:33 +00:00
Add USSA 1976 model
This commit is contained in:
153
src/models/altitude.cpp
Normal file
153
src/models/altitude.cpp
Normal file
@@ -0,0 +1,153 @@
|
||||
#include <sta/models/altitude.hpp>
|
||||
#include <cmath>
|
||||
#include <sta/models/constants.hpp>
|
||||
namespace sta
|
||||
{
|
||||
namespace models {
|
||||
|
||||
BarometricFormula::BarometricFormula(float pRef, float hRef)
|
||||
{
|
||||
p0_ = pRef / std::pow(1 - hRef / 44330, 5.255);
|
||||
}
|
||||
|
||||
float BarometricFormula::getAltitude(float p){
|
||||
return 44330 * (1 - std::pow(p / p0_, 1/5.255));
|
||||
}
|
||||
|
||||
float USSA1976::getAltitude(float p){
|
||||
float T_b = 288.15;
|
||||
float L_b = 0.0065;
|
||||
float P_b = 1013.25;
|
||||
float exp_b = 5.2561;
|
||||
float H_b = 0;
|
||||
|
||||
if(p > 226.321){
|
||||
T_b = 288.15;
|
||||
L_b = 0.0065;
|
||||
P_b = 1013.25;
|
||||
exp_b = 5.2561;
|
||||
H_b = 0;
|
||||
}
|
||||
else if(p > 54.7489){
|
||||
T_b = 216.65;
|
||||
L_b = 0;
|
||||
P_b = 226.321;
|
||||
exp_b = 0;
|
||||
H_b = 11000;
|
||||
}
|
||||
else if(p > 8.6802){
|
||||
T_b = 216.65;
|
||||
L_b = -0.001;
|
||||
P_b = 54.7489;
|
||||
exp_b = -34.1626;
|
||||
H_b = 20000;
|
||||
}
|
||||
else if(p > 1.1091){
|
||||
T_b = 228.65;
|
||||
L_b = -0.0028;
|
||||
P_b = 8.6802;
|
||||
exp_b = -12.2009;
|
||||
H_b = 32000;
|
||||
}
|
||||
else if(p > 0.6699){
|
||||
T_b = 270.65;
|
||||
L_b = 0;
|
||||
P_b = 1.1091;
|
||||
exp_b = 0;
|
||||
H_b = 47000;
|
||||
}
|
||||
else if(p > 0.0399){
|
||||
T_b = 270.65;
|
||||
L_b = 0.0028;
|
||||
P_b = 0.6699;
|
||||
exp_b = 12.2009;
|
||||
H_b = 51000;
|
||||
}
|
||||
else{
|
||||
T_b = 214.65;
|
||||
L_b = 0.002;
|
||||
P_b = 0.0399;
|
||||
exp_b = 17.0816;
|
||||
H_b = 71000;
|
||||
}
|
||||
|
||||
if(L_b == 0){
|
||||
return H_b - STA_CONSTANT_R*T_b*std::log(p/P_b) / (STA_CONSTANT_G_0* STA_CONSTANT_M);
|
||||
}
|
||||
return T_b/L_b * (-std::pow((p/P_b),(1/exp_b)) + 1) + H_b;
|
||||
}
|
||||
|
||||
sta::math::probability::grv USSA1976::getAltitude(sta::math::probability::grv p){
|
||||
float T_b = 288.15;
|
||||
float L_b = 0.0065;
|
||||
float P_b = 1013.25;
|
||||
float exp_b = 5.2561;
|
||||
float H_b = 0;
|
||||
|
||||
if(p.mean > 226.321){
|
||||
T_b = 288.15;
|
||||
L_b = 0.0065;
|
||||
P_b = 1013.25;
|
||||
exp_b = 5.2561;
|
||||
H_b = 0;
|
||||
}
|
||||
else if(p.mean > 54.7489){
|
||||
T_b = 216.65;
|
||||
L_b = 0;
|
||||
P_b = 226.321;
|
||||
exp_b = 0;
|
||||
H_b = 11000;
|
||||
}
|
||||
else if(p.mean > 8.6802){
|
||||
T_b = 216.65;
|
||||
L_b = -0.001;
|
||||
P_b = 54.7489;
|
||||
exp_b = -34.1626;
|
||||
H_b = 20000;
|
||||
}
|
||||
else if(p.mean > 1.1091){
|
||||
T_b = 228.65;
|
||||
L_b = -0.0028;
|
||||
P_b = 8.6802;
|
||||
exp_b = -12.2009;
|
||||
H_b = 32000;
|
||||
}
|
||||
else if(p.mean > 0.6699){
|
||||
T_b = 270.65;
|
||||
L_b = 0;
|
||||
P_b = 1.1091;
|
||||
exp_b = 0;
|
||||
H_b = 47000;
|
||||
}
|
||||
else if(p.mean > 0.0399){
|
||||
T_b = 270.65;
|
||||
L_b = 0.0028;
|
||||
P_b = 0.6699;
|
||||
exp_b = 12.2009;
|
||||
H_b = 51000;
|
||||
}
|
||||
else{
|
||||
T_b = 214.65;
|
||||
L_b = 0.002;
|
||||
P_b = 0.0399;
|
||||
exp_b = 17.0816;
|
||||
H_b = 71000;
|
||||
}
|
||||
|
||||
float h;
|
||||
float variance_h;
|
||||
if(L_b == 0){
|
||||
h = H_b - STA_CONSTANT_R*T_b*std::log(p.mean/P_b) / (STA_CONSTANT_G_0* STA_CONSTANT_M);
|
||||
variance_h = std::pow(( STA_CONSTANT_R * T_b / (STA_CONSTANT_G_0* STA_CONSTANT_M*p.mean)),2) * p.variance;
|
||||
}else{
|
||||
float inner = -std::pow((p.mean/P_b),(1/exp_b));
|
||||
h = T_b/L_b * (inner + 1) + H_b;
|
||||
variance_h = std::pow(inner*(T_b/L_b)*(1/exp_b) / p.mean ,2) * p.variance;
|
||||
}
|
||||
return {h, variance_h};
|
||||
}
|
||||
|
||||
|
||||
|
||||
} // namespace models
|
||||
} // namespace sta
|
Reference in New Issue
Block a user