変位を求める 関数は、2次元と3次元について、それぞれ以下のようになる。
/* 変位:2次元 */ void WH_SolidFemLinear2D__whV_u (int nNodes, int nDofs, double U_arrayInId[/* nNodes * nDofs */], double whV_N_arrayInId[/* nNodes * nDofs */][2], double OUT__whV_u[2]) /* 入力引数: nNodes は要素節点数 nDofs は節点自由度数 U_arrayInId はスカラーの配列(節点、自由度)で、 一般化変位 whV_N_arrayInId はベクトルの配列(節点、自由度)で、 補間関数ベクトル 出力引数: OUT__whV_u はベクトルで、変位 */ { int In, Id; WH_Tensor2D__assign_whV_OUT_whV (WH_Tensor2D__whV_O, OUT__whV_u); for (In = 0; In < nNodes; In++) { for (Id = 0; Id < nDofs; Id++) { double whV_tmp[2]; WH_Tensor2D__whV_mul_s_OUT_whV (whV_N_arrayInId[In * nDofs + Id], U_arrayInId[In * nDofs + Id], whV_tmp); WH_Tensor2D__whV_add_whV_OUT_whV (OUT__whV_u, whV_tmp, OUT__whV_u); } } } /* 変位:3次元 */ void WH_SolidFemLinear3D__whV_u (int nNodes, int nDofs, double U_arrayInId[/* nNodes * nDofs */], double whV_N_arrayInId[/* nNodes * nDofs */][3], double OUT__whV_u[3]) /* 入力引数: nNodes は要素節点数 nDofs は節点自由度数 U_arrayInId はスカラーの配列(節点、自由度)で、 一般化変位 whV_N_arrayInId はベクトルの配列(節点、自由度)で、 補間関数ベクトル 出力引数: OUT__whV_u はベクトルで、変位 */ { int In, Id; WH_Tensor3D__assign_whV_OUT_whV (WH_Tensor3D__whV_O, OUT__whV_u); for (In = 0; In < nNodes; In++) { for (Id = 0; Id < nDofs; Id++) { double whV_tmp[3]; WH_Tensor3D__whV_mul_s_OUT_whV (whV_N_arrayInId[In * nDofs + Id], U_arrayInId[In * nDofs + Id], whV_tmp); WH_Tensor3D__whV_add_whV_OUT_whV (OUT__whV_u, whV_tmp, OUT__whV_u); } } }
変位勾配テンソルを求める 関数は、2次元と3次元について、それぞれ以下のようになる。
/* 変位勾配テンソル:2次元 */ void WH_SolidFemLinear2D__whT_Z (int nNodes, int nDofs, double U_arrayInId[/* nNodes * nDofs */], double whT_N_X_arrayInId[/* nNodes * nDofs */][2][2], double OUT__whT_Z[2][2]) /* 入力引数: nNodes は要素節点数 nDofs は節点自由度数 U_arrayInId はスカラーの配列(節点、自由度)で、 一般化変位 whT_N_X_arrayInId はテンソルの配列(節点、自由度)で、 補間関数勾配テンソル 出力引数: OUT__whT_Z はテンソルで、変位勾配テンソル */ { int In, Id; WH_Tensor2D__assign_whT_OUT_whT (WH_Tensor2D__whT_O, OUT__whT_Z); for (In = 0; In < nNodes; In++) { for (Id = 0; Id < nDofs; Id++) { double whT_tmp[2][2]; WH_Tensor2D__whT_mul_s_OUT_whT (whT_N_X_arrayInId[In * nDofs + Id], U_arrayInId[In * nDofs + Id], whT_tmp); WH_Tensor2D__whT_add_whT_OUT_whT (OUT__whT_Z, whT_tmp, OUT__whT_Z); } } } /* 変位勾配テンソル:3次元 */ void WH_SolidFemLinear3D__whT_Z (int nNodes, int nDofs, double U_arrayInId[/* nNodes * nDofs */], double whT_N_X_arrayInId[/* nNodes * nDofs */][3][3], double OUT__whT_Z[3][3]) /* 入力引数: nNodes は要素節点数 nDofs は節点自由度数 U_arrayInId はスカラーの配列(節点、自由度)で、 一般化変位 whT_N_X_arrayInId はテンソルの配列(節点、自由度)で、 補間関数勾配テンソル 出力引数: OUT__whT_Z はテンソルで、変位勾配テンソル */ { int In, Id; WH_Tensor3D__assign_whT_OUT_whT (WH_Tensor3D__whT_O, OUT__whT_Z); for (In = 0; In < nNodes; In++) { for (Id = 0; Id < nDofs; Id++) { double whT_tmp[3][3]; WH_Tensor3D__whT_mul_s_OUT_whT (whT_N_X_arrayInId[In * nDofs + Id], U_arrayInId[In * nDofs + Id], whT_tmp); WH_Tensor3D__whT_add_whT_OUT_whT (OUT__whT_Z, whT_tmp, OUT__whT_Z); } } }