LCOV - code coverage report
Current view: top level - icepack/columnphysics - icepack_warnings.F90 (source / functions) Hit Total Coverage
Test: 200617-180449:aec9683041:7:first,base,travis,decomp,reprosum,io,quick Lines: 43 56 76.79 %
Date: 2020-06-17 18:05:09 Functions: 7 8 87.50 %

          Line data    Source code
       1             : 
       2             : module icepack_warnings
       3             : 
       4             :       use icepack_kinds
       5             : 
       6             :       implicit none
       7             : 
       8             :       private
       9             : 
      10             :       ! warning messages
      11             :       character(len=char_len_long), dimension(:), allocatable :: warnings
      12             :       integer :: nWarnings = 0
      13             :       integer, parameter :: nWarningsBuffer = 10 ! incremental number of messages
      14             : 
      15             :       ! abort flag, accessed via icepack_warnings_setabort and icepack_warnings_aborted
      16             :       logical :: warning_abort = .false.
      17             : 
      18             :       ! public string for all subroutines to use
      19             :       character(len=char_len_long), public :: warnstr
      20             : 
      21             :       public :: &
      22             :         icepack_warnings_clear,    &
      23             :         icepack_warnings_print,    &
      24             :         icepack_warnings_flush,    &
      25             :         icepack_warnings_aborted,  &
      26             :         icepack_warnings_add,      &
      27             :         icepack_warnings_setabort
      28             : 
      29             :       private :: &
      30             :         icepack_warnings_getall,   &
      31             :         icepack_warnings_getone
      32             : 
      33             : !=======================================================================
      34             : 
      35             : contains
      36             : 
      37             : !=======================================================================
      38             : !autodocument_start icepack_warnings_aborted
      39             : ! turn on the abort flag in the icepack warnings package
      40             : ! pass in an optional error message
      41             : 
      42 >15063*10^7 :       logical function icepack_warnings_aborted(instring)
      43             : 
      44             :         character(len=*),intent(in), optional :: instring
      45             : 
      46             : !autodocument_end
      47             : 
      48             :         character(len=*),parameter :: subname='(icepack_warnings_aborted)'
      49             : 
      50 >15063*10^7 :         icepack_warnings_aborted = warning_abort
      51           0 :         if (warning_abort .and. present(instring)) then
      52           0 :            call icepack_warnings_add(subname//' ... '//trim(instring))
      53             :         endif
      54             : 
      55 >15063*10^7 :       end function icepack_warnings_aborted
      56             : 
      57             : !=======================================================================
      58             : 
      59        2828 :       subroutine icepack_warnings_setabort(abortflag,file,line)
      60             : 
      61             :         logical, intent(in) :: abortflag
      62             :         character(len=*), intent(in), optional :: file
      63             :         integer, intent(in), optional :: line
      64             : 
      65             :         character(len=*),parameter :: subname='(icepack_warnings_setabort)'
      66             : 
      67             :         ! try to capture just the first setabort call
      68             : 
      69        2828 :         if (abortflag) then
      70           0 :           write(warnstr,*) subname,abortflag
      71           0 :           if (present(file)) write(warnstr,*) trim(warnstr)//' :file '//trim(file)
      72           0 :           if (present(line)) write(warnstr,*) trim(warnstr)//' :line ',line
      73           0 :           call icepack_warnings_add(warnstr)
      74             :         endif
      75             : 
      76        2828 :         warning_abort = abortflag
      77             : 
      78        2828 :       end subroutine icepack_warnings_setabort
      79             : 
      80             : !=======================================================================
      81             : !autodocument_start icepack_warnings_clear
      82             : ! clear all warning messages from the icepack warning buffer
      83             : 
      84 22270198657 :       subroutine icepack_warnings_clear()
      85             : 
      86             : !autodocument_end
      87             : 
      88             :         character(len=*),parameter :: subname='(icepack_warnings_clear)'
      89             : 
      90 22270198657 :         nWarnings = 0
      91             : 
      92 22270198657 :       end subroutine icepack_warnings_clear
      93             : 
      94             : !=======================================================================
      95             :       
      96           0 :       subroutine icepack_warnings_getall(warningsOut)
      97             : 
      98             :         character(len=char_len_long), dimension(:), allocatable, intent(out) :: &
      99             :              warningsOut
     100             :  
     101             :         integer :: iWarning
     102             :         character(len=*),parameter :: subname='(icepack_warnings_getall)'
     103             : 
     104           0 :         if (allocated(warningsOut)) deallocate(warningsOut)
     105           0 :         allocate(warningsOut(nWarnings))
     106             : 
     107           0 :         do iWarning = 1, nWarnings
     108           0 :            warningsOut(iWarning) = trim(icepack_warnings_getone(iWarning))
     109             :         enddo
     110             : 
     111           0 :       end subroutine icepack_warnings_getall
     112             : 
     113             : !=======================================================================
     114             : !autodocument_start icepack_warnings_print
     115             : ! print all warning messages from the icepack warning buffer
     116             : 
     117         273 :       subroutine icepack_warnings_print(iounit)
     118             : 
     119             :         integer, intent(in) :: iounit
     120             : 
     121             : !autodocument_end
     122             : 
     123             :         integer :: iWarning
     124             :         character(len=*),parameter :: subname='(icepack_warnings_print)'
     125             : 
     126             : ! tcraig
     127             : ! this code intermittenly aborts on recursive IO errors with intel
     128             : ! not sure if it's OMP or something else causing this
     129         217 : !$OMP MASTER
     130        2737 :         do iWarning = 1, nWarnings
     131        2743 :           write(iounit,*) trim(icepack_warnings_getone(iWarning))
     132             :         enddo
     133             : !$OMP END MASTER
     134             : 
     135         273 :       end subroutine icepack_warnings_print
     136             : 
     137             : !=======================================================================
     138             : !autodocument_start icepack_warnings_flush
     139             : ! print and clear all warning messages from the icepack warning buffer
     140             : 
     141 22270198657 :       subroutine icepack_warnings_flush(iounit)
     142             : 
     143             :         integer, intent(in) :: iounit
     144             : 
     145             : !autodocument_end
     146             : 
     147             :         character(len=*),parameter :: subname='(icepack_warnings_flush)'
     148             : 
     149 22270198657 :         if (nWarnings > 0) then
     150         273 :           call icepack_warnings_print(iounit)
     151             :         endif
     152 22270198657 :         call icepack_warnings_clear()
     153             : 
     154 22270198657 :       end subroutine icepack_warnings_flush
     155             : 
     156             : !=======================================================================
     157             : 
     158        2476 :       subroutine icepack_warnings_add(warning)
     159             : 
     160             :         character(len=*), intent(in) :: warning ! warning to add to array of warnings
     161             : 
     162             :         ! local 
     163             : 
     164        2476 :         character(len=char_len_long), dimension(:), allocatable :: warningsTmp
     165             :         integer :: &
     166             :              nWarningsArray, & ! size of warnings array at start
     167             :              iWarning ! warning index
     168             :         character(len=*),parameter :: subname='(icepack_warnings_add)'
     169             : 
     170        3988 : !$OMP CRITICAL (omp_warnings_add)
     171             :         ! check if warnings array is not allocated
     172        2476 :         if (.not. allocated(warnings)) then
     173             : 
     174             :            ! allocate warning array with number of buffer elements
     175         250 :            allocate(warnings(nWarningsBuffer))
     176             : 
     177             :            ! set initial number of nWarnings
     178         250 :            nWarnings = 0
     179             : 
     180             :         ! already allocated
     181             :         else
     182             : 
     183             :            ! find the size of the warnings array at the start
     184        2226 :            nWarningsArray = size(warnings)
     185             :            
     186             :            ! check to see if need more space in warnings array
     187        2226 :            if (nWarnings + 1 > nWarningsArray) then
     188             :            
     189             :               ! allocate the temporary warning storage
     190          17 :               allocate(warningsTmp(nWarningsArray))
     191             : 
     192             :               ! copy the warnings to temporary storage
     193         187 :               do iWarning = 1, nWarningsArray
     194         187 :                  warningsTmp(iWarning) = trim(warnings(iWarning))
     195             :               enddo ! iWarning
     196             : 
     197             :               ! increase the size of the warning array by the buffer size
     198          17 :               deallocate(warnings)
     199          17 :               allocate(warnings(nWarningsArray + nWarningsBuffer))
     200             : 
     201             :               ! copy back the temporary stored warnings
     202         187 :               do iWarning = 1, nWarningsArray
     203         187 :                  warnings(iWarning) = trim(warningsTmp(iWarning))
     204             :               enddo ! iWarning
     205             : 
     206             :               ! deallocate the temporary storage
     207          17 :               deallocate(warningsTmp)
     208             : 
     209             :            endif
     210             :               
     211             :         endif
     212             : 
     213             :         ! increase warning number
     214        2476 :         nWarnings = nWarnings + 1
     215             : !$OMP END CRITICAL (omp_warnings_add)
     216             : 
     217             :         ! add the new warning
     218        2476 :         warnings(nWarnings) = trim(warning)
     219             : 
     220        4952 :       end subroutine icepack_warnings_add
     221             : 
     222             : !=======================================================================
     223             : 
     224        2470 :       function icepack_warnings_getone(iWarning) result(warning)
     225             : 
     226             :         integer, intent(in) :: iWarning
     227             : 
     228             :         character(len=char_len_long) :: warning
     229             : 
     230             :         character(len=*),parameter :: subname='(icepack_warnings_getone)'
     231             : 
     232        2470 :         if (iWarning <= nWarnings) then
     233        2470 :            warning = warnings(iWarning)
     234             :         else
     235           0 :            warning = ""
     236             :         endif
     237             : 
     238        2470 :       end function icepack_warnings_getone
     239             : 
     240             : !=======================================================================
     241             : 
     242             : end module icepack_warnings

Generated by: LCOV version 1.14-6-g40580cd