foxes 1.0__py3-none-any.whl → 1.1.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of foxes might be problematic. Click here for more details.
- docs/source/conf.py +0 -1
- examples/states_lookup_table/run.py +1 -1
- examples/timeseries/run.py +11 -4
- foxes/algorithms/downwind/downwind.py +18 -13
- foxes/algorithms/downwind/models/farm_wakes_calc.py +1 -1
- foxes/algorithms/downwind/models/init_farm_data.py +1 -1
- foxes/algorithms/downwind/models/point_wakes_calc.py +1 -1
- foxes/algorithms/downwind/models/reorder_farm_output.py +1 -1
- foxes/algorithms/downwind/models/set_amb_farm_results.py +1 -1
- foxes/algorithms/downwind/models/set_amb_point_results.py +1 -1
- foxes/algorithms/iterative/iterative.py +1 -1
- foxes/algorithms/iterative/models/farm_wakes_calc.py +1 -1
- foxes/algorithms/iterative/models/urelax.py +3 -3
- foxes/algorithms/sequential/models/plugin.py +4 -4
- foxes/algorithms/sequential/models/seq_state.py +1 -1
- foxes/constants.py +5 -5
- foxes/core/algorithm.py +2 -2
- foxes/core/data_calc_model.py +2 -2
- foxes/core/engine.py +20 -10
- foxes/core/farm_controller.py +3 -3
- foxes/core/farm_data_model.py +1 -1
- foxes/core/ground_model.py +2 -2
- foxes/core/model.py +122 -108
- foxes/core/partial_wakes_model.py +1 -1
- foxes/core/point_data_model.py +2 -2
- foxes/core/states.py +1 -1
- foxes/core/turbine_type.py +2 -2
- foxes/core/wake_frame.py +8 -30
- foxes/core/wake_model.py +3 -2
- foxes/core/wake_superposition.py +1 -1
- foxes/data/windio/windio_5turbines_timeseries.yaml +9 -15
- foxes/engines/__init__.py +1 -0
- foxes/engines/dask.py +13 -6
- foxes/engines/multiprocess.py +5 -8
- foxes/engines/numpy.py +8 -26
- foxes/engines/pool.py +10 -24
- foxes/engines/ray.py +79 -0
- foxes/engines/single.py +3 -1
- foxes/input/farm_layout/from_json.py +1 -1
- foxes/input/states/__init__.py +1 -0
- foxes/input/states/field_data_nc.py +4 -4
- foxes/input/states/multi_height.py +4 -4
- foxes/input/states/scan_ws.py +1 -1
- foxes/input/states/single.py +1 -1
- foxes/input/states/slice_data_nc.py +681 -0
- foxes/input/states/states_table.py +3 -3
- foxes/input/windio/__init__.py +1 -1
- foxes/input/windio/read_attributes.py +8 -2
- foxes/input/windio/read_fields.py +3 -0
- foxes/input/windio/read_outputs.py +8 -2
- foxes/input/windio/windio.py +6 -2
- foxes/models/farm_models/turbine2farm.py +1 -1
- foxes/models/ground_models/wake_mirror.py +2 -2
- foxes/models/model_book.py +29 -2
- foxes/models/partial_wakes/axiwake.py +3 -3
- foxes/models/partial_wakes/top_hat.py +2 -2
- foxes/models/point_models/set_uniform_data.py +1 -1
- foxes/models/point_models/tke2ti.py +1 -1
- foxes/models/point_models/wake_deltas.py +1 -1
- foxes/models/rotor_models/grid.py +2 -2
- foxes/models/turbine_models/calculator.py +4 -4
- foxes/models/turbine_models/kTI_model.py +22 -6
- foxes/models/turbine_models/lookup_table.py +3 -2
- foxes/models/turbine_types/PCt_file.py +5 -5
- foxes/models/turbine_types/PCt_from_two.py +5 -5
- foxes/models/turbine_types/TBL_file.py +80 -0
- foxes/models/turbine_types/__init__.py +1 -0
- foxes/models/turbine_types/lookup.py +5 -5
- foxes/models/turbine_types/null_type.py +3 -3
- foxes/models/turbine_types/wsrho2PCt_from_two.py +7 -7
- foxes/models/turbine_types/wsti2PCt_from_two.py +9 -9
- foxes/models/vertical_profiles/__init__.py +1 -1
- foxes/models/wake_frames/dynamic_wakes.py +2 -2
- foxes/models/wake_frames/farm_order.py +2 -2
- foxes/models/wake_frames/rotor_wd.py +2 -2
- foxes/models/wake_frames/seq_dynamic_wakes.py +5 -11
- foxes/models/wake_frames/streamlines.py +2 -2
- foxes/models/wake_frames/timelines.py +2 -2
- foxes/models/wake_frames/yawed_wakes.py +3 -3
- foxes/models/wake_models/dist_sliced.py +1 -1
- foxes/models/wake_models/induction/rankine_half_body.py +1 -1
- foxes/models/wake_models/induction/rathmann.py +76 -22
- foxes/models/wake_models/induction/self_similar.py +76 -26
- foxes/models/wake_models/induction/vortex_sheet.py +84 -46
- foxes/models/wake_models/ti/crespo_hernandez.py +6 -4
- foxes/models/wake_models/ti/iec_ti.py +7 -5
- foxes/models/wake_models/wind/bastankhah14.py +6 -4
- foxes/models/wake_models/wind/bastankhah16.py +9 -9
- foxes/models/wake_models/wind/jensen.py +3 -2
- foxes/models/wake_models/wind/turbopark.py +14 -11
- foxes/models/wake_superpositions/ti_linear.py +1 -1
- foxes/models/wake_superpositions/ti_max.py +1 -1
- foxes/models/wake_superpositions/ti_pow.py +1 -1
- foxes/models/wake_superpositions/ti_quadratic.py +1 -1
- foxes/models/wake_superpositions/ws_linear.py +8 -7
- foxes/models/wake_superpositions/ws_max.py +8 -7
- foxes/models/wake_superpositions/ws_pow.py +8 -7
- foxes/models/wake_superpositions/ws_product.py +5 -5
- foxes/models/wake_superpositions/ws_quadratic.py +8 -7
- foxes/output/farm_layout.py +14 -10
- foxes/output/farm_results_eval.py +1 -1
- foxes/output/grids.py +1 -1
- foxes/output/results_writer.py +2 -2
- foxes/output/rose_plot.py +3 -3
- foxes/output/seq_plugins/seq_flow_ani_plugin.py +2 -2
- foxes/output/seq_plugins/seq_wake_debug_plugin.py +2 -2
- foxes/output/state_turbine_map.py +1 -1
- foxes/utils/abl/neutral.py +2 -2
- foxes/utils/abl/stable.py +2 -2
- foxes/utils/abl/unstable.py +2 -2
- foxes/utils/data_book.py +1 -1
- foxes/utils/dict.py +23 -0
- foxes/utils/exec_python.py +1 -1
- foxes/utils/factory.py +29 -1
- foxes/utils/geom2d/circle.py +1 -1
- foxes/utils/geom2d/polygon.py +1 -1
- foxes/utils/geopandas_utils.py +2 -2
- foxes/utils/load.py +2 -2
- foxes/utils/pandas_helpers.py +1 -1
- foxes/utils/xarray_utils.py +1 -1
- foxes/variables.py +3 -3
- {foxes-1.0.dist-info → foxes-1.1.1.dist-info}/METADATA +8 -6
- {foxes-1.0.dist-info → foxes-1.1.1.dist-info}/RECORD +127 -125
- {foxes-1.0.dist-info → foxes-1.1.1.dist-info}/WHEEL +1 -1
- foxes/utils/geopandas_helpers.py +0 -294
- /examples/{induction_RHB → induction}/run.py +0 -0
- {foxes-1.0.dist-info → foxes-1.1.1.dist-info}/LICENSE +0 -0
- {foxes-1.0.dist-info → foxes-1.1.1.dist-info}/top_level.txt +0 -0
|
@@ -7,7 +7,7 @@ import foxes.constants as FC
|
|
|
7
7
|
|
|
8
8
|
class WSQuadratic(WakeSuperposition):
|
|
9
9
|
"""
|
|
10
|
-
Quadratic
|
|
10
|
+
Quadratic superposition of wind deficit results
|
|
11
11
|
|
|
12
12
|
Attributes
|
|
13
13
|
----------
|
|
@@ -94,7 +94,7 @@ class WSQuadratic(WakeSuperposition):
|
|
|
94
94
|
The target point data
|
|
95
95
|
downwind_index: int
|
|
96
96
|
The index of the wake causing turbine
|
|
97
|
-
in the
|
|
97
|
+
in the downwind order
|
|
98
98
|
st_sel: numpy.ndarray of bool
|
|
99
99
|
The selection of targets, shape: (n_states, n_targets)
|
|
100
100
|
variable: str
|
|
@@ -121,14 +121,15 @@ class WSQuadratic(WakeSuperposition):
|
|
|
121
121
|
if np.any(st_sel):
|
|
122
122
|
scale = self.get_data(
|
|
123
123
|
FV.AMB_REWS if self.scale_amb else FV.REWS,
|
|
124
|
-
FC.
|
|
124
|
+
FC.STATE_TARGET_TPOINT,
|
|
125
125
|
lookup="w",
|
|
126
126
|
algo=algo,
|
|
127
127
|
fdata=fdata,
|
|
128
128
|
tdata=tdata,
|
|
129
129
|
downwind_index=downwind_index,
|
|
130
|
-
upcast=
|
|
131
|
-
|
|
130
|
+
upcast=False,
|
|
131
|
+
selection=st_sel,
|
|
132
|
+
)
|
|
132
133
|
|
|
133
134
|
wake_delta[st_sel] += (scale * wake_model_result) ** 2
|
|
134
135
|
|
|
@@ -182,7 +183,7 @@ class WSQuadratic(WakeSuperposition):
|
|
|
182
183
|
|
|
183
184
|
class WSQuadraticLocal(WakeSuperposition):
|
|
184
185
|
"""
|
|
185
|
-
Local quadratic
|
|
186
|
+
Local quadratic superposition of wind deficit results
|
|
186
187
|
|
|
187
188
|
Attributes
|
|
188
189
|
----------
|
|
@@ -261,7 +262,7 @@ class WSQuadraticLocal(WakeSuperposition):
|
|
|
261
262
|
The target point data
|
|
262
263
|
downwind_index: int
|
|
263
264
|
The index of the wake causing turbine
|
|
264
|
-
in the
|
|
265
|
+
in the downwind order
|
|
265
266
|
st_sel: numpy.ndarray of bool
|
|
266
267
|
The selection of targets, shape: (n_states, n_targets)
|
|
267
268
|
variable: str
|
foxes/output/farm_layout.py
CHANGED
|
@@ -138,7 +138,7 @@ class FarmLayoutOutput(Output):
|
|
|
138
138
|
----------
|
|
139
139
|
color_by: str, optional
|
|
140
140
|
Set scatter color by variable results.
|
|
141
|
-
Use "mean_REWS" etc for means, also
|
|
141
|
+
Use "mean_REWS", etc, for means, also
|
|
142
142
|
min, max, sum. All wrt states
|
|
143
143
|
fontsize: int, optional
|
|
144
144
|
Size of the turbine numbers
|
|
@@ -325,7 +325,7 @@ class FarmLayoutOutput(Output):
|
|
|
325
325
|
fname = file_path if file_path is not None else self.farm.name + ".xyh"
|
|
326
326
|
np.savetxt(fname, data, header="x y h")
|
|
327
327
|
|
|
328
|
-
def write_csv(self, file_path=None):
|
|
328
|
+
def write_csv(self, file_path=None, type_col=None, algo=None):
|
|
329
329
|
"""
|
|
330
330
|
Writes csv layout file.
|
|
331
331
|
|
|
@@ -334,6 +334,10 @@ class FarmLayoutOutput(Output):
|
|
|
334
334
|
file_path: str
|
|
335
335
|
The file into which to plot, or None
|
|
336
336
|
for default
|
|
337
|
+
type_col: str, optional
|
|
338
|
+
Name of the turbine type column
|
|
339
|
+
algo: foxes.core.Algorithm, optional
|
|
340
|
+
The algorithm, needed for turbine types
|
|
337
341
|
|
|
338
342
|
"""
|
|
339
343
|
|
|
@@ -341,17 +345,17 @@ class FarmLayoutOutput(Output):
|
|
|
341
345
|
|
|
342
346
|
fname = file_path if file_path is not None else self.farm.name + ".csv"
|
|
343
347
|
|
|
344
|
-
lyt = pd.DataFrame(
|
|
345
|
-
index=range(len(data)), columns=["id", "name", "x", "y", "h", "D"]
|
|
346
|
-
)
|
|
348
|
+
lyt = pd.DataFrame(index=range(len(data)), columns=["name", "x", "y", "h", "D"])
|
|
347
349
|
lyt.index.name = "index"
|
|
348
|
-
lyt["
|
|
349
|
-
lyt["
|
|
350
|
-
lyt["
|
|
351
|
-
lyt["
|
|
352
|
-
lyt["h"] = data[:, 2]
|
|
350
|
+
lyt["name"] = [t.name for t in self.farm.turbines]
|
|
351
|
+
lyt["x"] = np.round(data[:, 0], 4)
|
|
352
|
+
lyt["y"] = np.round(data[:, 1], 4)
|
|
353
|
+
lyt["h"] = np.round(data[:, 2], 4)
|
|
353
354
|
lyt["D"] = [t.D for t in self.farm.turbines]
|
|
354
355
|
|
|
356
|
+
if type_col is not None:
|
|
357
|
+
lyt[type_col] = [m.name for m in algo.farm_controller.turbine_types]
|
|
358
|
+
|
|
355
359
|
lyt.to_csv(fname)
|
|
356
360
|
|
|
357
361
|
def write_json(self, file_path=None):
|
|
@@ -381,7 +381,7 @@ class FarmResultsEval(Output):
|
|
|
381
381
|
algo: foxes.core.Algorithm, optional
|
|
382
382
|
The algorithm, for P_nominal lookup
|
|
383
383
|
annual: bool, optional
|
|
384
|
-
Flag for
|
|
384
|
+
Flag for returning annual results, by default False
|
|
385
385
|
ambient: bool, optional
|
|
386
386
|
Flag for ambient power, by default False
|
|
387
387
|
hours: int, optional
|
foxes/output/grids.py
CHANGED
|
@@ -27,7 +27,7 @@ def calc_point_results(
|
|
|
27
27
|
farm_results: xarray.Dataset, optional
|
|
28
28
|
The farm results
|
|
29
29
|
seq_iter: foxes.algorithms.sequential.SequentialIter, optional
|
|
30
|
-
The sequential
|
|
30
|
+
The sequential iterator
|
|
31
31
|
verbosity: int
|
|
32
32
|
The verbosity level, 0 = silent
|
|
33
33
|
kwargs: dict, optional
|
foxes/output/results_writer.py
CHANGED
|
@@ -83,7 +83,7 @@ class ResultsWriter(Output):
|
|
|
83
83
|
Parameters
|
|
84
84
|
----------
|
|
85
85
|
file_path: str
|
|
86
|
-
Path
|
|
86
|
+
Path for the csv file
|
|
87
87
|
variables: dict or list of str, optional
|
|
88
88
|
The variables to be written. If a dict, then
|
|
89
89
|
the keys are the foxes variables and the values
|
|
@@ -150,7 +150,7 @@ class ResultsWriter(Output):
|
|
|
150
150
|
Parameters
|
|
151
151
|
----------
|
|
152
152
|
file_path: str
|
|
153
|
-
Path
|
|
153
|
+
Path for the nc file
|
|
154
154
|
variables: dict or list of str, optional
|
|
155
155
|
The variables to be written. If a dict, then
|
|
156
156
|
the keys are the foxes variables and the values
|
foxes/output/rose_plot.py
CHANGED
|
@@ -118,7 +118,7 @@ class RosePlotOutput(Output):
|
|
|
118
118
|
var: str
|
|
119
119
|
The data variable name
|
|
120
120
|
var_bins: list of float
|
|
121
|
-
The variable bin
|
|
121
|
+
The variable bin separation values
|
|
122
122
|
wd_var: str, optional
|
|
123
123
|
The wind direction variable name
|
|
124
124
|
turbine: int, optional
|
|
@@ -231,7 +231,7 @@ class RosePlotOutput(Output):
|
|
|
231
231
|
var: str
|
|
232
232
|
The data variable name
|
|
233
233
|
var_bins: list of float
|
|
234
|
-
The variable bin
|
|
234
|
+
The variable bin separation values
|
|
235
235
|
wd_var: str, optional
|
|
236
236
|
The wind direction variable name
|
|
237
237
|
turbine: int, optional
|
|
@@ -330,7 +330,7 @@ class RosePlotOutput(Output):
|
|
|
330
330
|
var: str
|
|
331
331
|
The data variable name
|
|
332
332
|
var_bins: list of float
|
|
333
|
-
The variable bin
|
|
333
|
+
The variable bin separation values
|
|
334
334
|
ret_data: bool
|
|
335
335
|
Flag for returning wind rose data
|
|
336
336
|
kwargs: dict, optional
|
|
@@ -49,7 +49,7 @@ class SeqFlowAnimationPlugin(SequentialPlugin):
|
|
|
49
49
|
Parameters
|
|
50
50
|
----------
|
|
51
51
|
algo: foxes.algorithms.sequential.Sequential
|
|
52
|
-
The current
|
|
52
|
+
The current sequential algorithm
|
|
53
53
|
|
|
54
54
|
"""
|
|
55
55
|
super().initialize(algo)
|
|
@@ -62,7 +62,7 @@ class SeqFlowAnimationPlugin(SequentialPlugin):
|
|
|
62
62
|
Parameters
|
|
63
63
|
----------
|
|
64
64
|
algo: foxes.algorithms.sequential.Sequential
|
|
65
|
-
The latest
|
|
65
|
+
The latest sequential algorithm
|
|
66
66
|
fres: xarray.Dataset
|
|
67
67
|
The latest farm results
|
|
68
68
|
pres: xarray.Dataset, optional
|
|
@@ -54,7 +54,7 @@ class SeqWakeDebugPlugin(SequentialPlugin):
|
|
|
54
54
|
Parameters
|
|
55
55
|
----------
|
|
56
56
|
algo: foxes.algorithms.sequential.Sequential
|
|
57
|
-
The current
|
|
57
|
+
The current sequential algorithm
|
|
58
58
|
|
|
59
59
|
"""
|
|
60
60
|
super().initialize(algo)
|
|
@@ -67,7 +67,7 @@ class SeqWakeDebugPlugin(SequentialPlugin):
|
|
|
67
67
|
Parameters
|
|
68
68
|
----------
|
|
69
69
|
algo: foxes.algorithms.sequential.Sequential
|
|
70
|
-
The latest
|
|
70
|
+
The latest sequential algorithm
|
|
71
71
|
fres: xarray.Dataset
|
|
72
72
|
The latest farm results
|
|
73
73
|
pres: xarray.Dataset, optional
|
foxes/utils/abl/neutral.py
CHANGED
|
@@ -39,7 +39,7 @@ def ustar(ws_ref, h_ref, z0, kappa=0.41):
|
|
|
39
39
|
z0: float
|
|
40
40
|
The roughness length
|
|
41
41
|
kappa: float
|
|
42
|
-
The
|
|
42
|
+
The von Karman constant
|
|
43
43
|
|
|
44
44
|
Returns
|
|
45
45
|
-------
|
|
@@ -66,7 +66,7 @@ def calc_ws(height, z0, ustar, kappa=0.41):
|
|
|
66
66
|
ustar: float
|
|
67
67
|
The friction velocity
|
|
68
68
|
kappa: float
|
|
69
|
-
The
|
|
69
|
+
The von Karman constant
|
|
70
70
|
|
|
71
71
|
Returns
|
|
72
72
|
-------
|
foxes/utils/abl/stable.py
CHANGED
|
@@ -64,7 +64,7 @@ def ustar(ws_ref, h_ref, z0, mol, kappa=0.41):
|
|
|
64
64
|
mol: float
|
|
65
65
|
The Monin-Obukhov height
|
|
66
66
|
kappa: float
|
|
67
|
-
The
|
|
67
|
+
The von Karman constant
|
|
68
68
|
|
|
69
69
|
Returns
|
|
70
70
|
-------
|
|
@@ -92,7 +92,7 @@ def calc_ws(height, z0, ustar, psi, kappa=0.41):
|
|
|
92
92
|
psi: float
|
|
93
93
|
The Psi function values
|
|
94
94
|
kappa: float
|
|
95
|
-
The
|
|
95
|
+
The von Karman constant
|
|
96
96
|
|
|
97
97
|
Returns
|
|
98
98
|
-------
|
foxes/utils/abl/unstable.py
CHANGED
|
@@ -47,7 +47,7 @@ def ustar(ws_ref, h_ref, z0, mol, kappa=0.41):
|
|
|
47
47
|
mol: float
|
|
48
48
|
The Monin-Obukhov height
|
|
49
49
|
kappa: float
|
|
50
|
-
The
|
|
50
|
+
The von Karman constant
|
|
51
51
|
|
|
52
52
|
Returns
|
|
53
53
|
-------
|
|
@@ -75,7 +75,7 @@ def calc_ws(height, z0, ustar, psi, kappa=0.41):
|
|
|
75
75
|
psi: float
|
|
76
76
|
The Psi function values
|
|
77
77
|
kappa: float
|
|
78
|
-
The
|
|
78
|
+
The von Karman constant
|
|
79
79
|
|
|
80
80
|
Returns
|
|
81
81
|
-------
|
foxes/utils/data_book.py
CHANGED
foxes/utils/dict.py
CHANGED
|
@@ -28,6 +28,29 @@ class Dict(dict):
|
|
|
28
28
|
super().__init__(*args, **kwargs)
|
|
29
29
|
self.name = name if name is not None else type(self).__name__
|
|
30
30
|
|
|
31
|
+
def get_item(self, key, prnt=True):
|
|
32
|
+
"""
|
|
33
|
+
Gets an item, prints readable error if not found
|
|
34
|
+
|
|
35
|
+
Parameters
|
|
36
|
+
----------
|
|
37
|
+
key: immutable object
|
|
38
|
+
The key
|
|
39
|
+
prnt: bool
|
|
40
|
+
Flag for message printing
|
|
41
|
+
|
|
42
|
+
"""
|
|
43
|
+
try:
|
|
44
|
+
return self[key]
|
|
45
|
+
except KeyError as e:
|
|
46
|
+
if prnt:
|
|
47
|
+
print(f"\n{self.name}: Cannot find key '{key}'.\n")
|
|
48
|
+
print("Known keys:")
|
|
49
|
+
for k in self.keys():
|
|
50
|
+
print(" ", k)
|
|
51
|
+
print()
|
|
52
|
+
raise e
|
|
53
|
+
|
|
31
54
|
def __getitem__(self, key):
|
|
32
55
|
try:
|
|
33
56
|
return super().__getitem__(key)
|
foxes/utils/exec_python.py
CHANGED
|
@@ -17,7 +17,7 @@ def exec_python(s, indicator="%", newline=";", globals=globals(), locals={}):
|
|
|
17
17
|
s: list, dict or object
|
|
18
18
|
The source to by analyzed
|
|
19
19
|
indicator: str
|
|
20
|
-
The indicator that
|
|
20
|
+
The indicator that triggers python evaluation
|
|
21
21
|
newline: str
|
|
22
22
|
The new line indicator
|
|
23
23
|
globals: dict
|
foxes/utils/factory.py
CHANGED
|
@@ -618,6 +618,35 @@ class FDict(Dict):
|
|
|
618
618
|
return True
|
|
619
619
|
return found
|
|
620
620
|
|
|
621
|
+
def get_item(self, key, prnt=True):
|
|
622
|
+
"""
|
|
623
|
+
Gets an item, prints readable error if not found
|
|
624
|
+
|
|
625
|
+
Parameters
|
|
626
|
+
----------
|
|
627
|
+
key: immutable object
|
|
628
|
+
The key
|
|
629
|
+
prnt: bool
|
|
630
|
+
Flag for message printing
|
|
631
|
+
|
|
632
|
+
"""
|
|
633
|
+
try:
|
|
634
|
+
return self[key]
|
|
635
|
+
except KeyError as e:
|
|
636
|
+
if prnt:
|
|
637
|
+
print(
|
|
638
|
+
f"\n{self.name}: Cannot find key '{key}', also no factory matches.\n"
|
|
639
|
+
)
|
|
640
|
+
print("Known keys:")
|
|
641
|
+
for k in self.keys():
|
|
642
|
+
print(" ", k)
|
|
643
|
+
if len(self.factories):
|
|
644
|
+
print("\nKnown factories:")
|
|
645
|
+
for f in self.factories:
|
|
646
|
+
print(" ", f.name_template)
|
|
647
|
+
print()
|
|
648
|
+
raise e
|
|
649
|
+
|
|
621
650
|
def __getitem__(self, key):
|
|
622
651
|
try:
|
|
623
652
|
return super().__getitem__(key)
|
|
@@ -630,7 +659,6 @@ class FDict(Dict):
|
|
|
630
659
|
return obj
|
|
631
660
|
except ValueError:
|
|
632
661
|
pass
|
|
633
|
-
|
|
634
662
|
k = ", ".join(sorted(list(self.keys())))
|
|
635
663
|
e = f"{self.name}: Cannot find key '{key}', also no factory matches. Known keys: {k}. Known factories: {[f.name_template for f in self.factories]}"
|
|
636
664
|
raise KeyError(e)
|
foxes/utils/geom2d/circle.py
CHANGED
foxes/utils/geom2d/polygon.py
CHANGED
foxes/utils/geopandas_utils.py
CHANGED
|
@@ -50,7 +50,7 @@ def check_import_utm():
|
|
|
50
50
|
|
|
51
51
|
def read_shp(fname, **kwargs):
|
|
52
52
|
"""
|
|
53
|
-
Read a
|
|
53
|
+
Read a shapefile file
|
|
54
54
|
|
|
55
55
|
Parameters
|
|
56
56
|
----------
|
|
@@ -74,7 +74,7 @@ def read_shp(fname, **kwargs):
|
|
|
74
74
|
|
|
75
75
|
def shp2csv(ifile, ofile, in_kwargs={}, out_kwargs={}, verbosity=1):
|
|
76
76
|
"""
|
|
77
|
-
Read
|
|
77
|
+
Read shapefile file, write csv file
|
|
78
78
|
|
|
79
79
|
Parameters
|
|
80
80
|
----------
|
foxes/utils/load.py
CHANGED
|
@@ -20,7 +20,7 @@ def import_module(name, package=None, hint=None):
|
|
|
20
20
|
Returns
|
|
21
21
|
-------
|
|
22
22
|
mdl: module
|
|
23
|
-
The
|
|
23
|
+
The imported package
|
|
24
24
|
|
|
25
25
|
:group: utils
|
|
26
26
|
|
|
@@ -35,7 +35,7 @@ def import_module(name, package=None, hint=None):
|
|
|
35
35
|
|
|
36
36
|
def load_module(name, path):
|
|
37
37
|
"""
|
|
38
|
-
Imports a module from file path
|
|
38
|
+
Imports a module from a file path
|
|
39
39
|
|
|
40
40
|
Parameters
|
|
41
41
|
----------
|
foxes/utils/pandas_helpers.py
CHANGED
foxes/utils/xarray_utils.py
CHANGED
foxes/variables.py
CHANGED
|
@@ -4,7 +4,7 @@ X = "X"
|
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
6
|
Y = "Y"
|
|
7
|
-
""" The y coordinate in
|
|
7
|
+
""" The y coordinate in m
|
|
8
8
|
:group: foxes.variables
|
|
9
9
|
"""
|
|
10
10
|
|
|
@@ -257,7 +257,7 @@ Z0 = "z0"
|
|
|
257
257
|
"""
|
|
258
258
|
|
|
259
259
|
MOL = "MOL"
|
|
260
|
-
""" The Monin
|
|
260
|
+
""" The Monin–Obukhov length in m
|
|
261
261
|
:group: foxes.variables
|
|
262
262
|
"""
|
|
263
263
|
|
|
@@ -296,7 +296,7 @@ DEFAULT_DIGITS = {
|
|
|
296
296
|
|
|
297
297
|
def get_default_digits(variable):
|
|
298
298
|
"""
|
|
299
|
-
Gets the default
|
|
299
|
+
Gets the default number of output digits
|
|
300
300
|
|
|
301
301
|
Parameters
|
|
302
302
|
----------
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: foxes
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.1.1
|
|
4
4
|
Summary: Farm Optimization and eXtended yield Evaluation Software
|
|
5
5
|
Author: Jonas Schulte
|
|
6
6
|
Maintainer: Jonas Schulte
|
|
@@ -41,6 +41,7 @@ Classifier: Programming Language :: Python :: 3.9
|
|
|
41
41
|
Classifier: Programming Language :: Python :: 3.10
|
|
42
42
|
Classifier: Programming Language :: Python :: 3.11
|
|
43
43
|
Classifier: Programming Language :: Python :: 3.12
|
|
44
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
44
45
|
Classifier: License :: OSI Approved :: MIT License
|
|
45
46
|
Classifier: Operating System :: OS Independent
|
|
46
47
|
Classifier: Development Status :: 4 - Beta
|
|
@@ -67,7 +68,7 @@ Requires-Dist: flake8; extra == "dev"
|
|
|
67
68
|
Requires-Dist: pytest; extra == "dev"
|
|
68
69
|
Requires-Dist: jupyter; extra == "dev"
|
|
69
70
|
Requires-Dist: objsize; extra == "dev"
|
|
70
|
-
Requires-Dist: black; extra == "dev"
|
|
71
|
+
Requires-Dist: black[jupyter]; extra == "dev"
|
|
71
72
|
Provides-Extra: doc
|
|
72
73
|
Requires-Dist: sphinx; extra == "doc"
|
|
73
74
|
Requires-Dist: sphinx-immaterial; extra == "doc"
|
|
@@ -83,14 +84,14 @@ Requires-Dist: distributed; extra == "eng"
|
|
|
83
84
|
Requires-Dist: dask-jobqueue; extra == "eng"
|
|
84
85
|
Requires-Dist: setuptools; extra == "eng"
|
|
85
86
|
Requires-Dist: mpi4py; extra == "eng"
|
|
87
|
+
Requires-Dist: ray; extra == "eng"
|
|
86
88
|
Provides-Extra: eng0
|
|
87
89
|
Requires-Dist: multiprocess; extra == "eng0"
|
|
88
90
|
Requires-Dist: dask; extra == "eng0"
|
|
89
91
|
Requires-Dist: distributed; extra == "eng0"
|
|
90
92
|
Requires-Dist: dask-jobqueue; extra == "eng0"
|
|
91
93
|
Requires-Dist: setuptools; extra == "eng0"
|
|
92
|
-
|
|
93
|
-
Requires-Dist: windio>=1; extra == "io"
|
|
94
|
+
Requires-Dist: ray; extra == "eng0"
|
|
94
95
|
Provides-Extra: opt
|
|
95
96
|
Requires-Dist: foxes-opt; extra == "opt"
|
|
96
97
|
Provides-Extra: test
|
|
@@ -113,10 +114,11 @@ The software `foxes` is a modular wind farm simulation and wake modelling toolbo
|
|
|
113
114
|
The fast performance of `foxes` is owed to vectorization and parallelization,
|
|
114
115
|
and it is intended to be used for large wind farms and large timeseries inflow data.
|
|
115
116
|
The parallelization on local or remote clusters is supported, based on
|
|
117
|
+
[mpi4py](https://mpi4py.readthedocs.io/en/stable/) or
|
|
116
118
|
[dask.distributed](https://distributed.dask.org/en/stable/).
|
|
117
119
|
The wind farm
|
|
118
|
-
optimization capabilities invoke the [
|
|
119
|
-
as well supports vectorization.
|
|
120
|
+
optimization capabilities invoke the [foxes-opt](https://github.com/FraunhoferIWES/foxes-opt) package which
|
|
121
|
+
as well supports vectorization and parallelization.
|
|
120
122
|
|
|
121
123
|
`foxes` is build upon many years of experience with wake model code development at IWES, starting with the C++ based in-house code _flapFOAM_ (2011-2019) and the Python based direct predecessor _flappy_ (2019-2022).
|
|
122
124
|
|