LCOV - code coverage report
Current view: | top level - physics/cam - geopotential.F90 (source / functions) |  |  | Hit | Total | Coverage
Test: | coverage.info |  | Lines: | 17 | 34 | 50.0 %
Date: | 2025-01-13 21:54:50 |  | Functions: | 1 | 1 | 100.0 %

              Line data    Source code
           1             : module geopotential
           2             :
           3             : !---------------------------------------------------------------------------------
           4             : ! Compute geopotential from temperature or
           5             : ! compute geopotential and temperature from dry static energy.
           6             : !
           7             : ! The hydrostatic matrix elements must be consistent with the dynamics algorithm.
           8             : ! The diagonal element is the itegration weight from interface k+1 to midpoint k.
           9             : ! The offdiagonal element is the weight between interfaces.
          10             : !
          11             : ! Author: B.Boville, Feb 2001 from earlier code by Boville and S.J. Lin
          12             : !---------------------------------------------------------------------------------
          13             :
          14             :   use shr_kind_mod, only: r8 => shr_kind_r8
          15             :   use ppgrid,       only: pver, pverp
          16             :   use dycore,       only: dycore_is
          17             :
          18             :   implicit none
          19             :   private
          20             :   save
          21             :
          22             :   public geopotential_t
          23             :
          24             : contains
          25             :
          26             : !===============================================================================
          27    23907312 :   subroutine geopotential_t(                                 &
          28    23907312 :        piln   , pmln   , pint   , pmid   , pdel   , rpdel  , &
          29    47814624 :        t      , q      , rair   , gravit , zvir   ,          &
          30    47814624 :        zi     , zm     , ncol   )
          31             :
          32             : !-----------------------------------------------------------------------
          33             : !
          34             : ! Purpose:
          35             : ! Compute the geopotential height (above the surface) at the midpoints and
          36             : ! interfaces using the input temperatures and pressures.
          37             : !
          38             : !-----------------------------------------------------------------------
          39             :
          40             : use ppgrid,                    only: pcols
          41             : use constituents,              only: pcnst, cnst_get_ind
          42             : use ccpp_constituent_prop_mod, only: ccpp_const_props      !CCPP constituent properties array (CAM version)
          43             : use geopotential_temp,         only: geopotential_temp_run !CCPP version
          44             : !------------------------------Arguments--------------------------------
          45             : !
          46             : ! Input arguments
          47             : !
          48             :     integer, intent(in) :: ncol                  ! Number of longitudes
          49             :
          50             :     real(r8), intent(in) :: piln (:,:)    ! (pcols,pverp) - Log interface pressures
          51             :     real(r8), intent(in) :: pmln (:,:)    ! (pcols,pver)  - Log midpoint pressures
          52             :     real(r8), intent(in) :: pint (:,:)    ! (pcols,pverp) - Interface pressures
          53             :     real(r8), intent(in) :: pmid (:,:)    ! (pcols,pver)  - Midpoint pressures
          54             :     real(r8), intent(in) :: pdel (:,:)    ! (pcols,pver)  - layer thickness
          55             :     real(r8), intent(in) :: rpdel(:,:)    ! (pcols,pver)  - inverse of layer thickness
          56             :     real(r8), intent(in) :: t    (:,:)    ! (pcols,pver)  - temperature
          57             :     real(r8), intent(in) :: q    (:,:,:)  ! (pcols,pver,:)- tracers (moist mixing ratios)
          58             :     real(r8), intent(in) :: rair (:,:)    ! (pcols,pver)  - Gas constant for dry air
          59             :     real(r8), intent(in) :: gravit        !               - Acceleration of gravity
          60             :     real(r8), intent(in) :: zvir (:,:)    ! (pcols,pver)  - rh2o/rair - 1
          61             :
          62             : ! Output arguments
          63             :
          64             :     real(r8), intent(out) :: zi(:,:)      ! (pcols,pverp) - Height above surface at interfaces
          65             :     real(r8), intent(out) :: zm(:,:)      ! (pcols,pver)  - Geopotential height at mid level
          66             : !
          67             : !---------------------------Local variables-----------------------------
          68             : !
          69             :     logical  :: lagrang                 ! Lagrangian vertical coordinate flag
          70             :     integer  :: ixq                     ! state constituent array index for water vapor
          71             :     integer  :: i,k,idx                 ! Lon, level indices, water species index
          72    47814624 :     real(r8) :: hkk(ncol)               ! diagonal element of hydrostatic matrix
          73    47814624 :     real(r8) :: hkl(ncol)               ! off-diagonal element
          74    47814624 :     real(r8) :: rog(ncol,pver)          ! Rair / gravit
          75             :     real(r8) :: tv                      ! virtual temperature
          76             :     real(r8) :: tvfac                   ! Tv/T
          77             :     real(r8) :: qfac(ncol,pver)         ! factor to convert from wet to dry mixing ratio
          78             :     real(r8) :: sum_dry_mixing_ratio(ncol,pver)! sum of dry water mixing ratios
          79             :
          80             :     !CCPP-required variables (not used):
          81             :     integer            :: errflg
          82             :     character(len=512) :: errmsg
          83             :
          84             : !
          85             : !-----------------------------------------------------------------------
          86             : !
          87             :     !Determine index for water vapor mass mixing ratio
          88    23907312 :     call cnst_get_ind('Q', ixq)
          89             :
          90             :     !
          91             :     ! original code for backwards compatability with FV and EUL
          92             :     !
          93    23907312 :     if (.not.(dycore_is('MPAS') .or. dycore_is('SE'))) then
          94             :
          95             :       !dry air gas constant over gravity
          96           0 :       rog(:ncol,:) = rair(:ncol,:) / gravit
          97             :
          98             :       ! The surface height is zero by definition.
          99           0 :       do i = 1,ncol
         100           0 :         zi(i,pverp) = 0.0_r8
         101             :       end do
         102             :
         103             :       ! Compute zi, zm from bottom up.
         104             :       ! Note, zi(i,k) is the interface above zm(i,k)
         105           0 :       do k = pver, 1, -1
         106             :
         107             :         ! First set hydrostatic elements consistent with dynamics
         108             :
         109           0 :         if ((dycore_is('LR') .or. dycore_is('FV3'))) then
         110           0 :           do i = 1,ncol
         111           0 :             hkl(i) = piln(i,k+1) - piln(i,k)
         112           0 :             hkk(i) = 1._r8 - pint(i,k) * hkl(i) * rpdel(i,k)
         113             :           end do
         114             :         else
         115           0 :           do i = 1,ncol
         116           0 :             hkl(i) = pdel(i,k) / pmid(i,k)
         117           0 :             hkk(i) = 0.5_r8 * hkl(i)
         118             :           end do
         119             :         end if
         120             :
         121             :         ! Now compute tv, zm, zi
         122             :
         123           0 :         do i = 1,ncol
         124           0 :           tvfac   = 1._r8 + zvir(i,k) * q(i,k,ixq)
         125           0 :           tv      = t(i,k) * tvfac
         126             :
         127           0 :           zm(i,k) = zi(i,k+1) + rog(i,k) * tv * hkk(i)
         128           0 :           zi(i,k) = zi(i,k+1) + rog(i,k) * tv * hkl(i)
         129             :         end do
         130             :       end do
         131             :     else !Using MPAS or SE dycore
         132             :
         133             :       !Determine vertical coordinate type,
         134             :       !NOTE: Currently the FV (LR) or FV3 dycores
         135             :       !      do not allow for condensate loading,
         136             :       !      so for now 'lagrang' will always be FALSE.
         137    23907312 :       if ((dycore_is('LR') .or. dycore_is('FV3'))) then
         138           0 :         lagrang = .true.
         139             :       else
         140    23907312 :         lagrang = .false.
         141             :       end if
         142             :
         143             :       !Use CCPP version of geopotential_t:
         144             :       call geopotential_temp_run(pver, lagrang, pver, 1, pverp, 1,  &
         145    71721936 :         pcnst, piln(1:ncol,:), pint(1:ncol,:), pmid(1:ncol,:),      &
         146    71721936 :         pdel(1:ncol,:), rpdel(1:ncol,:), t(1:ncol,:),               &
         147    23907312 :         q(1:ncol,:,ixq), q(1:ncol,:,:), ccpp_const_props,           &
         148    71721936 :         rair(1:ncol,:), gravit, zvir(1:ncol,:), zi(1:ncol,:),       &
         149   262980432 :         zm(1:ncol,:), ncol, errflg, errmsg)
         150             :
         151             :     end if
         152    23907312 :   end subroutine geopotential_t
         153             : end module geopotential

Generated by: LCOV version 1.14