next up previous contents
: 歪み : 変位と変位勾配 : 変位と変位勾配   目次

実装

変位を求める 関数は、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);
    }
  }
}



Hiroshi KAWAI 平成15年4月19日