use std::sync::Arc;
use super::advecator::Advector;
use super::phasespace::PhaseSpaceRepr;
use super::progress::StepProgress;
use super::solver::PoissonSolver;
use super::types::{AccelerationField, DensityField, PotentialField};
use crate::CausticError;
pub struct StepProducts {
pub density: DensityField,
pub potential: PotentialField,
pub acceleration: AccelerationField,
}
pub struct SimState {
pub time: f64,
pub step: u64,
pub step_rank_diagnostics: Option<super::time::rank_monitor::StepRankDiagnostics>,
}
#[derive(Clone, Debug, Default)]
pub struct StepTimings {
pub drift_ms: f64,
pub poisson_ms: f64,
pub kick_ms: f64,
pub density_ms: f64,
pub diagnostics_ms: f64,
pub io_ms: f64,
pub other_ms: f64,
}
impl StepTimings {
pub fn to_array(&self) -> [f64; 7] {
[
self.drift_ms,
self.poisson_ms,
self.kick_ms,
self.density_ms,
self.diagnostics_ms,
self.io_ms,
self.other_ms,
]
}
}
pub trait TimeIntegrator {
fn advance(
&mut self,
repr: &mut dyn PhaseSpaceRepr,
solver: &dyn PoissonSolver,
advector: &dyn Advector,
dt: f64,
) -> Result<StepProducts, CausticError>;
fn max_dt(&self, repr: &dyn PhaseSpaceRepr, cfl_factor: f64) -> f64;
fn last_step_timings(&self) -> Option<&StepTimings> {
None
}
fn set_progress(&mut self, _progress: Arc<StepProgress>) {}
fn suggested_dt(&self) -> Option<f64> {
None
}
}