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}