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[3][3][3][3];

  4次元配列 whT4_C の配列添字 0, 1, 2 は、それぞれ x, y, z 成分を表す。
  [0][0][0][0]=xxxx, [0][0][0][1]=xxxy, [0][0][0][2]=xxxz
  [0][0][1][0]=xxyx, [0][0][1][1]=xxyy, [0][0][1][2]=xxyz
  [0][0][2][0]=xxzx, [0][0][2][1]=xxzy, [0][0][2][2]=xxzz
  [0][1][0][0]=xyxx, [0][1][0][1]=xyxy, [0][1][0][2]=xyxz
  [0][1][1][0]=xyyx, [0][1][1][1]=xyyy, [0][1][1][2]=xyyz
  [0][1][2][0]=xyzx, [0][1][2][1]=xyzy, [0][1][2][2]=xyzz
  [0][2][0][0]=xzxx, [0][2][0][1]=xzxy, [0][2][0][2]=xzxz
  [0][2][1][0]=xzyx, [0][2][1][1]=xzyy, [0][2][1][2]=xzyz
  [0][2][2][0]=xzzx, [0][2][2][1]=xzzy, [0][2][2][2]=xzzz

  [1][0][0][0]=yxxx, [1][0][0][1]=yxxy, [1][0][0][2]=yxxz
  [1][0][1][0]=yxyx, [1][0][1][1]=yxyy, [1][0][1][2]=yxyz
  [1][0][2][0]=yxzx, [1][0][2][1]=yxzy, [1][0][2][2]=yxzz
  [1][1][0][0]=yyxx, [1][1][0][1]=yyxy, [1][1][0][2]=yyxz
  [1][1][1][0]=yyyx, [1][1][1][1]=yyyy, [1][1][1][2]=yyyz
  [1][1][2][0]=yyzx, [1][1][2][1]=yyzy, [1][1][2][2]=yyzz
  [1][2][0][0]=yzxx, [1][2][0][1]=yzxy, [1][2][0][2]=yzxz
  [1][2][1][0]=yzyx, [1][2][1][1]=yzyy, [1][2][1][2]=yzyz
  [1][2][2][0]=yzzx, [1][2][2][1]=yzzy, [1][2][2][2]=yzzz

  [2][0][0][0]=zxxx, [2][0][0][1]=zxxy, [2][0][0][2]=zxxz
  [2][0][1][0]=zxyx, [2][0][1][1]=zxyy, [2][0][1][2]=zxyz
  [2][0][2][0]=zxzx, [2][0][2][1]=zxzy, [2][0][2][2]=zxzz
  [2][1][0][0]=zyxx, [2][1][0][1]=zyxy, [2][1][0][2]=zyxz
  [2][1][1][0]=zyyx, [2][1][1][1]=zyyy, [2][1][1][2]=zyyz
  [2][1][2][0]=zyzx, [2][1][2][1]=zyzy, [2][1][2][2]=zyzz
  [2][2][0][0]=zzxx, [2][2][0][1]=zzxy, [2][2][0][2]=zzxz
  [2][2][1][0]=zzyx, [2][2][1][1]=zzyy, [2][2][1][2]=zzyz
  [2][2][2][0]=zzzx, [2][2][2][1]=zzzy, [2][2][2][2]=zzzz
*/

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

double whST4_D[6][6];

  2次元配列 whST4_D の配列添字 0, 1, 2, 3, 4, 5 は、
  それぞれ xx, yy, zz, xy, yz, zx 成分を表す。
  [0][0]=xx xx, [0][1]=xx yy, [0][2]=xx zz,
     [0][3]=xx xy, [0][4]=xx yz, [0][5]=xx zx

  [1][0]=yy xx, [1][1]=yy yy, [1][2]=yy zz,
     [1][3]=yy xy, [1][4]=yy yz, [1][5]=yy zx

  [2][0]=zz xx, [2][1]=zz yy, [2][2]=zz zz,
     [2][3]=zz xy, [2][4]=zz yz, [2][5]=zz zx

  [3][0]=xy xx, [3][1]=xy yy, [3][2]=xy zz,
     [3][3]=xy xy, [3][4]=xy yz, [3][5]=xy zx

  [4][0]=yz xx, [4][1]=yz yy, [4][2]=yz zz,
     [4][3]=yz xy, [4][4]=yz yz, [4][5]=yz zx

  [5][0]=zx xx, [5][1]=zx yy, [5][2]=zx zz,
     [5][3]=zx xy, [5][4]=zx yz, [5][5]=zx zx
*/

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

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

  for (ij = 0; ij < 6; ij++) {
    for (kl = 0; kl < 6; kl++) {
      OUT__whST4_Y[ij][kl] 
        = whT4_X[WH_Tensor3D__I[ij]][WH_Tensor3D__J[ij]]
                [WH_Tensor3D__I[kl]][WH_Tensor3D__J[kl]];
    }
  }
}

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

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



Hiroshi KAWAI 平成15年4月19日