X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FEnvironment%2Fenvironment.cxx;h=9a5755e3db3d7f8cabeaa89a739547c8b28fb71f;hb=386aefe69358ce41a11c9afeb8f56e26758fe56b;hp=eed66fa17cd28c5ece0da1d192b53254cc7e79c9;hpb=7b6d15d537308363fa8967e0edda879a80ddaa21;p=flightgear.git diff --git a/src/Environment/environment.cxx b/src/Environment/environment.cxx index eed66fa17..9a5755e3d 100644 --- a/src/Environment/environment.cxx +++ b/src/Environment/environment.cxx @@ -29,8 +29,6 @@ #include -#include - #include #include #include @@ -140,6 +138,9 @@ void FGEnvironment::_init() wind_from_north_fps = 0; wind_from_east_fps = 0; wind_from_down_fps = 0; + thermal_lift_fps = 0; + ridge_lift_fps= 0; + local_weather_lift_fps=0; altitude_half_to_sun_m = 1000; altitude_tropo_top_m = 10000; #ifdef USING_TABLES @@ -147,7 +148,7 @@ void FGEnvironment::_init() #endif _recalc_density(); _recalc_relative_humidity(); - + live_update = true; } FGEnvironment::FGEnvironment() @@ -180,6 +181,9 @@ FGEnvironment::copy (const FGEnvironment &env) wind_from_north_fps = env.wind_from_north_fps; wind_from_east_fps = env.wind_from_east_fps; wind_from_down_fps = env.wind_from_down_fps; + thermal_lift_fps = env.thermal_lift_fps; + ridge_lift_fps= env.ridge_lift_fps; + local_weather_lift_fps = env.local_weather_lift_fps; turbulence_magnitude_norm = env.turbulence_magnitude_norm; turbulence_rate_hz = env.turbulence_rate_hz; } @@ -203,6 +207,7 @@ maybe_copy_value (FGEnvironment * env, const SGPropertyNode * node, void FGEnvironment::read (const SGPropertyNode * node) { + bool live_update = set_live_update( false ); maybe_copy_value(this, node, "visibility-m", &FGEnvironment::set_visibility_m); @@ -235,6 +240,15 @@ FGEnvironment::read (const SGPropertyNode * node) maybe_copy_value(this, node, "turbulence/rate-hz", &FGEnvironment::set_turbulence_rate_hz); + + // calculate derived properties here to avoid duplicate expensive computations + _recalc_ne(); + _recalc_alt_pt(); + _recalc_alt_dewpoint(); + _recalc_density(); + _recalc_relative_humidity(); + + set_live_update(live_update); } @@ -346,6 +360,24 @@ FGEnvironment::get_wind_from_down_fps () const return wind_from_down_fps; } +double +FGEnvironment::get_thermal_lift_fps () const +{ + return thermal_lift_fps; +} + +double +FGEnvironment::get_ridge_lift_fps () const +{ + return ridge_lift_fps; +} + +double +FGEnvironment::get_local_weather_lift_fps () const +{ + return local_weather_lift_fps; +} + double FGEnvironment::get_turbulence_magnitude_norm () const { @@ -379,19 +411,23 @@ FGEnvironment::set_temperature_sea_level_degc (double t) temperature_sea_level_degc = t; if (dewpoint_sea_level_degc > t) dewpoint_sea_level_degc = t; - _recalc_alt_pt(); - _recalc_density(); + if( live_update ) { + _recalc_alt_pt(); + _recalc_density(); + } } void FGEnvironment::set_temperature_degc (double t) { temperature_degc = t; - _recalc_sl_temperature(); - _recalc_sl_pressure(); - _recalc_alt_pt(); - _recalc_density(); - _recalc_relative_humidity(); + if( live_update ) { + _recalc_sl_temperature(); + _recalc_sl_pressure(); + _recalc_alt_pt(); + _recalc_density(); + _recalc_relative_humidity(); + } } void @@ -400,68 +436,113 @@ FGEnvironment::set_dewpoint_sea_level_degc (double t) dewpoint_sea_level_degc = t; if (temperature_sea_level_degc < t) temperature_sea_level_degc = t; - _recalc_alt_dewpoint(); - _recalc_density(); + if( live_update ) { + _recalc_alt_dewpoint(); + _recalc_density(); + } } void FGEnvironment::set_dewpoint_degc (double t) { dewpoint_degc = t; - _recalc_sl_dewpoint(); - _recalc_density(); - _recalc_relative_humidity(); + if( live_update ) { + _recalc_sl_dewpoint(); + _recalc_density(); + _recalc_relative_humidity(); + } } void FGEnvironment::set_pressure_sea_level_inhg (double p) { pressure_sea_level_inhg = p; - _recalc_alt_pt(); - _recalc_density(); + if( live_update ) { + _recalc_alt_pt(); + _recalc_density(); + } } void FGEnvironment::set_pressure_inhg (double p) { pressure_inhg = p; - _recalc_sl_pressure(); - _recalc_density(); + if( live_update ) { + _recalc_sl_pressure(); + _recalc_density(); + } } void FGEnvironment::set_wind_from_heading_deg (double h) { wind_from_heading_deg = h; - _recalc_ne(); + if( live_update ) { + _recalc_ne(); + } } void FGEnvironment::set_wind_speed_kt (double s) { wind_speed_kt = s; - _recalc_ne(); + if( live_update ) { + _recalc_ne(); + } } void FGEnvironment::set_wind_from_north_fps (double n) { wind_from_north_fps = n; - _recalc_hdgspd(); + if( live_update ) { + _recalc_hdgspd(); + } } void FGEnvironment::set_wind_from_east_fps (double e) { wind_from_east_fps = e; - _recalc_hdgspd(); + if( live_update ) { + _recalc_hdgspd(); + } } void FGEnvironment::set_wind_from_down_fps (double d) { wind_from_down_fps = d; - _recalc_hdgspd(); + if( live_update ) { + _recalc_hdgspd(); + } +} + +void +FGEnvironment::set_thermal_lift_fps (double th) +{ + thermal_lift_fps = th; + if( live_update ) { + _recalc_updraft(); + } +} + +void +FGEnvironment::set_ridge_lift_fps (double ri) +{ + ridge_lift_fps = ri; + if( live_update ) { + _recalc_updraft(); + } +} + +void +FGEnvironment::set_local_weather_lift_fps (double lwl) +{ + local_weather_lift_fps = lwl; + if( live_update ) { + _recalc_updraft(); + } } void @@ -480,24 +561,30 @@ void FGEnvironment::set_elevation_ft (double e) { elevation_ft = e; - _recalc_alt_dewpoint(); - _recalc_alt_pt(); - _recalc_density(); - _recalc_relative_humidity(); + if( live_update ) { + _recalc_alt_pt(); + _recalc_alt_dewpoint(); + _recalc_density(); + _recalc_relative_humidity(); + } } void FGEnvironment::set_altitude_half_to_sun_m (double alt) { - altitude_half_to_sun_m = alt; - _recalc_density_tropo_avg_kgm3(); + altitude_half_to_sun_m = alt; + if( live_update ) { + _recalc_density_tropo_avg_kgm3(); + } } void FGEnvironment::set_altitude_tropo_top_m (double alt) { - altitude_tropo_top_m = alt; - _recalc_density_tropo_avg_kgm3(); + altitude_tropo_top_m = alt; + if( live_update ) { + _recalc_density_tropo_avg_kgm3(); + } } @@ -546,6 +633,12 @@ FGEnvironment::_recalc_ne () sin(wind_from_heading_deg * SGD_DEGREES_TO_RADIANS); } +void +FGEnvironment::_recalc_updraft () +{ + wind_from_down_fps = thermal_lift_fps + ridge_lift_fps + local_weather_lift_fps ; +} + // Intended to help with the interpretation of METAR data, // not for random in-flight outside-air temperatures. void @@ -569,7 +662,7 @@ FGEnvironment::_recalc_sl_temperature () double t_strato = ISA_def[1].temp - atmodel::freezing; if (temperature_degc < t_strato) temperature_sea_level_degc = t_strato; else temperature_sea_level_degc = - temperature_degc - elevation_ft * ISA_def[0].lapse; + temperature_degc + elevation_ft * atmodel::foot * ISA_def[0].lapse; // Alternative implemenation: // else temperature_sea_level_inhg = T_layer(0., elevation_ft * foot, @@ -631,7 +724,6 @@ FGEnvironment::_recalc_alt_pt () << " and " << temperature_sea_level_degc << " :: " << this << " # " << count); - ///////////////////////////////////raise(SIGUSR1); } } #endif @@ -682,12 +774,26 @@ FGEnvironment::_recalc_density_tropo_avg_kgm3 () void FGEnvironment::_recalc_relative_humidity () { +/* double vaporpressure = 6.11 * pow(10.0, ((7.5 * dewpoint_degc) / ( 237.7 + dewpoint_degc))); double sat_vaporpressure = 6.11 * pow(10.0, ((7.5 * temperature_degc) / ( 237.7 + temperature_degc)) ); relative_humidity = 100 * vaporpressure / sat_vaporpressure ; + + with a little algebra, this gets the same result and spares two multiplications and one pow() +*/ + double a = (7.5 * dewpoint_degc) / ( 237.7 + dewpoint_degc); + double b = (7.5 * temperature_degc) / ( 237.7 + temperature_degc); + relative_humidity = 100 * pow(10.0,a-b); } +bool +FGEnvironment::set_live_update( bool _live_update ) +{ + bool b = live_update; + live_update = _live_update; + return b; +} //////////////////////////////////////////////////////////////////////// @@ -719,6 +825,10 @@ void interpolate (const FGEnvironment * env1, const FGEnvironment * env2, double fraction, FGEnvironment * result) { + // don't calculate each internal property every time we set a single value + // we trigger that at the end of the interpolation process + bool live_update = result->set_live_update( false ); + result->set_visibility_m (do_interp(env1->get_visibility_m(), env2->get_visibility_m(), @@ -729,7 +839,7 @@ interpolate (const FGEnvironment * env1, const FGEnvironment * env2, env2->get_temperature_sea_level_degc(), fraction)); - result->set_dewpoint_degc + result->set_dewpoint_sea_level_degc (do_interp(env1->get_dewpoint_sea_level_degc(), env2->get_dewpoint_sea_level_degc(), fraction)); @@ -763,6 +873,15 @@ interpolate (const FGEnvironment * env1, const FGEnvironment * env2, (do_interp(env1->get_turbulence_rate_hz(), env2->get_turbulence_rate_hz(), fraction)); + + // calculate derived properties here to avoid duplicate expensive computations + result->_recalc_ne(); + result->_recalc_alt_pt(); + result->_recalc_alt_dewpoint(); + result->_recalc_density(); + result->_recalc_relative_humidity(); + + result->set_live_update(live_update); } // end of environment.cxx