木曜日, 9月 22, 2011

スペック : specification

ここんとこ、趣味が高じてつくってたプログラムの仕様をメモしておく。
自分以外に使う人は皆無?なので、
60 億人くらいの人にとってはムダ情報。

A specification of the program coded by me was written down as following description. It might be a useless description for around 6 thousand million people,
because this description is a scribbled memo only for me.


--------------------------------
《概要》
用途:とあるフリーソルバ向けの 簡易形状データ作成プログラム
言語: fortran
プログラム名: CreateBlockMeshDict.f

入力: 実行ファイルのあるディレクトリに
CreateBlockMeshDict.ctl
という条件ファイルを用意

出力:上記の条件ファイル で指定したファイル
   出力ファイルは とあるフリーソルバの 入力条件ファイルに

上記ファイルと同時に
CreateBlockMeshDict.ctl とほぼ同じ書式の、
ModifyMeshDistrib.ctl というファイルも生成される。

特記事項: 一回実行するとフリーソルバ向けのデータがでてくるが、メッシュ形状が
気に入らなかったら、また、 *.ctl ファイルを修正して処理実行すればいいのだが、
 2回目以降の実行にあたってはModifyMeshDistrib.ctlの書式だと
より、細かい設定ができる。



《Outline》
usage: simple box-shape creation program for BlockMeshDict
language: fortran
program name: CreateBlockMeshDict.f

input:CreateBlockMeshDict.ctl  should be located in current directory


output:user-indicated out file described above ctl file
           this output file is described by the manner of blockMeshDict

ModifyMeshDistrib.ctl, nearly same format with CreateBlockMeshDict.ctl  is also outputted simultanously.

Remarks : Users can change or modify first time configuration,
with using ModifyMeshDistrib.ctl, that have more detailed parameters.



--------------------------------
 《条件ファイル  CreateBlockMeshDict.ctl のサンプル記述》
 《Sample control file description of, CreateBlockMeshDict.ctl》


 ############ CreateBlockMeshDict.ctl #########
  1             ctrol file format flag
./sample.dict
    0.10000E-04
  5.000
  10
  1.000
   0.000   0.000   0.000
 500.000 500.000 300.000
----------
 10
------------------------------
box
wall
      150.000      150.000       20.000       50.000       50.000       30.000
------------------------------
box
wall
      250.000      150.000       20.000       50.000       50.000       30.000
------------------------------
box
wall
      150.000      150.000       50.000      150.000       50.000       30.000
------------------------------
west
patch
        0.000        0.000        0.000        0.000      500.000      300.000
------------------------------
east
patch
      500.000        0.000        0.000        0.000      500.000      300.000
------------------------------
box2
dummy
      100.000      100.000        0.000      300.000      300.000      100.000
------------------------------
south
patch
        0.000        0.000        0.000      500.000        0.000      300.000
------------------------------
north
patch
        0.000      500.000        0.000      500.000        0.000      300.000
------------------------------
bottom
wall
        0.000        0.000        0.000      500.000      500.000        0.000
------------------------------
top
wall
        0.000        0.000      300.000      500.000      500.000        0.000

--------------------------------
 《条件ファイル  CreateBlockMeshDict.ctl の記述項目》


1行目:ヘッダ(読み飛ばし)
2行目:コントロールファイルフラグ (1 or 2 )

           * 1 は  CreateBlockMeshDict.ctl の書式スタイル
           * 2 は  ModifyMeshDistrib.ctl の書式スタイル
3行目:出力ファイル名(ファイルパス)
4行目:プログラム処理中に 0 (ゼロ値)として認識する閾値
5行目:aveDelta  (1 Region内の平均格子幅:現在未使用パラメータ)
6行目:1 Region内の格子分割数(x, y, z 方向、最初はすべて同じ値)
7行目:Grading Ratio :1ブロック内の格子拡大・縮小率 
(x, y, z 方向、最初はすべて同じ値)
8行目:解析領域の起点座標
9行目:解析領域を規定する座標値で、各方向最遠方座標
    * 8行目、9行目は eps ファイルとかで使われる boundary box の座標指定

      みたいなイメージ。
11 行目:設定する境界条件の個数
 

13 行目:境界条件の名前(自由)
14 行目:境界条件のタイプ名
           *対象ソルバで用意されている名前のみ、wall, patch, symmetryPlane, ....
15 行目:境界条件のオブジェクト形状を表す座標情報
         x0,  y0,  z0,   dx,   dy,  dz

       * (x0,  y0, z0) と  (x0+dx,  y0+dy, z0+dz) で直方体規定
       * PHOENICS とかと同じ考え

上記の、13 行目〜15 行目は 11 行目に書いてある境界条件数に応じて
繰り返し、同じような書式で 書き込んでいく。

--------------------------------

上記の条件にて fortran プログラムを実行し、
とあるフリーソルバの pre 処理 ユーチリティー にかけてやると、



 という形状ができあがる。
この凱旋門的な形状は 柱部となる2ブロックと
 梁部となる1ブロックからなり、上記の CreateBlockMeshDict.ctl
記述サンプルでは 'box' という 3 つの境界条件名に対応している。

境界条件名を同じ名前にしておけば、勝手に、1つの境界条件オブジェクト
としてマージしてくれる。

上記のCreateBlockMeshDict.ctlサンプルの中に 'box2' という境界条件名があり、
 境界条件タイプとして 'dummy' というキーワードが使われている。
これは、格子分布を定義する Region 領域を規定するための
 ダミー領域をもうける命令キーワードを意味する。

なので、今回対象にしているフリーソルバ側には
なにも影響を及ぼさない。

Region という言葉は PHOENICS で使われている用語と同義で、
メッシュの1分布を定規する最小領域名で、
解析領域内に 各 x, y, z 方向に 複数(あるいは単数)Region を有することになる。


上の図はわかりにくいが、内部に凱旋門形状を有しており、

1 Region に対して、上のサンプル *.ctl ファイル内で指定された '10'
という分割数が割り当てられる。

この図のように、今回はキリのいい位置、大きさ形状なので、
綺麗に当分割、直交格子となっている。

--------------------------------
 《条件ファイル  ModifyMeshDistrib.ctl のサンプル記述》

ModifyMeshDistrib.ctl は、上記の CreateBlockMeshDict.ctl の末尾に

以下の Region Information が付け加わる。


------------------------------
----  Region Information -----
------------------------------
  7  !  total region number of X-direc
   reg. num.|     Length |       nDim |   aveDelta |  initDelta |  termDelta |   GradingR |   solid flag
  -------------+  -------------+  -------------+  -------------+  -------------+  -------------+  -------------+  -------------+
    1  100.000    20    5.000    5.000    5.000    1.000  0
    2   50.000    10    5.000    5.000    5.000    1.000  0
    3   50.000    10    5.000    5.000    5.000    1.000  1
    4   50.000    10    5.000    5.000    5.000    1.000  1
    5   50.000    10    5.000    5.000    5.000    1.000  1
    6  100.000    20    5.000    5.000    5.000    1.000  0
    7  100.000    20    5.000    5.000    5.000    1.000  0
  5  !  total region number of Y-direc
   reg. num.|     Length |       nDim |   aveDelta |  initDelta |  termDelta |   GradingR |   solid flag
  -------------+  -------------+  -------------+  -------------+  -------------+  -------------+  -------------+  -------------+
    1  100.000    20    5.000    5.000    5.000    1.000  0
    2   50.000    10    5.000    5.000    5.000    1.000  0
    3   50.000    10    5.000    5.000    5.000    1.000  1
    4  200.000    40    5.000    5.000    5.000    1.000  0
    5  100.000    20    5.000    5.000    5.000    1.000  0
  5  !  total region number of Z-direc
   reg. num.|     Length |       nDim |   aveDelta |  initDelta |  termDelta |   GradingR |   solid flag
  -------------+  -------------+  -------------+  -------------+  -------------+  -------------+  -------------+  -------------+
    1   20.000     4    5.000    5.000    5.000    1.000  0
    2   30.000     6    5.000    5.000    5.000    1.000  1
    3   30.000     6    5.000    5.000    5.000    1.000  1
    4   20.000     4    5.000    5.000    5.000    1.000  0
    5  200.000    40    5.000    5.000    5.000    1.000  0



--------------------------------
 《条件ファイル  ModifyMeshDistrib.ctl の記述説明》

大きく3つの書き込み情報ブロックにわかれる

x- 方向の region 情報
y- 方向の region 情報

z- 方向の region 情報


各方向とも書式は同じで
・region の総数
・第1 region の使用パラメータリスト
・第2 region の使用パラメータリスト

・第3 region の使用パラメータリスト

・  .....
・  .....

・第n region の使用パラメータリスト



という書式になる。

カラム方向(ヨコ方向)の記述はヘッダ部分の記述でわかるように

   reg. num.     ..... 第 n th Region
     Length       ..... 対象 Region の長さ
       nDim       ..... 対象 Region のセル数
   aveDelta      ..... 対象 Region の平均セル幅
  initDelta        ..... 対象 Region の init 位置セル幅
  termDelta      .... 対象 Region の term 位置セル幅
   GradingR     .... 対象 Region のセル幅拡大率
   solid flag      .... 対象 Region 内に solid オブジェクトがあるか?無いか?
                            流体に対して障害物があるかないか?
                            なければ 0,  あれば 1

からなっている。

現時点 ( Fri. Sept. 22, 2011) では、上記の
nDim, GradingR  のみに対して、設定変更が反映される。


 ModifyMeshDistrib.ctlの書式読み込みにあたっては、

2行目の control file format flag を '2' にしておかなければならない。


--------------------------------

 上記の ModifyMeshDistrib.ctl を使って、
二回目の CreateBlockMeshDict.f を実行した例

Regionによっては、分割数が減っているのがわかる。

上記は完成形じゃないので、もうすこし、Region と Region
の間で、cell 幅を連続的なサイズにしなきゃいけない。
--------------------------------

上記の west 面、 south 面に流入条件
east 面、north 面に 流出条件を設定してちょっくら
 計算してみる。

セル数にして 576,688 ほど。
むかしは、この程度の計算、ヒーヒー言いながらやってたけど、
この文章を書いている、自宅の非力マシンでも、ちゃっちゃと計算してくれる。

SIMPLE solution converged in 66 iterations

というメッセージとともに計算終了。

0 件のコメント: