zfp_sys/
lib.rs

1#![allow(non_upper_case_globals)]
2#![allow(non_camel_case_types)]
3#![allow(non_snake_case)]
4#![allow(deref_nullptr)]
5
6include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
7
8#[cfg(test)]
9mod zfp {
10    use super::*;
11
12    #[test]
13    fn compress_array() {
14        //based on examples/simple.c
15        let nx = 100;
16        let ny = 100;
17        let nz = 100;
18
19        let mut array: Vec<f64> = vec![0.0; nx * ny * nz];
20
21        for i in 0..nx {
22            for j in 0..ny {
23                for k in 0..nz {
24                    let x = 2.0 * (i as f64) / (nx as f64);
25                    let y = 2.0 * (j as f64) / (ny as f64);
26                    let z = 2.0 * (k as f64) / (nz as f64);
27                    array[i + nx * (j + ny * k)] = (-(x * x + y * y + z * z)).exp();
28                }
29            }
30        }
31
32        println!("original data sample: {:?}", &array[0..nx]);
33
34        //compression
35        /* allocate meta data for the 3D array a[nz][ny][nx] */
36        let data_type = zfp_type_zfp_type_double;
37        let field = unsafe {
38            zfp_field_3d(
39                array.as_mut_ptr() as *mut std::ffi::c_void,
40                data_type,
41                nx as usize,
42                ny as usize,
43                nz as usize,
44            )
45        };
46
47        /* allocate meta data for a compressed stream */
48        let zfp = unsafe { zfp_stream_open(std::ptr::null_mut() as *mut bitstream) };
49
50        /* set compression mode and parameters via one of three functions */
51        unsafe { zfp_stream_set_rate(zfp, 8.0, data_type, 3, 0) };
52        /*  zfp_stream_set_precision(zfp, precision); */
53        //let tolerance = 1.0e-3;
54        //unsafe { zfp_stream_set_accuracy(zfp, tolerance) };
55
56        #[cfg(feature = "cuda")]
57        {
58            let ret = unsafe { zfp_stream_set_execution(zfp, zfp_exec_policy_zfp_exec_cuda) };
59
60            if ret == 0 {
61                println!("failed to set the execution policy to zfp_exec_cuda");
62                assert!(false);
63            }
64        }
65
66        /* allocate buffer for compressed data */
67        let bufsize = unsafe { zfp_stream_maximum_size(zfp, field) };
68        let mut buffer: Vec<u8> = vec![0; bufsize as usize];
69
70        /* associate bit stream with allocated buffer */
71        let stream = unsafe { stream_open(buffer.as_mut_ptr() as *mut std::ffi::c_void, bufsize) };
72        unsafe {
73            zfp_stream_set_bit_stream(zfp, stream);
74            zfp_stream_rewind(zfp);
75        }
76
77        /* compress array and output compressed stream */
78        let zfpsize = unsafe { zfp_compress(zfp, field) };
79        if zfpsize == 0 {
80            println!("compression failed");
81            assert!(false);
82        } else {
83            let original_size = nx * ny * nz * std::mem::size_of::<f64>();
84            let ratio = (original_size as f64) / (zfpsize as f64);
85
86            println!(
87                "bufsize: {} bytes, original size: {} bytes, compressed size: {} bytes, ratio: {}",
88                bufsize, original_size, zfpsize, ratio
89            );
90        }
91
92        /* rewind compressed stream and decompress array */
93        unsafe { zfp_stream_rewind(zfp) };
94        let ret = unsafe { zfp_decompress(zfp, field) };
95        if ret == 0 {
96            println!("decompression failed");
97            assert!(false);
98        } else {
99            println!("ret: {}", ret);
100        }
101
102        println!("decompressed data sample: {:?}", &array[0..nx]);
103
104        /* clean up */
105        unsafe {
106            zfp_field_free(field);
107            zfp_stream_close(zfp);
108            stream_close(stream);
109        }
110
111        assert!(true);
112    }
113}