foxes 0.7.2__tar.gz → 0.7.3.1__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.
- {foxes-0.7.2 → foxes-0.7.3.1}/MANIFEST.in +1 -0
- {foxes-0.7.2/foxes.egg-info → foxes-0.7.3.1}/PKG-INFO +8 -6
- {foxes-0.7.2 → foxes-0.7.3.1}/README.md +1 -1
- foxes-0.7.3.1/foxes/VERSION +1 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/algorithms/downwind/downwind.py +57 -45
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/algorithms/downwind/models/farm_wakes_calc.py +17 -6
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/algorithms/downwind/models/point_wakes_calc.py +13 -45
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/algorithms/iterative/iterative.py +1 -1
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/algorithms/iterative/models/farm_wakes_calc.py +18 -4
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/constants.py +5 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/core/__init__.py +2 -1
- foxes-0.7.3.1/foxes/core/ground_model.py +254 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/core/model.py +3 -2
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/core/partial_wakes_model.py +19 -3
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/core/states.py +33 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/core/wake_model.py +138 -2
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/data/__init__.py +1 -1
- foxes-0.7.3.1/foxes/data/states/WRF-Timeseries-3000.nc +0 -0
- foxes-0.7.3.1/foxes/data/states/windio_timeseries_5000.nc +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/data/static_data.py +7 -0
- foxes-0.7.3.1/foxes/data/windio/DTU_10MW_turbine.yaml +10 -0
- foxes-0.7.3.1/foxes/data/windio/windio_5turbines_timeseries.yaml +63 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/input/states/__init__.py +1 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/input/states/multi_height.py +225 -6
- foxes-0.7.3.1/foxes/input/windio/__init__.py +10 -0
- foxes-0.7.3.1/foxes/input/windio/get_states.py +115 -0
- foxes-0.7.3.1/foxes/input/windio/read_attributes.py +321 -0
- foxes-0.7.3.1/foxes/input/windio/read_farm.py +163 -0
- foxes-0.7.3.1/foxes/input/windio/read_fields.py +164 -0
- foxes-0.7.3.1/foxes/input/windio/runner.py +105 -0
- foxes-0.7.3.1/foxes/input/windio/windio.py +167 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/__init__.py +1 -0
- foxes-0.7.3.1/foxes/models/ground_models/__init__.py +2 -0
- foxes-0.7.3.1/foxes/models/ground_models/no_ground.py +12 -0
- foxes-0.7.3.1/foxes/models/ground_models/wake_mirror.py +161 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/model_book.py +68 -149
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/partial_wakes/axiwake.py +27 -4
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/partial_wakes/top_hat.py +26 -4
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/turbine_types/PCt_file.py +1 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/turbine_types/PCt_from_two.py +92 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_frames/yawed_wakes.py +41 -38
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_models/__init__.py +0 -1
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_models/induction/__init__.py +1 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_models/induction/rankine_half_body.py +1 -1
- foxes-0.7.3.1/foxes/models/wake_models/induction/vortex_sheet.py +227 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_models/ti/crespo_hernandez.py +26 -24
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_models/ti/iec_ti.py +33 -26
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_models/wind/bastankhah14.py +11 -32
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_models/wind/bastankhah16.py +30 -34
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_models/wind/jensen.py +13 -29
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_models/wind/turbopark.py +31 -61
- foxes-0.7.3.1/foxes/output/flow_plots_2d.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/output/grids.py +6 -6
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/output/output.py +6 -6
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/__init__.py +1 -1
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/factory.py +203 -11
- {foxes-0.7.2 → foxes-0.7.3.1/foxes.egg-info}/PKG-INFO +8 -6
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes.egg-info/SOURCES.txt +15 -1
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes.egg-info/requires.txt +6 -4
- {foxes-0.7.2 → foxes-0.7.3.1}/setup.cfg +6 -4
- foxes-0.7.2/foxes/VERSION +0 -1
- foxes-0.7.2/foxes/input/windio/__init__.py +0 -5
- foxes-0.7.2/foxes/input/windio/windio.py +0 -285
- foxes-0.7.2/foxes/models/wake_models/wake_mirror.py +0 -196
- {foxes-0.7.2 → foxes-0.7.3.1}/LICENSE +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/Logo_FOXES.svg +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/algorithms/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/algorithms/downwind/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/algorithms/downwind/models/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/algorithms/downwind/models/init_farm_data.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/algorithms/downwind/models/reorder_farm_output.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/algorithms/downwind/models/set_amb_farm_results.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/algorithms/downwind/models/set_amb_point_results.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/algorithms/iterative/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/algorithms/iterative/models/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/algorithms/iterative/models/convergence.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/algorithms/iterative/models/urelax.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/algorithms/sequential/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/algorithms/sequential/models/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/algorithms/sequential/models/plugin.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/algorithms/sequential/models/seq_state.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/algorithms/sequential/sequential.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/core/algorithm.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/core/axial_induction_model.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/core/data.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/core/data_calc_model.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/core/farm_controller.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/core/farm_data_model.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/core/farm_model.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/core/point_data_model.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/core/rotor_model.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/core/turbine.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/core/turbine_model.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/core/turbine_type.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/core/vertical_profile.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/core/wake_frame.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/core/wake_superposition.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/core/wind_farm.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/data/farms/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/data/farms/test_farm_67.csv +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/data/parse.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/data/power_ct_curves/DTU-10MW-D178d3-H119.csv +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/data/power_ct_curves/IEA-15MW-D240-H150.csv +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/data/power_ct_curves/IWT-7d5MW-D164-H100.csv +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/data/power_ct_curves/NREL-5MW-D126-H90.csv +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/data/power_ct_curves/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/data/states/WRF-Timeseries-4464.csv.gz +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/data/states/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/data/states/abl_states_6000.csv.gz +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/data/states/timeseries_100.csv.gz +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/data/states/timeseries_3000.csv.gz +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/data/states/timeseries_8000.csv.gz +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/data/states/wind_rose_bremen.csv +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/data/states/wind_rotation.nc +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/data/states/winds100.tab +0 -0
- /foxes-0.7.2/foxes/output/flow_plots_2d.py → /foxes-0.7.3.1/foxes/data/windio/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/input/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/input/farm_layout/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/input/farm_layout/from_csv.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/input/farm_layout/from_df.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/input/farm_layout/from_file.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/input/farm_layout/from_json.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/input/farm_layout/from_random.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/input/farm_layout/grid.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/input/farm_layout/row.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/input/states/create/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/input/states/create/random_abl_states.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/input/states/create/random_timeseries.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/input/states/field_data_nc.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/input/states/scan_ws.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/input/states/single.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/input/states/states_table.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/axial_induction/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/axial_induction/betz.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/axial_induction/madsen.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/farm_controllers/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/farm_controllers/basic.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/farm_models/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/farm_models/turbine2farm.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/partial_wakes/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/partial_wakes/centre.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/partial_wakes/grid.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/partial_wakes/rotor_points.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/partial_wakes/segregated.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/point_models/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/point_models/set_uniform_data.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/point_models/tke2ti.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/point_models/wake_deltas.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/rotor_models/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/rotor_models/centre.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/rotor_models/grid.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/rotor_models/levels.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/turbine_models/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/turbine_models/calculator.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/turbine_models/kTI_model.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/turbine_models/lookup_table.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/turbine_models/power_mask.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/turbine_models/rotor_centre_calc.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/turbine_models/sector_management.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/turbine_models/set_farm_vars.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/turbine_models/table_factors.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/turbine_models/thrust2ct.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/turbine_models/yaw2yawm.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/turbine_models/yawm2yaw.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/turbine_types/CpCt_file.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/turbine_types/CpCt_from_two.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/turbine_types/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/turbine_types/null_type.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/turbine_types/wsrho2PCt_from_two.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/turbine_types/wsti2PCt_from_two.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/vertical_profiles/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/vertical_profiles/abl_log_neutral_ws.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/vertical_profiles/abl_log_stable_ws.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/vertical_profiles/abl_log_unstable_ws.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/vertical_profiles/abl_log_ws.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/vertical_profiles/data_profile.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/vertical_profiles/sheared_ws.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/vertical_profiles/uniform.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_frames/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_frames/farm_order.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_frames/rotor_wd.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_frames/seq_dynamic_wakes.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_frames/streamlines.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_frames/timelines.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_models/axisymmetric.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_models/dist_sliced.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_models/gaussian.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_models/induction/rathmann.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_models/induction/self_similar.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_models/induction/self_similar2020.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_models/ti/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_models/top_hat.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_models/wind/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_superpositions/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_superpositions/ti_linear.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_superpositions/ti_max.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_superpositions/ti_pow.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_superpositions/ti_quadratic.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_superpositions/ws_linear.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_superpositions/ws_max.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_superpositions/ws_pow.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_superpositions/ws_product.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/models/wake_superpositions/ws_quadratic.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/constraints/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/constraints/area_geometry.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/constraints/min_dist.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/core/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/core/farm_constraint.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/core/farm_objective.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/core/farm_opt_problem.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/core/farm_vars_problem.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/core/pop_states.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/objectives/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/objectives/farm_vars.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/objectives/max_n_turbines.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/problems/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/problems/layout/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/problems/layout/farm_layout.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/problems/layout/geom_layouts/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/problems/layout/geom_layouts/constraints.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/problems/layout/geom_layouts/geom_layout.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/problems/layout/geom_layouts/geom_layout_gridded.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/problems/layout/geom_layouts/geom_reggrid.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/problems/layout/geom_layouts/geom_reggrids.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/problems/layout/geom_layouts/objectives.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/problems/layout/reggrids_layout.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/problems/layout/regular_layout.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/opt/problems/opt_farm_vars.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/output/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/output/animation.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/output/calc_points.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/output/farm_layout.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/output/farm_results_eval.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/output/flow_plots_2d/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/output/flow_plots_2d/flow_plots.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/output/flow_plots_2d/get_fig.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/output/flow_plots_2d/seq_flow_ani_plugin.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/output/results_writer.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/output/rose_plot.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/output/rotor_point_plots.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/output/round.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/output/slice_data.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/output/state_turbine_map.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/output/turbine_type_curves.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/abl/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/abl/neutral.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/abl/sheared.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/abl/stable.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/abl/unstable.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/cubic_roots.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/data_book.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/dict.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/exec_python.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/geom2d/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/geom2d/area_geometry.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/geom2d/circle.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/geom2d/example_intersection.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/geom2d/example_union.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/geom2d/half_plane.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/geom2d/polygon.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/geopandas_helpers.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/geopandas_utils.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/load.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/pandas_helpers.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/pandas_utils.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/plotly_helpers.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/random_xy.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/regularize.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/runners/__init__.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/runners/runners.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/subclasses.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/tab_files.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/two_circles.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/wind_dir.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/windrose_plot.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/utils/xarray_utils.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes/variables.py +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes.egg-info/dependency_links.txt +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes.egg-info/top_level.txt +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/foxes.egg-info/zip-safe +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/pyproject.toml +0 -0
- {foxes-0.7.2 → foxes-0.7.3.1}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: foxes
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.3.1
|
|
4
4
|
Summary: Farm Optimization and eXtended yield Evaluation Software
|
|
5
5
|
Author: Fraunhofer IWES
|
|
6
6
|
Author-email: jonas.schmidt@iwes.fraunhofer.de
|
|
@@ -17,16 +17,18 @@ Requires-Python: >=3.8
|
|
|
17
17
|
Description-Content-Type: text/markdown
|
|
18
18
|
License-File: LICENSE
|
|
19
19
|
Requires-Dist: matplotlib
|
|
20
|
-
Requires-Dist: numpy
|
|
20
|
+
Requires-Dist: numpy<2
|
|
21
|
+
Requires-Dist: pandas
|
|
21
22
|
Requires-Dist: xarray
|
|
22
|
-
Requires-Dist: dask
|
|
23
|
+
Requires-Dist: dask
|
|
24
|
+
Requires-Dist: distributed
|
|
23
25
|
Requires-Dist: scipy
|
|
24
26
|
Requires-Dist: netcdf4
|
|
25
27
|
Requires-Dist: windrose
|
|
26
28
|
Requires-Dist: iwopy>=0.1.4
|
|
27
29
|
Requires-Dist: pyarrow
|
|
28
30
|
Provides-Extra: io
|
|
29
|
-
Requires-Dist: windio>=1
|
|
31
|
+
Requires-Dist: windio>=1; extra == "io"
|
|
30
32
|
Provides-Extra: test
|
|
31
33
|
Requires-Dist: flake8; extra == "test"
|
|
32
34
|
Requires-Dist: pytest; extra == "test"
|
|
@@ -40,7 +42,7 @@ Requires-Dist: ipywidgets; extra == "doc"
|
|
|
40
42
|
Requires-Dist: m2r2; extra == "doc"
|
|
41
43
|
Requires-Dist: lxml_html_clean; extra == "doc"
|
|
42
44
|
Provides-Extra: all
|
|
43
|
-
Requires-Dist: windio>=1
|
|
45
|
+
Requires-Dist: windio>=1; extra == "all"
|
|
44
46
|
Requires-Dist: flake8; extra == "all"
|
|
45
47
|
Requires-Dist: pytest; extra == "all"
|
|
46
48
|
Requires-Dist: pymoo>=0.6; extra == "all"
|
|
@@ -170,7 +172,7 @@ The supported Python versions are:
|
|
|
170
172
|
- `Python 3.11`
|
|
171
173
|
- `Python 3.12`
|
|
172
174
|
|
|
173
|
-
### Preparation
|
|
175
|
+
### Preparation (optional)
|
|
174
176
|
|
|
175
177
|
It is strongly recommend to use the `libmamba` dependency solver instead of the default solver. Install it once by
|
|
176
178
|
|
|
@@ -116,7 +116,7 @@ The supported Python versions are:
|
|
|
116
116
|
- `Python 3.11`
|
|
117
117
|
- `Python 3.12`
|
|
118
118
|
|
|
119
|
-
### Preparation
|
|
119
|
+
### Preparation (optional)
|
|
120
120
|
|
|
121
121
|
It is strongly recommend to use the `libmamba` dependency solver instead of the default solver. Install it once by
|
|
122
122
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.7.3.1
|
|
@@ -28,6 +28,9 @@ class Downwind(Algorithm):
|
|
|
28
28
|
partial_wakes: dict
|
|
29
29
|
The partial wakes mapping. Key: wake model name,
|
|
30
30
|
value: foxes.core.PartialWakesModel
|
|
31
|
+
ground_models: dict
|
|
32
|
+
The ground models mapping. Key: wake model name,
|
|
33
|
+
value: foxes.core.GroundModel
|
|
31
34
|
farm_controller: foxes.core.FarmController
|
|
32
35
|
The farm controller
|
|
33
36
|
n_states: int
|
|
@@ -65,9 +68,9 @@ class Downwind(Algorithm):
|
|
|
65
68
|
rotor_model="centre",
|
|
66
69
|
wake_frame="rotor_wd",
|
|
67
70
|
partial_wakes=None,
|
|
71
|
+
ground_models=None,
|
|
68
72
|
farm_controller="basic_ctrl",
|
|
69
73
|
chunks={FC.STATE: 1000, FC.POINT: 4000},
|
|
70
|
-
wake_mirrors={},
|
|
71
74
|
mbook=None,
|
|
72
75
|
dbook=None,
|
|
73
76
|
verbosity=1,
|
|
@@ -93,15 +96,15 @@ class Downwind(Algorithm):
|
|
|
93
96
|
partial_wakes: dict, list or str, optional
|
|
94
97
|
The partial wakes mapping. Key: wake model name,
|
|
95
98
|
value: partial wake model name
|
|
99
|
+
ground_models: dict, list or str, optional
|
|
100
|
+
The ground models mapping. Key: wake model name,
|
|
101
|
+
value: ground model name
|
|
96
102
|
farm_controller: str
|
|
97
103
|
The farm controller. Will be
|
|
98
104
|
looked up in the model book
|
|
99
105
|
chunks: dict
|
|
100
106
|
The chunks choice for running in parallel with dask,
|
|
101
107
|
e.g. `{"state": 1000}` for chunks of 1000 states
|
|
102
|
-
wake_mirrors: dict
|
|
103
|
-
Switch on wake mirrors for wake models.
|
|
104
|
-
Key: wake model name, value: list of heights
|
|
105
108
|
mbook: foxes.ModelBook, optional
|
|
106
109
|
The model book
|
|
107
110
|
dbook: foxes.DataBook, optional
|
|
@@ -129,51 +132,60 @@ class Downwind(Algorithm):
|
|
|
129
132
|
for w in wake_models:
|
|
130
133
|
m = self.mbook.wake_models[w]
|
|
131
134
|
m.name = w
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
135
|
+
self.wake_models[w] = m
|
|
136
|
+
|
|
137
|
+
def _set_wspecific(descr, target, values, deffunc, mbooks, checkw):
|
|
138
|
+
if values is None:
|
|
139
|
+
values = {}
|
|
140
|
+
if isinstance(values, list) and len(values) == 1:
|
|
141
|
+
values = values[0]
|
|
142
|
+
if isinstance(values, str):
|
|
143
|
+
for w in wake_models:
|
|
144
|
+
try:
|
|
145
|
+
pw = values
|
|
146
|
+
if checkw:
|
|
147
|
+
mbooks[pw].check_wmodel(self.wake_models[w], error=True)
|
|
148
|
+
except TypeError:
|
|
149
|
+
pw = deffunc(self.wake_models[w])
|
|
150
|
+
target[w] = mbooks[pw]
|
|
151
|
+
target[w].name = pw
|
|
152
|
+
elif isinstance(values, list):
|
|
153
|
+
for i, w in enumerate(wake_models):
|
|
154
|
+
if i >= len(values):
|
|
155
|
+
raise IndexError(
|
|
156
|
+
f"Not enough {descr} in list {values}, expecting {len(wake_models)}"
|
|
140
157
|
)
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
158
|
+
pw = values[i]
|
|
159
|
+
target[w] = mbooks[pw]
|
|
160
|
+
target[w].name = pw
|
|
144
161
|
else:
|
|
145
|
-
|
|
162
|
+
for w in wake_models:
|
|
163
|
+
if w in values:
|
|
164
|
+
pw = values[w]
|
|
165
|
+
else:
|
|
166
|
+
pw = deffunc(self.wake_models[w])
|
|
167
|
+
target[w] = mbooks[pw]
|
|
168
|
+
target[w].name = pw
|
|
146
169
|
|
|
147
170
|
self.partial_wakes = {}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
pw = partial_wakes[i]
|
|
167
|
-
self.partial_wakes[w] = self.mbook.partial_wakes[pw]
|
|
168
|
-
self.partial_wakes[w].name = pw
|
|
169
|
-
else:
|
|
170
|
-
for w in wake_models:
|
|
171
|
-
if w in partial_wakes:
|
|
172
|
-
pw = partial_wakes[w]
|
|
173
|
-
else:
|
|
174
|
-
pw = mbook.default_partial_wakes(self.wake_models[w])
|
|
175
|
-
self.partial_wakes[w] = self.mbook.partial_wakes[pw]
|
|
176
|
-
self.partial_wakes[w].name = pw
|
|
171
|
+
_set_wspecific(
|
|
172
|
+
descr="partial wakes",
|
|
173
|
+
target=self.partial_wakes,
|
|
174
|
+
values=partial_wakes,
|
|
175
|
+
deffunc=mbook.default_partial_wakes,
|
|
176
|
+
mbooks=self.mbook.partial_wakes,
|
|
177
|
+
checkw=True,
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
self.ground_models = {}
|
|
181
|
+
_set_wspecific(
|
|
182
|
+
descr="ground models",
|
|
183
|
+
target=self.ground_models,
|
|
184
|
+
values=ground_models,
|
|
185
|
+
deffunc=lambda w: "no_ground",
|
|
186
|
+
mbooks=self.mbook.ground_models,
|
|
187
|
+
checkw=False,
|
|
188
|
+
)
|
|
177
189
|
|
|
178
190
|
self.farm_controller = self.mbook.farm_controllers[farm_controller]
|
|
179
191
|
self.farm_controller.name = farm_controller
|
|
@@ -75,10 +75,12 @@ class FarmWakesCalculation(FarmDataModel):
|
|
|
75
75
|
wdelta = {v: d[s] for v, d in wdeltas.items()}
|
|
76
76
|
return tdata, wdelta
|
|
77
77
|
|
|
78
|
-
def _evaluate(
|
|
78
|
+
def _evaluate(
|
|
79
|
+
gmodel, tdata, amb_res, weights, wake_res, wdeltas, oi, wmodel, pwake
|
|
80
|
+
):
|
|
79
81
|
"""Helper function for data evaluation at turbines"""
|
|
80
|
-
wres =
|
|
81
|
-
algo, mdata, fdata, tdata, amb_res, weights, wdeltas, wmodel, oi
|
|
82
|
+
wres = gmodel.finalize_farm_wakes(
|
|
83
|
+
algo, mdata, fdata, tdata, amb_res, weights, wdeltas, wmodel, oi, pwake
|
|
82
84
|
)
|
|
83
85
|
|
|
84
86
|
hres = {v: d[:, oi, None] for v, d in wake_res.items()}
|
|
@@ -101,8 +103,11 @@ class FarmWakesCalculation(FarmDataModel):
|
|
|
101
103
|
run_down = None
|
|
102
104
|
for wname, wmodel in algo.wake_models.items():
|
|
103
105
|
pwake = algo.partial_wakes[wname]
|
|
106
|
+
gmodel = algo.ground_models[wname]
|
|
104
107
|
tdatap = pwake2tdata[pwake.name]
|
|
105
|
-
wdeltas =
|
|
108
|
+
wdeltas = gmodel.new_farm_wake_deltas(
|
|
109
|
+
algo, mdata, fdata, tdatap, wmodel, pwake
|
|
110
|
+
)
|
|
106
111
|
|
|
107
112
|
# downwind:
|
|
108
113
|
if wmodel.affects_downwind:
|
|
@@ -110,6 +115,7 @@ class FarmWakesCalculation(FarmDataModel):
|
|
|
110
115
|
for oi in range(n_turbines):
|
|
111
116
|
if oi > 0:
|
|
112
117
|
_evaluate(
|
|
118
|
+
gmodel,
|
|
113
119
|
tdatap,
|
|
114
120
|
amb_res,
|
|
115
121
|
weights,
|
|
@@ -122,7 +128,9 @@ class FarmWakesCalculation(FarmDataModel):
|
|
|
122
128
|
|
|
123
129
|
if oi < n_turbines - 1:
|
|
124
130
|
tdata, wdelta = _get_wdata(tdatap, wdeltas, np.s_[:, oi + 1 :])
|
|
125
|
-
|
|
131
|
+
gmodel.contribute_to_farm_wakes(
|
|
132
|
+
algo, mdata, fdata, tdata, oi, wdelta, wmodel, pwake
|
|
133
|
+
)
|
|
126
134
|
|
|
127
135
|
# upwind:
|
|
128
136
|
else:
|
|
@@ -130,6 +138,7 @@ class FarmWakesCalculation(FarmDataModel):
|
|
|
130
138
|
for oi in range(n_turbines - 1, -1, -1):
|
|
131
139
|
if oi < n_turbines - 1:
|
|
132
140
|
_evaluate(
|
|
141
|
+
gmodel,
|
|
133
142
|
tdatap,
|
|
134
143
|
amb_res,
|
|
135
144
|
weights,
|
|
@@ -142,7 +151,9 @@ class FarmWakesCalculation(FarmDataModel):
|
|
|
142
151
|
|
|
143
152
|
if oi > 0:
|
|
144
153
|
tdata, wdelta = _get_wdata(tdatap, wdeltas, np.s_[:, :oi])
|
|
145
|
-
|
|
154
|
+
gmodel.contribute_to_farm_wakes(
|
|
155
|
+
algo, mdata, fdata, tdata, oi, wdelta, wmodel, pwake
|
|
156
|
+
)
|
|
146
157
|
|
|
147
158
|
if run_up is not None and run_down is not None:
|
|
148
159
|
raise KeyError(
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
from foxes.core import PointDataModel, TData
|
|
1
3
|
import foxes.variables as FV
|
|
2
4
|
import foxes.constants as FC
|
|
3
|
-
from foxes.core import PointDataModel
|
|
4
5
|
|
|
5
6
|
|
|
6
7
|
class PointWakesCalculation(PointDataModel):
|
|
@@ -86,43 +87,6 @@ class PointWakesCalculation(PointDataModel):
|
|
|
86
87
|
"""
|
|
87
88
|
return self.pvars
|
|
88
89
|
|
|
89
|
-
def contribute(
|
|
90
|
-
self,
|
|
91
|
-
algo,
|
|
92
|
-
mdata,
|
|
93
|
-
fdata,
|
|
94
|
-
tdata,
|
|
95
|
-
downwind_index,
|
|
96
|
-
wmodel,
|
|
97
|
-
wdeltas,
|
|
98
|
-
):
|
|
99
|
-
"""
|
|
100
|
-
Contribute to wake deltas from source turbines
|
|
101
|
-
|
|
102
|
-
Parameters
|
|
103
|
-
----------
|
|
104
|
-
algo: foxes.core.Algorithm
|
|
105
|
-
The calculation algorithm
|
|
106
|
-
mdata: foxes.core.Data
|
|
107
|
-
The model data
|
|
108
|
-
fdata: foxes.core.Data
|
|
109
|
-
The farm data
|
|
110
|
-
tdata: foxes.core.Data
|
|
111
|
-
The target point data
|
|
112
|
-
downwind_index: int
|
|
113
|
-
The index in the downwind order
|
|
114
|
-
wmodel: foxes.core.WakeModel
|
|
115
|
-
The wake model
|
|
116
|
-
wdeltas: dict
|
|
117
|
-
The wake deltas, are being modified ob the fly.
|
|
118
|
-
Key: Variable name str, for which the
|
|
119
|
-
wake delta applies, values: numpy.ndarray with
|
|
120
|
-
shape (n_states, n_targets, n_tpoints, ...)
|
|
121
|
-
|
|
122
|
-
"""
|
|
123
|
-
wcoos = algo.wake_frame.get_wake_coos(algo, mdata, fdata, tdata, downwind_index)
|
|
124
|
-
wmodel.contribute(algo, mdata, fdata, tdata, downwind_index, wcoos, wdeltas)
|
|
125
|
-
|
|
126
90
|
def calculate(self, algo, mdata, fdata, tdata, downwind_index=None):
|
|
127
91
|
""" "
|
|
128
92
|
The main model calculation.
|
|
@@ -151,29 +115,33 @@ class PointWakesCalculation(PointDataModel):
|
|
|
151
115
|
(n_states, n_targets, n_tpoints)
|
|
152
116
|
|
|
153
117
|
"""
|
|
154
|
-
|
|
155
118
|
res = {}
|
|
156
119
|
wmodels = (
|
|
157
120
|
algo.wake_models.values() if self.wake_models is None else self.wake_models
|
|
158
121
|
)
|
|
159
122
|
for wmodel in wmodels:
|
|
160
|
-
|
|
123
|
+
pwake = algo.partial_wakes[wmodel.name]
|
|
124
|
+
gmodel = algo.ground_models[wmodel.name]
|
|
125
|
+
|
|
126
|
+
wdeltas = gmodel.new_point_wake_deltas(algo, mdata, fdata, tdata, wmodel)
|
|
127
|
+
|
|
161
128
|
if len(set(self.pvars).intersection(wdeltas.keys())):
|
|
162
129
|
|
|
163
130
|
if downwind_index is None:
|
|
164
131
|
for oi in range(fdata.n_turbines):
|
|
165
|
-
|
|
166
|
-
|
|
132
|
+
gmodel.contribute_to_point_wakes(
|
|
133
|
+
algo, mdata, fdata, tdata, oi, wdeltas, wmodel
|
|
134
|
+
)
|
|
167
135
|
else:
|
|
168
|
-
|
|
169
|
-
algo, mdata, fdata, tdata, downwind_index,
|
|
136
|
+
gmodel.contribute_to_point_wakes(
|
|
137
|
+
algo, mdata, fdata, tdata, downwind_index, wdeltas, wmodel
|
|
170
138
|
)
|
|
171
139
|
|
|
172
140
|
for v in self.pvars:
|
|
173
141
|
if v not in res and v in tdata:
|
|
174
142
|
res[v] = tdata[v].copy()
|
|
175
143
|
|
|
176
|
-
|
|
144
|
+
gmodel.finalize_point_wakes(algo, mdata, fdata, res, wdeltas, wmodel)
|
|
177
145
|
|
|
178
146
|
for v in res.keys():
|
|
179
147
|
if v in wdeltas:
|
|
@@ -64,7 +64,7 @@ class Iterative(Downwind):
|
|
|
64
64
|
"""
|
|
65
65
|
super().__init__(*args, **kwargs)
|
|
66
66
|
|
|
67
|
-
self.max_it = 2
|
|
67
|
+
self.max_it = 2 + self.farm.n_turbines**2 if max_it is None else max_it
|
|
68
68
|
self.conv_crit = (
|
|
69
69
|
self.get_model("DefaultConv")() if conv_crit == "default" else conv_crit
|
|
70
70
|
)
|
|
@@ -109,6 +109,7 @@ class FarmWakesCalculation(FarmDataModel):
|
|
|
109
109
|
n_turbines = mdata.n_turbines
|
|
110
110
|
for wname, wmodel in algo.wake_models.items():
|
|
111
111
|
pwake = algo.partial_wakes[wname]
|
|
112
|
+
gmodel = algo.ground_models[wname]
|
|
112
113
|
tdatap = pwake2tdata[pwake.name]
|
|
113
114
|
wdeltas = pwake.new_wake_deltas(algo, mdata, fdata, tdatap, wmodel)
|
|
114
115
|
|
|
@@ -116,15 +117,28 @@ class FarmWakesCalculation(FarmDataModel):
|
|
|
116
117
|
|
|
117
118
|
if oi > 0:
|
|
118
119
|
tdata, wdelta = _get_wdata(tdatap, wdeltas, np.s_[:, :oi])
|
|
119
|
-
|
|
120
|
+
gmodel.contribute_to_farm_wakes(
|
|
121
|
+
algo, mdata, fdata, tdata, oi, wdelta, wmodel, pwake
|
|
122
|
+
)
|
|
120
123
|
|
|
121
124
|
if oi < n_turbines - 1:
|
|
122
125
|
tdata, wdelta = _get_wdata(tdatap, wdeltas, np.s_[:, oi + 1 :])
|
|
123
|
-
|
|
126
|
+
gmodel.contribute_to_farm_wakes(
|
|
127
|
+
algo, mdata, fdata, tdata, oi, wdelta, wmodel, pwake
|
|
128
|
+
)
|
|
124
129
|
|
|
125
130
|
for oi in range(n_turbines):
|
|
126
|
-
wres =
|
|
127
|
-
algo,
|
|
131
|
+
wres = gmodel.finalize_farm_wakes(
|
|
132
|
+
algo,
|
|
133
|
+
mdata,
|
|
134
|
+
fdata,
|
|
135
|
+
tdatap,
|
|
136
|
+
amb_res,
|
|
137
|
+
weights,
|
|
138
|
+
wdeltas,
|
|
139
|
+
wmodel,
|
|
140
|
+
oi,
|
|
141
|
+
pwake,
|
|
128
142
|
)
|
|
129
143
|
for v, d in wres.items():
|
|
130
144
|
if v in wake_res:
|
|
@@ -18,7 +18,8 @@ from .farm_controller import FarmController
|
|
|
18
18
|
from .turbine import Turbine
|
|
19
19
|
from .partial_wakes_model import PartialWakesModel
|
|
20
20
|
from .wake_frame import WakeFrame
|
|
21
|
-
from .wake_model import WakeModel, TurbineInductionModel
|
|
21
|
+
from .wake_model import WakeModel, TurbineInductionModel, WakeK
|
|
22
22
|
from .wake_superposition import WakeSuperposition
|
|
23
23
|
from .vertical_profile import VerticalProfile
|
|
24
24
|
from .axial_induction_model import AxialInductionModel
|
|
25
|
+
from .ground_model import GroundModel
|