%表題   MATH1下位gt2dlib
%
%履歴
%\Drireki{
%         2011/08/16 堀之内武
%        }
%
%  \Dchapter{GT2DLIB : }
\Dchapterhead
\label{gt2dlib}


\section{概要}

本ライブラリーは2次元の補間、並びにそれを用いた2次元の座標変換を扱う。
座標間の対応は離散的な格子点で指定し、間は補間する。補間アルゴリズムは
双線形補間を用いる。このため逆変換は解析的に計算される。将来的には双3
次補間もサポートする可能性があるが、その場合逆変換は反復法によることに
なる。

補間のサブルーチンは、座標変換のみならず一般の用途に適するよう作ってある。

座標変換は、$(\xi,\eta) -> (x,y)$ において、離散的な点 $\xi _i (i=0,1,2,..),\eta _j(j=0,1,2,..)$ で
\begin{eqnarray*}
x_{i,j} = x(\xi_i,\eta_j) \\
y_{i,j} = y(\xi_i,\eta_j)
\end{eqnarray*}
という形で表される格子点での対応関係により定義される。従って「正変換」
においては、変換元の座標のデータは2つの1次元配列、変換先の座標のデータ
は2つの2次元配列となる。逆変換はその逆である。なお、2つの2次元配列から
2つの2次元配列へと対応づけられる座標変換は、中間的に1次元配列ベースの
「矩形」格子を設定すれば、逆変換、正変換の2段階で行うことが出来る。こ
れは、幾何的には、基準となるデカルト座標系を用いることに相当する。

\section{関数のリスト}

  \begin{tabular}{lp{10cm}}
      {\tt G2FBLI(P, Q, Z00, Z10, Z01, Z11, Z)} & 双線形補間 \\
      {\tt G2FBL2(P,Q, X00,X10,X01,X11, Y00,Y10,Y01,Y11, X,Y)} & 2変数同時の双線形補間\\
      {\tt G2IBL2(X,Y, X00,X10,X01,X11, Y00,Y10,Y01,Y11, P,Q)} & G2FBL2 の逆変換\\
      {\tt G2SCTR(NX, NY, UXA,UYA, TXA,TYA)} & 2次元の座標変換の設定\\
      {\tt G2FCTR(UX, UY, TX, TY)} & 2次元の座標変換\\
      {\tt G2ICTR(TX, TY, UX, UY)} & G2FCTRの逆変換\\
      {\tt G2QCTR(LINIT)} & 初期化済かの問合わせ\\
      {\tt LG2INQ(TX,TY, TX00,TX10,TX01,TX11, TY00,TY10,TY01,TY11)} & 四辺形の内側にあるか判定
  \end{tabular}

\section{関数の説明}

  \subsection{G2FBLI}
  \label{gt2dlib.sub.g2fbli}

    \begin{enumerate}
      \item 機能
        \begin{quote}
          双線形補間. 入力座標 (P, Q) はともに [0, 1] の区間に正規化されたものをとる.
        \end{quote}
      \item 呼び出し方法
        \begin{quote}
          {\tt CALL G2FBLI(P, Q, Z00, Z10, Z01, Z11, Z)}
        \end{quote}
      \item パラメーターの説明
        \begin{quote}
          \begin{tabular}{llp{10cm}}
             {\tt P,Q} & {\tt (R)} &  補間すべき点の座標. ４隅が (0,0), (1,0), (1,1), (0,1) となるよう正規化されてるものとする. (入力) \\
             {\tt Z00, Z10, Z01, Z11} & {\tt (R)} & P,Q の４隅(上述)、即ち、それぞれ (P,Q) = (0,0), (1,0), (1,1), (0,1) における変数の値 (入力) \\
             {\tt Z} & {\tt (R)} & 補間結果 (出力)
          \end{tabular}
        \end{quote}
      \item 備考
        \begin{enumerate}
          \item 中身はZ = (1-P)*(1-Q)*Z00 + P*(1-Q)*Z10 + (1-P)*Q*Z01 + P*Q*Z11
である(一行のみ).
          \item P, Q とも [0,1] の区間内にある場合は補間, そうでなければ外挿 となる.
          \item パラメターの説明から明らかであろうが, (P,Q) = (0,0), (1,0), (1,1), (0,1) の場合、出力はそれぞれ {\tt Z00, Z10, Z01, Z11} に等しくなる.
        \end{enumerate}
    \end{enumerate}

  \subsection{G2FBL2}
  \label{gt2dlib.sub.g2fbl2}

    \begin{enumerate}
      \item 機能
        \begin{quote}
          2変数同時の双線形補間. 入力座標 (P, Q) はともに [0, 1] の区間に正規化 されたものをとる.
        \end{quote}
      \item 呼び出し方法
        \begin{quote}
          {\tt CALL G2FBL2(P,Q, X00,X10,X01,X11, Y00,Y10,Y01,Y11, X,Y)}
        \end{quote}
      \item パラメーターの説明
        \begin{quote}
          \begin{tabular}{llp{10cm}}

            {\tt P, Q} & {\tt (R)} & 補間すべき点の座標. ４隅が (0,0), (1,0), (1,1), (0,1) となるよう正規化されてるものとする. (入力) \\
            {\tt X00, X10, X01, X11} & {\tt (R)} & P,Q の４隅(上述)、即ち、それぞれ (P,Q) = (0,0), (1,0), (1,1), (0,1) における一つめの変数の値 (入力) \\
            {\tt Y00, Y10, Y01, Y11} & {\tt (R)} & P,Q の４隅(上述)、即ち、それぞれ (P,Q) = (0,0), (1,0), (1,1), (0,1) における二つめの変数の値 (入力) \\
            {\tt X} & {\tt (R)} & {\tt X00, X10, X01, X11} に関する補間結果 (出力) \\
            {\tt Y} & {\tt (R)} & {\tt Y00, Y10, Y01, Y11} に関する補間結果 (出力)
          \end{tabular}
        \end{quote}
      \item 備考
        \begin{enumerate}
          \item {\tt G2FBLI} を2回呼んでいるだけである。よって
X = (1-P)*(1-Q)*X00 + P*(1-Q)*X10 + (1-P)*Q*X01 + P*Q*X11
Y = (1-P)*(1-Q)*Y00 + P*(1-Q)*Y10 + (1-P)*Q*Y01 + P*Q*Y11
          \item 2変数から2変数への変換であるから逆変換が存在する.
逆変換を行うサブルーチンは {\tt G2IBL2 }である.
        \end{enumerate}
    \end{enumerate}

  \subsection{G2IBL2}
  \label{gt2dlib.sub.g2ibl2}

    \begin{enumerate}
      \item 機能
        \begin{quote}
          {\tt G2FBL2} (2変数同時の双線形補間) の逆変換. 解析解である.
        \end{quote}
      \item 呼び出し方法
        \begin{quote}
          {\tt CALL G2IBL2(X,Y, X00,X10,X01,X11, Y00,Y10,Y01,Y11, P,Q)}
        \end{quote}
      \item パラメーターの説明
        \begin{quote}
          \begin{tabular}{llp{10cm}}
           {\tt X,Y, X00,X10,X01,X11, Y00,Y10,Y01,Y11} & {\tt (R)} & (入力) \\
           {\tt P, Q} & {\tt (R)} & (出力)

          \end{tabular}
        \end{quote}
      \item 備考
        \begin{enumerate}
          \item パラメーターの説明は {\tt G2FBL2} を参照のこと.
          \item 連立２次方程式を解析的に解く. (実質的に１次方程式になる場合等、 多くの場合分けを含む)
        \end{enumerate}
    \end{enumerate}

  \subsection{G2SCTR}
  \label{gt2dlib.sub.g2sctr}

    \begin{enumerate}
      \item 機能
        \begin{quote}
          2次元の座標変換の設定(初期化). 格子点間の対応で定義する.
        \end{quote}
      \item 呼び出し方法
        \begin{quote}
          {\tt CALL G2SCTR(NX, NY, UXA,UYA, TXA,TYA)}
        \end{quote}
      \item パラメーターの説明
        \begin{quote}
          \begin{tabular}{llp{10cm}}

           {\tt NX, NY} & {\tt (R)} & 配列の長さ (入力) \\
           {\tt UXA} & {\tt (R)} & 変換元の座標 (独立変数その1). 長さ {\tt NX} の1次元配列 (入力).\\
           {\tt UYA} & {\tt (R)} & 変換元の座標 (独立変数その2). 長さ {\tt NY} の1次元配列 (入力).\\
           {\tt TXA} & {\tt (R)} & 変換先の座標 (独立変数その1). 長さ {\tt NX*NY}の2次元配列 (入力).第1要素({\tt TX(1,1)})を {\tt RUNDEF} とすることで省略できる. 省略の場合,{\tt TX(I,J)=UX(I)} が用いられる.\\
           {\tt TYA} & {\tt (R)} & 変換先の座標 (独立変数その2). 長さ {\tt NX*NY}の2次元配列 (入力).第1要素({\tt TY(1,1)})を {\tt RUNDEF} とすることで省略できる. 省略の場合,{\tt TY(I,J)=UY(J)} が用いられる.
          \end{tabular}
        \end{quote}
      \item 備考
        \begin{enumerate}
          \item 2次元配列 {\tt (TXA,TYA)} のセーブは、C 言語で書かれた下請の関数が行う。
動的割り当てによるため、サイズに制限がない。一方、一次元の {\tt UXA,UYA} は静的に確保されたサブルーチン内の配列にセーブされる。
最大の長さは {\tt GRPH2} の {\tt UWPACK} と同様、コンパイル時に変更可能な定数 {\tt MAXNGRID} である。デフォルト長は 4000。
        \end{enumerate}
    \end{enumerate}

  \subsection{G2FCTR}
  \label{gt2dlib.sub.g2fctr}

    \begin{enumerate}
      \item 機能
        \begin{quote}
          2次元の座標変換を行う.
        \end{quote}
      \item 呼び出し方法
        \begin{quote}
          {\tt CALL G2FCTR(UX, UY, TX, TY)}
        \end{quote}
      \item パラメーターの説明
        \begin{quote}
          \begin{tabular}{llp{10cm}}
           {\tt UX} & {\tt (R)} & 変換前の座標（その1） (入力)\\
           {\tt UY} & {\tt (R)} & 変換前の座標（その2） (入力)\\
           {\tt TX} & {\tt (R)} & 変換後の座標（その1） (出力)\\
           {\tt TY} & {\tt (R)} & 変換後の座標（その2） (出力)
          \end{tabular}
        \end{quote}
      \item 備考
        \begin{enumerate}
          \item 予め {\tt G2SCTR} で初期化しておかないとエラーを発生する。
          \item {\tt G2SCTR} で設定した {\tt UXA, UYA} の範囲外の入力に対しては、 警告を出しつつ、外挿を行う。
        \end{enumerate}
    \end{enumerate}


  \subsection{G2ICTR}
  \label{gt2dlib.sub.g2ictr}

    \begin{enumerate}
      \item 機能
        \begin{quote}
          {\tt G2FCTR} (2次元の座標変換) の逆変換を行う.
        \end{quote}
      \item 呼び出し方法
        \begin{quote}
          {\tt CALL G2ICTR(TX, TY, UX, UY)}
        \end{quote}
      \item パラメーターの説明
        \begin{quote}
          \begin{tabular}{llp{10cm}}
           {\tt TX} & {\tt (R)} & 逆変換前の座標（その1） (入力)\\
           {\tt TY} & {\tt (R)} & 逆変換前の座標（その2） (入力)\\
           {\tt UX} & {\tt (R)} & 逆変換後の座標（その1） (出力)\\
           {\tt UY} & {\tt (R)} & 逆変換後の座標（その2） (出力)
          \end{tabular}
        \end{quote}
      \item 備考
        \begin{enumerate}
          \item 予め {\tt G2SCTR} で初期化しておかないとエラーを発生する。
          \item {\tt G2SCTR} で設定した {\tt TXA, TYA} の範囲外の入力に対しては、 エラーを発生する。
        \end{enumerate}
    \end{enumerate}

  \subsection{G2QCTR}
  \label{gt2dlib.sub.g2qctr}

    \begin{enumerate}
      \item 機能
        \begin{quote}
          初期化済か否かの問合わせ.なお、初期化せずに {\tt G2FCTR, G2ICTR} を呼べばエラーがでるようになっているので、問合わせは必須ではない。
        \end{quote}
      \item 呼び出し方法
        \begin{quote}
          {\tt CALL G2QCTR(LINIT)}
        \end{quote}
      \item パラメーターの説明
        \begin{quote}
          \begin{tabular}{llp{10cm}}
           {\tt LINIT} & {\tt (L)} & 初期化済なら {\tt .TRUE.} まだなら {\tt .FALSE.} を返す。(出力)
          \end{tabular}
        \end{quote}
      \item 備考
        \begin{enumerate}
          \item {\tt G2SCTR} が既に呼ばれていれば {\tt .TRUE.} 
        \end{enumerate}
    \end{enumerate}

  \subsection{LG2INQ}
  \label{gt2dlib.sub.lg2inq}

    \begin{enumerate}
      \item 機能
        \begin{quote}
          ある点が四辺形の内側にあるか判定する。凸四辺形限定。
        \end{quote}
      \item 呼び出し方法
        \begin{quote}
          {\tt LIN = LG2INQ(TX,TY, TX00,TX10,TX01,TX11, TY00,TY10,TY01,TY11)}
        \end{quote}
      \item パラメーターの説明
        \begin{quote}
          \begin{tabular}{llp{10cm}}
           {\tt TX,TY} & {\tt (R)} & 判定すべき点の座標 (入力) \\
           {\tt TX00,TX10,TX01,TX11, TY00,TY10,TY01,TY11} & {\tt (R)} & 四辺形の4隅の座標 (入力)
          \end{tabular}
          戻り値 (L) 内側または境界上にあれば {\tt .TRUE.} 外側なら {\tt .FALSE.} を返す.
        \end{quote}
      \item 備考
        \begin{enumerate}
          \item {\tt G2ICTR} が下請として用いる.
          \item 凹四辺形には対応していない。座標変換においては、凹四辺形は多価性のある変換にしか現われない。多価の場合は、逆変換はそもそも一意に決まらないので、利用価値が低い。将来的には、凹四辺形に対応してもよい。
        \end{enumerate}
    \end{enumerate}

  \subsection{下請}
{\tt FUNCTION G2SGRD, FUNCTION G2QGRD}

{\tt G2SCTR} の下請であり、動的な配列確保のため C で書かれている。それ以外に
独立な関数とするべき理由はないので説明は割愛する。