use parse_monitors::{Mirror, Monitors, MonitorsLoader};
use structopt::StructOpt;
#[derive(Debug, StructOpt)]
#[structopt(name = "parse-monitors", about = "Parsing Star-CCM+ monitors")]
struct Opt {
path: String,
#[structopt(short, long)]
monitor: Option<String>,
#[structopt(short = "x", long)]
exclude: Option<String>,
#[structopt(short, long)]
start: Option<f64>,
#[structopt(short, long)]
end: Option<f64>,
#[structopt(short, long)]
last: Option<usize>,
#[structopt(long)]
csv: Option<String>,
#[structopt(short, long)]
plot: bool,
#[structopt(long)]
local: bool,
#[structopt(long)]
m1_table: bool,
#[structopt(long)]
m1_table_net: bool,
#[structopt(long)]
detrend: bool,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let opt = Opt::from_args();
#[cfg(feature = "b2020")]
let mut loader = MonitorsLoader::<2020>::default();
#[cfg(not(feature = "b2020"))]
let mut loader = MonitorsLoader::<2021>::default();
loader = loader.data_path(&opt.path);
if let Some(arg) = opt.monitor {
loader = loader.header_filter(arg);
}
if let Some(arg) = opt.exclude {
loader = loader.exclude_filter(arg);
}
if let Some(arg) = opt.start {
loader = loader.start_time(arg);
}
if let Some(arg) = opt.end {
loader = loader.end_time(arg);
}
let mut monitors = loader.load()?;
if let Some(arg) = opt.last {
monitors.keep_last(arg);
}
if opt.detrend {
monitors.detrend();
}
if opt.local {
monitors.into_local();
}
monitors.summary();
if opt.plot {
let values: Vec<_> = monitors
.total_forces_and_moments
.iter()
.map(|e| e.force.clone())
.collect();
let plot = complot::Config::new()
.filename("SUM_FORCES.png")
.xaxis(complot::Axis::new().label("Time [s]"))
.yaxis(complot::Axis::new().label("FORCE [N]"))
.legend(vec!["Fx", "Fy", "Fz"]);
Monitors::plot_this_forces(&values, Some(plot));
}
if let Some(filename) = opt.csv {
monitors.to_csv(filename)?;
}
#[cfg(feature = "windloading")]
if opt.m1_covers {
monitors.m1covers_windloads()?;
}
if opt.m1_table {
if let Some(arg) = opt.start {
Mirror::m1(&opt.path).start_time(arg).load()?.summary();
} else {
Mirror::m1(&opt.path).load()?.summary();
};
}
if opt.m1_table_net {
if let Some(arg) = opt.start {
Mirror::m1(&opt.path)
.net_force()
.start_time(arg)
.load()?
.summary();
} else {
Mirror::m1(&opt.path).net_force().load()?.summary();
};
}
Ok(())
}