pub struct RkState<V: Vector> { /* private fields */ }Expand description
State container for the SDIRK Runge-Kutta solversintegrator. For the common state API use as_ref and as_mut methods.
Trait Implementations§
Source§impl<V> OdeSolverState<V> for RkState<V>where
V: Vector,
impl<V> OdeSolverState<V> for RkState<V>where
V: Vector,
Source§fn set_problem<Eqn: OdeEquations>(
&mut self,
_ode_problem: &OdeSolverProblem<Eqn>,
) -> Result<(), DiffsolError>
fn set_problem<Eqn: OdeEquations>( &mut self, _ode_problem: &OdeSolverProblem<Eqn>, ) -> Result<(), DiffsolError>
Set the ODE problem for the state, allocating any necessary data structures.
Source§fn set_augmented_problem<Eqn: OdeEquations, AugmentedEqn: AugmentedOdeEquations<Eqn>>(
&mut self,
_ode_problem: &OdeSolverProblem<Eqn>,
_augmented_eqn: &AugmentedEqn,
) -> Result<(), DiffsolError>
fn set_augmented_problem<Eqn: OdeEquations, AugmentedEqn: AugmentedOdeEquations<Eqn>>( &mut self, _ode_problem: &OdeSolverProblem<Eqn>, _augmented_eqn: &AugmentedEqn, ) -> Result<(), DiffsolError>
Set the augmented ODE problem (for sensitivities) for the state.
Source§fn new_from_common(state: StateCommon<V>) -> Self
fn new_from_common(state: StateCommon<V>) -> Self
Create a new state from a common state representation.
Source§fn into_common(self) -> StateCommon<V>
fn into_common(self) -> StateCommon<V>
Convert the state into a common state representation.
Source§fn as_mut(&mut self) -> StateRefMut<'_, V>
fn as_mut(&mut self) -> StateRefMut<'_, V>
Get a mutable reference to the state.
Source§fn check_consistent_with_problem<Eqn: OdeEquations>(
&self,
problem: &OdeSolverProblem<Eqn>,
) -> Result<(), DiffsolError>
fn check_consistent_with_problem<Eqn: OdeEquations>( &self, problem: &OdeSolverProblem<Eqn>, ) -> Result<(), DiffsolError>
Check that the state is consistent with the given ODE problem.
Source§fn check_sens_consistent_with_problem<Eqn: OdeEquations, AugmentedEqn: AugmentedOdeEquations<Eqn>>(
&self,
problem: &OdeSolverProblem<Eqn>,
augmented_eqn: &AugmentedEqn,
) -> Result<(), DiffsolError>
fn check_sens_consistent_with_problem<Eqn: OdeEquations, AugmentedEqn: AugmentedOdeEquations<Eqn>>( &self, problem: &OdeSolverProblem<Eqn>, augmented_eqn: &AugmentedEqn, ) -> Result<(), DiffsolError>
Check that the sensitivity vectors in the state are consistent with the given ODE problem.
Source§fn state_mut_op<Eqn, O>(
&mut self,
eqn: &Eqn,
op: &O,
) -> Result<(), DiffsolError>
fn state_mut_op<Eqn, O>( &mut self, eqn: &Eqn, op: &O, ) -> Result<(), DiffsolError>
Apply a non-linear operator to the current state in-place, replacing
state.y with
op(state.y, state.t) and recomputing state.dy = rhs(state.y, state.t). Read moreSource§fn state_mut_op_with_sens_and_reset<Eqn, G, R>(
&mut self,
eqn: &Eqn,
reset_op: &G,
root_op: &R,
root_idx: usize,
) -> Result<(), DiffsolError>where
Eqn: OdeEquations<T = V::T, V = V, C = V::C>,
G: NonLinearOpJacobian<T = V::T, V = V, M = Eqn::M> + NonLinearOpSens<T = V::T, V = V, M = Eqn::M> + NonLinearOpTimePartial<T = V::T, V = V, M = Eqn::M>,
R: NonLinearOpJacobian<T = V::T, V = V, M = Eqn::M> + NonLinearOpSens<T = V::T, V = V, M = Eqn::M> + NonLinearOpTimePartial<T = V::T, V = V, M = Eqn::M>,
fn state_mut_op_with_sens_and_reset<Eqn, G, R>(
&mut self,
eqn: &Eqn,
reset_op: &G,
root_op: &R,
root_idx: usize,
) -> Result<(), DiffsolError>where
Eqn: OdeEquations<T = V::T, V = V, C = V::C>,
G: NonLinearOpJacobian<T = V::T, V = V, M = Eqn::M> + NonLinearOpSens<T = V::T, V = V, M = Eqn::M> + NonLinearOpTimePartial<T = V::T, V = V, M = Eqn::M>,
R: NonLinearOpJacobian<T = V::T, V = V, M = Eqn::M> + NonLinearOpSens<T = V::T, V = V, M = Eqn::M> + NonLinearOpTimePartial<T = V::T, V = V, M = Eqn::M>,
Apply a reset operator to the current state and propagate sensitivities through a
time-dependent root-triggered event correction. Read more
Source§fn state_mut_op_with_adjoint_and_reset<'a, Eqn, Method, G, R>(
&mut self,
adj_eqn: &mut AdjointEquations<'a, Eqn, Method>,
reset_op: &G,
root_op: &R,
root_idx: usize,
fwd_state_minus: &Self,
fwd_state_plus: &Self,
) -> Result<(), DiffsolError>where
Eqn: OdeEquationsAdjoint<T = V::T, V = V, C = V::C>,
Method: OdeSolverMethod<'a, Eqn>,
G: NonLinearOpJacobian<T = V::T, V = V, M = Eqn::M> + NonLinearOpAdjoint<T = V::T, V = V, M = Eqn::M> + NonLinearOpSensAdjoint<T = V::T, V = V, M = Eqn::M> + NonLinearOpTimePartial<T = V::T, V = V, M = Eqn::M>,
R: NonLinearOpJacobian<T = V::T, V = V, M = Eqn::M> + NonLinearOpAdjoint<T = V::T, V = V, M = Eqn::M> + NonLinearOpSensAdjoint<T = V::T, V = V, M = Eqn::M> + NonLinearOpTimePartial<T = V::T, V = V, M = Eqn::M>,
fn state_mut_op_with_adjoint_and_reset<'a, Eqn, Method, G, R>(
&mut self,
adj_eqn: &mut AdjointEquations<'a, Eqn, Method>,
reset_op: &G,
root_op: &R,
root_idx: usize,
fwd_state_minus: &Self,
fwd_state_plus: &Self,
) -> Result<(), DiffsolError>where
Eqn: OdeEquationsAdjoint<T = V::T, V = V, C = V::C>,
Method: OdeSolverMethod<'a, Eqn>,
G: NonLinearOpJacobian<T = V::T, V = V, M = Eqn::M> + NonLinearOpAdjoint<T = V::T, V = V, M = Eqn::M> + NonLinearOpSensAdjoint<T = V::T, V = V, M = Eqn::M> + NonLinearOpTimePartial<T = V::T, V = V, M = Eqn::M>,
R: NonLinearOpJacobian<T = V::T, V = V, M = Eqn::M> + NonLinearOpAdjoint<T = V::T, V = V, M = Eqn::M> + NonLinearOpSensAdjoint<T = V::T, V = V, M = Eqn::M> + NonLinearOpTimePartial<T = V::T, V = V, M = Eqn::M>,
Propagate adjoint variables through a time-dependent root-triggered reset. Read more
Source§fn state_mut_adjoint_terminal_root<'a, Eqn, Method>(
&mut self,
adj_eqn: &mut AdjointEquations<'a, Eqn, Method>,
root_idx: usize,
forward: &Self,
) -> Result<(), DiffsolError>where
Eqn: OdeEquationsAdjoint<T = V::T, V = V, C = V::C, Root: NonLinearOpJacobian<T = V::T, V = V, M = Eqn::M> + NonLinearOpAdjoint<T = V::T, V = V, M = Eqn::M> + NonLinearOpSensAdjoint<T = V::T, V = V, M = Eqn::M> + NonLinearOpTimePartial<T = V::T, V = V, M = Eqn::M>, Out: NonLinearOp<T = V::T, V = V, M = Eqn::M>>,
Method: OdeSolverMethod<'a, Eqn>,
fn state_mut_adjoint_terminal_root<'a, Eqn, Method>(
&mut self,
adj_eqn: &mut AdjointEquations<'a, Eqn, Method>,
root_idx: usize,
forward: &Self,
) -> Result<(), DiffsolError>where
Eqn: OdeEquationsAdjoint<T = V::T, V = V, C = V::C, Root: NonLinearOpJacobian<T = V::T, V = V, M = Eqn::M> + NonLinearOpAdjoint<T = V::T, V = V, M = Eqn::M> + NonLinearOpSensAdjoint<T = V::T, V = V, M = Eqn::M> + NonLinearOpTimePartial<T = V::T, V = V, M = Eqn::M>, Out: NonLinearOp<T = V::T, V = V, M = Eqn::M>>,
Method: OdeSolverMethod<'a, Eqn>,
Add the terminal-root adjoint correction for a root-defined final time. Read more
Source§fn new<Eqn>(
ode_problem: &OdeSolverProblem<Eqn>,
solver_order: usize,
) -> Result<Self, DiffsolError>
fn new<Eqn>( ode_problem: &OdeSolverProblem<Eqn>, solver_order: usize, ) -> Result<Self, DiffsolError>
Create a new solver state from an ODE problem.
This function will set the initial step size based on the given solver.
If you want to create a state without this default initialisation, use Self::new_without_initialise instead.
You can then use Self::set_consistent and Self::set_step_size to set the state up if you need to.
Source§fn new_and_consistent<LS, Eqn>(
ode_problem: &OdeSolverProblem<Eqn>,
solver_order: usize,
) -> Result<Self, DiffsolError>
fn new_and_consistent<LS, Eqn>( ode_problem: &OdeSolverProblem<Eqn>, solver_order: usize, ) -> Result<Self, DiffsolError>
Create a new solver state from an ODE problem.
This function will make the state consistent with any algebraic constraints using a default nonlinear solver.
It will also set the initial step size based on the given solver.
If you want to create a state without this default initialisation, use Self::new_without_initialise instead.
You can then use Self::set_consistent and Self::set_step_size to set the state up if you need to.
Source§fn new_with_sensitivities<Eqn>(
ode_problem: &OdeSolverProblem<Eqn>,
solver_order: usize,
) -> Result<Self, DiffsolError>
fn new_with_sensitivities<Eqn>( ode_problem: &OdeSolverProblem<Eqn>, solver_order: usize, ) -> Result<Self, DiffsolError>
Create a new solver state from an ODE problem with sensitivity equations.
This will initialize the sensitivity vectors but will not make them consistent with algebraic constraints.
Source§fn new_with_sensitivities_and_consistent<LS, Eqn>(
ode_problem: &OdeSolverProblem<Eqn>,
solver_order: usize,
) -> Result<Self, DiffsolError>
fn new_with_sensitivities_and_consistent<LS, Eqn>( ode_problem: &OdeSolverProblem<Eqn>, solver_order: usize, ) -> Result<Self, DiffsolError>
Create a new solver state from an ODE problem with sensitivity equations, making both the main state and sensitivities consistent with algebraic constraints.
Source§fn new_without_initialise<Eqn>(
ode_problem: &OdeSolverProblem<Eqn>,
) -> Result<Self, DiffsolError>
fn new_without_initialise<Eqn>( ode_problem: &OdeSolverProblem<Eqn>, ) -> Result<Self, DiffsolError>
Create a new solver state from an ODE problem, without any initialisation apart from setting the initial time state vector y,
the initial time derivative dy and if applicable the sensitivity vectors s.
This is useful if you want to set up the state yourself, or if you want to use a different nonlinear solver to make the state consistent,
or if you want to set the step size yourself or based on the exact order of the solver.
Source§fn new_without_initialise_augmented<Eqn, AugmentedEqn>(
ode_problem: &OdeSolverProblem<Eqn>,
augmented_eqn: &mut AugmentedEqn,
) -> Result<Self, DiffsolError>
fn new_without_initialise_augmented<Eqn, AugmentedEqn>( ode_problem: &OdeSolverProblem<Eqn>, augmented_eqn: &mut AugmentedEqn, ) -> Result<Self, DiffsolError>
Create a new solver state with augmented equations (sensitivities) from an ODE problem, without making the augmented state consistent.
Source§fn new_without_initialise_augmented_at<Eqn, AugmentedEqn>(
ode_problem: &OdeSolverProblem<Eqn>,
augmented_eqn: &mut AugmentedEqn,
t: V::T,
) -> Result<Self, DiffsolError>
fn new_without_initialise_augmented_at<Eqn, AugmentedEqn>( ode_problem: &OdeSolverProblem<Eqn>, augmented_eqn: &mut AugmentedEqn, t: V::T, ) -> Result<Self, DiffsolError>
Create a new solver state with augmented equations from an ODE problem, evaluating the
augmented initial/output operators at a caller-supplied time while leaving the base state
allocation behavior unchanged.
fn initialise_augmented_state<Eqn, AugmentedEqn>( augmented_eqn: &mut AugmentedEqn, ode_problem: &OdeSolverProblem<Eqn>, state: &mut StateCommon<V>, ) -> Result<(), DiffsolError>
Source§fn set_consistent<Eqn, S>(
&mut self,
ode_problem: &OdeSolverProblem<Eqn>,
root_solver: &mut S,
) -> Result<(), DiffsolError>
fn set_consistent<Eqn, S>( &mut self, ode_problem: &OdeSolverProblem<Eqn>, root_solver: &mut S, ) -> Result<(), DiffsolError>
Calculate a consistent state and time derivative of the state, based on the equations of the problem.
Source§fn set_consistent_augmented<Eqn, AugmentedEqn, S>(
&mut self,
ode_problem: &OdeSolverProblem<Eqn>,
augmented_eqn: &mut AugmentedEqn,
root_solver: &mut S,
) -> Result<(), DiffsolError>where
Eqn: OdeEquationsImplicit<T = V::T, V = V, C = V::C>,
AugmentedEqn: AugmentedOdeEquationsImplicit<Eqn> + Debug,
S: NonLinearSolver<AugmentedEqn::M>,
fn set_consistent_augmented<Eqn, AugmentedEqn, S>(
&mut self,
ode_problem: &OdeSolverProblem<Eqn>,
augmented_eqn: &mut AugmentedEqn,
root_solver: &mut S,
) -> Result<(), DiffsolError>where
Eqn: OdeEquationsImplicit<T = V::T, V = V, C = V::C>,
AugmentedEqn: AugmentedOdeEquationsImplicit<Eqn> + Debug,
S: NonLinearSolver<AugmentedEqn::M>,
Calculate the initial sensitivity vectors and their time derivatives, based on the equations of the problem.
Note that this function assumes that the state is already consistent with the algebraic constraints
(either via Self::set_consistent or by setting the state up manually).
Source§fn set_step_size<Eqn>(
&mut self,
h0: Eqn::T,
atol: &Eqn::V,
rtol: Eqn::T,
eqn: &Eqn,
solver_order: usize,
)
fn set_step_size<Eqn>( &mut self, h0: Eqn::T, atol: &Eqn::V, rtol: Eqn::T, eqn: &Eqn, solver_order: usize, )
compute size of first step based on alg in Hairer, Norsett, Wanner
Solving Ordinary Differential Equations I, Nonstiff Problems
Section II.4.2
Note: this assumes that the state is already consistent with the algebraic constraints
and y and dy are already set appropriately
Auto Trait Implementations§
impl<V> Freeze for RkState<V>
impl<V> RefUnwindSafe for RkState<V>
impl<V> Send for RkState<V>where
V: Send,
impl<V> Sync for RkState<V>where
V: Sync,
impl<V> Unpin for RkState<V>
impl<V> UnsafeUnpin for RkState<V>
impl<V> UnwindSafe for RkState<V>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> DistributionExt for Twhere
T: ?Sized,
impl<T> DistributionExt for Twhere
T: ?Sized,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
The inverse inclusion map: attempts to construct
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
Checks if
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
Use with care! Same as
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
The inclusion map: converts
self to the equivalent element of its superset.