Source code for fluidsim_core.output.remaining_clock_time

"""Helper to plot remaining clock time data

Provides:

.. autoclass:: RemainingClockTime
   :members:
   :private-members:
   :undoc-members:

"""

from abc import ABCMeta, abstractmethod
from datetime import timedelta

import numpy as np
import matplotlib.pyplot as plt


[docs] class RemainingClockTime(metaclass=ABCMeta):
[docs] @abstractmethod def _load_times(self): """Load remaining time data. - equation_times - remaining_clock_times - clock_times_per_timestep - equation_time_start - full_clock_time """
[docs] def plot_clock_times(self): """Plot the estimated full clock time and clock time per time step.""" results = self._load_times() equation_times = results["equation_times"] if len(equation_times) == 0: print("No time data in the log file. Can't plot anything.") return fig, axes = plt.subplots(2, 1, sharex=True) remaining_clock_times = results["remaining_clock_times"] ax = axes[0] ax.plot(equation_times, remaining_clock_times) ax.set_ylabel("estimated full clock time (s)") if remaining_clock_times[-1] > 0.05 * np.nanmax(remaining_clock_times): last_remaining = remaining_clock_times[-1] ax.plot( equation_times[-1], last_remaining, "rx", label=( f"Last estimation {timedelta(seconds=int(last_remaining))}" ), ) ax.legend() clock_times_per_timestep = results["clock_times_per_timestep"] if clock_times_per_timestep[-1] <= 0.0: equation_times = equation_times[:-1] clock_times_per_timestep = clock_times_per_timestep[:-1] times2 = np.empty(2 * equation_times.size) times2[0] = results["equation_time_start"] times2[1::2] = equation_times times2[2::2] = equation_times[:-1] clock_times_per_timestep2 = np.zeros_like(times2) clock_times_per_timestep2[::2] = clock_times_per_timestep clock_times_per_timestep2[1::2] = clock_times_per_timestep ax = axes[1] ax.plot(times2, clock_times_per_timestep2) ax.set_xlabel("equation time") ax.set_ylabel("clock time per time step (s)") full_clock_time = results["full_clock_time"] ax.set_title( f"Full clock time: {timedelta(seconds=int(full_clock_time))}" ) for ax in axes: ax.set_ylim(bottom=0) fig.suptitle(self.output.summary_simul, fontsize=8) fig.tight_layout() print( "Mean clock time per time step: " f"{np.nanmean(clock_times_per_timestep2):.3g} s" )