use num_complex::Complex;
use super::{CoefficientDerivatives, MieSolution};
use crate::scalar::Real;
#[derive(Clone, Copy, Debug)]
pub(crate) struct Coefficients<'a, T> {
pub(crate) x: T,
pub(crate) a: &'a [Complex<T>],
pub(crate) b: &'a [Complex<T>],
pub(crate) abs_sum: T,
}
#[derive(Clone, Copy, Debug)]
pub(crate) struct Group<'a, T> {
pub(crate) d: CoefficientDerivatives<'a, T>,
pub(crate) abs_sum: [T; 3],
pub(crate) outer: bool,
}
impl<T: Real> Coefficients<'_, T> {
pub(crate) fn n_terms(&self) -> usize {
self.a.len()
}
}
impl<'a, T: Real> MieSolution<'a, T> {
pub(crate) fn coefficients(&self) -> Coefficients<'a, T> {
let s = self.state;
Coefficients {
x: s.x,
a: &s.a,
b: &s.b,
abs_sum: s.abs_sum,
}
}
pub(crate) fn group(&self) -> Option<Group<'a, T>> {
self.derivatives().map(|d| Group {
d,
abs_sum: self.state.abs_sum_jacobian,
outer: true,
})
}
}