熱伝導行列の 節点 節点 における成分を計算する 関数は、2次元と3次元問題についてそれぞれ以下のようになる。
/* 熱伝導行列:2次元 */ void WH_ThermalFemLinear2D__K_cnd_InJn (double whV_N_X_In[2], double whV_N_X_Jn[2], double whT_lambda[2][2], double *OUT__K_cnd_InJn) /* 入力引数: whV_N_X_In, whV_N_X_Jn はベクトルで、 それぞれ節点 In, Jn の補間関数勾配ベクトル whT_lambda はテンソルで、熱伝導率テンソル 出力引数: OUT__K_cnd_InJn はスカラーで、 熱伝導行列の節点 In 節点 Jn 成分 */ { double whV_tmp[2]; WH_Tensor2D__whT_cdot_whV_OUT_whV (whT_lambda, whV_N_X_Jn, whV_tmp); WH_Tensor2D__whV_cdot_whV_OUT_s (whV_N_X_In, whV_tmp, OUT__K_cnd_InJn); } /* 熱伝導行列:3次元 */ void WH_ThermalFemLinear3D__K_cnd_InJn (double whV_N_X_In[3], double whV_N_X_Jn[3], double whT_lambda[3][3], double *OUT__K_cnd_InJn) /* 入力引数: whV_N_X_In, whV_N_X_Jn はベクトルで、 それぞれ節点 In, Jn の補間関数勾配ベクトル whT_lambda はテンソルで、熱伝導率テンソル 出力引数: OUT__K_cnd_InJn はスカラーで、 熱伝導行列の節点 In 節点 Jn 成分 */ { double whV_tmp[3]; WH_Tensor3D__whT_cdot_whV_OUT_whV (whT_lambda, whV_N_X_Jn, whV_tmp); WH_Tensor3D__whV_cdot_whV_OUT_s (whV_N_X_In, whV_tmp, OUT__K_cnd_InJn); }
さらに、 熱伝導行列全体を数値積分により求める 関数は、2次元と3次元問題についてそれぞれ以下のようになる。 なお、ここでは、 熱伝導率は要素内において一定であると仮定する。
#define NNODES 6 /* 熱伝導行列:2次元 */ void WH_ThermalFemLinear2D__K_cnd_arrayInJn (double whV_X_arrayIn[NNODES][2], double whT_lambda[2][2], double a, double OUT__K_cnd_arrayInJn[NNODES][NNODES]) /* 入力引数: whV_X_arrayIn はベクトルの節点配列で、位置(節点座標) whT_lambda はテンソルで、熱伝導率テンソル a はスカラーで、厚み 出力引数: OUT__K_cnd_arrayInJn はスカラーの配列(節点、節点)で、 熱伝導行列 */ { int nPoints; int Ip; int In, Jn; const int order = 2; for (In = 0; In < NNODES; In++) { for (Jn = 0; Jn < NNODES; Jn++) { OUT__K_cnd_arrayInJn[In][Jn] = 0; } } nPoints = WH_Gauss2D__Triangle__nIntegrationPoints (order); for (Ip = 0; Ip < nPoints; Ip++) { double whV_xi_Ip[2]; double w_Ip; double whP_N_whV_xi_arrayIn[NNODES][2]; double whPt_whV_X_whV_xi[2][2]; double J_S; double whV_N_X_arrayIn[NNODES][2]; WH_Gauss2D__Triangle__whV_xi_Ip (order, Ip, whV_xi_Ip); WH_Gauss2D__Triangle__w_Ip (order, Ip, &w_Ip); WH_Shape__Triangle6Nodes__whP_N_whV_xi_arrayIn (whV_xi_Ip, whP_N_whV_xi_arrayIn); WH_Element2D__Volume__whPt_whV_x_whV_xi (NNODES, whP_N_whV_xi_arrayIn, whV_X_arrayIn, whPt_whV_X_whV_xi); WH_Element2D__Volume__J_S (whPt_whV_X_whV_xi, a, &J_S); WH_Element2D__whP_N_whV_x_arrayIn (whPt_whV_X_whV_xi, NNODES, whP_N_whV_xi_arrayIn, whV_N_X_arrayIn); for (In = 0; In < NNODES; In++) { for (Jn = 0; Jn < NNODES; Jn++) { double K_cnd; WH_ThermalFemLinear2D__K_cnd_InJn (whV_N_X_arrayIn[In], whV_N_X_arrayIn[Jn], whT_lambda, &K_cnd); OUT__K_cnd_arrayInJn[In][Jn] += K_cnd * J_S * w_Ip; } } } }