///|
pub fn debye_length(
  electron_temperature_k : Double,
  electron_density_m3 : Double,
) -> Double {
  let top = vacuum_permittivity * boltzmann_constant * electron_temperature_k
  let bottom = electron_density_m3 * elementary_charge * elementary_charge
  (top / bottom).sqrt()
}

///|
pub fn plasma_frequency(
  density_m3 : Double,
  charge_c? : Double = elementary_charge,
  mass_kg? : Double = electron_mass,
) -> Double {
  (density_m3 * charge_c * charge_c / (vacuum_permittivity * mass_kg)).sqrt()
}

///|
pub fn electron_plasma_frequency(electron_density_m3 : Double) -> Double {
  plasma_frequency(electron_density_m3)
}

///|
pub fn gyro_frequency(
  charge_c : Double,
  magnetic_field_t : Double,
  mass_kg : Double,
) -> Double {
  charge_c * magnetic_field_t / mass_kg
}

///|
pub fn plasma_parameter(
  electron_density_m3 : Double,
  debye_length_m : Double,
) -> Double {
  4.0 *
  pi *
  electron_density_m3 *
  debye_length_m *
  debye_length_m *
  debye_length_m /
  3.0
}

///|
pub fn landau_damping_rate(
  wave_number_m : Double,
  electron_temperature_k : Double,
  electron_density_m3 : Double,
) -> Double {
  let lambda_d = debye_length(electron_temperature_k, electron_density_m3)
  let k_lambda = wave_number_m * lambda_d
  if k_lambda <= 0.0 {
    0.0
  } else {
    let omega_p = electron_plasma_frequency(electron_density_m3)
    let exponent = -1.0 / (2.0 * k_lambda * k_lambda) - 1.5
    -(pi / 8.0).sqrt() *
    omega_p /
    (k_lambda * k_lambda * k_lambda) *
    @math.exp(exponent)
  }
}