!---------------------------------------------------------------------
!     Copyright (C) GFD Dennou Club, 2004. All rights reserved.
!---------------------------------------------------------------------
                                                                 !=begin
!= Module TimeSet
!
!   * Developer: SUGIYAMA Ko-ichiro (sugiyama@gfd-dennou.org)
!   * Version: $Id: timeset.f90,v 1.2.4.1 2006/01/13 06:55:05 sugiyama Exp $ 
!   * Tag Name: $Name:  $
!   * Change History: 
!
!== Overview 
!
!NAMELIST から時間の設定を行うモジュール
!
!== Error Handling
!
!== Known Bugs
!
!== Note
!
!== Future Plans
!
!
                                                                 !=end

module timeset
  implicit none
  save
                                                                 !=begin
  !== Public Interface
  real(8)           :: DelTimeLong   !長いタイムステップ
  real(8)           :: DelTimeShort  !短いタイムステップ
  real(8)           :: TimeInt    !積分時間
  real(8)           :: TimeDisp   !ファイル出力する時間間隔
  integer           :: NstepLong !長いタイムステップのステップ数
  integer           :: NstepShort!短いタイムステップのステップ数
                                                                 !=end  
contains
                                                                 !=begin
  !== Procedure Interface 
  !
  !=== Initialize module and acquire NAMELIST
  !
  !NAMELIST から必要な情報を読み取り, 時間関連の変数の設定を行う. 
  !
  subroutine timeset_init(cfgfile)

    !=== Dependency
    use dc_trace,      only: BeginSub, EndSub 
    use dc_message,    only: MessageNotify

    !=== Input
    character(*), intent(in) :: cfgfile
    
    !=== NAMELIST
    NAMELIST /timeset/ &
         & DelTimeLong, DelTimeShort, TimeInt, TimeDisp
                                                                 !=end    

    call BeginSub("timeset_init", &
&                 fmt="%c",       &
&                 c1="Initialize parameters of time integration. ")
        
    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("Message", "timeset_init", &
&                         "mod(TimeInt, DelTimeLong) is not zero")
    end if
    
    !=== 長い時間ステップが短い時間ステップで割り切れない場合には警告を出す
    if(mod(DelTimeLong, DelTimeShort) /= 0) then 
       call MessageNotify("Message", "timeset_init", &
&                         "mod(DelTimeLong, DelTimeShort) is not zero")
    end if

    !=== 積分時間が出力時間間隔で割り切れない場合には警告を出す
    if(mod(TimeDisp, DelTimeLong) /= 0) then 
       call MessageNotify("Message", "timeset_init", &
&                         "mod(TimeDisp, DelTimeLong) is not zero")
    end if


    !==== 確認
    write(*,*) "DelTimeLong, DelTimeShort", DelTimeLong, DelTimeShort
!    write(*,*) "TimeInt", TimeInt
!    write(*,*) "TimeDisp", TimeDisp
    write(*,*) "NstepLong, NstepShort", NstepLong, NstepShort

    call EndSub("timeset_init")

  end subroutine timeset_init
  
end module timeset
