LCOV - code coverage report
Current view: | top level - control - cam_history_buffers.F90 (source / functions) |  |  | Hit | Total | Coverage
Test: | coverage.info |  | Lines: | 54 | 173 | 31.2 %
Date: | 2024-12-17 22:39:59 |  | Functions: | 5 | 8 | 62.5 %

              Line data    Source code
           1             : module cam_history_buffers
           2             :   use shr_kind_mod,        only: r8 => shr_kind_r8
           3             :   use cam_history_support, only: max_chars, field_info, hentry, dim_index_2d
           4             :   use cam_abortutils,      only: endrun
           5             :   use pio,                 only: var_desc_t
           6             :
           7             :   implicit none
           8             :
           9             :
          10             : contains
          11     1489176 :   subroutine hbuf_accum_inst (buf8, field, nacs, dimind, idim, flag_xyfill, fillvalue)
          12             :     !
          13             :     !-----------------------------------------------------------------------
          14             :     !
          15             :     ! Purpose: Accumulate instantaneous values of field in 2-D hbuf.
          16             :     !          Set accumulation counter to 1.
          17             :     !
          18             :     !-----------------------------------------------------------------------
          19             :     !
          20             :     real(r8), pointer :: buf8(:,:)    ! 2-D history buffer
          21             :     integer, pointer                 :: nacs(:) ! accumulation counter
          22             :     integer, intent(in)              :: idim    ! Longitude dimension of field array
          23             :     logical, intent(in)              :: flag_xyfill ! non-applicable xy points flagged with fillvalue
          24             :     real(r8),          intent(in ) :: field(idim,*)   ! real*8 array
          25             :     type (dim_index_2d), intent(in ) :: dimind  ! 2-D dimension index
          26             :     real(r8), intent(in) :: fillvalue
          27             :     !
          28             :     ! Local indices
          29             :     !
          30             :     integer :: ieu, jeu  ! number of elements in each dimension
          31             :     integer :: i, k      ! loop indices
          32             :
          33             :     logical :: bad       ! flag indicates input field fillvalues not applied consistently
          34             :     ! with vertical level
          35             :
          36     1489176 :     call dimind%dim_sizes(ieu, jeu)
          37             :
          38     2978352 :     do k=1,jeu
          39    26354952 :        do i=1,ieu
          40    24865776 :           buf8(i,k) = field(i,k)
          41             :        end do
          42             :     end do
          43             :
          44     1489176 :     if (flag_xyfill) then
          45           0 :        do i=1,ieu
          46           0 :           if (field(i,1) == fillvalue) then
          47           0 :              nacs(i) = 0
          48             :           else
          49           0 :              nacs(i) = 1
          50             :           end if
          51             :        end do
          52             :     else
          53     1489176 :        nacs(1) = 1
          54             :     end if
          55             :
          56     1489176 :     return
          57             :   end subroutine hbuf_accum_inst
          58             :   !#######################################################################
          59             :
          60   661234392 :   subroutine hbuf_accum_add (buf8, field, nacs, dimind, idim, flag_xyfill, fillvalue)
          61             :     !
          62             :     !-----------------------------------------------------------------------
          63             :     !
          64             :     ! Purpose: Add the values of field to 2-D hbuf.
          65             :     !          Increment accumulation counter by 1.
          66             :     !
          67             :     !-----------------------------------------------------------------------
          68             :     !
          69             :     real(r8), pointer :: buf8(:,:)    ! 2-D history buffer
          70             :     integer, pointer                 :: nacs(:) ! accumulation counter
          71             :     integer, intent(in) :: idim           ! Longitude dimension of field array
          72             :     logical, intent(in)              :: flag_xyfill ! non-applicable xy points flagged with fillvalue
          73             :     real(r8),          intent(in ) :: field(idim,*)   ! real*8 array
          74             :     type (dim_index_2d), intent(in ) :: dimind  ! 2-D dimension index
          75             :     real(r8), intent(in) :: fillvalue
          76             :     !
          77             :     ! Local indices
          78             :     !
          79             :     integer :: ieu, jeu  ! number of elements in each dimension
          80             :     integer :: i,k       ! indices
          81             :
          82   661234392 :     call dimind%dim_sizes(ieu, jeu)
          83             :
          84   661234392 :     if (flag_xyfill) then
          85     7461360 :        do k=1,jeu
          86    66024360 :           do i=1,ieu
          87    62293680 :              if (field(i,k) /= fillvalue) then
          88    29281500 :                 buf8(i,k) = buf8(i,k) + field(i,k)
          89             :              end if
          90             :           end do
          91             :        end do
          92             :        !
          93             :        ! Ensure input field has fillvalue defined invariant in the z-direction, then increment nacs
          94             :        !
          95     3730680 :        call check_accum (field, idim, ieu, jeu, fillvalue)
          96    62293680 :        do i=1,ieu
          97    62293680 :           if (field(i,1) /= fillvalue) then
          98    29281500 :              nacs(i) = nacs(i) + 1
          99             :           end if
         100             :        end do
         101             :     else
         102 34943864688 :        do k=1,jeu
         103 >57315*10^7 :           do i=1,ieu
         104 >57250*10^7 :              buf8(i,k) = buf8(i,k) + field(i,k)
         105             :           end do
         106             :        end do
         107   657503712 :        nacs(1) = nacs(1) + 1
         108             :     end if
         109             :
         110   661234392 :     return
         111             :   end subroutine hbuf_accum_add
         112             :
         113             :   !#######################################################################
         114             :
         115           0 :   subroutine hbuf_accum_variance (hbuf, sbuf, field, nacs, dimind, idim, flag_xyfill, fillvalue)
         116             :     !
         117             :     !-----------------------------------------------------------------------
         118             :     !
         119             :     ! Purpose: accumulate a running variance for standard deviations
         120             :     !
         121             :     !  The method of computing variance is from http://www.johndcook.com/blog/standard_deviation/
         122             :     !  and
         123             :     !  1962 paper by B. P. Welford and is presented in Donald Knuth's Art of
         124             :     !  Computer Programming, Vol 2, page 232, 3rd edition.
         125             :     !-----------------------------------------------------------------------
         126             :     !
         127             :     real(r8), pointer :: hbuf(:,:)    ! 2-D history buffer
         128             :     real(r8), pointer :: sbuf(:,:)    ! 2-D history buffer
         129             :     integer,  pointer :: nacs(:)      ! accumulation counter
         130             :     integer,  intent(in) :: idim           ! Longitude dimension of field array
         131             :     logical,  intent(in) :: flag_xyfill    ! non-applicable xy points flagged with fillvalue
         132             :     real(r8), intent(in) :: field(idim,*)  ! real*8 array
         133             :     type (dim_index_2d), intent(in ) :: dimind  ! 2-D dimension index
         134             :     real(r8), intent(in) :: fillvalue
         135             :     !
         136             :     ! Local indices
         137             :     !
         138             :     integer :: ieu, jeu  ! number of elements in each dimension
         139             :     integer :: i,k       ! indices
         140             :     real(r8) :: tmp
         141             :
         142           0 :     call dimind%dim_sizes(ieu, jeu)
         143             :
         144           0 :     if (flag_xyfill) then
         145             :
         146             :        !
         147             :        ! Ensure input field has fillvalue defined invariant in the z-direction, then increment nacs
         148             :        !
         149           0 :        call check_accum (field, idim, ieu, jeu, fillvalue)
         150           0 :        do i=1,ieu
         151           0 :           if (field(i,1) /= fillvalue) then
         152           0 :              nacs(i) = nacs(i) + 1
         153             :           end if
         154             :        end do
         155             :
         156           0 :        do k=1,jeu
         157           0 :           do i=1,ieu
         158           0 :              if (field(i,k) /= fillvalue) then
         159           0 :                 if (nacs(i)==1) then
         160           0 :                    hbuf(i,k) = field(i,k)
         161           0 :                    sbuf(i,k) = 0._r8
         162             :                 else
         163           0 :                    tmp = hbuf(i,k)
         164           0 :                    hbuf(i,k) = hbuf(i,k) + (field(i,k)-hbuf(i,k))/nacs(i)
         165           0 :                    sbuf(i,k) = sbuf(i,k) + (field(i,k)-hbuf(i,k))*(field(i,k)-tmp)
         166             :                 endif
         167             :              end if
         168             :           end do
         169             :        end do
         170             :
         171             :     else
         172             :
         173             :        ! increment counter before variance calculation
         174           0 :        nacs(1) = nacs(1) + 1
         175             :
         176           0 :        do k=1,jeu
         177           0 :           do i=1,ieu
         178           0 :              if (nacs(1)==1) then
         179           0 :                 hbuf(i,k) = field(i,k)
         180           0 :                 sbuf(i,k) = 0._r8
         181             :              else
         182           0 :                 tmp = hbuf(i,k)
         183           0 :                 hbuf(i,k) = hbuf(i,k) + (field(i,k)-hbuf(i,k))/nacs(1)
         184           0 :                 sbuf(i,k) = sbuf(i,k) + (field(i,k)-hbuf(i,k))*(field(i,k)-tmp)
         185             :              endif
         186             :           end do
         187             :        end do
         188             :
         189             :     end if
         190             :
         191           0 :   end subroutine hbuf_accum_variance
         192             :
         193             :   !#######################################################################
         194             :
         195           0 :   subroutine hbuf_accum_add00z (buf8, field, nacs, dimind, idim, flag_xyfill, fillvalue)
         196             :     !
         197             :     !-----------------------------------------------------------------------
         198             :     !
         199             :     ! Purpose: Add the values of field to 2-D hbuf, only if time is 00z.
         200             :     !          Increment accumulation counter by 1.
         201             :     !
         202             :     !-----------------------------------------------------------------------
         203             :     !
         204             :     use time_manager, only:  get_curr_date
         205             :
         206             :     real(r8), pointer :: buf8(:,:)    ! 2-D history buffer
         207             :     integer, pointer                 :: nacs(:) ! accumulation counter
         208             :     integer, intent(in) :: idim           ! Longitude dimension of field array
         209             :     logical, intent(in)              :: flag_xyfill ! non-applicable xy points flagged with fillvalue
         210             :     real(r8),          intent(in ) :: field(idim,*)   ! real*8 array
         211             :     type (dim_index_2d), intent(in ) :: dimind  ! 2-D dimension index
         212             :     real(r8), intent(in) :: fillvalue
         213             :     !
         214             :     ! Local indices
         215             :     !
         216             :     integer :: ieu, jeu  ! number of elements in each dimension
         217             :     integer :: i,k       ! indices
         218             :     integer :: yr, mon, day, tod
         219             :
         220             :     ! get the time of day, return if not 00z
         221           0 :     call get_curr_date (yr,mon,day,tod)
         222           0 :     if (tod /= 0) return
         223             :
         224           0 :     call dimind%dim_sizes(ieu, jeu)
         225             :
         226           0 :     if (flag_xyfill) then
         227           0 :        do k=1,jeu
         228           0 :           do i=1,ieu
         229           0 :              if (field(i,k) /= fillvalue) then
         230           0 :                 buf8(i,k) = buf8(i,k) + field(i,k)
         231             :              end if
         232             :           end do
         233             :        end do
         234             :        !
         235             :        ! Ensure input field has fillvalue defined invariant in the z-direction, then increment nacs
         236             :        !
         237           0 :        call check_accum (field, idim, ieu, jeu, fillvalue)
         238           0 :        do i=1,ieu
         239           0 :           if (field(i,1) /= fillvalue) then
         240           0 :              nacs(i) = nacs(i) + 1
         241             :           end if
         242             :        end do
         243             :     else
         244           0 :        do k=1,jeu
         245           0 :           do i=1,ieu
         246           0 :              buf8(i,k) = buf8(i,k) + field(i,k)
         247             :           end do
         248             :        end do
         249           0 :        nacs(1) = nacs(1) + 1
         250             :     end if
         251             :
         252             :     return
         253           0 :   end subroutine hbuf_accum_add00z
         254             :
         255             :   !#######################################################################
         256             :
         257     1489176 :   subroutine hbuf_accum_max (buf8, field, nacs, dimind, idim, flag_xyfill, fillvalue)
         258             :     !
         259             :     !-----------------------------------------------------------------------
         260             :     !
         261             :     ! Purpose: Accumulate the maximum values of field in 2-D hbuf
         262             :     !          Set accumulation counter to 1.
         263             :     !
         264             :     !-----------------------------------------------------------------------
         265             :     !
         266             :     real(r8), pointer :: buf8(:,:)    ! 2-D history buffer
         267             :     integer, pointer                 :: nacs(:) ! accumulation counter
         268             :     integer, intent(in) :: idim           ! Longitude dimension of field array
         269             :     logical, intent(in)              :: flag_xyfill ! non-applicable xy points flagged with fillvalue
         270             :     real(r8),          intent(in ) :: field(idim,*)   ! real*8 array
         271             :     type (dim_index_2d), intent(in ) :: dimind  ! 2-D dimension index
         272             :     real(r8), intent(in) :: fillvalue
         273             :     !
         274             :     ! Local indices
         275             :     !
         276             :     integer :: ieu, jeu  ! number of elements in each dimension
         277             :     integer :: i, k
         278             :
         279     1489176 :     call dimind%dim_sizes(ieu, jeu)
         280             :
         281     1489176 :     if (flag_xyfill) then
         282           0 :        do k=1,jeu
         283           0 :           do i=1,ieu
         284           0 :              if (nacs(i) == 0) then
         285           0 :                 buf8(i,k) = -huge (buf8)
         286             :              end if
         287           0 :              if (field(i,k) > buf8(i,k) .and. field(i,k) /= fillvalue) then
         288           0 :                 buf8(i,k) = field(i,k)
         289             :              end if
         290             :           end do
         291             :        end do
         292             :     else
         293     2978352 :        do k=1,jeu
         294    26354952 :           do i=1,ieu
         295    23376600 :              if (nacs(1) == 0) then
         296     7824600 :                 buf8(i,k) = -huge (buf8)
         297             :              end if
         298    24865776 :              if (field(i,k) > buf8(i,k)) then
         299    16138698 :                 buf8(i,k) = field(i,k)
         300             :              end if
         301             :           end do
         302             :        end do
         303             :     end if
         304             :
         305     1489176 :     if (flag_xyfill) then
         306           0 :        call check_accum (field, idim, ieu, jeu,fillvalue)
         307           0 :        do i=1,ieu
         308           0 :           if (field(i,1) /= fillvalue) then
         309           0 :              nacs(i) = 1
         310             :           end if
         311             :        end do
         312             :     else
         313     1489176 :        nacs(1) = 1
         314             :     end if
         315             :
         316     1489176 :     return
         317           0 :   end subroutine hbuf_accum_max
         318             :
         319             :   !#######################################################################
         320             :
         321     1489176 :   subroutine hbuf_accum_min (buf8, field, nacs, dimind, idim, flag_xyfill, fillvalue)
         322             :     !
         323             :     !-----------------------------------------------------------------------
         324             :     !
         325             :     ! Purpose: Accumulate the minimum values of field in 2-D hbuf
         326             :     !          Set accumulation counter to 1.
         327             :     !
         328             :     !-----------------------------------------------------------------------
         329             :     !
         330             :     real(r8), pointer :: buf8(:,:)    ! 2-D history buffer
         331             :     integer, pointer                 :: nacs(:) ! accumulation counter
         332             :     integer, intent(in) :: idim           ! Longitude dimension of field array
         333             :     logical, intent(in)              :: flag_xyfill ! non-applicable xy points flagged with fillvalue
         334             :     real(r8),          intent(in ) :: field(idim,*)   ! real*8 array
         335             :     type (dim_index_2d), intent(in ) :: dimind  ! 2-D dimension index
         336             :     real(r8), intent(in) :: fillvalue
         337             :     !
         338             :     ! Local indices
         339             :     !
         340             :     integer :: ieu, jeu  ! number of elements in each dimension
         341             :     integer :: i, k
         342             :
         343     1489176 :     call dimind%dim_sizes(ieu, jeu)
         344             :
         345     1489176 :     if (flag_xyfill) then
         346           0 :        do k=1,jeu
         347           0 :           do i=1,ieu
         348           0 :              if (nacs(i) == 0) then
         349           0 :                 buf8(i,k) = +huge (buf8)
         350             :              end if
         351           0 :              if (field(i,k) < buf8(i,k) .and. field(i,k) /= fillvalue) then
         352           0 :                 buf8(i,k) = field(i,k)
         353             :              end if
         354             :           end do
         355             :        end do
         356             :     else
         357     2978352 :        do k=1,jeu
         358    26354952 :           do i=1,ieu
         359    23376600 :              if (nacs(1) == 0) then
         360     7824600 :                 buf8(i,k) = +huge (buf8)
         361             :              end if
         362    24865776 :              if (field(i,k) < buf8(i,k)) then
         363    14707358 :                 buf8(i,k) = field(i,k)
         364             :              end if
         365             :           end do
         366             :        end do
         367             :     end if
         368             :
         369     1489176 :     if (flag_xyfill) then
         370           0 :        call check_accum (field, idim, ieu, jeu, fillvalue)
         371           0 :        do i=1,ieu
         372           0 :           if (field(i,1) /= fillvalue) then
         373           0 :              nacs(i) = 1
         374             :           end if
         375             :        end do
         376             :     else
         377     1489176 :        nacs(1) = 1
         378             :     end if
         379             :
         380     1489176 :     return
         381             :   end subroutine hbuf_accum_min
         382             :
         383           0 :   subroutine hbuf_accum_addlcltime (buf8, field, nacs, dimind, idim, flag_xyfill, fillvalue, c , decomp_type,&
         384             :        lcltod_start, lcltod_stop)
         385             :     !
         386             :     !-----------------------------------------------------------------------
         387             :     !
         388             :     ! Purpose: Add the values of field to 2-D hbuf, only if the local time
         389             :     !          is in the range specified.
         390             :     !          Increment accumulation counter by 1.
         391             :     !
         392             :     !-----------------------------------------------------------------------
         393             :     !
         394             :     use time_manager, only:  get_curr_date
         395             :     use phys_grid,    only:  get_rlon_all_p, phys_decomp
         396             :     use physconst,    only:  pi
         397             :     use phys_grid,    only: get_ncols_p
         398             :     use dyn_grid,     only: dyn_grid_get_elem_coords
         399             :
         400             :     type (dim_index_2d), intent(in ) :: dimind  ! 2-D dimension index
         401             :     real(r8), pointer    :: buf8(:,:)    ! 2-D history buffer
         402             :     integer,  pointer    :: nacs(:) ! accumulation counter
         403             :     integer,  intent(in) :: idim           ! Longitude dimension of field array
         404             :     logical,  intent(in) :: flag_xyfill ! non-applicable xy points flagged with fillvalue
         405             :     real(r8), intent(in) :: field(idim,*)   ! real*8 array
         406             :     integer,  intent(in) :: c              ! chunk (physics) or latitude (dynamics) index
         407             :
         408             :     integer, intent(in)  :: decomp_type, lcltod_start, lcltod_stop
         409             :     real(r8), intent(in) :: fillvalue
         410             :
         411             :     !
         412             :     ! Local indices
         413             :     !
         414             :     integer  :: ieu, jeu  ! number of elements in each dimension
         415             :     integer  :: i,k       ! indices
         416             :     integer  :: yr, mon, day, tod
         417             :     integer  :: ncols
         418             :
         419           0 :     integer,  allocatable :: lcltod(:)     ! local time of day (secs)
         420           0 :     logical,  allocatable :: inavg(:)      ! is the column in the desired local time range?
         421           0 :     real(r8), allocatable :: rlon(:)       ! column longitude (radians)
         422           0 :     integer,  allocatable :: cdex(:)       ! global column index
         423             :
         424           0 :     call dimind%dim_sizes(ieu, jeu)
         425             :
         426           0 :     allocate( inavg(1:ieu) , lcltod(1:ieu) )
         427           0 :     lcltod(:) = 0
         428             :
         429             :     !
         430             :     ! Get the time of day and longitude and compute the local time.
         431             :     !
         432           0 :     call get_curr_date (yr,mon,day,tod)
         433             :
         434           0 :     if ( decomp_type == phys_decomp ) then
         435             :
         436           0 :        ncols = get_ncols_p(c)
         437           0 :        ieu = ncols
         438           0 :        allocate( rlon(ncols) )
         439           0 :        call get_rlon_all_p(c, ncols, rlon)
         440           0 :        lcltod(1:ncols) = mod((tod) + (nint(86400._r8 * rlon(1:ncols) / 2._r8 / pi)), 86400)
         441             :
         442             :     else
         443             :
         444           0 :        ncols = ieu
         445           0 :        allocate(rlon(ncols),cdex(ncols))
         446           0 :        call dyn_grid_get_elem_coords( c, rlon=rlon, cdex=cdex )
         447           0 :        lcltod(:) = -999999
         448           0 :        where( cdex(:)>0 ) lcltod(1:ieu) = mod((tod) + (nint(86400._r8 * rlon(1:ncols) / 2._r8 / pi)), 86400)
         449             :
         450             :     endif
         451             :
         452             :
         453             :
         454             :     !
         455             :     ! Set a flag to indicate that the column is in the requested local time range.
         456             :     ! If lcltod_stop is less than lcltod_start, then the time is wrapping around 24 hours.
         457             :     !
         458           0 :     inavg(:)  = .false.
         459             :
         460           0 :     if (lcltod_stop < lcltod_start) then
         461             :        ! the ".and.(lcltod(:)>0" condition was added to exclude the undefined (-999999) columns
         462           0 :        where((lcltod(:) >= lcltod_start) .or. ((lcltod(:) < lcltod_stop).and.(lcltod(:)>0))) inavg(:) = .true.
         463           0 :     else if (lcltod_stop == lcltod_start) then
         464           0 :        where(lcltod(1:ieu) == lcltod_start) inavg(1:ieu) = .true.
         465             :     else
         466           0 :        where((lcltod(:) >= lcltod_start) .and. (lcltod(:) < lcltod_stop)) inavg(:) = .true.
         467             :     end if
         468             :
         469           0 :     if (flag_xyfill) then
         470           0 :        do k=1,jeu
         471           0 :           do i=1,ieu
         472           0 :              if (inavg(i) .and. (field(i,k) /= fillvalue)) then
         473           0 :                 buf8(i,k) = buf8(i,k) + field(i,k)
         474             :              end if
         475             :           end do
         476             :        end do
         477             :        !
         478             :        ! Ensure input field has fillvalue defined invariant in the z-direction, then increment nacs
         479             :        !
         480           0 :        call check_accum (field, idim, ieu, jeu, fillvalue)
         481           0 :        do i=1,ieu
         482           0 :           if (inavg(i) .and. (field(i,1) /= fillvalue)) then
         483           0 :              nacs(i) = nacs(i) + 1
         484             :           end if
         485             :        end do
         486             :     else
         487           0 :        do k=1,jeu
         488           0 :           do i=1,ieu
         489           0 :              if (inavg(i)) then
         490           0 :                 buf8(i,k) = buf8(i,k) + field(i,k)
         491             :              end if
         492             :           end do
         493             :        end do
         494             :        !
         495             :        ! NOTE: Because of the local time, some columns in the chunk may not be used in the
         496             :        ! average, so nacs need to be dimension with the number of columns unlike the other
         497             :        ! averaging techniques.
         498             :        !
         499           0 :        do i=1,ieu
         500           0 :           if (inavg(i)) nacs(i) = nacs(i) + 1
         501             :        end do
         502             :     end if
         503             :
         504           0 :     deallocate( inavg , rlon, lcltod )
         505           0 :     if (allocated(cdex)) deallocate(cdex)
         506             :
         507           0 :     return
         508           0 :   end subroutine hbuf_accum_addlcltime
         509             :
         510             : !#######################################################################
         511             :
         512             :
         513             :   !#######################################################################
         514             :
         515     3730680 :   subroutine check_accum (field, idim, ieu, jeu, fillvalue)
         516             :     !
         517             :     integer, intent(in)  :: idim
         518             :     real(r8), intent(in) :: field(idim,*)   ! real*8 array
         519             :     integer, intent(in)  :: ieu,jeu         ! loop ranges
         520             :
         521             :     logical :: bad
         522             :     integer :: i,k
         523             :     real(r8), intent(in) :: fillvalue
         524             :     !
         525             :     ! For multilevel fields ensure that all levels have fillvalue applied consistently
         526             :     !
         527     3730680 :     bad = .false.
         528     3730680 :     do k=2,jeu
         529     3730680 :        do i=1,ieu
         530           0 :           if (field(i,1) == fillvalue .and. field(i,k) /= fillvalue .or. &
         531           0 :                field(i,1) /= fillvalue .and. field(i,k) == fillvalue) then
         532           0 :              bad = .true.
         533             :           end if
         534             :        end do
         535             :     end do
         536             :
         537     3730680 :     if (bad) then
         538           0 :        call endrun ('CHECK_ACCUM: inconsistent level values')
         539             :     end if
         540             :
         541     3730680 :     return
         542           0 :   end subroutine check_accum
         543             :
         544             : end module cam_history_buffers

Generated by: LCOV version 1.14