0. 構成

  1. 初期全体メッシュ
  2. 分散
  3. 領域分割用コード<$CUR/part>
  4. 壁法則適用点情報生成コード<$CUR/wall>
  5. 通信情報使用例<$CUR/part/para>
  6. テスト用メッシュジェネレータ<$CUR/mesh>

1. 領域分割用コード

1.1 入力ファイル

必須入力ファイル:
  1. GF形式の初期全体メッシュファイル<#GRIDFIL>
  2. GF形式の初期全体境界条件ファイル<#BCFIL>
  3. 制御情報ファイル「INPUT.DAT」
  4. 各オプションに応じた入力ファイル<#INPFIL>
Optional:

1.2 出力ファイル

  1. GF形式の局所分散メッシュファイル<#GRIDout(k)>(k=1,PETOT)
  2. GF形式の局所分散境界条件ファイル<#BCout(k)>(k=1,PETOT)
  3. 領域間通信情報ファイル(分散)<#COMMout(k)>(k=1,PETOT)
  4. METIS用入力ファイル<#METISinpFIL>(オプション選択時のみ)

1.3 概要

領域分割用コードの使用法としては,以下の3種類があります。
  1. Recursive Coordinate Bisection(RCB)法によって領域分割する(<#NTYP>=1)
  2. METISによって領域分割する(<#NTYP>=3)
  3. METIS入力情報を生成する(<#NTYP>=4)

ここで<#NTYP>「INPUT.DAT」の入力項目の一つで 選択オプションを示します。選択した<#NTYP>によって,制御情報が更に 異なるため,ファイル<#INPFIL>を使用して入力しています。
「INPUT.DAT」の例はここをクリックしてください。
変数の説明についてはここをクリックしてください。


以下に<#NTYP>に応じた<#INPFIL>の入力内容について説明します:

1.4 使用法

必要なファイルを用意して,<$CUR/part>ディレクトリでコマンドラインから

  <$CUR/part> part

と打ち込んでください。その他,注意事項は以下の通りです:

2. 壁法則適用点情報生成コード

2.1 入力ファイル

必須入力ファイル:
  1. GF形式の初期全体メッシュファイル<#GRIDFIL>
  2. GF形式の初期全体境界条件ファイル<#BCFIL>
  3. 制御情報ファイル「INPUT.DAT」

2.2 出力ファイル

  1. 壁法則適用点情報ファイル「$CUR/wall/wall.law」

2.3 概要

各節点に対応した壁境界節点を決定する計算は,問題規模が大きくなるほど膨大になります。 100万節点レベルだと,Intel Xeon 2.8GHz でも10分以上かかります。 この部分の計算だけでも前以て並列にやっておいてやろう・・・というのがこのコードの趣旨です。 完全に並列処理可能なプロセスですので,並列化効率はほぼ100%です。 制御情報ファイル「INPUT.DAT」の書式は「1.」と同じです。 「INPUT.DAT」の例は
ここ, 変数の説明についてはここをクリックしてください。

2.4 使用法

必要なファイルを用意して,<$CUR/part>ディレクトリでコマンドラインから

  <$CUR/part> mpirun -np <#PETOT> wall

と打ち込んでください。<#PETOT>は使用するプロセッサ数です。

3. 通信情報使用例

領域間通信をやるのに必要なファイルは以下のとおりです:
通信情報データの概要はここをクリックしてください。 通信テーブルは通常の領域境界情報交換のもののほか, 壁関数用の情報のものがあります。 実際の通信はこんな感じでやります:

領域境界通信情報交換の場合


      use hpcmw_cfdzhang_comm
      use solver_SR
      real(kind=8), dimension(:), allocatable :: V
      real(kind=8), dimension(:), allocatable :: WS, WR
      character(len=80) :: HEADER
......
      call call INPUT_HPCMW_CFDZHANG_COMM (HEADER)
......
      allocate (V(hpcmwNODTOTw))
      (calc. V(i))
......
      allocate (WS(hpcmwNODTOT), WR(hpcmwNODTOT))
      WS= 0.d0
      WR= 0.d0
      call SOLVER_SEND_RECV                                             &
     &          ( hpcmwNODTOT, hpcmwNEIBPETOT, hpcmwNEIBPE,             &
     &            hpcmwIMPORT_index, hpcmwIMPORT_item,                  &
     &            hpcmwEXPORT_index, hpcmwEXPORT_item,                  &
     &            WS, WR, V, MPI_COMM_WORLD, my_rank)
      deallocate (WS, WR)

壁関数の場合


      use hpcmw_cfdzhang_comm
      use solver_SRw
      real(kind=8), dimension(:), allocatable :: UTAU
      real(kind=8), dimension(:), allocatable :: WS, WR
      character(len=80) :: HEADER
......
      call call INPUT_HPCMW_CFDZHANG_COMM (HEADER)
......
      allocate (UTAU(hpcmwNODTOTw))
      (calc. UTAU(i))
......
      allocate (WS(hpcmwLENw), WR(hpcmwLENw))
      WS= 0.d0
      WR= 0.d0
      call SOLVER_SEND_RECVw                                            &
     &          ( hpcmwNODTOTw, hpcmwNEIBPETOTw, hpcmwNEIBPEw,          &
     &            hpcmwIMPORTw_index, hpcmwIMPORTw_item,                &
     &            hpcmwEXPORTw_index, hpcmwEXPORTw_item,                &
     &            hpcmwLENw, WS, WR, UTAU, MPI_COMM_WORLD, my_rank )
      deallocate (WS, WR)

4. テスト用メッシュジェネレータ

<$CUR/mesh>において:

  <$CUR/mg> mg

とタイプすると:

NX,NY,NZ
と訊いてきます。X,Y,Z方向の分割数を入力してください。NX×NY×NZ×6の四面体と (NX+1)×(NY+1)×(NZ+1)の節点が生成され,境界条件とともに: にGF形式で出力されます。境界条件は以下の通りです。

5. 反復法ソルバーとの併用について

反復法ソルバーと併用する場合,モジュール内における変数のバッティング等が生じるためいくつか問題があります。 以下のモジュールにおいて以下のように書き直したものを使用してください:

hpcmw_fem_mesh(ファイル)

「hpcmw_cfdzhang_comm」で使用されている変数を使用する場合には以下のようにしてください (ファイル)

      use hpcmw_zhangcfd_comm
      use hpcmw_fem_mesh
......
      NEIBPETOT= hpcmwNEIBPETOT

      NEIBPE           => hpcmwNEIBPE
      NOD_STACK_IMPORT => hpcmwIMPORT_index
      NOD_IMPORT       => hpcmwIMPORT_item
      NOD_STACK_EXPORT => hpcmwEXPORT_index
      NOD_EXPORT       => hpcmwEXPORT_item
......

hpcmw_cfdzhang_comm(ファイル)


      module hpcmw_cfdzhang_comm
        use hpcmw_util
        integer (kind=4) :: hpcmwNEIBPETOT, hpcmwNEIBPETOTw
        integer (kind=4) :: hpcmwINTNODTOT, hpcmwNODTOT, hpcmwNODTOTw
        integer (kind=4) :: hpcmwNODtotDIFF
        integer (kind=4) :: hpcmwELMtot
        integer (kind=4) :: hpcmwLEN, hpcmwLENw
        integer (kind=4), pointer :: hpcmwNEIBPE(:), hpcmwNEIBPEw(:)
        integer (kind=4), pointer ::                                    &
     &         hpcmwIMPORT_index(:), hpcmwIMPORT_item(:),               &
     &         hpcmwEXPORT_index(:), hpcmwEXPORT_item(:)
        integer (kind=4), pointer ::                                    &
     &         hpcmwIMPORTw_index(:), hpcmwIMPORTw_item(:),             &
     &         hpcmwEXPORTw_index(:), hpcmwEXPORTw_item(:)
        integer (kind=4), pointer ::                                    &
     &         hpcmwNOD_IDg(:), hpcmwELM_IDg(:)
        character(len=80) :: LINE
      end module hpcmw_cfdzhang_comm