use super::*;
use dim::ucum::{self, EPS_0, RAD, UCUM};
pub use units::*;
#[doc(hidden)]
mod units {
use super::*;
derived!(ucum, UCUM: CommonNorm = Second * Meter * Meter * Meter * Meter / Radian / Radian);
}
fn common_norm(omega_s: Frequency, omega_i: Frequency, spdc: &SPDC) -> CommonNorm<f64> {
let degeneracy_factor = 1.0_f64;
let periodic_poling_coeff = if spdc.pp == PeriodicPoling::Off {
1.
} else {
2. / PI
};
let lambda_p = spdc.pump.vacuum_wavelength();
let fwhm = spdc.pump_bandwidth;
let sigma = fwhm_to_spectral_width(lambda_p, fwhm);
let crystal_length = spdc.crystal_setup.length;
let pump_power = spdc.pump_average_power;
let deff = spdc.deff;
let wp_sq = spdc.pump.waist().x_by_y();
let n_s = spdc.signal.refractive_index(omega_s, &spdc.crystal_setup);
let n_i = spdc.idler.refractive_index(omega_i, &spdc.crystal_setup);
let lomega = omega_s * omega_i / sq(n_s * n_i) / RAD / RAD;
let constants = (degeneracy_factor * periodic_poling_coeff).powi(2)
/ (4. * PI.powi(5) * TWO_PI.sqrt() * C_ * C_ * C_ * EPS_0);
TWO_PI.powi(3) * constants * wp_sq * sq(deff * crystal_length) * lomega / RAD * pump_power / sigma
}
pub fn jsi_normalization(omega_s: Frequency, omega_i: Frequency, spdc: &SPDC) -> JsiNorm<f64> {
let theta_i_e = spdc.idler.theta_external(&spdc.crystal_setup);
let sec_i = sec(theta_i_e);
let theta_s_e = spdc.signal.theta_external(&spdc.crystal_setup);
let sec_s = sec(theta_s_e);
let ws_sq = spdc.signal.waist().x_by_y();
let wi_sq = spdc.idler.waist().x_by_y();
let chi = common_norm(omega_s, omega_i, spdc);
chi * sec_s * sec_i * ws_sq * wi_sq
}
pub fn jsi_singles_normalization(
omega_s: Frequency,
omega_i: Frequency,
spdc: &SPDC,
) -> JsiSinglesNorm<f64> {
let theta_s_e = spdc.signal.theta_external(&spdc.crystal_setup);
let sec_s = sec(theta_s_e);
let ws_sq = spdc.signal.waist().x_by_y();
let chi = common_norm(omega_s, omega_i, spdc);
chi * sec_s * ws_sq
}