ESMF_LogErrPerfUTest Program

Uses

  • program~~esmf_logerrperfutest~~UsesGraph program~esmf_logerrperfutest ESMF_LogErrPerfUTest module~esmf ESMF program~esmf_logerrperfutest->module~esmf module~esmf_testmod ESMF_TestMod program~esmf_logerrperfutest->module~esmf_testmod

Calls

program~~esmf_logerrperfutest~~CallsGraph program~esmf_logerrperfutest ESMF_LogErrPerfUTest proc~esmf_finalize ESMF_Finalize program~esmf_logerrperfutest->proc~esmf_finalize proc~esmf_test ESMF_Test program~esmf_logerrperfutest->proc~esmf_test proc~esmf_testend ESMF_TestEnd program~esmf_logerrperfutest->proc~esmf_testend proc~esmf_teststart ESMF_TestStart program~esmf_logerrperfutest->proc~esmf_teststart proc~perflogfounderror perfLogFoundError program~esmf_logerrperfutest->proc~perflogfounderror c_esmc_getcompliancechecktrace c_esmc_getcompliancechecktrace proc~esmf_finalize->c_esmc_getcompliancechecktrace proc~esmf_calendarfinalize ESMF_CalendarFinalize proc~esmf_finalize->proc~esmf_calendarfinalize proc~esmf_logfinalize ESMF_LogFinalize proc~esmf_finalize->proc~esmf_logfinalize proc~esmf_logflush ESMF_LogFlush proc~esmf_finalize->proc~esmf_logflush proc~esmf_logrc2msg ESMF_LogRc2Msg proc~esmf_finalize->proc~esmf_logrc2msg proc~esmf_logwrite ESMF_LogWrite proc~esmf_finalize->proc~esmf_logwrite proc~esmf_traceclose ESMF_TraceClose proc~esmf_finalize->proc~esmf_traceclose proc~esmf_vmabort ESMF_VMAbort proc~esmf_finalize->proc~esmf_vmabort proc~esmf_vmfinalize ESMF_VMFinalize proc~esmf_finalize->proc~esmf_vmfinalize proc~esmf_test->proc~esmf_logwrite proc~esmf_testend->proc~esmf_finalize proc~esmf_testend->proc~esmf_logwrite interface~esmf_vmget ESMF_VMGet proc~esmf_teststart->interface~esmf_vmget proc~esmf_initialize ESMF_Initialize proc~esmf_teststart->proc~esmf_initialize proc~esmf_logset ESMF_LogSet proc~esmf_teststart->proc~esmf_logset proc~esmf_teststart->proc~esmf_logwrite proc~esmf_logfounderror ESMF_LogFoundError proc~perflogfounderror->proc~esmf_logfounderror proc~perflogfounderror->proc~esmf_logwrite proc~esmf_vmwtime ESMF_VMWtime proc~perflogfounderror->proc~esmf_vmwtime

Variables

Type Attributes Name Initial
character(len=*), parameter :: version = '$Id$'
character(len=ESMF_MAXSTR) :: failMsg
character(len=ESMF_MAXSTR) :: name
integer :: rc
integer :: result = 0
real(kind=ESMF_KIND_R8) :: dt
real(kind=ESMF_KIND_R8) :: dtTest

Subroutines

subroutine perfLogFoundError(n, dt)

Arguments

Type IntentOptional Attributes Name
integer :: n
real(kind=ESMF_KIND_R8) :: dt

Source Code

program ESMF_LogErrPerfUTest

!------------------------------------------------------------------------------
 
#include "ESMF_Macros.inc"
#include "ESMF.h"

!==============================================================================
!BOP
! !PROGRAM: ESMF_LogErrPerfUTest - This unit test file tests LogErr performance
!  
! !DESCRIPTION:
!
! The code in this file drives Fortran ESMF_Log API.
!
!-----------------------------------------------------------------------------
! !USES:
  use ESMF_TestMod     ! test methods
  use ESMF

  implicit none

!------------------------------------------------------------------------------
! The following line turns the CVS identifier string into a printable variable.
  character(*), parameter :: version = &
    '$Id$'
!------------------------------------------------------------------------------

  ! cumulative result: count failures; no failures equals "all pass"
  integer :: result = 0

  ! individual test result code
  integer :: rc
  
  ! individual test failure message
  character(ESMF_MAXSTR) :: failMsg
  character(ESMF_MAXSTR) :: name
  
  ! other variables
  real(ESMF_KIND_R8)     :: dt, dtTest

  !------------------------------------------------------------------------
  call ESMF_TestStart(ESMF_SRCLINE, rc=rc)  ! calls ESMF_Initialize() internally
  if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
  !------------------------------------------------------------------------
  
  !------------------------------------------------------------------------
  !NEX_UTest
  write(name, *) "Performance of ESMF_LogFoundError() 1000x Test"
  write(failMsg, *) "Did not return ESMF_SUCCESS"
  call perfLogFoundError(n=1000, dt=dt)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  !------------------------------------------------------------------------

  !------------------------------------------------------------------------
  !NEX_UTest
  write(name, *) "Performance of ESMF_LogFoundError() 10000x Test"
  write(failMsg, *) "Did not return ESMF_SUCCESS"
  call perfLogFoundError(n=10000, dt=dt)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  !------------------------------------------------------------------------

  !------------------------------------------------------------------------
  !NEX_UTest
  write(name, *) "Performance of ESMF_LogFoundError() 100000x Test"
  write(failMsg, *) "Did not return ESMF_SUCCESS"
  call perfLogFoundError(n=100000, dt=dt)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  !------------------------------------------------------------------------

  !------------------------------------------------------------------------
  !NEX_UTest
  write(name, *) "Performance of ESMF_LogFoundError() 1000000x Test"
  write(failMsg, *) "Did not return ESMF_SUCCESS"
  call perfLogFoundError(n=1000000, dt=dt)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  !------------------------------------------------------------------------
  !NEX_UTest
  write(name, *) "Threshold check for ESMF_LogFoundError() 1000000x Test"
#ifdef ESMF_BOPT_g
  dtTest = 7.d-7  ! 700ns is expected to pass in debug mode
#else
  dtTest = 6.d-8  ! 60ns is expected to pass in optimized mode
#endif
  write(failMsg, *) "ESMF_LogFoundError() performance problem! ", &
    dt, ">", dtTest
#ifdef ESMF_TESTPERFORMANCE
  call ESMF_Test((dt<dtTest), name, failMsg, result, ESMF_SRCLINE)
#else
  call ESMF_Test((.true.), name, failMsg, result, ESMF_SRCLINE)
#endif
  !------------------------------------------------------------------------

  !------------------------------------------------------------------------
  call ESMF_TestEnd(ESMF_SRCLINE) ! calls ESMF_Finalize() internally
  !------------------------------------------------------------------------

 contains !---------------------------------------------------------------------

  !--------------------------------------------------------------------------
  subroutine perfLogFoundError(n, dt)
    integer             :: n
    real(ESMF_KIND_R8)  :: dt
    ! local vars
    integer             :: i
    real(ESMF_KIND_R8)  :: t0, t1
    character(160)      :: msgString
    logical             :: testFlag
    !
    call ESMF_VMWtime(t0, rc=rc)
    do i=1, n
      testFlag = (ESMF_LogFoundError(rcToCheck=ESMF_SUCCESS, &
        msg=ESMF_LOGERR_PASSTHRU, &
        line=__LINE__, &
        file=__FILE__))
    enddo
    call ESMF_VMWtime(t1, rc=rc)
    dt = (t1-t0)/real(n)
    write(msgString,*) "perfLogFoundError: ", n, " iterations took", t1-t0, &
      " seconds. => ", dt, " per iteration."
    call ESMF_LogWrite(msgString, ESMF_LOGMSG_INFO, rc=rc)
    if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
      line=__LINE__, &
      file=__FILE__)) return
    ! indicate success
    rc=ESMF_SUCCESS
  end subroutine
  !--------------------------------------------------------------------------

end program ESMF_LogErrPerfUTest