use crate::CfdScalar;
use crate::solvers::dec::DecNsRate;
use crate::traits::FluidTheory;
use crate::types::Ambient;
use deep_causality_physics::{PhysicsError, VelocityOneForm};
use deep_causality_topology::HodgeDecomposeOptions;
#[derive(Debug)]
pub struct DecIncompressible<'m, const D: usize, R: CfdScalar> {
rate: DecNsRate<'m, D, R>,
opts: HodgeDecomposeOptions<R>,
}
impl<'m, const D: usize, R: CfdScalar> DecIncompressible<'m, D, R> {
pub fn new(rate: DecNsRate<'m, D, R>, opts: HodgeDecomposeOptions<R>) -> Self {
Self { rate, opts }
}
pub fn rate(&self) -> &DecNsRate<'m, D, R> {
&self.rate
}
}
impl<'m, const D: usize, R: CfdScalar> FluidTheory<R> for DecIncompressible<'m, D, R> {
type State = VelocityOneForm<R>;
type Ambient = Ambient<R>;
fn rate(
&self,
state: &VelocityOneForm<R>,
ambient: &Ambient<R>,
) -> Result<VelocityOneForm<R>, PhysicsError> {
self.rate.set_nu(*ambient.nu());
self.rate.eval_projected(state, &self.opts)
}
}