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

Reply via email to