*%表題   等値線図を描く
*%
*%履歴   91/04/25 佐藤正樹       C:\FORT\OORT\MCNTR.FOR
*%       91/05/21 佐藤正樹       C:\FORT\OORT\GYZCNTR.FOR
*%
*%
*-----------------------------------------------------------------------
      PROGRAM  GYZCNTR
*
      INTEGER  NXMAX         ! 座標配列の次元の上限
      PARAMETER(  NXMAX   = 100 )
      REAL  XXX(1:NXMAX)      ! 第1次元配列
      REAL  YYY(1:NXMAX)      ! 第2次元配列

      INTEGER  NZMAX         ! 2次元配列の次元の上限
      PARAMETER(  NZMAX   = 1000 )
      REAL  GDATA(1:NZMAX)    ! 2次元配列



      INTEGER  IDIM           ! データ次元数
      INTEGER  JDIM
      INTEGER  KDIM
      INTEGER  IJKDIM

      INTEGER  IXDIM          ! X 軸次元数
      INTEGER  JXDIM
      INTEGER  KXDIM
      INTEGER  IJKXDIM

      INTEGER  IYDIM          ! Y 軸次元数
      INTEGER  JYDIM
      INTEGER  KYDIM
      INTEGER  IJKYDIM



      INTEGER  NCC
      INTEGER  NDC
      PARAMETER  ( NCC=16, NDC=64 )
      CHARACTER  HHEAD( NDC )*(NCC)
      CHARACTER  HHEADX( NDC )*(NCC)
      CHARACTER  HHEADY( NDC )*(NCC)


*     < 入出力パラメーター >

      INTEGER   IPR  / 10 /          ! 入力ユニット番号
      CHARACTER HIPFL*13 / 'GYZCNTR.PAR' / 
     &                               ! 入力パラメーターファイル名
      LOGICAL   LIPEX                ! 入力パラメーターファイルの存在

      INTEGER   IFILE   / 20 /       ! 入力ユニット番号
      CHARACTER HIFLX*16             ! X 軸情報ファイル名
      CHARACTER HIFLY*16             ! Y 軸情報ファイル名
      CHARACTER HFILE*16             ! 入力ファイル名



*     < 描画パラメーター >

      INTEGER  IWS                  ! ワークステーション番号

      CHARACTER  CXTTL*16, CXUNIT*16 ! X 軸のパラメーター
      REAL  XMIN, XMAX, DXS, DXL
      REAL  XFAC         / 1. /
      INTEGER  STYPX
      LOGICAL  LXINV

      CHARACTER  CYTTL*16, CYUNIT*16 ! Y 軸のパラメーター
      REAL  YMIN, YMAX, DYS, DYL
      REAL  YFAC         / 1. /
      INTEGER  STYPY
      LOGICAL  LYINV

      CHARACTER  CZTTL*32, CZUNIT*16 ! データに関するパラメーター
      REAL  ZMIN,     ZMAX,     DZS,     DZL
      REAL  ZFAC         / 1. /
      INTEGER  STYPZ
      LOGICAL  LZINV

      REAL  RMISS

      REAL  CINT
      INTEGER  ICYCLE


      REAL  VXMIN / 0.175 /   ! ビューポート X座標
      REAL  VXMAX / 0.825 /   ! ビューポート X座標
      REAL  VYMIN / 0.1875 /  ! ビューポート Y座標
      REAL  VYMAX / 0.5125 /  ! ビューポート Y座標
      LOGICAL  LFULL / .TRUE. / 



*     < NAMELIST >

      NAMELIST / XPARA /   CXTTL,    CXUNIT,
     &                     XMIN,     XMAX,     DXS,      DXL,
     &                     STYPX,
     &                     XFAC
      NAMELIST / YPARA /   CYTTL,    CYUNIT,
     &                     YMIN,     YMAX,     DYS,      DYL,
     &                     STYPY,
     &                     YFAC
      NAMELIST / ZPARA /   CZTTL, 
     &                     ZMIN,     ZMAX,     DZS,     DZL,
     &                     STYPZ,
     &                     ZFAC
      NAMELIST / VPARA /   VXMIN,    VXMAX,    VYMIN,    VYMAX,
     &                     LFULL

*-----------------------------------------------------------------------
*     < アンダーフローのスイッチの設定 >

      CALL UNDER0(.TRUE.)

*-----------------------------------------------------------------------

      WRITE ( 6,* )     ' FILE NAME ? '              ! ファイル名
      READ  ( 5,'(A)' ) HFILE
      WRITE ( 6,* )     ' CONTOUR INT. ( DEFALT: <=0 )?'
      READ  ( 5,* )     CINT                         ! コンター間隔
      WRITE ( 6,* )     ' WORK STATION NO ?'         ! ワークステー
      READ  ( 5,* )     IWS                          !   ション番号

*-----------------------------------------------------------------------
*     < データ入力 >

      CALL  RDGTDT
     I           ( IFILE,    HFILE,
     O             HHEAD,    GDATA,
     D             IDIM,     JDIM,     KDIM,     IJKDIM  )



*     < 軸情報の入力 >

      CALL  GHCGET( HHEAD, 'AITM2', HIFLX )
      CALL  GHCGET( HHEAD, 'AITM3', HIFLY )

      CALL  RDGTDT
     I           ( IFILE,    HIFLX,
     O             HHEADX,   XXX,
     D             IXDIM,    JXDIM,    KXDIM,     IJKXDIM  )

      CALL  RDGTDT
     I           ( IFILE,    HIFLY,
     O             HHEADY,   YYY,
     D             IYDIM,    JYDIM,    KYDIM,     IJKYDIM  )

*-----------------------------------------------------------------------
*     < 描画パラメーターの設定 >

      CALL  GHCGTS( HHEAD, 'TITL',  CZTTL )
      CALL  GHCGET( HHEAD, 'UNIT',  CZUNIT )
      CALL  GHPGET( HHEAD, 'DMIN',  ZMIN )
      CALL  GHPGET( HHEAD, 'DMAX',  ZMAX )
      CALL  GHPGET( HHEAD, 'DIVS',  DZS )
      CALL  GHPGET( HHEAD, 'DIVL',  DZL )

      CALL  GHCGET( HHEADX, 'UNIT',  CXUNIT )
      CALL  GHPGET( HHEADX, 'DMIN',  XMIN )
      CALL  GHPGET( HHEADX, 'DMAX',  XMAX )
      CALL  GHPGET( HHEADX, 'DIVS',  DXS )
      CALL  GHPGET( HHEADX, 'DIVL',  DXL )
      CALL  GHPGET( HHEADX, 'STYP',  STYPX )
      IF( STYPX .EQ. 1 ) THEN
        LXINV = .FALSE.
      ELSE IF( STYPX .EQ. -1 ) THEN
        LXINV = .TRUE.
      ENDIF

      CALL  GHCGET( HHEADY, 'UNIT',  CYUNIT )
      CALL  GHPGET( HHEADY, 'DMIN',  YMIN )
      CALL  GHPGET( HHEADY, 'DMAX',  YMAX )
      CALL  GHPGET( HHEADY, 'DIVS',  DYS )
      CALL  GHPGET( HHEADY, 'DIVL',  DYL )
      CALL  GHPGET( HHEADY, 'STYP',  STYPY )
      IF( STYPY .EQ. 1 ) THEN
        LYINV = .FALSE.
      ELSE IF( STYPY .EQ. -1 ) THEN
        LYINV = .TRUE.
      ENDIF

*-----------------------------------------------------------------------
*     < 欠損値処理 >

      CALL  GHPGET( HHEAD, 'MISS',  RMISS )
      CALL  GLPSET( 'RMISS', RMISS )
      CALL  GLPSET( 'LMISS', .TRUE. )

*-----------------------------------------------------------------------
*     < パラメーターの入力 >

      INQUIRE(FILE=HIPFL, EXIST=LIPEX)
      IF( .NOT. LIPEX ) THEN
        WRITE(6,*) '入力パラメーターファイルが存在しません'
        WRITE(6,*) ' ファイル名: ', HIPFL
        GOTO 5000
      END IF


      OPEN(IPR,FILE=HIPFL)
        READ(IPR,XPARA)
        READ(IPR,YPARA)
        READ(IPR,ZPARA)
        READ(IPR,VPARA)
      CLOSE(IPR)

 5000 CONTINUE

*-----------------------------------------------------------------------
*     < 描画 >


*     << 開始 >>

      CALL SGPSET('LFULL', LFULL)     ! 画面をいっぱいにとるかどうか
      CALL GROPN(IWS)



      CALL GRFRM

      CALL USSVPT(VXMIN, VXMAX, VYMIN, VYMAX) ! ビューポート
      CALL GLPSET('LMISS', .TRUE. )    ! 欠損値処理


*     << 表題 >>

      CALL SGSTXC( 0 )                 ! 中央に書く
      CALL SGSTXS( 0.02 )              ! 文字の高さ
      CALL SGSTXI( 5 )                 ! 文字の線のインデックス
      CALL SGTXV( 0.5, VYMAX+0.05,  CZTTL)

      CALL SGSTXC( 1 )                 ! 右寄せして書く
      CALL SGSTXS( 0.02 )              ! 文字の高さ
      CALL SGSTXI( 1 )                 ! 文字の線のインデックス
      CALL SGTXV( VXMAX, VYMAX+0.03,  CZUNIT)



*     << 軸の描画 >>

      CALL USCSET('CBLKT' , ' ')        ! サブラベルに括弧をつけない

      CALL USCSET('CXTTL' , CXTTL)
      CALL USCSET('CXUNIT', CXUNIT)
      CALL USPSET('XMIN', XMIN)
      CALL USPSET('XMAX', XMAX)
      CALL USPSET('DXT', DXS)
      CALL USPSET('DXL', DXL)
      CALL USPSET('LXINV', LXINV)
      CALL USPSET('XFAC', XFAC)

      CALL USCSET('CYTTL' , CYTTL)
      CALL USCSET('CYUNIT', CYUNIT)
      CALL USPSET('YMIN', YMIN)
      CALL USPSET('YMAX', YMAX)
      CALL USPSET('DYT', DYS)
      CALL USPSET('DYL', DYL)
      CALL USPSET('LYINV', LYINV)
      CALL USPSET('YFAC', YFAC)

      CALL UZPSET('INNER', -1)       ! 外側に向かって目盛を打つ

      CALL USAXIS



*     << 等値線 >>

      CALL UDSGXA(XXX, IJKXDIM)
      CALL UDSGYA(YYY, IJKYDIM)

      IF( CINT .GT. 0 ) THEN
        CALL UDGCLA(ZMIN, ZMAX, CINT)      ! コンター間隔
      ELSE IF( DZS .GT. 0 ) THEN
        ICYCLE = INT( DZL / DZS )
        CALL UDPSET('ICYCLE', ICYCLE)     ! 太コンターの間隔
        CALL UDGCLA(ZMIN, ZMAX, DZS)      ! コンター間隔
      END IF
C      CALL UDPSET('LMSG', .FALSE.)         ! メッセージを書かない
      CALL UDPSET('RSIZET', 0.01)        ! メッセージの文字の大きさ
      CALL UDPSET('XTTL', 1)             ! メッセージを右よせ

      CALL UDCNTR(GDATA, IJKXDIM, IJKXDIM, IJKYDIM)   ! 描画



*     << 画面のメッセージを消去 >>

      CALL SYSTEM('CLS')



*     << 終了 >>

      CALL GRCLS

*-----------------------------------------------------------------------
      STOP
      END
