MODULE module_timing INTEGER, PARAMETER, PRIVATE :: cnmax = 30 INTEGER, PRIVATE :: cn = 0 REAL, PRIVATE :: elapsed_seconds , elapsed_seconds_total = 0 REAL(kind=8) :: epoch_seconds_hires(cnmax) CONTAINS SUBROUTINE init_module_timing call init_hires_timer() cn = 0 END SUBROUTINE init_module_timing SUBROUTINE start_timing IMPLICIT NONE cn = cn + 1 IF ( cn .gt. cnmax ) THEN CALL wrf_error_fatal3("",41,& 'module_timing: clock nesting error (too many nests)' ) RETURN ENDIF call hires_timer(epoch_seconds_hires(cn)) END SUBROUTINE start_timing SUBROUTINE end_timing ( string ) IMPLICIT NONE REAL(kind=8) :: now_hires CHARACTER *(*) :: string IF ( cn .lt. 1 ) THEN CALL wrf_error_fatal3("",58,& 'module_timing: clock nesting error, cn<1' ) ELSE IF ( cn .gt. cnmax ) THEN CALL wrf_error_fatal3("",61,& 'module_timing: clock nesting error, cn>cnmax' ) ENDIF call hires_timer(now_hires) elapsed_seconds = REAL(now_hires-epoch_seconds_hires(cn)) elapsed_seconds_total = elapsed_seconds_total + elapsed_seconds WRITE(6,'(A,A,A,F10.5,A)') 'Timing for ',TRIM(string),': ',elapsed_seconds,' elapsed seconds.' WRITE(0,'(A,A,A,F10.5,A)') 'Timing for ',TRIM(string),': ',elapsed_seconds,' elapsed seconds.' cn = cn - 1 END SUBROUTINE end_timing END MODULE module_timing