%表題   らくらく電能ライブラリ
%
%履歴
%\Drireki{
%         95/04/13 余田 成男
%        }
%
%\Dchapter{2次元量の表示}
\Dchapterhead
\label{c:u2d1}

第\ref{c:quick}章で見たように, 2次元データを手早くコンタリングしたいと
いうときには, サブルーチン {\tt UDCNTR} を呼ぶだけで, とりあえず等高線
図が得られました. これは, GRPH2 の2次元等高線図描画ルーチンパッケージ
UDPACK に含まれるサブルーチンです. ここでは, UDPACK のいくつかの機能を
簡単なプログラム例で示します.

なお, UDPACK はU-座標系で作画していますから, 第\ref{c:map3d}章で簡単に
ふれる地図投影にも対応できます.

%-----------------------------------------------------------------------
\section{コンターラインをコントロール}

第\ref{s:quick_con}節で扱ったデータを用いて, コンターラインをユーザー
の好みで制御することを考えてみましょう({\tt U2D1}).

\Dproginput{u2d1/u2d1.f}
\vspace*{1em}

\begin{center}
\Depsf[10cm]{u2d1/u2d1_0001.eps}\\
{\bf u2d1.f: frame1}\\
\end{center}

デフォルトではラベル付きの太線が1本おきに引かれますが, これをメジャー
ラインとよびます. このメジャーラインに付いているコンターラベルのフォー
マットは, {\tt UDSFMT} ルーチンで設定できます. 29行めのように, 指定す
るフォーマットを文字型で与えます. コンターラインにつけるラベルは, コン
ターレベルを決定するルーチンの中で生成されますから, {\tt UDSFMT} ルー
チンはコンターラインを生成するルーチン({\tt UDGCLA} や {\tt UDGCLB})の
前に呼ばなければなりません.
\vspace{1em}

コンターラインの生成ですが, ここでは, {\tt UDGCLA} ルーチンで等間隔の
コンターレベルを生成します. 最初の2つの引数がコンターレベルの最小値と
最大値で, 30行めの例では負のコンターは描かれません. 最後の引数は刻み
幅ですが, これが負の時にはその絶対値程度の本数のコンターレベルを生成し
ます.
\vspace{1em}

これらのルーチンでは, 等間隔のコンターレベルしか生成されません. もしも,
不等間隔のコンターレベルを指定したい場合や, 特定のコンターレベルを追加
したい場合は, 31行めのように {\tt UDSCLV} ルーチンで1本1本のコンターレ
ベルを生成します. 最初の引数がコンターレベルの値で, 残りの4つがコンター
ラインの属性です. 順に, ラインインデクス, ラインタイプ, ラベル, V-座標
系におけるラベルの大きさ, です. 逆に, ある1本のコンターレベルを無効に
するには {\tt UDDCLV} ルーチンを呼びます. 引数はコンターレベルの値で,
この例では, 0.6の等高線を描いていません. また, すべてのコンターレベル
を無効にするには {\tt UDICLV} ルーチンを呼びます.
\vspace{1em}

あとは, 同じ {\tt UDCNTR} ルーチンを呼ぶだけです.
このプログラムを実行すると, 次のようなメッセージが出るはずです.
\begin{quote}
{\tt
 *** MESSAGE (UDCNTR) ***  INAPPROPRIATE DATA WILL BE MODIFIED INTERNALLY. \\
 *** MESSAGE (-CNT.-) ***  Z(  1,  1)= -1.00000000     ===>  -1.00000119
}
\end{quote}
{\tt UDCNTR} では, ある格子点での値がコンターレベルと等しい時に, 格子
点値をわずかにずらして作画し, このようなメッセージを出力します. たいて
いの場合, このメッセージを気にする必要はありません.
\vspace{1em}
\vspace{1em}


もう少しコンターラインにこだわってみましょう. 次のプログラム {\tt
U2D2} では, 内部変数を変更することにより, コンターラインをコントロール
しています. UDPACK サブルーチンパッケージで使用する内部変数の参照と変
更は, {\tt UDpGET} と {\tt UDpSET} のルーチンで行ないます. ここで,
{\tt p} は, 内部変数の型によって {\tt L}(論理型), {\tt I}(整数型),
{\tt R}(実数型)のどれかをとります. この例では, 内部変数 {\tt 'LABEL'}
を {\tt .FALSE.} にして, メジャーラインにラベルを付けないようにします.
{\tt 'LDASH'} も {\tt .FALSE.} にして正も負も同じラインタイプでコンター
ラインを描くことにします. また, その時のラインタイプを {\tt 'ISOLID'}
で2(破線)と指定しています. さらに, {\tt 'ICYCLE'} を4として, 4本に1本
の割合でメジャーラインを引くことにします.  結果は, 正負の区別もつかず,
わけのわからない等高線図となってしまいましたが, このような機能もあると
いうデモンストレーションです.

\Dproginput{u2d1/u2d2.f}

\begin{center}
\Depsf[10cm]{u2d1/u2d2_0001.eps}\\
{\bf u2d2.f: frame1}\\
\end{center}
\vspace*{2em}

%-----------------------------------------------------------------------
\section{格子点が不等間隔の場合}

UWPACK は2次元の格子点座標に関する情報を管理するサブルーチンパッケージ
です. {\tt UDCNTR} ルーチンを呼ぶ前に UWPACK のサブルーチンを呼んで格
子点の座標値をあらかじめ指定しておけば, 不等間隔な格子点でもコンタリン
グが可能です({\tt U2D3}).

\Dproginput{u2d1/u2d3.f}
\vspace{1em}

この例では, これまでと同じ2次元配列データですが, $y$方向にはサイン緯度
($-1$から1の値を取る)の座標系を設定してコンタリングをおこないます. ま
ず, 配列 {\tt UY1} に格子点の座標をU-座標系の値で用意します. {\tt UY2}
は, {\tt UYAXLB} ルーチンで$y$座標軸のラベルを描くために, その座標値を
用意する配列です. 40行めでは{\tt UYAXDV} ルーチンでサイン緯度の座標軸
を等間隔に刻んで描きます. 次に, 右側の$y$座標軸にラベルが描けるように
して, {\tt UYAXLB} ルーチンでデータのある格子点に目盛をつけ, 緯度30度
毎にラベルをつけます.
\vspace{1em}

次に, $x$方向については, {\tt UWSGXB} ルーチンを用いて, 最小値, 最大値
および格子点数を指定することによって, 格子点座標に関する情報を設定しま
す. ただし, ここでは格子点をウインドウいっぱいに設定するようにしている
だけなので, {\tt UWSGXB} ルーチンを呼ばなくても結果は同じです. そして,
{\tt UWSGYA} ルーチンを用いて不等間隔の格子点を設定しています. 引数は,
座標値を指定する配列名 {\tt UY1} とその長さです. $x$軸に不等間隔の格子
点を設定するには, {\tt UWSGXA} ルーチンを用います.
\vspace{1em}

あとは, {\tt UDCNTR} ルーチンを呼ぶと, 格子点が不等間隔の場合でも御覧
のように等高線図が描かれます.
\vspace{1em}

\begin{center}
\Depsf[10cm]{u2d1/u2d3_0001.eps}\\
{\bf u2d3.f: frame1}\\
\end{center}


%-----------------------------------------------------------------------
\section{配列の一部分だけを描く}
\label{s:u2d1_bubun}

配列の一部分だけを作画するにはどうしたらよいのでしょう? これまでと同じ
データで, その一部分だけを描くことを考えてみましょう({\tt U2D4}).
\vspace{1em}

経度80$^{\circ}$から320$^{\circ}$, 緯度$-60^{\circ}$から60$^{\circ}$の
部分だけを描くことにします. 6行めのパラメータ文で与えているように, 格
子点の範囲は$x$方向に$9 \leq i \leq 33$, $y$方向に$7 \leq j \leq 31$と
なります. ウインドウの設定をこの範囲とし, 36行めの{\tt UDCNTR} ルーチ
ンで等高線図を描くのですが, ここで一工夫が必要です. 最初の引数としては,
この矩形領域の左下に対応する配列要素 {\tt P(KXMN,KYMN)} を陽に与え, 2
番めには実際に宣言した配列の第1次元寸法 {\tt NX}, 3, 4番めには実際の作
画に使う配列の第1次元および第2次元寸法 {\tt (KXMX-KXMN+1,KYMX-KYMN+1)}
を与えることによって配列の一部分だけを作画することができます.
\vspace{1em}

この辺の事情を正しく理解するためには, FORTRAN において, 2次元の配列要
素が記憶領域上でどのように順序づけられ, サブルーチンの引数にある配列が
どのように扱われているかを知る必要があります. FORTRAN マニュアルなどを
参照してください.

\Dproginput{u2d1/u2d4.f}

\begin{center}
\Depsf[10cm]{u2d1/u2d4_0001.eps}\\
{\bf u2d4.f: frame1}\\
\end{center}
