#!/usr/bin/perl

# 変数が宣言されていない場合にエラーにする。
# 未宣言変数を許可するとデバッグが大変になるので、この設定を使う
use strict;

use lib 'c:\Programs\Perl\lib';
use lib 'd:\Programs\Perl\lib';

use Utils;

# perlスクリプト実行時のコマンドライン引数は、配列 @ARGV で取得できる。
# perlで 配列 @a の $i 番目成分を取得する場合は $a[$i] とすればいい
my $InFile  = $ARGV[0];
my $CSVFile = $ARGV[1];

# 引数が足りない場合、スクリプトの使用方法を表示して終了
if(!defined $CSVFile) {
	print "Usage: perl LAMMPS_MakeHistory.pl InFile CSVFile\n\n";
	exit;
}

# $InFile を読み込みモードで開く。失敗した場合は、die 以降の文字列を表示して終了
open(IN, $InFile) or die "Can not read [$InFile].\n";

my $TimeStep;
my $iRun = 1;
# $CSVFile を新規書き込みモードで開く。失敗した場合は、die 以降の文字列を表示して終了
open(OUT, ">$CSVFile") or die "Can not write to [$CSVFile].\n";

# 複数のMD計算の出力が分かれて出力されるので、while(1){} で無限ループを回して読み込む
while(1) {
# 一行ずつファイルを読み込み、先頭から非空白文字がTimestep :で始まる行を探す
# 一致した場合、:の後の数値を読み込む。
# perlの正規表現では、正規表現内の()にマッチした文字列は $1、$2、、という変数に代入される
	my $line;

# まず、Time step行をさがす
	while(1) {
		$line = <IN>;
# ファイル末尾に到達したらループを抜ける
		last if(eof(IN));

		if($line =~ /^\s*Time step\s*:\s*([0-9\.eEdD]+)/) {
			$TimeStep = $1;
			last;
		}
	}
# ファイル末尾に到達したらループを抜ける
	last if(eof(IN));

# データの先頭行を探す。以下の形式なので、正規表現で /^\s*Step\s+Time /i にマッチさせる
# Step Time Temp E_pair E_mol TotEng Press Volume Density 
	while(1) {
		$line = <IN>;
		last if(eof(IN));

		if($line =~ /^\s*Step\s+Time /i) {
			last;
		};
	}
# ファイル末尾に到達したらループを抜ける
	last if(eof(IN));

	print "\n";
	print "Run #$iRun\n";
	print "  Time step: $TimeStep\n";

# CSVファイルのヘッダー行を書き出す
	if($iRun == 1) {
#		print OUT "Run,Step,Time,Temp,E_pair,E_mol,TotEng,Press,Volume,Density\n";
		my @a = Utils::Split("\\s+", $line);
#		my @a = split(/\s+/, $line);
		print OUT "Run,", join(',', @a), "\n";
	}

# 一行ずつ読み込み、空白文字で区切って変数に入れる
	while(1) {
		my $line = <IN>;
		last if(eof(IN));
# Loop time of の行が見つかったら、このRunのデータは終了
		last if($line =~ /Loop time/i);

# 空白文字で区切って変数に入れる。
# このセパレータの使い方だと、行先頭に空白文字がある場合、null文字が最初に送られてくるので、変数$blankで受ける
#		my ($blank, $Step, $Time, $Temp, $E_pair, $E_mol, $TotEng, $Press, $Volume, $Density)
		my @a2 = Utils::Split("\\s+", $line);
#		my @a2 = split(/\s+/, $line);
# CSVファイルに書き出す
		print OUT "$iRun, ", join(', ', @a2), "\n";
#		print OUT "$iRun, $Step, $Time, $Temp, $E_pair, $E_mol, $TotEng, $Press, $Volume, $Density\n";
#		print "$iRun, $Step, $Time, $Temp, $E_pair, $E_mol, $TotEng, $Press, $Volume, $Density\n";
	}

	$iRun++;
}

close(IN);
close(OUT);

exit;

