%表題   GTOOL3 利用の手引 (gftool)
%
%履歴   90/09/24 沼口  敦
%       95/06/02 竹広真一
%

\chapter{ファイル入出力モジュール群}

  ファイルの入出力に関するモジュールが用意されている.
  ファイルは基本的には装置番号で指定する.

\section{ファイルの読み書きに関するモジュール}

  \subsection{GFREAD  [S]   GTOOL3標準フォーマットデータ読み込み }
    \entry{GFREAD}

    % GFREAD.FOR 9:  1990/09/23 (日) 19:16:51
    \begin{verbatim}
          SUBROUTINE GFREAD
         O         ( HHEAD , GDATA , IEOD  ,
         I           IFILE , MODE           )
    *
          CHARACTER  HHEAD ( * )*(*)         ! ヘッダー
          REAL       GDATA ( * )             ! データ
          INTEGER    IEOD                    ! データ存在フラグ
          INTEGER    IFILE                   ! 装置番号
          INTEGER    MODE                    ! モード(1なら表示ON)
    \end{verbatim}

    \begin{setumei}
    装置番号IFILEのファイルの,
    現在指しているデータユニットを読み込む.
    データが存在しないときには,
    IEODとして0でない値を返す.

    MODE=1と指定すると,
    読んだユニットのヘッダーのITEMとTIMEを表示する.
    \end{setumei}

    \subsection{GFRDSL  [S]   GTOOL3標準フォーマットデータ読み込み: 選択つき}
    \entry{GFRDSL}

    % GFREAD.FOR 29:  1990/09/23 (日) 19:16:51
    \begin{verbatim}
          SUBROUTINE GFRDSL
         O         ( HHEAD , GDATA , IEOD  ,
         I           HPSEL , HSEL  , ISEL  ,
         I           IFILE , MODE           )
    *
          CHARACTER  HHEAD ( * )*(*)         ! ヘッダー
          REAL       GDATA ( * )             ! データ
          INTEGER    IEOD                    ! データ存在フラグ
          CHARACTER  HPSEL *(*)              ! 選択する欄
          CHARACTER  HSEL  *(*)              ! 選択するデータ(文字)
          INTEGER    ISEL                    ! 選択するデータ(数)
          INTEGER    IFILE                   ! 装置番号
          INTEGER    MODE                    ! モード(1なら表示ON)
    \end{verbatim}

    \begin{setumei}
    装置番号IFILEのファイルの,
    現在指しているデータユニット以降で,
    ヘッダーの欄HPSELの内容がHSEL(文字)
    またはISEL(数)に
    等しいものを探して,
    最初のものを読み込む.
    HPSELに\verb!'###'!を指定すると,
    無条件に読み込む(\モジ{GFREAD}と同じ).
    データが存在しないときには,
    IEODとして0でない値を返す.

    MODE=1とすると,
    読んだユニットのヘッダーのITEMとTIMEを表示する.
    \end{setumei}

  \subsection{GFRDHD  [ES]   GTOOL3標準フォーマットヘッダー読み込み}
    \entry{GFRDHD}

    % GFREAD.FOR 195:  1990/09/23 (日) 19:16:51
    \begin{verbatim}
          ENTRY      GFRDHD
         O         ( HHEAD , IEOD  ,
         I           IFILE , MODE   )
    *
          CHARACTER  HHEAD ( * )*(*)         ! ヘッダー
          INTEGER    IEOD                    ! データ存在フラグ
          REAL       GDATA ( * )             ! データ
          INTEGER    IFILE                   ! 装置番号
          INTEGER    MODE                    ! モード(1なら表示ON)
    \end{verbatim}

    \begin{setumei}
    装置番号IFILEのファイルの,
    現在指しているデータユニットのヘッダーレコードを読み,
    データレコードを読みとばす.
    データが存在しないときには,
    IEODとして0でない値を返す.

    MODE=1と指定すると,
    読んだユニットのヘッダーのITEMとTIMEを表示する.
    \end{setumei}

  \subsection{GFWRIT  [S]   GTOOL3標準フォーマットデータ書き込み }
    \entry{GFWRIT}

    % GFWRIT.FOR 9:  1990/09/23 (日) 19:17:31
    \begin{verbatim}
          SUBROUTINE GFWRIT
         I         ( HHEAD , GDATA ,
         I           JFILE , MODE  , NOEND   )
    *
          CHARACTER  HHEAD ( * )*(*)         ! ヘッダー
          REAL       GDATA ( * )             ! データ
          INTEGER    JFILE                   ! 装置番号
          INTEGER    MODE                    ! モード(1なら表示ON)
          INTEGER    NOEND                   ! ENDFILEの間隔
    \end{verbatim}

    \begin{setumei}
    装置番号IFILEのファイルに,
    データユニットを追加して書き込む.

    NOEND$\neq$0の時は,
    同じ装置番号のファイルに
    NOEND個のデータユニットを書き込む毎に
    {\rm ENDFILE\footnotemark }処理を行なう.
    NOEND=0の時は{\rm ENDFILE}処理を行なわない.

    \footnotetext{\rm ENDFILE処理を行なうと,
                      HITACでは操作対象となるDD名
                      {\tt FTxxFyyy}の{\tt yyy}が一つ増える}

    MODE=1とすると,
    書き込んだユニットのヘッダーのITEMとTIMEを表示する.
    \end{setumei}

  \subsection{GFREDZ  [S]  データ読み込み}
    \entry{GFREDZ}

    \begin{verbatim}
          SUBROUTINE GFREDZ
         O         ( GDATA , IEOD  ,
         I           IFILE , IJKDIM )
    \end{verbatim}


  \subsection{GFWRTZ  [S]  データ書き込み}
    \entry{GFWRTZ}

    \begin{verbatim}
          SUBROUTINE GFWRTZ
         I         ( GDATA ,
         I           JFILE , IJKDIM )
    *
          REAL       GDATA ( IJKDIM )              !" データ
          INTEGER    JFILE                         !" ファイル番号
    \end{verbatim}

\section{ファイルのオープンに関するモジュール}

  \subsection{GFROPN  [S]  ファイル読み込みオープン }
    \entry{GFROPN}

    % GFROPN.FOR 10:  1990/09/23 (日) 19:17:18
    \begin{verbatim}
          SUBROUTINE GFROPN
         M         ( IFILE ,
         I           HFILE  )
    *
          INTEGER    IFILE                    ! 装置番号
          CHARACTER  HFILE*(*)                ! ファイル名
    \end{verbatim}

    \begin{setumei}
    読み込み専用にファイルをオープンし,
    装置番号IFILE番に割り当てる.
    IFILE番がすでに接続されている場合には,
    IFILE番以降で空いている装置番号を捜して割り当て,
    割り当てた装置番号をIFILEに返す.

    ファイル名として数字(例えばHFILE='20')を指定した場合は,
    その装置番号がすでにファイルに接続されていると見なして,
    何もせずにファイル名を整数に変換してIFILEに返す.
    ファイル名として, 'CON'を指定した場合は,
    5をIFILEとして返す.

    ファイルの形式は順データセット, 書式なしである.
    ファイルが存在しなかった場合はエラーを表示し停止する.
    \end{setumei}

  \subsection{GFWOPN  [S]  ファイル書き込みオープン }
    \entry{GFWOPN}

    % GFROPN.FOR 31:  1990/09/23 (日) 19:17:18
    \begin{verbatim}
          SUBROUTINE GFWOPN
         M         ( IFILE ,
         I           HFILE  )
    *
          INTEGER    IFILE                    ! 装置番号
          CHARACTER  HFILE*(*)                ! ファイル名
    *
    \end{verbatim}

    \begin{setumei}
    書き込み専用にファイルをオープンし,
    装置番号IFILE番に割り当てる.
    IFILE番がすでに接続されている場合には,
    IFILE番以降で空いている装置番号を捜して割り当て,
    割り当てた装置番号をIFILEに返す.

    ファイル名として数字(例えばHFILE='20')を指定した場合は,
    その装置番号がすでにファイルに接続されていると見なして,
    何もせずにファイル名を整数に変換してIFILEに返す.
    ファイル名として, 'CON'を指定した場合は,
    6をIFILEとして返す.

    ファイルの形式は順データセット, 書式なしである.
    オープンエラーが発生した場合はエラーを表示し停止する.
    \end{setumei}

  \subsection{GFCLSE  [S]  ファイルのクローズ }
    \entry{GFCLSE}

    % GFROPN.FOR 52:  1990/09/23 (日) 19:17:18
    \begin{verbatim}
          SUBROUTINE GFCLSE
         M         ( IFILE  )
    *
          INTEGER    IFILE                    ! 装置番号
    \end{verbatim}

    \begin{setumei}
    装置番号IFILEのファイルをクローズする.
    IFILEとして, 1〜99以外のものを指定したときには
    何もしない.
    \end{setumei}

  \subsection{GFOPEN  [S]  ファイルのオープン }
    \entry{GFOPEN}

    % GFOPEN.FOR 10:  1990/09/23 (日) 19:16:21
    \begin{verbatim}
          SUBROUTINE GFOPEN
         O         ( IFILE , IERR  ,
         I           HFILE , IFILED, HACT  , HFORM   )
    *
          INTEGER    IFILE                       ! 装置番号
          INTEGER    IERR                        ! エラー≠０
          CHARACTER  HFILE *(*)                  ! ファイル名
          INTEGER    IFILED                      ! デフォルト装置番号
          CHARACTER  HACT  *(*)                  ! 読み／書き
          CHARACTER  HFORM *(*)                  ! フォーマット
    \end{verbatim}

    \begin{setumei}
    ファイルをオープンし,
    装置番号IFILED番に割り当てる.
    IFILED番がすでに接続されている場合には,
    IFILED番以降で空いている装置番号を捜して割り当てる.
    割り当てた装置番号をIFILEに返す.

    ファイル名として数字(例えばHFILE='20')を指定した場合は,
    その装置番号がすでにファイルに接続されていると見なして,
    何もせずにファイル名を整数に変換してIFILEに返す.
    ファイル名として, 'CON'を指定した場合は,
    読み込み用の場合は5を,
    書き込み用の場合は6をIFILEとして返す.

    ファイルの形式は順データセットとする.
    HACTが'READ'の場合は読み込み専用,
    HACTが'WRITE'の場合は書き込み専用となる.
    HFORMが'FORMATTED'の場合は書式つき,
    HFORMが'UNFORMATTED'の場合は書式なしとしてオープンする.

    オープンエラーが発生した場合は,
    エラーコード(0以外)をIERRに返す.
    読み込み用にオープンする場合でファイルが存在しないときは
    エラーコード1を返す.
    エラーが起きた場合, IFILEには0が入る.
    \end{setumei}

  \subsection{GFAOPN  [S]  ファイル追加書き込みオープン}
    \entry{GFAOPN}

    \begin{verbatim}
          SUBROUTINE GFAOPN
         M         ( IFILE ,
         I           HFILE  )
    *
          INTEGER    IFILE                    !" 装置番号
          CHARACTER  HFILE*(*)                !" ファイル名
    \end{verbatim}


  \subsection{GFOOPN  [S]  ファイル(追加)書き込みオープン}
    \entry{GFOOPN}

    \begin{verbatim}
          SUBROUTINE GFOOPN
         M         ( IFILE ,
         I           HFILX , OAPPND  )
    *
          INTEGER    IFILE                    !" 装置番号
          CHARACTER  HFILX*(*)                !" ファイル名
          LOGICAL    OAPPND                   !" 追加?
    \end{verbatim}


  \subsection{GFROPQ  [S]  ファイル名取得＆読み込みオープン}
    \entry{GFROPQ}

    \begin{verbatim}
          SUBROUTINE GFROPQ
         O         ( IFILE ,
         I           HINQ   )
    \end{verbatim}


  \subsection{GFWOPQ  [ES] ファイル名取得＆書き込みオープン}
    \entry{GFWOPQ}

    \begin{verbatim}
          ENTRY      GFWOPQ
         O         ( IFILE ,
         I           HINQ   )
    *
          INTEGER    IFILE                    !" 装置番号
          CHARACTER  HINQ  *(*)
    \end{verbatim}


  \subsection{GFAOPQ  [ES] ファイル名取得＆追加書き込みオープン}
    \entry{GFAOPQ}

    \begin{verbatim}
          ENTRY      GFAOPQ
         O         ( IFILE ,
         I           HINQ   )
    *
          INTEGER    IFILE                    !" 装置番号
          CHARACTER  HINQ  *(*)
    \end{verbatim}


  \subsection{GFOOPQ  [ES]  ファイル名取得＆(追加)書き込みオープン}
        \entry{GFOOPQ}

        \begin{verbatim}
              ENTRY      GFOOPQ
             M         ( IFILE ,
             I           HINQ    )
        *
              INTEGER    IFILE                    !" 装置番号
              CHARACTER  HINQ  *(*)
        \end{verbatim}


    \section{そのほかのモジュール}

      \subsection{GFSADJ  [ES]  整合寸法の設定 }
    \entry{GFSADJ}

    % GFQADJ.FOR 29:  1990/09/23 (日) 19:16:40
    \begin{verbatim}
          ENTRY      GFSADJ
         I         ( IXDIM , IYDIM , IZDIM )
    *
          INTEGER    IXDIM                       ! 第1次元の整合寸法
          INTEGER    IYDIM                       ! 第2次元の整合寸法
          INTEGER    IZDIM                       ! 第3次元の整合寸法
    \end{verbatim}

    \begin{setumei}
    \GTOOL3では,
    通常はデータを配列に隙間なく入れて処理を行なう.
    従って, \モジ{GFREAD}, \モジ{GFRDSL}はデータを配列に隙間なく詰め込み,
    \モジ{GFWRIT}は隙間なく詰め込んであるものとして扱う.
    \GTOOL3を用いていないプログラムでは,
    必ずしもそのような形式になっているとは限らない.
    そのような場合など,
    配列の一部に入っているデータを\GTOOL3形式で入出力したい場合に,
    データの整合寸法をこのモジュールによって指定する.

    IXDIM, IYDIM, IZDIMが0以外の時には,
    データが,
       \begin{verbatim}
             REAL    DATA ( IXDIM, IYDIM, IZDIM )
       \end{verbatim}
    というように宣言されており,
    各々その始めの(添字1からデータの寸法までの)
    部分にデータが入っているものとして処理を行なう.
    もとに戻すには全て0を指定する.

    \vspace{3mm}

    例えば, 大循環モデルプログラム{\rm GCM5}の{\rm T42}版においては
    第{\rm 1}次元方向に{\rm 128}個の格子点があるが,
    バンクコンフリクトを避けるなどの目的から
    配列の第{\rm 1}次元の寸法を{\rm 130}にとっている.
    このような場合,

    \begin{verbatim}
          CALL GFSADJ ( 130, 0  , 0  )
    \end{verbatim}

    ととることによって,
    配列の第{\rm 1}次元の寸法が{\rm 130}であり,
    その始めの部分にデータが入っていると
    GFREAD, GFRDSL, GFWRITに知らせることができ,
    データを書き換えずにそのまま読み書きができる.
    この場合のように
    第{\rm 2}次元, 第{\rm 3}次元方向には
    通常どおり隙間なく入っている場合は
    0を指定しておけばよい.

    この整合寸法の指定が有効なのは
    モジュールGFREAD, GFRDSL, GFWRITだけであり,
    それ以外のモジュールには通用しないので
    注意されたい.

    現在の設定状態は次のGFQADJによって参照できる.
    \end{setumei}

  \subsection{GFQADJ  [S]  整合寸法の参照 }
    \entry{GFQADJ}

    % GFQADJ.FOR 9:  1990/09/23 (日) 19:16:40
    \begin{verbatim}
          SUBROUTINE GFQADJ
         I         ( IXDIM , IYDIM , IZDIM )
    *
          INTEGER    IXDIM                       ! 第1次元の整合寸法
          INTEGER    IYDIM                       ! 第2次元の整合寸法
          INTEGER    IZDIM                       ! 第3次元の整合寸法
    \end{verbatim}

    \begin{setumei}
    \モジ{GFSADJ}参照.
    \end{setumei}

  \subsection{GFWTTS  [ES] GTOOL3標準フォーマット時間設定出力}
    \entry{GFWTTS}

    \begin{verbatim}
          ENTRY      GFWTTS
         I         ( HHEAD , GDATA ,
         I           IT    , IDATE , IDNUM , ITDUR ,
         I           JFILE , IOMODE, NOEND           )
    *
          CHARACTER  HHEAD ( * )*(*)             !" ヘッダー
          REAL       GDATA ( * )                 !" データ
          INTEGER    IEOD                        !" データ有：０ 無：１
          INTEGER    IT                          !" 通し時間
          INTEGER    IDATE ( * )                 !" 時刻：年月日時分秒
          INTEGER    IDNUM                       !" データ番号
          INTEGER    ITDUR                       !" 代表時間
          INTEGER    JFILE                       !" 出力ファイル番号
          INTEGER    IOMODE                      !" 入出力モード
          INTEGER    NOEND                       !" ENDFILE間隔
    \end{verbatim}

  \subsection{GFRDTS  [S]  GTOOL3標準フォーマット入力時間取得}
    \entry{GFRDTS}

    \begin{verbatim}
          SUBROUTINE GFRDTS
         O         ( HHEAD , GDATA , IEOD  ,
         O           IT    , IDATE , IDNUM , ITDUR ,
         I           HPSEL , HSEL  , ISEL  ,
         I           IFILE , IOMODE                 )
    *
          CHARACTER  HHEAD ( * )*(*)             !" ヘッダー
          REAL       GDATA ( * )                 !" データ
          INTEGER    IEOD                        !" データ有：０ 無：１
          INTEGER    IT                          !" 通し時間
          INTEGER    IDATE ( * )                 !" 時刻：年月日時分秒
          INTEGER    IDNUM                       !" データ番号
          INTEGER    ITDUR                       !" 代表時間
          CHARACTER  HPSEL *(*)                  !" 選択する欄
          CHARACTER  HSEL  *(*)                  !" 選択するデータ(文
    *    (INTEGER)   ISEL                        !" 選択するデータ(数
          INTEGER    IFILE                       !" 入力ファイル番号
          INTEGER    IOMODE                      !" 入出力モード
          INTEGER    NOEND                       !" ENDFILE間隔
    \end{verbatim}


% Local Variables: 
% mode: japanese-latex
% TeX-master: "gtool"
% End: 

