1
Fork 0
internship/swash/processing/post.py

100 lines
2.6 KiB
Python

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")