foxes 1.5__py3-none-any.whl → 1.5.2__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 (38) hide show
  1. examples/abl_states/run.py +58 -56
  2. examples/dyn_wakes/run.py +110 -118
  3. examples/field_data_nc/run.py +22 -20
  4. examples/multi_height/run.py +8 -6
  5. examples/scan_row/run.py +89 -87
  6. examples/sector_management/run.py +40 -38
  7. examples/states_lookup_table/run.py +6 -4
  8. examples/streamline_wakes/run.py +8 -6
  9. examples/timelines/run.py +100 -98
  10. examples/timeseries/run.py +71 -76
  11. examples/wind_rose/run.py +27 -25
  12. examples/yawed_wake/run.py +82 -80
  13. foxes/core/algorithm.py +1 -0
  14. foxes/engines/pool.py +1 -0
  15. foxes/input/yaml/windio/read_attributes.py +8 -2
  16. foxes/input/yaml/windio/read_farm.py +20 -0
  17. foxes/input/yaml/windio/read_fields.py +3 -0
  18. foxes/input/yaml/windio/read_outputs.py +24 -12
  19. foxes/input/yaml/windio/read_site.py +33 -12
  20. foxes/input/yaml/windio/windio.py +1 -0
  21. foxes/models/farm_controllers/__init__.py +1 -0
  22. foxes/models/farm_controllers/op_flag.py +196 -0
  23. foxes/models/wake_models/induction/self_similar.py +22 -4
  24. foxes/models/wake_models/induction/self_similar2020.py +1 -1
  25. foxes/models/wake_models/ti/crespo_hernandez.py +1 -1
  26. foxes/models/wake_models/wind/bastankhah14.py +1 -1
  27. foxes/models/wake_models/wind/bastankhah16.py +1 -1
  28. foxes/models/wake_models/wind/turbopark.py +1 -1
  29. foxes/output/state_turbine_map.py +7 -4
  30. foxes/utils/xarray_utils.py +20 -12
  31. foxes/variables.py +8 -3
  32. {foxes-1.5.dist-info → foxes-1.5.2.dist-info}/METADATA +5 -6
  33. {foxes-1.5.dist-info → foxes-1.5.2.dist-info}/RECORD +38 -36
  34. tests/2_models/turbine_models/test_set_farm_vars.py +64 -0
  35. {foxes-1.5.dist-info → foxes-1.5.2.dist-info}/WHEEL +0 -0
  36. {foxes-1.5.dist-info → foxes-1.5.2.dist-info}/entry_points.txt +0 -0
  37. {foxes-1.5.dist-info → foxes-1.5.2.dist-info}/licenses/LICENSE +0 -0
  38. {foxes-1.5.dist-info → foxes-1.5.2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,196 @@
1
+ import numpy as np
2
+ from xarray import open_dataset, Dataset
3
+
4
+ from foxes.core import FarmController
5
+ import foxes.constants as FC
6
+ import foxes.variables as FV
7
+
8
+
9
+ class OpFlagController(FarmController):
10
+ """
11
+ A basic controller with a flag for
12
+ turbine operation at each state.
13
+
14
+ Parameters
15
+ ----------
16
+ non_op_values: dict
17
+ The non-operational values for variables,
18
+ keys: variable str, values: float
19
+ var2ncvar: dict
20
+ The mapping of variable names to NetCDF variable names,
21
+ only needed if data_source is a path to a NetCDF file
22
+
23
+ :group: models.farm_controllers
24
+
25
+ """
26
+
27
+ def __init__(
28
+ self,
29
+ data_source,
30
+ non_op_values=None,
31
+ var2ncvar={},
32
+ **kwargs,
33
+ ):
34
+ """
35
+ Constructor.
36
+
37
+ Parameters
38
+ ----------
39
+ data_source: numpy.ndarray or str
40
+ The operating flag data, shape: (n_states, n_turbines),
41
+ or path to a NetCDF file
42
+ non_op_values: dict, optional
43
+ The non-operational values for variables,
44
+ keys: variable str, values: float
45
+ var2ncvar: dict
46
+ The mapping of variable names to NetCDF variable names,
47
+ only needed if data_source is a path to a NetCDF file
48
+ kwargs: dict, optional
49
+ Additional keyword arguments for the
50
+ base class constructor
51
+
52
+ """
53
+ super().__init__(**kwargs)
54
+ self.data_source = data_source
55
+ self.var2ncvar = var2ncvar
56
+
57
+ self.non_op_values = {
58
+ FV.P: 0.0,
59
+ FV.CT: 0.0,
60
+ }
61
+ if non_op_values is not None:
62
+ self.non_op_values.update(non_op_values)
63
+
64
+ self._op_flags = None
65
+
66
+ def output_farm_vars(self, algo):
67
+ """
68
+ The variables which are being modified by the model.
69
+
70
+ Parameters
71
+ ----------
72
+ algo: foxes.core.Algorithm
73
+ The calculation algorithm
74
+
75
+ Returns
76
+ -------
77
+ output_vars: list of str
78
+ The output variable names
79
+
80
+ """
81
+ vrs = set(super().output_farm_vars(algo))
82
+ vrs.update([FV.OPERATING])
83
+ return list(vrs)
84
+
85
+ def load_data(self, algo, verbosity=0):
86
+ """
87
+ Load and/or create all model data that is subject to chunking.
88
+
89
+ Such data should not be stored under self, for memory reasons. The
90
+ data returned here will automatically be chunked and then provided
91
+ as part of the mdata object during calculations.
92
+
93
+ Parameters
94
+ ----------
95
+ algo: foxes.core.Algorithm
96
+ The calculation algorithm
97
+ verbosity: int
98
+ The verbosity level, 0 = silent
99
+
100
+ Returns
101
+ -------
102
+ idata: dict
103
+ The dict has exactly two entries: `data_vars`,
104
+ a dict with entries `name_str -> (dim_tuple, data_ndarray)`;
105
+ and `coords`, a dict with entries `dim_name_str -> dim_array`
106
+
107
+ """
108
+
109
+ idata = super().load_data(algo, verbosity)
110
+
111
+ if isinstance(self.data_source, np.ndarray):
112
+ self._op_flags = self.data_source
113
+
114
+ elif isinstance(self.data_source, Dataset):
115
+ cop = self.var2ncvar.get(FV.OPERATING, FV.OPERATING)
116
+ self._op_flags = self.data_source[cop].to_numpy()
117
+
118
+ else:
119
+ if verbosity > 0:
120
+ print(f"OpFlagController: Reading data from {self.data_source}")
121
+ ds = open_dataset(self.data_source)
122
+ cop = self.var2ncvar.get(FV.OPERATING, FV.OPERATING)
123
+ self._op_flags = ds[cop].to_numpy()
124
+ del ds
125
+
126
+ assert self._op_flags.shape == (algo.n_states, algo.n_turbines), (
127
+ f"OpFlagController data shape {self._op_flags.shape} does not match "
128
+ f"(n_states, n_turbines)=({algo.n_states}, {algo.n_turbines})"
129
+ )
130
+ op_flags = self._op_flags.astype(bool)
131
+
132
+ off = np.where(~op_flags)
133
+ tmsels = idata["data_vars"][FC.TMODEL_SELS][1]
134
+ tmsels[off[0], off[1], :] = False
135
+ self._tmall = [np.all(t) for t in tmsels]
136
+
137
+ idata["data_vars"][FC.TMODEL_SELS] = (
138
+ (FC.STATE, FC.TURBINE, FC.TMODELS),
139
+ tmsels,
140
+ )
141
+ idata["data_vars"][FV.OPERATING] = (
142
+ (FC.STATE, FC.TURBINE),
143
+ op_flags,
144
+ )
145
+
146
+ return idata
147
+
148
+ def calculate(self, algo, mdata, fdata, pre_rotor, downwind_index=None):
149
+ """
150
+ The main model calculation.
151
+
152
+ This function is executed on a single chunk of data,
153
+ all computations should be based on numpy arrays.
154
+
155
+ Parameters
156
+ ----------
157
+ algo: foxes.core.Algorithm
158
+ The calculation algorithm
159
+ mdata: foxes.core.MData
160
+ The model data
161
+ fdata: foxes.core.FData
162
+ The farm data
163
+ pre_rotor: bool
164
+ Flag for running pre-rotor or post-rotor
165
+ models
166
+ downwind_index: int, optional
167
+ The index in the downwind order
168
+
169
+ Returns
170
+ -------
171
+ results: dict
172
+ The resulting data, keys: output variable str.
173
+ Values: numpy.ndarray with shape (n_states, n_turbines)
174
+
175
+ """
176
+ self.ensure_output_vars(algo, fdata)
177
+
178
+ # compute data for all operating turbines:
179
+ op = mdata[FV.OPERATING].astype(bool)
180
+ fdata[FV.OPERATING] = op
181
+ results = super().calculate(algo, mdata, fdata, pre_rotor, downwind_index)
182
+ results[FV.OPERATING] = fdata[FV.OPERATING]
183
+
184
+ # set non-operating values:
185
+ if downwind_index is None:
186
+ off = np.where(~op)
187
+ for v in self.output_farm_vars(algo):
188
+ if v != FV.OPERATING:
189
+ fdata[v][off[0], off[1]] = self.non_op_values.get(v, np.nan)
190
+ else:
191
+ off = np.where(~op[:, downwind_index])
192
+ for v in self.output_farm_vars(algo):
193
+ if v != FV.OPERATING:
194
+ fdata[v][off[0], downwind_index] = self.non_op_values.get(v, np.nan)
195
+
196
+ return results
@@ -27,6 +27,12 @@ class SelfSimilar(TurbineInductionModel):
27
27
 
28
28
  Attributes
29
29
  ----------
30
+ alpha: float
31
+ The alpha parameter
32
+ beta: float
33
+ The beta parameter
34
+ gamma: float
35
+ The gamma parameter
30
36
  pre_rotor_only: bool
31
37
  Calculate only the pre-rotor region
32
38
  induction: foxes.core.AxialInductionModel or str
@@ -40,6 +46,8 @@ class SelfSimilar(TurbineInductionModel):
40
46
  self,
41
47
  superposition="ws_linear",
42
48
  induction="Madsen",
49
+ alpha=8 / 9,
50
+ beta=np.sqrt(2),
43
51
  gamma=1.1,
44
52
  pre_rotor_only=False,
45
53
  ):
@@ -52,8 +60,12 @@ class SelfSimilar(TurbineInductionModel):
52
60
  The wind speed superposition.
53
61
  induction: foxes.core.AxialInductionModel or str
54
62
  The induction model
55
- gamma: float, default=1.1
56
- The parameter that multiplies Ct in the ct2a calculation
63
+ alpha: float
64
+ The alpha parameter
65
+ beta: float
66
+ The beta parameter
67
+ gamma: float
68
+ The gamma parameter
57
69
  pre_rotor_only: bool
58
70
  Calculate only the pre-rotor region
59
71
 
@@ -61,6 +73,8 @@ class SelfSimilar(TurbineInductionModel):
61
73
  super().__init__(wind_superposition=superposition)
62
74
  self.induction = induction
63
75
  self.pre_rotor_only = pre_rotor_only
76
+ self.alpha = alpha
77
+ self.beta = beta
64
78
  self.gamma = gamma
65
79
 
66
80
  def __repr__(self):
@@ -163,9 +177,13 @@ class SelfSimilar(TurbineInductionModel):
163
177
  """Helper function: using eqn 13 from [2]"""
164
178
  return np.sqrt(0.587 * (1.32 + x_R**2))
165
179
 
166
- def _rad_fn(self, x_R, r_R, beta=np.sqrt(2), alpha=8 / 9):
180
+ def _rad_fn(self, x_R, r_R):
167
181
  """Helper function: define radial shape function (eqn 12 from [1])"""
168
- return (1 / np.cosh(beta * (r_R) / self._r_half(x_R))) ** alpha # * (x_R < 0)
182
+ with np.errstate(over="ignore"):
183
+ result = (
184
+ 1 / np.cosh(self.beta * (r_R) / self._r_half(x_R))
185
+ ) ** self.alpha # * (x_R < 0)
186
+ return result
169
187
 
170
188
  def contribute(
171
189
  self,
@@ -25,7 +25,7 @@ class SelfSimilar2020(SelfSimilar):
25
25
 
26
26
  """
27
27
 
28
- def _a0(self, ct, x_R, gamma=1.1):
28
+ def _a0(self, ct, x_R):
29
29
  """Helper function: define a0 with gamma factor, eqn 8 from [2]"""
30
30
 
31
31
  x_new = np.minimum(np.maximum(-1 * np.abs(x_R), -6), -1)
@@ -218,7 +218,7 @@ class CrespoHernandezTIWake(TopHatWakeModel):
218
218
 
219
219
  # calculate:
220
220
  a = self.induction.ct2a(ct)
221
- beta = (1 - a) / (1 - 2 * a)
221
+ beta = np.maximum((1 - a) / (1 - 2 * a), 0)
222
222
  radius = 2 * (k * x + self.sbeta_factor * np.sqrt(beta) * D)
223
223
 
224
224
  return radius
@@ -194,7 +194,7 @@ class Bastankhah2014(GaussianWakeModel):
194
194
  # calculate sigma:
195
195
  # beta = 0.5 * (1 + np.sqrt(1.0 - ct)) / np.sqrt(1.0 - ct)
196
196
  a = self.induction.ct2a(ct)
197
- beta = (1 - a) / (1 - 2 * a)
197
+ beta = np.maximum((1 - a) / (1 - 2 * a), 0)
198
198
  sigma = k * x + self.sbeta_factor * np.sqrt(beta) * D
199
199
  del beta, a
200
200
 
@@ -423,7 +423,7 @@ class Bastankhah2016(DistSlicedWakeModel):
423
423
  self,
424
424
  superposition,
425
425
  alpha=0.58,
426
- beta=0.07,
426
+ beta=0.077,
427
427
  induction="Madsen",
428
428
  **wake_k,
429
429
  ):
@@ -220,7 +220,7 @@ class TurbOParkWake(GaussianWakeModel):
220
220
  # calculate sigma:
221
221
  # beta = np.sqrt(0.5 * (1 + np.sqrt(1.0 - ct)) / np.sqrt(1.0 - ct))
222
222
  a = self.induction.ct2a(ct)
223
- beta = (1 - a) / (1 - 2 * a)
223
+ beta = np.maximum((1 - a) / (1 - 2 * a), 0)
224
224
  epsilon = self.sbeta_factor * np.sqrt(beta)
225
225
  del a, beta
226
226
 
@@ -39,6 +39,7 @@ class StateTurbineMap(Output):
39
39
  self,
40
40
  variable,
41
41
  title=None,
42
+ cbar_label=None,
42
43
  ax=None,
43
44
  figsize=None,
44
45
  rotate_xlabels=None,
@@ -93,8 +94,11 @@ class StateTurbineMap(Output):
93
94
 
94
95
  ax.set_yticks(turbines[:-1] + 0.5)
95
96
  ax.set_yticklabels(turbines[:-1])
96
- xt = ax.get_xticks()
97
+ xt = np.asarray(ax.get_xticks())
97
98
  xtl = ax.get_xticklabels()
99
+ if xt.dtype != np.datetime64:
100
+ xt, ar = np.unique(xt.astype(int), return_index=True)
101
+ xtl = [int(float(xtl[i].get_text())) for i in ar]
98
102
  ax.set_xticks(
99
103
  xt[:-1] + 0.5 * (xt[-1] - xt[-2]), xtl[:-1], rotation=rotate_xlabels
100
104
  )
@@ -103,10 +107,9 @@ class StateTurbineMap(Output):
103
107
  ytl = [None for t in yt]
104
108
  ytl[::5] = ax.get_yticklabels()[::5]
105
109
  ax.set_yticks(yt, ytl)
106
- fig.colorbar(c, ax=ax)
110
+ fig.colorbar(c, ax=ax, label=cbar_label)
107
111
 
108
- t = title if title is not None else variable
109
- ax.set_title(t)
112
+ ax.set_title(title)
110
113
  ax.set_ylabel("Turbine index")
111
114
  ax.set_xlabel("State")
112
115
 
@@ -31,24 +31,32 @@ def write_nc(
31
31
  Additional parameters for xarray.to_netcdf
32
32
 
33
33
  """
34
+
35
+ def _round(x, v, d):
36
+ """Helper function to round values"""
37
+ if d is not None:
38
+ if verbosity > 1:
39
+ print(f"File {fpath.name}: Rounding {v} to {d} decimals")
40
+ try:
41
+ x = x.astype(np.float32)
42
+ except ValueError:
43
+ pass
44
+ try:
45
+ return np.round(x, d)
46
+ except Exception:
47
+ pass
48
+ return x
49
+
34
50
  fpath = Path(fpath)
35
51
  if round is not None:
36
52
  crds = {}
37
- for v in ds.coords.keys():
53
+ for v, x in ds.coords.items():
38
54
  d = round.get(v, get_default_digits(v))
39
- if d is not None:
40
- if verbosity > 1:
41
- print(f"File {fpath.name}: Rounding {v} to {d} decimals")
42
- crds[v] = np.round(ds[v].to_numpy(), d)
43
- else:
44
- crds[v] = ds[v].to_numpy()
55
+ crds[v] = _round(x.to_numpy(), v, d)
45
56
  dvrs = {}
46
- for v in ds.data_vars.keys():
57
+ for v, x in ds.data_vars.items():
47
58
  d = round.get(v, get_default_digits(v))
48
- if d is not None:
49
- if verbosity > 1:
50
- print(f"File {fpath.name}: Rounding {v} to {d} decimals")
51
- dvrs[v] = (ds[v].dims, np.round(ds[v].to_numpy(), d))
59
+ dvrs[v] = (x.dims, _round(x.to_numpy(), v, d))
52
60
  ds = Dataset(coords=crds, data_vars=dvrs)
53
61
 
54
62
  enc = None
foxes/variables.py CHANGED
@@ -1,3 +1,8 @@
1
+ OPERATING = "operating"
2
+ """ Flag for turbine operation
3
+ :group: foxes.variables
4
+ """
5
+
1
6
  X = "X"
2
7
  """ The x coordinate in m
3
8
  :group: foxes.variables
@@ -19,7 +24,7 @@ D = "D"
19
24
  """
20
25
 
21
26
  TXYH = "txyh"
22
- """ The turbine rotor centre coordinate
27
+ """ The turbine rotor centre coordinate
23
28
  vector (x, y, height)
24
29
  :group: foxes.variables
25
30
  """
@@ -190,13 +195,13 @@ AMB_RHO = "AMB_RHO"
190
195
  """
191
196
 
192
197
  AMB_YAW = "AMB_YAW"
193
- """ The ambient absolute yaw angle of
198
+ """ The ambient absolute yaw angle of
194
199
  a turbine in degrees
195
200
  :group: foxes.variables
196
201
  """
197
202
 
198
203
  AMB_YAWM = "AMB_YAWM"
199
- """ The ambient relative yaw angle of
204
+ """ The ambient relative yaw angle of
200
205
  a turbine in degrees
201
206
  :group: foxes.variables
202
207
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: foxes
3
- Version: 1.5
3
+ Version: 1.5.2
4
4
  Summary: Farm Optimization and eXtended yield Evaluation Software
5
5
  Author: Jonas Schulte
6
6
  Maintainer: Jonas Schulte
@@ -47,17 +47,16 @@ Classifier: Development Status :: 4 - Beta
47
47
  Requires-Python: >=3.9
48
48
  Description-Content-Type: text/markdown
49
49
  License-File: LICENSE
50
- Requires-Dist: cycler>=0.10
51
- Requires-Dist: h5netcdf>=1.0
52
50
  Requires-Dist: matplotlib>=3.8
53
51
  Requires-Dist: numpy>=1.26
54
52
  Requires-Dist: pandas>=2.0
55
- Requires-Dist: pyyaml>=4.0
56
53
  Requires-Dist: scipy>=1.12
57
- Requires-Dist: tqdm>=2.0
58
54
  Requires-Dist: xarray>=2023
55
+ Requires-Dist: h5netcdf>=1.0
56
+ Requires-Dist: pyyaml>=4.0
57
+ Requires-Dist: tqdm>=2.0
59
58
  Provides-Extra: opt
60
- Requires-Dist: foxes-opt>=0.5; extra == "opt"
59
+ Requires-Dist: foxes-opt>=0.6; extra == "opt"
61
60
  Provides-Extra: dask
62
61
  Requires-Dist: dask>=2022.0; extra == "dask"
63
62
  Requires-Dist: distributed>=2022.0; extra == "dask"
@@ -1,29 +1,29 @@
1
1
  docs/source/conf.py,sha256=vJI7sGh52LTnDRfKhQFWOMxheU4Vnq7_lWqL7G4OQAM,12351
2
- examples/abl_states/run.py,sha256=NUyNTRzPb2mW_oiWj3NWgHb2lx-6F_CZ27g9Y9_a_to,4598
2
+ examples/abl_states/run.py,sha256=DhFge87Sx6PK0n9BRU7vsGN-0F5V0I8ZqVTOWxwHyrM,4853
3
3
  examples/compare_rotors_pwakes/run.py,sha256=yGvSGguLcgJmYNwTUGKJDRBxRRFFRYKF4v4VLUo9Wfw,6642
4
4
  examples/compare_wakes/run.py,sha256=uS3svL5UYcttvtSW6jCUyS0_qW0-ArBkY-msYfvJSkE,7353
5
- examples/dyn_wakes/run.py,sha256=7L9Ao-U2TIxE8VT1ZT1rFCHrOBlsBeV1Vck0QDzH9Ak,9364
6
- examples/field_data_nc/run.py,sha256=fWD8h905psa1ijSuNdVk9N_oJxBDtPKtiVPCvW9BlSM,3568
5
+ examples/dyn_wakes/run.py,sha256=OdrRgR1MXeAfwKErhGLN7bCAtd6aCAVeSSQWltQYSJ0,9689
6
+ examples/field_data_nc/run.py,sha256=RIVoNtPM3ewhfCJLBFZ1m8F9sKbFAwS7m2JUf4sBQ1s,3671
7
7
  examples/induction/run.py,sha256=Vqrjuw1_inqseihl-8_qgp4rq-7kc2NawsKa39Ux7V4,6340
8
- examples/multi_height/run.py,sha256=9Gbx-FiMro1pxiMHMO8pomP8tgBbuW6w-jaJW_S5zMA,3294
8
+ examples/multi_height/run.py,sha256=qnx2mAJZ1aY7N6wSmczjkSNcAsvQibzHh4e0Bf_mQ3o,3345
9
9
  examples/power_mask/run.py,sha256=BXR0V_9y1aebzLnj2bXIFXMHQ1veaCMAPLRAH8EMOhY,7596
10
10
  examples/quickstart/run.py,sha256=fo8A_oioPyUtNs4EiHZE1fCHH6DRuXFQzWJyHHd_oiI,427
11
11
  examples/random_timeseries/run.py,sha256=ASpLTZkG9tLVbG34vyiBK1zJgvvAfl45EhA6r6jHDxM,6111
12
- examples/scan_row/run.py,sha256=ti3XCL4MSyL5b0qMsbJOZfpLNOm6OiMwHd_sN5939tg,5850
13
- examples/sector_management/run.py,sha256=WQvrHqtC7_u6JvZfbRsVSb3SPYDjCp-ZJpC-nZsQf5M,4451
12
+ examples/scan_row/run.py,sha256=N9UX_Fb5ZGTLEzKZsv_paHt2Wk6RAanHKfEL6liuMj8,6197
13
+ examples/sector_management/run.py,sha256=aNT22eIsRlgOy0aN3TVWsVNc3wCfNa6keg7gfwD6hl8,4626
14
14
  examples/sequential/run.py,sha256=pd7L3obYyqNZXzDxntRKsfhqunG0SIjZslbD42WcveI,6758
15
15
  examples/single_state/run.py,sha256=VfZD5Ev4jLo6LQ7antKmZFU8SDfezeI9ERSf4ASvKsU,6162
16
- examples/states_lookup_table/run.py,sha256=XZkntAbHfZwozQ0GFOQiKl4yjm7v4TjC4lwSsF1Ixgs,3922
17
- examples/streamline_wakes/run.py,sha256=weBGjuHxZJQFOFK9Anct0UK0gwd-4dnrZIHYjiVNlqU,4698
16
+ examples/states_lookup_table/run.py,sha256=IJu6SJOq1S9VvJIv785hJVXn7zpjDRp41Cj-mN7ZQZ4,3965
17
+ examples/streamline_wakes/run.py,sha256=mzuxLGzajazIGfzWDCzDU2zRUODQmstYUlqzK46aA-U,4749
18
18
  examples/tab_file/run.py,sha256=xe4VUwyl3eYMUGtyS7kuieGeoYo9mEq_ZvQ6E1rZ1uE,4370
19
- examples/timelines/run.py,sha256=ca1koiA6qX8LVrAGrYMJRJY7xChwwjHndP6AB5LNlqA,8261
20
- examples/timeseries/run.py,sha256=QN6xXXUOZFh12FBZ6to_WC1rnLkCzebay2ORiLp1X10,5399
19
+ examples/timelines/run.py,sha256=Tc37gtvV9q5ALoCuT5p1N8m2X7J8UK0E7qXn0YZunpA,8688
20
+ examples/timeseries/run.py,sha256=3aAf_qC4IlEr_QhMUoZIV5A4K_jnnizy5H9-HBFTdjE,5571
21
21
  examples/timeseries_slurm/run.py,sha256=4yHi4SXr7rff4tbJNQEUa9Dd7Dvli2XrJExu-xdE2Us,5587
22
- examples/wind_rose/run.py,sha256=QeV6tbJcJcDD8vC1kQqRgyyeRjACzTmYkedLQ9eqYe0,4253
23
- examples/yawed_wake/run.py,sha256=msw7_xkxH45gegvUn9_0-lAB7D1gpmzvtMDd6kGKfVo,6531
22
+ examples/wind_rose/run.py,sha256=CU7pzOSlWHifFvdtKl_t9gufaAKw2TkjwvklDZRaawM,4380
23
+ examples/yawed_wake/run.py,sha256=X-cxmhC0rCRHyB00kXrsnqQ9fufSY7L35lozls7Nxuw,6882
24
24
  foxes/__init__.py,sha256=1RPU7w3WJ3jFb2aJdZKRy-6Fje9qAaH85WYcOCiDvwk,1375
25
25
  foxes/constants.py,sha256=jQcyeU53V629Tf8qQWc2F4Xw1rV3ywtJiT-g1JWenNg,3842
26
- foxes/variables.py,sha256=sK58u3HJRsWo-fbE7GPlQUhF0YUhY-qSg6Vl8Pv1Eo8,6144
26
+ foxes/variables.py,sha256=7B5wFWUunrFZLjU2l2cgYZ5nyZmakOLR1gqh-G3BTuI,6225
27
27
  foxes/algorithms/__init__.py,sha256=L0VyK-B81zXr-IFI6NMhJ7Px9XVhlkmX0M0IrKhcf0o,327
28
28
  foxes/algorithms/downwind/__init__.py,sha256=tdTnMEVLi58EMkqStollQb4gPug4x8Te2K8ddAxkas8,75
29
29
  foxes/algorithms/downwind/downwind.py,sha256=Rqpe-BYWVt8eS1HxsRYFO93SgblVxmuTKFI1sSFzhXQ,26215
@@ -48,7 +48,7 @@ foxes/algorithms/sequential/models/seq_state.py,sha256=al7XhLKLQSGhfUZw--Bz4RNNb
48
48
  foxes/config/__init__.py,sha256=M2FrI1gO6SZUUPsQe1KL_-JNyUUt_Lk4nOw7cyNpHew,223
49
49
  foxes/config/config.py,sha256=e3HhitD2Xleqm3utoXLGAu8Vg16app35Cpx4nBhnZm8,4318
50
50
  foxes/core/__init__.py,sha256=iMuUuPsFERvjY2PQa7PCEsxrZYRJ8IORJs3k3OoerFw,1985
51
- foxes/core/algorithm.py,sha256=xRED8Y7c3xqr3Biurf5jJrZpbpcF-Xq0sEBPikSOFZs,27450
51
+ foxes/core/algorithm.py,sha256=EZPXOXAS-IjhWHatxZO-tvQch4yPMIPkdDHWtpATEmQ,27494
52
52
  foxes/core/axial_induction_model.py,sha256=sGbTHFMjEYKiVjElLP_SCRulKatcK0wsEXf30zty2Vc,1023
53
53
  foxes/core/data.py,sha256=sYkL-kZnWU9wdKkbSS85KS66BMUXToloCNkWGPE7C3s,25280
54
54
  foxes/core/data_calc_model.py,sha256=c96fv7HrLK29WD5SRc4WFXjT24lNImnLflQJvIMACn8,1488
@@ -103,7 +103,7 @@ foxes/engines/futures.py,sha256=_VQXNLb0AxTtTouy96LhBnwPldHiG0xldHjpChKyNxs,1503
103
103
  foxes/engines/mpi.py,sha256=XR9xFX6Spw8OKQ7x4qYOSeUlxcFWkwndNRiQ3IomkdM,650
104
104
  foxes/engines/multiprocess.py,sha256=X4S-AnhnYuONpfZ3pKWi4VH9mm68ZMNm43ELPoeb-Ek,1328
105
105
  foxes/engines/numpy.py,sha256=yljXIiVZgQjw97jmhpz_vKOh1TW3RxSI4SxN7rQnC4M,5806
106
- foxes/engines/pool.py,sha256=CFKwrmwWXNqKzwRXNYsvChSiKwiIi0pzQvwwGT8ysSY,8708
106
+ foxes/engines/pool.py,sha256=SxJCH45mqFSwvq9YtLDoamu_5AWnVPH-VDZkDI5Tfiw,8709
107
107
  foxes/engines/ray.py,sha256=Otlc1ZfoTiNE6sq9rq1y212tVbaVDfxryqAl4T0AM_A,1622
108
108
  foxes/engines/single.py,sha256=Z0tun1ZKQD-LMdSK291AUagBDJiHnexJL5ysrkP04tY,4725
109
109
  foxes/input/__init__.py,sha256=JodEdc77y5I-CsgfT5HadMK7DH5EKcr9uGLEVcgM-wY,157
@@ -135,19 +135,20 @@ foxes/input/yaml/__init__.py,sha256=XGCJlbE1SwavEWEKDRAuJwqAi9Afm_qwPnQLxPKjzP4,
135
135
  foxes/input/yaml/dict.py,sha256=0hRqpF0Gn3FknS-xldyzzhKTTpYlv8GTqUBsLIFjolU,14921
136
136
  foxes/input/yaml/yaml.py,sha256=0hikKGhkjipYANJNeXgNZ8xzVj-mMscmsA26w_6HdgE,2741
137
137
  foxes/input/yaml/windio/__init__.py,sha256=HXJEBEDd1FbATkDfjXzA3sgo9detUxgvekmC32QOc5E,446
138
- foxes/input/yaml/windio/read_attributes.py,sha256=wibXcIGSY6iTMIyMQ9w6_RNaj3dDH7khd3LI-jsGW40,13017
139
- foxes/input/yaml/windio/read_farm.py,sha256=F2s27Z4yCvPaQsTlNbOtZiDzSwRmOBnMnhfNj4tW4nk,7428
140
- foxes/input/yaml/windio/read_fields.py,sha256=lWMm5GQ6AcnQ_bQPHpIDpClya6yQd9GdpR0qrImGyIs,4738
141
- foxes/input/yaml/windio/read_outputs.py,sha256=iwxZ-9VKlo2r_aH8D-bkJNGV9p1hRAjP5G6BFCA4MVw,7963
142
- foxes/input/yaml/windio/read_site.py,sha256=KVRTr92mNqmsxgHx2XkPIqHVV91WiEzaqvub5uils0A,13124
143
- foxes/input/yaml/windio/windio.py,sha256=IjspxFNBHwbCJ8vSOU3OcOpjVm9vwKTExVA0dQj9Rqo,5617
138
+ foxes/input/yaml/windio/read_attributes.py,sha256=T4FLMGVgWWK4cyNnq0H8x7TX_pbeUv-X4NEmCC-0IBs,13252
139
+ foxes/input/yaml/windio/read_farm.py,sha256=TraS7AYIbu8BVj9ml8dj9yWN9dCZ_VoHrrFkmWWaU28,8247
140
+ foxes/input/yaml/windio/read_fields.py,sha256=pgMMkXaZ8BXzTIyNqgFxJCR_QvO7rn5xEEP77NjD17k,4818
141
+ foxes/input/yaml/windio/read_outputs.py,sha256=IbD5_0PLMy6Dl1-oyCDoY4S6fetD7j03iUZG2cIJ7yY,8678
142
+ foxes/input/yaml/windio/read_site.py,sha256=csmhoe46b3nUecMR9Nuc5vifAvOHB2g3SyR8MvFHzp8,13840
143
+ foxes/input/yaml/windio/windio.py,sha256=mcznjZCwUpX06ADMvhp-kQMeBZG4pP7ooILb6-UH5_A,5659
144
144
  foxes/models/__init__.py,sha256=-wXjx9PkxWT2Koq4tmtCuasnlb8RIeLVWP7iSYPQ1Fc,727
145
145
  foxes/models/model_book.py,sha256=A9lCg-cQtGVQ2dpIGzcEJGHdyktUdpzqyqHrybUMRvo,30065
146
146
  foxes/models/axial_induction/__init__.py,sha256=QJN1RLxIt1EhQXIDVLjPSZ1zIoaS6YjK9VDdgw7NwsA,124
147
147
  foxes/models/axial_induction/betz.py,sha256=rAaq7pnu-FmfYh61BU5Af1h4_bG2AAimP4Qah1aZo88,894
148
148
  foxes/models/axial_induction/madsen.py,sha256=_-ycfh8SnIpCKWm1uwx5VH7f49FQvR0y1Nbb_U8xWyU,1403
149
- foxes/models/farm_controllers/__init__.py,sha256=0HEGiWEsrKjm8Opf890DzVHwTptSlTSgeo5QJMx9gnw,95
149
+ foxes/models/farm_controllers/__init__.py,sha256=9c9vvgfUAvOG1I_5Bp58zJPC1mvUFuSQCDbRAUFTj4c,153
150
150
  foxes/models/farm_controllers/basic.py,sha256=6pinNXiyfoG3apXhqQWcnxx4vN_7Q63YryXX5Z7kTE0,249
151
+ foxes/models/farm_controllers/op_flag.py,sha256=EEtPejZ5majpDiPO_8Y5Z6b2deNpj1PyOX7wsl56Shk,6021
151
152
  foxes/models/farm_models/__init__.py,sha256=8qV0dQ2N3HJpbOolhLtBs0LMdC8hctxy8J-OiqcSvKo,87
152
153
  foxes/models/farm_models/turbine2farm.py,sha256=LuK-qAy4aVXBqFCM4-1qogwAA4qfHsjYRFsrZy_OUro,2276
153
154
  foxes/models/ground_models/__init__.py,sha256=r_MuSulOGQ1SnrojfpwU9kky7tZhPtCwXbXIVvGdrkg,148
@@ -220,17 +221,17 @@ foxes/models/wake_models/top_hat.py,sha256=APZf6r26jfi2rP_rrmk4qXs1NGlzc1hsFxrj6
220
221
  foxes/models/wake_models/induction/__init__.py,sha256=xw5LiTh2YWRRNF8cyYACQc-735C23NarCMHWiHQ_5-8,311
221
222
  foxes/models/wake_models/induction/rankine_half_body.py,sha256=1NaV5eqcsxjlQwCSUDC-w3wO_SGgh4ykEYvNJX8ToBk,6427
222
223
  foxes/models/wake_models/induction/rathmann.py,sha256=ZPF16PESm1wWA7SL7sNbj_XPb4rAGGcmfBrby8VoU3o,7964
223
- foxes/models/wake_models/induction/self_similar.py,sha256=v3bQjX-RAYwJ-WbZfOpAVb-7Wbq8HXgsgqenP6Jel40,8505
224
- foxes/models/wake_models/induction/self_similar2020.py,sha256=kteNnjRG4SptcYiW3avBgiDjmX3NMefTB2G2rpb-Hjs,1527
224
+ foxes/models/wake_models/induction/self_similar.py,sha256=WO5NStvfAy2xT-i4zW63ncyn-NH4_fNPAzv--nQjJvA,8869
225
+ foxes/models/wake_models/induction/self_similar2020.py,sha256=FETB7iiS1av0ymb8w3sgYLRCK3jz0lVXAMgGZ6MXljg,1516
225
226
  foxes/models/wake_models/induction/vortex_sheet.py,sha256=Iy3QX_2lUA7MiEEYKFeRh7jz9s7KpyyS7qBLhfCEsAo,7197
226
227
  foxes/models/wake_models/ti/__init__.py,sha256=0ZKF4sHbtU3QCRzC1Ff0vnVymbdby7s12Qcy3PnBgKU,163
227
- foxes/models/wake_models/ti/crespo_hernandez.py,sha256=UVxeDbxPu7beKNm5b8jwvgOdqJFGUQxG9Wybwfwy5p8,8990
228
+ foxes/models/wake_models/ti/crespo_hernandez.py,sha256=Or1uf0t8GjtQePyiczSIf4Dmb8tl4AMqdV9TqWFQNbE,9005
228
229
  foxes/models/wake_models/ti/iec_ti.py,sha256=P9SUNaxf9UdA_rufuJcmpgLXM1Fj1FRhFHU4DNxYFa4,7064
229
230
  foxes/models/wake_models/wind/__init__.py,sha256=QOCeb8E7TYuwkX5jhgPUST1kGmv9c59qvclLhtUeLnQ,379
230
- foxes/models/wake_models/wind/bastankhah14.py,sha256=zMhlZq9YMTMje-zbbx4BKHl9DwZK_e0SoODlNuVumvo,5567
231
- foxes/models/wake_models/wind/bastankhah16.py,sha256=6yBMInYi0Zg3Ly6x2gU9GbjTho6lmfQ1CkGd4uXIFgg,18742
231
+ foxes/models/wake_models/wind/bastankhah14.py,sha256=0NxM4QO1CtaY7dim2Xc7CXK3uMMWCMkhuOd3Wnb75RU,5582
232
+ foxes/models/wake_models/wind/bastankhah16.py,sha256=FuBQi9Q01f6gIK0_S5aO6QpCPJvyFzqH8wV44q1eTIw,18743
232
233
  foxes/models/wake_models/wind/jensen.py,sha256=rGEtBgTtT1z3_sGVHkAlqSP4sSErD2yQu-lDwqfykIw,4493
233
- foxes/models/wake_models/wind/turbopark.py,sha256=Vu69CeFnWfGfSlLRp0p4M7GCYezEUFt12ia_elCm7fg,15222
234
+ foxes/models/wake_models/wind/turbopark.py,sha256=w0ZXloSgjsbk32JuivrmVF4WbVv0TNE3KiU9UC07Y4c,15237
234
235
  foxes/models/wake_superpositions/__init__.py,sha256=fMrBOoBGSa45xbc2E1Jdgjfkm2ahKBKgPeBVq8s9uH0,690
235
236
  foxes/models/wake_superpositions/ti_linear.py,sha256=Cqteww87M94ZDIrSoAoXSouCcH-Auj0u8NSD6JCv9Lw,3895
236
237
  foxes/models/wake_superpositions/ti_max.py,sha256=s2NYnqMIk-Bj6-SAUyhBX0WWEye5yu4hRoe5dGcLEAw,3920
@@ -255,7 +256,7 @@ foxes/output/rose_plot.py,sha256=bHd9LrGCsE39zUxmiaRk8Z3r2m3csWqSUTS-3H-vdnk,188
255
256
  foxes/output/rotor_point_plots.py,sha256=J2gfwDZVBrQIgCk6RJuj0Jq1UA1cmyh7k8VC2TfV6xw,3324
256
257
  foxes/output/slice_data.py,sha256=bnY8D0ITFFN-i1mSkm0e2ukIMqxjev2KaUINbxo62pA,33788
257
258
  foxes/output/slices_data.py,sha256=FqulnXnZ5aI2fOns4ffBYSw5j42IEGq-lLCNJxWG5HA,8671
258
- foxes/output/state_turbine_map.py,sha256=LY-fhGws2LC0b-Tgkh76g9gKzEtNBOUWYkVEZ_lV9dI,2772
259
+ foxes/output/state_turbine_map.py,sha256=tBHDbAqxEqanVYRJhPlpvIV6FslZGG0VYEfRzEfh5AI,2944
259
260
  foxes/output/state_turbine_table.py,sha256=ldG0LcC126YsXQZtJY9OSWxW3ETbHdBehjtU21caTDw,2228
260
261
  foxes/output/turbine_type_curves.py,sha256=fvODho-HmH8hIrv0iQ6BXqtQ4Hz0jomnOTK-kV7vfBQ,5724
261
262
  foxes/output/flow_plots_2d/__init__.py,sha256=5pFJqvSuZKkm1TkN3d7won0mPLvr9MUg9m0TMlOqbec,91
@@ -282,7 +283,7 @@ foxes/utils/two_circles.py,sha256=xkj-SA_x-VXY7KtmSU4lcV4gFdplyhU3sBAC9vTdkF4,28
282
283
  foxes/utils/weibull.py,sha256=2fUWt-vZVMu55fFrXuo0M3B771xtoWeVVmqE7Nr5yXM,656
283
284
  foxes/utils/wind_dir.py,sha256=6W0njWDvnIdOOjwqcMr64MW9ApjdtFA75blVUxirPMo,2823
284
285
  foxes/utils/wrg_utils.py,sha256=QzaASvn50Pzegk2NoCJhC9WozO95KiQPIwiWGNMeA4w,3604
285
- foxes/utils/xarray_utils.py,sha256=pqtBkCzSXJMlTM0VTI-Su4SGxOP57sYVlZORBr7Z2qw,1880
286
+ foxes/utils/xarray_utils.py,sha256=ddnjrZ6HLMqIE1JpP_yCx4tKeSDjNRsSI6c5CL2neJo,1961
286
287
  foxes/utils/abl/__init__.py,sha256=yDbyZodXZ_dsmIJ4QH981CZ7xvVQyLneGzjOgYB7ZNE,179
287
288
  foxes/utils/abl/neutral.py,sha256=E4DEhvXvw74BPrYr1MjQjeIaoz6ZOTWVlqScKflm-0M,1358
288
289
  foxes/utils/abl/sheared.py,sha256=nS6gxa5cR7B7XcZbEk3rwOvbF6m4cinXAIhhn9gGBBs,446
@@ -295,7 +296,7 @@ foxes/utils/geom2d/example_intersection.py,sha256=4e6sjpZEk_bNc462YvwKPzwxdV1B90
295
296
  foxes/utils/geom2d/example_union.py,sha256=BKfLt1mtQcSto-qExeMQkq8tQ6kfFXVJ93Cc7DhOal8,1750
296
297
  foxes/utils/geom2d/half_plane.py,sha256=kzZD6pkZxZ03MK9WAboWzXb5Ws5dWLQY9GIahD4D9mA,6167
297
298
  foxes/utils/geom2d/polygon.py,sha256=Xj7triA5Pe4-48sNSAvGxEXlQGptV161LUpKKCf3YOY,5535
298
- foxes-1.5.dist-info/licenses/LICENSE,sha256=bBCH6mYTPzSepk2s2UUZ3II_ZYXrn1bnSqB85-aZHxU,1071
299
+ foxes-1.5.2.dist-info/licenses/LICENSE,sha256=bBCH6mYTPzSepk2s2UUZ3II_ZYXrn1bnSqB85-aZHxU,1071
299
300
  tests/0_consistency/iterative/test_iterative.py,sha256=lzagmJ1y241l6Szw4Cu80S8S1ATHIyD7ukr1vVBrusY,2637
300
301
  tests/0_consistency/partial_wakes/test_partial_wakes.py,sha256=7rdg2lcUYUzxwCdGhue7A4QYCJQGrOO4E0bytgatYj4,2584
301
302
  tests/1_verification/flappy_0_6/PCt_files/test_PCt_files.py,sha256=8tIqifsykvxMCd9eD-mZWxRwT56sKjIxrGf3hf8aCFA,2530
@@ -320,9 +321,10 @@ tests/1_verification/flappy_0_6_2/row_Bastankhah_Crespo/test_row_Bastankhah_Cres
320
321
  tests/1_verification/flappy_0_6_2/row_Bastankhah_Crespo/flappy/run.py,sha256=nwIyn20ZyYHhCKcPCnm02zjwNKMRzr9t0U8TjKK61QU,2213
321
322
  tests/1_verification/flappy_0_6_2/row_Bastankhah_linear_centre/test_row_Bastankhah_linear_centre.py,sha256=QUULW3AJJq8zvUIdIQHkXiNZpaysVYIALh5HOJ6-428,2595
322
323
  tests/1_verification/flappy_0_6_2/row_Bastankhah_linear_centre/flappy/run.py,sha256=1paRjCe71AIM8igK4_f0FFH1xiIETvuBwnZAATiwWUU,2102
324
+ tests/2_models/turbine_models/test_set_farm_vars.py,sha256=_y-lVYsL9jByh_34c08Qu4GgYxW8s-E2HsSyX7ptfnY,1680
323
325
  tests/3_examples/test_examples.py,sha256=9_PtvlYA6ELsQGHt-xAnsjCYdGj1ekX237ymWvEJaCk,732
324
- foxes-1.5.dist-info/METADATA,sha256=3SO55BIVmGwr2wJ-TWDMqSdqAQ9vJgzJOXRZHrQ0C1Y,8121
325
- foxes-1.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
326
- foxes-1.5.dist-info/entry_points.txt,sha256=KuS44FRH5NnMw201A8Btr76eNRKr2UOoKHjejAsqKwE,123
327
- foxes-1.5.dist-info/top_level.txt,sha256=G7oHApEz5nc-iP__XsPcvjYe_NyXGmKMUMPHi3C3x6I,26
328
- foxes-1.5.dist-info/RECORD,,
326
+ foxes-1.5.2.dist-info/METADATA,sha256=yJDpMwsBVrfk6vpMRDi85OFO89RTham8VVQk1-Bre7Y,8095
327
+ foxes-1.5.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
328
+ foxes-1.5.2.dist-info/entry_points.txt,sha256=KuS44FRH5NnMw201A8Btr76eNRKr2UOoKHjejAsqKwE,123
329
+ foxes-1.5.2.dist-info/top_level.txt,sha256=G7oHApEz5nc-iP__XsPcvjYe_NyXGmKMUMPHi3C3x6I,26
330
+ foxes-1.5.2.dist-info/RECORD,,