Source code for ravenpy.config.emulators.mohyse

from typing import Dict, Literal, Sequence, Union

from pydantic import Field, field_validator
from pydantic.dataclasses import dataclass
from pymbolic.primitives import Variable

import ravenpy.config.processes as p
from ravenpy.config import commands as rc
from ravenpy.config import options as o
from ravenpy.config.base import Params, Sym, SymConfig
from ravenpy.config.commands import HRU, PL, Process
from ravenpy.config.defaults import nc_attrs
from ravenpy.config.rvs import Config


[docs] @dataclass(config=SymConfig) class P(Params): X01: Sym = Variable("X01") # X02: Sym = Variable("X02") X03: Sym = Variable("X03") X04: Sym = Variable("X04") X05: Sym = Variable("X05") X06: Sym = Variable("X06") X07: Sym = Variable("X07") X08: Sym = Variable("X08") X09: Sym = Variable("X09") X10: Sym = Variable("X10")
[docs] class LandHRU(HRU): land_use_class: str = "LU_ALL" veg_class: str = "VEG_ALL" soil_profile: str = "DEFAULT_P" aquifer_profile: str = "[NONE]" terrain_class: str = "[NONE]" hru_type: Literal["land"] = "land"
[docs] class HRUs(rc.HRUs): """HRUs command for GR4J. Pydantic is able to automatically detect if an HRU is Land or Lake if `hru_type` is provided. """ root: Sequence[LandHRU]
[docs] class Mohyse(Config): """Modèle Hydrologique Simplifié à l'Extrême (MOHYSE) References ---------- Fortin, V.; Turcotte, R. Le modèle hydrologique MOHYSE. In Note de Cours Pour SCA7420, Université du Québec à Montréal: Montréal, QC, Canada, 2007; p. 14. Troin, M., Arsenault, R. and Brissette, F., 2015. Performance and uncertainty evaluation of snow models on snowmelt flow simulations over a Nordic catchment (Mistassibi, Canada). Hydrology, 2(4), pp.289-317. """ params: P = P() hrus: HRUs = Field([LandHRU()], alias="HRUs") netcdf_attribute: Dict[str, str] = {"model_id": "Mohyse"} sub_basins: rc.SubBasins = Field([rc.SubBasin()], alias="SubBasins") write_netcdf_format: bool = Field(True, alias="WriteNetcdfFormat") time_step: Union[float, str] = Field(1.0, alias="TimeStep") calendar: o.Calendar = Field("PROLEPTIC_GREGORIAN", alias="Calendar") soil_classes: rc.SoilClasses = Field( [{"name": "TOPSOIL"}, {"name": "GWSOIL"}], alias="SoilClasses" ) land_use_classes: rc.LandUseClasses = Field( [{"name": "LU_ALL", "impermeable_frac": 0, "forest_coverage": 1}], alias="LandUseClasses", ) vegetation_classes: rc.VegetationClasses = Field( [{"name": "VEG_ALL"}], alias="VegetationClasses" ) soil_profiles: rc.SoilProfiles = Field( [ {"name": "LAKE"}, {"name": "ROCK"}, { "name": "DEFAULT_P", "soil_classes": ["TOPSOIL", "GWSOIL"], "thicknesses": [P.X05, 10.0], }, ], alias="SoilProfiles", ) global_parameter: Dict = Field( {"RAINSNOW_TEMP": -2, "TOC_MULTIPLIER": 1, "MOHYSE_PET_COEFF": P.X01}, alias="GlobalParameter", ) soil_parameter_list: rc.SoilParameterList = Field( { "parameters": [ "POROSITY", "PET_CORRECTION", "HBV_BETA", "BASEFLOW_COEFF", "PERC_COEFF", ], "pl": [ PL(name="TOPSOIL", values=(1.0, 1.0, 1.0, P.X07, P.X06)), PL(name="GWSOIL", values=(1.0, 1.0, 1.0, P.X08, 0.0)), ], }, alias="SoilParameterList", ) land_use_parameter_list: rc.LandUseParameterList = Field( { "parameters": [ "MELT_FACTOR", "AET_COEFF", "FOREST_SPARSENESS", "DD_MELT_TEMP", ], "pl": [PL(name="[DEFAULT]", values=(P.X03, P.X02, 0, P.X04))], }, alias="LandUseParameterList", ) vegetation_parameter_list: rc.VegetationParameterList = Field( { "parameters": ["SAI_HT_RATIO", "RAIN_ICEPT_PCT", "SNOW_ICEPT_PCT"], "pl": [PL(name="[DEFAULT]", values=(0, 0, 0))], }, alias="VegetationParameterList", ) soil_model: rc.SoilModel = Field(2, alias="SoilModel") potential_melt_method: o.PotentialMeltMethod = Field( "POTMELT_DEGREE_DAY", alias="PotentialMeltMethod" ) routing: o.Routing = Field("ROUTE_NONE", alias="Routing") catchment_route: o.CatchmentRoute = Field( "ROUTE_GAMMA_CONVOLUTION", alias="CatchmentRoute" ) evaporation: o.Evaporation = Field("PET_MOHYSE", alias="Evaporation") direct_evaporation: bool = Field(True, alias="DirectEvaporation") rain_snow_fraction: o.RainSnowFraction = Field( "RAINSNOW_DATA", alias="RainSnowFraction" ) hydrologic_processes: Sequence[Process] = Field( [ p.SoilEvaporation( algo="SOILEVAP_LINEAR", source="SOIL[0]", to="ATMOSPHERE" ), p.SnowBalance(algo="SNOBAL_SIMPLE_MELT", source="SNOW", to="PONDED_WATER"), p.Precipitation(algo="RAVEN_DEFAULT", source="ATMOS_PRECIP", to="MULTIPLE"), p.Infiltration(algo="INF_HBV", source="PONDED_WATER", to="MULTIPLE"), p.Baseflow(algo="BASE_LINEAR", source="SOIL[0]", to="SURFACE_WATER"), p.Percolation(algo="PERC_LINEAR", source="SOIL[0]", to="SOIL[1]"), p.Baseflow(algo="BASE_LINEAR", source="SOIL[1]", to="SURFACE_WATER"), ] ) sub_basin_properties: rc.SubBasinProperties = Field( { "parameters": ["GAMMA_SCALE", "GAMMA_SHAPE"], "records": [ {"sb_id": "1", "values": (1 / P.X10, P.X09)}, ], }, alias="SubBasinProperties", ) _nc_attrs = field_validator("netcdf_attribute")(nc_attrs)