# Mg加工の下ノズルを作るスクリプト
# by M. Endo
# 02/07/24 とにかく動くように作った
# 02/07/25 端点を24増やし,パイプとノズルを分離.曲がりも急峻で無いよう
#               にした.パイプ内圧を下げるねらい.
#
# 02/09/19 端点の定義方法を変更.ノズルがなめらかに細くなるようにした.
#               実験と計算があわないので.
#
# 02/09/19 ノズルの内径を2.8×0.9mmに変更する.
#
# 03/09/05 earexe3.5で顕在化した問題を発見,修正.

$a  = 0.28; # パイプの内幅(x)[cm]
$b  = 0.28; # パイプの内幅(y)[cm]
$c  = 0.28; # ノズルの内幅(x)[cm]
$d  = 0.09; # ノズルの内幅(y)[cm]
$n  = 0.08; # パイプの肉厚[cm]
$l1 = 0.11; # 垂直部分の長さ[cm]
$l2 = 0.1;  # つなぎ部分(1)の長さ[cm]
$l3 = 0.1 ; # つなぎ部分(2)の長さ[cm]
$l4 = 0.41; # ノズル部分の長さ[cm]

open (OUFILE, ">LoNzl.dat");

# $dx1, $dy1の定義:パイプの内側
$dx1[0] = 0.0;       $dy1[0] =  $b/2.0;
$dx1[1] = $a-$b/3.0; $dy1[1] =  $b/2.0;
$dx1[2] = $a;      ; $dy1[2] =  $b/3.0;
$dx1[3] = $a;      ; $dy1[3] = -$b/3.0;
$dx1[4] = $a-$b/3.0; $dy1[4] = -$b/2.0;
$dx1[5] = 0.0;       $dy1[5] = -$b/2.0;

# $dx2, $dy2の定義:パイプの外側
for($i = 0; $i <  6; $i++) {
  $dx2[$i] = $dx1[$i]*($a+$n)/$a;
  $dy2[$i] = $dy1[$i]*($b+$n*2.0)/$b;
}

# $dx3, $dy3の定義:ノズルの内側
$dx3[0] = 0.0;       $dy3[0] =  $d/2.0;
$dx3[1] = $c-$d/3.0; $dy3[1] =  $d/2.0;
$dx3[2] = $c;      ; $dy3[2] =  $d/3.0;
$dx3[3] = $c;      ; $dy3[3] = -$d/3.0;
$dx3[4] = $c-$d/3.0; $dy3[4] = -$d/2.0;
$dx3[5] = 0.0;       $dy3[5] = -$d/2.0;

# $dx4, $dy4の定義:ノズルの外側
for($i = 0; $i <  6; $i++) {
  $dx4[$i] = $dx3[$i]*($c+$n)/$c;
  $dy4[$i] = $dy3[$i]*($d+$n*2.0)/$d;
}

$y0 = $n+$b/2.0; $z0 = 0.0;
for($i =  0; $i <  6; $i++) { # はじめの12点(地面)
  $x[$i   ] = 0.0+$dx1[$i];
  $y[$i   ] = $y0+$dy1[$i];
  $z[$i   ] = $z0;
  $x[$i+ 6] = 0.0+$dx2[$i];
  $y[$i+ 6] = $y0+$dy2[$i];
  $z[$i+ 6] = $z0;
}

$z0 = $l1;
for($i =  0; $i <  6; $i++) { # 途中の12点(折れ曲がり1)
  $x[$i+12] = 0.0+$dx1[$i];
  $y[$i+12] = $y0+$dy1[$i]*0.966;
  $z[$i+12] = $z0-$dy1[$i]*0.259;
  $x[$i+18] = 0.0+$dx2[$i];
  $y[$i+18] = $y0+$dy2[$i]*0.966;
  $z[$i+18] = $z0-$dy2[$i]*0.259;
}

$y0 += $l2*0.259; $z0 += $l2*0.966;
for($i =  0; $i <  6; $i++) { # 途中の12点(折れ曲がり2)
  $x[$i+24] = 0.0+$dx1[$i];
  $y[$i+24] = $y0+$dy1[$i]*0.866;
  $z[$i+24] = $z0-$dy1[$i]*0.500;
  $x[$i+30] = 0.0+$dx2[$i];
  $y[$i+30] = $y0+$dy2[$i]*0.866;
  $z[$i+30] = $z0-$dy2[$i]*0.500;
}

$y0 += $l3*0.500; $z0 += $l3*0.866;
for($i =  0; $i <  6; $i++) { # 途中の12点(折れ曲がり3)
  $x[$i+36] = 0.0+$dx1[$i];
  $y[$i+36] = $y0+$dy1[$i]*0.707;
  $z[$i+36] = $z0-$dy1[$i]*0.707;
  $x[$i+42] = 0.0+$dx2[$i];
  $y[$i+42] = $y0+$dy2[$i]*0.707;
  $z[$i+42] = $z0-$dy2[$i]*0.707;
}

$y0 += $l4*0.707; $z0 += $l4*0.707;
for($i =  0; $i <  6; $i++) { # 最後の12点(ノズル)
  $x[$i+48] = 0.0+$dx3[$i];
  $y[$i+48] = $y0+$dy3[$i]*0.707;
  $z[$i+48] = $z0-$dy3[$i]*0.707;
  $x[$i+54] = 0.0+$dx4[$i];
  $y[$i+54] = $y0+$dy4[$i]*0.707;
  $z[$i+54] = $z0-$dy4[$i]*0.707;
}

print OUFILE "* Lower nozzle of Mg cutting Ver. 2\n";
print OUFILE "* number points\n";
print OUFILE "    60\n";
print OUFILE "* x, y, z for each point\n";

for($i =  0; $i < 60; $i++) { # 頂点を出力
  &pointoutput($x[$i],$y[$i],$z[$i]);
}

print OUFILE "* number facets\n";
print OUFILE "    58\n";
print OUFILE "* facet indices\n";

for($i =  1; $i <=  5; $i++)   { # 面を出力 下
  print OUFILE sprintf "    %2d    %2d    %2d    %2d   110\n", $i, $i+6, $i+7, $i+1;
}
for($i = 49; $i <= 53; $i++)   { # 面を出力 上
  print OUFILE sprintf "    %2d    %2d    %2d    %2d   110\n", $i, $i+1, $i+7, $i+6;
}
for($i =  1; $i <=  5; $i++)   { # 面を出力 第1区間内側
  print OUFILE sprintf "    %2d    %2d    %2d    %2d   110\n", $i, $i+1, $i+13, $i+12;
}
for($i = 13; $i <= 17; $i++)   { # 面を出力 第2区間内側
  print OUFILE sprintf "    %2d    %2d    %2d    %2d   110\n", $i, $i+1, $i+13, $i+12;
}
for($i = 25; $i <= 29; $i++)   { # 面を出力 第3区間内側
  print OUFILE sprintf "    %2d    %2d    %2d    %2d   110\n", $i, $i+1, $i+13, $i+12;
}
for($i = 37; $i <= 41; $i++)   { # 面を出力 第4区間内側
  print OUFILE sprintf "    %2d    %2d    %2d    %2d   110\n", $i, $i+1, $i+13, $i+12;
}
for($i =  7; $i <= 11; $i++)   { # 面を出力 第1区間外側
  print OUFILE sprintf "    %2d    %2d    %2d    %2d   110\n", $i, $i+12,$i+13, $i+1;
}
for($i = 19; $i <= 23; $i++)   { # 面を出力 第2区間外側
  print OUFILE sprintf "    %2d    %2d    %2d    %2d   110\n", $i, $i+12,$i+13, $i+1;
}
for($i = 31; $i <= 35; $i++)   { # 面を出力 第3区間外側
  print OUFILE sprintf "    %2d    %2d    %2d    %2d   110\n", $i, $i+12,$i+13, $i+1;
}
for($i = 43; $i <= 47; $i++)   { # 面を出力 第4区間外側
  print OUFILE sprintf "    %2d    %2d    %2d    %2d   110\n", $i, $i+12,$i+13, $i+1;
}
for($i =  1; $i <  49; $i+=12) { # 面を出力 手前(1)
  print OUFILE sprintf "    %2d    %2d    %2d    %2d   110\n", $i, $i+12, $i+18, $i+6;
}
for($i =  6; $i <  54; $i+=12) { # 面を出力 手前(2)
  print OUFILE sprintf "    %2d    %2d    %2d    %2d   110\n", $i, $i+6, $i+18, $i+12;
}

close(OUFILE);

open (OUFILE, ">LoIn.dat");
print OUFILE "* Lower inlet of Mg cutting\n";
print OUFILE "* number points\n";
print OUFILE "    12\n";
print OUFILE "* x, y, z for each point\n";
for($i =  0; $i <  6; $i++) { # 頂点を出力
  &pointoutput($x[$i],$y[$i],0.0);
}
for($i =  0; $i <  6; $i++) { # 頂点を出力
  &pointoutput($x[$i],$y[$i],1.0);
}
print OUFILE "* number facets\n";
print OUFILE "    10\n";
print OUFILE "* facet indices\n";

for($i =  1; $i <=  5; $i++)   { # 面を出力 側面
  print OUFILE sprintf "    %2d    %2d    %2d    %2d   130\n", $i, $i+6 ,$i+7 , $i+1;
}
print OUFILE sprintf "    %2d    %2d    %2d    %2d   130\n", 1, 2, 3, 4;
print OUFILE sprintf "    %2d    %2d    %2d    %2d   130\n", 4, 5, 6, 1;
print OUFILE sprintf "    %2d    %2d    %2d    %2d   130\n", 7,10, 9, 8;
print OUFILE sprintf "    %2d    %2d    %2d    %2d   130\n",10, 7,12,11;
print OUFILE sprintf "    %2d    %2d    %2d    %2d   130\n", 1, 6,12, 7;
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";
}