指定したフォルダにあるすべての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