// Fundamental physical constants and optical unit conversions.

///|
/// Speed of light in vacuum (m/s)
pub const C_LIGHT : Double = 299792458.0

///|
/// Planck's constant (J*s)
pub const PLANCK_H : Double = 6.62607015e-34

///|
/// Reduced Planck's constant (J*s)
pub const H_BAR : Double = 1.054571817e-34

///|
/// Vacuum permittivity (F/m)
pub const EPSILON_0 : Double = 8.8541878128e-12

///|
/// Mathematical constant PI
pub const PI : Double = 3.14159265358979323846

///|
/// 2 * PI
pub const TWO_PI : Double = 6.28318530717958647692

///|
/// Standard C-band telecommunication wavelength (1550 nm in meters)
pub const WAVELENGTH_1550NM : Double = 1550.0e-9

///|
/// Ytterbium laser wavelength (1064 nm in meters)
pub const WAVELENGTH_1064NM : Double = 1064.0e-9

///|
/// Titanium-Sapphire laser wavelength (800 nm in meters)
pub const WAVELENGTH_800NM : Double = 800.0e-9

///|
/// Convert wavelength in meters to angular frequency omega0 (rad/s)
pub fn wavelength_to_omega(wavelength : Double) -> Double {
  TWO_PI * C_LIGHT / wavelength
}

///|
/// Convert angular frequency to wavelength in meters
pub fn omega_to_wavelength(omega : Double) -> Double {
  TWO_PI * C_LIGHT / omega
}

///|
/// Calculate group velocity dispersion (GVD) parameter beta2 (ps^2/km) from dispersion D (ps/(nm*km))
pub fn d_to_beta2(d_param : Double, wavelength : Double) -> Double {
  // beta2 = - (lambda^2 / (2 * pi * c)) * D
  let factor = -(wavelength * wavelength) / (TWO_PI * C_LIGHT)
  factor * d_param * 1.0e-6
}