use std::fmt::Display;
use clap::ValueEnum;
use crate::kernel::muskingum::rs_route::*;
#[allow(clippy::too_many_arguments, non_snake_case)]
pub mod t_route;
pub mod rs_route {
#[allow(clippy::too_many_arguments, non_snake_case, unused)]
pub mod mc_kernel;
}
#[allow(clippy::too_many_arguments, non_snake_case)]
pub mod c_mc;
#[repr(C)]
#[derive(Default)]
pub struct MuskingumCungeInput {
pub dt: f32,
pub qup: f32,
pub quc: f32,
pub qdp: f32,
pub ql: f32,
pub dx: f32,
pub bw: f32,
pub tw: f32,
pub tw_cc: f32,
pub n: f32,
pub n_cc: f32,
pub cs: f32,
pub s0: f32,
pub velp: f32,
pub depthp: f32,
}
#[repr(C)]
#[derive(Default, Debug)]
pub struct MuskingumCungeResult {
pub qdc: f32,
pub velc: f32,
pub depthc: f32,
pub ck: f32,
pub cn: f32,
pub x: f32,
}
#[derive(Clone, Copy, Debug, ValueEnum)]
pub enum MuskingumCungeKernel {
RouteRs,
TRouteModernized,
TRouteLegacy,
CMuskingumCunge,
}
macro_rules! call_kernel {
($fn:path, $i:expr, $courant:expr) => {
$fn(
$i.qup, $i.quc, $i.qdp, $i.ql, $i.dt, $i.s0, $i.dx, $i.n, $i.cs, $i.bw, $i.tw,
$i.tw_cc, $i.n_cc, $i.depthp, $courant,
)
};
}
impl MuskingumCungeKernel {
pub fn exec(
self,
input: &MuskingumCungeInput,
calculate_courant: bool,
) -> MuskingumCungeResult {
match self {
MuskingumCungeKernel::RouteRs => {
call_kernel!(mc_kernel::muskingum_cunge, input, calculate_courant)
}
MuskingumCungeKernel::TRouteModernized => call_kernel!(
t_route::fortran_modernized::submuskingcunge,
input,
calculate_courant
),
MuskingumCungeKernel::TRouteLegacy => call_kernel!(
t_route::fortran_legacy::submuskingcunge,
input,
calculate_courant
),
MuskingumCungeKernel::CMuskingumCunge => {
call_kernel!(c_mc::submuskingcunge, input, calculate_courant)
}
}
}
}
impl Display for MuskingumCungeKernel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
match self {
MuskingumCungeKernel::RouteRs => "route-rs",
MuskingumCungeKernel::TRouteModernized => "t-route-modernized",
MuskingumCungeKernel::TRouteLegacy => "t-route-legacy",
MuskingumCungeKernel::CMuskingumCunge => "c-muskingum-cunge",
}
)
}
}