与えられた位置 から 対応する自然座標 を求める 関数は以下のようになる。
/* 位置から自然座標への変換 */ 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; } }