foxes 0.7.3.1__tar.gz → 0.7.4__tar.gz

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.

Potentially problematic release.


This version of foxes might be problematic. Click here for more details.

Files changed (284) hide show
  1. {foxes-0.7.3.1/foxes.egg-info → foxes-0.7.4}/PKG-INFO +1 -1
  2. foxes-0.7.4/foxes/VERSION +1 -0
  3. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/constants.py +1 -1
  4. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/core/wind_farm.py +1 -1
  5. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/input/windio/__init__.py +1 -0
  6. foxes-0.7.4/foxes/input/windio/get_states.py +184 -0
  7. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/input/windio/read_attributes.py +99 -82
  8. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/input/windio/read_farm.py +12 -12
  9. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/input/windio/read_fields.py +37 -27
  10. foxes-0.7.4/foxes/input/windio/read_outputs.py +125 -0
  11. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/input/windio/runner.py +72 -8
  12. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/input/windio/windio.py +24 -16
  13. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_models/wind/bastankhah14.py +1 -1
  14. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/output/__init__.py +1 -0
  15. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/output/slice_data.py +41 -11
  16. foxes-0.7.4/foxes/output/state_turbine_table.py +78 -0
  17. {foxes-0.7.3.1 → foxes-0.7.4/foxes.egg-info}/PKG-INFO +1 -1
  18. {foxes-0.7.3.1 → foxes-0.7.4}/foxes.egg-info/SOURCES.txt +2 -0
  19. foxes-0.7.3.1/foxes/VERSION +0 -1
  20. foxes-0.7.3.1/foxes/input/windio/get_states.py +0 -115
  21. {foxes-0.7.3.1 → foxes-0.7.4}/LICENSE +0 -0
  22. {foxes-0.7.3.1 → foxes-0.7.4}/Logo_FOXES.svg +0 -0
  23. {foxes-0.7.3.1 → foxes-0.7.4}/MANIFEST.in +0 -0
  24. {foxes-0.7.3.1 → foxes-0.7.4}/README.md +0 -0
  25. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/__init__.py +0 -0
  26. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/algorithms/__init__.py +0 -0
  27. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/algorithms/downwind/__init__.py +0 -0
  28. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/algorithms/downwind/downwind.py +0 -0
  29. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/algorithms/downwind/models/__init__.py +0 -0
  30. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/algorithms/downwind/models/farm_wakes_calc.py +0 -0
  31. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/algorithms/downwind/models/init_farm_data.py +0 -0
  32. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/algorithms/downwind/models/point_wakes_calc.py +0 -0
  33. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/algorithms/downwind/models/reorder_farm_output.py +0 -0
  34. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/algorithms/downwind/models/set_amb_farm_results.py +0 -0
  35. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/algorithms/downwind/models/set_amb_point_results.py +0 -0
  36. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/algorithms/iterative/__init__.py +0 -0
  37. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/algorithms/iterative/iterative.py +0 -0
  38. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/algorithms/iterative/models/__init__.py +0 -0
  39. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/algorithms/iterative/models/convergence.py +0 -0
  40. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/algorithms/iterative/models/farm_wakes_calc.py +0 -0
  41. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/algorithms/iterative/models/urelax.py +0 -0
  42. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/algorithms/sequential/__init__.py +0 -0
  43. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/algorithms/sequential/models/__init__.py +0 -0
  44. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/algorithms/sequential/models/plugin.py +0 -0
  45. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/algorithms/sequential/models/seq_state.py +0 -0
  46. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/algorithms/sequential/sequential.py +0 -0
  47. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/core/__init__.py +0 -0
  48. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/core/algorithm.py +0 -0
  49. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/core/axial_induction_model.py +0 -0
  50. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/core/data.py +0 -0
  51. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/core/data_calc_model.py +0 -0
  52. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/core/farm_controller.py +0 -0
  53. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/core/farm_data_model.py +0 -0
  54. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/core/farm_model.py +0 -0
  55. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/core/ground_model.py +0 -0
  56. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/core/model.py +0 -0
  57. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/core/partial_wakes_model.py +0 -0
  58. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/core/point_data_model.py +0 -0
  59. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/core/rotor_model.py +0 -0
  60. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/core/states.py +0 -0
  61. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/core/turbine.py +0 -0
  62. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/core/turbine_model.py +0 -0
  63. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/core/turbine_type.py +0 -0
  64. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/core/vertical_profile.py +0 -0
  65. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/core/wake_frame.py +0 -0
  66. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/core/wake_model.py +0 -0
  67. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/core/wake_superposition.py +0 -0
  68. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/data/__init__.py +0 -0
  69. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/data/farms/__init__.py +0 -0
  70. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/data/farms/test_farm_67.csv +0 -0
  71. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/data/parse.py +0 -0
  72. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/data/power_ct_curves/DTU-10MW-D178d3-H119.csv +0 -0
  73. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/data/power_ct_curves/IEA-15MW-D240-H150.csv +0 -0
  74. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/data/power_ct_curves/IWT-7d5MW-D164-H100.csv +0 -0
  75. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/data/power_ct_curves/NREL-5MW-D126-H90.csv +0 -0
  76. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/data/power_ct_curves/__init__.py +0 -0
  77. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/data/states/WRF-Timeseries-3000.nc +0 -0
  78. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/data/states/WRF-Timeseries-4464.csv.gz +0 -0
  79. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/data/states/__init__.py +0 -0
  80. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/data/states/abl_states_6000.csv.gz +0 -0
  81. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/data/states/timeseries_100.csv.gz +0 -0
  82. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/data/states/timeseries_3000.csv.gz +0 -0
  83. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/data/states/timeseries_8000.csv.gz +0 -0
  84. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/data/states/wind_rose_bremen.csv +0 -0
  85. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/data/states/wind_rotation.nc +0 -0
  86. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/data/states/windio_timeseries_5000.nc +0 -0
  87. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/data/states/winds100.tab +0 -0
  88. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/data/static_data.py +0 -0
  89. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/data/windio/DTU_10MW_turbine.yaml +0 -0
  90. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/data/windio/__init__.py +0 -0
  91. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/data/windio/windio_5turbines_timeseries.yaml +0 -0
  92. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/input/__init__.py +0 -0
  93. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/input/farm_layout/__init__.py +0 -0
  94. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/input/farm_layout/from_csv.py +0 -0
  95. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/input/farm_layout/from_df.py +0 -0
  96. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/input/farm_layout/from_file.py +0 -0
  97. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/input/farm_layout/from_json.py +0 -0
  98. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/input/farm_layout/from_random.py +0 -0
  99. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/input/farm_layout/grid.py +0 -0
  100. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/input/farm_layout/row.py +0 -0
  101. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/input/states/__init__.py +0 -0
  102. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/input/states/create/__init__.py +0 -0
  103. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/input/states/create/random_abl_states.py +0 -0
  104. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/input/states/create/random_timeseries.py +0 -0
  105. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/input/states/field_data_nc.py +0 -0
  106. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/input/states/multi_height.py +0 -0
  107. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/input/states/scan_ws.py +0 -0
  108. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/input/states/single.py +0 -0
  109. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/input/states/states_table.py +0 -0
  110. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/__init__.py +0 -0
  111. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/axial_induction/__init__.py +0 -0
  112. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/axial_induction/betz.py +0 -0
  113. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/axial_induction/madsen.py +0 -0
  114. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/farm_controllers/__init__.py +0 -0
  115. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/farm_controllers/basic.py +0 -0
  116. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/farm_models/__init__.py +0 -0
  117. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/farm_models/turbine2farm.py +0 -0
  118. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/ground_models/__init__.py +0 -0
  119. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/ground_models/no_ground.py +0 -0
  120. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/ground_models/wake_mirror.py +0 -0
  121. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/model_book.py +0 -0
  122. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/partial_wakes/__init__.py +0 -0
  123. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/partial_wakes/axiwake.py +0 -0
  124. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/partial_wakes/centre.py +0 -0
  125. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/partial_wakes/grid.py +0 -0
  126. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/partial_wakes/rotor_points.py +0 -0
  127. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/partial_wakes/segregated.py +0 -0
  128. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/partial_wakes/top_hat.py +0 -0
  129. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/point_models/__init__.py +0 -0
  130. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/point_models/set_uniform_data.py +0 -0
  131. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/point_models/tke2ti.py +0 -0
  132. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/point_models/wake_deltas.py +0 -0
  133. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/rotor_models/__init__.py +0 -0
  134. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/rotor_models/centre.py +0 -0
  135. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/rotor_models/grid.py +0 -0
  136. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/rotor_models/levels.py +0 -0
  137. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/turbine_models/__init__.py +0 -0
  138. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/turbine_models/calculator.py +0 -0
  139. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/turbine_models/kTI_model.py +0 -0
  140. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/turbine_models/lookup_table.py +0 -0
  141. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/turbine_models/power_mask.py +0 -0
  142. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/turbine_models/rotor_centre_calc.py +0 -0
  143. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/turbine_models/sector_management.py +0 -0
  144. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/turbine_models/set_farm_vars.py +0 -0
  145. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/turbine_models/table_factors.py +0 -0
  146. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/turbine_models/thrust2ct.py +0 -0
  147. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/turbine_models/yaw2yawm.py +0 -0
  148. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/turbine_models/yawm2yaw.py +0 -0
  149. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/turbine_types/CpCt_file.py +0 -0
  150. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/turbine_types/CpCt_from_two.py +0 -0
  151. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/turbine_types/PCt_file.py +0 -0
  152. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/turbine_types/PCt_from_two.py +0 -0
  153. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/turbine_types/__init__.py +0 -0
  154. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/turbine_types/null_type.py +0 -0
  155. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/turbine_types/wsrho2PCt_from_two.py +0 -0
  156. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/turbine_types/wsti2PCt_from_two.py +0 -0
  157. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/vertical_profiles/__init__.py +0 -0
  158. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/vertical_profiles/abl_log_neutral_ws.py +0 -0
  159. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/vertical_profiles/abl_log_stable_ws.py +0 -0
  160. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/vertical_profiles/abl_log_unstable_ws.py +0 -0
  161. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/vertical_profiles/abl_log_ws.py +0 -0
  162. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/vertical_profiles/data_profile.py +0 -0
  163. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/vertical_profiles/sheared_ws.py +0 -0
  164. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/vertical_profiles/uniform.py +0 -0
  165. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_frames/__init__.py +0 -0
  166. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_frames/farm_order.py +0 -0
  167. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_frames/rotor_wd.py +0 -0
  168. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_frames/seq_dynamic_wakes.py +0 -0
  169. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_frames/streamlines.py +0 -0
  170. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_frames/timelines.py +0 -0
  171. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_frames/yawed_wakes.py +0 -0
  172. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_models/__init__.py +0 -0
  173. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_models/axisymmetric.py +0 -0
  174. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_models/dist_sliced.py +0 -0
  175. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_models/gaussian.py +0 -0
  176. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_models/induction/__init__.py +0 -0
  177. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_models/induction/rankine_half_body.py +0 -0
  178. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_models/induction/rathmann.py +0 -0
  179. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_models/induction/self_similar.py +0 -0
  180. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_models/induction/self_similar2020.py +0 -0
  181. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_models/induction/vortex_sheet.py +0 -0
  182. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_models/ti/__init__.py +0 -0
  183. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_models/ti/crespo_hernandez.py +0 -0
  184. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_models/ti/iec_ti.py +0 -0
  185. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_models/top_hat.py +0 -0
  186. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_models/wind/__init__.py +0 -0
  187. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_models/wind/bastankhah16.py +0 -0
  188. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_models/wind/jensen.py +0 -0
  189. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_models/wind/turbopark.py +0 -0
  190. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_superpositions/__init__.py +0 -0
  191. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_superpositions/ti_linear.py +0 -0
  192. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_superpositions/ti_max.py +0 -0
  193. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_superpositions/ti_pow.py +0 -0
  194. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_superpositions/ti_quadratic.py +0 -0
  195. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_superpositions/ws_linear.py +0 -0
  196. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_superpositions/ws_max.py +0 -0
  197. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_superpositions/ws_pow.py +0 -0
  198. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_superpositions/ws_product.py +0 -0
  199. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/models/wake_superpositions/ws_quadratic.py +0 -0
  200. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/__init__.py +0 -0
  201. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/constraints/__init__.py +0 -0
  202. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/constraints/area_geometry.py +0 -0
  203. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/constraints/min_dist.py +0 -0
  204. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/core/__init__.py +0 -0
  205. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/core/farm_constraint.py +0 -0
  206. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/core/farm_objective.py +0 -0
  207. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/core/farm_opt_problem.py +0 -0
  208. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/core/farm_vars_problem.py +0 -0
  209. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/core/pop_states.py +0 -0
  210. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/objectives/__init__.py +0 -0
  211. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/objectives/farm_vars.py +0 -0
  212. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/objectives/max_n_turbines.py +0 -0
  213. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/problems/__init__.py +0 -0
  214. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/problems/layout/__init__.py +0 -0
  215. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/problems/layout/farm_layout.py +0 -0
  216. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/problems/layout/geom_layouts/__init__.py +0 -0
  217. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/problems/layout/geom_layouts/constraints.py +0 -0
  218. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/problems/layout/geom_layouts/geom_layout.py +0 -0
  219. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/problems/layout/geom_layouts/geom_layout_gridded.py +0 -0
  220. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/problems/layout/geom_layouts/geom_reggrid.py +0 -0
  221. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/problems/layout/geom_layouts/geom_reggrids.py +0 -0
  222. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/problems/layout/geom_layouts/objectives.py +0 -0
  223. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/problems/layout/reggrids_layout.py +0 -0
  224. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/problems/layout/regular_layout.py +0 -0
  225. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/opt/problems/opt_farm_vars.py +0 -0
  226. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/output/animation.py +0 -0
  227. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/output/calc_points.py +0 -0
  228. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/output/farm_layout.py +0 -0
  229. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/output/farm_results_eval.py +0 -0
  230. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/output/flow_plots_2d/__init__.py +0 -0
  231. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/output/flow_plots_2d/flow_plots.py +0 -0
  232. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/output/flow_plots_2d/get_fig.py +0 -0
  233. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/output/flow_plots_2d/seq_flow_ani_plugin.py +0 -0
  234. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/output/flow_plots_2d.py +0 -0
  235. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/output/grids.py +0 -0
  236. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/output/output.py +0 -0
  237. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/output/results_writer.py +0 -0
  238. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/output/rose_plot.py +0 -0
  239. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/output/rotor_point_plots.py +0 -0
  240. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/output/round.py +0 -0
  241. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/output/state_turbine_map.py +0 -0
  242. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/output/turbine_type_curves.py +0 -0
  243. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/__init__.py +0 -0
  244. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/abl/__init__.py +0 -0
  245. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/abl/neutral.py +0 -0
  246. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/abl/sheared.py +0 -0
  247. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/abl/stable.py +0 -0
  248. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/abl/unstable.py +0 -0
  249. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/cubic_roots.py +0 -0
  250. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/data_book.py +0 -0
  251. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/dict.py +0 -0
  252. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/exec_python.py +0 -0
  253. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/factory.py +0 -0
  254. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/geom2d/__init__.py +0 -0
  255. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/geom2d/area_geometry.py +0 -0
  256. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/geom2d/circle.py +0 -0
  257. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/geom2d/example_intersection.py +0 -0
  258. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/geom2d/example_union.py +0 -0
  259. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/geom2d/half_plane.py +0 -0
  260. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/geom2d/polygon.py +0 -0
  261. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/geopandas_helpers.py +0 -0
  262. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/geopandas_utils.py +0 -0
  263. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/load.py +0 -0
  264. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/pandas_helpers.py +0 -0
  265. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/pandas_utils.py +0 -0
  266. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/plotly_helpers.py +0 -0
  267. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/random_xy.py +0 -0
  268. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/regularize.py +0 -0
  269. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/runners/__init__.py +0 -0
  270. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/runners/runners.py +0 -0
  271. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/subclasses.py +0 -0
  272. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/tab_files.py +0 -0
  273. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/two_circles.py +0 -0
  274. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/wind_dir.py +0 -0
  275. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/windrose_plot.py +0 -0
  276. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/utils/xarray_utils.py +0 -0
  277. {foxes-0.7.3.1 → foxes-0.7.4}/foxes/variables.py +0 -0
  278. {foxes-0.7.3.1 → foxes-0.7.4}/foxes.egg-info/dependency_links.txt +0 -0
  279. {foxes-0.7.3.1 → foxes-0.7.4}/foxes.egg-info/requires.txt +0 -0
  280. {foxes-0.7.3.1 → foxes-0.7.4}/foxes.egg-info/top_level.txt +0 -0
  281. {foxes-0.7.3.1 → foxes-0.7.4}/foxes.egg-info/zip-safe +0 -0
  282. {foxes-0.7.3.1 → foxes-0.7.4}/pyproject.toml +0 -0
  283. {foxes-0.7.3.1 → foxes-0.7.4}/setup.cfg +0 -0
  284. {foxes-0.7.3.1 → foxes-0.7.4}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: foxes
3
- Version: 0.7.3.1
3
+ Version: 0.7.4
4
4
  Summary: Farm Optimization and eXtended yield Evaluation Software
5
5
  Author: Fraunhofer IWES
6
6
  Author-email: jonas.schmidt@iwes.fraunhofer.de
@@ -0,0 +1 @@
1
+ 0.7.4
@@ -66,7 +66,7 @@ POINTS = "points"
66
66
  """
67
67
 
68
68
  AMB_TARGET_RESULTS = "amb_target_res"
69
- """ Identified for ambient target results
69
+ """ Identifier for ambient target results
70
70
  :group: foxes.constants
71
71
  """
72
72
 
@@ -48,7 +48,7 @@ class WindFarm:
48
48
  self.turbines.append(turbine)
49
49
  if verbosity > 0:
50
50
  print(
51
- f"Turbine {turbine.index}, {turbine.name}: {', '.join(turbine.models)}"
51
+ f"Turbine {turbine.index}, {turbine.name}: xy=({turbine.xy[0]:.2f}, {turbine.xy[1]:.2f}), {', '.join(turbine.models)}"
52
52
  )
53
53
 
54
54
  @property
@@ -7,4 +7,5 @@ from .read_fields import wio2foxes, foxes2wio
7
7
  from .get_states import get_states
8
8
  from .read_farm import read_turbine_type, read_layout
9
9
  from .read_attributes import read_attributes
10
+ from .read_outputs import read_outputs
10
11
  from .runner import WindioRunner
@@ -0,0 +1,184 @@
1
+ import numpy as np
2
+ import pandas as pd
3
+ from xarray import Dataset
4
+ from numbers import Number
5
+
6
+ from foxes.core import States
7
+ import foxes.constants as FC
8
+ import foxes.variables as FV
9
+
10
+ def _get_profiles(coords, fields, dims, ovars, fixval, verbosity):
11
+ """Read ABL profiles information
12
+ :group: input.windio
13
+ """
14
+ profiles = {}
15
+ if FV.Z0 in fields:
16
+ if FV.H not in fields and verbosity > 0:
17
+ print(f"Ignoring '{FV.Z0}', since no reference_height found. No ABL profile activated.")
18
+ elif FV.MOL in fields:
19
+ ovars.append(FV.MOL)
20
+ fixval[FV.H] = fields[FV.H]
21
+ profiles = {FV.WS: "ABLLogWsProfile"}
22
+ else:
23
+ fixval[FV.H] = fields[FV.H]
24
+ profiles = {FV.WS: "ABLLogNeutralWsProfile"}
25
+ elif FV.H in fields and verbosity > 0:
26
+ print(f"Ignoring '{FV.H}', since no '{FV.Z0}' data found. No ABL profile activated.")
27
+ if len(profiles) and verbosity > 2:
28
+ print(f" Selecting ABL profile '{profiles[FV.WS]}', {FV.H} = {fields[FV.H]} m")
29
+
30
+ return profiles
31
+
32
+ def _get_SingleStateStates(coords, fields, dims, states_dict,
33
+ ovars, fixval, profiles, verbosity):
34
+ """Try to generate single state parameters
35
+ :group: input.windio
36
+ """
37
+ for c in coords:
38
+ if not isinstance(c, Number):
39
+ return False
40
+
41
+ if verbosity > 2:
42
+ print(" selecting class 'SingleStateStates'")
43
+
44
+ smap = {FV.WS: "ws", FV.WD: "wd", FV.TI: "ti", FV.RHO: "rho"}
45
+
46
+ data = {smap[v]: d for v, d in fixval.items()}
47
+ for v, d in coords.items():
48
+ if v in smap:
49
+ data[smap[v]] = d
50
+ elif verbosity > 1:
51
+ print(f" ignoring coord '{v}'")
52
+ for v, d in fields.items():
53
+ if v in smap and len(dims[v]) == 0:
54
+ data[smap[v]] = d
55
+ elif verbosity > 1:
56
+ print(f" ignoring field '{v}' with dims {dims[v]}")
57
+
58
+ sdata = pd.DataFrame(index=coords[FC.TIME], data=data)
59
+ sdata.index.name = FC.TIME
60
+ states_dict.update(
61
+ dict(
62
+ states_type="SingleStateStates",
63
+ profiles=profiles,
64
+ **data,
65
+ )
66
+ )
67
+ return True
68
+
69
+ def _get_Timeseries(coords, fields, dims, states_dict,
70
+ ovars, fixval, profiles, verbosity):
71
+ """Try to generate time series parameters
72
+ :group: input.windio
73
+ """
74
+ if len(coords) == 1 and FC.TIME in coords:
75
+ if verbosity > 2:
76
+ print(" selecting class 'Timeseries'")
77
+
78
+ data = {}
79
+ fix = {}
80
+ for v, d in fields.items():
81
+ if dims[v] == (FC.TIME,):
82
+ data[v] = d
83
+ elif len(dims[v]) == 0:
84
+ fix[v] = d
85
+ elif verbosity > 2:
86
+ print(f" ignoring field '{v}' with dims {dims[v]}")
87
+ fix.update({v: d for v, d in fixval.items() if v not in data})
88
+
89
+ sdata = pd.DataFrame(index=coords[FC.TIME], data=data)
90
+ sdata.index.name = FC.TIME
91
+ states_dict.update(
92
+ dict(
93
+ states_type="Timeseries",
94
+ data_source=sdata,
95
+ output_vars=ovars,
96
+ fixed_vars=fix,
97
+ profiles=profiles,
98
+ )
99
+ )
100
+ return True
101
+ return False
102
+
103
+ def _get_MultiHeightNCTimeseries(coords, fields, dims, states_dict,
104
+ ovars, fixval, profiles, verbosity):
105
+ """Try to generate time series parameters
106
+ :group: input.windio
107
+ """
108
+ if len(coords) == 2 and FC.TIME in coords and FV.H in coords:
109
+ if verbosity > 2:
110
+ print(" selecting class 'MultiHeightNCTimeseries'")
111
+
112
+ if len(profiles) and verbosity > 0:
113
+ print(f"Ignoring profile '{profiles[FV.WS]}' for states class 'MultiHeightNCTimeseries'")
114
+
115
+ data = {}
116
+ fix = {}
117
+ for v, d in fields.items():
118
+ if dims[v] == (FC.TIME, FV.H):
119
+ data[v] = ((FC.TIME, FV.H), d)
120
+ if dims[v] == (FV.H, FC.TIME):
121
+ data[v] = ((FC.TIME, FV.H), np.swapaxes(d, 0, 1))
122
+ elif len(dims[v]) == 0:
123
+ fix[v] = d
124
+ elif verbosity > 2:
125
+ print(f" ignoring field '{v}' with dims {dims[v]}")
126
+ fix.update({v: d for v, d in fixval.items() if v not in data})
127
+
128
+ sdata = Dataset(coords=coords, data_vars=data)
129
+ states_dict.update(
130
+ dict(
131
+ states_type="MultiHeightNCTimeseries",
132
+ h_coord=FV.H,
133
+ format_times_func=None,
134
+ data_source=sdata,
135
+ output_vars=ovars,
136
+ fixed_vars=fix,
137
+ )
138
+ )
139
+ return True
140
+ return False
141
+
142
+ def get_states(coords, fields, dims, verbosity=1):
143
+ """
144
+ Reads states parameters from windio input
145
+
146
+ Parameters
147
+ ----------
148
+ coords: dict
149
+ The coordinates data
150
+ fields: dict
151
+ The fields data
152
+ dims: dict
153
+ The dimensions data
154
+ verbosity: int
155
+ The verbosity level
156
+
157
+ Returns
158
+ -------
159
+ states: foxes.core.States
160
+ The states object
161
+
162
+ :group: input.windio
163
+
164
+ """
165
+ if verbosity > 2:
166
+ print(" Preparing states")
167
+
168
+ ovars = [FV.WS, FV.WD, FV.TI, FV.RHO]
169
+ fixval = {FV.TI: 0.05, FV.RHO: 1.225}
170
+ profiles = _get_profiles(coords, fields, dims, ovars, fixval, verbosity)
171
+
172
+ states_dict = {}
173
+ if _get_SingleStateStates(
174
+ coords, fields, dims, states_dict, ovars, fixval, profiles, verbosity
175
+ ) or _get_Timeseries(
176
+ coords, fields, dims, states_dict, ovars, fixval, profiles, verbosity
177
+ ) or _get_MultiHeightNCTimeseries(
178
+ coords, fields, dims, states_dict, ovars, fixval, profiles, verbosity
179
+ ):
180
+ return States.new(**states_dict)
181
+ else:
182
+ raise ValueError(
183
+ f"Failed to create states for coords {list(coords.keys())} and fields {list(fields.keys())} with dims {dims}"
184
+ )
@@ -2,6 +2,8 @@ from foxes.utils import Dict
2
2
  from foxes.core import WakeModel, WakeFrame
3
3
  import foxes.variables as FV
4
4
 
5
+ from .read_outputs import read_outputs
6
+
5
7
 
6
8
  def _read_wind_deficit(wind_deficit, superposition, induction, algo_dict, verbosity):
7
9
  """Reads the wind deficit wake model"""
@@ -23,11 +25,20 @@ def _read_wind_deficit(wind_deficit, superposition, induction, algo_dict, verbos
23
25
  },
24
26
  name="ws_sup_dict",
25
27
  )
26
-
28
+ ws_sup_amb_dict = Dict(
29
+ {
30
+ "Linear": "ws_linear_amb",
31
+ "Quadratic": "ws_quadratic_amb",
32
+ },
33
+ name="ws_sup_dict",
34
+ )
35
+
27
36
  wname = wind_deficit.pop("name")
28
- if verbosity > 1:
37
+ eff_ws = wind_deficit.pop("use_effective_ws", True)
38
+ if verbosity > 2:
29
39
  print(" Reading wind_deficit_model")
30
- print(" Name:", wname)
40
+ print(" Name :", wname)
41
+ print(" Eff ws :", eff_ws)
31
42
  print(" Contents:", [k for k in wind_deficit.keys()])
32
43
  wind_def_dict = Dict(wmodel_type=wind_def_map[wname], induction=induction)
33
44
  kcoef = Dict(wind_deficit["wake_expansion_coefficient"], name="kcoef")
@@ -36,11 +47,11 @@ def _read_wind_deficit(wind_deficit, superposition, induction, algo_dict, verbos
36
47
  amb_ti = kcoef.get("free_stream_ti", False)
37
48
  if ka is None or ka == 0.0:
38
49
  wind_def_dict["k"] = kb
39
- if verbosity > 1:
50
+ if verbosity > 2:
40
51
  print(" Using k =", kb)
41
52
  else:
42
53
  ti_var = FV.AMB_TI if amb_ti else FV.TI
43
- if verbosity > 1:
54
+ if verbosity > 2:
44
55
  print(f" Using k = {ka} * {ti_var} + {kb}")
45
56
  wind_def_dict["k"] = None
46
57
  wind_def_dict["ka"] = ka
@@ -48,20 +59,20 @@ def _read_wind_deficit(wind_deficit, superposition, induction, algo_dict, verbos
48
59
  wind_def_dict["ti_var"] = ti_var
49
60
  if "ceps" in wind_deficit:
50
61
  sbf = wind_deficit["ceps"]
51
- if verbosity > 1:
62
+ if verbosity > 2:
52
63
  print(f" Using sbeta_factor = {sbf}")
53
64
  wind_def_dict["sbeta_factor"] = sbf
54
- wind_def_dict["superposition"] = ws_sup_dict[superposition["ws_superposition"]]
65
+ supd = ws_sup_dict if eff_ws else ws_sup_amb_dict
66
+ wind_def_dict["superposition"] = supd[superposition["ws_superposition"]]
55
67
 
56
68
  algo_dict["mbook"].wake_models[wname] = WakeModel.new(**wind_def_dict)
57
- if verbosity > 1:
69
+ if verbosity > 2:
58
70
  print(f" Created wake model '{wname}':")
59
71
  print(" ", algo_dict["mbook"].wake_models[wname])
60
72
  algo_dict["wake_models"].append(wname)
61
73
 
62
74
  return ka, kb, amb_ti
63
75
 
64
-
65
76
  def _read_turbulence(
66
77
  turbulence_model, superposition, induction, algo_dict, ka, kb, amb_ti, verbosity
67
78
  ):
@@ -70,7 +81,7 @@ def _read_turbulence(
70
81
  twake_def_map = Dict(
71
82
  {
72
83
  "CrespoHernandez": "CrespoHernandezTIWake",
73
- "IEC-TI-2019": "IECTI2019",
84
+ "IEC-TI-2019": "IECTIWake",
74
85
  },
75
86
  name="twake_def_map",
76
87
  )
@@ -84,38 +95,41 @@ def _read_turbulence(
84
95
  )
85
96
 
86
97
  wname = turbulence_model.pop("name")
87
- if verbosity > 1:
98
+ if verbosity > 2:
88
99
  print(" Reading turbulence_model")
89
100
  print(" Name:", wname)
90
101
  print(" Contents:", [k for k in turbulence_model.keys()])
91
- tiwake_dict = dict(wmodel_type=twake_def_map[wname], induction=induction)
92
- if "wake_expansion_coefficient" in turbulence_model:
93
- kcoef = Dict(turbulence_model["wake_expansion_coefficient"], name="kcoef")
94
- ka = kcoef["k_a"]
95
- kb = kcoef.get("k_b", 0.0)
96
- amb_ti = kcoef.get("free_stream_ti", False)
97
- if ka is None or ka == 0.0:
98
- tiwake_dict["k"] = kb
99
- if verbosity > 1:
100
- print(" Using k =", kb)
101
- else:
102
- ti_var = FV.AMB_TI if amb_ti else FV.TI
103
- if verbosity > 1:
104
- print(f" Using k = {ka} * {ti_var} + {kb}")
105
- tiwake_dict["k"] = None
106
- tiwake_dict["ka"] = ka
107
- tiwake_dict["kb"] = kb
108
- tiwake_dict["ti_var"] = ti_var
109
- tiwake_dict["superposition"] = ti_sup_dict[superposition["ti_superposition"]]
110
-
111
- algo_dict["mbook"].wake_models[wname] = WakeModel.new(**tiwake_dict)
112
- if verbosity > 1:
113
- print(f" Created wake model '{wname}':")
114
- print(" ", algo_dict["mbook"].wake_models[wname])
115
- algo_dict["wake_models"].append(wname)
116
-
102
+ if wname != "None":
103
+ tiwake_dict = dict(wmodel_type=twake_def_map[wname], induction=induction)
104
+ if wname == "IEC-TI-2019":
105
+ tiwake_dict["opening_angle"] = None
106
+ tiwake_dict["iec_type"] = "2019"
107
+ if "wake_expansion_coefficient" in turbulence_model:
108
+ kcoef = Dict(turbulence_model["wake_expansion_coefficient"], name="kcoef")
109
+ ka = kcoef["k_a"]
110
+ kb = kcoef.get("k_b", 0.0)
111
+ amb_ti = kcoef.get("free_stream_ti", False)
112
+ if ka is None or ka == 0.0:
113
+ tiwake_dict["k"] = kb
114
+ if verbosity > 2:
115
+ print(" Using k =", kb)
116
+ else:
117
+ ti_var = FV.AMB_TI if amb_ti else FV.TI
118
+ if verbosity > 2:
119
+ print(f" Using k = {ka} * {ti_var} + {kb}")
120
+ tiwake_dict["k"] = None
121
+ tiwake_dict["ka"] = ka
122
+ tiwake_dict["kb"] = kb
123
+ tiwake_dict["ti_var"] = ti_var
124
+ tiwake_dict["superposition"] = ti_sup_dict[superposition["ti_superposition"]]
125
+
126
+ algo_dict["mbook"].wake_models[wname] = WakeModel.new(**tiwake_dict)
127
+ if verbosity > 2:
128
+ print(f" Created wake model '{wname}':")
129
+ print(" ", algo_dict["mbook"].wake_models[wname])
130
+ algo_dict["wake_models"].append(wname)
117
131
 
118
- def _read_blockage(blockage_model, superposition, induction, algo_dict, verbosity):
132
+ def _read_blockage(blockage_model, induction, algo_dict, verbosity):
119
133
  """Reads the blockage model"""
120
134
  indc_def_map = Dict(
121
135
  {
@@ -128,23 +142,22 @@ def _read_blockage(blockage_model, superposition, induction, algo_dict, verbosit
128
142
  )
129
143
 
130
144
  wname = blockage_model.pop("name")
131
- if verbosity > 1:
145
+ if verbosity > 2:
132
146
  print(" Reading blockage_model")
133
147
  print(" Name:", wname)
134
148
  print(" Contents:", [k for k in blockage_model.keys()])
135
149
  if wname != "None":
136
150
  indc_dict = Dict(wmodel_type=indc_def_map[wname], induction=induction)
137
151
  algo_dict["mbook"].wake_models[wname] = WakeModel.new(**indc_dict)
138
- if verbosity > 1:
152
+ if verbosity > 2:
139
153
  print(f" Created wake model '{wname}':")
140
154
  print(" ", algo_dict["mbook"].wake_models[wname])
141
155
  algo_dict["wake_models"].append(wname)
142
156
  algo_dict["algo_type"] = "Iterative"
143
157
 
144
-
145
158
  def _read_rotor_averaging(rotor_averaging, algo_dict, verbosity):
146
159
  """Reads the rotor averaging"""
147
- if verbosity > 1:
160
+ if verbosity > 2:
148
161
  print(" Reading rotor_averaging")
149
162
  print(" Contents:", [k for k in rotor_averaging.keys()])
150
163
  grid = rotor_averaging["grid"]
@@ -158,13 +171,13 @@ def _read_rotor_averaging(rotor_averaging, algo_dict, verbosity):
158
171
  wake_averaging = rotor_averaging["wake_averaging"]
159
172
  wse_P = rotor_averaging["wind_speed_exponent_for_power"]
160
173
  wse_ct = rotor_averaging["wind_speed_exponent_for_ct"]
161
- if verbosity > 1:
174
+ if verbosity > 2:
162
175
  print(" grid :", grid)
163
176
  print(" background_averaging:", background_averaging)
164
177
  print(" wake_averaging :", wake_averaging)
165
178
  print(" ws exponent power :", wse_P)
166
179
  print(" ws exponent ct :", wse_ct)
167
- if background_averaging == "center":
180
+ if background_averaging in ["center", "centre"]:
168
181
  algo_dict["rotor_model"] = "centre"
169
182
  elif background_averaging == "grid":
170
183
  algo_dict["rotor_model"] = f"grid{nx*ny}"
@@ -172,7 +185,7 @@ def _read_rotor_averaging(rotor_averaging, algo_dict, verbosity):
172
185
  raise KeyError(
173
186
  f"Expecting background_averaging 'center' or 'grid', got '{background_averaging}'"
174
187
  )
175
- if wake_averaging == "centre":
188
+ if wake_averaging in ["centre", "center"]:
176
189
  algo_dict["partial_wakes"] = "centre"
177
190
  elif wake_averaging == "grid":
178
191
  if background_averaging == "grid":
@@ -184,11 +197,10 @@ def _read_rotor_averaging(rotor_averaging, algo_dict, verbosity):
184
197
  algo_dict["partial_wakes"] = grid
185
198
  else:
186
199
  algo_dict["partial_wakes"] = wake_averaging
187
- if verbosity > 1:
200
+ if verbosity > 2:
188
201
  print(" --> rotor_model :", algo_dict["rotor_model"])
189
202
  print(" --> partial_wakes :", algo_dict["partial_wakes"])
190
203
 
191
-
192
204
  def _read_deflection(deflection, induction, algo_dict, verbosity):
193
205
  """Reads deflection model"""
194
206
  defl_def_map = Dict(
@@ -200,7 +212,7 @@ def _read_deflection(deflection, induction, algo_dict, verbosity):
200
212
  )
201
213
 
202
214
  wname = deflection.pop("name")
203
- if verbosity > 1:
215
+ if verbosity > 2:
204
216
  print(" Reading deflection_model")
205
217
  print(" Name:", wname)
206
218
  print(" Contents:", [k for k in deflection.keys()])
@@ -211,21 +223,20 @@ def _read_deflection(deflection, induction, algo_dict, verbosity):
211
223
  )
212
224
  except TypeError:
213
225
  algo_dict["mbook"].wake_frames[wname] = WakeFrame.new(**indc_dict)
214
- if verbosity > 1:
226
+ if verbosity > 2:
215
227
  print(f" Created wake frame '{wname}':")
216
228
  print(" ", algo_dict["mbook"].wake_frames[wname])
217
229
  algo_dict["wake_frame"] = wname
218
230
 
219
-
220
231
  def _read_analysis(wio_ana, algo_dict, verbosity):
221
232
  """Reads the windio analyses"""
222
- if verbosity > 1:
233
+ if verbosity > 2:
223
234
  print(" Reading analysis")
224
235
  print(" Contents:", [k for k in wio_ana.keys()])
225
236
 
226
237
  # superposition:
227
238
  superposition = Dict(wio_ana["superposition_model"], name="superposition_model")
228
- if verbosity > 1:
239
+ if verbosity > 2:
229
240
  print(" Reading superposition_model")
230
241
  print(" Contents:", [k for k in superposition.keys()])
231
242
 
@@ -237,8 +248,8 @@ def _read_analysis(wio_ana, algo_dict, verbosity):
237
248
  },
238
249
  name="induction mapping",
239
250
  )
240
- induction = imap[wio_ana["axial_induction_model"]]
241
- if verbosity > 1:
251
+ induction = imap[wio_ana.get("axial_induction_model", "1D")]
252
+ if verbosity > 2:
242
253
  print(" axial induction model:", induction)
243
254
 
244
255
  # wind deficit model:
@@ -248,33 +259,35 @@ def _read_analysis(wio_ana, algo_dict, verbosity):
248
259
  )
249
260
 
250
261
  # turbulence model:
251
- turbulence_model = Dict(wio_ana["turbulence_model"], name="turbulence_model")
252
- _read_turbulence(
253
- turbulence_model, superposition, induction, algo_dict, ka, kb, amb_ti, verbosity
254
- )
262
+ if "turbulence_model" in wio_ana:
263
+ turbulence_model = Dict(wio_ana["turbulence_model"], name="turbulence_model")
264
+ _read_turbulence(
265
+ turbulence_model, superposition, induction, algo_dict, ka, kb, amb_ti, verbosity
266
+ )
267
+ elif verbosity > 0:
268
+ print("turbulence_model not found, not using a TI wake model")
255
269
 
256
270
  # blockage model:
257
- blockage_model = Dict(wio_ana["blockage_model"], name="blockage_model")
258
- _read_blockage(blockage_model, superposition, induction, algo_dict, verbosity)
259
-
271
+ if "blockage_model" in wio_ana:
272
+ blockage_model = Dict(wio_ana["blockage_model"], name="blockage_model")
273
+ _read_blockage(blockage_model, induction, algo_dict, verbosity)
274
+ elif verbosity > 0:
275
+ print("blockage_model not found, not using a turbine induction model")
276
+
260
277
  # rotor_averaging:
261
- rotor_averaging = Dict(wio_ana["rotor_averaging"], name="rotor_averaging")
262
- _read_rotor_averaging(rotor_averaging, algo_dict, verbosity)
263
-
278
+ if "rotor_averaging" in wio_ana:
279
+ rotor_averaging = Dict(wio_ana["rotor_averaging"], name="rotor_averaging")
280
+ _read_rotor_averaging(rotor_averaging, algo_dict, verbosity)
281
+ elif verbosity > 0:
282
+ print("rotor_averaging not found, using default settings")
283
+
264
284
  # deflection:
265
- deflection = Dict(wio_ana["deflection_model"], name="deflection_model")
266
- _read_deflection(deflection, induction, algo_dict, verbosity)
267
-
268
-
269
- def _read_outputs(wio_outs, algo_dict, verbosity):
270
- """Reads the outputs"""
271
- if verbosity > 1:
272
- print(" Reading outputs")
273
- print(" Contents:", [k for k in wio_outs.keys()])
274
- quit()
275
- return []
276
-
277
-
285
+ if "deflection_model" in wio_ana:
286
+ deflection = Dict(wio_ana["deflection_model"], name="deflection_model")
287
+ _read_deflection(deflection, induction, algo_dict, verbosity)
288
+ elif verbosity > 0:
289
+ print("deflection_model not found, using default settings")
290
+
278
291
  def read_attributes(wio, algo_dict, verbosity):
279
292
  """
280
293
  Reads the attributes part of windio
@@ -297,7 +310,7 @@ def read_attributes(wio, algo_dict, verbosity):
297
310
 
298
311
  """
299
312
  wio_attrs = Dict(wio["attributes"], name="attributes")
300
- if verbosity > 0:
313
+ if verbosity > 1:
301
314
  print("Reading attributes")
302
315
  print(" Contents:", [k for k in wio_attrs.keys()])
303
316
 
@@ -305,17 +318,21 @@ def read_attributes(wio, algo_dict, verbosity):
305
318
  if "flow_model" in wio_attrs:
306
319
  flow_model = Dict(wio_attrs["flow_model"], name="flow_model")
307
320
  fmname = flow_model.pop("name")
308
- if verbosity > 1:
321
+ if verbosity > 2:
309
322
  print(" Reading flow_model")
310
323
  print(" Name:", fmname)
311
324
  print(" Contents:", [k for k in flow_model.keys()])
312
325
  if fmname != "foxes":
313
- raise ValueError(f"Can only run flow_model 'foxes', got '{fmname}'")
326
+ print(f"Running flow model 'foxes', overruling original choice '{fmname}'")
314
327
 
315
328
  # read analysis:
316
329
  wio_ana = Dict(wio_attrs["analysis"], name="analyses")
317
330
  _read_analysis(wio_ana, algo_dict, verbosity)
318
331
 
319
332
  # outputs:
320
- outputs = Dict(wio_attrs["outputs"], name="outputs")
321
- return _read_outputs(outputs, algo_dict, verbosity)
333
+ out_dicts = []
334
+ if "outputs" in wio_attrs:
335
+ outputs = Dict(wio_attrs["outputs"], name="outputs")
336
+ out_dicts = read_outputs(outputs, algo_dict, verbosity)
337
+
338
+ return out_dicts
@@ -32,27 +32,27 @@ def read_turbine_type(wio_trbns, algo_dict, ws_exp_P, ws_exp_ct, verbosity):
32
32
 
33
33
  """
34
34
  tname = wio_trbns.pop("name")
35
- if verbosity > 1:
35
+ if verbosity > 2:
36
36
  print(" Reading wio_trbns")
37
37
  print(" Name:", tname)
38
38
  print(" Contents:", [k for k in wio_trbns.keys()])
39
39
 
40
40
  # read performance:
41
41
  performance = Dict(wio_trbns["performance"], name="performance")
42
- if verbosity > 1:
42
+ if verbosity > 2:
43
43
  print(" Reading performance")
44
44
  print(" Contents:", [k for k in performance.keys()])
45
45
 
46
46
  # P, ct data:
47
47
  if "power_curve" in performance:
48
48
  power_curve = Dict(performance["power_curve"], name="power_curve")
49
- if verbosity > 1:
49
+ if verbosity > 2:
50
50
  print(" Reading power_curve")
51
51
  print(" Contents:", [k for k in power_curve.keys()])
52
52
  P = power_curve["power_values"]
53
53
  ws_P = power_curve["power_wind_speeds"]
54
54
  ct_curve = Dict(performance["Ct_curve"], name="Ct_values")
55
- if verbosity > 1:
55
+ if verbosity > 2:
56
56
  print(" Reading Ct_curve")
57
57
  print(" Contents:", [k for k in ct_curve.keys()])
58
58
  ct = ct_curve["Ct_values"]
@@ -66,7 +66,7 @@ def read_turbine_type(wio_trbns, algo_dict, ws_exp_P, ws_exp_ct, verbosity):
66
66
  raise ValueError(f"Expecting wind speed exponent 1, 2 or 3, got {wse}")
67
67
  return FV.REWS if wse == 1 else (FV.REWS2 if wse == 2 else FV.REWS3)
68
68
 
69
- if verbosity > 1:
69
+ if verbosity > 2:
70
70
  print(f" Creating model '{tname}'")
71
71
  print(f" Turbine type class: PCtFromTwo")
72
72
  algo_dict["mbook"].turbine_types[tname] = TurbineType.new(
@@ -83,19 +83,19 @@ def read_turbine_type(wio_trbns, algo_dict, ws_exp_P, ws_exp_ct, verbosity):
83
83
  var_ws_P=_get_wse_var(ws_exp_P),
84
84
  rho=1.225,
85
85
  )
86
- if verbosity > 1:
86
+ if verbosity > 2:
87
87
  print(" ", algo_dict["mbook"].turbine_types[tname])
88
88
 
89
89
  # P, ct data:
90
90
  elif "Cp_curve" in performance:
91
91
  cp_curve = Dict(performance["Cp_curve"], name="Cp_curve")
92
- if verbosity > 1:
92
+ if verbosity > 2:
93
93
  print(" Reading Cp_curve")
94
94
  print(" Contents:", [k for k in cp_curve.keys()])
95
95
  cp = cp_curve["Cp_values"]
96
96
  ws_cp = cp_curve["Cp_wind_speeds"]
97
97
  ct_curve = Dict(performance["Ct_curve"], name="Ct_values")
98
- if verbosity > 1:
98
+ if verbosity > 2:
99
99
  print(" Reading Ct_curve")
100
100
  print(" Contents:", [k for k in ct_curve.keys()])
101
101
  ct = ct_curve["Ct_values"]
@@ -104,7 +104,7 @@ def read_turbine_type(wio_trbns, algo_dict, ws_exp_P, ws_exp_ct, verbosity):
104
104
  data_cp = pd.DataFrame(data={"ws": ws_cp, "cp": cp})
105
105
  data_ct = pd.DataFrame(data={"ws": ws_ct, "ct": ct})
106
106
 
107
- if verbosity > 1:
107
+ if verbosity > 2:
108
108
  print(f" Creating model '{tname}'")
109
109
  print(f" Turbine type class: CpCtFromTwo")
110
110
  algo_dict["mbook"].turbine_types[tname] = TurbineType.new(
@@ -150,14 +150,14 @@ def read_layout(lname, ldict, algo_dict, ttype, verbosity=1):
150
150
  :group: input.windio
151
151
 
152
152
  """
153
- if verbosity > 1:
153
+ if verbosity > 2:
154
154
  print(f" Reading '{lname}'")
155
155
  cdict = Dict(ldict["coordinates"], name="coordinates")
156
156
  farm = algo_dict["farm"]
157
157
  for xy in zip(cdict["x"], cdict["y"]):
158
158
  farm.add_turbine(
159
159
  Turbine(xy=np.array(xy), turbine_models=[ttype]),
160
- verbosity=0,
160
+ verbosity=verbosity-3,
161
161
  )
162
- if verbosity > 1:
162
+ if verbosity > 2:
163
163
  print(f" Added {farm.n_turbines} wio_trbns of type '{ttype}'")