%表題   らくらくDCL
%
%履歴
%\Drireki{
%         95/04/13 余田 成男
%        }
%
%\Dchapter{欠損値処理いろいろ}
\Dchapterhead

地球流体の分野では, 測器にトラブルがあったり観測出来なかったりして, デー
タに欠損が生じることがしばしば起こります. その時, 適当な欠損値を与えて
データの継続性を保つことが一般的に行なわれますが, そのようなデータを解
析するのは結構面倒なものです. DCLには, 強力な欠損値処理機能があります.
どのように欠損値が処理できるのか, この章ではグラフィクスルーチンに限っ
て説明しましょう.

%-----------------------------------------------------------------------
\section{ポリライン・ポリマーカーにおける欠損値処理}

データの中に欠損がある場合には, MATH1 の SYSLIB サブルーチンパッケージ
にある {\tt GLLSET} ルーチンで欠損値処理の指定に関する内部変数 {\tt
'LMISS'} を {\tt .TRUE.} にして, 欠損値処理を有効にします. 欠損値処理
の制御は SGPACK だけでなく DCL 全体で統一的に行われるために, 欠損値処
理に関する内部変数の管理は{\tt SGpGET/}{\tt SGpSET} ではなく {\tt
GLpGET/}{\tt GLpSET} で行われています({\tt p} は {\tt I}, {\tt R},
{\tt L} または {\tt C}).

\vspace{1em}

このように指定すると, データの値が999.であるものは欠損値と見なして, こ
れから見るような欠損値処理を行ないます. 欠損値999.が実際のデータ範囲に
入っていて, 別の値にしたい場合には, {\tt GLRSET} ルーチンによって実数
の欠損値をあらわす内部変数 {\tt 'RMISS'} を変更します.
\vspace{1em}

まず, {\tt MISS1}プログラムを例に, ポリラインとポリマーカーのプリミティ
ブで欠損値処理がどのように行なわれるか見てみましょう. 第\ref{c:kihon1}
章で用いた正弦関数のデータに欠損値 999.を埋め込みます. データの1/4のと
ころでは3点連続して欠損値とし, 3/4のところでは, 有効な点が欠損値データ
に挟まれて1点だけ孤立しているように与えます.

\Dproginput{miss/miss1.f}

\begin{center}
\Depsf[10cm]{miss/miss1_0001.eps}\\
{\bf miss1.f: frame1}\\
\end{center}

欠損値処理をしない(デフォルト)で {\tt SGPLU} と {\tt SGPMU} のルーチン
を呼んだ結果が上の2つです. 他のデータと比べて999.は非常に大きな値です
から, ポリラインではほぼ真上に線を引いて最大作画範囲を飛び出しています.
また, ポリマーカーでもこれらの点は作画範囲を飛び出してしまって描かれま
せん.
\vspace{1em}

{\tt GLLSET} ルーチンで内部変数 {\tt 'LMISS'} を {\tt .TRUE.} にして,
欠損値処理を行なって描いた結果が下の2つです. ポリラインでは欠損値の前
後を線で結びません. 有効な点が1点だけ孤立している場合には, その点を結
ぶことができないので, そこには何も描かれません. また, ポリマーカーでは
欠損値の点にはマーカーを打ちません. この例では, ポリマーカーの結果はど
ちらも同じですが, 欠損値を小さくして2.とすると違いは明らかです.


%-----------------------------------------------------------------------
\section{2次元量表示における欠損値処理}

格子点の値が欠損値のときでも, 欠損値処理の指定をすることによって,
UDPACK や UEPACK, UGPACK にある2次元量表示サブルーチンでも欠損値処理を
して作図できます.
\vspace{1em}

プログラム {\tt MISS2} の例では, 基本的には第\ref{s:quick_con}節の
{\tt QUICK4} と同じプログラム構成で, ただし格子点値の一部分を欠損値
{\tt RMISS} (この値は{\tt GLRGET} ルーチンで設定されている実数欠損値を
参照しました)として, 欠損値処理の指定をおこなって作画しています. 欠損
値処理の指定は, やはり {\tt GLLSET} ルーチンによって内部変数 {\tt
'LMISS'} を {\tt .TRUE.} とすることによっておこないます. この実行結果
からもわかるように, 欠損値のまわりの格子点を境界としてコンターやトーン
が描かれません.

\Dproginput{miss/miss2.f}
\vspace*{3em}

\begin{center}
\Depsf[10cm]{miss/miss2_0001.eps}\\
{\bf miss2.f: frame1}\\
\end{center}

2次元ベクトル場を作画する UGPACK でも, 同様の欠損値処理を行ないます.
{\tt UGVECT} ルーチンでは, ベクトルの少なくとも1成分が欠損値の時にはベ
クトルを描きません. {\tt UGLSET} ルーチンで UGPACK に関する内部変数
{\tt 'LMISSP'} を {\tt .TRUE.} にすると, 欠損値ベクトルの格子点にマー
カー $\times$ を描きます. この印のマーカータイプやマーカーサイズは,
やはり, {\tt UGISET}, {\tt UGRSET} ルーチンでそれぞれ対応する内部変数
{\tt 'ITYPE1'}, {\tt 'RSIZEM'} を設定することにより変更できます.
