4階テンソルと2階テンソルの積を関数として以下のように実装する。
/* 4階テンソルと2階テンソルの積 */
void WH_Tensor2D__whT4_colon_whT_OUT_whT
(double whT4_C[2][2][2][2],
double whT_X[2][2],
double OUT__whT_Y[2][2])
/*
入力引数:
whT4_Cは4階テンソル
whT_X はテンソル
出力引数:
OUT__whT_Yはテンソルで、whT4_C と whT_X の積
*/
{
int i, j, k, l;
for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
double tmp = 0;
for (k = 0; k < 2; k++) {
for (l = 0; l < 2; l++) {
tmp += whT4_C[i][j][k][l] * whT_X[k][l];
}
}
OUT__whT_Y[i][j] = tmp;
}
}
}
/* 2階テンソルと4階テンソルの積 */
void WH_Tensor2D__whT_colon_whT4_OUT_whT
(double whT_X[2][2],
double whT4_C[2][2][2][2],
double OUT__whT_Y[2][2])
/*
入力引数:
whT_X はテンソル
whT4_Cは4階テンソル
出力引数:
OUT__whT_Yはテンソルで、whT_X と whT4_C の積
*/
{
int i, j, k, l;
for (k = 0; k < 2; k++) {
for (l = 0; l < 2; l++) {
double tmp = 0;
for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
tmp += whT_X[i][j] * whT4_C[i][j][k][l];
}
}
OUT__whT_Y[k][l] = tmp;
}
}
}