pub trait ElasticIVElements<const G: usize, V, const D: usize>{
// Required methods
fn internal_variables_initial(&self) -> InternalVariablesField<G, V>;
fn internal_variables_increment(
&self,
nodal_coordinates: &NodalCoordinates<D>,
internal_variables: &InternalVariablesField<G, V>,
nodal_decrement: &NodalCoordinates<D>,
step: Scalar,
) -> Result<InternalVariablesField<G, V>, ElementModelError>;
fn internal_variables_root(
&self,
local_solver: &NewtonRaphson,
nodal_coordinates: &NodalCoordinates<D>,
internal_variables: &InternalVariablesField<G, V>,
) -> Result<InternalVariablesField<G, V>, ElementModelError>;
fn nodal_forces_into(
&self,
nodal_coordinates: &NodalCoordinates<D>,
internal_variables: &InternalVariablesField<G, V>,
nodal_forces: &mut NodalForcesSolid<D>,
) -> Result<(), ElementModelError>;
fn nodal_forces_eliminated_into(
&self,
nodal_coordinates: &NodalCoordinates<D>,
internal_variables: &InternalVariablesField<G, V>,
nodal_forces: &mut NodalForcesSolid<D>,
) -> Result<(), ElementModelError>;
fn nodal_stiffnesses_into(
&self,
nodal_coordinates: &NodalCoordinates<D>,
internal_variables: &InternalVariablesField<G, V>,
nodal_stiffnesses: &mut NodalStiffnessesSolid<D>,
) -> Result<(), ElementModelError>;
// Provided methods
fn nodal_forces(
&self,
nodal_coordinates: &NodalCoordinates<D>,
internal_variables: &InternalVariablesField<G, V>,
) -> Result<NodalForcesSolid<D>, ElementModelError> { ... }
fn nodal_forces_eliminated(
&self,
nodal_coordinates: &NodalCoordinates<D>,
internal_variables: &InternalVariablesField<G, V>,
) -> Result<NodalForcesSolid<D>, ElementModelError> { ... }
fn nodal_stiffnesses(
&self,
nodal_coordinates: &NodalCoordinates<D>,
internal_variables: &InternalVariablesField<G, V>,
) -> Result<NodalStiffnessesSolid<D>, ElementModelError> { ... }
}Required Methods§
Sourcefn internal_variables_initial(&self) -> InternalVariablesField<G, V>
fn internal_variables_initial(&self) -> InternalVariablesField<G, V>
The internal variables every integration point starts from.
Sourcefn internal_variables_increment(
&self,
nodal_coordinates: &NodalCoordinates<D>,
internal_variables: &InternalVariablesField<G, V>,
nodal_decrement: &NodalCoordinates<D>,
step: Scalar,
) -> Result<InternalVariablesField<G, V>, ElementModelError>
fn internal_variables_increment( &self, nodal_coordinates: &NodalCoordinates<D>, internal_variables: &InternalVariablesField<G, V>, nodal_decrement: &NodalCoordinates<D>, step: Scalar, ) -> Result<InternalVariablesField<G, V>, ElementModelError>
Steps the internal variables everywhere alongside a decrement of the nodal coordinates, rather than solving them where the coordinates now are.
This is the second row of the Newton system the solver never assembles, each integration point taking its own share of the increment.
Sourcefn internal_variables_root(
&self,
local_solver: &NewtonRaphson,
nodal_coordinates: &NodalCoordinates<D>,
internal_variables: &InternalVariablesField<G, V>,
) -> Result<InternalVariablesField<G, V>, ElementModelError>
fn internal_variables_root( &self, local_solver: &NewtonRaphson, nodal_coordinates: &NodalCoordinates<D>, internal_variables: &InternalVariablesField<G, V>, ) -> Result<InternalVariablesField<G, V>, ElementModelError>
Solves the internal variables everywhere, holding the deformation fixed.
Every integration point is independent of every other, so this is a gather of local solves rather than a system.
fn nodal_forces_into( &self, nodal_coordinates: &NodalCoordinates<D>, internal_variables: &InternalVariablesField<G, V>, nodal_forces: &mut NodalForcesSolid<D>, ) -> Result<(), ElementModelError>
Sourcefn nodal_forces_eliminated_into(
&self,
nodal_coordinates: &NodalCoordinates<D>,
internal_variables: &InternalVariablesField<G, V>,
nodal_forces: &mut NodalForcesSolid<D>,
) -> Result<(), ElementModelError>
fn nodal_forces_eliminated_into( &self, nodal_coordinates: &NodalCoordinates<D>, internal_variables: &InternalVariablesField<G, V>, nodal_forces: &mut NodalForcesSolid<D>, ) -> Result<(), ElementModelError>
The nodal forces with the residual of the internal variables eliminated into them, for when they are carried rather than solved.
\mathbf{r}_u - \mathcal{K}_{uv}\mathcal{K}_{vv}^{-1}\mathbf{r}_vfn nodal_stiffnesses_into( &self, nodal_coordinates: &NodalCoordinates<D>, internal_variables: &InternalVariablesField<G, V>, nodal_stiffnesses: &mut NodalStiffnessesSolid<D>, ) -> Result<(), ElementModelError>
Provided Methods§
fn nodal_forces( &self, nodal_coordinates: &NodalCoordinates<D>, internal_variables: &InternalVariablesField<G, V>, ) -> Result<NodalForcesSolid<D>, ElementModelError>
fn nodal_forces_eliminated( &self, nodal_coordinates: &NodalCoordinates<D>, internal_variables: &InternalVariablesField<G, V>, ) -> Result<NodalForcesSolid<D>, ElementModelError>
fn nodal_stiffnesses( &self, nodal_coordinates: &NodalCoordinates<D>, internal_variables: &InternalVariablesField<G, V>, ) -> Result<NodalStiffnessesSolid<D>, ElementModelError>
Dyn Compatibility§
This trait is dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".