地球流体の分野では, 測器にトラブルがあったり観測出来なかったりして, デー タに欠損が生じることがしばしば起こります. その時, 適当な欠損値を与えて データの継続性を保つことが一般的に行なわれますが, そのようなデータを解 析するのは結構面倒なものです. DCLには, 強力な欠損値処理機能があります. どのように欠損値が処理できるのか, この章ではグラフィクスルーチンに限っ て説明しましょう.
データの中に欠損がある場合には, MATH1 の SYSLIB サブルーチンパッケージ にある GLLSET ルーチンで欠損値処理の指定に関する内部変数 'LMISS' を .TRUE. にして, 欠損値処理を有効にします. 欠損値処理 の制御は SGPACK だけでなく DCL 全体で統一的に行われるために, 欠損値処 理に関する内部変数の管理はSGpGET/SGpSET ではなく GLpGET/GLpSET で行われています(p は I, R, L または C).
このように指定すると, データの値が999.であるものは欠損値と見なして, こ
れから見るような欠損値処理を行ないます. 欠損値999.が実際のデータ範囲に
入っていて, 別の値にしたい場合には, GLRSET ルーチンによって実数
の欠損値をあらわす内部変数 'RMISS' を変更します.
まず, MISS1プログラムを例に, ポリラインとポリマーカーのプリミティ
ブで欠損値処理がどのように行なわれるか見てみましょう. 第3
章で用いた正弦関数のデータに欠損値 999.を埋め込みます. データの1/4のと
ころでは3点連続して欠損値とし, 3/4のところでは, 有効な点が欠損値データ
に挟まれて1点だけ孤立しているように与えます.
欠損値処理をしない(デフォルト)で SGPLU と SGPMU のルーチン
を呼んだ結果が上の2つです. 他のデータと比べて999.は非常に大きな値です
から, ポリラインではほぼ真上に線を引いて最大作画範囲を飛び出しています.
また, ポリマーカーでもこれらの点は作画範囲を飛び出してしまって描かれま
せん.
GLLSET ルーチンで内部変数 'LMISS' を .TRUE. にして,
欠損値処理を行なって描いた結果が下の2つです. ポリラインでは欠損値の前
後を線で結びません. 有効な点が1点だけ孤立している場合には, その点を結
ぶことができないので, そこには何も描かれません. また, ポリマーカーでは
欠損値の点にはマーカーを打ちません. この例では, ポリマーカーの結果はど
ちらも同じですが, 欠損値を小さくして2.とすると違いは明らかです.
program sample_2d02 use dcl integer,parameter :: nx=18, ny=18 real,parameter :: xmin=0, xmax=360, dx1=10, dx2=60 real,parameter :: ymin=-90, ymax=90 real,parameter :: pi=3.141592, drad=pi/180, dz=0.05 integer,parameter :: my=6, nc=3 real :: p(0:nx, 0:ny), uy1(0:ny), uy2(0:my) character(len=nc),dimension(0:my) :: ch ch = (/ 'SP ', '60S', '30S', 'EQ ', '30N', '60N', 'NP ' /) do j = 0, ny alat = ( ymin + (ymax-ymin) * j/ny ) * drad slat = sin(alat) uy1(j) = slat do i = 0, nx alon = ( xmin + (xmax-xmin) * i/nx ) * drad p(i,j) = cos(alon) * (1-slat**2) * sin(2*pi*slat) + dz end do end do do j = 0, my alat = ( ymin + (ymax-ymin) * j/my ) * drad slat = sin(alat) uy2(j) = slat end do call DclOpenGraphics() call DclNewFrame call DclSetWindow( xmin, xmax, uy1(1), uy1(ny) ) call DclSetViewPort( 0.2, 0.8, 0.2, 0.8 ) call DclSetTransFunction call DclDrawAxis( 'bt', dx2, dx1 ) call DclDrawTitle( 'b', 'LONGITUDE', 0.0 ) call DclDrawAxisSpecify( 'lr', uy2, uy1, ch ) call DclDrawTitle( 'l', 'LATITUDE', 0.0 ) call DclSetXEvenGrid( xmin, xmax, nx+1 ) call DclSetYGrid( uy1 ) call DclSetContourLabelFormat( '(f6.1)' ) call DclSetContourLevel( p, 0.2 ) call DclSetContourLine( 0.1, index=1, type=4, height=0.01 ) call DclDrawContour( p ) call DclCloseGraphics end program |
DclDrawLine (SGPLU,SGPLZU) |
ユーザー座標系で折れ線を描く. |
DclSetLineType (SGSPLT) |
折れ線のラインタイプを設定する. |
DclSetLineIndex (SGSPLI) |
折れ線のラインインデクスの設定する. |
* 括弧の中は、対応するf77インターフェイス名.