use crate::{utils::vacuum_wavelength_to_frequency, *};
use dim::ucum::{C_, M};
use math::*;
const GAUSSIAN_SINC_GAMMA_FACTOR: f64 = 0.193;
pub fn gaussian_pm(x: f64) -> f64 {
f64::exp(-GAUSSIAN_SINC_GAMMA_FACTOR * x.powi(2))
}
pub fn fwhm_to_spectral_width(pump_wavelength: Wavelength, fwhm: Wavelength) -> Frequency {
let diff = pump_wavelength - 0.5 * fwhm;
let sum = pump_wavelength + 0.5 * fwhm;
let omega_high = vacuum_wavelength_to_frequency(diff);
let omega_low = vacuum_wavelength_to_frequency(sum);
fwhm_to_waist(omega_high - omega_low)
}
pub fn pump_spectral_amplitude(omega: Frequency, spdc: &SPDC) -> f64 {
let lambda_p = spdc.pump.vacuum_wavelength();
let omega_0 = spdc.pump.frequency();
let delta_omega = omega - omega_0;
let fwhm = spdc.pump_bandwidth;
let waist = fwhm_to_spectral_width(lambda_p, fwhm);
let x = delta_omega / waist;
(-x * x).exp()
}
#[deprecated(
note = "Deprecated in favour of explicit integration steps dependent on integrator type."
)]
pub fn integration_steps_best_guess(crystal_length: Distance) -> usize {
use num::clamp;
use std::cmp::max;
let zslice = 1e-4 * clamp((*(crystal_length / M) / 2.5e-3).sqrt(), 0., 5.);
let slices = (*(crystal_length / M) / zslice) as usize;
max(slices + slices % 2 - 2, 4) }
mod normalization;
pub use normalization::*;
mod delta_k;
pub use delta_k::*;
mod coincidences;
pub use coincidences::*;
mod singles;
pub use singles::*;