conspire/fem/block/element/composite/tetrahedron/
mod.rs

1#[cfg(test)]
2mod test;
3
4use super::*;
5use crate::math::{
6    tensor_rank_1, tensor_rank_1_list, tensor_rank_1_list_2d, tensor_rank_1_zero, tensor_rank_2,
7    tensor_rank_2_list,
8};
9
10const G: usize = 4;
11const M: usize = 3;
12const N: usize = 10;
13const P: usize = 12;
14const Q: usize = 4;
15
16pub type Tetrahedron<C> = Element<C, G, N>;
17
18impl<C, Y> FiniteElement<C, G, N, Y> for Tetrahedron<C>
19where
20    C: Constitutive<Y>,
21    Y: Parameters,
22{
23    fn new(
24        constitutive_model_parameters: Y,
25        reference_nodal_coordinates: ReferenceNodalCoordinates<N>,
26    ) -> Self {
27        let (gradient_vectors, integration_weights) = Self::initialize(reference_nodal_coordinates);
28        Self {
29            constitutive_models: from_fn(|_| <C>::new(constitutive_model_parameters)),
30            gradient_vectors,
31            integration_weights,
32        }
33    }
34    fn reference() -> ReferenceNodalCoordinates<N> {
35        tensor_rank_1_list([
36            tensor_rank_1([0.0, 0.0, 0.0]),
37            tensor_rank_1([1.0, 0.0, 0.0]),
38            tensor_rank_1([0.0, 1.0, 0.0]),
39            tensor_rank_1([0.0, 0.0, 1.0]),
40            tensor_rank_1([0.25, 0.25, 0.0]),
41            tensor_rank_1([0.25, 0.0, 0.25]),
42            tensor_rank_1([0.0, 0.25, 0.25]),
43            tensor_rank_1([0.5, 0.5, 0.0]),
44            tensor_rank_1([0.5, 0.0, 0.5]),
45            tensor_rank_1([0.0, 0.5, 0.5]),
46        ])
47    }
48    fn reset(&mut self) {
49        let (gradient_vectors, integration_weights) = Self::initialize(Self::reference());
50        self.gradient_vectors = gradient_vectors;
51        self.integration_weights = integration_weights;
52    }
53}
54
55impl<C> Tetrahedron<C> {
56    fn initialize(
57        reference_nodal_coordinates: ReferenceNodalCoordinates<N>,
58    ) -> (GradientVectors<G, N>, Scalars<G>) {
59        let gradient_vectors = Self::projected_gradient_vectors(&reference_nodal_coordinates);
60        let integration_weights =
61            Self::reference_jacobians(&reference_nodal_coordinates) * Self::integration_weight();
62        (gradient_vectors, integration_weights)
63    }
64    const fn integration_weight() -> Scalar {
65        1.0 / 24.0
66    }
67    const fn inverse_normalized_projection_matrix() -> NormalizedProjectionMatrix<Q> {
68        const DIAG: Scalar = 4.0 / 640.0;
69        const OFF: Scalar = -1.0 / 640.0;
70        tensor_rank_2([
71            tensor_rank_1([DIAG, OFF, OFF, OFF]),
72            tensor_rank_1([OFF, DIAG, OFF, OFF]),
73            tensor_rank_1([OFF, OFF, DIAG, OFF]),
74            tensor_rank_1([OFF, OFF, OFF, DIAG]),
75        ])
76    }
77    fn inverse_projection_matrix(
78        reference_jacobians_subelements: &Scalars<P>,
79    ) -> NormalizedProjectionMatrix<Q> {
80        Self::shape_function_integrals_products()
81            .iter()
82            .zip(reference_jacobians_subelements.iter())
83            .map(
84                |(shape_function_integrals_products, reference_jacobian_subelement)| {
85                    shape_function_integrals_products * reference_jacobian_subelement
86                },
87            )
88            .sum::<ProjectionMatrix<Q>>()
89            .inverse()
90    }
91    fn projected_gradient_vectors(
92        reference_nodal_coordinates: &ReferenceNodalCoordinates<N>,
93    ) -> GradientVectors<G, N> {
94        let parametric_gradient_operators = Self::standard_gradient_operators()
95            .iter()
96            .map(|standard_gradient_operator| {
97                reference_nodal_coordinates * standard_gradient_operator
98            })
99            .collect::<ParametricGradientOperators<P>>();
100        let reference_jacobians_subelements =
101            Self::reference_jacobians_subelements(reference_nodal_coordinates);
102        let inverse_projection_matrix =
103            Self::inverse_projection_matrix(&reference_jacobians_subelements);
104        Self::shape_functions_at_integration_points()
105            .iter()
106            .map(|shape_functions_at_integration_point| {
107                Self::standard_gradient_operators_transposed()
108                    .iter()
109                    .map(|standard_gradient_operators_a| {
110                        Self::shape_function_integrals()
111                            .iter()
112                            .zip(
113                                standard_gradient_operators_a.iter().zip(
114                                    parametric_gradient_operators
115                                        .iter()
116                                        .zip(reference_jacobians_subelements.iter()),
117                                ),
118                            )
119                            .map(
120                                |(
121                                    shape_function_integral,
122                                    (
123                                        standard_gradient_operator,
124                                        (
125                                            parametric_gradient_operator,
126                                            reference_jacobian_subelement,
127                                        ),
128                                    ),
129                                )| {
130                                    (parametric_gradient_operator.inverse_transpose()
131                                        * standard_gradient_operator)
132                                        * reference_jacobian_subelement
133                                        * (shape_functions_at_integration_point
134                                            * (&inverse_projection_matrix
135                                                * shape_function_integral))
136                                },
137                            )
138                            .sum()
139                    })
140                    .collect()
141            })
142            .collect()
143    }
144    fn reference_jacobians(
145        reference_nodal_coordinates: &ReferenceNodalCoordinates<N>,
146    ) -> Scalars<G> {
147        let vector = Self::inverse_normalized_projection_matrix()
148            * Self::shape_function_integrals()
149                .iter()
150                .zip(Self::reference_jacobians_subelements(reference_nodal_coordinates).iter())
151                .map(|(shape_function_integral, reference_jacobian_subelement)| {
152                    shape_function_integral * reference_jacobian_subelement
153                })
154                .sum::<TensorRank1<Q, 9>>();
155        Self::shape_functions_at_integration_points()
156            .iter()
157            .map(|shape_functions_at_integration_point| {
158                shape_functions_at_integration_point * &vector
159            })
160            .collect()
161    }
162    fn reference_jacobians_subelements(
163        reference_nodal_coordinates: &ReferenceNodalCoordinates<N>,
164    ) -> Scalars<P> {
165        Self::standard_gradient_operators()
166            .iter()
167            .map(|standard_gradient_operator| {
168                reference_nodal_coordinates * standard_gradient_operator
169            })
170            .collect::<ParametricGradientOperators<P>>()
171            .iter()
172            .map(|parametric_gradient_operator| parametric_gradient_operator.determinant())
173            .collect()
174    }
175    const fn shape_functions_at_integration_points() -> ShapeFunctionsAtIntegrationPoints<G, Q> {
176        const DIAG: Scalar = 0.585_410_196_624_968_5;
177        const OFF: Scalar = 0.138_196_601_125_010_5;
178        tensor_rank_1_list([
179            tensor_rank_1([DIAG, OFF, OFF, OFF]),
180            tensor_rank_1([OFF, DIAG, OFF, OFF]),
181            tensor_rank_1([OFF, OFF, DIAG, OFF]),
182            tensor_rank_1([OFF, OFF, OFF, DIAG]),
183        ])
184    }
185    const fn shape_function_integrals() -> ShapeFunctionIntegrals<P, Q> {
186        tensor_rank_1_list([
187            tensor_rank_1([200.0, 40.0, 40.0, 40.0]),
188            tensor_rank_1([40.0, 200.0, 40.0, 40.0]),
189            tensor_rank_1([40.0, 40.0, 200.0, 40.0]),
190            tensor_rank_1([40.0, 40.0, 40.0, 200.0]),
191            tensor_rank_1([30.0, 70.0, 30.0, 30.0]),
192            tensor_rank_1([10.0, 50.0, 50.0, 50.0]),
193            tensor_rank_1([30.0, 30.0, 30.0, 70.0]),
194            tensor_rank_1([50.0, 50.0, 10.0, 50.0]),
195            tensor_rank_1([50.0, 50.0, 50.0, 10.0]),
196            tensor_rank_1([30.0, 30.0, 70.0, 30.0]),
197            tensor_rank_1([50.0, 10.0, 50.0, 50.0]),
198            tensor_rank_1([70.0, 30.0, 30.0, 30.0]),
199        ])
200    }
201    const fn shape_function_integrals_products() -> ShapeFunctionIntegralsProducts<P, Q> {
202        tensor_rank_2_list([
203            tensor_rank_2([
204                tensor_rank_1([128.0, 24.0, 24.0, 24.0]),
205                tensor_rank_1([24.0, 8.0, 4.0, 4.0]),
206                tensor_rank_1([24.0, 4.0, 8.0, 4.0]),
207                tensor_rank_1([24.0, 4.0, 4.0, 8.0]),
208            ]),
209            tensor_rank_2([
210                tensor_rank_1([8.0, 24.0, 4.0, 4.0]),
211                tensor_rank_1([24.0, 128.0, 24.0, 24.0]),
212                tensor_rank_1([4.0, 24.0, 8.0, 4.0]),
213                tensor_rank_1([4.0, 24.0, 4.0, 8.0]),
214            ]),
215            tensor_rank_2([
216                tensor_rank_1([8.0, 4.0, 24.0, 4.0]),
217                tensor_rank_1([4.0, 8.0, 24.0, 4.0]),
218                tensor_rank_1([24.0, 24.0, 128.0, 24.0]),
219                tensor_rank_1([4.0, 4.0, 24.0, 8.0]),
220            ]),
221            tensor_rank_2([
222                tensor_rank_1([8.0, 4.0, 4.0, 24.0]),
223                tensor_rank_1([4.0, 8.0, 4.0, 24.0]),
224                tensor_rank_1([4.0, 4.0, 8.0, 24.0]),
225                tensor_rank_1([24.0, 24.0, 24.0, 128.0]),
226            ]),
227            tensor_rank_2([
228                tensor_rank_1([7.0, 13.0, 5.0, 5.0]),
229                tensor_rank_1([13.0, 31.0, 13.0, 13.0]),
230                tensor_rank_1([5.0, 13.0, 7.0, 5.0]),
231                tensor_rank_1([5.0, 13.0, 5.0, 7.0]),
232            ]),
233            tensor_rank_2([
234                tensor_rank_1([1.0, 3.0, 3.0, 3.0]),
235                tensor_rank_1([3.0, 17.0, 15.0, 15.0]),
236                tensor_rank_1([3.0, 15.0, 17.0, 15.0]),
237                tensor_rank_1([3.0, 15.0, 15.0, 17.0]),
238            ]),
239            tensor_rank_2([
240                tensor_rank_1([7.0, 5.0, 5.0, 13.0]),
241                tensor_rank_1([5.0, 7.0, 5.0, 13.0]),
242                tensor_rank_1([5.0, 5.0, 7.0, 13.0]),
243                tensor_rank_1([13.0, 13.0, 13.0, 31.0]),
244            ]),
245            tensor_rank_2([
246                tensor_rank_1([17.0, 15.0, 3.0, 15.0]),
247                tensor_rank_1([15.0, 17.0, 3.0, 15.0]),
248                tensor_rank_1([3.0, 3.0, 1.0, 3.0]),
249                tensor_rank_1([15.0, 15.0, 3.0, 17.0]),
250            ]),
251            tensor_rank_2([
252                tensor_rank_1([17.0, 15.0, 15.0, 3.0]),
253                tensor_rank_1([15.0, 17.0, 15.0, 3.0]),
254                tensor_rank_1([15.0, 15.0, 17.0, 3.0]),
255                tensor_rank_1([3.0, 3.0, 3.0, 1.0]),
256            ]),
257            tensor_rank_2([
258                tensor_rank_1([7.0, 5.0, 13.0, 5.0]),
259                tensor_rank_1([5.0, 7.0, 13.0, 5.0]),
260                tensor_rank_1([13.0, 13.0, 31.0, 13.0]),
261                tensor_rank_1([5.0, 5.0, 13.0, 7.0]),
262            ]),
263            tensor_rank_2([
264                tensor_rank_1([17.0, 3.0, 15.0, 15.0]),
265                tensor_rank_1([3.0, 1.0, 3.0, 3.0]),
266                tensor_rank_1([15.0, 3.0, 17.0, 15.0]),
267                tensor_rank_1([15.0, 3.0, 15.0, 17.0]),
268            ]),
269            tensor_rank_2([
270                tensor_rank_1([31.0, 13.0, 13.0, 13.0]),
271                tensor_rank_1([13.0, 7.0, 5.0, 5.0]),
272                tensor_rank_1([13.0, 5.0, 7.0, 5.0]),
273                tensor_rank_1([13.0, 5.0, 5.0, 7.0]),
274            ]),
275        ])
276    }
277    const fn standard_gradient_operators() -> StandardGradientOperators<M, N, P> {
278        const TWO_THIRDS: Scalar = 2.0 / 3.0;
279        const FOUR_THIRDS: Scalar = 4.0 / 3.0;
280        tensor_rank_1_list_2d([
281            tensor_rank_1_list([
282                tensor_rank_1([-2.0, -2.0, -2.0]),
283                tensor_rank_1_zero(),
284                tensor_rank_1_zero(),
285                tensor_rank_1_zero(),
286                tensor_rank_1([2.0, 0.0, 0.0]),
287                tensor_rank_1_zero(),
288                tensor_rank_1([0.0, 2.0, 0.0]),
289                tensor_rank_1([0.0, 0.0, 2.0]),
290                tensor_rank_1_zero(),
291                tensor_rank_1_zero(),
292            ]),
293            tensor_rank_1_list([
294                tensor_rank_1_zero(),
295                tensor_rank_1([2.0, 0.0, 0.0]),
296                tensor_rank_1_zero(),
297                tensor_rank_1_zero(),
298                tensor_rank_1([-2.0, -2.0, -2.0]),
299                tensor_rank_1([0.0, 2.0, 0.0]),
300                tensor_rank_1_zero(),
301                tensor_rank_1_zero(),
302                tensor_rank_1([0.0, 0.0, 2.0]),
303                tensor_rank_1_zero(),
304            ]),
305            tensor_rank_1_list([
306                tensor_rank_1_zero(),
307                tensor_rank_1_zero(),
308                tensor_rank_1([0.0, 2.0, 0.0]),
309                tensor_rank_1_zero(),
310                tensor_rank_1_zero(),
311                tensor_rank_1([2.0, 0.0, 0.0]),
312                tensor_rank_1([-2.0, -2.0, -2.0]),
313                tensor_rank_1_zero(),
314                tensor_rank_1_zero(),
315                tensor_rank_1([0.0, 0.0, 2.0]),
316            ]),
317            tensor_rank_1_list([
318                tensor_rank_1_zero(),
319                tensor_rank_1_zero(),
320                tensor_rank_1_zero(),
321                tensor_rank_1([0.0, 0.0, 2.0]),
322                tensor_rank_1_zero(),
323                tensor_rank_1_zero(),
324                tensor_rank_1_zero(),
325                tensor_rank_1([-2.0, -2.0, -2.0]),
326                tensor_rank_1([2.0, 0.0, 0.0]),
327                tensor_rank_1([0.0, 2.0, 0.0]),
328            ]),
329            tensor_rank_1_list([
330                tensor_rank_1_zero(),
331                tensor_rank_1_zero(),
332                tensor_rank_1_zero(),
333                tensor_rank_1_zero(),
334                tensor_rank_1([-TWO_THIRDS, -2.0, -2.0]),
335                tensor_rank_1([FOUR_THIRDS, 2.0, 0.0]),
336                tensor_rank_1([-TWO_THIRDS, 0.0, 0.0]),
337                tensor_rank_1([-TWO_THIRDS, 0.0, 0.0]),
338                tensor_rank_1([FOUR_THIRDS, 0.0, 2.0]),
339                tensor_rank_1([-TWO_THIRDS, 0.0, 0.0]),
340            ]),
341            tensor_rank_1_list([
342                tensor_rank_1_zero(),
343                tensor_rank_1_zero(),
344                tensor_rank_1_zero(),
345                tensor_rank_1_zero(),
346                tensor_rank_1([-TWO_THIRDS, -TWO_THIRDS, -TWO_THIRDS]),
347                tensor_rank_1([FOUR_THIRDS, FOUR_THIRDS, -TWO_THIRDS]),
348                tensor_rank_1([-TWO_THIRDS, -TWO_THIRDS, -TWO_THIRDS]),
349                tensor_rank_1([-TWO_THIRDS, -TWO_THIRDS, -TWO_THIRDS]),
350                tensor_rank_1([FOUR_THIRDS, -TWO_THIRDS, FOUR_THIRDS]),
351                tensor_rank_1([-TWO_THIRDS, FOUR_THIRDS, FOUR_THIRDS]),
352            ]),
353            tensor_rank_1_list([
354                tensor_rank_1_zero(),
355                tensor_rank_1_zero(),
356                tensor_rank_1_zero(),
357                tensor_rank_1_zero(),
358                tensor_rank_1([0.0, 0.0, -TWO_THIRDS]),
359                tensor_rank_1([0.0, 0.0, -TWO_THIRDS]),
360                tensor_rank_1([0.0, 0.0, -TWO_THIRDS]),
361                tensor_rank_1([-2.0, -2.0, -TWO_THIRDS]),
362                tensor_rank_1([2.0, 0.0, FOUR_THIRDS]),
363                tensor_rank_1([0.0, 2.0, FOUR_THIRDS]),
364            ]),
365            tensor_rank_1_list([
366                tensor_rank_1_zero(),
367                tensor_rank_1_zero(),
368                tensor_rank_1_zero(),
369                tensor_rank_1_zero(),
370                tensor_rank_1([0.0, -FOUR_THIRDS, -2.0]),
371                tensor_rank_1([0.0, TWO_THIRDS, 0.0]),
372                tensor_rank_1([0.0, TWO_THIRDS, 0.0]),
373                tensor_rank_1([-2.0, -FOUR_THIRDS, 0.0]),
374                tensor_rank_1([2.0, TWO_THIRDS, 2.0]),
375                tensor_rank_1([0.0, TWO_THIRDS, 0.0]),
376            ]),
377            tensor_rank_1_list([
378                tensor_rank_1_zero(),
379                tensor_rank_1_zero(),
380                tensor_rank_1_zero(),
381                tensor_rank_1_zero(),
382                tensor_rank_1([0.0, -2.0, -FOUR_THIRDS]),
383                tensor_rank_1([2.0, 2.0, TWO_THIRDS]),
384                tensor_rank_1([-2.0, 0.0, -FOUR_THIRDS]),
385                tensor_rank_1([0.0, 0.0, TWO_THIRDS]),
386                tensor_rank_1([0.0, 0.0, TWO_THIRDS]),
387                tensor_rank_1([0.0, 0.0, TWO_THIRDS]),
388            ]),
389            tensor_rank_1_list([
390                tensor_rank_1_zero(),
391                tensor_rank_1_zero(),
392                tensor_rank_1_zero(),
393                tensor_rank_1_zero(),
394                tensor_rank_1([0.0, -TWO_THIRDS, 0.0]),
395                tensor_rank_1([2.0, FOUR_THIRDS, 0.0]),
396                tensor_rank_1([-2.0, -TWO_THIRDS, -2.0]),
397                tensor_rank_1([0.0, -TWO_THIRDS, 0.0]),
398                tensor_rank_1([0.0, -TWO_THIRDS, 0.0]),
399                tensor_rank_1([0.0, FOUR_THIRDS, 2.0]),
400            ]),
401            tensor_rank_1_list([
402                tensor_rank_1_zero(),
403                tensor_rank_1_zero(),
404                tensor_rank_1_zero(),
405                tensor_rank_1_zero(),
406                tensor_rank_1([TWO_THIRDS, 0.0, 0.0]),
407                tensor_rank_1([TWO_THIRDS, 0.0, 0.0]),
408                tensor_rank_1([-FOUR_THIRDS, 0.0, -2.0]),
409                tensor_rank_1([-FOUR_THIRDS, -2.0, 0.0]),
410                tensor_rank_1([TWO_THIRDS, 0.0, 0.0]),
411                tensor_rank_1([TWO_THIRDS, 2.0, 2.0]),
412            ]),
413            tensor_rank_1_list([
414                tensor_rank_1_zero(),
415                tensor_rank_1_zero(),
416                tensor_rank_1_zero(),
417                tensor_rank_1_zero(),
418                tensor_rank_1([TWO_THIRDS, -FOUR_THIRDS, -FOUR_THIRDS]),
419                tensor_rank_1([TWO_THIRDS, TWO_THIRDS, TWO_THIRDS]),
420                tensor_rank_1([-FOUR_THIRDS, TWO_THIRDS, -FOUR_THIRDS]),
421                tensor_rank_1([-FOUR_THIRDS, -FOUR_THIRDS, TWO_THIRDS]),
422                tensor_rank_1([TWO_THIRDS, TWO_THIRDS, TWO_THIRDS]),
423                tensor_rank_1([TWO_THIRDS, TWO_THIRDS, TWO_THIRDS]),
424            ]),
425        ])
426    }
427    const fn standard_gradient_operators_transposed() -> StandardGradientOperatorsTransposed<M, N, P>
428    {
429        const TWO_THIRDS: Scalar = 2.0 / 3.0;
430        const FOUR_THIRDS: Scalar = 4.0 / 3.0;
431        tensor_rank_1_list_2d([
432            tensor_rank_1_list([
433                tensor_rank_1([-2.0, -2.0, -2.0]),
434                tensor_rank_1_zero(),
435                tensor_rank_1_zero(),
436                tensor_rank_1_zero(),
437                tensor_rank_1_zero(),
438                tensor_rank_1_zero(),
439                tensor_rank_1_zero(),
440                tensor_rank_1_zero(),
441                tensor_rank_1_zero(),
442                tensor_rank_1_zero(),
443                tensor_rank_1_zero(),
444                tensor_rank_1_zero(),
445            ]),
446            tensor_rank_1_list([
447                tensor_rank_1_zero(),
448                tensor_rank_1([2.0, 0.0, 0.0]),
449                tensor_rank_1_zero(),
450                tensor_rank_1_zero(),
451                tensor_rank_1_zero(),
452                tensor_rank_1_zero(),
453                tensor_rank_1_zero(),
454                tensor_rank_1_zero(),
455                tensor_rank_1_zero(),
456                tensor_rank_1_zero(),
457                tensor_rank_1_zero(),
458                tensor_rank_1_zero(),
459            ]),
460            tensor_rank_1_list([
461                tensor_rank_1_zero(),
462                tensor_rank_1_zero(),
463                tensor_rank_1([0.0, 2.0, 0.0]),
464                tensor_rank_1_zero(),
465                tensor_rank_1_zero(),
466                tensor_rank_1_zero(),
467                tensor_rank_1_zero(),
468                tensor_rank_1_zero(),
469                tensor_rank_1_zero(),
470                tensor_rank_1_zero(),
471                tensor_rank_1_zero(),
472                tensor_rank_1_zero(),
473            ]),
474            tensor_rank_1_list([
475                tensor_rank_1_zero(),
476                tensor_rank_1_zero(),
477                tensor_rank_1_zero(),
478                tensor_rank_1([0.0, 0.0, 2.0]),
479                tensor_rank_1_zero(),
480                tensor_rank_1_zero(),
481                tensor_rank_1_zero(),
482                tensor_rank_1_zero(),
483                tensor_rank_1_zero(),
484                tensor_rank_1_zero(),
485                tensor_rank_1_zero(),
486                tensor_rank_1_zero(),
487            ]),
488            tensor_rank_1_list([
489                tensor_rank_1([2.0, 0.0, 0.0]),
490                tensor_rank_1([-2.0, -2.0, -2.0]),
491                tensor_rank_1_zero(),
492                tensor_rank_1_zero(),
493                tensor_rank_1([-TWO_THIRDS, -2.0, -2.0]),
494                tensor_rank_1([-TWO_THIRDS, -TWO_THIRDS, -TWO_THIRDS]),
495                tensor_rank_1([0.0, 0.0, -TWO_THIRDS]),
496                tensor_rank_1([0.0, -FOUR_THIRDS, -2.0]),
497                tensor_rank_1([0.0, -2.0, -FOUR_THIRDS]),
498                tensor_rank_1([0.0, -TWO_THIRDS, 0.0]),
499                tensor_rank_1([TWO_THIRDS, 0.0, 0.0]),
500                tensor_rank_1([TWO_THIRDS, -FOUR_THIRDS, -FOUR_THIRDS]),
501            ]),
502            tensor_rank_1_list([
503                tensor_rank_1_zero(),
504                tensor_rank_1([0.0, 2.0, 0.0]),
505                tensor_rank_1([2.0, 0.0, 0.0]),
506                tensor_rank_1_zero(),
507                tensor_rank_1([FOUR_THIRDS, 2.0, 0.0]),
508                tensor_rank_1([FOUR_THIRDS, FOUR_THIRDS, -TWO_THIRDS]),
509                tensor_rank_1([0.0, 0.0, -TWO_THIRDS]),
510                tensor_rank_1([0.0, TWO_THIRDS, 0.0]),
511                tensor_rank_1([2.0, 2.0, TWO_THIRDS]),
512                tensor_rank_1([2.0, FOUR_THIRDS, 0.0]),
513                tensor_rank_1([TWO_THIRDS, 0.0, 0.0]),
514                tensor_rank_1([TWO_THIRDS, TWO_THIRDS, TWO_THIRDS]),
515            ]),
516            tensor_rank_1_list([
517                tensor_rank_1([0.0, 2.0, 0.0]),
518                tensor_rank_1_zero(),
519                tensor_rank_1([-2.0, -2.0, -2.0]),
520                tensor_rank_1_zero(),
521                tensor_rank_1([-TWO_THIRDS, 0.0, 0.0]),
522                tensor_rank_1([-TWO_THIRDS, -TWO_THIRDS, -TWO_THIRDS]),
523                tensor_rank_1([0.0, 0.0, -TWO_THIRDS]),
524                tensor_rank_1([0.0, TWO_THIRDS, 0.0]),
525                tensor_rank_1([-2.0, 0.0, -FOUR_THIRDS]),
526                tensor_rank_1([-2.0, -TWO_THIRDS, -2.0]),
527                tensor_rank_1([-FOUR_THIRDS, 0.0, -2.0]),
528                tensor_rank_1([-FOUR_THIRDS, TWO_THIRDS, -FOUR_THIRDS]),
529            ]),
530            tensor_rank_1_list([
531                tensor_rank_1([0.0, 0.0, 2.0]),
532                tensor_rank_1_zero(),
533                tensor_rank_1_zero(),
534                tensor_rank_1([-2.0, -2.0, -2.0]),
535                tensor_rank_1([-TWO_THIRDS, 0.0, 0.0]),
536                tensor_rank_1([-TWO_THIRDS, -TWO_THIRDS, -TWO_THIRDS]),
537                tensor_rank_1([-2.0, -2.0, -TWO_THIRDS]),
538                tensor_rank_1([-2.0, -FOUR_THIRDS, 0.0]),
539                tensor_rank_1([0.0, 0.0, TWO_THIRDS]),
540                tensor_rank_1([0.0, -TWO_THIRDS, 0.0]),
541                tensor_rank_1([-FOUR_THIRDS, -2.0, 0.0]),
542                tensor_rank_1([-FOUR_THIRDS, -FOUR_THIRDS, TWO_THIRDS]),
543            ]),
544            tensor_rank_1_list([
545                tensor_rank_1_zero(),
546                tensor_rank_1([0.0, 0.0, 2.0]),
547                tensor_rank_1_zero(),
548                tensor_rank_1([2.0, 0.0, 0.0]),
549                tensor_rank_1([FOUR_THIRDS, 0.0, 2.0]),
550                tensor_rank_1([FOUR_THIRDS, -TWO_THIRDS, FOUR_THIRDS]),
551                tensor_rank_1([2.0, 0.0, FOUR_THIRDS]),
552                tensor_rank_1([2.0, TWO_THIRDS, 2.0]),
553                tensor_rank_1([0.0, 0.0, TWO_THIRDS]),
554                tensor_rank_1([0.0, -TWO_THIRDS, 0.0]),
555                tensor_rank_1([TWO_THIRDS, 0.0, 0.0]),
556                tensor_rank_1([TWO_THIRDS, TWO_THIRDS, TWO_THIRDS]),
557            ]),
558            tensor_rank_1_list([
559                tensor_rank_1_zero(),
560                tensor_rank_1_zero(),
561                tensor_rank_1([0.0, 0.0, 2.0]),
562                tensor_rank_1([0.0, 2.0, 0.0]),
563                tensor_rank_1([-TWO_THIRDS, 0.0, 0.0]),
564                tensor_rank_1([-TWO_THIRDS, FOUR_THIRDS, FOUR_THIRDS]),
565                tensor_rank_1([0.0, 2.0, FOUR_THIRDS]),
566                tensor_rank_1([0.0, TWO_THIRDS, 0.0]),
567                tensor_rank_1([0.0, 0.0, TWO_THIRDS]),
568                tensor_rank_1([0.0, FOUR_THIRDS, 2.0]),
569                tensor_rank_1([TWO_THIRDS, 2.0, 2.0]),
570                tensor_rank_1([TWO_THIRDS, TWO_THIRDS, TWO_THIRDS]),
571            ]),
572        ])
573    }
574}