要素
境界稜線
において、
法線方向成分がスカラー関数
であるベクトル量を数値積分する
関数のテンプレートは、以下のようになる。
/* 稜線上の法線方向成分指定の積分:二次元ボリューム */
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);
}
}