next up previous contents
: 形状関数 : 位置 : 位置   目次

実装

位置(全体座標)は、配列変数として実装される。

/*
  位置変数 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;
}



Hiroshi KAWAI 平成15年8月11日