next up previous contents
: 三次元 : 積分 : 積分   目次

実装

/* 領域での積分点数 */
void WH_Fem__NumInt__Gauss2D__Quad__nPoints 
(int order,
 int *OUT__nPoints)
/*
  入力引数:
    order は整数で、ガウス積分の次数
  出力引数:
    OUT__nPoints は整数で、積分点数
*/
{
  int nLinePoints;

  WH_Fem__NumInt__Gauss1D__nPoints 
    (order,
     &nLinePoints);
  *OUT__nPoints = nLinePoints * nLinePoints;
}

/* 領域での積分点の自然座標 */
void WH_Fem__NumInt__Gauss2D__Quad__whV_xi_Ip
(int order, 
 int Ip,
 double OUT__whV_xi_Ip[2])
/*
  入力引数:
    order は整数で、ガウス積分の次数
    Ip は整数で、積分点ID
  出力引数:
    OUT__whV_xi_Ip はベクトルで、自然座標
*/
{
  int nLinePoints;
  int Ip_xi, Ip_eta;
  double xi, eta;

  WH_Fem__NumInt__Gauss1D__nPoints 
    (order,
     &nLinePoints);
  Ip_xi = Ip % nLinePoints;
  Ip_eta = Ip / nLinePoints;
  WH_Fem__NumInt__Gauss1D__xi_Ip
    (order, Ip_xi,
     &xi);
  WH_Fem__NumInt__Gauss1D__xi_Ip
    (order, Ip_eta,
     &eta);
  OUT__whV_xi_Ip[0] = xi;
  OUT__whV_xi_Ip[1] = eta;
}

/* 領域での積分点の重み係数 */
void WH_Fem__NumInt__Gauss2D__Quad__w_Ip
(int order, 
 int Ip,
 double *OUT__w_Ip)
/*
  入力引数:
    order は整数で、ガウス積分の次数
    Ip は整数で、積分点ID
  出力引数:
    OUT__w_Ip はスカラーで、重み係数
*/
{
  int nLinePoints;
  int Ip_xi, Ip_eta;
  double w_xi, w_eta;

  WH_Fem__NumInt__Gauss1D__nPoints 
    (order,
     &nLinePoints);
  Ip_xi = Ip % nLinePoints;
  Ip_eta = Ip / nLinePoints;
  WH_Fem__NumInt__Gauss1D__w_Ip
    (order, Ip_xi,
     &w_xi);
  WH_Fem__NumInt__Gauss1D__w_Ip
    (order, Ip_eta,
     &w_eta);
  *OUT__w_Ip = w_xi * w_eta;
}

/* 境界稜線上での積分点数 */
void WH_Fem__NumInt__Gauss2D__Quad__nPoints_Iedge
(int order,
 int Iedge,
 int *OUT__nPoints)
/*
  入力引数:
    order は整数で、ガウス積分の次数
    Iedge は整数で、要素辺ID
  出力引数:
    OUT__nPoints は整数で、積分点数
*/
{
  WH_Fem__NumInt__Gauss1D__nPoints 
    (order,
     OUT__nPoints);
}

/* 境界稜線上での積分点の自然座標 */
void WH_Fem__NumInt__Gauss2D__Quad__whV_xi_IedgeIp
(int order, 
 int Iedge,
 int Ip,
 double OUT__whV_xi_Ip[2])
/*
  入力引数:
    order は整数で、ガウス積分の次数
    Iedge は整数で、要素辺ID
    Ip は整数で、積分点ID
  出力引数:
    OUT__whV_xi_Ip はベクトルで、自然座標
*/
{
  double xi_line;

  WH_Fem__NumInt__Gauss1D__xi_Ip
    (order, Ip,
     &xi_line);
  switch (Iedge) {
  case 3:   /* -xi */
    OUT__whV_xi_Ip[0] = -1.0;
    OUT__whV_xi_Ip[1] = xi_line;
    break;
  case 1:   /* +xi */
    OUT__whV_xi_Ip[0] = 1.0;
    OUT__whV_xi_Ip[1] = xi_line;
    break;
  case 0:   /* -eta */
    OUT__whV_xi_Ip[0] = xi_line;
    OUT__whV_xi_Ip[1] = -1.0;
    break;
  case 2:   /* +eta */
    OUT__whV_xi_Ip[0] = xi_line;
    OUT__whV_xi_Ip[1] = 1.0;
    break;
  default:
    assert(0);
    break;
  }
}

/* 境界稜線上での積分点の重み係数 */
void WH_Fem__NumInt__Gauss2D__Quad__w_IedgeIp
(int order, 
 int Iedge,
 int Ip,
 double *OUT__w_Ip)
/*
  入力引数:
    order は整数で、ガウス積分の次数
    Iedge は整数で、要素辺ID
    Ip は整数で、積分点ID
  出力引数:
    OUT__w_Ip はスカラーで、重み係数
*/
{
  WH_Fem__NumInt__Gauss1D__w_Ip
    (order, Ip, 
     OUT__w_Ip);
}



Hiroshi KAWAI 平成15年8月11日