cubature_sys/
lib.rs

1pub mod ffi;
2pub use crate::ffi::*;
3
4#[cfg(test)]
5mod tests {
6    use super::*;
7    use std::ptr::addr_of_mut;
8
9    #[test]
10    fn h_integrate_sawtooth() {
11        extern "C" fn my_integrand(
12            ndim: ::std::os::raw::c_uint,
13            x: *const f64,
14            arg1: *mut ::std::os::raw::c_void,
15            fdim: ::std::os::raw::c_uint,
16            fval: *mut f64,
17        ) -> ::std::os::raw::c_int {
18            unsafe {
19                let xv = std::slice::from_raw_parts(x, ndim as usize);
20                let fvalv = std::slice::from_raw_parts_mut(fval, fdim as usize);
21                fvalv[0] = xv[0] - xv[0].floor();
22                fvalv[1] = xv[1] - xv[1].floor();
23                fvalv[2] = (xv[0] - xv[0].floor()) * (xv[1] - xv[1].floor());
24                *arg1.cast::<usize>() += 1;
25            }
26            0
27        }
28
29        let xmin = [0.0, 0.0];
30        let xmax = [1.5, 1.5];
31        let mut num_eval: usize = 0;
32        let max_eval = 100000;
33        let req_abs_error = 1.0e-8;
34        let req_rel_error = 1.0e-8;
35        let mut valv: [f64; 3] = Default::default();
36        let mut errv: [f64; 3] = Default::default();
37        unsafe {
38            hcubature(
39                3,
40                Some(my_integrand),
41                addr_of_mut!(num_eval) as *mut _,
42                2,
43                xmin.as_ptr(),
44                xmax.as_ptr(),
45                max_eval,
46                req_abs_error,
47                req_rel_error,
48                ErrorNorm::L2,
49                valv.as_mut_ptr(),
50                errv.as_mut_ptr(),
51            );
52        }
53        assert!(num_eval < max_eval);
54
55        let expected_vals = [0.9375, 0.9375, 0.390625];
56        for ((&val, &err), &expected_val) in valv.iter().zip(errv.iter()).zip(expected_vals.iter())
57        {
58            assert!((val - expected_val).abs() < req_abs_error);
59            assert!(err < req_abs_error);
60        }
61    }
62}