pub mod body_force_one_form;
pub mod pressure_zero_form;
pub mod solenoidal_field;
pub mod velocity_one_form;
pub mod vorticity_two_form;
use alloc::format;
use deep_causality_algebra::RealField;
use deep_causality_tensor::CausalTensor;
use deep_causality_topology::{ChainComplex, LatticeComplex, Manifold};
use crate::error::physics_error::PhysicsError;
pub(crate) fn validate_graded_field<const D: usize, R>(
field: &CausalTensor<R>,
grade: usize,
type_name: &str,
manifold: &Manifold<LatticeComplex<D, R>, R>,
) -> Result<(), PhysicsError>
where
R: RealField,
{
let expected = manifold.complex().num_cells(grade);
if field.len() != expected {
return Err(PhysicsError::DimensionMismatch(format!(
"{type_name}: expected {expected} grade-{grade} coefficients, got {}",
field.len()
)));
}
if let Some(idx) = field.as_slice().iter().position(|v| !v.is_finite()) {
return Err(PhysicsError::NumericalInstability(format!(
"{type_name}: non-finite coefficient at index {idx}"
)));
}
Ok(())
}