!= Module HistoryFileIO
!
! Authors::   SUGIYAMA Ko-ichiro
! Version::   $Id: historyfileio.f90,v 1.9 2014/03/04 05:55:04 sugiyama Exp $ 
! Tag Name::  $Name:  $
! Copyright:: Copyright (C) GFD Dennou Club, 2006. All rights reserved.
! License::   See COPYRIGHT[link:../../COPYRIGHT]


module HistoryFileIO
  !
  !ファイル出力. 長い時間ステップの値を出力.
  !

  ! 種別型パラメタ
  ! Kind type parameter
  !
  use gtool_historyauto, only: HistoryAutoCreate, HistoryAutoClose, &
    & HistoryAutoAddAttr, HistoryAutoAddWeight, HistoryAutoPutAxis, &
    & HistoryAutoAddVariable

  ! ファイル入出力補助
  ! File I/O support
  !
  use dc_iounit, only: FileOpen
  
  ! 種別型パラメタ
  ! Kind type parameter
  !
  use dc_types, only: DP, &      ! 倍精度実数型. Double precision. 
    &                 STRING, &  ! 文字列.       Strings. 
    &                 TOKEN,  &  ! キーワード.   Keywords. 
    &                 STDOUT     ! 標準出力の装置番号. Unit number of standard output

  use fileset,  only: exptitle,         &!データの表題
    &                 expsrc,           &!データを作成する手順
    &                 expinst            !最終変更者・組織
  use basicset, only: SpcWetSymbol
  use gridset,  only: SpcNum,            &
    &                 s_X,               &!X 座標軸(スカラー格子点)
    &                 s_Z,               &!Z 座標軸(スカラー格子点)
    &                 FileNX,            &!X 方向の格子点(ファイル出力)
    &                 FileNZ,            &!Z 方向の格子点(ファイル出力)
    &                 FileXMin,          &!X 方向の配列の下限(ファイル出力)
    &                 FileXMax,          &!X 方向の配列の上限(ファイル出力)
    &                 FileZMin,          &!Z 方向の配列の下限(ファイル出力)
    &                 FileZMax            !Z 方向の配列の上限(ファイル出力)
  use timeset,  only: TimeInt

  !暗黙の型宣言禁止
  implicit none
  
  !属性の指定
  private

  logical, parameter :: FLAG_LIB_MPI = .false.

  !公開手続き
  public HistoryFileIO_init
  public HistoryFileIO_finalize

  ! 非公開変数
  ! Private variables
  !
  character(STRING), parameter:: module_name = 'historyfileio'
                              ! モジュールの名称. 
                              ! Module name
  character(STRING), parameter:: version = &
    & '$Name:  $' // &
    & '$Id: historyfileio.f90,v 1.9 2014/03/04 05:55:04 sugiyama Exp $'
                              ! モジュールのバージョン
                              ! Module version

contains 

!!!------------------------------------------------------------------------
  subroutine HistoryFileIO_init( TimeN, cfgfile )
    !
    ! history_file_io モジュールの初期化を行います. 
    !--
    ! NAMELIST#history_file_io_nml の読み込みはこの手続きで行われます. 
    !++
    !
    ! "history_file_io" module is initialized. 
    !--
    ! "NAMELIST#history_file_io_nml" is loaded in this procedure. 
    !++
    !

    ! モジュール引用 ; USE statements
    !

    ! gtool5 netCDF データの入出力インターフェース (大規模モデル用)
    ! Interface of Input/Output of gtool5 netCDF data (For large models)
    !

    ! 宣言文 ; Declaration statements
    !
    implicit none
    
    !変数定義
    real(DP),     intent(in) :: TimeN
    character(*), intent(in) :: cfgfile
    real(DP), parameter      :: TimeDisp = 1.0e5 !出力間隔のデフォルト値
    real(DP)                 :: Restarttime
    real(DP)                 :: EndTime
    integer                  :: l

    RestartTime = TimeN
    EndTime = TimeN + TimeInt

    !-----------------------------------------------------------
    ! ヒストリー作成
    !-----------------------------------------------------------
    call HistoryAutoCreate(                             &
      & title = exptitle,                               &
      & source = expsrc,                                &
      & institution = expinst,                          &
      & dims=(/'x','z','t'/),                           &
      & dimsizes=(/FileNX, FileNZ, 0/),                 &
      & longnames=(/'x-coordinate',                     &
      &             'z-coordinate',                     &
      &             'time        '/),                   &
      & units=(/'m  ','m  ','sec'/),                    &
      & xtypes=(/'float ','float ','double'/),          &
      & origin   = Restarttime,                         & 
      & terminus = EndTime,                             &
      & interval = TimeDisp,                            &
      & flag_mpi_split = FLAG_LIB_MPI,                  &
      & namelist_filename = cfgfile )  

    call HistoryAutoAddAttr( &
      & varname = 'x', attrname = 'standard_name', &   ! (in)
      & value = 'x-coordinate' )                       ! (in)
    call HistoryAutoAddAttr( &
      & varname = 'z', attrname = 'standard_name', &   ! (in)
      & value = 'z-coordinate' )                       ! (in)
    
    call HistoryAutoPutAxis('x', s_X(FileXMin:FileXMax))
    call HistoryAutoPutAxis('z', s_Z(FileZMin:FileZMax))

    !無次元圧力の擾乱
    call HistoryAutoAddVariable(  &
      & varname='Exner',      &  
      & dims=(/'x','z','t'/), &
      & longname='disturbunce of nondimensional pressure', &
      & units=' ',            &        
      & xtype='float' )
    
    !温位の擾乱
    call HistoryAutoAddVariable(  &
      & varname='PotTemp',    &
      & dims=(/'x','z','t'/), &
      & longname='disturbunce of potential temperature',  &
      & units='K',            &
      & xtype='float' )

    !水平速度
    call HistoryAutoAddVariable(  &
      & varname='VelX',       &
      & dims=(/'x','z','t'/), &
      & longname='zonal velocity', &
      & units='m.s-1',      &
      & xtype='float' )

    !鉛直速度
    call HistoryAutoAddVariable(  &
      & varname='VelZ',       &
      & dims=(/'x','z','t'/), &
      & longname='vertical velocity', &
      & units='m.s-1',      &
      & xtype='float' )

    !渦粘性係数(運動量)
    call HistoryAutoAddVariable(  &
      & varname='Km',         &
      & dims=(/'x','z','t'/), &
      & longname='turbulet diffusion coefficient', &
      & units='m2.s-1',            &
      & xtype='float' )
  
    !渦粘性係数(熱)
    call HistoryAutoAddVariable(  &
      & varname='Kh',         &
      & dims=(/'x','z','t'/), &
      & longname='turbulet diffusion coefficient for heat', &
      & units='m2.s-1',            &
      & xtype='float')

    !混合比
    do l = 1, SpcNum
      call HistoryAutoAddVariable(                         &
        & varname=trim(SpcWetSymbol(l)),                   &
        & dims=(/'x','z','t'/),                        &
        & longname=trim(SpcWetSymbol(l))//' Mixing Ratio', &
        & units='kg.kg-1',                                 &
        & xtype='float')

      call HistoryAutoAddVariable(                         &
        & varname=trim(SpcWetSymbol(l))//'All',            &
        & dims=(/'x','z','t'/),                        &
        & longname=trim(SpcWetSymbol(l))//' Mixing Ratio', &
        & units='kg.kg-1',                                 &
        & xtype='float')
    end do
    
  end subroutine HistoryFileIO_init


  subroutine HistoryFileIO_finalize
    !
    ! ヒストリデータファイル出力の終了処理を行います. 
    !
    ! Terminate history data files output. 

    ! モジュール引用 ; USE statements
    !

    ! 宣言文 ; Declaration statements
    !
    implicit none

    ! 作業変数
    ! Work variables
    !

    ! 実行文 ; Executable statement
    !

    call HistoryAutoClose

  end subroutine HistoryFileIO_finalize
  
end module HistoryFileIO
