*     PACKAGE ASTRT  !" 初期値入出力( 1 time level )
*"                  ver 1.00                   92/10/13 takepiro
*
**********************************************************************
      SUBROUTINE RDSTRT             !" 初期値の読み込みと再生成
     O         ( GAU   , GAV   , GAW   , GAT   , 
     O           GATOR , GAPOR ,
     O           ITA   , ISTEP ,
     C           ITSTRT, ALAT  , DLAT  , ARAD  , DRAD   )
*
*   [PARAM]
#ifdef SYS_IBMS
      INCLUDE   (ZCDIM)                      !" 格子点数, 波数
      INCLUDE   (ZHDIM)                      !" 文字列文字数
#else
#include        "zcdim.F"                    !" 格子点数, 波数
#include        "zhdim.F"                    !" 文字列文字数
#endif
*
*   [OUTPUT]
      REAL       GAU   ( IDIM, JDIM, 0:KDIM )  !" 西風   ｕ
      REAL       GAV   ( IDIM, JDIM, 0:KDIM )  !" 南風   ｖ
      REAL       GAW   ( IDIM, JDIM, 0:KDIM )  !" 鉛直風 ｗ
      REAL       GAT   ( IDIM, JDIM, 0:KDIM )  !" 温度   Ｔ
      REAL       GATOR ( IDIM, JDIM, 0:KDIM )  !" トロイダル Ψ
      REAL       GAPOR ( IDIM, JDIM, 0:KDIM )  !" ポロイダル Φ
*"       : 格子点データ(t)
*
      INTEGER    ISTEP                 !" 通しステップ数
      INTEGER    ITA                   !" 通し時間(t)
*"       : 時刻等
*
*   [CONST]
      INTEGER    ITSTRT                !" 計算開始時刻
      REAL       ALAT  ( JDIM )        !" 緯度
      REAL       DLAT  ( JDIM )        !" 緯度荷重
      REAL       ARAD  ( 0:KDIM )              !" ｒレベル(整数)
      REAL       DRAD  ( 0:KDIM )              !" Δｒ(整数)
*"        : 座標格子
*
*   [INTERNAL WORK]
      INTEGER    ITINIT                !" 初期値時刻
      INTEGER    ITDBFR                !" 同後方許容誤差
      INTEGER    ITDAFT                !" 同前方許容誤差
      INTEGER    ISTEPV, II, ISCDIF, ITDIF
      INTEGER    IFPAR, JFPAR, IFLSTR, IERR
      INTEGER    IEOD, ISTEPA
*
*   [INTERNAL PARAM]
      INTEGER    IDATEA( 6 )           !" 時刻：年月日時分秒
      INTEGER    IDATEB( 6 )           !" 時刻：年月日時分秒
      CHARACTER  FILE *(NFILN)         !" 入力ファイル：初期値
      CHARACTER  TUNIT  *4             !" 時刻単位
      INTEGER    TINIT                 !" 初期データ時刻
      INTEGER    IDATEI( 6 )           !" 同年月日時分秒
      INTEGER    DTBFR                 !" 同後方許容誤差
      INTEGER    DTAFTR                !" 同前方許容誤差
      DATA       FILE   / ' ' /
      DATA       TUNIT  / 'DAY ' /
      DATA       TINIT  / -999 /
      DATA       DTBFR  / 0 /
      DATA       DTAFTR / 10 /
      INTEGER    IFILED
      INTEGER    IOMODE
      DATA       IFILED / 40 /
      DATA       IOMODE / 0  /
*
      NAMELIST /NMINIT/ FILE, TINIT, DTBFR, DTAFTR
      NAMELIST /NMDATE/ IDATEI
*
      WRITE ( 6,* ) ' INITIAL DATA READ DATE=92/09/30'
*
*" << INITIM : 初期値の時刻 >>
*
      ITINIT = ITSTRT
      CALL   REWNML ( IFPAR , JFPAR )
      READ   ( IFPAR, NMINIT, END=190 )
  190 WRITE  ( JFPAR, NMINIT )
*
      IF ( TINIT .NE. -999 ) THEN
         CALL ACTIME ( TINIT, TUNIT, '#', ITINIT  )
      ELSE
         ITINIT = ITSTRT
      ENDIF
*
      CALL ACTIME ( DTBFR,  TUNIT, '#', ITDBFR  )
      CALL ACTIME ( DTAFTR, TUNIT, '#', ITDAFT  )
*
      IF ( ITINIT .GE. 0 ) THEN
         WRITE ( 6,* ) ' TRY TO READ HIST AT T = ', ITINIT
      ELSE
         CALL   REWNML ( IFPAR , JFPAR )
         READ   ( IFPAR, NMDATE, END=1090 )
 1090    WRITE  ( JFPAR, NMDATE )         
         WRITE ( 6,* ) ' TRY TO READ HIST AT T = ', IDATEI
      ENDIF
*
*" << RDSTR : 初期値の読み込み >>
*
      CALL IFLOPN
     O         ( IFLSTR, IERR  ,
     I           FILE  , IFILED, 'READ', 'UNFORMATTED' )
*
      CALL RDGDST                !" 初期値(GA)の読み込み
     O         ( GAU   , GAV   , GAW   , GAT   , 
     O           ITA   , IDATEA, ISTEPA, IEOD  ,
     I           'GA'  , ITINIT, IDATEI,
     I           ITDBFR, ITDAFT, IFLSTR, IOMODE  )
*
      IF ( IEOD .GE. 1 ) THEN
         CALL MSGDMP( 'E','GRSTRT','***** No Initial Data. ******')
*        ** STOP **
      ENDIF
*
*"  << VORDIV : 渦度発散の読み込みと生成 >>
*
      CALL RDGDSV                !" 渦度発散(GA)の読み込み
     O         ( GATOR , GAPOR ,
     O           ISTEPV, IEOD  ,
     I           'GA'  , IFLSTR, IOMODE  )
*
c$$$      IF ( ( IEOD.GE.1 ) .OR. ( ISTEPV.NE.ISTEP ) ) THEN
c$$$         CALL DSTRT             !" 初期データの再生成
c$$$     M        (  GAU   , GAV   , GAW   , GAT   , 
c$$$     O           GATOR , GAPOR ,
c$$$     C           ALAT  , DLAT  , 
c$$$     C           ARAD  , DRAD                      )
c$$$      ENDIF
c$$$      ENDIF
*
      CALL GFCLSE ( IFLSTR )
*
*"  << CHGDAT : 日付の変更 >>
*
c$$$      IF ( ITINIT .GE. 0 ) THEN
c$$$         DO 5100 II = 1,6
c$$$            IDATEI( II ) = IDATEB( II )
c$$$ 5100    CONTINUE
c$$$*
c$$$         CALL   REWNML ( IFPAR , JFPAR )
c$$$         READ   ( IFPAR, NMDATE, END=5190 )
c$$$ 5190    WRITE  ( JFPAR, NMDATE )
c$$$*
c$$$         CALL DIDATE
c$$$     O      ( ISCDIF,
c$$$     I        IDATEA, IDATEB )
c$$$         DO 5300 II = 1, 6
c$$$            IDATEB( II ) = IDATEI( II )
c$$$ 5300    CONTINUE
c$$$         CALL AIDATE
c$$$     O      ( IDATEA,
c$$$     I        IDATEB, ISCDIF )
c$$$*
c$$$         ITDIF = ITB - ITINIT
c$$$         ITA   = ITA - ITB + ITDIF + ITSTRT
c$$$         ITB   =             ITDIF + ITSTRT
c$$$      ELSE
c$$$*
c$$$         ITA   = ITA - ITB + ITSTRT
c$$$         ITB   =             ITSTRT
c$$$      ENDIF
c$$$*
c$$$      IF ( ITINIT .NE. ITSTRT ) THEN
c$$$         CALL MSGDMP('M', 'GRSTRT', 'INITIAL TIME IT IS MODIFIED' )
c$$$      ENDIF
c$$$      WRITE ( 6,* ) ' **** INITIAL IT, DATE ', 
c$$$     &              ITB, (IDATEB( II ), II=1, 6)
*
      RETURN
      END
***********************************************************************
      SUBROUTINE RDGDST        !" 初期値(GD)の読み込み
     O         ( GDU   , GDV   , GDW   , GDT   , 
     O           ITD   , IDATED, ISTEP , IEOD  ,
     I           HAB   , ITINIT, IDATEI,
     I           ITDBFR, ITDAFT, IFLSTR, IOMODE  )
*
*   [PARAM]
#ifdef SYS_IBMS
      INCLUDE   (ZCDIM)                      !" 格子点数, 波数
#else
#include        "zcdim.F"                    !" 格子点数, 波数
#endif
*
*   [OUTPUT]
      REAL       GDU   ( IDIM, JDIM, 0:KDIM )  !" 西風   ｕ
      REAL       GDV   ( IDIM, JDIM, 0:KDIM )  !" 南風   ｖ
      REAL       GDW   ( IDIM, JDIM, 0:KDIM )  !" 鉛直風 ｗ
      REAL       GDT   ( IDIM, JDIM, 0:KDIM )  !" 温度   Ｔ
*"       : 格子点データ
*
      INTEGER    ISTEP                 !" 通しステップ数
      INTEGER    ITD                   !" 通し時間
      INTEGER    IDATED( 6 )           !" 時刻：年月日時分秒
*"       : 時刻等
      INTEGER    IEOD                  !" データありなし
*
*   [INPUT]
      CHARACTER  HAB *(*)              !" GA or GB
      INTEGER    ITINIT                !" 初期値時刻
      INTEGER    IDATEI( 6 )           !" 同年月日時分秒
      INTEGER    ITDBFR                !" 同後方許容誤差
      INTEGER    ITDAFT                !" 同前方許容誤差
      INTEGER    IFLSTR                !" 装置番号
      INTEGER    IOMODE                !" 表示モード
*
*   [INTERNAL WORK]
      INTEGER    IEODU, IEODV, IEODW, IEODT
      INTEGER    ITDUR, ISCDIF
      CHARACTER  HU*3, HV*3, HW*3, HT*3
      HU  = HAB(1:2)//'U'
      HV  = HAB(1:2)//'V'
      HW  = HAB(1:2)//'W'
      HT  = HAB(1:2)//'T'
*
 1100 CONTINUE
*
         CALL GDREAD
     O         ( GDU   , IEODU ,
     O           ITD   , IDATED, ISTEP , ITDUR ,
     I           IFLSTR, HU    , IOMODE, 'ALEV'  )
*
         IF ( IEODU .EQ. 0  ) THEN
            WRITE ( 6,* ) '        READ HIST AT T = ', ITD
*
            IF ( ( ITDBFR .GE. 0 ) .AND. ( ITDAFT .GE. 0 ) ) THEN
               IF ( ITINIT .GE. 0 ) THEN
                  IF ( ( ITD .LT. ITINIT-ITDBFR ).OR.
     &                 ( ITD .GT. ITINIT+ITDAFT )     ) THEN
                     GOTO 1100
*"                              ------> 次のデータ ----->
                  ENDIF
c$$$               ELSE
c$$$                  CALL DIDATE   !" 時刻差
c$$$     O               ( ISCDIF,
c$$$     I                 IDATED, IDATEI )
c$$$                  IF ( ( ISCDIF .LT. -ITDBFR ) .OR. 
c$$$     &                 ( ISCDIF .GT. ITDAFT  )      ) THEN
c$$$                     GOTO 1100 
c$$$*"                              ------> 次のデータ ----->
c$$$                  ENDIF
               ENDIF
            ENDIF
        ENDIF
*
      CALL GDREAD
     O         ( GDV   , IEODV ,
     O           ITD   , IDATED, ISTEP , ITDUR ,
     I           IFLSTR, HV    , IOMODE, 'ALEV' )
*
      CALL GDREAD
     O         ( GDW   , IEODW ,
     O           ITD   , IDATED, ISTEP , ITDUR ,
     I           IFLSTR, HW    , IOMODE, 'ALEV' )
*
      CALL GDREAD
     O         ( GDT   , IEODT ,
     O           ITD   , IDATED, ISTEP , ITDUR ,
     I           IFLSTR, HT    , IOMODE, 'ALEV' )
*
      IEOD = MAX( IEODU, IEODV, IEODW, IEODT )
*
      RETURN
      END
***********************************************************************
      SUBROUTINE RDGDSV               !" ポテンシャルの読み込み
     O         ( GDTOR , GDPOR ,
     O           ISTEP , IEOD  ,
     I           HAB   , IFLSTR, IOMODE  )
*
*   [PARAM]
#ifdef SYS_IBMS
      INCLUDE   (ZCDIM)                      !" 格子点数, 波数
#else
#include        "zcdim.F"                    !" 格子点数, 波数
#endif
*
*   [OUTPUT]
      REAL       GDTOR ( IDIM, JDIM, 0:KDIM )  !" トロイダル Ψ
      REAL       GDPOR ( IDIM, JDIM, 0:KDIM )  !" ポロイダル Φ
*"       : 格子点データ
*
      INTEGER    ISTEP                 !" 通しステップ数
      INTEGER    IEOD                  !" データありなし
*
*   [INPUT]
      CHARACTER  HAB *(*)              !" GA or GB
      INTEGER    IFLSTR                !" 装置番号
      INTEGER    IOMODE                !" 表示モード
*
*   [INTERNAL WORK]
      INTEGER    ITD                   !" 通し時間
      INTEGER    IDATED( 6 )           !" 時刻：年月日時分秒
      INTEGER    IEODP, IEODT, ITDUR
*
      CHARACTER   HTOR*5, HPOR*5
      HTOR  = HAB(1:2)//'TOR'
      HPOR  = HAB(1:2)//'POR'
*
      CALL GDREAD
     O         ( GDTOR , IEODT ,
     O           ITD   , IDATED, ISTEP , ITDUR ,
     I           IFLSTR, HTOR  , IOMODE, 'ALEV' )
*
      CALL GDREAD
     O         ( GDPOR , IEODP ,
     O           ITD   , IDATED, ISTEP , ITDUR ,
     I           IFLSTR, HPOR  , IOMODE, 'ALEV' )
*
      IEOD = MAX( IEODT, IEODP )
*
      RETURN
      END
***********************************************************************
      SUBROUTINE WRRSTR            !" リスタート・ファイルの書き込み
     I         ( GAU   , GAV   , GAW   , GAT   , 
     I           GATOR , GAPOR ,
     I           ITA   , ISTEP                    )
*
*   [PARAM]
#ifdef SYS_IBMS
      INCLUDE   (ZCDIM)                      !" 格子点数, 波数
      INCLUDE   (ZHDIM)                      !" 文字列文字数
#else
#include        "zcdim.F"                    !" 格子点数, 波数
#include        "zhdim.F"                    !" 文字列文字数
#endif
*
*   [INPUT]
      REAL       GAU   ( IDIM, JDIM, 0:KDIM )  !" 西風   ｕ
      REAL       GAV   ( IDIM, JDIM, 0:KDIM )  !" 南風   ｖ
      REAL       GAW   ( IDIM, JDIM, 0:KDIM )  !" 鉛直風 ｗ
      REAL       GAT   ( IDIM, JDIM, 0:KDIM )  !" 温度   Ｔ
      REAL       GATOR ( IDIM, JDIM, 0:KDIM )  !" トロイダル Ψ
      REAL       GAPOR ( IDIM, JDIM, 0:KDIM )  !" ポロイダル Φ
*"       : 格子点データ(t) <DYNMCS>  格子点データ(t+Δt)
*
      INTEGER    ISTEP                 !" 通しステップ数
      INTEGER    ITA                   !" 通し時間(t)
      INTEGER    ITB                   !" 通し時間(t-Δt)
*"       : 時刻等
*
*    [INTERNAL PARAM]
      INTEGER    IDATEA( 6 )           !" 時刻：年月日時分秒
      INTEGER    IDATEB( 6 )           !" 時刻：年月日時分秒
      CHARACTER  FILE   *(NFILN)       !" 出力ファイル：再出発
      CHARACTER  DFMT  *(NCC)          !" 出力フォーマット
      DATA       FILE   / '  ' /
      DATA       DFMT   / 'UR8' /
      LOGICAL    OVORDV                !" 渦度発散を出すか?
      DATA       OVORDV / .TRUE. /
      INTEGER    JFILED
      DATA       JFILED / 41 /
      LOGICAL    OFIRST
      DATA       OFIRST / .TRUE. /
      LOGICAL    OADVNC
      REAL       DELT
      SAVE
*
      NAMELIST  /NMRSTR/ FILE, DFMT, OVORDV
*    
*    [INTERNAL WORK]
      INTEGER    IFPAR, JFPAR, JFLRST, IERR
*
      IF ( OFIRST ) THEN
         OFIRST = .FALSE.
         CALL   REWNML ( IFPAR , JFPAR )
         READ   ( IFPAR, NMRSTR, END=1090 )
 1090    WRITE  ( JFPAR, NMRSTR )         
*
         CALL IFLOPN
     O         ( JFLRST, IERR  ,
     I           FILE  , JFILED, 'WRITE', 'UNFORMATTED' )
         CALL INQTIM
     O         ( ITA   , ITB   , IDATEA, IDATEB,
     O           ISTEP , DELT  , OADVNC          )
      ENDIF
*
      CALL WRRSTX           !" 基本リスタート・ファイルの書き込み
     I         ( GAU   , GAV   , GAW   , GAT   ,
     I           ITA   , IDATEA, ISTEP ,
     I           JFLRST, DFMT                     )
*
      CALL WRRSTY           !" 渦度発散リスタート・ファイルの書き込み
     I         ( GATOR , GAPOR ,
     I           ITA   , IDATEA, ISTEP ,
     I           JFLRST, DFMT             )
*
      RETURN
      END
***********************************************************************
      SUBROUTINE WRRSTX           !" 基本リスタート・ファイルの書き込み
     I         ( GAU   , GAV   , GAW   , GAT   , 
     I           ITA   , IDATEA, ISTEP ,
     I           JFLRST, HDFMT                     )
*
*   [PARAM]
#ifdef SYS_IBMS
      INCLUDE   (ZCDIM)                      !" 格子点数, 波数
      INCLUDE   (ZHDIM)                      !" 文字列文字数
#else
#include        "zcdim.F"                    !" 格子点数, 波数
#include        "zhdim.F"                    !" 文字列文字数
#endif
*
*   [INPUT]
      REAL       GAU   ( IDIM, JDIM, 0:KDIM )  !" 西風   ｕ
      REAL       GAV   ( IDIM, JDIM, 0:KDIM )  !" 南風   ｖ
      REAL       GAW   ( IDIM, JDIM, 0:KDIM )  !" 鉛直風 ｗ
      REAL       GAT   ( IDIM, JDIM, 0:KDIM )  !" 温度   Ｔ
*"       : 格子点データ(t) <DYNMCS>  格子点データ(t+Δt)
*
      INTEGER    ISTEP                 !" 通しステップ数
      INTEGER    ITA                   !" 通し時間(t)
      INTEGER    IDATEA( 6 )           !" 時刻：年月日時分秒
*"       : 時刻等
*
      INTEGER    JFLRST                !" 出力ファイル
      CHARACTER  HDFMT  *(*)           !" 出力フォーマット
*
*    [INTERNAL PARAM]
      INTEGER    IOMODE
      INTEGER    NOEND
      INTEGER    ITDUR
      DATA       IOMODE / 0  /
      DATA       NOEND  / 0  /
      DATA       ITDUR  / 1  /
*
*" << GAWRIT : ファイル出力 (GA) >>
*
      CALL GDWRIT
     I        ( GAU   ,
     I         'GAU'  , 'u-velocity @ t      ','1/s' ,
     I          ITA   , IDATEA, ISTEP , ITDUR ,
     I          JFLRST, IOMODE, NOEND , 'ALEV', HDFMT  )
*
      CALL GDWRIT
     I        ( GAV   ,
     I         'GAV'  , 'v-velocity @ t      ','1/s' ,
     I          ITA   , IDATEA, ISTEP , ITDUR ,
     I          JFLRST, IOMODE, NOEND , 'ALEV', HDFMT  )
*
      CALL GDWRIT
     I        ( GAW   ,
     I         'GAW'  , 'w-velocity @ t      ','1/s' ,
     I          ITA   , IDATEA, ISTEP , ITDUR ,
     I          JFLRST, IOMODE, NOEND , 'ALEV', HDFMT  )
*
      CALL GDWRIT
     I        ( GAT   ,
     I         'GAT'  , 'temperature @ t     ','K'   ,
     I          ITA   , IDATEA, ISTEP , ITDUR ,
     I          JFLRST, IOMODE, NOEND , 'ALEV', HDFMT  )
*
      RETURN
      END
***********************************************************************
      SUBROUTINE WRRSTY     !" ポテンシャルリスタート・ファイルの書き込み
     I         ( GATOR , GAPOR ,
     I           ITA   , IDATEA, ISTEP ,
     I           JFLRST, HDFMT           )
*
*   [PARAM]
#ifdef SYS_IBMS
      INCLUDE   (ZCDIM)                      !" 格子点数, 波数
      INCLUDE   (ZHDIM)                      !" 文字列文字数
#else
#include        "zcdim.F"                    !" 格子点数, 波数
#include        "zhdim.F"                    !" 文字列文字数
#endif
*
*   [INPUT]
      REAL       GATOR ( IDIM, JDIM, 0:KDIM )  !" トロイダル Ψ
      REAL       GAPOR ( IDIM, JDIM, 0:KDIM )  !" ポロイダル Φ
*"       : 格子点データ(t) <DYNMCS>  格子点データ(t+Δt)
*
      INTEGER    ISTEP                 !" 通しステップ数
      INTEGER    ITA                   !" 通し時間(t)
      INTEGER    IDATEA( 6 )           !" 時刻：年月日時分秒
*"       : 時刻等
*
      INTEGER    JFLRST                !" 出力ファイル
      CHARACTER  HDFMT  *(*)           !" 出力フォーマット
*
*    [INTERNAL PARAM]
      INTEGER    IOMODE
      INTEGER    NOEND
      INTEGER    ITDUR
      DATA       IOMODE / 0  /
      DATA       NOEND  / 0  /
      DATA       ITDUR  / 1  /
*
*" << GAVRDV : 渦度発散 (GA) >>
*
      CALL GDWRIT
     I        ( GATOR ,
     I         'GATOR', 'toloidal pot. @ t   ','1/s' ,
     I          ITA   , IDATEA, ISTEP , ITDUR ,
     I          JFLRST, IOMODE, NOEND , 'ALEV', HDFMT  )
*
      CALL GDWRIT
     I        ( GAPOR ,
     I         'GAPOR', 'poroidal pot. @ t   ','1/s' ,
     I          ITA   , IDATEA, ISTEP , ITDUR ,
     I          JFLRST, IOMODE, NOEND , 'ALEV', HDFMT  )
*
      RETURN
      END
