Arte SheetsLearn. Try. Understand.

Engineering

Streeter-Phelps Dissolved Oxygen (DO) Sag Curve & Critical Time formulas

Model river dissolved oxygen depletion and recovery downstream of a wastewater discharge using Streeter-Phelps deficit D(t), remaining DO = DO_sat - D(t), and critical sag travel time t_c.

A simplified oxygen-deficit model after mixing

Use ultimate carbonaceous oxygen demand L0 and initial deficit D0 after complete mixing, both in mg/L. The positive rate constants k1 and k2 use natural-exponential decay in day^-1; do not insert base-10 decay coefficients unchanged. Travel time is in days and saturation oxygen is held constant.

This model omits additional discharges, dispersion, sediment demand, nitrification, photosynthesis and changing hydraulic or temperature conditions. It estimates a curve under these assumptions, not an exact river location or a species-independent fish-stress threshold. Distance additionally requires a travel-velocity model.

Equal rate constants have a finite limiting solution: D(t)=(D0+k1×L0×t)EXP(-k1×t). For nearly equal rates the example uses a local series to avoid subtracting nearly identical exponentials.

The maximum deficit on t>=0 occurs at the mixing point if the initial deficit is already decreasing or if L0 is zero. Otherwise calculate the positive stationary time. Negative predicted oxygen is flagged as outside the aerobic model rather than displayed as an actual negative concentration.

Water-Quality MetricFormulaL0=20, D0=1.5, k1=0.25, k2=0.50, t=2d (DOsat=9.2)Outfall Mixing Point (t = 0)
DO Deficit D(t) (mg/L)((k1*L0)/(k2-k1))*(e^-k1t - e^-k2t) + D0*e^-k2t5.32 mg/L deficit1.50 mg/L (= D_0)
Modelled DO (mg/L)DO_sat - D(t)3.88 mg/L under model assumptions7.70 mg/L
Critical Sag Time t_c (days)LN((k2/k1)*(1 - D0*(k2-k1)/(k1*L0))) / (k2-k1)2.46 days downstream2.46 days

Streeter-Phelps Downstream Dissolved Oxygen Deficit D(t) (mg/L)

Compute the raw deficit before rounding. The small-difference branch includes the equal-rate limit and uses a cubic series when |(k2−k1)t| is below 10^-5.

=IF(COUNT(B2:B7)<>6,"Invalid inputs",IF(OR(B2<0,B3<0,B4<=0,B5<=0,B6<0,B7<=0,B3>B7),"Invalid inputs",ROUND(LET(deltaRate,B5-B4,scaledDelta,deltaRate*B6,decayTerm,IF(ABS(scaledDelta)<0.00001,B6*EXP(-B4*B6)*(1-scaledDelta/2+scaledDelta^2/6-scaledDelta^3/24),(EXP(-B4*B6)-EXP(-B5*B6))/deltaRate),B4*B2*decayTerm+B3*EXP(-B5*B6)),2)))

Critical Travel Time t_c to Minimum River Oxygen (Days)

Return the time of the largest deficit over t>=0. Zero denotes the boundary at initial mixing, not a failed logarithm. The near-equal branch uses a small-logarithm series.

=IF(COUNT(B2:B7)<>6,"Invalid inputs",IF(OR(B2<0,B3<0,B4<=0,B5<=0,B6<0,B7<=0,B3>B7),"Invalid inputs",IF(OR(B2=0,B4*B2<=B5*B3),0,LET(deltaRate,B5-B4,shapeTerm,(B4*B2-B5*B3)/(B4^2*B2),logDelta,deltaRate*shapeTerm,ROUND(IF(ABS(logDelta)<0.00001,shapeTerm*(1-logDelta/2+logDelta^2/3-logDelta^3/4),LN(1+logDelta)/deltaRate),2)))))

Modelled remaining dissolved oxygen

Subtract the unrounded deficit from saturation oxygen. A deficit above saturation returns an out-of-model message.

=IF(COUNT(B2:B7)<>6,"Invalid inputs",IF(OR(B2<0,B3<0,B4<=0,B5<=0,B6<0,B7<=0,B3>B7),"Invalid inputs",LET(deficit,LET(deltaRate,B5-B4,scaledDelta,deltaRate*B6,decayTerm,IF(ABS(scaledDelta)<0.00001,B6*EXP(-B4*B6)*(1-scaledDelta/2+scaledDelta^2/6-scaledDelta^3/24),(EXP(-B4*B6)-EXP(-B5*B6))/deltaRate),B4*B2*decayTerm+B3*EXP(-B5*B6)),IF(deficit>B7,"Outside aerobic model",ROUND(B7-deficit,2)))))

Try the example

Use the original values or change them to test your understanding.

Further reading