use crate::common::IntegrateFloat;
use crate::ode::ODEMethod;
use scirs2_core::ndarray::Array1;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum DAEType {
#[default]
SemiExplicit,
FullyImplicit,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum DAEIndex {
#[default]
Index1,
Index2,
Index3,
HigherIndex,
}
#[derive(Debug, Clone)]
pub struct DAEOptions<F: IntegrateFloat> {
pub dae_type: DAEType,
pub index: DAEIndex,
pub method: ODEMethod,
pub rtol: F,
pub atol: F,
pub h0: Option<F>,
pub max_steps: usize,
pub max_step: Option<F>,
pub min_step: Option<F>,
pub max_newton_iterations: usize,
pub newton_tol: F,
pub max_order: Option<usize>,
}
impl<F: IntegrateFloat> Default for DAEOptions<F> {
fn default() -> Self {
DAEOptions {
dae_type: DAEType::default(),
index: DAEIndex::default(),
method: ODEMethod::Radau, rtol: F::from_f64(1e-3).expect("Operation failed"),
atol: F::from_f64(1e-6).expect("Operation failed"),
h0: None,
max_steps: 500,
max_step: None,
min_step: None,
max_newton_iterations: 10,
newton_tol: F::from_f64(1e-8).expect("Operation failed"),
max_order: None,
}
}
}
#[derive(Debug, Clone)]
pub struct DAEResult<F: IntegrateFloat> {
pub t: Vec<F>,
pub x: Vec<Array1<F>>,
pub y: Vec<Array1<F>>,
pub success: bool,
pub message: Option<String>,
pub n_eval: usize,
pub n_constraint_eval: usize,
pub n_steps: usize,
pub n_accepted: usize,
pub n_rejected: usize,
pub n_lu: usize,
pub n_jac: usize,
pub method: ODEMethod,
pub dae_type: DAEType,
pub index: DAEIndex,
}