%表題 共通 ステップ制御
%
%履歴   93/09/15 保坂征宏
%
%
%
\section{サブルーチンの説明 : ステップ制御・日付処理}

\verb!TIMSTP! で時刻の進行制御を行なう. 
次のステップでの時刻を計算・記憶する. 
その記憶情報をもとに \verb!ADVSTP! で時刻の進行を行なう. 
時刻の変更設定をしたいときには \verb!SETTIM! で, 
時刻の参照をしたいときには \verb!INQTIM! ですれば良い. 
サブルーチン \verb!AIDATE! では, 日付処理に関する雑務をおこなう. 

\subsection{TIMSTP}
\label{timstp}
\begin{enumerate}
  \item 機能 
    \begin{quote}
       進行させるかどうかを判断・出力し, 
       次のステップでの時刻・時間を内部設定する(出力はしない). 
       また, 時間刻並びに
       リスタートファイルを出力するかどうかを判断・出力する. 
    \end{quote}
       
  \item 呼び出し方法
    \begin{verbatim}
      SUBROUTINE TIMSTP      !"  時刻制御 
     O         ( DELT  , OADVNC, ORSTR ,
     I           ITA   , ITB   , IDATEA, IDATEB, ISTEP  ,
     C           IDELT , INISTP, ITEND , IORSTR          )
    \end{verbatim}
    
  \item パラメタの説明
    \begin{verbatim}
* 出力
      REAL       DELT                        !" 時間刻みΔｔ ( 単位秒 )
      LOGICAL    OADVNC                      !" 時刻が進行するか否か
      LOGICAL    ORSTR                       !" リスタート出すか否か
* 入力
      INTEGER    ITA                         !" 通し時間(t)
      INTEGER    ITB                         !" 通し時間(t-Δt)
      INTEGER    IDATEA( * )                 !" 時刻年月日時分秒
      INTEGER    IDATEB( * )                 !" 時刻年月日時分秒
      INTEGER    ISTEP                       !" 通しステップ数
* 定数
      INTEGER    IDELT                       !" 標準時間刻み ( 単位秒 )
      INTEGER    INISTP                      !" 初期ステップ数
      INTEGER    ITEND                       !" 計算終了時刻
      INTEGER    IORSTR                      !" 出力間隔：再出発
    \end{verbatim}

  \item 備考
    \begin{enumerate}
      \item 時刻関連情報は記憶している. 
      \item \verb!DELT, IDELT! の単位は秒である. 
            標準時間単位ではない. 
            \verb!IT?! は標準時間単位である. 
      \item 手続きは以下のとおり. 
        \begin{enumerate}
          \item 時刻を進めるかどうかの判断, 時間刻の設定. 
                通しステップ数 \verb!ISTEP! が 
                \verb!INISTP! に比べて大きいかどうかで判断する. 
                進めない場合の時間刻は 
                \verb!IDELT/(2.**(INISTP-ISTEP))! とする. 
          \item 次のステップでの時刻 \verb!ITN! 
                および時間\verb!IDATEN! を計算する. \\
                時間刻を単位秒から標準時間単位変換し( \verb!ACTIME! ), 
                時刻進行する場合は現在の時刻・時間に, 
                進行しない場合は前のステップでの時刻・時間に
                時間刻分の時間を加える. 
          \item リスタートファイルの出力の有無の判断
                をする\footnotemark . 
                 \footnotetext{
                       リスタートファイル出力間隔として
                       負の値が設定されていれば, 
                       実験最終時刻以外では出力しない. }
          \item 諸量の内部設定 ( 記憶 ) . 
        \end{enumerate}
      \item \verb!DELT! はメインルーチンに直接引き渡されており, 
            メインルーチンでの \verb!DELT! も当然
            秒単位ということになる. 
    \end{enumerate}
    
\end{enumerate}
    
\subsection{SETTIM}
\label{settim}
\begin{enumerate}
  \item 機能 
    \begin{quote}
       時間・時刻・ステップ数の内部設定をおこなう. 
    \end{quote}
       
  \item 呼び出し方法
    \begin{verbatim}
      ENTRY      SETTIM
     I         ( ITA   , ITB   , IDATEA, IDATEB, ISTEP  )
    \end{verbatim}
    
  \item パラメタの説明
    \begin{verbatim}
* 入力
      INTEGER    ITA                         !" 通し時間(t)
      INTEGER    ITB                         !" 通し時間(t-Δt)
      INTEGER    IDATEA( * )                 !" 時刻年月日時分秒
      INTEGER    IDATEB( * )                 !" 時刻年月日時分秒
      INTEGER    ISTEP                       !" 通しステップ数
    \end{verbatim}
    
  \item 備考
     \begin{enumerate}
       \item 些細なバグ. エントリー文で \verb!I! であるべきところが 
             \verb!O! になっている. 
       \item \verb!TIMSTP! の時間・時刻・ステップ数の設定方法と同じ. 
     \end{enumerate}

\end{enumerate}

\subsection{ADVSTP}
\label{advstp}
\begin{enumerate}
  \item 機能 
    \begin{quote}
       現ステップ並びに 1 つ前のステップの時間時刻について
       時間進行を行なう. 
       進行後の各時刻・時間はサブルーチン \verb!TIMSTP! で記憶する. 
    \end{quote}
       
  \item 呼び出し方法
    \begin{verbatim}
      ENTRY      ADVSTP      !"  時刻進行 
     O         ( ITA   , ITB   , IDATEA, IDATEB,
     I           OADVNC                          )
    \end{verbatim}
    
  \item パラメタの説明
    \begin{verbatim}
* 入力
      LOGICAL    OADVNC                      !" 時刻が進行するか否か
* 出力
      INTEGER    ITA                         !" 通し時間(t)
      INTEGER    ITB                         !" 通し時間(t-Δt)
      INTEGER    IDATEA( * )                 !" 時刻年月日時分秒
      INTEGER    IDATEB( * )                 !" 時刻年月日時分秒
    \end{verbatim}
  
  \item 備考
    \begin{enumerate}
      \item なし
    \end{enumerate}
\end{enumerate}

\subsection{INQSTP}
\label{inqstp}
\begin{enumerate}
  \item 機能 
    \begin{quote}
       現ステップ並びに 1 つ前のステップの時間・時刻, 
       通しステップ数, 時間刻, 時刻進行の可否情報を返す. 
    \end{quote}
       
  \item 呼び出し方法
    \begin{verbatim}
      ENTRY      INQTIM      !"  時刻の参照 
     O         ( ITA   , ITB   , IDATEA, IDATEB,
     O           ISTEP , DELT  , OADVNC          )
    \end{verbatim}
    
  \item パラメタの説明
    \begin{verbatim}
* 出力
      INTEGER    ITA                         !" 通し時間(t)
      INTEGER    ITB                         !" 通し時間(t-Δt)
      INTEGER    IDATEA( * )                 !" 時刻年月日時分秒
      INTEGER    IDATEB( * )                 !" 時刻年月日時分秒
      INTEGER    ISTEP                       !" 通しステップ数
      REAL       DELT                        !" 時間刻 ( 単位秒 )
      LOGICAL    OADVNC                      !" 時刻が進行するか否か
    \end{verbatim}

  \item 備考
    \begin{enumerate}
      \item なし. 
    \end{enumerate}
    
    
\end{enumerate}


\subsection{AIDATE}
\label{aidate}
\begin{enumerate}
  \item 機能 
    \begin{quote}
       日付の更新. 現ステップでの時刻 \verb!IDATE! と
       時間刻 \verb!IDELT! とから次のステップでの時刻 \verb!IDATEN! 
       を計算する. 
    \end{quote}
       
  \item 呼び出し方法
    \begin{verbatim}
      SUBROUTINE AIDATE      !"  日付の更新 
     O        ( IDATEN,
     I          IDATE ,
     I          IDELT  )
    \end{verbatim}
    
  \item パラメタの説明
    \begin{verbatim}
* 出力
      INTEGER    IDATEN( * )              !" 時刻年月日時分秒
* 入力
      INTEGER    IDATE ( * )              !" 時刻年月日時分秒
      INTEGER    IDELT                    !" 時間刻み ( 標準時間単位 )
* ネームリスト
      NAMELIST   NMCALN 
    \end{verbatim}
    
  \item 備考
    \begin{enumerate}
      \item ネームリスト \verb!NMCALN! で
            各時刻単位での数値の最大値 ( 繰上がる値 ) および
            季節変化するかどうかを設定できる. 
            季節変化しない場合は日付が変わらない(繰り上がらないため). 
    \end{enumerate}
\end{enumerate}

\subsection{DIDATE}
\label{didate}
\begin{enumerate}
  \item 機能 
    \begin{quote}
      2 つの日付間の時刻差を計算する. 
      \verb!IDATEN! の時刻から \verb!IDATE! の時刻を引く. 
    \end{quote}
  \item 呼び出し方法
    \begin{verbatim}
      ENTRY     DIDATE      !"  日付の時刻差 
     O        ( IDELT ,
     I          IDATEN,
     I          IDATE  )
    \end{verbatim}
  \item パラメタの説明
    \begin{verbatim}
* 出力
      INTEGER    IDATE                    !" 時間差 ( 標準時間単位 )
* 入力
      INTEGER    IDATE ( * )              !" 時刻年月日時分秒
      INTEGER    IDATEN( * )              !" 時刻年月日時分秒
    \end{verbatim}
    
  \item 備考
  
    \begin{enumerate}
      \item なし
    \end{enumerate}
    
\end{enumerate}

\subsection{RDATES}
\label{rdates}
\begin{enumerate}
  \item 機能 
    \begin{quote}
       日付の小数化. 
       日付情報, すなわち月・日を年単位に, 
       時間情報, すなわち時・分・秒を日単位にする. 
    \end{quote}
  \item 呼び出し方法
    \begin{verbatim}
      ENTRY      RDATES      !"  日付の小数化 
     O         ( RDATE ,
     I           IDATE  )
    \end{verbatim}
  \item パラメタの説明
    \begin{verbatim}
* 出力
      REAL       RDATE ( 2 )                 !" 季節(日), 時刻(秒)
* 入力
      INTEGER    IDATE ( 6 )                 !" 時刻年月日時分秒
    \end{verbatim}

  \item 備考
    \begin{enumerate}
      \item サブルーチン \verb!AIDATE! に記憶された情報を用いる. 
    \end{enumerate}
\end{enumerate}

