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}