2次元ベクトル場を描くメソッド(元サブルーチン) ugvect では, ベクトルの各成分
をV-座標系における単位で表現しています. ただし実際には, V-座標系の単位
に変換した配列を与える必要はなく, スケーリングファクターを与えてやれば
十分です. このスケーリングファクターは, 内部変数 'LNRMAL' が
.true.(初期値)ならば内部的に決定され, .false. ならば内部変
数 'XFACT1', 'YFACT1'を参照します. したがって, このデモプ
ログラム(u2d6)のように, スケーリングファクターを陽に指定する場合
は, uglset ルーチンで 'LNRMAL' を .false. として
ugrset で 'XFACT1' と 'YFACT1' を設定します. ここで
は, u と v の値が1桁違いますから, xfact1=0.5, yfact1=0.05 としました. たとえば, ベクトル (U,V)=(0.1,1) は, V-
座標系単位で (0.05, 0.05) の大きさのベクトルとして表示されます. つまり,
スケーリングファクターとは, 次元量として与えられたベクトルの成分をV-座
標系の単位で表現される矢印の成分に変換するための比例係数なのです.
またこの例では, 内部変数 'LUNIT' を .true. としてユニット
ベクトルを描いています. (この初期値は .false.で, ユニットベクト
ルを描きません.) 表示するユニットベクトルの大きさは, V-座標系の単位を
用いて内部変数 'VXUNIT', 'VYUNIT' をそれぞれ0.1に設定して
います. もしも次元量で指定したいならば, 内部変数 'UXUNIT', 'UYUNIT' を設定することでユニットベクトルを描くこともできます. ugsut ルーチンを用いると, このユニットベクトルにタイトルをつけること
ができます. x成分は 'U', y成分は 'V' としました. なお,
図の下部に表示されているユニットベクトルの大きさXUNIT, YUNIT は次元量
です. この例のように, ユニットベクトルの大きさをV-座標系の単位で指定し
た場合は, それぞれをスケーリングファクターで割った値となります.
UGPACKが図の下に書くメッセージについてですが, ユニットベクトルを描かな いときにはスケーリングファクターが表示され, ユニットベクトルを描くとき にはユニットベクトルの大きさが表示されます. ユニットベクトルを描くとき にも, 内部変数 'LUMSG' を .false. とすることによってスケー リングファクターの表示に切替えることもできます. また, メッセージを何も 描かせたくないときには, 内部変数 'LMSG' を .false. としま す.
# u2d6.rb require "narray" require "numru/dcl" include NumRu include Math nx = 11 ny = 11 xmin = -1 xmax = 1 ymin = -1 ymax = 1 u = NArray.sfloat(nx, ny) v = NArray.sfloat(nx, ny) #-- data --- for j in 0..ny-1 for i in 0..nx-1 x = xmin + (xmax-xmin)*i/(nx-1).to_f y = ymin + (ymax-ymin)*j/(ny-1).to_f u[i,j] = x * 0.1 v[i,j] = -y 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::usdaxs DCL::uglset('LNRMAL', false) DCL::ugrset('XFACT1', 0.5) DCL::ugrset('YFACT1', 0.05) DCL::uglset('LUNIT', true) DCL::ugrset('VXUNIT', 0.1) DCL::ugrset('VYUNIT', 0.1) DCL::ugrset('VXUOFF', 0.06) DCL::ugsut('X', 'U') DCL::ugsut('Y', 'V') DCL::ugvect(u, v) DCL::grclsprogram u2d6