剛性行列の
節点
自由度
節点
自由度
における成分を計算する
関数は、2次元と3次元問題についてそれぞれ以下のようになる。
/* 剛性行列:2次元 */
void WH_SolidFemLinear2D__K_InIdJnJd
(double whT_N_epsilon_InId[2][2],
double whT_N_epsilon_JnId[2][2],
double whT4_C_e[2][2][2][2],
double *OUT__K_InIdJnJd)
/*
入力引数:
whT_N_epsilon_InId, whT_N_epsilon_JnJd はテンソルで、
それぞれ節点 In 自由度 Id 、および、
節点 Jn 自由度 Jd の歪みの補間関数勾配テンソル
whT4_C_e は4階テンソルで、弾性定数テンソル
出力引数:
OUT__K_InIdJnJd はスカラーで、
剛性行列の節点 In 自由度 Id 節点 Jn 自由度 Jd 成分
*/
{
double whT_tmp[2][2];
WH_Tensor2D__whT4_colon_whT_OUT_whT
(whT4_C_e, whT_N_epsilon_JnJd,
whT_tmp);
WH_Tensor2D__whT_colon_whT_OUT_s
(whT_tmp, whT_N_epsilon_InId,
OUT__K_InIdJnJd);
}
さらに、 剛性行列全体を数値積分により求める 関数は、2次元と3次元問題についてそれぞれ以下のようになる。 なお、ここでは、 弾性定数は要素内において一定であると仮定する。
#define NNODES 6
#define NDOFS 2
/* 剛性行列:2次元 */
void WH_SolidFemLinear2D__K_arrayInIdJnJd
(double whV_X_arrayIn[NNODES][2],
double whT4_C_e[2][2][2][2],
double a,
double OUT__K_arrayInIdJnJd[NNODES * NDOFS][NNODES * NDOFS])
/*
入力引数:
whV_X_arrayIn はベクトルの節点配列で、位置(節点座標)
whT4_C_e は4階テンソルで、弾性定数テンソル
a はスカラーで、厚み
出力引数:
OUT__K_arrayInIdJnJd はスカラーの
配列(節点、自由度、節点、自由度)で、剛性行列
*/
{
int nPoints;
int Ip;
int In, Jn;
int Id, Jd;
const int order = 2;
for (In = 0; In < NNODES; In++) {
for (Id = 0; Id < NDOFS; Id++) {
for (Jn = 0; Jn < NNODES; Jn++) {
for (Jd = 0; Jd < NDOFS; Jd++) {
OUT__K_arrayInIdJnJd[In][Id][Jn][Jd] = 0;
}
}
}
}
nPoints = WH_Gauss2D__Triangle__nIntegrationPoints (order);
for (Ip = 0; Ip < nPoints; Ip++) {
double whV_xi_Ip[2];
double w_Ip;
double whP_N_whV_xi_arrayIn[NNODES][2];
double whPt_whV_X_whV_xi[2][2];
double J_S;
double whV_N_arrayIn[NNODES][2];
double whT_N_X_arrayInId[NNODES][NDOFS][2][2];
double whT_N_epsilon_arrayInId[NNODES][NDOFS][2][2];
WH_Gauss2D__Triangle__whV_xi_Ip
(order, Ip,
whV_xi_Ip);
WH_Gauss2D__Triangle__w_Ip
(order, Ip,
&w_Ip);
WH_Shape__Triangle6Nodes__whP_N_whV_xi_arrayIn
(whV_xi_Ip,
whP_N_whV_xi_arrayIn);
WH_Element2D__Volume__whPt_whV_x_whV_xi
(NNODES, whP_N_whV_xi_arrayIn, whV_X_arrayIn,
whPt_whV_X_whV_xi);
WH_Element2D__Volume__J_S
(whPt_whV_X_whV_xi, a,
&J_S);
WH_Element2D__whP_N_whV_x_arrayIn
(whPt_whV_X_whV_xi, NNODES, whP_N_whV_xi_arrayIn,
whV_N_X_arrayIn);
WH_Element2D__whT_N_x_arrayInId
(NNODES, whP_N_whV_X_arrayIn,
whT_N_X_arrayInId);
WH_SolidFemLinear2D__whT_N_epsilon_arrayInId
(NNODES, whT_N_X_arrayInId,
whT_N_epsilon_arrayInId);
for (In = 0; In < NNODES; In++) {
for (Id = 0; Id < NDOFS; Id++) {
for (Jn = 0; Jn < NNODES; Jn++) {
for (Jd = 0; Jd < NDOFS; Jd++) {
double K;
WH_SolidFemLinear2D__K_InIdJnJd
(whT_N_epsilon_arrayIn[In][Id],
whT_N_epsilon_arrayIn[Jn][Jd],
whT4_C_e,
&K);
OUT__K_arrayInIdJnJd[In][Id][Jn][Jd]
+= K * J_S * w_Ip;
}
}
}
}
}
}