Hi. After "Force TTS/NDL calculation off if things take too long" i kinda grew tired of always re-enabling the TTS/NDL button, so i thought about it a bit.
Attached is a one patch that uses the TTS from the previous data point if the stopdepth and stoptime calculated are the same. This shows me a speedup of about 4 times on some of my longer dives. Attached is also another variant that doesn't calculate NDL/TTS on every sample, but only every 60 seconds. I run my OSTC3 with 2s sample interval so thats also quite a speedup. I can see us applying any of these two techniques, as long as we stop disabling TTS/NDL when i would like to look at the numbers from my dives. //Anton -- Anton Lundin +46702-161604
diff --git i/profile.c w/profile.c index b40ef62..19bc03e 100644 --- i/profile.c +++ w/profile.c @@ -1070,6 +1070,15 @@ static void calculate_ndl_tts(double tissue_tolerance, struct plot_data *entry, &dive->cylinder[cylinderindex].gasmix, time_stepsize, entry->po2 * 1000, dive); if (deco_allowed_depth(tissue_tolerance, surface_pressure, dive, 1) <= next_stop) { + /* if we have the same stopdepth and stoptime as the previous datapoint + * just reuse that tts and bail here + */ + struct plot_data *prev_entry = (entry - 1); + if (prev_entry->stopdepth_calc == entry->stopdepth_calc && prev_entry->stoptime_calc == entry->stoptime_calc) { + entry->tts_calc = prev_entry->tts_calc; + break; + } + /* move to the next stop and add the travel between stops */ for (; ascent_depth > next_stop; ascent_depth -= ascent_mm_per_deco_step, entry->tts_calc += ascent_s_per_deco_step) add_segment(depth_to_mbar(ascent_depth, dive) / 1000.0,
diff --git i/profile.c w/profile.c index b40ef62..5c36672 100644 --- i/profile.c +++ w/profile.c @@ -1088,6 +1088,7 @@ void calculate_deco_information(struct dive *dive, struct divecomputer *dc, stru int i; double surface_pressure = (dc->surface_pressure.mbar ? dc->surface_pressure.mbar : get_surface_pressure_in_mbar(dive, true)) / 1000.0; double tissue_tolerance = 0; + int last_ndl_tts_calc_time = 0; for (i = 1; i < pi->nr; i++) { struct plot_data *entry = pi->entry + i; int j, t0 = (entry - 1)->sec, t1 = entry->sec; @@ -1112,6 +1113,17 @@ void calculate_deco_information(struct dive *dive, struct divecomputer *dc, stru /* should we do more calculations? * We don't for print-mode because this info doesn't show up there */ if (prefs.calcndltts && !print_mode) { + /* only calculate ndl/tts on every 60 seconds */ + if ((entry->sec - last_ndl_tts_calc_time) < 60) { + struct plot_data *prev_entry = (entry - 1); + entry->stoptime_calc = prev_entry->stoptime_calc; + entry->stopdepth_calc = prev_entry->stopdepth_calc; + entry->tts_calc = prev_entry->tts_calc; + entry->ndl_calc = prev_entry->ndl_calc; + continue; + } + last_ndl_tts_calc_time = entry->sec; + /* We are going to mess up deco state, so store it for later restore */ char *cache_data = NULL; cache_deco_state(tissue_tolerance, &cache_data);
_______________________________________________ subsurface mailing list subsurface@hohndel.org http://lists.hohndel.org/cgi-bin/mailman/listinfo/subsurface