要素 境界稜線
において、
法線方向成分がスカラー関数
であるベクトル量を数値積分する
関数のテンプレートは、以下のようになる。
/* 稜線上の法線方向成分指定の積分:二次元ボリューム */ void WH_Fem__Isoparam2D__Volume__int_l_Iedge_f_whV_n_whD_l__TEMPLATE (WH_Fem__Shape2DType shapeType, WH_Fem__Element2DType elementType, int nNodes, double whV_x_arrayIn[/* nNodes */][2], int Iedge, double a, double OUT__int_l_Iedge_f_whV_n_whD_l[2]) /* 入力引数: shapeType は要素形状のタイプ elementType は要素のタイプ nNodes は整数で、要素節点数 whV_x_arrayIn はベクトルの節点配列で、位置(節点座標) Iedge は整数で、要素辺ID a はスカラーで、厚み 出力引数: OUT__int_l_Iedge_f_whV_n_whD_l はベクトルで、 スカラー値を法線方向成分としたベクトルの積分値 */ { int order; int nPoints; int Ip; /***********************************************/ /* このテンプレートの利用者は、ここを書き直す */ /***********************************************/ /* 関数 f の多項式の次数を2とする。*/ order = 2; WH_Tensor2D__assign_whV_OUT_whV (WH_Tensor2D__whV_O, OUT__int_l_Iedge_f_whV_n_whD_l); /* 次数 order に対応する積分点数 nPoints を得る */ WH_Fem__NumInt__Gauss2D__nPoints_Iedge (shapeType, order, Iedge, &nPoints); for (Ip = 0; Ip < nPoints; Ip++) { double whV_xi_Ip[2]; double w_Ip; double whP_N_whV_xi_arrayIn[6][2]; double whPt_whV_x_whV_xi[2][2]; double whV_J_l[2]; double f; double whV_tmp[2]; /* 積分点 Ip の自然座標 whV_xi_Ip を得る */ WH_Fem__NumInt__Gauss2D__whV_xi_IedgeIp (shapeType, order, Iedge, Ip, whV_xi_Ip); /* 積分点 Ip の重み係数 w_Ip を得る */ WH_Fem__NumInt__Gauss2D__w_IedgeIp (shapeType, order, Iedge, Ip, &w_Ip); /* 変換子 whV_J_lを計算する */ WH_Fem__Shape2D__whP_N_whV_xi_arrayIn (shapeType, nNodes, whV_xi_Ip, whP_N_whV_xi_arrayIn); WH_Fem__Isoparam2D__Volume__whPt_whV_x_whV_xi (nNodes, whP_N_whV_xi_arrayIn, whV_x_arrayIn, whPt_whV_x_whV_xi); WH_Fem__Isoparam2D__Volume__whV_J_l_Iedge (shapeType, Iedge, whPt_whV_x_whV_xi, a, whV_J_l); /***********************************************/ /* このテンプレートの利用者は、ここを書き直す */ /***********************************************/ /* スカラー値 f を自然座標 whV_xi_Ip で評価する */ /* 例 f = 1.0 の場合 ( whV_xi_Ip は無視 ) */ f = 1.0; WH_Tensor2D__s_mul_whV_OUT_whV (f * w_Ip, whV_J_l, whV_tmp); WH_Tensor2D__whV_add_whV_OUT_whV (OUT__int_l_Iedge_f_whV_n_whD_l, whV_tmp, OUT__int_l_Iedge_f_whV_n_whD_l); } }