20#ifndef B2_TENSOR_TRANSFORMATION_H_
21#define B2_TENSOR_TRANSFORMATION_H_
25#include "utils/b2linear_algebra.H"
84 copy_3(base[0], cartesian_base[0]);
86 outer_product_3(cartesian_base[2], cartesian_base[0], cartesian_base[1]);
90inline void get_base_opposite_variance(
const T base[3][3], T base_ov[3][3]) {
95inline void get_base_opposite_variance(
const T base[2][2], T base_ov[2][2]) {
100inline void transform_strain(
const T Gab[3][3],
const T strain_A[6], T strain_B[6]) {
101 const T EEA[3][3] = {
102 {strain_A[0], .5 * strain_A[3], .5 * strain_A[5]},
103 {.5 * strain_A[3], strain_A[1], .5 * strain_A[4]},
104 {.5 * strain_A[5], .5 * strain_A[4], strain_A[2]},
107 for (
int i = 0; i != 3; ++i) {
108 for (
int j = 0; j != 3; ++j) {
109 for (
int a = 0; a != 3; ++a) {
110 for (
int b = 0; b != 3; ++b) { EEB[i][j] += EEA[a][b] * Gab[a][i] * Gab[b][j]; }
114 strain_B[0] = EEB[0][0];
115 strain_B[1] = EEB[1][1];
116 strain_B[2] = EEB[2][2];
117 strain_B[3] = EEB[0][1] + EEB[1][0];
118 strain_B[4] = EEB[1][2] + EEB[2][1];
119 strain_B[5] = EEB[0][2] + EEB[2][0];
123inline void transform_strain(
const T Gab[2][2],
const T strain_A[3], T strain_B[3]) {
124 const T EEA[2][2] = {
125 {strain_A[0], .5 * strain_A[2]},
126 {.5 * strain_A[2], strain_A[1]},
129 for (
int i = 0; i != 2; ++i) {
130 for (
int j = 0; j != 2; ++j) {
131 for (
int a = 0; a != 2; ++a) {
132 for (
int b = 0; b != 2; ++b) { EEB[i][j] += EEA[a][b] * Gab[a][i] * Gab[b][j]; }
136 strain_B[0] = EEB[0][0];
137 strain_B[1] = EEB[1][1];
138 strain_B[2] = EEB[0][1] + EEB[1][0];
142inline void transform_strain_from_base_A_to_base_B(
143 const T base_A[3][3],
const T base_B[3][3],
const T strain_A[6], T strain_B[6]) {
145 get_base_opposite_variance(base_A, base_A_ov);
147 for (
int i = 0; i != 3; ++i) {
148 for (
int j = 0; j != 3; ++j) { Gab[i][j] =
dot_3(base_A_ov[i], base_B[j]); }
150 transform_strain(Gab, strain_A, strain_B);
154inline void transform_strain_from_base_A_to_base_B(
155 const T base_A[2][2],
const T base_B[2][2],
const T strain_A[3], T strain_B[3]) {
157 get_base_opposite_variance(base_A, base_A_ov);
159 for (
int i = 0; i != 2; ++i) {
160 for (
int j = 0; j != 2; ++j) { Gab[i][j] =
dot_2(base_A_ov[i], base_B[j]); }
162 transform_strain(Gab, strain_A, strain_B);
166inline void transform_strain_from_base_A_ov_to_base_B(
167 const T base_A_ov[3][3],
const T base_B[3][3],
const T strain_A[6], T strain_B[6]) {
169 for (
int i = 0; i != 3; ++i) {
170 for (
int j = 0; j != 3; ++j) { Gab[i][j] =
dot_3(base_A_ov[i], base_B[j]); }
172 transform_strain(Gab, strain_A, strain_B);
176inline void transform_strain_from_base_A_ov_to_base_B(
177 const T base_A_ov[2][2],
const T base_B[2][2],
const T strain_A[3], T strain_B[3]) {
179 for (
int i = 0; i != 2; ++i) {
180 for (
int j = 0; j != 2; ++j) { Gab[i][j] =
dot_2(base_A_ov[i], base_B[j]); }
182 transform_strain(Gab, strain_A, strain_B);
186inline void transform_strain_from_base_A_to_I(
187 const T base_A[3][3],
const T strain_A[6], T strain_B[6]) {
189 get_base_opposite_variance(base_A, base_A_ov);
190 transform_strain(base_A_ov, strain_A, strain_B);
194inline void transform_strain_from_base_A_to_I(
195 const T base_A[2][2],
const T strain_A[3], T strain_B[3]) {
197 get_base_opposite_variance(base_A, base_A_ov);
198 transform_strain(base_A_ov, strain_A, strain_B);
202inline void transform_strain_from_base_A_ov_to_I(
203 const T base_A_ov[3][3],
const T strain_A[6], T strain_B[6]) {
204 transform_strain(base_A_ov, strain_A, strain_B);
208inline void transform_strain_from_base_A_ov_to_I(
209 const T base_A_ov[2][2],
const T strain_A[3], T strain_B[3]) {
210 transform_strain(base_A_ov, strain_A, strain_B);
214inline void transform_strain_from_I_to_base_B(
215 const T base_B[3][3],
const T strain_A[6], T strain_B[6]) {
218 transform_strain(Gab, strain_A, strain_B);
222inline void transform_strain_from_I_to_base_B(
223 const T base_B[2][2],
const T strain_A[3], T strain_B[3]) {
226 transform_strain(Gab, strain_A, strain_B);
230inline void transform_stress(
const T Gab[3][3],
const T stress_A[6], T stress_B[6]) {
231 const T SSa[3][3] = {
232 {stress_A[0], stress_A[3], stress_A[5]},
233 {stress_A[3], stress_A[1], stress_A[4]},
234 {stress_A[5], stress_A[4], stress_A[2]},
237 for (
int i = 0; i != 3; ++i) {
238 for (
int j = 0; j != 3; ++j) {
239 for (
int a = 0; a != 3; ++a) {
240 for (
int b = 0; b != 3; ++b) { SSb[i][j] += SSa[a][b] * Gab[a][i] * Gab[b][j]; }
244 stress_B[0] = SSb[0][0];
245 stress_B[1] = SSb[1][1];
246 stress_B[2] = SSb[2][2];
247 stress_B[3] = .5 * (SSb[0][1] + SSb[1][0]);
248 stress_B[4] = .5 * (SSb[1][2] + SSb[2][1]);
249 stress_B[5] = .5 * (SSb[0][2] + SSb[2][0]);
253inline void transform_stress(
const T Gab[2][2],
const T stress_A[3], T stress_B[3]) {
254 const T SSa[3][3] = {
255 {stress_A[0], stress_A[2]},
256 {stress_A[2], stress_A[1]},
259 for (
int i = 0; i != 2; ++i) {
260 for (
int j = 0; j != 2; ++j) {
261 for (
int a = 0; a != 2; ++a) {
262 for (
int b = 0; b != 2; ++b) { SSb[i][j] += SSa[a][b] * Gab[a][i] * Gab[b][j]; }
266 stress_B[0] = SSb[0][0];
267 stress_B[1] = SSb[1][1];
268 stress_B[2] = .5 * (SSb[0][1] + SSb[1][0]);
272inline void transform_stress_from_base_A_to_base_B(
273 const T base_A[3][3],
const T base_B[3][3],
const T stress_A[6], T stress_B[6]) {
275 get_base_opposite_variance(base_A, base_A_ov);
277 for (
int i = 0; i != 3; ++i) {
278 for (
int j = 0; j != 3; ++j) { Gab[i][j] =
dot_3(base_A_ov[i], base_B[j]); }
280 transform_stress(Gab, stress_A, stress_B);
284inline void transform_stress_from_base_A_to_base_B(
285 const T base_A[2][2],
const T base_B[2][2],
const T stress_A[3], T stress_B[3]) {
287 get_base_opposite_variance(base_A, base_A_ov);
289 for (
int i = 0; i != 2; ++i) {
290 for (
int j = 0; j != 2; ++j) { Gab[i][j] =
dot_2(base_A_ov[i], base_B[j]); }
292 transform_stress(Gab, stress_A, stress_B);
296inline void transform_stress_from_base_A_ov_to_base_B(
297 const T base_A_ov[3][3],
const T base_B[3][3],
const T stress_A[6], T stress_B[6]) {
299 for (
int i = 0; i != 3; ++i) {
300 for (
int j = 0; j != 3; ++j) { Gab[i][j] =
dot_3(base_A_ov[i], base_B[j]); }
302 transform_stress(Gab, stress_A, stress_B);
306inline void transform_stress_from_base_A_ov_to_base_B(
307 const T base_A_ov[2][2],
const T base_B[2][2],
const T stress_A[3], T stress_B[3]) {
309 for (
int i = 0; i != 2; ++i) {
310 for (
int j = 0; j != 2; ++j) { Gab[i][j] =
dot_2(base_A_ov[i], base_B[j]); }
312 transform_stress(Gab, stress_A, stress_B);
316inline void transform_stress_from_base_A_to_I(
317 const T base_A[3][3],
const T stress_A[6], T stress_B[6]) {
319 get_base_opposite_variance(base_A, base_A_ov);
320 transform_stress(base_A_ov, stress_A, stress_B);
324inline void transform_stress_from_base_A_to_I(
325 const T base_A[2][2],
const T stress_A[3], T stress_B[3]) {
327 get_base_opposite_variance(base_A, base_A_ov);
328 transform_stress(base_A_ov, stress_A, stress_B);
332inline void transform_stress_from_base_A_ov_to_I(
333 const T base_A_ov[3][3],
const T stress_A[6], T stress_B[6]) {
334 transform_stress(base_A_ov, stress_A, stress_B);
338inline void transform_stress_from_base_A_ov_to_I(
339 const T base_A_ov[2][2],
const T stress_A[3], T stress_B[3]) {
340 transform_stress(base_A_ov, stress_A, stress_B);
344inline void transform_stress_from_I_to_base_B(
345 const T base_B[3][3],
const T stress_A[6], T stress_B[6]) {
348 transform_stress(Gab, stress_A, stress_B);
352inline void transform_stress_from_I_to_base_B(
353 const T base_B[2][2],
const T stress_A[3], T stress_B[3]) {
356 transform_stress(Gab, stress_A, stress_B);
360inline void transform_constitutive_tensor(
361 const T Gab[3][3],
const T d_stress_d_strain_A[21], T d_stress_d_strain_B[21]) {
362 b2linalg::Matrix<T, b2linalg::Mlower_packed_constref> CCa(6, d_stress_d_strain_A);
363 b2linalg::Matrix<T, b2linalg::Mlower_packed_ref> CCb(6, d_stress_d_strain_B);
364 const int ia[6] = {0, 1, 2, 0, 1, 0};
365 const int ib[6] = {0, 1, 2, 1, 2, 2};
368 const int ii[9] = {0, 3, 5, 3, 1, 4, 5, 4, 2};
370 for (
int i = 0; i != 6; ++i) {
371 for (
int j = 0; j <= i; ++j) {
373 for (
int ab = 0; ab != 9; ++ab) {
374 const int a = ab % 3;
375 const int b = ab / 3;
376 for (
int cd = 0; cd != 9; ++cd) {
377 const int c = cd % 3;
378 const int d = cd / 3;
379 CCb(i, j) += CCa(ii[ab], ii[cd]) * Gab[a][ia[i]] * Gab[b][ib[i]] * Gab[c][ia[j]]
388inline void transform_constitutive_tensor(
389 const T Gab[2][2],
const T d_stress_d_strain_A[6], T d_stress_d_strain_B[6]) {
390 b2linalg::Matrix<T, b2linalg::Mlower_packed_constref> CCa(3, d_stress_d_strain_A);
391 b2linalg::Matrix<T, b2linalg::Mlower_packed_ref> CCb(3, d_stress_d_strain_B);
392 const int ia[3] = {0, 1, 0};
393 const int ib[3] = {0, 1, 1};
396 const int ii[4] = {0, 2, 2, 1};
398 for (
int i = 0; i != 3; ++i) {
399 for (
int j = 0; j <= i; ++j) {
401 for (
int ab = 0; ab != 4; ++ab) {
402 const int a = ab % 2;
403 const int b = ab / 2;
404 for (
int cd = 0; cd != 4; ++cd) {
405 const int c = cd % 2;
406 const int d = cd / 2;
407 CCb(i, j) += CCa(ii[ab], ii[cd]) * Gab[a][ia[i]] * Gab[b][ib[i]] * Gab[c][ia[j]]
416inline void transform_constitutive_tensor_from_base_A_to_base_B(
417 const T base_A[3][3],
const T base_B[3][3],
const T d_stress_d_strain_A[21],
418 T d_stress_d_strain_B[21]) {
420 get_base_opposite_variance(base_A, base_A_ov);
422 for (
int i = 0; i != 3; ++i) {
423 for (
int j = 0; j != 3; ++j) { Gab[i][j] =
dot_3(base_A_ov[i], base_B[j]); }
425 transform_constitutive_tensor(Gab, d_stress_d_strain_A, d_stress_d_strain_B);
429inline void transform_constitutive_tensor_from_base_A_to_base_B(
430 const T base_A[2][2],
const T base_B[2][2],
const T d_stress_d_strain_A[6],
431 T d_stress_d_strain_B[6]) {
433 get_base_opposite_variance(base_A, base_A_ov);
435 for (
int i = 0; i != 2; ++i) {
436 for (
int j = 0; j != 2; ++j) { Gab[i][j] =
dot_2(base_A_ov[i], base_B[j]); }
438 transform_constitutive_tensor(Gab, d_stress_d_strain_A, d_stress_d_strain_B);
442inline void transform_constitutive_tensor_from_base_A_ov_to_base_B(
443 const T base_A_ov[3][3],
const T base_B[3][3],
const T d_stress_d_strain_A[21],
444 T d_stress_d_strain_B[21]) {
446 for (
int i = 0; i != 3; ++i) {
447 for (
int j = 0; j != 3; ++j) { Gab[i][j] =
dot_3(base_A_ov[i], base_B[j]); }
449 transform_constitutive_tensor(Gab, d_stress_d_strain_A, d_stress_d_strain_B);
453inline void transform_constitutive_tensor_from_base_A_ov_to_base_B(
454 const T base_A_ov[2][2],
const T base_B[2][2],
const T d_stress_d_strain_A[6],
455 T d_stress_d_strain_B[6]) {
457 for (
int i = 0; i != 2; ++i) {
458 for (
int j = 0; j != 2; ++j) { Gab[i][j] =
dot_2(base_A_ov[i], base_B[j]); }
460 transform_constitutive_tensor(Gab, d_stress_d_strain_A, d_stress_d_strain_B);
464inline void transform_constitutive_tensor_from_base_A_to_I(
465 const T base_A[3][3],
const T d_stress_d_strain_A[21], T d_stress_d_strain_B[21]) {
467 get_base_opposite_variance(base_A, base_A_ov);
468 transform_constitutive_tensor(base_A_ov, d_stress_d_strain_A, d_stress_d_strain_B);
472inline void transform_constitutive_tensor_from_base_A_to_I(
473 const T base_A[2][2],
const T d_stress_d_strain_A[6], T d_stress_d_strain_B[6]) {
475 get_base_opposite_variance(base_A, base_A_ov);
476 transform_constitutive_tensor(base_A_ov, d_stress_d_strain_A, d_stress_d_strain_B);
480inline void transform_constitutive_tensor_from_base_A_ov_to_I(
481 const T base_A_ov[3][3],
const T d_stress_d_strain_A[21], T d_stress_d_strain_B[21]) {
482 transform_constitutive_tensor(base_A_ov, d_stress_d_strain_A, d_stress_d_strain_B);
486inline void transform_constitutive_tensor_from_base_A_ov_to_I(
487 const T base_A_ov[2][2],
const T d_stress_d_strain_A[6], T d_stress_d_strain_B[6]) {
488 transform_constitutive_tensor(base_A_ov, d_stress_d_strain_A, d_stress_d_strain_B);
492inline void transform_constitutive_tensor_from_I_to_base_B(
493 const T base_B[3][3],
const T d_stress_d_strain_A[21], T d_stress_d_strain_B[21]) {
496 transform_constitutive_tensor(Gab, d_stress_d_strain_A, d_stress_d_strain_B);
500inline void transform_constitutive_tensor_from_I_to_base_B(
501 const T base_B[2][2],
const T d_stress_d_strain_A[6], T d_stress_d_strain_B[6]) {
504 transform_constitutive_tensor(Gab, d_stress_d_strain_A, d_stress_d_strain_B);
508inline void transform_shell_strain(
const T Gab[3][3],
const T strain_A[8], T strain_B[8]) {
510 for (
int ii = 0; ii != 2; ++ii) {
511 const int o = 3 * ii;
514 const T EEA[3][3] = {
515 {strain_A[o + 0], .5 * strain_A[o + 2], 0},
516 {.5 * strain_A[o + 2], strain_A[o + 1], 0},
522 for (
int i = 0; i != 3; ++i) {
523 for (
int j = 0; j != 3; ++j) {
524 for (
int a = 0; a != 3; ++a) {
525 for (
int b = 0; b != 3; ++b) { EEB[i][j] += EEA[a][b] * Gab[a][i] * Gab[b][j]; }
531 strain_B[o + 0] = EEB[0][0];
532 strain_B[o + 1] = EEB[1][1];
533 strain_B[o + 2] = EEB[0][1] + EEB[1][0];
539 const T EEA[3][3] = {
540 {0, 0, .5 * strain_A[7]},
541 {0, 0, .5 * strain_A[6]},
542 {.5 * strain_A[7], .5 * strain_A[6], 0},
547 for (
int i = 0; i != 3; ++i) {
548 for (
int j = 0; j != 3; ++j) {
549 for (
int a = 0; a != 3; ++a) {
550 for (
int b = 0; b != 3; ++b) { EEB[i][j] += EEA[a][b] * Gab[a][i] * Gab[b][j]; }
556 strain_B[6] = EEB[1][2] + EEB[2][1];
557 strain_B[7] = EEB[0][2] + EEB[2][0];
562inline void transform_shell_strain_from_base_A_to_base_B(
563 const T base_A[3][3],
const T base_B[3][3],
const T strain_A[8], T strain_B[8]) {
565 get_base_opposite_variance(base_A, base_A_ov);
567 for (
int i = 0; i != 3; ++i) {
568 for (
int j = 0; j != 3; ++j) { Gab[i][j] =
dot_3(base_A_ov[i], base_B[j]); }
570 transform_shell_strain(Gab, strain_A, strain_B);
574inline void transform_shell_strain_from_base_A_ov_to_base_B(
575 const T base_A_ov[3][3],
const T base_B[3][3],
const T strain_A[8], T strain_B[8]) {
577 for (
int i = 0; i != 3; ++i) {
578 for (
int j = 0; j != 3; ++j) { Gab[i][j] =
dot_3(base_A_ov[i], base_B[j]); }
580 transform_shell_strain(Gab, strain_A, strain_B);
584inline void transform_shell_strain_from_base_A_to_I(
585 const T base_A[3][3],
const T strain_A[8], T strain_B[8]) {
587 get_base_opposite_variance(base_A, base_A_ov);
588 transform_shell_strain(base_A_ov, strain_A, strain_B);
592inline void transform_shell_strain_from_base_A_ov_to_I(
593 const T base_A_ov[3][3],
const T strain_A[8], T strain_B[8]) {
594 transform_shell_strain(base_A_ov, strain_A, strain_B);
598inline void transform_shell_strain_from_I_to_base_B(
599 const T base_B[3][3],
const T strain_A[8], T strain_B[8]) {
602 transform_shell_strain(Gab, strain_A, strain_B);
606inline void transform_shell_stress(
const T Gab[3][3],
const T stress_A[8], T stress_B[8]) {
608 for (
int ii = 0; ii != 2; ++ii) {
609 const int o = 3 * ii;
612 const T SSA[3][3] = {
613 {stress_A[o + 0], stress_A[o + 2], 0},
614 {stress_A[o + 2], stress_A[o + 1], 0},
620 for (
int i = 0; i != 3; ++i) {
621 for (
int j = 0; j != 3; ++j) {
622 for (
int a = 0; a != 3; ++a) {
623 for (
int b = 0; b != 3; ++b) { SSB[i][j] += SSA[a][b] * Gab[a][i] * Gab[b][j]; }
629 stress_B[o + 0] = SSB[0][0];
630 stress_B[o + 1] = SSB[1][1];
631 stress_B[o + 2] = .5 * (SSB[0][1] + SSB[1][0]);
637 const T SSA[3][3] = {
640 {stress_A[7], stress_A[6], 0},
645 for (
int i = 0; i != 3; ++i) {
646 for (
int j = 0; j != 3; ++j) {
647 for (
int a = 0; a != 3; ++a) {
648 for (
int b = 0; b != 3; ++b) { SSB[i][j] += SSA[a][b] * Gab[a][i] * Gab[b][j]; }
654 stress_B[6] = .5 * (SSB[1][2] + SSB[2][1]);
655 stress_B[7] = .5 * (SSB[0][2] + SSB[2][0]);
660inline void transform_shell_stress_from_base_A_to_base_B(
661 const T base_A[3][3],
const T base_B[3][3],
const T stress_A[8], T stress_B[8]) {
663 get_base_opposite_variance(base_A, base_A_ov);
665 for (
int i = 0; i != 3; ++i) {
666 for (
int j = 0; j != 3; ++j) { Gab[i][j] =
dot_3(base_A_ov[i], base_B[j]); }
668 transform_shell_stress(Gab, stress_A, stress_B);
672inline void transform_shell_stress_from_base_A_ov_to_base_B(
673 const T base_A_ov[3][3],
const T base_B[3][3],
const T stress_A[8], T stress_B[8]) {
675 for (
int i = 0; i != 3; ++i) {
676 for (
int j = 0; j != 3; ++j) { Gab[i][j] =
dot_3(base_A_ov[i], base_B[j]); }
678 transform_shell_stress(Gab, stress_A, stress_B);
682inline void transform_shell_stress_from_base_A_to_I(
683 const T base_A[3][3],
const T stress_A[8], T stress_B[8]) {
685 get_base_opposite_variance(base_A, base_A_ov);
686 transform_shell_stress(base_A_ov, stress_A, stress_B);
690inline void transform_shell_stress_from_base_A_ov_to_I(
691 const T base_A_ov[3][3],
const T stress_A[8], T stress_B[8]) {
692 transform_shell_stress(base_A_ov, stress_A, stress_B);
696inline void transform_shell_stress_from_I_to_base_B(
697 const T base_B[3][3],
const T stress_A[8], T stress_B[8]) {
700 transform_shell_stress(Gab, stress_A, stress_B);
704inline void transform_shell_constitutive_tensor(
705 const T Gab[3][3],
const T d_stress_d_strain_A[36], T d_stress_d_strain_B[36]) {
706 b2linalg::Matrix<T, b2linalg::Mlower_packed_constref> CCa(8, d_stress_d_strain_A);
707 b2linalg::Matrix<T, b2linalg::Mlower_packed_ref> CCb(8, d_stress_d_strain_B);
710 for (
int ii = 0; ii != 3; ++ii) {
711 const int off_k[3] = {0, 3, 0};
712 const int off_l[3] = {0, 3, 3};
713 const int ind[3] = {0, 1, 3};
717 b2linalg::Matrix<T, b2linalg::Mlower_packed_ref> C_tmp_a(6, &tmp_a[0]);
718 for (
int l = 0; l != 3; ++l) {
719 for (
int k = l; k != 3; ++k) {
720 C_tmp_a(ind[k], ind[l]) = CCa(off_k[ii] + k, off_l[ii] + l);
726 transform_constitutive_tensor(Gab, tmp_a, tmp_b);
729 b2linalg::Matrix<T, b2linalg::Mlower_packed_constref> C_tmp_b(6, &tmp_b[0]);
730 for (
int l = 0; l != 3; ++l) {
731 for (
int k = l; k != 3; ++k) {
732 CCb(off_k[ii] + k, off_l[ii] + l) = C_tmp_b(ind[k], ind[l]);
741 tmp_a[18] = CCa(6, 6);
742 tmp_a[19] = CCa(6, 7);
743 tmp_a[20] = CCa(7, 7);
747 transform_constitutive_tensor(Gab, tmp_a, tmp_b);
750 CCb(6, 6) = tmp_b[18];
751 CCb(6, 7) = tmp_b[19];
752 CCb(7, 7) = tmp_b[20];
757inline void transform_shell_constitutive_tensor_from_base_A_to_base_B(
758 const T base_A[3][3],
const T base_B[3][3],
const T d_stress_d_strain_A[36],
759 T d_stress_d_strain_B[36]) {
761 get_base_opposite_variance(base_A, base_A_ov);
763 for (
int i = 0; i != 3; ++i) {
764 for (
int j = 0; j != 3; ++j) { Gab[i][j] =
dot_3(base_A_ov[i], base_B[j]); }
766 transform_shell_constitutive_tensor(Gab, d_stress_d_strain_A, d_stress_d_strain_B);
770inline void transform_shell_constitutive_tensor_from_base_A_ov_to_base_B(
771 const T base_A_ov[3][3],
const T base_B[3][3],
const T d_stress_d_strain_A[36],
772 T d_stress_d_strain_B[36]) {
774 for (
int i = 0; i != 3; ++i) {
775 for (
int j = 0; j != 3; ++j) { Gab[i][j] =
dot_3(base_A_ov[i], base_B[j]); }
777 transform_shell_constitutive_tensor(Gab, d_stress_d_strain_A, d_stress_d_strain_B);
781inline void transform_shell_constitutive_tensor_from_base_A_to_I(
782 const T base_A[3][3],
const T d_stress_d_strain_A[36], T d_stress_d_strain_B[36]) {
784 get_base_opposite_variance(base_A, base_A_ov);
785 transform_shell_constitutive_tensor(base_A_ov, d_stress_d_strain_A, d_stress_d_strain_B);
789inline void transform_shell_constitutive_tensor_from_base_A_ov_to_I(
790 const T base_A_ov[3][3],
const T d_stress_d_strain_A[36], T d_stress_d_strain_B[36]) {
791 transform_shell_constitutive_tensor(base_A_ov, d_stress_d_strain_A, d_stress_d_strain_B);
795inline void transform_shell_constitutive_tensor_from_I_to_base_B(
796 const T base_B[3][3],
const T d_stress_d_strain_A[36], T d_stress_d_strain_B[36]) {
799 transform_shell_constitutive_tensor(Gab, d_stress_d_strain_A, d_stress_d_strain_B);
Contains the base classes for implementing Finite Elements.
Definition b2boundary_condition.H:32
void copy_3(const T1 a[3], T1 b[3])
Definition b2tensor_calculus.H:214
T transposed_invert_3_3(const T a[3][3], T b[3][3])
Definition b2tensor_calculus.H:764
T normalise_3(T a[3])
Definition b2tensor_calculus.H:418
void outer_product_3(const T1 a[3], const T2 b[3], T3 c[3])
Definition b2tensor_calculus.H:389
void transpose_2_2(T1 a[2][2])
Definition b2tensor_calculus.H:623
void get_cartesian_base(const T base[3][3], T cartesian_base[3][3])
Definition b2tensor_transformation.H:81
T transposed_invert_2_2(const T a[2][2], T b[2][2])
Definition b2tensor_calculus.H:795
T dot_3(const T a[3], const T b[3])
Definition b2tensor_calculus.H:328
T dot_2(const T a[2], const T b[2])
Definition b2tensor_calculus.H:346
void transpose_3_3(T1 a[3][3])
Definition b2tensor_calculus.H:615