112 if( dt <= SGLimitsd::min() )
115 if( _enabled_node && !_enabled_node->getBoolValue() ) {
117 if( strength != 0.0 ) {
118 if( strength > 0.1 ) {
124 _ridge_lift_fps_node->setDoubleValue( strength );
133 probe_lat_deg[0] = _user_latitude_node->getDoubleValue();
134 probe_lon_deg[0] = _user_longitude_node->getDoubleValue();
135 probe_elev_m[0] = _ground_elev_node->getDoubleValue() * SG_FEET_TO_METER;
138 SGGeod myGeodPos = SGGeod::fromDegM( probe_lon_deg[0], probe_lat_deg[0], 20000.0 );
139 SGGeoc myGeocPos = SGGeoc::fromGeod( myGeodPos );
140 double ground_wind_from_rad = _surface_wind_from_deg_node->getDoubleValue() * SG_DEGREES_TO_RADIANS;
143 for (
unsigned i = 1;
i <
sizeof(probe_elev_m)/
sizeof(probe_elev_m[0]);
i++) {
144 SGGeoc probe = myGeocPos.advanceRadM( ground_wind_from_rad, dist_probe_m[
i] );
146 SGGeod probeGeod = SGGeod::fromGeoc( probe );
147 probe_lat_deg[
i] = probeGeod.getLatitudeDeg();
148 probe_lon_deg[
i] = probeGeod.getLongitudeDeg();
149 if (!
globals->get_scenery()->get_elevation_m( probeGeod, probe_elev_m[
i], NULL )) {
151 probe_elev_m[
i] = probe_elev_m[
i-1];
156 double adj_slope[
sizeof(slope)];
157 slope[0] = (probe_elev_m[0] - probe_elev_m[1]) / dist_probe_m[1];
158 slope[1] = (probe_elev_m[1] - probe_elev_m[2]) / dist_probe_m[2];
159 slope[2] = (probe_elev_m[2] - probe_elev_m[3]) / dist_probe_m[3];
160 slope[3] = (probe_elev_m[4] - probe_elev_m[0]) / -dist_probe_m[4];
162 for (
unsigned i = 0;
i <
sizeof(slope)/
sizeof(slope[0]);
i++)
163 adj_slope[
i] = sin(atan(5.0 * pow ( (fabs(slope[
i])),1.7) ) ) *SG_SIGN<double>(slope[
i]);
168 if ( adj_slope [2] < 0.0 ) {
174 if ( ( adj_slope [0] >= 0.0 ) && ( adj_slope [3] < 0.0 ) ) {
179 lift_factor = adj_slope[0]+adj_slope[1]+adj_slope[2]+adj_slope[3];
186 double user_altitude_agl_m = _user_altitude_agl_ft_node->getDoubleValue() * SG_FEET_TO_METER;
189 double boundary2_m = 130.0;
190 if (lift_factor < 0.0) {
191 double highest_probe_temp= std::max ( probe_elev_m[1], probe_elev_m[2] );
192 double highest_probe_downwind_m= std::max ( highest_probe_temp, probe_elev_m[3] );
193 boundary2_m = highest_probe_downwind_m - probe_elev_m[0];
198 agl_factor = 0.5+0.5*user_altitude_agl_m /
BOUNDARY1_m ;
199 }
else if ( user_altitude_agl_m < boundary2_m ) {
202 agl_factor = exp(-(2 + probe_elev_m[0] / 2000) *
203 (user_altitude_agl_m - boundary2_m) / std::max(probe_elev_m[0],200.0));
206 double ground_wind_speed_mps = _surface_wind_speed_node->getDoubleValue() * SG_NM_TO_METER / 3600;
207 double lift_mps = lift_factor* ground_wind_speed_mps * agl_factor;
210 strength =
fgGetLowPass( strength, lift_mps * SG_METER_TO_FEET, dt );
211 _ridge_lift_fps_node->setDoubleValue( strength );