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 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 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 let zfp = unsafe { zfp_stream_open(std::ptr::null_mut() as *mut bitstream) };
49
50 unsafe { zfp_stream_set_rate(zfp, 8.0, data_type, 3, 0) };
52 #[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 let bufsize = unsafe { zfp_stream_maximum_size(zfp, field) };
68 let mut buffer: Vec<u8> = vec![0; bufsize as usize];
69
70 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 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 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 unsafe {
106 zfp_field_free(field);
107 zfp_stream_close(zfp);
108 stream_close(stream);
109 }
110
111 assert!(true);
112 }
113}