X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FWeatherCM%2FFGPhysicalProperties.cpp;h=636ff130e9b1661f1c3cd5070101943493d120d2;hb=a4e81f4ff075e6a3c0c2ea1b5a29c0bcdfdbc671;hp=044e6805bb84d02d61b51069a6ed67715e6d12a4;hpb=b430d919d428f19d2963578508067ad0f71229f3;p=flightgear.git diff --git a/src/WeatherCM/FGPhysicalProperties.cpp b/src/WeatherCM/FGPhysicalProperties.cpp index 044e6805b..636ff130e 100644 --- a/src/WeatherCM/FGPhysicalProperties.cpp +++ b/src/WeatherCM/FGPhysicalProperties.cpp @@ -71,7 +71,7 @@ FGPhysicalProperties::FGPhysicalProperties() AirPressure = FGAirPressureItem(101325.0); - VaporPressure[ 0.0] = FG_WEATHER_DEFAULT_VAPORPRESSURE; //in Pa (I *only* accept SI!) + VaporPressure[-1000.0] = FG_WEATHER_DEFAULT_VAPORPRESSURE; //in Pa (I *only* accept SI!) VaporPressure[10000.0] = FG_WEATHER_DEFAULT_VAPORPRESSURE; //in Pa (I *only* accept SI!) //Clouds.insert(FGCloudItem()) => none @@ -80,6 +80,37 @@ FGPhysicalProperties::FGPhysicalProperties() LightningProbability = 0.0; } +/* +The Methods: + + WeatherPrecision getWind_x( int number ) const; + WeatherPrecision getWind_y( int number ) const; + WeatherPrecision getWind_z( int number ) const; + WeatherPrecision getWind_a( int number ) const; + void setWind_x( int number, WeatherPrecision x); + void setWind_y( int number, WeatherPrecision y); + void setWind_z( int number, WeatherPrecision z); + void setWind_a( int number, WeatherPrecision a); + WeatherPrecision getTurbulence_x( int number ) const; + WeatherPrecision getTurbulence_y( int number ) const; + WeatherPrecision getTurbulence_z( int number ) const; + WeatherPrecision getTurbulence_a( int number ) const; + void setTurbulence_x( int number, WeatherPrecision x); + void setTurbulence_y( int number, WeatherPrecision y); + void setTurbulence_z( int number, WeatherPrecision z); + void setTurbulence_a( int number, WeatherPrecision a); + WeatherPrecision getTemperature_x( int number ) const; + WeatherPrecision getTemperature_a( int number ) const; + void setTemperature_x( int number, WeatherPrecision x); + void setTemperature_a( int number, WeatherPrecision a); + WeatherPrecision getVaporPressure_x( int number ) const; + WeatherPrecision getVaporPressure_a( int number ) const; + void setVaporPressure_x( int number, WeatherPrecision x); + void setVaporPressure_a( int number, WeatherPrecision a); + +are in the extra file FGPhysicalProperties_bind.cpp +*/ + unsigned int FGPhysicalProperties::getNumberOfCloudLayers(void) const { return Clouds.size(); @@ -126,7 +157,7 @@ ostream& operator<< ( ostream& out, const FGPhysicalProperties2D& p ) out << "\n"; out << "Stored AirPressure: "; - out << p.AirPressure.getValue(0)/100.0 << " hPa at " << 0.0 << "m; "; + out << p.AirPressure.getValue()/100.0 << " hPa at " << 0.0 << "m; "; out << "\n"; out << "Stored VaporPressure: "; @@ -140,4 +171,152 @@ ostream& operator<< ( ostream& out, const FGPhysicalProperties2D& p ) } +inline double F(const WeatherPrecision factor, const WeatherPrecision a, const WeatherPrecision b, const WeatherPrecision r, const WeatherPrecision x) +{ + const double c = 1.0 / (-b + a * r); + return factor * c * ( 1.0 / (r + x) + a * c * log(fabs((r + x) * (b + a * x))) ); +} + +WeatherPrecision FGPhysicalProperties::AirPressureAt(const WeatherPrecision x) const +{ + const double rho0 = (AirPressure.getValue()*FG_WEATHER_DEFAULT_AIRDENSITY*FG_WEATHER_DEFAULT_TEMPERATURE)/(TemperatureAt(0)*FG_WEATHER_DEFAULT_AIRPRESSURE); + const double G = 6.673e-11; //Gravity; in m^3 kg^-1 s^-2 + const double m = 5.977e24; //mass of the earth in kg + const double r = 6368e3; //radius of the earth in metres + const double factor = -(rho0 * TemperatureAt(0) * G * m) / AirPressure.getValue(); + + double a, b, FF = 0.0; + + //ok, integrate from 0 to a now. + if (Temperature.size() < 2) + { //take care of the case that there aren't enough points + //actually this should be impossible... + + if (Temperature.size() == 0) + { + cerr << "ERROR in FGPhysicalProperties: Air pressure at " << x << " metres altiude requested,\n"; + cerr << " but there isn't enough data stored! No temperature is aviable!\n"; + return FG_WEATHER_DEFAULT_AIRPRESSURE; + } + + //ok, I've got only one point. So I'm assuming that that temperature is + //the same for all altitudes. + a = 1; + b = TemperatureAt(0); + FF += F(factor, a, b, r, x ); + FF -= F(factor, a, b, r, 0.0); + } + else + { //I've got at least two entries now + + //integrate 'backwards' by integrating the strip ]n,x] first, then ]n-1,n] ... to [0,n-m] + + if (x>=0.0) + { + map::const_iterator temp2 = Temperature.upper_bound(x); + map::const_iterator temp1 = temp2; temp1--; + + if (temp1->first == x) + { //ignore that interval + temp1--; temp2--; + } + bool first_pass = true; + while(true) + { + if (temp2 == Temperature.end()) + { + //temp2 doesn't exist. So cheat by assuming that the slope is the + //same as between the two earlier temperatures + temp1--; temp2--; + a = (temp2->second - temp1->second)/(temp2->first - temp1->first); + b = temp1->second - a * temp1->first; + temp1++; temp2++; + } + else + { + a = (temp2->second - temp1->second)/(temp2->first - temp1->first); + b = temp1->second - a * temp1->first; + } + + if (first_pass) + { + + FF += F(factor, a, b, r, x); + first_pass = false; + } + else + { + FF += F(factor, a, b, r, temp2->first); + } + + if (temp1->first>0.0) + { + FF -= F(factor, a, b, r, temp1->first); + temp1--; temp2--; + } + else + { + FF -= F(factor, a, b, r, 0.0); + return AirPressure.getValue() * exp(FF); + } + } + } + else + { //ok x is smaller than 0.0, so do everything in reverse + map::const_iterator temp2 = Temperature.upper_bound(x); + map::const_iterator temp1 = temp2; temp1--; + + bool first_pass = true; + while(true) + { + if (temp2 == Temperature.begin()) + { + //temp1 doesn't exist. So cheat by assuming that the slope is the + //same as between the two earlier temperatures + temp1 = Temperature.begin(); temp2++; + a = (temp2->second - temp1->second)/(temp2->first - temp1->first); + b = temp1->second - a * temp1->first; + temp2--; + } + else + { + a = (temp2->second - temp1->second)/(temp2->first - temp1->first); + b = temp1->second - a * temp1->first; + } + + if (first_pass) + { + + FF += F(factor, a, b, r, x); + first_pass = false; + } + else + { + FF += F(factor, a, b, r, temp2->first); + } + + if (temp2->first<0.0) + { + FF -= F(factor, a, b, r, temp1->first); + + if (temp2 == Temperature.begin()) + { + temp1 = Temperature.begin(); temp2++; + } + else + { + temp1++; temp2++; + } + } + else + { + FF -= F(factor, a, b, r, 0.0); + return AirPressure.getValue() * exp(FF); + } + } + } + } + + return AirPressure.getValue() * exp(FF); +}