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}