mod fld_file_loader;
pub use fld_file_loader::{DataCoordinates, DataDimensionality, FileData};
#[derive(Clone, Debug)]
pub struct B1Data {
file_name: String,
geo_keys: Vec<[i32; 3]>,
b1_vals: Vec<f64>,
}
impl B1Data {
pub fn from_file(path_and_name: &str) -> Self {
let file_data = match FileData::load_file(path_and_name, 1) {
Ok(fd) => fd,
Err(msg) => panic!("{}", msg),
};
let file_name = file_data.file_name;
let geo_keys = file_data
.geo_points
.iter()
.map(|geo_floats| gen_geo_key(geo_floats))
.collect();
let b1_vals = file_data.fld_points.iter().flatten().copied().collect();
Self {
file_name,
geo_keys,
b1_vals,
}
}
}
#[derive(Clone, Debug)]
pub struct HDataGroup {
file_names: Vec<String>,
geo_keys: Vec<[i32; 3]>,
ch_h_vals: Vec<Vec<[f64; 6]>>,
num_points: usize,
}
impl HDataGroup {
pub fn from_files(paths_and_names: &[&str], assert_geo_equality: bool) -> Self {
let file_datas: Vec<FileData> = paths_and_names
.iter()
.map(|pn| match FileData::load_file(&pn, 6) {
Ok(fd) => fd,
Err(msg) => panic!("{}", msg),
})
.collect();
let num_points = file_datas[0].num_points;
for fd in file_datas.iter().skip(1) {
assert_eq!(
num_points, fd.num_points,
"H files do not have the same number of points!"
);
}
let file_names = file_datas.iter().map(|fd| fd.file_name.clone()).collect();
let geo_keys: Vec<[i32; 3]> = file_datas[0]
.geo_points
.iter()
.map(|geo_floats| gen_geo_key(geo_floats))
.collect();
if assert_geo_equality {
for fd in file_datas.iter().skip(1) {
for (key, geo_pt) in geo_keys.iter().zip(fd.geo_points.iter()) {
assert_eq!(
key,
&gen_geo_key(geo_pt),
"H files do not cover the same geometry!"
);
}
}
}
let ch_h_vals = file_datas
.iter()
.map(|fd| {
fd.fld_points
.iter()
.map(|fld_pt| {
[
fld_pt[0], fld_pt[1], fld_pt[2], fld_pt[3], fld_pt[4], fld_pt[5],
]
})
.collect()
})
.collect();
Self {
file_names,
geo_keys,
ch_h_vals,
num_points,
}
}
}
fn gen_geo_key(geo_floats: &[f64; 3]) -> [i32; 3] {
[
(geo_floats[0] * 1000.0) as i32,
(geo_floats[1] * 1000.0) as i32,
(geo_floats[2] * 1000.0) as i32,
]
}