Source code for foxes.algorithms.iterative.models.urelax
from foxes.core import FarmDataModel
[docs]
class URelax(FarmDataModel):
"""
Apply under-relaxation to selected variables
during iterations.
Attributes
----------
urel: dict
The variables and their under-relaxation
factors between 0 and 1
:group: algorithms.iterative.models
"""
[docs]
def __init__(self, **urel):
"""
Constructor.
Parameters
----------
urel: dict
The variables and their under-relaxation
factors between 0 and 1
"""
super().__init__()
self.urel = urel
self.name += "_" + "_".join(list(urel.keys()))
[docs]
def output_farm_vars(self, algo):
"""
The variables which are being modified by the model.
Parameters
----------
algo: foxes.core.Algorithm
The calculation algorithm
Returns
-------
output_vars: list of str
The output variable names
"""
return list(self.urel.keys())
[docs]
def calculate(self, algo, mdata, fdata):
"""
The main model calculation.
This function is executed on a single chunk of data,
all computations should be based on numpy arrays.
Parameters
----------
algo: foxes.core.Algorithm
The calculation algorithm
mdata: foxes.core.Data
The model data
fdata: foxes.core.Data
The farm data
Returns
-------
results: dict
The resulting data, keys: output variable str.
Values: numpy.ndarray with shape (n_states, n_turbines)
"""
i0 = fdata.states_i0(counter=True, algo=algo)
i1 = i0 + fdata.n_states
pres = algo.prev_farm_results
out = {}
for v, u in self.urel.items():
if u > 0 and pres is not None:
odata = pres[v].to_numpy()[i0:i1]
out[v] = u * odata + (1 - u) * fdata[v]
else:
out[v] = fdata[v]
return out