next up previous contents
: テトラド : 4階テンソル : 4階テンソル   目次

実装

4階のテンソルは、一般には4次元配列変数として実装される。 ただし、対称テンソルの場合には、2次元配列変数として実装できる。 この場合の対称とは、$C_{ijkl}$ について、$ij$$kl$ とが対称で、 かつ、$i$$j$$k$$l$ ともそれぞれ対称な場合を意味する。 ここでも、二次元対称テンソルで用いたインデックスの既約を用いる。

/*
  (4階)テンソル変数 whT4_C は、以下のように定義される。
  外側から内側へ順に、i、j、k、lとする

double whT4_C[2][2][2][2];

  4次元配列 whT4_C の配列添字 0, 1 は、それぞれ x, y 成分を表す。
  [0][0][0][0]=xxxx, [0][0][0][1]=xxxy
  [0][0][1][0]=xxyx, [0][0][1][1]=xxyy
  [0][1][0][0]=xyxx, [0][1][0][1]=xyxy
  [0][1][1][0]=xyyx, [0][1][1][1]=xyyy
  [1][0][0][0]=yxxx, [1][0][0][1]=yxxy
  [1][0][1][0]=yxyx, [1][0][1][1]=yxyy
  [1][1][0][0]=yyxx, [1][1][0][1]=yyxy
  [1][1][1][0]=yyyx, [1][1][1][1]=yyyy
*/

/*
  対称の(4階)テンソル変数 whST4_D は、以下のように定義される。
  外側から内側へ順に、ij、klとする

double whST4_D[3][3];

  2次元配列 whST4_D の配列添字 0, 1, 2 は、
  それぞれ xx, yy, xy 成分を表す。
  [0][0]=xx xx, [0][1]=xx yy, [0][2]=xx xy
  [1][0]=yy xx, [1][1]=yy yy, [1][2]=yy xy
  [2][0]=xy xx, [2][1]=xy yy, [2][2]=xy xy
*/

また、4階テンソルと対称4階テンソルとの変換を 関数として以下のように実装する。

/* 4階テンソルから対称4階テンソルへ変換する */
void WH_Tensor2D__convert_whT4_OUT_whST4
(double whT4_X[2][2][2][2],
 double OUT__whST4_Y[3][3])
/*
  入力引数:
    whT4_X は4階テンソルで、これは対称テンソルでなければならない
  出力引数:
    OUT__whST4_Yは対称4階テンソル
*/
{
  int ij, kl;

  for (ij = 0; ij < 3; ij++) {
    for (kl = 0; kl < 3; kl++) {
      OUT__whST4_Y[ij][kl] 
        = whT4_X[WH_Tensor2D__I[ij]][WH_Tensor2D__J[ij]]
                [WH_Tensor2D__I[kl]][WH_Tensor2D__J[kl]];
    }
  }
}

/* 対称4階テンソルから4階テンソルへ変換する */
void WH_Tensor2D__convert_whST4_OUT_whT4
(double whST4_X[3][3],
 double OUT__whT4_Y[2][2][2][2])
/*
  入力引数:
    whST4_X は対称4階テンソル
  出力引数:
    OUT__whT4_Yは4階テンソル
*/
{
  int i, j, k, l;

  for (i = 0; i < 2; i++) {
    for (j = 0; j < 2; j++) {
      for (k = 0; k < 2; k++) {
        for (l = 0; l < 2; l++) {
          OUT__whT4_Y[i][j][k][l] 
            = whST4_X[WH_Tensor2D__IJ[i][j]]
                     [WH_Tensor2D__IJ[k][l]];
        }
      }
    }
  }
}



Hiroshi KAWAI 平成15年4月19日