Skip to main content

deep_causality_physics/kernels/mhd/
wrappers.rs

1/*
2 * SPDX-License-Identifier: MIT
3 * Copyright (c) 2023 - 2026. The DeepCausality Authors and Contributors. All Rights Reserved.
4 */
5
6use crate::kernels::mhd::{grmhd, ideal, plasma, resistive};
7use crate::{
8    AlfvenSpeed, DebyeLength, Diffusivity, ElectronDensity, LarmorRadius, MagneticPressure,
9    PlasmaFrequency,
10};
11use crate::{Density, Mass, PhysicalField, Speed, Temperature};
12use core::fmt::Debug;
13use deep_causality_algebra::RealField;
14use deep_causality_core::{CausalityError, PropagatingEffect};
15use deep_causality_num::FromPrimitive;
16use deep_causality_par::MaybeParallel;
17use deep_causality_tensor::CausalTensor;
18use deep_causality_topology::SimplicialManifold;
19
20// ============================================================================
21// Ideal MHD Wrappers
22// ============================================================================
23
24pub fn alfven_speed<R>(
25    b: &PhysicalField<R>,
26    rho: &Density<R>,
27    mu0: R,
28) -> PropagatingEffect<AlfvenSpeed<R>>
29where
30    R: RealField + MaybeParallel + Debug,
31{
32    match ideal::alfven_speed_kernel(b, rho, mu0) {
33        Ok(v) => PropagatingEffect::pure(v),
34        Err(e) => PropagatingEffect::from_error(CausalityError::from(e)),
35    }
36}
37
38pub fn magnetic_pressure<R>(b: &PhysicalField<R>, mu0: R) -> PropagatingEffect<MagneticPressure<R>>
39where
40    R: RealField + MaybeParallel + FromPrimitive + Debug,
41{
42    match ideal::magnetic_pressure_kernel(b, mu0) {
43        Ok(p) => PropagatingEffect::pure(p),
44        Err(e) => PropagatingEffect::from_error(CausalityError::from(e)),
45    }
46}
47
48pub fn ideal_induction<R>(
49    v: &SimplicialManifold<R, R>,
50    b: &SimplicialManifold<R, R>,
51) -> PropagatingEffect<CausalTensor<R>>
52where
53    R: RealField + MaybeParallel + FromPrimitive + Default + PartialEq + Debug,
54{
55    match ideal::ideal_induction_kernel(v, b) {
56        Ok(t) => PropagatingEffect::pure(t),
57        Err(e) => PropagatingEffect::from_error(CausalityError::from(e)),
58    }
59}
60
61// ============================================================================
62// Resistive MHD Wrappers
63// ============================================================================
64
65pub fn resistive_diffusion<R>(
66    b: &SimplicialManifold<R, R>,
67    eta: Diffusivity<R>,
68) -> PropagatingEffect<CausalTensor<R>>
69where
70    R: RealField + MaybeParallel + FromPrimitive + Default + PartialEq + Debug,
71{
72    match resistive::resistive_diffusion_kernel(b, eta) {
73        Ok(t) => PropagatingEffect::pure(t),
74        Err(e) => PropagatingEffect::from_error(CausalityError::from(e)),
75    }
76}
77
78pub fn magnetic_reconnection_rate<R>(va: AlfvenSpeed<R>, s: R) -> PropagatingEffect<Speed<R>>
79where
80    R: RealField + MaybeParallel + Debug,
81{
82    match resistive::magnetic_reconnection_rate_kernel(va, s) {
83        Ok(v) => PropagatingEffect::pure(v),
84        Err(e) => PropagatingEffect::from_error(CausalityError::from(e)),
85    }
86}
87
88// ============================================================================
89// GRMHD Wrappers
90// ============================================================================
91
92use crate::LorentzianMetric;
93
94/// Wrapper for relativistic current density calculation.
95///
96/// Computes J = ★d★F using differential forms on the manifold.
97pub fn relativistic_current<R, M>(
98    em_manifold: &SimplicialManifold<R, R>,
99    spacetime_metric: &M,
100) -> PropagatingEffect<CausalTensor<R>>
101where
102    R: RealField + MaybeParallel + FromPrimitive + Default + PartialEq + Debug,
103    M: LorentzianMetric,
104{
105    match grmhd::relativistic_current_kernel(em_manifold, spacetime_metric) {
106        Ok(j) => PropagatingEffect::pure(j),
107        Err(e) => PropagatingEffect::from_error(CausalityError::from(e)),
108    }
109}
110
111pub fn energy_momentum_tensor_em<R>(
112    em: &CausalTensor<R>,
113    metric: &CausalTensor<R>,
114) -> PropagatingEffect<CausalTensor<R>>
115where
116    R: RealField + MaybeParallel + FromPrimitive + core::iter::Sum + Default + PartialOrd + Debug,
117{
118    match grmhd::energy_momentum_tensor_em_kernel(em, metric) {
119        Ok(t) => PropagatingEffect::pure(t),
120        Err(e) => PropagatingEffect::from_error(CausalityError::from(e)),
121    }
122}
123
124// ============================================================================
125// Plasma Wrappers
126// ============================================================================
127
128pub fn debye_length<R>(t: Temperature<R>, n: R, eps0: R, e: R) -> PropagatingEffect<DebyeLength<R>>
129where
130    R: RealField + MaybeParallel + FromPrimitive + Debug,
131{
132    match plasma::debye_length_kernel(t, n, eps0, e) {
133        Ok(l) => PropagatingEffect::pure(l),
134        Err(e) => PropagatingEffect::from_error(CausalityError::from(e)),
135    }
136}
137
138pub fn larmor_radius<R>(
139    m: Mass<R>,
140    v: Speed<R>,
141    q: R,
142    b: &PhysicalField<R>,
143) -> PropagatingEffect<LarmorRadius<R>>
144where
145    R: RealField + MaybeParallel + Debug,
146{
147    match plasma::larmor_radius_kernel(m, v, q, b) {
148        Ok(r) => PropagatingEffect::pure(r),
149        Err(e) => PropagatingEffect::from_error(CausalityError::from(e)),
150    }
151}
152
153pub fn plasma_frequency<R>(n_e: ElectronDensity<R>) -> PropagatingEffect<PlasmaFrequency<R>>
154where
155    R: RealField + MaybeParallel + FromPrimitive + Debug,
156{
157    match plasma::plasma_frequency_kernel(n_e) {
158        Ok(w) => PropagatingEffect::pure(w),
159        Err(e) => PropagatingEffect::from_error(CausalityError::from(e)),
160    }
161}