2階のテンソルは、一般には2次元配列変数として実装される。 ただし、対称テンソルの場合には、1次元配列変数として実装できる。 このとき、以下に述べるようなインデックスの既約を用いる。
/*
(2階)テンソル変数 whT_X は、以下のように定義される。
double whT_X[3][3];
2次元配列 whT_X の配列添字 0, 1, 2 は、それぞれ x, y, z 成分を表す。
外側から内側へ順に、i、jとする
[0][0]=xx, [0][1]=xy, [0][2]=xz
[1][0]=yx, [1][1]=yy, [1][2]=yz
[2][0]=zx, [2][1]=zy, [2][2]=zz
*/
/*
対称の(2階)テンソル変数 whST_Y は、以下のように定義される。
double whST_Y[6];
配列 whST_Y の配列添字 0, 1, 2, 3, 4, 5 は、
それぞれ xx, yy, zz, xy, yz, zx 成分を表す。
[0]=xx, [1]=yy, [2]=zz
[3]=xy, [4]=yz, [5]=zx
*/
/* 対称テンソルの添字に関するマクロ */
#define WH_TENSOR3D__XX 0
#define WH_TENSOR3D__YY 1
#define WH_TENSOR3D__ZZ 2
#define WH_TENSOR3D__XY 3
#define WH_TENSOR3D__YZ 4
#define WH_TENSOR3D__ZX 5
#define WH_TENSOR3D__ST00 0
#define WH_TENSOR3D__ST11 1
#define WH_TENSOR3D__ST22 2
#define WH_TENSOR3D__ST01 3
#define WH_TENSOR3D__ST10 3
#define WH_TENSOR3D__ST12 4
#define WH_TENSOR3D__ST21 4
#define WH_TENSOR3D__ST20 5
#define WH_TENSOR3D__ST02 5
/* 対称テンソルの添字に関する定数 */
int WH_Tensor3D__IJ[3][3] = {
{ 0, 3, 5 }, { 3, 1, 4 }, { 5, 4, 2 }
/* 00 01 02 10 11 12 20 21 22 */
};
int WH_Tensor3D__I[6] = {
0, 1, 2, 0, 1, 2
/* 00 11 22 01 12 20 */
};
int WH_Tensor3D__J[6] = {
0, 1, 2, 1, 2, 0
/* 00 11 22 01 12 20 */
};
また、テンソルと対称テンソルとの変換を関数として以下のように実装する。
/* テンソルから対称テンソルへ変換する */
void WH_Tensor3D__convert_whT_OUT_whST
(double whT_X[3][3],
double OUT__whST_Y[6])
/*
入力引数:
whT_X はテンソルで、これは対称テンソルでなければならない
出力引数:
OUT__whST_Yは対称テンソル
*/
{
OUT__whST_Y[WH_TENSOR3D__ST00] = whT_X[0][0];
OUT__whST_Y[WH_TENSOR3D__ST11] = whT_X[1][1];
OUT__whST_Y[WH_TENSOR3D__ST22] = whT_X[2][2];
OUT__whST_Y[WH_TENSOR3D__ST01] = whT_X[0][1];
OUT__whST_Y[WH_TENSOR3D__ST12] = whT_X[1][2];
OUT__whST_Y[WH_TENSOR3D__ST20] = whT_X[2][0];
}
/* 対称テンソルからテンソルへ変換する */
void WH_Tensor3D__convert_whST_OUT_whT
(double whST_X[3],
double OUT__whT_Y[2][2])
/*
入力引数:
whST_X は対称テンソル
出力引数:
OUT__whT_Yはテンソル
*/
{
OUT__whT_Y[0][0] = whST_X[WH_TENSOR3D__ST00];
OUT__whT_Y[0][1] = whST_X[WH_TENSOR3D__ST01];
OUT__whT_Y[0][2] = whST_X[WH_TENSOR3D__ST02];
OUT__whT_Y[1][0] = whST_X[WH_TENSOR3D__ST10];
OUT__whT_Y[1][1] = whST_X[WH_TENSOR3D__ST11];
OUT__whT_Y[1][2] = whST_X[WH_TENSOR3D__ST12];
OUT__whT_Y[2][0] = whST_X[WH_TENSOR3D__ST20];
OUT__whT_Y[2][1] = whST_X[WH_TENSOR3D__ST21];
OUT__whT_Y[2][2] = whST_X[WH_TENSOR3D__ST22];
}