[PATCH 1/2] Calculate VPM-B ceiling outside of planner
Rick Walsh
rickmwalsh at gmail.com
Thu Oct 29 04:53:52 PDT 2015
On 29 October 2015 at 18:53, Rick Walsh <rickmwalsh at gmail.com> wrote:
> Robert,
>
> On 29 October 2015 at 07:18, Robert C. Helling <helling at atdotde.de> wrote:
>
>> Hi Rick,
>>
>> here are some more comments but I think we are converging on all the
>> points.
>>
>> On 28 Oct 2015, at 13:10, Rick Walsh <rickmwalsh at gmail.com> wrote:
>>
>>> >
>>> > bool off_gassing = false
>>> >
>>> > and then in the loop
>>> >
>>> > off_gassing ||= (pn2_oversat < 0) || (phe_oversat <0);
>>> >
>>> > and finally change add_segment from void to bool by returning
>>> off_gassing. Then we can simply add all the time for all segments the we
>>> added which return true.
>>>
>>> This would work, but will achieve almost the same outcome. Taking deco
>>> time as time from max ceiling until time of clear ceiling implies that at
>>> least one tissues, the leading tissue, is off-gassing. With a very deep
>>> (setting deepest ceiling) to shallow (shallower ceiling) to deep (all
>>> tissues on-gas and ceiling deepens but not to max), there could be a small
>>> difference in calculated deco time.
>>>
>> A problem with this approach is that with a deep -> shallow -> deeper
>> (setting deepest ceiling) profile is that it would start counting deco time
>> before we are in the real ascent phase and actual offgassing. I don't
>> believe we should be distributing the extra bubble volume allowed by the
>> CVA over this section. I have kept it as is, but happy to discuss further.
>>
>>
>> This is really about how to interpret the (in itself not very logical)
>> philosophy of the model. I would argue, that whenever the tissues are
>> oversaturated compared to the ambient pressure we are adding gas to the
>> bubbles and those are there to stay (their decay is supposed to have a half
>> time of two weeks). So, there is „free gas“ no matter if we later go to
>> greater depth again or not. So I would count it. Or, maybe more convincing:
>> Imagine a dive where you do something which in the real world would be
>> rather stupid: You do all you stops and when at last the 3m ceiling clears,
>> you realise that the anchor needs to be freed. So you do a final bounce to
>> the bottom and then ascent. In that case, you would want to count all the
>> bubbles of the real deco not just those of the bounce.
>>
>> Yes, how should the philosophy of model be interpreted? It's especially
> hard when to my knowledge, nothing has been documented for interpreting
> actual dives.
>
> I was actually considering the case of a dive with a final bounce. My
> rationale was dropped equipment, rather than freeing an anchor, but the
> profile is similar. I think an important feature of a final bounce, after
> clearing the ceiling (or nearly clearing the ceiling) from the main dive
> would be that any deco ceiling from the bounce would be shallower than the
> maximum ceiling of the main part of the dive. If that weren't the case,
> there'd be a significant deco obligation, the calculated deco time would be
> much longer, and the boat captain would not be happy that we'd caused him
> to wait an extra 45 minutes.
>
> Assuming the bounce ceiling is shallower than the deepest ceiling, the
> deco time calculated as [runtime when ceiling cleared] - [runtime of
> deepest ceiling] does count all the bubbles of the real deco. In fact it
> would be a little bit longer than that calculated as [total offgassing
> time], because the offgassing time wouldn't include the bounce descent. In
> practice, the difference will be very little - a minute here or there
> doesn't make much difference to the CVA.
>
The attached patch keeps the deco_time calculation as it was.
>
>>
>>> >
>>> > 2) I don’t really understand what you are doing
>>> with first_ceiling_pressure_set. It seems to me you want to pick up the
>>> first step after the maximum of the ceiling. So you look for a segment
>>> where the ceiling goes up but in the previous step it didn’t. Why don’t you
>>> simply memorise the last step where the ceiling gets deeper (it should be
>>> the previous), by getting rid of first_ceiling_pressure_set and simply doing
>>> >
>>> > if (entry->ceiling > first_ceiling) {
>>> > first_ceiling = entry->ceiling;
>>> > first_ceiling_pressure.mbar = depth_to_mbar(first_ceiling, dive);
>>> > }
>>> >
>>> > This would give you the value for the maximum ceiling.
>>>
>>> Yes, that's much simpler way to achieve the same thing. I'll do that.
>>>
>> I tried doing that. But it messes up the setting of the gradients.
>> Until we reach the deepest ceiling, we want to use first_gradient, after
>> setting the deepest ceiling, we want to use next_gradient (set once, when
>> first_ceiling_pressure is set) with the approximated deco_time. To
>> distinguish, I have used the first_ceiling_pressure_set boolean variable.
>>
>>
>> I don’t follow you here. Next gradient is about the next round of the
>> CVA. What you say sounds more like you are talking about the Boyle
>> compensation. Taking care of the latter is rather trivial: When
>> entry->ceiling >= first_ceiling you don’t compensate and otherwise you do.
>> (First ceiling is actually the max_ceiling up to that point).
>>
>> Sorry, I didn't explain that well at all. The first pass is used to
> calculate the deepest ceiling. After the deepest ceiling is set, we are in
> "ascent mode". Like in the planner, the CVA calculations are based on this
> point forward. We want to run vpmb_next_gradient at this point, but not
> after it (like in the planner, when it is run at the start of the CVA
> loop). I used first_ceiling_pressure_set as a marker for whether we should
> update the gradients.
>
> vpmb_next_gradient is set once only for the subsequent iteration(s) (at
> the end of the previous iteration), so this is filtered out while looping
> through the samples by testing for the bool first_iteration.
>
> Looking at the code again, I agree that rather than testing for
> !first_ceiling_pressure_set, we should be able to test for entry->ceiling
> >= first_ceiling. I'll have another go at this - if I can get it to work,
> it should remove a few lines of code.
>
It works, and a few lines of code have been removed. No more
first_ceiling_pressure_set.
I also made it so that first_ceiling is recalculated when iterating. It
makes a very small difference, but because the gradients are updated, the
ceiling can change a little.
>
>>
>>> >
>>> > 3) I am a bit worried that the last hunk copies quite a bit of
>>> non-trivial code. Wouldn’t it be possible to factor this out, i.e. do it
>>> with a loop or as a separate function that the logic is in the source only
>>> once? Otherwise, we are almost guaranteed that when changing the code in
>>> the future we will end up with two inconsistent copies.
>>> >
>>> Yes, at first glance I thought only a little bit of code needed to be
>>> repeated so I thought copying it would be better. But it turns out I
>>> needed to copy most of it. I loop is better.
>>>
>> I have reworked to loop through the code until it deco_time converges, or
>> a max of 3 iterations.
>>
>>
>> In a quick look, I could not see what the loop is run only once if we are
>> not using VPM. But I need to do some more understanding and thinking here.
>>
>> It does only run once if running in the planner, or if using Buhlmann,
> but I should add a comment to explain.
>
> + while ((abs(prev_deco_time - deco_time) >= 30) && (count_iteration <
> 4)) {
> ...
> ...
>
> + if (prefs.deco_mode == VPMB && !in_planner()) {
> ...
> + } else {
> + prev_deco_time = deco_time = 0;
> }
> }
>
> Setting prev_deco_time = deco_time means that the while condition will
> fail. They don't need to be set to zero, but it seemed safer to set to
> something, in case deco_time hadn't been initialized (even though it is),
> and hadn't been set.
>
Comments added to commit
>
> Cheers,
>
> Rick
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.subsurface-divelog.org/pipermail/subsurface/attachments/20151029/f5ba96eb/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Calculate-VPM-B-ceiling-outside-of-planner.patch
Type: text/x-patch
Size: 11116 bytes
Desc: not available
URL: <http://lists.subsurface-divelog.org/pipermail/subsurface/attachments/20151029/f5ba96eb/attachment-0002.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0002-Profile-Display-VPM-B-rather-than-GF-when-in-VPM-B-m.patch
Type: text/x-patch
Size: 5568 bytes
Desc: not available
URL: <http://lists.subsurface-divelog.org/pipermail/subsurface/attachments/20151029/f5ba96eb/attachment-0003.bin>
More information about the subsurface
mailing list