格子点の値が欠損値のときでも, 欠損値処理の指定をすることによって,
UDPACK や UEPACK, UGPACK にある2次元量表示メソッド(元サブルーチン)でも欠損値処理を
して作図できます.
プログラム miss2 の例では, 基本的には第2.2節の quick4 と同じプログラム構成で, ただし格子点値の一部分を欠損値 rmiss (この値はglrget ルーチンで設定されている実数欠損値を 参照しました)として, 欠損値処理の指定をおこなって作画しています. 欠損 値処理の指定は, やはり gllset ルーチンによって内部変数 'LMISS' を .true. とすることによっておこないます. この実行結果 からもわかるように, 欠損値のまわりの格子点を境界としてコンターやトーン が描かれません.
# miss2.rb
require "narray"
require "numru/dcl"
include NumRu
include Math
nx = 37
ny = 37
xmin = 0
xmax = 360
ymin = -90
ymax = 90
drad = PI/180
p = NArray.sfloat(nx, ny)
rmiss = DCL::glrget('RMISS')
DCL::gllset('LMISS', true)
#-- data ---
for j in 0..ny-1
for i in 0..nx-1
alon = (xmin + (xmax-xmin)*i/(nx-1)) * drad
alat = (ymin + (ymax-ymin)*j/(ny-1)) * drad
slat = sin(alat)
p[i,j] = 3*sqrt(1-slat**2)*slat*cos(alon) - 0.5*(3*slat**2-1)
if ( i == 5 && j == 5 )
p[i,j] = rmiss
end
if ( ( 7 <= i && i <= 23) && j == 29 )
p[i,j] = rmiss
end
if( (21 <= i && i <= 29) && (11 <= j && j <= 19))
p[i,j] = rmiss
end
end
end
#-- graph ---
iws = (ARGV[0] || (puts ' WORKSTATION ID (I) ? ;'; DCL::sgpwsn; gets)).to_i
DCL::gropn iws
DCL::grfrm
DCL::grswnd(xmin, xmax, ymin, ymax)
DCL::grsvpt(0.2, 0.8, 0.2, 0.8)
DCL::grstrn(1)
DCL::grstrf
DCL::uetone(p)
DCL::usdaxs
DCL::udcntr(p)
DCL::grcls
program miss2
2次元ベクトル場を作画する UGPACK でも, 同様の欠損値処理を行ないます. ugvect ルーチンでは, ベクトルの少なくとも1成分が欠損値の時にはベ クトルを描きません. uglset ルーチンで UGPACK に関する内部変数 'LMISSP' を .true. にすると, 欠損値ベクトルの格子点にマー カー × を描きます. この印のマーカータイプやマーカーサイズは, やはり, ugiset, ugrset ルーチンでそれぞれ対応する内部変数 'ITYPE1', 'RSIZEM' を設定することにより変更できます.