CNS calculation headaches

Robert Helling helling at
Sat Aug 10 06:19:42 PDT 2019


> On 10. Aug 2019, at 14:16, Willem Ferguson <willemferguson at> wrote:
> The bug that that was encountered during dive planning by one of the users leads to an interesting point about the handling of dives that are not well-behaved, i.e. with pO2 above 1.6. The NOAA tables for calculating CNS toxicity only go up to a pO2 of 1.6. Above that our knowledge is so sparse that we do not really have a basis for calculating CNS toxicity. Using the standard algorithm, a negative CNS value is created when attempting to calculate CNS% at pO2 higher than 1.65. Following the Shearwater web site, they implement a rule of "1% CNS for every 4 minutes above pO2=1.6". This means that, after 400 seconds above pO2 of 1.6, an additional 100% of CNS is accrued. There are two problems.
> 1) The basis for using the Shearwater rule of 1% per 4s is unclear. I have read most of the literature around this (including Clark & Lambersen) and I admit I did not come across the 4s-1% generalisation. But the literature is really lengthy and I could easily have missed it. So I am note sure there is enough information available about CNS toxicity above 1.6 to really make any firm statement.
> 2) In diving practice there is a real problem. If I have 9 min of deco to do at 6m with oxygen I am right at the 1.6 pO2 limit. I might be in sea water at 6m, in which case I will be some 3% over the 1.6 limit. In this case I will accrue ~ 125% of CNS toxicity during my 9 min deco stop. This is blatantly not helpful and probably not realistic: using the 1%- 4s yard stick does not contribute to a sane CNS% value during that particular deco stop.
> Assuming that Subsurface should attempt to take real dive conditions into account in which the pO2 may well exceed 1.6, the question is how to handle such cases since this is an unknown domain. One approach could be to treat all pO2 values > 1.65 as if it was at 1.65. In cases with pO2 above 1.65 this results in an underestimate of CNS%, but in the case of my deco stop at 6m it would be immensely more helpful than using a 1%-4-minute thumb-suck.

I am not sure if I would be super happy underestimating the CNS value by much as it might give a false sense of safety to the user. What about the following:

Keeping the value for 1.6bar for a bit more, say 1.7bar or 1.65bar or maybe a slightly more conservative but constant value and then simply refuse to calculate a CNS value for partial pressures above that. I think this would be a safer approach than guessing.

I have updated my pull request accordingly.

What do you think?


PS: The original problem arose as the interpolated table value is used in the denominator of the cns += formula and would result in a pole when the extrapolated table value reaches 0. Maybe we should redo the whole thing and linearly interpolate the inverses of the table value rather than the table value. For those an extrapolation would be more sensible.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: Message signed with OpenPGP
URL: <>

More information about the subsurface mailing list