next up previous contents
: 解説 : テンソル・ベクトル積 : テンソル・ベクトル積   目次

実装

テンソル・ベクトル積およびベクトル・テンソル積を 関数として以下のように実装する。

/* テンソル・ベクトル積 */
void WH_Tensor3D__whT_cdot_whV_OUT_whV
(double whT_X[3][3],
 double whV_a[3], 
 double OUT__whV_b[3])
/*
  入力引数:
    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]
                + whT_X[0][2] * whV_a[2];
  OUT__whV_b[1] = whT_X[1][0] * whV_a[0] 
                + whT_X[1][1] * whV_a[1]
                + whT_X[1][2] * whV_a[2];
  OUT__whV_b[2] = whT_X[2][0] * whV_a[0] 
                + whT_X[2][1] * whV_a[1]
                + whT_X[2][2] * whV_a[2];
}

/* ベクトル・テンソル積 */
void WH_Tensor3D__whV_cdot_whT_OUT_whV
(double whV_a[3],
 double whT_X[3][3],
 double OUT__whV_b[3])
/*
  入力引数:
    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]
                + whV_a[2] * whT_X[2][0];
  OUT__whV_b[1] = whV_a[0] * whT_X[0][1] 
                + whV_a[1] * whT_X[1][1]
                + whV_a[2] * whT_X[2][1];
  OUT__whV_b[2] = whV_a[0] * whT_X[0][2] 
                + whV_a[1] * whT_X[1][2]
                + whV_a[2] * whT_X[2][2];
}

また、対称テンソルの場合には、 以下のようになる。

/* 対称テンソル・ベクトル積 */
void WH_Tensor3D__whST_cdot_whV_OUT_whV
(double whST_X[6],
 double whV_a[3], 
 double OUT__whV_b[3])
/*
  入力引数:
    whST_X は対称テンソル
    whV_a はベクトル
  出力引数:
    OUT__whV_bはベクトルで、whST_X と whV_a のテンソル・ベクトル積
*/
{
  OUT__whV_b[0] = whST_X[WH_TENSOR3D__ST00] * whV_a[0] 
                + whST_X[WH_TENSOR3D__ST01] * whV_a[1]
                + whST_X[WH_TENSOR3D__ST02] * whV_a[2];
  OUT__whV_b[1] = whST_X[WH_TENSOR3D__ST10] * whV_a[0] 
                + whST_X[WH_TENSOR3D__ST11] * whV_a[1]
                + whST_X[WH_TENSOR3D__ST12] * whV_a[2];
  OUT__whV_b[2] = whST_X[WH_TENSOR3D__ST20] * whV_a[0] 
                + whST_X[WH_TENSOR3D__ST21] * whV_a[1]
                + whST_X[WH_TENSOR3D__ST22] * whV_a[2];
}

/* ベクトル・対称テンソル積 */
void WH_Tensor3D__whV_cdot_whST_OUT_whV
(double whV_a[3],
 double whST_X[6],
 double OUT__whV_b[3])
/*
  入力引数:
    whV_a はベクトル
    whST_X は対称テンソル
  出力引数:
    OUT__whV_bはベクトルで、whV_a と whST_X のベクトル・テンソル積
*/
{
  OUT__whV_b[0] = whV_a[0] * whST_X[WH_TENSOR3D__ST00] 
                + whV_a[1] * whST_X[WH_TENSOR3D__ST10]
                + whV_a[2] * whST_X[WH_TENSOR3D__ST20];
  OUT__whV_b[1] = whV_a[0] * whST_X[WH_TENSOR3D__ST01] 
                + whV_a[1] * whST_X[WH_TENSOR3D__ST11]
                + whV_a[2] * whST_X[WH_TENSOR3D__ST21];
  OUT__whV_b[2] = whV_a[0] * whST_X[WH_TENSOR3D__ST02] 
                + whV_a[1] * whST_X[WH_TENSOR3D__ST12]
                + whV_a[2] * whST_X[WH_TENSOR3D__ST22];
}



Hiroshi KAWAI 平成15年8月11日