diff options
author | Rick Walsh <rickmwalsh@gmail.com> | 2015-08-22 14:41:53 +1000 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2015-08-23 07:21:17 -0700 |
commit | 634e69866464c986c09dcbacfdabdede1c102b25 (patch) | |
tree | 5c2bb470ee8996824876770233a9ce5bb4db6a93 /planner.c | |
parent | 898ea6acb541d76b86320538ae56c9fcd6f151be (diff) | |
download | subsurface-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.c | 22 |
1 files changed, 17 insertions, 5 deletions
@@ -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); } |