use crate::kernels::mhd::quantities::{AlfvenSpeed, Diffusivity};
use crate::{PhysicsError, Speed};
use core::fmt::Debug;
use deep_causality_num::{FromPrimitive, RealField};
use deep_causality_tensor::CausalTensor;
use deep_causality_topology::SimplicialManifold;
pub fn resistive_diffusion_kernel<R>(
b_manifold: &SimplicialManifold<R, R>,
diffusivity: Diffusivity<R>,
) -> Result<CausalTensor<R>, PhysicsError>
where
R: RealField + FromPrimitive + Default + PartialEq + Debug,
{
let eta = diffusivity.value();
if eta < R::zero() {
return Err(PhysicsError::PhysicalInvariantBroken(
"Diffusivity cannot be negative".into(),
));
}
let laplacian = b_manifold.laplacian(2);
let rate = laplacian * (-eta);
Ok(rate)
}
pub fn magnetic_reconnection_rate_kernel<R>(
alfven_speed: AlfvenSpeed<R>,
lundquist: R,
) -> Result<Speed<R>, PhysicsError>
where
R: RealField,
{
let va = alfven_speed.value();
if lundquist <= R::zero() {
return Err(PhysicsError::Singularity(
"Lundquist number must be positive for reconnection".into(),
));
}
let vin = va / lundquist.sqrt();
Speed::new(vin)
}