LCOV - code coverage report
Current view: top level - utils - buffer.F90.in (source / functions) Hit Total Coverage
Test: coverage.info Lines: 54 86 62.8 %
Date: 2024-12-17 17:57:11 Functions: 18 56 32.1 %

          Line data    Source code
       1             : module buffer
       2             : 
       3             :   !----------------------------------------------------------------------- 
       4             :   ! 
       5             :   ! Purpose: 
       6             :   !   LOW level handler for f90 arrays. 
       7             :   !
       8             :   ! Author: J. Edwards
       9             :   !
      10             :   ! This file is used with genf90.pl to generate buffer.F90  
      11             :   ! 
      12             :   !-----------------------------------------------------------------------
      13             : 
      14             :   use shr_kind_mod,     only: r8 => shr_kind_r8, r4=> shr_kind_r4, i4=> shr_kind_i4
      15             :   use cam_logfile,      only: iulog
      16             :   use cam_abortutils,   only: endrun
      17             : 
      18             :   implicit none
      19             :   private
      20             :   ! The maximum number of dims in a fortran array
      21             : #define MAXDIMS 7  
      22             : 
      23             : 
      24             :   type buffer_field_default_type
      25             :      private
      26             :      real(r8), pointer :: data(:,:,:,:,:,:,:) => null()
      27             :   end type buffer_field_default_type
      28             : 
      29             :   ! TYPE int,double,real 
      30             :   type buffer_field_{TYPE}
      31             :      private
      32             :      {VTYPE}, pointer :: data(:,:,:,:,:,:,:) => null()
      33             :   end type buffer_field_{TYPE}
      34             : 
      35             :   integer(i4), parameter,public :: dtype_i4=1
      36             :   real(r8), parameter,public :: dtype_r8=1_r8
      37             :   real(r4), parameter,public :: dtype_r4=1_r4
      38             : 
      39             :   interface buffer_field_deallocate
      40             :      ! TYPE int,double,real 
      41             :      module procedure  buffer_field_deallocate_{TYPE}
      42             :   end interface
      43             : 
      44             :   interface buffer_field_allocate
      45             :      ! TYPE int,double,real 
      46             :      module procedure  buffer_field_allocate_{TYPE}
      47             :   end interface
      48             : 
      49             :   interface buffer_set_field
      50             :      ! TYPE int,double,real 
      51             :      module procedure  buffer_set_field_const_{TYPE}
      52             :      ! DIMS 1,2,3,4,5,6,7
      53             :      ! TYPE int,double,real 
      54             :      module procedure buffer_set_field_{DIMS}d_{TYPE}
      55             :   end interface
      56             : 
      57             :   interface buffer_get_field_ptr
      58             :      ! DIMS 1,2,3,4,5,6,7
      59             :      ! TYPE int,double,real 
      60             :      module procedure buffer_get_field_ptr_{DIMS}d_{TYPE}
      61             :   end interface
      62             : 
      63             :   public :: buffer_field_deallocate, buffer_field_allocate, buffer_set_field, buffer_get_field_ptr, buffer_field_default_type
      64             :   public :: buffer_field_is_alloc
      65             : 
      66             :   
      67             : CONTAINS
      68             : 
      69             : ! TYPE int,double,real
      70     1448928 :   subroutine buffer_field_deallocate_{TYPE}(bfg, dtype)
      71             : 
      72             :     type(buffer_field_default_type),intent(inout) :: bfg
      73             :     {VTYPE}, intent(in) :: dtype
      74             : 
      75             :     type(buffer_field_{TYPE}) :: b1
      76             : 
      77     1448928 :     b1 = transfer(bfg, b1)
      78             : 
      79     1448928 :     if(.not.associated(b1%data)) then
      80           0 :        call endrun('Attempt to deallocate unassociated array ptr')
      81             :     end if
      82             : 
      83     1448928 :     deallocate(b1%data)
      84             : 
      85     1448928 :     nullify(bfg%data)
      86             : 
      87     1448928 :   end subroutine buffer_field_deallocate_{TYPE}
      88             : 
      89  1204168465 :   logical function buffer_field_is_alloc(bfg)
      90             :     type(buffer_field_default_type),intent(in) :: bfg
      91             : 
      92  1204168465 :     buffer_field_is_alloc = associated(bfg%data) 
      93             : 
      94  1204168465 :   end function buffer_field_is_alloc
      95             : 
      96             : 
      97             : ! TYPE int,double,real
      98     1448928 :   subroutine buffer_field_allocate_{TYPE} (bfg, dimsizes, dtype)
      99             : 
     100             :     type(buffer_field_default_type),intent(inout) :: bfg
     101             :     integer, intent(in) :: dimsizes(:)
     102             :     integer :: alldimsizes( MAXDIMS )
     103             :     {VTYPE}, intent(in) :: dtype
     104             :     integer :: ierr
     105             : 
     106             :     type(buffer_field_{TYPE}) :: b1
     107             : 
     108    11591424 :     alldimsizes(:) = 1
     109    11591424 :     alldimsizes(1:size(dimsizes)) = dimsizes
     110             : 
     111     1448928 :     if(associated(bfg%data)) then
     112           0 :        call endrun('Attempt to allocate array to associated ptr')
     113             :     end if
     114             : 
     115             :     allocate(b1%data(alldimsizes(1),alldimsizes(2),alldimsizes(3),alldimsizes(4),&
     116    13040352 :          alldimsizes(5),alldimsizes(6),alldimsizes(7)),stat=ierr)
     117             : 
     118     1448928 :     if(ierr/=0) then
     119           0 :        call endrun("allocate failed")
     120             :     end if
     121             : 
     122     1448928 :     bfg = transfer(b1,bfg)
     123             : 
     124     1448928 :   end subroutine buffer_field_allocate_{TYPE}
     125             : 
     126             :   ! TYPE int,double,real 
     127      297216 :   subroutine buffer_set_field_const_{TYPE}(bfg, const, start,kount)
     128             :     type(buffer_field_default_type) :: bfg
     129             :     {VTYPE}, intent(in) :: const
     130             :     integer, intent(in), optional :: start(:),kount(:)
     131             : 
     132             :     type(buffer_field_{TYPE}) :: ptr
     133             : 
     134             :     integer :: i, ns, strt(7), fin(7), cnt(7)
     135             : 
     136      297216 :     ptr = transfer(bfg, ptr)        
     137             : 
     138      297216 :     if(present(start).and.present(kount)) then
     139           0 :        strt(:) = 1
     140           0 :        cnt = shape(ptr%data)
     141             : 
     142           0 :        ns = size(start)
     143           0 :        strt(1:ns) = start
     144             :     
     145           0 :        fin = strt+cnt-1
     146             : 
     147           0 :        do i=1,ns
     148           0 :          fin(i) = strt(i)+kount(i)-1
     149           0 :          if(strt(i)<1 .or. fin(i)>cnt(i)) then
     150           0 :            call endrun('Start plus kount exceeds dimension bounds')
     151             :          endif
     152             :        enddo
     153             : 
     154             : 
     155           0 :        ptr%data(strt(1):fin(1),strt(2):fin(2),strt(3):fin(3),strt(4):fin(4),&
     156           0 :             strt(5):fin(5),strt(6):fin(6),strt(7):fin(7))=const
     157             :     else
     158   440734176 :        ptr%data = const
     159             :     endif
     160             : 
     161      297216 :   end subroutine buffer_set_field_const_{TYPE}
     162             : 
     163             :   !=========================================================================================
     164             :   ! 
     165             :   ! Given a physics_buffer chunk and an index return a pointer to a field chunk 
     166             :   ! 
     167             :   !
     168             : 
     169             :   ! TYPE int,double,real 
     170             :   ! DIMS 1,2,3,4,5,6,7
     171  1193047057 :   subroutine buffer_get_field_ptr_{DIMS}d_{TYPE}(bfg, field, start,kount)
     172             :     type(buffer_field_default_type), intent(in) :: bfg
     173             :     {VTYPE}, pointer :: field{DIMSTR}
     174             :     integer, intent(in), optional :: start(:), kount(:)
     175             :     type(buffer_field_{TYPE}), target :: ptr
     176             :     
     177             :     integer :: ns, strt(7), fin(7), cnt(7)
     178             : 
     179  1193047057 :     ptr = transfer(bfg, ptr)        
     180             : 
     181             : 
     182  9544376456 :     strt(:) = 1
     183  9544376456 :     cnt = shape(ptr%data)
     184             : 
     185  1193047057 :     if(present(start)) then
     186   243153648 :        ns = size(start)
     187  1215313128 :        strt(1:ns) = start
     188             :     end if
     189  1193047057 :     if(present(kount)) then
     190  1215313128 :        cnt(1:ns) = kount
     191             :     end if
     192  9544376456 :     fin = strt+cnt-1
     193             : 
     194             : #if  ({DIMS}==1)
     195   188639280 :     field => ptr%data(strt(1):fin(1),strt(2),strt(3),strt(4),strt(5),strt(6),strt(7))
     196             : #elif ({DIMS}==2)
     197   981017497 :     field => ptr%data(strt(1):fin(1),strt(2):fin(2),strt(3),strt(4),strt(5),strt(6),strt(7))
     198             : #elif ({DIMS}==3)
     199    22350024 :     field => ptr%data(strt(1):fin(1),strt(2):fin(2),strt(3):fin(3),strt(4),strt(5),strt(6),strt(7))
     200             : #elif ({DIMS}==4)
     201           0 :     field => ptr%data(strt(1):fin(1),strt(2):fin(2),strt(3):fin(3),strt(4):fin(4),strt(5),strt(6),strt(7))
     202             : #elif ({DIMS}==5)
     203      693504 :     field => ptr%data(strt(1):fin(1),strt(2):fin(2),strt(3):fin(3),strt(4):fin(4),strt(5):fin(5),strt(6),strt(7))
     204             : #elif ({DIMS}==6)
     205           0 :     field => ptr%data(strt(1):fin(1),strt(2):fin(2),strt(3):fin(3),strt(4):fin(4),&
     206      346752 :          strt(5):fin(5),strt(6):fin(6),strt(7))
     207             : #else
     208           0 :     field => ptr%data(strt(1):fin(1),strt(2):fin(2),strt(3):fin(3),strt(4):fin(4),&
     209           0 :          strt(5):fin(5),strt(6):fin(6),strt(7):fin(7))
     210             : #endif
     211             : 
     212  1193047057 :   end subroutine buffer_get_field_ptr_{DIMS}d_{TYPE}
     213             : 
     214             :   ! TYPE int,double,real 
     215             :   ! DIMS 1,2,3,4,5,6,7
     216    10452096 :   subroutine buffer_set_field_{DIMS}d_{TYPE}(bfg,field,start,kount)
     217             :     type(buffer_field_default_type) :: bfg
     218             :     {VTYPE},intent(in) :: field{DIMSTR}
     219             :     integer,intent(in),optional :: start(:),kount(:)
     220             :     type(buffer_field_{TYPE}) :: ptr
     221             : 
     222             :     integer :: i, nc, strt(7), fin(7), cnt(7)
     223             : 
     224    10452096 :     ptr = transfer(bfg,ptr)
     225    10452096 :     if(present(start).and.present(kount)) then
     226    23876352 :        strt(:) = 1
     227    23876352 :        cnt = shape(ptr%data)
     228             : 
     229     2984544 :        nc=size(start)
     230    14922720 :        strt(1:nc) = start
     231    23876352 :        fin = strt+cnt-1
     232             : 
     233     8953632 :        do i=1,nc
     234     5969088 :          fin(i) = strt(i)+kount(i)-1
     235     8953632 :          if(strt(i)<1 .or. fin(i)>cnt(i)) then
     236           0 :            call endrun('Start plus kount exceeds dimension bounds')
     237             :          endif
     238             :        enddo
     239             : 
     240             : 
     241             : #if  ({DIMS}==1)
     242    25315992 :        ptr%data(strt(1):fin(1),strt(2),strt(3),strt(4),strt(5),strt(6),strt(7))=field
     243             : #elif ({DIMS}==2)
     244  2323627992 :        ptr%data(strt(1):fin(1),strt(2):fin(2),strt(3),strt(4),strt(5),strt(6),strt(7))=field
     245             : #elif ({DIMS}==3)
     246           0 :        ptr%data(strt(1):fin(1),strt(2):fin(2),strt(3):fin(3),strt(4),strt(5),strt(6),strt(7))=field
     247             : #elif ({DIMS}==4)
     248           0 :        ptr%data(strt(1):fin(1),strt(2):fin(2),strt(3):fin(3),strt(4):fin(4),strt(5),strt(6),strt(7))=field
     249             : #elif ({DIMS}==5)
     250           0 :        ptr%data(strt(1):fin(1),strt(2):fin(2),strt(3):fin(3),strt(4):fin(4),strt(5):fin(5),strt(6),strt(7))=field
     251             : #elif ({DIMS}==6)
     252           0 :        ptr%data(strt(1):fin(1),strt(2):fin(2),strt(3):fin(3),strt(4):fin(4),&
     253           0 :             strt(5):fin(5),strt(6):fin(6),strt(7))=field
     254             : #else
     255           0 :        ptr%data(strt(1):fin(1),strt(2):fin(2),strt(3):fin(3),strt(4):fin(4),&
     256           0 :             strt(5):fin(5),strt(6):fin(6),strt(7):fin(7))=field
     257             : #endif
     258             :     else
     259             : #if ({DIMS}==1)
     260    76263768 :        ptr%data(:,1,1,1,1,1,1) = field
     261             : #elif({DIMS}==2)
     262  4762966896 :        ptr%data(:,:,1,1,1,1,1) = field
     263             : #elif({DIMS}==3)
     264           0 :        ptr%data(:,:,:,1,1,1,1) = field
     265             : #elif({DIMS}==4)
     266           0 :        ptr%data(:,:,:,:,1,1,1) = field
     267             : #elif({DIMS}==5)
     268           0 :        ptr%data(:,:,:,:,:,1,1) = field
     269             : #elif({DIMS}==6)
     270           0 :        ptr%data(:,:,:,:,:,:,1) = field
     271             : #else
     272           0 :        ptr%data = field
     273             : #endif
     274             :     end if
     275    10452096 :   end subroutine buffer_set_field_{DIMS}d_{TYPE}
     276             : 
     277             : 
     278             : 
     279           0 : end module buffer
     280             : 
     281             : 
     282             : 
     283             : 
     284             : 

Generated by: LCOV version 1.14