rdbench 0.1.0

Reaction-diffusion simulation based on Gray-Scott model.
Documentation
#[derive(Debug)]
pub enum Error {
    InvalidParameters(String),
    InvalidDomain {
        np: i32,
        dims: Vec<i32>,
        msg: String,
    },
    InvalidArguments(String),
    InvalidData(String),
    MpiError {
        code: i32,
        msg: String,
    },
}

impl Error {
    pub fn invalid_parameters(msg: &str) -> Self {
        Error::InvalidParameters(msg.to_string())
    }

    pub fn invalid_domain(np: i32, dims: &Vec<i32>, msg: &str) -> Self {
        Error::InvalidDomain {
            np,
            dims: dims.clone(),
            msg: msg.to_string(),
        }
    }

    pub fn invalid_arguments(msg: &str) -> Self {
        Error::InvalidArguments(msg.to_string())
    }

    pub fn invalid_data(msg: &str) -> Self {
        Error::InvalidData(msg.to_string())
    }

    pub fn mpi_error(code: i32, msg: &str) -> Self {
        Error::MpiError {
            code,
            msg: msg.to_string(),
        }
    }
}

pub type Result<T> = std::result::Result<T, Error>;

impl std::fmt::Display for Error {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            Error::InvalidParameters(msg) => write!(f, "Invalid parameters: {}", msg),
            Error::InvalidDomain { np, dims, msg } => {
                write!(f, "Invalid domain (np={}, dims={:?}): {}", np, dims, msg)
            }
            Error::InvalidArguments(msg) => write!(f, "Invalid arguments: {}", msg),
            Error::InvalidData(msg) => write!(f, "Invalid data: {}", msg),
            Error::MpiError { code, msg } => write!(f, "MPI error: ({}) {}", code, msg),
        }
    }
}

impl std::error::Error for Error {
    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
        match self {
            Error::InvalidParameters(_) => None,
            Error::InvalidDomain { .. } => None,
            Error::InvalidArguments(_) => None,
            Error::InvalidData(_) => None,
            Error::MpiError { .. } => None,
        }
    }
}