変位を求める 関数は、2次元と3次元について、それぞれ以下のようになる。
/* 変位:2次元 */
void WH_SolidFemLinear2D__whV_u
(int nNodes, int nDofs,
double U_arrayInId[/* nNodes * nDofs */],
double whV_N_arrayInId[/* nNodes * nDofs */][2],
double OUT__whV_u[2])
/*
入力引数:
nNodes は要素節点数
nDofs は節点自由度数
U_arrayInId はスカラーの配列(節点、自由度)で、
一般化変位
whV_N_arrayInId はベクトルの配列(節点、自由度)で、
補間関数ベクトル
出力引数:
OUT__whV_u はベクトルで、変位
*/
{
int In, Id;
WH_Tensor2D__assign_whV_OUT_whV
(WH_Tensor2D__whV_O,
OUT__whV_u);
for (In = 0; In < nNodes; In++) {
for (Id = 0; Id < nDofs; Id++) {
double whV_tmp[2];
WH_Tensor2D__whV_mul_s_OUT_whV
(whV_N_arrayInId[In * nDofs + Id],
U_arrayInId[In * nDofs + Id],
whV_tmp);
WH_Tensor2D__whV_add_whV_OUT_whV
(OUT__whV_u, whV_tmp,
OUT__whV_u);
}
}
}
/* 変位:3次元 */
void WH_SolidFemLinear3D__whV_u
(int nNodes, int nDofs,
double U_arrayInId[/* nNodes * nDofs */],
double whV_N_arrayInId[/* nNodes * nDofs */][3],
double OUT__whV_u[3])
/*
入力引数:
nNodes は要素節点数
nDofs は節点自由度数
U_arrayInId はスカラーの配列(節点、自由度)で、
一般化変位
whV_N_arrayInId はベクトルの配列(節点、自由度)で、
補間関数ベクトル
出力引数:
OUT__whV_u はベクトルで、変位
*/
{
int In, Id;
WH_Tensor3D__assign_whV_OUT_whV
(WH_Tensor3D__whV_O,
OUT__whV_u);
for (In = 0; In < nNodes; In++) {
for (Id = 0; Id < nDofs; Id++) {
double whV_tmp[3];
WH_Tensor3D__whV_mul_s_OUT_whV
(whV_N_arrayInId[In * nDofs + Id],
U_arrayInId[In * nDofs + Id],
whV_tmp);
WH_Tensor3D__whV_add_whV_OUT_whV
(OUT__whV_u, whV_tmp,
OUT__whV_u);
}
}
}
変位勾配テンソルを求める 関数は、2次元と3次元について、それぞれ以下のようになる。
/* 変位勾配テンソル:2次元 */
void WH_SolidFemLinear2D__whT_Z
(int nNodes, int nDofs,
double U_arrayInId[/* nNodes * nDofs */],
double whT_N_X_arrayInId[/* nNodes * nDofs */][2][2],
double OUT__whT_Z[2][2])
/*
入力引数:
nNodes は要素節点数
nDofs は節点自由度数
U_arrayInId はスカラーの配列(節点、自由度)で、
一般化変位
whT_N_X_arrayInId はテンソルの配列(節点、自由度)で、
補間関数勾配テンソル
出力引数:
OUT__whT_Z はテンソルで、変位勾配テンソル
*/
{
int In, Id;
WH_Tensor2D__assign_whT_OUT_whT
(WH_Tensor2D__whT_O,
OUT__whT_Z);
for (In = 0; In < nNodes; In++) {
for (Id = 0; Id < nDofs; Id++) {
double whT_tmp[2][2];
WH_Tensor2D__whT_mul_s_OUT_whT
(whT_N_X_arrayInId[In * nDofs + Id],
U_arrayInId[In * nDofs + Id],
whT_tmp);
WH_Tensor2D__whT_add_whT_OUT_whT
(OUT__whT_Z, whT_tmp,
OUT__whT_Z);
}
}
}
/* 変位勾配テンソル:3次元 */
void WH_SolidFemLinear3D__whT_Z
(int nNodes, int nDofs,
double U_arrayInId[/* nNodes * nDofs */],
double whT_N_X_arrayInId[/* nNodes * nDofs */][3][3],
double OUT__whT_Z[3][3])
/*
入力引数:
nNodes は要素節点数
nDofs は節点自由度数
U_arrayInId はスカラーの配列(節点、自由度)で、
一般化変位
whT_N_X_arrayInId はテンソルの配列(節点、自由度)で、
補間関数勾配テンソル
出力引数:
OUT__whT_Z はテンソルで、変位勾配テンソル
*/
{
int In, Id;
WH_Tensor3D__assign_whT_OUT_whT
(WH_Tensor3D__whT_O,
OUT__whT_Z);
for (In = 0; In < nNodes; In++) {
for (Id = 0; Id < nDofs; Id++) {
double whT_tmp[3][3];
WH_Tensor3D__whT_mul_s_OUT_whT
(whT_N_X_arrayInId[In * nDofs + Id],
U_arrayInId[In * nDofs + Id],
whT_tmp);
WH_Tensor3D__whT_add_whT_OUT_whT
(OUT__whT_Z, whT_tmp,
OUT__whT_Z);
}
}
}