module error_messages 20,2
!-----------------------------------------------------------------------
!
! Purpose:
! General purpose routines for issuing error messages.
!
! Author: B. Eaton
!
!-----------------------------------------------------------------------
use abortutils
, only: endrun
use cam_logfile
, only: iulog
implicit none
save
private
public :: &
alloc_err, &! Issue error message after non-zero return from an allocate statement.
handle_err, &! Issue error message after non-zero return from anything
handle_ncerr ! Handle error returns from netCDF library procedures.
!##############################################################################
contains
!##############################################################################
subroutine alloc_err( istat, routine, name, nelem ) 17,1
!-----------------------------------------------------------------------
! Purpose:
! Issue error message after non-zero return from an allocate statement.
!
! Author: B. Eaton
!-----------------------------------------------------------------------
integer, intent(in) ::&
istat ! status from allocate statement
character(len=*), intent(in) ::&
routine, &! routine that called allocate
name ! name of array
integer, intent(in) ::&
nelem ! number of elements attempted to allocate
!-----------------------------------------------------------------------
if ( istat .ne. 0 ) then
write(iulog,*)'ERROR trying to allocate memory in routine: ' &
//trim(routine)
write(iulog,*)' Variable name: '//trim(name)
write(iulog,*)' Number of elements: ',nelem
call endrun
('ALLOC_ERR')
end if
return
end subroutine alloc_err
!##############################################################################
subroutine handle_err( istat, msg ),1
!-----------------------------------------------------------------------
! Purpose:
! Issue error message after non-zero return from anything.
!
! Author: T. Henderson
!-----------------------------------------------------------------------
integer, intent(in) :: istat ! status, zero = "no error"
character(len=*), intent(in) :: msg ! error message to print
!-----------------------------------------------------------------------
if ( istat .ne. 0 ) then
call endrun
(trim(msg))
end if
return
end subroutine handle_err
!##############################################################################
subroutine handle_ncerr( ret, mes, line ) 97,1
!-----------------------------------------------------------------------
! Purpose:
! Check netCDF library function return code. If error detected
! issue error message then abort.
!
! Author: B. Eaton
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
use netcdf
!-----------------------------------------------------------------------
integer, intent(in) ::&
ret ! return code from netCDF library routine
character(len=*), intent(in) ::&
mes ! message to be printed if error detected
integer, intent(in), optional :: line
!-----------------------------------------------------------------------
if ( ret .ne. NF90_NOERR ) then
if(present(line)) then
write(iulog,*) mes, line
else
write(iulog,*) mes
end if
write(iulog,*) nf90_strerror( ret )
call endrun
('HANDLE_NCERR')
endif
return
end subroutine handle_ncerr
!##############################################################################
end module error_messages