diff --git a/physics/memcheck.F90 b/physics/memcheck.F90 index 53bb467ae..3d8e5df68 100644 --- a/physics/memcheck.F90 +++ b/physics/memcheck.F90 @@ -3,19 +3,13 @@ module memcheck - use machine, only: kind_phys - implicit none private public memcheck_init, memcheck_run, memcheck_finalize - ! Can use larger time frame to track memory leaks - real(kind_phys), parameter :: SECONDS_ELAPSED_MIN = 3500.0 - real(kind_phys), parameter :: SECONDS_ELAPSED_MAX = 3700.0 - - contains + contains subroutine memcheck_init () end subroutine memcheck_init @@ -24,15 +18,17 @@ subroutine memcheck_finalize () end subroutine memcheck_finalize !> \section arg_table_memcheck_run Argument Table -!! | local_name | standard_name | long_name | units | rank | type | kind | intent | optional | -!! |-----------------|--------------------------------------------------------|---------------------------------------------------------|---------------|------|-----------|-----------|--------|----------| -!! | seconds_elapsed | seconds_elapsed_since_model_initialization | seconds elapsed since model initialization | s | 0 | real | kind_phys | in | F | -!! | block_number | block_number | for explicit data blocking: block number of this block | index | 0 | integer | | in | F | -!! | mpicomm | mpi_comm | MPI communicator | index | 0 | integer | | in | F | -!! | errmsg | ccpp_error_message | error message for error handling in CCPP | none | 0 | character | len=* | out | F | -!! | errflg | ccpp_error_flag | error flag for error handling in CCPP | flag | 0 | integer | | out | F | +!! | local_name | standard_name | long_name | units | rank | type | kind | intent | optional | +!! |-----------------|--------------------------------------------------------|---------------------------------------------------------|-------|------|-----------|-----------|--------|----------| +!! | mpicomm | mpi_comm | MPI communicator | index | 0 | integer | | in | F | +!! | mpirank | mpi_rank | current MPI-rank | index | 0 | integer | | in | F | +!! | mpisize | mpi_size | number of MPI tasks in communicator | count | 0 | integer | | in | F | +!! | mpiroot | mpi_root | master MPI-rank | index | 0 | integer | | in | T | +!! | ompthreads | omp_threads | number of OpenMP threads available for physics schemes | count | 0 | integer | | in | F | +!! | errmsg | ccpp_error_message | error message for error handling in CCPP | none | 0 | character | len=* | out | F | +!! | errflg | ccpp_error_flag | error flag for error handling in CCPP | flag | 0 | integer | | out | F | !! - subroutine memcheck_run (seconds_elapsed, block_number, mpicomm, errmsg, errflg) + subroutine memcheck_run (mpicomm, mpirank, mpisize, mpiroot, ompthreads, errmsg, errflg) #ifdef MPI use mpi @@ -45,15 +41,16 @@ subroutine memcheck_run (seconds_elapsed, block_number, mpicomm, errmsg, errflg) implicit none !--- interface variables - real(kind=kind_phys), intent(in) :: seconds_elapsed - integer, intent(in) :: block_number integer, intent(in) :: mpicomm + integer, intent(in) :: mpirank + integer, intent(in) :: mpisize + integer, optional, intent(in) :: mpiroot + integer, intent(in) :: ompthreads character(len=*), intent(out) :: errmsg integer, intent(out) :: errflg !--- local variables integer :: impi, ierr - integer :: mpirank, mpisize integer :: ompthread character(len=1024) :: memory_usage @@ -61,36 +58,30 @@ subroutine memcheck_run (seconds_elapsed, block_number, mpicomm, errmsg, errflg) errmsg = '' errflg = 0 - if (seconds_elapsed < SECONDS_ELAPSED_MIN .or. & - seconds_elapsed > SECONDS_ELAPSED_MAX) return - - if (block_number>1) return - -#ifdef MPI - call MPI_COMM_RANK(MPI_COMM_WORLD, mpirank, ierr) - call MPI_COMM_SIZE(MPI_COMM_WORLD, mpisize, ierr) -#else - mpirank = 0 - mpisize = 1 -#endif - #ifdef OPENMP ompthread = OMP_GET_THREAD_NUM() #else ompthread = 0 #endif - + ierr = ccpp_memory_usage(mpicomm, memory_usage) + if (present(mpiroot) .and. mpirank==mpiroot) then + write(0,'(a)') trim(memory_usage) + else if (.not.present(mpiroot)) then + ! Output ordered by MPI rank + do impi=0,mpisize-1 + if (mpirank==impi) then + write(0,'(a)') trim(memory_usage) + end if +#ifdef MPI + call MPI_BARRIER(mpicomm,ierr) +#endif + end do + end if - ! Output ordered by MPI rank - do impi=0,mpisize-1 - if (mpirank==impi .and. ompthread==0) then - write(0,'(a)') trim(memory_usage) - end if #ifdef MPI - call MPI_BARRIER(MPI_COMM_WORLD,ierr) + call MPI_BARRIER(mpicomm,ierr) #endif - end do end subroutine memcheck_run