/* 領域での積分点数 */
void WH_Fem__NumInt__Gauss3D__Hexa__nPoints
(int order,
int *OUT__nPoints)
/*
入力引数:
order は整数で、ガウス積分の次数
出力引数:
OUT__nPoints は整数で、積分点数
*/
{
int nLinePoints;
WH_Fem__NumInt__Gauss1D__nPoints
(order,
&nLinePoints);
*OUT__nPoints = nLinePoints * nLinePoints * nLinePoints;
}
/* 領域での積分点の自然座標 */
void WH_Fem__NumInt__Gauss3D__Hexa__whV_xi_Ip
(int order,
int Ip,
double OUT__whV_xi_Ip[3])
/*
入力引数:
order は整数で、ガウス積分の次数
Ip は整数で、積分点ID
出力引数:
OUT__whV_xi_Ip はベクトルで、自然座標
*/
{
int nLinePoints;
int Ip_xi, Ip_eta, Ip_zeta;
double xi, eta, zeta;
WH_Fem__NumInt__Gauss1D__nPoints
(order,
&nLinePoints);
Ip_xi = (Ip % (nLinePoints * nLinePoints)) % nLinePoints;
Ip_eta = (Ip % (nLinePoints * nLinePoints)) / nLinePoints;
Ip_zeta = Ip / (nLinePoints * nLinePoints);
WH_Fem__NumInt__Gauss1D__xi_Ip
(order, Ip_xi,
&xi);
WH_Fem__NumInt__Gauss1D__xi_Ip
(order, Ip_eta,
&eta);
WH_Fem__NumInt__Gauss1D__xi_Ip
(order, Ip_zeta,
&zeta);
OUT__whV_xi_Ip[0] = xi;
OUT__whV_xi_Ip[1] = eta;
OUT__whV_xi_Ip[2] = zeta;
}
/* 領域での積分点の重み係数 */
void WH_Fem__NumInt__Gauss3D__Hexa__w_Ip
(int order,
int Ip,
double *OUT__w_Ip)
/*
入力引数:
order は整数で、ガウス積分の次数
Ip は整数で、積分点ID
出力引数:
OUT__w_Ip はスカラーで、重み係数
*/
{
int nLinePoints;
int Ip_xi, Ip_eta, Ip_zeta;
double w_xi, w_eta, w_zeta;
WH_Fem__NumInt__Gauss1D__nPoints
(order,
&nLinePoints);
Ip_xi = (Ip % (nLinePoints * nLinePoints)) % nLinePoints;
Ip_eta = (Ip % (nLinePoints * nLinePoints)) / nLinePoints;
Ip_zeta = Ip / (nLinePoints * nLinePoints);
WH_Fem__NumInt__Gauss1D__w_Ip
(order, Ip_xi,
&w_xi);
WH_Fem__NumInt__Gauss1D__w_Ip
(order, Ip_eta,
&w_eta);
WH_Fem__NumInt__Gauss1D__w_Ip
(order, Ip_zeta,
&w_zeta);
*OUT__w_Ip = w_xi * w_eta * w_zeta;
}
/* 境界表面上での積分点数 */
void WH_Fem__NumInt__Gauss3D__Hexa__nPoints_Iface
(int order,
int Iface,
int *OUT__nPoints)
/*
入力引数:
order は整数で、ガウス積分の次数
Iface は整数で、要素面ID
出力引数:
OUT__nPoints は整数で、積分点数
*/
{
WH_Fem__NumInt__Gauss2D__Quad__nPoints
(order,
OUT__nPoints);
}
/* 境界表面上での積分点の自然座標 */
void WH_Fem__NumInt__Gauss3D__Hexa__whV_xi_IfaceIp
(int order,
int Iface,
int Ip,
double OUT__whV_xi_Ip[3])
/*
入力引数:
order は整数で、ガウス積分の次数
Iface は整数で、要素面ID
Ip は整数で、積分点ID
出力引数:
OUT__whV_xi_Ip はベクトルで、自然座標
*/
{
double whV_xi_quad[2];
WH_Fem__NumInt__Gauss2D__Quad__whV_xi_Ip
(order, Ip,
whV_xi_quad);
switch (Iface) {
case 5: /* -xi */
OUT__whV_xi_Ip[0] = -1.0;
OUT__whV_xi_Ip[1] = whV_xi_quad[0];
OUT__whV_xi_Ip[2] = whV_xi_quad[1];
break;
case 3: /* +xi */
OUT__whV_xi_Ip[0] = 1.0;
OUT__whV_xi_Ip[1] = whV_xi_quad[0];
OUT__whV_xi_Ip[2] = whV_xi_quad[1];
break;
case 2: /* -eta */
OUT__whV_xi_Ip[0] = whV_xi_quad[1];
OUT__whV_xi_Ip[1] = -1.0;
OUT__whV_xi_Ip[2] = whV_xi_quad[0];
break;
case 4: /* +eta */
OUT__whV_xi_Ip[0] = whV_xi_quad[1];
OUT__whV_xi_Ip[1] = 1.0;
OUT__whV_xi_Ip[2] = whV_xi_quad[0];
break;
case 0: /* -zeta */
OUT__whV_xi_Ip[0] = whV_xi_quad[0];
OUT__whV_xi_Ip[1] = whV_xi_quad[1];
OUT__whV_xi_Ip[2] = -1.0;
break;
case 1: /* +zeta */
OUT__whV_xi_Ip[0] = whV_xi_quad[0];
OUT__whV_xi_Ip[1] = whV_xi_quad[1];
OUT__whV_xi_Ip[2] = 1.0;
break;
default:
assert(0);
break;
}
}
/* 境界表面上での積分点の重み係数 */
void WH_Fem__NumInt__Gauss3D__Hexa__w_IfaceIp
(int order,
int Iface,
int Ip,
double *OUT__w_Ip)
/*
入力引数:
order は整数で、ガウス積分の次数
Iface は整数で、要素面ID
Ip は整数で、積分点ID
出力引数:
OUT__w_Ip はスカラーで、重み係数
*/
{
WH_Fem__NumInt__Gauss2D__Quad__w_Ip
(order, Ip,
OUT__w_Ip);
}