module phys_debug_util 8,5 !---------------------------------------------------------------------------------------- ! Module to facilitate debugging of physics parameterizations. ! ! The user requests a location for debugging in lat/lon coordinates ! (degrees). The initialization routine does a global search to find the ! column in the physics grid closest to the requested location. The local ! indices of that column in the physics decomposition are stored as module ! data. The user code then passes the local chunk index of the chunked ! data into the subroutine that will write diagnostic information for the ! column. The function phys_debug_col returns the local column index if ! the column of interest is contained in the chunk, and zero otherwise. ! Printing is done only if a column index >0 is returned. ! ! Phil Rasch, B. Eaton, Feb 2008 !---------------------------------------------------------------------------------------- use shr_kind_mod, only: r8 => shr_kind_r8 use phys_grid, only: phys_grid_find_col, get_rlat_p, get_rlon_p use spmd_utils, only: masterproc, iam use cam_logfile, only: iulog use abortutils, only: endrun implicit none private save real(r8), parameter :: uninit_r8 = huge(1._r8) ! Public methods public phys_debug_readnl ! read namelist input public phys_debug_init ! initialize the method to a chunk and column public phys_debug_col ! return local column index in debug chunk ! Namelist variables real(r8) :: phys_debug_lat = uninit_r8 ! latitude of requested debug column location in degrees real(r8) :: phys_debug_lon = uninit_r8 ! longitude of requested debug column location in degrees integer :: debchunk = -999 ! local index of the chuck we will debug integer :: debcol = -999 ! the column within the chunk we will debug !================================================================================ contains !================================================================================ subroutine phys_debug_readnl(nlfile) 1,9 use namelist_utils, only: find_group_name use units, only: getunit, freeunit use mpishorthand character(len=*), intent(in) :: nlfile ! filepath for file containing namelist input ! Local variables integer :: unitn, ierr character(len=*), parameter :: subname = 'phys_debug_readnl' namelist /phys_debug_nl/ phys_debug_lat, phys_debug_lon !----------------------------------------------------------------------------- if (masterproc) then unitn = getunit() open( unitn, file=trim(nlfile), status='old' ) call find_group_name(unitn, 'phys_debug_nl', status=ierr) if (ierr == 0) then read(unitn, phys_debug_nl, iostat=ierr) if (ierr /= 0) then call endrun(subname // ':: ERROR reading namelist') end if end if close(unitn) call freeunit(unitn) end if #ifdef SPMD ! Broadcast namelist variables call mpibcast(phys_debug_lat, 1, mpir8, 0, mpicom) call mpibcast(phys_debug_lon, 1, mpir8, 0, mpicom) #endif end subroutine phys_debug_readnl !================================================================================ subroutine phys_debug_init() 1,3 integer :: owner, lchunk, icol real(r8) :: deblat, deblon !----------------------------------------------------------------------------- ! If no debug column specified then do nothing if (phys_debug_lat == uninit_r8 .or. phys_debug_lon == uninit_r8) return ! User has specified a column location for debugging. Find the closest ! column in the physics grid. call phys_grid_find_col(phys_debug_lat, phys_debug_lon, owner, lchunk, icol) ! If the column is owned by this process then save it's local indices if (iam == owner) then debchunk = lchunk debcol = icol deblat = get_rlat_p(lchunk, icol)*57.296 ! approximate conversion for log output only deblon = get_rlon_p(lchunk, icol)*57.296 write(iulog,*) 'phys_debug_init: debugging column at lat=', deblat, ' lon=', deblon end if end subroutine phys_debug_init !================================================================================ integer function phys_debug_col(chunk) 7 integer, intent(in) :: chunk !----------------------------------------------------------------------------- if (chunk == debchunk) then phys_debug_col = debcol else phys_debug_col = 0 endif end function phys_debug_col !================================================================================ end module phys_debug_util