6.1 等高線図

格子点で与えられた2次元のスカラーデータを手早く等高線図で描きたいとい うときには, メソッド(元サブルーチン) udcntr を呼びます(u2d1). udcntr ルーチンは等高線を描くだけですから, まず正規化変換を設定します. ウインドウはgrswnd ルーチンで[tmin,tmax]×[zmin,zmax]( [0,5]×[20,50])と陽に設定 しますが, ビューポート([0.2,0.8,] ×[0.2,0.8,] )と変換メソッド(元関数)番号(1: 直角一様座標)は括弧内の初期値を用いるので, uspfit ルーチンを呼び, さらに grstrf ルーチンでこれらを確定しています.

次に, ussttl ルーチンで座標軸タイトルの情報を与え, usdaxs ルーチンでおまかせの座標軸を描きます.

そして, 最後に udcntr ルーチンを呼んで等高線を描きます. 現在設定 されているウインドウいっぱいに等間隔の格子点が設定されて,コンタリング が行なわれます. つまり, 座標軸の目盛に関係なく, U(1,1) が左下隅, U(NT,NZ) が右上隅にくるように等間隔の格子点座標が設定されます. コンターレベルは自動的に決定され, 図の下にそのコンター間隔が表示されま す. udcntr の引数の2番目以降で配列の寸法を指定しますが, 第1次元 寸法を2度指定するのは, 配列の一部分だけを作画できるようにするためです. この例のようにデータ全部を描く場合は, 2番目の引数と3番目の引数を同じ (nt)にします.

# u2d1.rb

require "narray"
require "numru/dcl"

include NumRu
include NMath

nt = 51
nz = 21
tmin = 0.0
tmax = 5.0
zmin = 20.0
zmax = 50.0
dt = (tmax-tmin)/(nt-1)
dz = (zmax-zmin)/(nz-1)

u = NArray.sfloat(nt, nz)

#-- data ----
zj = NArray.sfloat(nz).indgen! * dz
uz = exp(-0.2*zj)*(zj**0.5)
tz = -2.0*exp(-0.1*zj)
for i in 0..nt-1
  u[i,true] = uz*sin(3.0*(tz+i*dt))
end

#-- graph ----
iws = (ARGV[0] || (puts ' WORKSTATION ID (I)  ? ;'; DCL::sgpwsn; gets)).to_i
DCL::gropn iws
DCL::grfrm

DCL::grswnd(tmin, tmax, zmin, zmax)
DCL::uspfit
DCL::grstrf

DCL::ussttl('TIME', 'YEAR', 'HEIGHT', 'km')
DCL::usdaxs

DCL::udcntr(u)

DCL::grcls

 
program u2d1

\resizebox{10cm}{!}{\includegraphics{u2d/u2d1.eps}}
u2d1.rb: frame1