Balance de Oxígeno Disuelto: la Curva de Depresión y sus Fuentes y Sumideros

El oxígeno disuelto es el indicador que mejor resume el estado de un río, porque casi todo lo que ocurre en el cauce termina reflejándose en él. En esta página se desarrolla el término central del modelo, la ecuación de reaireación de oxígeno disuelto, y su papel en la modelación de la curva de depresión de oxígeno a lo largo del perfil longitudinal bajo carga contaminante.

Ecuación Diferencial del Balance de Oxígeno

La tasa de cambio del oxígeno disuelto a lo largo del recorrido del agua se expresa así:

dDOdt=ka(DOsatDO)kdcCBODfkdcsCBODsronknNH4SODH\frac{dDO}{dt} = k_a(DO_{sat} - DO) - k_{dc} \cdot CBOD_f - k_{dcs} \cdot CBOD_s - r_{on} \cdot k_n \cdot NH_4 - \frac{SOD}{H}

Interpretación Término por Término

TérminoExpresiónEfecto sobre el ODMagnitud Típica Fluvial
Reaireación atmosféricaka · (DOsat − DO)Aporte (+) cuando el OD está por debajo de la saturación1–10 mg/L/d
Oxidación de la DBO rápidakdc · CBODfConsumo (−) por oxidación de la materia orgánica lábil0.5–5 mg/L/d
Oxidación de la DBO lentakdcs · CBODsConsumo (−) sostenido por la fracción refractaria0.01–0.5 mg/L/d
Demanda nitrogenadaron · kn · NH₄Consumo (−) por la oxidación bacteriana del amonio0.5–3 mg/L/d
Demanda de oxígeno del sedimentoSOD / HConsumo (−) que el lecho ejerce sobre la columna de agua0.5–5 mg/L/d

La Curva de Depresión de Oxígeno (DO Sag Curve)

El perfil de oxígeno disuelto en un río después de una descarga de aguas residuales se conoce como la curva de depresión de oxígeno. Esta curva muestra cómo el OD cae hasta un punto crítico para luego recuperarse mediante la reaireación natural:

Demanda de Oxígeno Nitrogenada (NOD)

El amonio presente en el agua consume oxígeno cuando las bacterias nitrificantes lo oxidan y lo transforman en nitrato:

NH4++2O2NO3+2H++H2ONH_4^+ + 2O_2 \rightarrow NO_3^- + 2H^+ + H_2O

La estequiometría de esa reacción fija la relación: ron=4.57r_{on} = 4.57 mg de O₂ por cada 1 mg de NH₄-N oxidado. Por eso las cargas de nitrógeno de origen agroindustrial pesan tanto en el balance de oxígeno.

Demanda de Oxígeno del Sedimento (SOD)

La SOD es la tasa a la que el lecho consume oxígeno de la columna de agua que está en contacto con él, producto de la descomposición anaerobia de la materia orgánica depositada en el fondo. Se expresa como un flujo por unidad de área (gr O₂ por mt² por día) y se convierte a una tasa volumétrica dividiéndola por la profundidad del tramo:

Tasa volumeˊtrica=SODH(mg/L/d)\text{Tasa volumétrica} = \frac{SOD}{H} \quad \text{(mg/L/d)}

Tasas de SOD típicas según el sustrato del lecho

Tipo de SustratoSOD (g/m²/día)Escenario Típico
Lecho de grava o roca en cuenca alta0.2 – 1.0Cauce sin contaminación ni acumulación de lodos
Lecho aluvial de limo y arcilla1.0 – 2.0Enriquecimiento de nutrientes incipiente
Manto de lodo orgánico blando2.0 – 5.0Aguas abajo de una PTAR municipal activa
Lodo con material industrial en descomposición5.0 – 10.0Zonas anaerobias por descargas de industria
Sedimento urbano de canal o estuario2.0 – 10.0Ríos que reciben alcantarillado sin tratar

Saturación de Oxígeno a Nivel del Mar

Valores de OD de saturación a 0 M.S.N.M y 1 Atm

Temperatura (°C)OD sat (mg/L)Temperatura (°C)OD sat (mg/L)Temperatura (°C)OD sat (mg/L)
014.621011.29209.09
213.841210.78228.74
413.131410.31248.42
612.48169.87268.11
811.87189.47287.83

Implementación en el Motor Python

pythonkinetics.py — cálculo del balance de oxígeno disuelto
def calculate_do_balance(do_in, cbod_fast, cbod_slow, nh4, rates, reach, temp, dt):
    ka = reach.get('ka', 0)
    ka_t = temp_correction(ka, 1.024, temp)  # Correccion por temperatura

    dosat = calculate_dosat(temp, reach.get('elev', 0))

    kdc = temp_correction(rates['kdc'], rates.get('kdc_theta', 1.047), temp)
    kdcs = temp_correction(rates['kdcs'], rates.get('kdcs_theta', 1.047), temp)
    kn = temp_correction(rates.get('kn', 0), rates.get('kn_theta', 1.083), temp)
    ron = rates.get('ron', 4.57)  # Relacion estequiometrica O2 por N oxidado
    sod = reach.get('SOD', 0)
    h = reach.get('H', 1.0)

    # Aporte de oxigeno desde la atmosfera
    reaeration = ka_t * (dosat - do_in) * dt
    # Sumideros: oxidacion de la DBO, nitrificacion y demanda del sedimento
    cbod_demand_f = kdc * cbod_fast * dt
    cbod_demand_s = kdcs * cbod_slow * dt
    nod_demand = ron * kn * nh4 * dt
    sod_demand = (sod / h) * dt if h > 0 else 0

    do_out = do_in + reaeration - cbod_demand_f - cbod_demand_s - nod_demand - sod_demand
    return max(do_out, 0.0)  # El OD no puede ser negativo