位置(全体座標)は、配列変数として実装される。
/* 位置変数 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;
}