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