use crate::MU0_OVER_4PI;
use crate::math::{cross3, dot3};
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(
src: [f64; 3],
moment: [f64; 3],
obs: [f64; 3],
) -> [f64; 3] {
let r = [obs[0] - src[0], obs[1] - src[1], obs[2] - src[2]]; let r_sq = dot3(r[0], r[1], r[2], r[0], r[1], r[2]); let near = r_sq < CURRENT_ELEMENT_MIN_DISTANCE_SQ; let rnorm3_inv = r_sq.max(CURRENT_ELEMENT_MIN_DISTANCE_SQ).powf(-1.5); let m_cross_r = cross3(moment[0], moment[1], moment[2], r[0], r[1], r[2]); let out = [
MU0_OVER_4PI * m_cross_r.0 * rnorm3_inv, MU0_OVER_4PI * m_cross_r.1 * rnorm3_inv, MU0_OVER_4PI * m_cross_r.2 * rnorm3_inv, ];
if near { [0.0, 0.0, 0.0] } else { out }
}
#[inline]
pub(crate) fn vector_potential_current_element_scalar(
src: [f64; 3],
moment: [f64; 3],
obs: [f64; 3],
) -> [f64; 3] {
let r = [obs[0] - src[0], obs[1] - src[1], obs[2] - src[2]]; let r_sq = dot3(r[0], r[1], r[2], r[0], r[1], r[2]); let near = r_sq < CURRENT_ELEMENT_MIN_DISTANCE_SQ; let rmag = r_sq.sqrt().max(CURRENT_ELEMENT_MIN_DISTANCE); let out = [
MU0_OVER_4PI * moment[0] / rmag, MU0_OVER_4PI * moment[1] / rmag, MU0_OVER_4PI * moment[2] / rmag, ];
if near { [0.0, 0.0, 0.0] } else { out }
}