use alloc::format;
use deep_causality_tensor::CausalTensor;
use deep_causality_physics::PhysicsError;
use deep_causality_physics::SolenoidalField;
use deep_causality_physics::VelocityOneForm;
use super::DecNsSolver;
use crate::solvers::dec::DecNsScalar;
impl<const D: usize, R: DecNsScalar> DecNsSolver<'_, D, R> {
pub fn seed_from_vertex_vectors(
&self,
vertex_vectors: &CausalTensor<R>,
) -> Result<SolenoidalField<R>, PhysicsError> {
let edge_form = self
.manifold
.de_rham(vertex_vectors)
.map_err(|e| PhysicsError::TopologyError(format!("de Rham seeding failed: {e}")))?;
self.project_seed(edge_form)
}
pub fn seed_from_edge_integrals(
&self,
edge_integrals: &CausalTensor<R>,
) -> Result<SolenoidalField<R>, PhysicsError> {
let edge_form = self
.manifold
.de_rham_from_integrals(edge_integrals)
.map_err(|e| {
PhysicsError::TopologyError(format!("de Rham integral seeding failed: {e}"))
})?;
self.project_seed(edge_form)
}
fn project_seed(&self, edge_form: CausalTensor<R>) -> Result<SolenoidalField<R>, PhysicsError> {
let velocity = VelocityOneForm::new(edge_form, self.manifold)?;
let (state, _potential) = SolenoidalField::from_open_leray_projection_weighted_opts(
&velocity,
self.manifold,
self.rate.no_slip_edges(),
self.rate.inflow_edges(),
self.rate.reference_vertices(),
self.rate.no_slip_rows(),
&self.cg_options,
None,
)?;
let state = state
.constrain_edges(self.rate.no_slip_edges())
.with_lift(&self.lift);
Ok(state)
}
}