指定したフォルダにあるすべてのofdファイルを計算するバッチファイルをリスト5-9-1とリスト5-9-2に示します。
例えばOpenFDTD\data\batch\にcase1.ofd~case3.ofdがあるとき、
コマンドプロンプトでOpenFDTD\で以下のように実行すると、
OpenFDTD\data\batch\にofd.logのコピーcase1.log~case3.logと、
ofd.outのコピーcase1.out~case3.outが出力されます。
$ run.bat (batファイルの場合)
$ cscript.exe /nologo run.vbs data\batch (vbsファイルの場合)
logファイルはエディタで内容を確認し、
outファイルはOpenFDTD\にofd.outという名前でコピーしてポスト処理を行います。
なお、計算コマンド行は必要に応じて修正してください。
リスト5-9-1では入力データファイル名が番号で並んでいることが必要ですが、
リスト5-9-2では指定したフォルダにある入力データファイルをすべて計算します。
リスト5-9-1 batファイル例 (run.bat)
@echo off rem OpenFDTDバッチ処理プログラム rem コマンドプロンプトを起動して以下を実行する rem $ run.bat rem 以下を適当に編集する set command=ofd.exe -n 4 set common=data\batch\case set start=1 set stop=3 for /L %%i in (%start% 1 %stop%) do ( rem 入力データ確認 echo %common%%%i.ofd time /T rem 計算実行 %command% %common%%%i.ofd >nul rem 後処理(必要に応じて編集する) copy ofd.log %common%%%i.log >nul copy ofd.out %common%%%i.out >nul )
リスト5-9-2 vbsファイル例 (run.vbs)
'OpenFDTDバッチ処理プログラム 'コマンドプロンプトを起動して以下を実行する '$ cscript.exe /nologo run.vbs データフォルダ Option Explicit '次の行を編集すること(計算コマンド) Const command = "ofd.exe -n 4" 'CPUのとき、数字はスレッド数 'Const command = "ofd_cuda.exe" 'GPUのとき Const ext = "ofd" '拡張子 Dim objShell, objFS, objFolder Dim fn, num, strout, strlog, datafolder 'フォルダ名を引数から取得する If WScript.Arguments.Count = 1 Then datafolder = WScript.Arguments(0) Else WScript.Echo "使い方: cscript.exe run.vbs データフォルダ" WScript.Quit 1 End If Set objShell = CreateObject("Wscript.Shell") Set objFS = CreateObject("Scripting.FileSystemObject") 'フォルダ If Not objFS.FolderExists(datafolder) Then WScript.Echo "フォルダ " & datafolder & " が存在しません" WScript.Quit 1 End If Set objFolder = objFS.GetFolder(datafolder) '計算コマンド確認 WScript.Echo "計算コマンド : " & command 'データファイルに関するループ num = 0 For Each fn In objFolder.Files '拡張子チェック If objFS.GetExtensionName(fn) = ext Then 'ファイル名表示 num = num + 1 WScript.Echo num & ". " & objFS.GetFileName(fn) & " " & Now() '計算実行 objShell.Run command & " " & fn, 0, True '0:ウィンドウなし、True:同期 'ofd.logコピー strlog = datafolder + "\" + objFS.GetBaseName(fn) + ".log" If objFS.FileExists(strlog) Then objFS.DeleteFile strlog End If objFS.CopyFile "ofd.log", strlog 'ofd.outコピー strout = datafolder + "\" + objFS.GetBaseName(fn) + ".out" If objFS.FileExists(strout) Then objFS.DeleteFile strout End If objFS.CopyFile "ofd.out", strout End If Next If num = 0 Then WScript.Echo "フォルダ " & datafolder & " に" & ext & "ファイルがありません" End If
リスト5-9-1のbatファイルでは入力データのファイル名が数字の並びになっていることが必要でしたが、
ofdファイルの数が少ないときはリスト5-9-3のようにコマンドを直接並べることも可能です。
リスト5-9-3 batファイル例(2)
@echo off rem case1 ofd.exe -n 4 data\batch\case1.ofd copy ofd.log data\batch\case1.log copy ofd.out data\batch\case1.out rem case2 ofd.exe -n 4 data\batch\case2.ofd copy ofd.log data\batch\case2.log copy ofd.out data\batch\case2.out rem case3 ofd.exe -n 4 data\batch\case3.ofd copy ofd.log data\batch\case3.log copy ofd.out data\batch\case3.out
指定したディレクトリにあるすべてのofdファイルを計算するスクリプトファイルをリスト5-9-4に示します。
例えばOpenFDTD/data/batch/にcase1.ofd~case3.ofdがあるとき、
コマンドラインでOpenFDTD/で以下のように実行すると、
OpenFDTD/data/batch/にofd.logのコピーcase1.log~case3.logと、
ofd.outのコピーcase1.out~case3.outが出力されます。
$ ./run.sh data/batch
logファイルはエディタで内容を確認し、
outファイルはOpenFDTD/にofd.outという名前でコピーしてポスト処理を行います。
なお、計算コマンド行は必要に応じて修正してください。
リスト5-9-4 shファイル例 (run.sh)
#/bin/sh n=1 for file in `ls $1/*.ofd`; do # monitor echo $n. $file `date` n=`expr $n + 1` # command ./ofd -n 8 $file > /dev/null # copy cp ofd.log `ls $file | sed -e "s/.ofd/.log/g"` cp ofd.out `ls $file | sed -e "s/.ofd/.out/g"` done