2.2 とりあえず等高線図

2次元のスカラー場を手早くコンタリングして見たいというときには, 等高線 描画パッケージ UDPACK にあるサブルーチン UDCNTR を1つ呼ぶだけで 十分です. 例題として, 球面調和関数の重ね合わせ $ P^{1}_{2}(\sin \phi)\exp (i \lambda) - P_{2}(\sin \phi) $ の実部を描いてみましょう(QUICK3).

      PROGRAM QUICK3

      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 20 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
   20 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 UDCNTR( P, NX, NX, NY )

      CALL GRCLS

      END
PROGRAM QUICK3

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

UDCNTR は等高線図を描くだけで, 枠や座標軸を描いてくれませんから, この例ではまず, いくつかの「おまじない」(GRSWND, GRSVPT, GRSTRN, GRSTRF)で座標系を決め, USPACKのルーチン USDAXS を使っておまかせの座標軸を描画したのちに, UDCNTR を呼ん で等高線図を描いています.

UDCNTR の引数は, 最初のP が作画しようとする場を与える2次元 配列, 2番目のNX が実際に宣言した配列の第1次元寸法, 3, 4番目の NX, NY がそれぞれ, 作画に使う配列の第1次元および第2次元寸 法です. この例のように, 宣言した配列をフルに用いて作画するときは, 2番 目と3番目の引数は同じになりますが, 第1次元目の寸法をこのように2つの引 数で指定するといいことがあります. その利点は第9.3節で説 明します.

この例のように UDCNTR だけを呼ぶ場合には, 等間隔の格子点を設定し てコンタリングを行ないます. つまり, 座標軸の目盛に関係なく, P(1,1) が左下隅, P(NX,NY) が右上隅にくるような等間隔の格子点座 標が設定されます. また, コンターレベルも自動的に決定されて, 図の下にそ のコンター間隔が表示されます.

GRPH1 の ユーザーインターフェイス SGPACK には, 折れ線を描いたり文字列 を描いたりする機能の他にも, 多角形閉領域のぬりつぶしを行なう機能があり ます. UEPACK はこれに対応するトーンぬりつぶしの上位ルーチンですが, QUICK3 の例で UETONE サブルーチンを1つ呼ぶだけで, とりあえ ず負の領域に斜線のハッチをつけることができます(QUICK4). ここで UETONE を呼ぶのが31行めで, 座標軸やコンターを描くよりも前である ことに注意しておきましょう. これらの順序を変えると, 出力装置によっては 結果が異なります. それまでに描いた部分がぬりつぶされ消されてしまうこと があるのです. この点については, 第3.5節, 第 10.1節で詳しく説明します.

UDPACK や UEPACK, UWPACK の諸機能を使うことによって, 高度な等高線図が 描けるようになります. カラーグラフィクスが利用できる環境では, このよう な等高線図を色の塗り分け(カラー グラデーション)で表現することも可能に なります. これらは, 第9, 10, 12章で説 明することにしましょう.

      PROGRAM QUICK4

      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 20 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
   20 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 UETONE( P, NX, NX, NY )
      CALL USDAXS
      CALL UDCNTR( P, NX, NX, NY )

      CALL GRCLS

      END
PROGRAM QUICK4



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