recursive subroutine ESMF_GridCompRun(gridcomp, keywordEnforcer, &
importState, exportState, clock, syncflag, phase, timeout, timeoutFlag, &
userRc, rc)
!
! !ARGUMENTS:
type(ESMF_GridComp), intent(inout) :: gridcomp
type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below
type(ESMF_State), intent(inout), optional :: importState
type(ESMF_State), intent(inout), optional :: exportState
type(ESMF_Clock), intent(inout), optional :: clock
type(ESMF_Sync_Flag), intent(in), optional :: syncflag
integer, intent(in), optional :: phase
integer, intent(in), optional :: timeout
logical, intent(out), optional :: timeoutFlag
integer, intent(out), optional :: userRc
integer, intent(out), optional :: rc
!
! !STATUS:
! \begin{itemize}
! \item\apiStatusCompatibleVersion{5.2.0r}
! \item\apiStatusModifiedSinceVersion{5.2.0r}
! \begin{description}
! \item[5.3.0] Added argument {\tt timeout}.
! Added argument {\tt timeoutFlag}.
! The new arguments provide access to the fault-tolerant component
! features.
! \end{description}
! \end{itemize}
!
! !DESCRIPTION:
! Call the associated user run routine for
! an {\tt ESMF\_GridComp}.
!
! The arguments are:
! \begin{description}
! \item[gridcomp]
! {\tt ESMF\_GridComp} to call run routine for.
! \item[{[importState]}]
! {\tt ESMF\_State} containing import data. If not present, a dummy
! argument will be passed to the user-supplied routine. The
! importState argument in the user code cannot be optional.
! \item[{[exportState]}]
! {\tt ESMF\_State} containing export data. If not present, a dummy
! argument will be passed to the user-supplied routine. The
! exportState argument in the user code cannot be optional.
! \item[{[clock]}]
! External {\tt ESMF\_Clock} for passing in time information.
! This is generally the parent component's clock, and will be treated
! as read-only by the child component. The child component can maintain
! a private clock for its own internal time computations. If not present, a dummy
! argument will be passed to the user-supplied routine. The
! clock argument in the user code cannot be optional.
! \item[{[syncflag]}]
! Blocking behavior of this method call. See section \ref{const:sync}
! for a list of valid blocking options. Default option is
! {\tt ESMF\_SYNC\_VASBLOCKING} which blocks PETs and their spawned off threads
! across each VAS but does not synchronize PETs that run in different VASs.
! \item[{[phase]}]
! Component providers must document whether each of their
! routines are {\em single-phase} or {\em multi-phase}.
! Single-phase routines require only one invocation to complete
! their work.
! Multi-phase routines provide multiple subroutines to accomplish
! the work, accommodating components which must complete part of their
! work, return to the caller and allow other processing to occur,
! and then continue the original operation.
! For multiple-phase child components, this is the integer phase
! number to be invoked.
! For single-phase child components this argument is optional. The default is
! 1.
! \item[{[timeout]}]
! The maximum period in seconds that this call will wait in communications
! with the actual component, before returning with a timeout condition.
! The default is 3600, i.e. 1 hour. The {\tt timeout} argument is only
! supported for connected dual components.
! \item[{[timeoutFlag]}]
! Returns {\tt .true.} if the timeout was reached, {\tt .false.} otherwise.
! If {\tt timeoutFlag} was {\em not} provided, a timeout condition will lead
! to a return code of {\tt rc \textbackslash = ESMF\_SUCCESS}. Otherwise the
! return value of {\tt timeoutFlag} is the sole indicator of a timeout
! condition.
! \item[{[userRc]}]
! Return code set by {\tt userRoutine} before returning.
! \item[{[rc]}]
! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
! \end{description}
!
!EOP
!------------------------------------------------------------------------------
integer :: localrc ! local return code
integer :: timeoutArg
! initialize return code; assume routine not implemented
if (present(rc)) rc = ESMF_RC_NOT_IMPL
localrc = ESMF_RC_NOT_IMPL
ESMF_INIT_CHECK_DEEP(ESMF_GridCompGetInit,gridcomp,rc)
! check consistency between timeout argument and component argument
if (present(timeout).and. &
.not.ESMF_CompIsDualConnected(gridcomp%compp, rc=localrc)) then
call ESMF_LogSetError(ESMF_RC_ARG_INCOMP, &
msg="'timeout' argument is only allowed for connected dual components",&
ESMF_CONTEXT, rcToReturn=rc)
return
endif
timeoutArg = ESMF_DEFAULT_TIMEOUT ! default 1h
if (present(timeout)) timeoutArg = timeout
! call Comp method
call ESMF_CompExecute(gridcomp%compp, method=ESMF_METHOD_RUNIC, &
importState=importState, exportState=exportState, clock=clock, &
syncflag=syncflag, phase=phase, timeout=timeoutArg, &
userRc=userRc, rc=localrc)
! conditionally filter out the RC_TIMEOUT and return success
if (present(timeoutFlag)) then
timeoutFlag = .false. ! initialize
if ((localrc==ESMF_RC_TIMEOUT).or.(localrc==ESMC_RC_TIMEOUT)) then
timeoutFlag = .true. ! indicate timeout through flag argument
localrc = ESMF_SUCCESS ! do not raise error condition on user level
endif
endif
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
! return successfully
if (present(rc)) rc = ESMF_SUCCESS
end subroutine ESMF_GridCompRun