テンソルとテンソル、テンソルとスカラーの各種演算を 関数として以下のように実装する。
/* テンソルからテンソルへの代入 */ 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; }