!= Module FileSet
!
! Authors::   SUGIYAMA Ko-ichiro
! Version::   $Id: fileset.f90,v 1.8 2011-04-05 14:46:54 sugiyama Exp $ 
! Tag Name::  $Name: arare4-20111215 $
! Copyright:: Copyright (C) GFD Dennou Club, 2006. All rights reserved.
! License::   See COPYRIGHT[link:../../COPYRIGHT]
!
!== Overview 
!
!引数に与えられた NAMELIST ファイルから, ファイル名や表題等の情報を取得し
!保管するための変数型モジュール
!
!== Error Handling
!
!== Known Bugs
!
!== Note
!
!== Future Plans
!

module fileset
  !
  !引数に与えられた NAMELIST ファイルから, I/O ファイル名を取得し, 
  !保管するための変数型モジュール
  !

  !モジュール読み込み
  use dc_types,      only : STRING 
  use dc_iounit,     only : FileOpen
  use dc_message,    only : MessageNotify
  use gtool_history, only: gt_history
  use gridset,       only: SpcNum       !凝縮成分の数
  use basicset,      only: SpcWetSymbol !湿潤成分の化学種名

  !暗黙の型宣言禁止
  implicit none

   !公開変数
  character(STRING), save, public :: InitFile          = ""                    !初期値ファイル
  character(STRING), save, public :: InitFilePrefix    = ""                    !初期値ファイル
  character(STRING), save, public :: HistoryFilePrefix = "deepconv"            !ヒストリーファイル接頭詞
  character(STRING), save, public :: ReStartFile       = ""                    !リスタートファイル
  character(STRING), save, public :: RandomFile        = "rand.dat"            !乱数ファイル
  character(STRING), save, public :: ExpTitle = "2D cumulus model deepconv/arare"         !データの表題
  character(STRING), save, public :: ExpSrc   = "GFD_Dennou_Club deepconv project (arare)"!データを作成する手順
  character(STRING), save, public :: ExpInst  = "deepconv@gfd-dennou.org"                 !最終変更者・組織
  character(STRING), save, public :: DefaultFilePrefix = ""                    !ヒストリファイル名
  type(gt_history),allocatable, save, public   :: gt_hist(:)                   !gt_history 型構造体
  character(STRING), allocatable, save, public :: HistoryFile(:)               !出力ファイル名
  integer, save, public           :: FileNum = 10                              !出力ファイル数
  character(3), save              :: Rank = ""                                 !ノード番号
  integer, save                   :: myrank = 0

!  character(80) :: InitFile          !初期値ファイル
!  character(80) :: HistoryFilePrefix !ヒストリーファイル接頭詞
!  character(80) :: ReStartFile       !リスタートファイル
!  character(80) :: RandomFile        !乱数ファイaル
!  character(80) :: ExpTitle          !データの表題
!  character(80) :: ExpSrc            !データを作成する手順
!  character(80) :: ExpInst           !最終変更者・組織
!  character(len=100), allocatable :: HistoryFile(:) !出力ファイル名
!  integer                         :: FileNum        !出力ファイル数
!  type(gt_history),allocatable    :: gt_hist(:)     !gt_history 型構造体

contains

  subroutine fileset_init(cfgfile, cpurank)
    !
    !NAMELIST からファイル名に付けるタグを得て, 出力ファイル名を作成する. 
    !

    !暗黙の型宣言禁止
    implicit none

    !入力変数
    character(*), intent(in)      :: cfgfile
    integer, intent(in), optional :: cpurank    
    integer                       :: unit     !装置番号
    integer                       :: s         !ループ添字

    !NAMELIST から情報を取得
    NAMELIST /fileset/                                                        &
      & InitFile, InitFilePrefix, HistoryFilePrefix, ReStartFile, RandomFile, &
      & ExpTitle, ExpSrc, ExpInst

    call FileOpen(unit, file=cfgfile, mode='r')
    read(unit, NML=fileset)
    close(unit)

    !ノード番号を用意
    if (present(cpurank)) then 
      myrank = cpurank
    end if
    call fileset_setnum()    
    
    !ファイル名を格納する配列の割り付け
    !  次元数は
    !    PotTemp, Exner, VelX, VelZ, MixRt(SpcNum), Km, Kh
    !    *BasicZ, *Zprof, SurfaceFlux(2010年12月追加), FallRain(2010年12月追加)
    !  の合計 10 + SpcNum
    
    FileNum = 10 + SpcNum
    allocate(HistoryFile(FileNum))
    allocate(gt_hist(FileNum))

    ! InitFile が空だが InitFilePrefix が空でない場合は, InitFilePrefix 利用
    if (trim(InitFile) == '' .AND. trim(InitFilePrefix) /= '') then 
      InitFile = trim(InitFilePrefix)//"-rank"//trim(rank)//"_restart.nc"
    end if

    DefaultFilePrefix = trim(HistoryFilePrefix)//"-gt5-rank"//trim(rank)//"_"

    HistoryFile(1) = trim(HistoryFilePrefix)//"-rank"//trim(rank)//"_Exner.nc" 
    HistoryFile(2) = trim(HistoryFilePrefix)//"-rank"//trim(rank)//"_PotTemp.nc" 
    HistoryFile(3) = trim(HistoryFilePrefix)//"-rank"//trim(rank)//"_VelX.nc" 
    HistoryFile(4) = trim(HistoryFilePrefix)//"-rank"//trim(rank)//"_VelZ.nc" 
    HistoryFile(5) = trim(HistoryFilePrefix)//"-rank"//trim(rank)//"_Km.nc" 
    HistoryFile(6) = trim(HistoryFilePrefix)//"-rank"//trim(rank)//"_Kh.nc" 
    HistoryFile(7) = trim(HistoryFilePrefix)//"-rank"//trim(rank)//"_BasicZ.nc" 
    HistoryFile(8) = trim(HistoryFilePrefix)//"-rank"//trim(rank)//"_Zprof.nc" 
    !地表面フラックスの出力先のファイル名
    HistoryFile(8+SpcNum+1) = trim(HistoryFilePrefix)//"-rank"//trim(rank)//"_SurfaceFlux.nc" 
    !雨水落下項の出力先のファイル名
    HistoryFile(8+SpcNum+2) = trim(HistoryFilePrefix)//"-rank"//trim(rank)//"_FallRain.nc" 

    do s = 1, SpcNum
      HistoryFile(8+s) = trim(HistoryFilePrefix)//"-rank"//trim(rank)//"_"//trim(SpcWetSymbol(s))//".nc"
    end do
    
    !リスタートファイル
    if (RestartFile == "") then 
      ReStartFile  = trim(HistoryFilePrefix)//"-rank"//trim(rank)//"_restart.nc" 
    end if

    !確認
    if (myrank == 0) then 
      !確認
      call MessageNotify( "M", &
        & "fileset_init", "InitFile=%c",    c1=trim(InitFile))
      call MessageNotify( "M", &
        & "fileset_init", "HistoryFilePrefix=%c", c1=trim(HistoryFilePrefix) )
      call MessageNotify( "M", &
        & "fileset_init", "ReStartFile=%c", c1=trim(ReStartFile) )
      call MessageNotify( "M", &
        & "fileset_init", "RandomFile=%c",  c1=trim(RandomFile) )
      call MessageNotify( "M", &
        & "fileset_init", "ExpTitle=%c",    c1=trim(ExpTitle) )
      call MessageNotify( "M", &
        & "fileset_init", "ExpSrc=%c",      c1=trim(ExpSrc) )
      call MessageNotify( "M", &
        & "fileset_init", "ExpInst=%c",     c1=trim(ExpInst) )
      
      do s = 1, Filenum
        call MessageNotify( "M", &
          & "fileset_init", "HistoryFile=%c", c1=trim(HistoryFile(s)) )
      end do
    end if

  end subroutine fileset_init


  subroutine fileset_setnum()

   !ノード番号の文字列化
   rank = "000"
   if (myrank < 10) then 
     write(rank(3:3), 100) myrank
100  format(I1)
   else if (myrank < 100 ) then 
     write(rank(2:3), 200) myrank
200  format(I2)
   else if (myrank < 1000 ) then 
     write(rank(1:3), 300) myrank
300  format(I3)
   end if
 end subroutine fileset_setnum
end module fileset
