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.
- hydpy/__init__.py +275 -0
- hydpy/aliases.py +2554 -0
- hydpy/auxs/__init__.py +0 -0
- hydpy/auxs/anntools.py +1305 -0
- hydpy/auxs/armatools.py +883 -0
- hydpy/auxs/calibtools.py +3337 -0
- hydpy/auxs/interptools.py +1094 -0
- hydpy/auxs/iuhtools.py +543 -0
- hydpy/auxs/networktools.py +597 -0
- hydpy/auxs/ppolytools.py +809 -0
- hydpy/auxs/quadtools.py +61 -0
- hydpy/auxs/roottools.py +228 -0
- hydpy/auxs/smoothtools.py +273 -0
- hydpy/auxs/statstools.py +2125 -0
- hydpy/auxs/validtools.py +81 -0
- hydpy/conf/HydPyConfigBase.xsd +68637 -0
- hydpy/conf/HydPyConfigBase.xsdt +358 -0
- hydpy/conf/HydPyConfigMultipleRuns.xsd +25 -0
- hydpy/conf/HydPyConfigSingleRun.xsd +24 -0
- hydpy/conf/__init__.py +0 -0
- hydpy/conf/a_coefficients_explicit_lobatto_sequence.npy +0 -0
- hydpy/conf/support_points_for_smoothpar_logistic2.npy +0 -0
- hydpy/config.py +42 -0
- hydpy/core/__init__.py +0 -0
- hydpy/core/aliastools.py +214 -0
- hydpy/core/autodoctools.py +1947 -0
- hydpy/core/auxfiletools.py +1169 -0
- hydpy/core/devicetools.py +3810 -0
- hydpy/core/exceptiontools.py +269 -0
- hydpy/core/filetools.py +1985 -0
- hydpy/core/hydpytools.py +3089 -0
- hydpy/core/importtools.py +1398 -0
- hydpy/core/indextools.py +345 -0
- hydpy/core/itemtools.py +1849 -0
- hydpy/core/masktools.py +460 -0
- hydpy/core/modeltools.py +4868 -0
- hydpy/core/netcdftools.py +2683 -0
- hydpy/core/objecttools.py +2023 -0
- hydpy/core/optiontools.py +1045 -0
- hydpy/core/parametertools.py +4674 -0
- hydpy/core/printtools.py +222 -0
- hydpy/core/propertytools.py +643 -0
- hydpy/core/pubtools.py +254 -0
- hydpy/core/selectiontools.py +1571 -0
- hydpy/core/sequencetools.py +4476 -0
- hydpy/core/seriestools.py +339 -0
- hydpy/core/testtools.py +2483 -0
- hydpy/core/timetools.py +3567 -0
- hydpy/core/typingtools.py +333 -0
- hydpy/core/variabletools.py +2615 -0
- hydpy/cythons/__init__.py +24 -0
- hydpy/cythons/annutils.pxd +33 -0
- hydpy/cythons/annutils.pyi +25 -0
- hydpy/cythons/annutils.pyx +120 -0
- hydpy/cythons/autogen/__init__.py +0 -0
- hydpy/cythons/autogen/annutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/annutils.pxd +42 -0
- hydpy/cythons/autogen/annutils.pyx +129 -0
- hydpy/cythons/autogen/c_arma.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_arma.pxd +179 -0
- hydpy/cythons/autogen/c_arma.pyx +356 -0
- hydpy/cythons/autogen/c_arma_rimorido.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_arma_rimorido.pxd +179 -0
- hydpy/cythons/autogen/c_arma_rimorido.pyx +356 -0
- hydpy/cythons/autogen/c_conv.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_conv.pxd +198 -0
- hydpy/cythons/autogen/c_conv.pyx +491 -0
- hydpy/cythons/autogen/c_conv_idw.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_conv_idw.pxd +124 -0
- hydpy/cythons/autogen/c_conv_idw.pyx +264 -0
- hydpy/cythons/autogen/c_conv_idw_ed.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_conv_idw_ed.pxd +197 -0
- hydpy/cythons/autogen/c_conv_idw_ed.pyx +481 -0
- hydpy/cythons/autogen/c_conv_nn.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_conv_nn.pxd +120 -0
- hydpy/cythons/autogen/c_conv_nn.pyx +224 -0
- hydpy/cythons/autogen/c_dam.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam.pxd +805 -0
- hydpy/cythons/autogen/c_dam.pyx +1477 -0
- hydpy/cythons/autogen/c_dam_llake.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_llake.pxd +364 -0
- hydpy/cythons/autogen/c_dam_llake.pyx +705 -0
- hydpy/cythons/autogen/c_dam_lreservoir.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_lreservoir.pxd +365 -0
- hydpy/cythons/autogen/c_dam_lreservoir.pyx +708 -0
- hydpy/cythons/autogen/c_dam_lretention.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_lretention.pxd +340 -0
- hydpy/cythons/autogen/c_dam_lretention.pyx +625 -0
- hydpy/cythons/autogen/c_dam_pump.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_pump.pxd +402 -0
- hydpy/cythons/autogen/c_dam_pump.pyx +724 -0
- hydpy/cythons/autogen/c_dam_pump_sluice.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_pump_sluice.pxd +452 -0
- hydpy/cythons/autogen/c_dam_pump_sluice.pyx +829 -0
- hydpy/cythons/autogen/c_dam_sluice.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_sluice.pxd +404 -0
- hydpy/cythons/autogen/c_dam_sluice.pyx +726 -0
- hydpy/cythons/autogen/c_dam_v001.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_v001.pxd +452 -0
- hydpy/cythons/autogen/c_dam_v001.pyx +816 -0
- hydpy/cythons/autogen/c_dam_v002.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_v002.pxd +394 -0
- hydpy/cythons/autogen/c_dam_v002.pyx +703 -0
- hydpy/cythons/autogen/c_dam_v003.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_v003.pxd +417 -0
- hydpy/cythons/autogen/c_dam_v003.pyx +744 -0
- hydpy/cythons/autogen/c_dam_v004.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_v004.pxd +486 -0
- hydpy/cythons/autogen/c_dam_v004.pyx +891 -0
- hydpy/cythons/autogen/c_dam_v005.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_v005.pxd +524 -0
- hydpy/cythons/autogen/c_dam_v005.pyx +928 -0
- hydpy/cythons/autogen/c_dummy.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dummy.pxd +151 -0
- hydpy/cythons/autogen/c_dummy.pyx +263 -0
- hydpy/cythons/autogen/c_dummy_interceptedwater.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dummy_interceptedwater.pxd +69 -0
- hydpy/cythons/autogen/c_dummy_interceptedwater.pyx +104 -0
- hydpy/cythons/autogen/c_dummy_node2node.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dummy_node2node.pxd +89 -0
- hydpy/cythons/autogen/c_dummy_node2node.pyx +148 -0
- hydpy/cythons/autogen/c_dummy_snowalbedo.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dummy_snowalbedo.pxd +69 -0
- hydpy/cythons/autogen/c_dummy_snowalbedo.pyx +104 -0
- hydpy/cythons/autogen/c_dummy_snowcover.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dummy_snowcover.pxd +69 -0
- hydpy/cythons/autogen/c_dummy_snowcover.pyx +104 -0
- hydpy/cythons/autogen/c_dummy_snowycanopy.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dummy_snowycanopy.pxd +69 -0
- hydpy/cythons/autogen/c_dummy_snowycanopy.pyx +104 -0
- hydpy/cythons/autogen/c_dummy_soilwater.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dummy_soilwater.pxd +69 -0
- hydpy/cythons/autogen/c_dummy_soilwater.pyx +104 -0
- hydpy/cythons/autogen/c_evap.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap.pxd +1029 -0
- hydpy/cythons/autogen/c_evap.pyx +2601 -0
- hydpy/cythons/autogen/c_evap_aet_hbv96.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_aet_hbv96.pxd +227 -0
- hydpy/cythons/autogen/c_evap_aet_hbv96.pyx +584 -0
- hydpy/cythons/autogen/c_evap_aet_minhas.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_aet_minhas.pxd +193 -0
- hydpy/cythons/autogen/c_evap_aet_minhas.pyx +478 -0
- hydpy/cythons/autogen/c_evap_aet_morsim.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_aet_morsim.pxd +681 -0
- hydpy/cythons/autogen/c_evap_aet_morsim.pyx +1642 -0
- hydpy/cythons/autogen/c_evap_pet_ambav1.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_pet_ambav1.pxd +532 -0
- hydpy/cythons/autogen/c_evap_pet_ambav1.pyx +1296 -0
- hydpy/cythons/autogen/c_evap_pet_hbv96.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_pet_hbv96.pxd +179 -0
- hydpy/cythons/autogen/c_evap_pet_hbv96.pyx +328 -0
- hydpy/cythons/autogen/c_evap_pet_m.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_pet_m.pxd +124 -0
- hydpy/cythons/autogen/c_evap_pet_m.pyx +214 -0
- hydpy/cythons/autogen/c_evap_pet_mlc.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_pet_mlc.pxd +126 -0
- hydpy/cythons/autogen/c_evap_pet_mlc.pyx +214 -0
- hydpy/cythons/autogen/c_evap_ret_fao56.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_ret_fao56.pxd +305 -0
- hydpy/cythons/autogen/c_evap_ret_fao56.pyx +624 -0
- hydpy/cythons/autogen/c_evap_ret_io.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_ret_io.pxd +112 -0
- hydpy/cythons/autogen/c_evap_ret_io.pyx +176 -0
- hydpy/cythons/autogen/c_evap_ret_tw2002.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_ret_tw2002.pxd +139 -0
- hydpy/cythons/autogen/c_evap_ret_tw2002.pyx +273 -0
- hydpy/cythons/autogen/c_exch.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_exch.pxd +230 -0
- hydpy/cythons/autogen/c_exch.pyx +462 -0
- hydpy/cythons/autogen/c_exch_branch_hbv96.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_exch_branch_hbv96.pxd +134 -0
- hydpy/cythons/autogen/c_exch_branch_hbv96.pyx +255 -0
- hydpy/cythons/autogen/c_exch_waterlevel.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_exch_waterlevel.pxd +54 -0
- hydpy/cythons/autogen/c_exch_waterlevel.pyx +78 -0
- hydpy/cythons/autogen/c_exch_weir_hbv96.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_exch_weir_hbv96.pxd +156 -0
- hydpy/cythons/autogen/c_exch_weir_hbv96.pyx +282 -0
- hydpy/cythons/autogen/c_ga.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_ga.pxd +353 -0
- hydpy/cythons/autogen/c_ga.pyx +1204 -0
- hydpy/cythons/autogen/c_ga_garto.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_ga_garto.pxd +330 -0
- hydpy/cythons/autogen/c_ga_garto.pyx +1105 -0
- hydpy/cythons/autogen/c_ga_garto_submodel1.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_ga_garto_submodel1.pxd +236 -0
- hydpy/cythons/autogen/c_ga_garto_submodel1.pyx +944 -0
- hydpy/cythons/autogen/c_gland.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_gland.pxd +437 -0
- hydpy/cythons/autogen/c_gland.pyx +726 -0
- hydpy/cythons/autogen/c_gland_gr4.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_gland_gr4.pxd +382 -0
- hydpy/cythons/autogen/c_gland_gr4.pyx +605 -0
- hydpy/cythons/autogen/c_gland_gr5.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_gland_gr5.pxd +368 -0
- hydpy/cythons/autogen/c_gland_gr5.pyx +568 -0
- hydpy/cythons/autogen/c_gland_gr6.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_gland_gr6.pxd +420 -0
- hydpy/cythons/autogen/c_gland_gr6.pyx +673 -0
- hydpy/cythons/autogen/c_hland.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_hland.pxd +855 -0
- hydpy/cythons/autogen/c_hland.pyx +2486 -0
- hydpy/cythons/autogen/c_hland_96.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_hland_96.pxd +631 -0
- hydpy/cythons/autogen/c_hland_96.pyx +1724 -0
- hydpy/cythons/autogen/c_hland_96c.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_hland_96c.pxd +621 -0
- hydpy/cythons/autogen/c_hland_96c.pyx +1822 -0
- hydpy/cythons/autogen/c_hland_96p.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_hland_96p.pxd +683 -0
- hydpy/cythons/autogen/c_hland_96p.pyx +1911 -0
- hydpy/cythons/autogen/c_kinw.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_kinw.pxd +509 -0
- hydpy/cythons/autogen/c_kinw.pyx +965 -0
- hydpy/cythons/autogen/c_kinw_williams.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_kinw_williams.pxd +409 -0
- hydpy/cythons/autogen/c_kinw_williams.pyx +763 -0
- hydpy/cythons/autogen/c_kinw_williams_ext.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_kinw_williams_ext.pxd +220 -0
- hydpy/cythons/autogen/c_kinw_williams_ext.pyx +440 -0
- hydpy/cythons/autogen/c_lland.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_lland.pxd +1386 -0
- hydpy/cythons/autogen/c_lland.pyx +3679 -0
- hydpy/cythons/autogen/c_lland_dd.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_lland_dd.pxd +679 -0
- hydpy/cythons/autogen/c_lland_dd.pyx +1719 -0
- hydpy/cythons/autogen/c_lland_knauf.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_lland_knauf.pxd +1096 -0
- hydpy/cythons/autogen/c_lland_knauf.pyx +2784 -0
- hydpy/cythons/autogen/c_lland_knauf_ic.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_lland_knauf_ic.pxd +1369 -0
- hydpy/cythons/autogen/c_lland_knauf_ic.pyx +3625 -0
- hydpy/cythons/autogen/c_meteo.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo.pxd +469 -0
- hydpy/cythons/autogen/c_meteo.pyx +879 -0
- hydpy/cythons/autogen/c_meteo_clear_glob_io.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_clear_glob_io.pxd +75 -0
- hydpy/cythons/autogen/c_meteo_clear_glob_io.pyx +107 -0
- hydpy/cythons/autogen/c_meteo_glob_fao56.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_glob_fao56.pxd +209 -0
- hydpy/cythons/autogen/c_meteo_glob_fao56.pyx +339 -0
- hydpy/cythons/autogen/c_meteo_glob_io.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_glob_io.pxd +63 -0
- hydpy/cythons/autogen/c_meteo_glob_io.pyx +91 -0
- hydpy/cythons/autogen/c_meteo_glob_morsim.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_glob_morsim.pxd +289 -0
- hydpy/cythons/autogen/c_meteo_glob_morsim.pyx +527 -0
- hydpy/cythons/autogen/c_meteo_precip_io.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_precip_io.pxd +112 -0
- hydpy/cythons/autogen/c_meteo_precip_io.pyx +176 -0
- hydpy/cythons/autogen/c_meteo_psun_sun_glob_io.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_psun_sun_glob_io.pxd +87 -0
- hydpy/cythons/autogen/c_meteo_psun_sun_glob_io.pyx +123 -0
- hydpy/cythons/autogen/c_meteo_sun_fao56.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_sun_fao56.pxd +209 -0
- hydpy/cythons/autogen/c_meteo_sun_fao56.pyx +343 -0
- hydpy/cythons/autogen/c_meteo_sun_morsim.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_sun_morsim.pxd +286 -0
- hydpy/cythons/autogen/c_meteo_sun_morsim.pyx +519 -0
- hydpy/cythons/autogen/c_meteo_temp_io.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_temp_io.pxd +112 -0
- hydpy/cythons/autogen/c_meteo_temp_io.pyx +176 -0
- hydpy/cythons/autogen/c_musk.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_musk.pxd +282 -0
- hydpy/cythons/autogen/c_musk.pyx +605 -0
- hydpy/cythons/autogen/c_musk_classic.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_musk_classic.pxd +138 -0
- hydpy/cythons/autogen/c_musk_classic.pyx +226 -0
- hydpy/cythons/autogen/c_musk_mct.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_musk_mct.pxd +282 -0
- hydpy/cythons/autogen/c_musk_mct.pyx +609 -0
- hydpy/cythons/autogen/c_rconc.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_rconc.pxd +119 -0
- hydpy/cythons/autogen/c_rconc.pyx +174 -0
- hydpy/cythons/autogen/c_rconc_nash.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_rconc_nash.pxd +111 -0
- hydpy/cythons/autogen/c_rconc_nash.pyx +185 -0
- hydpy/cythons/autogen/c_rconc_uh.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_rconc_uh.pxd +92 -0
- hydpy/cythons/autogen/c_rconc_uh.pyx +125 -0
- hydpy/cythons/autogen/c_sw1d.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d.pxd +511 -0
- hydpy/cythons/autogen/c_sw1d.pyx +1263 -0
- hydpy/cythons/autogen/c_sw1d_channel.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_channel.pxd +119 -0
- hydpy/cythons/autogen/c_sw1d_channel.pyx +300 -0
- hydpy/cythons/autogen/c_sw1d_gate_out.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_gate_out.pxd +240 -0
- hydpy/cythons/autogen/c_sw1d_gate_out.pyx +476 -0
- hydpy/cythons/autogen/c_sw1d_lias.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_lias.pxd +320 -0
- hydpy/cythons/autogen/c_sw1d_lias.pyx +619 -0
- hydpy/cythons/autogen/c_sw1d_lias_sluice.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_lias_sluice.pxd +325 -0
- hydpy/cythons/autogen/c_sw1d_lias_sluice.pyx +644 -0
- hydpy/cythons/autogen/c_sw1d_network.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_network.pxd +90 -0
- hydpy/cythons/autogen/c_sw1d_network.pyx +246 -0
- hydpy/cythons/autogen/c_sw1d_pump.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_pump.pxd +256 -0
- hydpy/cythons/autogen/c_sw1d_pump.pyx +502 -0
- hydpy/cythons/autogen/c_sw1d_q_in.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_q_in.pxd +224 -0
- hydpy/cythons/autogen/c_sw1d_q_in.pyx +383 -0
- hydpy/cythons/autogen/c_sw1d_q_out.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_q_out.pxd +224 -0
- hydpy/cythons/autogen/c_sw1d_q_out.pyx +383 -0
- hydpy/cythons/autogen/c_sw1d_storage.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_storage.pxd +193 -0
- hydpy/cythons/autogen/c_sw1d_storage.pyx +349 -0
- hydpy/cythons/autogen/c_sw1d_weir_out.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_weir_out.pxd +212 -0
- hydpy/cythons/autogen/c_sw1d_weir_out.pyx +404 -0
- hydpy/cythons/autogen/c_test.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_test.pxd +175 -0
- hydpy/cythons/autogen/c_test.pyx +348 -0
- hydpy/cythons/autogen/c_test_discontinous.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_test_discontinous.pxd +146 -0
- hydpy/cythons/autogen/c_test_discontinous.pyx +256 -0
- hydpy/cythons/autogen/c_test_stiff0d.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_test_stiff0d.pxd +146 -0
- hydpy/cythons/autogen/c_test_stiff0d.pyx +250 -0
- hydpy/cythons/autogen/c_test_stiff1d.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_test_stiff1d.pxd +145 -0
- hydpy/cythons/autogen/c_test_stiff1d.pyx +294 -0
- hydpy/cythons/autogen/c_whmod.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_whmod.pxd +482 -0
- hydpy/cythons/autogen/c_whmod.pyx +1156 -0
- hydpy/cythons/autogen/c_whmod_rural.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_whmod_rural.pxd +411 -0
- hydpy/cythons/autogen/c_whmod_rural.pyx +982 -0
- hydpy/cythons/autogen/c_whmod_urban.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_whmod_urban.pxd +482 -0
- hydpy/cythons/autogen/c_whmod_urban.pyx +1155 -0
- hydpy/cythons/autogen/c_wland.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_wland.pxd +842 -0
- hydpy/cythons/autogen/c_wland.pyx +1890 -0
- hydpy/cythons/autogen/c_wland_gd.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_wland_gd.pxd +829 -0
- hydpy/cythons/autogen/c_wland_gd.pyx +1847 -0
- hydpy/cythons/autogen/c_wland_wag.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_wland_wag.pxd +810 -0
- hydpy/cythons/autogen/c_wland_wag.pyx +1780 -0
- hydpy/cythons/autogen/c_wq.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_wq.pxd +275 -0
- hydpy/cythons/autogen/c_wq.pyx +652 -0
- hydpy/cythons/autogen/c_wq_trapeze.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_wq_trapeze.pxd +170 -0
- hydpy/cythons/autogen/c_wq_trapeze.pyx +400 -0
- hydpy/cythons/autogen/c_wq_trapeze_strickler.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_wq_trapeze_strickler.pxd +243 -0
- hydpy/cythons/autogen/c_wq_trapeze_strickler.pyx +578 -0
- hydpy/cythons/autogen/c_wq_walrus.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_wq_walrus.pxd +61 -0
- hydpy/cythons/autogen/c_wq_walrus.pyx +82 -0
- hydpy/cythons/autogen/configutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/configutils.pxd +17 -0
- hydpy/cythons/autogen/configutils.pyx +119 -0
- hydpy/cythons/autogen/interfaceutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/interfaceutils.pxd +31 -0
- hydpy/cythons/autogen/interfaceutils.pyx +82 -0
- hydpy/cythons/autogen/interputils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/interputils.pxd +42 -0
- hydpy/cythons/autogen/interputils.pyx +118 -0
- hydpy/cythons/autogen/masterinterface.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/masterinterface.pxd +153 -0
- hydpy/cythons/autogen/masterinterface.pyx +222 -0
- hydpy/cythons/autogen/pointerutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/pointerutils.pxd +31 -0
- hydpy/cythons/autogen/pointerutils.pyx +650 -0
- hydpy/cythons/autogen/ppolyutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/ppolyutils.pxd +35 -0
- hydpy/cythons/autogen/ppolyutils.pyx +59 -0
- hydpy/cythons/autogen/quadutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/quadutils.pxd +26 -0
- hydpy/cythons/autogen/quadutils.pyx +973 -0
- hydpy/cythons/autogen/rootutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/rootutils.pxd +28 -0
- hydpy/cythons/autogen/rootutils.pyx +109 -0
- hydpy/cythons/autogen/sequenceutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/sequenceutils.pxd +45 -0
- hydpy/cythons/autogen/sequenceutils.pyx +101 -0
- hydpy/cythons/autogen/smoothutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/smoothutils.pxd +29 -0
- hydpy/cythons/autogen/smoothutils.pyx +833 -0
- hydpy/cythons/configutils.pxd +8 -0
- hydpy/cythons/configutils.pyi +5 -0
- hydpy/cythons/configutils.pyx +110 -0
- hydpy/cythons/interfaceutils.pxd +22 -0
- hydpy/cythons/interfaceutils.pyi +15 -0
- hydpy/cythons/interfaceutils.pyx +73 -0
- hydpy/cythons/interputils.pxd +33 -0
- hydpy/cythons/interputils.pyi +32 -0
- hydpy/cythons/interputils.pyx +109 -0
- hydpy/cythons/modelutils.py +2990 -0
- hydpy/cythons/pointerutils.pxd +22 -0
- hydpy/cythons/pointerutils.pyi +89 -0
- hydpy/cythons/pointerutils.pyx +641 -0
- hydpy/cythons/ppolyutils.pxd +26 -0
- hydpy/cythons/ppolyutils.pyi +21 -0
- hydpy/cythons/ppolyutils.pyx +50 -0
- hydpy/cythons/quadutils.pxd +17 -0
- hydpy/cythons/quadutils.pyi +13 -0
- hydpy/cythons/quadutils.pyx +964 -0
- hydpy/cythons/rootutils.pxd +19 -0
- hydpy/cythons/rootutils.pyi +21 -0
- hydpy/cythons/rootutils.pyx +100 -0
- hydpy/cythons/sequenceutils.pxd +36 -0
- hydpy/cythons/sequenceutils.pyi +7 -0
- hydpy/cythons/sequenceutils.pyx +92 -0
- hydpy/cythons/smoothutils.pxd +20 -0
- hydpy/cythons/smoothutils.pyi +15 -0
- hydpy/cythons/smoothutils.pyx +824 -0
- hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/land_dill_assl.py +13 -0
- hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/land_lahn_kalk.py +13 -0
- hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/land_lahn_leun.py +14 -0
- hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/land_lahn_marb.py +13 -0
- hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/stream_dill_assl_lahn_leun.py +5 -0
- hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/stream_lahn_leun_lahn_kalk.py +5 -0
- hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/stream_lahn_marb_lahn_leun.py +5 -0
- hydpy/data/HydPy-H-Lahn/control/default/land.py +9 -0
- hydpy/data/HydPy-H-Lahn/control/default/land_dill_assl.py +57 -0
- hydpy/data/HydPy-H-Lahn/control/default/land_lahn_kalk.py +57 -0
- hydpy/data/HydPy-H-Lahn/control/default/land_lahn_leun.py +56 -0
- hydpy/data/HydPy-H-Lahn/control/default/land_lahn_marb.py +57 -0
- hydpy/data/HydPy-H-Lahn/control/default/stream_dill_assl_lahn_leun.py +7 -0
- hydpy/data/HydPy-H-Lahn/control/default/stream_lahn_leun_lahn_kalk.py +7 -0
- hydpy/data/HydPy-H-Lahn/control/default/stream_lahn_marb_lahn_leun.py +7 -0
- hydpy/data/HydPy-H-Lahn/multiple_runs.xml +309 -0
- hydpy/data/HydPy-H-Lahn/multiple_runs_alpha.xml +71 -0
- hydpy/data/HydPy-H-Lahn/network/default/headwaters.py +11 -0
- hydpy/data/HydPy-H-Lahn/network/default/nonheadwaters.py +11 -0
- hydpy/data/HydPy-H-Lahn/network/default/streams.py +8 -0
- hydpy/data/HydPy-H-Lahn/series/default/dill_assl_obs_q.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/evap_pet_hbv96_input_normalairtemperature.nc +0 -0
- hydpy/data/HydPy-H-Lahn/series/default/evap_pet_hbv96_input_normalevapotranspiration.nc +0 -0
- hydpy/data/HydPy-H-Lahn/series/default/hland_96_input_p.nc +0 -0
- hydpy/data/HydPy-H-Lahn/series/default/hland_96_input_t.nc +0 -0
- hydpy/data/HydPy-H-Lahn/series/default/lahn_kalk_obs_q.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/lahn_leun_obs_q.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/lahn_marb_obs_q.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_dill_assl_evap_pet_hbv96_input_normalairtemperature.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_dill_assl_evap_pet_hbv96_input_normalevapotranspiration.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_dill_assl_hland_96_input_p.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_dill_assl_hland_96_input_t.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_kalk_evap_pet_hbv96_input_normalairtemperature.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_kalk_evap_pet_hbv96_input_normalevapotranspiration.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_kalk_hland_96_input_p.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_kalk_hland_96_input_t.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_leun_evap_pet_hbv96_input_normalairtemperature.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_leun_evap_pet_hbv96_input_normalevapotranspiration.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_leun_hland_96_input_p.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_leun_hland_96_input_t.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_marb_evap_pet_hbv96_input_normalairtemperature.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_marb_evap_pet_hbv96_input_normalevapotranspiration.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_marb_hland_96_input_p.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_marb_hland_96_input_t.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/obs_q.nc +0 -0
- hydpy/data/HydPy-H-Lahn/single_run.xml +152 -0
- hydpy/data/HydPy-H-Lahn/single_run.xmlt +143 -0
- hydpy/data/__init__.py +17 -0
- hydpy/docs/__init__.py +0 -0
- hydpy/docs/autofigs/__init__.py +0 -0
- hydpy/docs/bib/__init__.py +0 -0
- hydpy/docs/bib/refs.bib +566 -0
- hydpy/docs/combine_docversions.py +133 -0
- hydpy/docs/draw_model_sketches.py +1301 -0
- hydpy/docs/enable_autodoc.py +7 -0
- hydpy/docs/figs/HydPy-G-GR4.png +0 -0
- hydpy/docs/figs/HydPy-G-GR5.png +0 -0
- hydpy/docs/figs/HydPy-G-GR6.png +0 -0
- hydpy/docs/figs/HydPy-H-HBV96-COSERO.png +0 -0
- hydpy/docs/figs/HydPy-H-HBV96-PREVAH.png +0 -0
- hydpy/docs/figs/HydPy-H-HBV96.png +0 -0
- hydpy/docs/figs/HydPy-H-Lahn.png +0 -0
- hydpy/docs/figs/HydPy-KinW-Williams.png +0 -0
- hydpy/docs/figs/HydPy-L-DD.png +0 -0
- hydpy/docs/figs/HydPy-W-Wag.png +0 -0
- hydpy/docs/figs/HydPy_Logo.png +0 -0
- hydpy/docs/figs/HydPy_Logo_Text.png +0 -0
- hydpy/docs/figs/IDLE-editor.png +0 -0
- hydpy/docs/figs/IDLE-shell.png +0 -0
- hydpy/docs/figs/LAWA_river-basin-bumbers.png +0 -0
- hydpy/docs/figs/__init__.py +0 -0
- hydpy/docs/html_/__init__.py +0 -0
- hydpy/docs/polish_html.py +57 -0
- hydpy/docs/prepare.py +224 -0
- hydpy/docs/publish_docs.py +53 -0
- hydpy/docs/rst/HydPy-ARMA.rst +27 -0
- hydpy/docs/rst/HydPy-Conv.rst +22 -0
- hydpy/docs/rst/HydPy-Dam.rst +79 -0
- hydpy/docs/rst/HydPy-Dummy.rst +21 -0
- hydpy/docs/rst/HydPy-Evap.rst +26 -0
- hydpy/docs/rst/HydPy-Exch.rst +36 -0
- hydpy/docs/rst/HydPy-G.rst +40 -0
- hydpy/docs/rst/HydPy-GA.rst +34 -0
- hydpy/docs/rst/HydPy-H.rst +24 -0
- hydpy/docs/rst/HydPy-KinW.rst +32 -0
- hydpy/docs/rst/HydPy-L.rst +42 -0
- hydpy/docs/rst/HydPy-Meteo.rst +28 -0
- hydpy/docs/rst/HydPy-Musk.rst +21 -0
- hydpy/docs/rst/HydPy-Rconc.rst +17 -0
- hydpy/docs/rst/HydPy-SW1D.rst +49 -0
- hydpy/docs/rst/HydPy-Test.rst +19 -0
- hydpy/docs/rst/HydPy-W.rst +20 -0
- hydpy/docs/rst/HydPy-WHMod.rst +19 -0
- hydpy/docs/rst/HydPy-WQ.rst +20 -0
- hydpy/docs/rst/__init__.py +0 -0
- hydpy/docs/rst/additional_repositories.rst +40 -0
- hydpy/docs/rst/auxiliaries.rst +31 -0
- hydpy/docs/rst/continuous_integration.rst +75 -0
- hydpy/docs/rst/core.rst +75 -0
- hydpy/docs/rst/cythons.rst +47 -0
- hydpy/docs/rst/definitions.rst +506 -0
- hydpy/docs/rst/developer_guide.rst +54 -0
- hydpy/docs/rst/example_projects.rst +40 -0
- hydpy/docs/rst/execution.rst +22 -0
- hydpy/docs/rst/framework_tools.rst +56 -0
- hydpy/docs/rst/how_to_read_the_reference_manual.rst +156 -0
- hydpy/docs/rst/hydpydependencies.rst +55 -0
- hydpy/docs/rst/index.rst +125 -0
- hydpy/docs/rst/installation.rst +155 -0
- hydpy/docs/rst/model_families.rst +79 -0
- hydpy/docs/rst/model_overview.rst +291 -0
- hydpy/docs/rst/modelimports.rst +10 -0
- hydpy/docs/rst/options.rst +119 -0
- hydpy/docs/rst/programming_style.rst +572 -0
- hydpy/docs/rst/project_structure.rst +520 -0
- hydpy/docs/rst/quickstart.rst +304 -0
- hydpy/docs/rst/reference_manual.rst +29 -0
- hydpy/docs/rst/required_tools.rst +50 -0
- hydpy/docs/rst/simulation.rst +514 -0
- hydpy/docs/rst/submodel_interfaces.rst +32 -0
- hydpy/docs/rst/tests_and_documentation.rst +85 -0
- hydpy/docs/rst/user_guide.rst +38 -0
- hydpy/docs/rst/version_control.rst +116 -0
- hydpy/docs/rst/zbibliography.rst +8 -0
- hydpy/docs/sphinx/__init__.py +0 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/changes/frameset.html +11 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/changes/rstsource.html +15 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/changes/versionchanges.html +33 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/defindex.html +35 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/domainindex.html +56 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/genindex-single.html +63 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/genindex-split.html +41 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/genindex.html +76 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/globaltoc.html +11 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/layout.html +221 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/localtoc.html +15 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/opensearch.xml +13 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/page.html +13 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/relations.html +23 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/search.html +65 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/searchbox.html +21 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/searchfield.html +23 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/sourcelink.html +18 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/basic.css_t +925 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/doctools.js +156 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/documentation_options.js_t +13 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/file.png +0 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/language_data.js_t +26 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/minus.png +0 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/plus.png +0 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/searchtools.js +574 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/sphinx_highlight.js +154 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/theme.conf +16 -0
- hydpy/docs/sphinx/_themes/classic_hydpy/layout.html +23 -0
- hydpy/docs/sphinx/_themes/classic_hydpy/static/classic.css_t +358 -0
- hydpy/docs/sphinx/_themes/classic_hydpy/static/sidebar.js_t +72 -0
- hydpy/docs/sphinx/_themes/classic_hydpy/theme.conf +32 -0
- hydpy/docs/sphinx/conf.py +398 -0
- hydpy/docs/sphinx/defaultlinks_extension.py +36 -0
- hydpy/docs/sphinx/integrationtest_extension.py +104 -0
- hydpy/docs/sphinx/projectstructure_extension.py +58 -0
- hydpy/docs/sphinx/submodelgraph_extension.py +53 -0
- hydpy/exe/__init__.py +0 -0
- hydpy/exe/commandtools.py +651 -0
- hydpy/exe/hyd.py +277 -0
- hydpy/exe/modelimports.py +41 -0
- hydpy/exe/replacetools.py +216 -0
- hydpy/exe/servertools.py +2348 -0
- hydpy/exe/xmltools.py +3280 -0
- hydpy/interfaces/__init__.py +0 -0
- hydpy/interfaces/aetinterfaces.py +94 -0
- hydpy/interfaces/dischargeinterfaces.py +45 -0
- hydpy/interfaces/petinterfaces.py +117 -0
- hydpy/interfaces/precipinterfaces.py +42 -0
- hydpy/interfaces/radiationinterfaces.py +79 -0
- hydpy/interfaces/rconcinterfaces.py +30 -0
- hydpy/interfaces/routinginterfaces.py +324 -0
- hydpy/interfaces/soilinterfaces.py +96 -0
- hydpy/interfaces/stateinterfaces.py +98 -0
- hydpy/interfaces/tempinterfaces.py +46 -0
- hydpy/models/__init__.py +0 -0
- hydpy/models/arma/__init__.py +14 -0
- hydpy/models/arma/arma_control.py +383 -0
- hydpy/models/arma/arma_derived.py +204 -0
- hydpy/models/arma/arma_fluxes.py +41 -0
- hydpy/models/arma/arma_inlets.py +11 -0
- hydpy/models/arma/arma_logs.py +19 -0
- hydpy/models/arma/arma_model.py +461 -0
- hydpy/models/arma/arma_outlets.py +11 -0
- hydpy/models/arma_rimorido.py +381 -0
- hydpy/models/conv/__init__.py +12 -0
- hydpy/models/conv/conv_control.py +303 -0
- hydpy/models/conv/conv_derived.py +271 -0
- hydpy/models/conv/conv_fluxes.py +54 -0
- hydpy/models/conv/conv_inlets.py +11 -0
- hydpy/models/conv/conv_model.py +687 -0
- hydpy/models/conv/conv_outlets.py +11 -0
- hydpy/models/conv_idw.py +120 -0
- hydpy/models/conv_idw_ed.py +184 -0
- hydpy/models/conv_nn.py +112 -0
- hydpy/models/dam/__init__.py +16 -0
- hydpy/models/dam/dam_aides.py +17 -0
- hydpy/models/dam/dam_control.py +346 -0
- hydpy/models/dam/dam_derived.py +559 -0
- hydpy/models/dam/dam_factors.py +46 -0
- hydpy/models/dam/dam_fluxes.py +179 -0
- hydpy/models/dam/dam_inlets.py +29 -0
- hydpy/models/dam/dam_logs.py +52 -0
- hydpy/models/dam/dam_model.py +5011 -0
- hydpy/models/dam/dam_outlets.py +23 -0
- hydpy/models/dam/dam_receivers.py +41 -0
- hydpy/models/dam/dam_senders.py +23 -0
- hydpy/models/dam/dam_solver.py +75 -0
- hydpy/models/dam/dam_states.py +11 -0
- hydpy/models/dam_llake.py +499 -0
- hydpy/models/dam_lreservoir.py +548 -0
- hydpy/models/dam_lretention.py +343 -0
- hydpy/models/dam_pump.py +278 -0
- hydpy/models/dam_pump_sluice.py +339 -0
- hydpy/models/dam_sluice.py +319 -0
- hydpy/models/dam_v001.py +1127 -0
- hydpy/models/dam_v002.py +381 -0
- hydpy/models/dam_v003.py +422 -0
- hydpy/models/dam_v004.py +665 -0
- hydpy/models/dam_v005.py +479 -0
- hydpy/models/dummy/__init__.py +15 -0
- hydpy/models/dummy/dummy_control.py +22 -0
- hydpy/models/dummy/dummy_fluxes.py +11 -0
- hydpy/models/dummy/dummy_inlets.py +11 -0
- hydpy/models/dummy/dummy_inputs.py +41 -0
- hydpy/models/dummy/dummy_model.py +196 -0
- hydpy/models/dummy/dummy_outlets.py +11 -0
- hydpy/models/dummy_interceptedwater.py +85 -0
- hydpy/models/dummy_node2node.py +83 -0
- hydpy/models/dummy_snowalbedo.py +84 -0
- hydpy/models/dummy_snowcover.py +84 -0
- hydpy/models/dummy_snowycanopy.py +86 -0
- hydpy/models/dummy_soilwater.py +85 -0
- hydpy/models/evap/__init__.py +13 -0
- hydpy/models/evap/evap_control.py +354 -0
- hydpy/models/evap/evap_derived.py +236 -0
- hydpy/models/evap/evap_factors.py +188 -0
- hydpy/models/evap/evap_fixed.py +68 -0
- hydpy/models/evap/evap_fluxes.py +150 -0
- hydpy/models/evap/evap_inputs.py +54 -0
- hydpy/models/evap/evap_logs.py +91 -0
- hydpy/models/evap/evap_masks.py +48 -0
- hydpy/models/evap/evap_model.py +9170 -0
- hydpy/models/evap/evap_parameters.py +149 -0
- hydpy/models/evap/evap_sequences.py +32 -0
- hydpy/models/evap/evap_states.py +18 -0
- hydpy/models/evap_aet_hbv96.py +372 -0
- hydpy/models/evap_aet_minhas.py +331 -0
- hydpy/models/evap_aet_morsim.py +627 -0
- hydpy/models/evap_pet_ambav1.py +483 -0
- hydpy/models/evap_pet_hbv96.py +147 -0
- hydpy/models/evap_pet_m.py +94 -0
- hydpy/models/evap_pet_mlc.py +107 -0
- hydpy/models/evap_ret_fao56.py +265 -0
- hydpy/models/evap_ret_io.py +74 -0
- hydpy/models/evap_ret_tw2002.py +165 -0
- hydpy/models/exch/__init__.py +14 -0
- hydpy/models/exch/exch_control.py +262 -0
- hydpy/models/exch/exch_derived.py +36 -0
- hydpy/models/exch/exch_factors.py +26 -0
- hydpy/models/exch/exch_fluxes.py +48 -0
- hydpy/models/exch/exch_inlets.py +11 -0
- hydpy/models/exch/exch_logs.py +12 -0
- hydpy/models/exch/exch_model.py +451 -0
- hydpy/models/exch/exch_outlets.py +17 -0
- hydpy/models/exch/exch_receivers.py +17 -0
- hydpy/models/exch_branch_hbv96.py +186 -0
- hydpy/models/exch_waterlevel.py +73 -0
- hydpy/models/exch_weir_hbv96.py +609 -0
- hydpy/models/ga/__init__.py +14 -0
- hydpy/models/ga/ga_aides.py +17 -0
- hydpy/models/ga/ga_control.py +208 -0
- hydpy/models/ga/ga_derived.py +77 -0
- hydpy/models/ga/ga_fluxes.py +83 -0
- hydpy/models/ga/ga_inputs.py +26 -0
- hydpy/models/ga/ga_logs.py +17 -0
- hydpy/models/ga/ga_model.py +2952 -0
- hydpy/models/ga/ga_states.py +87 -0
- hydpy/models/ga_garto.py +1001 -0
- hydpy/models/ga_garto_submodel1.py +79 -0
- hydpy/models/gland/__init__.py +14 -0
- hydpy/models/gland/gland_control.py +90 -0
- hydpy/models/gland/gland_derived.py +113 -0
- hydpy/models/gland/gland_fluxes.py +137 -0
- hydpy/models/gland/gland_inputs.py +12 -0
- hydpy/models/gland/gland_model.py +1439 -0
- hydpy/models/gland/gland_outlets.py +11 -0
- hydpy/models/gland/gland_states.py +90 -0
- hydpy/models/gland_gr4.py +501 -0
- hydpy/models/gland_gr5.py +463 -0
- hydpy/models/gland_gr6.py +487 -0
- hydpy/models/hland/__init__.py +20 -0
- hydpy/models/hland/hland_aides.py +19 -0
- hydpy/models/hland/hland_constants.py +37 -0
- hydpy/models/hland/hland_control.py +1530 -0
- hydpy/models/hland/hland_derived.py +683 -0
- hydpy/models/hland/hland_factors.py +57 -0
- hydpy/models/hland/hland_fixed.py +42 -0
- hydpy/models/hland/hland_fluxes.py +279 -0
- hydpy/models/hland/hland_inputs.py +19 -0
- hydpy/models/hland/hland_masks.py +107 -0
- hydpy/models/hland/hland_model.py +4664 -0
- hydpy/models/hland/hland_outlets.py +11 -0
- hydpy/models/hland/hland_parameters.py +227 -0
- hydpy/models/hland/hland_sequences.py +382 -0
- hydpy/models/hland/hland_states.py +236 -0
- hydpy/models/hland_96.py +1812 -0
- hydpy/models/hland_96c.py +1196 -0
- hydpy/models/hland_96p.py +1204 -0
- hydpy/models/kinw/__init__.py +18 -0
- hydpy/models/kinw/kinw_aides.py +306 -0
- hydpy/models/kinw/kinw_control.py +270 -0
- hydpy/models/kinw/kinw_derived.py +197 -0
- hydpy/models/kinw/kinw_fixed.py +33 -0
- hydpy/models/kinw/kinw_fluxes.py +37 -0
- hydpy/models/kinw/kinw_inlets.py +11 -0
- hydpy/models/kinw/kinw_model.py +3026 -0
- hydpy/models/kinw/kinw_outlets.py +11 -0
- hydpy/models/kinw/kinw_solver.py +45 -0
- hydpy/models/kinw/kinw_states.py +17 -0
- hydpy/models/kinw_williams.py +1299 -0
- hydpy/models/kinw_williams_ext.py +768 -0
- hydpy/models/lland/__init__.py +42 -0
- hydpy/models/lland/lland_aides.py +38 -0
- hydpy/models/lland/lland_constants.py +88 -0
- hydpy/models/lland/lland_control.py +1329 -0
- hydpy/models/lland/lland_derived.py +380 -0
- hydpy/models/lland/lland_factors.py +18 -0
- hydpy/models/lland/lland_fixed.py +128 -0
- hydpy/models/lland/lland_fluxes.py +626 -0
- hydpy/models/lland/lland_inlets.py +12 -0
- hydpy/models/lland/lland_inputs.py +33 -0
- hydpy/models/lland/lland_logs.py +17 -0
- hydpy/models/lland/lland_masks.py +212 -0
- hydpy/models/lland/lland_model.py +7690 -0
- hydpy/models/lland/lland_outlets.py +12 -0
- hydpy/models/lland/lland_parameters.py +195 -0
- hydpy/models/lland/lland_sequences.py +67 -0
- hydpy/models/lland/lland_states.py +280 -0
- hydpy/models/lland_dd.py +2270 -0
- hydpy/models/lland_knauf.py +2156 -0
- hydpy/models/lland_knauf_ic.py +1920 -0
- hydpy/models/meteo/__init__.py +12 -0
- hydpy/models/meteo/meteo_control.py +154 -0
- hydpy/models/meteo/meteo_derived.py +159 -0
- hydpy/models/meteo/meteo_factors.py +88 -0
- hydpy/models/meteo/meteo_fixed.py +19 -0
- hydpy/models/meteo/meteo_fluxes.py +46 -0
- hydpy/models/meteo/meteo_inputs.py +47 -0
- hydpy/models/meteo/meteo_logs.py +30 -0
- hydpy/models/meteo/meteo_model.py +2904 -0
- hydpy/models/meteo/meteo_parameters.py +14 -0
- hydpy/models/meteo/meteo_sequences.py +22 -0
- hydpy/models/meteo_clear_glob_io.py +77 -0
- hydpy/models/meteo_glob_fao56.py +217 -0
- hydpy/models/meteo_glob_io.py +68 -0
- hydpy/models/meteo_glob_morsim.py +444 -0
- hydpy/models/meteo_precip_io.py +76 -0
- hydpy/models/meteo_psun_sun_glob_io.py +83 -0
- hydpy/models/meteo_sun_fao56.py +188 -0
- hydpy/models/meteo_sun_morsim.py +466 -0
- hydpy/models/meteo_temp_io.py +76 -0
- hydpy/models/musk/__init__.py +15 -0
- hydpy/models/musk/musk_control.py +328 -0
- hydpy/models/musk/musk_derived.py +32 -0
- hydpy/models/musk/musk_factors.py +53 -0
- hydpy/models/musk/musk_fluxes.py +24 -0
- hydpy/models/musk/musk_inlets.py +11 -0
- hydpy/models/musk/musk_masks.py +15 -0
- hydpy/models/musk/musk_model.py +838 -0
- hydpy/models/musk/musk_outlets.py +11 -0
- hydpy/models/musk/musk_sequences.py +88 -0
- hydpy/models/musk/musk_solver.py +68 -0
- hydpy/models/musk/musk_states.py +64 -0
- hydpy/models/musk_classic.py +228 -0
- hydpy/models/musk_mct.py +1247 -0
- hydpy/models/rconc/__init__.py +12 -0
- hydpy/models/rconc/rconc_control.py +473 -0
- hydpy/models/rconc/rconc_derived.py +76 -0
- hydpy/models/rconc/rconc_fluxes.py +19 -0
- hydpy/models/rconc/rconc_logs.py +74 -0
- hydpy/models/rconc/rconc_model.py +260 -0
- hydpy/models/rconc/rconc_states.py +11 -0
- hydpy/models/rconc_nash.py +48 -0
- hydpy/models/rconc_uh.py +53 -0
- hydpy/models/sw1d/__init__.py +17 -0
- hydpy/models/sw1d/sw1d_control.py +356 -0
- hydpy/models/sw1d/sw1d_derived.py +85 -0
- hydpy/models/sw1d/sw1d_factors.py +78 -0
- hydpy/models/sw1d/sw1d_fixed.py +12 -0
- hydpy/models/sw1d/sw1d_fluxes.py +55 -0
- hydpy/models/sw1d/sw1d_inlets.py +17 -0
- hydpy/models/sw1d/sw1d_model.py +3385 -0
- hydpy/models/sw1d/sw1d_outlets.py +11 -0
- hydpy/models/sw1d/sw1d_receivers.py +11 -0
- hydpy/models/sw1d/sw1d_senders.py +11 -0
- hydpy/models/sw1d/sw1d_states.py +23 -0
- hydpy/models/sw1d_channel.py +2051 -0
- hydpy/models/sw1d_gate_out.py +599 -0
- hydpy/models/sw1d_lias.py +105 -0
- hydpy/models/sw1d_lias_sluice.py +531 -0
- hydpy/models/sw1d_network.py +1219 -0
- hydpy/models/sw1d_pump.py +448 -0
- hydpy/models/sw1d_q_in.py +79 -0
- hydpy/models/sw1d_q_out.py +81 -0
- hydpy/models/sw1d_storage.py +78 -0
- hydpy/models/sw1d_weir_out.py +75 -0
- hydpy/models/test/__init__.py +14 -0
- hydpy/models/test/test_control.py +28 -0
- hydpy/models/test/test_fluxes.py +17 -0
- hydpy/models/test/test_model.py +201 -0
- hydpy/models/test/test_solver.py +48 -0
- hydpy/models/test/test_states.py +17 -0
- hydpy/models/test_discontinous.py +46 -0
- hydpy/models/test_stiff0d.py +47 -0
- hydpy/models/test_stiff1d.py +42 -0
- hydpy/models/whmod/__init__.py +21 -0
- hydpy/models/whmod/whmod_constants.py +77 -0
- hydpy/models/whmod/whmod_control.py +333 -0
- hydpy/models/whmod/whmod_derived.py +210 -0
- hydpy/models/whmod/whmod_factors.py +9 -0
- hydpy/models/whmod/whmod_fluxes.py +105 -0
- hydpy/models/whmod/whmod_inputs.py +15 -0
- hydpy/models/whmod/whmod_masks.py +178 -0
- hydpy/models/whmod/whmod_model.py +2091 -0
- hydpy/models/whmod/whmod_parameters.py +155 -0
- hydpy/models/whmod/whmod_sequences.py +193 -0
- hydpy/models/whmod/whmod_states.py +73 -0
- hydpy/models/whmod_rural.py +794 -0
- hydpy/models/whmod_urban.py +1011 -0
- hydpy/models/wland/__init__.py +43 -0
- hydpy/models/wland/wland_aides.py +55 -0
- hydpy/models/wland/wland_constants.py +103 -0
- hydpy/models/wland/wland_control.py +508 -0
- hydpy/models/wland/wland_derived.py +330 -0
- hydpy/models/wland/wland_factors.py +11 -0
- hydpy/models/wland/wland_fixed.py +12 -0
- hydpy/models/wland/wland_fluxes.py +166 -0
- hydpy/models/wland/wland_inputs.py +33 -0
- hydpy/models/wland/wland_masks.py +54 -0
- hydpy/models/wland/wland_model.py +3755 -0
- hydpy/models/wland/wland_outlets.py +11 -0
- hydpy/models/wland/wland_parameters.py +214 -0
- hydpy/models/wland/wland_sequences.py +108 -0
- hydpy/models/wland/wland_solver.py +45 -0
- hydpy/models/wland/wland_states.py +56 -0
- hydpy/models/wland_gd.py +888 -0
- hydpy/models/wland_wag.py +1244 -0
- hydpy/models/wq/__init__.py +14 -0
- hydpy/models/wq/wq_control.py +117 -0
- hydpy/models/wq/wq_derived.py +182 -0
- hydpy/models/wq/wq_factors.py +79 -0
- hydpy/models/wq/wq_fluxes.py +17 -0
- hydpy/models/wq/wq_model.py +1889 -0
- hydpy/models/wq_trapeze.py +168 -0
- hydpy/models/wq_trapeze_strickler.py +101 -0
- hydpy/models/wq_walrus.py +57 -0
- hydpy/py.typed +0 -0
- hydpy/tests/.coveragerc +22 -0
- hydpy/tests/__init__.py +0 -0
- hydpy/tests/check_consistency.py +32 -0
- hydpy/tests/hydpydoctestcustomize.pth +1 -0
- hydpy/tests/hydpydoctestcustomize.py +15 -0
- hydpy/tests/iotesting/__init__.py +0 -0
- hydpy/tests/run_doctests.py +233 -0
- hydpy-6.2.dev1.data/scripts/hyd.py +277 -0
- hydpy-6.2.dev1.dist-info/LICENSE +165 -0
- hydpy-6.2.dev1.dist-info/METADATA +163 -0
- hydpy-6.2.dev1.dist-info/RECORD +890 -0
- hydpy-6.2.dev1.dist-info/WHEEL +5 -0
- hydpy-6.2.dev1.dist-info/licenses_hydpy_installer.txt +42 -0
- hydpy-6.2.dev1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,514 @@
|
|
|
1
|
+
|
|
2
|
+
.. _OpenDA: http://openda.org/
|
|
3
|
+
.. _xmlschema: https://pypi.org/project/xmlschema/
|
|
4
|
+
|
|
5
|
+
.. _simulation:
|
|
6
|
+
|
|
7
|
+
Simulation
|
|
8
|
+
==========
|
|
9
|
+
|
|
10
|
+
This section explains the basic principles of configuring a simulation run via Python
|
|
11
|
+
scripts or XML files. The focus lies on the more central methods, especially those
|
|
12
|
+
provided by the class |HydPy|.
|
|
13
|
+
|
|
14
|
+
.. _simulation_python:
|
|
15
|
+
|
|
16
|
+
Python
|
|
17
|
+
______
|
|
18
|
+
|
|
19
|
+
The :ref:`Quick Start's <quickstart>` :ref:`run_hydpy` section demonstrates the
|
|
20
|
+
straightest way to perform a simulation via the Python shell or a Python script without
|
|
21
|
+
deviating from any default settings. Here, we split the procedure into smaller steps
|
|
22
|
+
to discuss more details about using a project's data to set a HydPy instance in a
|
|
23
|
+
simulation-ready state. Also, we give some first ideas about possible modifications
|
|
24
|
+
and ways to save simulation results.
|
|
25
|
+
|
|
26
|
+
Please unzip the :ref:`HydPy-H-Lahn` example project into your preferred working
|
|
27
|
+
directory and define the `workingdir` variable as exercised in the :ref:`quickstart`
|
|
28
|
+
section:
|
|
29
|
+
|
|
30
|
+
>>> workingdir = "C:/temp"
|
|
31
|
+
|
|
32
|
+
.. testsetup::
|
|
33
|
+
|
|
34
|
+
>>> from hydpy import TestIO
|
|
35
|
+
>>> TestIO.clear()
|
|
36
|
+
>>> from hydpy.core.testtools import prepare_full_example_1
|
|
37
|
+
>>> prepare_full_example_1()
|
|
38
|
+
>>> import os
|
|
39
|
+
>>> cwd = os.getcwd()
|
|
40
|
+
>>> from hydpy.tests import iotesting
|
|
41
|
+
>>> workingdir = iotesting.__path__[0]
|
|
42
|
+
>>> os.chdir(workingdir)
|
|
43
|
+
|
|
44
|
+
Proceed like in the :ref:`quickstart` section by activating the working directory,
|
|
45
|
+
importing |HydPy| and |pub|, initialising a |HydPy| instance, and defining the period
|
|
46
|
+
to consider:
|
|
47
|
+
|
|
48
|
+
>>> import os
|
|
49
|
+
>>> os.chdir(workingdir)
|
|
50
|
+
>>> from hydpy import HydPy, pub
|
|
51
|
+
>>> hp = HydPy("HydPy-H-Lahn")
|
|
52
|
+
>>> pub.timegrids = "1996-01-01", "1997-01-01", "1d"
|
|
53
|
+
|
|
54
|
+
We now define a small helper function that checks if a directory or file we are talking
|
|
55
|
+
about exists:
|
|
56
|
+
|
|
57
|
+
>>> def assert_exists(*components):
|
|
58
|
+
... components = (workingdir,) + components
|
|
59
|
+
... path = os.path.join(*components)
|
|
60
|
+
... assert os.path.exists(path)
|
|
61
|
+
|
|
62
|
+
First, we must prepare the network. All loadable networks are usually within the
|
|
63
|
+
`network` subfolder:
|
|
64
|
+
|
|
65
|
+
>>> assert_exists("HydPy-H-Lahn", "network")
|
|
66
|
+
|
|
67
|
+
The |NetworkManager| instance of the |pub| object can give us more information. For
|
|
68
|
+
example, it can tell us that the :ref:`HydPy-H-Lahn` project only comprises one
|
|
69
|
+
subfolder and hence only one "network version":
|
|
70
|
+
|
|
71
|
+
>>> pub.networkmanager.availabledirs # doctest: +ELLIPSIS
|
|
72
|
+
Folder2Path(default=.../HydPy-H-Lahn/network/default)
|
|
73
|
+
>>> assert_exists("HydPy-H-Lahn", "network", "default")
|
|
74
|
+
|
|
75
|
+
The |NetworkManager| instance assumes this single directory as the desired working
|
|
76
|
+
directory:
|
|
77
|
+
|
|
78
|
+
>>> assert pub.networkmanager.currentdir == "default"
|
|
79
|
+
|
|
80
|
+
The default directory consists of three Python files, for example, `headwaters.py`:
|
|
81
|
+
|
|
82
|
+
>>> assert_exists("HydPy-H-Lahn", "network", "default", "headwaters.py")
|
|
83
|
+
|
|
84
|
+
If we call method |HydPy.prepare_network|, HydPy builds a network that consists of all
|
|
85
|
+
the elements and nodes defined in these three files:
|
|
86
|
+
|
|
87
|
+
>>> hp.prepare_network()
|
|
88
|
+
>>> hp.nodes
|
|
89
|
+
Nodes("dill_assl", "lahn_kalk", "lahn_leun", "lahn_marb")
|
|
90
|
+
>>> hp.elements
|
|
91
|
+
Elements("land_dill_assl", "land_lahn_kalk", "land_lahn_leun",
|
|
92
|
+
"land_lahn_marb", "stream_dill_assl_lahn_leun",
|
|
93
|
+
"stream_lahn_leun_lahn_kalk", "stream_lahn_marb_lahn_leun")
|
|
94
|
+
|
|
95
|
+
Besides this, the |Selections| instance of |pub| now contains three user-defined
|
|
96
|
+
|Selection| instances:
|
|
97
|
+
|
|
98
|
+
>>> pub.selections
|
|
99
|
+
Selections("headwaters", "nonheadwaters", "streams")
|
|
100
|
+
|
|
101
|
+
Each user-defined selection corresponds to one network file, meaning it has the same
|
|
102
|
+
name and comprises the same nodes and elements:
|
|
103
|
+
|
|
104
|
+
>>> pub.selections.headwaters
|
|
105
|
+
Selection("headwaters",
|
|
106
|
+
nodes=("dill_assl", "lahn_marb"),
|
|
107
|
+
elements=("land_dill_assl", "land_lahn_marb"))
|
|
108
|
+
|
|
109
|
+
A fourth selection, named "complete", is also accessible. The property
|
|
110
|
+
|Selections.complete| creates it automatically upon request by combining the contents
|
|
111
|
+
of the user-defined selections. Right after calling |HydPy.prepare_network|, the
|
|
112
|
+
|HydPy| instance and |Selections.complete| have the same nodes and elements:
|
|
113
|
+
|
|
114
|
+
>>> assert hp == pub.selections.complete
|
|
115
|
+
|
|
116
|
+
Use method |HydPy.update_devices| to concentrate only on a part of the complete
|
|
117
|
+
network. Here, we restrict the simulation to the headwater catchments:
|
|
118
|
+
|
|
119
|
+
>>> hp.update_devices(selection=pub.selections.headwaters)
|
|
120
|
+
>>> assert hp == pub.selections.headwaters
|
|
121
|
+
|
|
122
|
+
So far, we prepared the network and selected the subnetwork we are interested in, but a
|
|
123
|
+
model that could perform any actual simulation is still missing:
|
|
124
|
+
|
|
125
|
+
>>> from hydpy import attrready
|
|
126
|
+
>>> assert not attrready(hp.elements.land_dill_assl, "model")
|
|
127
|
+
|
|
128
|
+
The |ControlManager| instance of |pub| informs us about the only available set of model
|
|
129
|
+
types and parameterisations, which is available in a directory named `default`, the now
|
|
130
|
+
relevant working directory:
|
|
131
|
+
|
|
132
|
+
>>> pub.controlmanager.availabledirs # doctest: +ELLIPSIS
|
|
133
|
+
Folder2Path(default=.../HydPy-H-Lahn/control/default)
|
|
134
|
+
>>> assert pub.controlmanager.currentdir == "default"
|
|
135
|
+
|
|
136
|
+
This directory contains one Python file for each element of the current selection, for
|
|
137
|
+
example, `land_dill_assl.py`:
|
|
138
|
+
|
|
139
|
+
>>> assert_exists("HydPy-H-Lahn", "control", "default", "land_dill_assl.py")
|
|
140
|
+
|
|
141
|
+
Calling method |HydPy.prepare_models| lets HydPy execute these files to create the
|
|
142
|
+
required main models and their submodels, which it then connects to the respective
|
|
143
|
+
elements:
|
|
144
|
+
|
|
145
|
+
>>> hp.prepare_models()
|
|
146
|
+
>>> model = hp.elements.land_dill_assl.model
|
|
147
|
+
>>> model
|
|
148
|
+
hland_96
|
|
149
|
+
aetmodel: evap_aet_hbv96
|
|
150
|
+
petmodel: evap_pet_hbv96
|
|
151
|
+
rconcmodel: rconc_uh
|
|
152
|
+
|
|
153
|
+
All parameter values are already set:
|
|
154
|
+
|
|
155
|
+
>>> model.parameters.control.icmax
|
|
156
|
+
icmax(field=1.0, forest=1.5)
|
|
157
|
+
>>> model.aetmodel.petmodel.parameters.derived.altitude
|
|
158
|
+
altitude(420.53445)
|
|
159
|
+
|
|
160
|
+
However, initial condition values are still missing:
|
|
161
|
+
|
|
162
|
+
>>> model.sequences.states.uz
|
|
163
|
+
uz(nan)
|
|
164
|
+
|
|
165
|
+
We can use the |ConditionManager| to discover the available sets of initial conditions.
|
|
166
|
+
There is only one set, and this is suitable for 1 January 1996:
|
|
167
|
+
|
|
168
|
+
>>> pub.conditionmanager.availabledirs # doctest: +ELLIPSIS
|
|
169
|
+
Folder2Path(init_1996_01_01_00_00_00=.../HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00)
|
|
170
|
+
|
|
171
|
+
The |ConditionManager| is unique as it differentiates between initial and final
|
|
172
|
+
conditions, which correspond to the start and end of the currently selected simulation
|
|
173
|
+
period. If not overwritten by |FileManager.currentdir| (see below), property
|
|
174
|
+
|ConditionManager.inputpath| creates the expected path to the input conditions based on
|
|
175
|
+
the set |ConditionManager.prefix| (defaults to `init`) and the current simulation start
|
|
176
|
+
date:
|
|
177
|
+
|
|
178
|
+
>>> from hydpy import repr_
|
|
179
|
+
>>> repr_(pub.conditionmanager.inputpath) # doctest: +ELLIPSIS
|
|
180
|
+
'.../HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00'
|
|
181
|
+
|
|
182
|
+
As for control files, there is also one condition file per element, like, for example,
|
|
183
|
+
`land_dill_assl.py`:
|
|
184
|
+
|
|
185
|
+
>>> assert_exists(
|
|
186
|
+
... "HydPy-H-Lahn", "conditions", "init_1996_01_01_00_00_00", "land_dill_assl.py"
|
|
187
|
+
... )
|
|
188
|
+
|
|
189
|
+
Method |HydPy.prepare_models| sets all condition sequences' values by evaluating the
|
|
190
|
+
relevant condition files:
|
|
191
|
+
|
|
192
|
+
>>> hp.load_conditions()
|
|
193
|
+
>>> model.sequences.states.uz
|
|
194
|
+
uz(7.25228)
|
|
195
|
+
|
|
196
|
+
The input time series is the only data still missing to run a simulation:
|
|
197
|
+
|
|
198
|
+
>>> assert not attrready(model.sequences.inputs.t, "series")
|
|
199
|
+
|
|
200
|
+
The |SequenceManager| informs us there is only one time series directory, and it is
|
|
201
|
+
named `default`:
|
|
202
|
+
|
|
203
|
+
>>> pub.sequencemanager.availabledirs # doctest: +ELLIPSIS
|
|
204
|
+
Folder2Path(default=...HydPy-H-Lahn/series/default)
|
|
205
|
+
>>> assert pub.sequencemanager.currentdir == "default"
|
|
206
|
+
|
|
207
|
+
Reading time series data is a two-step procedure. First, one calls the suitable
|
|
208
|
+
"prepare method". When called without arguments, methods like
|
|
209
|
+
|HydPy.prepare_allseries| (which, as its name suggests, addresses the time series of
|
|
210
|
+
all relevant sequences) allocate the necessary space in RAM for handling the time
|
|
211
|
+
series data:
|
|
212
|
+
|
|
213
|
+
>>> hp.prepare_allseries()
|
|
214
|
+
|
|
215
|
+
The second step is to call the suitable "load methods". In this example, method
|
|
216
|
+
|HydPy.load_inputseries| loads the required (meteorological) input time series:
|
|
217
|
+
|
|
218
|
+
>>> hp.load_inputseries()
|
|
219
|
+
|
|
220
|
+
If not specified otherwise, HydPy reads time series from and writes them to ASCII files.
|
|
221
|
+
For example, the |hland_inputs.T| time series data of the |hland_96| model instance
|
|
222
|
+
handled by the element `land_dill_assl` stems from the ASCII file
|
|
223
|
+
`land_dill_assl_hland_96_input_t.asc`:
|
|
224
|
+
|
|
225
|
+
>>> assert_exists(
|
|
226
|
+
... "HydPy-H-Lahn", "series", "default", "land_dill_assl_hland_96_input_t.asc"
|
|
227
|
+
... )
|
|
228
|
+
>>> from hydpy import print_vector
|
|
229
|
+
>>> print_vector(model.sequences.inputs.t.series[:5])
|
|
230
|
+
0.0, -0.5, -2.4, -6.8, -7.8
|
|
231
|
+
|
|
232
|
+
Class |SequenceManager| provides more options than just the directory-related ones.
|
|
233
|
+
For example, you can use option |SequenceManager.filetype| to read discharge
|
|
234
|
+
measurement data from the NetCDF file `obs_q.nc`:
|
|
235
|
+
|
|
236
|
+
>>> with pub.sequencemanager.filetype("nc"):
|
|
237
|
+
... hp.load_obsseries()
|
|
238
|
+
>>> assert_exists("HydPy-H-Lahn", "series", "default", "obs_q.nc")
|
|
239
|
+
>>> node = hp.nodes.dill_assl
|
|
240
|
+
>>> print_vector(node.sequences.obs.series[:5])
|
|
241
|
+
4.84, 5.19, 4.22, 3.65, 3.61
|
|
242
|
+
|
|
243
|
+
Finally, with all required preprocessing done, we can conduct the simulation:
|
|
244
|
+
|
|
245
|
+
>>> hp.simulate()
|
|
246
|
+
|
|
247
|
+
The :ref:`quickstart` section already touches on plotting simulated and observed
|
|
248
|
+
discharge:
|
|
249
|
+
|
|
250
|
+
>>> figure = node.plot_allseries()
|
|
251
|
+
|
|
252
|
+
.. testsetup::
|
|
253
|
+
|
|
254
|
+
>>> from hydpy.core.testtools import save_autofig
|
|
255
|
+
>>> save_autofig("Asslar_Qsim_vs_Qobs.png", figure)
|
|
256
|
+
|
|
257
|
+
.. image:: Asslar_Qsim_vs_Qobs.png
|
|
258
|
+
|
|
259
|
+
We "prepared" not only the meteorological input and discharge observation time series
|
|
260
|
+
but also those of all sequences for which this is possible. This foresighted action
|
|
261
|
+
allows to gain insights into many internal calculation details. For example, we can
|
|
262
|
+
plot the time series of the zone-specific state sequence |hland_states.SM| and the
|
|
263
|
+
subbasin-specific state sequences |hland_states.UZ| and |hland_states.LZ|:
|
|
264
|
+
|
|
265
|
+
>>> figure = hp.elements.land_dill_assl.plot_stateseries("sm", "uz", "lz")
|
|
266
|
+
|
|
267
|
+
There are numerous ways to modify the figure creation process or to change already
|
|
268
|
+
created figures. As an example, we add a custom y-label:
|
|
269
|
+
|
|
270
|
+
>>> text = figure.get_axes()[0].set_ylabel("storage content [mm]")
|
|
271
|
+
|
|
272
|
+
.. testsetup::
|
|
273
|
+
|
|
274
|
+
>>> from hydpy.core.testtools import save_autofig
|
|
275
|
+
>>> save_autofig("Dill_SM_UZ_LZ.png", figure)
|
|
276
|
+
|
|
277
|
+
.. image:: Dill_SM_UZ_LZ.png
|
|
278
|
+
|
|
279
|
+
Besides plotting time series, one might wish to save them for later evaluation.
|
|
280
|
+
Refraining from writing simulation results into the input data's directory is
|
|
281
|
+
considered good practice. Hence, we use the |SequenceManager| to create a new time
|
|
282
|
+
series directory:
|
|
283
|
+
|
|
284
|
+
>>> pub.sequencemanager.currentdir = "output"
|
|
285
|
+
>>> assert_exists("HydPy-H-Lahn", "series", "output")
|
|
286
|
+
>>> pub.sequencemanager.availabledirs # doctest: +ELLIPSIS
|
|
287
|
+
Folder2Path(default=...HydPy-H-Lahn/series/default,
|
|
288
|
+
output=...HydPy-H-Lahn/series/output)
|
|
289
|
+
|
|
290
|
+
Analogue to the "load methods", |HydPy| offers multiple "save methods" for writing
|
|
291
|
+
simulated (and, if necessary, previously read) time series. Here, we use method
|
|
292
|
+
|HydPy.save_simseries| to write the simulated discharge series of the two selected
|
|
293
|
+
nodes:
|
|
294
|
+
|
|
295
|
+
>>> hp.save_simseries()
|
|
296
|
+
>>> assert_exists("HydPy-H-Lahn", "series", "output", "dill_assl_sim_q.asc")
|
|
297
|
+
|
|
298
|
+
Also of frequent interest (for example, in the context of operational forecasting) is
|
|
299
|
+
writing the achieved final conditions, allowing us to continue the simulation later
|
|
300
|
+
seamlessly.
|
|
301
|
+
|
|
302
|
+
By default, the |ConditionManager.outputpath| property of class |ConditionManager|
|
|
303
|
+
creates the required target directory based on the simulation's end date and informs
|
|
304
|
+
you about this action:
|
|
305
|
+
|
|
306
|
+
>>> with pub.options.printprogress(True):
|
|
307
|
+
... path = pub.conditionmanager.outputpath # doctest: +ELLIPSIS
|
|
308
|
+
The condition manager's current working directory is not defined explicitly. Hence, the condition manager writes its data to a directory named `init_1997_01_01_00_00_00`.
|
|
309
|
+
Directory ...init_1997_01_01_00_00_00 has been created.
|
|
310
|
+
>>> pub.conditionmanager.availabledirs # doctest: +ELLIPSIS
|
|
311
|
+
Folder2Path(init_1996_01_01_00_00_00=.../HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00,
|
|
312
|
+
init_1997_01_01_00_00_00=.../HydPy-H-Lahn/conditions/init_1997_01_01_00_00_00)
|
|
313
|
+
|
|
314
|
+
If this happens by accident, you can undo it in two steps. First, set the current
|
|
315
|
+
working directory to the freshly created output path (note that we here actually pass
|
|
316
|
+
a whole directory path instead of a directory name, which would, for example, allow us
|
|
317
|
+
to write data beyond the usual HydPy project structure):
|
|
318
|
+
|
|
319
|
+
>>> pub.conditionmanager.currentdir = path
|
|
320
|
+
|
|
321
|
+
Second, apply the `del` statement to remove the unintentionally created directory:
|
|
322
|
+
|
|
323
|
+
>>> del pub.conditionmanager.currentdir
|
|
324
|
+
>>> pub.conditionmanager.availabledirs # doctest: +ELLIPSIS
|
|
325
|
+
Folder2Path(init_1996_01_01_00_00_00=.../HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00)
|
|
326
|
+
|
|
327
|
+
Finally, we can create a directory with the desired name and write the conditions into
|
|
328
|
+
it:
|
|
329
|
+
|
|
330
|
+
>>> pub.conditionmanager.currentdir = "my_conditions"
|
|
331
|
+
>>> pub.conditionmanager.availabledirs # doctest: +ELLIPSIS
|
|
332
|
+
Folder2Path(init_1996_01_01_00_00_00=.../HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00,
|
|
333
|
+
my_conditions=.../HydPy-H-Lahn/conditions/my_conditions)
|
|
334
|
+
>>> hp.save_conditions()
|
|
335
|
+
>>> assert_exists("HydPy-H-Lahn", "conditions", "my_conditions", "land_dill_assl.py")
|
|
336
|
+
|
|
337
|
+
Note that |ConditionManager.inputpath| and |ConditionManager.outputpath| now point to
|
|
338
|
+
the set working directory:
|
|
339
|
+
|
|
340
|
+
>>> assert pub.conditionmanager.inputpath.endswith("my_conditions")
|
|
341
|
+
>>> assert pub.conditionmanager.outputpath.endswith("my_conditions")
|
|
342
|
+
|
|
343
|
+
Assign |None| to |FileManager.currentdir| to undo this without removing the directory:
|
|
344
|
+
|
|
345
|
+
>>> pub.conditionmanager.currentdir = None
|
|
346
|
+
>>> assert pub.conditionmanager.inputpath.endswith("init_1996_01_01_00_00_00")
|
|
347
|
+
>>> assert pub.conditionmanager.outputpath.endswith("init_1997_01_01_00_00_00")
|
|
348
|
+
>>> assert_exists("HydPy-H-Lahn", "conditions", "my_conditions", "land_dill_assl.py")
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
.. _simulation_xml:
|
|
352
|
+
|
|
353
|
+
XML
|
|
354
|
+
___
|
|
355
|
+
|
|
356
|
+
HydPy's XML support is a convenient alternative for people not interested in learning
|
|
357
|
+
Python or for standardised tasks like operational forecasting. It is not as flexible
|
|
358
|
+
as defining workflows in Python scripts, but (except for plotting) supports all
|
|
359
|
+
features described above and many more.
|
|
360
|
+
|
|
361
|
+
HydPy offers so-called "script functions" that users can trigger from external
|
|
362
|
+
terminals like the Windows command line. Regarding the XML support, five of them
|
|
363
|
+
matter: |run_simulation|, |xml_validate|, |xml_replace|, |start_server|, and
|
|
364
|
+
|await_server|. The latter two functions deal with the advanced topic of letting HydPy
|
|
365
|
+
act as a server that can interact with client programs like `OpenDA`_, which is beyond
|
|
366
|
+
the :ref:`User Guide's <user_guide>` scope. Hence, we will focus on |run_simulation|
|
|
367
|
+
in the following and also give some notes on |xml_validate| and |xml_replace|.
|
|
368
|
+
|
|
369
|
+
The :ref:`HydPy-H-Lahn` example project comes with three working XML files, of which
|
|
370
|
+
`single_run.xml` is the only relevant one in the given context (the other two deal with
|
|
371
|
+
HydPy's server functionalities):
|
|
372
|
+
|
|
373
|
+
>>> assert_exists("HydPy-H-Lahn", "single_run.xml")
|
|
374
|
+
|
|
375
|
+
Any XML file compatible with the script function |run_simulation|, like
|
|
376
|
+
`single_run.xml`, must comply with the XML Schema Definition file
|
|
377
|
+
`HydPyConfigSingleRun.xsd`. If you work with a capable IDE or XML editor, it uses
|
|
378
|
+
these definitions to assist you in writing a new or modifying an existing XML file. At
|
|
379
|
+
the very least, it should warn you if your XML file violates the schema file.
|
|
380
|
+
|
|
381
|
+
Without a capable IDE or XML editor, or if you want to include automatic XML
|
|
382
|
+
validation in your workflow, the script function |xml_validate| (which relies on the
|
|
383
|
+
`xmlschema`_ library) might be a good option. We use it as the first example to
|
|
384
|
+
demonstrate HydPy's command line usage.
|
|
385
|
+
|
|
386
|
+
With a standard :ref:`HydPy installation <installation>` on your computer (and, if
|
|
387
|
+
necessary, the right environment activated), you can trigger HydPy with the command
|
|
388
|
+
`hyd.py`. Open a terminal, change into the already prepared working directory, type
|
|
389
|
+
`hyd.py`, and press enter::
|
|
390
|
+
|
|
391
|
+
hyd.py
|
|
392
|
+
|
|
393
|
+
In the following examples, we fake the usage of a terminal with the help of function
|
|
394
|
+
|run_subprocess|, which runs the given commands in a separate subprocess as if typed in
|
|
395
|
+
a terminal:
|
|
396
|
+
|
|
397
|
+
>>> from hydpy import run_subprocess
|
|
398
|
+
|
|
399
|
+
If we only type `hyd.py`, HydPy informs us that we must tell it what to do by naming
|
|
400
|
+
the suitable script function:
|
|
401
|
+
|
|
402
|
+
>>> subprocess = run_subprocess("hyd.py") # doctest: +ELLIPSIS
|
|
403
|
+
Invoking hyd.py without arguments resulted in the following error:
|
|
404
|
+
The first positional argument defining the function to be called is missing.
|
|
405
|
+
...
|
|
406
|
+
|
|
407
|
+
Use the process's return code to determine whether it was successful. In this case, it
|
|
408
|
+
was not, so the return code is unequal zero:
|
|
409
|
+
|
|
410
|
+
>>> assert subprocess.returncode != 0
|
|
411
|
+
|
|
412
|
+
Specifying the relevant script function is not enough, as |xml_validate|
|
|
413
|
+
(understandably) must know which file to check:
|
|
414
|
+
|
|
415
|
+
>>> subprocess = run_subprocess("hyd.py xml_validate") # doctest: +ELLIPSIS
|
|
416
|
+
Invoking hyd.py with argument `xml_validate` resulted in the following error:
|
|
417
|
+
Function `xml_validate` requires `1` positional arguments (xmlpath), but `0` are given.
|
|
418
|
+
...
|
|
419
|
+
|
|
420
|
+
After adding the relative or absolute path, |xml_validate| informs us by a message and
|
|
421
|
+
a zero return code that `single_run.xml` is valid:
|
|
422
|
+
|
|
423
|
+
>>> subprocess = run_subprocess("hyd.py xml_validate HydPy-H-Lahn/single_run.xml")
|
|
424
|
+
HydPy-H-Lahn/single_run.xml successfully validated
|
|
425
|
+
>>> assert subprocess.returncode == 0
|
|
426
|
+
|
|
427
|
+
Note that "valid" here only means the XML file's compliance with
|
|
428
|
+
`HydPyConfigSingleRun.xsd`. It is still possible that its configurations do not fit
|
|
429
|
+
the :ref:`HydPy-H-Lahn` project. For example, `single_run.xml` could select a
|
|
430
|
+
simulation period not met by the available input time series.
|
|
431
|
+
|
|
432
|
+
With a ready XML file, starting a simulation run via method |run_simulation| is easy:
|
|
433
|
+
|
|
434
|
+
>>> subprocess = run_subprocess("hyd.py run_simulation HydPy-H-Lahn single_run.xml") # doctest: +ELLIPSIS
|
|
435
|
+
Start HydPy project `HydPy-H-Lahn` (...).
|
|
436
|
+
Read configuration file `single_run.xml` (...).
|
|
437
|
+
Interpret the defined options (...).
|
|
438
|
+
Interpret the defined period (...).
|
|
439
|
+
Read all network files (...).
|
|
440
|
+
Create the custom selections (if defined) (...).
|
|
441
|
+
Activate the selected network (...).
|
|
442
|
+
Read the required control files (...).
|
|
443
|
+
Read the required condition files (...).
|
|
444
|
+
Read the required time series files (...).
|
|
445
|
+
Perform the simulation run (...).
|
|
446
|
+
Write the desired condition files (...).
|
|
447
|
+
Write the desired time series files (...).
|
|
448
|
+
|
|
449
|
+
The printed response clarifies that |run_simulation| essentially executes the same
|
|
450
|
+
steps as we did in the :ref:`Simulation > Python <simulation_python>` section above.
|
|
451
|
+
|
|
452
|
+
One step that goes beyond the Python example is the creation of selections.
|
|
453
|
+
Previously, we only used the already available selection `headwaters` defined by the
|
|
454
|
+
network file `headwaters.py`. The XML file goes further and creates three new
|
|
455
|
+
selections by specifying individual elements (`from_devices`), keywords
|
|
456
|
+
(`from_keywords`), and other selections (`from_selections`). All these definitions
|
|
457
|
+
occur within the XML element `add_selections`. The defined selections help configure
|
|
458
|
+
the reader and writer XML elements not to read and write data needlessly.
|
|
459
|
+
|
|
460
|
+
The :ref:`User Guide's <user_guide>` :ref:`options` section provided more introductory
|
|
461
|
+
information on configuring XML files.
|
|
462
|
+
|
|
463
|
+
For purposes like operational forecasting, one might wish to reuse a predefined XML
|
|
464
|
+
file with some aspects, such as the simulation period, changed. For this, HydPy
|
|
465
|
+
offers an XML template mechanism. With `single_run.xmlt`, the :ref:`HydPy-H-Lahn`
|
|
466
|
+
project contains one example of an XML template file:
|
|
467
|
+
|
|
468
|
+
>>> assert_exists("HydPy-H-Lahn", "single_run.xmlt")
|
|
469
|
+
|
|
470
|
+
This template contains three special XML comments in lines
|
|
471
|
+
`<firstdate><!--|firstdate=1996-01-01T00:00:00|--></firstdate>`,
|
|
472
|
+
`<prefix><!--|prefix=init|--></prefix>`, and `<zip><!--|zip_=false|--></zip>`. The
|
|
473
|
+
parts `<!--` and `-->` define a usual XML comment. As such comments count as nothing,
|
|
474
|
+
|xml_validate| reports the following error when checking `single_run.xmlt`:
|
|
475
|
+
|
|
476
|
+
>>> subprocess = run_subprocess("hyd.py xml_validate HydPy-H-Lahn/single_run.xmlt") # doctest: +ELLIPSIS
|
|
477
|
+
failed validating '' with XsdAtomicBuiltin(name='xs:dateTime'):
|
|
478
|
+
<BLANKLINE>
|
|
479
|
+
Reason: Invalid datetime string '' for <class 'elementpath.datatypes.datetime.DateTime10'>
|
|
480
|
+
...
|
|
481
|
+
Path: /hpcsr:config/timegrid/firstdate
|
|
482
|
+
|
|
483
|
+
The HydPy-specific parts, `|firstdate=1996-01-01T00:00:00|`, `|prefix=init|`, and
|
|
484
|
+
`|zip_=false|`, indicate that |xml_replace| is supposed to replace the respective whole
|
|
485
|
+
XML comment. In the following example, we pass only data to the argument `zip_`:
|
|
486
|
+
|
|
487
|
+
>>> subprocess = run_subprocess("hyd.py xml_replace HydPy-H-Lahn/single_run zip_=wrong")
|
|
488
|
+
template file: HydPy-H-Lahn/single_run.xmlt
|
|
489
|
+
target file: HydPy-H-Lahn/single_run.xml
|
|
490
|
+
replacements:
|
|
491
|
+
firstdate --> 1996-01-01T00:00:00 (default argument)
|
|
492
|
+
prefix --> init (default argument)
|
|
493
|
+
zip_ --> wrong (given argument)
|
|
494
|
+
|
|
495
|
+
Following the printed summary, |xml_replace| used the given value `wrong` for the
|
|
496
|
+
argument `zip_` and the default values `1996-01-01T00:00:00` and `init` for the
|
|
497
|
+
arguments `firstdate` and `prefix` (one must not define such default values; with a
|
|
498
|
+
line like `<zip><!--|zip_|--></zip>` one would always have to pass data for the
|
|
499
|
+
argument `zip_`).
|
|
500
|
+
|
|
501
|
+
Although technically successful, the replacement was flawed because, as |xml_validate|
|
|
502
|
+
can tell us, `wrong` is not a boolean value, as would be required:
|
|
503
|
+
|
|
504
|
+
>>> subprocess = run_subprocess("hyd.py xml_validate HydPy-H-Lahn/single_run.xml") # doctest: +ELLIPSIS
|
|
505
|
+
failed validating 'wrong' with XsdAtomicBuiltin(name='xs:boolean'):
|
|
506
|
+
<BLANKLINE>
|
|
507
|
+
Reason: 'wrong' is not a boolean value
|
|
508
|
+
...
|
|
509
|
+
Path: /hpcsr:config/conditions_io/zip
|
|
510
|
+
|
|
511
|
+
|
|
512
|
+
.. testsetup::
|
|
513
|
+
|
|
514
|
+
>>> os.chdir(cwd)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
|
|
2
|
+
.. _submodel_interfaces:
|
|
3
|
+
|
|
4
|
+
Submodel Interfaces
|
|
5
|
+
===================
|
|
6
|
+
|
|
7
|
+
Submodel interfaces are contracts between main models and submodels. If both of them
|
|
8
|
+
agree with one contract, they are compatible. We say a submodel "follows" or "complies
|
|
9
|
+
with" an interface if it supplies all the interface's required methods (and is derived
|
|
10
|
+
from it). On the other side, we speak of a main model's "port" of a specific interface
|
|
11
|
+
if a main model can use all submodels that follow that interface.
|
|
12
|
+
|
|
13
|
+
This subsection lists all currently available submodel interfaces. We hope this
|
|
14
|
+
information to be relevant only for framework and model developers. Users should be
|
|
15
|
+
able to easier query the information about possible couplings between main models and
|
|
16
|
+
submodels via submodel graphs. See, for example, the "complete" submodel graph,
|
|
17
|
+
available in the :ref:`model_overview` section, which covers all user-relevant models.
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
.. toctree::
|
|
21
|
+
:hidden:
|
|
22
|
+
|
|
23
|
+
aetinterfaces
|
|
24
|
+
dischargeinterfaces
|
|
25
|
+
petinterfaces
|
|
26
|
+
precipinterfaces
|
|
27
|
+
radiationinterfaces
|
|
28
|
+
rconcinterfaces
|
|
29
|
+
routinginterfaces
|
|
30
|
+
soilinterfaces
|
|
31
|
+
stateinterfaces
|
|
32
|
+
tempinterfaces
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
|
|
2
|
+
.. _Hutton et al.: https://agupubs.onlinelibrary.wiley.com/doi/10.1002/2016WR019285
|
|
3
|
+
.. _docstrings: https://www.python.org/dev/peps/pep-0257
|
|
4
|
+
.. _reStructuredText: http://docutils.sourceforge.net/rst.html
|
|
5
|
+
.. _Sphinx: http://www.sphinx-doc.org/en/master/
|
|
6
|
+
.. _doctests: https://docs.python.org/library/doctest.html
|
|
7
|
+
.. _unittest: https://docs.python.org/3/library/unittest.html
|
|
8
|
+
.. _run_doctests.py: https://github.com/hydpy-dev/hydpy/blob/master/hydpy/tests/run_doctests.py
|
|
9
|
+
.. _tests: https://github.com/hydpy-dev/hydpy/tree/master/hydpy/tests
|
|
10
|
+
.. _coverage library: https://coverage.readthedocs.io
|
|
11
|
+
.. _Travis CI: https://travis-ci.com/
|
|
12
|
+
.. _Travis log-page: https://travis-ci.com/hydpy-dev/hydpy
|
|
13
|
+
.. _Pylint: https://www.pylint.org/
|
|
14
|
+
|
|
15
|
+
.. _tests_and_documentation:
|
|
16
|
+
|
|
17
|
+
Tests & documentation
|
|
18
|
+
_____________________
|
|
19
|
+
|
|
20
|
+
The scientific community broadly discusses the capabilities and shortcomings of
|
|
21
|
+
hydrological models from a theoretical point of view. For example, many
|
|
22
|
+
sensitivity studies address the negative impacts of low data quality. By
|
|
23
|
+
contrast, we unaware of any studies estimating the adverse effects of bugs and
|
|
24
|
+
misleading documentation of hydrological computer models. With little
|
|
25
|
+
attention paid to these issues during evaluation processes (e.g. during
|
|
26
|
+
peer-review), there is a risk of publishing impaired model results, possibly
|
|
27
|
+
compromising the drawn conclusions. See, for example, the commentary of
|
|
28
|
+
`Hutton et al.`_, addressing this topic from the scientific perspective.
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
This section describes strategies to limit the risk of serious errors and
|
|
32
|
+
outdated documentation. We try to keep the code and the documentation in sync
|
|
33
|
+
by connecting them as strong as possible, using Python's "docstring" and
|
|
34
|
+
"doctest" features.
|
|
35
|
+
|
|
36
|
+
The first "connection" is writing each piece of the documentation close to the
|
|
37
|
+
related source code. Therefore, we prefer to write all explanations addressing
|
|
38
|
+
specific HydPy features as `docstrings`_. Docstrings are documentation strings
|
|
39
|
+
attached to the Python objects they explain. When extending *HydPy*, it is a
|
|
40
|
+
strict requirement that each newly implemented public member (including the
|
|
41
|
+
sub-members, e.g. the user-available methods of a class) comes with its own
|
|
42
|
+
docstring. Our `Travis CI`_ based continuous integration workflow recognises
|
|
43
|
+
any missing docstrings using `Pylint`_ and reports them as errors.
|
|
44
|
+
|
|
45
|
+
The second "connection" is to use and extend the functionalities of `Sphinx`_,
|
|
46
|
+
which collects the source code, the docstrings, and the usual documentation
|
|
47
|
+
files to generate the online documentation. `Sphinx`_ relies on the
|
|
48
|
+
`reStructuredText`_ format, hence follow this format when writing docstrings
|
|
49
|
+
and regular documentation files. However, instead of using its regular
|
|
50
|
+
referencing style, make use of "substitutions" as defined by class |Substituter|
|
|
51
|
+
of module |autodoctools|. Write, for example, the class name "Substituter"
|
|
52
|
+
within vertical bars to reference the corresponding class properly. This short
|
|
53
|
+
syntax allows making frequent use of substitutions. A helpful side effect is
|
|
54
|
+
that, during the generation of the HTML pages, wrong substitutions result in
|
|
55
|
+
warnings, interpreted as errors by our `Travis CI`_ based continuous
|
|
56
|
+
integration workflow (see section :ref:`continuous_integration`). This
|
|
57
|
+
mechanism increases the chances that, when documentation adjustments do not
|
|
58
|
+
accompany future code changes, the `Travis CI`_ based workflow breaks, forcing
|
|
59
|
+
the responsible programmer to adapt the documentation.
|
|
60
|
+
|
|
61
|
+
The third "connection" is to define a sufficient number of `doctests`_.
|
|
62
|
+
Doctests are documentation sections containing valid Python code followed by
|
|
63
|
+
the expected results. For developers, |doctest| is not always as convenient as
|
|
64
|
+
other unit testing frameworks (e.g. |unittest|), but it offers the great
|
|
65
|
+
advantage to defining tests that are understandable for non-programmers. At
|
|
66
|
+
best, each (sub)member should specify its own doctests, in conjunction with
|
|
67
|
+
some "normal" explanations about its purpose and usage. Non-programmers should
|
|
68
|
+
be enabled to learn using *HydPy* by repeating the doctests. Besides their
|
|
69
|
+
intuitiveness, doctests (like substitutions) offer the significant advantage of
|
|
70
|
+
keeping source code and documentation in sync. For example, as long as the
|
|
71
|
+
following three-line doctest remains in the documentation, one can be sure that
|
|
72
|
+
the current core package contains a module named "objecttools":
|
|
73
|
+
|
|
74
|
+
>>> from hydpy.core import objecttools
|
|
75
|
+
>>> objecttools.classname(objecttools)
|
|
76
|
+
'module'
|
|
77
|
+
|
|
78
|
+
The Python script `run_doctests.py`_ collects the doctests of all modules and
|
|
79
|
+
executes them.
|
|
80
|
+
|
|
81
|
+
We measure the "code coverage" (the number of executed code lines divided by
|
|
82
|
+
the total number of code lines), determined by the `coverage library`_. The
|
|
83
|
+
current code coverage of *HydPy* is 100 %. `Travis CI`_ reports all future
|
|
84
|
+
changes introducing uncovered lines as failures to make sure future changes do
|
|
85
|
+
not undo this favourable situation.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
|
|
2
|
+
.. _user_guide:
|
|
3
|
+
|
|
4
|
+
User Guide
|
|
5
|
+
==========
|
|
6
|
+
|
|
7
|
+
This user guide build the bridge between the brief :ref:`quick start section
|
|
8
|
+
<quickstart>` and the highly comprehensive :ref:`reference manual <reference_manual>`.
|
|
9
|
+
It should enable beginners to develop an understanding of HydPy's core ideas and
|
|
10
|
+
concepts and use its essential features.
|
|
11
|
+
|
|
12
|
+
It covers the following topics:
|
|
13
|
+
|
|
14
|
+
* The :ref:`how_to_read_the_reference_manual` section explains some aspects of the
|
|
15
|
+
reference manual that are typical for Python libraries but less typical for
|
|
16
|
+
hydrological model descriptions.
|
|
17
|
+
* The :ref:`definitions` section lists and explains the most important Python and
|
|
18
|
+
HydPy frequently used in this document.
|
|
19
|
+
* The :ref:`model_overview` section briefly introduces HydPy's model collection and so
|
|
20
|
+
is a good preparation before reading the detailed model descriptions in the
|
|
21
|
+
reference guide's :ref:`model_families` section.
|
|
22
|
+
* The :ref:`project_structure` section describes the typical directory and file
|
|
23
|
+
structure of HydPy projects.
|
|
24
|
+
* The :ref:`options` section explains how to set the most user-relevant general HydPy
|
|
25
|
+
options and where to find their documentation.
|
|
26
|
+
* The :ref:`simulation` section summarises the basic steps to perform a simulation run
|
|
27
|
+
via Python skripts or XML files.
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
.. toctree::
|
|
31
|
+
:hidden:
|
|
32
|
+
|
|
33
|
+
how_to_read_the_reference_manual
|
|
34
|
+
definitions
|
|
35
|
+
model_overview
|
|
36
|
+
project_structure
|
|
37
|
+
options
|
|
38
|
+
simulation
|