use crate::theories::{compressible_ns, euler, incompressible_ns, stokes};
use core::fmt::Debug;
use deep_causality_algebra::RealField;
use deep_causality_core::{CausalityError, PropagatingEffect};
use deep_causality_physics::{
AccelerationVector, Density, KinematicViscosity, Velocity3, VelocityGradient,
};
pub fn incompressible_ns_rhs_effect<R>(
u: &Velocity3<R>,
grad_u: &VelocityGradient<R>,
laplacian_u: &[R; 3],
grad_p: &[R; 3],
rho: &Density<R>,
nu: &KinematicViscosity<R>,
body_force_per_mass: &AccelerationVector<R>,
) -> PropagatingEffect<AccelerationVector<R>>
where
R: RealField + Debug + 'static,
{
match incompressible_ns::incompressible_ns_rhs(
u,
grad_u,
laplacian_u,
grad_p,
rho,
nu,
body_force_per_mass,
) {
Ok(a) => PropagatingEffect::pure(a),
Err(e) => PropagatingEffect::from_error(CausalityError::from(e)),
}
}
pub fn euler_momentum_rhs_effect<R>(
u: &Velocity3<R>,
grad_u: &VelocityGradient<R>,
grad_p: &[R; 3],
rho: &Density<R>,
body_force_per_mass: &AccelerationVector<R>,
) -> PropagatingEffect<AccelerationVector<R>>
where
R: RealField + Debug + 'static,
{
match euler::euler_momentum_rhs(u, grad_u, grad_p, rho, body_force_per_mass) {
Ok(a) => PropagatingEffect::pure(a),
Err(e) => PropagatingEffect::from_error(CausalityError::from(e)),
}
}
pub fn stokes_momentum_rhs_effect<R>(
laplacian_u: &[R; 3],
grad_p: &[R; 3],
rho: &Density<R>,
nu: &KinematicViscosity<R>,
body_force_per_mass: &AccelerationVector<R>,
) -> PropagatingEffect<AccelerationVector<R>>
where
R: RealField + Debug + 'static,
{
match stokes::stokes_momentum_rhs(laplacian_u, grad_p, rho, nu, body_force_per_mass) {
Ok(a) => PropagatingEffect::pure(a),
Err(e) => PropagatingEffect::from_error(CausalityError::from(e)),
}
}
pub fn compressible_ns_continuity_rhs_effect<R>(
rho: &Density<R>,
u: &Velocity3<R>,
grad_rho: &[R; 3],
div_u: R,
) -> PropagatingEffect<R>
where
R: RealField + Debug + Default + 'static,
{
PropagatingEffect::pure(compressible_ns::compressible_ns_continuity_rhs(
rho, u, grad_rho, div_u,
))
}
pub fn compressible_ns_momentum_rhs_effect<R>(
u: &Velocity3<R>,
grad_u: &VelocityGradient<R>,
grad_p: &[R; 3],
div_tau: &[R; 3],
rho: &Density<R>,
body_force_per_mass: &AccelerationVector<R>,
) -> PropagatingEffect<AccelerationVector<R>>
where
R: RealField + Debug + 'static,
{
match compressible_ns::compressible_ns_momentum_rhs(
u,
grad_u,
grad_p,
div_tau,
rho,
body_force_per_mass,
) {
Ok(a) => PropagatingEffect::pure(a),
Err(e) => PropagatingEffect::from_error(CausalityError::from(e)),
}
}
#[allow(clippy::too_many_arguments)]
pub fn compressible_ns_energy_rhs_effect<R>(
rho: &Density<R>,
u: &Velocity3<R>,
div_rho_u_e: R,
div_p_u: R,
div_tau_dot_u: R,
div_q: R,
body_force_per_mass: &AccelerationVector<R>,
) -> PropagatingEffect<R>
where
R: RealField + Debug + Default + 'static,
{
PropagatingEffect::pure(compressible_ns::compressible_ns_energy_rhs(
rho,
u,
div_rho_u_e,
div_p_u,
div_tau_dot_u,
div_q,
body_force_per_mass,
))
}