9.2 格子点が不等間隔の場合

UWPACK は2次元の格子点座標に関する情報を管理するサブルーチンパッケージ です. UDCNTR ルーチンを呼ぶ前に UWPACK のサブルーチンを呼んで格 子点の座標値をあらかじめ指定しておけば, 不等間隔な格子点でもコンタリン グが可能です(U2D3).

      PROGRAM U2D3

      PARAMETER( NX=37, NY=37, MY=7 )
      PARAMETER( XMIN=0, XMAX=360, YMIN=-90, YMAX=90 )
      PARAMETER( PI=3.14159, DRAD=PI/180 )
      REAL      P(NX,NY), UY1(NY), UY2(MY)
      CHARACTER CH(MY)*3

      DATA      CH/ 'SP ', '60S', '30S', 'EQ ', '30N', '60N', 'NP ' /

      DO 10 J=1,NY
      DO 10 I=1,NX
        ALON = ( XMIN + (XMAX-XMIN)*(I-1)/(NX-1) ) * DRAD
        ALAT = ( YMIN + (YMAX-YMIN)*(J-1)/(NY-1) ) * DRAD
        SLAT = SIN(ALAT)
        UY1(J) = SLAT
        P(I,J) = 3*SQRT(1-SLAT**2)*SLAT*COS(ALON) - 0.5*(3*SLAT**2-1)
   10 CONTINUE

      DO 20 J=1,MY
        UY2(J) = SIN( ( YMIN + (YMAX-YMIN)*(J-1)/(MY-1) ) * DRAD )
   20 CONTINUE

      WRITE(*,*) ' WORKSTATION ID (I)  ? ;'
      CALL SGPWSN
      READ (*,*) IWS

      CALL GROPN( IWS )
      CALL GRFRM

      CALL GRSWND( XMIN, XMAX, -1.,  1. )
      CALL GRSVPT(  0.2,  0.8, 0.2, 0.8 )
      CALL GRSTRN( 1 )
      CALL GRSTRF

      CALL UXAXDV( 'B', 10., 60. )
      CALL UXAXDV( 'T', 10., 60. )
      CALL UXSTTL( 'B', 'LONGITUDE', 0. )

      CALL UYAXDV( 'L', 0.1, 0.5 )
      CALL UYSTTL( 'L', 'SINE LATITUDE', 0. )

      CALL UZLSET( 'LABELYR', .TRUE. )
      CALL UYAXLB( 'R', UY1, NY, UY2, CH, 3, MY )
      CALL UYSTTL( 'R', 'LATITUDE', 0. )

      CALL UWSGXB( XMIN, XMAX, NX )
      CALL UWSGYA( UY1, NY )

      CALL UDCNTR( P, NX, NX, NY )

      CALL GRCLS

      END
PROGRAM U2D3

この例では, これまでと同じ2次元配列データですが, y方向にはサイン緯度 (-1から1の値を取る)の座標系を設定してコンタリングをおこないます. ま ず, 配列 UY1 に格子点の座標をU-座標系の値で用意します. UY2 は, UYAXLB ルーチンでy座標軸のラベルを描くために, その座標値を 用意する配列です. 40行めではUYAXDV ルーチンでサイン緯度の座標軸 を等間隔に刻んで描きます. 次に, 右側のy座標軸にラベルが描けるように して, UYAXLB ルーチンでデータのある格子点に目盛をつけ, 緯度30度 毎にラベルをつけます.

次に, x方向については, UWSGXB ルーチンを用いて, 最小値, 最大値 および格子点数を指定することによって, 格子点座標に関する情報を設定しま す. ただし, ここでは格子点をウインドウいっぱいに設定するようにしている だけなので, UWSGXB ルーチンを呼ばなくても結果は同じです. そして, UWSGYA ルーチンを用いて不等間隔の格子点を設定しています. 引数は, 座標値を指定する配列名 UY1 とその長さです. x軸に不等間隔の格子 点を設定するには, UWSGXA ルーチンを用います.

あとは, UDCNTR ルーチンを呼ぶと, 格子点が不等間隔の場合でも御覧 のように等高線図が描かれます.

\resizebox{10cm}{!}{\includegraphics{u2d1/u2d3.eps}}
u2d3.f: frame1