#[cfg(test)]
pub mod test;
use crate::units::{
ForcePerLength, ForcePerVelocity, Length, PowerPerArea, PowerPerLengthTemperature, Rate,
ReciprocalLength, Stress, TemperaturePerLength, Velocity, Viscosity,
};
use crate::math::{Current, Intermediate, Reference};
use crate::math::{
Rank2, Style, StyledError, Tensor, TensorRank1, TensorRank1List, TensorRank1List2D,
TensorRank1RefVec, TensorRank1Vec, TensorRank1Vec2D, TensorRank2, TensorRank2List,
TensorRank2List2D, TensorRank2Vec, TensorRank2Vec2D, TensorRank4, TensorRank4List,
TensorRank4Vec, styled_error,
};
pub use crate::math::Scalar;
pub enum DeformationError {
InvalidJacobian(Scalar),
}
impl StyledError for DeformationError {
fn message(&self, style: &Style) -> String {
let (h, c) = (style.headline, style.frame);
match self {
Self::InvalidJacobian(jacobian) => {
format!("{h}Invalid Jacobian: {jacobian:.6e}.{c}")
}
}
}
}
styled_error!(DeformationError);
pub trait Deformation<I, J> {
fn jacobian(&self) -> Result<Scalar, DeformationError>;
fn left_cauchy_green(&self) -> TensorRank2<3, I, I>;
fn right_cauchy_green(&self) -> TensorRank2<3, J, J>;
}
impl<I, J> Deformation<I, J> for DeformationGradientGeneral<I, J> {
fn jacobian(&self) -> Result<Scalar, DeformationError> {
let jacobian = self.determinant();
if jacobian > 0.0 {
Ok(jacobian)
} else {
Err(DeformationError::InvalidJacobian(jacobian))
}
}
fn left_cauchy_green(&self) -> TensorRank2<3, I, I> {
self.iter()
.map(|deformation_gradient_i| {
self.iter()
.map(|deformation_gradient_j| deformation_gradient_i * deformation_gradient_j)
.collect()
})
.collect()
}
fn right_cauchy_green(&self) -> TensorRank2<3, J, J> {
let deformation_gradient_transpose = self.transpose();
deformation_gradient_transpose
.iter()
.map(|deformation_gradient_transpose_i| {
deformation_gradient_transpose
.iter()
.map(|deformation_gradient_transpose_j| {
deformation_gradient_transpose_i * deformation_gradient_transpose_j
})
.collect()
})
.collect()
}
}
pub type Basis = TensorRank1List<3, Current, 3, Length>;
pub type Bases<const N: usize> = TensorRank1List2D<3, Current, 3, N, Length>;
pub type CauchyStress = TensorRank2<3, Current, Current, Stress>;
pub type CauchyStresses<const W: usize> = TensorRank2List<3, Current, Current, W, Stress>;
pub type CauchyTangentStiffness = TensorRank4<3, Current, Current, Current, Reference, Stress>;
pub type CauchyTangentStiffness1 = TensorRank4<3, Current, Current, Current, Intermediate, Stress>;
pub type CauchyTangentStiffnessElastic =
TensorRank4<3, Current, Current, Current, Intermediate, Stress>;
pub type CauchyRateTangentStiffness =
TensorRank4<3, Current, Current, Current, Reference, Viscosity>;
pub type Coordinate<I> = TensorRank1<3, I, Length>;
pub type CoordinateList<I, const N: usize> = TensorRank1List<3, I, N, Length>;
pub type Coordinates<I> = TensorRank1Vec<3, I, Length>;
pub type CoordinatesRef<'a, I> = TensorRank1RefVec<'a, 3, I, Length>;
pub type CurrentCoordinate = TensorRank1<3, Current, Length>;
pub type CurrentCoordinates<const W: usize> = TensorRank1List<3, Current, W, Length>;
pub type CurrentCoordinatesRef<'a> = TensorRank1RefVec<'a, 3, Current, Length>;
pub type CurrentVelocity = TensorRank1<3, Current, Velocity>;
pub type CurrentVelocities<const W: usize> = TensorRank1List<3, Current, W, Velocity>;
pub type DeformationGradient = TensorRank2<3, Current, Reference>;
pub type DeformationGradient2 = TensorRank2<3, Intermediate, Reference>;
pub type DeformationGradientElastic = TensorRank2<3, Current, Intermediate>;
pub type DeformationGradientGeneral<I, J> = TensorRank2<3, I, J>;
pub type DeformationGradientPlastic = TensorRank2<3, Intermediate, Reference>;
pub type DeformationGradientRate = TensorRank2<3, Current, Reference, Rate>;
pub type DeformationGradientRatePlastic = TensorRank2<3, Intermediate, Reference, Rate>;
pub type DeformationGradientList<const W: usize> = TensorRank2List<3, Current, Reference, W>;
pub type DeformationGradientRateList<const W: usize> =
TensorRank2List<3, Current, Reference, W, Rate>;
pub type DeformationGradients = TensorRank2Vec<3, Current, Reference>;
pub type DeformationGradientsPlastic = TensorRank2Vec<3, Intermediate, Reference>;
pub type DeformationGradientRates = TensorRank2Vec<3, Current, Reference, Rate>;
pub type DeformationGradientRatesPlastic = TensorRank2Vec<3, Intermediate, Reference, Rate>;
pub type Displacement = TensorRank1<3, Current, Length>;
pub type FirstPiolaKirchhoffStress = TensorRank2<3, Current, Reference, Stress>;
pub type FirstPiolaKirchhoffStress1 = TensorRank2<3, Current, Intermediate, Stress>;
pub type FirstPiolaKirchhoffStress2 = TensorRank2<3, Intermediate, Reference, Stress>;
pub type FirstPiolaKirchhoffStressElastic = FirstPiolaKirchhoffStress1;
pub type FirstPiolaKirchhoffStressList<const N: usize> =
TensorRank2List<3, Current, Reference, N, Stress>;
pub type FirstPiolaKirchhoffStresses = TensorRank2Vec<3, Current, Reference, Stress>;
pub type FirstPiolaKirchhoffTangentStiffness =
TensorRank4<3, Current, Reference, Current, Reference, Stress>;
pub type FirstPiolaKirchhoffTangentStiffness1 =
TensorRank4<3, Current, Intermediate, Current, Intermediate, Stress>;
pub type FirstPiolaKirchhoffTangentStiffness2 =
TensorRank4<3, Intermediate, Reference, Intermediate, Reference, Stress>;
pub type FirstPiolaKirchhoffTangentStiffnessElastic = FirstPiolaKirchhoffTangentStiffness1;
pub type FirstPiolaKirchhoffTangentStiffnessList<const N: usize> =
TensorRank4List<3, Current, Reference, Current, Reference, N, Stress>;
pub type FirstPiolaKirchhoffTangentStiffnesses =
TensorRank4Vec<3, Current, Reference, Current, Reference, Stress>;
pub type FirstPiolaKirchhoffRateTangentStiffness =
TensorRank4<3, Current, Reference, Current, Reference, Viscosity>;
pub type FirstPiolaKirchhoffRateTangentStiffnesses<const W: usize> =
TensorRank4List<3, Current, Reference, Current, Reference, W, Viscosity>;
pub type Force = TensorRank1<3, Current, crate::units::Force>;
pub type ForceList<const N: usize> = TensorRank1List<3, Current, N, crate::units::Force>;
pub type Forces = TensorRank1Vec<3, Current, crate::units::Force>;
pub type FrameSpin = TensorRank2<3, Current, Current, Rate>;
pub type HeatFlux = TensorRank1<3, Reference, PowerPerArea>;
pub type HeatFluxes<const N: usize> = TensorRank1List<3, Reference, N, PowerPerArea>;
pub type HeatFluxTangent = TensorRank2<3, Reference, Reference, PowerPerLengthTemperature>;
pub type HeatFluxTangents<const N: usize> =
TensorRank2List<3, Reference, Reference, N, PowerPerLengthTemperature>;
pub type LeftCauchyGreenDeformation = TensorRank2<3, Current, Current>;
pub type MandelStress = TensorRank2<3, Reference, Reference, Stress>;
pub type MandelStressElastic = TensorRank2<3, Intermediate, Intermediate, Stress>;
pub type Normal = TensorRank1<3, Current>;
pub type Normals<const N: usize> = TensorRank1List<3, Current, N>;
pub type NormalGradients<const O: usize, const P: usize> =
TensorRank2List2D<3, Current, Current, O, P, ReciprocalLength>;
pub type NormalRate = TensorRank1<3, Current, Rate>;
pub type NormalRates<const N: usize> = TensorRank1List<3, Current, N, Rate>;
pub type ReferenceCoordinate = TensorRank1<3, Reference, Length>;
pub type ReferenceCoordinates<const W: usize> = TensorRank1List<3, Reference, W, Length>;
pub type ReferenceNormal = TensorRank1<3, Reference>;
pub type ReferenceNormals<const N: usize> = TensorRank1List<3, Reference, N>;
pub type RightCauchyGreenDeformation = TensorRank2<3, Reference, Reference>;
pub type RotationCurrentConfiguration = TensorRank2<3, Current, Current>;
pub type RotationCurrentConfigurationList<const N: usize> = TensorRank2List<3, Current, Current, N>;
pub type RotationRateCurrentConfiguration = TensorRank2<3, Current, Current, Rate>;
pub type RotationReferenceConfiguration = TensorRank2<3, Reference, Reference>;
pub type Separation = Displacement;
pub type SecondPiolaKirchhoffStress = TensorRank2<3, Reference, Reference, Stress>;
pub type SecondPiolaKirchhoffStressElastic = TensorRank2<3, Intermediate, Intermediate, Stress>;
pub type SecondPiolaKirchhoffTangentStiffness =
TensorRank4<3, Reference, Reference, Current, Reference, Stress>;
pub type SecondPiolaKirchhoffTangentStiffnessElastic =
TensorRank4<3, Intermediate, Intermediate, Current, Intermediate, Stress>;
pub type SecondPiolaKirchhoffRateTangentStiffness =
TensorRank4<3, Reference, Reference, Current, Reference, Viscosity>;
pub type Stiffness = TensorRank2<3, Current, Current, ForcePerLength>;
pub type StiffnessList<const N: usize> = TensorRank2List<3, Current, Current, N, ForcePerLength>;
pub type StiffnessList2D<const N: usize> =
TensorRank2List2D<3, Current, Current, N, N, ForcePerLength>;
pub type Damping = TensorRank2<3, Current, Current, ForcePerVelocity>;
pub type DampingList2D<const N: usize> =
TensorRank2List2D<3, Current, Current, N, N, ForcePerVelocity>;
pub type Dampings = TensorRank2Vec2D<3, Current, Current, ForcePerVelocity>;
pub type Stiffnesses = TensorRank2Vec2D<3, Current, Current, ForcePerLength>;
pub type StretchingRate = TensorRank2<3, Current, Current, Rate>;
pub type StretchingRatePlastic = TensorRank2<3, Intermediate, Intermediate, Rate>;
pub type SurfaceBasis<I> = TensorRank1List<3, I, 2, Length>;
pub type SurfaceBases<I, const N: usize> = TensorRank1List2D<3, I, 2, N, Length>;
pub type SurfaceDualBasis<I> = TensorRank1List<3, I, 2, ReciprocalLength>;
pub type SurfaceDualBases<I, const N: usize> = TensorRank1List2D<3, I, 2, N, ReciprocalLength>;
pub type TemperatureGradient = TensorRank1<3, Reference, TemperaturePerLength>;
pub type TemperatureGradients<const N: usize> =
TensorRank1List<3, Reference, N, TemperaturePerLength>;
pub type Times = crate::math::integrate::Times;
pub type Traction = TensorRank1<3, Current, Stress>;
pub type TractionList<const N: usize> = TensorRank1List<3, Current, N, Stress>;
pub type Vector<I> = TensorRank1<3, I>;
pub type VectorList<I, const W: usize> = TensorRank1List<3, I, W>;
pub type VectorList2D<I, const W: usize, const X: usize> = TensorRank1List2D<3, I, W, X>;
pub type Vectors<I> = TensorRank1Vec<3, I>;
pub type Vectors2D<I> = TensorRank1Vec2D<3, I>;