next up previous contents
: ベクトルのテンソル積 : テンソルの基本演算 : テンソルの基本演算   目次

実装

テンソルとテンソル、テンソルとスカラーの各種演算を 関数として以下のように実装する。

/* テンソルからテンソルへの代入 */
void WH_Tensor3D__assign_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];
  OUT__whT_Y[0][2] = whT_X[0][2];

  OUT__whT_Y[1][0] = whT_X[1][0];
  OUT__whT_Y[1][1] = whT_X[1][1];
  OUT__whT_Y[1][2] = whT_X[1][2];

  OUT__whT_Y[2][0] = whT_X[2][0];
  OUT__whT_Y[2][1] = whT_X[2][1];
  OUT__whT_Y[2][2] = whT_X[2][2];
}

/* テンソルとテンソルとの和 */
void WH_Tensor3D__whT_add_whT_OUT_whT
(double whT_X[3][3],
 double whT_Y[3][3],
 double OUT__whT_Z[3][3])
/*
  入力引数:
    whT_X,whT_Y はテンソル
  出力引数:
    OUT__whT_Z はテンソルで、whT_X + whT_Y
*/
{
  OUT__whT_Z[0][0] = whT_X[0][0] + whT_Y[0][0];
  OUT__whT_Z[0][1] = whT_X[0][1] + whT_Y[0][1];
  OUT__whT_Z[0][2] = whT_X[0][2] + whT_Y[0][2];

  OUT__whT_Z[1][0] = whT_X[1][0] + whT_Y[1][0];
  OUT__whT_Z[1][1] = whT_X[1][1] + whT_Y[1][1];
  OUT__whT_Z[1][2] = whT_X[1][2] + whT_Y[1][2];

  OUT__whT_Z[2][0] = whT_X[2][0] + whT_Y[2][0];
  OUT__whT_Z[2][1] = whT_X[2][1] + whT_Y[2][1];
  OUT__whT_Z[2][2] = whT_X[2][2] + whT_Y[2][2];
}

/* テンソルとテンソルとの差 */
void WH_Tensor3D__whT_sub_whT_OUT_whT
(double whT_X[3][3],
 double whT_Y[3][3],
 double OUT__whT_Z[3][3])
/*
  入力引数:
    whT_X,whT_Y はテンソル
  出力引数:
    OUT__whT_Z はテンソルで、whT_X - whT_Y
*/
{
  OUT__whT_Z[0][0] = whT_X[0][0] - whT_Y[0][0];
  OUT__whT_Z[0][1] = whT_X[0][1] - whT_Y[0][1];
  OUT__whT_Z[0][2] = whT_X[0][2] - whT_Y[0][2];

  OUT__whT_Z[1][0] = whT_X[1][0] - whT_Y[1][0];
  OUT__whT_Z[1][1] = whT_X[1][1] - whT_Y[1][1];
  OUT__whT_Z[1][2] = whT_X[1][2] - whT_Y[1][2];

  OUT__whT_Z[2][0] = whT_X[2][0] - whT_Y[2][0];
  OUT__whT_Z[2][1] = whT_X[2][1] - whT_Y[2][1];
  OUT__whT_Z[2][2] = whT_X[2][2] - whT_Y[2][2];
}

/* テンソルとスカラーとの積 */
void WH_Tensor3D__whT_mul_s_OUT_whT
(double whT_X[3][3],
 double a,
 double OUT__whT_Y[3][3])
/*
  入力引数:
    whT_X はテンソル
    a はスカラー
  出力引数:
    OUT__whT_Y はテンソルで、whT_X * a
*/
{
  OUT__whT_Y[0][0] = whT_X[0][0] * a;
  OUT__whT_Y[0][1] = whT_X[0][1] * a;
  OUT__whT_Y[0][2] = whT_X[0][2] * a;

  OUT__whT_Y[1][0] = whT_X[1][0] * a;
  OUT__whT_Y[1][1] = whT_X[1][1] * a;
  OUT__whT_Y[1][2] = whT_X[1][2] * a;

  OUT__whT_Y[2][0] = whT_X[2][0] * a;
  OUT__whT_Y[2][1] = whT_X[2][1] * a;
  OUT__whT_Y[2][2] = whT_X[2][2] * a;
}

/* スカラーとテンソルとの積 */
void WH_Tensor3D__s_mul_whT_OUT_whT
(double a,
 double whT_X[3][3],
 double OUT__whT_Y[3][3])
/*
  入力引数:
    a はスカラー
    whT_X はテンソル
  出力引数:
    OUT__whT_Y はテンソルで、a * whT_X
*/
{
  OUT__whT_Y[0][0] = a * whT_X[0][0];
  OUT__whT_Y[0][1] = a * whT_X[0][1];
  OUT__whT_Y[0][2] = a * whT_X[0][2];

  OUT__whT_Y[1][0] = a * whT_X[1][0];
  OUT__whT_Y[1][1] = a * whT_X[1][1];
  OUT__whT_Y[1][2] = a * whT_X[1][2];

  OUT__whT_Y[2][0] = a * whT_X[2][0];
  OUT__whT_Y[2][1] = a * whT_X[2][1];
  OUT__whT_Y[2][2] = a * whT_X[2][2];
}

/* テンソルをスカラーで割る */
void WH_Tensor3D__whT_div_s_OUT_whT
(double whT_X[3][3],
 double a,
 double OUT__whT_Y[3][3])
/*
  入力引数:
    whT_X はテンソル
    a はスカラーで、0であってはならない
  出力引数:
    OUT__whT_Y はテンソルで、whT_X / a
*/
{
  OUT__whT_Y[0][0] = whT_X[0][0] / a;
  OUT__whT_Y[0][1] = whT_X[0][1] / a;
  OUT__whT_Y[0][2] = whT_X[0][2] / a;

  OUT__whT_Y[1][0] = whT_X[1][0] / a;
  OUT__whT_Y[1][1] = whT_X[1][1] / a;
  OUT__whT_Y[1][2] = whT_X[1][2] / a;

  OUT__whT_Y[2][0] = whT_X[2][0] / a;
  OUT__whT_Y[2][1] = whT_X[2][1] / a;
  OUT__whT_Y[2][2] = whT_X[2][2] / a;
}

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

/* 対称テンソルから対称テンソルへの代入 */
void WH_Tensor3D__assign_whST_OUT_whST
(double whST_X[6],
 double OUT__whST_Y[6])
/*
  入力引数:
    whST_X は対称テンソル
  出力引数:
    OUT__whST_Y は対称テンソルで、whST_X と同じもの
*/
{
  OUT__whST_Y[0] = whST_X[0];
  OUT__whST_Y[1] = whST_X[1];
  OUT__whST_Y[2] = whST_X[2];
  OUT__whST_Y[3] = whST_X[3];
  OUT__whST_Y[4] = whST_X[4];
  OUT__whST_Y[5] = whST_X[5];
}

/* 対称テンソルと対称テンソルとの和 */
void WH_Tensor3D__whST_add_whST_OUT_whST
(double whST_X[6],
 double whST_Y[6],
 double OUT__whST_Z[6])
/*
  入力引数:
    whST_X,whST_Y は対称テンソル
  出力引数:
    OUT__whST_Z は対称テンソルで、whST_X + whST_Y
*/
{
  OUT__whST_Z[0] = whST_X[0] + whST_Y[0];
  OUT__whST_Z[1] = whST_X[1] + whST_Y[1];
  OUT__whST_Z[2] = whST_X[2] + whST_Y[2];
  OUT__whST_Z[3] = whST_X[3] + whST_Y[3];
  OUT__whST_Z[4] = whST_X[4] + whST_Y[4];
  OUT__whST_Z[5] = whST_X[5] + whST_Y[5];
}

/* 対称テンソルと対称テンソルとの差 */
void WH_Tensor3D__whST_sub_whST_OUT_whST
(double whST_X[6],
 double whST_Y[6],
 double OUT__whST_Z[6])
/*
  入力引数:
    whST_X,whST_Y は対称テンソル
  出力引数:
    OUT__whST_Z は対称テンソルで、whST_X - whST_Y
*/
{
  OUT__whST_Z[0] = whST_X[0] - whST_Y[0];
  OUT__whST_Z[1] = whST_X[1] - whST_Y[1];
  OUT__whST_Z[2] = whST_X[2] - whST_Y[2];
  OUT__whST_Z[3] = whST_X[3] - whST_Y[3];
  OUT__whST_Z[4] = whST_X[4] - whST_Y[4];
  OUT__whST_Z[5] = whST_X[5] - whST_Y[5];
}

/* 対称テンソルとスカラーとの積 */
void WH_Tensor3D__whST_mul_s_OUT_whST
(double whST_X[6],
 double a,
 double OUT__whST_Y[6])
/*
  入力引数:
    whST_X は対称テンソル
    a はスカラー
  出力引数:
    OUT__whST_Y は対称テンソルで、whST_X * a
*/
{
  OUT__whST_Y[0] = whST_X[0] * a;
  OUT__whST_Y[1] = whST_X[1] * a;
  OUT__whST_Y[2] = whST_X[2] * a;
  OUT__whST_Y[3] = whST_X[3] * a;
  OUT__whST_Y[4] = whST_X[4] * a;
  OUT__whST_Y[5] = whST_X[5] * a;
}

/* スカラーと対称テンソルとの積 */
void WH_Tensor3D__s_mul_whST_OUT_whST
(double a,
 double whST_X[6],
 double OUT__whST_Y[6])
/*
  入力引数:
    a はスカラー
    whST_X は対称テンソル
  出力引数:
    OUT__whST_Y は対称テンソルで、a * whST_X
*/
{
  OUT__whST_Y[0] = a * whST_X[0];
  OUT__whST_Y[1] = a * whST_X[1];
  OUT__whST_Y[2] = a * whST_X[2];
  OUT__whST_Y[3] = a * whST_X[3];
  OUT__whST_Y[4] = a * whST_X[4];
  OUT__whST_Y[5] = a * whST_X[5];
}

/* 対称テンソルをスカラーで割る */
void WH_Tensor3D__whST_div_s_OUT_whST
(double whST_X[6],
 double a,
 double OUT__whST_Y[6])
/*
  入力引数:
    whST_X は対称テンソル
    a はスカラーで、0であってはならない
  出力引数:
    OUT__whST_Y は対称テンソルで、whST_X / a
*/
{
  OUT__whST_Y[0] = whST_X[0] / a;
  OUT__whST_Y[1] = whST_X[1] / a;
  OUT__whST_Y[2] = whST_X[2] / a;
  OUT__whST_Y[3] = whST_X[3] / a;
  OUT__whST_Y[4] = whST_X[4] / a;
  OUT__whST_Y[5] = whST_X[5] / a;
}



Hiroshi KAWAI 平成15年8月11日