Source code for cwatm.hydrological_modules.sealed_water

# -------------------------------------------------------------------------
# Name:        Sealed_water module
# Purpose:     runoff calculation for open water and sealed areas

# Author:      PB
# Created:     12/12/2016
# CWatM is licensed under GNU GENERAL PUBLIC LICENSE Version 3.
# -------------------------------------------------------------------------

from cwatm.management_modules.data_handling import *


[docs]class sealed_water(object): """ Sealed surface and open water runoff and evaporation module. Handles runoff generation and evaporation processes for impermeable surfaces (sealed/urban areas) and open water land cover types. Accounts for water bodies not explicitly represented in the lakes/reservoirs/channels framework. **Global variables** =================================== ========== ====================================================================== ===== Variable [self.var] Type Description Unit =================================== ========== ====================================================================== ===== modflow Flag True if modflow_coupling = True in settings file bool EWRef Array potential evaporation rate from water surface m availWaterInfiltration Array quantity of water reaching the soil after interception, more snowmelt m actualET Array simulated evapotranspiration from soil, flooded area and vegetation m directRunoff Array Simulated surface runoff m openWaterEvap Array Simulated evaporation from open areas m capillar Array Flow from groundwater to the third CWATM soil layer. Used with MODFLOW m =================================== ========== ====================================================================== ===== Attributes ---------- var : object Reference to model variables object containing state variables model : object Reference to the main CWatM model instance Notes ----- The module addresses hydrological processes on: - Sealed surfaces: Impermeable urban/built-up areas with limited evaporation - Open water: Water land cover including small rivers, ponds, wetlands Open water evaporation accounts for water bodies not captured by explicit lakes, reservoirs, and channels. For instance, if explicit water bodies cover 10% of a cell but water land class covers 20%, this module handles evaporation from the additional 10% of unrepresented water surfaces. Evaporation rates differ by surface type: - Water surfaces: Full reference evapotranspiration rate - Sealed surfaces: Reduced rate (0.2 × reference) for ponded water """ def __init__(self, model): """ Initialize sealed water module. Parameters ---------- model : object CWatM model instance providing access to variables and configuration """ self.var = model.var self.model = model
[docs] def dynamic(self, coverType, No): """ Calculate runoff and evaporation for sealed surfaces and open water. Processes water balance for impermeable surfaces and open water land cover types, determining direct runoff and evaporation rates based on surface characteristics and available water. Parameters ---------- coverType : str Land cover type identifier ('sealed' or 'water') No : int Index number of the land cover type in model arrays Notes ----- Processing logic: - Sealed surfaces (No=4): Limited evaporation (0.2 × EWRef), remainder to runoff - Open water (No=5): Full evaporation rate (1.0 × EWRef), remainder to runoff - ModFlow integration: Includes capillary rise contributions to runoff - Updates actual evapotranspiration and direct runoff arrays The method only processes land cover types with No > 3 (sealed and water), as other land covers are handled by different modules. """ if No > 3: # 4 = sealed areas, 5 = water if coverType == "water": # bigger than 0.2 because of wind evaporation mult = 1.0 else: # evaporation from open areas on sealed area estimated as 0.2 EWRef mult = 0.2 # ModFlow capillary rise under sealed areas and water is sent to runoff if self.var.modflow: self.var.openWaterEvap[No] = np.minimum(mult * self.var.EWRef, self.var.availWaterInfiltration[No]) self.var.directRunoff[No] = (self.var.availWaterInfiltration[No] - self.var.openWaterEvap[No] + self.var.capillar) else: self.var.openWaterEvap[No] = np.minimum(mult * self.var.EWRef, self.var.availWaterInfiltration[No]) self.var.directRunoff[No] = (self.var.availWaterInfiltration[No] - self.var.openWaterEvap[No]) # Open water evaporation will be accounted for in river/lake water balance calculations self.var.actualET[No] = self.var.actualET[No] + self.var.openWaterEvap[No]