ESMF_TraceUserEx Program

Variables

Type Attributes Name Initial
character(len=ESMF_MAXSTR) :: failMsg
character(len=ESMF_MAXSTR) :: name
character(len=ESMF_MAXSTR) :: testname
integer :: count
integer :: finalrc
integer :: i
integer :: itemCount
integer :: j
integer :: localPet
integer :: petCount
integer :: rc
integer :: result
integer :: tmp
type(ESMF_GridComp) :: gridcomp
type(ESMF_VM) :: vm

Source Code

program ESMF_TraceUserEx

!==============================================================================
!ESMF_EXAMPLE        String used by test script to count examples.
!==============================================================================
#include "ESMF.h"

!BOE
! \subsubsection{Profiling/Tracing User-defined Code Regions} \label{ex:TraceUserEx}
!
! This example illustrates how to manually instrument code with
! entry and exit points for user-defined code regions. Note that the
! API calls {\tt ESMF\_TraceRegionEnter} and {\tt ESMF\_TraceRegionExit}
! should always appear in pairs, wrapping a particular section
! of code. The environment variable {\tt ESMF\_RUNTIME\_TRACE} 
! or {\tt ESMF\_RUNTIME\_PROFILE} must be set to {\tt ON} to enable these
! regions. If not at least one is set, the calls to
! {\tt ESMF\_TraceRegionEnter} and {\tt ESMF\_TraceRegionExit}
! will simply return immediately. For this reason, it is safe to
! leave this instrumentation in application code, even when not being profiled.  
!EOE


!  !PROGRAM: ESMF\_UserTrace - Examples of Trace usage.
!
!  !DESCRIPTION: 
!
! This program shows examples of Trace usage


!BOC
      ! Use ESMF framework module
      use ESMF
!EOC
      use ESMF_TestMod
!BOC
      implicit none

      ! Local variables  
      integer :: rc, finalrc
      integer :: i, j, tmp                 
!EOC
      integer                 :: petCount, localPet, &
                                 itemCount, count, result
      type(ESMF_VM)           :: vm

      
      type(ESMF_GridComp)     :: gridcomp
      character(ESMF_MAXSTR)  :: name
      character(ESMF_MAXSTR)  :: testname
      character(ESMF_MAXSTR)  :: failMsg

!-------------------------------------------------------------------------
!-------------------------------------------------------------------------

      write(failMsg, *) "Example failure"
      write(testname, *) "Example ESMF_TraceUserEx"

! ------------------------------------------------------------------------------
! ------------------------------------------------------------------------------

!BOC     
      ! initialize ESMF
      finalrc = ESMF_SUCCESS
      call ESMF_Initialize(vm=vm, defaultlogfilename="TraceUserEx.Log", &
                    logkindflag=ESMF_LOGKIND_MULTI, rc=rc)
!EOC
      if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
      
      ! get the vm
      call ESMF_VMGet(vm, petCount=petCount, localPet=localPet, rc=rc)        
      if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
      
      if (localPet==0) then
        print *, "--------------------------------------- "
        print *, "Start of ESMF_TraceUser Example"
        print *, "--------------------------------------- "
      endif
!BOC
      ! record entrance into "outer_region"
      call ESMF_TraceRegionEnter("outer_region", rc=rc)

      tmp = 0
      do i=1, 10
         
         ! record entrance into "inner_region_1"
         call ESMF_TraceRegionEnter("inner_region_1", rc=rc)
         ! arbitrary computation
         do j=1,10000
            tmp=tmp+j+i
         enddo
         ! record exit from "inner_region_1"
         call ESMF_TraceRegionExit("inner_region_1", rc=rc)

         tmp = 0
         
         ! record entrance into "inner_region_2"
         call ESMF_TraceRegionEnter("inner_region_2", rc=rc)
         ! arbitrary computation
         do j=1,5000
            tmp=tmp+j+i
         enddo
         ! record exit from "inner_region_2"
         call ESMF_TraceRegionExit("inner_region_2", rc=rc)
      enddo

      ! record exit from "outer_region"
      call ESMF_TraceRegionExit("outer_region", rc=rc)
!EOC
      
      ! IMPORTANT: ESMF_STest() prints the PASS string and the # of processors in the log
      ! file that the scripts grep for.
      call ESMF_STest((finalrc.eq.ESMF_SUCCESS), testname, failMsg, result, ESMF_SRCLINE)    

!BOC      
      call ESMF_Finalize(rc=rc)
!EOC
      
      if (localPet==0) then
         print *, "--------------------------------------- "
         print *, "End of ESMF_TraceUser Example"
         print *, "--------------------------------------- "
      endif

      if (rc/=ESMF_SUCCESS) finalrc = ESMF_FAILURE
      if (finalrc==ESMF_SUCCESS) then
         print *, "PASS: ESMF_TraceUserEx.F90"
      else
         print *, "FAIL: ESMF_TraceUserEx.F90"
      endif

end program ESMF_TraceUserEx