use core::ffi::c_int;
use crate::ffi;
pub fn cyl_bessel_j(nu: f64, x: f64) -> f64 {
unsafe { ffi::math_cyl_bessel_j(nu, x) }
}
pub fn cyl_bessel_j_zero(nu: f64, k: u32) -> f64 {
assert!(k < c_int::MAX as u32);
unsafe { ffi::math_cyl_bessel_j_zero(nu, (k + 1) as c_int) }
}
#[doc(alias = "cyl_bessel_y")]
pub fn cyl_neumann(nu: f64, x: f64) -> f64 {
unsafe { ffi::math_cyl_neumann(nu, x) }
}
pub fn cyl_neumann_zero(nu: f64, k: u32) -> f64 {
assert!(k < c_int::MAX as u32);
unsafe { ffi::math_cyl_neumann_zero(nu, (k + 1) as c_int) }
}
pub fn cyl_bessel_i(nu: f64, x: f64) -> f64 {
unsafe { ffi::math_cyl_bessel_i(nu, x) }
}
pub fn cyl_bessel_k(nu: f64, x: f64) -> f64 {
unsafe { ffi::math_cyl_bessel_k(nu, x) }
}
#[doc(alias = "sph_bessel_j")]
pub fn sph_bessel(n: u32, x: f64) -> f64 {
unsafe { ffi::math_sph_bessel(n, x) }
}
#[doc(alias = "sph_bessel_y")]
pub fn sph_neumann(n: u32, x: f64) -> f64 {
unsafe { ffi::math_sph_neumann(n, x) }
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_cyl_bessel_j() {
assert_eq!(cyl_bessel_j(0.0, 0.0), 1.0);
}
#[test]
fn test_cyl_bessel_j_zero() {
assert_relative_eq!(cyl_bessel_j_zero(0.0, 0), 2.404_825_557_695_773);
}
#[test]
fn test_cyl_neumann() {
assert_abs_diff_eq!(cyl_neumann(-1.0, 0.781078), 1.0, epsilon = 1e-7);
}
#[test]
fn test_cyl_neumann_zero() {
assert_relative_eq!(cyl_neumann_zero(0.0, 0), 0.893_576_966_279_167_5);
}
#[test]
fn test_cyl_bessel_i() {
assert_eq!(cyl_bessel_i(0.0, 0.0), 1.0);
}
#[test]
fn test_cyl_bessel_k() {
assert_abs_diff_eq!(cyl_bessel_k(-1.0, 0.7240853), 1.0, epsilon = 1e-7);
}
#[test]
fn test_sph_bessel() {
assert_eq!(sph_bessel(0, 0.0), 1.0);
}
#[test]
fn test_sph_neumann() {
assert_abs_diff_eq!(sph_neumann(0, 0.7390851), -1.0, epsilon = 1e-7);
}
}