!= Module FileSet
!
! Authors::   SUGIYAMA Ko-ichiro
! Version::   $Id: fileset.f90,v 1.1 2011-04-26 04:08:10 sugiyama Exp $ 
! Tag Name::  $Name:  $
! 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 mpi_wrapper, only: myrank

  !暗黙の型宣言禁止
  implicit none

  private

  !公開変数
  character(STRING), save, public :: InputFile = ""                     !リスタートファイル
  character(STRING), save, public :: InputFilePrefix = ""               !リスタートファイル
  character(STRING), save, public :: OutputFile = ""                    !リスタートファイル
  character(STRING), save, public :: OutputFilePrefix = ""              !リスタートファイル
  character(STRING), save, public :: HistoryFile  = "deepconv"     !ヒストリーファイル接頭詞
  character(STRING), save, public :: HistoryFilePrefix = "deepconv"     !ヒストリーファイル接頭詞
  character(STRING), save, public :: DefaultFilePrefix = ""             !ヒストリファイル名
  character(STRING), save, public :: FileTitle = 'Simulation of an atmosphere of planet with the land and the ocean'
                              ! 出力データファイルの表題.
                              ! Title of output data files
  character(STRING), save, public :: FileSource = 'deepconv/arare5 $Name:  $ (http://www.gfd-dennou.org/library/deepconv)'
                              ! データファイル作成の手段. 
                              ! Source of data file
  character(STRING), save, public :: FileInstitution = 'GFD Dennou Club (http://www.gfd-dennou.org)'
                              ! データファイルを最終的に変更した組織/個人. 
                              ! Institution or person that changes data files for the last time
  public fileset_init


contains

  subroutine fileset_init(cfgfile)
    !
    !NAMELIST からファイル名に付けるタグを得て, 出力ファイル名を作成する. 
    !
    
    !暗黙の型宣言禁止
    implicit none
    
    !入力変数
    character(STRING), intent(in) :: cfgfile
    integer                       :: unit     !装置番号
    character(3)                  :: Rank 
    
    !NAMELIST から情報を取得
    NAMELIST /fileset_nml/   &
      & InputFilePrefix, OutputFilePrefix, HistoryFilePrefix, &
      & FileTitle, FileSource, FileInstitution, HistoryFile  
    
    call FileOpen(unit, file=cfgfile, mode='r')
    read(unit, NML=fileset_nml)
    close(unit)
    
    !ノード番号を用意
    call fileset_setnum(rank) !(inout)
    
    ! InitialFile
    if (trim(InputFilePrefix) /= '') then 
      InputFile = trim(InputFilePrefix)//"-rank"//trim(rank)//"_restart.nc"
    end if
    
    ! HistoryFile の接頭詞
    DefaultFilePrefix = trim(HistoryFilePrefix)//"-rank"//trim(rank)//"_"
    
    ! リスタートファイル
    OutputFile  = trim(OutputFilePrefix)//"-rank"//trim(rank)//"_restart.nc" 
    
    !確認
    if (myrank == 0) then 
      call MessageNotify( "M", &
        & "fileset_init", "HistoryFilePrefix=%c", c1=trim(HistoryFilePrefix) )
      call MessageNotify( "M", &
        & "fileset_init", "InputFilePrefix=%c", c1=trim(InputFilePrefix) )
      call MessageNotify( "M", &
        & "fileset_init", "OutputFilePrefix=%c", c1=trim(OutputFilePrefix) )
      call MessageNotify( "M", &
        & "fileset_init", "DefaultFilePrefix=%c", c1=trim(DefaultFilePrefix) )
      call MessageNotify( "M", &
        & "fileset_init", "FileTitle = %c",    c1=trim(FileTitle) )
      call MessageNotify( "M", &
        & "fileset_init", "FileSource = %c",   c1=trim(FileSource) )
      call MessageNotify( "M", &
        & "fileset_init", "FileInstitution = %c", c1=trim(FileInstitution) )
    end if

  end subroutine fileset_init


  subroutine fileset_setnum(rank)

    character(3), intent(inout) :: rank 

   !ノード番号の文字列化
   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
