Tránsito de Caudales y Balance de Masa en Segmentos de Río

QUAL2K divide el río en tramos discretos (elementos computacionales) y avanza hacia aguas abajo desde la frontera de cabecera. En cada tramo, realiza un balance de masa conservativo para mezclar el flujo aguas arriba con las fuentes puntuales y difusas antes de aplicar las reacciones cinéticas. Esto se conoce fundamentalmente como el tránsito de caudales en estado estacionario.

Algoritmo de Tránsito de Caudales Aguas Abajo

La simulación procede secuencialmente desde la cabecera (tramo 0) hasta el final (tramo n). En cada tramo ii, se realizan tres pasos en orden:

Paso 1: Balance de Masa por Mezcla Conservativa

La masa que ingresa al tramo ii desde todas las fuentes aguas arriba se suma y se divide por el flujo total para producir concentraciones mezcladas:

Cmix,k=QupCup,k+QpsCps,k+QdsCds,kQtotalC_{mix,k} = \frac{Q_{up} \cdot C_{up,k} + \sum Q_{ps} \cdot C_{ps,k} + \sum Q_{ds} \cdot C_{ds,k}}{Q_{total}}

dónde:

  • QupQ_{up} — caudal aportado desde el tramo i1i-1 frente a frontera directa aguas arriba
  • Cup,kC_{up,k} — concentración aguas arriba del constituyente kk
  • Qps,CpsQ_{ps}, C_{ps} — caudal y concentración de la fuente puntual
  • Qds,CdsQ_{ds}, C_{ds} — caudal y concentración de la fuente difusa
  • Qtotal=Qup+ΣQps+ΣQdsΣQabsQ_{total} = Q_{up} + \Sigma Q_{ps} + \Sigma Q_{ds} - \Sigma Q_{abs}

Inyección de Fuente Puntual

Las fuentes puntuales representan descargas discretas como el efluente de una planta de tratamiento de aguas residuales, afluencias de afluentes, o vertidos industriales. Cada fuente puntual tiene una ubicación xpsx_{ps} (km) a lo largo del río y se asigna al tramo donde recae:

xdn,i1<xpsxdn,ix_{dn,i-1} < x_{ps} \leq x_{dn,i}

Distribución de Fuentes Difusas

Las fuentes difusas (no puntuales) se distribuyen sobre un rango de kilómetros de río. La contribución a cada tramo es proporcional a la longitud de superposición entre la franja de la fuente difusa y el tramo implicado:

Qds,i=QdsLoverlapLdsQ_{ds,i} = Q_{ds} \cdot \frac{L_{overlap}}{L_{ds}}

donde Loverlap=min(xds,max,xr,max)max(xds,min,xr,min)L_{overlap} = \min(x_{ds,max}, x_{r,max}) - \max(x_{ds,min}, x_{r,min}) yLdsL_{ds} es la longitud total de aportación de dicha fuente difusa.

Paso 2: Reacciones Cinéticas

Una vez calculada la mezcla, las reacciones cinéticas de primer orden se aplican a lo largo del tiempo de recorrido Δt\Delta t que le toma al agua en ese preciso tramo. Revisa la sección de Decaimiento DBO y el Ciclo del Nitrógeno para revisar en detalle cómo decaen las ecuaciones base de estas variables en estado estacionario a lo largo de este margen de tiempo de flujo.

Paso 3: Balance de Oxígeno Disuelto

La concentración final de OD se adquiere al someter las adiciones de fuentes de inyección netamente positivas en el balance a las sustracciones (reducción de oxidaciones y respiraciones) y demandas, las cuales representan un drenaje al balance, ver la lectura de Balance de Oxígeno para profundizar su entendimiento algebraico.

Tiempo de Recorrido y Discretización Espacial

El tiempo que le toma a un vector masivo atravesar la estructura del canal hasta su próximo punto es la unidad crítica sobre la cual las ecuaciones cinéticas modelan su avance a través del canal en cuestión. Este se expresa esencialmente de este modo:

Δt=AcLQ86400(dıˊas)\Delta t = \frac{A_c \cdot L}{Q \cdot 86400} \quad \text{(días)}

Si tienes tramos muy prolongados, la variable temporal aumenta proporcionalmente extendiendo dramáticamente a nivel matemático la magnitud por la cual las tasas continuas decaen sobre un contaminante en un mismo punto espacial. La discretización espacial impacta el detalle analítico pero NUNCA debiera violar matemáticamente este parámetro fundamental estratégico del caudal conservatorio fundamental que protege al cálculo.

Implementación en Python

pythonsimulation.py — Bucle de tránsito de descenso de estado contiguo
for i in range(1, nr + 1):
    reach = reaches[i]
    q_up = reaches[i - 1].get('q', 0)

    # Paso 1: Mezcla Conservativa
    mass_in = [c * q_up for c in conc[i - 1]]
    q_total = q_up

    for ps in point_sources:
        if _in_reach(ps['xptt'], x_up, x_dn):
            q_ps = ps['Qptt']
            for k in range(num_vars):
                mass_in[k] += q_ps * ps['cpttMean'][k]
            q_total += q_ps

    c_mix = [m / q_total for m in mass_in]

    # Paso 2: Cinética
    c_kin = apply_kinetics(c_mix, rates, reach, temp, trav_time)

    # Paso 3: Balance de OD
    c_kin[2] = calculate_do_balance(c_kin[2], ...)

¿Listo para modelar tu río?

Prueba el motor de predicción QUAL2K con tus propios datos

Iniciar Motor de Predicción