diff --git a/swash/processing/post.py b/swash/processing/post.py new file mode 100644 index 0000000..8cead73 --- /dev/null +++ b/swash/processing/post.py @@ -0,0 +1,100 @@ +import configparser +import pathlib +import argparse +import logging + +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +import scipy.signal as sgl + +from .read_swash import * + + +parser = argparse.ArgumentParser(description="Post-process swash output") +parser.add_argument("-v", "--verbose", action="count", default=0) +args = parser.parse_args() + +logging.basicConfig(level=max((10, 20 - 10 * args.verbose))) +log = logging.getLogger("post") + +log.info("Starting post-processing") +config = configparser.ConfigParser() +config.read("config.ini") + +cache = pathlib.Path(config.get("data", "out")) +root = pathlib.Path(config.get("swash", "out")) + +log.info(f"Reading bathymetry from '{cache}'") +bathy = pd.read_hdf(cache.joinpath("bathy.h5"), "bathy") +n = bathy.index.size + +log.info(f"Reading swash output from '{root}'") +botl = read_nohead_scalar(root.joinpath("botl.dat"), n) +dep = np.maximum(0, read_nohead_scalar(root.joinpath("dep.dat"), n)) +vel = read_nohead_vect(root.joinpath("vel.dat"), n) + +dt = config.getfloat("post", "dt") +n_t = botl.shape[0] +t = np.arange(0, n_t * dt, dt) + +# Cospectral calculations +x0 = config.getint("post", "x0") +t0 = config.getint("post", "t0") +f = 1 / dt +log.info(f"Computing reflection coefficient at x={x0}") + +eta = (dep - botl)[t > t0, x0] +u = vel[t > t0, 0, x0] + +phi_eta = np.abs(sgl.csd(eta, eta, f)) +phi_u = np.abs(sgl.csd(u, u, f)) +phi_eta_u = np.abs(sgl.csd(eta, u, f)) + +R = np.sqrt( + (phi_eta[1] + phi_u[1] - 2 * phi_eta_u[1]) + / (phi_eta[1] + phi_u[1] + 2 * phi_eta_u[1]) +) + +# Plotting +log.info("Plotting results") +fig, (ax_dep, ax_vel) = plt.subplots(2) + +ax_dep.plot(t, (dep - botl)[:, x0], label="dep") +ax_dep.set(xlabel="t (s)", ylabel="z (m)") +ax_dep.autoscale(axis="x", tight=True) +ax_dep.grid() +ax_dep.axvline(t0, c="k", alpha=0.2) + +ax_vel.plot(t, vel[:, 0, x0], label="vel") +ax_vel.set(xlabel="t (s)", ylabel="U (m/s)") +ax_vel.autoscale(axis="x", tight=True) +ax_vel.grid() +ax_vel.axvline(t0, c="k", alpha=0.2) + +fig.tight_layout() + +fig_r, ax_r = plt.subplots() + +ax_r.plot(phi_eta[0], R) +ax_r.autoscale(axis="x", tight=True) +ax_r.set(ylim=(0, 1), xlabel="f (Hz)", ylabel="R") +ax_r.grid() + +fig_x, ax_x = plt.subplots() +ax_x.plot(-botl[0, :], color="k") +ax_x.plot((dep - botl)[t == t0, :].T) +ax_x.axvline(x0, c="k", alpha=0.2) +ax_x.set(xlabel="x (m)", ylabel="z (m)") +ax_x.autoscale(axis="x", tight=True) +ax_x.grid() + +out = pathlib.Path(config.get("post", "out")) +log.info(f"Saving plots in '{out}'") +out.mkdir(exist_ok=True) + +fig.savefig(out.joinpath(f"t{x0}.png")) +fig_r.savefig(out.joinpath(f"R{x0}.png")) +fig_x.savefig(out.joinpath(f"x{t0}.png")) + +log.info("Finished post-processing")