pub trait StateEvolution<T = Time, Y = Quantity>{
type Field: Integrable;
type Drive;
// Required methods
fn initial_state(&self) -> <Self::Field as Integrable>::Point;
fn state_rate(
&self,
time: Quantity<T>,
drive: &Self::Drive,
state: &<Self::Field as Integrable>::Point,
) -> Result<Derivative<<Self::Field as Integrable>::Increment, T>, String>;
}Expand description
A model whose internal state evolves as a product of Lie-algebra rates,
ready for the field drivers. Self::Drive is the externally-imposed input
the rate needs beside the state (e.g. the total deformation gradient).
Y is only a discriminant: a model type (e.g. Canonical) that could carry
several kinds of internal state selects one impl per Y, so it appears here
even though nothing in the trait names it.
Required Associated Types§
Sourcetype Field: Integrable
type Field: Integrable
Geometry of the composite internal state.
Required Methods§
Sourcefn initial_state(&self) -> <Self::Field as Integrable>::Point
fn initial_state(&self) -> <Self::Field as Integrable>::Point
The initial internal state.
Sourcefn state_rate(
&self,
time: Quantity<T>,
drive: &Self::Drive,
state: &<Self::Field as Integrable>::Point,
) -> Result<Derivative<<Self::Field as Integrable>::Increment, T>, String>
fn state_rate( &self, time: Quantity<T>, drive: &Self::Drive, state: &<Self::Field as Integrable>::Point, ) -> Result<Derivative<<Self::Field as Integrable>::Increment, T>, String>
The product of Lie-algebra rates at (time, drive, state).
Dyn Compatibility§
This trait is dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".
Implementors§
Source§impl<C, Y> StateEvolution<Time, Y> for Cwhere
C: ElasticViscoplastic<Y>,
for<'a> Y: Clone + Differentiable<Time> + Tensor + Add<&'a Y, Output = Y>,
TensorTuple<TensorRank2<3, Intermediate, Intermediate>, Y>: Differentiable<Time, Derivative = TensorTuple<TensorRank2<3, Intermediate, Intermediate, Rate>, Derivative<Y>>>,
The internal state (F_p, Y) evolves as F_p on the unimodular group
(Reference → Intermediate, so its algebra element D_p Δt is
Intermediate → Intermediate) and the hardening variable Y additively. The
rate is (D_p, Ẏ), from the model’s plastic_evolution (D_p recovered as
Ḟ_p F_p⁻¹), driven by the total deformation gradient through the Mandel
stress. Blanket over any ElasticViscoplastic model — not
Canonical-specific — so a hybrid composition gets it automatically as
soon as it implements ElasticViscoplastic<Y>.
impl<C, Y> StateEvolution<Time, Y> for Cwhere
C: ElasticViscoplastic<Y>,
for<'a> Y: Clone + Differentiable<Time> + Tensor + Add<&'a Y, Output = Y>,
TensorTuple<TensorRank2<3, Intermediate, Intermediate>, Y>: Differentiable<Time, Derivative = TensorTuple<TensorRank2<3, Intermediate, Intermediate, Rate>, Derivative<Y>>>,
The internal state (F_p, Y) evolves as F_p on the unimodular group
(Reference → Intermediate, so its algebra element D_p Δt is
Intermediate → Intermediate) and the hardening variable Y additively. The
rate is (D_p, Ẏ), from the model’s plastic_evolution (D_p recovered as
Ḟ_p F_p⁻¹), driven by the total deformation gradient through the Mandel
stress. Blanket over any ElasticViscoplastic model — not
Canonical-specific — so a hybrid composition gets it automatically as
soon as it implements ElasticViscoplastic<Y>.