テンソル・ベクトル積およびベクトル・テンソル積を 関数として以下のように実装する。
/* テンソル・ベクトル積 */
void WH_Tensor2D__whT_cdot_whV_OUT_whV
(double whT_X[2][2],
double whV_a[2],
double OUT__whV_b[2])
/*
入力引数:
whT_X はテンソル
whV_a はベクトル
出力引数:
OUT__whV_bはベクトルで、whT_X と whV_a のテンソル・ベクトル積
*/
{
OUT__whV_b[0] = whT_X[0][0] * whV_a[0]
+ whT_X[0][1] * whV_a[1];
OUT__whV_b[1] = whT_X[1][0] * whV_a[0]
+ whT_X[1][1] * whV_a[1];
}
/* ベクトル・テンソル積 */
void WH_Tensor2D__whV_cdot_whT_OUT_whV
(double whV_a[2],
double whT_X[2][2],
double OUT__whV_b[2])
/*
入力引数:
whV_a はベクトル
whT_X はテンソル
出力引数:
OUT__whV_bはベクトルで、whV_a と whT_X のベクトル・テンソル積
*/
{
OUT__whV_b[0] = whV_a[0] * whT_X[0][0]
+ whV_a[1] * whT_X[1][0];
OUT__whV_b[1] = whV_a[0] * whT_X[0][1]
+ whV_a[1] * whT_X[1][1];
}
また、対称テンソルの場合には、 以下のようになる。
/* 対称テンソル・ベクトル積 */
void WH_Tensor2D__whST_cdot_whV_OUT_whV
(double whST_X[3],
double whV_a[2],
double OUT__whV_b[2])
/*
入力引数:
whST_X は対称テンソル
whV_a はベクトル
出力引数:
OUT__whV_bはベクトルで、whST_X と whV_a のテンソル・ベクトル積
*/
{
OUT__whV_b[0] = whST_X[WH_TENSOR2D__ST00] * whV_a[0]
+ whST_X[WH_TENSOR2D__ST01] * whV_a[1];
OUT__whV_b[1] = whST_X[WH_TENSOR2D__ST10] * whV_a[0]
+ whST_X[WH_TENSOR2D__ST11] * whV_a[1];
}
/* ベクトル・対称テンソル積 */
void WH_Tensor2D__whV_cdot_whST_OUT_whV
(double whV_a[2],
double whST_X[3],
double OUT__whV_b[2])
/*
入力引数:
whV_a はベクトル
whST_X は対称テンソル
出力引数:
OUT__whV_bはベクトルで、whV_a と whST_X のベクトル・テンソル積
*/
{
OUT__whV_b[0] = whV_a[0] * whST_X[WH_TENSOR2D__ST00]
+ whV_a[1] * whST_X[WH_TENSOR2D__ST10];
OUT__whV_b[1] = whV_a[0] * whST_X[WH_TENSOR2D__ST01]
+ whV_a[1] * whST_X[WH_TENSOR2D__ST11];
}