subroutine create_output_alarm(clock, hconfig, comp_name, rc)
type(ESMF_Clock), intent(inout) :: clock
type(ESMF_HConfig), intent(in) :: hconfig
character(len=*), intent(in) :: comp_name
integer, intent(out), optional :: rc
type(ESMF_Alarm) :: alarm
integer :: status
type(ESMF_HConfig) :: time_hconfig
type(ESMF_TimeInterval) :: time_interval
character(len=:), allocatable :: iso_time
type(ESMF_Time) :: first_ring_time, currTime, startTime
integer :: int_time, yy, mm, dd, m, h, s
logical :: has_ref_time, has_frequency
call ESMF_ClockGet(clock, currTime=currTime, timeStep=time_interval, startTime = startTime, _RC)
time_hconfig = ESMF_HConfigCreateAt(hconfig, keyString='time_spec', _RC)
has_frequency = ESMF_HConfigIsDefined(time_hconfig, keyString='frequency', _RC)
if (has_frequency) then
time_interval = hconfig_to_esmf_timeinterval(time_hconfig, 'frequency', _RC)
end if
int_time = 0
has_ref_time = ESMF_HConfigIsDefined(time_hconfig, keyString='ref_time', _RC)
if (has_ref_time) then
iso_time = ESMF_HConfigAsString(time_hconfig, keyString='ref_time', _RC)
int_time = string_to_integer_time(iso_time, _RC)
end if
call MAPL_UnpackTime(int_time, h, m, s)
call ESMF_TimeGet(currTime, yy=yy, mm=mm, dd=dd, _RC)
call ESMF_TimeSet(first_ring_time, yy=yy, mm=mm, dd=dd, h=h, m=m, s=s, _RC)
! These 2 lines are borrowed from old History. Unforunately until ESMF alarms
! get fixed kluges like this are neccessary so alarms will acutally ring
if (first_ring_time == startTime) first_ring_time = first_ring_time + time_interval
if (first_ring_time < currTime) &
first_ring_time = first_ring_time +(INT((currTime - first_ring_time)/time_interval)+1)*time_interval
alarm = ESMF_AlarmCreate(clock=clock, RingInterval=time_interval, RingTime=first_ring_time, sticky=.false., name=comp_name//"_write_alarm", _RC)
_RETURN(_SUCCESS)
end subroutine create_output_alarm