%表題   GRPH2 図形処理上位パッケージ
%
%履歴
%\Drireki{
%         90/03/22 塩谷雅人
%         91/09/05 林祥介
%         91/12/10 林祥介
%         92/02/05 塩谷雅人
%         92/04/22 林祥介   (4.1版)
%         92/04/24 塩谷雅人
%         94/03/18 塩谷雅人
%        }
%
\section{サブルーチンの説明}
%\label{ugpack.refug}


\subsection{UGVECT}
%\label{ugpack.refug.ugvect}
\begin{enumerate}
  \item 機能
  \begin{quote}
    2次元ベクトル場を描く.
  \end{quote}
  \item 呼び出し方法
  \begin{quote}
    {\tt CALL UGVECT(U,MU,V,MV,NX,NY)}
  \end{quote}
  \item パラメーターの説明
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt U} & {\tt (R)} & ベクトルのX成分を与える
        {\tt MU}$ \times ${\tt NY}の2次元配列.
        作画には{\tt NX}$ \times ${\tt NY}の部分を使う. \\
      {\tt MU} & {\tt (I)} & 配列{\tt U}の第1次元整合寸法. \\
      {\tt V} & {\tt (R)} & ベクトルのY成分を与える
        {\tt MV}$ \times ${\tt NY}の2次元配列.
        作画には{\tt NX}$ \times ${\tt NY}の部分を使う. \\
      {\tt MV} & {\tt (I)} & 配列{\tt V}の第1次元整合寸法. \\
      {\tt NX} & {\tt (I)} & 作画に使う配列{\tt U, V}の第1次元寸法. \\
      {\tt NY} & {\tt (I)} & 作画に使う配列{\tt U, V}の第2次元寸法.
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item ベクトルの各成分の単位はV座標系における単位とする.
      ただし普通は, V座標系の単位に変換した配列{\tt U, V}
      を与える必要はなく, スケーリングファクターを与えてやればよい.
      このスケーリングファクターは,
      内部変数{\tt 'LNRMAL'}が{\tt .TRUE.}(初期値)なら
      内部的に決定される;
      {\tt .FALSE.}なら内部変数{\tt 'XFACT1'}, {\tt 'YFACT1'}
      (初期値はそれぞれ1.0)を参照する.
      したがって, スケーリングファクターを陽に指定したければ,
      {\tt 'LNRMAL'}を{\tt .FALSE.}として
      {\tt 'XFACT1'}, {\tt 'YFACT1'}を設定してやればよい.
      さらに, {\tt 'LNRMAL'}が{\tt .TRUE.}のとき,
      内部変数{\tt 'LEQRAT'}が{\tt .TRUE.}ならばXとYの
      スケーリングファクターを同じにする
      (初期値は {\tt .TRUE.}).
    \item ベクトルはUFPACK (第\ref{ufpack}章参照)のなかの
      {\tt UFLNZV}によって描かれる.
      したがってベクトルの形は{\tt UFPGET/UFPSET}の管理する
      内部変数によって決まる.
      ただし, ベクトルを描く線分のラインインデクスは内部変数{\tt 'INDEX'}が
      決める(初期値は3).
      また, 内部変数{\tt 'ICENT'}によってベクトルの始点を格子点に対して
      どこにとるか指定できる.
      {\tt 'ICENT'}が+1ならベクトルの終点が格子点と一致するように描く;
      0ならベクトルの中点が格子点と一致するように描く;
      --1ならベクトルの始点が格子点と一致するように描く
      (初期値は0).
    \item X方向の格子点の座標が{\tt UWSGXA}または{\tt UWSGXB}
      によって設定されていない場合, {\tt SGQWND}でウインドウ情報を
      取得し
      ウインドウの{\tt UXMIN}, {\tt UXMAX}を{\tt NX}--1等分するような
      格子点を設定する.
    \item Y方向の格子点の座標が{\tt UWSGYA}または{\tt UWSGYB}
      によって設定されていない場合, {\tt SGQWND}でウインドウ情報を
      取得し
      ウインドウの{\tt UYMIN}, {\tt UYMAX}を{\tt NY}--1等分するような
      格子点を設定する.
    \item \GLPGETSET (「MATH1」のマニュアル参照)の
      管理する内部変数{\tt 'LMISS'}が
      {\tt .TRUE.}なら欠損値処理をおこなう;
      (その際, 参照する欠損値は \GLPGETSET の管理する
      内部変数{\tt 'RMISS'}である)
      {\tt .FALSE.}なら欠損値処理をおこなわない.
      ここでいう欠損値処理とは, ベクトルのXまたはY成分のうち
      少なくとも一方が欠損値
      (以下では, このようなベクトルを欠損値ベクトルと呼ぶ)
      のときにおこなわれる処理のことである.
      具体的には, 内部変数{\tt 'LMISSP'}が
      {\tt .TRUE.}のときその格子点にマークを描く
      (描くマークのマーカータイプ, マーカーインデクス,
      マーカーサイズは内部変数
      {\tt 'ITYPE1'}, {\tt 'INDEX'}, {\tt 'RSIZEM'}を参照する.
      初期値はそれぞれ5, 3, 0.01. );
      {\tt .FALSE.}なら, なにも描かない
      (初期値は{\tt .FALSE.}).
      また, 内部変数{\tt 'LSMALL'}が{\tt .TRUE.}なら
      内部変数{\tt 'RSMALL'}が決める値以下のベクトル長の
      ベクトルについても上と同様な処理をおこなう.
      ただし描くマーカーのマーカータイプは,
      内部変数{\tt 'ITYPE2'}を参照する.
      ({\tt 'LSMALL'}, {\tt RSMALL}, {\tt ITYPE2}の初期値はそれぞれ
      {\tt .FALSE.}, 0.001, 1. )
    \item 作画をおこなう前にすべてのベクトル値のチェックをおこなう.
      次の2つの場合作画はおこなわずその旨メッセージが出力される.
      さらに内部変数{\tt 'LMSG'}が
      {\tt .TRUE.}のときグラフの下部マージンにもメッセージを書く;
      {\tt .FALSE.}のときメッセージを書かない
      (初期値は{\tt .TRUE.}).
      2つの場合とは:
      \begin{itemize}
        \item すべてのベクトルが欠損値ベクトルのとき(missing field).
        \item すべてのベクトルがゼロベクトルのとき(zero field).
      \end{itemize}
    \item 内部変数{\tt 'LUNIT'}が{\tt .TRUE.}ならユニットベクトルを描く;
      {\tt .FALSE.}なら描かない(初期値は{\tt .FALSE.}).
      ユニットベクトルは, 内部変数{\tt 'VXULOC'}, {\tt 'VYILOC'}
      (V座標系におけるx,y座標値:初期値は不定)を陽に指定しなければ
      ビューポートの右下隅から内部変数
      {\tt 'VXUOFF'}, {\tt 'VYUOFF'}で決まる量だけはなれた位置に描かれる
      ({\tt 'VXUOFF'}, {\tt 'VYUOFF'}の初期値は0.02, 0).
      またユニットベクトルの長さは, 内部変数{\tt VXUNIT}, {\tt VYUNIT}で
      決まる(単位はV座標系;初期値は0.05, 0.05).
      ただし内部変数{\tt UXUNIT}, {\tt UYUNIT}が陽に設定されていれば
      それらの値を用いる(初期値は不定).
      {\tt UXUNIT}, {\tt UYUNIT}は{\tt VXUNIT}, {\tt VYUNIT}と違って
      ユニットベクトルが示す次元量の単位で指定する.
      さらに{\tt 'LUNIT'}が{\tt .TRUE.}のとき,
      内部変数{\tt 'LUMSG'}が{\tt .TRUE.}ならユニットベクトルの
      大きさを図の下部マージンに書く(初期値は{\tt .TRUE.});
      {\tt 'LUNIT'}が{\tt .FALSE.}のとき,
      内部変数{\tt 'LMSG'}が{\tt .TRUE.}ならスケーリングファクターを
      図の下部マージンに書く(初期値は{\tt .TRUE.}).
      これらのメッセージは{\tt UXPTTL}
      (\ref{uxyzpack.refLLA.uxpttl}節参照)を使って書く.
      したがって, まず座標軸を描いた後で{\tt UGVECT}を呼ぶべきである.
  \end{enumerate}
\end{enumerate}

\subsection{UGSUT}
%\label{ugpack.refug.ugsut}
\begin{enumerate}
  \item 機能
  \begin{quote}
    ユニットベクトルにつけるタイトルを設定する.
  \end{quote}
  \item 呼び出し方法
  \begin{quote}
    {\tt CALL UGSUT(CSIDE,CTTL)}
  \end{quote}
  \item パラメーターの説明
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt CSIDE} & {\tt (C*1)} & タイトルをつける位置を指定する.
        {\tt 'X'} (X方向のベクトル),
        {\tt 'Y'} (Y方向のベクトル)が指定できる.  \\
      {\tt CTTL} & {\tt (C*(*))} & つけるタイトル.
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item 設定できるタイトルの数は最大10個,
      またタイトルの長さは最大32文字である.
    \item タイトル文字のラインインデクスは,
      内部変数{\tt 'IUINDX'}が決める(初期値は3).
      また, タイトルの回転角はXおよびY方向についてそれぞれ内部変数
      {\tt 'IUTXRO'}, {\tt 'IUTYRO'}が決める
      (初期値はそれぞれ0, 90:単位は度).
  \end{enumerate}
\end{enumerate}

\subsection{UG{\it p}GET/UG{\it p}SET(UG{\it p}STX)}
%\label{ugpack.refug.ugpget}
\begin{enumerate}
  \item 機能
  \begin{quote}
    UGPACKサブルーチンパッケージで使用する内部変数を参照/変更する.
    (\UGPSTX は実行時オプションによる変更を許す. )
  \end{quote}
  \item 呼び出し方法
  \begin{quote}
    {\tt CALL \UGPGET (CP,IPARA)} \\
    {\tt CALL \UGPSET (CP,IPARA)} \\
    {\tt CALL \UGPSTX (CP,IPARA)}
  \end{quote}
  \item パラメーターの説明
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt CP} & {\tt (C*8)} & 内部変数の名前.  \\
      {\tt IPARA} & {\tt (I,R,L)} & 内部変数の値.
    \end{tabular}

    \vspace{1em}
    以下に{\tt CP}として指定できる名前のリストを記す.

    \vspace{1em}
    \begin{tabbing}
      123456789 \= 1234 \=                                         \kill
      {\tt 'INDEX'} \> {\tt (I)} \>
        \parbox[t]{10cm}
        {ベクトルを描く線分のラインインデクス.
        および{\tt 'LMISSP'}, {\tt 'LSMALL'}が{\tt .TRUE.}のときに
        描くマーカーのラインインデクス(初期値は3 ).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'LNRMAL'} \> {\tt (L)} \>
        \parbox[t]{10cm}
        {内部的にスケーリングファクターを決めるかどうかを指定する.
        {\tt .TRUE.}のとき内部的に決める;
        {\tt .FALSE.}のとき内部変数{\tt 'XFACT1'}, {\tt 'YFACT1}を
        参照する(初期値は{\tt .TRUE.}).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'LEQRAT'} \> {\tt (L)} \>
        \parbox[t]{10cm}
        {内部的にスケーリングファクターを決めるとき
        ({\tt 'LNRNAL'}が{\tt .TRUE.}のとき) X方向とY方向の
        スケーリングファクターを同じにするかどうかを指定する.
        {\tt .TRUE.}なら同じにする
        (初期値は{\tt .TRUE.}).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'XFACT1'} \> {\tt (R)} \>
        \parbox[t]{10cm}
        {{\tt 'LNRNAL'}が{\tt .FALSE.}のときに参照する
        X方向のスケーリングファクター(初期値は1.0).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'YFACT1'} \> {\tt (R)} \>
        \parbox[t]{10cm}
        {{\tt 'LNRNAL'}が{\tt .FALSE.}のときに参照する
        Y方向のスケーリングファクター(初期値は1.0).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'XFACT2'} \> {\tt (R)} \>
        \parbox[t]{10cm}
        {実際に用いられるX方向のスケーリングファクター
        (初期値は不定).
        ユーザーが指定しても意味がない.
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'YFACT2'} \> {\tt (R)} \>
        \parbox[t]{10cm}
        {実際に用いられるY方向のスケーリングファクター
        (初期値は不定).
        ユーザーが指定しても意味がない.
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'LMSG'} \> {\tt (L)} \>
        \parbox[t]{10cm}
        {グラフの下部マージンにスケーリングファクターなどの
        タイトルを書くかどうかを指定する.
        {\tt .TRUE.}なら書く;{\tt .FALSE.}なら書かない
        (初期値は{\tt .TRUE.}).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'ICENT'} \> {\tt (I)} \>
        \parbox[t]{10cm}
        {ベクトルの始点を格子点に対してどこにとるか指定する.
        +1ならベクトルの終点が格子点と一致するように描く;
        0ならベクトルの中点が格子点と一致するように描く;
        --1ならベクトルの始点が格子点と一致するように描く
        (初期値は0).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'LMISSP'} \> {\tt (L)} \>
        \parbox[t]{10cm}
        {欠損値ベクトルのとき,
        その格子点にマーカーを描くかどうか
        (欠損値処理をおこなうかどうか)を指定する.
        {\tt .TRUE.}なら描く;{\tt .FALSE.}なら描かない
        (初期値は{\tt .FALSE.}).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'ITYPE1'} \> {\tt (I)} \>
        \parbox[t]{10cm}
        {欠損値処理をおこなうとき, その格子点に描くマーカーの
        マーカータイプ(初期値は5).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'LSMALL'} \> {\tt (L)} \>
        \parbox[t]{10cm}
        {ベクトルの大きさが内部変数{\tt 'RSMALL'}で決まる値以下のとき
        欠損値処理と同じように,
        その格子点にマーカーを描くかどうか指定する.
        {\tt .TRUE.}なら描く;{\tt .FALSE.}なら描かない
        (初期値は{\tt .FALSE.}).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'RSMALL'} \> {\tt (R)} \>
        \parbox[t]{10cm}
        {内部変数{\tt 'LSMALL'}が参照するベクトルの大きさのしきい値
        (初期値は0.001).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'ITYPE2'} \> {\tt (I)} \>
        \parbox[t]{10cm}
        {内部変数{\tt 'LSMALL'}が{\tt .TRUE.}のとき,
        その格子点に描くマーカーのマーカータイプ(初期値は1).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'RSIZEM'} \> {\tt (R)} \>
        \parbox[t]{10cm}
        {{\tt 'LMISSP'}, {\tt 'LSMALL'}が{\tt .TRUE.}のときに描く
        マーカーのマーカーサイズ(初期値は0.01).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'RSIZET'} \> {\tt (R)} \>
        \parbox[t]{10cm}
        {グラフの下部マージンに書くタイトルの文字高
        (単位はV座標系;初期値は不定).
        この内部変数が不定のとき \UZPGETSET の管理する
        内部変数{\tt 'RSIZEL1'}を
        参照する(\ref{uxyzpack.refuz}節参照).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'XTTL'} \> {\tt (R)} \>
        \parbox[t]{10cm}
        {グラフの下部マージンに書くタイトルの位置を決める内部変数.
        --1から+1までの実数値をとりうる.
        --1のとき左よせ, 0のときセンタリング, +1のとき右よせする
        (初期値は0).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'LUNIT'} \> {\tt (L)} \>
        \parbox[t]{10cm}
        {ユニットベクトルを描くかどうかを指定する.
        {\tt .TRUE.}なら描く; {\tt .FALSE.}なら描かない
        (初期値は{\tt .FALSE.}).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'LUMSG'} \> {\tt (L)} \>
        \parbox[t]{10cm}
        {ユニットベクトルを描くときグラフの下部マージンに
        ユニットベクトルの単位を書くかどうかを指定する.
        {\tt .TRUE.}なら書く;{\tt .FALSE.}なら書かない
        (初期値は{\tt .TRUE.}).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'VXULOC'} \> {\tt (R)} \>
        \parbox[t]{10cm}
        {ユニットベクトルの始点のX座標(単位はV座標系;初期値は不定).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'VYULOC'} \> {\tt (R)} \>
        \parbox[t]{10cm}
        {ユニットベクトルの始点のY座標(単位はV座標系;初期値は不定).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'VXUOFF'} \> {\tt (R)} \>
        \parbox[t]{10cm}
        {{\tt 'VXULOC'}, {\tt 'VYULOC'}が陽に指定されていないとき,
        ユニットベクトルをビューポートの右下隅からX方向にどれだけ離すかを
        与えるオフセット値(単位はV座標系;初期値は0.02).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'VYUOFF'} \> {\tt (R)} \>
        \parbox[t]{10cm}
        {{\tt 'VXULOC'}, {\tt 'VYULOC'}が陽に指定されていないとき,
        ユニットベクトルをビューポートの右下隅からY方向にどれだけ離すかを
        与えるオフセット値(単位はV座標系;初期値は0.0).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'UXUNIT'} \> {\tt (R)} \>
        \parbox[t]{10cm}
        {X方向のユニットベクトルの長さ(単位は次元量;初期値は不定).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'UYUNIT'} \> {\tt (R)} \>
        \parbox[t]{10cm}
        {Y方向のユニットベクトルの長さ(単位は次元量;初期値は不定).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'VXUNIT'} \> {\tt (R)} \>
        \parbox[t]{10cm}
        {X方向のユニットベクトルの長さ(単位はV座標系;初期値は0.05).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'VYUNIT'} \> {\tt (R)} \>
        \parbox[t]{10cm}
        {Y方向のユニットベクトルの長さ(単位はV座標系;初期値は0.05).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'IUNTTL'} \> {\tt (I)} \>
        \parbox[t]{10cm}
        {設定されている, ユニットベクトルにつけるタイトルの数.
        ユーザーは値を設定してはいけない.
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'RSIZEUT'} \> {\tt (R)} \>
        \parbox[t]{10cm}
        {ユニットベクトルにつけるタイトルの文字高(単位はV座標系;初期値は不定).
        この内部変数が不定のとき \UZPGETSET の管理する内部変数
        {\tt 'RSIZEL1'}を参照する(\ref{uxyzpack.refuz}節参照).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'IUINDX'} \> {\tt (I)} \>
        \parbox[t]{10cm}
        {ユニットベクトルにつけるタイトルのラインインデクス
        (初期値は3).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'IUTXRO'} \> {\tt (I)} \>
        \parbox[t]{10cm}
        {X方向のユニットベクトルにつけるタイトルの回転角
        (単位は度;初期値は0).
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'IUTYRO'} \> {\tt (I)} \>
        \parbox[t]{10cm}
        {Y方向のユニットベクトルにつけるタイトルの回転角
        (単位は度;初期値は90).
        タイトルの長さが1のときに限って{\tt 'IUTYRO'}は90以外の値を
        とることが許される.
        \rule[-1ex]{0ex}{1ex}} \\
      {\tt 'IUNDEF'} \> {\tt (I)} \>
        \parbox[t]{10cm}
        {値が不定であることを示す内部変数
        (初期値は-999).
        \rule[-1ex]{0ex}{1ex}}
    \end{tabbing}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item 内部変数を管理するための下請けルーチンとして
      以下のものがある.
      \begin{quote}
      \begin{tabular}{lp{8cm}}
        {\tt UGPQNP(NCP)}       &
          内部変数の総数{\tt NCP}を求める. \\
        {\tt UGPQID(CP,IDX)}    &
          内部変数{\tt CP}の位置{\tt IDX}を求める.  \\
        {\tt UGPQCP(IDX,CP)}    &
          {\tt IDX}の位置にある内部変数の名前{\tt CP}を参照する.  \\
        {\tt UGPQVL(IDX,IPARA)} &
          {\tt IDX}の位置にある内部変数の値{\tt IPARA}を参照する.  \\
        {\tt UGPSVL(IDX,IPARA)} &
          {\tt IDX}の位置にある内部変数の値{\tt IPARA}を変更する.  \\
      \end{tabular}
      \end{quote}
    \item \UGPGET は上に述べた{\tt UGPQID}を呼んで
      内部変数の位置を求め, {\tt UGPQVL}によって値を参照する;
      \UGPSET は{\tt UGPQID}を呼んで内部変数の位置を求め,
      {\tt UGPSVL}によって値を設定する.
      したがって指定した内部変数名が見つからないとき,
      エラーメッセージは{\tt UGPQID}が出力する.
    \item {\tt ITYPE}としては適切な型の定数または変数を指定すること.
  \end{enumerate}
\end{enumerate}

\subsection{その他のサブルーチン・関数}

このパッケージにはこのほかに以下の下位ルーチン・関数がある.
ここではその名前をあげるにとどめる.

\vspace{1em}
\begin{quote}
\begin{tabular}{lll}
  {\tt UGVXVY} & {\tt UGUNIT} & {\tt UGDUT}
\end{tabular}
\end{quote}
