Source code for foxes.output.seq_plugins.seq_wake_debug_plugin

from foxes.algorithms.sequential import SequentialPlugin
from foxes.models.wake_frames.seq_dynamic_wakes import SeqDynamicWakes


[docs] class SeqWakeDebugPlugin(SequentialPlugin): """ Plugin for creating wake debug plots in animations Attributes ---------- show_p: bool Flag for showing wake points show_v: bool Flag for showing wake vectors vpars: dict Additional parameters for vector lines ppars: dict Additional parameters for point scatter :group: output.seq_plugins """
[docs] def __init__(self, show_p=True, show_v=True, vpars={}, **ppars): """ Constructor. Parameters ---------- show_p: bool Flag for showing wake points show_v: bool Flag for showing wake vectors vpars: dict Additional parameters for vector lines ppars: dict, optional Additional parameters for point scatter """ super().__init__() self.show_p = show_p self.show_v = show_v self.vpars = dict(color="blue") self.vpars.update(vpars) self.ppars = dict(color="blue") self.ppars.update(ppars)
[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) wframe = algo.wake_frame if not isinstance(wframe, SeqDynamicWakes): raise ValueError( f"Wake frame not of type SeqDynamicWakes, got {type(algo.wake_frame).__name__}" ) counter = algo.counter N = counter + 1 dt = wframe._dt[counter] if counter < len(wframe._dt) else wframe._dt[-1] self._data.append( ( dt, wframe._traces_p[:N].copy(), wframe._traces_v[:N].copy(), ) )
[docs] def gen_images(self, ax): """ Parameters ---------- ax: matplotlib.Axis The plotting axis Yields ------ imgs: tuple The (figure, artists) tuple """ while len(self._data): dt, pts, v = self._data.pop(0) N = len(pts) artists = [] if self.show_p: artists += [ ax.scatter( pts[:, downwind_index, 0], pts[:, downwind_index, 1], animated=True, **self.ppars, ) for downwind_index in range(self.algo.n_turbines) ] if self.show_v: for downwind_index in range(self.algo.n_turbines): for i in range(N): p = pts[i, downwind_index] dxy = v[i, downwind_index] * dt artists.append( ax.arrow( p[0], p[1], dxy[0], dxy[1], length_includes_head=True, animated=True, **self.vpars, ) ) yield ax.get_figure(), artists