use siderust::qtty;
use siderust::qtty::area::SquareMeter;
use siderust::qtty::length::Nanometer;
use siderust::qtty::power::Watt;
use siderust::qtty::{unit, Per, Quantity};
pub(crate) type ScaleFactors = siderust::qtty::dimensionless::Ratios;
pub(crate) type SolarSpectralIrradianceUnit = Per<Per<Watt, SquareMeter>, Nanometer>;
pub(crate) type SolarSpectralIrradiance = Quantity<SolarSpectralIrradianceUnit>;
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, siderust::qtty::Unit)]
#[unit(
crate = qtty,
symbol = "ph·s⁻¹·m⁻²·arcsec⁻²·µm⁻¹",
dimension = siderust::qtty::radiometry::SpectralPhotonRadiance,
ratio = 4.254_517_029_022_576e16
)]
#[allow(dead_code)]
pub(crate) struct SkyCalcPhotonPerSquareMeterSecondSquareArcsecondMicrometer;
#[allow(dead_code)]
pub(crate) type SkyCalcSpectralPhotonRadiance =
Quantity<SkyCalcPhotonPerSquareMeterSecondSquareArcsecondMicrometer>;
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, siderust::qtty::Unit)]
#[unit(
crate = qtty,
symbol = "W·m⁻²·sr⁻¹·µm⁻¹",
dimension = siderust::qtty::radiometry::SpectralRadiance,
ratio = 1.0e6
)]
pub(crate) struct WattPerSquareMeterSteradianMicrometer;
pub(crate) type WattsPerSquareMeterSteradianMicrometer =
Quantity<WattPerSquareMeterSteradianMicrometer>;
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, siderust::qtty::Unit)]
#[unit(
crate = qtty,
symbol = "SFU",
dimension = siderust::qtty::dimensionless::Dimensionless,
ratio = 1.0
)]
pub struct SolarFluxUnit;
pub type SolarFluxUnits = Quantity<SolarFluxUnit>;
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, siderust::qtty::Unit)]
#[unit(
crate = qtty,
symbol = "mag·airmass⁻¹",
dimension = siderust::qtty::dimensionless::Dimensionless,
ratio = 1.0
)]
pub(crate) struct MagnitudePerAirmass;
pub(crate) type MagnitudesPerAirmass = Quantity<MagnitudePerAirmass>;
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, siderust::qtty::Unit)]
#[unit(
crate = qtty,
symbol = "nL",
dimension = siderust::qtty::dimensionless::Dimensionless,
ratio = 1.0
)]
pub(crate) struct Nanolambert;
pub(crate) type Nanolamberts = Quantity<Nanolambert>;
pub(crate) type PixelIntegratedPhotonFlux =
Quantity<unit::Prod<unit::PhotonPerSquareCentimeterNanosecondSteradian, unit::Steradian>>;
#[cfg(test)]
mod tests {
use super::*;
use crate::units::radiometry::PhotonPerSquareCentimeterNanosecondSteradianNanometer;
#[test]
fn skycalc_spectral_photon_radiance_converts_to_band_units() {
let converted = SkyCalcSpectralPhotonRadiance::new(1.0)
.to::<PhotonPerSquareCentimeterNanosecondSteradianNanometer>();
assert!((converted.value() - 4.254_517_029_022_576e-6).abs() < 1.0e-18);
}
#[test]
fn skycalc_spectral_photon_radiance_round_trips() {
let original = SkyCalcSpectralPhotonRadiance::new(123.456);
let round_trip = original
.to::<PhotonPerSquareCentimeterNanosecondSteradianNanometer>()
.to::<SkyCalcPhotonPerSquareMeterSecondSquareArcsecondMicrometer>();
let rel = (round_trip.value() - original.value()).abs() / original.value();
assert!(rel < 1.0e-12);
}
#[test]
fn solar_spectral_irradiance_uses_qtty_dimension_algebra() {
let irradiance = SolarSpectralIrradiance::new(2.5);
assert_eq!(irradiance.value(), 2.5);
}
}