Post-process for sensors
This commit is contained in:
parent
ac74d4490c
commit
028b9db8b7
2 changed files with 116 additions and 0 deletions
1
post_process/.gitignore
vendored
1
post_process/.gitignore
vendored
|
@ -1 +1,2 @@
|
|||
local.hdf
|
||||
/out
|
||||
|
|
115
post_process/post_process/__main__.py
Normal file
115
post_process/post_process/__main__.py
Normal file
|
@ -0,0 +1,115 @@
|
|||
from pprint import pp
|
||||
import logging
|
||||
import configparser
|
||||
from pathlib import Path
|
||||
import re
|
||||
from multiprocessing.pool import ThreadPool
|
||||
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
import fluidfoam
|
||||
|
||||
logging.basicConfig(level='INFO')
|
||||
log = logging.getLogger('post_process')
|
||||
|
||||
config = configparser.ConfigParser()
|
||||
config.read('config.ini')
|
||||
|
||||
root = Path(config.get('main', 'root')).expanduser()
|
||||
cases = config.get('main', 'cases').split(',')
|
||||
case_root = root.joinpath(cases[0])
|
||||
|
||||
if config.getboolean('main', 'loaddata', fallback=False):
|
||||
mesh = fluidfoam.readmesh(str(case_root))
|
||||
|
||||
t = []
|
||||
for item in case_root.iterdir():
|
||||
if item.is_dir() and re.fullmatch(r'[0-9]+(\.[0-9]+)?', item.name):
|
||||
t.append(item.name)
|
||||
timesteps = pd.Series(t, dtype='float', name='t', index=t)\
|
||||
.sort_values()
|
||||
timesteps.drop('0', inplace=True)
|
||||
|
||||
data = {}
|
||||
with pd.HDFStore(
|
||||
Path(config.get('main', 'savefile')),
|
||||
mode='w',
|
||||
complib='blosc',
|
||||
) as hdf:
|
||||
hdf.put('timesteps', timesteps)
|
||||
hdf.put('mesh', pd.DataFrame(mesh, index=('x', 'y', 'z')).T)
|
||||
for case in cases:
|
||||
with ThreadPool(
|
||||
config.getint('main', 'nthreads', fallback=1)
|
||||
) as pool:
|
||||
sensor = dict(zip(timesteps, pool.map(
|
||||
lambda t:np.apply_along_axis(
|
||||
lambda x:np.sqrt((x**2).sum()),
|
||||
0,
|
||||
fluidfoam.readvector(
|
||||
root.joinpath(case),
|
||||
t,
|
||||
config.get('sensor', 'value')
|
||||
),
|
||||
),
|
||||
timesteps.index
|
||||
)))
|
||||
|
||||
hdf.put(case, pd.DataFrame(sensor))
|
||||
del sensor
|
||||
|
||||
with pd.HDFStore(
|
||||
Path(config.get('bathy', 'source')),
|
||||
mode='r',
|
||||
) as bathy:
|
||||
rubble_line = bathy.get('rubble')
|
||||
|
||||
|
||||
with pd.HDFStore(
|
||||
Path(config.get('main', 'savefile')),
|
||||
mode='r',
|
||||
) as data:
|
||||
timesteps = data.get('timesteps')
|
||||
mesh = data.get('mesh')
|
||||
rawxs = config.get('sensor', 'x').split(',')
|
||||
fig, ax = plt.subplots(len(rawxs))
|
||||
figmax = config.getfloat('figure', 'max')
|
||||
for axi, rawx in zip(ax, rawxs):
|
||||
x0 = float(rawx)
|
||||
y0 = rubble_line.iloc[np.abs(x0-rubble_line.index).argmin()]
|
||||
pp((x0,y0))
|
||||
|
||||
sensor_id = ((mesh.x-x0)**2+(mesh.y-y0)**2).argmin()
|
||||
pp(mesh.iloc[sensor_id])
|
||||
|
||||
sensor_data = pd.DataFrame(index=timesteps)
|
||||
for case, title, color, ls \
|
||||
in zip(
|
||||
cases,
|
||||
config.get('main', 'case_titles').split(';'),
|
||||
config.get('main', 'case_colors').split(','),
|
||||
config.get('main', 'case_ls').split(','),
|
||||
):
|
||||
sensor_data = pd.concat((
|
||||
sensor_data,
|
||||
data.get(case).iloc[sensor_id].rename(case),
|
||||
), axis=1)
|
||||
axi.plot(
|
||||
sensor_data.index,
|
||||
sensor_data[case],
|
||||
label=title,
|
||||
color=color,
|
||||
ls=ls,
|
||||
)
|
||||
axi.legend()
|
||||
axi.grid()
|
||||
axi.set(
|
||||
xlabel='t (s)',
|
||||
ylabel='U (m/s)',
|
||||
xlim=(0,timesteps.max()),
|
||||
ylim=(0,figmax),
|
||||
)
|
||||
fig.savefig(config.get('figure', 'save'))
|
||||
plt.show()
|
Reference in a new issue