目次

5.9 バッチ処理

5.9.1 Windows環境

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

5.9.2 Linux環境

指定したディレクトリにあるすべての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