SUBROUTINE Set_Timekeeping ( grid ) 5,94
USE module_domain
USE module_configure
USE esmf_mod
IMPLICIT NONE
TYPE(domain), POINTER :: grid
! Local
TYPE(ESMF_TimeInterval) :: interval, run_length
INTEGER :: start_year,start_month,start_day,start_hour,start_minute,start_second
INTEGER :: end_year,end_month,end_day,end_hour,end_minute,end_second
INTEGER :: history_interval , restart_interval , &
history_interval_mo, restart_interval_mo, &
history_interval_d, restart_interval_d, &
history_interval_h, restart_interval_h, &
history_interval_m, restart_interval_m, &
history_interval_s, restart_interval_s
INTEGER :: auxhist1_interval , auxhist2_interval , auxhist3_interval , &
auxhist1_interval_mo, auxhist2_interval_mo, auxhist3_interval_mo, &
auxhist1_interval_d, auxhist2_interval_d, auxhist3_interval_d, &
auxhist1_interval_h, auxhist2_interval_h, auxhist3_interval_h, &
auxhist1_interval_m, auxhist2_interval_m, auxhist3_interval_m, &
auxhist1_interval_s, auxhist2_interval_s, auxhist3_interval_s
INTEGER :: auxhist4_interval , auxhist5_interval, &
auxhist4_interval_mo, auxhist5_interval_mo, &
auxhist4_interval_d, auxhist5_interval_d, &
auxhist4_interval_h, auxhist5_interval_h, &
auxhist4_interval_m, auxhist5_interval_m, &
auxhist4_interval_s, auxhist5_interval_s
INTEGER :: auxinput1_interval , auxinput2_interval , auxinput3_interval , &
auxinput1_interval_mo, auxinput2_interval_mo, auxinput3_interval_mo, &
auxinput1_interval_d, auxinput2_interval_d, auxinput3_interval_d, &
auxinput1_interval_h, auxinput2_interval_h, auxinput3_interval_h, &
auxinput1_interval_m, auxinput2_interval_m, auxinput3_interval_m, &
auxinput1_interval_s, auxinput2_interval_s, auxinput3_interval_s
INTEGER :: auxinput4_interval , auxinput5_interval , &
auxinput4_interval_mo, auxinput5_interval_mo, &
auxinput4_interval_d, auxinput5_interval_d, &
auxinput4_interval_h, auxinput5_interval_h, &
auxinput4_interval_m, auxinput5_interval_m, &
auxinput4_interval_s, auxinput5_interval_s
INTEGER :: run_days, run_hours, run_minutes, run_seconds
INTEGER :: time_step, time_step_fract_num, time_step_fract_den
INTEGER :: rc
REAL :: dt
CALL get_start_year
(grid%id,start_year)
CALL get_start_month
(grid%id,start_month)
CALL get_start_day
(grid%id,start_day)
CALL get_start_hour
(grid%id,start_hour)
CALL get_start_minute
(grid%id,start_minute)
CALL get_start_second
(grid%id,start_second)
CALL ESMF_TimeSet(grid%start_time, YR=start_year, MM=start_month, DD=start_day, &
H=start_hour, M=start_minute, S=start_second )
CALL get_run_days
(run_days)
CALL get_run_hours
(run_hours)
CALL get_run_minutes
(run_minutes)
CALL get_run_seconds
(run_seconds)
IF ( run_days .gt. 0 .or. run_hours .gt. 0 .or. run_minutes .gt. 0 .or. run_seconds .gt. 0 ) THEN
CALL ESMF_TimeIntervalSet ( run_length , D=run_days, H=run_hours, M=run_minutes, S=run_seconds, rc=rc )
grid%stop_time = grid%start_time + run_length
ELSE
CALL get_end_year
(grid%id,end_year)
CALL get_end_month
(grid%id,end_month)
CALL get_end_day
(grid%id,end_day)
CALL get_end_hour
(grid%id,end_hour)
CALL get_end_minute
(grid%id,end_minute)
CALL get_end_second
(grid%id,end_second)
CALL ESMF_TimeSet(grid%stop_time, YR=end_year, MM=end_month, DD=end_day, &
H=end_hour, M=end_minute, S=end_second )
ENDIF
IF ( grid%id .EQ. head_grid%id ) THEN
CALL get_time_step
( time_step )
CALL get_time_step_fract_num
( time_step_fract_num )
CALL get_time_step_fract_den
( time_step_fract_den )
dt = real(time_step) + real(time_step_fract_num) / real(time_step_fract_den)
CALL set_dt
( grid%id, dt )
grid%dt = dt
CALL ESMF_TimeIntervalSet(head_grid%step_time, S=time_step, Sn=time_step_fract_num, Sd=time_step_fract_den, rc=rc)
ELSE
grid%step_time = grid%parents(1)%ptr%step_time / grid%parent_time_step_ratio
ENDIF
CALL ESMF_ClockSet( grid%domain_clock,TimeStep=grid%step_time,StartTime=grid%start_time, &
StopTime=grid%stop_time,rc=rc)
CALL ESMF_ClockGetAlarmList( grid%domain_clock, grid%alarms, rc )
! HISTORY INTERVAL
! history_interval is left there (and means minutes) for consistency, but
! history_interval_m will take precedence if specified
CALL get_history_interval
( grid%id, history_interval ) ! same as minutes
CALL get_history_interval_mo
( grid%id, history_interval_mo )
CALL get_history_interval_d
( grid%id, history_interval_d )
CALL get_history_interval_h
( grid%id, history_interval_h )
CALL get_history_interval_m
( grid%id, history_interval_m )
CALL get_history_interval_s
( grid%id, history_interval_s )
history_interval_m = max( history_interval, history_interval_m )
CALL ESMF_TimeIntervalSet( interval, MO=history_interval_mo, D=history_interval_d, &
H=history_interval_h, M=history_interval_m, S=history_interval_s, rc=rc )
CALL ESMF_AlarmSet( grid%alarms( HISTORY_ALARM ), RingInterval=interval, rc=rc )
CALL ESMF_ClockAddAlarm( grid%domain_clock, grid%alarms( HISTORY_ALARM ), rc=rc )
! RESTART INTERVAL
! restart_interval is left there (and means minutes) for consistency, but
! restart_interval_m will take precedence if specified
CALL get_restart_interval
( restart_interval ) ! same as minutes
CALL get_restart_interval_mo
( restart_interval_mo )
CALL get_restart_interval_d
( restart_interval_d )
CALL get_restart_interval_h
( restart_interval_h )
CALL get_restart_interval_m
( restart_interval_m )
CALL get_restart_interval_s
( restart_interval_s )
restart_interval_m = max( restart_interval, restart_interval_m )
CALL ESMF_TimeIntervalSet( interval, MO=restart_interval_mo, D=restart_interval_d, &
H=restart_interval_h, M=restart_interval_m, S=restart_interval_s, rc=rc )
CALL ESMF_AlarmSet( grid%alarms( RESTART_ALARM ), RingInterval=interval, rc=rc )
CALL ESMF_ClockAddAlarm( grid%domain_clock, grid%alarms( RESTART_ALARM ), rc=rc )
! AUXHIST1 INTERVAL
CALL get_auxhist1_interval
( grid%id, auxhist1_interval ) ! same as minutes
CALL get_auxhist1_interval_mo
( grid%id, auxhist1_interval_mo )
CALL get_auxhist1_interval_d
( grid%id, auxhist1_interval_d )
CALL get_auxhist1_interval_h
( grid%id, auxhist1_interval_h )
CALL get_auxhist1_interval_m
( grid%id, auxhist1_interval_m )
CALL get_auxhist1_interval_s
( grid%id, auxhist1_interval_s )
auxhist1_interval_m = max( auxhist1_interval, auxhist1_interval_m )
CALL ESMF_TimeIntervalSet( interval, MO=auxhist1_interval_mo, D=auxhist1_interval_d, &
H=auxhist1_interval_h, M=auxhist1_interval_m, S=auxhist1_interval_s, rc=rc )
CALL ESMF_AlarmSet( grid%alarms( AUXHIST1_ALARM ), RingInterval=interval, rc=rc )
CALL ESMF_ClockAddAlarm( grid%domain_clock, grid%alarms( AUXHIST1_ALARM ), rc=rc )
! AUXHIST2 INTERVAL
CALL get_auxhist2_interval
( grid%id, auxhist2_interval ) ! same as minutes
CALL get_auxhist2_interval_mo
( grid%id, auxhist2_interval_mo )
CALL get_auxhist2_interval_d
( grid%id, auxhist2_interval_d )
CALL get_auxhist2_interval_h
( grid%id, auxhist2_interval_h )
CALL get_auxhist2_interval_m
( grid%id, auxhist2_interval_m )
CALL get_auxhist2_interval_s
( grid%id, auxhist2_interval_s )
auxhist2_interval_m = max( auxhist2_interval, auxhist2_interval_m )
CALL ESMF_TimeIntervalSet( interval, MO=auxhist2_interval_mo, D=auxhist2_interval_d, &
H=auxhist2_interval_h, M=auxhist2_interval_m, S=auxhist2_interval_s, rc=rc )
CALL ESMF_AlarmSet( grid%alarms( AUXHIST2_ALARM ), RingInterval=interval, rc=rc )
CALL ESMF_ClockAddAlarm( grid%domain_clock, grid%alarms( AUXHIST2_ALARM ), rc=rc )
! AUXHIST3 INTERVAL
CALL get_auxhist3_interval
( grid%id, auxhist3_interval ) ! same as minutes
CALL get_auxhist3_interval_mo
( grid%id, auxhist3_interval_mo )
CALL get_auxhist3_interval_d
( grid%id, auxhist3_interval_d )
CALL get_auxhist3_interval_h
( grid%id, auxhist3_interval_h )
CALL get_auxhist3_interval_m
( grid%id, auxhist3_interval_m )
CALL get_auxhist3_interval_s
( grid%id, auxhist3_interval_s )
auxhist3_interval_m = max( auxhist3_interval, auxhist3_interval_m )
CALL ESMF_TimeIntervalSet( interval, MO=auxhist3_interval_mo, D=auxhist3_interval_d, &
H=auxhist3_interval_h, M=auxhist3_interval_m, S=auxhist3_interval_s, rc=rc )
CALL ESMF_AlarmSet( grid%alarms( AUXHIST3_ALARM ), RingInterval=interval, rc=rc )
CALL ESMF_ClockAddAlarm( grid%domain_clock, grid%alarms( AUXHIST3_ALARM ), rc=rc )
! AUXHIST4 INTERVAL
CALL get_auxhist4_interval
( grid%id, auxhist4_interval ) ! same as minutes
CALL get_auxhist4_interval_mo
( grid%id, auxhist4_interval_mo )
CALL get_auxhist4_interval_d
( grid%id, auxhist4_interval_d )
CALL get_auxhist4_interval_h
( grid%id, auxhist4_interval_h )
CALL get_auxhist4_interval_m
( grid%id, auxhist4_interval_m )
CALL get_auxhist4_interval_s
( grid%id, auxhist4_interval_s )
auxhist4_interval_m = max( auxhist4_interval, auxhist4_interval_m )
CALL ESMF_TimeIntervalSet( interval, MO=auxhist4_interval_mo, D=auxhist4_interval_d, &
H=auxhist4_interval_h, M=auxhist4_interval_m, S=auxhist4_interval_s, rc=rc )
CALL ESMF_AlarmSet( grid%alarms( AUXHIST4_ALARM ), RingInterval=interval, rc=rc )
CALL ESMF_ClockAddAlarm( grid%domain_clock, grid%alarms( AUXHIST4_ALARM ), rc=rc )
! AUXHIST5 INTERVAL
CALL get_auxhist5_interval
( grid%id, auxhist5_interval ) ! same as minutes
CALL get_auxhist5_interval_mo
( grid%id, auxhist5_interval_mo )
CALL get_auxhist5_interval_d
( grid%id, auxhist5_interval_d )
CALL get_auxhist5_interval_h
( grid%id, auxhist5_interval_h )
CALL get_auxhist5_interval_m
( grid%id, auxhist5_interval_m )
CALL get_auxhist5_interval_s
( grid%id, auxhist5_interval_s )
auxhist5_interval_m = max( auxhist5_interval, auxhist5_interval_m )
CALL ESMF_TimeIntervalSet( interval, MO=auxhist5_interval_mo, D=auxhist5_interval_d, &
H=auxhist5_interval_h, M=auxhist5_interval_m, S=auxhist5_interval_s, rc=rc )
CALL ESMF_AlarmSet( grid%alarms( AUXHIST2_ALARM ), RingInterval=interval, rc=rc )
CALL ESMF_ClockAddAlarm( grid%domain_clock, grid%alarms( AUXHIST2_ALARM ), rc=rc )
! AUXINPUT1 INTERVAL
CALL get_auxinput1_interval
( grid%id, auxinput1_interval ) ! same as minutes
CALL get_auxinput1_interval_mo
( grid%id, auxinput1_interval_mo )
CALL get_auxinput1_interval_d
( grid%id, auxinput1_interval_d )
CALL get_auxinput1_interval_h
( grid%id, auxinput1_interval_h )
CALL get_auxinput1_interval_m
( grid%id, auxinput1_interval_m )
CALL get_auxinput1_interval_s
( grid%id, auxinput1_interval_s )
auxinput1_interval_m = max( auxinput1_interval, auxinput1_interval_m )
CALL ESMF_TimeIntervalSet( interval, MO=auxinput1_interval_mo, D=auxinput1_interval_d, &
H=auxinput1_interval_h, M=auxinput1_interval_m, S=auxinput1_interval_s, rc=rc )
CALL ESMF_AlarmSet( grid%alarms( AUXINPUT1_ALARM ), RingInterval=interval, rc=rc )
CALL ESMF_ClockAddAlarm( grid%domain_clock, grid%alarms( AUXINPUT1_ALARM ), rc=rc )
! AUXINPUT2 INTERVAL
CALL get_auxinput2_interval
( grid%id, auxinput2_interval ) ! same as minutes
CALL get_auxinput2_interval_mo
( grid%id, auxinput2_interval_mo )
CALL get_auxinput2_interval_d
( grid%id, auxinput2_interval_d )
CALL get_auxinput2_interval_h
( grid%id, auxinput2_interval_h )
CALL get_auxinput2_interval_m
( grid%id, auxinput2_interval_m )
CALL get_auxinput2_interval_s
( grid%id, auxinput2_interval_s )
auxinput2_interval_m = max( auxinput2_interval, auxinput2_interval_m )
CALL ESMF_TimeIntervalSet( interval, MO=auxinput2_interval_mo, D=auxinput2_interval_d, &
H=auxinput2_interval_h, M=auxinput2_interval_m, S=auxinput2_interval_s, rc=rc )
CALL ESMF_AlarmSet( grid%alarms( AUXINPUT2_ALARM ), RingInterval=interval, rc=rc )
CALL ESMF_ClockAddAlarm( grid%domain_clock, grid%alarms( AUXINPUT2_ALARM ), rc=rc )
! AUXINPUT3 INTERVAL
CALL get_auxinput3_interval
( grid%id, auxinput3_interval ) ! same as minutes
CALL get_auxinput3_interval_mo
( grid%id, auxinput3_interval_mo )
CALL get_auxinput3_interval_d
( grid%id, auxinput3_interval_d )
CALL get_auxinput3_interval_h
( grid%id, auxinput3_interval_h )
CALL get_auxinput3_interval_m
( grid%id, auxinput3_interval_m )
CALL get_auxinput3_interval_s
( grid%id, auxinput3_interval_s )
auxinput3_interval_m = max( auxinput3_interval, auxinput3_interval_m )
CALL ESMF_TimeIntervalSet( interval, MO=auxinput3_interval_mo, D=auxinput3_interval_d, &
H=auxinput3_interval_h, M=auxinput3_interval_m, S=auxinput3_interval_s, rc=rc )
CALL ESMF_AlarmSet( grid%alarms( AUXINPUT3_ALARM ), RingInterval=interval, rc=rc )
CALL ESMF_ClockAddAlarm( grid%domain_clock, grid%alarms( AUXINPUT3_ALARM ), rc=rc )
! AUXINPUT4 INTERVAL
CALL get_auxinput4_interval
( grid%id, auxinput4_interval ) ! same as minutes
CALL get_auxinput4_interval_mo
( grid%id, auxinput4_interval_mo )
CALL get_auxinput4_interval_d
( grid%id, auxinput4_interval_d )
CALL get_auxinput4_interval_h
( grid%id, auxinput4_interval_h )
CALL get_auxinput4_interval_m
( grid%id, auxinput4_interval_m )
CALL get_auxinput4_interval_s
( grid%id, auxinput4_interval_s )
auxinput4_interval_m = max( auxinput4_interval, auxinput4_interval_m )
CALL ESMF_TimeIntervalSet( interval, MO=auxinput4_interval_mo, D=auxinput4_interval_d, &
H=auxinput4_interval_h, M=auxinput4_interval_m, S=auxinput4_interval_s, rc=rc )
CALL ESMF_AlarmSet( grid%alarms( AUXINPUT4_ALARM ), RingInterval=interval, rc=rc )
CALL ESMF_ClockAddAlarm( grid%domain_clock, grid%alarms( AUXINPUT4_ALARM ), rc=rc )
! AUXINPUT5 INTERVAL
CALL get_auxinput5_interval
( grid%id, auxinput5_interval ) ! same as minutes
CALL get_auxinput5_interval_mo
( grid%id, auxinput5_interval_mo )
CALL get_auxinput5_interval_d
( grid%id, auxinput5_interval_d )
CALL get_auxinput5_interval_h
( grid%id, auxinput5_interval_h )
CALL get_auxinput5_interval_m
( grid%id, auxinput5_interval_m )
CALL get_auxinput5_interval_s
( grid%id, auxinput5_interval_s )
auxinput5_interval_m = max( auxinput5_interval, auxinput5_interval_m )
CALL ESMF_TimeIntervalSet( interval, MO=auxinput5_interval_mo, D=auxinput5_interval_d, &
H=auxinput5_interval_h, M=auxinput5_interval_m, S=auxinput5_interval_s, rc=rc )
CALL ESMF_AlarmSet( grid%alarms( AUXINPUT2_ALARM ), RingInterval=interval, rc=rc )
CALL ESMF_ClockAddAlarm( grid%domain_clock, grid%alarms( AUXINPUT2_ALARM ), rc=rc )
CALL ESMF_AlarmEnable(grid%alarms( BOUNDARY_ALARM ), rc=rc )
CALL ESMF_ClockAddAlarm( grid%domain_clock, grid%alarms( BOUNDARY_ALARM ), rc=rc )
CALL ESMF_AlarmTurnOn( grid%alarms( BOUNDARY_ALARM ), rc=rc )
CALL ESMF_AlarmTurnOn( grid%alarms( HISTORY_ALARM ), rc=rc )
END SUBROUTINE Set_Timekeeping