aboutsummaryrefslogtreecommitdiffstats
path: root/planner.c
diff options
context:
space:
mode:
authorGravatar Rick Walsh <rickmwalsh@gmail.com>2015-08-22 14:41:53 +1000
committerGravatar Dirk Hohndel <dirk@hohndel.org>2015-08-23 07:21:17 -0700
commit634e69866464c986c09dcbacfdabdede1c102b25 (patch)
tree5c2bb470ee8996824876770233a9ce5bb4db6a93 /planner.c
parent898ea6acb541d76b86320538ae56c9fcd6f151be (diff)
downloadsubsurface-634e69866464c986c09dcbacfdabdede1c102b25.tar.gz
VPM-B: Calculate first_stop_pressure before starting ascent
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@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'planner.c')
-rw-r--r--planner.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/planner.c b/planner.c
index aca5a0594..ffe890780 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);
}