位置(全体座標)は、配列変数として実装される。
/* 位置変数 whV_x はベクトルで、 例えば以下のように定義される。 double whV_x[2]; whV_x[0] は x, whV_x[1] は yを表す。 */
面積座標から位置(全体座標)を求める 関数は以下のようになる。
/* 面積座標に対応する位置 */ void WH_Fem__Simplex2D__whV_x (double whV_x0[2], double whV_x1[2], double whV_x2[2], double L0, double L1, double L2, double OUT__whV_x[2]) /* 入力引数: whV_x0, whV_x1, whV_x2 はベクトルで、各頂点の位置 L0, L1, L2 はスカラーで、面積座標 出力引数: OUT__whV_x はベクトルで、位置 */ { OUT__whV_x[0] = L0 * whV_x0[0] + L1 * whV_x1[0] + L2 * whV_x2[0]; OUT__whV_x[1] = L0 * whV_x0[1] + L1 * whV_x1[1] + L2 * whV_x2[1]; }
位置(全体座標)から面積座標を求める 関数は以下のようになる。
/* 係数 a */ void WH_Fem__Simplex2D__a (double whV_x0[2], double whV_x1[2], double whV_x2[2], double S, double *OUT__a0, double *OUT__a1, double *OUT__a2) /* 入力引数: whV_x0, whV_x1, whV_x2 はベクトルで、各頂点の位置 S はスカラーで、三角形の面積 出力引数: OUT__a0, OUT__a1, OUT__a2 はスカラーで、係数 */ { double x0 = whV_x0[0]; double x1 = whV_x1[0]; double x2 = whV_x2[0]; double y0 = whV_x0[1]; double y1 = whV_x1[1]; double y2 = whV_x2[1]; double factor = 1.0 / (2.0 * S); *OUT__a0 = factor * (x1 * y2 - x2 * y1); *OUT__a1 = factor * (x2 * y0 - x0 * y2); *OUT__a2 = factor * (x0 * y1 - x1 * y0); } /* 係数 b, c */ void WH_Fem__Simplex2D__bc (double whV_x0[2], double whV_x1[2], double whV_x2[2], double S, double *OUT__b0, double *OUT__b1, double *OUT__b2, double *OUT__c0, double *OUT__c1, double *OUT__c2) /* 入力引数: whV_x0, whV_x1, whV_x2 はベクトルで、各頂点の位置 S はスカラーで、三角形の面積 出力引数: OUT__b0, OUT__b1, OUT__b2 はスカラーで、係数 b OUT__c0, OUT__c1, OUT__c2 はスカラーで、係数 c */ { double x0 = whV_x0[0]; double x1 = whV_x1[0]; double x2 = whV_x2[0]; double y0 = whV_x0[1]; double y1 = whV_x1[1]; double y2 = whV_x2[1]; double factor = 1.0 / (2.0 * S); *OUT__b0 = factor * (y1 - y2); *OUT__b1 = factor * (y2 - y0); *OUT__b2 = factor * (y0 - y1); *OUT__c0 = factor * (x2 - x1); *OUT__c1 = factor * (x0 - x2); *OUT__c2 = factor * (x1 - x0); } /* 位置(全体座標)に対応する面積座標 */ void WH_Fem__Simplex2D__L012 (double whV_x0[2], double whV_x1[2], double whV_x2[2], double whV_x[2], double *OUT__L0, double *OUT__L1, double *OUT__L2) /* 入力引数: whV_x0, whV_x1, whV_x2 はベクトルで、各頂点の位置 whV_x はベクトルで、位置(全体座標) 出力引数: OUT__L0, OUT__L1, OUT__L2 はスカラーで、面積座標 */ { double x = whV_x[0]; double y = whV_x[1]; double S; double a0, a1, a2; double b0, b1, b2; double c0, c1, c2; WH_Fem__Simplex2D__S (whV_x0, whV_x1, whV_x2, &S); WH_Fem__Simplex2D__a (whV_x0, whV_x1, whV_x2, S, &a0, &a1, &a2); WH_Fem__Simplex2D__bc (whV_x0, whV_x1, whV_x2, S, &b0, &b1, &b2, &c0, &c1, &c2); *OUT__L0 = a0 + b0 * x + c0 * y; *OUT__L1 = a1 + b1 * x + c1 * y; *OUT__L2 = a2 + b2 * x + c2 * y; }
面積座標の勾配を求める 関数は以下のようになる。
/* 面積座標の勾配 */ void WH_Fem__Simplex2D__whP_L012_whV_x (double whV_x0[2], double whV_x1[2], double whV_x2[2], double OUT__whP_L0_whV_x[2], double OUT__whP_L1_whV_x[2], double OUT__whP_L2_whV_x[2]) /* 入力引数: whV_x0, whV_x1, whV_x2 はベクトルで、各頂点の位置 出力引数: OUT__whP_L0_whV_x, OUT__whP_L1_whV_x, OUT__whP_L2_whV_x はベクトルで、面積座標の勾配 */ { double S; double b0, b1, b2; double c0, c1, c2; WH_Fem__Simplex2D__S (whV_x0, whV_x1, whV_x2, &S); WH_Fem__Simplex2D__bc (whV_x0, whV_x1, whV_x2, S, &b0, &b1, &b2, &c0, &c1, &c2); OUT__whP_L0_whV_x[0] = b0; OUT__whP_L1_whV_x[0] = b1; OUT__whP_L2_whV_x[0] = b2; OUT__whP_L0_whV_x[1] = c0; OUT__whP_L1_whV_x[1] = c1; OUT__whP_L2_whV_x[1] = c2; }