カルマン渦シミュレーションモデル (Karman)
本プログラムは, 2 次元流におけるカルマン渦をシミュレーションする数値モデルである (参考文献 : 中道, 2007).
本モデルの定式化などの詳細はマニュアル PDFを参照. 流線関数ー渦度法を用いて渦度の時間発展と流線関数を計算する.
ファイル構成は以下のようになっている.
solver.f90 -> ソルバプログラム. namelist.nml の finame で設定された初期データを元に, 渦度の時間発展を計算する.
プログラムの実行
依存プログラム
- 必須
STPK, NetCDF, gtool5
- 描画用のオプション
DCLAF90, DCL
NetCDF 形式で出力されるので, それを描画するツールがあれば, 何でも OK.
Mkinclude の編集
- 親ディレクトリに存在する Mkinclude を自身の環境に合わせて適宜編集して下さい.
非計算領域設定ファイルの編集
カルマン渦は流体内に柱などの流体が存在しない領域を設ける必要がある. 流体が存在しない未定義領域を設定するファイルが colum.txt である. このファイル名は namelist.nml で任意に指定できる. 以下にこのファイルの編集方法を記述する.
- 仮定
- x, y 方向の格子数を 20 x 10 とする.
- 柱は正方形 (この形は設定次第で任意の形を指定できる) で長さは格子点について 2 x 2 の大きさとする (柱の実際の大きさは "格子点数 x 格子点間隔").
- 柱の位置は格子点で数えて左から 4 点目, 下から 4 点目とする.
- 柱の境界条件はディリクレ型.
- 指定方法
- テキストファイルの 2 行目から書き始める. 1 行目はダミー用なので何らかの任意の文字列を設定しておくこと(文字は何でもよい).
- 1 行の文字数は x 方向の格子点数と同じ. 1 列の文字数は y 方向の格子点数と上記のダミー用 1 行分を足し合わせた分に同じである.
- 上の例の場合, 1 行の文字数は 20, 1 列の文字数は 11 である.
- 計算を行う領域は "0", 計算を行わない領域は "-" で指定する. この "-" の格子点が柱の存在する領域となる.
- 柱の境界は "0" ではない境界条件の種類を指定する数値が入る. (境界条件の種類と指定すべき数値は Alge_Solv の Poisson ソルバルーチンの内部境界条件設定と同じにしてある).
- "-" と "0" は隣接してはならない. 必ず, 境界条件指定の数値が入らなければならない.
- 注意すべきは, テキストで記述される y 方向の格子は上から順に読み込まれるので, y 座標の下端はテキストでいうと 2 行めに記述される.
- 実際の指定
上記の仮定を元に, colum.txt のサンプルを下に記述する.
|--- 10 ---||--- 20 ---| 000000000000000000000000 000000000000000000000000 001111000000000000000000 001--1000000000000000000 001--1000000000000000000 001111000000000000000000 000000000000000000000000 000000000000000000000000 000000000000000000000000 000000000000000000000000
- ここで, y 座標の格子点は上からカウントされるので, 柱の始まりが y 座標 4 格子点目はテキストでは 5 行目にきていることに注意.
プログラムのコンパイル
$ make
でメインソルバがコンパイルされ,
Karman
が生成される.
また, オプションとして, 描画用プログラム (DCL, DCLAF90 必須) をコンパイルする場合は,
$ make draw
で draw_anim プログラムが作成される.
プログラムの実行
namelist の編集
同梱ファイルに namelist.nml というファイルが入っている. これは, ソルバプログラムで用いられるネームリストファイルである.
nx = 400 ! X-coordinate grid number ny = 100 ! Y-coordinate grid number nt = 100000 ! calculating time step xmin = 0.0 ! X-coordinate original point ymin = 0.0 ! Y-coordinate original point dx = 0.1 ! X-coordinate grid interval [m] dy = 0.1 ! Y-coordinate grid interval [m] dt = 0.001 ! time interval [s] dmpstp = 1000 ! dumping time step ! dumping time interval is equal to "dmpstp * dt" finame = "" ! initial data file name. ! if there is no, automatically, ! being made by the program. foname = "result.nc" ! result data inner_file = 'colum.txt' ! inner boundary file time_flag = '1' ! time scheme : ! [1] = 4th order's Runge-Kutta ! [2] = Leap Frog ! [3] = 1th Explicit Euler undef = -999.0 ! undefined value init_type = 'psi' ! the tpe of initial value. ! 'psi' = strem line, 'omg' = vorticity. ubar = 1.0 ! mean flow [m/s] eps = 1.0e-4 ! convergent condition for poisson solver nu = 0.01 ! diffusion coefficient
もし, finame が設定されていない場合は, ソルバプログラムが自動的に colum.txt を読み込んで適切な初期値を用意する.
実際の実行
以下の順番で実行する.
$ export OMP_NUM_THREADS=[number] # ここは openMP 並列機能を用いる場合のみ. $ ./Karman < namelist.nml
以上で結果が foname に指定されたファイルに作成されている.
データの詳細は NetCDF のヘッダー情報参照.
描画オプション
オプションとして同梱されている描画プログラム draw_anim の実行についても記述しておく.
namelist の編集
draw.nml という名称のファイルは draw_anim 用のネームリストファイルである.
fig_type = 1 ! 固定値 nx = 400 ! x 方向の格子点数 ny = 100 ! x 方向の格子点数 nt = 101 ! ダンプされている時間ステップ数 dt = 1.0 ! ダンプされている時間間隔 [s] xmin = 0.0 ! 描画する x 方向の左端 xmax = 40.0 ! 描画する x 方向の右端 ymin = 0.0 ! 描画する y 方向の下端 ymax = 10.0 ! 描画する y 方向の上端 fname = 'result.nc' ! 出力ファイル名 txtname = '' ! テキストファイル [使用しない] cont_val = 'psi' ! 等値線で描く変数 shade_val = 'omega' ! カラーで描く変数 vx_val = '' ! x 方向の矢印ベクトル成分 vy_val = '' ! y 方向の矢印ベクトル成分 cmin = -5.0 ! 等値線の下限値 cmax = 5.0 ! 等値線の上限値 smin = -1.0 ! カラーの下限値 smax = 1.0 ! カラーの上限値 x_axis = 'x' ! x 軸の名前 y_axis = 'y' ! y 軸の名前 sfact = 1.0 ! カラーのスケールファクター cfact = 1.0 ! 等値線のスケールファクター vxfact = 1.0 ! x 方向の矢印のスケールファクター vyfact = 1.0 ! x 方向の矢印のスケールファクター undef = -999.0 ! 未定義値 vx = 0.2, 0.8 ! x 方向の viewport 左右端 vy = 0.4, 0.6 ! y 方向の viewport 上下端 clev = 10, 80 ! 等値線の本数とカラーのレベル数 cmap = 4 ! dcl のカラーマップナンバー
これらを設定し,
$ ./draw_anim < draw.nml
を実行すると, 例えば, 以下のようなグラフが描画される.
- 実行例
- コンターが流線関数, シェードが相対渦度.
- 上記のネームリストの設定で行った計算.