4階のテンソルは、一般には4次元配列変数として実装される。
ただし、対称テンソルの場合には、2次元配列変数として実装できる。
この場合の対称とは、
について、
と
とが対称で、
かつ、
と
、
と
ともそれぞれ対称な場合を意味する。
ここでも、二次元対称テンソルで用いたインデックスの既約を用いる。
/*
(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]];
}
}
}
}
}