use crate::PhysicsError;
use crate::kernels::fluids::governing::{
continuity_rhs_kernel, convective_acceleration_kernel, pressure_gradient_force_kernel,
};
use crate::kernels::fluids::quantities::{
AccelerationVector, Density, Velocity3, VelocityGradient,
};
use deep_causality_num::RealField;
pub fn compressible_ns_continuity_rhs_kernel<R>(
rho: &Density<R>,
u: &Velocity3<R>,
grad_rho: &[R; 3],
div_u: R,
) -> R
where
R: RealField,
{
continuity_rhs_kernel(rho, u, grad_rho, div_u)
}
pub fn compressible_ns_momentum_rhs_kernel<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>,
) -> Result<AccelerationVector<R>, PhysicsError>
where
R: RealField,
{
let conv = convective_acceleration_kernel(u, grad_u).into_inner();
let press = pressure_gradient_force_kernel(rho, grad_p)?.into_inner();
let inv_rho = R::one() / rho.value();
let g = body_force_per_mass.value();
Ok(AccelerationVector::new_unchecked([
-conv[0] + press[0] + inv_rho * div_tau[0] + g[0],
-conv[1] + press[1] + inv_rho * div_tau[1] + g[1],
-conv[2] + press[2] + inv_rho * div_tau[2] + g[2],
]))
}
pub fn compressible_ns_energy_rhs_kernel<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>,
) -> R
where
R: RealField,
{
let u_raw = u.value();
let g = body_force_per_mass.value();
let u_dot_g = u_raw[0] * g[0] + u_raw[1] * g[1] + u_raw[2] * g[2];
-div_rho_u_e - div_p_u + div_tau_dot_u - div_q + rho.value() * u_dot_g
}