1#[cfg(test)]
3pub mod test;
4
5use crate::units::{
6 Fluidity, ForcePerLength, ForcePerVelocity, Length, PowerPerArea, PowerPerLengthTemperature,
7 Rate, ReciprocalLength, Stress, TemperaturePerLength, Velocity, Viscosity,
8};
9
10use crate::math::{Current, Intermediate, Reference};
11
12use crate::math::{
13 Rank2, Style, StyledError, Tensor, TensorRank1, TensorRank1List, TensorRank1List2D,
14 TensorRank1RefVec, TensorRank1Vec, TensorRank1Vec2D, TensorRank2, TensorRank2List,
15 TensorRank2List2D, TensorRank2Vec, TensorRank2Vec2D, TensorRank4, TensorRank4List,
16 TensorRank4Vec, styled_error,
17};
18
19pub use crate::math::Scalar;
20
21pub enum DeformationError {
23 InvalidJacobian(Scalar),
24}
25
26impl StyledError for DeformationError {
27 fn message(&self, style: &Style) -> String {
28 let (h, c) = (style.headline, style.frame);
29 match self {
30 Self::InvalidJacobian(jacobian) => {
31 format!("{h}Invalid Jacobian: {jacobian:.6e}.{c}")
32 }
33 }
34 }
35}
36
37styled_error!(DeformationError);
38
39pub trait Deformation<I, J> {
41 fn jacobian(&self) -> Result<Scalar, DeformationError>;
47 fn left_cauchy_green(&self) -> TensorRank2<3, I, I>;
53 fn right_cauchy_green(&self) -> TensorRank2<3, J, J>;
59}
60
61impl<I, J> Deformation<I, J> for DeformationGradientGeneral<I, J> {
62 fn jacobian(&self) -> Result<Scalar, DeformationError> {
63 let jacobian = self.determinant();
64 if jacobian > 0.0 {
65 Ok(jacobian)
66 } else {
67 Err(DeformationError::InvalidJacobian(jacobian))
68 }
69 }
70 fn left_cauchy_green(&self) -> TensorRank2<3, I, I> {
71 self.iter()
72 .map(|deformation_gradient_i| {
73 self.iter()
74 .map(|deformation_gradient_j| deformation_gradient_i * deformation_gradient_j)
75 .collect()
76 })
77 .collect()
78 }
79 fn right_cauchy_green(&self) -> TensorRank2<3, J, J> {
80 let deformation_gradient_transpose = self.transpose();
81 deformation_gradient_transpose
82 .iter()
83 .map(|deformation_gradient_transpose_i| {
84 deformation_gradient_transpose
85 .iter()
86 .map(|deformation_gradient_transpose_j| {
87 deformation_gradient_transpose_i * deformation_gradient_transpose_j
88 })
89 .collect()
90 })
91 .collect()
92 }
93}
94
95pub type Basis = TensorRank1List<3, Current, 3, Length>;
97
98pub type Bases<const N: usize> = TensorRank1List2D<3, Current, 3, N, Length>;
100
101pub type CauchyStress = TensorRank2<3, Current, Current, Stress>;
103
104pub type CauchyStresses<const W: usize> = TensorRank2List<3, Current, Current, W, Stress>;
106
107pub type CauchyTangentStiffness = TensorRank4<3, Current, Current, Current, Reference, Stress>;
109
110pub type CauchyTangentStiffness1 = TensorRank4<3, Current, Current, Current, Intermediate, Stress>;
112
113pub type CauchyTangentStiffnessElastic =
115 TensorRank4<3, Current, Current, Current, Intermediate, Stress>;
116
117pub type CauchyTangentStiffnessPlastic =
119 TensorRank4<3, Current, Current, Intermediate, Reference, Stress>;
120
121pub type MandelStressTangentElastic =
123 TensorRank4<3, Intermediate, Intermediate, Current, Reference, Stress>;
124
125pub type MandelStressTangentElasticPlastic =
127 TensorRank4<3, Intermediate, Intermediate, Intermediate, Reference, Stress>;
128
129pub type FirstPiolaKirchhoffTangentStiffnessPlastic =
131 TensorRank4<3, Current, Reference, Intermediate, Reference, Stress>;
132
133pub type CauchyRateTangentStiffness =
135 TensorRank4<3, Current, Current, Current, Reference, Viscosity>;
136
137pub type Coordinate<I> = TensorRank1<3, I, Length>;
139
140pub type CoordinateList<I, const N: usize> = TensorRank1List<3, I, N, Length>;
142
143pub type Coordinates<I> = TensorRank1Vec<3, I, Length>;
145
146pub type CoordinatesRef<'a, I> = TensorRank1RefVec<'a, 3, I, Length>;
148
149pub type CurrentCoordinate = TensorRank1<3, Current, Length>;
151
152pub type CurrentCoordinates<const W: usize> = TensorRank1List<3, Current, W, Length>;
154
155pub type CurrentCoordinatesRef<'a> = TensorRank1RefVec<'a, 3, Current, Length>;
157
158pub type CurrentVelocity = TensorRank1<3, Current, Velocity>;
160
161pub type CurrentVelocities<const W: usize> = TensorRank1List<3, Current, W, Velocity>;
163
164pub type DeformationGradient = TensorRank2<3, Current, Reference>;
166
167pub type DeformationGradient2 = TensorRank2<3, Intermediate, Reference>;
169
170pub type DeformationGradientElastic = TensorRank2<3, Current, Intermediate>;
172
173pub type DeformationGradientGeneral<I, J> = TensorRank2<3, I, J>;
175
176pub type DeformationGradientPlastic = TensorRank2<3, Intermediate, Reference>;
178
179pub type DeformationGradientRate = TensorRank2<3, Current, Reference, Rate>;
181
182pub type DeformationGradientRatePlastic = TensorRank2<3, Intermediate, Reference, Rate>;
184
185pub type DeformationGradientList<const W: usize> = TensorRank2List<3, Current, Reference, W>;
187
188pub type DeformationGradientRateList<const W: usize> =
190 TensorRank2List<3, Current, Reference, W, Rate>;
191
192pub type DeformationGradients = TensorRank2Vec<3, Current, Reference>;
194
195pub type DeformationGradientsPlastic = TensorRank2Vec<3, Intermediate, Reference>;
197
198pub type DeformationGradientRates = TensorRank2Vec<3, Current, Reference, Rate>;
200
201pub type DeformationGradientRatesPlastic = TensorRank2Vec<3, Intermediate, Reference, Rate>;
203
204pub type Displacement = TensorRank1<3, Current, Length>;
206
207pub type FirstPiolaKirchhoffStress = TensorRank2<3, Current, Reference, Stress>;
209
210pub type FirstPiolaKirchhoffStress1 = TensorRank2<3, Current, Intermediate, Stress>;
212
213pub type FirstPiolaKirchhoffStress2 = TensorRank2<3, Intermediate, Reference, Stress>;
215
216pub type FirstPiolaKirchhoffStressElastic = FirstPiolaKirchhoffStress1;
218
219pub type FirstPiolaKirchhoffStressList<const N: usize> =
221 TensorRank2List<3, Current, Reference, N, Stress>;
222
223pub type FirstPiolaKirchhoffStresses = TensorRank2Vec<3, Current, Reference, Stress>;
225
226pub type FirstPiolaKirchhoffTangentStiffness =
228 TensorRank4<3, Current, Reference, Current, Reference, Stress>;
229
230pub type FirstPiolaKirchhoffTangentStiffness1 =
232 TensorRank4<3, Current, Intermediate, Current, Intermediate, Stress>;
233
234pub type FirstPiolaKirchhoffTangentStiffness2 =
236 TensorRank4<3, Intermediate, Reference, Intermediate, Reference, Stress>;
237
238pub type FirstPiolaKirchhoffTangentStiffnessElastic = FirstPiolaKirchhoffTangentStiffness1;
240
241pub type FirstPiolaKirchhoffTangentStiffnessList<const N: usize> =
243 TensorRank4List<3, Current, Reference, Current, Reference, N, Stress>;
244
245pub type FirstPiolaKirchhoffTangentStiffnesses =
247 TensorRank4Vec<3, Current, Reference, Current, Reference, Stress>;
248
249pub type FirstPiolaKirchhoffRateTangentStiffness =
251 TensorRank4<3, Current, Reference, Current, Reference, Viscosity>;
252
253pub type FirstPiolaKirchhoffRateTangentStiffnessList<const W: usize> =
255 TensorRank4List<3, Current, Reference, Current, Reference, W, Viscosity>;
256
257pub type FirstPiolaKirchhoffRateTangentStiffnesses =
259 TensorRank4Vec<3, Current, Reference, Current, Reference, Viscosity>;
260
261pub type Force = TensorRank1<3, Current, crate::units::Force>;
263
264pub type ForceList<const N: usize> = TensorRank1List<3, Current, N, crate::units::Force>;
266
267pub type Forces = TensorRank1Vec<3, Current, crate::units::Force>;
269
270pub type FrameSpin = TensorRank2<3, Current, Current, Rate>;
272
273pub type HeatFlux = TensorRank1<3, Reference, PowerPerArea>;
275
276pub type HeatFluxes<const N: usize> = TensorRank1List<3, Reference, N, PowerPerArea>;
278
279pub type HeatFluxTangent = TensorRank2<3, Reference, Reference, PowerPerLengthTemperature>;
281
282pub type HeatFluxTangents<const N: usize> =
284 TensorRank2List<3, Reference, Reference, N, PowerPerLengthTemperature>;
285
286pub type LeftCauchyGreenDeformation = TensorRank2<3, Current, Current>;
288
289pub type MandelStress = TensorRank2<3, Reference, Reference, Stress>;
291
292pub type MandelStressElastic = TensorRank2<3, Intermediate, Intermediate, Stress>;
294
295pub type Normal = TensorRank1<3, Current>;
297
298pub type Normals<const N: usize> = TensorRank1List<3, Current, N>;
300
301pub type NormalGradients<const O: usize, const P: usize> =
303 TensorRank2List2D<3, Current, Current, O, P, ReciprocalLength>;
304
305pub type NormalRate = TensorRank1<3, Current, Rate>;
307
308pub type NormalRates<const N: usize> = TensorRank1List<3, Current, N, Rate>;
310
311pub type ReferenceCoordinate = TensorRank1<3, Reference, Length>;
313
314pub type ReferenceCoordinates<const W: usize> = TensorRank1List<3, Reference, W, Length>;
316
317pub type ReferenceNormal = TensorRank1<3, Reference>;
319
320pub type ReferenceNormals<const N: usize> = TensorRank1List<3, Reference, N>;
322
323pub type RightCauchyGreenDeformation = TensorRank2<3, Reference, Reference>;
325
326pub type RotationCurrentConfiguration = TensorRank2<3, Current, Current>;
328
329pub type RotationCurrentConfigurationList<const N: usize> = TensorRank2List<3, Current, Current, N>;
331
332pub type RotationRateCurrentConfiguration = TensorRank2<3, Current, Current, Rate>;
334
335pub type RotationReferenceConfiguration = TensorRank2<3, Reference, Reference>;
337
338pub type Separation = Displacement;
340
341pub type SecondPiolaKirchhoffStress = TensorRank2<3, Reference, Reference, Stress>;
343
344pub type SecondPiolaKirchhoffStressElastic = TensorRank2<3, Intermediate, Intermediate, Stress>;
346
347pub type SecondPiolaKirchhoffTangentStiffness =
349 TensorRank4<3, Reference, Reference, Current, Reference, Stress>;
350
351pub type SecondPiolaKirchhoffTangentStiffnessElastic =
353 TensorRank4<3, Intermediate, Intermediate, Current, Intermediate, Stress>;
354
355pub type SecondPiolaKirchhoffRateTangentStiffness =
357 TensorRank4<3, Reference, Reference, Current, Reference, Viscosity>;
358
359pub type Stiffness = TensorRank2<3, Current, Current, ForcePerLength>;
361
362pub type StiffnessList<const N: usize> = TensorRank2List<3, Current, Current, N, ForcePerLength>;
364
365pub type StiffnessList2D<const N: usize> =
367 TensorRank2List2D<3, Current, Current, N, N, ForcePerLength>;
368
369pub type Damping = TensorRank2<3, Current, Current, ForcePerVelocity>;
371
372pub type DampingList2D<const N: usize> =
374 TensorRank2List2D<3, Current, Current, N, N, ForcePerVelocity>;
375
376pub type Dampings = TensorRank2Vec2D<3, Current, Current, ForcePerVelocity>;
378
379pub type Stiffnesses = TensorRank2Vec2D<3, Current, Current, ForcePerLength>;
381
382pub type StretchingRate = TensorRank2<3, Current, Current, Rate>;
384
385pub type StretchingRatePlastic = TensorRank2<3, Intermediate, Intermediate, Rate>;
387
388pub type StretchingRatePlasticTangent =
390 TensorRank4<3, Intermediate, Intermediate, Intermediate, Intermediate, Fluidity>;
391
392pub type StretchingRatePlasticTangentYield = TensorRank2<3, Intermediate, Intermediate, Fluidity>;
394
395pub type SurfaceBasis<I> = TensorRank1List<3, I, 2, Length>;
397
398pub type SurfaceBases<I, const N: usize> = TensorRank1List2D<3, I, 2, N, Length>;
400
401pub type SurfaceDualBasis<I> = TensorRank1List<3, I, 2, ReciprocalLength>;
403
404pub type SurfaceDualBases<I, const N: usize> = TensorRank1List2D<3, I, 2, N, ReciprocalLength>;
406
407pub type TemperatureGradient = TensorRank1<3, Reference, TemperaturePerLength>;
409
410pub type TemperatureGradients<const N: usize> =
412 TensorRank1List<3, Reference, N, TemperaturePerLength>;
413
414pub type Times = crate::math::integrate::Times;
416
417pub type Traction = TensorRank1<3, Current, Stress>;
419
420pub type TractionList<const N: usize> = TensorRank1List<3, Current, N, Stress>;
422
423pub type Vector<I> = TensorRank1<3, I>;
425
426pub type VectorList<I, const W: usize> = TensorRank1List<3, I, W>;
428
429pub type VectorList2D<I, const W: usize, const X: usize> = TensorRank1List2D<3, I, W, X>;
431
432pub type Vectors<I> = TensorRank1Vec<3, I>;
434
435pub type Vectors2D<I> = TensorRank1Vec2D<3, I>;