与えられた位置
から
対応する自然座標
を求める
関数は以下のようになる。
/* 位置から自然座標への変換 */
void WH_Fem__Isoparam2D__Volume__whV_xi
(WH_Fem__Element2DType elementType,
int nNodes,
double whV_x_arrayIn[/* nNodes */][2],
double whV_x_src[2],
double whV_xi_ini[2],
double epsilon,
double OUT__whV_xi_dest[2])
/*
入力引数:
elementType は要素のタイプ
nNodes は整数で、要素節点数
whV_x_arrayIn はベクトルの節点配列で、位置(節点座標)
whV_x_src はベクトルで、位置
whV_xi_ini はベクトルで、自然座標の初期値
epsilon はスカラーで、トレランス
出力引数:
OUT__whV_xi_dest はベクトルで、自然座標
*/
{
WH_Tensor2D__assign_whV_OUT_whV
(whV_xi_ini,
OUT__whV_xi_dest);
for (;;) {
double N_arrayIn[WH_FEM__MAX_ELEMENT_NODES];
double whV_f[2];
double whP_N_whV_xi_arrayIn[WH_FEM__MAX_ELEMENT_NODES][2];
double whT_J[2][2];
double whInc_whV_xi[2];
double whV_tmp0[2];
double whT_tmp1[2][2];
double whT_tmp2[2][2];
double whV_tmp3[2];
double tmp4;
WH_Fem__Shape2D__N_arrayIn
(elementType, nNodes, OUT__whV_xi_dest,
N_arrayIn);
WH_Fem__Isoparam2D__Volume__whV_x
(nNodes, N_arrayIn, whV_x_arrayIn,
whV_tmp0);
WH_Tensor2D__whV_sub_whV_OUT_whV
(whV_tmp0, whV_x_src,
whV_f);
WH_Fem__Shape2D__whP_N_whV_xi_arrayIn
(elementType, nNodes, OUT__whV_xi_dest,
whP_N_whV_xi_arrayIn);
WH_Fem__Isoparam2D__Volume__whPt_whV_x_whV_xi
(nNodes, whP_N_whV_xi_arrayIn, whV_x_arrayIn,
whT_J);
WH_Tensor2D__whTrans_whT_OUT_whT
(whT_J,
whT_tmp1);
WH_Tensor2D__whInv_whT_OUT_whT
(whT_tmp1,
whT_tmp2);
WH_Tensor2D__whT_cdot_whV_OUT_whV
(whT_tmp2, whV_f,
whV_tmp3);
WH_Tensor2D__s_mul_whV_OUT_whV
(-1.0, whV_tmp3,
whInc_whV_xi);
WH_Tensor2D__whV_add_whV_OUT_whV
(OUT__whV_xi_dest, whInc_whV_xi,
OUT__whV_xi_dest);
WH_Tensor2D__whLen_whV_OUT_s
(whInc_whV_xi,
&tmp4);
if (tmp4 < epsilon) break;
}
}