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