pub trait ElasticIVFiniteElement<C, const G: usize, const M: usize, const N: usize, const P: usize, V, E>where
C: ElasticIV<V>,
C::Residual: Erase<Erased = E>,
Self: SolidFiniteElement<G, M, N, P>,
V: Erase<Erased = E> + Jacobian + Solution,
<V as Tensor>::Unit: UnitDiv<<V as Tensor>::Unit, Output = Dimensionless>,
E: Tensor,
for<'a> &'a C::Residual: Div<C::TangentVv, Output = V>,
for<'a> &'a V: Mul<Quantity<Dimensionless>, Output = V> + Mul<Scalar, Output = V>,
for<'a> &'a Matrix: Mul<&'a V, Output = Vector>,{
// Required methods
fn internal_variables_initial(
&self,
constitutive_model: &C,
) -> InternalVariables<G, V>;
fn internal_variables_root(
&self,
local_solver: &NewtonRaphson,
constitutive_model: &C,
nodal_coordinates: &ElementNodalCoordinates<N>,
internal_variables: &InternalVariables<G, V>,
) -> Result<InternalVariables<G, V>, FiniteElementError>;
fn internal_variables_increment(
&self,
constitutive_model: &C,
nodal_coordinates: &ElementNodalCoordinates<N>,
internal_variables: &InternalVariables<G, V>,
nodal_decrement: &ElementNodalCoordinates<N>,
step: Scalar,
) -> Result<InternalVariables<G, V>, FiniteElementError>;
fn nodal_forces(
&self,
constitutive_model: &C,
nodal_coordinates: &ElementNodalCoordinates<N>,
internal_variables: &InternalVariables<G, V>,
) -> Result<ElementNodalForcesSolid<N>, FiniteElementError>;
fn nodal_forces_eliminated(
&self,
constitutive_model: &C,
nodal_coordinates: &ElementNodalCoordinates<N>,
internal_variables: &InternalVariables<G, V>,
) -> Result<ElementNodalForcesSolid<N>, FiniteElementError>;
fn nodal_stiffnesses(
&self,
constitutive_model: &C,
nodal_coordinates: &ElementNodalCoordinates<N>,
internal_variables: &InternalVariables<G, V>,
) -> Result<ElementNodalStiffnessesSolid<N>, FiniteElementError>;
}Required Methods§
Sourcefn internal_variables_initial(
&self,
constitutive_model: &C,
) -> InternalVariables<G, V>
fn internal_variables_initial( &self, constitutive_model: &C, ) -> InternalVariables<G, V>
The internal variables an element starts from at every integration point.
Sourcefn internal_variables_root(
&self,
local_solver: &NewtonRaphson,
constitutive_model: &C,
nodal_coordinates: &ElementNodalCoordinates<N>,
internal_variables: &InternalVariables<G, V>,
) -> Result<InternalVariables<G, V>, FiniteElementError>
fn internal_variables_root( &self, local_solver: &NewtonRaphson, constitutive_model: &C, nodal_coordinates: &ElementNodalCoordinates<N>, internal_variables: &InternalVariables<G, V>, ) -> Result<InternalVariables<G, V>, FiniteElementError>
Solves the internal variables at every integration point, holding the deformation fixed.
The integration points are independent of one another, the internal variables of one never entering the residual of another.
Sourcefn internal_variables_increment(
&self,
constitutive_model: &C,
nodal_coordinates: &ElementNodalCoordinates<N>,
internal_variables: &InternalVariables<G, V>,
nodal_decrement: &ElementNodalCoordinates<N>,
step: Scalar,
) -> Result<InternalVariables<G, V>, FiniteElementError>
fn internal_variables_increment( &self, constitutive_model: &C, nodal_coordinates: &ElementNodalCoordinates<N>, internal_variables: &InternalVariables<G, V>, nodal_decrement: &ElementNodalCoordinates<N>, step: Scalar, ) -> Result<InternalVariables<G, V>, FiniteElementError>
Steps the internal variables alongside a decrement of the nodal coordinates, rather than solving them where the coordinates now are.
fn nodal_forces( &self, constitutive_model: &C, nodal_coordinates: &ElementNodalCoordinates<N>, internal_variables: &InternalVariables<G, V>, ) -> Result<ElementNodalForcesSolid<N>, FiniteElementError>
Sourcefn nodal_forces_eliminated(
&self,
constitutive_model: &C,
nodal_coordinates: &ElementNodalCoordinates<N>,
internal_variables: &InternalVariables<G, V>,
) -> Result<ElementNodalForcesSolid<N>, FiniteElementError>
fn nodal_forces_eliminated( &self, constitutive_model: &C, nodal_coordinates: &ElementNodalCoordinates<N>, internal_variables: &InternalVariables<G, V>, ) -> Result<ElementNodalForcesSolid<N>, FiniteElementError>
The nodal forces with the residual of the internal variables eliminated into them, for when they are carried rather than solved.
Sourcefn nodal_stiffnesses(
&self,
constitutive_model: &C,
nodal_coordinates: &ElementNodalCoordinates<N>,
internal_variables: &InternalVariables<G, V>,
) -> Result<ElementNodalStiffnessesSolid<N>, FiniteElementError>
fn nodal_stiffnesses( &self, constitutive_model: &C, nodal_coordinates: &ElementNodalCoordinates<N>, internal_variables: &InternalVariables<G, V>, ) -> Result<ElementNodalStiffnessesSolid<N>, FiniteElementError>
The tangent stiffnesses with the internal variables condensed out.
\mathcal{C} = \mathcal{K}_{uu} - \mathcal{K}_{uv}\mathcal{K}_{vv}^{-1}\mathcal{K}_{vu}Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".