!= Module TimeSet
!
! Authors::   SUGIYAMA Ko-ichiro, ODAKA Masatsugu
! Version::   $Id: timeset.f90,v 1.2 2011-04-26 04:08:11 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 timeset
  !
  !引数に与えられた NAMELIST ファイルから, 時刻に関する情報を取得し, 
  !保管するための変数型モジュール
  !
  
  !モジュール読み込み
  use dc_types,   only: DP
  use dc_iounit,  only: FileOpen
  use dc_message, only: MessageNotify
  use mpi_wrapper, only: myrank
  
  !暗黙の型宣言禁止
  implicit none
  
  ! Public Interface
  real(DP), save, public  :: DelTime      = 2.0d0  !長いタイムステップ
  real(DP), save, public  :: DelTimeLong  = 2.0d0  !長いタイムステップ
  real(DP), save, public  :: DelTimeShort = 2.0d-1 !短いタイムステップ
  real(DP), save, public  :: StartTime  = 0.0d0    !計算開始時刻
  real(DP), save, public  :: EndTime    = 3600.0d0 !計算終了時刻
  integer, save, public   :: NstepLong  = 1800     !長いタイムステップのステップ数
  integer, save, public   :: NstepShort = 20       !短いタイムステップのステップ数
  
contains
  
  subroutine timeset_init(cfgfile)
    !
    !NAMELIST から必要な情報を読み取り, 時間関連の変数の設定を行う. 
    !

    !暗黙の型宣言禁止
    implicit none

    !入力変数
    character(*), intent(in)      :: cfgfile

    !内部変数
    integer    :: unit
    integer    :: myrank = 0

    !---------------------------------------------------------------    
    ! NAMELIST から情報を取得
    !
    NAMELIST /timeset_nml/ &
      & DelTimeLong, DelTimeShort, EndTime, StartTime, DelTime
    
    call FileOpen(unit, file=cfgfile, mode='r')
    read(unit, NML=timeset_nml)
    close(unit)
    
    !---------------------------------------------------------------
    ! ループ回数の設定
    !
    NstepLong = nint( (EndTime - StartTime) / DelTimeLong )
    NstepShort = 2 * nint( DelTimeLong / DelTimeShort )
    
    !積分時間が長い時間ステップで割り切れない場合には警告を出す
    if(mod((EndTime - StartTime), DelTimeLong) /= 0) then 
      call MessageNotify( "W", &
        & "timeset_init", "mod((EndTime - StartTime), DelTimeLong) is not zero")
    end if
    
    !長い時間ステップが短い時間ステップで割り切れない場合には警告を出す
    if(mod(DelTimeLong, DelTimeShort) /= 0) then 
      call MessageNotify( "W", &
        & "timeset_init", "mod(DelTimeLong, DelTimeShort) is not zero")
    end if
    
    !---------------------------------------------------------------
    ! 確認
    !
    if (myrank == 0) then
      call MessageNotify( "M", &
        & "timeset_init", "DelTimeLong  = %f", d=(/DelTimeLong/) )
      call MessageNotify( "M", &
        & "timeset_init", "DelTimeShort = %f", d=(/DelTimeShort/) )
      call MessageNotify( "M", &
        & "timeset_init", "NstepLong  = %d", i=(/NstepLong/) )
      call MessageNotify( "M", &
        & "timeset_init", "NstepShort = %d", i=(/NstepShort/) )
      call MessageNotify( "M", &
        & "timeset_init", "StartTime  = %f",  d=(/StartTime/)  )
      call MessageNotify( "M", &
        & "timeset_init", "EndTime    = %f", d=(/EndTime/) )
    end if
   
  end subroutine timeset_init
  
end module timeset
