Source code for hsamiplus.hsami_mhumide

"""The function simulates flow in wwetlands in HSAMI+ model."""

from __future__ import annotations

import numpy as np


[docs] def hsami_mhumide(apport, param, etat, demande, etr, physio, superficie): """ Module de milieux humides. Parameters ---------- apport : list Lames d'eau verticales (cm, voir hsami_interception). param : list Paramètres pour la simulation. etat : dict États du bassin versants et du réservoir. demande : float Demande évaporative de l'atmosphére (cm). etr : list Composantes de l'évapotranspiration (cm, voir hsami_interception). physio : dict Les données physiographiques peuvent être vides. superficie : list La superficie du bassin versan et la uuperficie moyenne du réservoir. Returns ------- apport : list Lames d'eau verticales (cm, voir hsami_interception). etat : dict États du bassin versants et du réservoir. etr : list Composantes de l'évapotranspiration (cm, voir hsami_interception). """ # ----------------------------- # Identification des paramétres # ----------------------------- hmax = param[47] # Coefficient pour calcul du volume max du MHE (hmax) p_norm = param[48] # Coefficient pour détermination de la surface normale (30# dans HYDROTEL)(p_norm) ksat = 10 ** param[49] # Puissance de la conductivité hydraulique é saturation é la base du MHE (cm/j) # ----------------------------------- # Identification des variables d'état # ----------------------------------- v_init = etat["mh_vol"] sa = etat["mh_surf"] # Superficie du MHE au début du pas de temps (hectares) sup_bv = superficie[0] * 100 # Surface totale du BV (en hectares)- NE VARIE PAS PDT LA SIMULATION sa_max = (physio["samax"]) * 100 # Surface max du MHE (en hectares)- NE VARIE PAS PDT LA SIMULATION sa_norm = p_norm * sa_max # Surface normale du MHE (30# de Smax dans HYDROTEL) (en hectares) - NE VARIE PAS PDT LA SIMULATION # Calcul de v_max et v_norm v_max = hmax * (sa_max * 10000) # Volume d'eau max dans le MHE (m^3) v_norm = p_norm * v_max # Volume d'eau normal dans le MHE (m^3) vmin = 0.5 * v_norm # Volume d'eau minimal dans le MHE (m^3) # Calcul des coefficients alpha et beta alpha = (np.log10(sa_max) - np.log10(sa_norm)) / (np.log10(v_max) - np.log10(v_norm)) # Ex.: alpha = 1.000 beta = sa_max / (v_max**alpha) # Ex.: 1.0000e-04 # =================== # Ecoulement vertical # =================== qb = apport[0] # écoulement de base vers le MH en cm qi = apport[1] # écoulement latéral vers le MH en cm qs = apport[2] # écoulement de surf. vers le MH en cm # -------------------------------------------------- # Calcul du volume d'eau qui entre dans le MH - Vin # -------------------------------------------------- vb = qb * sa * 100 # en m^3 vi = qi * sa * 100 # en m^3 vs = qs * sa * 100 # en m^3 # ------------------------------------------ # Calcul du volume de ruissellement - Vsurf # ------------------------------------------ # Le volume et débit de ruissellement sont calculés en prenant é la base un # vsurf de 0 et en recalculant le nouveau volume du MH. En fonction de la # valeur du MH et sa comparaison avec les seuil v_norm et v_max, on établit la # valeur de vsurf et ainsi le débit et volume de ruissellement. v_actuel = v_init + vb + vi + vs # Ex.: v_actuel = 2.4645e+07 if v_actuel <= v_norm: vsurf = 0 elif v_actuel <= v_max: vsurf = (v_actuel - v_norm) / 10 # Ex.: vsurf = 3.4845e+04 elif v_actuel > v_max: vsurf = (v_actuel - v_max) + (v_max - v_norm) / 10 v_actuel = v_actuel - vsurf # -------------------------------------- # Calcul du volume d'eau évaporé - vevap # --------------------------------------- # La demande en evaporation est comblée é cette étape. étant donnée que # c'est un MH assimilé é un lac non connecté, la demande devrait toujours # étre comblée. # on n'offre en evap que le v_initial - v_normal + Vsurface) offre_evap = (v_actuel - vmin) / (sa * 100) if offre_evap > demande: vevap = demande * sa * 100 # Ex.: vevap = 2.2023e+04 else: vevap = offre_evap * sa * 100 v_actuel = v_actuel - vevap # ------------------------------------------------- # Calcul du volume sortant à la base du MH - vseep # ------------------------------------------------- # é cette étape, on calcule le débit et volume de base # offre_seep = ce qu'il reste dans le MHE aprés l'évap. demande_seep = ksat * sa * 100 offre_seep = v_actuel - vmin if offre_seep > demande_seep: vseep = demande_seep # Ex.: vseep = 2.4633e+03 else: vseep = offre_seep v_actuel = v_actuel - vseep # ---------------------------------------- # Calcul de la surface et du volume du MHE # ---------------------------------------- # é partir du nouveau volume, la nouvelle surface du MH peut-étre déterminée # Cette surface sera donc réutilisée au prochain pas de temps etat["mh_surf"] = beta * (v_actuel**alpha) etat["mh_vol"] = v_actuel # ------------------------------------------------------- # Calcul des Returnss pondérées au bassin versant et au MH # ------------------------------------------------------- # Returnss du MH qbase_mh = np.round(vseep * etat["ratio_MH"] / (sa * 100), 10) # Ex.: qbase_mh = 9.3306e-05 qsurf_mh = vsurf * etat["ratio_MH"] / (sa * 100) # Ex.: qsurf_mh = 0.0013 etr_mh = np.round(vevap * etat["ratio_MH"] / (sa * 100), 10) # Ex.: etr_mh = 8.3422e-04 # Returnss du BV pondérées qbase_bv = apport[0] * (1 - etat["ratio_MH"]) qintr_bv = apport[1] * (1 - etat["ratio_MH"]) qsurf_bv = apport[2] * (1 - etat["ratio_MH"]) # Returnss totales apport = [ qbase_mh + qbase_bv, qintr_bv, qsurf_bv, apport[3], apport[4], qsurf_mh, ] # Ex.: apport = [0.0507, 0, 0, -0.0894, 0, 0.0013] etr = np.append(etr, etr_mh) etat["ratio_qbase"] = qbase_mh / (qbase_bv + qbase_mh) # Ex.: etat.ratio_qbase = 0.0018 # Recalcul des ratios etat["ratio_MH"] = etat["mh_surf"] / sup_bv # Ex.: 0.0093 etat["mhumide"] = etat["mh_vol"] * etat["ratio_MH"] / (etat["mh_surf"] * 100) # Ex.: 0.9313 return apport, etat, etr