#![doc = include_str!("../README.md")]
#![forbid(unsafe_code)]
#![deny(missing_docs)]
pub type BmiResult<T> = Result<T, Box<dyn std::error::Error + Send + Sync>>;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Location {
Node,
Edge,
Face,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum GridType {
Scalar,
Points,
Vector,
Unstructured,
StructuredQuadrilateral,
Rectilinear,
UniformRectilinear,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Values {
I8(Vec<i8>),
U8(Vec<u8>),
I16(Vec<i16>),
U16(Vec<u16>),
I32(Vec<i32>),
U32(Vec<u32>),
I64(Vec<i64>),
U64(Vec<u64>),
F32(Vec<f32>),
F64(Vec<f64>),
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum RefValues<'a> {
I8(&'a [i8]),
U8(&'a [u8]),
I16(&'a [i16]),
U16(&'a [u16]),
I32(&'a [i32]),
U32(&'a [u32]),
I64(&'a [i64]),
U64(&'a [u64]),
F32(&'a [f32]),
F64(&'a [f64]),
}
pub trait Bmi {
fn initialize(&mut self, config_file: &str) -> BmiResult<()>;
fn update(&mut self) -> BmiResult<()>;
fn update_until(&mut self, time: f64) -> BmiResult<()>;
fn finalize(&mut self) -> BmiResult<()>;
fn get_component_name(&self) -> BmiResult<String>;
fn get_input_item_count(&self) -> BmiResult<usize>;
fn get_output_item_count(&self) -> BmiResult<usize>;
fn get_input_var_names(&self) -> BmiResult<Vec<String>>;
fn get_output_var_names(&self) -> BmiResult<Vec<String>>;
fn get_var_grid(&self, name: &str) -> BmiResult<i32>;
fn get_var_type(&self, name: &str) -> BmiResult<String>;
fn get_var_units(&self, name: &str) -> BmiResult<String>;
fn get_var_itemsize(&self, name: &str) -> BmiResult<usize>;
fn get_var_nbytes(&self, name: &str) -> BmiResult<usize>;
fn get_var_location(&self, name: &str) -> BmiResult<Location>;
fn get_current_time(&self) -> BmiResult<f64>;
fn get_start_time(&self) -> BmiResult<f64>;
fn get_end_time(&self) -> BmiResult<f64>;
fn get_time_units(&self) -> BmiResult<String>;
fn get_time_step(&self) -> BmiResult<f64>;
fn get_value(&self, name: &str) -> BmiResult<Values>;
fn get_value_ptr(&self, name: &str) -> BmiResult<RefValues<'_>>;
fn get_value_at_indices(&self, name: &str, indices: &[usize]) -> BmiResult<Values>;
fn set_value(&mut self, name: &str, src: RefValues<'_>) -> BmiResult<()>;
fn set_value_at_indices(
&mut self,
name: &str,
indices: &[usize],
src: RefValues<'_>,
) -> BmiResult<()>;
fn get_grid_rank(&self, grid: i32) -> BmiResult<usize>;
fn get_grid_size(&self, grid: i32) -> BmiResult<usize>;
fn get_grid_type(&self, grid: i32) -> BmiResult<GridType>;
fn get_grid_shape(&self, grid: i32) -> BmiResult<Vec<usize>>;
fn get_grid_spacing(&self, grid: i32) -> BmiResult<Vec<f64>>;
fn get_grid_origin(&self, grid: i32) -> BmiResult<Vec<f64>>;
fn get_grid_x(&self, grid: i32) -> BmiResult<Vec<f64>>;
fn get_grid_y(&self, grid: i32) -> BmiResult<Vec<f64>>;
fn get_grid_z(&self, grid: i32) -> BmiResult<Vec<f64>>;
fn get_grid_node_count(&self, grid: i32) -> BmiResult<usize>;
fn get_grid_edge_count(&self, grid: i32) -> BmiResult<usize>;
fn get_grid_face_count(&self, grid: i32) -> BmiResult<usize>;
fn get_grid_edge_nodes(&self, grid: i32) -> BmiResult<Vec<usize>>;
fn get_grid_face_edges(&self, grid: i32) -> BmiResult<Vec<usize>>;
fn get_grid_face_nodes(&self, grid: i32) -> BmiResult<Vec<usize>>;
fn get_grid_nodes_per_face(&self, grid: i32) -> BmiResult<Vec<usize>>;
}