Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
real(kind=ESMF_KIND_R8), | intent(out) | :: | prec | |||
type(ESMF_KeywordEnforcer), | optional | :: | keywordEnforcer | |||
integer, | intent(out), | optional | :: | rc |
subroutine ESMF_VMWtimePrec(prec, keywordEnforcer, rc) ! ! !ARGUMENTS: real(ESMF_KIND_R8), intent(out) :: prec type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below integer, intent(out), optional :: rc ! ! !STATUS: ! \begin{itemize} ! \item\apiStatusCompatibleVersion{5.2.0r} ! \end{itemize} ! ! !DESCRIPTION: ! Get a run-time estimate of the timer precision as floating-point number ! of seconds. This is a relatively expensive call since the timer precision ! is measured several times before the maximum is returned as the estimate. ! The returned value is PET-specific and may differ across the VM ! context. ! ! The arguments are: ! \begin{description} ! \item[prec] ! Timer precision in seconds. ! \item[{[rc]}] ! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors. ! \end{description} ! !EOP !------------------------------------------------------------------------------ real(ESMF_KIND_R8) :: t_1, t_2 ! timer variables real(ESMF_KIND_R8) :: temp_prec ! timer variables integer :: i ! initialize return code; assume routine not implemented if (present(rc)) rc = ESMF_RC_NOT_IMPL ! Measuring the timer precision here by explicitly calling ESMF_WTime() will ! provide a better estimate than determining the precision inside the C++ ! interface. temp_prec = 0. do i=1, 10 call ESMF_VMWtime(t_1) t_2 = t_1 do while (t_2 <= t_1) call ESMF_VMWtime(t_2) end do if (t_2 - t_1 > temp_prec) temp_prec = t_2 - t_1 end do prec = temp_prec ! return successfully if (present(rc)) rc = ESMF_SUCCESS end subroutine ESMF_VMWtimePrec