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,1169 @@
1
+ """This module supports writing auxiliary files.
2
+
3
+ In *HydPy*, parameter values are usually not shared between different model objects
4
+ handled by different elements, even if the model objects are of the same type (e.g.
5
+ |lland_dd|). This approach offers flexibility in applying different parameterisation
6
+ schemes. However, often modellers prefer to use a minimal amount of values for
7
+ specific parameters (at least within hydrologically homogeneous regions). Hence, the
8
+ downside of this flexibility is that the same parameter values might appear in hundreds
9
+ or even thousands of parameter control files (one file for each model/element).
10
+
11
+ To decrease this redundancy, *HydPy* allows for passing names of auxiliary control
12
+ files to parameters defined within regular control files. *HydPy* then reads the
13
+ actual parameter values from the auxiliary files, each one possibly referenced within a
14
+ large number of control files.
15
+
16
+ Reading parameters from regular and from auxiliary control files is straightforward.
17
+ However, storing some parameters in a large number of regular control files and some
18
+ other parameters in a small number of auxiliary files can be complicated. The features
19
+ implemented in module |auxfiletools| are a means to perform such actions in a
20
+ semi-automated manner (other means are the selection mechanism implemented in module
21
+ |selectiontools|).
22
+ """
23
+
24
+ # import...
25
+ # ...from standard library
26
+ from __future__ import annotations
27
+ import copy
28
+ import itertools
29
+ import types
30
+ import warnings
31
+
32
+ # ...from HydPy
33
+ import hydpy
34
+ from hydpy.core import importtools
35
+ from hydpy.core import modeltools
36
+ from hydpy.core import objecttools
37
+ from hydpy.core import parametertools
38
+ from hydpy.core import variabletools
39
+ from hydpy.core.typingtools import *
40
+
41
+ if TYPE_CHECKING:
42
+ from hydpy.core import timetools
43
+
44
+
45
+ Reference: TypeAlias = Union[parametertools.Parameter, parametertools.KeywordArguments]
46
+
47
+
48
+ class Auxfiler:
49
+ """Structures auxiliary file information.
50
+
51
+ For writing some parameter information to auxiliary files, it is advisable to
52
+ prepare (only) one |Auxfiler| object:
53
+
54
+ >>> from hydpy import Auxfiler
55
+ >>> auxfiler = Auxfiler()
56
+
57
+ Each |Auxfiler| object is capable of handling parameter information for different
58
+ kinds of models and performs some plausibility checks on added data. Assume we
59
+ want to store the control files of a "LARSIM type" HydPy project involving the
60
+ application models |lland_dd|, |lland_knauf| and |kinw_williams|. The following
61
+ example shows how we add these models to the |Auxfiler| object by passing through
62
+ module (|lland_dd|), a working model object (|lland_knauf|) or their name
63
+ (|kinw_williams|):
64
+
65
+ >>> from hydpy import prepare_model
66
+ >>> from hydpy.models import lland_dd as module
67
+ >>> model = prepare_model("lland_knauf")
68
+ >>> string = "kinw_williams"
69
+
70
+ You can add all model types individually or in groups:
71
+
72
+ >>> auxfiler.add_models(module)
73
+ >>> auxfiler.add_models(model, string)
74
+ >>> auxfiler
75
+ Auxfiler("kinw_williams", "lland_dd", "lland_knauf")
76
+
77
+ Alternatively, you can pass the models directly to the constructor:
78
+
79
+ >>> Auxfiler(model, string, module)
80
+ Auxfiler("kinw_williams", "lland_dd", "lland_knauf")
81
+
82
+ Wrong model specifications result in errors like the following:
83
+
84
+ >>> auxfiler.add_models("asdf")
85
+ Traceback (most recent call last):
86
+ ...
87
+ ModuleNotFoundError: While trying to add one ore more models to the actual \
88
+ `Auxfiler` object, the following error occurred: No module named 'hydpy.models.asdf'
89
+
90
+ The |Auxfiler| object allocates a separate |SubAuxfiler| object to each model type.
91
+ These are available via keyword and attribute access:
92
+
93
+ >>> auxfiler["lland_dd"]
94
+ SubAuxfiler()
95
+ >>> auxfiler.lland_knauf
96
+ SubAuxfiler()
97
+
98
+ Adding new and deleting existing |SubAuxfiler| objects via attribute access is
99
+ disabled for safety purposes:
100
+
101
+ >>> auxfiler.lland_knauf = auxfiler.lland_dd
102
+ Traceback (most recent call last):
103
+ ...
104
+ AttributeError: Class `Auxfiler` does not support adding `SubAuxfiler` objects \
105
+ via attribute access. Use method `add_models` to register additional models.
106
+
107
+ >>> del auxfiler.lland_dd
108
+ Traceback (most recent call last):
109
+ ...
110
+ AttributeError: Class `Auxfiler` does not support deleting `SubAuxfiler` objects \
111
+ via attribute access. Use method `remove_models` to remove registered models.
112
+
113
+ As stated by the last error message, you should remove models and their
114
+ |SubAuxfiler| objects via method |Auxfiler.remove_models|:
115
+
116
+ >>> auxfiler.remove_models(module, string)
117
+ >>> auxfiler
118
+ Auxfiler("lland_knauf")
119
+
120
+ >>> auxfiler.remove_models(module, string)
121
+ Traceback (most recent call last):
122
+ ...
123
+ RuntimeError: While trying to remove one or more models from the actual \
124
+ `Auxfiler` object, the following error occurred: Model `lland_dd` is currently not \
125
+ registered.
126
+
127
+ >>> auxfiler.lland_dd # doctest: +ELLIPSIS
128
+ Traceback (most recent call last):
129
+ ...
130
+ AttributeError: The actual `Auxfiler` object does neither have a normal attribute \
131
+ nor does it handle a model named `lland_dd`...
132
+
133
+ >>> auxfiler["lland_dd"]
134
+ Traceback (most recent call last):
135
+ ...
136
+ KeyError: 'The actual `Auxfiler` object does not handle a model named `lland_dd`.'
137
+
138
+ For other types, attribute access works as usual:
139
+
140
+ >>> auxfiler.test = 123
141
+ >>> hasattr(auxfiler, "test")
142
+ True
143
+ >>> del auxfiler.test
144
+ >>> hasattr(auxfiler, "test")
145
+ False
146
+ """
147
+
148
+ _model2subauxfiler: dict[str, SubAuxfiler]
149
+
150
+ def __init__(self, *models: str | types.ModuleType | modeltools.Model) -> None:
151
+ self._model2subauxfiler = {}
152
+ self.add_models(*models)
153
+
154
+ def add_models(self, *models: str | types.ModuleType | modeltools.Model) -> None:
155
+ """Register an arbitrary number of |Model| types.
156
+
157
+ For further information, see the main documentation on class |Auxfiler|.
158
+ """
159
+ try:
160
+ for model in models:
161
+ model_ = self._get_model(model)
162
+ self._model2subauxfiler[str(model_)] = SubAuxfiler(
163
+ master=self, model=self._get_model(model_)
164
+ )
165
+ except BaseException:
166
+ objecttools.augment_excmessage(
167
+ f"While trying to add one ore more models to the actual "
168
+ f"`{type(self).__name__}` object"
169
+ )
170
+
171
+ def remove_models(self, *models: str | types.ModuleType | modeltools.Model) -> None:
172
+ """Unregister an arbitrary number of |Model| classes.
173
+
174
+ For further information, see the main documentation on class |Auxfiler|.
175
+ """
176
+ try:
177
+ for model in models:
178
+ model_ = self._get_model(model)
179
+ try:
180
+ del self._model2subauxfiler[str(model_)]
181
+ except KeyError:
182
+ raise RuntimeError(
183
+ f"Model `{model_}` is currently not registered."
184
+ ) from None
185
+ except BaseException:
186
+ objecttools.augment_excmessage(
187
+ f"While trying to remove one or more models from the actual "
188
+ f"`{type(self).__name__}` object"
189
+ )
190
+
191
+ @staticmethod
192
+ def _get_model(
193
+ value: str | types.ModuleType | modeltools.Model,
194
+ ) -> modeltools.Model:
195
+ if isinstance(value, modeltools.Model):
196
+ return value
197
+ return importtools.prepare_model(value)
198
+
199
+ def get(self, model: str | modeltools.Model) -> SubAuxfiler | None:
200
+ """Get the |SubAuxfiler| object related to the given |Model| type.
201
+
202
+ In contrast to attribute and keyword access, method |Auxfiler.get| returns
203
+ |None| when it does not handle the requested |SubAuxfiler| object:
204
+
205
+ >>> from hydpy import Auxfiler
206
+ >>> auxfiler = Auxfiler("lland_dd")
207
+ >>> auxfiler.get("lland_dd")
208
+ SubAuxfiler()
209
+ >>> auxfiler.get("lland_knauf")
210
+ """
211
+ return self._model2subauxfiler.get(str(model))
212
+
213
+ def __getitem__(self, item: str) -> SubAuxfiler:
214
+ try:
215
+ return self._model2subauxfiler[item]
216
+ except KeyError:
217
+ raise KeyError(
218
+ f"The actual `{type(self).__name__}` object does not handle a model "
219
+ f"named `{item}`."
220
+ ) from None
221
+
222
+ @property
223
+ def modelnames(self) -> tuple[str, ...]:
224
+ """A sorted |tuple| of all names of the handled models.
225
+
226
+ >>> from hydpy import Auxfiler
227
+ >>> Auxfiler("lland_knauf", "kinw_williams", "lland_dd").modelnames
228
+ ('kinw_williams', 'lland_dd', 'lland_knauf')
229
+ """
230
+ return tuple(sorted(self._model2subauxfiler.keys()))
231
+
232
+ def write(
233
+ self,
234
+ parameterstep: timetools.PeriodConstrArg | None = None,
235
+ simulationstep: timetools.PeriodConstrArg | None = None,
236
+ ) -> None:
237
+ """Write all defined auxiliary control files.
238
+
239
+ Before being able to write parameter information into auxiliary files, you need
240
+ to know how to add this information to your |Auxfiler| object. Hence, please
241
+ read the documentation on method |SubAuxfiler.add_parameter| of class
242
+ |SubAuxfiler| first, from which we borrow the following (slightly modified)
243
+ test-setting:
244
+
245
+ >>> from hydpy.models.lland import *
246
+ >>> parameterstep()
247
+ >>> nhru(4)
248
+ >>> lnk(ACKER, LAUBW, WASSER, ACKER)
249
+ >>> tgr(acker=2.0, laubw=1.0)
250
+ >>> eqd1(200.0)
251
+ >>> eqd2(100.0)
252
+
253
+ >>> from hydpy import Auxfiler
254
+ >>> auxfiler = Auxfiler("lland_dd", "lland_knauf")
255
+ >>> auxfiler.lland_dd.add_parameter(eqd1, filename="file1")
256
+ >>> auxfiler.lland_dd.add_parameter(parameter=tgr,
257
+ ... filename="file1",
258
+ ... keywordarguments=tgr.keywordarguments)
259
+ >>> auxfiler.lland_knauf.add_parameters(eqd1, eqd2, filename="file2")
260
+
261
+ Class |Auxfiler| takes the target path from the |ControlManager| object stored
262
+ in the global |pub| object. For testing, we initialise one and override its
263
+ |property| |FileManager.currentpath| with a simple |str| object defining the
264
+ test target path:
265
+
266
+ >>> from hydpy import pub
267
+ >>> pub.projectname = "test"
268
+ >>> from hydpy.core.filetools import ControlManager
269
+ >>> class Test(ControlManager):
270
+ ... currentpath = "test_directory"
271
+ >>> pub.controlmanager = Test()
272
+
273
+ Usually, |Auxfiler| objects write control files to disk, of course. But to
274
+ show (and to test) the results in the following test, we redirected file
275
+ writing via class |Open|:
276
+
277
+ >>> from hydpy import Open
278
+ >>> with Open():
279
+ ... auxfiler.write(parameterstep="1d", simulationstep="12h")
280
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
281
+ test_directory/file1.py
282
+ -----------------------------------
283
+ from hydpy.models.lland_dd import *
284
+ <BLANKLINE>
285
+ simulationstep("12h")
286
+ parameterstep("1d")
287
+ <BLANKLINE>
288
+ tgr(acker=2.0, laubw=1.0)
289
+ eqd1(200.0)
290
+ <BLANKLINE>
291
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
292
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
293
+ test_directory/file2.py
294
+ --------------------------------------
295
+ from hydpy.models.lland_knauf import *
296
+ <BLANKLINE>
297
+ simulationstep("12h")
298
+ parameterstep("1d")
299
+ <BLANKLINE>
300
+ eqd1(200.0)
301
+ eqd2(100.0)
302
+ <BLANKLINE>
303
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
304
+ """
305
+ options = hydpy.pub.options
306
+ for modelname, subauxfiler in self:
307
+ for filename in subauxfiler.get_filenames():
308
+ with options.parameterstep(parameterstep), options.simulationstep(
309
+ simulationstep
310
+ ):
311
+ model = importtools.prepare_model(modelname)
312
+ header = model.get_controlfileheader(
313
+ import_submodels=False,
314
+ parameterstep=parameterstep,
315
+ simulationstep=simulationstep,
316
+ )
317
+ body = "\n".join(
318
+ subauxfiler.get_parameterstrings(filename=filename)
319
+ )
320
+ hydpy.pub.controlmanager.save_file(
321
+ filename=filename, text="".join((header, body, "\n"))
322
+ )
323
+
324
+ def __getattr__(self, name: str) -> SubAuxfiler:
325
+ try:
326
+ return self._model2subauxfiler[name]
327
+ except KeyError:
328
+ raise AttributeError(
329
+ f"The actual `{type(self).__name__}` object does neither have a "
330
+ f"normal attribute nor does it handle a model named `{name}`."
331
+ ) from None
332
+
333
+ def __setattr__(self, name: str, value: object) -> None:
334
+ if isinstance(value, SubAuxfiler):
335
+ raise AttributeError(
336
+ f"Class `{type(self).__name__}` does not support adding `SubAuxfiler` "
337
+ f"objects via attribute access. Use method `add_models` to register "
338
+ f"additional models."
339
+ )
340
+ super().__setattr__(name, value)
341
+
342
+ def __delattr__(self, name: str) -> None:
343
+ if name in self._model2subauxfiler:
344
+ raise AttributeError(
345
+ f"Class `{type(self).__name__}` does not support deleting "
346
+ f"`SubAuxfiler` objects via attribute access. Use method "
347
+ f"`remove_models` to remove registered models."
348
+ )
349
+ super().__delattr__(name)
350
+
351
+ def __iter__(self) -> Iterator[tuple[str, SubAuxfiler]]:
352
+ yield from sorted(self._model2subauxfiler.items())
353
+
354
+ def __repr__(self) -> str:
355
+ return objecttools.apply_black(
356
+ type(self).__name__, *sorted(f"{name}" for name in self.modelnames)
357
+ )
358
+
359
+ def __dir__(self) -> list[str]:
360
+ """
361
+ >>> aux = Auxfiler()
362
+ >>> aux.add_models("lland_knauf", "lland_dd", "hland_96")
363
+ >>> sorted(set(dir(aux)) - set(object.__dir__(aux)))
364
+ ['hland_96', 'lland_dd', 'lland_knauf']
365
+ """
366
+ return cast(list[str], super().__dir__()) + list(self.modelnames)
367
+
368
+
369
+ class SubAuxfiler:
370
+ """Map different |Parameter| objects to the names of auxiliary files.
371
+
372
+ Usually, |SubAuxfiler| objects are not initialised by the user explicitly but made
373
+ available by their master |Auxfiler| object. After that, users can access them and
374
+ subsequently register different |Parameter| objects. See the documentation on
375
+ method |SubAuxfiler.add_parameter| for further information.
376
+ """
377
+
378
+ _master: Auxfiler | None
379
+ _model: modeltools.Model | None
380
+ _type2filename2reference: dict[type[parametertools.Parameter], dict[str, Reference]]
381
+
382
+ def __init__(
383
+ self, master: Auxfiler | None = None, model: modeltools.Model | None = None
384
+ ) -> None:
385
+ self._master = master
386
+ self._model = model
387
+ self._type2filename2reference = {}
388
+
389
+ def add_parameter(
390
+ self,
391
+ parameter: parametertools.Parameter,
392
+ filename: str,
393
+ keywordarguments: parametertools.KeywordArguments[T] | None = None,
394
+ ) -> None:
395
+ """Add a single |Parameter| to the actual |SubAuxfiler| object.
396
+
397
+ To show how |SubAuxfiler| works, we first prepare an instance of application
398
+ model |lland_dd| and define the values of some of its parameters:
399
+
400
+ >>> from hydpy.models.lland_dd import *
401
+ >>> parameterstep()
402
+ >>> nhru(4)
403
+ >>> lnk(ACKER, LAUBW, WASSER, ACKER)
404
+ >>> tgr(acker=2.0, laubw=1.0)
405
+ >>> eqb(5000.0)
406
+ >>> eqi1(2000.0)
407
+ >>> eqi2(1000.0)
408
+ >>> eqd1(100.0)
409
+ >>> eqd2(50.0)
410
+
411
+ Next, we initialise an |Auxfiler| object handling a single |SubAuxfiler|
412
+ object. The purpose of the |SubAuxfiler| object is to allocate the above
413
+ parameters to two auxiliary files named `file1` and `file2`:
414
+
415
+ >>> from hydpy import Auxfiler
416
+ >>> auxfiler = Auxfiler(model)
417
+
418
+ Auxiliary file `file1` shall contain the actual values of parameters
419
+ |lland_control.EQB|, |lland_control.EQI1|, and |lland_control.EQI2|:
420
+
421
+ >>> auxfiler.lland_dd.add_parameters(eqb, eqi1, eqi2, filename="file1")
422
+ >>> auxfiler.lland_dd.file1
423
+ (eqb(5000.0), eqi1(2000.0), eqi2(1000.0))
424
+
425
+ Auxiliary file `file2` shall contain the actual values of parameters
426
+ |lland_control.EQD1|, |lland_control.EQD2|, and (also!) of parameter
427
+ |lland_control.EQB|:
428
+
429
+ >>> auxfiler.lland_dd.add_parameters(eqd1, eqd2, filename="file2")
430
+ >>> auxfiler.lland_dd.add_parameter(eqb, filename="file2")
431
+ Traceback (most recent call last):
432
+ ...
433
+ RuntimeError: While trying to extend the range of parameters handled by the \
434
+ actual `SubAuxfiler` object, the following error occurred: You tried to allocate \
435
+ parameter `eqb(5000.0)` to filename `file2`, but an equal `EQB` object has already \
436
+ been allocated to filename `file1`.
437
+
438
+ >>> auxfiler.lland_dd.file2
439
+ (eqd1(100.0), eqd2(50.0))
440
+
441
+ As explained by the error message, allocating the same parameter type with
442
+ equal values to two different auxiliary files is not allowed. Nevertheless,
443
+ after changing the value of parameter |lland_control.EQB|, it can be allocated
444
+ to filename `file2`:
445
+
446
+ >>> eqb *= 2
447
+ >>> auxfiler.lland_dd.add_parameter(eqb, filename="file2")
448
+ >>> auxfiler.lland_dd.file2
449
+ (eqb(10000.0), eqd1(100.0), eqd2(50.0))
450
+
451
+ The following example shows that parameter |lland_control.EQB| already
452
+ allocated to `file1` has still the same value (we implemented this safety
453
+ mechanism via deep copying) and that one can view all registered parameters by
454
+ using their names as attribute names:
455
+
456
+ >>> auxfiler.lland_dd.eqb
457
+ (eqb(10000.0), eqb(5000.0))
458
+
459
+ During adding parameters method |SubAuxfiler.add_parameter| performs some
460
+ additional plausibility checks. First, it prevents from using the same
461
+ filename twice:
462
+
463
+ >>> auxfiler.add_models("kinw_williams")
464
+ >>> auxfiler.kinw_williams.add_parameter(tgr, filename="file1")
465
+ Traceback (most recent call last):
466
+ ...
467
+ RuntimeError: While trying to extend the range of parameters handled by the \
468
+ actual `SubAuxfiler` object, the following error occurred: Filename `file1` is \
469
+ already allocated to another `SubAuxfiler` object.
470
+
471
+ Second, it checks that an assigned parameter belongs to the corresponding
472
+ model:
473
+
474
+ >>> auxfiler.kinw_williams.add_parameter(tgr, filename="file3")
475
+ Traceback (most recent call last):
476
+ ...
477
+ TypeError: While trying to extend the range of parameters handled by the \
478
+ actual `SubAuxfiler` object, the following error occurred: Variable type `TGr` is not \
479
+ handled by model `kinw_williams`.
480
+
481
+ The examples above deal with simple 0-dimensional |Parameter| subclasses where
482
+ there is no question in how to define equality. However, for multidimensional
483
+ |Parameter| subclasses requiring that the shape and all values are equal might
484
+ often be too strict.
485
+
486
+ The auxiliary file functionalities of *HydPy* allow using the
487
+ |Parameter.keywordarguments| property of a parameter to check for equality
488
+ instead (put more concretely, method |SubAuxfiler.get_parameterstrings| uses
489
+ method |KeywordArguments.subset_of| of class |KeywordArguments| for
490
+ comparisons). If we want to apply this feature for the instances of the
491
+ |ZipParameter| subclass |lland_control.TGr|, we need to additionally pass a
492
+ |KeywordArguments| object to method |SubAuxfiler.add_parameter|:
493
+
494
+ >>> auxfiler.lland_dd.add_parameter(
495
+ ... tgr, filename="file1", keywordarguments=tgr.keywordarguments)
496
+ >>> auxfiler.lland_dd.tgr
497
+ (KeywordArguments(acker=2.0, laubw=1.0),)
498
+
499
+ Alternatively, we can also pass a manually defined |KeywordArguments| object
500
+ (for which we perform similar plausibility checks as discussed above):
501
+
502
+ >>> from hydpy import KeywordArguments
503
+ >>> auxfiler.lland_dd.add_parameter(
504
+ ... tgr, filename="file2",
505
+ ... keywordarguments=KeywordArguments(acker=2.0, laubw=1.0))
506
+ Traceback (most recent call last):
507
+ ...
508
+ RuntimeError: While trying to extend the range of parameters handled by the \
509
+ actual `SubAuxfiler` object, the following error occurred: You tried to allocate \
510
+ parameter `tgr(acker=2.0, laubw=1.0)` with keyword arguments \
511
+ `KeywordArguments(acker=2.0, laubw=1.0)` to filename `file2`, but an `TGr` with equal \
512
+ keyword arguments has already been allocated to filename `file1`.
513
+
514
+ Often, we want such a manually defined |KeywordArguments| object to be more
515
+ general so that it covers as many actual parameter objects as possible:
516
+
517
+ >>> auxfiler.lland_dd.add_parameter(
518
+ ... tgr, filename="file2",
519
+ ... keywordarguments=KeywordArguments(acker=2.0, laubw=1.0, nadelw=0.0))
520
+ >>> auxfiler.lland_dd.tgr
521
+ (KeywordArguments(acker=2.0, laubw=1.0), \
522
+ KeywordArguments(acker=2.0, laubw=1.0, nadelw=0.0))
523
+
524
+ Note that due to the current implementation of method
525
+ |SubAuxfiler.get_parameterstrings| the final state of the |Auxfiler| object
526
+ results in some ambiguity (see the documentation on method
527
+ |SubAuxfiler.get_parameterstrings| for further information). Hence, we might
528
+ add more detailed plausibility checks regarding equality of |KeywordArguments|
529
+ objects in the future.
530
+
531
+ Unfortunately, the string representations of |SubAuxfiler| objects are not
532
+ executable at the moment:
533
+
534
+ >>> auxfiler.lland_dd
535
+ SubAuxfiler(file1, file2)
536
+
537
+ Erroneous attribute access results in the following error:
538
+
539
+ >>> auxfiler.lland_dd.wrong
540
+ Traceback (most recent call last):
541
+ ...
542
+ AttributeError: `wrong` is neither a filename nor a name of a parameter \
543
+ handled by the actual `SubAuxfiler` object.
544
+ """
545
+ try:
546
+ self._check_filename(filename=filename)
547
+ self._check_parameter(parameter=parameter)
548
+ filename2reference = self._type2filename2reference.get(type(parameter), {})
549
+ self._check_duplicate(
550
+ filename2reference=filename2reference,
551
+ parameter=parameter,
552
+ filename=filename,
553
+ keywordarguments=keywordarguments,
554
+ )
555
+ if keywordarguments is None:
556
+ filename2reference[filename] = copy.deepcopy(parameter)
557
+ else:
558
+ filename2reference[filename] = copy.deepcopy(keywordarguments)
559
+ self._type2filename2reference[type(parameter)] = filename2reference
560
+ except BaseException:
561
+ objecttools.augment_excmessage(
562
+ f"While trying to extend the range of parameters handled by the "
563
+ f"actual `{type(self).__name__}` object"
564
+ )
565
+
566
+ def _check_filename(self, filename: str) -> None:
567
+ objecttools.valid_variable_identifier(filename)
568
+ if self._master is not None:
569
+ for _, subauxf in self._master:
570
+ if (subauxf is not self) and (filename in subauxf.get_filenames()):
571
+ raise RuntimeError(
572
+ f"Filename `{filename}` is already allocated to another "
573
+ f"`{type(self).__name__}` object."
574
+ )
575
+
576
+ def _check_parameter(self, parameter: parametertools.Parameter) -> None:
577
+ if self._model and not isinstance(
578
+ parameter, self._model.parameters.control.CLASSES
579
+ ):
580
+ raise TypeError(
581
+ f"Variable type `{type(parameter).__name__}` is not handled by model "
582
+ f"`{self._model}`."
583
+ )
584
+
585
+ @staticmethod
586
+ def _check_duplicate(
587
+ filename2reference: dict[str, Reference],
588
+ parameter: parametertools.Parameter,
589
+ filename: str,
590
+ keywordarguments: parametertools.KeywordArguments[T] | None,
591
+ ) -> None:
592
+ for fn, ref in filename2reference.items():
593
+ if fn != filename:
594
+ if (keywordarguments is None) and (ref == parameter):
595
+ raise RuntimeError(
596
+ f"You tried to allocate parameter `{repr(parameter)}` to "
597
+ f"filename `{filename}`, but an equal "
598
+ f"`{type(parameter).__name__}` object has already been "
599
+ f"allocated to filename `{fn}`."
600
+ )
601
+ if (keywordarguments is not None) and (ref == keywordarguments):
602
+ raise RuntimeError(
603
+ f"You tried to allocate parameter `{repr(parameter)}` with "
604
+ f"keyword arguments `{keywordarguments}` to filename "
605
+ f"`{filename}`, but an `{type(parameter).__name__}` with "
606
+ f"equal keyword arguments has already been allocated to "
607
+ f"filename `{fn}`."
608
+ )
609
+
610
+ def add_parameters(
611
+ self, *parameters: parametertools.Parameter, filename: str
612
+ ) -> None:
613
+ """Add an arbitrary number of |Parameter| objects to the actual |SubAuxfiler|
614
+ object.
615
+
616
+ Method |SubAuxfiler.add_parameters| works like method
617
+ |SubAuxfiler.add_parameter| but allows to add multiple parameters at once. On
618
+ the downside, it does not allow to define alternative keyword arguments.
619
+ """
620
+ for parameter in parameters:
621
+ self.add_parameter(filename=filename, parameter=parameter)
622
+
623
+ def remove_parameters(
624
+ self,
625
+ parametertype: type[parametertools.Parameter] | None = None,
626
+ filename: str | None = None,
627
+ ) -> None:
628
+ """Remove the registered |Parameter| objects of the given type related to the
629
+ given filename.
630
+
631
+ The following (slightly modified) test-setting stems from the documentation
632
+ on method |SubAuxfiler.add_parameter|:
633
+
634
+ >>> from hydpy.models.lland_dd import *
635
+ >>> parameterstep()
636
+ >>> nhru(4)
637
+ >>> lnk(ACKER, LAUBW, WASSER, ACKER)
638
+ >>> tgr(acker=2.0, laubw=1.0)
639
+ >>> eqb(5000.0)
640
+ >>> eqi1(2000.0)
641
+ >>> eqd1(100.0)
642
+
643
+ >>> from hydpy import Auxfiler
644
+ >>> auxfiler = Auxfiler(model)
645
+ >>> subauxfiler = auxfiler.lland_dd
646
+ >>> subauxfiler.add_parameters(eqb, eqi1, filename="file1")
647
+ >>> subauxfiler.add_parameter(
648
+ ... tgr, filename="file1", keywordarguments=tgr.keywordarguments)
649
+ >>> eqb *= 2.0
650
+ >>> subauxfiler.add_parameters(eqb, eqd1, filename="file2")
651
+
652
+ >>> subauxfiler.file1
653
+ (KeywordArguments(acker=2.0, laubw=1.0), eqb(5000.0), eqi1(2000.0))
654
+ >>> subauxfiler.file2
655
+ (eqb(10000.0), eqd1(100.0))
656
+
657
+ To be able to start from this setting repeatedly, we make a deep copy
658
+ of an internal dictionary:
659
+
660
+ >>> from copy import deepcopy
661
+ >>> copy = deepcopy(subauxfiler._type2filename2reference)
662
+
663
+ First, you can remove all parameters related to a specific filename:
664
+
665
+ >>> subauxfiler.remove_parameters(filename="file1")
666
+ >>> subauxfiler.get_filenames()
667
+ ('file2',)
668
+ >>> subauxfiler.file2
669
+ (eqb(10000.0), eqd1(100.0))
670
+
671
+ Second, you can remove all parameters of a specific type:
672
+
673
+ >>> subauxfiler._type2filename2reference = deepcopy(copy)
674
+ >>> subauxfiler.remove_parameters(parametertype=type(eqb))
675
+ >>> subauxfiler.file1
676
+ (KeywordArguments(acker=2.0, laubw=1.0), eqi1(2000.0))
677
+ >>> subauxfiler.file2
678
+ (eqd1(100.0),)
679
+
680
+ Third, you can remove a specific parameter object by defining both its time and
681
+ its filename:
682
+
683
+ >>> subauxfiler._type2filename2reference = deepcopy(copy)
684
+ >>> subauxfiler.remove_parameters(parametertype=type(eqb), filename="file1")
685
+ >>> subauxfiler.file1
686
+ (KeywordArguments(acker=2.0, laubw=1.0), eqi1(2000.0))
687
+ >>> subauxfiler.file2
688
+ (eqb(10000.0), eqd1(100.0))
689
+
690
+ Fourth, you can remove all parameters at once:
691
+
692
+ >>> subauxfiler._type2filename2reference = deepcopy(copy)
693
+ >>> subauxfiler.remove_parameters()
694
+ >>> subauxfiler.get_filenames()
695
+ ()
696
+
697
+ Each combination of arguments comes with a particular error message:
698
+
699
+ >>> subauxfiler.remove_parameters(filename="file2")
700
+ Traceback (most recent call last):
701
+ ...
702
+ RuntimeError: While trying to remove the parameter object(s) allocated to \
703
+ filename `file2`, the following error occurred: No such parameter object(s) available.
704
+
705
+ >>> subauxfiler.remove_parameters(parametertype=type(eqd2))
706
+ Traceback (most recent call last):
707
+ ...
708
+ RuntimeError: While trying to remove the parameter object(s) of type `EQD2`, \
709
+ the following error occurred: No such parameter object(s) available.
710
+
711
+ >>> subauxfiler.remove_parameters(parametertype=type(eqd2), filename="file2")
712
+ Traceback (most recent call last):
713
+ ...
714
+ RuntimeError: While trying to remove a parameter object of type `EQD2` \
715
+ allocated to filename `file2`, the following error occurred: No such parameter \
716
+ object(s) available.
717
+
718
+ >>> subauxfiler._type2filename2reference = None
719
+ >>> subauxfiler.remove_parameters()
720
+ Traceback (most recent call last):
721
+ ...
722
+ AttributeError: While trying to remove all parameter objects, the following \
723
+ error occurred: 'NoneType' object has no attribute 'items'
724
+ """
725
+ try:
726
+ deleted_something = False
727
+ for type_, fn2ref in tuple(self._type2filename2reference.items()):
728
+ for filename_ in tuple(fn2ref):
729
+ if parametertype in (None, type_) and (
730
+ filename in (None, filename_)
731
+ ):
732
+ del fn2ref[filename_]
733
+ deleted_something = True
734
+ if not fn2ref:
735
+ del self._type2filename2reference[type_]
736
+ if not deleted_something:
737
+ raise RuntimeError("No such parameter object(s) available.")
738
+ except BaseException:
739
+ if (parametertype is None) and (filename is None):
740
+ objecttools.augment_excmessage(
741
+ "While trying to remove all parameter objects"
742
+ )
743
+ if parametertype is None:
744
+ objecttools.augment_excmessage(
745
+ f"While trying to remove the parameter object(s) allocated to "
746
+ f"filename `{filename}`"
747
+ )
748
+ if filename is None:
749
+ objecttools.augment_excmessage(
750
+ f"While trying to remove the parameter object(s) of type "
751
+ f"`{parametertype.__name__}`"
752
+ )
753
+ objecttools.augment_excmessage(
754
+ f"While trying to remove a parameter object of type "
755
+ f"`{parametertype.__name__}` allocated to filename `{filename}`"
756
+ )
757
+
758
+ def get_filenames(
759
+ self, parametertype: type[parametertools.Parameter] | None = None
760
+ ) -> tuple[str, ...]:
761
+ """Return a |tuple| of all or a selection of the handled auxiliary file names.
762
+
763
+ The following (slightly modified) test-setting stems from the documentation on
764
+ method |SubAuxfiler.add_parameter|:
765
+
766
+ >>> from hydpy.models.lland_dd import *
767
+ >>> parameterstep()
768
+ >>> nhru(4)
769
+ >>> lnk(ACKER, LAUBW, WASSER, ACKER)
770
+ >>> tgr(acker=2.0, laubw=1.0)
771
+ >>> eqb(5000.0)
772
+ >>> eqi1(2000.0)
773
+ >>> eqd1(100.0)
774
+
775
+ >>> from hydpy import Auxfiler
776
+ >>> auxfiler = Auxfiler(model)
777
+ >>> subauxfiler = auxfiler.lland_dd
778
+ >>> subauxfiler.add_parameters(eqb, eqi1, filename="file1")
779
+ >>> subauxfiler.add_parameter(
780
+ ... tgr, filename="file1", keywordarguments=tgr.keywordarguments)
781
+ >>> eqb *= 2.0
782
+ >>> subauxfiler.add_parameters(eqb, eqd1, filename="file2")
783
+
784
+ Without an argument, method |SubAuxfiler.get_filenames| returns all auxiliary
785
+ filenames:
786
+
787
+ >>> subauxfiler.get_filenames()
788
+ ('file1', 'file2')
789
+
790
+ For a given parameter type, method |SubAuxfiler.get_filenames| returns only the
791
+ auxiliary filenames allocating such a type:
792
+
793
+ >>> subauxfiler.get_filenames(parametertype=type(eqi1))
794
+ ('file1',)
795
+ """
796
+ filenames: set[str] = set()
797
+ for type_, filename2reference in self._type2filename2reference.items():
798
+ if (parametertype is None) or issubclass(parametertype, type_):
799
+ filenames.update(filename2reference)
800
+ return tuple(sorted(filenames))
801
+
802
+ def get_parametertypes(
803
+ self, filename: str | None = None
804
+ ) -> tuple[type[parametertools.Parameter], ...]:
805
+ """Return a |tuple| of all or a selection of the handled parameter types.
806
+
807
+ The following (slightly modified) test-setting stems from the documentation on
808
+ method |SubAuxfiler.add_parameter|:
809
+
810
+ >>> from hydpy.models.lland_dd import *
811
+ >>> parameterstep()
812
+ >>> nhru(4)
813
+ >>> lnk(ACKER, LAUBW, WASSER, ACKER)
814
+ >>> tgr(acker=2.0, laubw=1.0)
815
+ >>> eqb(5000.0)
816
+ >>> eqi1(2000.0)
817
+ >>> eqd1(100.0)
818
+
819
+ >>> from hydpy import Auxfiler
820
+ >>> auxfiler = Auxfiler(model)
821
+ >>> subauxfiler = auxfiler.lland_dd
822
+ >>> subauxfiler.add_parameters(eqb, eqi1, filename="file1")
823
+ >>> subauxfiler.add_parameter(
824
+ ... tgr, filename="file1", keywordarguments=tgr.keywordarguments)
825
+ >>> eqb *= 2.0
826
+ >>> subauxfiler.add_parameters(eqb, eqd1, filename="file2")
827
+
828
+ Without an argument, method |SubAuxfiler.get_parametertypes| returns all
829
+ registered parameter types:
830
+
831
+ >>> for parametertype in subauxfiler.get_parametertypes():
832
+ ... print(parametertype.__name__)
833
+ TGr
834
+ EQB
835
+ EQI1
836
+ EQD1
837
+
838
+ For a given filename, method |SubAuxfiler.get_parametertypes| returns only the
839
+ registered parameter types allocated for this filename:
840
+
841
+ >>> for parametertype in subauxfiler.get_parametertypes(filename="file1"):
842
+ ... print(parametertype.__name__)
843
+ TGr
844
+ EQB
845
+ EQI1
846
+ """
847
+ return variabletools.sort_variables(
848
+ type_
849
+ for type_, filename2reference in self._type2filename2reference.items()
850
+ if (filename is None) or (filename in filename2reference)
851
+ )
852
+
853
+ def get_parameterstrings(
854
+ self,
855
+ filename: str | None = None,
856
+ parametertype: type[parametertools.Parameter] | None = None,
857
+ ) -> tuple[str, ...]:
858
+ """Return a |tuple| of string representations of all or a selection of the
859
+ handled parameter objects.
860
+
861
+ The following (slightly modified) test-setting stems from the documentation on
862
+ method |SubAuxfiler.add_parameter|:
863
+
864
+ >>> from hydpy.models.lland_dd import *
865
+ >>> parameterstep()
866
+ >>> nhru(4)
867
+ >>> lnk(ACKER, LAUBW, WASSER, ACKER)
868
+ >>> tgr(acker=2.0, laubw=1.0)
869
+ >>> eqb(5000.0)
870
+ >>> eqi1(2000.0)
871
+ >>> eqd1(100.0)
872
+
873
+ >>> from hydpy import Auxfiler
874
+ >>> auxfiler = Auxfiler(model)
875
+ >>> subauxfiler = auxfiler.lland_dd
876
+ >>> subauxfiler.add_parameters(eqb, eqi1, filename="file1")
877
+ >>> subauxfiler.add_parameter(
878
+ ... tgr, filename="file1", keywordarguments=tgr.keywordarguments)
879
+ >>> eqb *= 2.0
880
+ >>> subauxfiler.add_parameters(eqb, eqd1, filename="file2")
881
+
882
+ Without an argument, method |SubAuxfiler.get_parameterstrings| returns the
883
+ string representations of all registered parameter objects:
884
+
885
+ >>> for string in subauxfiler.get_parameterstrings():
886
+ ... print(string)
887
+ tgr(acker=2.0, laubw=1.0)
888
+ eqb(5000.0)
889
+ eqb(10000.0)
890
+ eqi1(2000.0)
891
+ eqd1(100.0)
892
+
893
+ For a given filename, method |SubAuxfiler.get_parameterstrings| returns only
894
+ the string representations of the registered parameter objects allocated for
895
+ this filename:
896
+
897
+ >>> for string in subauxfiler.get_parameterstrings(filename="file1"):
898
+ ... print(string)
899
+ tgr(acker=2.0, laubw=1.0)
900
+ eqb(5000.0)
901
+ eqi1(2000.0)
902
+
903
+ For a given parameter type, method |SubAuxfiler.get_parameterstrings| returns
904
+ only the string representations of the registered parameter objects of such a
905
+ type:
906
+
907
+ >>> for string in subauxfiler.get_parameterstrings(parametertype=type(eqb)):
908
+ ... print(string)
909
+ eqb(5000.0)
910
+ eqb(10000.0)
911
+
912
+ For a given filename and a given parameter type, method
913
+ |SubAuxfiler.get_parameterstrings| returns only the string representation of
914
+ the registered parameter object of such a type allocated by such a filename:
915
+
916
+ >>> subauxfiler.get_parameterstrings(filename="file1", parametertype=type(eqb))
917
+ ('eqb(5000.0)',)
918
+ """
919
+ strings: list[str] = []
920
+ for type_, fn2ref in variabletools.sort_variables(
921
+ self._type2filename2reference.items()
922
+ ):
923
+ for fn, ref in sorted(fn2ref.items()):
924
+ if parametertype in (None, type_) and filename in (None, fn):
925
+ if isinstance(ref, parametertools.KeywordArguments):
926
+ strings.append(
927
+ objecttools.apply_black(type_.__name__.lower(), **dict(ref))
928
+ )
929
+ else:
930
+ strings.append(repr(ref))
931
+ return tuple(strings)
932
+
933
+ def get_references(
934
+ self,
935
+ filename: str | None = None,
936
+ parametertype: type[parametertools.Parameter] | None = None,
937
+ ) -> tuple[Reference, ...]:
938
+ """Return a |tuple| of all or a selection of the reference parameter objects
939
+ or their related reference keyword arguments.
940
+
941
+ The following (slightly modified) test-setting stems from the documentation on
942
+ method |SubAuxfiler.add_parameter|:
943
+
944
+ >>> from hydpy.models.lland_dd import *
945
+ >>> parameterstep()
946
+ >>> nhru(4)
947
+ >>> lnk(ACKER, LAUBW, WASSER, ACKER)
948
+ >>> tgr(acker=2.0, laubw=1.0)
949
+ >>> eqb(5000.0)
950
+ >>> eqi1(2000.0)
951
+ >>> eqd1(100.0)
952
+
953
+ >>> from hydpy import Auxfiler
954
+ >>> auxfiler = Auxfiler(model)
955
+ >>> subauxfiler = auxfiler.lland_dd
956
+ >>> subauxfiler.add_parameters(eqb, eqi1, filename="file1")
957
+ >>> subauxfiler.add_parameter(
958
+ ... tgr, filename="file1", keywordarguments=tgr.keywordarguments)
959
+ >>> eqb *= 2.0
960
+ >>> subauxfiler.add_parameters(eqb, eqd1, filename="file2")
961
+
962
+ Despite returning the reference objects instead of parameter string
963
+ representations, method |SubAuxfiler.get_references| works precisely like
964
+ method |SubAuxfiler.get_parameterstrings|:
965
+
966
+ >>> for reference in subauxfiler.get_references():
967
+ ... print(reference)
968
+ KeywordArguments(acker=2.0, laubw=1.0)
969
+ eqb(5000.0)
970
+ eqb(10000.0)
971
+ eqi1(2000.0)
972
+ eqd1(100.0)
973
+
974
+ >>> for reference in subauxfiler.get_references(filename="file1"):
975
+ ... print(reference)
976
+ KeywordArguments(acker=2.0, laubw=1.0)
977
+ eqb(5000.0)
978
+ eqi1(2000.0)
979
+
980
+ >>> for reference in subauxfiler.get_references(parametertype=type(eqb)):
981
+ ... print(reference)
982
+ eqb(5000.0)
983
+ eqb(10000.0)
984
+
985
+ >>> subauxfiler.get_references(filename="file1", parametertype=type(eqb))
986
+ (eqb(5000.0),)
987
+ """
988
+ references: list[Reference] = []
989
+ for type_, fn2ref in variabletools.sort_variables(
990
+ self._type2filename2reference.items()
991
+ ):
992
+ for fn, ref in sorted(fn2ref.items()):
993
+ if parametertype in (None, type_) and filename in (None, fn):
994
+ references.append(ref)
995
+ return tuple(references)
996
+
997
+ def get_filename(self, parameter: parametertools.Parameter) -> str | None:
998
+ """If possible, return an auxiliary filename suitable for the given parameter
999
+ object.
1000
+
1001
+ The following (slightly modified) test-setting stems from the documentation on
1002
+ method |SubAuxfiler.add_parameter|:
1003
+
1004
+ >>> from hydpy.models.lland_dd import *
1005
+ >>> parameterstep()
1006
+ >>> nhru(4)
1007
+ >>> lnk(ACKER, LAUBW, WASSER, ACKER)
1008
+ >>> tgr(acker=2.0, laubw=1.0)
1009
+ >>> eqb(5000.0)
1010
+ >>> eqi1(2000.0)
1011
+ >>> eqd1(100.0)
1012
+
1013
+ >>> from hydpy import Auxfiler
1014
+ >>> auxfiler = Auxfiler(model)
1015
+ >>> subauxfiler = auxfiler.lland_dd
1016
+ >>> subauxfiler.add_parameters(eqb, eqi1, filename="file1")
1017
+ >>> subauxfiler.add_parameter(
1018
+ ... tgr, filename="file1", keywordarguments=tgr.keywordarguments)
1019
+ >>> eqb *= 2.0
1020
+ >>> subauxfiler.add_parameters(eqb, eqd1, filename="file2")
1021
+
1022
+ In simple cases, method |SubAuxfiler.get_filename| searches for an equal
1023
+ reference parameter object and returns the related auxiliary filename:
1024
+
1025
+ >>> subauxfiler.get_filename(eqb)
1026
+ 'file2'
1027
+ >>> eqb /= 2.0
1028
+ >>> subauxfiler.get_filename(eqb)
1029
+ 'file1'
1030
+
1031
+ If it cannot find an equal reference parameter, it returns |None|:
1032
+
1033
+ >>> eqb /= 2.0
1034
+ >>> subauxfiler.get_filename(eqb)
1035
+
1036
+ If a registered parameter object is associated with a |KeywordArguments| object
1037
+ (see the documentation on method |SubAuxfiler.add_parameter| on how to do this),
1038
+ |SubAuxfiler.get_filename| does not check for equality. Instead, it uses
1039
+ method |KeywordArguments.subset_of| to check if the keyword arguments of the
1040
+ given parameter are a subset of keyword arguments of the registered parameter:
1041
+
1042
+ >>> subauxfiler.get_filename(tgr)
1043
+ 'file1'
1044
+ >>> tgr(acker=2.0, laubw=0.0)
1045
+ >>> subauxfiler.get_filename(tgr)
1046
+
1047
+ As a result, auxiliary file `file1` is also considered suitable for a
1048
+ |lland_control.TGr| object related to land-use type |lland_constants.ACKER|
1049
+ (acre) only:
1050
+
1051
+ >>> lnk(ACKER)
1052
+ >>> tgr(acker=3.0)
1053
+ >>> subauxfiler.get_filename(tgr)
1054
+ >>> tgr(acker=2.0)
1055
+ >>> subauxfiler.get_filename(tgr)
1056
+ 'file1'
1057
+
1058
+ The above mechanism is convenient (and possibly even necessary to make writing
1059
+ auxiliary files feasible for many parameter types) but can lead to ambiguous
1060
+ situations. To demonstrate this, we register the currently relevant keyword
1061
+ arguments of parameter |lland_control.TGr|:
1062
+
1063
+ >>> subauxfiler.add_parameter(
1064
+ ... tgr, filename="file2", keywordarguments=tgr.keywordarguments)
1065
+
1066
+ Now, the keyword arguments of |lland_control.TGr| are a subset of both
1067
+ registered |KeywordArguments| objects:
1068
+
1069
+ >>> tgr.keywordarguments
1070
+ KeywordArguments(acker=2.0)
1071
+ >>> kwargs = subauxfiler.get_references(
1072
+ ... parametertype=type(tgr), filename="file1")[0]
1073
+ >>> kwargs
1074
+ KeywordArguments(acker=2.0, laubw=1.0)
1075
+ >>> tgr.keywordarguments.subset_of(kwargs)
1076
+ True
1077
+ >>> kwargs = subauxfiler.get_references(
1078
+ ... parametertype=type(tgr), filename="file2")[0]
1079
+ >>> kwargs
1080
+ KeywordArguments(acker=2.0)
1081
+ >>> tgr.keywordarguments.subset_of(kwargs)
1082
+ True
1083
+
1084
+ Method |SubAuxfiler.get_filename| emits a warning when it finds multiple
1085
+ suitable auxiliary files:
1086
+
1087
+ >>> subauxfiler.get_filename(tgr)
1088
+ Traceback (most recent call last):
1089
+ ...
1090
+ UserWarning: Parameter `tgr(2.0)` matches several auxiliary files: file1 and \
1091
+ file2
1092
+
1093
+ Nevertheless, it returns the first match (which might be confusing due to its
1094
+ arbitrariness but at least results in a working project configuration):
1095
+
1096
+ >>> import warnings
1097
+ >>> with warnings.catch_warnings() :
1098
+ ... warnings.filterwarnings("ignore")
1099
+ ... subauxfiler.get_filename(tgr)
1100
+ 'file1'
1101
+ """
1102
+ filenames = []
1103
+ filename2reference = self._type2filename2reference.get(type(parameter), {})
1104
+ for filename, reference in filename2reference.items():
1105
+ if (
1106
+ isinstance(reference, parametertools.KeywordArguments)
1107
+ and parameter.keywordarguments.subset_of(reference)
1108
+ ) or (parameter == reference):
1109
+ filenames.append(filename)
1110
+ if not filenames:
1111
+ return None
1112
+ if len(filenames) > 1:
1113
+ warnings.warn(
1114
+ f"Parameter `{parameter}` matches several auxiliary files: "
1115
+ f"{objecttools.enumeration(filenames)}"
1116
+ )
1117
+ return filenames[0]
1118
+
1119
+ def __getattr__(self, name: str) -> tuple[Reference, ...]:
1120
+ type2ref = {}
1121
+ for type_, fn2ref in self._type2filename2reference.items():
1122
+ if name == type_.name:
1123
+ return tuple(sorted(fn2ref.values(), key=str))
1124
+ if name in fn2ref:
1125
+ type2ref[type_] = fn2ref[name]
1126
+ if type2ref:
1127
+ return tuple(
1128
+ ref for type_, ref in variabletools.sort_variables(type2ref.items())
1129
+ )
1130
+ raise AttributeError(
1131
+ f"`{name}` is neither a filename nor a name of a parameter handled by the "
1132
+ f"actual `{type(self).__name__}` object."
1133
+ )
1134
+
1135
+ def __repr__(self) -> str:
1136
+ repr_ = objecttools.assignrepr_values(
1137
+ values=self.get_filenames(), prefix=f"{type(self).__name__}(", width=70
1138
+ )
1139
+ return f"{repr_})"
1140
+
1141
+ def __dir__(self) -> list[str]:
1142
+ """
1143
+ >>> from hydpy.models.lland_dd import *
1144
+ >>> parameterstep()
1145
+ >>> nhru(4)
1146
+ >>> lnk(ACKER, LAUBW, WASSER, ACKER)
1147
+ >>> tgr(acker=2.0, laubw=1.0)
1148
+ >>> eqb(5000.0)
1149
+ >>> eqi1(2000.0)
1150
+ >>> eqd1(100.0)
1151
+
1152
+ >>> from hydpy import Auxfiler
1153
+ >>> auxfiler = Auxfiler(model)
1154
+ >>> subauxfiler = auxfiler.lland_dd
1155
+ >>> subauxfiler.add_parameters(eqb, eqi1, filename="file1")
1156
+ >>> subauxfiler.add_parameter(
1157
+ ... tgr, filename="file1", keywordarguments=tgr.keywordarguments)
1158
+ >>> eqb *= 2.0
1159
+ >>> subauxfiler.add_parameters(eqb, eqd1, filename="file2")
1160
+
1161
+ >>> sorted(set(dir(subauxfiler)) - set(object.__dir__(subauxfiler)))
1162
+ ['eqb', 'eqd1', 'eqi1', 'file1', 'file2', 'tgr']
1163
+ """
1164
+ names = itertools.chain(
1165
+ cast(list[str], super().__dir__()),
1166
+ self.get_filenames(),
1167
+ (type_.__name__.lower() for type_ in self.get_parametertypes()),
1168
+ )
1169
+ return list(names)