Source code for foxes.output.seq_plugins.seq_flow_ani_plugin
from copy import deepcopy
from foxes.algorithms.sequential import SequentialPlugin
from ..flow_plots_2d.flow_plots import FlowPlots2D
[docs]
class SeqFlowAnimationPlugin(SequentialPlugin):
"""
Plugin for creating data for a 2D flow animation
during sequential iterations
Attributes
----------
orientation: str
The orientation, either "yx", "xz" or "yz"
pars: dict
Additional parameters for plotting
:group: output.seq_plugins
"""
[docs]
def __init__(self, orientation, **pars):
"""
Constructor.
Parameters
----------
orientation: str
The orientation, either "yx", "xz" or "yz"
pars: dict, optional
Additional parameters for plotting
"""
super().__init__()
self.orientation = orientation
self.pars = pars
if "title" in self.pars and callable(self.pars["title"]):
self._tfun = self.pars.pop("title")
else:
self._tfun = None
[docs]
def initialize(self, algo):
"""
Initialize data based on the intial iterator
Parameters
----------
algo: foxes.algorithms.sequential.Sequential
The current sequential algorithm
"""
super().initialize(algo)
self._data = []
[docs]
def update(self, algo, fres, pres=None):
"""
Updates data based on current iteration
Parameters
----------
algo: foxes.algorithms.sequential.Sequential
The latest sequential algorithm
fres: xarray.Dataset
The latest farm results
pres: xarray.Dataset, optional
The latest point results
"""
super().update(algo, fres, pres)
o = FlowPlots2D(algo, fres)
if self._tfun is not None:
self.pars["title"] = self._tfun(algo.states.counter, algo.states.index()[0])
if self.orientation == "xy":
d = next(o.gen_states_fig_xy(**self.pars, precalc=True))
elif self.orientation == "xz":
d = next(o.gen_states_fig_xz(**self.pars, precalc=True))
elif self.orientation == "yz":
d = next(o.gen_states_fig_yz(**self.pars, precalc=True))
else:
raise KeyError(
f"Unkown orientation '{self.orientation}', choises: xy, xz, yz"
)
# minimize stored data:
od = [d[0], d[1], None]
if len(self._data) == 0:
od[2] = d[2]
of = (
fres
if ("rotor_color" in self.pars and self.pars["rotor_color"] is not None)
else None
)
self._data.append((of, od))
[docs]
def gen_images(self, ax):
"""
Parameters
----------
ax: matplotlib.Axis
The plotting axis
Yields
------
imgs: tuple
The (figure, artists) tuple
"""
fig = ax.get_figure()
gdata = None
while len(self._data):
fres, d = self._data.pop(0)
if d[2] is not None:
gdata = d[2]
o = FlowPlots2D(self.algo, fres)
yield next(
o.gen_states_fig_xy(
**self.pars,
ax=ax,
fig=fig,
ret_im=True,
precalc=(d[0], d[1], gdata),
)
)
del o, fres, d
if (
self.pars.get("vmin", None) is not None
and self.pars.get("vmax", None) is not None
):
self.pars["add_bar"] = False