create_output_alarm Subroutine

public subroutine create_output_alarm(clock, hconfig, comp_name, rc)

Arguments

Type IntentOptional Attributes Name
type(ESMF_Clock), intent(inout) :: clock
type(ESMF_HConfig), intent(in) :: hconfig
character(len=*), intent(in) :: comp_name
integer, intent(out), optional :: rc

Calls

proc~~create_output_alarm~~CallsGraph proc~create_output_alarm create_output_alarm ESMF_AlarmCreate ESMF_AlarmCreate proc~create_output_alarm->ESMF_AlarmCreate ESMF_ClockGet ESMF_ClockGet proc~create_output_alarm->ESMF_ClockGet ESMF_TimeGet ESMF_TimeGet proc~create_output_alarm->ESMF_TimeGet ESMF_TimeSet ESMF_TimeSet proc~create_output_alarm->ESMF_TimeSet esmf_hconfigasstring esmf_hconfigasstring proc~create_output_alarm->esmf_hconfigasstring esmf_hconfigcreateat esmf_hconfigcreateat proc~create_output_alarm->esmf_hconfigcreateat esmf_hconfigisdefined esmf_hconfigisdefined proc~create_output_alarm->esmf_hconfigisdefined interface~mapl_unpacktime MAPL_UnpackTime proc~create_output_alarm->interface~mapl_unpacktime proc~hconfig_to_esmf_timeinterval hconfig_to_esmf_timeinterval proc~create_output_alarm->proc~hconfig_to_esmf_timeinterval proc~mapl_return MAPL_Return proc~create_output_alarm->proc~mapl_return proc~mapl_verify MAPL_Verify proc~create_output_alarm->proc~mapl_verify proc~string_to_integer_time string_to_integer_time proc~create_output_alarm->proc~string_to_integer_time proc~hconfig_to_esmf_timeinterval->esmf_hconfigasstring proc~hconfig_to_esmf_timeinterval->proc~mapl_return proc~hconfig_to_esmf_timeinterval->proc~mapl_verify proc~string_to_esmf_timeinterval string_to_esmf_timeinterval proc~hconfig_to_esmf_timeinterval->proc~string_to_esmf_timeinterval at at proc~mapl_return->at insert insert proc~mapl_return->insert proc~mapl_throw_exception MAPL_throw_exception proc~mapl_return->proc~mapl_throw_exception proc~mapl_verify->proc~mapl_throw_exception proc~string_to_integer_time->proc~mapl_return proc~string_to_esmf_timeinterval->proc~mapl_return proc~string_to_esmf_timeinterval->proc~mapl_verify ESMF_TimeIntervalSet ESMF_TimeIntervalSet proc~string_to_esmf_timeinterval->ESMF_TimeIntervalSet interface~mapl_assert MAPL_Assert proc~string_to_esmf_timeinterval->interface~mapl_assert

Called by

proc~~create_output_alarm~~CalledByGraph proc~create_output_alarm create_output_alarm proc~test_create_output_alarm test_create_output_alarm proc~test_create_output_alarm->proc~create_output_alarm

Source Code

   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