"""Physical fields output 1d
============================
Provides:
.. autoclass:: MoviesBasePhysFields1D
:members:
:private-members:
:undoc-members:
.. autoclass:: PhysFieldsBase1D
:members:
:private-members:
:undoc-members:
"""
import numpy as np
from fluiddyn.util import mpi
from fluidsim_core.output.movies import MoviesBase1D
from .phys_fields import PhysFieldsBase
[docs]
class MoviesBasePhysFields1D(MoviesBase1D):
def __init__(self, output, phys_fields):
self.phys_fields = phys_fields
super().__init__(output)
self._equation = None
[docs]
class PhysFieldsBase1D(PhysFieldsBase):
_cls_movies = MoviesBasePhysFields1D
[docs]
def plot(self, field=None, time=None, numfig=None):
is_field_ready = False
key_field = None
if field is None:
key_field = self.get_key_field_to_plot(
forbid_compute=time is not None
)
elif isinstance(field, np.ndarray):
key_field = "given array"
is_field_ready = True
elif isinstance(field, str):
key_field = field
assert key_field is not None
if time is None and not is_field_ready:
# we have to get the field from the state
time = self.sim.time_stepping.t
field, _ = self.get_field_to_plot_from_state(key_field)
else:
self.set_of_phys_files.update_times()
# we have to get the field from a file
if key_field not in self.sim.state.keys_state_phys:
raise ValueError("key not in state.keys_state_phys")
field, time = self.get_field_to_plot(key=key_field, time=time)
if mpi.rank == 0:
if numfig is None:
fig, ax = self.output.figure_axe(size_axe=None)
else:
fig, ax = self.output.figure_axe(numfig=numfig, size_axe=None)
xs = self.oper.xs
ax.plot(xs, field)
ax.set_xlabel("x")
self._set_title(ax, key_field, time)
[docs]
def _set_title(self, ax, key, time):
ax.set_title(key + f", $t = {time:.3f}$\n" + self.output.summary_simul)