テンソルの加算分解を関数として以下のように実装する。
/* テンソルから対称成分を得る */ void WH_Tensor3D__whSym_whT_OUT_whT (double whT_X[3][3], double OUT__whT_Y[3][3]) /* 入力引数: whT_X はテンソル 出力引数: OUT__whT_Yはテンソルで、whT_X の対称成分 */ { OUT__whT_Y[0][0] = whT_X[0][0]; OUT__whT_Y[0][1] = (whT_X[0][1] + whT_X[1][0]) / 2; OUT__whT_Y[0][2] = (whT_X[2][0] + whT_X[0][2]) / 2; OUT__whT_Y[1][0] = OUT__whT_Y[0][1]; OUT__whT_Y[1][1] = whT_X[1][1]; OUT__whT_Y[1][2] = (whT_X[1][2] + whT_X[2][1]) / 2; OUT__whT_Y[2][0] = OUT__whT_Y[0][2]; OUT__whT_Y[2][1] = OUT__whT_Y[1][2]; OUT__whT_Y[2][2] = whT_X[2][2]; } /* テンソルから対称成分を、対称テンソルとして得る */ void WH_Tensor3D__whSym_whT_OUT_whST (double whT_X[3][3], double OUT__whST_Y[6]) /* 入力引数: whT_X はテンソル 出力引数: OUT__whST_Yは対称テンソルで、whT_X の対称成分 */ { OUT__whST_Y[0] = whT_X[0][0]; OUT__whST_Y[1] = whT_X[1][1]; OUT__whST_Y[2] = whT_X[2][2]; OUT__whST_Y[3] = (whT_X[0][1] + whT_X[1][0]) / 2; OUT__whST_Y[4] = (whT_X[1][2] + whT_X[2][1]) / 2; OUT__whST_Y[5] = (whT_X[2][0] + whT_X[0][2]) / 2; } /* テンソルから反対称成分を得る */ void WH_Tensor3D__whAsym_whT_OUT_whT (double whT_X[3][3], double OUT__whT_Y[3][3]) /* 入力引数: whT_X はテンソル 出力引数: OUT__whT_Yはテンソルで、whT_X の反対称成分 */ { OUT__whT_Y[0][0] = 0; OUT__whT_Y[0][1] = (whT_X[0][1] - whT_X[1][0]) / 2; OUT__whT_Y[0][2] = (whT_X[0][2] - whT_X[2][0]) / 2; OUT__whT_Y[1][0] = -OUT__whT_Y[0][1]; OUT__whT_Y[1][1] = 0; OUT__whT_Y[1][2] = (whT_X[1][2] - whT_X[2][1]) / 2; OUT__whT_Y[2][0] = -OUT__whT_Y[0][2]; OUT__whT_Y[2][1] = -OUT__whT_Y[1][2]; OUT__whT_Y[2][2] = 0; }