Got actual solar spectrum data and incorporated it. Plus radiometry

This commit is contained in:
connor committed 2026-10-14 15:38:23 -04:00
1 parent 3eb7ec4808
commit cefcfe7e4e
7 files changed
+1281 -20

No files matched your search

+1 -1
View File
@@ -72,7 +72,7 @@ impl CameraConfig {
/// 80 nm wide at half maximum, with 60 % peak QE.
/// - 20,000 electron full well, 12-bit ADC, 5 electrons per DN, 64 DN bias.
/// - 0.1 ms exposure: a white Lambertian surface facing the Sun fills about half the
/// well (44-54 % across the channels), so Earth and the target are both unsaturated.
/// well (48-57 % across the channels), so Earth and the target are both unsaturated.
/// - Mounted with no offset or rotation on the observer.
pub fn example() -> Self {
let channel = |name: &str, center: f64| Channel {
+3
View File
@@ -15,10 +15,13 @@ pub use nalgebra;
pub mod camera;
pub mod error;
pub mod radiometry;
pub mod scene;
mod solar_data;
pub mod spectrum;
pub use camera::{CameraConfig, Channel, Detector, Intrinsics};
pub use error::Error;
pub use radiometry::Radiometry;
pub use scene::{CameraRelative, Placement, Pose, Scene, Target};
pub use spectrum::Spectrum;
+247
View File
@@ -0,0 +1,247 @@
//! Sunlight, and the per-channel constants the GPU shades with.
//!
//! Spectra are folded into a few numbers per channel once, when a camera is set up, so
//! the GPU never integrates over wavelength. The unit that makes this work is the
//! channel radiance of a channel k:
//!
//! ```text
//! L_k = ∫ L(λ) τ(λ) QE_k(λ) λ / (h c) dλ [electrons / s / m^2 / sr]
//! ```
//!
//! It is scene radiance as this camera's channel sees it: weighted by the optics
//! transmission and QE, and counted in photons rather than watts. Electrons follow from
//! it by geometry alone (see [`Radiometry::electrons`]). The approximation is that a
//! surface's reflectance is treated as constant across each channel's band once it is
//! reduced to an [effective albedo](Radiometry::effective_albedo); `docs/optics.md`
//! explains when that matters.
use std::sync::OnceLock;
use crate::camera::CameraConfig;
use crate::solar_data;
use crate::spectrum::Spectrum;
/// The astronomical unit, in meters (IAU 2012, exact).
pub const AU: f64 = 149_597_870_700.0;
/// Nominal solar radius, in meters (IAU 2015 Resolution B3).
pub const SUN_RADIUS: f64 = 6.957e8;
/// Planck constant, in J s (SI, exact).
pub const PLANCK: f64 = 6.626_070_15e-34;
/// Speed of light in vacuum, in m/s (SI, exact).
pub const SPEED_OF_LIGHT: f64 = 299_792_458.0;
/// Solar spectral irradiance at 1 AU, in W/m^2 per meter of wavelength.
///
/// The TSIS-1 Hybrid Solar Reference Spectrum at 1 nm resolution, 202 to 2730 nm
/// (Coddington et al. 2021, <https://doi.org/10.1029/2020GL091709>), compiled in from
/// `solar_data.rs`, which `scripts/fetch-solar-spectrum.sh` generates. It integrates to
/// 1325.8 W/m^2; the remaining ~35 W/m^2 of the 1361 W/m^2 total lies outside that range,
/// where silicon detectors do not respond.
pub fn solar_spectrum() -> &'static Spectrum {
static SPECTRUM: OnceLock<Spectrum> = OnceLock::new();
SPECTRUM.get_or_init(|| Spectrum::from_static(&solar_data::WAVELENGTH, &solar_data::IRRADIANCE))
}
/// The solid angle of the solar disk seen from 1 AU, in steradians.
pub fn sun_solid_angle_at_1au() -> f64 {
let sin = SUN_RADIUS / AU;
2.0 * std::f64::consts::PI * (1.0 - (1.0 - sin * sin).sqrt())
}
/// The integral over wavelength of the product of `spectra`.
///
/// The integral runs over the range where every sampled spectrum is defined, using the
/// trapezoid rule on the union of their sample wavelengths. Returns `None` if every
/// spectrum is constant, since the integral then has no bound.
pub fn integrate(spectra: &[&Spectrum]) -> Option<f64> {
integrate_weighted(spectra, |_| 1.0)
}
fn integrate_weighted(spectra: &[&Spectrum], weight: impl Fn(f64) -> f64) -> Option<f64> {
let (lo, hi) = spectra
.iter()
.filter_map(|s| s.support())
.reduce(|(a, b), (c, d)| (a.max(c), b.min(d)))?;
if lo >= hi {
return Some(0.0);
}
let mut grid: Vec<f64> = spectra
.iter()
.flat_map(|s| s.breakpoints())
.copied()
.filter(|&l| l > lo && l < hi)
.chain([lo, hi])
.collect();
grid.sort_by(f64::total_cmp);
grid.dedup();
let f = |l: f64| weight(l) * spectra.iter().map(|s| s.at(l)).product::<f64>();
Some(
grid.windows(2)
.map(|w| 0.5 * (f(w[0]) + f(w[1])) * (w[1] - w[0]))
.sum(),
)
}
/// A camera's per-channel radiometric constants.
#[derive(Clone, Debug, PartialEq)]
pub struct Radiometry {
/// Per channel: the electron rate per square meter of detector that 1 AU sunlight
/// would produce falling directly on it through the optics,
/// `∫ E_sun τ QE_k λ / (h c) dλ`, in electrons / s / m^2.
pub solar_flux: Vec<f64>,
/// Electrons per unit channel radiance at the image center:
/// `π A t / (4 N^2)`, in m^2 sr s, for pixel area A and exposure t.
pub electrons_per_radiance: f64,
/// The camera's transmission and QE, kept to compute effective albedos.
response: Vec<Spectrum>,
transmission: Spectrum,
}
impl Radiometry {
/// Folds the solar spectrum through `camera`'s optics and channels.
pub fn new(camera: &CameraConfig) -> Self {
let photons = |l: f64| l / (PLANCK * SPEED_OF_LIGHT);
let solar_flux = camera
.channels
.iter()
.map(|ch| {
let spectra = [
solar_spectrum(),
&camera.transmission,
&ch.quantum_efficiency,
];
integrate_weighted(&spectra, photons).expect("solar spectrum is bounded")
})
.collect();
let pixel_area = camera.pixel_pitch * camera.pixel_pitch;
Self {
solar_flux,
electrons_per_radiance: std::f64::consts::PI * pixel_area * camera.exposure
/ (4.0 * camera.f_number * camera.f_number),
response: camera
.channels
.iter()
.map(|ch| ch.quantum_efficiency.clone())
.collect(),
transmission: camera.transmission.clone(),
}
}
/// Per channel, the albedo a spectrally flat surface would need to look the same as a
/// surface with this spectral `reflectance` under sunlight.
pub fn effective_albedo(&self, reflectance: &Spectrum) -> Vec<f64> {
let photons = |l: f64| l / (PLANCK * SPEED_OF_LIGHT);
self.response
.iter()
.zip(&self.solar_flux)
.map(|(qe, flux)| {
let spectra = [solar_spectrum(), &self.transmission, qe, reflectance];
integrate_weighted(&spectra, photons).expect("solar spectrum is bounded") / flux
})
.collect()
}
/// Channel radiance of a Lambertian surface with channel albedo `albedo`, lit by the
/// Sun at `sun_distance` meters with the Sun `cos_incidence` from the surface normal.
pub fn lambert_radiance(
&self,
channel: usize,
albedo: f64,
cos_incidence: f64,
sun_distance: f64,
) -> f64 {
let au = sun_distance / AU;
albedo * cos_incidence.max(0.0) * self.solar_flux[channel]
/ (std::f64::consts::PI * au * au)
}
/// Channel radiance of the solar disk, treated as uniformly bright. It does not depend
/// on distance.
pub fn sun_radiance(&self, channel: usize) -> f64 {
self.solar_flux[channel] / sun_solid_angle_at_1au()
}
/// Electrons collected from channel radiance `radiance` by a pixel whose line of sight
/// is `cos_off_axis` from the boresight, including the cos^4 falloff.
pub fn electrons(&self, radiance: f64, cos_off_axis: f64) -> f64 {
radiance * self.electrons_per_radiance * cos_off_axis.powi(4)
}
}
#[cfg(test)]
mod tests {
use super::*;
use approx::assert_relative_eq;
#[test]
fn solar_table_integral() {
let total = integrate(&[solar_spectrum()]).unwrap();
assert_relative_eq!(total, 1325.78, max_relative = 1e-5);
}
#[test]
fn integrate_gaussian_matches_closed_form() {
let (peak, fwhm) = (0.6, 80e-9);
let g = Spectrum::gaussian(peak, 540e-9, fwhm);
let exact = peak * fwhm * (std::f64::consts::PI / (4.0 * std::f64::consts::LN_2)).sqrt();
assert_relative_eq!(
integrate(&[&g, &Spectrum::constant(1.0)]).unwrap(),
exact,
max_relative = 1e-5
);
assert_eq!(integrate(&[&Spectrum::constant(1.0)]), None);
}
#[test]
fn example_camera_matches_independent_integration() {
// Integrated separately (Python, 0.01 nm trapezoid over the same table).
let r = Radiometry::new(&CameraConfig::example());
for (got, want) in r
.solar_flux
.iter()
.zip([2.413601e20, 2.356644e20, 2.036617e20])
{
assert_relative_eq!(*got, want, max_relative = 1e-4);
}
}
#[test]
fn white_surface_facing_sun_electrons() {
// The worked example in docs/optics.md.
let r = Radiometry::new(&CameraConfig::example());
let green = r.electrons(r.lambert_radiance(1, 1.0, 1.0, AU), 1.0);
assert_relative_eq!(green, 11_139.0, max_relative = 1e-4);
}
#[test]
fn flat_reflectance_has_that_albedo() {
let r = Radiometry::new(&CameraConfig::example());
for a in r.effective_albedo(&Spectrum::constant(0.3)) {
assert_relative_eq!(a, 0.3, max_relative = 1e-12);
}
}
#[test]
fn sun_radiance_over_disk_is_solar_flux() {
let r = Radiometry::new(&CameraConfig::example());
assert_relative_eq!(
r.sun_radiance(0) * sun_solid_angle_at_1au(),
r.solar_flux[0],
max_relative = 1e-12
);
// About 6.8e-5 sr: the Sun is 0.53 degrees across.
assert_relative_eq!(sun_solid_angle_at_1au(), 6.8e-5, max_relative = 0.01);
}
#[test]
fn lambert_falls_with_square_of_sun_distance() {
let r = Radiometry::new(&CameraConfig::example());
let near = r.lambert_radiance(0, 0.5, 0.8, AU);
assert_relative_eq!(
r.lambert_radiance(0, 0.5, 0.8, 2.0 * AU),
near / 4.0,
max_relative = 1e-12
);
assert_eq!(r.lambert_radiance(0, 0.5, -0.2, AU), 0.0);
}
}
+862
View File
@@ -0,0 +1,862 @@
//! The TSIS-1 Hybrid Solar Reference Spectrum: solar spectral irradiance at 1 AU.
//!
//! @generated by scripts/fetch-solar-spectrum.sh on 2026-10-14 from
//! <https://lasp.colorado.edu/lisird/latis/dap/tsis1_hsrs_1nm.csv>. Do not edit by hand.
//!
//! Coddington, O. M., et al. (2021). The TSIS-1 Hybrid Solar Reference Spectrum.
//! Geophysical Research Letters, 48, e2020GL091709.
//! <https://doi.org/10.1029/2020GL091709>
/// Vacuum wavelength, in meters, every 1 nm from 202 to 2730 nm.
#[rustfmt::skip]
pub(crate) static WAVELENGTH: [f64; 2529] = [
202e-9, 203e-9, 204e-9, 205e-9, 206e-9, 207e-9,
208e-9, 209e-9, 210e-9, 211e-9, 212e-9, 213e-9,
214e-9, 215e-9, 216e-9, 217e-9, 218e-9, 219e-9,
220e-9, 221e-9, 222e-9, 223e-9, 224e-9, 225e-9,
226e-9, 227e-9, 228e-9, 229e-9, 230e-9, 231e-9,
232e-9, 233e-9, 234e-9, 235e-9, 236e-9, 237e-9,
238e-9, 239e-9, 240e-9, 241e-9, 242e-9, 243e-9,
244e-9, 245e-9, 246e-9, 247e-9, 248e-9, 249e-9,
250e-9, 251e-9, 252e-9, 253e-9, 254e-9, 255e-9,
256e-9, 257e-9, 258e-9, 259e-9, 260e-9, 261e-9,
262e-9, 263e-9, 264e-9, 265e-9, 266e-9, 267e-9,
268e-9, 269e-9, 270e-9, 271e-9, 272e-9, 273e-9,
274e-9, 275e-9, 276e-9, 277e-9, 278e-9, 279e-9,
280e-9, 281e-9, 282e-9, 283e-9, 284e-9, 285e-9,
286e-9, 287e-9, 288e-9, 289e-9, 290e-9, 291e-9,
292e-9, 293e-9, 294e-9, 295e-9, 296e-9, 297e-9,
298e-9, 299e-9, 300e-9, 301e-9, 302e-9, 303e-9,
304e-9, 305e-9, 306e-9, 307e-9, 308e-9, 309e-9,
310e-9, 311e-9, 312e-9, 313e-9, 314e-9, 315e-9,
316e-9, 317e-9, 318e-9, 319e-9, 320e-9, 321e-9,
322e-9, 323e-9, 324e-9, 325e-9, 326e-9, 327e-9,
328e-9, 329e-9, 330e-9, 331e-9, 332e-9, 333e-9,
334e-9, 335e-9, 336e-9, 337e-9, 338e-9, 339e-9,
340e-9, 341e-9, 342e-9, 343e-9, 344e-9, 345e-9,
346e-9, 347e-9, 348e-9, 349e-9, 350e-9, 351e-9,
352e-9, 353e-9, 354e-9, 355e-9, 356e-9, 357e-9,
358e-9, 359e-9, 360e-9, 361e-9, 362e-9, 363e-9,
364e-9, 365e-9, 366e-9, 367e-9, 368e-9, 369e-9,
370e-9, 371e-9, 372e-9, 373e-9, 374e-9, 375e-9,
376e-9, 377e-9, 378e-9, 379e-9, 380e-9, 381e-9,
382e-9, 383e-9, 384e-9, 385e-9, 386e-9, 387e-9,
388e-9, 389e-9, 390e-9, 391e-9, 392e-9, 393e-9,
394e-9, 395e-9, 396e-9, 397e-9, 398e-9, 399e-9,
400e-9, 401e-9, 402e-9, 403e-9, 404e-9, 405e-9,
406e-9, 407e-9, 408e-9, 409e-9, 410e-9, 411e-9,
412e-9, 413e-9, 414e-9, 415e-9, 416e-9, 417e-9,
418e-9, 419e-9, 420e-9, 421e-9, 422e-9, 423e-9,
424e-9, 425e-9, 426e-9, 427e-9, 428e-9, 429e-9,
430e-9, 431e-9, 432e-9, 433e-9, 434e-9, 435e-9,
436e-9, 437e-9, 438e-9, 439e-9, 440e-9, 441e-9,
442e-9, 443e-9, 444e-9, 445e-9, 446e-9, 447e-9,
448e-9, 449e-9, 450e-9, 451e-9, 452e-9, 453e-9,
454e-9, 455e-9, 456e-9, 457e-9, 458e-9, 459e-9,
460e-9, 461e-9, 462e-9, 463e-9, 464e-9, 465e-9,
466e-9, 467e-9, 468e-9, 469e-9, 470e-9, 471e-9,
472e-9, 473e-9, 474e-9, 475e-9, 476e-9, 477e-9,
478e-9, 479e-9, 480e-9, 481e-9, 482e-9, 483e-9,
484e-9, 485e-9, 486e-9, 487e-9, 488e-9, 489e-9,
490e-9, 491e-9, 492e-9, 493e-9, 494e-9, 495e-9,
496e-9, 497e-9, 498e-9, 499e-9, 500e-9, 501e-9,
502e-9, 503e-9, 504e-9, 505e-9, 506e-9, 507e-9,
508e-9, 509e-9, 510e-9, 511e-9, 512e-9, 513e-9,
514e-9, 515e-9, 516e-9, 517e-9, 518e-9, 519e-9,
520e-9, 521e-9, 522e-9, 523e-9, 524e-9, 525e-9,
526e-9, 527e-9, 528e-9, 529e-9, 530e-9, 531e-9,
532e-9, 533e-9, 534e-9, 535e-9, 536e-9, 537e-9,
538e-9, 539e-9, 540e-9, 541e-9, 542e-9, 543e-9,
544e-9, 545e-9, 546e-9, 547e-9, 548e-9, 549e-9,
550e-9, 551e-9, 552e-9, 553e-9, 554e-9, 555e-9,
556e-9, 557e-9, 558e-9, 559e-9, 560e-9, 561e-9,
562e-9, 563e-9, 564e-9, 565e-9, 566e-9, 567e-9,
568e-9, 569e-9, 570e-9, 571e-9, 572e-9, 573e-9,
574e-9, 575e-9, 576e-9, 577e-9, 578e-9, 579e-9,
580e-9, 581e-9, 582e-9, 583e-9, 584e-9, 585e-9,
586e-9, 587e-9, 588e-9, 589e-9, 590e-9, 591e-9,
592e-9, 593e-9, 594e-9, 595e-9, 596e-9, 597e-9,
598e-9, 599e-9, 600e-9, 601e-9, 602e-9, 603e-9,
604e-9, 605e-9, 606e-9, 607e-9, 608e-9, 609e-9,
610e-9, 611e-9, 612e-9, 613e-9, 614e-9, 615e-9,
616e-9, 617e-9, 618e-9, 619e-9, 620e-9, 621e-9,
622e-9, 623e-9, 624e-9, 625e-9, 626e-9, 627e-9,
628e-9, 629e-9, 630e-9, 631e-9, 632e-9, 633e-9,
634e-9, 635e-9, 636e-9, 637e-9, 638e-9, 639e-9,
640e-9, 641e-9, 642e-9, 643e-9, 644e-9, 645e-9,
646e-9, 647e-9, 648e-9, 649e-9, 650e-9, 651e-9,
652e-9, 653e-9, 654e-9, 655e-9, 656e-9, 657e-9,
658e-9, 659e-9, 660e-9, 661e-9, 662e-9, 663e-9,
664e-9, 665e-9, 666e-9, 667e-9, 668e-9, 669e-9,
670e-9, 671e-9, 672e-9, 673e-9, 674e-9, 675e-9,
676e-9, 677e-9, 678e-9, 679e-9, 680e-9, 681e-9,
682e-9, 683e-9, 684e-9, 685e-9, 686e-9, 687e-9,
688e-9, 689e-9, 690e-9, 691e-9, 692e-9, 693e-9,
694e-9, 695e-9, 696e-9, 697e-9, 698e-9, 699e-9,
700e-9, 701e-9, 702e-9, 703e-9, 704e-9, 705e-9,
706e-9, 707e-9, 708e-9, 709e-9, 710e-9, 711e-9,
712e-9, 713e-9, 714e-9, 715e-9, 716e-9, 717e-9,
718e-9, 719e-9, 720e-9, 721e-9, 722e-9, 723e-9,
724e-9, 725e-9, 726e-9, 727e-9, 728e-9, 729e-9,
730e-9, 731e-9, 732e-9, 733e-9, 734e-9, 735e-9,
736e-9, 737e-9, 738e-9, 739e-9, 740e-9, 741e-9,
742e-9, 743e-9, 744e-9, 745e-9, 746e-9, 747e-9,
748e-9, 749e-9, 750e-9, 751e-9, 752e-9, 753e-9,
754e-9, 755e-9, 756e-9, 757e-9, 758e-9, 759e-9,
760e-9, 761e-9, 762e-9, 763e-9, 764e-9, 765e-9,
766e-9, 767e-9, 768e-9, 769e-9, 770e-9, 771e-9,
772e-9, 773e-9, 774e-9, 775e-9, 776e-9, 777e-9,
778e-9, 779e-9, 780e-9, 781e-9, 782e-9, 783e-9,
784e-9, 785e-9, 786e-9, 787e-9, 788e-9, 789e-9,
790e-9, 791e-9, 792e-9, 793e-9, 794e-9, 795e-9,
796e-9, 797e-9, 798e-9, 799e-9, 800e-9, 801e-9,
802e-9, 803e-9, 804e-9, 805e-9, 806e-9, 807e-9,
808e-9, 809e-9, 810e-9, 811e-9, 812e-9, 813e-9,
814e-9, 815e-9, 816e-9, 817e-9, 818e-9, 819e-9,
820e-9, 821e-9, 822e-9, 823e-9, 824e-9, 825e-9,
826e-9, 827e-9, 828e-9, 829e-9, 830e-9, 831e-9,
832e-9, 833e-9, 834e-9, 835e-9, 836e-9, 837e-9,
838e-9, 839e-9, 840e-9, 841e-9, 842e-9, 843e-9,
844e-9, 845e-9, 846e-9, 847e-9, 848e-9, 849e-9,
850e-9, 851e-9, 852e-9, 853e-9, 854e-9, 855e-9,
856e-9, 857e-9, 858e-9, 859e-9, 860e-9, 861e-9,
862e-9, 863e-9, 864e-9, 865e-9, 866e-9, 867e-9,
868e-9, 869e-9, 870e-9, 871e-9, 872e-9, 873e-9,
874e-9, 875e-9, 876e-9, 877e-9, 878e-9, 879e-9,
880e-9, 881e-9, 882e-9, 883e-9, 884e-9, 885e-9,
886e-9, 887e-9, 888e-9, 889e-9, 890e-9, 891e-9,
892e-9, 893e-9, 894e-9, 895e-9, 896e-9, 897e-9,
898e-9, 899e-9, 900e-9, 901e-9, 902e-9, 903e-9,
904e-9, 905e-9, 906e-9, 907e-9, 908e-9, 909e-9,
910e-9, 911e-9, 912e-9, 913e-9, 914e-9, 915e-9,
916e-9, 917e-9, 918e-9, 919e-9, 920e-9, 921e-9,
922e-9, 923e-9, 924e-9, 925e-9, 926e-9, 927e-9,
928e-9, 929e-9, 930e-9, 931e-9, 932e-9, 933e-9,
934e-9, 935e-9, 936e-9, 937e-9, 938e-9, 939e-9,
940e-9, 941e-9, 942e-9, 943e-9, 944e-9, 945e-9,
946e-9, 947e-9, 948e-9, 949e-9, 950e-9, 951e-9,
952e-9, 953e-9, 954e-9, 955e-9, 956e-9, 957e-9,
958e-9, 959e-9, 960e-9, 961e-9, 962e-9, 963e-9,
964e-9, 965e-9, 966e-9, 967e-9, 968e-9, 969e-9,
970e-9, 971e-9, 972e-9, 973e-9, 974e-9, 975e-9,
976e-9, 977e-9, 978e-9, 979e-9, 980e-9, 981e-9,
982e-9, 983e-9, 984e-9, 985e-9, 986e-9, 987e-9,
988e-9, 989e-9, 990e-9, 991e-9, 992e-9, 993e-9,
994e-9, 995e-9, 996e-9, 997e-9, 998e-9, 999e-9,
1000e-9, 1001e-9, 1002e-9, 1003e-9, 1004e-9, 1005e-9,
1006e-9, 1007e-9, 1008e-9, 1009e-9, 1010e-9, 1011e-9,
1012e-9, 1013e-9, 1014e-9, 1015e-9, 1016e-9, 1017e-9,
1018e-9, 1019e-9, 1020e-9, 1021e-9, 1022e-9, 1023e-9,
1024e-9, 1025e-9, 1026e-9, 1027e-9, 1028e-9, 1029e-9,
1030e-9, 1031e-9, 1032e-9, 1033e-9, 1034e-9, 1035e-9,
1036e-9, 1037e-9, 1038e-9, 1039e-9, 1040e-9, 1041e-9,
1042e-9, 1043e-9, 1044e-9, 1045e-9, 1046e-9, 1047e-9,
1048e-9, 1049e-9, 1050e-9, 1051e-9, 1052e-9, 1053e-9,
1054e-9, 1055e-9, 1056e-9, 1057e-9, 1058e-9, 1059e-9,
1060e-9, 1061e-9, 1062e-9, 1063e-9, 1064e-9, 1065e-9,
1066e-9, 1067e-9, 1068e-9, 1069e-9, 1070e-9, 1071e-9,
1072e-9, 1073e-9, 1074e-9, 1075e-9, 1076e-9, 1077e-9,
1078e-9, 1079e-9, 1080e-9, 1081e-9, 1082e-9, 1083e-9,
1084e-9, 1085e-9, 1086e-9, 1087e-9, 1088e-9, 1089e-9,
1090e-9, 1091e-9, 1092e-9, 1093e-9, 1094e-9, 1095e-9,
1096e-9, 1097e-9, 1098e-9, 1099e-9, 1100e-9, 1101e-9,
1102e-9, 1103e-9, 1104e-9, 1105e-9, 1106e-9, 1107e-9,
1108e-9, 1109e-9, 1110e-9, 1111e-9, 1112e-9, 1113e-9,
1114e-9, 1115e-9, 1116e-9, 1117e-9, 1118e-9, 1119e-9,
1120e-9, 1121e-9, 1122e-9, 1123e-9, 1124e-9, 1125e-9,
1126e-9, 1127e-9, 1128e-9, 1129e-9, 1130e-9, 1131e-9,
1132e-9, 1133e-9, 1134e-9, 1135e-9, 1136e-9, 1137e-9,
1138e-9, 1139e-9, 1140e-9, 1141e-9, 1142e-9, 1143e-9,
1144e-9, 1145e-9, 1146e-9, 1147e-9, 1148e-9, 1149e-9,
1150e-9, 1151e-9, 1152e-9, 1153e-9, 1154e-9, 1155e-9,
1156e-9, 1157e-9, 1158e-9, 1159e-9, 1160e-9, 1161e-9,
1162e-9, 1163e-9, 1164e-9, 1165e-9, 1166e-9, 1167e-9,
1168e-9, 1169e-9, 1170e-9, 1171e-9, 1172e-9, 1173e-9,
1174e-9, 1175e-9, 1176e-9, 1177e-9, 1178e-9, 1179e-9,
1180e-9, 1181e-9, 1182e-9, 1183e-9, 1184e-9, 1185e-9,
1186e-9, 1187e-9, 1188e-9, 1189e-9, 1190e-9, 1191e-9,
1192e-9, 1193e-9, 1194e-9, 1195e-9, 1196e-9, 1197e-9,
1198e-9, 1199e-9, 1200e-9, 1201e-9, 1202e-9, 1203e-9,
1204e-9, 1205e-9, 1206e-9, 1207e-9, 1208e-9, 1209e-9,
1210e-9, 1211e-9, 1212e-9, 1213e-9, 1214e-9, 1215e-9,
1216e-9, 1217e-9, 1218e-9, 1219e-9, 1220e-9, 1221e-9,
1222e-9, 1223e-9, 1224e-9, 1225e-9, 1226e-9, 1227e-9,
1228e-9, 1229e-9, 1230e-9, 1231e-9, 1232e-9, 1233e-9,
1234e-9, 1235e-9, 1236e-9, 1237e-9, 1238e-9, 1239e-9,
1240e-9, 1241e-9, 1242e-9, 1243e-9, 1244e-9, 1245e-9,
1246e-9, 1247e-9, 1248e-9, 1249e-9, 1250e-9, 1251e-9,
1252e-9, 1253e-9, 1254e-9, 1255e-9, 1256e-9, 1257e-9,
1258e-9, 1259e-9, 1260e-9, 1261e-9, 1262e-9, 1263e-9,
1264e-9, 1265e-9, 1266e-9, 1267e-9, 1268e-9, 1269e-9,
1270e-9, 1271e-9, 1272e-9, 1273e-9, 1274e-9, 1275e-9,
1276e-9, 1277e-9, 1278e-9, 1279e-9, 1280e-9, 1281e-9,
1282e-9, 1283e-9, 1284e-9, 1285e-9, 1286e-9, 1287e-9,
1288e-9, 1289e-9, 1290e-9, 1291e-9, 1292e-9, 1293e-9,
1294e-9, 1295e-9, 1296e-9, 1297e-9, 1298e-9, 1299e-9,
1300e-9, 1301e-9, 1302e-9, 1303e-9, 1304e-9, 1305e-9,
1306e-9, 1307e-9, 1308e-9, 1309e-9, 1310e-9, 1311e-9,
1312e-9, 1313e-9, 1314e-9, 1315e-9, 1316e-9, 1317e-9,
1318e-9, 1319e-9, 1320e-9, 1321e-9, 1322e-9, 1323e-9,
1324e-9, 1325e-9, 1326e-9, 1327e-9, 1328e-9, 1329e-9,
1330e-9, 1331e-9, 1332e-9, 1333e-9, 1334e-9, 1335e-9,
1336e-9, 1337e-9, 1338e-9, 1339e-9, 1340e-9, 1341e-9,
1342e-9, 1343e-9, 1344e-9, 1345e-9, 1346e-9, 1347e-9,
1348e-9, 1349e-9, 1350e-9, 1351e-9, 1352e-9, 1353e-9,
1354e-9, 1355e-9, 1356e-9, 1357e-9, 1358e-9, 1359e-9,
1360e-9, 1361e-9, 1362e-9, 1363e-9, 1364e-9, 1365e-9,
1366e-9, 1367e-9, 1368e-9, 1369e-9, 1370e-9, 1371e-9,
1372e-9, 1373e-9, 1374e-9, 1375e-9, 1376e-9, 1377e-9,
1378e-9, 1379e-9, 1380e-9, 1381e-9, 1382e-9, 1383e-9,
1384e-9, 1385e-9, 1386e-9, 1387e-9, 1388e-9, 1389e-9,
1390e-9, 1391e-9, 1392e-9, 1393e-9, 1394e-9, 1395e-9,
1396e-9, 1397e-9, 1398e-9, 1399e-9, 1400e-9, 1401e-9,
1402e-9, 1403e-9, 1404e-9, 1405e-9, 1406e-9, 1407e-9,
1408e-9, 1409e-9, 1410e-9, 1411e-9, 1412e-9, 1413e-9,
1414e-9, 1415e-9, 1416e-9, 1417e-9, 1418e-9, 1419e-9,
1420e-9, 1421e-9, 1422e-9, 1423e-9, 1424e-9, 1425e-9,
1426e-9, 1427e-9, 1428e-9, 1429e-9, 1430e-9, 1431e-9,
1432e-9, 1433e-9, 1434e-9, 1435e-9, 1436e-9, 1437e-9,
1438e-9, 1439e-9, 1440e-9, 1441e-9, 1442e-9, 1443e-9,
1444e-9, 1445e-9, 1446e-9, 1447e-9, 1448e-9, 1449e-9,
1450e-9, 1451e-9, 1452e-9, 1453e-9, 1454e-9, 1455e-9,
1456e-9, 1457e-9, 1458e-9, 1459e-9, 1460e-9, 1461e-9,
1462e-9, 1463e-9, 1464e-9, 1465e-9, 1466e-9, 1467e-9,
1468e-9, 1469e-9, 1470e-9, 1471e-9, 1472e-9, 1473e-9,
1474e-9, 1475e-9, 1476e-9, 1477e-9, 1478e-9, 1479e-9,
1480e-9, 1481e-9, 1482e-9, 1483e-9, 1484e-9, 1485e-9,
1486e-9, 1487e-9, 1488e-9, 1489e-9, 1490e-9, 1491e-9,
1492e-9, 1493e-9, 1494e-9, 1495e-9, 1496e-9, 1497e-9,
1498e-9, 1499e-9, 1500e-9, 1501e-9, 1502e-9, 1503e-9,
1504e-9, 1505e-9, 1506e-9, 1507e-9, 1508e-9, 1509e-9,
1510e-9, 1511e-9, 1512e-9, 1513e-9, 1514e-9, 1515e-9,
1516e-9, 1517e-9, 1518e-9, 1519e-9, 1520e-9, 1521e-9,
1522e-9, 1523e-9, 1524e-9, 1525e-9, 1526e-9, 1527e-9,
1528e-9, 1529e-9, 1530e-9, 1531e-9, 1532e-9, 1533e-9,
1534e-9, 1535e-9, 1536e-9, 1537e-9, 1538e-9, 1539e-9,
1540e-9, 1541e-9, 1542e-9, 1543e-9, 1544e-9, 1545e-9,
1546e-9, 1547e-9, 1548e-9, 1549e-9, 1550e-9, 1551e-9,
1552e-9, 1553e-9, 1554e-9, 1555e-9, 1556e-9, 1557e-9,
1558e-9, 1559e-9, 1560e-9, 1561e-9, 1562e-9, 1563e-9,
1564e-9, 1565e-9, 1566e-9, 1567e-9, 1568e-9, 1569e-9,
1570e-9, 1571e-9, 1572e-9, 1573e-9, 1574e-9, 1575e-9,
1576e-9, 1577e-9, 1578e-9, 1579e-9, 1580e-9, 1581e-9,
1582e-9, 1583e-9, 1584e-9, 1585e-9, 1586e-9, 1587e-9,
1588e-9, 1589e-9, 1590e-9, 1591e-9, 1592e-9, 1593e-9,
1594e-9, 1595e-9, 1596e-9, 1597e-9, 1598e-9, 1599e-9,
1600e-9, 1601e-9, 1602e-9, 1603e-9, 1604e-9, 1605e-9,
1606e-9, 1607e-9, 1608e-9, 1609e-9, 1610e-9, 1611e-9,
1612e-9, 1613e-9, 1614e-9, 1615e-9, 1616e-9, 1617e-9,
1618e-9, 1619e-9, 1620e-9, 1621e-9, 1622e-9, 1623e-9,
1624e-9, 1625e-9, 1626e-9, 1627e-9, 1628e-9, 1629e-9,
1630e-9, 1631e-9, 1632e-9, 1633e-9, 1634e-9, 1635e-9,
1636e-9, 1637e-9, 1638e-9, 1639e-9, 1640e-9, 1641e-9,
1642e-9, 1643e-9, 1644e-9, 1645e-9, 1646e-9, 1647e-9,
1648e-9, 1649e-9, 1650e-9, 1651e-9, 1652e-9, 1653e-9,
1654e-9, 1655e-9, 1656e-9, 1657e-9, 1658e-9, 1659e-9,
1660e-9, 1661e-9, 1662e-9, 1663e-9, 1664e-9, 1665e-9,
1666e-9, 1667e-9, 1668e-9, 1669e-9, 1670e-9, 1671e-9,
1672e-9, 1673e-9, 1674e-9, 1675e-9, 1676e-9, 1677e-9,
1678e-9, 1679e-9, 1680e-9, 1681e-9, 1682e-9, 1683e-9,
1684e-9, 1685e-9, 1686e-9, 1687e-9, 1688e-9, 1689e-9,
1690e-9, 1691e-9, 1692e-9, 1693e-9, 1694e-9, 1695e-9,
1696e-9, 1697e-9, 1698e-9, 1699e-9, 1700e-9, 1701e-9,
1702e-9, 1703e-9, 1704e-9, 1705e-9, 1706e-9, 1707e-9,
1708e-9, 1709e-9, 1710e-9, 1711e-9, 1712e-9, 1713e-9,
1714e-9, 1715e-9, 1716e-9, 1717e-9, 1718e-9, 1719e-9,
1720e-9, 1721e-9, 1722e-9, 1723e-9, 1724e-9, 1725e-9,
1726e-9, 1727e-9, 1728e-9, 1729e-9, 1730e-9, 1731e-9,
1732e-9, 1733e-9, 1734e-9, 1735e-9, 1736e-9, 1737e-9,
1738e-9, 1739e-9, 1740e-9, 1741e-9, 1742e-9, 1743e-9,
1744e-9, 1745e-9, 1746e-9, 1747e-9, 1748e-9, 1749e-9,
1750e-9, 1751e-9, 1752e-9, 1753e-9, 1754e-9, 1755e-9,
1756e-9, 1757e-9, 1758e-9, 1759e-9, 1760e-9, 1761e-9,
1762e-9, 1763e-9, 1764e-9, 1765e-9, 1766e-9, 1767e-9,
1768e-9, 1769e-9, 1770e-9, 1771e-9, 1772e-9, 1773e-9,
1774e-9, 1775e-9, 1776e-9, 1777e-9, 1778e-9, 1779e-9,
1780e-9, 1781e-9, 1782e-9, 1783e-9, 1784e-9, 1785e-9,
1786e-9, 1787e-9, 1788e-9, 1789e-9, 1790e-9, 1791e-9,
1792e-9, 1793e-9, 1794e-9, 1795e-9, 1796e-9, 1797e-9,
1798e-9, 1799e-9, 1800e-9, 1801e-9, 1802e-9, 1803e-9,
1804e-9, 1805e-9, 1806e-9, 1807e-9, 1808e-9, 1809e-9,
1810e-9, 1811e-9, 1812e-9, 1813e-9, 1814e-9, 1815e-9,
1816e-9, 1817e-9, 1818e-9, 1819e-9, 1820e-9, 1821e-9,
1822e-9, 1823e-9, 1824e-9, 1825e-9, 1826e-9, 1827e-9,
1828e-9, 1829e-9, 1830e-9, 1831e-9, 1832e-9, 1833e-9,
1834e-9, 1835e-9, 1836e-9, 1837e-9, 1838e-9, 1839e-9,
1840e-9, 1841e-9, 1842e-9, 1843e-9, 1844e-9, 1845e-9,
1846e-9, 1847e-9, 1848e-9, 1849e-9, 1850e-9, 1851e-9,
1852e-9, 1853e-9, 1854e-9, 1855e-9, 1856e-9, 1857e-9,
1858e-9, 1859e-9, 1860e-9, 1861e-9, 1862e-9, 1863e-9,
1864e-9, 1865e-9, 1866e-9, 1867e-9, 1868e-9, 1869e-9,
1870e-9, 1871e-9, 1872e-9, 1873e-9, 1874e-9, 1875e-9,
1876e-9, 1877e-9, 1878e-9, 1879e-9, 1880e-9, 1881e-9,
1882e-9, 1883e-9, 1884e-9, 1885e-9, 1886e-9, 1887e-9,
1888e-9, 1889e-9, 1890e-9, 1891e-9, 1892e-9, 1893e-9,
1894e-9, 1895e-9, 1896e-9, 1897e-9, 1898e-9, 1899e-9,
1900e-9, 1901e-9, 1902e-9, 1903e-9, 1904e-9, 1905e-9,
1906e-9, 1907e-9, 1908e-9, 1909e-9, 1910e-9, 1911e-9,
1912e-9, 1913e-9, 1914e-9, 1915e-9, 1916e-9, 1917e-9,
1918e-9, 1919e-9, 1920e-9, 1921e-9, 1922e-9, 1923e-9,
1924e-9, 1925e-9, 1926e-9, 1927e-9, 1928e-9, 1929e-9,
1930e-9, 1931e-9, 1932e-9, 1933e-9, 1934e-9, 1935e-9,
1936e-9, 1937e-9, 1938e-9, 1939e-9, 1940e-9, 1941e-9,
1942e-9, 1943e-9, 1944e-9, 1945e-9, 1946e-9, 1947e-9,
1948e-9, 1949e-9, 1950e-9, 1951e-9, 1952e-9, 1953e-9,
1954e-9, 1955e-9, 1956e-9, 1957e-9, 1958e-9, 1959e-9,
1960e-9, 1961e-9, 1962e-9, 1963e-9, 1964e-9, 1965e-9,
1966e-9, 1967e-9, 1968e-9, 1969e-9, 1970e-9, 1971e-9,
1972e-9, 1973e-9, 1974e-9, 1975e-9, 1976e-9, 1977e-9,
1978e-9, 1979e-9, 1980e-9, 1981e-9, 1982e-9, 1983e-9,
1984e-9, 1985e-9, 1986e-9, 1987e-9, 1988e-9, 1989e-9,
1990e-9, 1991e-9, 1992e-9, 1993e-9, 1994e-9, 1995e-9,
1996e-9, 1997e-9, 1998e-9, 1999e-9, 2000e-9, 2001e-9,
2002e-9, 2003e-9, 2004e-9, 2005e-9, 2006e-9, 2007e-9,
2008e-9, 2009e-9, 2010e-9, 2011e-9, 2012e-9, 2013e-9,
2014e-9, 2015e-9, 2016e-9, 2017e-9, 2018e-9, 2019e-9,
2020e-9, 2021e-9, 2022e-9, 2023e-9, 2024e-9, 2025e-9,
2026e-9, 2027e-9, 2028e-9, 2029e-9, 2030e-9, 2031e-9,
2032e-9, 2033e-9, 2034e-9, 2035e-9, 2036e-9, 2037e-9,
2038e-9, 2039e-9, 2040e-9, 2041e-9, 2042e-9, 2043e-9,
2044e-9, 2045e-9, 2046e-9, 2047e-9, 2048e-9, 2049e-9,
2050e-9, 2051e-9, 2052e-9, 2053e-9, 2054e-9, 2055e-9,
2056e-9, 2057e-9, 2058e-9, 2059e-9, 2060e-9, 2061e-9,
2062e-9, 2063e-9, 2064e-9, 2065e-9, 2066e-9, 2067e-9,
2068e-9, 2069e-9, 2070e-9, 2071e-9, 2072e-9, 2073e-9,
2074e-9, 2075e-9, 2076e-9, 2077e-9, 2078e-9, 2079e-9,
2080e-9, 2081e-9, 2082e-9, 2083e-9, 2084e-9, 2085e-9,
2086e-9, 2087e-9, 2088e-9, 2089e-9, 2090e-9, 2091e-9,
2092e-9, 2093e-9, 2094e-9, 2095e-9, 2096e-9, 2097e-9,
2098e-9, 2099e-9, 2100e-9, 2101e-9, 2102e-9, 2103e-9,
2104e-9, 2105e-9, 2106e-9, 2107e-9, 2108e-9, 2109e-9,
2110e-9, 2111e-9, 2112e-9, 2113e-9, 2114e-9, 2115e-9,
2116e-9, 2117e-9, 2118e-9, 2119e-9, 2120e-9, 2121e-9,
2122e-9, 2123e-9, 2124e-9, 2125e-9, 2126e-9, 2127e-9,
2128e-9, 2129e-9, 2130e-9, 2131e-9, 2132e-9, 2133e-9,
2134e-9, 2135e-9, 2136e-9, 2137e-9, 2138e-9, 2139e-9,
2140e-9, 2141e-9, 2142e-9, 2143e-9, 2144e-9, 2145e-9,
2146e-9, 2147e-9, 2148e-9, 2149e-9, 2150e-9, 2151e-9,
2152e-9, 2153e-9, 2154e-9, 2155e-9, 2156e-9, 2157e-9,
2158e-9, 2159e-9, 2160e-9, 2161e-9, 2162e-9, 2163e-9,
2164e-9, 2165e-9, 2166e-9, 2167e-9, 2168e-9, 2169e-9,
2170e-9, 2171e-9, 2172e-9, 2173e-9, 2174e-9, 2175e-9,
2176e-9, 2177e-9, 2178e-9, 2179e-9, 2180e-9, 2181e-9,
2182e-9, 2183e-9, 2184e-9, 2185e-9, 2186e-9, 2187e-9,
2188e-9, 2189e-9, 2190e-9, 2191e-9, 2192e-9, 2193e-9,
2194e-9, 2195e-9, 2196e-9, 2197e-9, 2198e-9, 2199e-9,
2200e-9, 2201e-9, 2202e-9, 2203e-9, 2204e-9, 2205e-9,
2206e-9, 2207e-9, 2208e-9, 2209e-9, 2210e-9, 2211e-9,
2212e-9, 2213e-9, 2214e-9, 2215e-9, 2216e-9, 2217e-9,
2218e-9, 2219e-9, 2220e-9, 2221e-9, 2222e-9, 2223e-9,
2224e-9, 2225e-9, 2226e-9, 2227e-9, 2228e-9, 2229e-9,
2230e-9, 2231e-9, 2232e-9, 2233e-9, 2234e-9, 2235e-9,
2236e-9, 2237e-9, 2238e-9, 2239e-9, 2240e-9, 2241e-9,
2242e-9, 2243e-9, 2244e-9, 2245e-9, 2246e-9, 2247e-9,
2248e-9, 2249e-9, 2250e-9, 2251e-9, 2252e-9, 2253e-9,
2254e-9, 2255e-9, 2256e-9, 2257e-9, 2258e-9, 2259e-9,
2260e-9, 2261e-9, 2262e-9, 2263e-9, 2264e-9, 2265e-9,
2266e-9, 2267e-9, 2268e-9, 2269e-9, 2270e-9, 2271e-9,
2272e-9, 2273e-9, 2274e-9, 2275e-9, 2276e-9, 2277e-9,
2278e-9, 2279e-9, 2280e-9, 2281e-9, 2282e-9, 2283e-9,
2284e-9, 2285e-9, 2286e-9, 2287e-9, 2288e-9, 2289e-9,
2290e-9, 2291e-9, 2292e-9, 2293e-9, 2294e-9, 2295e-9,
2296e-9, 2297e-9, 2298e-9, 2299e-9, 2300e-9, 2301e-9,
2302e-9, 2303e-9, 2304e-9, 2305e-9, 2306e-9, 2307e-9,
2308e-9, 2309e-9, 2310e-9, 2311e-9, 2312e-9, 2313e-9,
2314e-9, 2315e-9, 2316e-9, 2317e-9, 2318e-9, 2319e-9,
2320e-9, 2321e-9, 2322e-9, 2323e-9, 2324e-9, 2325e-9,
2326e-9, 2327e-9, 2328e-9, 2329e-9, 2330e-9, 2331e-9,
2332e-9, 2333e-9, 2334e-9, 2335e-9, 2336e-9, 2337e-9,
2338e-9, 2339e-9, 2340e-9, 2341e-9, 2342e-9, 2343e-9,
2344e-9, 2345e-9, 2346e-9, 2347e-9, 2348e-9, 2349e-9,
2350e-9, 2351e-9, 2352e-9, 2353e-9, 2354e-9, 2355e-9,
2356e-9, 2357e-9, 2358e-9, 2359e-9, 2360e-9, 2361e-9,
2362e-9, 2363e-9, 2364e-9, 2365e-9, 2366e-9, 2367e-9,
2368e-9, 2369e-9, 2370e-9, 2371e-9, 2372e-9, 2373e-9,
2374e-9, 2375e-9, 2376e-9, 2377e-9, 2378e-9, 2379e-9,
2380e-9, 2381e-9, 2382e-9, 2383e-9, 2384e-9, 2385e-9,
2386e-9, 2387e-9, 2388e-9, 2389e-9, 2390e-9, 2391e-9,
2392e-9, 2393e-9, 2394e-9, 2395e-9, 2396e-9, 2397e-9,
2398e-9, 2399e-9, 2400e-9, 2401e-9, 2402e-9, 2403e-9,
2404e-9, 2405e-9, 2406e-9, 2407e-9, 2408e-9, 2409e-9,
2410e-9, 2411e-9, 2412e-9, 2413e-9, 2414e-9, 2415e-9,
2416e-9, 2417e-9, 2418e-9, 2419e-9, 2420e-9, 2421e-9,
2422e-9, 2423e-9, 2424e-9, 2425e-9, 2426e-9, 2427e-9,
2428e-9, 2429e-9, 2430e-9, 2431e-9, 2432e-9, 2433e-9,
2434e-9, 2435e-9, 2436e-9, 2437e-9, 2438e-9, 2439e-9,
2440e-9, 2441e-9, 2442e-9, 2443e-9, 2444e-9, 2445e-9,
2446e-9, 2447e-9, 2448e-9, 2449e-9, 2450e-9, 2451e-9,
2452e-9, 2453e-9, 2454e-9, 2455e-9, 2456e-9, 2457e-9,
2458e-9, 2459e-9, 2460e-9, 2461e-9, 2462e-9, 2463e-9,
2464e-9, 2465e-9, 2466e-9, 2467e-9, 2468e-9, 2469e-9,
2470e-9, 2471e-9, 2472e-9, 2473e-9, 2474e-9, 2475e-9,
2476e-9, 2477e-9, 2478e-9, 2479e-9, 2480e-9, 2481e-9,
2482e-9, 2483e-9, 2484e-9, 2485e-9, 2486e-9, 2487e-9,
2488e-9, 2489e-9, 2490e-9, 2491e-9, 2492e-9, 2493e-9,
2494e-9, 2495e-9, 2496e-9, 2497e-9, 2498e-9, 2499e-9,
2500e-9, 2501e-9, 2502e-9, 2503e-9, 2504e-9, 2505e-9,
2506e-9, 2507e-9, 2508e-9, 2509e-9, 2510e-9, 2511e-9,
2512e-9, 2513e-9, 2514e-9, 2515e-9, 2516e-9, 2517e-9,
2518e-9, 2519e-9, 2520e-9, 2521e-9, 2522e-9, 2523e-9,
2524e-9, 2525e-9, 2526e-9, 2527e-9, 2528e-9, 2529e-9,
2530e-9, 2531e-9, 2532e-9, 2533e-9, 2534e-9, 2535e-9,
2536e-9, 2537e-9, 2538e-9, 2539e-9, 2540e-9, 2541e-9,
2542e-9, 2543e-9, 2544e-9, 2545e-9, 2546e-9, 2547e-9,
2548e-9, 2549e-9, 2550e-9, 2551e-9, 2552e-9, 2553e-9,
2554e-9, 2555e-9, 2556e-9, 2557e-9, 2558e-9, 2559e-9,
2560e-9, 2561e-9, 2562e-9, 2563e-9, 2564e-9, 2565e-9,
2566e-9, 2567e-9, 2568e-9, 2569e-9, 2570e-9, 2571e-9,
2572e-9, 2573e-9, 2574e-9, 2575e-9, 2576e-9, 2577e-9,
2578e-9, 2579e-9, 2580e-9, 2581e-9, 2582e-9, 2583e-9,
2584e-9, 2585e-9, 2586e-9, 2587e-9, 2588e-9, 2589e-9,
2590e-9, 2591e-9, 2592e-9, 2593e-9, 2594e-9, 2595e-9,
2596e-9, 2597e-9, 2598e-9, 2599e-9, 2600e-9, 2601e-9,
2602e-9, 2603e-9, 2604e-9, 2605e-9, 2606e-9, 2607e-9,
2608e-9, 2609e-9, 2610e-9, 2611e-9, 2612e-9, 2613e-9,
2614e-9, 2615e-9, 2616e-9, 2617e-9, 2618e-9, 2619e-9,
2620e-9, 2621e-9, 2622e-9, 2623e-9, 2624e-9, 2625e-9,
2626e-9, 2627e-9, 2628e-9, 2629e-9, 2630e-9, 2631e-9,
2632e-9, 2633e-9, 2634e-9, 2635e-9, 2636e-9, 2637e-9,
2638e-9, 2639e-9, 2640e-9, 2641e-9, 2642e-9, 2643e-9,
2644e-9, 2645e-9, 2646e-9, 2647e-9, 2648e-9, 2649e-9,
2650e-9, 2651e-9, 2652e-9, 2653e-9, 2654e-9, 2655e-9,
2656e-9, 2657e-9, 2658e-9, 2659e-9, 2660e-9, 2661e-9,
2662e-9, 2663e-9, 2664e-9, 2665e-9, 2666e-9, 2667e-9,
2668e-9, 2669e-9, 2670e-9, 2671e-9, 2672e-9, 2673e-9,
2674e-9, 2675e-9, 2676e-9, 2677e-9, 2678e-9, 2679e-9,
2680e-9, 2681e-9, 2682e-9, 2683e-9, 2684e-9, 2685e-9,
2686e-9, 2687e-9, 2688e-9, 2689e-9, 2690e-9, 2691e-9,
2692e-9, 2693e-9, 2694e-9, 2695e-9, 2696e-9, 2697e-9,
2698e-9, 2699e-9, 2700e-9, 2701e-9, 2702e-9, 2703e-9,
2704e-9, 2705e-9, 2706e-9, 2707e-9, 2708e-9, 2709e-9,
2710e-9, 2711e-9, 2712e-9, 2713e-9, 2714e-9, 2715e-9,
2716e-9, 2717e-9, 2718e-9, 2719e-9, 2720e-9, 2721e-9,
2722e-9, 2723e-9, 2724e-9, 2725e-9, 2726e-9, 2727e-9,
2728e-9, 2729e-9, 2730e-9,
];
/// Solar spectral irradiance at 1 AU over a 1 nm band, in W/m^2 per meter of wavelength.
#[rustfmt::skip]
pub(crate) static IRRADIANCE: [f64; 2529] = [
7.93421e+06, 8.25275e+06, 9.34870e+06, 1.01604e+07, 1.02340e+07, 1.12075e+07,
1.29505e+07, 1.70961e+07, 2.34726e+07, 2.85841e+07, 3.38019e+07, 2.98988e+07,
3.63487e+07, 3.80811e+07, 3.29880e+07, 3.10206e+07, 4.07636e+07, 4.29708e+07,
4.78458e+07, 3.93478e+07, 4.26638e+07, 5.40437e+07, 6.02168e+07, 5.48045e+07,
4.48752e+07, 3.39076e+07, 4.67579e+07, 4.84640e+07, 4.52458e+07, 5.06138e+07,
4.98640e+07, 4.71771e+07, 3.93797e+07, 4.31525e+07, 4.83372e+07, 4.74957e+07,
4.24244e+07, 4.31743e+07, 3.96990e+07, 3.84252e+07, 5.99181e+07, 6.58758e+07,
6.19358e+07, 5.25918e+07, 4.72799e+07, 5.15814e+07, 4.92592e+07, 4.20750e+07,
5.94584e+07, 5.33512e+07, 3.97410e+07, 4.31610e+07, 5.30123e+07, 6.44646e+07,
8.43130e+07, 1.15722e+08, 1.27701e+08, 1.16126e+08, 8.55706e+07, 7.95589e+07,
9.96652e+07, 1.03695e+08, 2.28674e+08, 2.31127e+08, 2.56358e+08, 2.43207e+08,
2.46272e+08, 2.37151e+08, 2.56405e+08, 2.57078e+08, 1.88436e+08, 2.19706e+08,
1.49274e+08, 1.41550e+08, 2.17652e+08, 2.51731e+08, 1.92394e+08, 1.20601e+08,
7.51158e+07, 1.44193e+08, 2.60084e+08, 3.14334e+08, 2.95889e+08, 1.57866e+08,
2.47291e+08, 3.50950e+08, 2.93162e+08, 3.93753e+08, 5.63198e+08, 5.98267e+08,
5.53323e+08, 5.30420e+08, 5.12506e+08, 5.15982e+08, 5.64975e+08, 4.55734e+08,
5.19905e+08, 4.80941e+08, 4.34808e+08, 4.52318e+08, 4.26106e+08, 6.08616e+08,
6.02198e+08, 6.38780e+08, 5.54159e+08, 6.10367e+08, 6.41679e+08, 5.74133e+08,
5.12798e+08, 7.70407e+08, 6.78540e+08, 6.88222e+08, 7.22683e+08, 6.79628e+08,
5.76365e+08, 7.63082e+08, 6.95022e+08, 6.95685e+08, 7.82351e+08, 7.46949e+08,
7.31419e+08, 6.42728e+08, 7.31384e+08, 7.99047e+08, 9.86086e+08, 9.84251e+08,
9.40803e+08, 9.76951e+08, 1.10054e+09, 9.72937e+08, 9.75450e+08, 9.51329e+08,
9.30133e+08, 9.87311e+08, 8.62226e+08, 8.12738e+08, 9.10544e+08, 9.55541e+08,
1.05054e+09, 9.59361e+08, 9.85431e+08, 1.02918e+09, 8.30821e+08, 9.11420e+08,
9.19915e+08, 9.69370e+08, 9.05678e+08, 8.98331e+08, 1.00047e+09, 1.03522e+09,
9.82484e+08, 9.59963e+08, 1.12054e+09, 1.13146e+09, 1.04277e+09, 8.40502e+08,
7.80920e+08, 8.36656e+08, 1.12709e+09, 9.14983e+08, 9.34391e+08, 1.06542e+09,
1.07328e+09, 1.04606e+09, 1.29043e+09, 1.23621e+09, 1.15486e+09, 1.17561e+09,
1.28276e+09, 1.14724e+09, 1.10902e+09, 1.05715e+09, 9.29400e+08, 9.25914e+08,
1.11405e+09, 1.16017e+09, 1.40984e+09, 1.20927e+09, 1.10599e+09, 1.26761e+09,
9.49150e+08, 7.28965e+08, 7.86718e+08, 1.08917e+09, 9.70494e+08, 1.02820e+09,
1.00816e+09, 1.04797e+09, 1.25177e+09, 1.32526e+09, 1.25536e+09, 7.22749e+08,
7.54598e+08, 1.25905e+09, 1.17748e+09, 6.64623e+08, 1.33843e+09, 1.61448e+09,
1.67061e+09, 1.70267e+09, 1.78300e+09, 1.72018e+09, 1.75055e+09, 1.68229e+09,
1.64383e+09, 1.64587e+09, 1.69426e+09, 1.85455e+09, 1.58609e+09, 1.74641e+09,
1.86879e+09, 1.78052e+09, 1.82671e+09, 1.78174e+09, 1.81352e+09, 1.79489e+09,
1.72561e+09, 1.75294e+09, 1.69471e+09, 1.85861e+09, 1.80713e+09, 1.65674e+09,
1.74204e+09, 1.72033e+09, 1.70430e+09, 1.65821e+09, 1.67713e+09, 1.58551e+09,
1.33185e+09, 1.24661e+09, 1.79758e+09, 1.74594e+09, 1.59198e+09, 1.76730e+09,
1.87014e+09, 1.88180e+09, 1.73181e+09, 1.69042e+09, 1.82134e+09, 1.84546e+09,
1.96385e+09, 1.97173e+09, 1.97090e+09, 1.99970e+09, 1.83925e+09, 1.98296e+09,
2.04276e+09, 2.03290e+09, 2.08708e+09, 2.17995e+09, 2.09993e+09, 1.92355e+09,
2.04609e+09, 2.01224e+09, 2.09585e+09, 2.11306e+09, 2.07645e+09, 2.04915e+09,
2.03548e+09, 2.10905e+09, 2.11405e+09, 2.12414e+09, 2.06634e+09, 2.01957e+09,
2.08380e+09, 1.97493e+09, 2.04607e+09, 2.06904e+09, 2.01020e+09, 1.98527e+09,
2.11268e+09, 2.04179e+09, 2.06647e+09, 2.11172e+09, 2.05825e+09, 2.05877e+09,
2.14211e+09, 2.07532e+09, 2.11442e+09, 2.08948e+09, 2.12769e+09, 2.07479e+09,
2.03868e+09, 2.01056e+09, 1.66956e+09, 1.79348e+09, 1.96471e+09, 1.91988e+09,
2.08156e+09, 2.02390e+09, 1.90060e+09, 2.01436e+09, 1.98128e+09, 2.07489e+09,
1.99412e+09, 2.03681e+09, 1.97511e+09, 1.96450e+09, 1.96575e+09, 1.88784e+09,
1.87552e+09, 1.97003e+09, 1.90435e+09, 1.96939e+09, 2.05146e+09, 1.98341e+09,
1.91909e+09, 2.00528e+09, 1.95170e+09, 1.96057e+09, 2.00442e+09, 1.90639e+09,
1.87231e+09, 1.89185e+09, 1.91092e+09, 1.59980e+09, 1.76209e+09, 1.76626e+09,
1.88909e+09, 1.87250e+09, 1.92294e+09, 1.83430e+09, 1.95506e+09, 1.94948e+09,
1.91084e+09, 1.70359e+09, 1.88361e+09, 1.98744e+09, 1.92327e+09, 2.00705e+09,
1.95097e+09, 1.82811e+09, 1.91531e+09, 1.93325e+09, 1.99259e+09, 1.86057e+09,
1.93832e+09, 1.91747e+09, 1.84857e+09, 1.82749e+09, 1.90798e+09, 1.87883e+09,
1.92359e+09, 1.90711e+09, 1.91203e+09, 1.91077e+09, 1.85557e+09, 1.91196e+09,
1.90631e+09, 1.88483e+09, 1.91639e+09, 1.86741e+09, 1.90633e+09, 1.92586e+09,
1.89775e+09, 1.84647e+09, 1.86840e+09, 1.78607e+09, 1.81513e+09, 1.89408e+09,
1.83032e+09, 1.87330e+09, 1.85257e+09, 1.86779e+09, 1.80192e+09, 1.86389e+09,
1.86866e+09, 1.83345e+09, 1.85258e+09, 1.77593e+09, 1.86696e+09, 1.89359e+09,
1.89173e+09, 1.85812e+09, 1.84098e+09, 1.87181e+09, 1.83217e+09, 1.81675e+09,
1.84933e+09, 1.84163e+09, 1.85449e+09, 1.86602e+09, 1.85938e+09, 1.83880e+09,
1.78432e+09, 1.83612e+09, 1.83704e+09, 1.67667e+09, 1.71023e+09, 1.81536e+09,
1.81561e+09, 1.80451e+09, 1.81513e+09, 1.79440e+09, 1.80274e+09, 1.81573e+09,
1.78420e+09, 1.77594e+09, 1.77939e+09, 1.75188e+09, 1.73197e+09, 1.76423e+09,
1.78711e+09, 1.78164e+09, 1.76495e+09, 1.76754e+09, 1.74806e+09, 1.73384e+09,
1.72121e+09, 1.72373e+09, 1.71735e+09, 1.70955e+09, 1.66737e+09, 1.70649e+09,
1.65270e+09, 1.63931e+09, 1.69824e+09, 1.68936e+09, 1.70718e+09, 1.71462e+09,
1.67684e+09, 1.66936e+09, 1.66297e+09, 1.63940e+09, 1.63811e+09, 1.68192e+09,
1.68073e+09, 1.68317e+09, 1.64867e+09, 1.65872e+09, 1.61730e+09, 1.65715e+09,
1.62404e+09, 1.64899e+09, 1.62396e+09, 1.64108e+09, 1.65147e+09, 1.64444e+09,
1.60408e+09, 1.59769e+09, 1.59780e+09, 1.61714e+09, 1.60495e+09, 1.60435e+09,
1.59123e+09, 1.59777e+09, 1.60783e+09, 1.58940e+09, 1.53016e+09, 1.60746e+09,
1.58933e+09, 1.58871e+09, 1.58862e+09, 1.55077e+09, 1.35649e+09, 1.37644e+09,
1.53971e+09, 1.54666e+09, 1.54678e+09, 1.55601e+09, 1.57166e+09, 1.55415e+09,
1.54014e+09, 1.55572e+09, 1.55181e+09, 1.54157e+09, 1.53447e+09, 1.55262e+09,
1.53380e+09, 1.52727e+09, 1.50482e+09, 1.52530e+09, 1.52260e+09, 1.51014e+09,
1.51903e+09, 1.50779e+09, 1.51516e+09, 1.50616e+09, 1.50183e+09, 1.49650e+09,
1.49926e+09, 1.49356e+09, 1.46606e+09, 1.47533e+09, 1.46447e+09, 1.48451e+09,
1.47297e+09, 1.47890e+09, 1.47596e+09, 1.46754e+09, 1.45161e+09, 1.45607e+09,
1.46055e+09, 1.44595e+09, 1.45252e+09, 1.44848e+09, 1.41225e+09, 1.44080e+09,
1.42516e+09, 1.40601e+09, 1.39508e+09, 1.40606e+09, 1.40860e+09, 1.42493e+09,
1.41005e+09, 1.40468e+09, 1.41223e+09, 1.38718e+09, 1.40045e+09, 1.39471e+09,
1.38022e+09, 1.37453e+09, 1.38454e+09, 1.36205e+09, 1.37302e+09, 1.36274e+09,
1.35978e+09, 1.33405e+09, 1.34676e+09, 1.33465e+09, 1.34141e+09, 1.34455e+09,
1.34809e+09, 1.34394e+09, 1.34023e+09, 1.34253e+09, 1.33221e+09, 1.29538e+09,
1.32537e+09, 1.31652e+09, 1.32363e+09, 1.30914e+09, 1.32779e+09, 1.31462e+09,
1.30123e+09, 1.30805e+09, 1.30462e+09, 1.26405e+09, 1.28662e+09, 1.26460e+09,
1.25950e+09, 1.28357e+09, 1.28437e+09, 1.26971e+09, 1.28295e+09, 1.28333e+09,
1.27792e+09, 1.27054e+09, 1.25968e+09, 1.25186e+09, 1.26174e+09, 1.25287e+09,
1.26567e+09, 1.25673e+09, 1.24695e+09, 1.24521e+09, 1.24614e+09, 1.23334e+09,
1.24902e+09, 1.24226e+09, 1.21905e+09, 1.24233e+09, 1.24154e+09, 1.23519e+09,
1.18303e+09, 1.19465e+09, 1.22234e+09, 1.21077e+09, 1.20059e+09, 1.20550e+09,
1.19364e+09, 1.20020e+09, 1.20394e+09, 1.17612e+09, 1.20160e+09, 1.19819e+09,
1.17997e+09, 1.18856e+09, 1.18087e+09, 1.18027e+09, 1.19087e+09, 1.17846e+09,
1.16831e+09, 1.17540e+09, 1.17613e+09, 1.17485e+09, 1.16791e+09, 1.16993e+09,
1.16513e+09, 1.15852e+09, 1.14275e+09, 1.13552e+09, 1.11494e+09, 1.12171e+09,
1.14453e+09, 1.14473e+09, 1.14365e+09, 1.13928e+09, 1.11743e+09, 1.13171e+09,
1.13296e+09, 1.11562e+09, 1.12446e+09, 1.09756e+09, 1.11797e+09, 1.11396e+09,
1.10520e+09, 1.09541e+09, 1.08974e+09, 1.10546e+09, 1.10513e+09, 1.10344e+09,
1.10121e+09, 1.09601e+09, 1.09607e+09, 1.09247e+09, 1.08042e+09, 1.06468e+09,
1.05082e+09, 1.06391e+09, 1.04955e+09, 1.06944e+09, 1.06755e+09, 1.06293e+09,
1.06946e+09, 1.06583e+09, 1.06409e+09, 1.06127e+09, 1.05607e+09, 1.04669e+09,
1.05400e+09, 1.02524e+09, 1.02207e+09, 1.03102e+09, 1.04097e+09, 1.03735e+09,
1.03801e+09, 1.02074e+09, 1.03462e+09, 1.03412e+09, 1.02697e+09, 1.02138e+09,
1.00793e+09, 1.01385e+09, 1.02606e+09, 1.00725e+09, 1.01741e+09, 1.00987e+09,
9.06822e+08, 9.92344e+08, 9.85891e+08, 9.77271e+08, 8.17060e+08, 8.49734e+08,
9.69577e+08, 9.93270e+08, 9.92576e+08, 9.88384e+08, 9.79962e+08, 9.80521e+08,
9.77054e+08, 9.85237e+08, 9.83020e+08, 9.59562e+08, 8.53705e+08, 8.65253e+08,
9.48770e+08, 9.41207e+08, 9.59210e+08, 9.55772e+08, 9.52497e+08, 9.51416e+08,
9.37594e+08, 9.37860e+08, 9.37381e+08, 9.42000e+08, 9.44394e+08, 9.40195e+08,
9.35019e+08, 8.97221e+08, 9.42120e+08, 9.34748e+08, 9.32804e+08, 9.34493e+08,
9.22138e+08, 9.01622e+08, 9.24759e+08, 9.28153e+08, 9.25396e+08, 9.23261e+08,
9.16103e+08, 9.05147e+08, 9.20891e+08, 9.06394e+08, 9.20098e+08, 9.11000e+08,
9.06819e+08, 9.08917e+08, 8.94080e+08, 8.67597e+08, 8.57906e+08, 8.86165e+08,
8.99273e+08, 8.98457e+08, 8.85340e+08, 8.86068e+08, 8.79093e+08, 8.64488e+08,
8.69624e+08, 8.79359e+08, 8.72329e+08, 8.85719e+08, 8.80476e+08, 8.69722e+08,
8.73673e+08, 8.67673e+08, 8.66087e+08, 8.68019e+08, 8.62404e+08, 8.45057e+08,
8.31629e+08, 8.16875e+08, 8.32855e+08, 8.39291e+08, 8.19352e+08, 8.47561e+08,
8.50378e+08, 8.43470e+08, 8.45245e+08, 8.43688e+08, 8.39744e+08, 8.43039e+08,
8.41357e+08, 8.36959e+08, 8.31771e+08, 8.33166e+08, 8.31462e+08, 8.28782e+08,
8.22077e+08, 7.99050e+08, 7.93877e+08, 8.13888e+08, 8.00834e+08, 8.07933e+08,
8.13028e+08, 8.16750e+08, 8.17077e+08, 8.15355e+08, 8.14331e+08, 8.08034e+08,
8.02767e+08, 7.98537e+08, 7.86069e+08, 7.53923e+08, 7.88736e+08, 7.90656e+08,
7.93916e+08, 7.96737e+08, 7.91590e+08, 7.90465e+08, 7.87141e+08, 7.80201e+08,
7.80301e+08, 7.83370e+08, 7.68821e+08, 7.81352e+08, 7.77549e+08, 7.77271e+08,
7.74668e+08, 7.73926e+08, 7.77253e+08, 7.71492e+08, 7.61091e+08, 7.66700e+08,
7.66738e+08, 7.61460e+08, 7.65737e+08, 7.58155e+08, 7.59343e+08, 7.61530e+08,
7.62807e+08, 7.59102e+08, 7.57387e+08, 7.57579e+08, 7.51501e+08, 7.48451e+08,
7.51397e+08, 7.39402e+08, 7.45173e+08, 7.46945e+08, 7.46098e+08, 7.41307e+08,
7.41458e+08, 7.37902e+08, 7.38333e+08, 7.38478e+08, 7.34985e+08, 7.31964e+08,
7.28416e+08, 7.30933e+08, 7.27924e+08, 7.22378e+08, 7.06002e+08, 6.65413e+08,
6.90569e+08, 7.06259e+08, 7.17303e+08, 7.16487e+08, 7.17941e+08, 7.16465e+08,
7.12967e+08, 7.10420e+08, 7.11446e+08, 7.02085e+08, 7.07451e+08, 7.07661e+08,
7.07444e+08, 7.05292e+08, 7.00969e+08, 7.02364e+08, 6.89471e+08, 6.96883e+08,
6.97887e+08, 6.95931e+08, 6.94388e+08, 6.93359e+08, 6.91774e+08, 6.86315e+08,
6.86922e+08, 6.86381e+08, 6.85671e+08, 6.72878e+08, 6.76751e+08, 6.71155e+08,
6.79183e+08, 6.70736e+08, 6.69107e+08, 6.75107e+08, 6.68745e+08, 6.70253e+08,
6.70251e+08, 6.67282e+08, 6.67131e+08, 6.63664e+08, 6.46812e+08, 6.57914e+08,
6.62045e+08, 6.60919e+08, 6.58848e+08, 6.57750e+08, 6.55814e+08, 6.51972e+08,
6.49204e+08, 6.52376e+08, 6.50443e+08, 6.51034e+08, 6.41976e+08, 6.24092e+08,
6.40535e+08, 6.32022e+08, 6.41510e+08, 6.34610e+08, 6.39387e+08, 6.38580e+08,
6.25996e+08, 6.29066e+08, 6.27840e+08, 5.93466e+08, 6.11868e+08, 6.22698e+08,
6.28685e+08, 6.04427e+08, 6.23590e+08, 6.05236e+08, 6.17621e+08, 6.23251e+08,
6.17361e+08, 5.95657e+08, 6.17102e+08, 6.01670e+08, 6.01978e+08, 5.80785e+08,
6.03542e+08, 6.01555e+08, 6.09135e+08, 5.73242e+08, 5.94096e+08, 5.91582e+08,
6.01895e+08, 6.01420e+08, 5.91972e+08, 5.86964e+08, 5.44541e+08, 5.75687e+08,
5.75960e+08, 5.75431e+08, 5.73895e+08, 5.80183e+08, 5.87692e+08, 5.85225e+08,
5.67247e+08, 5.81919e+08, 5.82025e+08, 5.81739e+08, 5.81278e+08, 5.81206e+08,
5.79889e+08, 5.78499e+08, 5.78266e+08, 5.76748e+08, 5.70489e+08, 5.69437e+08,
5.73265e+08, 5.68109e+08, 5.69384e+08, 5.72329e+08, 5.69291e+08, 5.57299e+08,
5.59263e+08, 5.63980e+08, 5.66011e+08, 5.63403e+08, 5.61451e+08, 5.55138e+08,
5.48198e+08, 5.61419e+08, 5.58007e+08, 5.50485e+08, 5.49060e+08, 5.51836e+08,
5.52439e+08, 5.50214e+08, 5.50115e+08, 5.49904e+08, 5.46399e+08, 5.49432e+08,
5.40170e+08, 5.36643e+08, 5.37253e+08, 5.28495e+08, 5.35609e+08, 5.40527e+08,
5.38041e+08, 5.37538e+08, 5.39525e+08, 5.37682e+08, 5.36968e+08, 5.30109e+08,
5.34505e+08, 5.31670e+08, 5.33153e+08, 5.32613e+08, 5.32278e+08, 5.31570e+08,
5.31354e+08, 5.29005e+08, 5.27520e+08, 5.17788e+08, 5.13997e+08, 5.06679e+08,
5.15617e+08, 5.17804e+08, 5.11967e+08, 5.16371e+08, 5.10068e+08, 5.13031e+08,
5.15787e+08, 5.08837e+08, 5.09949e+08, 5.15368e+08, 5.15104e+08, 5.14455e+08,
5.13170e+08, 5.00907e+08, 4.95461e+08, 5.05958e+08, 4.99667e+08, 5.03471e+08,
5.05353e+08, 5.05809e+08, 5.03409e+08, 4.62413e+08, 4.85402e+08, 4.98315e+08,
5.00765e+08, 4.98567e+08, 4.92299e+08, 4.81897e+08, 4.88878e+08, 4.96998e+08,
4.96702e+08, 4.94605e+08, 4.94684e+08, 4.88917e+08, 4.90491e+08, 4.88001e+08,
4.75220e+08, 4.54272e+08, 4.79070e+08, 4.85698e+08, 4.87584e+08, 4.67904e+08,
4.66140e+08, 4.83142e+08, 4.82853e+08, 4.83473e+08, 4.73230e+08, 4.60417e+08,
4.74787e+08, 4.62731e+08, 4.75074e+08, 4.76702e+08, 4.73038e+08, 4.76166e+08,
4.75402e+08, 4.73293e+08, 4.69361e+08, 4.68777e+08, 4.69271e+08, 4.70168e+08,
4.68173e+08, 4.65280e+08, 4.67519e+08, 4.66652e+08, 4.65735e+08, 4.55064e+08,
4.58442e+08, 4.61692e+08, 4.59556e+08, 4.61737e+08, 4.59300e+08, 4.59954e+08,
4.57277e+08, 4.56700e+08, 4.57181e+08, 4.56977e+08, 4.56782e+08, 4.52472e+08,
4.48248e+08, 4.52270e+08, 4.49283e+08, 4.45559e+08, 4.42971e+08, 4.49621e+08,
4.46969e+08, 4.48215e+08, 4.46687e+08, 4.46602e+08, 4.45862e+08, 4.45478e+08,
4.43046e+08, 4.41023e+08, 4.43300e+08, 4.41015e+08, 4.38221e+08, 4.37198e+08,
4.37340e+08, 4.34133e+08, 4.36849e+08, 4.34955e+08, 4.29813e+08, 4.32491e+08,
4.29398e+08, 4.30618e+08, 4.32182e+08, 4.32215e+08, 4.25725e+08, 4.28979e+08,
4.30953e+08, 4.30598e+08, 4.29611e+08, 4.28547e+08, 4.25437e+08, 4.25535e+08,
4.25200e+08, 4.23627e+08, 4.22018e+08, 4.18707e+08, 4.14545e+08, 4.01567e+08,
3.61933e+08, 3.91122e+08, 4.08853e+08, 4.12632e+08, 4.15487e+08, 4.15550e+08,
4.13577e+08, 4.14447e+08, 4.07814e+08, 4.11185e+08, 4.13320e+08, 4.13234e+08,
4.11077e+08, 4.12288e+08, 4.11997e+08, 4.10789e+08, 4.05543e+08, 4.09765e+08,
4.09066e+08, 4.07031e+08, 4.07542e+08, 4.03160e+08, 4.02220e+08, 4.04342e+08,
4.03854e+08, 4.03514e+08, 4.03101e+08, 4.01969e+08, 3.98934e+08, 3.97615e+08,
3.96176e+08, 3.86194e+08, 3.96679e+08, 3.87594e+08, 3.89656e+08, 3.95380e+08,
3.85145e+08, 3.95007e+08, 3.93971e+08, 3.93591e+08, 3.92886e+08, 3.92821e+08,
3.92365e+08, 3.91007e+08, 3.89737e+08, 3.89242e+08, 3.87690e+08, 3.76041e+08,
3.82706e+08, 3.83554e+08, 3.79328e+08, 3.78240e+08, 3.85238e+08, 3.83113e+08,
3.81708e+08, 3.83430e+08, 3.82450e+08, 3.77666e+08, 3.77725e+08, 3.80493e+08,
3.78066e+08, 3.76982e+08, 3.76158e+08, 3.77744e+08, 3.76905e+08, 3.76518e+08,
3.75926e+08, 3.74556e+08, 3.68741e+08, 3.68983e+08, 3.73093e+08, 3.72333e+08,
3.71921e+08, 3.71032e+08, 3.69288e+08, 3.63732e+08, 3.69088e+08, 3.68626e+08,
3.67297e+08, 3.66916e+08, 3.66421e+08, 3.59767e+08, 3.64448e+08, 3.64733e+08,
3.63523e+08, 3.60044e+08, 3.62470e+08, 3.61447e+08, 3.58211e+08, 3.58096e+08,
3.57107e+08, 3.58439e+08, 3.58653e+08, 3.57175e+08, 3.57615e+08, 3.56817e+08,
3.54812e+08, 3.55349e+08, 3.54989e+08, 3.54848e+08, 3.54251e+08, 3.53657e+08,
3.52911e+08, 3.52134e+08, 3.51197e+08, 3.46995e+08, 3.49089e+08, 3.48710e+08,
3.45257e+08, 3.48170e+08, 3.48356e+08, 3.47820e+08, 3.46377e+08, 3.46166e+08,
3.45139e+08, 3.42655e+08, 3.43939e+08, 3.43960e+08, 3.41451e+08, 3.38408e+08,
3.41728e+08, 3.40420e+08, 3.40401e+08, 3.40728e+08, 3.38437e+08, 3.38329e+08,
3.35394e+08, 3.37555e+08, 3.37090e+08, 3.36141e+08, 3.32806e+08, 3.30400e+08,
3.34932e+08, 3.35523e+08, 3.34545e+08, 3.31981e+08, 3.32783e+08, 3.32599e+08,
3.32301e+08, 3.29681e+08, 3.28335e+08, 3.24197e+08, 3.25398e+08, 3.27137e+08,
3.26589e+08, 3.28508e+08, 3.26681e+08, 3.18215e+08, 3.20829e+08, 3.23931e+08,
3.25204e+08, 3.24231e+08, 3.22985e+08, 3.24193e+08, 3.21316e+08, 3.21259e+08,
3.23137e+08, 3.21574e+08, 3.09022e+08, 3.10338e+08, 3.16037e+08, 3.14298e+08,
3.13725e+08, 3.13361e+08, 3.16879e+08, 3.15352e+08, 3.15512e+08, 3.14650e+08,
3.14136e+08, 3.12346e+08, 3.07538e+08, 3.12740e+08, 3.10866e+08, 3.03140e+08,
3.03903e+08, 3.07020e+08, 3.11794e+08, 3.10775e+08, 3.08954e+08, 3.10020e+08,
3.06877e+08, 3.09398e+08, 3.07159e+08, 3.05513e+08, 3.01676e+08, 3.08261e+08,
3.05945e+08, 3.05991e+08, 3.04554e+08, 3.02621e+08, 3.03723e+08, 3.03873e+08,
3.02141e+08, 2.99804e+08, 3.01974e+08, 3.00659e+08, 2.97437e+08, 2.98907e+08,
3.02087e+08, 2.99749e+08, 2.99296e+08, 2.92812e+08, 2.96242e+08, 2.96997e+08,
2.96524e+08, 2.90699e+08, 2.56995e+08, 2.85676e+08, 2.93584e+08, 2.93719e+08,
2.95487e+08, 2.96015e+08, 2.92276e+08, 2.91930e+08, 2.86936e+08, 2.92001e+08,
2.91988e+08, 2.89591e+08, 2.92567e+08, 2.91212e+08, 2.81528e+08, 2.54405e+08,
2.67107e+08, 2.55727e+08, 2.80904e+08, 2.89561e+08, 2.87133e+08, 2.87711e+08,
2.81682e+08, 2.87818e+08, 2.85609e+08, 2.84803e+08, 2.82630e+08, 2.84328e+08,
2.81849e+08, 2.80727e+08, 2.81874e+08, 2.83578e+08, 2.82614e+08, 2.76519e+08,
2.75250e+08, 2.77503e+08, 2.79373e+08, 2.75645e+08, 2.80431e+08, 2.79077e+08,
2.80944e+08, 2.76714e+08, 2.64451e+08, 2.77741e+08, 2.78788e+08, 2.77465e+08,
2.71820e+08, 2.74361e+08, 2.76379e+08, 2.76454e+08, 2.70833e+08, 2.72220e+08,
2.65778e+08, 2.71988e+08, 2.73641e+08, 2.71681e+08, 2.73791e+08, 2.73320e+08,
2.70927e+08, 2.70707e+08, 2.67299e+08, 2.69882e+08, 2.65666e+08, 2.66549e+08,
2.67918e+08, 2.67221e+08, 2.61241e+08, 2.64351e+08, 2.57569e+08, 2.64337e+08,
2.66777e+08, 2.61028e+08, 2.59573e+08, 2.59732e+08, 2.59298e+08, 2.57420e+08,
2.58565e+08, 2.60225e+08, 2.59869e+08, 2.57086e+08, 2.54634e+08, 2.50558e+08,
2.52191e+08, 2.60893e+08, 2.59968e+08, 2.54598e+08, 2.51586e+08, 2.36401e+08,
2.48859e+08, 2.24000e+08, 2.47637e+08, 2.53756e+08, 2.52918e+08, 2.54535e+08,
2.44976e+08, 2.46095e+08, 2.41523e+08, 2.53948e+08, 2.51850e+08, 2.47014e+08,
2.45579e+08, 2.22090e+08, 2.27955e+08, 2.38718e+08, 2.45215e+08, 2.49179e+08,
2.49066e+08, 2.48420e+08, 2.36465e+08, 2.35313e+08, 2.44967e+08, 2.47039e+08,
2.48820e+08, 2.35478e+08, 2.42827e+08, 2.46327e+08, 2.42146e+08, 2.41755e+08,
2.43789e+08, 2.42447e+08, 2.40105e+08, 2.41826e+08, 2.30946e+08, 2.37758e+08,
2.38537e+08, 2.36152e+08, 2.40725e+08, 2.42593e+08, 2.34258e+08, 2.31979e+08,
2.35124e+08, 2.36135e+08, 2.31766e+08, 2.31667e+08, 2.32055e+08, 2.37393e+08,
2.34360e+08, 2.34429e+08, 2.39163e+08, 2.40059e+08, 2.38341e+08, 2.36068e+08,
2.36724e+08, 2.36474e+08, 2.26874e+08, 2.31659e+08, 2.33742e+08, 2.33715e+08,
2.31875e+08, 2.23760e+08, 2.23259e+08, 2.18732e+08, 2.20178e+08, 2.18844e+08,
2.23234e+08, 2.26245e+08, 2.22813e+08, 2.20592e+08, 2.27644e+08, 2.25264e+08,
2.24224e+08, 2.19533e+08, 2.25875e+08, 2.25770e+08, 2.21096e+08, 2.18244e+08,
2.21132e+08, 2.20824e+08, 2.20627e+08, 2.21965e+08, 2.25055e+08, 2.22636e+08,
2.23568e+08, 2.22531e+08, 2.21335e+08, 2.21002e+08, 2.20724e+08, 2.17713e+08,
2.15338e+08, 2.15784e+08, 2.14613e+08, 2.13325e+08, 2.18487e+08, 2.17891e+08,
2.11079e+08, 2.10851e+08, 2.16321e+08, 2.09928e+08, 2.05385e+08, 2.09430e+08,
2.12200e+08, 2.09692e+08, 2.06307e+08, 2.04367e+08, 2.03392e+08, 2.04114e+08,
2.07694e+08, 2.09389e+08, 2.08409e+08, 2.07153e+08, 2.08738e+08, 2.05028e+08,
2.05056e+08, 2.09507e+08, 2.09436e+08, 2.06742e+08, 2.07616e+08, 2.07802e+08,
2.05907e+08, 2.04258e+08, 2.06017e+08, 2.07136e+08, 2.02516e+08, 2.00376e+08,
2.03517e+08, 2.05193e+08, 2.03913e+08, 2.03211e+08, 2.03390e+08, 2.00585e+08,
2.01964e+08, 2.02335e+08, 2.00944e+08, 1.86482e+08, 1.94037e+08, 2.00933e+08,
1.99854e+08, 2.00464e+08, 1.98728e+08, 1.97256e+08, 1.99088e+08, 1.98584e+08,
1.97483e+08, 1.93200e+08, 1.96055e+08, 1.89897e+08, 1.91688e+08, 1.95154e+08,
1.93953e+08, 1.93595e+08, 1.88630e+08, 1.90756e+08, 1.89692e+08, 1.87436e+08,
1.87222e+08, 1.75664e+08, 1.79692e+08, 1.81335e+08, 1.78466e+08, 1.77400e+08,
1.81139e+08, 1.83194e+08, 1.83282e+08, 1.78542e+08, 1.83758e+08, 1.84746e+08,
1.85172e+08, 1.83427e+08, 1.81512e+08, 1.80278e+08, 1.82024e+08, 1.84597e+08,
1.84805e+08, 1.81634e+08, 1.82106e+08, 1.81210e+08, 1.81742e+08, 1.80919e+08,
1.80750e+08, 1.82869e+08, 1.80973e+08, 1.80495e+08, 1.81565e+08, 1.77634e+08,
1.73676e+08, 1.77139e+08, 1.76613e+08, 1.79263e+08, 1.80373e+08, 1.79589e+08,
1.78532e+08, 1.76757e+08, 1.77132e+08, 1.75055e+08, 1.74519e+08, 1.72542e+08,
1.74779e+08, 1.74119e+08, 1.74523e+08, 1.71000e+08, 1.72322e+08, 1.74329e+08,
1.73124e+08, 1.73804e+08, 1.70642e+08, 1.68675e+08, 1.68406e+08, 1.68445e+08,
1.72365e+08, 1.72000e+08, 1.71503e+08, 1.70297e+08, 1.70305e+08, 1.69990e+08,
1.69616e+08, 1.66910e+08, 1.63681e+08, 1.66374e+08, 1.66382e+08, 1.66896e+08,
1.65852e+08, 1.62679e+08, 1.65231e+08, 1.64030e+08, 1.62430e+08, 1.61986e+08,
1.63086e+08, 1.63373e+08, 1.59259e+08, 1.62321e+08, 1.62186e+08, 1.61437e+08,
1.58150e+08, 1.59857e+08, 1.58064e+08, 1.58331e+08, 1.57774e+08, 1.54807e+08,
1.54055e+08, 1.52007e+08, 1.48805e+08, 1.51522e+08, 1.53567e+08, 1.56492e+08,
1.56296e+08, 1.52675e+08, 1.57074e+08, 1.57662e+08, 1.58312e+08, 1.57525e+08,
1.55831e+08, 1.52926e+08, 1.57051e+08, 1.57066e+08, 1.55514e+08, 1.54189e+08,
1.56641e+08, 1.56476e+08, 1.55617e+08, 1.49232e+08, 1.46877e+08, 1.53481e+08,
1.50104e+08, 1.50888e+08, 1.47689e+08, 1.47262e+08, 1.50864e+08, 1.48991e+08,
1.49837e+08, 1.39843e+08, 1.47446e+08, 1.50032e+08, 1.47697e+08, 1.49583e+08,
1.51432e+08, 1.49621e+08, 1.51035e+08, 1.48046e+08, 1.46626e+08, 1.50051e+08,
1.47667e+08, 1.46332e+08, 1.47617e+08, 1.48315e+08, 1.47644e+08, 1.48356e+08,
1.47072e+08, 1.47261e+08, 1.44188e+08, 1.46559e+08, 1.46767e+08, 1.45529e+08,
1.44725e+08, 1.44067e+08, 1.41632e+08, 1.36450e+08, 1.35536e+08, 1.21908e+08,
1.15187e+08, 1.33737e+08, 1.35760e+08, 1.39282e+08, 1.41573e+08, 1.42162e+08,
1.41415e+08, 1.40269e+08, 1.41977e+08, 1.38441e+08, 1.37835e+08, 1.40651e+08,
1.39877e+08, 1.38629e+08, 1.39511e+08, 1.38714e+08, 1.36202e+08, 1.36873e+08,
1.38445e+08, 1.36342e+08, 1.32742e+08, 1.37769e+08, 1.38557e+08, 1.36587e+08,
1.37882e+08, 1.37228e+08, 1.37792e+08, 1.36243e+08, 1.35287e+08, 1.36259e+08,
1.36937e+08, 1.35835e+08, 1.35455e+08, 1.35793e+08, 1.35456e+08, 1.34263e+08,
1.32609e+08, 1.34704e+08, 1.35003e+08, 1.34806e+08, 1.33605e+08, 1.33876e+08,
1.33262e+08, 1.32816e+08, 1.26351e+08, 1.31785e+08, 1.31686e+08, 1.32127e+08,
1.32244e+08, 1.32299e+08, 1.30968e+08, 1.30653e+08, 1.30918e+08, 1.28205e+08,
1.30542e+08, 1.27080e+08, 1.27795e+08, 1.29760e+08, 1.28801e+08, 1.28231e+08,
1.28792e+08, 1.28258e+08, 1.27423e+08, 1.23563e+08, 1.24608e+08, 1.25081e+08,
1.23952e+08, 1.20100e+08, 1.14481e+08, 1.12378e+08, 1.12940e+08, 1.20653e+08,
1.22239e+08, 1.21622e+08, 1.20130e+08, 1.15604e+08, 1.22455e+08, 1.24760e+08,
1.23725e+08, 1.24272e+08, 1.24500e+08, 1.24089e+08, 1.23534e+08, 1.23212e+08,
1.22458e+08, 1.23339e+08, 1.21326e+08, 1.22516e+08, 1.21202e+08, 1.22657e+08,
1.22954e+08, 1.22696e+08, 1.22401e+08, 1.21867e+08, 1.21875e+08, 1.21761e+08,
1.19457e+08, 1.13142e+08, 1.18046e+08, 1.20453e+08, 1.20611e+08, 1.20232e+08,
1.13252e+08, 1.17599e+08, 1.17837e+08, 1.19443e+08, 1.17226e+08, 1.18935e+08,
1.18961e+08, 1.16673e+08, 1.13909e+08, 1.14816e+08, 1.18106e+08, 1.17757e+08,
1.17593e+08, 1.17386e+08, 1.15825e+08, 1.13608e+08, 1.12213e+08, 1.15658e+08,
1.15678e+08, 1.14259e+08, 1.13872e+08, 1.15742e+08, 1.15509e+08, 1.14301e+08,
1.14517e+08, 1.12791e+08, 1.14407e+08, 1.13607e+08, 1.12909e+08, 1.13754e+08,
1.13586e+08, 1.13490e+08, 1.12619e+08, 1.13190e+08, 1.13049e+08, 1.12752e+08,
1.12687e+08, 1.12217e+08, 1.12168e+08, 1.11880e+08, 1.11759e+08, 1.11698e+08,
1.11396e+08, 1.11253e+08, 1.11033e+08, 1.10796e+08, 1.10503e+08, 1.10326e+08,
1.10244e+08, 1.09738e+08, 1.09550e+08, 1.08364e+08, 1.07354e+08, 1.07951e+08,
1.09032e+08, 1.08779e+08, 1.08586e+08, 1.07073e+08, 1.08173e+08, 1.07615e+08,
1.06558e+08, 1.06315e+08, 1.07607e+08, 1.07108e+08, 1.07109e+08, 1.07119e+08,
1.06838e+08, 1.06185e+08, 1.06444e+08, 1.06137e+08, 1.05854e+08, 1.05653e+08,
1.05046e+08, 1.05394e+08, 1.05323e+08, 1.05260e+08, 1.04986e+08, 1.04810e+08,
1.04595e+08, 1.04310e+08, 1.04207e+08, 1.03256e+08, 1.03256e+08, 1.01219e+08,
1.03328e+08, 1.02095e+08, 1.01377e+08, 1.02860e+08, 1.02849e+08, 1.02640e+08,
1.01929e+08, 1.02129e+08, 1.00259e+08, 1.00489e+08, 1.00559e+08, 1.00584e+08,
1.00095e+08, 1.00992e+08, 1.00978e+08, 1.00705e+08, 1.00688e+08, 1.00542e+08,
9.98452e+07, 9.74298e+07, 9.95804e+07, 9.96270e+07, 9.89674e+07, 9.80193e+07,
9.89516e+07, 9.89632e+07, 9.88358e+07, 9.85027e+07, 9.82010e+07, 9.81086e+07,
9.50533e+07, 9.66374e+07, 9.76904e+07, 9.75024e+07, 9.71588e+07, 9.69353e+07,
9.69306e+07, 9.69507e+07, 9.67609e+07, 9.66129e+07, 9.62747e+07, 9.56072e+07,
9.59435e+07, 9.53041e+07, 9.24436e+07, 9.02638e+07, 9.50637e+07, 9.46328e+07,
9.25754e+07, 9.45391e+07, 9.44649e+07, 9.38667e+07, 9.35525e+07, 9.32425e+07,
9.31471e+07, 9.03478e+07, 9.32255e+07, 9.32038e+07, 9.17019e+07, 9.14416e+07,
9.17018e+07, 9.24653e+07, 9.23466e+07, 9.22351e+07, 9.18745e+07, 9.14912e+07,
9.21801e+07, 9.20344e+07, 9.14911e+07, 9.17015e+07, 9.16039e+07, 9.11901e+07,
9.11959e+07, 9.08590e+07, 8.73276e+07, 9.02497e+07, 9.01537e+07, 9.01611e+07,
9.02237e+07, 9.02953e+07, 9.01034e+07, 8.90792e+07, 8.92047e+07, 8.86957e+07,
8.86518e+07, 8.90371e+07, 8.89898e+07, 8.84464e+07, 8.86545e+07, 8.86784e+07,
8.83616e+07, 8.79868e+07, 8.80412e+07, 8.79248e+07, 8.76818e+07, 8.74719e+07,
8.71633e+07, 8.71129e+07, 8.67110e+07, 8.63505e+07, 8.55008e+07, 8.49940e+07,
8.39217e+07, 8.10692e+07, 7.57301e+07, 7.95874e+07, 8.29703e+07, 8.41012e+07,
8.42639e+07, 8.46651e+07, 8.49740e+07, 8.49764e+07, 8.47954e+07, 8.49712e+07,
8.44988e+07, 8.46753e+07, 8.33535e+07, 8.23984e+07, 8.43323e+07, 8.43839e+07,
8.31287e+07, 8.27531e+07, 8.37144e+07, 8.37809e+07, 8.35417e+07, 8.33618e+07,
8.12214e+07, 8.13941e+07, 8.23032e+07, 8.29924e+07, 8.28802e+07, 8.26570e+07,
8.26794e+07, 8.24886e+07, 8.24136e+07, 8.22288e+07, 8.20634e+07, 8.15666e+07,
8.14688e+07, 8.14974e+07, 8.15152e+07, 8.14608e+07, 8.13774e+07, 8.11356e+07,
7.79219e+07, 7.72198e+07, 8.01231e+07, 7.85376e+07, 8.04380e+07, 8.04456e+07,
8.02323e+07, 8.01521e+07, 7.99981e+07, 7.98889e+07, 7.96725e+07, 7.94986e+07,
7.94545e+07, 7.93921e+07, 7.92521e+07, 7.90726e+07, 7.89468e+07, 7.88724e+07,
7.86528e+07, 7.85046e+07, 7.72118e+07, 7.73342e+07, 7.81030e+07, 7.81024e+07,
7.79385e+07, 7.78330e+07, 7.77293e+07, 7.76054e+07, 7.74708e+07, 7.72296e+07,
7.71936e+07, 7.70316e+07, 7.63578e+07, 7.52654e+07, 7.61490e+07, 7.65016e+07,
7.61110e+07, 7.57725e+07, 7.61910e+07, 7.60781e+07, 7.59458e+07, 7.56934e+07,
7.41053e+07, 7.54858e+07, 7.52994e+07, 7.50068e+07, 7.47743e+07, 7.44978e+07,
7.37534e+07, 7.42036e+07, 7.41106e+07, 7.41294e+07, 7.42692e+07, 7.43106e+07,
7.42038e+07, 7.32907e+07, 7.26599e+07, 7.06623e+07, 7.33193e+07, 7.28258e+07,
7.13442e+07, 7.21597e+07, 7.30553e+07, 7.31473e+07, 7.29480e+07, 7.23336e+07,
7.25009e+07, 7.26866e+07, 7.22724e+07, 7.18567e+07, 7.21508e+07, 7.20644e+07,
7.19727e+07, 7.18251e+07, 7.12569e+07, 6.83383e+07, 6.88785e+07, 7.09792e+07,
7.09282e+07, 7.08541e+07, 7.10557e+07, 7.10478e+07, 7.09111e+07, 7.06333e+07,
7.05774e+07, 6.98886e+07, 7.02153e+07, 6.96440e+07, 6.80536e+07, 6.90620e+07,
6.88800e+07, 6.91070e+07, 6.92923e+07, 6.90734e+07, 6.90569e+07, 6.90519e+07,
6.90166e+07, 6.88433e+07, 6.87626e+07, 6.85983e+07, 6.84018e+07, 6.85202e+07,
6.82375e+07, 6.82898e+07, 6.82219e+07, 6.81150e+07, 6.80487e+07, 6.79399e+07,
6.76641e+07, 6.64055e+07, 6.73585e+07, 6.69231e+07, 6.69080e+07, 6.70065e+07,
6.71772e+07, 6.70363e+07, 6.66228e+07, 6.45489e+07, 6.53128e+07, 6.54712e+07,
6.56731e+07, 6.57276e+07, 6.57268e+07, 6.55366e+07, 6.56232e+07, 6.54947e+07,
6.54613e+07, 6.52837e+07, 6.51842e+07, 6.44743e+07, 6.44184e+07, 6.51371e+07,
6.40499e+07, 6.35398e+07, 6.48431e+07, 6.47897e+07, 6.47990e+07, 6.46224e+07,
6.44787e+07, 6.44141e+07, 6.44121e+07, 6.42716e+07, 6.41855e+07, 6.41730e+07,
6.39835e+07, 6.37086e+07, 6.29727e+07, 6.14763e+07, 6.23451e+07, 6.26547e+07,
6.26626e+07, 6.20624e+07, 6.20864e+07, 6.23229e+07, 6.26463e+07, 6.24925e+07,
6.25592e+07, 6.23814e+07, 6.24774e+07, 6.23588e+07, 6.22647e+07, 6.20743e+07,
6.21807e+07, 6.17638e+07, 6.14680e+07, 6.17368e+07, 6.18923e+07, 6.15865e+07,
6.16441e+07, 6.16905e+07, 6.16637e+07, 6.16595e+07, 6.14807e+07, 6.13731e+07,
6.11671e+07, 6.11579e+07, 6.11831e+07, 5.94215e+07, 5.90128e+07, 5.81191e+07,
5.84876e+07, 5.82305e+07, 5.99695e+07, 6.00948e+07, 6.00619e+07, 6.00253e+07,
6.00046e+07, 5.94308e+07, 5.99288e+07, 5.95389e+07, 5.92698e+07, 5.96795e+07,
5.94047e+07, 5.95159e+07, 5.91998e+07, 5.93105e+07, 5.94261e+07, 5.91454e+07,
5.88811e+07, 5.90244e+07, 5.89855e+07, 5.88803e+07, 5.88198e+07, 5.85444e+07,
5.86280e+07, 5.85407e+07, 5.84796e+07, 5.83135e+07, 5.72592e+07, 5.70230e+07,
5.73858e+07, 5.72833e+07, 5.76108e+07, 5.75458e+07, 5.72060e+07, 5.74154e+07,
5.74155e+07, 5.72312e+07, 5.72651e+07, 5.70388e+07, 5.70317e+07, 5.66679e+07,
5.67086e+07, 5.66335e+07, 5.68201e+07, 5.64489e+07, 5.65879e+07, 5.65501e+07,
5.61994e+07, 5.61294e+07, 5.62149e+07, 5.61560e+07, 5.52640e+07, 5.60732e+07,
5.61166e+07, 5.57159e+07, 5.57485e+07, 5.58447e+07, 5.56277e+07, 5.53965e+07,
5.45291e+07, 5.44451e+07, 5.44819e+07, 5.45672e+07, 5.46030e+07, 5.43300e+07,
5.46796e+07, 5.46021e+07, 5.41452e+07, 5.40159e+07, 5.34482e+07, 5.28407e+07,
5.35613e+07, 5.42552e+07, 5.42363e+07, 5.41628e+07, 5.39336e+07, 5.33158e+07,
5.39786e+07, 5.35214e+07, 5.35771e+07, 5.37377e+07, 5.35977e+07, 5.34993e+07,
5.34391e+07, 5.33766e+07, 5.31537e+07, 5.26723e+07, 5.24827e+07, 5.30579e+07,
5.28225e+07, 5.30503e+07, 5.28377e+07, 5.16127e+07, 5.10146e+07, 5.03998e+07,
5.05480e+07, 5.01362e+07, 5.21231e+07, 5.19700e+07, 5.07552e+07, 4.85493e+07,
5.16863e+07, 5.15405e+07, 5.17534e+07, 5.15434e+07, 5.15545e+07, 5.10149e+07,
5.14546e+07, 5.11551e+07, 5.13144e+07, 5.11899e+07, 5.10315e+07, 5.10385e+07,
5.08895e+07, 5.08984e+07, 5.09639e+07, 5.06380e+07, 5.05568e+07, 5.06576e+07,
5.06633e+07, 5.02240e+07, 5.01671e+07, 5.03419e+07, 4.99077e+07, 4.96888e+07,
4.96758e+07, 4.95427e+07, 4.96654e+07, 4.95673e+07, 4.96656e+07, 4.96110e+07,
4.89886e+07, 4.93875e+07, 4.93829e+07, 4.93738e+07, 4.92663e+07, 4.92069e+07,
4.90053e+07, 4.90453e+07, 4.88226e+07, 4.87901e+07, 4.88016e+07, 4.86474e+07,
4.87192e+07, 4.87129e+07, 4.86353e+07, 4.83596e+07, 4.84662e+07, 4.84709e+07,
4.82885e+07, 4.80491e+07, 4.80389e+07, 4.76267e+07, 4.78130e+07, 4.59928e+07,
4.24207e+07, 4.69068e+07, 4.74044e+07, 4.73751e+07, 4.74099e+07, 4.69291e+07,
4.67839e+07, 4.69163e+07, 4.71313e+07, 4.67341e+07, 4.59732e+07, 4.60281e+07,
4.67752e+07, 4.65786e+07, 4.62386e+07, 4.62917e+07, 4.63663e+07, 4.66104e+07,
4.61903e+07, 4.57164e+07, 4.48028e+07, 4.53914e+07, 4.59880e+07, 4.56323e+07,
4.60161e+07, 4.56695e+07, 4.58417e+07, 4.59081e+07, 4.55244e+07, 4.55436e+07,
4.56620e+07, 4.57173e+07, 4.55804e+07, 4.54504e+07, 4.55268e+07, 4.54358e+07,
4.52377e+07, 4.54271e+07, 4.52972e+07, 4.50246e+07, 4.46756e+07, 4.49052e+07,
4.44047e+07, 4.42347e+07, 4.26025e+07, 4.36715e+07, 4.45189e+07, 4.45860e+07,
4.44520e+07, 4.44472e+07, 4.41724e+07, 4.29250e+07, 4.37133e+07, 4.30766e+07,
4.32566e+07, 4.31444e+07, 4.37191e+07, 4.38583e+07, 4.34802e+07, 4.34215e+07,
4.32302e+07, 4.35448e+07, 4.34793e+07, 4.32875e+07, 4.35792e+07, 4.34663e+07,
4.34829e+07, 4.33483e+07, 4.33138e+07, 4.33321e+07, 4.30708e+07, 4.30995e+07,
4.30803e+07, 4.30280e+07, 4.28371e+07, 4.27414e+07, 4.23488e+07, 4.21723e+07,
4.22924e+07, 4.20916e+07, 4.15653e+07, 4.06720e+07, 4.07752e+07, 3.88035e+07,
3.65303e+07, 3.95495e+07, 4.08835e+07, 4.12953e+07, 4.14670e+07, 4.12646e+07,
4.15715e+07, 4.17711e+07, 4.16994e+07, 4.16053e+07, 4.17070e+07, 4.16873e+07,
4.14453e+07, 4.11604e+07, 3.82918e+07, 4.10898e+07, 4.10400e+07, 4.11268e+07,
4.12994e+07, 4.12758e+07, 4.11826e+07, 4.10107e+07, 4.06680e+07, 4.09453e+07,
4.10020e+07, 4.07411e+07, 4.07181e+07, 4.08487e+07, 4.04066e+07, 3.95439e+07,
4.05029e+07, 4.05919e+07, 4.05107e+07, 4.03701e+07, 4.03226e+07, 4.02825e+07,
3.99463e+07, 3.98278e+07, 3.98971e+07, 3.87835e+07, 3.96291e+07, 3.94090e+07,
3.99578e+07, 3.99081e+07, 3.98408e+07, 3.97724e+07, 3.97808e+07, 3.97256e+07,
3.96716e+07, 3.94843e+07, 3.94956e+07, 3.95203e+07, 3.94784e+07, 3.94205e+07,
3.92157e+07, 3.92013e+07, 3.92076e+07, 3.91053e+07, 3.91013e+07, 3.90588e+07,
3.90259e+07, 3.89927e+07, 3.87090e+07, 3.88260e+07, 3.88047e+07, 3.86953e+07,
3.86127e+07, 3.85968e+07, 3.84972e+07, 3.83765e+07, 3.81709e+07, 3.83800e+07,
3.84592e+07, 3.83837e+07, 3.82219e+07, 3.81221e+07, 3.81618e+07, 3.81683e+07,
3.80293e+07, 3.81225e+07, 3.79586e+07, 3.74656e+07, 3.76594e+07, 3.79063e+07,
3.78605e+07, 3.73825e+07, 3.72048e+07, 3.77497e+07, 3.77149e+07, 3.76596e+07,
3.76071e+07, 3.75283e+07, 3.75152e+07, 3.74350e+07, 3.74055e+07, 3.73059e+07,
3.72409e+07, 3.73299e+07, 3.72878e+07, 3.71483e+07, 3.71388e+07, 3.64899e+07,
3.70918e+07, 3.70473e+07, 3.70334e+07,
];
+33 -5
View File
@@ -2,6 +2,8 @@
//!
//! Wavelengths are in meters, like every other length in this crate.
use std::borrow::Cow;
/// A function of wavelength, linearly interpolated between samples and zero outside them.
#[derive(Clone, Debug, PartialEq)]
pub struct Spectrum(Repr);
@@ -10,8 +12,8 @@ pub struct Spectrum(Repr);
enum Repr {
Constant(f64),
Sampled {
wavelength: Vec<f64>,
value: Vec<f64>,
wavelength: Cow<'static, [f64]>,
value: Cow<'static, [f64]>,
},
}
@@ -29,7 +31,22 @@ impl Spectrum {
let increasing = wavelength.windows(2).all(|w| w[0] < w[1]);
let finite = wavelength.iter().chain(&value).all(|x| x.is_finite());
(wavelength.len() == value.len() && wavelength.len() >= 2 && increasing && finite)
.then_some(Self(Repr::Sampled { wavelength, value }))
.then_some(Self(Repr::Sampled {
wavelength: wavelength.into(),
value: value.into(),
}))
}
/// Samples compiled into the binary, borrowed rather than copied. The caller
/// guarantees what [`Spectrum::sampled`] checks.
pub(crate) fn from_static(wavelength: &'static [f64], value: &'static [f64]) -> Self {
debug_assert!(
wavelength.len() == value.len() && wavelength.windows(2).all(|w| w[0] < w[1])
);
Self(Repr::Sampled {
wavelength: Cow::Borrowed(wavelength),
value: Cow::Borrowed(value),
})
}
/// A Gaussian band with the given peak, center and full width at half maximum, sampled
@@ -41,11 +58,14 @@ impl Spectrum {
let wavelength: Vec<f64> = (0..SAMPLES)
.map(|i| lo + (hi - lo) * i as f64 / (SAMPLES - 1) as f64)
.collect();
let value = wavelength
let value: Vec<f64> = wavelength
.iter()
.map(|l| peak * (-0.5 * ((l - center) / sigma).powi(2)).exp())
.collect();
Self(Repr::Sampled { wavelength, value })
Self(Repr::Sampled {
wavelength: wavelength.into(),
value: value.into(),
})
}
/// The value at `wavelength`, in meters.
@@ -68,6 +88,14 @@ impl Spectrum {
}
}
/// The wavelengths where this spectrum changes slope, empty if it is constant.
pub(crate) fn breakpoints(&self) -> &[f64] {
match &self.0 {
Repr::Constant(_) => &[],
Repr::Sampled { wavelength, .. } => wavelength,
}
}
/// The wavelength range outside which this spectrum is zero, or `None` if it is
/// constant and so has no bound of its own.
pub fn support(&self) -> Option<(f64, f64)> {