#define MAX_TRI_ORDER 5 #define MAX_TRI_POINTS 7 static int Tri__nPoints[MAX_TRI_ORDER] = { 1, 3, 4, 6, 7 }; #define TRI_A4 0.445948490915965 #define TRI_B4 (0.111690794839005 * 2) #define TRI_C4 0.091576213509771 #define TRI_D4 (0.054975871827661 * 2) #define TRI_A5 0.470142064105115 #define TRI_B5 (0.0661970763942530 * 2) #define TRI_C5 0.101286507323456 #define TRI_D5 (0.0629695902724135 * 2) static double Tri__L012_Ip [MAX_TRI_ORDER][MAX_TRI_POINTS][3] = { { { 1.0/3, 1.0/3, 1.0/3 } }, { { 0.0/2, 1.0/2, 1.0/2 }, { 1.0/2, 0.0/2, 1.0/2 }, { 1.0/2, 1.0/2, 0.0/2 } }, { { 1.0/3, 1.0/3, 1.0/3 }, { 11.0/15, 2.0/15, 2.0/15 }, { 2.0/15, 11.0/15, 2.0/15 }, { 2.0/15, 2.0/15, 11.0/15 } }, { { 1.0 - 2 * TRI_A4, TRI_A4, TRI_A4 }, { TRI_A4, 1.0 - 2 * TRI_A4, TRI_A4 }, { TRI_A4, TRI_A4, 1.0 - 2 * TRI_A4 }, { 1.0 - 2 * TRI_C4, TRI_C4, TRI_C4 }, { TRI_C4, 1.0 - 2 * TRI_C4, TRI_C4 }, { TRI_C4, TRI_C4, 1.0 - 2 * TRI_C4 } }, { { 1.0/3, 1.0/3, 1.0/3 }, { 1.0 - 2 * TRI_A5, TRI_A5, TRI_A5 }, { TRI_A5, 1.0 - 2 * TRI_A5, TRI_A5 }, { TRI_A5, TRI_A5, 1.0 - 2 * TRI_A5 }, { 1.0 - 2 * TRI_C5, TRI_C5, TRI_C5 }, { TRI_C5, 1.0 - 2 * TRI_C5, TRI_C5 }, { TRI_C5, TRI_C5, 1.0 - 2 * TRI_C5 } } }; static double Tri__w_Ip [MAX_TRI_ORDER][MAX_TRI_POINTS] = { { 1.0 }, { 1.0/3, 1.0/3, 1.0/3 }, { -27.0/48, 25.0/48, 25.0/48, 25.0/48 }, { TRI_B4, TRI_B4, TRI_B4, TRI_D4, TRI_D4, TRI_D4 }, { 9.0/40, TRI_B5, TRI_B5, TRI_B5, TRI_D5, TRI_D5, TRI_D5 } }; /* 領域での積分点数 */ void WH_Fem__NumInt__Gauss2D__Tri__nPoints (int order, int *OUT__nPoints) /* 入力引数: order は整数で、ガウス積分の次数 出力引数: OUT__nPoints は整数で、積分点数 */ { assert(0 < order); assert(order <= MAX_TRI_ORDER); *OUT__nPoints = Tri__nPoints[order - 1]; } /* 領域での積分点の自然座標 */ void WH_Fem__NumInt__Gauss2D__Tri__whV_xi_Ip (int order, int Ip, double OUT__whV_xi_Ip[2]) /* 入力引数: order は整数で、ガウス積分の次数 Ip は整数で、積分点ID 出力引数: OUT__whV_xi_Ip はベクトルで、自然座標 */ { double L0, L1, L2; assert(0 < order); assert(order <= MAX_TRI_ORDER); assert(0 <= Ip); assert(Ip < Tri__nPoints[order - 1]); L0 = Tri__L012_Ip[order - 1][Ip][0]; L1 = Tri__L012_Ip[order - 1][Ip][1]; L2 = Tri__L012_Ip[order - 1][Ip][2]; OUT__whV_xi_Ip[0] = L1; OUT__whV_xi_Ip[1] = L2; } /* 領域での積分点の重み係数 */ void WH_Fem__NumInt__Gauss2D__Tri__w_Ip (int order, int Ip, double *OUT__w_Ip) /* 入力引数: order は整数で、ガウス積分の次数 Ip は整数で、積分点ID 出力引数: OUT__w_Ip はスカラーで、重み係数 */ { assert(0 < order); assert(order <= MAX_TRI_ORDER); assert(0 <= Ip); assert(Ip < Tri__nPoints[order - 1]); *OUT__w_Ip = Tri__w_Ip[order - 1][Ip]; } /* 境界稜線上での積分点数 */ void WH_Fem__NumInt__Gauss2D__Tri__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__Tri__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; double L0_line, L1_line; double L0, L1, L2; WH_Fem__NumInt__Gauss1D__xi_Ip (order, Ip, &xi_line); L0_line = 1.0 - xi_line; L1_line = xi_line; switch (Iedge) { case 0: /* L0 */ L0 = 0.0; L1 = L0_line; L2 = L1_line; break; case 1: /* L1 */ L0 = L1_line; L1 = 0.0; L2 = L0_line; break; case 2: /* L2 */ L0 = L0_line; L1 = L1_line; L2 = 0.0; break; default: assert(0); break; } OUT__whV_xi_Ip[0] = L1; OUT__whV_xi_Ip[1] = L2; } /* 境界稜線上での積分点の重み係数 */ void WH_Fem__NumInt__Gauss2D__Tri__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); }