import argparse import gzip from itertools import starmap import logging from multiprocessing import pool import pathlib import pickle from cycler import cycler import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec import numpy as np from scipy import interpolate from .olaflow import OFModel parser = argparse.ArgumentParser(description="Post-process olaflow results") parser.add_argument("-v", "--verbose", action="count", default=0) parser.add_argument( "-o", "--output", action="append", type=pathlib.Path, help="Post-processing directory", required=True, ) parser.add_argument( "-t", "--timestep", type=float, help="Time-step to compare", ) parser.add_argument( "-f", "--func", type=str, help="Post-process function to compare", default="graphUniform", ) args = parser.parse_args() logging.basicConfig(level=max((10, 20 - 10 * args.verbose))) log = logging.getLogger("ola_post") log.info("Plotting comparison of model output") def get_pickle(out): with ( path.open("rb") if (path := out.joinpath("pickle")).exists() else gzip.open(path.with_suffix(".gz"), "rb") ) as f: return pickle.load(f) models = list(map(get_pickle, args.output)) fig, ax = plt.subplots(len(models), figsize=(6, 1.5 * len(models)), dpi=100, constrained_layout=True) if args.timestep is None: for i, (_ax, _model) in enumerate(zip(ax, models)): _ax.contour( _model.t, _model.post_fields[args.func]["x_alpha.water"], _model.post_fields[args.func]["alpha.water"].T, (0.5,), colors="k", ) _ax.set(xlabel="t (s)", ylabel="z (m)", title=f"Case {i}") _ax.grid() fig.savefig( args.output[0].joinpath( f"diff_{args.func}_{'_'.join([o.name for o in args.output])}.pdf" ) ) else: for i, (_ax, _model) in enumerate(zip(ax, models)): _ax.tricontour( _model.x, _model.z, _model.fields["alpha.water"][np.where(_model.t == args.timestep)[0]][0], levels=(0.5,), colors="k", ) _ax.set(xlabel="x (m)", ylabel="z (m)", title=f"Case {i}") _ax.grid() fig.savefig( args.output[0].joinpath( f"diff_t{args.timestep}_{'_'.join([o.name for o in args.output])}.pdf" ) )