use num_complex::Complex;
use super::driver::x_max;
use crate::mie::MieOutput;
#[derive(Clone, Copy, Debug, PartialEq)]
#[non_exhaustive]
pub struct ValidatedDomain {
pub aspect_ratio_min: f64,
pub aspect_ratio_max: f64,
pub x_min: f64,
pub max_phase: f64,
pub m_re_min: f64,
pub m_re_max: f64,
pub m_im_max: f64,
pub rtol_min: f64,
}
pub const VALIDATED_DOMAIN: ValidatedDomain = ValidatedDomain {
aspect_ratio_min: 0.2,
aspect_ratio_max: 5.0,
x_min: 0.3,
max_phase: 60.0,
m_re_min: 1.3,
m_re_max: 3.0,
m_im_max: 0.5,
rtol_min: 1e-12,
};
impl ValidatedDomain {
pub fn contains(&self, eps: f64, x: f64, m: Complex<f64>) -> bool {
(self.aspect_ratio_min..=self.aspect_ratio_max).contains(&eps)
&& x >= self.x_min
&& m.norm() * x_max(x, eps) <= self.max_phase
&& (self.m_re_min..=self.m_re_max).contains(&m.re)
&& (0.0..=self.m_im_max).contains(&m.im)
}
pub fn tolerance(&self, output: MieOutput, rtol: f64, estimate: f64) -> f64 {
Self::constant(output) * rtol.max(estimate)
}
pub fn constant(output: MieOutput) -> f64 {
match output {
MieOutput::Extinction | MieOutput::Scattering | MieOutput::Asymmetry => 4.0,
_ => 16.0,
}
}
}