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,1301 @@
1
+ """Create sketches of the structure of the application models.
2
+
3
+ This script creates only the sketches of the first four H-Land application models.
4
+ I plan to add other application models gradually. Before doing so, the script requires
5
+ some refactoring.
6
+
7
+ For now, calling this script is not part of our Travis-CI workflow. So we have to run
8
+ the script and exchange the resulting png files manually each time something changes.
9
+ """
10
+
11
+ # pylint: disable=missing-class-docstring
12
+ # pylint: disable=missing-function-docstring
13
+ from __future__ import annotations
14
+
15
+ from collections.abc import Sequence
16
+ from dataclasses import dataclass, field
17
+ import os
18
+ from typing import Final, Literal, NamedTuple
19
+
20
+ from matplotlib import pyplot
21
+ import numpy
22
+
23
+ from hydpy import config
24
+
25
+
26
+ TOL: Final = 0.2 # total outlet length
27
+ HOW: Final = 0.05 # half outlet width
28
+ GOL: Final = 0.618 # golden ratio
29
+ TDX: Final = 0.02 # dx for left or right aligned text
30
+
31
+
32
+ @dataclass
33
+ class CellExtent:
34
+ x0: float
35
+ x1: float
36
+ y0: float
37
+ y1: float
38
+
39
+ @property
40
+ def dx(self) -> float:
41
+ return self.x1 - self.x0
42
+
43
+ @property
44
+ def dy(self) -> float:
45
+ return self.y1 - self.y0
46
+
47
+
48
+ @dataclass
49
+ class Index:
50
+ i0: int
51
+ j0: int
52
+ i1: int | None = None
53
+ j1: int | None = None
54
+
55
+
56
+ @dataclass
57
+ class Grid:
58
+ nrows: int
59
+ ncols: int
60
+ xs: tuple[float, ...] = field(init=False)
61
+ ys: tuple[float, ...] = field(init=False)
62
+ dx: float = field(init=False)
63
+ dy: float = field(init=False)
64
+
65
+ def __post_init__(self) -> None:
66
+ self.xs = tuple(numpy.linspace(0.0, 1.0, self.ncols + 1))
67
+ self.ys = tuple(numpy.linspace(0.0, 1.0, self.nrows + 1))
68
+ self.dx = self.xs[1] - self.xs[0]
69
+ self.dy = self.ys[1] - self.ys[0]
70
+
71
+ def get_cellextent(self, index: Index) -> CellExtent:
72
+ j1 = (index.j0 if index.j1 is None else index.j1) + 1
73
+ i1 = (index.i0 if index.i1 is None else index.i1) + 1
74
+ return CellExtent(
75
+ x0=self.xs[index.j0], x1=self.xs[j1], y0=self.ys[index.i0], y1=self.ys[i1]
76
+ )
77
+
78
+
79
+ @dataclass
80
+ class Margins:
81
+ left: float = 0.1
82
+ right: float = 0.1
83
+ bottom: float = 0.0
84
+ top: float = 0.0
85
+
86
+
87
+ class Point(NamedTuple):
88
+ x: float
89
+ y: float
90
+
91
+ def adjust(self, cellextent: CellExtent, margins: Margins) -> Point:
92
+ x0m = cellextent.x0 + margins.left * cellextent.dx
93
+ x1m = cellextent.x1 - margins.right * cellextent.dx
94
+ y0m = cellextent.y0 + margins.bottom * cellextent.dy
95
+ y1m = cellextent.y1 - margins.top * cellextent.dy
96
+ return type(self)(x=self.x * (x1m - x0m) + x0m, y=self.y * (y1m - y0m) + y0m)
97
+
98
+
99
+ class Points(list[Point]):
100
+ def __init__(self, *args: Point) -> None:
101
+ super().__init__(args)
102
+
103
+
104
+ @dataclass
105
+ class LineProperties:
106
+ color: Literal["black", "grey", "white"] = "black"
107
+ style: Literal["solid", "dashed", "dotted"] = "solid"
108
+ width: float = 0.5
109
+
110
+
111
+ @dataclass
112
+ class TextProperties:
113
+ color: Literal["black", "grey"] = "black"
114
+ size: float = 9.0
115
+ horizontal: Literal["left", "center", "right"] = "center"
116
+ vertical: Literal["bottom", "center", "top"] = "bottom"
117
+
118
+
119
+ @dataclass
120
+ class ArrowProperties:
121
+ color: Literal["black", "grey"] = "black"
122
+ style: Literal["solid", "dashed", "dotted"] = "solid"
123
+ linewidth: float = 0.25
124
+ headwidth: float = 0.01
125
+
126
+
127
+ @dataclass
128
+ class Vectors:
129
+ xs: Sequence[float]
130
+ ys: Sequence[float]
131
+
132
+ @classmethod
133
+ def from_points(cls, points: Points) -> Vectors:
134
+ return cls(
135
+ xs=tuple(point[0] for point in points),
136
+ ys=tuple(point[1] for point in points),
137
+ )
138
+
139
+ def adjust(self, cellextent: CellExtent, margins: Margins) -> Vectors:
140
+ x0m = cellextent.x0 + margins.left * cellextent.dx
141
+ x1m = cellextent.x1 - margins.right * cellextent.dx
142
+ y0m = cellextent.y0 + margins.bottom * cellextent.dy
143
+ y1m = cellextent.y1 - margins.top * cellextent.dy
144
+ xs = numpy.array(self.xs, dtype=config.NP_FLOAT)
145
+ ys = numpy.array(self.ys, dtype=config.NP_FLOAT)
146
+ xs = xs * (x1m - x0m) + x0m
147
+ ys = ys * (y1m - y0m) + y0m
148
+ return type(self)(xs=tuple(xs), ys=tuple(ys))
149
+
150
+
151
+ @dataclass
152
+ class Element:
153
+ index: Index
154
+ margins: Margins | None = None
155
+
156
+ def plot(self, frame: Frame) -> None:
157
+ raise NotImplementedError
158
+
159
+ def draw_line(
160
+ self,
161
+ frame: Frame,
162
+ points: Points | Sequence[Points],
163
+ properties: LineProperties,
164
+ ) -> None:
165
+ if not isinstance(points, Points):
166
+ points_ = points
167
+ else:
168
+ points_ = (points,)
169
+ for points__ in points_:
170
+ vectors = Vectors.from_points(points=points__)
171
+ vectors = vectors.adjust(
172
+ cellextent=frame.grid.get_cellextent(self.index),
173
+ margins=frame.margins if self.margins is None else self.margins,
174
+ )
175
+ pyplot.plot(
176
+ vectors.xs,
177
+ vectors.ys,
178
+ color=properties.color,
179
+ linestyle=properties.style,
180
+ linewidth=properties.width,
181
+ )
182
+
183
+ def _adjust_point(self, frame: Frame, point: Point) -> Point:
184
+ return point.adjust(
185
+ cellextent=frame.grid.get_cellextent(self.index),
186
+ margins=frame.margins if self.margins is None else self.margins,
187
+ )
188
+
189
+ def draw_text(
190
+ self, frame: Frame, text: str, point: Point, properties: TextProperties
191
+ ) -> None:
192
+ point = self._adjust_point(frame, point)
193
+ pyplot.text(
194
+ x=point.x,
195
+ y=point.y,
196
+ s=text,
197
+ ha=properties.horizontal,
198
+ va=properties.vertical,
199
+ size=properties.size,
200
+ )
201
+
202
+ def draw_arrow(
203
+ self, frame: Frame, base: Point, length: Point, properties: ArrowProperties
204
+ ) -> None:
205
+ base = self._adjust_point(frame=frame, point=base)
206
+ pyplot.arrow(
207
+ x=base.x,
208
+ y=base.y,
209
+ dx=length.x * frame.grid.dx,
210
+ dy=length.y * frame.grid.dy,
211
+ facecolor=properties.color,
212
+ edgecolor=properties.color,
213
+ linewidth=properties.linewidth,
214
+ linestyle=properties.style,
215
+ length_includes_head=True,
216
+ head_width=properties.headwidth,
217
+ )
218
+
219
+ def draw_special_form(self, frame: Frame) -> None:
220
+ top = 1.0
221
+ self.draw_line(
222
+ frame=frame,
223
+ points=Points(
224
+ Point(0.5 + HOW, 0.0),
225
+ Point(0.5 + HOW, TOL),
226
+ Point(1.0, TOL),
227
+ Point(1.0, top),
228
+ Point(0.0, top),
229
+ Point(0.0, TOL),
230
+ Point(0.5 - HOW, TOL),
231
+ Point(0.5 - HOW, 0.0),
232
+ ),
233
+ properties=LineProperties(),
234
+ )
235
+ gol = GOL * (top - TOL) + TOL
236
+ self.draw_line(
237
+ frame=frame,
238
+ points=Points(Point(0.0, gol), Point(top, gol)),
239
+ properties=LineProperties(style="dotted"),
240
+ )
241
+
242
+
243
+ @dataclass()
244
+ class Edge(Element):
245
+ def plot(self, frame: Frame) -> None:
246
+ self.draw_line(
247
+ frame=frame,
248
+ points=Points(
249
+ Point(0.0, 0.0),
250
+ Point(1.0, 0.0),
251
+ Point(1.0, 1.0),
252
+ Point(0.0, 1.0),
253
+ Point(0.0, 0.0),
254
+ ),
255
+ properties=LineProperties(width=2.0, color="white"),
256
+ )
257
+
258
+ def __post_init__(self) -> None:
259
+ self.margins = Margins(left=0.0, right=0.0)
260
+
261
+
262
+ @dataclass
263
+ class Title(Element):
264
+ text: str = ""
265
+
266
+ def plot(self, frame: Frame) -> None:
267
+ self.draw_text(
268
+ frame=frame,
269
+ text=self.text,
270
+ point=Point(0.5, 0.5),
271
+ properties=TextProperties(vertical="center"),
272
+ )
273
+
274
+
275
+ class Interception(Element):
276
+ def plot(self, frame: Frame) -> None:
277
+ self.draw_special_form(frame=frame)
278
+ self.draw_text(
279
+ frame=frame,
280
+ text="ICMax",
281
+ point=Point(TDX, 1.0),
282
+ properties=TextProperties(horizontal="left"),
283
+ )
284
+ self.draw_text(
285
+ frame=frame, text="IC", point=Point(0.5, TOL), properties=TextProperties()
286
+ )
287
+ self.draw_arrow(
288
+ frame=frame,
289
+ base=Point(0.7, 2.0),
290
+ length=Point(0.0, -1.0),
291
+ properties=ArrowProperties(),
292
+ )
293
+ self.draw_text(
294
+ frame=frame,
295
+ text="P",
296
+ point=Point(0.7 + TDX, 1.5),
297
+ properties=TextProperties(horizontal="left", vertical="center"),
298
+ )
299
+ self.draw_arrow(
300
+ frame=frame,
301
+ base=Point(0.6, 1.0),
302
+ length=Point(-0.2, 1.0),
303
+ properties=ArrowProperties(),
304
+ )
305
+ self.draw_text(
306
+ frame=frame,
307
+ text="EI",
308
+ point=Point(0.5 + TDX, 1.5),
309
+ properties=TextProperties(horizontal="left", vertical="center"),
310
+ )
311
+ self.draw_arrow(
312
+ frame=frame,
313
+ base=Point(0.5, 0.0),
314
+ length=Point(0.0, -0.5),
315
+ properties=ArrowProperties(headwidth=0.0),
316
+ )
317
+ self.draw_text(
318
+ frame=frame,
319
+ text="TF",
320
+ point=Point(0.5 + TDX, -0.25),
321
+ properties=TextProperties(horizontal="left", vertical="center"),
322
+ )
323
+ self.draw_arrow(
324
+ frame=frame,
325
+ base=Point(0.5, -0.5),
326
+ length=Point(-0.1, -0.5),
327
+ properties=ArrowProperties(),
328
+ )
329
+ self.draw_text(
330
+ frame=frame,
331
+ text="Snow",
332
+ point=Point(0.4 - TDX, -0.75),
333
+ properties=TextProperties(horizontal="right", vertical="center"),
334
+ )
335
+ self.draw_arrow(
336
+ frame=frame,
337
+ base=Point(0.5, -0.5),
338
+ length=Point(0.1, -0.5),
339
+ properties=ArrowProperties(),
340
+ )
341
+ self.draw_text(
342
+ frame=frame,
343
+ text="Rain",
344
+ point=Point(0.6 + TDX, -0.75),
345
+ properties=TextProperties(horizontal="left", vertical="center"),
346
+ )
347
+
348
+
349
+ @dataclass
350
+ class Snow(Element):
351
+ arrowfactor: float = 1.0
352
+ include_sr: bool = False
353
+
354
+ def plot(self, frame: Frame) -> None:
355
+ self.draw_line(
356
+ frame=frame,
357
+ points=(
358
+ Points(
359
+ Point(0.0, 1.0), Point(0.0, TOL), Point(0.5, TOL), Point(0.5, 1.0)
360
+ ),
361
+ Points(Point(0.5, TOL), Point(0.75 - HOW, TOL), Point(0.75 - HOW, 0.0)),
362
+ Points(
363
+ Point(0.75 + HOW, 0.0),
364
+ Point(0.75 + HOW, TOL),
365
+ Point(1.0, TOL),
366
+ Point(1.0, 0.8),
367
+ ),
368
+ Points(Point(0.5, 0.8), Point(1.0, 0.8)),
369
+ ),
370
+ properties=LineProperties(),
371
+ )
372
+ self.draw_line(
373
+ frame=frame,
374
+ points=(
375
+ Points(Point(0.0, 0.9), Point(0.5, 0.9)),
376
+ Points(Point(0.5, 0.6), Point(1.0, 0.6)),
377
+ ),
378
+ properties=LineProperties(style="dotted"),
379
+ )
380
+ self.draw_text(
381
+ frame=frame,
382
+ text="SP⋅WHC",
383
+ point=Point(0.99, 0.8),
384
+ properties=TextProperties(horizontal="right"),
385
+ )
386
+ self.draw_text(
387
+ frame=frame, text="SP", point=Point(0.25, TOL), properties=TextProperties()
388
+ )
389
+ self.draw_text(
390
+ frame=frame, text="WC", point=Point(0.75, TOL), properties=TextProperties()
391
+ )
392
+ self.draw_arrow(
393
+ frame=frame,
394
+ base=Point(0.75, 0.0),
395
+ length=Point(0.0, -1.0 * self.arrowfactor),
396
+ properties=ArrowProperties(),
397
+ )
398
+ self.draw_text(
399
+ frame=frame,
400
+ text="In",
401
+ point=Point(0.75 + TDX, -0.5),
402
+ properties=TextProperties(horizontal="left", vertical="center"),
403
+ )
404
+ if self.include_sr:
405
+ self.draw_text(
406
+ frame=frame,
407
+ text="SR",
408
+ point=Point(0.63 - TDX, -0.5),
409
+ properties=TextProperties(horizontal="left", vertical="center"),
410
+ )
411
+ self.draw_arrow(
412
+ frame=frame,
413
+ base=Point(0.4, 0.4),
414
+ length=Point(0.2, 0.0),
415
+ properties=ArrowProperties(linewidth=0.01),
416
+ )
417
+ self.draw_arrow(
418
+ frame=frame,
419
+ base=Point(0.6, 0.4),
420
+ length=Point(-0.2, 0.0),
421
+ properties=ArrowProperties(linewidth=0.01),
422
+ )
423
+
424
+
425
+ class Soil(Element):
426
+ version: Literal["v1_base", "v3_v4"] = "v1_base"
427
+
428
+ def plot(self, frame: Frame) -> None:
429
+ top = 1.0
430
+ if self.version == "v1_base":
431
+ self.draw_line(
432
+ frame=frame,
433
+ points=(
434
+ Points(
435
+ Point(0.25 - HOW, 0.0),
436
+ Point(0.25 - HOW, TOL),
437
+ Point(0.0, TOL),
438
+ Point(0.0, top),
439
+ Point(1.0, top),
440
+ Point(1.0, TOL),
441
+ Point(0.75 + HOW, TOL),
442
+ Point(0.75 + HOW, 0.0),
443
+ ),
444
+ Points(
445
+ Point(0.25 + HOW, 0.0),
446
+ Point(0.25 + HOW, TOL),
447
+ Point(0.75 - HOW, TOL),
448
+ Point(0.75 - HOW, 0.0),
449
+ ),
450
+ ),
451
+ properties=LineProperties(),
452
+ )
453
+ self.draw_line(
454
+ frame=frame,
455
+ points=Points(
456
+ Point(0.0, GOL * (top - TOL) + TOL),
457
+ Point(top, GOL * (top - TOL) + TOL),
458
+ ),
459
+ properties=LineProperties(color="grey"),
460
+ )
461
+ elif self.version == "v3_v4":
462
+ self.draw_special_form(frame=frame)
463
+ self.draw_text(
464
+ frame=frame,
465
+ text="FC",
466
+ point=Point(TDX, 1.0),
467
+ properties=TextProperties(horizontal="left"),
468
+ )
469
+ self.draw_text(
470
+ frame=frame, text="SM", point=Point(0.5, TOL), properties=TextProperties()
471
+ )
472
+ if self.version == "v1_base":
473
+ x_r = 0.25
474
+ self.draw_arrow(
475
+ frame=frame,
476
+ base=Point(0.75, -1.0),
477
+ length=Point(0.0, 1.0),
478
+ properties=ArrowProperties(),
479
+ )
480
+ self.draw_text(
481
+ frame=frame,
482
+ text="CF",
483
+ point=Point(0.75 + TDX, -0.5),
484
+ properties=TextProperties(horizontal="left", vertical="center"),
485
+ )
486
+ elif self.version == "v3_v4":
487
+ x_r = 0.5
488
+ else:
489
+ raise NotImplementedError
490
+ self.draw_arrow(
491
+ frame=frame,
492
+ base=Point(x_r, 0.0),
493
+ length=Point(0.0, -1.0),
494
+ properties=ArrowProperties(),
495
+ )
496
+ self.draw_text(
497
+ frame=frame,
498
+ text="R",
499
+ point=Point(x_r + TDX, -0.5),
500
+ properties=TextProperties(horizontal="left", vertical="center"),
501
+ )
502
+ self.draw_arrow(
503
+ frame=frame,
504
+ base=Point(0.6, 1.0),
505
+ length=Point(-0.2, 1.0),
506
+ properties=ArrowProperties(),
507
+ )
508
+ self.draw_text(
509
+ frame=frame,
510
+ text="EA",
511
+ point=Point(0.5 + TDX, 1.5),
512
+ properties=TextProperties(horizontal="left", vertical="center"),
513
+ )
514
+
515
+
516
+ @dataclass
517
+ class Glacier(Element):
518
+ def __post_init__(self) -> None:
519
+ self.margins = Margins(right=0.5)
520
+
521
+ def plot(self, frame: Frame) -> None:
522
+ top = 0.7
523
+ self.draw_line(
524
+ frame=frame,
525
+ points=(
526
+ Points(
527
+ Point(0.5 + 2 * HOW, 0.0),
528
+ Point(0.5 + 2 * HOW, TOL),
529
+ Point(1.0, TOL),
530
+ Point(1.0, top),
531
+ ),
532
+ Points(
533
+ Point(0.0, top),
534
+ Point(0.0, TOL),
535
+ Point(0.5 - 2 * HOW, TOL),
536
+ Point(0.5 - 2 * HOW, 0.0),
537
+ ),
538
+ ),
539
+ properties=LineProperties(),
540
+ )
541
+ self.draw_text(
542
+ frame=frame,
543
+ text="\u221e",
544
+ point=Point(0.5, TOL),
545
+ properties=TextProperties(),
546
+ )
547
+ self.draw_arrow(
548
+ frame=frame,
549
+ base=Point(0.5, 0.0),
550
+ length=Point(0.0, -1.0),
551
+ properties=ArrowProperties(),
552
+ )
553
+ self.draw_text(
554
+ frame=frame,
555
+ text="GLMelt",
556
+ point=Point(0.5 + TDX, -0.5),
557
+ properties=TextProperties(horizontal="left", vertical="center"),
558
+ )
559
+
560
+
561
+ @dataclass
562
+ class UZ_SG1_BW(Element):
563
+ arrows: bool = True
564
+
565
+ def plot(self, frame: Frame) -> None:
566
+ raise NotImplementedError
567
+
568
+ @property
569
+ def arrayinfo(self) -> tuple[ArrowProperties, float]:
570
+ if self.arrows:
571
+ return ArrowProperties(), -1.31
572
+ return (ArrowProperties(color="grey", headwidth=0.0), -1.0)
573
+
574
+
575
+ @dataclass
576
+ class UZ(UZ_SG1_BW):
577
+ version: Literal["v1_base", "v3"] = "v1_base"
578
+
579
+ def __post_init__(self) -> None:
580
+ if self.version == "v1_base":
581
+ self.margins = Margins(left=0.03, right=0.03)
582
+
583
+ def plot(self, frame: Frame) -> None:
584
+ top = 1.0
585
+ denom = 4 if self.version == "v1_base" else 2
586
+ d_outlet2 = 0.5
587
+ oversize = 1.2
588
+ denom_ = 2 if self.version == "v1_base" else 1
589
+ points = [
590
+ Points(
591
+ Point(-TOL / denom, TOL),
592
+ Point(0.5 - HOW / denom_, TOL),
593
+ Point(0.5 - HOW / denom_, 0.0),
594
+ ),
595
+ Points(
596
+ Point(0.5 + HOW / denom_, 0.0),
597
+ Point(0.5 + HOW / denom_, TOL),
598
+ Point(1.0, TOL),
599
+ Point(1.0, oversize * top),
600
+ ),
601
+ ]
602
+ if self.version == "v1_base":
603
+ points.append(
604
+ Points(
605
+ Point(-TOL / denom, TOL + 4 * HOW),
606
+ Point(0.0, TOL + 4 * HOW),
607
+ Point(0.0, oversize * top),
608
+ )
609
+ )
610
+ elif self.version == "v3":
611
+ points.extend(
612
+ (
613
+ Points(
614
+ Point(-TOL / denom, TOL + 4 * HOW),
615
+ Point(0.0, TOL + 4 * HOW),
616
+ Point(0.0, TOL + d_outlet2),
617
+ Point(-TOL / denom, TOL + d_outlet2),
618
+ ),
619
+ Points(
620
+ Point(-TOL / denom, TOL + d_outlet2 + 4 * HOW),
621
+ Point(0.0, TOL + d_outlet2 + 4 * HOW),
622
+ Point(0.0, oversize * top),
623
+ ),
624
+ )
625
+ )
626
+ else:
627
+ raise NotImplementedError
628
+ self.draw_line(frame=frame, points=points, properties=LineProperties())
629
+ self.draw_line(
630
+ frame=frame,
631
+ points=Points(Point(0.0, 1.0), Point(1.0, 1.0)),
632
+ properties=LineProperties(style="dotted"),
633
+ )
634
+ if self.version == "v1_base":
635
+ self.draw_text(
636
+ frame=frame,
637
+ text="UZ",
638
+ point=Point(0.5, TOL),
639
+ properties=TextProperties(),
640
+ )
641
+ elif self.version == "v3":
642
+ self.draw_text(
643
+ frame=frame,
644
+ text="SUZ",
645
+ point=Point(0.5, TOL + 0.1),
646
+ properties=TextProperties(),
647
+ )
648
+ else:
649
+ raise NotImplementedError
650
+ self.draw_arrow(
651
+ frame=frame,
652
+ base=Point(0.5, 0.0),
653
+ length=Point(0.0, -1.0),
654
+ properties=ArrowProperties(),
655
+ )
656
+ if self.version == "v1_base":
657
+ self.draw_text(
658
+ frame=frame,
659
+ text="Perc",
660
+ point=Point(0.5 + TDX / 2, -0.5),
661
+ properties=TextProperties(horizontal="left", vertical="center"),
662
+ )
663
+ elif self.version == "v3":
664
+ self.draw_text(
665
+ frame=frame,
666
+ text="DP",
667
+ point=Point(0.5 + TDX, -0.5),
668
+ properties=TextProperties(horizontal="left", vertical="center"),
669
+ )
670
+ else:
671
+ raise NotImplementedError
672
+ self.draw_arrow(
673
+ frame=frame,
674
+ base=Point(-TOL / denom, TOL + 2 * HOW),
675
+ length=Point(
676
+ self.arrayinfo[1] + (0.06 if self.version == "v1_base" else 0.0), 0.0
677
+ ),
678
+ properties=self.arrayinfo[0],
679
+ )
680
+ if self.version == "v1_base":
681
+ self.draw_text(
682
+ frame=frame,
683
+ text="Q0",
684
+ point=Point(-TOL / denom - 2 * TDX, TOL + 2 * HOW),
685
+ properties=TextProperties(horizontal="right"),
686
+ )
687
+ elif self.arrows:
688
+ self.draw_text(
689
+ frame=frame,
690
+ text="RI",
691
+ point=Point(-1.2 * TOL + self.arrayinfo[1], TOL + 2 * HOW),
692
+ properties=TextProperties(horizontal="center"),
693
+ )
694
+ elif self.version != "v3":
695
+ raise NotImplementedError
696
+ if self.version == "v3":
697
+ self.draw_line(
698
+ frame=frame,
699
+ points=Points(Point(0.0, TOL + d_outlet2), Point(1.0, TOL + d_outlet2)),
700
+ properties=LineProperties(style="dashed"),
701
+ )
702
+ if not self.arrows:
703
+ self.draw_text(
704
+ frame=frame,
705
+ text="SGR",
706
+ point=Point(TDX / 2, TOL + d_outlet2),
707
+ properties=TextProperties(horizontal="left"),
708
+ )
709
+ self.draw_arrow(
710
+ frame=frame,
711
+ base=Point(-TOL / denom, TOL + 2 * HOW + d_outlet2),
712
+ length=Point(self.arrayinfo[1], 0.0),
713
+ properties=self.arrayinfo[0],
714
+ )
715
+ if self.arrows:
716
+ self.draw_text(
717
+ frame=frame,
718
+ text="RS",
719
+ point=Point(
720
+ -1.2 * TOL + self.arrayinfo[1], TOL + 2 * HOW + d_outlet2
721
+ ),
722
+ properties=TextProperties(horizontal="center"),
723
+ )
724
+
725
+
726
+ @dataclass
727
+ class LZ(Element):
728
+ version: Literal["v1", "v2", "v4"] = "v1"
729
+
730
+ def __post_init__(self) -> None:
731
+ self.margins = Margins(left=0.02, right=0.02)
732
+
733
+ def plot(self, frame: Frame) -> None:
734
+ denom = 6
735
+ oversize = 1.2
736
+ if self.version in ("v1", "v4"):
737
+ bottom = 0.0
738
+ elif self.version == "v2":
739
+ bottom = -1.0
740
+ else:
741
+ raise NotImplementedError
742
+ self.draw_line(
743
+ frame=frame,
744
+ points=(
745
+ Points(
746
+ Point(0.0, bottom),
747
+ Point(0.0, 0.5 - 2 * HOW),
748
+ Point(-TOL / denom, 0.5 - 2 * HOW),
749
+ ),
750
+ Points(
751
+ Point(-TOL / denom, 0.5 + 2 * HOW),
752
+ Point(0.0, 0.5 + 2 * HOW),
753
+ Point(0.0, oversize),
754
+ ),
755
+ Points(Point(1.0, bottom), Point(1.0, oversize)),
756
+ ),
757
+ properties=LineProperties(),
758
+ )
759
+ y = 0.8
760
+ self.draw_line(
761
+ frame=frame,
762
+ points=Points(Point(0.0, y), Point(1.0, y)),
763
+ properties=LineProperties(style="dotted"),
764
+ )
765
+ self.draw_text(
766
+ frame=frame, text="LZ", point=Point(0.5, TOL), properties=TextProperties()
767
+ )
768
+ self.draw_arrow(
769
+ frame=frame,
770
+ base=Point(0.5 / 3, 2.0),
771
+ length=Point(0.0, -1.0),
772
+ properties=ArrowProperties(),
773
+ )
774
+ self.draw_text(
775
+ frame=frame,
776
+ text="P",
777
+ point=Point((0.5 + TDX) / 3, 1.5),
778
+ properties=TextProperties(horizontal="left", vertical="center"),
779
+ )
780
+ self.draw_arrow(
781
+ frame=frame,
782
+ base=Point(0.4 / 3, 1.0),
783
+ length=Point(-0.2, 1.0),
784
+ properties=ArrowProperties(),
785
+ )
786
+ self.draw_text(
787
+ frame=frame,
788
+ text="EL",
789
+ point=Point(0.3 / 3 + TDX, 1.5),
790
+ properties=TextProperties(horizontal="left", vertical="center"),
791
+ )
792
+ if self.version in ("v1", "v2"):
793
+ arraylength = -0.5
794
+ elif self.version == "v4":
795
+ arraylength = -1.5 - 2 * TOL
796
+ self.draw_text(
797
+ frame=frame,
798
+ text="Q",
799
+ point=Point(-0.65, 0.5),
800
+ properties=TextProperties(horizontal="left"),
801
+ )
802
+ else:
803
+ raise NotImplementedError
804
+ self.draw_arrow(
805
+ frame=frame,
806
+ base=Point(-TOL / denom, 0.5),
807
+ length=Point(arraylength, 0.0),
808
+ properties=ArrowProperties(),
809
+ )
810
+ self.draw_text(
811
+ frame=frame,
812
+ text="Q1",
813
+ point=Point(-TOL / denom - TDX, 0.5),
814
+ properties=TextProperties(horizontal="right"),
815
+ )
816
+
817
+
818
+ @dataclass
819
+ class SG1(UZ_SG1_BW):
820
+ def plot(self, frame: Frame) -> None:
821
+ denom = 2
822
+ oversize = 1.2
823
+ self.draw_line(
824
+ frame=frame,
825
+ points=(
826
+ Points(
827
+ Point(-TOL / denom, TOL + 4 * HOW),
828
+ Point(0.0, TOL + 4 * HOW),
829
+ Point(0.0, oversize),
830
+ ),
831
+ Points(
832
+ Point(-TOL / denom, TOL),
833
+ Point(0.5 - HOW, TOL),
834
+ Point(0.5 - HOW, 0.0),
835
+ ),
836
+ Points(
837
+ Point(0.5 + HOW, 0.0),
838
+ Point(0.5 + HOW, TOL),
839
+ Point(1.0, TOL),
840
+ Point(1.0, oversize),
841
+ ),
842
+ ),
843
+ properties=LineProperties(),
844
+ )
845
+ y = 0.8
846
+ self.draw_line(
847
+ frame=frame,
848
+ points=Points(Point(0.0, y), Point(1.0, y)),
849
+ properties=LineProperties(style="dotted"),
850
+ )
851
+ self.draw_text(
852
+ frame=frame,
853
+ text="SG1",
854
+ point=Point(0.5, TOL + 0.1),
855
+ properties=TextProperties(),
856
+ )
857
+ self.draw_arrow(
858
+ frame=frame,
859
+ base=Point(-TOL / denom, TOL + 2 * HOW),
860
+ length=Point(self.arrayinfo[1], 0.0),
861
+ properties=self.arrayinfo[0],
862
+ )
863
+ if self.arrows:
864
+ self.draw_text(
865
+ frame=frame,
866
+ text="RG1",
867
+ point=Point(-1.2 * TOL + self.arrayinfo[1], TOL + 2 * HOW),
868
+ properties=TextProperties(horizontal="center"),
869
+ )
870
+ self.draw_arrow(
871
+ frame=frame,
872
+ base=Point(0.5, 0.0),
873
+ length=Point(0.0, -0.5),
874
+ properties=ArrowProperties(headwidth=0.0),
875
+ )
876
+ self.draw_text(
877
+ frame=frame,
878
+ text="DP-GR1",
879
+ point=Point(0.5 + TDX, -0.25),
880
+ properties=TextProperties(horizontal="left", vertical="center"),
881
+ )
882
+ self.draw_arrow(
883
+ frame=frame,
884
+ base=Point(0.5, -0.5),
885
+ length=Point(-0.1, -0.75),
886
+ properties=ArrowProperties(),
887
+ )
888
+ self.draw_text(
889
+ frame=frame,
890
+ text="GR2",
891
+ point=Point(0.45 - TDX, -0.75),
892
+ properties=TextProperties(horizontal="right", vertical="center"),
893
+ )
894
+ self.draw_arrow(
895
+ frame=frame,
896
+ base=Point(0.5, -0.5),
897
+ length=Point(0.1 / 0.75 * 1.75, -1.75),
898
+ properties=ArrowProperties(),
899
+ )
900
+ self.draw_text(
901
+ frame=frame,
902
+ text="GR3",
903
+ point=Point(0.55 + TDX, -0.75),
904
+ properties=TextProperties(horizontal="left", vertical="center"),
905
+ )
906
+
907
+
908
+ @dataclass
909
+ class SG23(Element):
910
+ number: Literal[2, 3] = 2
911
+
912
+ def __post_init__(self) -> None:
913
+ self.margins = Margins(left=0.02, right=0.02)
914
+
915
+ def plot(self, frame: Frame) -> None:
916
+ denom = 6
917
+ bottom = 0.2 if self.number == 2 else -1.0
918
+ self.draw_line(
919
+ frame=frame,
920
+ points=(
921
+ Points(
922
+ Point(0.0, bottom),
923
+ Point(0.0, 0.5 - 2 * HOW),
924
+ Point(0.0 - TOL / denom, 0.5 - 2 * HOW),
925
+ ),
926
+ Points(
927
+ Point(0.0 - TOL / denom, 0.5 + 2 * HOW),
928
+ Point(0.0 + 0.0, 0.5 + 2 * HOW),
929
+ Point(0.0 + 0.0, 1.0),
930
+ ),
931
+ Points(Point(1.0, bottom), Point(1.0, 1.0)),
932
+ ),
933
+ properties=LineProperties(),
934
+ )
935
+ y = 0.8
936
+ self.draw_line(
937
+ frame=frame,
938
+ points=Points(Point(0.0, y), Point(1.0, y)),
939
+ properties=LineProperties(style="dotted"),
940
+ )
941
+ self.draw_text(
942
+ frame=frame,
943
+ text=f"SG{self.number}",
944
+ point=Point((0.0 + 1.0) / 2, TOL),
945
+ properties=TextProperties(),
946
+ )
947
+ self.draw_arrow(
948
+ frame=frame,
949
+ base=Point(-TOL / denom, 0.5),
950
+ length=Point(-0.25 if self.number == 2 else -0.5, 0.0),
951
+ properties=ArrowProperties(),
952
+ )
953
+ self.draw_text(
954
+ frame=frame,
955
+ text=f"RG{self.number}",
956
+ point=Point(-TOL / denom - TDX / 3, 0.5),
957
+ properties=TextProperties(horizontal="right", vertical="bottom"),
958
+ )
959
+ self.draw_arrow(
960
+ frame=frame,
961
+ base=Point(0.3 / 3, y),
962
+ length=Point(-0.2, 1.0),
963
+ properties=ArrowProperties(),
964
+ )
965
+ self.draw_text(
966
+ frame=frame,
967
+ text="EL",
968
+ point=Point(0.18 / 3 + TDX, 1.3),
969
+ properties=TextProperties(horizontal="left", vertical="center"),
970
+ )
971
+ if self.number == 2:
972
+ self.draw_arrow(
973
+ frame=frame,
974
+ base=Point(0.6 / 3, 2.0),
975
+ length=Point(0.0, -0.5),
976
+ properties=ArrowProperties(headwidth=0.0),
977
+ )
978
+ self.draw_arrow(
979
+ frame=frame,
980
+ base=Point(0.6 / 3, 1.5),
981
+ length=Point(-0.1, -0.75),
982
+ properties=ArrowProperties(),
983
+ )
984
+ self.draw_arrow(
985
+ frame=frame,
986
+ base=Point(0.6 / 3, 1.5),
987
+ length=Point(0.1 / 0.75 * 1.75, -1.75),
988
+ properties=ArrowProperties(),
989
+ )
990
+ self.draw_text(
991
+ frame=frame,
992
+ text="P",
993
+ point=Point((0.5 + TDX) / 3, 1.75),
994
+ properties=TextProperties(horizontal="left", vertical="center"),
995
+ )
996
+
997
+
998
+ @dataclass
999
+ class BW(UZ_SG1_BW):
1000
+ number: Literal[1, 2] = 1
1001
+
1002
+ def plot(self, frame: Frame) -> None:
1003
+ top = 1.0
1004
+ denom = 2
1005
+ d_outlet2 = 0.5
1006
+ oversize = 1.2
1007
+ denom_ = 1
1008
+ factor = 2
1009
+ self.draw_line(
1010
+ frame=frame,
1011
+ points=(
1012
+ Points(
1013
+ Point(0.0, oversize * top),
1014
+ Point(0.0, TOL + d_outlet2 + factor * HOW),
1015
+ Point(-TOL / denom, TOL + d_outlet2 + factor * HOW),
1016
+ ),
1017
+ Points(
1018
+ Point(-TOL / denom, TOL + d_outlet2 - factor * HOW),
1019
+ Point(0.0, TOL + d_outlet2 - factor * HOW),
1020
+ Point(0.0, TOL),
1021
+ Point(0.5 - HOW / denom_, TOL),
1022
+ Point(0.5 - HOW / denom_, 0.0),
1023
+ ),
1024
+ Points(
1025
+ Point(0.5 + HOW / denom_, 0.0),
1026
+ Point(0.5 + HOW / denom_, TOL),
1027
+ Point(1.0, TOL),
1028
+ Point(1.0, oversize * top),
1029
+ ),
1030
+ ),
1031
+ properties=LineProperties(),
1032
+ )
1033
+ self.draw_line(
1034
+ frame=frame,
1035
+ points=Points(Point(0.0, 1.0), Point(1.0, 1.0)),
1036
+ properties=LineProperties(style="dotted"),
1037
+ )
1038
+ self.draw_text(
1039
+ frame=frame,
1040
+ text=f"BW{self.number}",
1041
+ point=Point(0.5, TOL),
1042
+ properties=TextProperties(),
1043
+ )
1044
+ self.draw_arrow(
1045
+ frame=frame,
1046
+ base=Point(0.5, 0.0),
1047
+ length=Point(0.0, -1.0),
1048
+ properties=ArrowProperties(),
1049
+ )
1050
+ self.draw_text(
1051
+ frame=frame,
1052
+ text=f"QVs{self.number}",
1053
+ point=Point(0.5 + TDX, -0.5),
1054
+ properties=TextProperties(horizontal="left", vertical="center"),
1055
+ )
1056
+ self.draw_line(
1057
+ frame=frame,
1058
+ points=Points(
1059
+ Point(0.0, TOL + d_outlet2 - factor * HOW),
1060
+ Point(1.0, TOL + d_outlet2 - factor * HOW),
1061
+ ),
1062
+ properties=LineProperties(style="dashed"),
1063
+ )
1064
+ if not self.arrows:
1065
+ self.draw_text(
1066
+ frame=frame,
1067
+ text=f"H{self.number}",
1068
+ point=Point(TDX / 2, TOL + d_outlet2 - factor * HOW),
1069
+ properties=TextProperties(horizontal="left"),
1070
+ )
1071
+ arraylength = self.arrayinfo[1] - 0.25 * (self.arrows and self.number == 2)
1072
+ self.draw_arrow(
1073
+ frame=frame,
1074
+ base=Point(-TOL / denom, TOL + d_outlet2),
1075
+ length=Point(arraylength, 0.0),
1076
+ properties=self.arrayinfo[0],
1077
+ )
1078
+ if self.arrows:
1079
+ self.draw_text(
1080
+ frame=frame,
1081
+ text=f"QAb{self.number}",
1082
+ point=Point(-TOL, TOL + 2 * HOW + d_outlet2),
1083
+ properties=TextProperties(horizontal="right"),
1084
+ )
1085
+
1086
+
1087
+ class UH(Element):
1088
+ def plot(self, frame: Frame) -> None:
1089
+ self.draw_line(
1090
+ frame=frame,
1091
+ points=Points(Point(0.0, 0.0), Point(0.25, 1.0), Point(0.5, 0.0)),
1092
+ properties=LineProperties(),
1093
+ )
1094
+ self.draw_text(
1095
+ frame=frame, text="Q", point=Point(0.25, 0.25), properties=TextProperties()
1096
+ )
1097
+
1098
+
1099
+ @dataclass
1100
+ class SC(Element):
1101
+ version: Literal["v2_v3", "v4"] = "v2_v3"
1102
+
1103
+ def __post_init__(self) -> None:
1104
+ self.margins = Margins(left=0.0, right=0.0)
1105
+
1106
+ def plot(self, frame: Frame) -> None:
1107
+ x0 = 0.15
1108
+ if self.version == "v2_v3":
1109
+ y0 = 0.0
1110
+ elif self.version == "v4":
1111
+ y0 = 0.15
1112
+ else:
1113
+ raise NotImplementedError
1114
+ dx = 0.3
1115
+ dy = 0.65
1116
+ self.draw_line(
1117
+ frame=frame,
1118
+ points=(
1119
+ *(
1120
+ Points(
1121
+ Point(x0 - dx * i, y0 + 0.5 - dy * i),
1122
+ Point(x0 - dx * i, y0 + 4 * HOW - dy * i),
1123
+ )
1124
+ for i in range(3)
1125
+ ),
1126
+ *(
1127
+ Points(
1128
+ Point(x0 - dx * i, y0 - dy * i),
1129
+ Point(x0 + dx - dx * i, y0 - dy * i),
1130
+ Point(x0 + dx - dx * i, y0 + 0.5 - dy * i),
1131
+ )
1132
+ for i in range(3)
1133
+ ),
1134
+ ),
1135
+ properties=LineProperties(),
1136
+ )
1137
+ self.draw_line(
1138
+ frame=frame,
1139
+ points=(
1140
+ *(
1141
+ Points(
1142
+ Point(x0 - dx * i, y0 + 0.4 - dy * i),
1143
+ Point(x0 + dx - dx * i, y0 + 0.4 - dy * i),
1144
+ )
1145
+ for i in range(3)
1146
+ ),
1147
+ ),
1148
+ properties=LineProperties(style="dotted"),
1149
+ )
1150
+ for i in range(3):
1151
+ self.draw_text(
1152
+ frame=frame,
1153
+ text="SC",
1154
+ point=Point(dx - dx * i, y0 + -dy * i),
1155
+ properties=TextProperties(vertical="bottom"),
1156
+ )
1157
+ for i in range(2):
1158
+ self.draw_arrow(
1159
+ frame=frame,
1160
+ base=Point(x0 - dx * i, y0 + 0.1 - dy * i),
1161
+ length=Point(-0.225 / 1.5, -0.45 / 1.5),
1162
+ properties=ArrowProperties(),
1163
+ )
1164
+ i = 2
1165
+ if self.version == "v2_v3":
1166
+ self.draw_arrow(
1167
+ frame=frame,
1168
+ base=Point(x0 - dx * i, y0 + 0.1 - dy * i),
1169
+ length=Point(-0.3, 0.0),
1170
+ properties=ArrowProperties(),
1171
+ )
1172
+ self.draw_text(
1173
+ frame=frame,
1174
+ text="Q",
1175
+ point=Point(x0 - dx * i - 4 * TDX, y0 + 0.1 - dy * i),
1176
+ properties=TextProperties(vertical="bottom", horizontal="right"),
1177
+ )
1178
+ elif self.version == "v4":
1179
+ self.draw_arrow(
1180
+ frame=frame,
1181
+ base=Point(x0 - dx * i, y0 + 0.1 - dy * i),
1182
+ length=Point(-0.225, -0.45),
1183
+ properties=ArrowProperties(headwidth=0.0),
1184
+ )
1185
+ else:
1186
+ raise NotImplementedError
1187
+
1188
+
1189
+ @dataclass
1190
+ class Frame:
1191
+ grid: Grid
1192
+ margins: Margins
1193
+ elements: Sequence[Element]
1194
+ xfactor: float = 2.0
1195
+ yfactor: float = 0.5
1196
+
1197
+ def plot(self, filename: str | None = None) -> None:
1198
+ for e in self.elements:
1199
+ e.plot(frame=self)
1200
+ fig = pyplot.gcf()
1201
+ fig.subplots_adjust(bottom=0)
1202
+ fig.subplots_adjust(top=1)
1203
+ fig.subplots_adjust(right=1)
1204
+ fig.subplots_adjust(left=0)
1205
+ fig.set_size_inches(
1206
+ self.xfactor * self.grid.ncols, self.yfactor * self.grid.nrows
1207
+ )
1208
+ if filename is None:
1209
+ pyplot.show()
1210
+ else:
1211
+ pyplot.savefig(os.path.join("figs", filename))
1212
+ pyplot.clf()
1213
+
1214
+
1215
+ if __name__ == "__main__":
1216
+ elements_hland_96_base = [
1217
+ Edge(index=Index(i0=0, i1=10, j0=0, j1=3)),
1218
+ Title(index=Index(i0=10, j0=0), text="SEALED"),
1219
+ Title(index=Index(i0=10, j0=1), text="INTERNAL LAKE"),
1220
+ Title(index=Index(i0=10, j0=2), text="GLACIER"),
1221
+ Title(index=Index(i0=10, j0=3), text="FIELD/FOREST"),
1222
+ Interception(Index(i0=8, j0=0)),
1223
+ Interception(Index(i0=8, j0=3)),
1224
+ Snow(Index(i0=6, j0=0), arrowfactor=5.5, include_sr=True),
1225
+ Snow(Index(i0=6, j0=2), arrowfactor=3.0),
1226
+ Snow(Index(i0=6, j0=3)),
1227
+ Soil(Index(i0=4, j0=3)),
1228
+ Glacier(Index(i0=4, j0=2)),
1229
+ UZ(Index(i0=2, j0=2, j1=3)),
1230
+ LZ(Index(i0=0, j0=1, j1=3)),
1231
+ ]
1232
+ elements_hland_96 = elements_hland_96_base + [UH(Index(i0=0, j0=0))]
1233
+ Frame(
1234
+ grid=Grid(nrows=11, ncols=4), margins=Margins(), elements=elements_hland_96
1235
+ ).plot("HydPy-H-HBV96.png")
1236
+
1237
+ elements_hland_96p = elements_hland_96_base + [SC(Index(i0=0, j0=0))]
1238
+ for element in elements_hland_96p:
1239
+ if element.index.i1 is not None:
1240
+ element.index.i1 += 1
1241
+ if element.index.j1 is not None:
1242
+ element.index.j1 += 1
1243
+ if isinstance(element, Edge):
1244
+ continue
1245
+ element.index.i0 += 1
1246
+ element.index.j0 += 1
1247
+
1248
+ elements_hland_96p = [e for e in elements_hland_96p if not isinstance(e, (UZ, LZ))]
1249
+ for idx, element in enumerate(elements_hland_96p):
1250
+ if isinstance(element, SC):
1251
+ continue
1252
+ if element.index.i1 is not None:
1253
+ element.index.i1 += 3
1254
+ if isinstance(element, Edge):
1255
+ continue
1256
+ element.index.i0 += 3
1257
+ if isinstance(element, Snow) and element.index.j0 == 1:
1258
+ element.arrowfactor = 8.5
1259
+ if isinstance(element, Soil):
1260
+ element.version = "v3_v4"
1261
+ elements_hland_96p.extend(
1262
+ (
1263
+ UZ(Index(i0=6, j0=3), version="v3"),
1264
+ UZ(Index(i0=6, j0=4), version="v3", arrows=False),
1265
+ SG1(Index(i0=4, j0=3)),
1266
+ SG1(Index(i0=4, j0=4), arrows=False),
1267
+ SG23(Index(i0=2, j0=2, j1=4), number=2),
1268
+ SG23(Index(i0=1, j0=2, j1=4), number=3),
1269
+ )
1270
+ )
1271
+ Frame(
1272
+ grid=Grid(nrows=15, ncols=5), margins=Margins(), elements=elements_hland_96p
1273
+ ).plot("HydPy-H-HBV96-PREVAH.png")
1274
+
1275
+ elements_hland_96c = [
1276
+ e for e in elements_hland_96p if not isinstance(e, (UZ_SG1_BW, SG23))
1277
+ ]
1278
+ for element in elements_hland_96c:
1279
+ if isinstance(element, SC):
1280
+ element.version = "v4"
1281
+ element.index.i0 = 2
1282
+ continue
1283
+ if element.index.i1 is not None:
1284
+ element.index.i1 -= 2
1285
+ if isinstance(element, Edge):
1286
+ continue
1287
+ element.index.i0 -= 2
1288
+ if isinstance(element, Snow) and element.index.j0 == 1:
1289
+ element.arrowfactor = 5.25
1290
+ elements_hland_96c.extend(
1291
+ (
1292
+ BW(Index(i0=4, j0=3)),
1293
+ BW(Index(i0=4, j0=4), number=1, arrows=False),
1294
+ BW(Index(i0=2, j0=3), number=2),
1295
+ BW(Index(i0=2, j0=4), number=2, arrows=False),
1296
+ LZ(Index(i0=0, j0=2, j1=4), version="v4"),
1297
+ )
1298
+ )
1299
+ Frame(
1300
+ grid=Grid(nrows=13, ncols=5), margins=Margins(), elements=elements_hland_96c
1301
+ ).plot("HydPy-H-HBV96-COSERO.png")