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