foxes 0.7.0.5__py3-none-any.whl → 0.7.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.

@@ -178,3 +178,158 @@ class WSQuadratic(WakeSuperposition):
178
178
  if self.lim_high is not None:
179
179
  w = np.minimum(w, self.lim_high - amb_results)
180
180
  return w
181
+
182
+ class WSQuadraticLocal(WakeSuperposition):
183
+ """
184
+ Local quadratic supersposition of wind deficit results
185
+
186
+ Attributes
187
+ ----------
188
+ lim_low: float
189
+ Lower limit of the final waked wind speed
190
+ lim_high: float
191
+ Upper limit of the final waked wind speed
192
+
193
+ :group: models.wake_superpositions
194
+
195
+ """
196
+
197
+ def __init__(self, lim_low=None, lim_high=None):
198
+ """
199
+ Constructor.
200
+
201
+ Parameters
202
+ ----------
203
+ lim_low: float
204
+ Lower limit of the final waked wind speed
205
+ lim_high: float
206
+ Upper limit of the final waked wind speed
207
+
208
+ """
209
+ super().__init__()
210
+ self.lim_low = lim_low
211
+ self.lim_high = lim_high
212
+
213
+ def __repr__(self):
214
+ a = f"lim_low={self.lim_low}, lim_high={self.lim_high}"
215
+ return f"{type(self).__name__}({a})"
216
+
217
+ def input_farm_vars(self, algo):
218
+ """
219
+ The variables which are needed for running
220
+ the model.
221
+
222
+ Parameters
223
+ ----------
224
+ algo: foxes.core.Algorithm
225
+ The calculation algorithm
226
+
227
+ Returns
228
+ -------
229
+ input_vars: list of str
230
+ The input variable names
231
+
232
+ """
233
+ return []
234
+
235
+ def add_wake(
236
+ self,
237
+ algo,
238
+ mdata,
239
+ fdata,
240
+ tdata,
241
+ downwind_index,
242
+ st_sel,
243
+ variable,
244
+ wake_delta,
245
+ wake_model_result,
246
+ ):
247
+ """
248
+ Add a wake delta to previous wake deltas,
249
+ at rotor points.
250
+
251
+ Parameters
252
+ ----------
253
+ algo: foxes.core.Algorithm
254
+ The calculation algorithm
255
+ mdata: foxes.core.MData
256
+ The model data
257
+ fdata: foxes.core.FData
258
+ The farm data
259
+ tdata: foxes.core.TData
260
+ The target point data
261
+ downwind_index: int
262
+ The index of the wake causing turbine
263
+ in the downwnd order
264
+ st_sel: numpy.ndarray of bool
265
+ The selection of targets, shape: (n_states, n_targets)
266
+ variable: str
267
+ The variable name for which the wake deltas applies
268
+ wake_delta: numpy.ndarray
269
+ The original wake deltas, shape:
270
+ (n_states, n_targets, n_tpoints, ...)
271
+ wake_model_result: numpy.ndarray
272
+ The new wake deltas of the selected rotors,
273
+ shape: (n_st_sel, n_tpoints, ...)
274
+
275
+ Returns
276
+ -------
277
+ wdelta: numpy.ndarray
278
+ The updated wake deltas, shape:
279
+ (n_states, n_targets, n_tpoints, ...)
280
+
281
+ """
282
+ if variable not in [FV.REWS, FV.REWS2, FV.REWS3, FV.WS]:
283
+ raise ValueError(
284
+ f"Superposition '{self.name}': Expecting wind speed variable, got {variable}"
285
+ )
286
+
287
+ if np.any(st_sel):
288
+ wake_delta[st_sel] += wake_model_result**2
289
+
290
+ return wake_delta
291
+
292
+ def calc_final_wake_delta(
293
+ self,
294
+ algo,
295
+ mdata,
296
+ fdata,
297
+ variable,
298
+ amb_results,
299
+ wake_delta,
300
+ ):
301
+ """
302
+ Calculate the final wake delta after adding all
303
+ contributions.
304
+
305
+ Parameters
306
+ ----------
307
+ algo: foxes.core.Algorithm
308
+ The calculation algorithm
309
+ mdata: foxes.core.MData
310
+ The model data
311
+ fdata: foxes.core.FData
312
+ The farm data
313
+ variable: str
314
+ The variable name for which the wake deltas applies
315
+ amb_results: numpy.ndarray
316
+ The ambient results at targets,
317
+ shape: (n_states, n_targets, n_tpoints)
318
+ wake_delta: numpy.ndarray
319
+ The wake deltas at targets, shape:
320
+ (n_states, n_targets, n_tpoints)
321
+
322
+ Returns
323
+ -------
324
+ final_wake_delta: numpy.ndarray
325
+ The final wake delta, which will be added to the ambient
326
+ results by simple plus operation. Shape:
327
+ (n_states, n_targets, n_tpoints)
328
+
329
+ """
330
+ w = -np.sqrt(wake_delta) * amb_results
331
+ if self.lim_low is not None:
332
+ w = np.maximum(w, self.lim_low - amb_results)
333
+ if self.lim_high is not None:
334
+ w = np.minimum(w, self.lim_high - amb_results)
335
+ return w
foxes/utils/__init__.py CHANGED
@@ -7,6 +7,7 @@ from .pandas_utils import PandasFileHelper
7
7
  from .xarray_utils import write_nc
8
8
  from .subclasses import all_subclasses
9
9
  from .dict import Dict
10
+ from .factory import Factory, FDict
10
11
  from .data_book import DataBook
11
12
  from .cubic_roots import cubic_roots
12
13
  from .geopandas_utils import read_shp, shp2csv, read_shp_polygons, shp2geom2d
foxes/utils/factory.py ADDED
@@ -0,0 +1,333 @@
1
+ from .dict import Dict
2
+
3
+ class Factory:
4
+ """
5
+ Constructs objects from a choice of allowed
6
+ constructor parameters
7
+
8
+ Attributes
9
+ ----------
10
+ base: class
11
+ The class of which objects are to be created
12
+ name_template: str
13
+ The name template, e.g. 'name_<A>_<B>_<C>' for
14
+ variables A, B, C
15
+ args: tuple
16
+ Fixed arguments for the base class
17
+ kwargs: dict
18
+ Fixed arguments for the base class
19
+ var2arg: dict
20
+ Mapping from variable to constructor argument
21
+ hints: dict
22
+ Hints for print_toc, only for variables for which the
23
+ options are functions or missing
24
+ options: dict
25
+ For each variable, e.g. A, B or C, the list or dict
26
+ or function that maps a str to the actual value
27
+
28
+ :group: utils
29
+
30
+ """
31
+ def __init__(
32
+ self,
33
+ base,
34
+ name_template,
35
+ args=(),
36
+ kwargs={},
37
+ var2arg={},
38
+ hints={},
39
+ **options,
40
+ ):
41
+ """
42
+ Constructor.
43
+
44
+ Parameters
45
+ ----------
46
+ base: class
47
+ The class of which objects are to be created
48
+ name_template: str
49
+ The name template, e.g. 'name_<A>_<B>_<C>' for
50
+ variables A, B, C
51
+ args: tuple
52
+ Fixed arguments for the base class
53
+ kwargs: dict
54
+ Fixed arguments for the base class
55
+ var2arg: dict
56
+ Mapping from variable to constructor argument
57
+ hints: dict
58
+ Hints for print_toc, only for variables for which the
59
+ options are functions or missing
60
+ options: dict
61
+ For each variable, e.g. A, B or C, the list or dict
62
+ or function that maps a str to the actual value
63
+
64
+ """
65
+ self.base = base
66
+ self.name_template = name_template
67
+ self.args = args
68
+ self.kwargs = kwargs
69
+ self.var2arg = var2arg
70
+ self.hints = hints
71
+
72
+ parts = name_template.split(">")
73
+ if len(parts) < 2:
74
+ raise ValueError(f"Factory '{name_template}': Expecting at least one variable in template, pattern '<..>'")
75
+
76
+ self._vars = []
77
+ self._pre = []
78
+ for i, p in enumerate(parts):
79
+ if i < len(parts) - 1:
80
+ parts2 = p.split("<")
81
+ if len(parts2) != 2:
82
+ raise ValueError(f"Factory '{name_template}': incomplete pattern brackets '<..>'")
83
+ self._pre.append(parts2[0])
84
+ self._vars.append(parts2[1])
85
+ else:
86
+ self._pre.append(p)
87
+
88
+ if len(self.variables) > 1:
89
+ for vi, v in enumerate(self.variables):
90
+ p = self._pre[vi]
91
+ if vi < len(self.variables) - 1 and p == "":
92
+ raise ValueError(f"Factory '{name_template}': Require indicator before variable '{v}' in template, e.g. '{v}<{v}>'")
93
+
94
+ self.options = Dict(name=f"{self._pre[0]}_options")
95
+ for v, o in options.items():
96
+ if v not in self.variables:
97
+ raise KeyError(f"Factory '{name_template}': Variable '{v}' found in options, but not in template")
98
+ if isinstance(o, list) or isinstance(o, tuple):
99
+ o = {str(k): k for k in o}
100
+ if isinstance(o, dict):
101
+ for k in o.keys():
102
+ if not isinstance(k, str):
103
+ raise TypeError(f"Factory '{name_template}': Found option for variable '{v}' that is not a str, {k}")
104
+ self.options[v] = Dict(name=f"{self._pre[0]}_options_{v}", **o)
105
+ elif hasattr(o, "__call__"):
106
+ self.options[v] = o
107
+ else:
108
+ raise ValueError(f"Factory '{name_template}': Variable '{v}' has option of type '{type(v).__name__}'. Only list, tuple, dict or function are supported")
109
+
110
+ @property
111
+ def name_prefix(self):
112
+ """
113
+ The beginning of the name template
114
+
115
+ Returns
116
+ -------
117
+ nbase: str
118
+ The beginning of the name template
119
+
120
+ """
121
+ return self._pre[0]
122
+
123
+ @property
124
+ def name_suffix(self):
125
+ """
126
+ The ending of the name template
127
+
128
+ Returns
129
+ -------
130
+ nbase: str
131
+ The ending of the name template
132
+
133
+ """
134
+ return self._pre[-1]
135
+
136
+ @property
137
+ def variables(self):
138
+ """
139
+ The list of variables
140
+
141
+ Returns
142
+ -------
143
+ vrs: list of str
144
+ The variables
145
+
146
+ """
147
+ return self._vars
148
+
149
+ def __str__(self):
150
+ """ String representation """
151
+ s = f"{self.name_template}: {self.base.__name__} with"
152
+ for k, d in self.kwargs.items():
153
+ s += f"\n {k}={d}"
154
+ for v in self.variables:
155
+ if v in self.options and isinstance(self.options[v], dict):
156
+ s += f"\n {v} from {list(self.options[v])}"
157
+ else:
158
+ s += f"\n {v}={self.hints.get(v, '(value)')}"
159
+ return s
160
+
161
+ def check_match(self, name):
162
+ """
163
+ Tests if a name matches the template
164
+
165
+ Parameters
166
+ ----------
167
+ name: str
168
+ The name to be checked
169
+
170
+ Returns
171
+ -------
172
+ success: bool
173
+ True if the template is matched
174
+
175
+ """
176
+ data_str = name
177
+ for vi in range(len(self.variables)):
178
+ p = self._pre[vi]
179
+ i = data_str.find(p)
180
+ j = i + len(p)
181
+ if i < 0 or len(data_str) <= j:
182
+ return False
183
+ data_str = data_str[j:]
184
+
185
+ q = self._pre[vi+1]
186
+ if q != "":
187
+ i = data_str.find(q)
188
+ j = i + len(q)
189
+ if i < 0 or len(data_str) <= j:
190
+ return False
191
+ else:
192
+ data_str = ""
193
+
194
+ return True
195
+
196
+ def construct(self, name):
197
+ """
198
+ Create an object of the base class.
199
+
200
+ Parameters
201
+ ----------
202
+ name: str
203
+ The name, matching the template
204
+
205
+ Returns
206
+ -------
207
+ obj: object
208
+ The instance of the base class
209
+
210
+ """
211
+ data_str = name
212
+ wlist = []
213
+ for vi, v in enumerate(self.variables):
214
+ p = self._pre[vi]
215
+ i = data_str.find(p)
216
+ j = i + len(p)
217
+ if i < 0 or len(data_str) <= j:
218
+ raise ValueError(f"Factory '{self.name_template}': Name '{name}' not matching template")
219
+ data_str = data_str[j:]
220
+
221
+ q = self._pre[vi+1]
222
+ if q != "":
223
+ i = data_str.find(q)
224
+ j = i + len(q)
225
+ if i < 0 or len(data_str) <= j:
226
+ raise ValueError(f"Factory '{self.name_template}': Name '{name}' not matching template")
227
+ wlist.append(data_str[:i])
228
+ else:
229
+ wlist.append(data_str)
230
+ data_str = ""
231
+
232
+ kwargs = {}
233
+ for vi, v in enumerate(self.variables):
234
+ w = self.var2arg.get(v, v)
235
+ data = wlist[vi]
236
+ if v in self.options:
237
+ o = self.options[v]
238
+ if hasattr(o, "__call__"):
239
+ kwargs[w] = o(data)
240
+ else:
241
+ kwargs[w] = self.options[v][data]
242
+ else:
243
+ kwargs[w] = data
244
+
245
+ kwargs.update(self.kwargs)
246
+
247
+ return self.base(*self.args, **kwargs)
248
+
249
+ class FDict(Dict):
250
+ """
251
+ A dictionary with factory support
252
+
253
+ Attributes
254
+ ----------
255
+ store_created: bool
256
+ Flag for storing created objects
257
+ factories: list of foxes.utils.Factory
258
+ The factories
259
+
260
+ :group: utils
261
+
262
+ """
263
+ def __init__(self, *args, store_created=True, **kwargs):
264
+ """
265
+ Constructor.
266
+
267
+ Parameters
268
+ ----------
269
+ args: tuple, optional
270
+ Parameters for the base class
271
+ store_created: bool
272
+ Flag for storing created objects
273
+ kwargs: dict, optional
274
+ Parameters for the base class
275
+
276
+ """
277
+ super().__init__(*args, **kwargs)
278
+ self.store_created = store_created
279
+ self.factories = []
280
+
281
+ def add_factory(self, *args, **kwargs):
282
+ """
283
+ Constructor.
284
+
285
+ Parameters
286
+ ----------
287
+ args: tuple, optional
288
+ Parameters for the Factory constructor
289
+ kwargs: dict, optional
290
+ Parameters for the Factory constructor
291
+
292
+ """
293
+ f = Factory(*args, **kwargs)
294
+ i = len(self.factories)
295
+ for gi in range(len(self.factories) - 1, -1, -1):
296
+ g = self.factories[gi]
297
+ if (
298
+ g.name_prefix == f.name_prefix
299
+ and g.name_suffix == f.name_suffix
300
+ and len(f.variables) > len(g.variables)
301
+ ):
302
+ i = gi
303
+
304
+ if i == len(self.factories):
305
+ self.factories.append(f)
306
+ else:
307
+ self.factories.insert(i, f)
308
+
309
+ def __contains__(self, key):
310
+ found = super().__contains__(key)
311
+ if not found:
312
+ for f in self.factories:
313
+ if f.check_match(key):
314
+ return True
315
+ return found
316
+
317
+ def __getitem__(self, key):
318
+ try:
319
+ return super().__getitem__(key)
320
+ except KeyError:
321
+ for f in self.factories:
322
+ try:
323
+ obj = f.construct(key)
324
+ if self.store_created:
325
+ self[key] = obj
326
+ return obj
327
+ except ValueError:
328
+ pass
329
+
330
+ k = ", ".join(sorted(list(self.keys())))
331
+ 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]}"
332
+ raise KeyError(e)
333
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: foxes
3
- Version: 0.7.0.5
3
+ Version: 0.7.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
@@ -1,10 +1,10 @@
1
- foxes/VERSION,sha256=dHmuFaWnzgkXybbkToYNeDplwyLg55qzGEps7NBUCes,8
1
+ foxes/VERSION,sha256=kCMRx7s4-hZY_0A972FY7nN4_p1uLihPocOHNcMb0ws,6
2
2
  foxes/__init__.py,sha256=4ptDOBaQC8fAd_ZH5XH7d5pIgx3JXEY9xLcK3Nrs2Ow,718
3
3
  foxes/constants.py,sha256=UfflqHQ67uSQYFFktZBSe6rrWntoL2ccpMHnKs7zTcA,2650
4
4
  foxes/variables.py,sha256=I-S25WejH33ffOcVnmN2TDL1pIxWqg0aM1lhIBwZ9NQ,4454
5
5
  foxes/algorithms/__init__.py,sha256=uaXU8OYMT3eclcE6a2b8NkozHVXoM1BF5RJA2XR4DUw,260
6
6
  foxes/algorithms/downwind/__init__.py,sha256=lyygq5GMc6NAPmH0b0mhGeccWyuC8JTOEMZl-UlmE5M,53
7
- foxes/algorithms/downwind/downwind.py,sha256=vThxy66JwZjo3vMnw39-0sc6V1wvaj89yk0TCqqxa6U,21612
7
+ foxes/algorithms/downwind/downwind.py,sha256=W2W1ftPTnfNroBSskbBbSYZSXM0_wSfTrye8wXmfu7k,21652
8
8
  foxes/algorithms/downwind/models/__init__.py,sha256=0ov8rjIQ02w3iB6yYCxaswPvHDlPM_8_di6xPh1TTkQ,300
9
9
  foxes/algorithms/downwind/models/farm_wakes_calc.py,sha256=nRE_lCwrlVYB9zXJ0XR557IncNb6M7tUbhN9kBPgw_c,5178
10
10
  foxes/algorithms/downwind/models/init_farm_data.py,sha256=sTUMYGLU9iHr56prdNRR4cs0yuCFp7gqiCDut685HKM,4022
@@ -40,7 +40,7 @@ foxes/core/turbine.py,sha256=P5qPKmV1qohZdAKW4lPiUerQkRDTxUOhsvBPQqy8mBo,3054
40
40
  foxes/core/turbine_model.py,sha256=IcsU848QNHbUhDN5oqd7VnVWKx_VM5UwRhlPsWK_njw,2049
41
41
  foxes/core/turbine_type.py,sha256=uet3SiJDqt9bPD8tq5xkq-blGV7o1Nd0lNn_2DlqOyk,3151
42
42
  foxes/core/vertical_profile.py,sha256=pgjari78N2CHZOWnidQ_7KGsSs4lTFP9isn-w6e1Yro,1642
43
- foxes/core/wake_frame.py,sha256=1_gvfUAUz-fPTXXpOQoeuCC-4F-f-DmdRsQdu22D0yY,10221
43
+ foxes/core/wake_frame.py,sha256=JbDWjHtZ6nSt-pSSlIsrKea4shwx_7YViZCCl9kNI_0,10239
44
44
  foxes/core/wake_model.py,sha256=HAnYOVvT5gWr1Gyu1CWUe7_uO0nLTdIAHzQCiFN0X-o,4497
45
45
  foxes/core/wake_superposition.py,sha256=_XRgHeIVf_g8MkudwCLAX0DcTBp4Wdy9bDJLRPqkQrM,2811
46
46
  foxes/core/wind_farm.py,sha256=COJ6iLFeU_EiYJKLzcG2f9k9z3YegHKr-NvrAS1X_ks,1708
@@ -84,7 +84,7 @@ foxes/input/states/create/random_timeseries.py,sha256=gJpaQ4nEXxOjI4hp3xjNcVbCsm
84
84
  foxes/input/windio/__init__.py,sha256=Bj9qtJNapfvgFcjThCI_oDia2hvMKN_seNLgm5KhWhw,89
85
85
  foxes/input/windio/windio.py,sha256=GtUS3IpHdvb_f2WPcoutpbKNQMEZbE4Bc0U3EVfXBEQ,7948
86
86
  foxes/models/__init__.py,sha256=FNEKtkT75LfVkT7H9rXX2Jn_15xB1qKF-2p3_nwCzIU,413
87
- foxes/models/model_book.py,sha256=_vY02pXx-7n8X_8ZL8yFUO-BwyxybxhTCNdAGYQsksM,21372
87
+ foxes/models/model_book.py,sha256=PXs0amTpouSpoMmGToGuaDaUMe4H2sI6XcZOdBXvz60,26376
88
88
  foxes/models/axial_induction_models/__init__.py,sha256=CdYOzu45DWu7xrzpRpFIQ6CGZIMABjjy_lqAszjj9lg,78
89
89
  foxes/models/axial_induction_models/betz.py,sha256=rAaq7pnu-FmfYh61BU5Af1h4_bG2AAimP4Qah1aZo88,894
90
90
  foxes/models/axial_induction_models/madsen.py,sha256=_-ycfh8SnIpCKWm1uwx5VH7f49FQvR0y1Nbb_U8xWyU,1403
@@ -157,20 +157,20 @@ foxes/models/wake_models/ti/__init__.py,sha256=EOlqFHL2mzcKGFRZqlVYTiqGJqPb6dx7I
157
157
  foxes/models/wake_models/ti/crespo_hernandez.py,sha256=i02Ye9b5DU6rexYmKWPOvCgerpmws39AKT_02km43C0,8811
158
158
  foxes/models/wake_models/ti/iec_ti.py,sha256=kQRqwElW9uL9TJeZ7wNkFs9vLVJfighRCOtAjyn1jh8,6203
159
159
  foxes/models/wake_models/wind/__init__.py,sha256=X_QdQ_f3fKCIrZZ9K_CzzsHSl13AyvPRcWdEZ1y9Bk4,223
160
- foxes/models/wake_models/wind/bastankhah14.py,sha256=PdPwGrwss-MBdx1Wyi-ERc5qSPg2SM39zQ6ViV8w2sA,5612
160
+ foxes/models/wake_models/wind/bastankhah14.py,sha256=zPSi3oCiZlzR1XHx6UBb_n3hOBH2tZW16uGVud1I56I,5602
161
161
  foxes/models/wake_models/wind/bastankhah16.py,sha256=V3onz6hXBkW0bb9le4n8srjWq23Ama2Fq69iUdM9LHM,17629
162
162
  foxes/models/wake_models/wind/jensen.py,sha256=jEBBIARBHydqEC9YHRd5B7WExhBnTpxfty6Ldxd_Q8Y,4639
163
- foxes/models/wake_models/wind/turbopark.py,sha256=JZdo1LUzvZX_Sy1s2-IxXurGI-FGShjSsVF6ZGjfJEM,13852
164
- foxes/models/wake_superpositions/__init__.py,sha256=ZuVhOdjEdqa3S1-XR09pVhjflp2Z3tT75e_mUbVPQKQ,314
163
+ foxes/models/wake_models/wind/turbopark.py,sha256=PCo9pKVFTB0r5sFfOyd2co6xQZv8H9rm52Po7d8MyRE,15250
164
+ foxes/models/wake_superpositions/__init__.py,sha256=p_pI_bUC-JjpGfg-7hyo3EpB_qVYqg5CCFt_vSG9DF4,371
165
165
  foxes/models/wake_superpositions/ti_linear.py,sha256=T9lP5PsHzi04Neq5dS3HDZGwyV7Qzvx_umCbk9M7Zks,3911
166
166
  foxes/models/wake_superpositions/ti_max.py,sha256=fnfYmr_Wt9EPZftHoHnqRlTwFWAawrEheGgLA0NwIlA,3936
167
167
  foxes/models/wake_superpositions/ti_pow.py,sha256=4ZS3d0ulRkIDaVeG2VvcdjpJch673INQRUGgj37cs_A,4160
168
168
  foxes/models/wake_superpositions/ti_quadratic.py,sha256=tkmaoIm7a-Q4c3qtMpBmX25jfcVdt0Qp7Xn0fQrxN4A,3926
169
- foxes/models/wake_superpositions/ws_linear.py,sha256=1ctJpx4ann9ccGE7ikth1I9hgb5LjVyxS8LQehjy8uo,4988
170
- foxes/models/wake_superpositions/ws_max.py,sha256=zuGfTo8CRqIQStflEpfrxriY05litILO_XMzWN89IuI,5101
171
- foxes/models/wake_superpositions/ws_pow.py,sha256=Aiyhf6tXPT_GMognILM-3hry4hmsA3N90EipsTqLo5U,5211
169
+ foxes/models/wake_superpositions/ws_linear.py,sha256=TiKaRAxNioY4oIloJODfT1zftnkXzhuqfqEkqG33owc,9155
170
+ foxes/models/wake_superpositions/ws_max.py,sha256=lWQtvHwudPxyA1vUQodcqY37hlU4KiCWIC9XeupEHT8,9380
171
+ foxes/models/wake_superpositions/ws_pow.py,sha256=HiuGiMffV7dT6qydK-O8VDuFsrx0bNEIancYy_zUO_o,9601
172
172
  foxes/models/wake_superpositions/ws_product.py,sha256=8dCDaKfuzHfTEBo0_N7BR-x_qG2tWXTabzPsgpIAtXk,4672
173
- foxes/models/wake_superpositions/ws_quadratic.py,sha256=8LvpPg1cjfTnulmCqb-6O5P9RMTi_JYCewWRdjavKcM,5011
173
+ foxes/models/wake_superpositions/ws_quadratic.py,sha256=6H0BXMXpraPX7iz_U6m8ZB9NSEcWgUJr7pR-x4ZzNo0,9196
174
174
  foxes/opt/__init__.py,sha256=okwZagHJMkUkLvKCSQLbE0cjx_47RLl3bEz576j6CdI,172
175
175
  foxes/opt/constraints/__init__.py,sha256=UZzN_JlxGaASdGtvBn5d5xwdSDpwO6bklj3vw70IZvU,159
176
176
  foxes/opt/constraints/area_geometry.py,sha256=9TFsyuM8_pp3HEUV4N0w0KnhxOk0OLPMKd6ZvNQGC80,6156
@@ -216,11 +216,12 @@ foxes/output/flow_plots_2d/__init__.py,sha256=2d4RyQYPOYr-HiBCbp1swSPG4Nf3NGezTr
216
216
  foxes/output/flow_plots_2d/flow_plots.py,sha256=RYdYZui11IlJE5Mm_R3dtkkQDC0XbAz2JyOT1U25PAA,28209
217
217
  foxes/output/flow_plots_2d/get_fig.py,sha256=gGMOfzNCukq_l0FZLmi3zSBl0ANkQi2WoKaGTpB6xhc,6169
218
218
  foxes/output/flow_plots_2d/seq_flow_ani_plugin.py,sha256=RFlzbZG2L9A583d7wSqZHogP561YEtfcu5M5FaCqIIE,2782
219
- foxes/utils/__init__.py,sha256=jSVprNwzf7YSMMAa387ktXYYHJlnNB4k3Xh-_reR6R0,703
219
+ foxes/utils/__init__.py,sha256=enB6w5vHEYTVR37UEIh7oIzqIg83XmDMlcEmZQ7bP8g,739
220
220
  foxes/utils/cubic_roots.py,sha256=u2Pf-yHZ6EASpFONMfkv0mvldmd1E1VRZxj69YabDoc,3321
221
221
  foxes/utils/data_book.py,sha256=DgxusriNH-fhHNN_v6TY3QWcAnrAcw20Wgz7lDfbMeg,5302
222
222
  foxes/utils/dict.py,sha256=s922OY22wOKBMbzQ_g-T-MhEw1dga0d3CCwFwd0nI78,886
223
223
  foxes/utils/exec_python.py,sha256=BRylxWOyYHpjIZXCuoOp_A-P9VMoQZ13P2vpHs-lqj8,1714
224
+ foxes/utils/factory.py,sha256=pq028O6hlDFxhvMf7QN8_EUc4GOoBocDPOjwRt7gG80,9994
224
225
  foxes/utils/geopandas_helpers.py,sha256=inVQHMco6Op7YN3VFH1DGAJZWREuveJUS7gyoRudw2A,7895
225
226
  foxes/utils/geopandas_utils.py,sha256=inVQHMco6Op7YN3VFH1DGAJZWREuveJUS7gyoRudw2A,7895
226
227
  foxes/utils/load.py,sha256=7jrCX2GQ_GTgrSu3nz-jfxiyswa7Q3XXCYqobl6bkyk,1290
@@ -249,9 +250,9 @@ foxes/utils/geom2d/half_plane.py,sha256=kzZD6pkZxZ03MK9WAboWzXb5Ws5dWLQY9GIahD4D
249
250
  foxes/utils/geom2d/polygon.py,sha256=8ASfy7No_-Pt_xDSeNsDtLEkCjBWsNZK8nIxDQtqeOE,5534
250
251
  foxes/utils/runners/__init__.py,sha256=-WL4ZmdgNYldkqhCV6dR-aXCumBrH-Ea-V1shsRhsbs,55
251
252
  foxes/utils/runners/runners.py,sha256=Sc06qsCzPduMyxbywgf6G3uHRioDs1qWRSc6GZbLFAY,6932
252
- foxes-0.7.0.5.dist-info/LICENSE,sha256=bBCH6mYTPzSepk2s2UUZ3II_ZYXrn1bnSqB85-aZHxU,1071
253
- foxes-0.7.0.5.dist-info/METADATA,sha256=7CIen1imAubkuuhbXkjYdYxwupLKrbHqZgRmGpf1n9k,9522
254
- foxes-0.7.0.5.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
255
- foxes-0.7.0.5.dist-info/top_level.txt,sha256=B4spGR6JHsVHz7CEXsa68xsjYalAA70nBwHa1gfyRHc,6
256
- foxes-0.7.0.5.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
257
- foxes-0.7.0.5.dist-info/RECORD,,
253
+ foxes-0.7.1.dist-info/LICENSE,sha256=bBCH6mYTPzSepk2s2UUZ3II_ZYXrn1bnSqB85-aZHxU,1071
254
+ foxes-0.7.1.dist-info/METADATA,sha256=-i7RicI54Ewf9bAL0TQcPm19xduZAR3Qq2WKSEEzQvo,9520
255
+ foxes-0.7.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
256
+ foxes-0.7.1.dist-info/top_level.txt,sha256=B4spGR6JHsVHz7CEXsa68xsjYalAA70nBwHa1gfyRHc,6
257
+ foxes-0.7.1.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
258
+ foxes-0.7.1.dist-info/RECORD,,
File without changes