[PATCH] VPM-B: Calculate first_stop_pressure before starting ascent

Rick Walsh rickmwalsh at gmail.com
Fri Aug 21 21:41:53 PDT 2015


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 <rickmwalsh at gmail.com>
---
 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



More information about the subsurface mailing list