.. _sec-transform: [ Transform ] セクション ================================================== 書式 -------------------------------------------------- このセクションでは、 **[source]** 、 **[surface]** 、 **[cell]** の各セクション、 **r-z** 、 **xyz** メッシュの場合の各タリー、磁場や電場の定義の際に使用できる座標変換の定義を行います。 コメント文字として **$** の他に、行頭の **c** (直後に半角スペースがある場合)も使用できます。 **infl:** によるファイルの挿入、 **set:** によるユーザー定義定数の設定は、セクションの途中でも行うことができます。 なお、 **[transform]** を用いて可能な座標変換は回転と平行移動のみであり、拡大・縮小はできない点に注意してください。 書式は以下の通りです。 .. code-block:: text [ Transform ] TRn X0 Y0 Z0 B1 B2 B3 B4 B5 B6 B7 B8 B9 M **TRn** の **n** により定義する座標変換番号を指定します。 次の **X0, Y0, Z0** は平行移動に関する入力値であり、その後の **Bi** は回転に関する入力値です。 最後の **M** は変換方法のオプションで、これにより **Bi** の表す意味や座標変換に用いる式が変わります。 .. list-table:: 座標変換パラメータ :widths: 22 78 :header-rows: 1 * - 項目 - 説明 * - **n** - 座標変換番号。1 から 999999 が使用できます。 * - **X0, Y0, Z0** - 平行移動の **x, y, z** 成分。単位は cm です。 * - **B1-B9** - 回転に関する入力の各成分です。 **M=±1** の場合は :eq:`eq-transform-def1` と :eq:`eq-transform-def2` を参照してください。行列式が1でない場合は、1となるように規格化されます。 **M=±2, ±3** の場合は、それぞれ :numref:`sec-trans-m2` と :numref:`sec-trans-m3` に示した入力方式を確認してください。 * - **M** - 変換方法のオプションです。正の場合は回転させた後に平行移動させ、負の場合は平行移動させた後に回転させます。 **=±1** は **B1-B9** に回転行列の成分を直接入力するオプションです。 **=±2** と **±3** は、 **x, y, z** 軸周りの回転を角度だけ入力することで簡易的に指定するオプションです。 **M=±2** の場合は、原点中心の回転のみ扱い、回転させる順番も **z, y, x** 軸の順で固定です。 **M=±3** の場合は、回転の中心座標を指定でき、回転させる順番も指定できます。指定する角度は、 **TRn** の場合は radian 単位、 **\*TRn** の場合は degree 単位です。ただし、 **M=±1** の時は **Bi=** :math:`\cos(\theta_i)` とした時の :math:`\theta_i` をdegree単位で与えます。 座標変換の定義と使い方 -------------------------------------------------- この節では、 **M** の値によって変わる **Bi** の意味や座標変換式について説明し、例題を示すことで使い方を簡単に紹介します。 ただし、変換の対象がタリーの場合は、それ以外の場合と変換前後の座標系が式の上では逆になるので注意してください。 タリーの座標変換については :numref:`trans-tally` を参照してください。 **M=±1** の場合 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ このオプションでは、回転行列の成分を直接入力することで任意の回転を指定できます。 座標変換前の座標を :math:`(x,y,z)` 、変換後の座標を :math:`(x',y',z')` とすると、 **M=1** の時の変換式は、 .. math:: :label: eq-transform-def1 \begin{pmatrix} x' \\ y' \\ z' \end{pmatrix} = \begin{pmatrix} B_{1} & B_{4} & B_{7} \\ B_{2} & B_{5} & B_{8} \\ B_{3} & B_{6} & B_{9} \end{pmatrix} \begin{pmatrix} x \\ y \\ z \end{pmatrix} + \begin{pmatrix} X_0 \\ Y_0 \\ Z_0 \end{pmatrix} となり、 **M=-1** の時は、 .. math:: :label: eq-transform-def2 \begin{pmatrix} x' \\ y' \\ z' \end{pmatrix} = \begin{pmatrix} B_{1} & B_{4} & B_{7} \\ B_{2} & B_{5} & B_{8} \\ B_{3} & B_{6} & B_{9} \end{pmatrix} \begin{pmatrix} x - X_0 \\ y - Y_0 \\ z - Z_0 \end{pmatrix} となります。 **B1-B9** の幾何学的な解釈は、変換前後のxyz軸の成す角のcosine(trの前に*を付けた場合は角度degree)となります。 変換を行う対象を、 **M=1** の場合は回転してから平行移動させ、 **M=-1** の場合は平行移動してから回転させます。 回転は、どちらの場合も、 **xyz** 座標系の原点に対して行われます。 ただし、平行移動は **M=1** と **-1** で逆向きとなるので注意してください。 例えば、 **x** 方向に10 cm移動したい場合は、 **M=1** の場合は **X0=10** 、 **M=-1** の場合は **X0=-10** と指定します。 この関係は **M=±2, ±3** の場合も同じです。 .. _ex-transform-ex1: .. code-block:: text :caption: [transform]セクションの例題(1) 1: [ Transform ] 2: set: c10[90] $ angle of around Z (degree) 3: set: c20[30] $ angle of around Y (degree) 4: set: c30[0] $ angle of around X (degree) 5: 6: tr1 0 0 0 7: cos(c10/180*pi)*cos(c20/180*pi) 8: sin(c10/180*pi)*cos(c30/180*pi)+cos(c10/180*pi)*sin(c20/180*pi)*sin(c30/180*pi) 9: sin(c10/180*pi)*sin(c30/180*pi)-cos(c10/180*pi)*sin(c20/180*pi)*cos(c30/180*pi) 10: -sin(c10/180*pi)*cos(c20/180*pi) 11: cos(c10/180*pi)*cos(c30/180*pi)-sin(c10/180*pi)*sin(c20/180*pi)*sin(c30/180*pi) 12: cos(c10/180*pi)*sin(c30/180*pi)+sin(c10/180*pi)*sin(c20/180*pi)*cos(c30/180*pi) 13: sin(c20/180*pi) 14: -cos(c20/180*pi)*sin(c30/180*pi) 15: cos(c20/180*pi)*cos(c30/180*pi) 16: 1 上の例題は、 **z** 軸周りに **c10** 度、次に **y** 軸周りに **c20** 度、最後に **x** 軸周りに **c30** 度回転させる回転行列を書き下したものです。 **c10, c20, c30** の定数に値を入れることにより、各軸周りの回転を定義できます。 .. _sec-trans-m2: **M=±2** の場合 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ これは **x, y, z** 軸周りの回転のみを容易に指定できるオプションです。 軸毎の回転角度を入力するだけでよく、回転行列の成分を指定する必要がありません。 ただし、原点を中心とした回転のみを扱い、回転させる順番は **z, y, x** 軸の順で固定です。 入力方式は次のようになります。 .. code-block:: text TRn X0 Y0 Z0 theta_z theta_y theta_x 0 0 0 0 0 0 2 ここで、 **X0, Y0, Z0** はそれぞれ平行移動の **x, y, z** 成分、 **theta_z, theta_y, theta_x** はそれぞれ **z, y, x** 軸周りの回転角度です。 **B4-B9** の 0 の部分にはどんな数字でも良いので入れておく必要があります。 各軸周りの回転の方向は :numref:`fig-tran-rotation` を参照してください。 それぞれの回転を行列で表すと、 .. math:: :label: eq-transform-def3 R_x = \begin{pmatrix} 1 & 0 & 0 \\ 0 & \cos\theta_x & -\sin\theta_x \\ 0 & \sin\theta_x & \cos\theta_x \end{pmatrix}, \quad R_y = \begin{pmatrix} \cos\theta_y & 0 & \sin\theta_y \\ 0 & 1 & 0 \\ -\sin\theta_y & 0 & \cos\theta_y \end{pmatrix}, \quad R_z = \begin{pmatrix} \cos\theta_z & -\sin\theta_z & 0 \\ \sin\theta_z & \cos\theta_z & 0 \\ 0 & 0 & 1 \end{pmatrix} となります。 これにより、 **M=2** の時の座標変換の式は、変換前の座標を :math:`(x,y,z)` 、変換後の座標を :math:`(x',y',z')` とすると、 .. math:: :label: eq-transform-def4 \begin{pmatrix} x' \\ y' \\ z' \end{pmatrix} = R_x R_y R_z \begin{pmatrix} x \\ y \\ z \end{pmatrix} + \begin{pmatrix} X_0 \\ Y_0 \\ Z_0 \end{pmatrix} となり、 **M=-2** の時は、 .. math:: :label: eq-transform-def5 \begin{pmatrix} x' \\ y' \\ z' \end{pmatrix} = R_x R_y R_z \begin{pmatrix} x - X_0 \\ y - Y_0 \\ z - Z_0 \end{pmatrix} となります。 **M=±1** の節で書いたように、平行移動は **M=2** と **-2** で逆向きとなるので注意してください。 .. figure:: ../assets/transform-rotation.png :width: 50em :name: fig-tran-rotation :alt: rotation direction around x y z axes **x, y, z** 軸周りの回転の方向 .. _ex-transform-ex2: .. code-block:: text :caption: [transform]セクションの例題(2) 1: [ Transform ] 2: *tr1 0 0 0 90 30 0 0 0 0 0 0 0 2 3: tr2 0 0 0 pi/2 pi/6 0 0 0 0 0 0 0 2 これは **M=2** の例題です。 例題(1)と同じ回転の座標変換を簡易に入力できます。 **\*tr1** は degree 単位、 **\*** の付かない **tr2** は radian 単位で回転角度を指定します。 .. _sec-trans-m3: **M=±3** の場合 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ このオプションは、回転の中心となる座標を指定できるようにし、また回転する軸の順番を任意に変更できるようにしたものです。 入力方式は次のようになります。 .. code-block:: text TRn X0 Y0 Z0 XC YC ZC A1 theta1 A2 theta2 A3 theta3 3 ここで、 **X0, Y0, Z0** はそれぞれ平行移動の **x, y, z** 成分、 **XC, YC, ZC** は回転の中心となる座標の **x, y, z** 成分です。 **Ai** と **thetai** はそれぞれ、 **i** 回目の軸回転の軸と角度です。 **Ai=1,2,3** の場合はそれぞれ **x, y, z** 軸の回転を **i** 回目に実行することを意味します。 また、 **Ai=0** の場合は回転させないことを意味します。 例えば、 **y** 軸周りのみ回転させる場合は **A1=2, A2=A3=0** とします。 **M=3** の時の座標変換の式は、変換前の座標を :math:`(x,y,z)` 、変換後の座標を :math:`(x',y',z')` とすると、 .. math:: :label: eq-transform-def6 \begin{pmatrix} x' \\ y' \\ z' \end{pmatrix} = R_3 R_2 R_1 \begin{pmatrix} x - X_C \\ y - Y_C \\ z - Z_C \end{pmatrix} + \begin{pmatrix} X_C \\ Y_C \\ Z_C \end{pmatrix} + \begin{pmatrix} X_0 \\ Y_0 \\ Z_0 \end{pmatrix} となります。 **R1, R2, R3** には、それぞれ **A1, A2, A3** で指定した **x, y, z** 軸の回転行列が入ります。 **M=-3** の時は、 .. math:: :label: eq-transform-def7 \begin{pmatrix} x' \\ y' \\ z' \end{pmatrix} = R_3 R_2 R_1 \begin{pmatrix} x - X_C - X_0 \\ y - Y_C - Y_0 \\ z - Z_C - Z_0 \end{pmatrix} + \begin{pmatrix} X_C \\ Y_C \\ Z_C \end{pmatrix} となります。 なお、 **M=±1** の節で書いたように、平行移動は **M=3** と **-3** で逆向きとなるので注意してください。 .. _ex-transform-ex3: .. code-block:: text :caption: [transform]セクションの例題(3) 1: [ Transform ] 2: *tr1 0.0 0.0 5.0 0.0 10.0 0.0 2 45.0 3 -60.0 0 0.0 3 これは **M=3** の例題です。 座標 :math:`(0.0, 10.0, 0.0)` を中心とする座標系において、 **y** 軸周りに45度、 **z** 軸周りに-60度回転させた後、 **z** の **+** 方向に5 cm平行移動させます。 .. _trans-tally: タリーの場合 -------------------------------------------------- タリーに座標変換をかけると変換後の点を中心とした座標系で表示するようになり、いわゆる物体固定系で計算結果を表示できるようになります。 この場合、変換後の座標系で結果を描画することから、タリー以外の場合と比べて変換式の関係が逆になります。 例えば **M=1** の時、変換前の座標を :math:`(x,y,z)` 、変換後の座標、すなわちタリーで表示する座標を :math:`(x',y',z')` とすると、 .. math:: :label: eq-transform-def8 \begin{pmatrix} x' \\ y' \\ z' \end{pmatrix} = \begin{pmatrix} B_{1} & B_{4} & B_{7} \\ B_{2} & B_{5} & B_{8} \\ B_{3} & B_{6} & B_{9} \end{pmatrix} \begin{pmatrix} x - X_0 \\ y - Y_0 \\ z - Z_0 \end{pmatrix} となります。 これは例えば、変換前のタリーで **x=20** cm の位置に表示されていた物が、変換後のタリーでは :math:`x'=20-X_0` cm の位置に表示されることを意味します。 すなわち、 **X0** が正の場合は、その分だけ **x** 軸の負側にシフトして表示されます。 同様に **M=-1** の時は、 .. math:: :label: eq-transform-def9 \begin{pmatrix} x' \\ y' \\ z' \end{pmatrix} = \begin{pmatrix} B_{1} & B_{2} & B_{3} \\ B_{4} & B_{5} & B_{6} \\ B_{7} & B_{8} & B_{9} \end{pmatrix} \begin{pmatrix} x \\ y \\ z \end{pmatrix} + \begin{pmatrix} X_0 \\ Y_0 \\ Z_0 \end{pmatrix} となります。 **M=±1** 以外の場合も同様の挙動になりますので注意してください。