use crate::MU0_OVER_4PI;
use crate::math::Scalar;
use crate::math::{cross3, dot3, max_scalar};
const CURRENT_ELEMENT_MIN_DISTANCE: f64 = 1e-14;
const CURRENT_ELEMENT_MIN_DISTANCE_SQ: f64 =
CURRENT_ELEMENT_MIN_DISTANCE * CURRENT_ELEMENT_MIN_DISTANCE;
#[inline]
pub(crate) fn flux_density_current_element_scalar<T: Scalar>(
src: [T; 3],
moment: [T; 3],
obs: [T; 3],
) -> [T; 3] {
let r = [obs[0] - src[0], obs[1] - src[1], obs[2] - src[2]]; let r_sq = dot3(r, r); let min_distance_sq = crate::math::cast::<T>(CURRENT_ELEMENT_MIN_DISTANCE_SQ);
let near = r_sq < min_distance_sq; let rnorm3_inv = max_scalar(r_sq, min_distance_sq).powf(crate::math::cast::<T>(-1.5)); let m_cross_r = cross3(moment, r); let c = crate::math::cast::<T>(MU0_OVER_4PI);
let out = [
c * m_cross_r[0] * rnorm3_inv, c * m_cross_r[1] * rnorm3_inv, c * m_cross_r[2] * rnorm3_inv, ];
if near { [T::ZERO; 3] } else { out }
}
#[inline]
pub(crate) fn vector_potential_current_element_scalar<T: Scalar>(
src: [T; 3],
moment: [T; 3],
obs: [T; 3],
) -> [T; 3] {
let r = [obs[0] - src[0], obs[1] - src[1], obs[2] - src[2]]; let r_sq = dot3(r, r); let min_distance = crate::math::cast::<T>(CURRENT_ELEMENT_MIN_DISTANCE);
let min_distance_sq = crate::math::cast::<T>(CURRENT_ELEMENT_MIN_DISTANCE_SQ);
let near = r_sq < min_distance_sq; let rmag = max_scalar(r_sq.sqrt(), min_distance); let c = crate::math::cast::<T>(MU0_OVER_4PI);
let out = [
c * moment[0] / rmag, c * moment[1] / rmag, c * moment[2] / rmag, ];
if near { [T::ZERO; 3] } else { out }
}