[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