!= Module TimeSet
!
! Authors::   SUGIYAMA Ko-ichiro
! Version::   $Id: timeset.f90,v 1.3 2006/09/30 05:53:59 odakker Exp $ 
! Tag Name::  $Name: arare4-20061224 $
! 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_message, only: MessageNotify
  
  !暗黙の型宣言禁止
  implicit none

  !save 属性
  save

  ! Public Interface
  real(8)           :: DelTimeLong    !長いタイムステップ
  real(8)           :: DelTimeShort   !短いタイムステップ
  real(8)           :: TimeInt        !積分時間
  real(8)           :: TimeDisp       !ファイル出力する時間間隔
  real(8)           :: DayTime        ! 1 日の長さ [s]
  integer           :: NstepLong      !長いタイムステップのステップ数
  integer           :: NstepShort     !短いタイムステップのステップ数

contains

  subroutine timeset_init(cfgfile)
    !
    !NAMELIST から必要な情報を読み取り, 時間関連の変数の設定を行う. 
    !

    !暗黙の型宣言禁止
    implicit none

    !入力変数
    character(*), intent(in) :: cfgfile
    
    !NAMELIST から情報を取得
    NAMELIST /timeset/ &
         & DelTimeLong, DelTimeShort, TimeInt, TimeDisp, DayTime
    
    open (10, FILE=cfgfile)
    read(10, NML=timeset)
    close(10)

    !---------------------------------------------------------------
    ! ループ回数の設定
    !---------------------------------------------------------------
    NstepLong = nint( TimeInt / DelTimeLong )
    NstepShort = 2 * nint( DelTimeLong / DelTimeShort )
    
    !積分時間が長い時間ステップで割り切れない場合には警告を出す
    if(mod(TimeInt, DelTimeLong) /= 0) then 
      call MessageNotify( "W", &
        & "timeset_init", "mod(TimeInt, 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(mod(TimeDisp, DelTimeLong) /= 0) then 
      call MessageNotify( "W", &
        & "timeset_init", "mod(TimeDisp, DelTimeLong) is not zero")
    end if
        
    !---------------------------------------------------------------
    ! 確認
    !---------------------------------------------------------------
    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", "TimeInt = %f",  d=(/TimeInt/)  )
    call MessageNotify( "M", &
      & "timeset_init", "TimeDisp= %f", d=(/TimeDisp/) )
    call MessageNotify( "M", &
      & "timeset_init", "DayTime= %f",  d=(/DayTime/)  )
   
  end subroutine timeset_init
  
end module timeset
