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.

Files changed (128) hide show
  1. docs/source/conf.py +0 -1
  2. examples/states_lookup_table/run.py +1 -1
  3. examples/timeseries/run.py +11 -4
  4. foxes/algorithms/downwind/downwind.py +18 -13
  5. foxes/algorithms/downwind/models/farm_wakes_calc.py +1 -1
  6. foxes/algorithms/downwind/models/init_farm_data.py +1 -1
  7. foxes/algorithms/downwind/models/point_wakes_calc.py +1 -1
  8. foxes/algorithms/downwind/models/reorder_farm_output.py +1 -1
  9. foxes/algorithms/downwind/models/set_amb_farm_results.py +1 -1
  10. foxes/algorithms/downwind/models/set_amb_point_results.py +1 -1
  11. foxes/algorithms/iterative/iterative.py +1 -1
  12. foxes/algorithms/iterative/models/farm_wakes_calc.py +1 -1
  13. foxes/algorithms/iterative/models/urelax.py +3 -3
  14. foxes/algorithms/sequential/models/plugin.py +4 -4
  15. foxes/algorithms/sequential/models/seq_state.py +1 -1
  16. foxes/constants.py +5 -5
  17. foxes/core/algorithm.py +2 -2
  18. foxes/core/data_calc_model.py +2 -2
  19. foxes/core/engine.py +20 -10
  20. foxes/core/farm_controller.py +3 -3
  21. foxes/core/farm_data_model.py +1 -1
  22. foxes/core/ground_model.py +2 -2
  23. foxes/core/model.py +122 -108
  24. foxes/core/partial_wakes_model.py +1 -1
  25. foxes/core/point_data_model.py +2 -2
  26. foxes/core/states.py +1 -1
  27. foxes/core/turbine_type.py +2 -2
  28. foxes/core/wake_frame.py +8 -30
  29. foxes/core/wake_model.py +3 -2
  30. foxes/core/wake_superposition.py +1 -1
  31. foxes/data/windio/windio_5turbines_timeseries.yaml +9 -15
  32. foxes/engines/__init__.py +1 -0
  33. foxes/engines/dask.py +13 -6
  34. foxes/engines/multiprocess.py +5 -8
  35. foxes/engines/numpy.py +8 -26
  36. foxes/engines/pool.py +10 -24
  37. foxes/engines/ray.py +79 -0
  38. foxes/engines/single.py +3 -1
  39. foxes/input/farm_layout/from_json.py +1 -1
  40. foxes/input/states/__init__.py +1 -0
  41. foxes/input/states/field_data_nc.py +4 -4
  42. foxes/input/states/multi_height.py +4 -4
  43. foxes/input/states/scan_ws.py +1 -1
  44. foxes/input/states/single.py +1 -1
  45. foxes/input/states/slice_data_nc.py +681 -0
  46. foxes/input/states/states_table.py +3 -3
  47. foxes/input/windio/__init__.py +1 -1
  48. foxes/input/windio/read_attributes.py +8 -2
  49. foxes/input/windio/read_fields.py +3 -0
  50. foxes/input/windio/read_outputs.py +8 -2
  51. foxes/input/windio/windio.py +6 -2
  52. foxes/models/farm_models/turbine2farm.py +1 -1
  53. foxes/models/ground_models/wake_mirror.py +2 -2
  54. foxes/models/model_book.py +29 -2
  55. foxes/models/partial_wakes/axiwake.py +3 -3
  56. foxes/models/partial_wakes/top_hat.py +2 -2
  57. foxes/models/point_models/set_uniform_data.py +1 -1
  58. foxes/models/point_models/tke2ti.py +1 -1
  59. foxes/models/point_models/wake_deltas.py +1 -1
  60. foxes/models/rotor_models/grid.py +2 -2
  61. foxes/models/turbine_models/calculator.py +4 -4
  62. foxes/models/turbine_models/kTI_model.py +22 -6
  63. foxes/models/turbine_models/lookup_table.py +3 -2
  64. foxes/models/turbine_types/PCt_file.py +5 -5
  65. foxes/models/turbine_types/PCt_from_two.py +5 -5
  66. foxes/models/turbine_types/TBL_file.py +80 -0
  67. foxes/models/turbine_types/__init__.py +1 -0
  68. foxes/models/turbine_types/lookup.py +5 -5
  69. foxes/models/turbine_types/null_type.py +3 -3
  70. foxes/models/turbine_types/wsrho2PCt_from_two.py +7 -7
  71. foxes/models/turbine_types/wsti2PCt_from_two.py +9 -9
  72. foxes/models/vertical_profiles/__init__.py +1 -1
  73. foxes/models/wake_frames/dynamic_wakes.py +2 -2
  74. foxes/models/wake_frames/farm_order.py +2 -2
  75. foxes/models/wake_frames/rotor_wd.py +2 -2
  76. foxes/models/wake_frames/seq_dynamic_wakes.py +5 -11
  77. foxes/models/wake_frames/streamlines.py +2 -2
  78. foxes/models/wake_frames/timelines.py +2 -2
  79. foxes/models/wake_frames/yawed_wakes.py +3 -3
  80. foxes/models/wake_models/dist_sliced.py +1 -1
  81. foxes/models/wake_models/induction/rankine_half_body.py +1 -1
  82. foxes/models/wake_models/induction/rathmann.py +76 -22
  83. foxes/models/wake_models/induction/self_similar.py +76 -26
  84. foxes/models/wake_models/induction/vortex_sheet.py +84 -46
  85. foxes/models/wake_models/ti/crespo_hernandez.py +6 -4
  86. foxes/models/wake_models/ti/iec_ti.py +7 -5
  87. foxes/models/wake_models/wind/bastankhah14.py +6 -4
  88. foxes/models/wake_models/wind/bastankhah16.py +9 -9
  89. foxes/models/wake_models/wind/jensen.py +3 -2
  90. foxes/models/wake_models/wind/turbopark.py +14 -11
  91. foxes/models/wake_superpositions/ti_linear.py +1 -1
  92. foxes/models/wake_superpositions/ti_max.py +1 -1
  93. foxes/models/wake_superpositions/ti_pow.py +1 -1
  94. foxes/models/wake_superpositions/ti_quadratic.py +1 -1
  95. foxes/models/wake_superpositions/ws_linear.py +8 -7
  96. foxes/models/wake_superpositions/ws_max.py +8 -7
  97. foxes/models/wake_superpositions/ws_pow.py +8 -7
  98. foxes/models/wake_superpositions/ws_product.py +5 -5
  99. foxes/models/wake_superpositions/ws_quadratic.py +8 -7
  100. foxes/output/farm_layout.py +14 -10
  101. foxes/output/farm_results_eval.py +1 -1
  102. foxes/output/grids.py +1 -1
  103. foxes/output/results_writer.py +2 -2
  104. foxes/output/rose_plot.py +3 -3
  105. foxes/output/seq_plugins/seq_flow_ani_plugin.py +2 -2
  106. foxes/output/seq_plugins/seq_wake_debug_plugin.py +2 -2
  107. foxes/output/state_turbine_map.py +1 -1
  108. foxes/utils/abl/neutral.py +2 -2
  109. foxes/utils/abl/stable.py +2 -2
  110. foxes/utils/abl/unstable.py +2 -2
  111. foxes/utils/data_book.py +1 -1
  112. foxes/utils/dict.py +23 -0
  113. foxes/utils/exec_python.py +1 -1
  114. foxes/utils/factory.py +29 -1
  115. foxes/utils/geom2d/circle.py +1 -1
  116. foxes/utils/geom2d/polygon.py +1 -1
  117. foxes/utils/geopandas_utils.py +2 -2
  118. foxes/utils/load.py +2 -2
  119. foxes/utils/pandas_helpers.py +1 -1
  120. foxes/utils/xarray_utils.py +1 -1
  121. foxes/variables.py +3 -3
  122. {foxes-1.0.dist-info → foxes-1.1.1.dist-info}/METADATA +8 -6
  123. {foxes-1.0.dist-info → foxes-1.1.1.dist-info}/RECORD +127 -125
  124. {foxes-1.0.dist-info → foxes-1.1.1.dist-info}/WHEEL +1 -1
  125. foxes/utils/geopandas_helpers.py +0 -294
  126. /examples/{induction_RHB → induction}/run.py +0 -0
  127. {foxes-1.0.dist-info → foxes-1.1.1.dist-info}/LICENSE +0 -0
  128. {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 supersposition of wind deficit results
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 downwnd order
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.STATE_TARGET,
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=True,
131
- )[st_sel, None]
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 supersposition of wind deficit results
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 downwnd order
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
@@ -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["id"] = [t.info["id"] for t in self.farm.turbines]
349
- lyt["name"] = [t.info["name"] for t in self.farm.turbines]
350
- lyt["x"] = data[:, 0]
351
- lyt["y"] = data[:, 1]
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 returing annual results, by default False
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 itarator
30
+ The sequential iterator
31
31
  verbosity: int
32
32
  The verbosity level, 0 = silent
33
33
  kwargs: dict, optional
@@ -83,7 +83,7 @@ class ResultsWriter(Output):
83
83
  Parameters
84
84
  ----------
85
85
  file_path: str
86
- Path the the csv file
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 the the csv file
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 seperation values
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 seperation values
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 seperation values
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 sequetial algorithm
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 sequetial algorithm
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 sequetial algorithm
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 sequetial algorithm
70
+ The latest sequential algorithm
71
71
  fres: xarray.Dataset
72
72
  The latest farm results
73
73
  pres: xarray.Dataset, optional
@@ -7,7 +7,7 @@ from .output import Output
7
7
 
8
8
  class StateTurbineMap(Output):
9
9
  """
10
- Creates heat maps with turbines on the one
10
+ Creates heat maps with turbines on one axis
11
11
  and states on the other axis.
12
12
 
13
13
  Attributes
@@ -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 van-Karman constant
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 van-Karman constant
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 van-Karman constant
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 van-Karman constant
95
+ The von Karman constant
96
96
 
97
97
  Returns
98
98
  -------
@@ -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 van-Karman constant
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 van-Karman constant
78
+ The von Karman constant
79
79
 
80
80
  Returns
81
81
  -------
foxes/utils/data_book.py CHANGED
@@ -89,7 +89,7 @@ class DataBook:
89
89
  context: str
90
90
  The context
91
91
  package: str or package
92
- The package, must contain init.py` file
92
+ The package, must contain init.py file
93
93
  file_mane: str
94
94
  The file name
95
95
 
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)
@@ -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 trigger python evaluation
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)
@@ -21,7 +21,7 @@ class Circle(AreaGeometry):
21
21
 
22
22
  def __init__(self, centre, radius):
23
23
  """
24
- Cobnstructor.
24
+ Constructor.
25
25
 
26
26
  Parameters
27
27
  ----------
@@ -74,7 +74,7 @@ class ClosedPolygon(AreaGeometry):
74
74
  points: numpy.ndarray
75
75
  The probe points, shape (n_points, 2)
76
76
  return_nearest: bool
77
- Flag for return of the nearest point on bundary
77
+ Flag for return of the nearest point on boundary
78
78
 
79
79
  Returns
80
80
  -------
@@ -50,7 +50,7 @@ def check_import_utm():
50
50
 
51
51
  def read_shp(fname, **kwargs):
52
52
  """
53
- Read a shape file
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 shape file, write csv file
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 imnported package
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
  ----------
@@ -133,7 +133,7 @@ class PandasFileHelper:
133
133
  format_dict: dict
134
134
  Dictionary with format entries for
135
135
  columns, e.g. '{:.4f}'
136
- kwargs: dict, optional
136
+ **kwargs: dict, optional
137
137
  Parameters forwarded to the pandas writing method.
138
138
 
139
139
  """
@@ -6,7 +6,7 @@ from foxes.variables import get_default_digits
6
6
 
7
7
  def write_nc(ds, fpath, round={}, complevel=9, verbosity=1, **kwargs):
8
8
  """
9
- Writes a dataset to netCFD file
9
+ Writes a dataset to netCDF file
10
10
 
11
11
  Parameters
12
12
  ----------
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-Ubukhof length in m
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 numbber of output digits
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.0
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
- Provides-Extra: io
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 [iwopy](https://github.com/FraunhoferIWES/iwopy) package which
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