use crate::error::PhysicsError;
use deep_causality_multivector::{CausalMultiVector, MultiVector};
use deep_causality_num::RealField;
pub fn lorentz_force_kernel<R>(
j: &CausalMultiVector<R>,
b: &CausalMultiVector<R>,
) -> Result<CausalMultiVector<R>, PhysicsError>
where
R: RealField,
{
if j.metric() != b.metric() {
return Err(PhysicsError::DimensionMismatch(format!(
"Metric mismatch in Lorentz Force: {:?} vs {:?}",
j.metric(),
b.metric()
)));
}
let f = j.outer_product(b);
if f.data().iter().any(|v| !v.is_finite()) {
return Err(PhysicsError::NumericalInstability(
"Non-finite value in Lorentz force (J ∧ B)".into(),
));
}
Ok(f)
}