author: Eddie Yung
In the course of teaching Advanced Nitrox diving (the entry-level technical deep dive course), I always find it necessary to help participants visualize how their theoretical body tissues are loading and unloading inert gases. This led to the development of many charts and plots using MS Excel. Over time, that effort evolved into a full-featured decompression planner written in Python, namely the Orange Deco.
A “fictitious” dive to 75 meters (with a bottom time of 20 minutes) yields a dive plan like the one below. I call it “fictitious” because many would immediately reject using air as the bottom gas for this kind of dive. But for comparison’s sake, let’s just let our “software-sim diver” do the job.
Many decompression planners on the market plot tissue loading alongside M-value lines like what I did above. This helps visualize how “close” tissues are to their M-values before a deco stop is inserted - to prevent crossing that threshold. This makes sense. However, it's far from adequate, if not outright unrealistic. In most of these charts, we often see only the original Bühlmann M-value lines - those perfectly straight lines above. These represent M-values at Gradient Factors 100/100. But in reality, we rarely dive using GF 100/100.
There’s no shortage of online explanations about how gradient factors affect decompression. The general framework is sound: GF Low determines the first stop by limiting tissue pressure to a certain percentage of the M-value gradient. GF High defines the acceptable level of supersaturation at the surface. These explanations often proceed to draw a straight line from the first stop (GF Low) to the surface (GF High), giving the impression that the adjusted M-value lines are simply adjusted versions of the original ones - still straight, just offset.
They’re not.
As soon as we introduce gradient factors into the picture, the resulting (adjusted) M-value lines become curved. See the dotted lines in the plot below.
With gradient factors involved, the adjusted M-value lines - those conservative boundaries that control our ascent - are no longer straight. Why?
In Erik Baker’s paper, the Bühlmann equation is modified by a gradient factor that changes linearly and gradually throughout the ascent. The formula goes:
P = P(ambient) × (GF / b – GF + 1) + (GF × a) <-- formula #
If we plug in GF = 1.0 (i.e., 100%), the formula reduces to the original Bühlmann equation:
P = P(ambient) × (1 / b) + a
The second one is what gives us those straight lines in the first chart. With gradient factor adjustment (formula #), it doesn't. The y-intercept (portion GF × a) and the slope (portion GF / b – GF + 1) both change dynamically. So every data point forming the adjusted M-value curve has its own intercept and slope - making the line anything but straight.
Why do we tend to think GF-adjusted M-value lines are still straight? Probably because the gradient factor itself changes linearly from GF Low to GF High during the ascent. This is true. Once the first stop is known, the GF slope is already fixed and will not change for the rest of the dive:
GF slope = (GF High – GF Low) / (Final Stop Depth – First Stop Depth) <-- formula &
That said, the change of the gradient factor is linear (formula &). But the effect of gradient factor on M-values isn’t (formula #).
It also took me some time during development to realize that, since depth decreases and GF increases during ascent, the GF slope is always negative.
Also, slower tissues may appear to follow straight lines - but mathematically, they don’t.
Now, let’s complicate things by bringing Trimix into the picture. In Baker’s terms, this is called multiple inert gases. The chart now looks something like this:
(for an apples-to-apples comparison, just let our software-sim diver start off breathing hypoxic)
When my software first produced the above chart, I thought it had a bug. The adjusted M-value lines weren’t just curved now - they exhibit visible steps, especially for faster tissues. But no, it wasn't a bug - it was doing exactly what it was supposed to.
Here’s why.
But let’s start from here… If we have 16 tissues for a diver to load up nitrogen, naturally we also have 16 tissues for the same diver to load up helium (say it is helium) when trimix is concerned. Mathematically and programmatically, it is true. In a deco planner software, there are really 32 “credit cards” at play at the same time. But in determining the M-values it is not 32. We still only have 16 M-value lines to care for. Erik Baker combines the M-value of Nitrogen and M-value of Helium via a special (seemingly brutal) manipulation, that is,
Coefficient a = [a(He) × P(He) + a(N₂) × P(N₂)] / [P(He) + P(N₂)]
Coefficient b = [b(He) × P(He) + b(N₂) × P(N₂)] / [P(He) + P(N₂)]
Since a is the y-intercept of M-value lines and the slope is actually 1 / b, you can see that as inert gas proportions vary (even at the same depth, during a deco stop), both the y-intercept and the slope of the M-value line shift. And the more helium in the mix, the more dramatic the change. Think about why?
The steps will be very prominent after a gas switch to, say in the example, EAN50, where inspired helium proportion drops to zero thus largely expediting the off-gas of helium but not as much with nitrogen (that might even rise in proportion as a result of gas change), resulting in very visible steps on the adjusted M-value lines.
As a result, whenever there is a deco stop, the adjusted M-value lines will shift as a result of changing inert gas proportions.
In the chart above, the dotted line is the adjusted M-value line of tissue compartment 1 (5 min). The steps are the result of helium off-gassing at 21m during which the software diver changes gas to EAN50 (this is how we can make use of Orange Deco for educational and illustration purposes)
For software developers, this is where things get really interesting. With the original Bühlmann model (GF 100/100), you can calculate all the M-values in advance, using fixed slopes and y-intercepts - even before letting the software diver descend. With gradient factors, however, you must first iterate to find the initial stop, calculate the GF slope, and then adjust the gradient factor accordingly at each step before computing the M-values. The adjusted M-values are only known once the first stop is determined.
But when multiple inert gases are involved, M-values can only be calculated during the ascent - because they depend not just on depth, but also on the ever-changing proportions of inert gases in the body. Helium and nitrogen off-gas at different rates, and the choice of deco gases has a significant impact on these rates. The model must account for all of this in real time.
In short:
Mixed gases (like Trimix) introduce steps in the M-value lines.
Gradient factors bend those lines.
The final result is a beautiful mess of curved, stepped, constantly evolving boundaries.
(In this article, I intend to use the term "M-value" to refer to the original, unadjusted M-values as defined by Bühlmann. Any adjustments due to gradient factors or similar modifications will be explicitly labeled as "adjusted M-values." However, there may be occasional omissions of this distinction for the sake of readability. Whether adjusted or not, M-values represent the pressure limits that a tissue should not exceed.)