*" PACKAGE AADMIN !" 共通 メインルーチン
*"                  original                   90/01/14 momoko
*"                  ver 0.06                   96/03/13 takepiro
***********************************************************************
      PROGRAM BSN2D
*
*"        << 対流の時間発展問題を解く >>
*"                                    90/01/14 (石渡正樹)
* [PARAM]
#include        "zcdim.F"            !" 格子点数, 波数
#include        "zhdim.F"            !" 文字列文字数
*
* [VAR]
*" 格子点データ(t) <DYNMCS>  格子点データ(t+Δt)
      REAL PSI2  ( 0:NX+1 , 0:NZ+1 ) !" 流線関数
      REAL ZETA2 ( 0:NX+1 , 0:NZ+1 ) !" 渦度
      REAL T2    ( 0:NX+1 , 0:NZ+1 ) !" 温度
*
*" 格子点データ(t-Δt) <DYNMCS>  格子点データ(t)
      REAL PSI1  ( 0:NX+1 , 0:NZ+1 ) !" 流線関数
      REAL ZETA1 ( 0:NX+1 , 0:NZ+1 ) !" 渦度
      REAL T1    ( 0:NX+1 , 0:NZ+1 ) !" 温度
*
* [INTERNAL ONCE]
      REAL    DT                !" 時間間隔
*
      REAL    DX                !" X 軸上の格子点間隔
      REAL    DZ                !" Z 軸上の格子点間隔
*
* [WORK]
      INTEGER IT                !" ループカウンタ
      CHARACTER  HINTG * (NCC)  !" 時間積分スイッチ
      LOGICAL    OOUT           !" 出力スイッチ
      LOGICAL    OEND           !" 終了スイッチ
      INTEGER    IUNIT          !" メッセージ出力装置番号
*
      CALL GLPGET( 'MSGUNIT', IUNIT )
      WRITE ( IUNIT, * ) '2-DIM BOUSSINESQ MODEL'
     &                   //NAME
     &                   //' ver.0.04, 95/08/15'
*
*" << 1. SETPUP : 初期設定 >>
*
      CALL CLCSTR ( 'SETUP' )
      CALL YPREP                       !" システム前処理 
*
*"        < 1.1 時間, 座標パラメータの設定 >
*
      CALL ATSTRT               !" 実験初期設定(時間)
     O     ( IT , DT ) 
*
*"        < 1.2 座標設定 > 
*
      CALL ACRGET               !" 座標設定
     O     (  DX , DZ  )
*
*"        < 1.3 初期条件の設定 >
*
      CALL RDSTRT               !" 初期値の設定
     I       ( IT ,  
     O         PSI2  , ZETA2 , T2 ,
     O         PSI1  , ZETA1 , T1  )
*
      CALL ADMXMN               !" debug monitor
     I     ( PSI2 , ZETA2 , T2  ,
     I       IT   , 'Start PROGRAM'    )
*
#ifdef DEBUG
            CALL WRRSTR         !" リスタートファイル書き込み
     I         ( PSI2  , ZETA2   , T2   , 
     I           IT    ,                  )
#endif
      CALL CLCEND ( 'SETUP' )
*
 8888 CONTINUE                      !" << LOOP : <****** メイン・ループ >>
*
*"        < 1. 時間ステップ制御 >
*
          CALL ATSTEP               !"  時刻制御 
     M         ( IT   ,     
     O           HINTG , OOUT , OEND )
*
*"        < 2. 次ステップの物理量を求める >
*
         CALL CLCSTR ( 'DYNMCS' )
         CALL DYNMCS
     M         ( PSI2  , ZETA2 , T2  , 
     M           PSI1  , ZETA1 , T1  , 
     I           HINTG , DT            )
         CALL CLCEND ( 'DYNMCS' )
*
*"        < 3. 出力 >
*
         CALL CLCSTR ( 'OUTPUT' )
         IF( OOUT ) THEN
            CALL WRRSTR         !" リスタートファイル書き込み
     I         ( PSI2  , ZETA2   , T2   , 
     I           IT                       )
         ENDIF
         CALL CLCEND ( 'OUTPUT' )
*
      IF ( .NOT. OEND ) GOTO 8888    !" << LEND : メイン・ループ終わり ****> >>
*
*"        < 4. 最終処理 >
*
      CALL ADMXMN               !" debug monitor
     I     ( PSI2  , ZETA2 , T2  ,
     I       IT    , 'End PROGRAM'    )

      CALL CLCOUT                      !" CPU時間出力
      CALL YFINE                       !" システム後処理
*
      STOP
      END
*************************************************************************
      SUBROUTINE ADMXMN        !" debug monitor
     I         ( PSI   , ZETA  , T  ,
     I           IT    , HLABEL      )
*
* [PARAM]
#include        "zcdim.F"            !" 格子点数, 波数
*   [INPUT] 
      REAL PSI  ( 0:NX+1 , 0:NZ+1 ) !" 流線関数
      REAL ZETA ( 0:NX+1 , 0:NZ+1 ) !" 渦度
      REAL T    ( 0:NX+1 , 0:NZ+1 ) !" 温度
*
      INTEGER    IT
      CHARACTER  HLABEL *(*)
*
      INTEGER IUNIT             !" メッセージ出力装置番号
*
      CALL GLPGET( 'MSGUNIT', IUNIT )
      WRITE ( IUNIT,* ) HLABEL, ' IT= ', IT
*
      CALL MAXMIN( PSI , NX+2, NZ+2, 1, NX+1, NZ+2, 'PSI' )
      CALL MAXMIN( ZETA, NX+2, NZ+2, 1, NX+1, NZ+2, 'ZETA' )
      CALL MAXMIN( T   , NX+2, NZ+2, 1, NX+1, NZ+2, 'T' )
*
      RETURN
      END
