function ESMF_AlarmCreateNew(clock, keywordEnforcer, &
ringTime, ringInterval, stopTime, ringDuration, ringTimeStepCount, &
refTime, enabled, sticky, name, rc)
! !RETURN VALUE:
type(ESMF_Alarm) :: ESMF_AlarmCreateNew
! !ARGUMENTS:
type(ESMF_Clock), intent(in) :: clock
type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below
type(ESMF_Time), intent(in), optional :: ringTime
type(ESMF_TimeInterval), intent(in), optional :: ringInterval
type(ESMF_Time), intent(in), optional :: stopTime
type(ESMF_TimeInterval), intent(in), optional :: ringDuration
integer, intent(in), optional :: ringTimeStepCount
type(ESMF_Time), intent(in), optional :: refTime
logical, intent(in), optional :: enabled
logical, intent(in), optional :: sticky
character (len=*), intent(in), optional :: name
integer, intent(out), optional :: rc
!
! !STATUS:
! \begin{itemize}
! \item\apiStatusCompatibleVersion{5.2.0r}
! \end{itemize}
!
! !DESCRIPTION:
! Creates and sets the initial values in a new {\tt ESMF\_Alarm}.
!
! In {\tt ESMF\_DIRECTION\_REVERSE} (see Section~\ref{sec:Clock}), alarms
! ring in reverse, i.e., they begin ringing when they originally ended,
! and end ringing when they originally began.
!
! The arguments are:
! \begin{description}
! \item[clock]
! The clock with which to associate this newly created alarm.
! \item[{[ringTime]}]
! The ring time for a one-shot alarm or the first ring time for a
! repeating (interval) alarm. Must specify at least one of ringTime
! or ringInterval.
! \item[{[ringInterval]}]
! The ring interval for repeating (interval) alarms. If
! {\tt ringTime} is not also specified (first ring time), it will be
! calculated as the {\tt clock}'s current time plus {\tt ringInterval}.
! Must specify at least one of ringTime or ringInterval.
! \item[{[stopTime]}]
! The stop time for repeating (interval) alarms. If not
! specified, an interval alarm will repeat forever.
! \item[{[ringDuration]}]
! The absolute ring duration. If not sticky (see argument below),
! alarms rings for ringDuration, then turns itself off. Default is
! zero (unused). Mutually exclusive with ringTimeStepCount (below);
! used only if set to a non-zero duration and ringTimeStepCount is 1
! (see below).
! See also {\tt ESMF\_AlarmSticky()}, {\tt ESMF\_AlarmNotSticky()}.
! \item[{[ringTimeStepCount]}]
! The relative ring duration. If not sticky (see argument below),
! alarms rings for ringTimeStepCount, then turns itself off.
! Default is 1: a non-sticky alarm will ring for one clock time step.
! Mutually exclusive with ringDuration (above); used if
! ringTimeStepCount > 1. If ringTimeStepCount is 1 (default) and
! ringDuration is non-zero, ringDuration is used (see above), otherwise
! ringTimeStepCount is used.
! See also {\tt ESMF\_AlarmSticky()}, {\tt ESMF\_AlarmNotSticky()}.
! \item[{[refTime]}]
! The reference (i.e. base) time for an interval alarm.
! \item[{[enabled]}]
! Sets the enabled state; default is on (true). If disabled,
! an alarm will not function at all.
! See also {\tt ESMF\_AlarmEnable()}, {\tt ESMF\_AlarmDisable()}.
! \item[{[sticky]}]
! Sets the sticky state; default is on (true). If sticky,
! once an alarm is ringing, it will remain ringing until turned off
! manually via a user call to {\tt ESMF\_AlarmRingerOff()}.
! If not sticky, an alarm will turn itself off after a certain
! ring duration specified by either ringDuration or
! ringTimeStepCount (see above). There is an implicit limitation
! that in order to properly reverse timestep through a ring end
! time in {\tt ESMF\_DIRECTION\_REVERSE}, that time must have already
! been traversed in the forward direction. This is due to the fact
! that the Time Manager cannot predict when user code will call
! {\tt ESMF\_AlarmRingerOff()}. An error message will be logged
! when this limitation is not satisfied.
! See also {\tt ESMF\_AlarmSticky()}, {\tt ESMF\_AlarmNotSticky()}.
! \item[{[name]}]
! The name for the newly created alarm. If not specified,
! a default unique name will be generated: "AlarmNNN" where NNN
! is a unique sequence number from 001 to 999.
! \item[{[rc]}]
! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
! \end{description}
!
!EOP
! !REQUIREMENTS:
! TMG4.1, TMG4.7
! initialize name length to zero for non-existent name
integer :: nameLen, localrc
! Assume failure until success
if (present(rc)) rc = ESMF_RC_NOT_IMPL
localrc = ESMF_RC_NOT_IMPL
nameLen = 0
! check inputs
ESMF_INIT_CHECK_DEEP(ESMF_ClockGetInit,clock,rc)
ESMF_INIT_CHECK_SHALLOW(ESMF_TimeGetInit,ringTime,rc)
ESMF_INIT_CHECK_SHALLOW(ESMF_TimeIntervalGetInit,ringInterval,rc)
ESMF_INIT_CHECK_SHALLOW(ESMF_TimeGetInit,stopTime,rc)
ESMF_INIT_CHECK_SHALLOW(ESMF_TimeIntervalGetInit,ringDuration,rc)
ESMF_INIT_CHECK_SHALLOW(ESMF_TimeGetInit,refTime,rc)
! get length of given name for C++ validation
if (present(name)) then
nameLen = len_trim(name)
end if
! invoke C to C++ entry point to allocate and initialize new alarm
call c_ESMC_AlarmCreateNew(ESMF_AlarmCreateNew, nameLen, name, clock, &
ringTime, ringInterval, stopTime, &
ringDuration, ringTimeStepCount, refTime, &
enabled, sticky, localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
! mark output as successfully initialized
call ESMF_AlarmSetInitCreated(ESMF_AlarmCreateNew)
! Return success
if (present(rc)) rc = ESMF_SUCCESS
end function ESMF_AlarmCreateNew