(2階の)テンソルは、一般には2次元配列変数として実装される。 ただし、対称テンソルの場合には、1次元配列変数として実装できる。 このとき、以下に述べるようなインデックスの既約を用いる。
/*
(2階)テンソル変数 whT_X は、以下のように定義される。
double whT_X[2][2];
2次元配列 whT_X の配列添字 0, 1 は、それぞれ x, y 成分を表す。
外側から内側へ順に、i、jとする
[0][0]=xx, [0][1]=xy
[1][0]=yx, [1][1]=yy
*/
/*
対称の(2階)テンソル変数 whST_Y は、以下のように定義される。
double whST_Y[3];
配列 whST_Y の配列添字 0, 1, 2 は、それぞれ xx, yy, xy 成分を表す。
[0]=xx, [1]=yy, [2]=xy
*/
/* 対称テンソルの添字に関するマクロ */
#define WH_TENSOR2D__XX 0
#define WH_TENSOR2D__YY 1
#define WH_TENSOR2D__XY 2
#define WH_TENSOR2D__ST00 0
#define WH_TENSOR2D__ST11 1
#define WH_TENSOR2D__ST01 2
#define WH_TENSOR2D__ST10 2
/* 対称テンソルの添字に関する定数 */
int WH_Tensor2D__IJ[2][2] = {
{ 0, 2 }, { 2, 1 }
/* 00 01 10 11 */
};
int WH_Tensor2D__I[3] = {
0, 1, 0
/* 00 11 01 */
};
int WH_Tensor2D__J[3] = {
0, 1, 1
/* 00 11 01 */
};
また、テンソルと対称テンソルとの変換を関数として以下のように実装する。
/* テンソルから対称テンソルへ変換する */
void WH_Tensor2D__convert_whT_OUT_whST
(double whT_X[2][2],
double OUT__whST_Y[3])
/*
入力引数:
whT_X はテンソルで、これは対称テンソルでなければならない
出力引数:
OUT__whST_Yは対称テンソル
*/
{
OUT__whST_Y[WH_TENSOR2D__ST00] = whT_X[0][0];
OUT__whST_Y[WH_TENSOR2D__ST11] = whT_X[1][1];
OUT__whST_Y[WH_TENSOR2D__ST01] = whT_X[0][1];
}
/* 対称テンソルからテンソルへ変換する */
void WH_Tensor2D__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_TENSOR2D__ST00];
OUT__whT_Y[0][1] = whST_X[WH_TENSOR2D__ST01];
OUT__whT_Y[1][0] = whST_X[WH_TENSOR2D__ST10];
OUT__whT_Y[1][1] = whST_X[WH_TENSOR2D__ST11];
}