LCOV - code coverage report
Current view: | top level - physics/cam - const_init.F90 (source / functions) |  |  | Hit | Total | Coverage
Test: | coverage.info |  | Lines: | 0 | 97 | 0.0 %
Date: | 2025-01-13 21:54:50 |  | Functions: | 0 | 2 | 0.0 %

              Line data    Source code
           1             : module const_init
           2             :
           3             : ! Initialize constituents to default values
           4             :
           5             : use shr_kind_mod,     only: r8 => shr_kind_r8, max_chars=>shr_kind_cl
           6             : use spmd_utils,       only: masterproc
           7             : use cam_abortutils,   only: endrun
           8             : use cam_logfile,      only: iulog
           9             :
          10             : implicit none
          11             : private
          12             : save
          13             :
          14             : public :: cnst_init_default
          15             :
          16             : interface cnst_init_default
          17             :   module procedure cnst_init_default_col
          18             :   module procedure cnst_init_default_cblock
          19             : end interface cnst_init_default
          20             :
          21             : !==============================================================================
          22             : CONTAINS
          23             : !==============================================================================
          24             :
          25           0 :   subroutine cnst_init_default_col(m_cnst, latvals, lonvals, q, mask,         &
          26           0 :        verbose, notfound, z)
          27             :     use constituents,  only: cnst_name, cnst_read_iv
          28             :     use aoa_tracers,   only: aoa_tracers_implements_cnst,   aoa_tracers_init_cnst
          29             :     use carma_intr,    only: carma_implements_cnst,         carma_init_cnst
          30             :     use chemistry,     only: chem_implements_cnst,          chem_init_cnst
          31             :     use clubb_intr,    only: clubb_implements_cnst,         clubb_init_cnst
          32             :     use co2_cycle,     only: co2_implements_cnst,           co2_init_cnst
          33             :     use microp_driver, only: microp_driver_implements_cnst, microp_driver_init_cnst
          34             :     use rk_stratiform, only: rk_stratiform_implements_cnst, rk_stratiform_init_cnst
          35             :     use tracers,       only: tracers_implements_cnst,       tracers_init_cnst
          36             :     use unicon_cam,    only: unicon_implements_cnst,        unicon_init_cnst
          37             :
          38             :     !-----------------------------------------------------------------------
          39             :     !
          40             :     ! Purpose: initialize named tracer mixing ratio field
          41             :     !  This subroutine should be called ONLY at the beginning of an initial run
          42             :     !
          43             :     !-----------------------------------------------------------------------
          44             :
          45             :     ! Dummy arguments
          46             :     integer,           intent(in)  :: m_cnst     ! Constant index
          47             :     real(r8),          intent(in)  :: latvals(:) ! lat in degrees (ncol)
          48             :     real(r8),          intent(in)  :: lonvals(:) ! lon in degrees (ncol)
          49             :     real(r8),          intent(out) :: q(:,:)     ! mixing ratio (ncol, plev)
          50             :     logical, optional, intent(in)  :: mask(:)    ! Only initialize where .true.
          51             :     logical, optional, intent(in)  :: verbose    ! For internal use
          52             :     logical, optional, intent(in)  :: notfound   ! Turn off initial dataset warn
          53             :     real(r8),optional, intent(in)  :: z(:,:)     ! height of full pressure level
          54             :     ! Local variables
          55           0 :     logical, allocatable           :: mask_use(:)
          56             :     character(len=max_chars)       :: name
          57             :     logical                        :: verbose_use
          58             :     logical                        :: notfound_use
          59             :
          60           0 :     name = cnst_name(m_cnst)
          61             :
          62           0 :     allocate(mask_use(size(latvals)))
          63           0 :     if (present(mask)) then
          64           0 :       if (size(mask_use) /= size(mask)) then
          65           0 :         call endrun('cnst_init_default: input, mask, is wrong size')
          66             :       end if
          67           0 :       mask_use = mask
          68             :     else
          69           0 :       mask_use = .true.
          70             :     end if
          71             :
          72           0 :     if (present(verbose)) then
          73           0 :       verbose_use = verbose
          74             :     else
          75             :       verbose_use = .true.
          76             :     end if
          77             :
          78             :     ! default is to assume the constituent was not found on the initial file
          79             :     ! before calling this routine.  But it is also possible that the constituent
          80             :     ! was added with the "readiv=.false." option
          81           0 :     if (present(notfound)) then
          82           0 :       notfound_use = notfound
          83             :     else
          84             :       notfound_use = .true.
          85             :     end if
          86             :
          87           0 :     q = 0.0_r8 ! Make sure we start fresh (insurance)
          88             :
          89           0 :     if (masterproc .and. verbose_use .and. notfound_use) then
          90           0 :        if (cnst_read_iv(m_cnst)) then
          91           0 :           write(iulog, *) 'Field ',trim(trim(name)),' not found on initial dataset'
          92             :        else
          93           0 :           write(iulog, *) 'Field ',trim(trim(name)),' not read from initial dataset'
          94             :        end if
          95             :     end if
          96             :
          97           0 :     if (aoa_tracers_implements_cnst(trim(name))) then
          98           0 :       call aoa_tracers_init_cnst(trim(name), latvals, lonvals, mask_use, q)
          99           0 :       if(masterproc .and. verbose_use) then
         100           0 :         write(iulog,*) '          ', trim(name), ' initialized by "aoa_tracers_init_cnst"'
         101             :       end if
         102           0 :     else if (carma_implements_cnst(trim(name))) then
         103           0 :       call carma_init_cnst(trim(name), latvals, lonvals, mask_use, q)
         104           0 :       if(masterproc .and. verbose_use) then
         105           0 :         write(iulog,*) '          ', trim(name), ' initialized by "carma_init_cnst"'
         106             :       end if
         107           0 :     else if (chem_implements_cnst(trim(name))) then
         108           0 :       call chem_init_cnst(trim(name), latvals, lonvals, mask_use, q)
         109           0 :       if(masterproc .and. verbose_use) then
         110           0 :         write(iulog,*) '          ', trim(name), ' initialized by "chem_init_cnst"'
         111             :       end if
         112           0 :     else if (clubb_implements_cnst(trim(name))) then
         113           0 :       call clubb_init_cnst(trim(name), latvals, lonvals, mask_use, q)
         114           0 :       if(masterproc .and. verbose_use) then
         115           0 :         write(iulog,*) '          ', trim(name), ' initialized by "clubb_init_cnst"'
         116             :       end if
         117           0 :     else if (co2_implements_cnst(trim(name))) then
         118           0 :       call co2_init_cnst(trim(name), latvals, lonvals, mask_use, q)
         119           0 :       if(masterproc .and. verbose_use) then
         120           0 :         write(iulog,*) '          ', trim(name), ' initialized by "co2_init_cnst"'
         121             :       end if
         122           0 :     else if (microp_driver_implements_cnst(trim(name))) then
         123           0 :       call microp_driver_init_cnst(trim(name), latvals, lonvals, mask_use, q)
         124           0 :       if(masterproc .and. verbose_use) then
         125           0 :         write(iulog,*) '          ', trim(name), ' initialized by "microp_driver_init_cnst"'
         126             :       end if
         127           0 :     else if (rk_stratiform_implements_cnst(trim(name))) then
         128           0 :       call rk_stratiform_init_cnst(trim(name), latvals, lonvals, mask_use, q)
         129           0 :       if(masterproc .and. verbose_use) then
         130           0 :         write(iulog,*) '          ', trim(name), ' initialized by "rk_stratiform_init_cnst"'
         131             :       end if
         132           0 :     else if (tracers_implements_cnst(trim(name))) then
         133           0 :       call tracers_init_cnst(trim(name), latvals, lonvals, mask_use, q, z=z)
         134           0 :       if(masterproc .and. verbose_use) then
         135           0 :         write(iulog,*) '          ', trim(name), ' initialized by "tracers_init_cnst"'
         136             :       end if
         137           0 :     else if (unicon_implements_cnst(trim(name))) then
         138           0 :       call unicon_init_cnst(trim(name), latvals, lonvals, mask_use, q)
         139           0 :       if(masterproc .and. verbose_use) then
         140           0 :         write(iulog,*) '          ', trim(name), ' initialized by "unicon_init_cnst"'
         141             :       end if
         142             :     else
         143           0 :       if(masterproc .and. verbose_use) then
         144           0 :         write(iulog,*) '          ', trim(name), ' set to minimum value'
         145             :       end if
         146             :       ! Q already set to zero
         147             :     end if
         148             :
         149           0 :   end subroutine cnst_init_default_col
         150             :
         151           0 :   subroutine cnst_init_default_cblock(m_cnst, latvals, lonvals, q, mask)
         152             :
         153             :     !-----------------------------------------------------------------------
         154             :     !
         155             :     ! Purpose: initialize named tracer mixing ratio field
         156             :     !  This subroutine should be called ONLY at the beginning of an initial run
         157             :     !
         158             :     !-----------------------------------------------------------------------
         159             :
         160             :     ! Dummy arguments
         161             :     integer,           intent(in)  :: m_cnst     ! Constant index
         162             :     real(r8),          intent(in)  :: latvals(:) ! lat in degrees (ncol*blk)
         163             :     real(r8),          intent(in)  :: lonvals(:) ! lon in degrees (ncol*blk)
         164             :     real(r8),          intent(out) :: q(:,:,:)   ! mix ratio (ncol, plev, blk)
         165             :     logical, optional, intent(in)  :: mask(:)    ! Only initialize where .true.
         166             :
         167             :     ! Local variables
         168           0 :     real(r8), allocatable         :: latblk(:)
         169             :     integer                       :: i, bbeg, bend
         170             :     integer                       :: size1, size2, size3
         171             :     integer                       :: nblks, blksize
         172             :     logical                       :: verbose
         173             :
         174           0 :     verbose = .true.
         175           0 :     size1 = size(q, 1)
         176           0 :     size2 = size(q, 2)
         177           0 :     size3 = size(q, 3)
         178           0 :     if ((size(latvals) == size1*size3) .and. (size(lonvals) == size1*size3)) then
         179             :       ! Case: unstructured with blocks in 3rd dim
         180           0 :       nblks = size3
         181             :       blksize = size1
         182             :       bend = 0
         183           0 :       do i = 1, nblks
         184           0 :         bbeg = bend + 1
         185           0 :         bend = bbeg + blksize - 1
         186           0 :         if (present(mask)) then
         187           0 :           if (size(mask) /= size(latvals)) then
         188           0 :             call endrun('cnst_init_default_cblock: incorrect mask size')
         189             :           end if
         190           0 :           call cnst_init_default(m_cnst, latvals(bbeg:bend), lonvals(bbeg:bend), q(:,:,i), mask=mask(bbeg:bend), verbose=verbose)
         191             :         else
         192           0 :           call cnst_init_default(m_cnst, latvals(bbeg:bend), lonvals(bbeg:bend), q(:,:,i), verbose=verbose)
         193             :         end if
         194           0 :         verbose = .false.
         195             :       end do
         196           0 :     else if ((size(latvals) == size2) .and. (size(lonvals) == size1)) then
         197             :       ! Case: lon,lat,lev
         198           0 :       if (present(mask)) then
         199           0 :         call endrun('cnst_init_default_cblock: mask not supported for lon/lat')
         200             :       else
         201           0 :         nblks = size2
         202           0 :         allocate(latblk(size1))
         203           0 :         do i = 1, nblks
         204           0 :           latblk(:) = latvals(i)
         205           0 :           call cnst_init_default(m_cnst, latblk, lonvals, q(:,i,:), verbose=verbose)
         206           0 :           verbose = .false.
         207             :         end do
         208           0 :         deallocate(latblk)
         209             :       end if
         210           0 :     else if ((size(latvals) == size3) .and. (size(lonvals) == size1)) then
         211             :       ! Case: lon,lev,lat
         212           0 :       if (present(mask)) then
         213           0 :         call endrun('cnst_init_default_cblock: mask not supported for lon/lat')
         214             :       else
         215           0 :         nblks = size3
         216           0 :         allocate(latblk(size1))
         217           0 :         do i = 1, nblks
         218           0 :           latblk(:) = latvals(i)
         219           0 :           call cnst_init_default(m_cnst, latblk, lonvals, q(:,:,i), verbose=verbose)
         220           0 :           verbose = .false.
         221             :         end do
         222           0 :         deallocate(latblk)
         223             :       end if
         224             :     else
         225           0 :       call endrun('cnst_init_default_cblock: Unknown q layout')
         226             :     end if
         227             :
         228           0 :   end subroutine cnst_init_default_cblock
         229             :
         230             : end module const_init

Generated by: LCOV version 1.14