use crate::IntegrateFloat;
#[derive(Debug, Clone)]
pub struct AdaptiveMethodState<F: IntegrateFloat> {
pub method_type: AdaptiveMethodType,
pub steps_since_switch: usize,
pub order: usize,
pub config: crate::ode::utils::stiffness::StiffnessDetectionConfig<F>,
pub detector: crate::ode::utils::stiffness::StiffnessDetector<F>,
}
impl<F: IntegrateFloat> AdaptiveMethodState<F> {
pub fn with_config(config: crate::ode::utils::stiffness::StiffnessDetectionConfig<F>) -> Self {
let detector = crate::ode::utils::stiffness::StiffnessDetector::with_config(config.clone());
Self {
method_type: AdaptiveMethodType::Adams,
steps_since_switch: 0,
order: 1, config,
detector,
}
}
pub fn record_step(&mut self, _errorestimate: F) {
self.steps_since_switch += 1;
}
pub fn check_method_switch(&self) -> Option<AdaptiveMethodType> {
if self.steps_since_switch > 10 {
None
} else {
None
}
}
pub fn switch_method(
&mut self,
new_method: AdaptiveMethodType,
_steps: usize,
) -> crate::error::IntegrateResult<()> {
self.method_type = new_method;
self.steps_since_switch = 0;
Ok(())
}
pub fn generate_diagnostic_message(&self) -> String {
format!(
"AdaptiveMethodState: method={:?}, steps_since_switch={}",
self.method_type, self.steps_since_switch
)
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum AdaptiveMethodType {
Adams,
BDF,
RungeKutta,
Implicit,
Explicit,
}