pydra-core 0.0.1__py2.py3-none-any.whl → 0.0.3__py2.py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (368) hide show
  1. pydra_core/__init__.py +32 -32
  2. pydra_core/common/common.py +98 -98
  3. pydra_core/common/enum.py +63 -63
  4. pydra_core/common/interpolate.py +345 -345
  5. pydra_core/common/probability.py +293 -293
  6. pydra_core/core/calculation.py +51 -51
  7. pydra_core/core/datamodels/frequency_line.py +60 -60
  8. pydra_core/core/exceedance_frequency_line.py +224 -224
  9. pydra_core/core/exceedance_frequency_line_experimental.py +163 -163
  10. pydra_core/core/hbn.py +226 -226
  11. pydra_core/data/statistics/Afvoer/Borgharen/Ovkans_Borgharen_piekafvoer_2017.txt +36 -36
  12. pydra_core/data/statistics/Afvoer/Borgharen/Ovkans_Borgharen_piekafvoer_2017_metOnzHeid.txt +45 -45
  13. pydra_core/data/statistics/Afvoer/Borgharen/Ovkans_Borgharen_piekafvoer_OI2014_G_2015_metOnzHeid_v02.txt +50 -50
  14. pydra_core/data/statistics/Afvoer/Borgharen/Ovkans_Borgharen_piekafvoer_OI2014_G_2015_v02.txt +42 -42
  15. pydra_core/data/statistics/Afvoer/Borgharen/Ovkans_Borgharen_piekafvoer_OI2014_G_2050_metOnzHeid_v02.txt +56 -56
  16. pydra_core/data/statistics/Afvoer/Borgharen/Ovkans_Borgharen_piekafvoer_OI2014_G_2050_v02.txt +48 -48
  17. pydra_core/data/statistics/Afvoer/Borgharen/Ovkans_Borgharen_piekafvoer_OI2014_G_2100_metOnzHeid_v02.txt +56 -56
  18. pydra_core/data/statistics/Afvoer/Borgharen/Ovkans_Borgharen_piekafvoer_OI2014_G_2100_v02.txt +48 -48
  19. pydra_core/data/statistics/Afvoer/Borgharen/Ovkans_Borgharen_piekafvoer_OI2014_W_2015_metOnzHeid_v02.txt +50 -50
  20. pydra_core/data/statistics/Afvoer/Borgharen/Ovkans_Borgharen_piekafvoer_OI2014_W_2015_v02.txt +42 -42
  21. pydra_core/data/statistics/Afvoer/Borgharen/Ovkans_Borgharen_piekafvoer_OI2014_W_2050_metOnzHeid_v02.txt +56 -56
  22. pydra_core/data/statistics/Afvoer/Borgharen/Ovkans_Borgharen_piekafvoer_OI2014_W_2050_v02.txt +48 -48
  23. pydra_core/data/statistics/Afvoer/Borgharen/Ovkans_Borgharen_piekafvoer_OI2014_W_2100_metOnzHeid_v02.txt +51 -51
  24. pydra_core/data/statistics/Afvoer/Borgharen/Ovkans_Borgharen_piekafvoer_OI2014_W_2100_v02.txt +44 -44
  25. pydra_core/data/statistics/Afvoer/Borgharen/Ovkans_Borgharen_piekafvoer_Ref.txt +27 -27
  26. pydra_core/data/statistics/Afvoer/Dalfsen/Ovkans_Dalfsen_piekafvoer_2017.txt +30 -30
  27. pydra_core/data/statistics/Afvoer/Dalfsen/Ovkans_Dalfsen_piekafvoer_2017_metOnzHeid.txt +32 -32
  28. pydra_core/data/statistics/Afvoer/Dalfsen/Ovkans_Dalfsen_piekafvoer_OI2014_G_2015.txt +44 -44
  29. pydra_core/data/statistics/Afvoer/Dalfsen/Ovkans_Dalfsen_piekafvoer_OI2014_G_2015_metOnzHeid.txt +33 -33
  30. pydra_core/data/statistics/Afvoer/Dalfsen/Ovkans_Dalfsen_piekafvoer_OI2014_G_2050.txt +44 -44
  31. pydra_core/data/statistics/Afvoer/Dalfsen/Ovkans_Dalfsen_piekafvoer_OI2014_G_2050_metOnzHeid.txt +33 -33
  32. pydra_core/data/statistics/Afvoer/Dalfsen/Ovkans_Dalfsen_piekafvoer_OI2014_G_2100.txt +44 -44
  33. pydra_core/data/statistics/Afvoer/Dalfsen/Ovkans_Dalfsen_piekafvoer_OI2014_G_2100_metOnzHeid.txt +38 -38
  34. pydra_core/data/statistics/Afvoer/Dalfsen/Ovkans_Dalfsen_piekafvoer_OI2014_W_2015.txt +44 -44
  35. pydra_core/data/statistics/Afvoer/Dalfsen/Ovkans_Dalfsen_piekafvoer_OI2014_W_2015_metOnzHeid.txt +33 -33
  36. pydra_core/data/statistics/Afvoer/Dalfsen/Ovkans_Dalfsen_piekafvoer_OI2014_W_2050.txt +44 -44
  37. pydra_core/data/statistics/Afvoer/Dalfsen/Ovkans_Dalfsen_piekafvoer_OI2014_W_2050_metOnzHeid.txt +33 -33
  38. pydra_core/data/statistics/Afvoer/Dalfsen/Ovkans_Dalfsen_piekafvoer_OI2014_W_2100.txt +44 -44
  39. pydra_core/data/statistics/Afvoer/Dalfsen/Ovkans_Dalfsen_piekafvoer_OI2014_W_2100_metOnzHeid.txt +33 -33
  40. pydra_core/data/statistics/Afvoer/Dalfsen/Ovkans_Dalfsen_piekafvoer_Ref.txt +13 -13
  41. pydra_core/data/statistics/Afvoer/Lith/Ovkans_Lith_piekafvoer_2017.txt +47 -47
  42. pydra_core/data/statistics/Afvoer/Lith/Ovkans_Lith_piekafvoer_2017_metOnzHeid.txt +47 -47
  43. pydra_core/data/statistics/Afvoer/Lith/Ovkans_Lith_piekafvoer_OI2014_G_2015.txt +49 -49
  44. pydra_core/data/statistics/Afvoer/Lith/Ovkans_Lith_piekafvoer_OI2014_G_2015_metOnzHeid.txt +58 -58
  45. pydra_core/data/statistics/Afvoer/Lith/Ovkans_Lith_piekafvoer_OI2014_G_2050.txt +49 -49
  46. pydra_core/data/statistics/Afvoer/Lith/Ovkans_Lith_piekafvoer_OI2014_G_2050_metOnzHeid.txt +58 -58
  47. pydra_core/data/statistics/Afvoer/Lith/Ovkans_Lith_piekafvoer_OI2014_G_2100.txt +49 -49
  48. pydra_core/data/statistics/Afvoer/Lith/Ovkans_Lith_piekafvoer_OI2014_G_2100_metOnzHeid.txt +58 -58
  49. pydra_core/data/statistics/Afvoer/Lith/Ovkans_Lith_piekafvoer_OI2014_W_2015.txt +49 -49
  50. pydra_core/data/statistics/Afvoer/Lith/Ovkans_Lith_piekafvoer_OI2014_W_2015_metOnzHeid.txt +58 -58
  51. pydra_core/data/statistics/Afvoer/Lith/Ovkans_Lith_piekafvoer_OI2014_W_2050.txt +49 -49
  52. pydra_core/data/statistics/Afvoer/Lith/Ovkans_Lith_piekafvoer_OI2014_W_2050_metOnzHeid.txt +58 -58
  53. pydra_core/data/statistics/Afvoer/Lith/Ovkans_Lith_piekafvoer_OI2014_W_2100.txt +49 -49
  54. pydra_core/data/statistics/Afvoer/Lith/Ovkans_Lith_piekafvoer_OI2014_W_2100_metOnzHeid.txt +58 -58
  55. pydra_core/data/statistics/Afvoer/Lith/Ovkans_Lith_piekafvoer_Ref.txt +20 -20
  56. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_2017.txt +33 -33
  57. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_2017_metOnzHeid.txt +59 -59
  58. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_OI2014_G_2015.txt +49 -49
  59. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_OI2014_G_2015_BenedenRijn.txt +49 -49
  60. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_OI2014_G_2015_metOnzHeid.txt +62 -62
  61. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_OI2014_G_2015_metOnzHeid_BenedenRijn.txt +65 -65
  62. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_OI2014_G_2050.txt +49 -49
  63. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_OI2014_G_2050_BenedenRijn.txt +49 -49
  64. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_OI2014_G_2050_metOnzHeid.txt +62 -62
  65. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_OI2014_G_2050_metOnzHeid_BenedenRijn.txt +64 -64
  66. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_OI2014_G_2100.txt +49 -49
  67. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_OI2014_G_2100_BenedenRijn.txt +49 -49
  68. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_OI2014_G_2100_metOnzHeid.txt +62 -62
  69. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_OI2014_G_2100_metOnzHeid_BenedenRijn.txt +64 -64
  70. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_OI2014_W_2015.txt +50 -50
  71. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_OI2014_W_2015_BenedenRijn.txt +50 -50
  72. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_OI2014_W_2015_metOnzHeid.txt +62 -62
  73. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_OI2014_W_2015_metOnzHeid_BenedenRijn.txt +64 -64
  74. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_OI2014_W_2050.txt +50 -50
  75. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_OI2014_W_2050_BenedenRijn.txt +50 -50
  76. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_OI2014_W_2050_metOnzHeid.txt +62 -62
  77. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_OI2014_W_2050_metOnzHeid_BenedenRijn.txt +64 -64
  78. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_OI2014_W_2100.txt +50 -50
  79. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_OI2014_W_2100_BenedenRijn.txt +50 -50
  80. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_OI2014_W_2100_metOnzHeid.txt +62 -62
  81. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_OI2014_W_2100_metOnzHeid_BenedenRijn.txt +65 -65
  82. pydra_core/data/statistics/Afvoer/Lobith/Ovkans_Lobith_piekafvoer_Ref.txt +22 -22
  83. pydra_core/data/statistics/Afvoer/Olst/Ovkans_Olst_piekafvoer_2017.txt +55 -55
  84. pydra_core/data/statistics/Afvoer/Olst/Ovkans_Olst_piekafvoer_2017_metOnzHeid.txt +55 -55
  85. pydra_core/data/statistics/Afvoer/Olst/Ovkans_Olst_piekafvoer_OI2014_G_2015.txt +46 -46
  86. pydra_core/data/statistics/Afvoer/Olst/Ovkans_Olst_piekafvoer_OI2014_G_2015_metOnzHeid.txt +64 -64
  87. pydra_core/data/statistics/Afvoer/Olst/Ovkans_Olst_piekafvoer_OI2014_G_2050.txt +46 -46
  88. pydra_core/data/statistics/Afvoer/Olst/Ovkans_Olst_piekafvoer_OI2014_G_2050_metOnzHeid.txt +64 -64
  89. pydra_core/data/statistics/Afvoer/Olst/Ovkans_Olst_piekafvoer_OI2014_G_2100.txt +46 -46
  90. pydra_core/data/statistics/Afvoer/Olst/Ovkans_Olst_piekafvoer_OI2014_G_2100_metOnzHeid.txt +64 -64
  91. pydra_core/data/statistics/Afvoer/Olst/Ovkans_Olst_piekafvoer_OI2014_W_2015.txt +47 -47
  92. pydra_core/data/statistics/Afvoer/Olst/Ovkans_Olst_piekafvoer_OI2014_W_2015_metOnzHeid.txt +64 -64
  93. pydra_core/data/statistics/Afvoer/Olst/Ovkans_Olst_piekafvoer_OI2014_W_2050.txt +47 -47
  94. pydra_core/data/statistics/Afvoer/Olst/Ovkans_Olst_piekafvoer_OI2014_W_2050_metOnzHeid.txt +64 -64
  95. pydra_core/data/statistics/Afvoer/Olst/Ovkans_Olst_piekafvoer_OI2014_W_2100.txt +47 -47
  96. pydra_core/data/statistics/Afvoer/Olst/Ovkans_Olst_piekafvoer_OI2014_W_2100_metOnzHeid.txt +64 -64
  97. pydra_core/data/statistics/Afvoer/Olst/Ovkans_Olst_piekafvoer_Ref.txt +14 -14
  98. pydra_core/data/statistics/Golfvorm/Borgharen/Golfvormen_Borgharen.txt +76 -76
  99. pydra_core/data/statistics/Golfvorm/Dalfsen/Golfvormen_Dalfsen.txt +83 -83
  100. pydra_core/data/statistics/Golfvorm/Grevelingenmeer/Golfvormen_Grevelingenmeer.txt +33 -33
  101. pydra_core/data/statistics/Golfvorm/IJsselmeer/Golfvormen_IJsselmeer.txt +83 -83
  102. pydra_core/data/statistics/Golfvorm/Lith/Golfvormen_Lith.txt +76 -76
  103. pydra_core/data/statistics/Golfvorm/Lobith/Golfvormen_Lobith.txt +76 -76
  104. pydra_core/data/statistics/Golfvorm/Markermeer/Golfvormen_Markermeer.txt +139 -139
  105. pydra_core/data/statistics/Golfvorm/Olst/Golfvormen_Olst.txt +83 -83
  106. pydra_core/data/statistics/Golfvorm/Veerse Meer/Golfvormen_Veersemeer.txt +53 -53
  107. pydra_core/data/statistics/Golfvorm/Veluwerandmeer/Golfvormen_Veluwerandmeer.txt +139 -139
  108. pydra_core/data/statistics/Golfvorm/Volkerak-Zoommeer/Golfvormen_Volkerakzoommeer.txt +73 -73
  109. pydra_core/data/statistics/Meerpeil/Grevelingenmeer/Ovkans_Grevelingenmeer_piekmeerpeil_2017.txt +12 -12
  110. pydra_core/data/statistics/Meerpeil/Grevelingenmeer/Ovkans_Grevelingenmeer_piekmeerpeil_2017_metOnzHeid.txt +24 -24
  111. pydra_core/data/statistics/Meerpeil/Grevelingenmeer/Ovkans_Grevelingenmeer_piekmeerpeil_v01.txt +12 -12
  112. pydra_core/data/statistics/Meerpeil/IJsselmeer/Ovkans_IJsselmeer_piekmeerpeil_2017.txt +25 -25
  113. pydra_core/data/statistics/Meerpeil/IJsselmeer/Ovkans_IJsselmeer_piekmeerpeil_2017_metOnzHeid.txt +39 -39
  114. pydra_core/data/statistics/Meerpeil/IJsselmeer/Ovkans_IJsselmeer_piekmeerpeil_v01.txt +14 -14
  115. pydra_core/data/statistics/Meerpeil/Markermeer/Ovkans_Markermeer_piekmeerpeil_2017.txt +18 -18
  116. pydra_core/data/statistics/Meerpeil/Markermeer/Ovkans_Markermeer_piekmeerpeil_2017_metOnzHeid.txt +37 -37
  117. pydra_core/data/statistics/Meerpeil/Markermeer/Ovkans_Markermeer_piekmeerpeil_v01.txt +10 -10
  118. pydra_core/data/statistics/Meerpeil/Veerse Meer/Ovkans_Veersemeer_piekmeerpeil_excl_peilverhoging.txt +13 -13
  119. pydra_core/data/statistics/Meerpeil/Veerse Meer/Ovkans_Veersemeer_piekmeerpeil_v01.txt +15 -15
  120. pydra_core/data/statistics/Meerpeil/Veluwerandmeer/Ovkans_Veluwerandmeer_piekmeerpeil_2017.txt +13 -13
  121. pydra_core/data/statistics/Meerpeil/Veluwerandmeer/Ovkans_Veluwerandmeer_piekmeerpeil_2017_metOnzHeid.txt +36 -36
  122. pydra_core/data/statistics/Meerpeil/Veluwerandmeer/Ovkans_Veluwerandmeer_piekmeerpeil_v01.txt +13 -13
  123. pydra_core/data/statistics/Meerpeil/Volkerak-Zoommeer/Ovkans_VZM_piekmeerpeil_BER-VZM.txt +17 -17
  124. pydra_core/data/statistics/Meerpeil/Volkerak-Zoommeer/Ovkans_VZM_piekmeerpeil_BER-VZM_metOnzHeid.txt +42 -42
  125. pydra_core/data/statistics/Restant/Oosterschelde/BesliskansenOSKering.txt +524 -524
  126. pydra_core/data/statistics/Restant/Oosterschelde/KansenFaseverschil_2023.txt +7 -7
  127. pydra_core/data/statistics/Restant/Oosterschelde/KansenFaseverschil_OS.txt +13 -13
  128. pydra_core/data/statistics/Restant/Oosterschelde/KansenStormduur_OS.txt +14 -14
  129. pydra_core/data/statistics/Restant/Oosterschelde/KansenStormduur_OS_40_60_80uur_2023.txt +16 -16
  130. pydra_core/data/statistics/Restant/Oosterschelde/ScenariokansenOSKering_2008.txt +23 -23
  131. pydra_core/data/statistics/Restant/Oosterschelde/ScenariokansenOSKering_2013.txt +18 -18
  132. pydra_core/data/statistics/Restant/Oosterschelde/ScenariokansenOSKering_2017.txt +18 -18
  133. pydra_core/data/statistics/Restant/Oosterschelde/ScenariokansenOSKering_2023.txt +13 -13
  134. pydra_core/data/statistics/Restant/Up2U/Up2U10.dat +59 -59
  135. pydra_core/data/statistics/Restant/Up2U/Up2Up.dat +59 -59
  136. pydra_core/data/statistics/Restant/Up2U/Up2Ustar.dat +59 -59
  137. pydra_core/data/statistics/Restant/hulpdijken.txt +59 -59
  138. pydra_core/data/statistics/Restant/hulpgolfhoogtes.txt +23 -23
  139. pydra_core/data/statistics/Restant/hulpgolfperiodes.txt +38 -38
  140. pydra_core/data/statistics/Restant/kansstormduur.txt +8 -8
  141. pydra_core/data/statistics/Restant/pwind_west.txt +33 -33
  142. pydra_core/data/statistics/Restant/pwind_west_met_Volkerfactor.txt +33 -33
  143. pydra_core/data/statistics/Restant/pwind_west_zonder_Volkerfactor.txt +33 -33
  144. pydra_core/data/statistics/Sigmafunctie/Hollandse Kust Midden/VS_sigmafunctie_Kust_Midden.txt +18 -18
  145. pydra_core/data/statistics/Sigmafunctie/Hollandse Kust Midden/VS_sigmafunctie_Kust_Midden_2017.txt +22 -22
  146. pydra_core/data/statistics/Sigmafunctie/Hollandse Kust Noord/VS_sigmafunctie_Kust_Noord.txt +18 -18
  147. pydra_core/data/statistics/Sigmafunctie/Hollandse Kust Noord/VS_sigmafunctie_Kust_Noord_2017.txt +22 -22
  148. pydra_core/data/statistics/Sigmafunctie/Hollandse Kust Zuid/VS_sigmafunctie_Kust_Zuid.txt +18 -18
  149. pydra_core/data/statistics/Sigmafunctie/Hollandse Kust Zuid/VS_sigmafunctie_Kust_Zuid_2017.txt +22 -22
  150. pydra_core/data/statistics/Sigmafunctie/Oosterschelde/VS_sigmafunctie_OS.txt +21 -21
  151. pydra_core/data/statistics/Sigmafunctie/Oosterschelde/VS_sigmafunctie_OS_16sectoren_2023.txt +23 -23
  152. pydra_core/data/statistics/Sigmafunctie/Oosterschelde/VS_sigmafunctie_OS_2017.txt +21 -21
  153. pydra_core/data/statistics/Sigmafunctie/Waddenzee Oost/VS_sigmafunctie_WZ_oost.txt +18 -18
  154. pydra_core/data/statistics/Sigmafunctie/Waddenzee Oost/VS_sigmafunctie_WZ_oost_2017.txt +22 -22
  155. pydra_core/data/statistics/Sigmafunctie/Waddenzee West/VS_sigmafunctie_WZ_west.txt +18 -18
  156. pydra_core/data/statistics/Sigmafunctie/Waddenzee West/VS_sigmafunctie_WZ_west_2017.txt +22 -22
  157. pydra_core/data/statistics/Sigmafunctie/Westerschelde/VS_sigmafunctie_WS.txt +18 -18
  158. pydra_core/data/statistics/Sigmafunctie/Westerschelde/VS_sigmafunctie_WS_2017.txt +22 -22
  159. pydra_core/data/statistics/Sluitpeilen/Sluitfunctie Europoortkering Maas 2017.csv +630 -630
  160. pydra_core/data/statistics/Sluitpeilen/Sluitfunctie Europoortkering Rijn 2017.csv +630 -630
  161. pydra_core/data/statistics/Sluitpeilen/Sluitfunctie Hollandsche IJsselkering.csv +757 -757
  162. pydra_core/data/statistics/Sluitpeilen/Sluitfunctie Oosterscheldekering 2017.csv +55080 -55080
  163. pydra_core/data/statistics/Topduur/Borgharen/Topduur_Borgharen_2017.txt +18 -18
  164. pydra_core/data/statistics/Topduur/Borgharen/Topduur_Borgharen_v00.txt +14 -14
  165. pydra_core/data/statistics/Topduur/Dalfsen/Topduur_Dalfsen_2017.txt +19 -19
  166. pydra_core/data/statistics/Topduur/Dalfsen/Topduur_Dalfsen_v01.txt +15 -15
  167. pydra_core/data/statistics/Topduur/Grevelingenmeer/Topduur_Grevelingenmeer_2017.txt +13 -13
  168. pydra_core/data/statistics/Topduur/Grevelingenmeer/Topduur_Grevelingenmeer_v01.txt +13 -13
  169. pydra_core/data/statistics/Topduur/IJsselmeer/Topduur_IJsselmeer_2017.txt +19 -19
  170. pydra_core/data/statistics/Topduur/IJsselmeer/Topduur_IJsselmeer_v01.txt +14 -14
  171. pydra_core/data/statistics/Topduur/Lith/Topduur_Lith_2017.txt +18 -18
  172. pydra_core/data/statistics/Topduur/Lith/Topduur_Lith_v01.txt +17 -17
  173. pydra_core/data/statistics/Topduur/Lobith/Topduur_Lobith_2017.txt +18 -18
  174. pydra_core/data/statistics/Topduur/Lobith/Topduur_Lobith_v01.txt +16 -16
  175. pydra_core/data/statistics/Topduur/Markermeer/Topduur_Markermeer_2017.txt +19 -19
  176. pydra_core/data/statistics/Topduur/Markermeer/Topduur_Markermeer_v01.txt +11 -11
  177. pydra_core/data/statistics/Topduur/Olst/Topduur_Olst_2017.txt +19 -19
  178. pydra_core/data/statistics/Topduur/Olst/Topduur_Olst_v01.txt +15 -15
  179. pydra_core/data/statistics/Topduur/Veerse Meer/Topduur_Veersemeer_excl_peilverhoging.txt +12 -12
  180. pydra_core/data/statistics/Topduur/Veerse Meer/Topduur_Veersemeer_v01.txt +15 -15
  181. pydra_core/data/statistics/Topduur/Veluwerandmeer/Topduur_Veluwerandmeer_2017.txt +11 -11
  182. pydra_core/data/statistics/Topduur/Veluwerandmeer/Topduur_Veluwerandmeer_v01.txt +11 -11
  183. pydra_core/data/statistics/Topduur/Volkerak-Zoommeer/Topduur_Volkerakzoommeer_BER-VZM.txt +17 -17
  184. pydra_core/data/statistics/Windrichting/Deelen/Richtingskansen_Deelen_2017.txt +27 -27
  185. pydra_core/data/statistics/Windrichting/Hollandse Kust/KansenWindrichting_Kust.txt +16 -16
  186. pydra_core/data/statistics/Windrichting/Hollandse Kust/KansenWindrichting_Kust_2017.txt +23 -23
  187. pydra_core/data/statistics/Windrichting/Oosterschelde/KansenWindrichting_16sectoren_OS_2023.txt +30 -30
  188. pydra_core/data/statistics/Windrichting/Oosterschelde/KansenWindrichting_OS.txt +19 -19
  189. pydra_core/data/statistics/Windrichting/Oosterschelde/KansenWindrichting_OS_2017.txt +23 -23
  190. pydra_core/data/statistics/Windrichting/Schiphol/Richtingskansen_Schiphol_12sectoren.txt +19 -19
  191. pydra_core/data/statistics/Windrichting/Schiphol/Richtingskansen_Schiphol_12sectoren_2017.txt +19 -19
  192. pydra_core/data/statistics/Windrichting/Schiphol/Richtingskansen_Schiphol_2017.txt +27 -27
  193. pydra_core/data/statistics/Windrichting/Schiphol/kanswindrichting_v01.txt +28 -28
  194. pydra_core/data/statistics/Windrichting/Waddenzee/KansenWindrichting_WZ.txt +16 -16
  195. pydra_core/data/statistics/Windrichting/Waddenzee/KansenWindrichting_WZ_2017.txt +23 -23
  196. pydra_core/data/statistics/Windrichting/Westerschelde/KansenWindrichting_WS.txt +16 -16
  197. pydra_core/data/statistics/Windrichting/Westerschelde/KansenWindrichting_WS_2017.txt +23 -23
  198. pydra_core/data/statistics/Windsnelheid/De Kooy/OvkansWindsnelheid_Texel.txt +69 -69
  199. pydra_core/data/statistics/Windsnelheid/De Kooy/Ovkanswind_de Kooy_2017.txt +91 -91
  200. pydra_core/data/statistics/Windsnelheid/De Kooy/Ovkanswind_de Kooy_2017_metOnzHeid.txt +91 -91
  201. pydra_core/data/statistics/Windsnelheid/Deelen/Ovkanswind_Deelen_2017.txt +90 -90
  202. pydra_core/data/statistics/Windsnelheid/Deelen/Ovkanswind_Deelen_2017_metOnzHeid.txt +90 -90
  203. pydra_core/data/statistics/Windsnelheid/Hoek van Holland/OvkansWindsnelheid_Hoek van Holland.txt +69 -69
  204. pydra_core/data/statistics/Windsnelheid/Hoek van Holland/Ovkanswind_Hoek van Holland_2017.txt +91 -91
  205. pydra_core/data/statistics/Windsnelheid/Hoek van Holland/Ovkanswind_Hoek van Holland_2017_metOnzHeid.txt +91 -91
  206. pydra_core/data/statistics/Windsnelheid/IJmuiden/OvkansWindsnelheid_IJmuiden.txt +69 -69
  207. pydra_core/data/statistics/Windsnelheid/IJmuiden/Ovkanswind_IJmuiden_2017.txt +91 -91
  208. pydra_core/data/statistics/Windsnelheid/IJmuiden/Ovkanswind_IJmuiden_2017_metOnzHeid.txt +91 -91
  209. pydra_core/data/statistics/Windsnelheid/Schiphol/Ovkanswind_Schiphol_12sectoren.txt +50 -50
  210. pydra_core/data/statistics/Windsnelheid/Schiphol/Ovkanswind_Schiphol_12sectoren_2017.txt +90 -90
  211. pydra_core/data/statistics/Windsnelheid/Schiphol/Ovkanswind_Schiphol_12sectoren_2017_metOnzHeid.txt +90 -90
  212. pydra_core/data/statistics/Windsnelheid/Schiphol/Ovkanswind_Schiphol_12sectoren_2017_metWindDrag.txt +96 -96
  213. pydra_core/data/statistics/Windsnelheid/Schiphol/Ovkanswind_Schiphol_12sectoren_2017_metWindDrag_metOnzHeid.txt +96 -96
  214. pydra_core/data/statistics/Windsnelheid/Schiphol/Ovkanswind_Schiphol_16sectoren_2017_metWindDrag.txt +96 -96
  215. pydra_core/data/statistics/Windsnelheid/Schiphol/Ovkanswind_Schiphol_16sectoren_2017_metWindDrag_metOnzHeid.txt +96 -96
  216. pydra_core/data/statistics/Windsnelheid/Schiphol/Ovkanswind_Schiphol_2017.txt +90 -90
  217. pydra_core/data/statistics/Windsnelheid/Schiphol/Ovkanswind_Schiphol_2017_metOnzHeid.txt +90 -90
  218. pydra_core/data/statistics/Windsnelheid/Schiphol/Ovkanswind_Schiphol_met_Volkerfactor_2017.txt +90 -90
  219. pydra_core/data/statistics/Windsnelheid/Schiphol/Ovkanswind_Schiphol_met_Volkerfactor_2017_metOnzHeid.txt +90 -90
  220. pydra_core/data/statistics/Windsnelheid/Schiphol/Ovkanswind_schiphol.txt +57 -57
  221. pydra_core/data/statistics/Windsnelheid/Schiphol/Ovkanswind_schiphol_10%.txt +63 -63
  222. pydra_core/data/statistics/Windsnelheid/Schiphol/Ovkanswind_schiphol_5%.txt +61 -61
  223. pydra_core/data/statistics/Windsnelheid/Schiphol/Ovkanswind_schiphol_B_met volker.txt +59 -59
  224. pydra_core/data/statistics/Windsnelheid/Vlissingen/OvkansWindsnelheid_OS.txt +66 -66
  225. pydra_core/data/statistics/Windsnelheid/Vlissingen/OvkansWindsnelheid_Vlissingen.txt +69 -69
  226. pydra_core/data/statistics/Windsnelheid/Vlissingen/Ovkanswind_Vlissingen_16sectoren_2023.txt +91 -91
  227. pydra_core/data/statistics/Windsnelheid/Vlissingen/Ovkanswind_Vlissingen_16sectoren_2023_metOnzHeid.txt +90 -90
  228. pydra_core/data/statistics/Windsnelheid/Vlissingen/Ovkanswind_Vlissingen_2017.txt +91 -91
  229. pydra_core/data/statistics/Windsnelheid/Vlissingen/Ovkanswind_Vlissingen_2017_metOnzHeid.txt +91 -91
  230. pydra_core/data/statistics/Windsnelheid/Vlissingen/Ovkanswind_Vlissingen_2017_metWindDrag.txt +96 -96
  231. pydra_core/data/statistics/Windsnelheid/Vlissingen/Ovkanswind_Vlissingen_2017_metWindDrag_metOnzHeid.txt +96 -96
  232. pydra_core/data/statistics/Windsnelheid/West-Terschelling/OvkansWindsnelheid_West-Tersch.txt +69 -69
  233. pydra_core/data/statistics/Windsnelheid/West-Terschelling/Ovkanswind_West Terschelling_2017.txt +91 -91
  234. pydra_core/data/statistics/Windsnelheid/West-Terschelling/Ovkanswind_West Terschelling_2017_metOnzHeid.txt +91 -91
  235. pydra_core/data/statistics/Zeewaterstand/Delfzijl/CondPovDelfzijl_12u_zichtjaar1985_2017.txt +81 -81
  236. pydra_core/data/statistics/Zeewaterstand/Delfzijl/CondPovDelfzijl_12u_zichtjaar1985_2017_metOnzHeid.txt +81 -81
  237. pydra_core/data/statistics/Zeewaterstand/Delfzijl/CondPovDelfzijl_12u_zichtjaar2017.txt +81 -81
  238. pydra_core/data/statistics/Zeewaterstand/Delfzijl/CondPovDelfzijl_12u_zichtjaar2017_metOnzHeid.txt +81 -81
  239. pydra_core/data/statistics/Zeewaterstand/Delfzijl/OvkansZee_Delfzijl.txt +70 -70
  240. pydra_core/data/statistics/Zeewaterstand/Den Helder/CondPovDenHelder_12u_zichtjaar1985_2017.txt +89 -89
  241. pydra_core/data/statistics/Zeewaterstand/Den Helder/CondPovDenHelder_12u_zichtjaar1985_2017_metOnzHeid.txt +89 -89
  242. pydra_core/data/statistics/Zeewaterstand/Den Helder/CondPovDenHelder_12u_zichtjaar2017.txt +88 -88
  243. pydra_core/data/statistics/Zeewaterstand/Den Helder/CondPovDenHelder_12u_zichtjaar2017_metOnzHeid.txt +88 -88
  244. pydra_core/data/statistics/Zeewaterstand/Den Helder/OvkansZee_Den Helder.txt +70 -70
  245. pydra_core/data/statistics/Zeewaterstand/Den Oever/CondPovDenOeverBuiten_12u_zichtjaar1985_2017.txt +88 -88
  246. pydra_core/data/statistics/Zeewaterstand/Den Oever/CondPovDenOeverBuiten_12u_zichtjaar1985_2017_metOnzHeid.txt +88 -88
  247. pydra_core/data/statistics/Zeewaterstand/Den Oever/CondPovDenOeverBuiten_12u_zichtjaar2017.txt +87 -87
  248. pydra_core/data/statistics/Zeewaterstand/Den Oever/CondPovDenOeverBuiten_12u_zichtjaar2017_metOnzHeid.txt +87 -87
  249. pydra_core/data/statistics/Zeewaterstand/Den Oever/OvkansZee_Den Oever.txt +70 -70
  250. pydra_core/data/statistics/Zeewaterstand/Hansweert/CondPovHansweert_12u_zichtjaar1985_2017.txt +71 -71
  251. pydra_core/data/statistics/Zeewaterstand/Hansweert/CondPovHansweert_12u_zichtjaar1985_2017_metOnzHeid.txt +71 -71
  252. pydra_core/data/statistics/Zeewaterstand/Hansweert/CondPovHansweert_12u_zichtjaar2017.txt +70 -70
  253. pydra_core/data/statistics/Zeewaterstand/Hansweert/CondPovHansweert_12u_zichtjaar2017_metOnzHeid.txt +70 -70
  254. pydra_core/data/statistics/Zeewaterstand/Hansweert/OvkansZee_Hansweert.txt +70 -70
  255. pydra_core/data/statistics/Zeewaterstand/Harlingen/CondPovHarlingen_12u_zichtjaar1985_2017.txt +85 -85
  256. pydra_core/data/statistics/Zeewaterstand/Harlingen/CondPovHarlingen_12u_zichtjaar1985_2017_metOnzHeid.txt +85 -85
  257. pydra_core/data/statistics/Zeewaterstand/Harlingen/CondPovHarlingen_12u_zichtjaar2017.txt +84 -84
  258. pydra_core/data/statistics/Zeewaterstand/Harlingen/CondPovHarlingen_12u_zichtjaar2017_metOnzHeid.txt +84 -84
  259. pydra_core/data/statistics/Zeewaterstand/Harlingen/OvkansZee_Harlingen.txt +70 -70
  260. pydra_core/data/statistics/Zeewaterstand/Hoek van Holland/CondPovHoekvanHolland_12u_zichtjaar1985_2017.txt +84 -84
  261. pydra_core/data/statistics/Zeewaterstand/Hoek van Holland/CondPovHoekvanHolland_12u_zichtjaar1985_2017_metOnzHeid.txt +84 -84
  262. pydra_core/data/statistics/Zeewaterstand/Hoek van Holland/CondPovHoekvanHolland_12u_zichtjaar2017.txt +83 -83
  263. pydra_core/data/statistics/Zeewaterstand/Hoek van Holland/CondPovHoekvanHolland_12u_zichtjaar2017_metOnzHeid.txt +83 -83
  264. pydra_core/data/statistics/Zeewaterstand/Hoek van Holland/OvkansZee_Hoek van Holland.txt +70 -70
  265. pydra_core/data/statistics/Zeewaterstand/Huibertgat/CondPovHuibertgat_12u_zichtjaar1985_2017.txt +86 -86
  266. pydra_core/data/statistics/Zeewaterstand/Huibertgat/CondPovHuibertgat_12u_zichtjaar1985_2017_metOnzHeid.txt +86 -86
  267. pydra_core/data/statistics/Zeewaterstand/Huibertgat/CondPovHuibertgat_12u_zichtjaar2017.txt +85 -85
  268. pydra_core/data/statistics/Zeewaterstand/Huibertgat/CondPovHuibertgat_12u_zichtjaar2017_metOnzHeid.txt +85 -85
  269. pydra_core/data/statistics/Zeewaterstand/Huibertgat/OvkansZee_Huibertgat.txt +70 -70
  270. pydra_core/data/statistics/Zeewaterstand/IJmuiden/CondPovIJmuiden_12u_zichtjaar1985_2017.txt +85 -85
  271. pydra_core/data/statistics/Zeewaterstand/IJmuiden/CondPovIJmuiden_12u_zichtjaar1985_2017_metOnzHeid.txt +85 -85
  272. pydra_core/data/statistics/Zeewaterstand/IJmuiden/CondPovIJmuiden_12u_zichtjaar2017.txt +85 -85
  273. pydra_core/data/statistics/Zeewaterstand/IJmuiden/CondPovIJmuiden_12u_zichtjaar2017_metOnzHeid.txt +85 -85
  274. pydra_core/data/statistics/Zeewaterstand/IJmuiden/OvkansZee_IJmuiden.txt +70 -70
  275. pydra_core/data/statistics/Zeewaterstand/IJmuiden virtueel/CondPovIJmuiden-Additional_12u_zichtjaar1985_2017.txt +85 -85
  276. pydra_core/data/statistics/Zeewaterstand/IJmuiden virtueel/CondPovIJmuiden-Additional_12u_zichtjaar1985_2017_metOnzHeid.txt +85 -85
  277. pydra_core/data/statistics/Zeewaterstand/IJmuiden virtueel/CondPovIJmuiden-Additional_12u_zichtjaar2017.txt +85 -85
  278. pydra_core/data/statistics/Zeewaterstand/IJmuiden virtueel/CondPovIJmuiden-Additional_12u_zichtjaar2017_metOnzHeid.txt +85 -85
  279. pydra_core/data/statistics/Zeewaterstand/IJmuiden virtueel/OvkansZee_IJmuiden_virtueel.txt +70 -70
  280. pydra_core/data/statistics/Zeewaterstand/Lauwersoog/CondPovLauwersoog_12u_zichtjaar1985_2017.txt +85 -85
  281. pydra_core/data/statistics/Zeewaterstand/Lauwersoog/CondPovLauwersoog_12u_zichtjaar1985_2017_metOnzHeid.txt +85 -85
  282. pydra_core/data/statistics/Zeewaterstand/Lauwersoog/CondPovLauwersoog_12u_zichtjaar2017.txt +84 -84
  283. pydra_core/data/statistics/Zeewaterstand/Lauwersoog/CondPovLauwersoog_12u_zichtjaar2017_metOnzHeid.txt +84 -84
  284. pydra_core/data/statistics/Zeewaterstand/Lauwersoog/OvkansZee_Lauwersoog.txt +70 -70
  285. pydra_core/data/statistics/Zeewaterstand/Maasmond/CondPovMaasmond_12u_zichtjaar1985_2011.txt +88 -88
  286. pydra_core/data/statistics/Zeewaterstand/Maasmond/CondPovMaasmond_12u_zichtjaar1985_2017.txt +88 -88
  287. pydra_core/data/statistics/Zeewaterstand/Maasmond/CondPovMaasmond_12u_zichtjaar1985_2017_metOnzheid.txt +92 -92
  288. pydra_core/data/statistics/Zeewaterstand/Maasmond/CondPovMaasmond_12u_zichtjaar2017.txt +85 -85
  289. pydra_core/data/statistics/Zeewaterstand/Maasmond/CondPovMaasmond_12u_zichtjaar2017_metOnzheid.txt +85 -85
  290. pydra_core/data/statistics/Zeewaterstand/Oosterschelde/CondPovOS11_12u_zichtjaar1985_2017.txt +79 -79
  291. pydra_core/data/statistics/Zeewaterstand/Oosterschelde/CondPovOS11_12u_zichtjaar1985_2017_metOnzHeid.txt +79 -79
  292. pydra_core/data/statistics/Zeewaterstand/Oosterschelde/CondPovOS11_12u_zichtjaar2017.txt +79 -79
  293. pydra_core/data/statistics/Zeewaterstand/Oosterschelde/CondPovOS11_12u_zichtjaar2017_metOnzHeid.txt +79 -79
  294. pydra_core/data/statistics/Zeewaterstand/Oosterschelde/CondPovOS11_16sectoren_12u_2023.txt +74 -74
  295. pydra_core/data/statistics/Zeewaterstand/Oosterschelde/CondPovOS11_16sectoren_12u_2023_metOnzHeid.txt +73 -73
  296. pydra_core/data/statistics/Zeewaterstand/Oosterschelde/OvkansZee_OS11.txt +70 -70
  297. pydra_core/data/statistics/Zeewaterstand/Oosterschelde/OvkansZeewaterstand_OS.txt +71 -71
  298. pydra_core/data/statistics/Zeewaterstand/Vlissingen/CondPovVlissingen_12u_zichtjaar1985_2017.txt +74 -74
  299. pydra_core/data/statistics/Zeewaterstand/Vlissingen/CondPovVlissingen_12u_zichtjaar1985_2017_metOnzHeid.txt +74 -74
  300. pydra_core/data/statistics/Zeewaterstand/Vlissingen/CondPovVlissingen_12u_zichtjaar2017.txt +74 -74
  301. pydra_core/data/statistics/Zeewaterstand/Vlissingen/CondPovVlissingen_12u_zichtjaar2017_metOnzHeid.txt +74 -74
  302. pydra_core/data/statistics/Zeewaterstand/Vlissingen/OvkansZee_Vlissingen.txt +70 -70
  303. pydra_core/data/statistics/Zeewaterstand/Vlissingen virtueel/CondPovVlissingen-Additional_12u_zichtjaar1985_2017.txt +74 -74
  304. pydra_core/data/statistics/Zeewaterstand/Vlissingen virtueel/CondPovVlissingen-Additional_12u_zichtjaar1985_2017_metOnzHeid.txt +74 -74
  305. pydra_core/data/statistics/Zeewaterstand/Vlissingen virtueel/CondPovVlissingen-Additional_12u_zichtjaar2017.txt +74 -74
  306. pydra_core/data/statistics/Zeewaterstand/Vlissingen virtueel/CondPovVlissingen-Additional_12u_zichtjaar2017_metOnzHeid.txt +74 -74
  307. pydra_core/data/statistics/Zeewaterstand/Vlissingen virtueel/OvkansZee_Vlissingen_virtueel.txt +70 -70
  308. pydra_core/data/statistics/Zeewaterstand/West-Terschelling/CondPovWestTerschelling_12u_zichtjaar1985_2017.txt +87 -87
  309. pydra_core/data/statistics/Zeewaterstand/West-Terschelling/CondPovWestTerschelling_12u_zichtjaar1985_2017_metOnzHeid.txt +87 -87
  310. pydra_core/data/statistics/Zeewaterstand/West-Terschelling/CondPovWestTerschelling_12u_zichtjaar2017.txt +86 -86
  311. pydra_core/data/statistics/Zeewaterstand/West-Terschelling/CondPovWestTerschelling_12u_zichtjaar2017_metOnzHeid.txt +86 -86
  312. pydra_core/data/statistics/Zeewaterstand/West-Terschelling/OvkansZee_West-Terschelling.txt +70 -70
  313. pydra_core/hrdatabase/hrdatabase.py +177 -177
  314. pydra_core/io/database_hr.py +598 -598
  315. pydra_core/io/database_settings.py +183 -183
  316. pydra_core/io/file_hydranl.py +92 -92
  317. pydra_core/location/location.py +115 -115
  318. pydra_core/location/model/base_model.py +270 -270
  319. pydra_core/location/model/loading/loading.py +368 -368
  320. pydra_core/location/model/loading/loading_factory.py +89 -89
  321. pydra_core/location/model/loading/loading_model/loading_model.py +324 -324
  322. pydra_core/location/model/loading/other_systems/loading_wave_overtopping.py +122 -122
  323. pydra_core/location/model/loading/water_systems/loading_coast.py +54 -54
  324. pydra_core/location/model/loading/water_systems/loading_eastern_scheldt.py +169 -169
  325. pydra_core/location/model/loading/water_systems/loading_ijssel_vechtdelta.py +55 -55
  326. pydra_core/location/model/loading/water_systems/loading_lake.py +55 -55
  327. pydra_core/location/model/loading/water_systems/loading_lower_rivier.py +68 -68
  328. pydra_core/location/model/loading/water_systems/loading_upper_river.py +55 -55
  329. pydra_core/location/model/statistics/other_systems/statistics_wave_overtopping.py +72 -72
  330. pydra_core/location/model/statistics/statistics.py +171 -171
  331. pydra_core/location/model/statistics/statistics_factory.py +89 -89
  332. pydra_core/location/model/statistics/stochastics/barrier/barrier.py +43 -43
  333. pydra_core/location/model/statistics/stochastics/barrier/barrier_easternscheldt.py +147 -147
  334. pydra_core/location/model/statistics/stochastics/barrier/barrier_europoort.py +209 -209
  335. pydra_core/location/model/statistics/stochastics/barrier/barrier_ramspol.py +41 -41
  336. pydra_core/location/model/statistics/stochastics/barrier/no_barrier.py +21 -21
  337. pydra_core/location/model/statistics/stochastics/discharge.py +108 -108
  338. pydra_core/location/model/statistics/stochastics/discrete_probability.py +55 -55
  339. pydra_core/location/model/statistics/stochastics/lake_level.py +158 -158
  340. pydra_core/location/model/statistics/stochastics/model_uncertainty.py +358 -358
  341. pydra_core/location/model/statistics/stochastics/sea_level/sea_level.py +53 -53
  342. pydra_core/location/model/statistics/stochastics/sea_level/sea_level_lower_river.py +93 -93
  343. pydra_core/location/model/statistics/stochastics/sea_level/sea_level_point.py +65 -65
  344. pydra_core/location/model/statistics/stochastics/sea_level/sea_level_triangular.py +158 -158
  345. pydra_core/location/model/statistics/stochastics/sigma_function.py +24 -24
  346. pydra_core/location/model/statistics/stochastics/wave_shape.py +624 -624
  347. pydra_core/location/model/statistics/stochastics/wind_speed.py +196 -196
  348. pydra_core/location/model/statistics/water_systems/statistics_coast.py +153 -153
  349. pydra_core/location/model/statistics/water_systems/statistics_eastern_scheldt.py +177 -177
  350. pydra_core/location/model/statistics/water_systems/statistics_ijssel_vechtdelta.py +229 -229
  351. pydra_core/location/model/statistics/water_systems/statistics_lake.py +86 -86
  352. pydra_core/location/model/statistics/water_systems/statistics_lower_river.py +321 -321
  353. pydra_core/location/model/statistics/water_systems/statistics_upper_river.py +86 -86
  354. pydra_core/location/model/water_system.py +249 -249
  355. pydra_core/location/model/wave_overtopping.py +25 -25
  356. pydra_core/location/profile/foreland.py +246 -246
  357. pydra_core/location/profile/lib/CombOverloopOverslag64.dll +0 -0
  358. pydra_core/location/profile/lib/DynamicLib-DaF.dll +0 -0
  359. pydra_core/location/profile/lib/README.MD +10 -10
  360. pydra_core/location/profile/lib/dllDikesOvertopping.dll +0 -0
  361. pydra_core/location/profile/lib/feedbackDLL.dll +0 -0
  362. pydra_core/location/profile/profile.py +971 -971
  363. pydra_core/location/profile/profile_loading.py +473 -473
  364. pydra_core/location/settings/settings.py +387 -387
  365. {pydra_core-0.0.1.dist-info → pydra_core-0.0.3.dist-info}/METADATA +25 -5
  366. pydra_core-0.0.3.dist-info/RECORD +393 -0
  367. pydra_core-0.0.1.dist-info/RECORD +0 -389
  368. {pydra_core-0.0.1.dist-info → pydra_core-0.0.3.dist-info}/WHEEL +0 -0
@@ -1,624 +1,624 @@
1
- import numpy as np
2
-
3
- from scipy.stats import norm
4
-
5
- from ....settings.settings import Settings
6
- from .....common.enum import WaveShapeType
7
- from .....common.interpolate import Interpolate, InterpStruct
8
- from .....common.probability import ProbabilityFunctions
9
- from .....io.file_hydranl import FileHydraNL
10
-
11
-
12
- class WaveShape:
13
- """
14
- Class to describe the wave form statistics.
15
- Used in describing wave forms in river discharge and lake level.
16
- """
17
-
18
- def __init__(self, settings: Settings, type: WaveShapeType):
19
- """
20
- Constructor class for the WaveShape statistics.
21
-
22
- Parameters
23
- ----------
24
- settings : Settings
25
- The Settings object
26
- """
27
- # Placeholder
28
- self.wave_shapes = None
29
-
30
- # Obtain the parameters
31
- self.base_duration = settings.base_duration
32
- self.pw = settings.waveshape_pw
33
- if type == WaveShapeType.DISCHARGE:
34
- self.top_duration = settings.top_duration_q
35
- self.lower_limit = settings.q_min
36
- self.upper_limit = settings.q_limit
37
- self.ifh = settings.ifh_q
38
- self.ifb = settings.ifb_q
39
- elif type == WaveShapeType.LAKE_LEVEL:
40
- self.top_duration = settings.top_duration_a
41
- self.lower_limit = settings.a_min
42
- self.upper_limit = settings.a_limit
43
- self.ifh = settings.ifh_a
44
- self.ifb = settings.ifb_a
45
- else:
46
- raise TypeError("[ERROR] Unknown WaveShape type.")
47
-
48
- # Time
49
- self.time = np.arange(
50
- 0.0, settings.base_duration + 1e-6, settings.waveshape_time_step
51
- )
52
- self.ntime = len(self.time)
53
- if settings.base_duration != max(self.time):
54
- settings.base_duration = max(self.time)
55
- print(
56
- f"[NOTE] Base duration adjusted to blok wind ({settings.waveshape_time_step}h)."
57
- )
58
-
59
- def initialise_wave_shapes(self, peak: list, climate_change: float = 0.0):
60
- """
61
- Initialize the wave shapes for discharge or lake level.
62
-
63
- Parameters
64
- ----------
65
- peak : list
66
- A list with peak values or the discharge / lake level
67
- climate_change : float
68
- Increase of discharge or lake level to account for climate change (default = 0.0)
69
- """
70
- # Save
71
- self.peak = peak
72
- self.npeak = len(peak)
73
-
74
- # Determine shape of the wave
75
- if not self.pw:
76
- # Init wave shapes
77
- self.wave_shapes = self.__initialise_wave_shape(climate_change)
78
- self.wave_shapes = np.maximum(self.wave_shapes, self.lower_limit)
79
-
80
- # Read from a file
81
- else:
82
- raise NotImplementedError()
83
-
84
- def transition_wave(self, transition: float) -> None:
85
- """
86
- Transition wave form
87
-
88
- Parameters
89
- ----------
90
- transition : float
91
- Transition in hours
92
- """
93
- tijdenlang = np.zeros(2 * self.ntime - 1)
94
- golflang = np.zeros(2 * self.ntime - 1)
95
-
96
- if transition >= 0.0:
97
- # Als de verschuiving positief is in de tijd, dan wordt de tijdas
98
- # vooruit verschoven en eenzelfde periode wordt voor deze
99
- # verschoven tijdas geplaatst
100
- it = np.arange(self.ntime)
101
- tijdenlang[it + self.ntime - 1] = self.time[it] + transition
102
-
103
- it = np.arange(self.ntime - 1)
104
- tijdenlang[it] = tijdenlang[it + self.ntime - 1] - self.base_duration
105
-
106
- else:
107
- # Als de verschuiving negatief is in de tijd, dan wordt de tijdas
108
- # terug verschoven en eenzelfde periode wordt achter deze verschoven
109
- # tijdas geplaatst
110
- it = np.arange(self.ntime)
111
- tijdenlang[it] = self.time[it] + transition
112
- it = np.arange(1, self.ntime)
113
- tijdenlang[it + self.ntime - 1] = tijdenlang[it] + self.base_duration
114
-
115
- # Bij de verschoven en uitgebreide tijdas worden de golfvormen twee keer gezet
116
- # Door interpolatie worden op het reguliere rooster de uiteindelijke
117
- # verschoven golfvormen verkregen
118
- intstr = InterpStruct(x=self.time, xp=tijdenlang)
119
- for ip in range(self.npeak):
120
- golflang[: self.ntime] = self.wave_shapes[:, ip]
121
- golflang[self.ntime :] = golflang[1 : self.ntime]
122
- self.wave_shapes[:, ip] = intstr.interp(fp=golflang, extrapolate=False)
123
-
124
- def get_wave_shapes(self) -> np.ndarray:
125
- """
126
- Return the wave shapes.
127
-
128
- Returns
129
- -------
130
- np.ndarray
131
- Array with size (t, peak)
132
- """
133
- return self.wave_shapes
134
-
135
- def exceedance_timestamps(self, levels: np.ndarray):
136
- """
137
- Determine the exceedance durations for several levels in the waveshapes,
138
- given the peak levels of the wave.
139
-
140
- Parameters
141
- ----------
142
- levels : np.ndarray
143
- Levels for which the exceedance duration is determined.
144
-
145
- Returns
146
- -------
147
- np.ndarray
148
- Exceedance duration [N peak x N levels]
149
- """
150
- # Check if the wave shapes are defined
151
- if self.wave_shapes is None:
152
- raise ValueError("[ERROR] Wave shaped are not defined.")
153
-
154
- # Init empty array
155
- ovduur = np.zeros((self.npeak, len(levels)))
156
-
157
- # Bepaal voor elk blokniveau de overschrijdingsduren
158
- for ip in range(self.npeak):
159
- # Get one wave shape
160
- wave_shape = self.wave_shapes[:, ip]
161
-
162
- # Initieer lege arrays
163
- t_boven = np.zeros_like(levels)
164
- t_onder = np.zeros_like(levels)
165
-
166
- # Bepaal waar de niveaus gelijk of hoger zijn aan de golfvorm, hiervoor zijn er geen overschrijdingen
167
- idx = levels > wave_shape.max()
168
- t_boven[idx] = -1.0
169
- t_onder[idx] = -1.0
170
-
171
- # Aangenomen wordt dat de golf een monotoon opgaande en neergaande flank heeft.
172
- # Onder deze aanname kan met interpolatie de kruisingen bepaald worden.
173
- diff = wave_shape[1:] - wave_shape[:-1]
174
-
175
- # Het verschil is de afstand van het volgende punt ten opzichte van het huidige punt
176
- opgaand = np.concatenate([[True], diff > 0])
177
- neergaand = np.concatenate([diff < 0, [True]])
178
- t_boven[~idx] = np.interp(
179
- x=levels[~idx], xp=wave_shape[opgaand], fp=self.time[opgaand]
180
- )
181
- t_onder[~idx] = np.interp(
182
- x=levels[~idx],
183
- xp=wave_shape[neergaand][::-1],
184
- fp=self.time[neergaand][::-1],
185
- )
186
- ovduur[ip, :] = t_onder - t_boven
187
-
188
- # Return
189
- return ovduur
190
-
191
- def instantaneous_exceedance_probability(self, exceedance_peaks, levels):
192
- """
193
- Calculate the instantaneous exceedance probability of the discharge/water level
194
- for each peak value of a discharge/water level wave.
195
- {
196
- Calculate the time when the discharge/water level is higher than a given level
197
- and determine the time when the discharge/water level is lower than the given level.
198
- Determine the duration of exceedance.
199
- Use the composite trapezoidal rule for calculating the instantaneous exceedance probability
200
- of the discharge/water level.
201
- }
202
- """
203
- # Calculate the vector with probability densities of the discharge/water level
204
- peak_probability = ProbabilityFunctions.probability_density(
205
- self.peak, exceedance_peaks
206
- ).probability
207
- instantaneous_prob = np.zeros_like(levels)
208
- exceedance_duration = self.exceedance_timestamps(levels)
209
-
210
- for ib in range(len(levels)):
211
- integral = (exceedance_duration[:, ib] * peak_probability).sum()
212
-
213
- # Calculate the instantaneous exceedance probability of the discharge/water level
214
- instantaneous_prob[ib] = integral / self.base_duration
215
-
216
- return instantaneous_prob
217
-
218
- def cum_norm_s_naar_y(self, y, mu, sigma):
219
- """
220
- Bepaal de cumulatieve verdelingsfunctie voor het meerpeil onder de transformatie van s naar y = K(s)
221
- {
222
- y= Parameterwaarde
223
- mu= Gemiddelde van de normale verdeling
224
- sigma= Standaarddeviatie van de normale verdeling
225
- }
226
- """
227
- if sigma <= 0:
228
- # Geef foutmelding
229
- raise ValueError("Sigma <= 0")
230
-
231
- # Integratiegrenzen en stapgrootte
232
- stap = 0.05
233
- x = np.arange(0, 20 + 0.1 * stap, stap)
234
-
235
- # Voor de parameterwaarde wordt de integraal over het rooster berekend. Let wel: delta = 0
236
- yn = (y[None, :] - x[:, None] - mu) / sigma
237
-
238
- dx = np.diff(np.r_[x[0], (x[1:] + x[:-1]) / 2.0, x[-1]])
239
- f_y_sigma = (np.exp(-x[:, None]) * norm().cdf(x=yn) * dx[:, None]).sum(0)
240
-
241
- return f_y_sigma
242
-
243
- def __initialise_wave_shape(self, climate_change: float) -> np.ndarray:
244
- """
245
- Create the wave shapes for discharge or lake level.
246
-
247
- Parameters
248
- ----------
249
- climate_change : float
250
- Increase of discharge or lake level to account for climate change (default = 0.0)
251
-
252
- Returns
253
- -------
254
- np.ndarray
255
- A 2D array with wave shapes (time, q_m_peak)
256
- """
257
- # Read the table with top durations (t_top) given q or m (q_m)
258
- _q_m, _t_top = FileHydraNL.read_file_2columns(self.top_duration)
259
-
260
- # Correct for climate change (increase discharge or lake level)
261
- if climate_change > 0.0:
262
- _q_m += climate_change
263
-
264
- # Check if the top duration is larger than the base duration
265
- if (_t_top > self.base_duration).any():
266
- print(
267
- f"[WARNING] Top duration from file '{self.top_duration}' is larger than base duration."
268
- )
269
-
270
- # Increase the arrays with 1 element to allow for extrapolation
271
- q_m = np.r_[_q_m, 2.0 * _q_m[-1] - _q_m[-2]]
272
- t_top = np.r_[_t_top, _t_top[-1]]
273
-
274
- # Calculate for each peak the top duration
275
- top_durations = Interpolate.inextrp1d(x=self.peak, xp=q_m, fp=t_top)
276
-
277
- # Create an empty array of size (t, peak) for the wave shapes
278
- wave_shapes = np.zeros((len(self.time), len(self.peak)))
279
-
280
- # Create a trapezoid wave shape
281
- for ip, top_duration in enumerate(top_durations):
282
- # If the discretisation step for wave shapes is equal to the base_duration
283
- if (
284
- self.peak[ip] < q_m[0]
285
- or (self.time[1] - self.time[0]) == self.base_duration
286
- ):
287
- # Vul de vector met tijdstippen
288
- ttabel = [0.0, self.base_duration]
289
-
290
- # Vul de vector met golfwaarden
291
- gtabel = [self.peak[ip], self.peak[ip]]
292
-
293
- # If the top duration is equal to 0.0
294
- elif top_duration == 0.0:
295
- # Als ingesnoerd wordt totaan het tijdstip waarop de golfvorm de maximale waarde heeft
296
- if self.ifb == 0.0:
297
- # Vul de vector met tijdstippen
298
- ttabel = np.array(
299
- [
300
- 0,
301
- self.base_duration / 2.0 - 0.0001,
302
- self.base_duration / 2.0,
303
- self.base_duration / 2.0 + 0.0001,
304
- self.base_duration,
305
- ]
306
- )
307
-
308
- # Vul de vector met golfwaarden
309
- gtabel = np.array(
310
- [
311
- self.lower_limit,
312
- self.lower_limit
313
- + self.ifh * (self.peak[ip] - self.lower_limit),
314
- self.peak[ip],
315
- self.lower_limit
316
- + self.ifh * (self.peak[ip] - self.lower_limit),
317
- self.lower_limit,
318
- ]
319
- )
320
-
321
- # Als de golfvorm niet ingesnoerd wordt
322
- elif self.ifh == 1.0:
323
- # Vul de vector met tijdstippen
324
- ttabel = np.array(
325
- [0.0, self.base_duration / 2.0, self.base_duration]
326
- )
327
-
328
- # Vul de vector met golfwaarden
329
- gtabel = np.array(
330
- [self.lower_limit, self.peak[ip], self.lower_limit]
331
- )
332
-
333
- # Als er sprake is van een blokgolf
334
- elif self.ifb == (1.0 / (1.0 - self.ifh)):
335
- # Vul de vector met tijdstippen
336
- ttabel = np.array(
337
- [0.0, self.base_duration / 2.0, self.base_duration]
338
- )
339
-
340
- # Vul de vector met golfwaarden
341
- gtabel = np.array(
342
- [
343
- self.lower_limit
344
- + self.ifh * (self.peak[ip] - self.lower_limit),
345
- self.peak[ip],
346
- self.lower_limit
347
- + self.ifh * (self.peak[ip] - self.lower_limit),
348
- ]
349
- )
350
-
351
- # Als de golfvorm wel ingesnoerd wordt
352
- else:
353
- ttabel = np.zeros(5)
354
- gtabel = np.zeros(5)
355
-
356
- # Vul de vector met tijdstippen
357
- ttabel[0] = 0.0
358
- ttabel[2] = self.base_duration / 2.0
359
- ttabel[4] = self.base_duration
360
- ttabel[1] = ttabel[0] + self.ifh * (ttabel[2] - ttabel[0])
361
- ttabel[1] = ttabel[2] - self.ifb * (ttabel[2] - ttabel[1])
362
- ttabel[3] = ttabel[4] + self.ifh * (ttabel[2] - ttabel[4])
363
- ttabel[3] = ttabel[2] + self.ifb * (ttabel[3] - ttabel[2])
364
-
365
- # Vul de vector met golfwaarden
366
- gtabel = np.array(
367
- [
368
- self.lower_limit,
369
- self.lower_limit
370
- + self.ifh * (self.peak[ip] - self.lower_limit),
371
- self.peak[ip],
372
- self.lower_limit
373
- + self.ifh * (self.peak[ip] - self.lower_limit),
374
- self.lower_limit,
375
- ]
376
- )
377
-
378
- # Als de invoergeg.topduur ongelijk aan nul is
379
- else:
380
- # Als de invoergeg.topduur gelijk is aan de invoergeg.basisduur
381
- if top_duration == self.base_duration:
382
- # Vul de vector met tijdstippen
383
- ttabel = np.array([0.0, self.base_duration])
384
-
385
- # Vul de vector met golfwaarden
386
- gtabel = np.array([self.peak[ip], self.peak[ip]])
387
-
388
- # Als ingesnoerd wordt totaan het tijdstip waarop de golfvorm de maximale waarde heeft
389
- elif self.ifb == 0.0:
390
- # n = 6
391
-
392
- # Vul de vector met tijdstippen
393
- ttabel = np.array(
394
- [
395
- 0.0,
396
- self.base_duration / 2.0 - top_duration / 2.0 - 0.0001,
397
- self.base_duration / 2.0 - top_duration / 2.0,
398
- self.base_duration / 2.0 + top_duration / 2.0,
399
- self.base_duration / 2.0 + top_duration / 2.0 + 0.0001,
400
- self.base_duration,
401
- ]
402
- )
403
-
404
- # Vul de vector met golfwaarden
405
- gtabel = np.array(
406
- [
407
- self.lower_limit,
408
- self.lower_limit
409
- + self.ifh * (self.peak[ip] - self.lower_limit),
410
- self.peak[ip],
411
- self.peak[ip],
412
- self.lower_limit
413
- + self.ifh * (self.peak[ip] - self.lower_limit),
414
- self.lower_limit,
415
- ]
416
- )
417
-
418
- # Als de golfvorm niet wordt ingesnoerd
419
- elif self.ifh == 1.0:
420
- # Vul de vector met tijdstippen
421
- ttabel = np.array(
422
- [
423
- 0.0,
424
- self.base_duration / 2.0 - top_duration / 2.0,
425
- self.base_duration / 2.0 + top_duration / 2.0,
426
- self.base_duration,
427
- ]
428
- )
429
-
430
- # Vul de vector met golfwaarden
431
- gtabel = np.array(
432
- [
433
- self.lower_limit,
434
- self.peak[ip],
435
- self.peak[ip],
436
- self.lower_limit,
437
- ]
438
- )
439
-
440
- # Als er sprake is van een blokgolf
441
- elif self.ifb == (1.0 / (1.0 - self.ifh)):
442
- # Vul de vector met tijdstippen
443
- ttabel = np.array(
444
- [
445
- 0.0,
446
- self.base_duration / 2.0 - top_duration / 2.0,
447
- self.base_duration / 2.0 + top_duration / 2.0,
448
- self.base_duration,
449
- ]
450
- )
451
-
452
- # Vul de vector met golfwaarden
453
- gtabel = np.array(
454
- [
455
- self.lower_limit
456
- + self.ifh * (self.peak[ip] - self.lower_limit),
457
- self.peak[ip],
458
- self.peak[ip],
459
- self.lower_limit
460
- + self.ifh * (self.peak[ip] - self.lower_limit),
461
- ]
462
- )
463
-
464
- # Als de golfvorm wel ingesnoerd wordt
465
- else:
466
- ttabel = np.zeros(6)
467
- gtabel = np.zeros(6)
468
-
469
- # Vul de vector met tijdstippen
470
- ttabel[0] = 0.0
471
- ttabel[2] = self.base_duration / 2.0 - top_duration / 2.0
472
- ttabel[3] = self.base_duration / 2.0 + top_duration / 2.0
473
- ttabel[5] = self.base_duration
474
- ttabel[1] = ttabel[0] + self.ifh * (ttabel[2] - ttabel[0])
475
- ttabel[1] = ttabel[2] - self.ifb * (ttabel[2] - ttabel[1])
476
- ttabel[4] = ttabel[5] + self.ifh * (ttabel[3] - ttabel[5])
477
- ttabel[4] = ttabel[3] + self.ifb * (ttabel[4] - ttabel[3])
478
-
479
- # Vul de vector met golfwaarden
480
- gtabel = np.array(
481
- [
482
- self.lower_limit,
483
- self.lower_limit
484
- + self.ifh * (self.peak[ip] - self.lower_limit),
485
- self.peak[ip],
486
- self.peak[ip],
487
- self.lower_limit
488
- + self.ifh * (self.peak[ip] - self.lower_limit),
489
- self.lower_limit,
490
- ]
491
- )
492
-
493
- # Interpoleer de golfvorm naar de gewenste tijdas
494
- wave_shapes[:, ip] = np.interp(self.time, ttabel, gtabel)
495
-
496
- # Top de golfvormen af op het gewenste niveau
497
- wave_shapes = np.minimum(wave_shapes, self.upper_limit)
498
-
499
- # Return wave shapes
500
- return wave_shapes
501
-
502
- @staticmethod
503
- def bepaal_gezamenlijke_overschrijding(
504
- golfvormen_st1, niveaus_st1, golfvormen_st2, niveaus_st2
505
- ) -> np.ndarray:
506
- # Bepaal overschrijdingstijdstippen van beide stochasten in de golfvorm
507
- kruisng = np.zeros((len(niveaus_st1), len(niveaus_st2), 4))
508
- helling = np.zeros((len(niveaus_st1), len(niveaus_st2), 4), dtype=int)
509
- duren = np.zeros(
510
- (
511
- golfvormen_st1.npeak,
512
- golfvormen_st2.npeak,
513
- len(niveaus_st1),
514
- len(niveaus_st2),
515
- ),
516
- dtype=float,
517
- )
518
-
519
- # Bepaal eerst alle tijdstippen voor stochast 1
520
- kruisingen_st1 = np.zeros(
521
- (golfvormen_st1.npeak, len(niveaus_st1), 2), dtype=float
522
- )
523
- helling_st1 = np.zeros((golfvormen_st1.npeak, len(niveaus_st1), 2), dtype=int)
524
- for ip1 in range(golfvormen_st1.npeak):
525
- # Bepaal voor elk blokniveau de overschrijdingsduren
526
- kruisingen_st1[ip1, :, :], helling_st1[ip1, :, :] = (
527
- golfvormen_st1._overschrijdingstijdstip_op_af_v2(
528
- golfvormen_st1.wave_shapes[:, ip1], golfvormen_st1.time, niveaus_st1
529
- )
530
- )
531
-
532
- arange = np.arange(max(len(niveaus_st1), len(niveaus_st2)))
533
-
534
- # loop vervolgens over stochast 2
535
- kruisingen_st2 = np.zeros((len(niveaus_st2), 2))
536
- helling_st2 = np.zeros((len(niveaus_st2), 2))
537
- for ip2 in range(golfvormen_st2.npeak):
538
- # Bepaal voor elk blokniveau de overschrijdingsduren
539
- kruisingen_st2[:, :], helling_st2[:, :] = (
540
- golfvormen_st2._overschrijdingstijdstip_op_af_v2(
541
- golfvormen_st2.wave_shapes[:, ip2], golfvormen_st2.time, niveaus_st2
542
- )
543
- )
544
-
545
- # Bepaal voor elk piekniveau van stochast 2 de gezamenlijke overschrijdingen
546
- # Doe dit door de tijdstippen voor elke combinatie samen te voegen, te sorteren
547
- # op absolute waarde, en de overgang van laatste opgaand naar eerste neergaand
548
- # te bepalen
549
- for ip1 in range(golfvormen_st1.npeak):
550
- idx1 = kruisingen_st1[ip1, :, 0] != -1.0
551
- idx2 = kruisingen_st2[:, 0] != -1.0
552
-
553
- len1 = idx1.sum()
554
- len2 = idx2.sum()
555
- kruisng = np.zeros((len1, len2, 4))
556
- helling = np.zeros((len1, len2, 4), dtype=np.int8)
557
-
558
- # Vul arrays
559
- kruisng[:, :, :2] = kruisingen_st1[ip1, idx1, None, :]
560
- kruisng[:, :, 2:] = kruisingen_st2[None, idx2, :]
561
-
562
- helling[:, :, :2] = helling_st1[ip1, idx1, None, :]
563
- helling[:, :, 2:] = helling_st2[None, idx2, :]
564
-
565
- # Sorteer
566
- order = np.argsort(np.absolute(kruisng), axis=2)
567
- i1, i2 = arange[:len1, None, None], arange[None, :len2, None]
568
- kruisng[...] = kruisng[i1, i2, order]
569
- helling[...] = helling[i1, i2, order]
570
-
571
- # Bepaal alle plekken waar een tekenwisseling (kruising tussen golf en niveau) plaatsvindt
572
- wh = np.where((helling[:, :, 1:] ^ helling[:, :, :-1]))
573
-
574
- # Bereken het tijdsverschil bij tekenwisseling
575
- diff = kruisng[wh[0], wh[1], wh[2] + 1] - kruisng[wh[0], wh[1], wh[2]]
576
- # Zet tijdverschil bij neergaand naar opgaand op 0
577
- diff[
578
- (helling[wh[0], wh[1], wh[2] + 1] < helling[wh[0], wh[1], wh[2]])
579
- ] = 0.0
580
- # print(diff.max(), diff.min())
581
- duren[ip1, ip2, wh[0], wh[1]] += diff
582
-
583
- return duren
584
-
585
- @staticmethod
586
- def _overschrijdingstijdstip_op_af_v2(
587
- vormgolf: np.ndarray, tijden: np.ndarray, niveaus: np.ndarray
588
- ):
589
- # Bepaal waar de golfvorm boven het te testen niveau zit
590
- diff = (vormgolf[None, :] - niveaus[:, None]) >= 0.0
591
- # Bepaal alle plekken waar een tekenwisseling (kruising tussen golf en niveau) plaatsvindt
592
- locn, loct = np.where((diff[:, 1:] ^ diff[:, :-1]))
593
-
594
- # Bepaal het snijpunt bij de kruising
595
- dtdq = (tijden[loct + 1] - tijden[loct]) / (vormgolf[loct + 1] - vormgolf[loct])
596
- # Voeg dit punt toe aan de tijd
597
- duur = tijden[loct] + dtdq * (niveaus[locn] - vormgolf[loct])
598
-
599
- # Maak lege array aan
600
- t1t2 = np.full((len(niveaus), 2), np.nan, dtype=float)
601
- helling = np.full((len(niveaus), 2), 0, dtype=np.int8)
602
- # Waar het niveau hoger ligt dan de piekwaarde, -1 in
603
- t1t2[niveaus > vormgolf.max(), :] = -1
604
- # Controleer of alle niveaus of 0 of 2 keer voorkomen
605
- r = np.bincount(locn)
606
- assert ((r == 2) | (r == 0)).all()
607
-
608
- # Vul in in array met tijden. Vermenigvuldig met het teken van de helling *-1
609
- t1t2[locn, np.arange(len(locn)) % 2] = duur
610
- # Bepaal helling. Opgaand heeft dus -, neergaand +. De som geeft de totale overschrijdingsduur
611
- helling[locn, np.arange(len(locn)) % 2] = -np.sign(dtdq)
612
-
613
- # Als er NaN's in de array zitten, is dit op plekken waar het niveau in zijn geheel onder
614
- # of op het laagste punt van de golf ligt. Vul hier de min en max van de tijden in
615
- idx = np.isnan(t1t2)
616
- t1t2[idx[:, 0], 0] = tijden.min()
617
- t1t2[idx[:, 1], 1] = tijden.max()
618
- helling[idx[:, 0], 0] = -1
619
- helling[idx[:, 1], 1] = 1
620
-
621
- # Vermenigvuldig de even elementen met -1
622
- # idx = duur < 0
623
- # duur[::2] *= -1
624
- return t1t2, helling
1
+ import numpy as np
2
+
3
+ from scipy.stats import norm
4
+
5
+ from ....settings.settings import Settings
6
+ from .....common.enum import WaveShapeType
7
+ from .....common.interpolate import Interpolate, InterpStruct
8
+ from .....common.probability import ProbabilityFunctions
9
+ from .....io.file_hydranl import FileHydraNL
10
+
11
+
12
+ class WaveShape:
13
+ """
14
+ Class to describe the wave form statistics.
15
+ Used in describing wave forms in river discharge and lake level.
16
+ """
17
+
18
+ def __init__(self, settings: Settings, type: WaveShapeType):
19
+ """
20
+ Constructor class for the WaveShape statistics.
21
+
22
+ Parameters
23
+ ----------
24
+ settings : Settings
25
+ The Settings object
26
+ """
27
+ # Placeholder
28
+ self.wave_shapes = None
29
+
30
+ # Obtain the parameters
31
+ self.base_duration = settings.base_duration
32
+ self.pw = settings.waveshape_pw
33
+ if type == WaveShapeType.DISCHARGE:
34
+ self.top_duration = settings.top_duration_q
35
+ self.lower_limit = settings.q_min
36
+ self.upper_limit = settings.q_limit
37
+ self.ifh = settings.ifh_q
38
+ self.ifb = settings.ifb_q
39
+ elif type == WaveShapeType.LAKE_LEVEL:
40
+ self.top_duration = settings.top_duration_a
41
+ self.lower_limit = settings.a_min
42
+ self.upper_limit = settings.a_limit
43
+ self.ifh = settings.ifh_a
44
+ self.ifb = settings.ifb_a
45
+ else:
46
+ raise TypeError("[ERROR] Unknown WaveShape type.")
47
+
48
+ # Time
49
+ self.time = np.arange(
50
+ 0.0, settings.base_duration + 1e-6, settings.waveshape_time_step
51
+ )
52
+ self.ntime = len(self.time)
53
+ if settings.base_duration != max(self.time):
54
+ settings.base_duration = max(self.time)
55
+ print(
56
+ f"[NOTE] Base duration adjusted to blok wind ({settings.waveshape_time_step}h)."
57
+ )
58
+
59
+ def initialise_wave_shapes(self, peak: list, climate_change: float = 0.0):
60
+ """
61
+ Initialize the wave shapes for discharge or lake level.
62
+
63
+ Parameters
64
+ ----------
65
+ peak : list
66
+ A list with peak values or the discharge / lake level
67
+ climate_change : float
68
+ Increase of discharge or lake level to account for climate change (default = 0.0)
69
+ """
70
+ # Save
71
+ self.peak = peak
72
+ self.npeak = len(peak)
73
+
74
+ # Determine shape of the wave
75
+ if not self.pw:
76
+ # Init wave shapes
77
+ self.wave_shapes = self.__initialise_wave_shape(climate_change)
78
+ self.wave_shapes = np.maximum(self.wave_shapes, self.lower_limit)
79
+
80
+ # Read from a file
81
+ else:
82
+ raise NotImplementedError()
83
+
84
+ def transition_wave(self, transition: float) -> None:
85
+ """
86
+ Transition wave form
87
+
88
+ Parameters
89
+ ----------
90
+ transition : float
91
+ Transition in hours
92
+ """
93
+ tijdenlang = np.zeros(2 * self.ntime - 1)
94
+ golflang = np.zeros(2 * self.ntime - 1)
95
+
96
+ if transition >= 0.0:
97
+ # Als de verschuiving positief is in de tijd, dan wordt de tijdas
98
+ # vooruit verschoven en eenzelfde periode wordt voor deze
99
+ # verschoven tijdas geplaatst
100
+ it = np.arange(self.ntime)
101
+ tijdenlang[it + self.ntime - 1] = self.time[it] + transition
102
+
103
+ it = np.arange(self.ntime - 1)
104
+ tijdenlang[it] = tijdenlang[it + self.ntime - 1] - self.base_duration
105
+
106
+ else:
107
+ # Als de verschuiving negatief is in de tijd, dan wordt de tijdas
108
+ # terug verschoven en eenzelfde periode wordt achter deze verschoven
109
+ # tijdas geplaatst
110
+ it = np.arange(self.ntime)
111
+ tijdenlang[it] = self.time[it] + transition
112
+ it = np.arange(1, self.ntime)
113
+ tijdenlang[it + self.ntime - 1] = tijdenlang[it] + self.base_duration
114
+
115
+ # Bij de verschoven en uitgebreide tijdas worden de golfvormen twee keer gezet
116
+ # Door interpolatie worden op het reguliere rooster de uiteindelijke
117
+ # verschoven golfvormen verkregen
118
+ intstr = InterpStruct(x=self.time, xp=tijdenlang)
119
+ for ip in range(self.npeak):
120
+ golflang[: self.ntime] = self.wave_shapes[:, ip]
121
+ golflang[self.ntime :] = golflang[1 : self.ntime]
122
+ self.wave_shapes[:, ip] = intstr.interp(fp=golflang, extrapolate=False)
123
+
124
+ def get_wave_shapes(self) -> np.ndarray:
125
+ """
126
+ Return the wave shapes.
127
+
128
+ Returns
129
+ -------
130
+ np.ndarray
131
+ Array with size (t, peak)
132
+ """
133
+ return self.wave_shapes
134
+
135
+ def exceedance_timestamps(self, levels: np.ndarray):
136
+ """
137
+ Determine the exceedance durations for several levels in the waveshapes,
138
+ given the peak levels of the wave.
139
+
140
+ Parameters
141
+ ----------
142
+ levels : np.ndarray
143
+ Levels for which the exceedance duration is determined.
144
+
145
+ Returns
146
+ -------
147
+ np.ndarray
148
+ Exceedance duration [N peak x N levels]
149
+ """
150
+ # Check if the wave shapes are defined
151
+ if self.wave_shapes is None:
152
+ raise ValueError("[ERROR] Wave shaped are not defined.")
153
+
154
+ # Init empty array
155
+ ovduur = np.zeros((self.npeak, len(levels)))
156
+
157
+ # Bepaal voor elk blokniveau de overschrijdingsduren
158
+ for ip in range(self.npeak):
159
+ # Get one wave shape
160
+ wave_shape = self.wave_shapes[:, ip]
161
+
162
+ # Initieer lege arrays
163
+ t_boven = np.zeros_like(levels)
164
+ t_onder = np.zeros_like(levels)
165
+
166
+ # Bepaal waar de niveaus gelijk of hoger zijn aan de golfvorm, hiervoor zijn er geen overschrijdingen
167
+ idx = levels > wave_shape.max()
168
+ t_boven[idx] = -1.0
169
+ t_onder[idx] = -1.0
170
+
171
+ # Aangenomen wordt dat de golf een monotoon opgaande en neergaande flank heeft.
172
+ # Onder deze aanname kan met interpolatie de kruisingen bepaald worden.
173
+ diff = wave_shape[1:] - wave_shape[:-1]
174
+
175
+ # Het verschil is de afstand van het volgende punt ten opzichte van het huidige punt
176
+ opgaand = np.concatenate([[True], diff > 0])
177
+ neergaand = np.concatenate([diff < 0, [True]])
178
+ t_boven[~idx] = np.interp(
179
+ x=levels[~idx], xp=wave_shape[opgaand], fp=self.time[opgaand]
180
+ )
181
+ t_onder[~idx] = np.interp(
182
+ x=levels[~idx],
183
+ xp=wave_shape[neergaand][::-1],
184
+ fp=self.time[neergaand][::-1],
185
+ )
186
+ ovduur[ip, :] = t_onder - t_boven
187
+
188
+ # Return
189
+ return ovduur
190
+
191
+ def instantaneous_exceedance_probability(self, exceedance_peaks, levels):
192
+ """
193
+ Calculate the instantaneous exceedance probability of the discharge/water level
194
+ for each peak value of a discharge/water level wave.
195
+ {
196
+ Calculate the time when the discharge/water level is higher than a given level
197
+ and determine the time when the discharge/water level is lower than the given level.
198
+ Determine the duration of exceedance.
199
+ Use the composite trapezoidal rule for calculating the instantaneous exceedance probability
200
+ of the discharge/water level.
201
+ }
202
+ """
203
+ # Calculate the vector with probability densities of the discharge/water level
204
+ peak_probability = ProbabilityFunctions.probability_density(
205
+ self.peak, exceedance_peaks
206
+ ).probability
207
+ instantaneous_prob = np.zeros_like(levels)
208
+ exceedance_duration = self.exceedance_timestamps(levels)
209
+
210
+ for ib in range(len(levels)):
211
+ integral = (exceedance_duration[:, ib] * peak_probability).sum()
212
+
213
+ # Calculate the instantaneous exceedance probability of the discharge/water level
214
+ instantaneous_prob[ib] = integral / self.base_duration
215
+
216
+ return instantaneous_prob
217
+
218
+ def cum_norm_s_naar_y(self, y, mu, sigma):
219
+ """
220
+ Bepaal de cumulatieve verdelingsfunctie voor het meerpeil onder de transformatie van s naar y = K(s)
221
+ {
222
+ y= Parameterwaarde
223
+ mu= Gemiddelde van de normale verdeling
224
+ sigma= Standaarddeviatie van de normale verdeling
225
+ }
226
+ """
227
+ if sigma <= 0:
228
+ # Geef foutmelding
229
+ raise ValueError("Sigma <= 0")
230
+
231
+ # Integratiegrenzen en stapgrootte
232
+ stap = 0.05
233
+ x = np.arange(0, 20 + 0.1 * stap, stap)
234
+
235
+ # Voor de parameterwaarde wordt de integraal over het rooster berekend. Let wel: delta = 0
236
+ yn = (y[None, :] - x[:, None] - mu) / sigma
237
+
238
+ dx = np.diff(np.r_[x[0], (x[1:] + x[:-1]) / 2.0, x[-1]])
239
+ f_y_sigma = (np.exp(-x[:, None]) * norm().cdf(x=yn) * dx[:, None]).sum(0)
240
+
241
+ return f_y_sigma
242
+
243
+ def __initialise_wave_shape(self, climate_change: float) -> np.ndarray:
244
+ """
245
+ Create the wave shapes for discharge or lake level.
246
+
247
+ Parameters
248
+ ----------
249
+ climate_change : float
250
+ Increase of discharge or lake level to account for climate change (default = 0.0)
251
+
252
+ Returns
253
+ -------
254
+ np.ndarray
255
+ A 2D array with wave shapes (time, q_m_peak)
256
+ """
257
+ # Read the table with top durations (t_top) given q or m (q_m)
258
+ _q_m, _t_top = FileHydraNL.read_file_2columns(self.top_duration)
259
+
260
+ # Correct for climate change (increase discharge or lake level)
261
+ if climate_change > 0.0:
262
+ _q_m += climate_change
263
+
264
+ # Check if the top duration is larger than the base duration
265
+ if (_t_top > self.base_duration).any():
266
+ print(
267
+ f"[WARNING] Top duration from file '{self.top_duration}' is larger than base duration."
268
+ )
269
+
270
+ # Increase the arrays with 1 element to allow for extrapolation
271
+ q_m = np.r_[_q_m, 2.0 * _q_m[-1] - _q_m[-2]]
272
+ t_top = np.r_[_t_top, _t_top[-1]]
273
+
274
+ # Calculate for each peak the top duration
275
+ top_durations = Interpolate.inextrp1d(x=self.peak, xp=q_m, fp=t_top)
276
+
277
+ # Create an empty array of size (t, peak) for the wave shapes
278
+ wave_shapes = np.zeros((len(self.time), len(self.peak)))
279
+
280
+ # Create a trapezoid wave shape
281
+ for ip, top_duration in enumerate(top_durations):
282
+ # If the discretisation step for wave shapes is equal to the base_duration
283
+ if (
284
+ self.peak[ip] < q_m[0]
285
+ or (self.time[1] - self.time[0]) == self.base_duration
286
+ ):
287
+ # Vul de vector met tijdstippen
288
+ ttabel = [0.0, self.base_duration]
289
+
290
+ # Vul de vector met golfwaarden
291
+ gtabel = [self.peak[ip], self.peak[ip]]
292
+
293
+ # If the top duration is equal to 0.0
294
+ elif top_duration == 0.0:
295
+ # Als ingesnoerd wordt totaan het tijdstip waarop de golfvorm de maximale waarde heeft
296
+ if self.ifb == 0.0:
297
+ # Vul de vector met tijdstippen
298
+ ttabel = np.array(
299
+ [
300
+ 0,
301
+ self.base_duration / 2.0 - 0.0001,
302
+ self.base_duration / 2.0,
303
+ self.base_duration / 2.0 + 0.0001,
304
+ self.base_duration,
305
+ ]
306
+ )
307
+
308
+ # Vul de vector met golfwaarden
309
+ gtabel = np.array(
310
+ [
311
+ self.lower_limit,
312
+ self.lower_limit
313
+ + self.ifh * (self.peak[ip] - self.lower_limit),
314
+ self.peak[ip],
315
+ self.lower_limit
316
+ + self.ifh * (self.peak[ip] - self.lower_limit),
317
+ self.lower_limit,
318
+ ]
319
+ )
320
+
321
+ # Als de golfvorm niet ingesnoerd wordt
322
+ elif self.ifh == 1.0:
323
+ # Vul de vector met tijdstippen
324
+ ttabel = np.array(
325
+ [0.0, self.base_duration / 2.0, self.base_duration]
326
+ )
327
+
328
+ # Vul de vector met golfwaarden
329
+ gtabel = np.array(
330
+ [self.lower_limit, self.peak[ip], self.lower_limit]
331
+ )
332
+
333
+ # Als er sprake is van een blokgolf
334
+ elif self.ifb == (1.0 / (1.0 - self.ifh)):
335
+ # Vul de vector met tijdstippen
336
+ ttabel = np.array(
337
+ [0.0, self.base_duration / 2.0, self.base_duration]
338
+ )
339
+
340
+ # Vul de vector met golfwaarden
341
+ gtabel = np.array(
342
+ [
343
+ self.lower_limit
344
+ + self.ifh * (self.peak[ip] - self.lower_limit),
345
+ self.peak[ip],
346
+ self.lower_limit
347
+ + self.ifh * (self.peak[ip] - self.lower_limit),
348
+ ]
349
+ )
350
+
351
+ # Als de golfvorm wel ingesnoerd wordt
352
+ else:
353
+ ttabel = np.zeros(5)
354
+ gtabel = np.zeros(5)
355
+
356
+ # Vul de vector met tijdstippen
357
+ ttabel[0] = 0.0
358
+ ttabel[2] = self.base_duration / 2.0
359
+ ttabel[4] = self.base_duration
360
+ ttabel[1] = ttabel[0] + self.ifh * (ttabel[2] - ttabel[0])
361
+ ttabel[1] = ttabel[2] - self.ifb * (ttabel[2] - ttabel[1])
362
+ ttabel[3] = ttabel[4] + self.ifh * (ttabel[2] - ttabel[4])
363
+ ttabel[3] = ttabel[2] + self.ifb * (ttabel[3] - ttabel[2])
364
+
365
+ # Vul de vector met golfwaarden
366
+ gtabel = np.array(
367
+ [
368
+ self.lower_limit,
369
+ self.lower_limit
370
+ + self.ifh * (self.peak[ip] - self.lower_limit),
371
+ self.peak[ip],
372
+ self.lower_limit
373
+ + self.ifh * (self.peak[ip] - self.lower_limit),
374
+ self.lower_limit,
375
+ ]
376
+ )
377
+
378
+ # Als de invoergeg.topduur ongelijk aan nul is
379
+ else:
380
+ # Als de invoergeg.topduur gelijk is aan de invoergeg.basisduur
381
+ if top_duration == self.base_duration:
382
+ # Vul de vector met tijdstippen
383
+ ttabel = np.array([0.0, self.base_duration])
384
+
385
+ # Vul de vector met golfwaarden
386
+ gtabel = np.array([self.peak[ip], self.peak[ip]])
387
+
388
+ # Als ingesnoerd wordt totaan het tijdstip waarop de golfvorm de maximale waarde heeft
389
+ elif self.ifb == 0.0:
390
+ # n = 6
391
+
392
+ # Vul de vector met tijdstippen
393
+ ttabel = np.array(
394
+ [
395
+ 0.0,
396
+ self.base_duration / 2.0 - top_duration / 2.0 - 0.0001,
397
+ self.base_duration / 2.0 - top_duration / 2.0,
398
+ self.base_duration / 2.0 + top_duration / 2.0,
399
+ self.base_duration / 2.0 + top_duration / 2.0 + 0.0001,
400
+ self.base_duration,
401
+ ]
402
+ )
403
+
404
+ # Vul de vector met golfwaarden
405
+ gtabel = np.array(
406
+ [
407
+ self.lower_limit,
408
+ self.lower_limit
409
+ + self.ifh * (self.peak[ip] - self.lower_limit),
410
+ self.peak[ip],
411
+ self.peak[ip],
412
+ self.lower_limit
413
+ + self.ifh * (self.peak[ip] - self.lower_limit),
414
+ self.lower_limit,
415
+ ]
416
+ )
417
+
418
+ # Als de golfvorm niet wordt ingesnoerd
419
+ elif self.ifh == 1.0:
420
+ # Vul de vector met tijdstippen
421
+ ttabel = np.array(
422
+ [
423
+ 0.0,
424
+ self.base_duration / 2.0 - top_duration / 2.0,
425
+ self.base_duration / 2.0 + top_duration / 2.0,
426
+ self.base_duration,
427
+ ]
428
+ )
429
+
430
+ # Vul de vector met golfwaarden
431
+ gtabel = np.array(
432
+ [
433
+ self.lower_limit,
434
+ self.peak[ip],
435
+ self.peak[ip],
436
+ self.lower_limit,
437
+ ]
438
+ )
439
+
440
+ # Als er sprake is van een blokgolf
441
+ elif self.ifb == (1.0 / (1.0 - self.ifh)):
442
+ # Vul de vector met tijdstippen
443
+ ttabel = np.array(
444
+ [
445
+ 0.0,
446
+ self.base_duration / 2.0 - top_duration / 2.0,
447
+ self.base_duration / 2.0 + top_duration / 2.0,
448
+ self.base_duration,
449
+ ]
450
+ )
451
+
452
+ # Vul de vector met golfwaarden
453
+ gtabel = np.array(
454
+ [
455
+ self.lower_limit
456
+ + self.ifh * (self.peak[ip] - self.lower_limit),
457
+ self.peak[ip],
458
+ self.peak[ip],
459
+ self.lower_limit
460
+ + self.ifh * (self.peak[ip] - self.lower_limit),
461
+ ]
462
+ )
463
+
464
+ # Als de golfvorm wel ingesnoerd wordt
465
+ else:
466
+ ttabel = np.zeros(6)
467
+ gtabel = np.zeros(6)
468
+
469
+ # Vul de vector met tijdstippen
470
+ ttabel[0] = 0.0
471
+ ttabel[2] = self.base_duration / 2.0 - top_duration / 2.0
472
+ ttabel[3] = self.base_duration / 2.0 + top_duration / 2.0
473
+ ttabel[5] = self.base_duration
474
+ ttabel[1] = ttabel[0] + self.ifh * (ttabel[2] - ttabel[0])
475
+ ttabel[1] = ttabel[2] - self.ifb * (ttabel[2] - ttabel[1])
476
+ ttabel[4] = ttabel[5] + self.ifh * (ttabel[3] - ttabel[5])
477
+ ttabel[4] = ttabel[3] + self.ifb * (ttabel[4] - ttabel[3])
478
+
479
+ # Vul de vector met golfwaarden
480
+ gtabel = np.array(
481
+ [
482
+ self.lower_limit,
483
+ self.lower_limit
484
+ + self.ifh * (self.peak[ip] - self.lower_limit),
485
+ self.peak[ip],
486
+ self.peak[ip],
487
+ self.lower_limit
488
+ + self.ifh * (self.peak[ip] - self.lower_limit),
489
+ self.lower_limit,
490
+ ]
491
+ )
492
+
493
+ # Interpoleer de golfvorm naar de gewenste tijdas
494
+ wave_shapes[:, ip] = np.interp(self.time, ttabel, gtabel)
495
+
496
+ # Top de golfvormen af op het gewenste niveau
497
+ wave_shapes = np.minimum(wave_shapes, self.upper_limit)
498
+
499
+ # Return wave shapes
500
+ return wave_shapes
501
+
502
+ @staticmethod
503
+ def bepaal_gezamenlijke_overschrijding(
504
+ golfvormen_st1, niveaus_st1, golfvormen_st2, niveaus_st2
505
+ ) -> np.ndarray:
506
+ # Bepaal overschrijdingstijdstippen van beide stochasten in de golfvorm
507
+ kruisng = np.zeros((len(niveaus_st1), len(niveaus_st2), 4))
508
+ helling = np.zeros((len(niveaus_st1), len(niveaus_st2), 4), dtype=int)
509
+ duren = np.zeros(
510
+ (
511
+ golfvormen_st1.npeak,
512
+ golfvormen_st2.npeak,
513
+ len(niveaus_st1),
514
+ len(niveaus_st2),
515
+ ),
516
+ dtype=float,
517
+ )
518
+
519
+ # Bepaal eerst alle tijdstippen voor stochast 1
520
+ kruisingen_st1 = np.zeros(
521
+ (golfvormen_st1.npeak, len(niveaus_st1), 2), dtype=float
522
+ )
523
+ helling_st1 = np.zeros((golfvormen_st1.npeak, len(niveaus_st1), 2), dtype=int)
524
+ for ip1 in range(golfvormen_st1.npeak):
525
+ # Bepaal voor elk blokniveau de overschrijdingsduren
526
+ kruisingen_st1[ip1, :, :], helling_st1[ip1, :, :] = (
527
+ golfvormen_st1._overschrijdingstijdstip_op_af_v2(
528
+ golfvormen_st1.wave_shapes[:, ip1], golfvormen_st1.time, niveaus_st1
529
+ )
530
+ )
531
+
532
+ arange = np.arange(max(len(niveaus_st1), len(niveaus_st2)))
533
+
534
+ # loop vervolgens over stochast 2
535
+ kruisingen_st2 = np.zeros((len(niveaus_st2), 2))
536
+ helling_st2 = np.zeros((len(niveaus_st2), 2))
537
+ for ip2 in range(golfvormen_st2.npeak):
538
+ # Bepaal voor elk blokniveau de overschrijdingsduren
539
+ kruisingen_st2[:, :], helling_st2[:, :] = (
540
+ golfvormen_st2._overschrijdingstijdstip_op_af_v2(
541
+ golfvormen_st2.wave_shapes[:, ip2], golfvormen_st2.time, niveaus_st2
542
+ )
543
+ )
544
+
545
+ # Bepaal voor elk piekniveau van stochast 2 de gezamenlijke overschrijdingen
546
+ # Doe dit door de tijdstippen voor elke combinatie samen te voegen, te sorteren
547
+ # op absolute waarde, en de overgang van laatste opgaand naar eerste neergaand
548
+ # te bepalen
549
+ for ip1 in range(golfvormen_st1.npeak):
550
+ idx1 = kruisingen_st1[ip1, :, 0] != -1.0
551
+ idx2 = kruisingen_st2[:, 0] != -1.0
552
+
553
+ len1 = idx1.sum()
554
+ len2 = idx2.sum()
555
+ kruisng = np.zeros((len1, len2, 4))
556
+ helling = np.zeros((len1, len2, 4), dtype=np.int8)
557
+
558
+ # Vul arrays
559
+ kruisng[:, :, :2] = kruisingen_st1[ip1, idx1, None, :]
560
+ kruisng[:, :, 2:] = kruisingen_st2[None, idx2, :]
561
+
562
+ helling[:, :, :2] = helling_st1[ip1, idx1, None, :]
563
+ helling[:, :, 2:] = helling_st2[None, idx2, :]
564
+
565
+ # Sorteer
566
+ order = np.argsort(np.absolute(kruisng), axis=2)
567
+ i1, i2 = arange[:len1, None, None], arange[None, :len2, None]
568
+ kruisng[...] = kruisng[i1, i2, order]
569
+ helling[...] = helling[i1, i2, order]
570
+
571
+ # Bepaal alle plekken waar een tekenwisseling (kruising tussen golf en niveau) plaatsvindt
572
+ wh = np.where((helling[:, :, 1:] ^ helling[:, :, :-1]))
573
+
574
+ # Bereken het tijdsverschil bij tekenwisseling
575
+ diff = kruisng[wh[0], wh[1], wh[2] + 1] - kruisng[wh[0], wh[1], wh[2]]
576
+ # Zet tijdverschil bij neergaand naar opgaand op 0
577
+ diff[
578
+ (helling[wh[0], wh[1], wh[2] + 1] < helling[wh[0], wh[1], wh[2]])
579
+ ] = 0.0
580
+ # print(diff.max(), diff.min())
581
+ duren[ip1, ip2, wh[0], wh[1]] += diff
582
+
583
+ return duren
584
+
585
+ @staticmethod
586
+ def _overschrijdingstijdstip_op_af_v2(
587
+ vormgolf: np.ndarray, tijden: np.ndarray, niveaus: np.ndarray
588
+ ):
589
+ # Bepaal waar de golfvorm boven het te testen niveau zit
590
+ diff = (vormgolf[None, :] - niveaus[:, None]) >= 0.0
591
+ # Bepaal alle plekken waar een tekenwisseling (kruising tussen golf en niveau) plaatsvindt
592
+ locn, loct = np.where((diff[:, 1:] ^ diff[:, :-1]))
593
+
594
+ # Bepaal het snijpunt bij de kruising
595
+ dtdq = (tijden[loct + 1] - tijden[loct]) / (vormgolf[loct + 1] - vormgolf[loct])
596
+ # Voeg dit punt toe aan de tijd
597
+ duur = tijden[loct] + dtdq * (niveaus[locn] - vormgolf[loct])
598
+
599
+ # Maak lege array aan
600
+ t1t2 = np.full((len(niveaus), 2), np.nan, dtype=float)
601
+ helling = np.full((len(niveaus), 2), 0, dtype=np.int8)
602
+ # Waar het niveau hoger ligt dan de piekwaarde, -1 in
603
+ t1t2[niveaus > vormgolf.max(), :] = -1
604
+ # Controleer of alle niveaus of 0 of 2 keer voorkomen
605
+ r = np.bincount(locn)
606
+ assert ((r == 2) | (r == 0)).all()
607
+
608
+ # Vul in in array met tijden. Vermenigvuldig met het teken van de helling *-1
609
+ t1t2[locn, np.arange(len(locn)) % 2] = duur
610
+ # Bepaal helling. Opgaand heeft dus -, neergaand +. De som geeft de totale overschrijdingsduur
611
+ helling[locn, np.arange(len(locn)) % 2] = -np.sign(dtdq)
612
+
613
+ # Als er NaN's in de array zitten, is dit op plekken waar het niveau in zijn geheel onder
614
+ # of op het laagste punt van de golf ligt. Vul hier de min en max van de tijden in
615
+ idx = np.isnan(t1t2)
616
+ t1t2[idx[:, 0], 0] = tijden.min()
617
+ t1t2[idx[:, 1], 1] = tijden.max()
618
+ helling[idx[:, 0], 0] = -1
619
+ helling[idx[:, 1], 1] = 1
620
+
621
+ # Vermenigvuldig de even elementen met -1
622
+ # idx = duur < 0
623
+ # duur[::2] *= -1
624
+ return t1t2, helling