The Boyle's law compensation depends on first_stop_pressure.  To produce
profiles similar to other VPM-B implementations, we should calculate it as the
ceiling before starting the ascent.

Commit 159c9eb2c1c19dfbf650f2b0cc28e0ef1f45c964, Compare ceiling to next stop
rather than try to ascent for VPM-B, changed (VPM-B) to consider the current
ceiling rather than an incremental ascent between one stop level and the next.
However, the initial ascent generally steps through several stop levels, so
first_stop_pressure was still not calculated as the ceiling prior to commencing
the calculated ascent.

Signed-off-by: Rick Walsh <[email protected]>
---
 planner.c | 22 +++++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)

diff --git a/planner.c b/planner.c
index aca5a05..9114f32 100644
--- a/planner.c
+++ b/planner.c
@@ -939,6 +939,7 @@ bool plan(struct diveplan *diveplan, char **cached_datap, 
bool is_planner, bool
        int *decostoplevels;
        int decostoplevelcount;
        unsigned int *stoplevels = NULL;
+       int vpmb_first_stop;
        bool stopping = false;
        bool pendinggaschange = false;
        bool clear_to_ascend;
@@ -1100,6 +1101,22 @@ bool plan(struct diveplan *diveplan, char 
**cached_datap, bool is_planner, bool
        bottom_gi = gi;
        bottom_gas = gas;
        bottom_stopidx = stopidx;
+
+       // Find first stop used for VPM-B Boyle's law compensation
+       if (prefs.deco_mode == VPMB) {
+               vpmb_first_stop = deco_allowed_depth(tissue_tolerance, 
diveplan->surface_pressure / 1000, &displayed_dive, 1);
+               if (vpmb_first_stop > 0) {
+                       while (stoplevels[stopidx] > vpmb_first_stop) {
+                               stopidx--;
+                       }
+                       stopidx++;
+                       vpmb_first_stop = stoplevels[stopidx];
+               }
+               first_stop_pressure.mbar = depth_to_mbar(vpmb_first_stop, 
&displayed_dive);
+       } else {
+               first_stop_pressure.mbar = 0;
+       }
+               
        //CVA
        do {
                is_final_plan = (prefs.deco_mode == BUEHLMANN) || 
(previous_deco_time - deco_time < 10);  // CVA time converges
@@ -1119,7 +1136,6 @@ bool plan(struct diveplan *diveplan, char **cached_datap, 
bool is_planner, bool
                breaktime = -1;
                breakcylinder = 0;
                o2time = 0;
-               first_stop_pressure.mbar = 0;
                last_ascend_rate = ascent_velocity(depth, avg_depth, 
bottom_time);
                if ((current_cylinder = get_gasidx(&displayed_dive, &gas)) == 
-1) {
                        report_error(translate("gettextFromC", "Can't find gas 
%s"), gasname(&gas));
@@ -1160,8 +1176,6 @@ bool plan(struct diveplan *diveplan, char **cached_datap, 
bool is_planner, bool
                                stopping = true;
 
                                // Boyles Law compensation
-                               if (first_stop_pressure.mbar == 0)
-                                       first_stop_pressure.mbar = 
depth_to_mbar(depth, &displayed_dive);
                                boyles_law(depth_to_mbar(stoplevels[stopidx], 
&displayed_dive) / 1000.0);
 
                                /* Check we need to change cylinder.
@@ -1215,8 +1229,6 @@ bool plan(struct diveplan *diveplan, char **cached_datap, 
bool is_planner, bool
                                        stopping = true;
 
                                        // Boyles Law compensation
-                                       if (first_stop_pressure.mbar == 0)
-                                               first_stop_pressure.mbar = 
depth_to_mbar(depth, &displayed_dive);
                                        
boyles_law(depth_to_mbar(stoplevels[stopidx], &displayed_dive) / 1000.0);
                                }
 
-- 
2.4.3

_______________________________________________
subsurface mailing list
[email protected]
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface

Reply via email to