HydPy 6.2.dev1__cp313-cp313-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (890) hide show
  1. hydpy/__init__.py +275 -0
  2. hydpy/aliases.py +2554 -0
  3. hydpy/auxs/__init__.py +0 -0
  4. hydpy/auxs/anntools.py +1305 -0
  5. hydpy/auxs/armatools.py +883 -0
  6. hydpy/auxs/calibtools.py +3337 -0
  7. hydpy/auxs/interptools.py +1094 -0
  8. hydpy/auxs/iuhtools.py +543 -0
  9. hydpy/auxs/networktools.py +597 -0
  10. hydpy/auxs/ppolytools.py +809 -0
  11. hydpy/auxs/quadtools.py +61 -0
  12. hydpy/auxs/roottools.py +228 -0
  13. hydpy/auxs/smoothtools.py +273 -0
  14. hydpy/auxs/statstools.py +2125 -0
  15. hydpy/auxs/validtools.py +81 -0
  16. hydpy/conf/HydPyConfigBase.xsd +68637 -0
  17. hydpy/conf/HydPyConfigBase.xsdt +358 -0
  18. hydpy/conf/HydPyConfigMultipleRuns.xsd +25 -0
  19. hydpy/conf/HydPyConfigSingleRun.xsd +24 -0
  20. hydpy/conf/__init__.py +0 -0
  21. hydpy/conf/a_coefficients_explicit_lobatto_sequence.npy +0 -0
  22. hydpy/conf/support_points_for_smoothpar_logistic2.npy +0 -0
  23. hydpy/config.py +42 -0
  24. hydpy/core/__init__.py +0 -0
  25. hydpy/core/aliastools.py +214 -0
  26. hydpy/core/autodoctools.py +1947 -0
  27. hydpy/core/auxfiletools.py +1169 -0
  28. hydpy/core/devicetools.py +3810 -0
  29. hydpy/core/exceptiontools.py +269 -0
  30. hydpy/core/filetools.py +1985 -0
  31. hydpy/core/hydpytools.py +3089 -0
  32. hydpy/core/importtools.py +1398 -0
  33. hydpy/core/indextools.py +345 -0
  34. hydpy/core/itemtools.py +1849 -0
  35. hydpy/core/masktools.py +460 -0
  36. hydpy/core/modeltools.py +4868 -0
  37. hydpy/core/netcdftools.py +2683 -0
  38. hydpy/core/objecttools.py +2023 -0
  39. hydpy/core/optiontools.py +1045 -0
  40. hydpy/core/parametertools.py +4674 -0
  41. hydpy/core/printtools.py +222 -0
  42. hydpy/core/propertytools.py +643 -0
  43. hydpy/core/pubtools.py +254 -0
  44. hydpy/core/selectiontools.py +1571 -0
  45. hydpy/core/sequencetools.py +4476 -0
  46. hydpy/core/seriestools.py +339 -0
  47. hydpy/core/testtools.py +2483 -0
  48. hydpy/core/timetools.py +3567 -0
  49. hydpy/core/typingtools.py +333 -0
  50. hydpy/core/variabletools.py +2615 -0
  51. hydpy/cythons/__init__.py +24 -0
  52. hydpy/cythons/annutils.pxd +33 -0
  53. hydpy/cythons/annutils.pyi +25 -0
  54. hydpy/cythons/annutils.pyx +120 -0
  55. hydpy/cythons/autogen/__init__.py +0 -0
  56. hydpy/cythons/autogen/annutils.cp313-win_amd64.pyd +0 -0
  57. hydpy/cythons/autogen/annutils.pxd +42 -0
  58. hydpy/cythons/autogen/annutils.pyx +129 -0
  59. hydpy/cythons/autogen/c_arma.cp313-win_amd64.pyd +0 -0
  60. hydpy/cythons/autogen/c_arma.pxd +179 -0
  61. hydpy/cythons/autogen/c_arma.pyx +356 -0
  62. hydpy/cythons/autogen/c_arma_rimorido.cp313-win_amd64.pyd +0 -0
  63. hydpy/cythons/autogen/c_arma_rimorido.pxd +179 -0
  64. hydpy/cythons/autogen/c_arma_rimorido.pyx +356 -0
  65. hydpy/cythons/autogen/c_conv.cp313-win_amd64.pyd +0 -0
  66. hydpy/cythons/autogen/c_conv.pxd +198 -0
  67. hydpy/cythons/autogen/c_conv.pyx +491 -0
  68. hydpy/cythons/autogen/c_conv_idw.cp313-win_amd64.pyd +0 -0
  69. hydpy/cythons/autogen/c_conv_idw.pxd +124 -0
  70. hydpy/cythons/autogen/c_conv_idw.pyx +264 -0
  71. hydpy/cythons/autogen/c_conv_idw_ed.cp313-win_amd64.pyd +0 -0
  72. hydpy/cythons/autogen/c_conv_idw_ed.pxd +197 -0
  73. hydpy/cythons/autogen/c_conv_idw_ed.pyx +481 -0
  74. hydpy/cythons/autogen/c_conv_nn.cp313-win_amd64.pyd +0 -0
  75. hydpy/cythons/autogen/c_conv_nn.pxd +120 -0
  76. hydpy/cythons/autogen/c_conv_nn.pyx +224 -0
  77. hydpy/cythons/autogen/c_dam.cp313-win_amd64.pyd +0 -0
  78. hydpy/cythons/autogen/c_dam.pxd +805 -0
  79. hydpy/cythons/autogen/c_dam.pyx +1477 -0
  80. hydpy/cythons/autogen/c_dam_llake.cp313-win_amd64.pyd +0 -0
  81. hydpy/cythons/autogen/c_dam_llake.pxd +364 -0
  82. hydpy/cythons/autogen/c_dam_llake.pyx +705 -0
  83. hydpy/cythons/autogen/c_dam_lreservoir.cp313-win_amd64.pyd +0 -0
  84. hydpy/cythons/autogen/c_dam_lreservoir.pxd +365 -0
  85. hydpy/cythons/autogen/c_dam_lreservoir.pyx +708 -0
  86. hydpy/cythons/autogen/c_dam_lretention.cp313-win_amd64.pyd +0 -0
  87. hydpy/cythons/autogen/c_dam_lretention.pxd +340 -0
  88. hydpy/cythons/autogen/c_dam_lretention.pyx +625 -0
  89. hydpy/cythons/autogen/c_dam_pump.cp313-win_amd64.pyd +0 -0
  90. hydpy/cythons/autogen/c_dam_pump.pxd +402 -0
  91. hydpy/cythons/autogen/c_dam_pump.pyx +724 -0
  92. hydpy/cythons/autogen/c_dam_pump_sluice.cp313-win_amd64.pyd +0 -0
  93. hydpy/cythons/autogen/c_dam_pump_sluice.pxd +452 -0
  94. hydpy/cythons/autogen/c_dam_pump_sluice.pyx +829 -0
  95. hydpy/cythons/autogen/c_dam_sluice.cp313-win_amd64.pyd +0 -0
  96. hydpy/cythons/autogen/c_dam_sluice.pxd +404 -0
  97. hydpy/cythons/autogen/c_dam_sluice.pyx +726 -0
  98. hydpy/cythons/autogen/c_dam_v001.cp313-win_amd64.pyd +0 -0
  99. hydpy/cythons/autogen/c_dam_v001.pxd +452 -0
  100. hydpy/cythons/autogen/c_dam_v001.pyx +816 -0
  101. hydpy/cythons/autogen/c_dam_v002.cp313-win_amd64.pyd +0 -0
  102. hydpy/cythons/autogen/c_dam_v002.pxd +394 -0
  103. hydpy/cythons/autogen/c_dam_v002.pyx +703 -0
  104. hydpy/cythons/autogen/c_dam_v003.cp313-win_amd64.pyd +0 -0
  105. hydpy/cythons/autogen/c_dam_v003.pxd +417 -0
  106. hydpy/cythons/autogen/c_dam_v003.pyx +744 -0
  107. hydpy/cythons/autogen/c_dam_v004.cp313-win_amd64.pyd +0 -0
  108. hydpy/cythons/autogen/c_dam_v004.pxd +486 -0
  109. hydpy/cythons/autogen/c_dam_v004.pyx +891 -0
  110. hydpy/cythons/autogen/c_dam_v005.cp313-win_amd64.pyd +0 -0
  111. hydpy/cythons/autogen/c_dam_v005.pxd +524 -0
  112. hydpy/cythons/autogen/c_dam_v005.pyx +928 -0
  113. hydpy/cythons/autogen/c_dummy.cp313-win_amd64.pyd +0 -0
  114. hydpy/cythons/autogen/c_dummy.pxd +151 -0
  115. hydpy/cythons/autogen/c_dummy.pyx +263 -0
  116. hydpy/cythons/autogen/c_dummy_interceptedwater.cp313-win_amd64.pyd +0 -0
  117. hydpy/cythons/autogen/c_dummy_interceptedwater.pxd +69 -0
  118. hydpy/cythons/autogen/c_dummy_interceptedwater.pyx +104 -0
  119. hydpy/cythons/autogen/c_dummy_node2node.cp313-win_amd64.pyd +0 -0
  120. hydpy/cythons/autogen/c_dummy_node2node.pxd +89 -0
  121. hydpy/cythons/autogen/c_dummy_node2node.pyx +148 -0
  122. hydpy/cythons/autogen/c_dummy_snowalbedo.cp313-win_amd64.pyd +0 -0
  123. hydpy/cythons/autogen/c_dummy_snowalbedo.pxd +69 -0
  124. hydpy/cythons/autogen/c_dummy_snowalbedo.pyx +104 -0
  125. hydpy/cythons/autogen/c_dummy_snowcover.cp313-win_amd64.pyd +0 -0
  126. hydpy/cythons/autogen/c_dummy_snowcover.pxd +69 -0
  127. hydpy/cythons/autogen/c_dummy_snowcover.pyx +104 -0
  128. hydpy/cythons/autogen/c_dummy_snowycanopy.cp313-win_amd64.pyd +0 -0
  129. hydpy/cythons/autogen/c_dummy_snowycanopy.pxd +69 -0
  130. hydpy/cythons/autogen/c_dummy_snowycanopy.pyx +104 -0
  131. hydpy/cythons/autogen/c_dummy_soilwater.cp313-win_amd64.pyd +0 -0
  132. hydpy/cythons/autogen/c_dummy_soilwater.pxd +69 -0
  133. hydpy/cythons/autogen/c_dummy_soilwater.pyx +104 -0
  134. hydpy/cythons/autogen/c_evap.cp313-win_amd64.pyd +0 -0
  135. hydpy/cythons/autogen/c_evap.pxd +1029 -0
  136. hydpy/cythons/autogen/c_evap.pyx +2601 -0
  137. hydpy/cythons/autogen/c_evap_aet_hbv96.cp313-win_amd64.pyd +0 -0
  138. hydpy/cythons/autogen/c_evap_aet_hbv96.pxd +227 -0
  139. hydpy/cythons/autogen/c_evap_aet_hbv96.pyx +584 -0
  140. hydpy/cythons/autogen/c_evap_aet_minhas.cp313-win_amd64.pyd +0 -0
  141. hydpy/cythons/autogen/c_evap_aet_minhas.pxd +193 -0
  142. hydpy/cythons/autogen/c_evap_aet_minhas.pyx +478 -0
  143. hydpy/cythons/autogen/c_evap_aet_morsim.cp313-win_amd64.pyd +0 -0
  144. hydpy/cythons/autogen/c_evap_aet_morsim.pxd +681 -0
  145. hydpy/cythons/autogen/c_evap_aet_morsim.pyx +1642 -0
  146. hydpy/cythons/autogen/c_evap_pet_ambav1.cp313-win_amd64.pyd +0 -0
  147. hydpy/cythons/autogen/c_evap_pet_ambav1.pxd +532 -0
  148. hydpy/cythons/autogen/c_evap_pet_ambav1.pyx +1296 -0
  149. hydpy/cythons/autogen/c_evap_pet_hbv96.cp313-win_amd64.pyd +0 -0
  150. hydpy/cythons/autogen/c_evap_pet_hbv96.pxd +179 -0
  151. hydpy/cythons/autogen/c_evap_pet_hbv96.pyx +328 -0
  152. hydpy/cythons/autogen/c_evap_pet_m.cp313-win_amd64.pyd +0 -0
  153. hydpy/cythons/autogen/c_evap_pet_m.pxd +124 -0
  154. hydpy/cythons/autogen/c_evap_pet_m.pyx +214 -0
  155. hydpy/cythons/autogen/c_evap_pet_mlc.cp313-win_amd64.pyd +0 -0
  156. hydpy/cythons/autogen/c_evap_pet_mlc.pxd +126 -0
  157. hydpy/cythons/autogen/c_evap_pet_mlc.pyx +214 -0
  158. hydpy/cythons/autogen/c_evap_ret_fao56.cp313-win_amd64.pyd +0 -0
  159. hydpy/cythons/autogen/c_evap_ret_fao56.pxd +305 -0
  160. hydpy/cythons/autogen/c_evap_ret_fao56.pyx +624 -0
  161. hydpy/cythons/autogen/c_evap_ret_io.cp313-win_amd64.pyd +0 -0
  162. hydpy/cythons/autogen/c_evap_ret_io.pxd +112 -0
  163. hydpy/cythons/autogen/c_evap_ret_io.pyx +176 -0
  164. hydpy/cythons/autogen/c_evap_ret_tw2002.cp313-win_amd64.pyd +0 -0
  165. hydpy/cythons/autogen/c_evap_ret_tw2002.pxd +139 -0
  166. hydpy/cythons/autogen/c_evap_ret_tw2002.pyx +273 -0
  167. hydpy/cythons/autogen/c_exch.cp313-win_amd64.pyd +0 -0
  168. hydpy/cythons/autogen/c_exch.pxd +230 -0
  169. hydpy/cythons/autogen/c_exch.pyx +462 -0
  170. hydpy/cythons/autogen/c_exch_branch_hbv96.cp313-win_amd64.pyd +0 -0
  171. hydpy/cythons/autogen/c_exch_branch_hbv96.pxd +134 -0
  172. hydpy/cythons/autogen/c_exch_branch_hbv96.pyx +255 -0
  173. hydpy/cythons/autogen/c_exch_waterlevel.cp313-win_amd64.pyd +0 -0
  174. hydpy/cythons/autogen/c_exch_waterlevel.pxd +54 -0
  175. hydpy/cythons/autogen/c_exch_waterlevel.pyx +78 -0
  176. hydpy/cythons/autogen/c_exch_weir_hbv96.cp313-win_amd64.pyd +0 -0
  177. hydpy/cythons/autogen/c_exch_weir_hbv96.pxd +156 -0
  178. hydpy/cythons/autogen/c_exch_weir_hbv96.pyx +282 -0
  179. hydpy/cythons/autogen/c_ga.cp313-win_amd64.pyd +0 -0
  180. hydpy/cythons/autogen/c_ga.pxd +353 -0
  181. hydpy/cythons/autogen/c_ga.pyx +1204 -0
  182. hydpy/cythons/autogen/c_ga_garto.cp313-win_amd64.pyd +0 -0
  183. hydpy/cythons/autogen/c_ga_garto.pxd +330 -0
  184. hydpy/cythons/autogen/c_ga_garto.pyx +1105 -0
  185. hydpy/cythons/autogen/c_ga_garto_submodel1.cp313-win_amd64.pyd +0 -0
  186. hydpy/cythons/autogen/c_ga_garto_submodel1.pxd +236 -0
  187. hydpy/cythons/autogen/c_ga_garto_submodel1.pyx +944 -0
  188. hydpy/cythons/autogen/c_gland.cp313-win_amd64.pyd +0 -0
  189. hydpy/cythons/autogen/c_gland.pxd +437 -0
  190. hydpy/cythons/autogen/c_gland.pyx +726 -0
  191. hydpy/cythons/autogen/c_gland_gr4.cp313-win_amd64.pyd +0 -0
  192. hydpy/cythons/autogen/c_gland_gr4.pxd +382 -0
  193. hydpy/cythons/autogen/c_gland_gr4.pyx +605 -0
  194. hydpy/cythons/autogen/c_gland_gr5.cp313-win_amd64.pyd +0 -0
  195. hydpy/cythons/autogen/c_gland_gr5.pxd +368 -0
  196. hydpy/cythons/autogen/c_gland_gr5.pyx +568 -0
  197. hydpy/cythons/autogen/c_gland_gr6.cp313-win_amd64.pyd +0 -0
  198. hydpy/cythons/autogen/c_gland_gr6.pxd +420 -0
  199. hydpy/cythons/autogen/c_gland_gr6.pyx +673 -0
  200. hydpy/cythons/autogen/c_hland.cp313-win_amd64.pyd +0 -0
  201. hydpy/cythons/autogen/c_hland.pxd +855 -0
  202. hydpy/cythons/autogen/c_hland.pyx +2486 -0
  203. hydpy/cythons/autogen/c_hland_96.cp313-win_amd64.pyd +0 -0
  204. hydpy/cythons/autogen/c_hland_96.pxd +631 -0
  205. hydpy/cythons/autogen/c_hland_96.pyx +1724 -0
  206. hydpy/cythons/autogen/c_hland_96c.cp313-win_amd64.pyd +0 -0
  207. hydpy/cythons/autogen/c_hland_96c.pxd +621 -0
  208. hydpy/cythons/autogen/c_hland_96c.pyx +1822 -0
  209. hydpy/cythons/autogen/c_hland_96p.cp313-win_amd64.pyd +0 -0
  210. hydpy/cythons/autogen/c_hland_96p.pxd +683 -0
  211. hydpy/cythons/autogen/c_hland_96p.pyx +1911 -0
  212. hydpy/cythons/autogen/c_kinw.cp313-win_amd64.pyd +0 -0
  213. hydpy/cythons/autogen/c_kinw.pxd +509 -0
  214. hydpy/cythons/autogen/c_kinw.pyx +965 -0
  215. hydpy/cythons/autogen/c_kinw_williams.cp313-win_amd64.pyd +0 -0
  216. hydpy/cythons/autogen/c_kinw_williams.pxd +409 -0
  217. hydpy/cythons/autogen/c_kinw_williams.pyx +763 -0
  218. hydpy/cythons/autogen/c_kinw_williams_ext.cp313-win_amd64.pyd +0 -0
  219. hydpy/cythons/autogen/c_kinw_williams_ext.pxd +220 -0
  220. hydpy/cythons/autogen/c_kinw_williams_ext.pyx +440 -0
  221. hydpy/cythons/autogen/c_lland.cp313-win_amd64.pyd +0 -0
  222. hydpy/cythons/autogen/c_lland.pxd +1386 -0
  223. hydpy/cythons/autogen/c_lland.pyx +3679 -0
  224. hydpy/cythons/autogen/c_lland_dd.cp313-win_amd64.pyd +0 -0
  225. hydpy/cythons/autogen/c_lland_dd.pxd +679 -0
  226. hydpy/cythons/autogen/c_lland_dd.pyx +1719 -0
  227. hydpy/cythons/autogen/c_lland_knauf.cp313-win_amd64.pyd +0 -0
  228. hydpy/cythons/autogen/c_lland_knauf.pxd +1096 -0
  229. hydpy/cythons/autogen/c_lland_knauf.pyx +2784 -0
  230. hydpy/cythons/autogen/c_lland_knauf_ic.cp313-win_amd64.pyd +0 -0
  231. hydpy/cythons/autogen/c_lland_knauf_ic.pxd +1369 -0
  232. hydpy/cythons/autogen/c_lland_knauf_ic.pyx +3625 -0
  233. hydpy/cythons/autogen/c_meteo.cp313-win_amd64.pyd +0 -0
  234. hydpy/cythons/autogen/c_meteo.pxd +469 -0
  235. hydpy/cythons/autogen/c_meteo.pyx +879 -0
  236. hydpy/cythons/autogen/c_meteo_clear_glob_io.cp313-win_amd64.pyd +0 -0
  237. hydpy/cythons/autogen/c_meteo_clear_glob_io.pxd +75 -0
  238. hydpy/cythons/autogen/c_meteo_clear_glob_io.pyx +107 -0
  239. hydpy/cythons/autogen/c_meteo_glob_fao56.cp313-win_amd64.pyd +0 -0
  240. hydpy/cythons/autogen/c_meteo_glob_fao56.pxd +209 -0
  241. hydpy/cythons/autogen/c_meteo_glob_fao56.pyx +339 -0
  242. hydpy/cythons/autogen/c_meteo_glob_io.cp313-win_amd64.pyd +0 -0
  243. hydpy/cythons/autogen/c_meteo_glob_io.pxd +63 -0
  244. hydpy/cythons/autogen/c_meteo_glob_io.pyx +91 -0
  245. hydpy/cythons/autogen/c_meteo_glob_morsim.cp313-win_amd64.pyd +0 -0
  246. hydpy/cythons/autogen/c_meteo_glob_morsim.pxd +289 -0
  247. hydpy/cythons/autogen/c_meteo_glob_morsim.pyx +527 -0
  248. hydpy/cythons/autogen/c_meteo_precip_io.cp313-win_amd64.pyd +0 -0
  249. hydpy/cythons/autogen/c_meteo_precip_io.pxd +112 -0
  250. hydpy/cythons/autogen/c_meteo_precip_io.pyx +176 -0
  251. hydpy/cythons/autogen/c_meteo_psun_sun_glob_io.cp313-win_amd64.pyd +0 -0
  252. hydpy/cythons/autogen/c_meteo_psun_sun_glob_io.pxd +87 -0
  253. hydpy/cythons/autogen/c_meteo_psun_sun_glob_io.pyx +123 -0
  254. hydpy/cythons/autogen/c_meteo_sun_fao56.cp313-win_amd64.pyd +0 -0
  255. hydpy/cythons/autogen/c_meteo_sun_fao56.pxd +209 -0
  256. hydpy/cythons/autogen/c_meteo_sun_fao56.pyx +343 -0
  257. hydpy/cythons/autogen/c_meteo_sun_morsim.cp313-win_amd64.pyd +0 -0
  258. hydpy/cythons/autogen/c_meteo_sun_morsim.pxd +286 -0
  259. hydpy/cythons/autogen/c_meteo_sun_morsim.pyx +519 -0
  260. hydpy/cythons/autogen/c_meteo_temp_io.cp313-win_amd64.pyd +0 -0
  261. hydpy/cythons/autogen/c_meteo_temp_io.pxd +112 -0
  262. hydpy/cythons/autogen/c_meteo_temp_io.pyx +176 -0
  263. hydpy/cythons/autogen/c_musk.cp313-win_amd64.pyd +0 -0
  264. hydpy/cythons/autogen/c_musk.pxd +282 -0
  265. hydpy/cythons/autogen/c_musk.pyx +605 -0
  266. hydpy/cythons/autogen/c_musk_classic.cp313-win_amd64.pyd +0 -0
  267. hydpy/cythons/autogen/c_musk_classic.pxd +138 -0
  268. hydpy/cythons/autogen/c_musk_classic.pyx +226 -0
  269. hydpy/cythons/autogen/c_musk_mct.cp313-win_amd64.pyd +0 -0
  270. hydpy/cythons/autogen/c_musk_mct.pxd +282 -0
  271. hydpy/cythons/autogen/c_musk_mct.pyx +609 -0
  272. hydpy/cythons/autogen/c_rconc.cp313-win_amd64.pyd +0 -0
  273. hydpy/cythons/autogen/c_rconc.pxd +119 -0
  274. hydpy/cythons/autogen/c_rconc.pyx +174 -0
  275. hydpy/cythons/autogen/c_rconc_nash.cp313-win_amd64.pyd +0 -0
  276. hydpy/cythons/autogen/c_rconc_nash.pxd +111 -0
  277. hydpy/cythons/autogen/c_rconc_nash.pyx +185 -0
  278. hydpy/cythons/autogen/c_rconc_uh.cp313-win_amd64.pyd +0 -0
  279. hydpy/cythons/autogen/c_rconc_uh.pxd +92 -0
  280. hydpy/cythons/autogen/c_rconc_uh.pyx +125 -0
  281. hydpy/cythons/autogen/c_sw1d.cp313-win_amd64.pyd +0 -0
  282. hydpy/cythons/autogen/c_sw1d.pxd +511 -0
  283. hydpy/cythons/autogen/c_sw1d.pyx +1263 -0
  284. hydpy/cythons/autogen/c_sw1d_channel.cp313-win_amd64.pyd +0 -0
  285. hydpy/cythons/autogen/c_sw1d_channel.pxd +119 -0
  286. hydpy/cythons/autogen/c_sw1d_channel.pyx +300 -0
  287. hydpy/cythons/autogen/c_sw1d_gate_out.cp313-win_amd64.pyd +0 -0
  288. hydpy/cythons/autogen/c_sw1d_gate_out.pxd +240 -0
  289. hydpy/cythons/autogen/c_sw1d_gate_out.pyx +476 -0
  290. hydpy/cythons/autogen/c_sw1d_lias.cp313-win_amd64.pyd +0 -0
  291. hydpy/cythons/autogen/c_sw1d_lias.pxd +320 -0
  292. hydpy/cythons/autogen/c_sw1d_lias.pyx +619 -0
  293. hydpy/cythons/autogen/c_sw1d_lias_sluice.cp313-win_amd64.pyd +0 -0
  294. hydpy/cythons/autogen/c_sw1d_lias_sluice.pxd +325 -0
  295. hydpy/cythons/autogen/c_sw1d_lias_sluice.pyx +644 -0
  296. hydpy/cythons/autogen/c_sw1d_network.cp313-win_amd64.pyd +0 -0
  297. hydpy/cythons/autogen/c_sw1d_network.pxd +90 -0
  298. hydpy/cythons/autogen/c_sw1d_network.pyx +246 -0
  299. hydpy/cythons/autogen/c_sw1d_pump.cp313-win_amd64.pyd +0 -0
  300. hydpy/cythons/autogen/c_sw1d_pump.pxd +256 -0
  301. hydpy/cythons/autogen/c_sw1d_pump.pyx +502 -0
  302. hydpy/cythons/autogen/c_sw1d_q_in.cp313-win_amd64.pyd +0 -0
  303. hydpy/cythons/autogen/c_sw1d_q_in.pxd +224 -0
  304. hydpy/cythons/autogen/c_sw1d_q_in.pyx +383 -0
  305. hydpy/cythons/autogen/c_sw1d_q_out.cp313-win_amd64.pyd +0 -0
  306. hydpy/cythons/autogen/c_sw1d_q_out.pxd +224 -0
  307. hydpy/cythons/autogen/c_sw1d_q_out.pyx +383 -0
  308. hydpy/cythons/autogen/c_sw1d_storage.cp313-win_amd64.pyd +0 -0
  309. hydpy/cythons/autogen/c_sw1d_storage.pxd +193 -0
  310. hydpy/cythons/autogen/c_sw1d_storage.pyx +349 -0
  311. hydpy/cythons/autogen/c_sw1d_weir_out.cp313-win_amd64.pyd +0 -0
  312. hydpy/cythons/autogen/c_sw1d_weir_out.pxd +212 -0
  313. hydpy/cythons/autogen/c_sw1d_weir_out.pyx +404 -0
  314. hydpy/cythons/autogen/c_test.cp313-win_amd64.pyd +0 -0
  315. hydpy/cythons/autogen/c_test.pxd +175 -0
  316. hydpy/cythons/autogen/c_test.pyx +348 -0
  317. hydpy/cythons/autogen/c_test_discontinous.cp313-win_amd64.pyd +0 -0
  318. hydpy/cythons/autogen/c_test_discontinous.pxd +146 -0
  319. hydpy/cythons/autogen/c_test_discontinous.pyx +256 -0
  320. hydpy/cythons/autogen/c_test_stiff0d.cp313-win_amd64.pyd +0 -0
  321. hydpy/cythons/autogen/c_test_stiff0d.pxd +146 -0
  322. hydpy/cythons/autogen/c_test_stiff0d.pyx +250 -0
  323. hydpy/cythons/autogen/c_test_stiff1d.cp313-win_amd64.pyd +0 -0
  324. hydpy/cythons/autogen/c_test_stiff1d.pxd +145 -0
  325. hydpy/cythons/autogen/c_test_stiff1d.pyx +294 -0
  326. hydpy/cythons/autogen/c_whmod.cp313-win_amd64.pyd +0 -0
  327. hydpy/cythons/autogen/c_whmod.pxd +482 -0
  328. hydpy/cythons/autogen/c_whmod.pyx +1156 -0
  329. hydpy/cythons/autogen/c_whmod_rural.cp313-win_amd64.pyd +0 -0
  330. hydpy/cythons/autogen/c_whmod_rural.pxd +411 -0
  331. hydpy/cythons/autogen/c_whmod_rural.pyx +982 -0
  332. hydpy/cythons/autogen/c_whmod_urban.cp313-win_amd64.pyd +0 -0
  333. hydpy/cythons/autogen/c_whmod_urban.pxd +482 -0
  334. hydpy/cythons/autogen/c_whmod_urban.pyx +1155 -0
  335. hydpy/cythons/autogen/c_wland.cp313-win_amd64.pyd +0 -0
  336. hydpy/cythons/autogen/c_wland.pxd +842 -0
  337. hydpy/cythons/autogen/c_wland.pyx +1890 -0
  338. hydpy/cythons/autogen/c_wland_gd.cp313-win_amd64.pyd +0 -0
  339. hydpy/cythons/autogen/c_wland_gd.pxd +829 -0
  340. hydpy/cythons/autogen/c_wland_gd.pyx +1847 -0
  341. hydpy/cythons/autogen/c_wland_wag.cp313-win_amd64.pyd +0 -0
  342. hydpy/cythons/autogen/c_wland_wag.pxd +810 -0
  343. hydpy/cythons/autogen/c_wland_wag.pyx +1780 -0
  344. hydpy/cythons/autogen/c_wq.cp313-win_amd64.pyd +0 -0
  345. hydpy/cythons/autogen/c_wq.pxd +275 -0
  346. hydpy/cythons/autogen/c_wq.pyx +652 -0
  347. hydpy/cythons/autogen/c_wq_trapeze.cp313-win_amd64.pyd +0 -0
  348. hydpy/cythons/autogen/c_wq_trapeze.pxd +170 -0
  349. hydpy/cythons/autogen/c_wq_trapeze.pyx +400 -0
  350. hydpy/cythons/autogen/c_wq_trapeze_strickler.cp313-win_amd64.pyd +0 -0
  351. hydpy/cythons/autogen/c_wq_trapeze_strickler.pxd +243 -0
  352. hydpy/cythons/autogen/c_wq_trapeze_strickler.pyx +578 -0
  353. hydpy/cythons/autogen/c_wq_walrus.cp313-win_amd64.pyd +0 -0
  354. hydpy/cythons/autogen/c_wq_walrus.pxd +61 -0
  355. hydpy/cythons/autogen/c_wq_walrus.pyx +82 -0
  356. hydpy/cythons/autogen/configutils.cp313-win_amd64.pyd +0 -0
  357. hydpy/cythons/autogen/configutils.pxd +17 -0
  358. hydpy/cythons/autogen/configutils.pyx +119 -0
  359. hydpy/cythons/autogen/interfaceutils.cp313-win_amd64.pyd +0 -0
  360. hydpy/cythons/autogen/interfaceutils.pxd +31 -0
  361. hydpy/cythons/autogen/interfaceutils.pyx +82 -0
  362. hydpy/cythons/autogen/interputils.cp313-win_amd64.pyd +0 -0
  363. hydpy/cythons/autogen/interputils.pxd +42 -0
  364. hydpy/cythons/autogen/interputils.pyx +118 -0
  365. hydpy/cythons/autogen/masterinterface.cp313-win_amd64.pyd +0 -0
  366. hydpy/cythons/autogen/masterinterface.pxd +153 -0
  367. hydpy/cythons/autogen/masterinterface.pyx +222 -0
  368. hydpy/cythons/autogen/pointerutils.cp313-win_amd64.pyd +0 -0
  369. hydpy/cythons/autogen/pointerutils.pxd +31 -0
  370. hydpy/cythons/autogen/pointerutils.pyx +650 -0
  371. hydpy/cythons/autogen/ppolyutils.cp313-win_amd64.pyd +0 -0
  372. hydpy/cythons/autogen/ppolyutils.pxd +35 -0
  373. hydpy/cythons/autogen/ppolyutils.pyx +59 -0
  374. hydpy/cythons/autogen/quadutils.cp313-win_amd64.pyd +0 -0
  375. hydpy/cythons/autogen/quadutils.pxd +26 -0
  376. hydpy/cythons/autogen/quadutils.pyx +973 -0
  377. hydpy/cythons/autogen/rootutils.cp313-win_amd64.pyd +0 -0
  378. hydpy/cythons/autogen/rootutils.pxd +28 -0
  379. hydpy/cythons/autogen/rootutils.pyx +109 -0
  380. hydpy/cythons/autogen/sequenceutils.cp313-win_amd64.pyd +0 -0
  381. hydpy/cythons/autogen/sequenceutils.pxd +45 -0
  382. hydpy/cythons/autogen/sequenceutils.pyx +101 -0
  383. hydpy/cythons/autogen/smoothutils.cp313-win_amd64.pyd +0 -0
  384. hydpy/cythons/autogen/smoothutils.pxd +29 -0
  385. hydpy/cythons/autogen/smoothutils.pyx +833 -0
  386. hydpy/cythons/configutils.pxd +8 -0
  387. hydpy/cythons/configutils.pyi +5 -0
  388. hydpy/cythons/configutils.pyx +110 -0
  389. hydpy/cythons/interfaceutils.pxd +22 -0
  390. hydpy/cythons/interfaceutils.pyi +15 -0
  391. hydpy/cythons/interfaceutils.pyx +73 -0
  392. hydpy/cythons/interputils.pxd +33 -0
  393. hydpy/cythons/interputils.pyi +32 -0
  394. hydpy/cythons/interputils.pyx +109 -0
  395. hydpy/cythons/modelutils.py +2990 -0
  396. hydpy/cythons/pointerutils.pxd +22 -0
  397. hydpy/cythons/pointerutils.pyi +89 -0
  398. hydpy/cythons/pointerutils.pyx +641 -0
  399. hydpy/cythons/ppolyutils.pxd +26 -0
  400. hydpy/cythons/ppolyutils.pyi +21 -0
  401. hydpy/cythons/ppolyutils.pyx +50 -0
  402. hydpy/cythons/quadutils.pxd +17 -0
  403. hydpy/cythons/quadutils.pyi +13 -0
  404. hydpy/cythons/quadutils.pyx +964 -0
  405. hydpy/cythons/rootutils.pxd +19 -0
  406. hydpy/cythons/rootutils.pyi +21 -0
  407. hydpy/cythons/rootutils.pyx +100 -0
  408. hydpy/cythons/sequenceutils.pxd +36 -0
  409. hydpy/cythons/sequenceutils.pyi +7 -0
  410. hydpy/cythons/sequenceutils.pyx +92 -0
  411. hydpy/cythons/smoothutils.pxd +20 -0
  412. hydpy/cythons/smoothutils.pyi +15 -0
  413. hydpy/cythons/smoothutils.pyx +824 -0
  414. hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/land_dill_assl.py +13 -0
  415. hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/land_lahn_kalk.py +13 -0
  416. hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/land_lahn_leun.py +14 -0
  417. hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/land_lahn_marb.py +13 -0
  418. hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/stream_dill_assl_lahn_leun.py +5 -0
  419. hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/stream_lahn_leun_lahn_kalk.py +5 -0
  420. hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/stream_lahn_marb_lahn_leun.py +5 -0
  421. hydpy/data/HydPy-H-Lahn/control/default/land.py +9 -0
  422. hydpy/data/HydPy-H-Lahn/control/default/land_dill_assl.py +57 -0
  423. hydpy/data/HydPy-H-Lahn/control/default/land_lahn_kalk.py +57 -0
  424. hydpy/data/HydPy-H-Lahn/control/default/land_lahn_leun.py +56 -0
  425. hydpy/data/HydPy-H-Lahn/control/default/land_lahn_marb.py +57 -0
  426. hydpy/data/HydPy-H-Lahn/control/default/stream_dill_assl_lahn_leun.py +7 -0
  427. hydpy/data/HydPy-H-Lahn/control/default/stream_lahn_leun_lahn_kalk.py +7 -0
  428. hydpy/data/HydPy-H-Lahn/control/default/stream_lahn_marb_lahn_leun.py +7 -0
  429. hydpy/data/HydPy-H-Lahn/multiple_runs.xml +309 -0
  430. hydpy/data/HydPy-H-Lahn/multiple_runs_alpha.xml +71 -0
  431. hydpy/data/HydPy-H-Lahn/network/default/headwaters.py +11 -0
  432. hydpy/data/HydPy-H-Lahn/network/default/nonheadwaters.py +11 -0
  433. hydpy/data/HydPy-H-Lahn/network/default/streams.py +8 -0
  434. hydpy/data/HydPy-H-Lahn/series/default/dill_assl_obs_q.asc +11387 -0
  435. hydpy/data/HydPy-H-Lahn/series/default/evap_pet_hbv96_input_normalairtemperature.nc +0 -0
  436. hydpy/data/HydPy-H-Lahn/series/default/evap_pet_hbv96_input_normalevapotranspiration.nc +0 -0
  437. hydpy/data/HydPy-H-Lahn/series/default/hland_96_input_p.nc +0 -0
  438. hydpy/data/HydPy-H-Lahn/series/default/hland_96_input_t.nc +0 -0
  439. hydpy/data/HydPy-H-Lahn/series/default/lahn_kalk_obs_q.asc +11387 -0
  440. hydpy/data/HydPy-H-Lahn/series/default/lahn_leun_obs_q.asc +11387 -0
  441. hydpy/data/HydPy-H-Lahn/series/default/lahn_marb_obs_q.asc +11387 -0
  442. hydpy/data/HydPy-H-Lahn/series/default/land_dill_assl_evap_pet_hbv96_input_normalairtemperature.asc +11387 -0
  443. hydpy/data/HydPy-H-Lahn/series/default/land_dill_assl_evap_pet_hbv96_input_normalevapotranspiration.asc +11387 -0
  444. hydpy/data/HydPy-H-Lahn/series/default/land_dill_assl_hland_96_input_p.asc +11387 -0
  445. hydpy/data/HydPy-H-Lahn/series/default/land_dill_assl_hland_96_input_t.asc +11387 -0
  446. hydpy/data/HydPy-H-Lahn/series/default/land_lahn_kalk_evap_pet_hbv96_input_normalairtemperature.asc +11387 -0
  447. hydpy/data/HydPy-H-Lahn/series/default/land_lahn_kalk_evap_pet_hbv96_input_normalevapotranspiration.asc +11387 -0
  448. hydpy/data/HydPy-H-Lahn/series/default/land_lahn_kalk_hland_96_input_p.asc +11387 -0
  449. hydpy/data/HydPy-H-Lahn/series/default/land_lahn_kalk_hland_96_input_t.asc +11387 -0
  450. hydpy/data/HydPy-H-Lahn/series/default/land_lahn_leun_evap_pet_hbv96_input_normalairtemperature.asc +11387 -0
  451. hydpy/data/HydPy-H-Lahn/series/default/land_lahn_leun_evap_pet_hbv96_input_normalevapotranspiration.asc +11387 -0
  452. hydpy/data/HydPy-H-Lahn/series/default/land_lahn_leun_hland_96_input_p.asc +11387 -0
  453. hydpy/data/HydPy-H-Lahn/series/default/land_lahn_leun_hland_96_input_t.asc +11387 -0
  454. hydpy/data/HydPy-H-Lahn/series/default/land_lahn_marb_evap_pet_hbv96_input_normalairtemperature.asc +11387 -0
  455. hydpy/data/HydPy-H-Lahn/series/default/land_lahn_marb_evap_pet_hbv96_input_normalevapotranspiration.asc +11387 -0
  456. hydpy/data/HydPy-H-Lahn/series/default/land_lahn_marb_hland_96_input_p.asc +11387 -0
  457. hydpy/data/HydPy-H-Lahn/series/default/land_lahn_marb_hland_96_input_t.asc +11387 -0
  458. hydpy/data/HydPy-H-Lahn/series/default/obs_q.nc +0 -0
  459. hydpy/data/HydPy-H-Lahn/single_run.xml +152 -0
  460. hydpy/data/HydPy-H-Lahn/single_run.xmlt +143 -0
  461. hydpy/data/__init__.py +17 -0
  462. hydpy/docs/__init__.py +0 -0
  463. hydpy/docs/autofigs/__init__.py +0 -0
  464. hydpy/docs/bib/__init__.py +0 -0
  465. hydpy/docs/bib/refs.bib +566 -0
  466. hydpy/docs/combine_docversions.py +133 -0
  467. hydpy/docs/draw_model_sketches.py +1301 -0
  468. hydpy/docs/enable_autodoc.py +7 -0
  469. hydpy/docs/figs/HydPy-G-GR4.png +0 -0
  470. hydpy/docs/figs/HydPy-G-GR5.png +0 -0
  471. hydpy/docs/figs/HydPy-G-GR6.png +0 -0
  472. hydpy/docs/figs/HydPy-H-HBV96-COSERO.png +0 -0
  473. hydpy/docs/figs/HydPy-H-HBV96-PREVAH.png +0 -0
  474. hydpy/docs/figs/HydPy-H-HBV96.png +0 -0
  475. hydpy/docs/figs/HydPy-H-Lahn.png +0 -0
  476. hydpy/docs/figs/HydPy-KinW-Williams.png +0 -0
  477. hydpy/docs/figs/HydPy-L-DD.png +0 -0
  478. hydpy/docs/figs/HydPy-W-Wag.png +0 -0
  479. hydpy/docs/figs/HydPy_Logo.png +0 -0
  480. hydpy/docs/figs/HydPy_Logo_Text.png +0 -0
  481. hydpy/docs/figs/IDLE-editor.png +0 -0
  482. hydpy/docs/figs/IDLE-shell.png +0 -0
  483. hydpy/docs/figs/LAWA_river-basin-bumbers.png +0 -0
  484. hydpy/docs/figs/__init__.py +0 -0
  485. hydpy/docs/html_/__init__.py +0 -0
  486. hydpy/docs/polish_html.py +57 -0
  487. hydpy/docs/prepare.py +224 -0
  488. hydpy/docs/publish_docs.py +53 -0
  489. hydpy/docs/rst/HydPy-ARMA.rst +27 -0
  490. hydpy/docs/rst/HydPy-Conv.rst +22 -0
  491. hydpy/docs/rst/HydPy-Dam.rst +79 -0
  492. hydpy/docs/rst/HydPy-Dummy.rst +21 -0
  493. hydpy/docs/rst/HydPy-Evap.rst +26 -0
  494. hydpy/docs/rst/HydPy-Exch.rst +36 -0
  495. hydpy/docs/rst/HydPy-G.rst +40 -0
  496. hydpy/docs/rst/HydPy-GA.rst +34 -0
  497. hydpy/docs/rst/HydPy-H.rst +24 -0
  498. hydpy/docs/rst/HydPy-KinW.rst +32 -0
  499. hydpy/docs/rst/HydPy-L.rst +42 -0
  500. hydpy/docs/rst/HydPy-Meteo.rst +28 -0
  501. hydpy/docs/rst/HydPy-Musk.rst +21 -0
  502. hydpy/docs/rst/HydPy-Rconc.rst +17 -0
  503. hydpy/docs/rst/HydPy-SW1D.rst +49 -0
  504. hydpy/docs/rst/HydPy-Test.rst +19 -0
  505. hydpy/docs/rst/HydPy-W.rst +20 -0
  506. hydpy/docs/rst/HydPy-WHMod.rst +19 -0
  507. hydpy/docs/rst/HydPy-WQ.rst +20 -0
  508. hydpy/docs/rst/__init__.py +0 -0
  509. hydpy/docs/rst/additional_repositories.rst +40 -0
  510. hydpy/docs/rst/auxiliaries.rst +31 -0
  511. hydpy/docs/rst/continuous_integration.rst +75 -0
  512. hydpy/docs/rst/core.rst +75 -0
  513. hydpy/docs/rst/cythons.rst +47 -0
  514. hydpy/docs/rst/definitions.rst +506 -0
  515. hydpy/docs/rst/developer_guide.rst +54 -0
  516. hydpy/docs/rst/example_projects.rst +40 -0
  517. hydpy/docs/rst/execution.rst +22 -0
  518. hydpy/docs/rst/framework_tools.rst +56 -0
  519. hydpy/docs/rst/how_to_read_the_reference_manual.rst +156 -0
  520. hydpy/docs/rst/hydpydependencies.rst +55 -0
  521. hydpy/docs/rst/index.rst +125 -0
  522. hydpy/docs/rst/installation.rst +155 -0
  523. hydpy/docs/rst/model_families.rst +79 -0
  524. hydpy/docs/rst/model_overview.rst +291 -0
  525. hydpy/docs/rst/modelimports.rst +10 -0
  526. hydpy/docs/rst/options.rst +119 -0
  527. hydpy/docs/rst/programming_style.rst +572 -0
  528. hydpy/docs/rst/project_structure.rst +520 -0
  529. hydpy/docs/rst/quickstart.rst +304 -0
  530. hydpy/docs/rst/reference_manual.rst +29 -0
  531. hydpy/docs/rst/required_tools.rst +50 -0
  532. hydpy/docs/rst/simulation.rst +514 -0
  533. hydpy/docs/rst/submodel_interfaces.rst +32 -0
  534. hydpy/docs/rst/tests_and_documentation.rst +85 -0
  535. hydpy/docs/rst/user_guide.rst +38 -0
  536. hydpy/docs/rst/version_control.rst +116 -0
  537. hydpy/docs/rst/zbibliography.rst +8 -0
  538. hydpy/docs/sphinx/__init__.py +0 -0
  539. hydpy/docs/sphinx/_themes/basic_hydpy/changes/frameset.html +11 -0
  540. hydpy/docs/sphinx/_themes/basic_hydpy/changes/rstsource.html +15 -0
  541. hydpy/docs/sphinx/_themes/basic_hydpy/changes/versionchanges.html +33 -0
  542. hydpy/docs/sphinx/_themes/basic_hydpy/defindex.html +35 -0
  543. hydpy/docs/sphinx/_themes/basic_hydpy/domainindex.html +56 -0
  544. hydpy/docs/sphinx/_themes/basic_hydpy/genindex-single.html +63 -0
  545. hydpy/docs/sphinx/_themes/basic_hydpy/genindex-split.html +41 -0
  546. hydpy/docs/sphinx/_themes/basic_hydpy/genindex.html +76 -0
  547. hydpy/docs/sphinx/_themes/basic_hydpy/globaltoc.html +11 -0
  548. hydpy/docs/sphinx/_themes/basic_hydpy/layout.html +221 -0
  549. hydpy/docs/sphinx/_themes/basic_hydpy/localtoc.html +15 -0
  550. hydpy/docs/sphinx/_themes/basic_hydpy/opensearch.xml +13 -0
  551. hydpy/docs/sphinx/_themes/basic_hydpy/page.html +13 -0
  552. hydpy/docs/sphinx/_themes/basic_hydpy/relations.html +23 -0
  553. hydpy/docs/sphinx/_themes/basic_hydpy/search.html +65 -0
  554. hydpy/docs/sphinx/_themes/basic_hydpy/searchbox.html +21 -0
  555. hydpy/docs/sphinx/_themes/basic_hydpy/searchfield.html +23 -0
  556. hydpy/docs/sphinx/_themes/basic_hydpy/sourcelink.html +18 -0
  557. hydpy/docs/sphinx/_themes/basic_hydpy/static/basic.css_t +925 -0
  558. hydpy/docs/sphinx/_themes/basic_hydpy/static/doctools.js +156 -0
  559. hydpy/docs/sphinx/_themes/basic_hydpy/static/documentation_options.js_t +13 -0
  560. hydpy/docs/sphinx/_themes/basic_hydpy/static/file.png +0 -0
  561. hydpy/docs/sphinx/_themes/basic_hydpy/static/language_data.js_t +26 -0
  562. hydpy/docs/sphinx/_themes/basic_hydpy/static/minus.png +0 -0
  563. hydpy/docs/sphinx/_themes/basic_hydpy/static/plus.png +0 -0
  564. hydpy/docs/sphinx/_themes/basic_hydpy/static/searchtools.js +574 -0
  565. hydpy/docs/sphinx/_themes/basic_hydpy/static/sphinx_highlight.js +154 -0
  566. hydpy/docs/sphinx/_themes/basic_hydpy/theme.conf +16 -0
  567. hydpy/docs/sphinx/_themes/classic_hydpy/layout.html +23 -0
  568. hydpy/docs/sphinx/_themes/classic_hydpy/static/classic.css_t +358 -0
  569. hydpy/docs/sphinx/_themes/classic_hydpy/static/sidebar.js_t +72 -0
  570. hydpy/docs/sphinx/_themes/classic_hydpy/theme.conf +32 -0
  571. hydpy/docs/sphinx/conf.py +398 -0
  572. hydpy/docs/sphinx/defaultlinks_extension.py +36 -0
  573. hydpy/docs/sphinx/integrationtest_extension.py +104 -0
  574. hydpy/docs/sphinx/projectstructure_extension.py +58 -0
  575. hydpy/docs/sphinx/submodelgraph_extension.py +53 -0
  576. hydpy/exe/__init__.py +0 -0
  577. hydpy/exe/commandtools.py +651 -0
  578. hydpy/exe/hyd.py +277 -0
  579. hydpy/exe/modelimports.py +41 -0
  580. hydpy/exe/replacetools.py +216 -0
  581. hydpy/exe/servertools.py +2348 -0
  582. hydpy/exe/xmltools.py +3280 -0
  583. hydpy/interfaces/__init__.py +0 -0
  584. hydpy/interfaces/aetinterfaces.py +94 -0
  585. hydpy/interfaces/dischargeinterfaces.py +45 -0
  586. hydpy/interfaces/petinterfaces.py +117 -0
  587. hydpy/interfaces/precipinterfaces.py +42 -0
  588. hydpy/interfaces/radiationinterfaces.py +79 -0
  589. hydpy/interfaces/rconcinterfaces.py +30 -0
  590. hydpy/interfaces/routinginterfaces.py +324 -0
  591. hydpy/interfaces/soilinterfaces.py +96 -0
  592. hydpy/interfaces/stateinterfaces.py +98 -0
  593. hydpy/interfaces/tempinterfaces.py +46 -0
  594. hydpy/models/__init__.py +0 -0
  595. hydpy/models/arma/__init__.py +14 -0
  596. hydpy/models/arma/arma_control.py +383 -0
  597. hydpy/models/arma/arma_derived.py +204 -0
  598. hydpy/models/arma/arma_fluxes.py +41 -0
  599. hydpy/models/arma/arma_inlets.py +11 -0
  600. hydpy/models/arma/arma_logs.py +19 -0
  601. hydpy/models/arma/arma_model.py +461 -0
  602. hydpy/models/arma/arma_outlets.py +11 -0
  603. hydpy/models/arma_rimorido.py +381 -0
  604. hydpy/models/conv/__init__.py +12 -0
  605. hydpy/models/conv/conv_control.py +303 -0
  606. hydpy/models/conv/conv_derived.py +271 -0
  607. hydpy/models/conv/conv_fluxes.py +54 -0
  608. hydpy/models/conv/conv_inlets.py +11 -0
  609. hydpy/models/conv/conv_model.py +687 -0
  610. hydpy/models/conv/conv_outlets.py +11 -0
  611. hydpy/models/conv_idw.py +120 -0
  612. hydpy/models/conv_idw_ed.py +184 -0
  613. hydpy/models/conv_nn.py +112 -0
  614. hydpy/models/dam/__init__.py +16 -0
  615. hydpy/models/dam/dam_aides.py +17 -0
  616. hydpy/models/dam/dam_control.py +346 -0
  617. hydpy/models/dam/dam_derived.py +559 -0
  618. hydpy/models/dam/dam_factors.py +46 -0
  619. hydpy/models/dam/dam_fluxes.py +179 -0
  620. hydpy/models/dam/dam_inlets.py +29 -0
  621. hydpy/models/dam/dam_logs.py +52 -0
  622. hydpy/models/dam/dam_model.py +5011 -0
  623. hydpy/models/dam/dam_outlets.py +23 -0
  624. hydpy/models/dam/dam_receivers.py +41 -0
  625. hydpy/models/dam/dam_senders.py +23 -0
  626. hydpy/models/dam/dam_solver.py +75 -0
  627. hydpy/models/dam/dam_states.py +11 -0
  628. hydpy/models/dam_llake.py +499 -0
  629. hydpy/models/dam_lreservoir.py +548 -0
  630. hydpy/models/dam_lretention.py +343 -0
  631. hydpy/models/dam_pump.py +278 -0
  632. hydpy/models/dam_pump_sluice.py +339 -0
  633. hydpy/models/dam_sluice.py +319 -0
  634. hydpy/models/dam_v001.py +1127 -0
  635. hydpy/models/dam_v002.py +381 -0
  636. hydpy/models/dam_v003.py +422 -0
  637. hydpy/models/dam_v004.py +665 -0
  638. hydpy/models/dam_v005.py +479 -0
  639. hydpy/models/dummy/__init__.py +15 -0
  640. hydpy/models/dummy/dummy_control.py +22 -0
  641. hydpy/models/dummy/dummy_fluxes.py +11 -0
  642. hydpy/models/dummy/dummy_inlets.py +11 -0
  643. hydpy/models/dummy/dummy_inputs.py +41 -0
  644. hydpy/models/dummy/dummy_model.py +196 -0
  645. hydpy/models/dummy/dummy_outlets.py +11 -0
  646. hydpy/models/dummy_interceptedwater.py +85 -0
  647. hydpy/models/dummy_node2node.py +83 -0
  648. hydpy/models/dummy_snowalbedo.py +84 -0
  649. hydpy/models/dummy_snowcover.py +84 -0
  650. hydpy/models/dummy_snowycanopy.py +86 -0
  651. hydpy/models/dummy_soilwater.py +85 -0
  652. hydpy/models/evap/__init__.py +13 -0
  653. hydpy/models/evap/evap_control.py +354 -0
  654. hydpy/models/evap/evap_derived.py +236 -0
  655. hydpy/models/evap/evap_factors.py +188 -0
  656. hydpy/models/evap/evap_fixed.py +68 -0
  657. hydpy/models/evap/evap_fluxes.py +150 -0
  658. hydpy/models/evap/evap_inputs.py +54 -0
  659. hydpy/models/evap/evap_logs.py +91 -0
  660. hydpy/models/evap/evap_masks.py +48 -0
  661. hydpy/models/evap/evap_model.py +9170 -0
  662. hydpy/models/evap/evap_parameters.py +149 -0
  663. hydpy/models/evap/evap_sequences.py +32 -0
  664. hydpy/models/evap/evap_states.py +18 -0
  665. hydpy/models/evap_aet_hbv96.py +372 -0
  666. hydpy/models/evap_aet_minhas.py +331 -0
  667. hydpy/models/evap_aet_morsim.py +627 -0
  668. hydpy/models/evap_pet_ambav1.py +483 -0
  669. hydpy/models/evap_pet_hbv96.py +147 -0
  670. hydpy/models/evap_pet_m.py +94 -0
  671. hydpy/models/evap_pet_mlc.py +107 -0
  672. hydpy/models/evap_ret_fao56.py +265 -0
  673. hydpy/models/evap_ret_io.py +74 -0
  674. hydpy/models/evap_ret_tw2002.py +165 -0
  675. hydpy/models/exch/__init__.py +14 -0
  676. hydpy/models/exch/exch_control.py +262 -0
  677. hydpy/models/exch/exch_derived.py +36 -0
  678. hydpy/models/exch/exch_factors.py +26 -0
  679. hydpy/models/exch/exch_fluxes.py +48 -0
  680. hydpy/models/exch/exch_inlets.py +11 -0
  681. hydpy/models/exch/exch_logs.py +12 -0
  682. hydpy/models/exch/exch_model.py +451 -0
  683. hydpy/models/exch/exch_outlets.py +17 -0
  684. hydpy/models/exch/exch_receivers.py +17 -0
  685. hydpy/models/exch_branch_hbv96.py +186 -0
  686. hydpy/models/exch_waterlevel.py +73 -0
  687. hydpy/models/exch_weir_hbv96.py +609 -0
  688. hydpy/models/ga/__init__.py +14 -0
  689. hydpy/models/ga/ga_aides.py +17 -0
  690. hydpy/models/ga/ga_control.py +208 -0
  691. hydpy/models/ga/ga_derived.py +77 -0
  692. hydpy/models/ga/ga_fluxes.py +83 -0
  693. hydpy/models/ga/ga_inputs.py +26 -0
  694. hydpy/models/ga/ga_logs.py +17 -0
  695. hydpy/models/ga/ga_model.py +2952 -0
  696. hydpy/models/ga/ga_states.py +87 -0
  697. hydpy/models/ga_garto.py +1001 -0
  698. hydpy/models/ga_garto_submodel1.py +79 -0
  699. hydpy/models/gland/__init__.py +14 -0
  700. hydpy/models/gland/gland_control.py +90 -0
  701. hydpy/models/gland/gland_derived.py +113 -0
  702. hydpy/models/gland/gland_fluxes.py +137 -0
  703. hydpy/models/gland/gland_inputs.py +12 -0
  704. hydpy/models/gland/gland_model.py +1439 -0
  705. hydpy/models/gland/gland_outlets.py +11 -0
  706. hydpy/models/gland/gland_states.py +90 -0
  707. hydpy/models/gland_gr4.py +501 -0
  708. hydpy/models/gland_gr5.py +463 -0
  709. hydpy/models/gland_gr6.py +487 -0
  710. hydpy/models/hland/__init__.py +20 -0
  711. hydpy/models/hland/hland_aides.py +19 -0
  712. hydpy/models/hland/hland_constants.py +37 -0
  713. hydpy/models/hland/hland_control.py +1530 -0
  714. hydpy/models/hland/hland_derived.py +683 -0
  715. hydpy/models/hland/hland_factors.py +57 -0
  716. hydpy/models/hland/hland_fixed.py +42 -0
  717. hydpy/models/hland/hland_fluxes.py +279 -0
  718. hydpy/models/hland/hland_inputs.py +19 -0
  719. hydpy/models/hland/hland_masks.py +107 -0
  720. hydpy/models/hland/hland_model.py +4664 -0
  721. hydpy/models/hland/hland_outlets.py +11 -0
  722. hydpy/models/hland/hland_parameters.py +227 -0
  723. hydpy/models/hland/hland_sequences.py +382 -0
  724. hydpy/models/hland/hland_states.py +236 -0
  725. hydpy/models/hland_96.py +1812 -0
  726. hydpy/models/hland_96c.py +1196 -0
  727. hydpy/models/hland_96p.py +1204 -0
  728. hydpy/models/kinw/__init__.py +18 -0
  729. hydpy/models/kinw/kinw_aides.py +306 -0
  730. hydpy/models/kinw/kinw_control.py +270 -0
  731. hydpy/models/kinw/kinw_derived.py +197 -0
  732. hydpy/models/kinw/kinw_fixed.py +33 -0
  733. hydpy/models/kinw/kinw_fluxes.py +37 -0
  734. hydpy/models/kinw/kinw_inlets.py +11 -0
  735. hydpy/models/kinw/kinw_model.py +3026 -0
  736. hydpy/models/kinw/kinw_outlets.py +11 -0
  737. hydpy/models/kinw/kinw_solver.py +45 -0
  738. hydpy/models/kinw/kinw_states.py +17 -0
  739. hydpy/models/kinw_williams.py +1299 -0
  740. hydpy/models/kinw_williams_ext.py +768 -0
  741. hydpy/models/lland/__init__.py +42 -0
  742. hydpy/models/lland/lland_aides.py +38 -0
  743. hydpy/models/lland/lland_constants.py +88 -0
  744. hydpy/models/lland/lland_control.py +1329 -0
  745. hydpy/models/lland/lland_derived.py +380 -0
  746. hydpy/models/lland/lland_factors.py +18 -0
  747. hydpy/models/lland/lland_fixed.py +128 -0
  748. hydpy/models/lland/lland_fluxes.py +626 -0
  749. hydpy/models/lland/lland_inlets.py +12 -0
  750. hydpy/models/lland/lland_inputs.py +33 -0
  751. hydpy/models/lland/lland_logs.py +17 -0
  752. hydpy/models/lland/lland_masks.py +212 -0
  753. hydpy/models/lland/lland_model.py +7690 -0
  754. hydpy/models/lland/lland_outlets.py +12 -0
  755. hydpy/models/lland/lland_parameters.py +195 -0
  756. hydpy/models/lland/lland_sequences.py +67 -0
  757. hydpy/models/lland/lland_states.py +280 -0
  758. hydpy/models/lland_dd.py +2270 -0
  759. hydpy/models/lland_knauf.py +2156 -0
  760. hydpy/models/lland_knauf_ic.py +1920 -0
  761. hydpy/models/meteo/__init__.py +12 -0
  762. hydpy/models/meteo/meteo_control.py +154 -0
  763. hydpy/models/meteo/meteo_derived.py +159 -0
  764. hydpy/models/meteo/meteo_factors.py +88 -0
  765. hydpy/models/meteo/meteo_fixed.py +19 -0
  766. hydpy/models/meteo/meteo_fluxes.py +46 -0
  767. hydpy/models/meteo/meteo_inputs.py +47 -0
  768. hydpy/models/meteo/meteo_logs.py +30 -0
  769. hydpy/models/meteo/meteo_model.py +2904 -0
  770. hydpy/models/meteo/meteo_parameters.py +14 -0
  771. hydpy/models/meteo/meteo_sequences.py +22 -0
  772. hydpy/models/meteo_clear_glob_io.py +77 -0
  773. hydpy/models/meteo_glob_fao56.py +217 -0
  774. hydpy/models/meteo_glob_io.py +68 -0
  775. hydpy/models/meteo_glob_morsim.py +444 -0
  776. hydpy/models/meteo_precip_io.py +76 -0
  777. hydpy/models/meteo_psun_sun_glob_io.py +83 -0
  778. hydpy/models/meteo_sun_fao56.py +188 -0
  779. hydpy/models/meteo_sun_morsim.py +466 -0
  780. hydpy/models/meteo_temp_io.py +76 -0
  781. hydpy/models/musk/__init__.py +15 -0
  782. hydpy/models/musk/musk_control.py +328 -0
  783. hydpy/models/musk/musk_derived.py +32 -0
  784. hydpy/models/musk/musk_factors.py +53 -0
  785. hydpy/models/musk/musk_fluxes.py +24 -0
  786. hydpy/models/musk/musk_inlets.py +11 -0
  787. hydpy/models/musk/musk_masks.py +15 -0
  788. hydpy/models/musk/musk_model.py +838 -0
  789. hydpy/models/musk/musk_outlets.py +11 -0
  790. hydpy/models/musk/musk_sequences.py +88 -0
  791. hydpy/models/musk/musk_solver.py +68 -0
  792. hydpy/models/musk/musk_states.py +64 -0
  793. hydpy/models/musk_classic.py +228 -0
  794. hydpy/models/musk_mct.py +1247 -0
  795. hydpy/models/rconc/__init__.py +12 -0
  796. hydpy/models/rconc/rconc_control.py +473 -0
  797. hydpy/models/rconc/rconc_derived.py +76 -0
  798. hydpy/models/rconc/rconc_fluxes.py +19 -0
  799. hydpy/models/rconc/rconc_logs.py +74 -0
  800. hydpy/models/rconc/rconc_model.py +260 -0
  801. hydpy/models/rconc/rconc_states.py +11 -0
  802. hydpy/models/rconc_nash.py +48 -0
  803. hydpy/models/rconc_uh.py +53 -0
  804. hydpy/models/sw1d/__init__.py +17 -0
  805. hydpy/models/sw1d/sw1d_control.py +356 -0
  806. hydpy/models/sw1d/sw1d_derived.py +85 -0
  807. hydpy/models/sw1d/sw1d_factors.py +78 -0
  808. hydpy/models/sw1d/sw1d_fixed.py +12 -0
  809. hydpy/models/sw1d/sw1d_fluxes.py +55 -0
  810. hydpy/models/sw1d/sw1d_inlets.py +17 -0
  811. hydpy/models/sw1d/sw1d_model.py +3385 -0
  812. hydpy/models/sw1d/sw1d_outlets.py +11 -0
  813. hydpy/models/sw1d/sw1d_receivers.py +11 -0
  814. hydpy/models/sw1d/sw1d_senders.py +11 -0
  815. hydpy/models/sw1d/sw1d_states.py +23 -0
  816. hydpy/models/sw1d_channel.py +2051 -0
  817. hydpy/models/sw1d_gate_out.py +599 -0
  818. hydpy/models/sw1d_lias.py +105 -0
  819. hydpy/models/sw1d_lias_sluice.py +531 -0
  820. hydpy/models/sw1d_network.py +1219 -0
  821. hydpy/models/sw1d_pump.py +448 -0
  822. hydpy/models/sw1d_q_in.py +79 -0
  823. hydpy/models/sw1d_q_out.py +81 -0
  824. hydpy/models/sw1d_storage.py +78 -0
  825. hydpy/models/sw1d_weir_out.py +75 -0
  826. hydpy/models/test/__init__.py +14 -0
  827. hydpy/models/test/test_control.py +28 -0
  828. hydpy/models/test/test_fluxes.py +17 -0
  829. hydpy/models/test/test_model.py +201 -0
  830. hydpy/models/test/test_solver.py +48 -0
  831. hydpy/models/test/test_states.py +17 -0
  832. hydpy/models/test_discontinous.py +46 -0
  833. hydpy/models/test_stiff0d.py +47 -0
  834. hydpy/models/test_stiff1d.py +42 -0
  835. hydpy/models/whmod/__init__.py +21 -0
  836. hydpy/models/whmod/whmod_constants.py +77 -0
  837. hydpy/models/whmod/whmod_control.py +333 -0
  838. hydpy/models/whmod/whmod_derived.py +210 -0
  839. hydpy/models/whmod/whmod_factors.py +9 -0
  840. hydpy/models/whmod/whmod_fluxes.py +105 -0
  841. hydpy/models/whmod/whmod_inputs.py +15 -0
  842. hydpy/models/whmod/whmod_masks.py +178 -0
  843. hydpy/models/whmod/whmod_model.py +2091 -0
  844. hydpy/models/whmod/whmod_parameters.py +155 -0
  845. hydpy/models/whmod/whmod_sequences.py +193 -0
  846. hydpy/models/whmod/whmod_states.py +73 -0
  847. hydpy/models/whmod_rural.py +794 -0
  848. hydpy/models/whmod_urban.py +1011 -0
  849. hydpy/models/wland/__init__.py +43 -0
  850. hydpy/models/wland/wland_aides.py +55 -0
  851. hydpy/models/wland/wland_constants.py +103 -0
  852. hydpy/models/wland/wland_control.py +508 -0
  853. hydpy/models/wland/wland_derived.py +330 -0
  854. hydpy/models/wland/wland_factors.py +11 -0
  855. hydpy/models/wland/wland_fixed.py +12 -0
  856. hydpy/models/wland/wland_fluxes.py +166 -0
  857. hydpy/models/wland/wland_inputs.py +33 -0
  858. hydpy/models/wland/wland_masks.py +54 -0
  859. hydpy/models/wland/wland_model.py +3755 -0
  860. hydpy/models/wland/wland_outlets.py +11 -0
  861. hydpy/models/wland/wland_parameters.py +214 -0
  862. hydpy/models/wland/wland_sequences.py +108 -0
  863. hydpy/models/wland/wland_solver.py +45 -0
  864. hydpy/models/wland/wland_states.py +56 -0
  865. hydpy/models/wland_gd.py +888 -0
  866. hydpy/models/wland_wag.py +1244 -0
  867. hydpy/models/wq/__init__.py +14 -0
  868. hydpy/models/wq/wq_control.py +117 -0
  869. hydpy/models/wq/wq_derived.py +182 -0
  870. hydpy/models/wq/wq_factors.py +79 -0
  871. hydpy/models/wq/wq_fluxes.py +17 -0
  872. hydpy/models/wq/wq_model.py +1889 -0
  873. hydpy/models/wq_trapeze.py +168 -0
  874. hydpy/models/wq_trapeze_strickler.py +101 -0
  875. hydpy/models/wq_walrus.py +57 -0
  876. hydpy/py.typed +0 -0
  877. hydpy/tests/.coveragerc +22 -0
  878. hydpy/tests/__init__.py +0 -0
  879. hydpy/tests/check_consistency.py +32 -0
  880. hydpy/tests/hydpydoctestcustomize.pth +1 -0
  881. hydpy/tests/hydpydoctestcustomize.py +15 -0
  882. hydpy/tests/iotesting/__init__.py +0 -0
  883. hydpy/tests/run_doctests.py +233 -0
  884. hydpy-6.2.dev1.data/scripts/hyd.py +277 -0
  885. hydpy-6.2.dev1.dist-info/LICENSE +165 -0
  886. hydpy-6.2.dev1.dist-info/METADATA +163 -0
  887. hydpy-6.2.dev1.dist-info/RECORD +890 -0
  888. hydpy-6.2.dev1.dist-info/WHEEL +5 -0
  889. hydpy-6.2.dev1.dist-info/licenses_hydpy_installer.txt +42 -0
  890. hydpy-6.2.dev1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,2091 @@
1
+ # pylint: disable=missing-module-docstring
2
+
3
+ from typing import *
4
+
5
+ import numpy
6
+
7
+ from hydpy import config
8
+ from hydpy.core import importtools
9
+ from hydpy.core import modeltools
10
+ from hydpy.interfaces import aetinterfaces
11
+ from hydpy.interfaces import precipinterfaces
12
+ from hydpy.interfaces import stateinterfaces
13
+ from hydpy.interfaces import tempinterfaces
14
+ from hydpy.cythons import modelutils
15
+
16
+ from hydpy.models.whmod.whmod_constants import *
17
+ from hydpy.models.whmod import whmod_constants
18
+ from hydpy.models.whmod import whmod_control
19
+ from hydpy.models.whmod import whmod_derived
20
+ from hydpy.models.whmod import whmod_inputs
21
+ from hydpy.models.whmod import whmod_factors
22
+ from hydpy.models.whmod import whmod_fluxes
23
+ from hydpy.models.whmod import whmod_states
24
+
25
+
26
+ class Calc_Throughfall_InterceptedWater_V1(modeltools.Method):
27
+ r"""Calculate the interception storage's throughfall and change in water content due
28
+ to precipitation.
29
+
30
+ Basic equation:
31
+ .. math::
32
+ T = \begin{cases}
33
+ P &|\ I = C \\
34
+ 0 &|\ I \leq C
35
+ \end{cases}
36
+ \\
37
+ I_{new} = I_{old} + P - I
38
+ \\ \\
39
+ T = Throughfall \\
40
+ P = Precipitation \\
41
+ I = InterceptedWater \\
42
+ C = InterceptionCapacity
43
+
44
+ Examples:
45
+
46
+ >>> from hydpy.models.whmod import *
47
+ >>> parameterstep()
48
+ >>> nmbzones(5)
49
+ >>> landtype(CORN, CORN, CORN, CORN, WATER)
50
+ >>> interceptioncapacity.corn_jun = 2.0
51
+ >>> interceptioncapacity.corn_jul = 2.5
52
+
53
+ >>> from hydpy import pub
54
+ >>> pub.timegrids = "2001-06-29", "2001-07-03", "1d"
55
+ >>> derived.moy.update()
56
+
57
+ >>> inputs.precipitation = 1.0
58
+ >>> states.interceptedwater = 0.0, 1.0, 2.0, 3.0, nan
59
+ >>> model.idx_sim = 1
60
+ >>> model.calc_throughfall_interceptedwater_v1()
61
+ >>> states.interceptedwater
62
+ interceptedwater(1.0, 2.0, 2.0, 2.0, 0.0)
63
+ >>> fluxes.throughfall
64
+ throughfall(0.0, 0.0, 1.0, 2.0, 0.0)
65
+
66
+ >>> inputs.precipitation = 0.0
67
+ >>> states.interceptedwater = 0.0, 1.0, 2.0, 3.0, nan
68
+ >>> model.idx_sim = 2
69
+ >>> model.calc_throughfall_interceptedwater_v1()
70
+ >>> states.interceptedwater
71
+ interceptedwater(0.0, 1.0, 2.0, 2.5, 0.0)
72
+ >>> fluxes.throughfall
73
+ throughfall(0.0, 0.0, 0.0, 0.5, 0.0)
74
+ """
75
+
76
+ CONTROLPARAMETERS = (
77
+ whmod_control.NmbZones,
78
+ whmod_control.LandType,
79
+ whmod_control.InterceptionCapacity,
80
+ )
81
+ DERIVEDPARAMETERS = (whmod_derived.MOY,)
82
+ REQUIREDSEQUENCES = (whmod_inputs.Precipitation,)
83
+ UPDATEDSEQUENCES = (whmod_states.InterceptedWater,)
84
+ RESULTSEQUENCES = (whmod_fluxes.Throughfall,)
85
+
86
+ @staticmethod
87
+ def __call__(model: modeltools.Model) -> None:
88
+ con = model.parameters.control.fastaccess
89
+ der = model.parameters.derived.fastaccess
90
+ inp = model.sequences.inputs.fastaccess
91
+ flu = model.sequences.fluxes.fastaccess
92
+ sta = model.sequences.states.fastaccess
93
+ month = der.moy[model.idx_sim]
94
+ for k in range(con.nmbzones):
95
+ if con.landtype[k] == WATER:
96
+ sta.interceptedwater[k] = 0.0
97
+ flu.throughfall[k] = 0.0
98
+ else:
99
+ ic: float = con.interceptioncapacity[con.landtype[k] - 1, month]
100
+ flu.throughfall[k] = max(
101
+ inp.precipitation + sta.interceptedwater[k] - ic, 0.0
102
+ )
103
+ sta.interceptedwater[k] += inp.precipitation - flu.throughfall[k]
104
+
105
+
106
+ class Calc_InterceptionEvaporation_InterceptedWater_AETModel_V1(modeltools.Method):
107
+ r"""Let a submodel that follows the |AETModel_V1| submodel interface calculate
108
+ interception evaporation and adjust the amount of intercepted water.
109
+
110
+ Basic equations:
111
+ .. math::
112
+ E = get\_interceptionevaporation()
113
+ \\
114
+ I_{new} = I_{old} - E
115
+ \\ \\
116
+ I = InterceptedWater \\
117
+ E = InterceptionEvaporation
118
+
119
+ Examples:
120
+
121
+ We build an example based on |evap_aet_minhas| for calculating interception
122
+ evaporation, which uses |evap_ret_io| for querying potential
123
+ evapotranspiration:
124
+
125
+ >>> from hydpy.models.whmod_rural import *
126
+ >>> parameterstep("1h")
127
+ >>> area(1.0)
128
+ >>> nmbzones(5)
129
+ >>> landtype(GRASS, DECIDUOUS, CORN, SEALED, WATER)
130
+ >>> zonearea(0.05, 0.1, 0.2, 0.3, 0.35)
131
+ >>> interceptioncapacity.jun = 3.0
132
+ >>> derived.moy.shape = 1
133
+ >>> derived.moy(5)
134
+ >>> availablefieldcapacity(0.1)
135
+ >>> rootingdepth(0.1)
136
+ >>> groundwaterdepth(0.1)
137
+ >>> with model.add_aetmodel_v1("evap_aet_minhas"):
138
+ ... with model.add_petmodel_v1("evap_ret_io"):
139
+ ... evapotranspirationfactor(0.6, 0.8, 1.0, 1.2, 1.4)
140
+ ... inputs.referenceevapotranspiration = 1.0
141
+
142
+ |Calc_InterceptionEvaporation_InterceptedWater_AETModel_V1| uses the flux
143
+ returned by the submodel to adjust |InterceptedWater|:
144
+
145
+ >>> states.interceptedwater = 2.0
146
+ >>> model.calc_interceptionevaporation_interceptedwater_v1()
147
+ >>> fluxes.interceptionevaporation
148
+ interceptionevaporation(0.6, 0.8, 1.0, 1.2, 0.0)
149
+ >>> states.interceptedwater
150
+ interceptedwater(1.4, 1.2, 1.0, 0.8, 0.0)
151
+
152
+ |Calc_InterceptionEvaporation_InterceptedWater_AETModel_V1| eventually reduces
153
+ |InterceptionEvaporation| so that |InterceptedWater| does not become negative:
154
+
155
+ >>> model.aetmodel.petmodel.sequences.inputs.referenceevapotranspiration = 5.0
156
+ >>> states.interceptedwater = 2.0
157
+ >>> model.calc_interceptionevaporation_interceptedwater_v1()
158
+ >>> fluxes.interceptionevaporation
159
+ interceptionevaporation(2.0, 2.0, 2.0, 2.0, 0.0)
160
+ >>> states.interceptedwater
161
+ interceptedwater(0.0, 0.0, 0.0, 0.0, 0.0)
162
+
163
+ In contrast, |Calc_InterceptionEvaporation_InterceptedWater_AETModel_V1| does
164
+ not reduce negative |InterceptionEvaporation| values (condensation) that cause
165
+ an overshoot of the interception storage capacity:
166
+
167
+ >>> model.aetmodel.petmodel.sequences.inputs.referenceevapotranspiration = -3.0
168
+ >>> states.interceptedwater = 2.0
169
+ >>> model.calc_interceptionevaporation_interceptedwater_v1()
170
+ >>> fluxes.interceptionevaporation
171
+ interceptionevaporation(-1.8, -2.4, -3.0, -3.6, 0.0)
172
+ >>> states.interceptedwater
173
+ interceptedwater(3.8, 4.4, 5.0, 5.6, 0.0)
174
+ """
175
+
176
+ CONTROLPARAMETERS = (whmod_control.NmbZones, whmod_control.LandType)
177
+ UPDATEDSEQUENCES = (whmod_states.InterceptedWater,)
178
+ RESULTSEQUENCES = (whmod_fluxes.InterceptionEvaporation,)
179
+
180
+ @staticmethod
181
+ def __call__(model: modeltools.Model, submodel: aetinterfaces.AETModel_V1) -> None:
182
+ con = model.parameters.control.fastaccess
183
+ flu = model.sequences.fluxes.fastaccess
184
+ sta = model.sequences.states.fastaccess
185
+ submodel.determine_interceptionevaporation()
186
+ for k in range(con.nmbzones):
187
+ if con.landtype[k] == WATER:
188
+ flu.interceptionevaporation[k] = 0.0
189
+ sta.interceptedwater[k] = 0.0
190
+ else:
191
+ flu.interceptionevaporation[k] = min(
192
+ submodel.get_interceptionevaporation(k), sta.interceptedwater[k]
193
+ )
194
+ sta.interceptedwater[k] -= flu.interceptionevaporation[k]
195
+
196
+
197
+ class Calc_InterceptionEvaporation_InterceptedWater_V1(modeltools.Method):
198
+ """Let a submodel that follows the |AETModel_V1| submodel interface calculate
199
+ interception evaporation and adjust the amount of intercepted water."""
200
+
201
+ SUBMODELINTERFACES = (aetinterfaces.AETModel_V1,)
202
+ SUBMETHODS = (Calc_InterceptionEvaporation_InterceptedWater_AETModel_V1,)
203
+ CONTROLPARAMETERS = (whmod_control.NmbZones, whmod_control.LandType)
204
+ UPDATEDSEQUENCES = (whmod_states.InterceptedWater,)
205
+ RESULTSEQUENCES = (whmod_fluxes.InterceptionEvaporation,)
206
+
207
+ @staticmethod
208
+ def __call__(model: modeltools.Model) -> None:
209
+ if model.aetmodel_typeid == 1:
210
+ model.calc_interceptionevaporation_interceptedwater_aetmodel_v1(
211
+ cast(aetinterfaces.AETModel_V1, model.aetmodel)
212
+ )
213
+
214
+
215
+ class Calc_LakeEvaporation_AETModel_V1(modeltools.Method):
216
+ r"""Let a submodel that follows the |AETModel_V1| submodel interface calculate
217
+ lake evaporation.
218
+
219
+ Basic equation:
220
+ .. math::
221
+ LakeEvaporation = get\_waterevaporation()
222
+
223
+ Example:
224
+
225
+ We build an example based on |evap_aet_minhas| for calculating water
226
+ evaporation, which uses |evap_ret_io| for querying potential
227
+ evapotranspiration:
228
+
229
+ >>> from hydpy.models.whmod_rural import *
230
+ >>> parameterstep("1h")
231
+ >>> area(1.0)
232
+ >>> nmbzones(5)
233
+ >>> landtype(GRASS, DECIDUOUS, CORN, SEALED, WATER)
234
+ >>> zonearea(0.05, 0.1, 0.2, 0.3, 0.35)
235
+ >>> interceptioncapacity.jun = 3.0
236
+ >>> derived.moy.shape = 1
237
+ >>> derived.moy(5)
238
+ >>> availablefieldcapacity(0.1)
239
+ >>> rootingdepth(0.1)
240
+ >>> groundwaterdepth(0.1)
241
+ >>> with model.add_aetmodel_v1("evap_aet_minhas"):
242
+ ... with model.add_petmodel_v1("evap_ret_io"):
243
+ ... evapotranspirationfactor(0.6, 0.8, 1.0, 1.2, 1.4)
244
+ ... inputs.referenceevapotranspiration = 1.0
245
+
246
+ |Calc_LakeEvaporation_AETModel_V1| stores the flux returned by the submodel
247
+ without any modifications:
248
+
249
+ >>> model.aetmodel.determine_interceptionevaporation()
250
+ >>> model.calc_lakeevaporation_v1()
251
+ >>> fluxes.lakeevaporation
252
+ lakeevaporation(0.0, 0.0, 0.0, 0.0, 1.4)
253
+ """
254
+
255
+ CONTROLPARAMETERS = (whmod_control.NmbZones, whmod_control.LandType)
256
+ RESULTSEQUENCES = (whmod_fluxes.LakeEvaporation,)
257
+
258
+ @staticmethod
259
+ def __call__(model: modeltools.Model, submodel: aetinterfaces.AETModel_V1) -> None:
260
+ con = model.parameters.control.fastaccess
261
+ flu = model.sequences.fluxes.fastaccess
262
+ submodel.determine_waterevaporation()
263
+ for k in range(con.nmbzones):
264
+ if con.landtype[k] == WATER:
265
+ flu.lakeevaporation[k] = submodel.get_waterevaporation(k)
266
+ else:
267
+ flu.lakeevaporation[k] = 0.0
268
+
269
+
270
+ class Calc_LakeEvaporation_V1(modeltools.Method):
271
+ """Let a submodel that follows the |AETModel_V1| submodel interface calculate
272
+ lake evaporation."""
273
+
274
+ SUBMODELINTERFACES = (aetinterfaces.AETModel_V1,)
275
+ SUBMETHODS = (Calc_LakeEvaporation_AETModel_V1,)
276
+ CONTROLPARAMETERS = (whmod_control.NmbZones, whmod_control.LandType)
277
+ RESULTSEQUENCES = (whmod_fluxes.LakeEvaporation,)
278
+
279
+ @staticmethod
280
+ def __call__(model: modeltools.Model) -> None:
281
+ if model.aetmodel_typeid == 1:
282
+ model.calc_lakeevaporation_aetmodel_v1(
283
+ cast(aetinterfaces.AETModel_V1, model.aetmodel)
284
+ )
285
+
286
+
287
+ class Calc_PotentialSnowmelt_V1(modeltools.Method):
288
+ r"""Calculcate the potential snowmelt with the degree day method.
289
+
290
+ Basic equation:
291
+ .. math::
292
+ P = \begin{cases}
293
+ 0 &|\ T \leq 0 \\
294
+ D \cdot T &|\ T > 0
295
+ \end{cases}
296
+ \\ \\
297
+ P = PotentialSnowmelt \\
298
+ D = DegreeDayFactor \\
299
+ T = Temperature
300
+
301
+ Examples:
302
+
303
+ >>> from hydpy.models.whmod import *
304
+ >>> parameterstep("1d")
305
+ >>> simulationstep("1d")
306
+ >>> nmbzones(3)
307
+ >>> landtype(GRASS, SEALED, WATER)
308
+ >>> degreedayfactor(grass=3.0, sealed=4.0)
309
+
310
+ >>> inputs.temperature = -2.0
311
+ >>> model.calc_potentialsnowmelt_v1()
312
+ >>> fluxes.potentialsnowmelt
313
+ potentialsnowmelt(0.0, 0.0, 0.0)
314
+
315
+ >>> inputs.temperature = 0.0
316
+ >>> model.calc_potentialsnowmelt_v1()
317
+ >>> fluxes.potentialsnowmelt
318
+ potentialsnowmelt(0.0, 0.0, 0.0)
319
+
320
+ >>> inputs.temperature = 2.0
321
+ >>> model.calc_potentialsnowmelt_v1()
322
+ >>> fluxes.potentialsnowmelt
323
+ potentialsnowmelt(6.0, 8.0, 0.0)
324
+ """
325
+
326
+ CONTROLPARAMETERS = (
327
+ whmod_control.NmbZones,
328
+ whmod_control.LandType,
329
+ whmod_control.DegreeDayFactor,
330
+ )
331
+ REQUIREDSEQUENCES = (whmod_inputs.Temperature,)
332
+ RESULTSEQUENCES = (whmod_fluxes.PotentialSnowmelt,)
333
+
334
+ @staticmethod
335
+ def __call__(model: modeltools.Model) -> None:
336
+ con = model.parameters.control.fastaccess
337
+ inp = model.sequences.inputs.fastaccess
338
+ flu = model.sequences.fluxes.fastaccess
339
+ for k in range(con.nmbzones):
340
+ if (con.landtype[k] == WATER) or (inp.temperature <= 0.0):
341
+ flu.potentialsnowmelt[k] = 0.0
342
+ else:
343
+ flu.potentialsnowmelt[k] = con.degreedayfactor[k] * inp.temperature
344
+
345
+
346
+ class Calc_Snowmelt_Snowpack_V1(modeltools.Method):
347
+ r"""Calculatethe actual snowmelt and update the snow's water content.
348
+
349
+ Basic equations:
350
+ .. math::
351
+ M = \begin{cases}
352
+ 0 &|\ T \leq 0 \\
353
+ min(P, \, S_{old}) &|\ T > 0
354
+ \end{cases}
355
+ \\
356
+ S_{new} = \begin{cases}
357
+ S_{old} + F &|\ T \leq 0
358
+ \\
359
+ S_{old} - M &|\ T > 0
360
+ \end{cases}
361
+ \\ \\
362
+ M = Snowmelt \\
363
+ P = PotentialSnowmelt \\
364
+ S = SnowPack \\
365
+ T = Temperature \\
366
+ F = Throughfall
367
+
368
+ Examples:
369
+
370
+ >>> from hydpy.models.whmod import *
371
+ >>> parameterstep("1d")
372
+ >>> simulationstep("1d")
373
+ >>> nmbzones(3)
374
+ >>> landtype(GRASS, SEALED, WATER)
375
+ >>> fluxes.throughfall = 1.0
376
+
377
+ >>> inputs.temperature = 0.0
378
+ >>> states.snowpack = 0.0, 2.0, 0.0
379
+ >>> model.calc_snowmelt_snowpack_v1()
380
+ >>> fluxes.snowmelt
381
+ snowmelt(0.0, 0.0, 0.0)
382
+ >>> states.snowpack
383
+ snowpack(1.0, 3.0, 0.0)
384
+
385
+ >>> inputs.temperature = 1.0
386
+ >>> states.snowpack = 0.0, 3.0, 0.0
387
+ >>> fluxes.potentialsnowmelt = 2.0
388
+ >>> model.calc_snowmelt_snowpack_v1()
389
+ >>> fluxes.snowmelt
390
+ snowmelt(0.0, 2.0, 0.0)
391
+ >>> states.snowpack
392
+ snowpack(0.0, 1.0, 0.0)
393
+ """
394
+
395
+ CONTROLPARAMETERS = (whmod_control.NmbZones, whmod_control.LandType)
396
+ REQUIREDSEQUENCES = (
397
+ whmod_inputs.Temperature,
398
+ whmod_fluxes.Throughfall,
399
+ whmod_fluxes.PotentialSnowmelt,
400
+ )
401
+ UPDATEDSEQUENCES = (whmod_states.Snowpack,)
402
+ RESULTSEQUENCES = (whmod_fluxes.Snowmelt,)
403
+
404
+ @staticmethod
405
+ def __call__(model: modeltools.Model) -> None:
406
+ con = model.parameters.control.fastaccess
407
+ inp = model.sequences.inputs.fastaccess
408
+ flu = model.sequences.fluxes.fastaccess
409
+ sta = model.sequences.states.fastaccess
410
+ for k in range(con.nmbzones):
411
+ if con.landtype[k] == WATER:
412
+ flu.snowmelt[k] = 0.0
413
+ sta.snowpack[k] = 0.0
414
+ elif inp.temperature <= 0.0:
415
+ flu.snowmelt[k] = 0.0
416
+ sta.snowpack[k] += flu.throughfall[k]
417
+ elif flu.potentialsnowmelt[k] < sta.snowpack[k]:
418
+ flu.snowmelt[k] = flu.potentialsnowmelt[k]
419
+ sta.snowpack[k] -= flu.snowmelt[k]
420
+ else:
421
+ flu.snowmelt[k] = sta.snowpack[k]
422
+ sta.snowpack[k] = 0.0
423
+
424
+
425
+ class Calc_Ponding_V1(modeltools.Method):
426
+ r"""Calculate the (potential) ponding of throughfall and snowmelt of land surfaces.
427
+
428
+ Basic equation:
429
+ .. math::
430
+ P = \begin{cases}
431
+ 0 &|\ T \leq 0 \\
432
+ F + M &|\ T > 0
433
+ \end{cases}
434
+ \\ \\
435
+ P = Ponding \\
436
+ F = Throughfall \\
437
+ M = Snowmelt \\
438
+ T = Temperature
439
+
440
+ Examples:
441
+
442
+ >>> from hydpy.models.whmod import *
443
+ >>> parameterstep()
444
+ >>> nmbzones(3)
445
+ >>> landtype(GRASS, SEALED, WATER)
446
+
447
+ >>> inputs.temperature = 0.0
448
+ >>> model.calc_ponding_v1()
449
+ >>> fluxes.ponding
450
+ ponding(0.0, 0.0, 0.0)
451
+
452
+ >>> inputs.temperature = 1.0
453
+ >>> fluxes.throughfall = 2.0
454
+ >>> fluxes.snowmelt = 3.0
455
+ >>> model.calc_ponding_v1()
456
+ >>> fluxes.ponding
457
+ ponding(5.0, 5.0, 0.0)
458
+ """
459
+
460
+ CONTROLPARAMETERS = (whmod_control.NmbZones, whmod_control.LandType)
461
+ REQUIREDSEQUENCES = (
462
+ whmod_inputs.Temperature,
463
+ whmod_fluxes.Throughfall,
464
+ whmod_fluxes.Snowmelt,
465
+ )
466
+ RESULTSEQUENCES = (whmod_fluxes.Ponding,)
467
+
468
+ @staticmethod
469
+ def __call__(model: modeltools.Model) -> None:
470
+ con = model.parameters.control.fastaccess
471
+ inp = model.sequences.inputs.fastaccess
472
+ flu = model.sequences.fluxes.fastaccess
473
+ for k in range(con.nmbzones):
474
+ if (con.landtype[k] == WATER) or (inp.temperature <= 0.0):
475
+ flu.ponding[k] = 0.0
476
+ else:
477
+ flu.ponding[k] = flu.throughfall[k] + flu.snowmelt[k]
478
+
479
+
480
+ class Calc_SurfaceRunoff_V1(modeltools.Method):
481
+ """Calculate the surface runoff from sealed areas.
482
+
483
+ Basic equation:
484
+ .. math::
485
+ SurfaceRunoff = Ponding
486
+
487
+ Example:
488
+
489
+ >>> from hydpy.models.whmod import *
490
+ >>> parameterstep()
491
+ >>> nmbzones(3)
492
+ >>> landtype(SEALED, WATER, GRASS)
493
+ >>> fluxes.ponding = 3.0
494
+ >>> model.calc_surfacerunoff_v1()
495
+ >>> fluxes.surfacerunoff
496
+ surfacerunoff(3.0, 0.0, 0.0)
497
+ """
498
+
499
+ CONTROLPARAMETERS = (whmod_control.NmbZones, whmod_control.LandType)
500
+ REQUIREDSEQUENCES = (whmod_fluxes.Ponding,)
501
+ RESULTSEQUENCES = (whmod_fluxes.SurfaceRunoff,)
502
+
503
+ @staticmethod
504
+ def __call__(model: modeltools.Model) -> None:
505
+ con = model.parameters.control.fastaccess
506
+ flu = model.sequences.fluxes.fastaccess
507
+ for k in range(con.nmbzones):
508
+ if con.landtype[k] == SEALED:
509
+ flu.surfacerunoff[k] = flu.ponding[k]
510
+ else:
511
+ flu.surfacerunoff[k] = 0.0
512
+
513
+
514
+ class Calc_RelativeSoilMoisture_V1(modeltools.Method):
515
+ r"""Calculate the relative soil water content.
516
+
517
+ Basic equation:
518
+ .. math::
519
+ R = S / M
520
+ \\ \\
521
+ R = RelativeSoilMoisture \\
522
+ S = SoilMoisture \\
523
+ M = MaxSoilWater
524
+
525
+ Example:
526
+
527
+ >>> from hydpy.models.whmod import *
528
+ >>> parameterstep()
529
+ >>> nmbzones(7)
530
+ >>> landtype(GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, SEALED)
531
+ >>> soiltype(SAND, SAND_COHESIVE, LOAM, CLAY, SILT, PEAT, NONE)
532
+ >>> derived.maxsoilwater(200.0, 200.0, 200.0, 200.0, 200.0, 0.0, nan)
533
+ >>> states.soilmoisture = 0.0, 50.0, 100.0, 150.0, 200.0, 0.0, nan
534
+ >>> model.calc_relativesoilmoisture_v1()
535
+ >>> factors.relativesoilmoisture
536
+ relativesoilmoisture(0.0, 0.25, 0.5, 0.75, 1.0, 0.0, 0.0)
537
+ """
538
+
539
+ CONTROLPARAMETERS = (whmod_control.NmbZones, whmod_control.SoilType)
540
+ DERIVEDPARAMETERS = (whmod_derived.MaxSoilWater,)
541
+ REQUIREDSEQUENCES = (whmod_states.SoilMoisture,)
542
+ RESULTSEQUENCES = (whmod_factors.RelativeSoilMoisture,)
543
+
544
+ @staticmethod
545
+ def __call__(model: modeltools.Model) -> None:
546
+ con = model.parameters.control.fastaccess
547
+ der = model.parameters.derived.fastaccess
548
+ fac = model.sequences.factors.fastaccess
549
+ sta = model.sequences.states.fastaccess
550
+ for k in range(con.nmbzones):
551
+ if (con.soiltype[k] == NONE) or (der.maxsoilwater[k] <= 0.0):
552
+ fac.relativesoilmoisture[k] = 0.0
553
+ else:
554
+ fac.relativesoilmoisture[k] = sta.soilmoisture[k] / der.maxsoilwater[k]
555
+
556
+
557
+ class Calc_CisternInflow_V1(modeltools.Method):
558
+ r"""Calculate the inflow into the cistern.
559
+
560
+ Basic equation:
561
+ .. math::
562
+ I = \sum_{k=1}^N \frac{A_k}{1000} \cdot \begin{cases}
563
+ S_k &|\ L_k = SEALED \, \land \, C_k \\
564
+ P_k &|\ L_k \neq SEALED \, \land \, C_k
565
+ \end{cases}
566
+ \\ \\
567
+ I = CisternInflow\\
568
+ N = NmbZones \\
569
+ T = LandType \\
570
+ C = CisternSource \\
571
+ A = ZoneArea \\
572
+ S = SurfaceRunoff \\
573
+ P = Percolation
574
+
575
+ Example:
576
+
577
+ >>> from hydpy.models.whmod import *
578
+ >>> parameterstep()
579
+ >>> nmbzones(5)
580
+ >>> landtype(GRASS, GRASS, SEALED, SEALED, WATER)
581
+ >>> cisternsource(False, True, False, True, False)
582
+ >>> area(15.0)
583
+ >>> zonearea(1.0, 2.0, 3.0, 4.0, 5.0)
584
+ >>> fluxes.percolation = nan, 6.0, nan, nan, nan
585
+ >>> fluxes.surfacerunoff = nan, nan, nan, 7.0, nan
586
+ >>> model.calc_cisterninflow_v1()
587
+ >>> fluxes.cisterninflow
588
+ cisterninflow(0.04)
589
+ """
590
+
591
+ CONTROLPARAMETERS = (
592
+ whmod_control.NmbZones,
593
+ whmod_control.ZoneArea,
594
+ whmod_control.LandType,
595
+ whmod_control.CisternSource,
596
+ )
597
+ REQUIREDSEQUENCES = (whmod_fluxes.SurfaceRunoff, whmod_fluxes.Percolation)
598
+ RESULTSEQUENCES = (whmod_fluxes.CisternInflow,)
599
+
600
+ @staticmethod
601
+ def __call__(model: modeltools.Model) -> None:
602
+ con = model.parameters.control.fastaccess
603
+ flu = model.sequences.fluxes.fastaccess
604
+
605
+ flu.cisterninflow = 0.0
606
+ for k in range(con.nmbzones):
607
+ if con.cisternsource[k]:
608
+ if con.landtype[k] == SEALED:
609
+ flu.cisterninflow += con.zonearea[k] * flu.surfacerunoff[k]
610
+ elif con.landtype[k] != WATER:
611
+ flu.cisterninflow += con.zonearea[k] * flu.percolation[k]
612
+ flu.cisterninflow /= 1000.0
613
+
614
+
615
+ class Calc_CisternOverflow_CisternWater_V1(modeltools.Method):
616
+ r"""Take the inflow into the cistern to update its content and calculate eventual
617
+ overflow.
618
+
619
+ Basic equation:
620
+ .. math::
621
+ O(t) = \begin{cases}
622
+ 0 &|\ W(t) \leq C \\
623
+ I(t) &|\ W(t) = C
624
+ \end{cases}
625
+ \\
626
+ \frac{d W(t)}{d t} = I(t) - O(t)
627
+ \\ \\
628
+ O = CisternOverflow \\
629
+ I = CisternInflow \\
630
+ W = CisternWater \\
631
+ C = CisternCapacity
632
+
633
+ Examples:
634
+
635
+ >>> from hydpy.models.whmod import *
636
+ >>> parameterstep()
637
+ >>> cisterncapacity(5.0)
638
+ >>> states.cisternwater = 1.0
639
+ >>> fluxes.cisterninflow = 3.0
640
+
641
+ >>> model.calc_cisternoverflow_cisternwater_v1()
642
+ >>> states.cisternwater
643
+ cisternwater(4.0)
644
+ >>> fluxes.cisternoverflow
645
+ cisternoverflow(0.0)
646
+
647
+ >>> model.calc_cisternoverflow_cisternwater_v1()
648
+ >>> states.cisternwater
649
+ cisternwater(5.0)
650
+ >>> fluxes.cisternoverflow
651
+ cisternoverflow(2.0)
652
+
653
+ >>> model.calc_cisternoverflow_cisternwater_v1()
654
+ >>> states.cisternwater
655
+ cisternwater(5.0)
656
+ >>> fluxes.cisternoverflow
657
+ cisternoverflow(3.0)
658
+ """
659
+
660
+ CONTROLPARAMETERS = (whmod_control.CisternCapacity,)
661
+ REQUIREDSEQUENCES = (whmod_fluxes.CisternInflow,)
662
+ UPDATEDSEQUENCES = (whmod_states.CisternWater,)
663
+ RESULTSEQUENCES = (whmod_fluxes.CisternOverflow,)
664
+
665
+ @staticmethod
666
+ def __call__(model: modeltools.Model) -> None:
667
+ con = model.parameters.control.fastaccess
668
+ flu = model.sequences.fluxes.fastaccess
669
+ sta = model.sequences.states.fastaccess
670
+
671
+ sta.cisternwater += flu.cisterninflow
672
+ if sta.cisternwater <= con.cisterncapacity:
673
+ flu.cisternoverflow = 0.0
674
+ else:
675
+ flu.cisternoverflow = sta.cisternwater - con.cisterncapacity
676
+ sta.cisternwater = con.cisterncapacity
677
+
678
+
679
+ class Calc_Percolation_V1(modeltools.Method):
680
+ r"""Calculate the percolation out of the soil storage.
681
+
682
+ Basic equation:
683
+ .. math::
684
+ Percolation = P \cdot R ^ {\beta}
685
+ \\ \\
686
+ P = Ponding \\
687
+ R = RelativeSoilMoisture \\
688
+ \beta = BETA
689
+
690
+ Example:
691
+
692
+ >>> from hydpy.models.whmod import *
693
+ >>> parameterstep()
694
+ >>> nmbzones(7)
695
+ >>> landtype(GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, SEALED)
696
+ >>> soiltype(SAND, SAND_COHESIVE, LOAM, CLAY, SILT, PEAT, NONE)
697
+ >>> derived.beta(2.0)
698
+ >>> fluxes.ponding(10.0)
699
+ >>> factors.relativesoilmoisture = 0.0, 0.2, 0.4, 0.6, 0.8, 1.0, nan
700
+ >>> model.calc_percolation_v1()
701
+ >>> fluxes.percolation
702
+ percolation(0.0, 0.4, 1.6, 3.6, 6.4, 10.0, 0.0)
703
+ """
704
+
705
+ CONTROLPARAMETERS = (whmod_control.NmbZones, whmod_control.SoilType)
706
+ DERIVEDPARAMETERS = (whmod_derived.Beta,)
707
+ REQUIREDSEQUENCES = (whmod_fluxes.Ponding, whmod_factors.RelativeSoilMoisture)
708
+ RESULTSEQUENCES = (whmod_fluxes.Percolation,)
709
+
710
+ @staticmethod
711
+ def __call__(model: modeltools.Model) -> None:
712
+ con = model.parameters.control.fastaccess
713
+ der = model.parameters.derived.fastaccess
714
+ fac = model.sequences.factors.fastaccess
715
+ flu = model.sequences.fluxes.fastaccess
716
+ for k in range(con.nmbzones):
717
+ if con.soiltype[k] == NONE:
718
+ flu.percolation[k] = 0.0
719
+ else:
720
+ flu.percolation[k] = (
721
+ flu.ponding[k] * fac.relativesoilmoisture[k] ** der.beta[k]
722
+ )
723
+
724
+
725
+ class Calc_SoilEvapotranspiration_AETModel_V1(modeltools.Method):
726
+ r"""Let a submodel that follows the |AETModel_V1| submodel interface calculate
727
+ soil evapotranspiration.
728
+
729
+ Basic equation:
730
+ .. math::
731
+ SoilEvapotranspiration = get\_soilevapotranspiration()
732
+
733
+ Example:
734
+
735
+ We build an example based on |evap_aet_minhas|:
736
+
737
+ >>> from hydpy.models.whmod_rural import *
738
+ >>> parameterstep("1h")
739
+ >>> area(1.0)
740
+ >>> nmbzones(5)
741
+ >>> landtype(GRASS, GRASS, GRASS, GRASS, WATER)
742
+ >>> soiltype(SAND, SAND, SAND, SAND, NONE)
743
+ >>> zonearea(0.05, 0.1, 0.2, 0.3, 0.35)
744
+ >>> availablefieldcapacity(0.1)
745
+ >>> rootingdepth(1.0)
746
+ >>> groundwaterdepth(1.0)
747
+ >>> with model.add_aetmodel_v1("evap_aet_minhas"):
748
+ ... dissefactor(5.0)
749
+
750
+ |Calc_SoilEvapotranspiration_AETModel_V1| stores the flux returned by the
751
+ submodel without any modifications:
752
+
753
+ >>> states.soilmoisture = 0.0, 0.0, 50.0, 100.0, 0.0
754
+ >>> model.aetmodel.sequences.fluxes.potentialinterceptionevaporation = 5.0
755
+ >>> model.aetmodel.sequences.fluxes.potentialsoilevapotranspiration = 5.0
756
+ >>> model.aetmodel.sequences.fluxes.interceptionevaporation = 3.0
757
+ >>> model.calc_soilevapotranspiration_v1()
758
+ >>> fluxes.soilevapotranspiration
759
+ soilevapotranspiration(0.0, 0.0, 1.717962, 2.0, 0.0)
760
+ """
761
+
762
+ CONTROLPARAMETERS = (whmod_control.NmbZones, whmod_control.SoilType)
763
+ RESULTSEQUENCES = (whmod_fluxes.SoilEvapotranspiration,)
764
+
765
+ @staticmethod
766
+ def __call__(model: modeltools.Model, submodel: aetinterfaces.AETModel_V1) -> None:
767
+ con = model.parameters.control.fastaccess
768
+ flu = model.sequences.fluxes.fastaccess
769
+ submodel.determine_soilevapotranspiration()
770
+ for k in range(con.nmbzones):
771
+ if con.soiltype[k] == NONE:
772
+ flu.soilevapotranspiration[k] = 0.0
773
+ else:
774
+ flu.soilevapotranspiration[k] = submodel.get_soilevapotranspiration(k)
775
+
776
+
777
+ class Calc_SoilEvapotranspiration_V1(modeltools.Method):
778
+ """Let a submodel that follows the |AETModel_V1| submodel interface calculate soil
779
+ evapotranspiration."""
780
+
781
+ SUBMODELINTERFACES = (aetinterfaces.AETModel_V1,)
782
+ SUBMETHODS = (Calc_SoilEvapotranspiration_AETModel_V1,)
783
+ CONTROLPARAMETERS = (whmod_control.NmbZones, whmod_control.SoilType)
784
+ RESULTSEQUENCES = (whmod_fluxes.SoilEvapotranspiration,)
785
+
786
+ @staticmethod
787
+ def __call__(model: modeltools.Model) -> None:
788
+ if model.aetmodel_typeid == 1:
789
+ model.calc_soilevapotranspiration_aetmodel_v1(
790
+ cast(aetinterfaces.AETModel_V1, model.aetmodel)
791
+ )
792
+
793
+
794
+ class Calc_TotalEvapotranspiration_V1(modeltools.Method):
795
+ r"""Calculate the sum of interception evaporation, lake evaporation, and soil
796
+ evapotranspiration.
797
+
798
+ Basic equation:
799
+ .. math::
800
+ T = I + S + L
801
+ \\ \\
802
+ T = TotalEvapotranspiration \\
803
+ I = InterceptionEvaporation \\
804
+ S = SoilEvapotranspiration \\
805
+ L = LakeEvaporation
806
+
807
+ Example:
808
+
809
+ >>> from hydpy.models.whmod import *
810
+ >>> parameterstep()
811
+ >>> nmbzones(3)
812
+ >>> landtype(GRASS, SEALED, WATER)
813
+ >>> soiltype(SAND, NONE, NONE)
814
+ >>> fluxes.interceptionevaporation = 1.0, 2.0, nan
815
+ >>> fluxes.soilevapotranspiration = 3.0, nan, nan
816
+ >>> fluxes.lakeevaporation = nan, nan, 5.0
817
+ >>> model.calc_totalevapotranspiration_v1()
818
+ >>> fluxes.totalevapotranspiration
819
+ totalevapotranspiration(4.0, 2.0, 5.0)
820
+ """
821
+
822
+ CONTROLPARAMETERS = (
823
+ whmod_control.NmbZones,
824
+ whmod_control.LandType,
825
+ whmod_control.SoilType,
826
+ )
827
+ REQUIREDSEQUENCES = (
828
+ whmod_fluxes.InterceptionEvaporation,
829
+ whmod_fluxes.SoilEvapotranspiration,
830
+ whmod_fluxes.LakeEvaporation,
831
+ )
832
+ RESULTSEQUENCES = (whmod_fluxes.TotalEvapotranspiration,)
833
+
834
+ @staticmethod
835
+ def __call__(model: modeltools.Model) -> None:
836
+ con = model.parameters.control.fastaccess
837
+ flu = model.sequences.fluxes.fastaccess
838
+ for k in range(con.nmbzones):
839
+ if con.landtype[k] == WATER:
840
+ flu.totalevapotranspiration[k] = flu.lakeevaporation[k]
841
+ else:
842
+ flu.totalevapotranspiration[k] = flu.interceptionevaporation[k]
843
+ if con.soiltype[k] != NONE:
844
+ flu.totalevapotranspiration[k] += flu.soilevapotranspiration[k]
845
+
846
+
847
+ class Calc_CapillaryRise_V1(modeltools.Method):
848
+ r"""Calculate the actual capillary rise if requested.
849
+
850
+ Basic equation:
851
+ .. math::
852
+ C = P \cdot (1 - R) ^ 3
853
+ \\ \\
854
+ C = CapillaryRise \\
855
+ P = PotentialCapillaryRise \\
856
+ R = RelativeSoilMoisture
857
+
858
+ Examples:
859
+
860
+ >>> from hydpy.models.whmod import *
861
+ >>> simulationstep("1d")
862
+ >>> parameterstep("1d")
863
+ >>> nmbzones(7)
864
+ >>> landtype(GRASS, GRASS, GRASS, GRASS, GRASS, SEALED, WATER)
865
+ >>> soiltype(SAND, SAND, SAND, SAND, SAND, NONE, NONE)
866
+ >>> derived.potentialcapillaryrise(2.0)
867
+ >>> factors.relativesoilmoisture = 0.0, 0.25, 0.5, 0.75, 1.0, nan, nan
868
+
869
+ >>> withcapillaryrise(True)
870
+ >>> model.calc_capillaryrise_v1()
871
+ >>> fluxes.capillaryrise
872
+ capillaryrise(2.0, 0.84375, 0.25, 0.03125, 0.0, 0.0, 0.0)
873
+
874
+ >>> withcapillaryrise(False)
875
+ >>> model.calc_capillaryrise_v1()
876
+ >>> fluxes.capillaryrise
877
+ capillaryrise(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)
878
+ """
879
+
880
+ CONTROLPARAMETERS = (
881
+ whmod_control.NmbZones,
882
+ whmod_control.SoilType,
883
+ whmod_control.WithCapillaryRise,
884
+ )
885
+ DERIVEDPARAMETERS = (whmod_derived.PotentialCapillaryRise,)
886
+ REQUIREDSEQUENCES = (whmod_factors.RelativeSoilMoisture,)
887
+ RESULTSEQUENCES = (whmod_fluxes.CapillaryRise,)
888
+
889
+ @staticmethod
890
+ def __call__(model: modeltools.Model) -> None:
891
+ con = model.parameters.control.fastaccess
892
+ der = model.parameters.derived.fastaccess
893
+ fac = model.sequences.factors.fastaccess
894
+ flu = model.sequences.fluxes.fastaccess
895
+ for k in range(con.nmbzones):
896
+ if (con.soiltype[k] == NONE) or not con.withcapillaryrise:
897
+ flu.capillaryrise[k] = 0.0
898
+ else:
899
+ flu.capillaryrise[k] = (
900
+ der.potentialcapillaryrise[k]
901
+ * (1.0 - fac.relativesoilmoisture[k]) ** 3
902
+ )
903
+
904
+
905
+ class Calc_CapillaryRise_V2(modeltools.Method):
906
+ """Calculate the actual capillary rise if requested.
907
+
908
+ Method |Calc_CapillaryRise_V2| works like method |Calc_CapillaryRise_V1| except
909
+ that it does not calculate any capillary rise for zones connected to the cistern.
910
+
911
+ Examples:
912
+
913
+ >>> from hydpy.models.whmod import *
914
+ >>> simulationstep("1d")
915
+ >>> parameterstep("1d")
916
+ >>> nmbzones(7)
917
+ >>> landtype(GRASS, GRASS, GRASS, GRASS, GRASS, SEALED, WATER)
918
+ >>> soiltype(SAND, SAND, SAND, SAND, SAND, NONE, NONE)
919
+ >>> cisternsource(False, True, True, False, False, False, False)
920
+ >>> derived.potentialcapillaryrise(2.0)
921
+ >>> factors.relativesoilmoisture = 0.0, 0.25, 0.5, 0.75, 1.0, nan, nan
922
+
923
+ >>> withcapillaryrise(True)
924
+ >>> model.calc_capillaryrise_v2()
925
+ >>> fluxes.capillaryrise
926
+ capillaryrise(2.0, 0.0, 0.0, 0.03125, 0.0, 0.0, 0.0)
927
+
928
+ >>> withcapillaryrise(False)
929
+ >>> model.calc_capillaryrise_v2()
930
+ >>> fluxes.capillaryrise
931
+ capillaryrise(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)
932
+ """
933
+
934
+ CONTROLPARAMETERS = (
935
+ whmod_control.NmbZones,
936
+ whmod_control.SoilType,
937
+ whmod_control.CisternSource,
938
+ whmod_control.WithCapillaryRise,
939
+ )
940
+ DERIVEDPARAMETERS = (whmod_derived.PotentialCapillaryRise,)
941
+ REQUIREDSEQUENCES = (whmod_factors.RelativeSoilMoisture,)
942
+ RESULTSEQUENCES = (whmod_fluxes.CapillaryRise,)
943
+
944
+ @staticmethod
945
+ def __call__(model: modeltools.Model) -> None:
946
+ con = model.parameters.control.fastaccess
947
+ der = model.parameters.derived.fastaccess
948
+ fac = model.sequences.factors.fastaccess
949
+ flu = model.sequences.fluxes.fastaccess
950
+ for k in range(con.nmbzones):
951
+ if (
952
+ (con.soiltype[k] == NONE)
953
+ or con.cisternsource[k]
954
+ or not con.withcapillaryrise
955
+ ):
956
+ flu.capillaryrise[k] = 0.0
957
+ else:
958
+ flu.capillaryrise[k] = (
959
+ der.potentialcapillaryrise[k]
960
+ * (1.0 - fac.relativesoilmoisture[k]) ** 3
961
+ )
962
+
963
+
964
+ class Calc_SoilMoisture_V1(modeltools.Method):
965
+ r"""Update the actual soil storage's water content.
966
+
967
+ Basic equation:
968
+ .. math::
969
+ M = I - E - P + C
970
+ \\ \\
971
+ M = SoilMoisture \\
972
+ I = Ponding \\
973
+ E = SoilEvapotranspiration \\
974
+ P = Percolation \\
975
+ C = CapillaryRise
976
+
977
+ Examples:
978
+
979
+ >>> from hydpy.models.whmod import *
980
+ >>> parameterstep()
981
+ >>> nmbzones(5)
982
+ >>> landtype(GRASS, GRASS, GRASS, GRASS, SEALED)
983
+ >>> soiltype(SAND, SAND, SAND, SAND, NONE)
984
+ >>> derived.maxsoilwater(10.0)
985
+
986
+ Cases where the given basic equation does not need further adjustment:
987
+
988
+ >>> states.soilmoisture(5.0)
989
+ >>> fluxes.ponding = 2.0
990
+ >>> fluxes.soilevapotranspiration = 2.5, -2.5, 5.0, -5.0, nan
991
+ >>> fluxes.percolation = 5.0
992
+ >>> fluxes.capillaryrise = 3.0
993
+ >>> model.calc_soilmoisture_v1()
994
+ >>> states.soilmoisture
995
+ soilmoisture(2.5, 7.5, 0.0, 10.0, 0.0)
996
+ >>> fluxes.soilevapotranspiration
997
+ soilevapotranspiration(2.5, -2.5, 5.0, -5.0, 0.0)
998
+ >>> fluxes.percolation
999
+ percolation(5.0, 5.0, 5.0, 5.0, 0.0)
1000
+ >>> fluxes.capillaryrise
1001
+ capillaryrise(3.0, 3.0, 3.0, 3.0, 0.0)
1002
+
1003
+ Cases where the soil moisture would become negative (we prevent this by
1004
+ reducing percolation and, if positive, evapotranspiration by the same factor):
1005
+
1006
+ >>> states.soilmoisture(2.0)
1007
+ >>> fluxes.ponding = 1.0
1008
+ >>> fluxes.soilevapotranspiration = 5.0, 0.0, -1.0, 7.0, nan
1009
+ >>> fluxes.percolation = 0.0, 5.0, 6.0, 1.0, nan
1010
+ >>> fluxes.capillaryrise = 1.0
1011
+ >>> model.calc_soilmoisture_v1()
1012
+ >>> states.soilmoisture
1013
+ soilmoisture(0.0, 0.0, 0.0, 0.0, 0.0)
1014
+ >>> fluxes.soilevapotranspiration
1015
+ soilevapotranspiration(4.0, 0.0, -1.0, 3.5, 0.0)
1016
+ >>> fluxes.percolation
1017
+ percolation(0.0, 4.0, 5.0, 0.5, 0.0)
1018
+ >>> fluxes.capillaryrise
1019
+ capillaryrise(1.0, 1.0, 1.0, 1.0, 0.0)
1020
+
1021
+ Cases where the soil moisture would exceed the available storage volume (we
1022
+ prevent this by first reducing capillary rise and, if necessary, also
1023
+ increasing percolation):
1024
+
1025
+ >>> states.soilmoisture(8.0)
1026
+ >>> fluxes.ponding = 1.0
1027
+ >>> fluxes.soilevapotranspiration = 1.0, -1.0, -3.0, -4.0, nan
1028
+ >>> fluxes.percolation = 1.0
1029
+ >>> fluxes.capillaryrise = 5.0, 2.0, 1.0, 0.0, nan
1030
+ >>> model.calc_soilmoisture_v1()
1031
+ >>> states.soilmoisture
1032
+ soilmoisture(10.0, 10.0, 10.0, 10.0, 0.0)
1033
+ >>> fluxes.soilevapotranspiration
1034
+ soilevapotranspiration(1.0, -1.0, -3.0, -4.0, 0.0)
1035
+ >>> fluxes.percolation
1036
+ percolation(1.0, 1.0, 2.0, 3.0, 0.0)
1037
+ >>> fluxes.capillaryrise
1038
+ capillaryrise(3.0, 1.0, 0.0, 0.0, 0.0)
1039
+ """
1040
+
1041
+ CONTROLPARAMETERS = (whmod_control.NmbZones, whmod_control.SoilType)
1042
+ DERIVEDPARAMETERS = (whmod_derived.MaxSoilWater,)
1043
+ REQUIREDSEQUENCES = (
1044
+ whmod_fluxes.Ponding,
1045
+ whmod_fluxes.SoilEvapotranspiration,
1046
+ whmod_fluxes.Percolation,
1047
+ whmod_fluxes.CapillaryRise,
1048
+ )
1049
+ UPDATEDSEQUENCES = (whmod_states.SoilMoisture,)
1050
+
1051
+ @staticmethod
1052
+ def __call__(model: modeltools.Model) -> None:
1053
+ con = model.parameters.control.fastaccess
1054
+ der = model.parameters.derived.fastaccess
1055
+ flu = model.sequences.fluxes.fastaccess
1056
+ old = model.sequences.states.fastaccess_old
1057
+ new = model.sequences.states.fastaccess_new
1058
+ for k in range(con.nmbzones):
1059
+ if con.soiltype[k] == NONE:
1060
+ new.soilmoisture[k] = 0.0
1061
+ flu.percolation[k] = 0.0
1062
+ flu.capillaryrise[k] = 0.0
1063
+ flu.soilevapotranspiration[k] = 0.0
1064
+ else:
1065
+ increase: float = flu.ponding[k] + flu.capillaryrise[k]
1066
+ decrease: float = flu.percolation[k]
1067
+ if flu.soilevapotranspiration[k] < 0.0:
1068
+ increase -= flu.soilevapotranspiration[k]
1069
+ else:
1070
+ decrease += flu.soilevapotranspiration[k]
1071
+ new.soilmoisture[k] = old.soilmoisture[k] + increase - decrease
1072
+ if new.soilmoisture[k] < 0.0:
1073
+ factor: float = (old.soilmoisture[k] + increase) / decrease
1074
+ flu.percolation[k] *= factor
1075
+ if flu.soilevapotranspiration[k] >= 0.0:
1076
+ flu.soilevapotranspiration[k] *= factor
1077
+ new.soilmoisture[k] = 0.0
1078
+ elif new.soilmoisture[k] > der.maxsoilwater[k]:
1079
+ delta: float = new.soilmoisture[k] - der.maxsoilwater[k]
1080
+ if flu.capillaryrise[k] >= delta:
1081
+ flu.capillaryrise[k] -= delta
1082
+ new.soilmoisture[k] = der.maxsoilwater[k]
1083
+ else:
1084
+ new.soilmoisture[k] -= flu.capillaryrise[k]
1085
+ flu.capillaryrise[k] = 0.0
1086
+ flu.percolation[k] += new.soilmoisture[k] - der.maxsoilwater[k]
1087
+ new.soilmoisture[k] = der.maxsoilwater[k]
1088
+
1089
+
1090
+ class Calc_RequiredIrrigation_V1(modeltools.Method):
1091
+ r"""Calculate the individual zones' irrigation demand.
1092
+
1093
+ Basic equation:
1094
+ .. math::
1095
+ I = \begin{cases}
1096
+ (T_1 - R) \cdot M &|\ R < T_0 \\
1097
+ 0 &|\ R \geq T_0
1098
+ \end{cases}
1099
+ \\ \\
1100
+ I = RequiredIrrigation \\
1101
+ T_0 = IrrigationTrigger \\
1102
+ T_1 = IrrigationTarget \\
1103
+ R = RelativeSoilMoisture \\
1104
+ M = MaxSoilWater
1105
+
1106
+ Examples:
1107
+
1108
+ >>> from hydpy.models.whmod import *
1109
+ >>> parameterstep()
1110
+ >>> nmbzones(8)
1111
+ >>> landtype(GRASS, GRASS, CORN, CORN, CORN, CORN, CORN, SEALED)
1112
+ >>> soiltype(SAND, SAND, SAND, SAND, SAND, SAND, SAND, NONE)
1113
+ >>> trigger = irrigationtrigger
1114
+ >>> target = irrigationtarget
1115
+ >>> trigger.grass, target.grass = 0.0, 0.0
1116
+ >>> trigger.corn_jun, target.corn_jun = 0.7, 0.7
1117
+ >>> trigger.corn_jul, target.corn_jul = 0.6, 0.8
1118
+ >>> derived.maxsoilwater(100.0)
1119
+ >>> factors.relativesoilmoisture = 0.0, 0.1, 0.5, 0.6, 0.7, 0.8, 0.9, nan
1120
+
1121
+ >>> from hydpy import pub
1122
+ >>> pub.timegrids = "2001-06-29", "2001-07-03", "1d"
1123
+ >>> derived.moy.update()
1124
+
1125
+ >>> model.idx_sim = 1
1126
+ >>> model.calc_requiredirrigation_v1()
1127
+ >>> fluxes.requiredirrigation
1128
+ requiredirrigation(0.0, 0.0, 20.0, 10.0, 0.0, 0.0, 0.0, 0.0)
1129
+
1130
+ >>> model.idx_sim = 2
1131
+ >>> model.calc_requiredirrigation_v1()
1132
+ >>> fluxes.requiredirrigation
1133
+ requiredirrigation(0.0, 0.0, 30.0, 0.0, 0.0, 0.0, 0.0, 0.0)
1134
+ """
1135
+
1136
+ CONTROLPARAMETERS = (
1137
+ whmod_control.NmbZones,
1138
+ whmod_control.LandType,
1139
+ whmod_control.SoilType,
1140
+ whmod_control.IrrigationTrigger,
1141
+ whmod_control.IrrigationTarget,
1142
+ )
1143
+ DERIVEDPARAMETERS = (whmod_derived.MOY, whmod_derived.MaxSoilWater)
1144
+ REQUIREDSEQUENCES = (whmod_factors.RelativeSoilMoisture,)
1145
+ RESULTSEQUENCES = (whmod_fluxes.RequiredIrrigation,)
1146
+
1147
+ @staticmethod
1148
+ def __call__(model: modeltools.Model) -> None:
1149
+ con = model.parameters.control.fastaccess
1150
+ der = model.parameters.derived.fastaccess
1151
+ fac = model.sequences.factors.fastaccess
1152
+ flu = model.sequences.fluxes.fastaccess
1153
+
1154
+ m = der.moy[model.idx_sim]
1155
+ for k in range(con.nmbzones):
1156
+ l = con.landtype[k] - 1
1157
+ sm: float = fac.relativesoilmoisture[k]
1158
+ if (con.soiltype[k] == NONE) or (sm >= con.irrigationtrigger[l, m]):
1159
+ flu.requiredirrigation[k] = 0.0
1160
+ else:
1161
+ flu.requiredirrigation[k] = der.maxsoilwater[k] * (
1162
+ con.irrigationtarget[l, m] - sm
1163
+ )
1164
+
1165
+
1166
+ class Calc_CisternDemand_V1(modeltools.Method):
1167
+ r"""Calculate the total irrigation water demand from the cistern.
1168
+
1169
+ Basic equation:
1170
+ .. math::
1171
+ D = \sum_{k=1}^N \frac{A_k}{1000} \cdot R_k
1172
+ \\ \\
1173
+ D = CisternDemand \\
1174
+ N = NmbZones \\
1175
+ A = ZoneArea \\
1176
+ R = RequiredIrrigation
1177
+
1178
+ Example:
1179
+
1180
+ >>> from hydpy.models.whmod import *
1181
+ >>> parameterstep()
1182
+ >>> nmbzones(5)
1183
+ >>> landtype(GRASS, GRASS, GRASS, GRASS, SEALED)
1184
+ >>> soiltype(SAND, SAND, SAND, SAND, NONE)
1185
+ >>> area(15.0)
1186
+ >>> zonearea(1.0, 2.0, 3.0, 4.0, 5.0)
1187
+ >>> fluxes.requiredirrigation = 0.0, 6.0, 0.0, 7.0, nan
1188
+ >>> model.calc_cisterndemand_v1()
1189
+ >>> fluxes.cisterndemand
1190
+ cisterndemand(0.04)
1191
+ """
1192
+
1193
+ CONTROLPARAMETERS = (
1194
+ whmod_control.NmbZones,
1195
+ whmod_control.ZoneArea,
1196
+ whmod_control.SoilType,
1197
+ )
1198
+ REQUIREDSEQUENCES = (whmod_fluxes.RequiredIrrigation,)
1199
+ RESULTSEQUENCES = (whmod_fluxes.CisternDemand,)
1200
+
1201
+ @staticmethod
1202
+ def __call__(model: modeltools.Model) -> None:
1203
+ con = model.parameters.control.fastaccess
1204
+ flu = model.sequences.fluxes.fastaccess
1205
+
1206
+ flu.cisterndemand = 0.0
1207
+ for k in range(con.nmbzones):
1208
+ if con.soiltype[k] != NONE:
1209
+ flu.cisterndemand += con.zonearea[k] * flu.requiredirrigation[k]
1210
+ flu.cisterndemand /= 1000.0
1211
+
1212
+
1213
+ class Calc_CisternExtraction_CisternWater_V1(modeltools.Method):
1214
+ r"""Calculate the actual irrigation extraction from the cistern and update the
1215
+ amount of still available water.
1216
+
1217
+ Basic equations:
1218
+ .. math::
1219
+ E(t) = \begin{cases}
1220
+ D(t) &|\ W(t) > 0 \\
1221
+ 0 &|\ W(t) = 0
1222
+ \end{cases}
1223
+ \\
1224
+ \frac{d W(t)}{d t} = E(t)
1225
+ \\ \\
1226
+ E = CisternExtraction \\
1227
+ D = CisternDemand \\
1228
+ W = CisternWater
1229
+
1230
+ Examples:
1231
+
1232
+ >>> from hydpy.models.whmod import *
1233
+ >>> parameterstep()
1234
+ >>> states.cisternwater = 5.0
1235
+ >>> fluxes.cisterndemand = 3.0
1236
+
1237
+ >>> model.calc_cisternextraction_cisternwater_v1()
1238
+ >>> states.cisternwater
1239
+ cisternwater(2.0)
1240
+ >>> fluxes.cisternextraction
1241
+ cisternextraction(3.0)
1242
+
1243
+ >>> model.calc_cisternextraction_cisternwater_v1()
1244
+ >>> states.cisternwater
1245
+ cisternwater(0.0)
1246
+ >>> fluxes.cisternextraction
1247
+ cisternextraction(2.0)
1248
+
1249
+ >>> model.calc_cisternextraction_cisternwater_v1()
1250
+ >>> states.cisternwater
1251
+ cisternwater(0.0)
1252
+ >>> fluxes.cisternextraction
1253
+ cisternextraction(0.0)
1254
+ """
1255
+
1256
+ REQUIREDSEQUENCES = (whmod_fluxes.CisternDemand,)
1257
+ RESULTSEQUENCES = (whmod_fluxes.CisternExtraction,)
1258
+ UPDATEDSEQUENCES = (whmod_states.CisternWater,)
1259
+
1260
+ @staticmethod
1261
+ def __call__(model: modeltools.Model) -> None:
1262
+ flu = model.sequences.fluxes.fastaccess
1263
+ sta = model.sequences.states.fastaccess
1264
+
1265
+ if sta.cisternwater > flu.cisterndemand:
1266
+ flu.cisternextraction = flu.cisterndemand
1267
+ sta.cisternwater -= flu.cisternextraction
1268
+ else:
1269
+ flu.cisternextraction = sta.cisternwater
1270
+ sta.cisternwater = 0.0
1271
+
1272
+
1273
+ class Calc_InternalIrrigation_SoilMoisture_V1(modeltools.Method):
1274
+ r"""Internal irrigation with water taken from the cistern.
1275
+
1276
+ Basic equations:
1277
+ .. math::
1278
+ I = R \cdot E / D
1279
+ \\ \\
1280
+ I = InternalIrrigation \\
1281
+ R = RequiredIrrigation \\
1282
+ E = CisternExtraction \\
1283
+ D = CisternDemand
1284
+
1285
+ Examples:
1286
+
1287
+ >>> from hydpy.models.whmod import *
1288
+ >>> parameterstep()
1289
+ >>> nmbzones(5)
1290
+ >>> landtype(GRASS, GRASS, GRASS, GRASS, SEALED)
1291
+ >>> soiltype(SAND, SAND, SAND, SAND, NONE)
1292
+ >>> area(15.0)
1293
+ >>> zonearea(1.0, 2.0, 3.0, 4.0, 5.0)
1294
+ >>> states.soilmoisture = 100.0
1295
+
1296
+ >>> fluxes.requiredirrigation = 0.0, 6.0, 0.0, 7.0, nan
1297
+ >>> fluxes.cisterndemand = 0.04
1298
+ >>> fluxes.cisternextraction = 0.03
1299
+ >>> model.calc_internalirrigation_soilmoisture_v1()
1300
+ >>> fluxes.internalirrigation
1301
+ internalirrigation(0.0, 4.5, 0.0, 5.25, 0.0)
1302
+ >>> states.soilmoisture
1303
+ soilmoisture(100.0, 104.5, 100.0, 105.25, 0.0)
1304
+
1305
+ >>> fluxes.requiredirrigation = 0.0, 0.0, 0.0, 0.0, nan
1306
+ >>> fluxes.cisterndemand = 0.0
1307
+ >>> fluxes.cisternextraction = 0.0
1308
+ >>> model.calc_internalirrigation_soilmoisture_v1()
1309
+ >>> fluxes.internalirrigation
1310
+ internalirrigation(0.0, 0.0, 0.0, 0.0, 0.0)
1311
+ >>> states.soilmoisture
1312
+ soilmoisture(100.0, 104.5, 100.0, 105.25, 0.0)
1313
+ """
1314
+
1315
+ CONTROLPARAMETERS = (whmod_control.NmbZones, whmod_control.SoilType)
1316
+ REQUIREDSEQUENCES = (
1317
+ whmod_fluxes.RequiredIrrigation,
1318
+ whmod_fluxes.CisternDemand,
1319
+ whmod_fluxes.CisternExtraction,
1320
+ )
1321
+ RESULTSEQUENCES = (whmod_fluxes.InternalIrrigation,)
1322
+ UPDATEDSEQUENCES = (whmod_states.SoilMoisture,)
1323
+
1324
+ @staticmethod
1325
+ def __call__(model: modeltools.Model) -> None:
1326
+ con = model.parameters.control.fastaccess
1327
+ flu = model.sequences.fluxes.fastaccess
1328
+ sta = model.sequences.states.fastaccess
1329
+
1330
+ if flu.cisterndemand > 0.0:
1331
+ factor: float = flu.cisternextraction / flu.cisterndemand
1332
+ else:
1333
+ factor = 0.0
1334
+ for k in range(con.nmbzones):
1335
+ if con.soiltype[k] == NONE:
1336
+ sta.soilmoisture[k] = 0.0
1337
+ flu.internalirrigation[k] = 0.0
1338
+ else:
1339
+ flu.internalirrigation[k] = factor * flu.requiredirrigation[k]
1340
+ sta.soilmoisture[k] += flu.internalirrigation[k]
1341
+
1342
+
1343
+ class Calc_ExternalIrrigation_SoilMoisture_V1(modeltools.Method):
1344
+ r"""Irrigate from external sources, if required and requested.
1345
+
1346
+ Basic equations:
1347
+ .. math::
1348
+ E = \begin{cases}
1349
+ R &|\ W \\
1350
+ 0 &|\ \overline{W}
1351
+ \end{cases}
1352
+ \\
1353
+ S_{new} = S_{old} + E
1354
+ \\ \\
1355
+ E = ExternalIrrigation \\
1356
+ R = RequiredIrrigation \\
1357
+ W = WithExternalIrrigation \\
1358
+ S = SoilMoisture
1359
+
1360
+ Examples:
1361
+
1362
+ >>> from hydpy.models.whmod import *
1363
+ >>> parameterstep()
1364
+ >>> nmbzones(2)
1365
+ >>> landtype(CORN, SEALED)
1366
+ >>> soiltype(SAND, NONE)
1367
+ >>> fluxes.requiredirrigation(2.0, nan)
1368
+ >>> states.soilmoisture = 50.0, nan
1369
+
1370
+ >>> withexternalirrigation(False)
1371
+ >>> model.calc_externalirrigation_soilmoisture_v1()
1372
+ >>> fluxes.externalirrigation
1373
+ externalirrigation(0.0, 0.0)
1374
+ >>> states.soilmoisture
1375
+ soilmoisture(50.0, 0.0)
1376
+
1377
+ >>> withexternalirrigation(True)
1378
+ >>> model.calc_externalirrigation_soilmoisture_v1()
1379
+ >>> fluxes.externalirrigation
1380
+ externalirrigation(2.0, 0.0)
1381
+ >>> states.soilmoisture
1382
+ soilmoisture(52.0, 0.0)
1383
+ """
1384
+
1385
+ CONTROLPARAMETERS = (
1386
+ whmod_control.NmbZones,
1387
+ whmod_control.SoilType,
1388
+ whmod_control.WithExternalIrrigation,
1389
+ )
1390
+ REQUIREDSEQUENCES = (whmod_fluxes.RequiredIrrigation,)
1391
+ RESULTSEQUENCES = (whmod_fluxes.ExternalIrrigation,)
1392
+ UPDATEDSEQUENCES = (whmod_states.SoilMoisture,)
1393
+
1394
+ @staticmethod
1395
+ def __call__(model: modeltools.Model) -> None:
1396
+ con = model.parameters.control.fastaccess
1397
+ flu = model.sequences.fluxes.fastaccess
1398
+ sta = model.sequences.states.fastaccess
1399
+
1400
+ for k in range(con.nmbzones):
1401
+ if con.soiltype[k] == NONE:
1402
+ sta.soilmoisture[k] = 0.0
1403
+ flu.externalirrigation[k] = 0.0
1404
+ elif con.withexternalirrigation:
1405
+ flu.externalirrigation[k] = flu.requiredirrigation[k]
1406
+ sta.soilmoisture[k] += flu.externalirrigation[k]
1407
+ else:
1408
+ flu.externalirrigation[k] = 0.0
1409
+
1410
+
1411
+ class Calc_ExternalIrrigation_SoilMoisture_V2(modeltools.Method):
1412
+ r"""Irrigate from external sources, if still required after internal irrigation and
1413
+ requested.
1414
+
1415
+ Basic equations:
1416
+ .. math::
1417
+ E = \begin{cases}
1418
+ R - I &|\ W \\
1419
+ 0 &|\ \overline{W}
1420
+ \end{cases}
1421
+ \\
1422
+ S_{new} = S_{old} + E
1423
+ \\ \\
1424
+ E = ExternalIrrigation \\
1425
+ R = RequiredIrrigation \\
1426
+ I = InternalIrrigation \\
1427
+ W = WithExternalIrrigation \\
1428
+ S = SoilMoisture
1429
+
1430
+ Examples:
1431
+
1432
+ >>> from hydpy.models.whmod import *
1433
+ >>> parameterstep()
1434
+ >>> nmbzones(2)
1435
+ >>> landtype(CORN, SEALED)
1436
+ >>> soiltype(SAND, NONE)
1437
+ >>> fluxes.requiredirrigation(5.0, nan)
1438
+ >>> fluxes.internalirrigation(3.0, nan)
1439
+ >>> states.soilmoisture = 50.0, nan
1440
+
1441
+ >>> withexternalirrigation(False)
1442
+ >>> model.calc_externalirrigation_soilmoisture_v2()
1443
+ >>> fluxes.externalirrigation
1444
+ externalirrigation(0.0, 0.0)
1445
+ >>> states.soilmoisture
1446
+ soilmoisture(50.0, 0.0)
1447
+
1448
+ >>> withexternalirrigation(True)
1449
+ >>> model.calc_externalirrigation_soilmoisture_v2()
1450
+ >>> fluxes.externalirrigation
1451
+ externalirrigation(2.0, 0.0)
1452
+ >>> states.soilmoisture
1453
+ soilmoisture(52.0, 0.0)
1454
+ """
1455
+
1456
+ CONTROLPARAMETERS = (
1457
+ whmod_control.NmbZones,
1458
+ whmod_control.SoilType,
1459
+ whmod_control.WithExternalIrrigation,
1460
+ )
1461
+ REQUIREDSEQUENCES = (
1462
+ whmod_fluxes.RequiredIrrigation,
1463
+ whmod_fluxes.InternalIrrigation,
1464
+ )
1465
+ RESULTSEQUENCES = (whmod_fluxes.ExternalIrrigation,)
1466
+ UPDATEDSEQUENCES = (whmod_states.SoilMoisture,)
1467
+
1468
+ @staticmethod
1469
+ def __call__(model: modeltools.Model) -> None:
1470
+ con = model.parameters.control.fastaccess
1471
+ flu = model.sequences.fluxes.fastaccess
1472
+ sta = model.sequences.states.fastaccess
1473
+
1474
+ for k in range(con.nmbzones):
1475
+ if con.soiltype[k] == NONE:
1476
+ sta.soilmoisture[k] = 0.0
1477
+ flu.externalirrigation[k] = 0.0
1478
+ elif con.withexternalirrigation:
1479
+ flu.externalirrigation[k] = (
1480
+ flu.requiredirrigation[k] - flu.internalirrigation[k]
1481
+ )
1482
+ sta.soilmoisture[k] += flu.externalirrigation[k]
1483
+ else:
1484
+ flu.externalirrigation[k] = 0.0
1485
+
1486
+
1487
+ class Calc_PotentialRecharge_V1(modeltools.Method):
1488
+ r"""Calculate the potential recharge.
1489
+
1490
+ Basic equation for water areas:
1491
+ .. math::
1492
+ PotentialRecharge = P - E
1493
+ \\ \\
1494
+ P = Precipitation \\
1495
+ E = LakeEvaporation
1496
+
1497
+ Basic equation for non-sealed land areas:
1498
+ .. math::
1499
+ PotentialRecharge = P - C
1500
+ \\ \\
1501
+ P = Percolation \\
1502
+ C = CapillaryRise
1503
+
1504
+ Example:
1505
+
1506
+ >>> from hydpy.models.whmod import *
1507
+ >>> parameterstep()
1508
+ >>> nmbzones(3)
1509
+ >>> landtype(GRASS, SEALED, WATER)
1510
+ >>> inputs.precipitation = 7.0
1511
+ >>> fluxes.lakeevaporation = 4.0
1512
+ >>> fluxes.percolation = 3.0
1513
+ >>> fluxes.capillaryrise = 1.0
1514
+ >>> model.calc_potentialrecharge_v1()
1515
+ >>> fluxes.potentialrecharge
1516
+ potentialrecharge(2.0, 0.0, 3.0)
1517
+ """
1518
+
1519
+ CONTROLPARAMETERS = (whmod_control.NmbZones, whmod_control.LandType)
1520
+ REQUIREDSEQUENCES = (
1521
+ whmod_inputs.Precipitation,
1522
+ whmod_fluxes.LakeEvaporation,
1523
+ whmod_fluxes.Percolation,
1524
+ whmod_fluxes.CapillaryRise,
1525
+ )
1526
+ RESULTSEQUENCES = (whmod_fluxes.PotentialRecharge,)
1527
+
1528
+ @staticmethod
1529
+ def __call__(model: modeltools.Model) -> None:
1530
+ con = model.parameters.control.fastaccess
1531
+ inp = model.sequences.inputs.fastaccess
1532
+ flu = model.sequences.fluxes.fastaccess
1533
+ for k in range(con.nmbzones):
1534
+ if con.landtype[k] == SEALED:
1535
+ flu.potentialrecharge[k] = 0.0
1536
+ elif con.landtype[k] == WATER:
1537
+ flu.potentialrecharge[k] = inp.precipitation - flu.lakeevaporation[k]
1538
+ else:
1539
+ flu.potentialrecharge[k] = flu.percolation[k] - flu.capillaryrise[k]
1540
+
1541
+
1542
+ class Calc_PotentialRecharge_V2(modeltools.Method):
1543
+ """Calculate the potential recharge.
1544
+
1545
+ Method |Calc_PotentialRecharge_V2| works like method |Calc_PotentialRecharge_V1|
1546
+ except that it does not calculate any potential recharge for zones connected to the
1547
+ cistern.
1548
+
1549
+ Example:
1550
+
1551
+ >>> from hydpy.models.whmod import *
1552
+ >>> parameterstep()
1553
+ >>> nmbzones(5)
1554
+ >>> landtype(GRASS, GRASS, SEALED, SEALED, WATER)
1555
+ >>> cisternsource(False, True, False, True, False)
1556
+ >>> inputs.precipitation = 7.0
1557
+ >>> fluxes.lakeevaporation = 4.0
1558
+ >>> fluxes.percolation = 3.0
1559
+ >>> fluxes.capillaryrise = 1.0
1560
+ >>> model.calc_potentialrecharge_v2()
1561
+ >>> fluxes.potentialrecharge
1562
+ potentialrecharge(2.0, 0.0, 0.0, 0.0, 3.0)
1563
+ """
1564
+
1565
+ CONTROLPARAMETERS = (
1566
+ whmod_control.NmbZones,
1567
+ whmod_control.LandType,
1568
+ whmod_control.CisternSource,
1569
+ )
1570
+ REQUIREDSEQUENCES = (
1571
+ whmod_inputs.Precipitation,
1572
+ whmod_fluxes.LakeEvaporation,
1573
+ whmod_fluxes.Percolation,
1574
+ whmod_fluxes.CapillaryRise,
1575
+ )
1576
+ RESULTSEQUENCES = (whmod_fluxes.PotentialRecharge,)
1577
+
1578
+ @staticmethod
1579
+ def __call__(model: modeltools.Model) -> None:
1580
+ con = model.parameters.control.fastaccess
1581
+ inp = model.sequences.inputs.fastaccess
1582
+ flu = model.sequences.fluxes.fastaccess
1583
+ for k in range(con.nmbzones):
1584
+ if con.landtype[k] == WATER:
1585
+ flu.potentialrecharge[k] = inp.precipitation - flu.lakeevaporation[k]
1586
+ elif (con.landtype[k] == SEALED) or con.cisternsource[k]:
1587
+ flu.potentialrecharge[k] = 0.0
1588
+ else:
1589
+ flu.potentialrecharge[k] = flu.percolation[k] - flu.capillaryrise[k]
1590
+
1591
+
1592
+ class Calc_Baseflow_V1(modeltools.Method):
1593
+ r"""Calculate the base flow.
1594
+
1595
+ Basic equation:
1596
+ .. math::
1597
+ B = (1 - I) \cdot max(P, \, 0)
1598
+ \\ \\
1599
+ B = Baseflow \\
1600
+ I = BaseflowIndex \\
1601
+ P = PotentialRecharge
1602
+
1603
+ Example:
1604
+
1605
+ >>> from hydpy.models.whmod import *
1606
+ >>> parameterstep()
1607
+ >>> nmbzones(5)
1608
+ >>> landtype(GRASS, GRASS, GRASS, GRASS, SEALED)
1609
+ >>> baseflowindex(1.0, 0.5, 0.0, 0.0, nan)
1610
+ >>> fluxes.potentialrecharge = 2.0, 2.0, 2.0, -2.0, nan
1611
+ >>> model.calc_baseflow_v1()
1612
+ >>> fluxes.baseflow
1613
+ baseflow(0.0, 1.0, 2.0, 0.0, 0.0)
1614
+ """
1615
+
1616
+ CONTROLPARAMETERS = (
1617
+ whmod_control.NmbZones,
1618
+ whmod_control.LandType,
1619
+ whmod_control.BaseflowIndex,
1620
+ )
1621
+ REQUIREDSEQUENCES = (whmod_fluxes.PotentialRecharge,)
1622
+ RESULTSEQUENCES = (whmod_fluxes.Baseflow,)
1623
+
1624
+ @staticmethod
1625
+ def __call__(model: modeltools.Model) -> None:
1626
+ con = model.parameters.control.fastaccess
1627
+ flu = model.sequences.fluxes.fastaccess
1628
+ for k in range(con.nmbzones):
1629
+ if con.landtype[k] == SEALED:
1630
+ flu.baseflow[k] = 0.0
1631
+ else:
1632
+ flu.baseflow[k] = (1.0 - con.baseflowindex[k]) * max(
1633
+ flu.potentialrecharge[k], 0.0
1634
+ )
1635
+
1636
+
1637
+ class Calc_ActualRecharge_V1(modeltools.Method):
1638
+ r"""Calculate the actual recharge.
1639
+
1640
+ Basic equation:
1641
+ .. math::
1642
+ A = \sum_{i=1}^N P_i - B_i
1643
+ \\ \\
1644
+ N = NmbZones \\
1645
+ A = ActualRecharge \\
1646
+ P = PotentialRecharge \\
1647
+ B = Baseflow
1648
+
1649
+ Example:
1650
+
1651
+ >>> from hydpy.models.whmod import *
1652
+ >>> parameterstep()
1653
+ >>> nmbzones(5)
1654
+ >>> landtype(GRASS, GRASS, GRASS, GRASS, SEALED)
1655
+ >>> area(14.0)
1656
+ >>> zonearea(1.0, 1.5, 2.5, 2.0, 7.0)
1657
+ >>> derived.zoneratio.update()
1658
+ >>> fluxes.potentialrecharge = 2.0, 10.0, -2.0, -0.5, nan
1659
+ >>> fluxes.baseflow = 0.0, 5.0, 0.0, 0.0, nan
1660
+ >>> model.calc_actualrecharge_v1()
1661
+ >>> fluxes.actualrecharge
1662
+ actualrecharge(0.25)
1663
+ """
1664
+
1665
+ CONTROLPARAMETERS = (whmod_control.NmbZones, whmod_control.LandType)
1666
+ DERIVEDPARAMETERS = (whmod_derived.ZoneRatio,)
1667
+ REQUIREDSEQUENCES = (whmod_fluxes.PotentialRecharge, whmod_fluxes.Baseflow)
1668
+ RESULTSEQUENCES = (whmod_fluxes.ActualRecharge,)
1669
+
1670
+ @staticmethod
1671
+ def __call__(model: modeltools.Model) -> None:
1672
+ con = model.parameters.control.fastaccess
1673
+ der = model.parameters.derived.fastaccess
1674
+ flu = model.sequences.fluxes.fastaccess
1675
+ flu.actualrecharge = 0.0
1676
+ for k in range(con.nmbzones):
1677
+ if con.landtype[k] != SEALED:
1678
+ flu.actualrecharge += der.zoneratio[k] * (
1679
+ flu.potentialrecharge[k] - flu.baseflow[k]
1680
+ )
1681
+
1682
+
1683
+ class Calc_DelayedRecharge_DeepWater_V1(modeltools.Method):
1684
+ r"""Calculate the delayed recharge and update the amount of water that is (still)
1685
+ percolating through the vadose zone.
1686
+
1687
+ Basic equations:
1688
+ .. math::
1689
+ W_{new} = (A + W_{old}) \cdot exp(-1 / R)
1690
+ \\
1691
+ D = A + W_{old} - W_{new}
1692
+ \\ \\
1693
+ D = DelayedRecharge \\
1694
+ A = ActualRecharge \\
1695
+ W = DeepWater \\
1696
+ R = RechargeDelay
1697
+
1698
+ (The given equations are the analytical solution of the linear storage equation
1699
+ under the assumption of a stepwise constant inflow.)
1700
+
1701
+ Examples:
1702
+
1703
+ >>> from hydpy.models.whmod import *
1704
+ >>> simulationstep("1d")
1705
+ >>> parameterstep("1d")
1706
+ >>> fluxes.actualrecharge = 1.0
1707
+
1708
+ >>> rechargedelay(1.0)
1709
+ >>> states.deepwater(2.0)
1710
+ >>> model.calc_delayedrecharge_deepwater_v1()
1711
+ >>> fluxes.delayedrecharge
1712
+ delayedrecharge(1.896362)
1713
+ >>> states.deepwater
1714
+ deepwater(1.103638)
1715
+
1716
+ >>> rechargedelay(0.0)
1717
+ >>> states.deepwater(2.0)
1718
+ >>> model.calc_delayedrecharge_deepwater_v1()
1719
+ >>> fluxes.delayedrecharge
1720
+ delayedrecharge(3.0)
1721
+ >>> states.deepwater
1722
+ deepwater(0.0)
1723
+ """
1724
+
1725
+ CONTROLPARAMETERS = (whmod_control.RechargeDelay,)
1726
+ REQUIREDSEQUENCES = (whmod_fluxes.ActualRecharge,)
1727
+ UPDATEDSEQUENCES = (whmod_states.DeepWater,)
1728
+ RESULTSEQUENCES = (whmod_fluxes.DelayedRecharge,)
1729
+
1730
+ @staticmethod
1731
+ def __call__(model: modeltools.Model) -> None:
1732
+ con = model.parameters.control.fastaccess
1733
+ flu = model.sequences.fluxes.fastaccess
1734
+ new = model.sequences.states.fastaccess_new
1735
+ old = model.sequences.states.fastaccess_old
1736
+ if con.rechargedelay > 0.0:
1737
+ new.deepwater = (flu.actualrecharge + old.deepwater) * modelutils.exp(
1738
+ -1.0 / con.rechargedelay
1739
+ )
1740
+ flu.delayedrecharge = flu.actualrecharge + old.deepwater - new.deepwater
1741
+ else:
1742
+ flu.delayedrecharge = old.deepwater + flu.actualrecharge
1743
+ new.deepwater = 0.0
1744
+
1745
+
1746
+ class Get_Temperature_V1(modeltools.Method):
1747
+ """Get the basin's current air temperature.
1748
+
1749
+ Examples:
1750
+
1751
+ >>> from hydpy.models.whmod import *
1752
+ >>> parameterstep()
1753
+ >>> inputs.temperature = 2.0
1754
+ >>> from hydpy import round_
1755
+ >>> round_(model.get_temperature_v1(0))
1756
+ 2.0
1757
+ >>> round_(model.get_temperature_v1(1))
1758
+ 2.0
1759
+ """
1760
+
1761
+ REQUIREDSEQUENCES = (whmod_inputs.Temperature,)
1762
+
1763
+ @staticmethod
1764
+ def __call__(model: modeltools.Model, s: int) -> float:
1765
+ inp = model.sequences.inputs.fastaccess
1766
+
1767
+ return inp.temperature
1768
+
1769
+
1770
+ class Get_MeanTemperature_V1(modeltools.Method):
1771
+ """Get the basin's current air temperature.
1772
+
1773
+ Example:
1774
+
1775
+ >>> from hydpy.models.whmod import *
1776
+ >>> parameterstep()
1777
+ >>> inputs.temperature = 2.0
1778
+ >>> from hydpy import round_
1779
+ >>> round_(model.get_meantemperature_v1())
1780
+ 2.0
1781
+ """
1782
+
1783
+ REQUIREDSEQUENCES = (whmod_inputs.Temperature,)
1784
+
1785
+ @staticmethod
1786
+ def __call__(model: modeltools.Model) -> float:
1787
+ inp = model.sequences.inputs.fastaccess
1788
+
1789
+ return inp.temperature
1790
+
1791
+
1792
+ class Get_Precipitation_V1(modeltools.Method):
1793
+ """Get the basin's current precipitation.
1794
+
1795
+ Examples:
1796
+
1797
+ >>> from hydpy.models.whmod import *
1798
+ >>> parameterstep()
1799
+ >>> inputs.precipitation = 2.0
1800
+ >>> from hydpy import round_
1801
+ >>> round_(model.get_precipitation_v1(0))
1802
+ 2.0
1803
+ >>> round_(model.get_precipitation_v1(1))
1804
+ 2.0
1805
+ """
1806
+
1807
+ REQUIREDSEQUENCES = (whmod_inputs.Precipitation,)
1808
+
1809
+ @staticmethod
1810
+ def __call__(model: modeltools.Model, s: int) -> float:
1811
+ inp = model.sequences.inputs.fastaccess
1812
+
1813
+ return inp.precipitation
1814
+
1815
+
1816
+ class Get_InterceptedWater_V1(modeltools.Method):
1817
+ """Get the selected zone's current amount of intercepted water.
1818
+
1819
+ Examples:
1820
+
1821
+ >>> from hydpy.models.whmod import *
1822
+ >>> parameterstep()
1823
+ >>> nmbzones(2)
1824
+ >>> states.interceptedwater = 2.0, 4.0
1825
+ >>> from hydpy import round_
1826
+ >>> round_(model.get_interceptedwater_v1(0))
1827
+ 2.0
1828
+ >>> round_(model.get_interceptedwater_v1(1))
1829
+ 4.0
1830
+ """
1831
+
1832
+ REQUIREDSEQUENCES = (whmod_states.InterceptedWater,)
1833
+
1834
+ @staticmethod
1835
+ def __call__(model: modeltools.Model, k: int) -> float:
1836
+ sta = model.sequences.states.fastaccess
1837
+
1838
+ return sta.interceptedwater[k]
1839
+
1840
+
1841
+ class Get_SoilWater_V1(modeltools.Method):
1842
+ """Get the selected zone's current soil water content.
1843
+
1844
+ Examples:
1845
+
1846
+ >>> from hydpy.models.whmod import *
1847
+ >>> parameterstep()
1848
+ >>> nmbzones(2)
1849
+ >>> states.soilmoisture = 2.0, 4.0
1850
+ >>> from hydpy import round_
1851
+ >>> round_(model.get_soilwater_v1(0))
1852
+ 2.0
1853
+ >>> round_(model.get_soilwater_v1(1))
1854
+ 4.0
1855
+ """
1856
+
1857
+ REQUIREDSEQUENCES = (whmod_states.SoilMoisture,)
1858
+
1859
+ @staticmethod
1860
+ def __call__(model: modeltools.Model, k: int) -> float:
1861
+ sta = model.sequences.states.fastaccess
1862
+
1863
+ return sta.soilmoisture[k]
1864
+
1865
+
1866
+ class Get_SnowCover_V1(modeltools.Method):
1867
+ """Get the selected zones's current snow cover degree.
1868
+
1869
+ Examples:
1870
+
1871
+ Each response unit with a non-zero amount of snow counts as wholly covered:
1872
+
1873
+ >>> from hydpy.models.whmod import *
1874
+ >>> parameterstep()
1875
+ >>> nmbzones(2)
1876
+ >>> states.snowpack = 0.0, 2.0
1877
+ >>> model.get_snowcover_v1(0)
1878
+ 0.0
1879
+ >>> model.get_snowcover_v1(1)
1880
+ 1.0
1881
+ """
1882
+
1883
+ REQUIREDSEQUENCES = (whmod_states.Snowpack,)
1884
+
1885
+ @staticmethod
1886
+ def __call__(model: modeltools.Model, k: int) -> float:
1887
+ sta = model.sequences.states.fastaccess
1888
+
1889
+ if sta.snowpack[k] > 0.0:
1890
+ return 1.0
1891
+ return 0.0
1892
+
1893
+
1894
+ class Model(modeltools.AdHocModel):
1895
+ """|whmod.DOCNAME.complete|."""
1896
+
1897
+ DOCNAME = modeltools.DocName(short="WHMod")
1898
+ __HYDPY_ROOTMODEL__ = None
1899
+
1900
+ aetmodel = modeltools.SubmodelProperty(aetinterfaces.AETModel_V1)
1901
+ aetmodel_is_mainmodel = modeltools.SubmodelIsMainmodelProperty()
1902
+ aetmodel_typeid = modeltools.SubmodelTypeIDProperty()
1903
+
1904
+ INLET_METHODS = ()
1905
+ RECEIVER_METHODS = ()
1906
+ ADD_METHODS = (
1907
+ Calc_InterceptionEvaporation_InterceptedWater_AETModel_V1,
1908
+ Calc_LakeEvaporation_AETModel_V1,
1909
+ Calc_SoilEvapotranspiration_AETModel_V1,
1910
+ )
1911
+ INTERFACE_METHODS = (
1912
+ Get_Temperature_V1,
1913
+ Get_MeanTemperature_V1,
1914
+ Get_Precipitation_V1,
1915
+ Get_InterceptedWater_V1,
1916
+ Get_SoilWater_V1,
1917
+ Get_SnowCover_V1,
1918
+ )
1919
+ RUN_METHODS = (
1920
+ Calc_Throughfall_InterceptedWater_V1,
1921
+ Calc_InterceptionEvaporation_InterceptedWater_V1,
1922
+ Calc_LakeEvaporation_V1,
1923
+ Calc_PotentialSnowmelt_V1,
1924
+ Calc_Snowmelt_Snowpack_V1,
1925
+ Calc_Ponding_V1,
1926
+ Calc_SurfaceRunoff_V1,
1927
+ Calc_RelativeSoilMoisture_V1,
1928
+ Calc_Percolation_V1,
1929
+ Calc_CisternInflow_V1,
1930
+ Calc_CisternOverflow_CisternWater_V1,
1931
+ Calc_SoilEvapotranspiration_V1,
1932
+ Calc_TotalEvapotranspiration_V1,
1933
+ Calc_CapillaryRise_V1,
1934
+ Calc_CapillaryRise_V2,
1935
+ Calc_SoilMoisture_V1,
1936
+ Calc_RelativeSoilMoisture_V1,
1937
+ Calc_RequiredIrrigation_V1,
1938
+ Calc_CisternDemand_V1,
1939
+ Calc_CisternExtraction_CisternWater_V1,
1940
+ Calc_InternalIrrigation_SoilMoisture_V1,
1941
+ Calc_ExternalIrrigation_SoilMoisture_V1,
1942
+ Calc_ExternalIrrigation_SoilMoisture_V2,
1943
+ Calc_RelativeSoilMoisture_V1,
1944
+ Calc_PotentialRecharge_V1,
1945
+ Calc_PotentialRecharge_V2,
1946
+ Calc_Baseflow_V1,
1947
+ Calc_ActualRecharge_V1,
1948
+ Calc_DelayedRecharge_DeepWater_V1,
1949
+ )
1950
+ OUTLET_METHODS = ()
1951
+ SENDER_METHODS = ()
1952
+ SUBMODELINTERFACES = (aetinterfaces.AETModel_V1,)
1953
+ SUBMODELS = ()
1954
+
1955
+
1956
+ class Main_AETModel_V1(modeltools.AdHocModel):
1957
+ """Base class for |whmod.DOCNAME.long| models that use submodels that comply with
1958
+ the |AETModel_V1| interface."""
1959
+
1960
+ aetmodel: modeltools.SubmodelProperty
1961
+ aetmodel_is_mainmodel = modeltools.SubmodelIsMainmodelProperty()
1962
+ aetmodel_typeid = modeltools.SubmodelTypeIDProperty()
1963
+
1964
+ @importtools.prepare_submodel(
1965
+ "aetmodel",
1966
+ aetinterfaces.AETModel_V1,
1967
+ aetinterfaces.AETModel_V1.prepare_nmbzones,
1968
+ aetinterfaces.AETModel_V1.prepare_subareas,
1969
+ aetinterfaces.AETModel_V1.prepare_zonetypes,
1970
+ aetinterfaces.AETModel_V1.prepare_water,
1971
+ aetinterfaces.AETModel_V1.prepare_interception,
1972
+ aetinterfaces.AETModel_V1.prepare_soil,
1973
+ aetinterfaces.AETModel_V1.prepare_plant,
1974
+ aetinterfaces.AETModel_V1.prepare_tree,
1975
+ aetinterfaces.AETModel_V1.prepare_conifer,
1976
+ aetinterfaces.AETModel_V1.prepare_maxsoilwater,
1977
+ landtype_constants=whmod_constants.LANDTYPE_CONSTANTS,
1978
+ landtype_refindices=whmod_control.LandType,
1979
+ soiltype_constants=whmod_constants.SOILTYPE_CONSTANTS,
1980
+ soiltype_refindices=whmod_control.SoilType,
1981
+ refweights=whmod_control.ZoneArea,
1982
+ )
1983
+ def add_aetmodel_v1(
1984
+ self,
1985
+ aetmodel: aetinterfaces.AETModel_V1,
1986
+ /,
1987
+ *,
1988
+ refresh: bool, # pylint: disable=unused-argument
1989
+ ) -> None:
1990
+ """Initialise the given submodel that follows the |AETModel_V1| interface and
1991
+ is responsible for calculating the different kinds of actual
1992
+ evapotranspiration.
1993
+
1994
+ >>> from hydpy.models.whmod_rural import *
1995
+ >>> parameterstep()
1996
+ >>> nmbzones(5)
1997
+ >>> area(10.0)
1998
+ >>> landtype(GRASS, DECIDUOUS, CONIFER, WATER, SEALED)
1999
+ >>> zonearea(4.0, 1.0, 1.0, 1.0, 3.0)
2000
+ >>> availablefieldcapacity(0.2)
2001
+ >>> rootingdepth(1.0)
2002
+ >>> groundwaterdepth(1.0)
2003
+ >>> with model.add_aetmodel_v1("evap_aet_minhas"):
2004
+ ... nmbhru
2005
+ ... area
2006
+ ... water
2007
+ ... interception
2008
+ ... soil
2009
+ ... dissefactor(grass=1.0, deciduous=2.0, default=3.0)
2010
+ ... for method, arguments in model.preparemethod2arguments.items():
2011
+ ... print(method, arguments[0][0], sep=": ")
2012
+ nmbhru(5)
2013
+ area(10.0)
2014
+ water(conifer=False, deciduous=False, grass=False, sealed=False,
2015
+ water=True)
2016
+ interception(conifer=True, deciduous=True, grass=True, sealed=True,
2017
+ water=False)
2018
+ soil(conifer=True, deciduous=True, grass=True, sealed=False,
2019
+ water=False)
2020
+ prepare_nmbzones: 5
2021
+ prepare_zonetypes: [1 2 4 9 8]
2022
+ prepare_subareas: [4. 1. 1. 1. 3.]
2023
+ prepare_water: [False False False True False]
2024
+ prepare_interception: [ True True True False True]
2025
+ prepare_soil: [ True True True False False]
2026
+ prepare_plant: [ True True True False False]
2027
+ prepare_conifer: [False False True False False]
2028
+ prepare_tree: [False True True False False]
2029
+ prepare_maxsoilwater: [200. 200. 200. 200. 200.]
2030
+
2031
+ >>> df = model.aetmodel.parameters.control.dissefactor
2032
+ >>> df
2033
+ dissefactor(conifer=3.0, deciduous=2.0, grass=1.0)
2034
+ >>> landtype(DECIDUOUS, GRASS, CONIFER, WATER, SEALED)
2035
+ >>> df
2036
+ dissefactor(conifer=3.0, deciduous=1.0, grass=2.0)
2037
+ >>> from hydpy import round_
2038
+ >>> round_(df.average_values())
2039
+ 1.5
2040
+ """
2041
+ control = self.parameters.control
2042
+ derived = self.parameters.derived
2043
+
2044
+ hydrotopes = control.nmbzones.value
2045
+ landtype = control.landtype.values
2046
+
2047
+ aetmodel.prepare_nmbzones(hydrotopes)
2048
+ aetmodel.prepare_zonetypes(landtype)
2049
+ aetmodel.prepare_subareas(control.zonearea.value)
2050
+ sel = numpy.full(hydrotopes, False, dtype=config.NP_BOOL)
2051
+ sel[landtype == WATER] = True
2052
+ aetmodel.prepare_water(sel)
2053
+ sel = ~sel
2054
+ aetmodel.prepare_interception(sel)
2055
+ sel[landtype == SEALED] = False
2056
+ aetmodel.prepare_soil(sel)
2057
+ aetmodel.prepare_plant(sel)
2058
+ sel[:] = False
2059
+ sel[landtype == CONIFER] = True
2060
+ aetmodel.prepare_conifer(sel)
2061
+ sel[landtype == DECIDUOUS] = True
2062
+ aetmodel.prepare_tree(sel)
2063
+
2064
+ derived.soildepth.update()
2065
+ derived.maxsoilwater.update()
2066
+ aetmodel.prepare_maxsoilwater(derived.maxsoilwater.values)
2067
+
2068
+
2069
+ class Sub_TempModel_V1(modeltools.AdHocModel, tempinterfaces.TempModel_V1):
2070
+ """Base class for |whmod.DOCNAME.long| models that comply with the |TempModel_V1|
2071
+ submodel interface."""
2072
+
2073
+
2074
+ class Sub_PrecipModel_V1(modeltools.AdHocModel, precipinterfaces.PrecipModel_V1):
2075
+ """Base class for |whmod.DOCNAME.long| models that comply with the |PrecipModel_V1|
2076
+ submodel interface."""
2077
+
2078
+
2079
+ class Sub_IntercModel_V1(modeltools.AdHocModel, stateinterfaces.IntercModel_V1):
2080
+ """Base class for |whmod.DOCNAME.long| models that comply with the |IntercModel_V1|
2081
+ submodel interface."""
2082
+
2083
+
2084
+ class Sub_SoilWaterModel_V1(modeltools.AdHocModel, stateinterfaces.SoilWaterModel_V1):
2085
+ """Base class for |whmod.DOCNAME.long| models that comply with the
2086
+ |SoilWaterModel_V1| submodel interface."""
2087
+
2088
+
2089
+ class Sub_SnowCoverModel_V1(modeltools.AdHocModel, stateinterfaces.SnowCoverModel_V1):
2090
+ """Base class for |whmod.DOCNAME.long| models that comply with the
2091
+ |SnowCoverModel_V1| submodel interface."""