要素熱伝導行列を数値積分により求める 関数は、以下のようになる。
/* 要素熱伝導行列:三次元 */ void WH_ThermalFem3D__Linear__K_cnd_arrayInJn_AS_matrix (WH_Fem__Shape3DType shapeType, WH_Fem__Element3DType elementType, int nNodes, double whV_x_arrayIn[/* nNodes */][3], double whM_lambda[3][3], double OUT__K_cnd_arrayInJn[/* nNodes * nNodes */]) /* 入力引数: shapeType は要素形状のタイプ elementType は要素のタイプ nNodes は整数で、要素節点数 whV_x_arrayIn はベクトルの節点配列で、位置(節点座標) whM_lambda は行列で、熱伝導率の行列 出力引数: OUT__K_cnd_arrayInJn はスカラーの配列(節点、節点)で、 要素熱伝導行列 */ { int order; int nPoints; int Ip; int In, Jn; switch (elementType) { case WH_FEM__ELEMENT3D__TETRA4N: order = 1; break; case WH_FEM__ELEMENT3D__TETRA10N: case WH_FEM__ELEMENT3D__HEXA8N: order = 2; break; case WH_FEM__ELEMENT3D__HEXA20N: case WH_FEM__ELEMENT3D__HEXA27N: order = 3; break; default: assert(0); break; } for (In = 0; In < nNodes; In++) { for (Jn = 0; Jn < nNodes; Jn++) { OUT__K_cnd_arrayInJn[In * nNodes + Jn] = 0.0; } } WH_Fem__NumInt__Gauss3D__nPoints (shapeType, order, &nPoints); for (Ip = 0; Ip < nPoints; Ip++) { double whV_xi_Ip[3]; double w_Ip; double whP_N_whV_xi_arrayIn[WH_FEM__MAX_ELEMENT_NODES][3]; double whPt_whV_x_whV_xi[3][3]; double J_V; double whCv_N_x_arrayIn[WH_FEM__MAX_ELEMENT_NODES][3]; WH_Fem__NumInt__Gauss3D__whV_xi_Ip (shapeType, order, Ip, whV_xi_Ip); WH_Fem__NumInt__Gauss3D__w_Ip (shapeType, order, Ip, &w_Ip); WH_Fem__Shape3D__whP_N_whV_xi_arrayIn (elementType, nNodes, whV_xi_Ip, whP_N_whV_xi_arrayIn); WH_Fem__Isoparam3D__Volume__whPt_whV_x_whV_xi (nNodes, whP_N_whV_xi_arrayIn, whV_x_arrayIn, whPt_whV_x_whV_xi); WH_Fem__Isoparam3D__Volume__J_V (shapeType, whPt_whV_x_whV_xi, &J_V); WH_Fem__Isoparam3D__whP_N_whV_x_arrayIn (whPt_whV_x_whV_xi, nNodes, whP_N_whV_xi_arrayIn, whCv_N_x_arrayIn); /* column vector (3x1) ... 3-D vector */ for (In = 0; In < nNodes; In++) { for (Jn = 0; Jn < nNodes; Jn++) { double whCv_tmp[3]; double K_cnd; WH_Matrix__whM_mul_whCv_OUT_whCv (3, 3, whM_lambda, 3, whCv_N_x_arrayIn[Jn], 3, whCv_tmp); WH_Matrix__whTrans_whCv_mul_whCv_OUT_s (3, whCv_N_x_arrayIn[In], 3, whCv_tmp, &K_cnd); OUT__K_cnd_arrayInJn[In * nNodes + Jn] += K_cnd * J_V * w_Ip; } } } }