###############################################################################
#    *Mathematicaの出力ファイルを元に,Phoenicsで利用できる形状ファイル生成   #
#                                                          by Masamori ENDO   #
###############################################################################
#Ver 1.00 02/12/26 二次元テスト専用

#-----------------------------------------------------------------------------
# 初期設定変数
$nml      = 0.5  ;   #スロート高さ         [mm]
$DuctH    = 2.0;     #計算領域の高さ       [mm]
$pi       = 3.14159265;
#-----------------------------------------------------------------------------
# ノズル形状ファイルを読み込む
#     $mach[][0] マッハ数
#     $mach[][1] x座標
#     $mach[][2] y座標
#     $li        データの個数
#     Troat高さを1に規格化されている.
open (INFILE, ";
  if ($cline eq "") {last;}
  split(',',$cline);
  for ($i = 0; $i < 3; $i++) {
    $mach[$li][$i] = @_[$i];
  }
  $li++;
}
close(INFILE);

#-----------------------------------------------------------------------------
# 現在の時刻を計算
#
($sec, $min, $hour, $day, $mon, $year, $wdy, $yday, $isdst) = localtime(time);
$year += 1900;
$mon++;


#-----------------------------------------------------------------------------
# ノズル生成:まずはヘッダを書き出す
# ファイル名は"nozzle.dat"
#
$max_x = $mach[li-1][1]*$nml;         # x, y座標の最大値を計算する
$max_y = $mach[li-1][2]*$nml;

open (OUFILE, ">nozzle.dat");
printf OUFILE "\* Supersonic nozzle contor generated by MakeNozzle.pl\n";
printf OUFILE "\* 2-D nozzle\n";
printf OUFILE "\* Date and time:",;
printf OUFILE "%04d/%02d/%02d ",   $year, $mon, $day;
printf OUFILE "%02d:%02d:%02d\n",  $hour, $min, $sec;
printf OUFILE "\* Designed Mach number               %g\n",$mach[$li-1][0];
printf OUFILE "\* Size of the nozzle x  [mm]         %g\n",$max_x;
printf OUFILE "\* Size of the nozzle y  [mm]         %g\n",$max_y;

#-----------------------------------------------------------------------------
# 出力ファイル生成:Points生成
#
printf OUFILE "\* Number of points:\n";
printf OUFILE "   %3d\n", 2*$li+4;

for ($x = 0; $x <=1.0; $x+=1.0) {
  pointoutput($x, 1.0,0.0);
  for ($i = 0; $i < $li; $i++) {
    pointoutput($x, $mach[$i][2]*$nml/$max_y,$mach[$i][1]*$nml/$max_x);
  }
  pointoutput($x, 1.0,1.0);
}

#-----------------------------------------------------------------------------
# 出力ファイル生成:Faces生成
#
printf OUFILE "\* Number of faces:\n";
printf OUFILE "   %3d\n", ($li-1)*3+5;

for ($i = 0; $i < $li; $i++) {
  printf OUFILE "   %-3d  %-3d  %-3d  %-3d   133\n",1,$i+2,$i+3,1;
}

$a = ($li+2);
for ($i = 0; $i < $li; $i++) {
  printf OUFILE "   %-3d  %-3d  %-3d  %-3d   133\n",1+$a,$i+3+$a,$i+2+$a,1+$a;
}

for ($i = 0; $i < $li-1; $i++) {
  printf OUFILE "   %-3d  %-3d  %-3d  %-3d   133\n",$i+3,$i+2,$i+$li+4,$i+$li+5;
}


printf OUFILE "   %-3d  %-3d  %-3d  %-3d   133\n",2,1,$li+3,$li+4;
printf OUFILE "   %-3d  %-3d  %-3d  %-3d   133\n",$li+2,$li+1,$li*2+3,$li*2+4;
printf OUFILE "   %-3d  %-3d  %-3d  %-3d   133\n",1,$li+2,$li*2+4,$li+3;

close (OUFILE);



#-----------------------------------------------------------------------------
# サブルーチン:pointoutput
#     pointoutput(x,y,z);
#              x x座標
#              y y座標
#              z z座標
# Phoenicsの形状ファイルに適合した形になおして出力.
# ファイルハンドラはOUFILEで決め打ちとする.
#
sub pointoutput {
  $tmp = sprintf "  %E  %E  %E\n", @_[0],@_[1],@_[2];
  printf OUFILE "%s",substr($tmp, 0,8);
  printf OUFILE "%s",substr($tmp,10,2);
  printf OUFILE "%s",substr($tmp,13,2);
  printf OUFILE "%s",substr($tmp,15,8);
  printf OUFILE "%s",substr($tmp,25,2);
  printf OUFILE "%s",substr($tmp,28,2);
  printf OUFILE "%s",substr($tmp,30,8);
  printf OUFILE "%s",substr($tmp,40,2);
  printf OUFILE "%s",substr($tmp,43,2);
  printf OUFILE "\n";
}