from textwrap import dedent, indent
from typing import Literal, Optional, Sequence, Tuple
from .base import Sym
from .commands import Command, Process
# --- Processes --- #
[docs]
class Precipitation(Process):
"""Precipitation"""
algo: Literal["PRECIP_RAVEN", "RAVEN_DEFAULT"] = "PRECIP_RAVEN"
[docs]
class CapillaryRise(Process):
algo: Literal["RISE_HBV", "CRISE_HBV"]
[docs]
class CanopyEvaporation(Process):
algo: Literal["CANEVP_RUTTER", "CANEVP_MAXIMUM", "CANEVP_ALL"]
[docs]
class CanopySublimation(Process):
algo: Literal["CANEVP_ALL", "CANEVP_MAXIMUM", "CANSUBLIM_ALL", "CANSUBLIM_MAXIMUM"]
[docs]
class SoilBalance(Process):
""""""
algo: Literal["SOILBAL_SACSMA"]
[docs]
class SoilEvaporation(Process):
""""""
algo: Literal[
"SOILEVAP_VIC",
"SOILEVAP_HBV",
"SOILEVAP_HYPR",
"SOILEVAL_CHU",
"SOILEVAP_UBC",
"SOILEVAP_GR4J",
"SOILEVAP_TOPMODEL",
"SOILEVAP_SEQUEN",
"SOILEVAP_ROOT",
"SOILEVAP_ROOT_CONSTRAIN",
"SOILEVAP_ROOTFRAC",
"SOILEVAP_GAWSER",
"SOILEVAP_FEDERER",
"SOILEVAP_ALL",
"SOILEVAP_LINEAR",
"SOILEVAP_SACSMA",
"SOILEVAP_HYMOD2",
]
[docs]
class LakeEvaporation(Process):
algo: Literal["LAKE_EVAP_BASIC"]
[docs]
class LakeFreeze(Process):
algo: Literal["LFREEZE_BASIC", "LFREEZE_THERMAL"]
[docs]
class OpenWaterEvaporation(Process):
algo: Literal["OPEN_WATER_EVAP", "OPEN_WATER_RIPARIAN"]
[docs]
class Infiltration(Process):
""""""
algo: Literal[
"INF_RATIONAL",
"INF_SCS",
"INF_ALL_INFILTRATES",
"INF_GR4J",
"INF_GREEN_AMPT",
"INF_GA_SIMPLE",
"INF_UPSCALED_GREEN_AMPT",
"INF_HBV",
"INF_UBC",
"INF_VIC",
"INF_VIC_ARNO",
"INF_PRMS",
"INF_HMETS",
]
[docs]
class Percolation(Process):
""""""
algo: Literal[
"PERC_GAWSER",
"PERC_LINEAR",
"PERC_POWER_LAW",
"PERC_PRMS",
"PERC_SACRAMENTO",
"PERC_CONSTANT",
"PERC_GR4J",
"PERC_GR4JEXCH",
"PERC_GR4JEXCH2",
]
[docs]
class CapilaryRise(Process):
algo: Literal["CRISE_HBV"]
[docs]
class Baseflow(Process):
""""""
algo: Literal[
"BASE_LINEAR",
"BASE_LINEAR_CONSTRAIN",
"BASE_LINEAR_ANALYTIC",
"BASE_POWER_LAW",
"BASE_CONSTANT",
"BASE_VIC",
"BASE_THRESH_POWER",
"BASE_THRESH_STOR",
"BASE_GR4J",
"BASE_TOPMODEL",
"BASE_SACRAMENTO",
]
[docs]
class Interflow(Process):
algo: Literal["INTERFLOW_PRMS"]
[docs]
class Seepage(Process):
algo: Literal["SEEP_LINEAR"]
[docs]
class DepressionOverflow(Process):
algo: Literal["DFLOW_THRESHPOW", "DFLOW_LINEAR"]
[docs]
class LakeRelease(Process):
algo: Literal["LAKEREL_LINEAR"]
[docs]
class Abstraction(Process):
algo: Literal["ABST_PERCENTAGE", "ABST_FILL", "ABST_SCS", "ABST_PDMROF"]
[docs]
class SnowMelt(Process):
algo: Literal["MELT_POTMELT"]
[docs]
class SnowRefreeze(Process):
algo: Literal["FREEZE_DEGREE_DAY"]
[docs]
class SnowBalance(Process):
algo: Literal[
"SNOBAL_SIMPLE_MELT",
"SNOBAL_COLD_CONTENT",
"SNOBAL_HBV",
"SNOBAL_TWO_LAYER",
# "SNOWBAL_CEMA_NEIGE",
"SNOBAL_CEMA_NIEGE",
"SNOBAL_HMETS",
"SNOWBAL_GAWSER",
"SNOWBAL_UBC",
]
[docs]
class Sublimation(Process):
algo: Literal[
"SUBLIM_SVERDRUP",
"SUBLIM_KUZMIN",
"SUBLIM_CENTRAL_SIERRA",
"SUBLIM_PSBM",
"SUBLIM_WILLIAMS",
]
[docs]
class SnowAlbedoEvolve(Process):
algo: Literal["SNOALB_UBC"]
[docs]
class SnowTempEvolve(Process):
algo: Literal["SNOTEMP_NEWTONS"]
[docs]
class CanopyDrip(Process):
algo: Literal["CANDRIP_RUTTER", "CANDRIP_SLOWDRAIN"]
[docs]
class CropHeatUnitEvolve(Process):
algo: Literal["CHU_ONTARIO"]
[docs]
class GlacierMelt(Process):
algo: Literal["GMELT_SIMPLE_MELT", "GMELT_HBV", "GMELT_UBC"]
[docs]
class GlacierRelease(Process):
algo: Literal["GRELEASE_LINEAR", "GRELEASE_HBV_EC"]
[docs]
class Flush(Process):
""""""
algo: Literal["RAVEN_DEFAULT"] = "RAVEN_DEFAULT"
p: Optional[float] = None
[docs]
class Overflow(Process):
algo: Literal["OVERFLOW_RAVEN", "RAVEN_DEFAULT"]
_sub = "-->"
_indent = " "
[docs]
class Split(Process):
""""""
p: float = None
to: Tuple[str, str]
[docs]
class Convolve(Process):
""""""
algo: Literal["CONVOL_GR4J_1", "CONVOL_GR4J_2", "CONVOL_GAMMA", "CONVOL_GAMMA_2"]
[docs]
class LateralFlush(Process):
"""Lateral flush"""
[docs]
class LateralEquilibrate(Process):
"""Lateral equilibrate
Instantaneously equilibrates groundwater storage in basin HRUs.
"""
# --- End processes --- #
[docs]
class Conditional(Command):
"""Conditional statement"""
kind: Literal["HRU_TYPE", "LAND_CLASS", "HRU_GROUP"]
op: Literal["IS", "IS_NOT"]
value: str
_sub = "-->"
[docs]
def to_rv(self):
cmd = self._sub + self.__class__.__name__
return f":{cmd:<20} {self.kind} {self.op} {self.value}"
[docs]
class ProcessGroup(Command):
p: Sequence[Process]
params: Sequence[Sym]
@property
def _template(self):
return """
:{_cmd}
{_processes}
:End{_cmd} CALCULATE_WTS {_params}
"""
@property
def _indent(self):
return " "
[docs]
def to_rv(self):
d = {
"_cmd": "ProcessGroup",
"_processes": indent("\n".join(str(p) for p in self.p), self._indent),
"_params": " ".join(map(str, self.params)),
}
return dedent(self._template).format(**d)