9.1 コンターラインをコントロール

第2.2節で扱ったデータを用いて, コンターラインをユーザー の好みで制御することを考えてみましょう(U2D1).

      PROGRAM U2D1

      PARAMETER( NX=37, NY=37 )
      PARAMETER( XMIN=0, XMAX=360, YMIN=-90, YMAX=90 )
      PARAMETER( PI=3.14159, DRAD=PI/180 )
      REAL P(NX,NY)

      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)
        P(I,J) = 3*SQRT(1-SLAT**2)*SLAT*COS(ALON) - 0.5*(3*SLAT**2-1)
   10 CONTINUE

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

      CALL GROPN( IWS )
      CALL GRFRM

      CALL GRSWND( XMIN, XMAX, YMIN, YMAX )
      CALL GRSVPT(  0.2,  0.8,  0.2,  0.8 )
      CALL GRSTRN( 1 )
      CALL GRSTRF

      CALL USDAXS
      CALL UDSFMT( '(F4.1)' )
      CALL UDGCLA( 0., 1.4, 0.2 )
      CALL UDSCLV( -1., 3, 4, 'abc', 0.028 )
      CALL UDDCLV( 0.6 )
      CALL UDCNTR( P, NX, NX, NY )

      CALL GRCLS

      END
PROGRAM U2D1

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

デフォルトではラベル付きの太線が1本おきに引かれますが, これをメジャー ラインとよびます. このメジャーラインに付いているコンターラベルのフォー マットは, UDSFMT ルーチンで設定できます. 29行めのように, 指定す るフォーマットを文字型で与えます. コンターラインにつけるラベルは, コン ターレベルを決定するルーチンの中で生成されますから, UDSFMT ルー チンはコンターラインを生成するルーチン(UDGCLA や UDGCLB)の 前に呼ばなければなりません.

コンターラインの生成ですが, ここでは, UDGCLA ルーチンで等間隔の コンターレベルを生成します. 最初の2つの引数がコンターレベルの最小値と 最大値で, 30行めの例では負のコンターは描かれません. 最後の引数は刻み 幅ですが, これが負の時にはその絶対値程度の本数のコンターレベルを生成し ます.

これらのルーチンでは, 等間隔のコンターレベルしか生成されません. もしも, 不等間隔のコンターレベルを指定したい場合や, 特定のコンターレベルを追加 したい場合は, 31行めのように UDSCLV ルーチンで1本1本のコンターレ ベルを生成します. 最初の引数がコンターレベルの値で, 残りの4つがコンター ラインの属性です. 順に, ラインインデクス, ラインタイプ, ラベル, V-座標 系におけるラベルの大きさ, です. 逆に, ある1本のコンターレベルを無効に するには UDDCLV ルーチンを呼びます. 引数はコンターレベルの値で, この例では, 0.6の等高線を描いていません. また, すべてのコンターレベル を無効にするには UDICLV ルーチンを呼びます.

あとは, 同じ UDCNTR ルーチンを呼ぶだけです. このプログラムを実行すると, 次のようなメッセージが出るはずです.

*** MESSAGE (UDCNTR) *** INAPPROPRIATE DATA WILL BE MODIFIED INTERNALLY.
*** MESSAGE (-CNT.-) *** Z( 1, 1)= -1.00000000 ===> -1.00000119
UDCNTR では, ある格子点での値がコンターレベルと等しい時に, 格子 点値をわずかにずらして作画し, このようなメッセージを出力します. たいて いの場合, このメッセージを気にする必要はありません.



もう少しコンターラインにこだわってみましょう. 次のプログラム U2D2 では, 内部変数を変更することにより, コンターラインをコントロール しています. UDPACK サブルーチンパッケージで使用する内部変数の参照と変 更は, UDpGET と UDpSET のルーチンで行ないます. ここで, p は, 内部変数の型によって L(論理型), I(整数型), R(実数型)のどれかをとります. この例では, 内部変数 'LABEL' を .FALSE. にして, メジャーラインにラベルを付けないようにします. 'LDASH' も .FALSE. にして正も負も同じラインタイプでコンター ラインを描くことにします. また, その時のラインタイプを 'ISOLID' で2(破線)と指定しています. さらに, 'ICYCLE' を4として, 4本に1本 の割合でメジャーラインを引くことにします. 結果は, 正負の区別もつかず, わけのわからない等高線図となってしまいましたが, このような機能もあると いうデモンストレーションです.

      PROGRAM U2D2

      PARAMETER( NX=37, NY=37 )
      PARAMETER( XMIN=0, XMAX=360, YMIN=-90, YMAX=90 )
      PARAMETER( PI=3.14159, DRAD=PI/180 )
      REAL P(NX,NY)

      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)
        P(I,J) = 3*SQRT(1-SLAT**2)*SLAT*COS(ALON) - 0.5*(3*SLAT**2-1)
   10 CONTINUE

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

      CALL GROPN( IWS )
      CALL GRFRM

      CALL GRSWND( XMIN, XMAX, YMIN, YMAX )
      CALL GRSVPT(  0.2,  0.8,  0.2,  0.8 )
      CALL GRSTRN( 1 )
      CALL GRSTRF

      CALL USDAXS
      CALL UDLSET( 'LABEL', .FALSE. )
      CALL UDLSET( 'LDASH', .FALSE. )
      CALL UDISET( 'ISOLID', 2 )    
      CALL UDISET( 'ICYCLE', 4 )    
      CALL UDCNTR( P, NX, NX, NY )

      CALL GRCLS

      END
PROGRAM U2D2

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