!-----------------------------------------------------------------------
!BOP
! !ROUTINE: dryairm --- Check dry air mass; set to a predefined value if
! nlres is false (initialization run)
!
! !INTERFACE:
subroutine dryairm( grid, moun, ps, tracer, delp, & 2,9
pe, nlres_loc )
! !USES:
use shr_kind_mod
, only: r8 => shr_kind_r8
use dynamics_vars
, only: T_FVDYCORE_GRID
#if defined( SPMD )
#define CPP_PRT_PREFIX if( grid%iam == 0 )
#else
#define CPP_PRT_PREFIX
#endif
!fvitt
use constituents
, only: cnst_type
use mean_module
, only: gmeanxy
use cam_control_mod
, only: aqua_planet
use cam_logfile
, only: iulog
implicit none
type (T_FVDYCORE_GRID), intent(in) :: grid
logical, intent(in):: nlres_loc
logical, intent(in):: moun
real(r8), intent(inout) :: tracer(grid%ifirstxy:grid%ilastxy, &
grid%jfirstxy:grid%jlastxy,grid%km,grid%ntotq) ! Tracers
real(r8), intent(inout) :: ps(grid%ifirstxy:grid%ilastxy, &
grid%jfirstxy:grid%jlastxy) ! surface pressure
real(r8), intent(inout) :: delp(grid%ifirstxy:grid%ilastxy, &
grid%jfirstxy:grid%jlastxy,grid%km) ! press. thickness
real(r8), intent(inout) :: pe(grid%ifirstxy:grid%ilastxy,grid%km+1, &
grid%jfirstxy:grid%jlastxy) ! edge pressure
! !DESCRIPTION:
! Perform adjustment of the total dry-air-mass while preserving total
! tracer mass
! Developer: S.-J. Lin, Aug 2000
!
! !REVISION HISTORY:
! AAM 01.06.27 Assure agreement thru roundoff for 2D decomp.
! WS 05.07.06 Simplified interface with grid argument
! WS 05.08.26 Modified for XY decomposition
! WS 06.02.21 OMP bug fix (2nd to last DO), removed YZ ver.
! WS 06.07.01 Transitioned tracers q to T_TRACERS
!
!EOP
!---------------------------------------------------------------------
!BOC
! Use work arrays psdk/psdkg to assure identical answers through roundoff
! for different z decompositions
real(r8), allocatable :: psdk(:,:,:) ! local work array
real(r8), allocatable :: psdkg(:,:,:) ! global work array
! dry surface pressure
real(r8) psd(grid%ifirstxy:grid%ilastxy,grid%jfirstxy:grid%jlastxy)
real(r8) drym,drym_loc ! global mean dry air mass in pascals
integer :: im, jm, km ! Dimensions
integer :: ifirstxy, ilastxy, jfirstxy, jlastxy ! XY slice
integer :: nq ! Number of advective tracers
real(r8):: ptop
#if defined ( NAVY10 )
parameter (drym = 98222.0_r8) ! For US NAVY 10-min terrain
#else
parameter (drym = 98288.0_r8) ! For USGS terrain
#endif
real(r8), parameter :: D245_0 = 245._r8
real(r8), parameter :: D101325_0 = 101325._r8
integer i, j, k, ic
real(r8) psm0, psm1
real(r8) psdry
real(r8) dpd
im = grid%im
jm = grid%jm
km = grid%km
ifirstxy = grid%ifirstxy
ilastxy = grid%ilastxy
jfirstxy = grid%jfirstxy
jlastxy = grid%jlastxy
nq = grid%nq
ptop = grid%ptop
drym_loc = drym
if (aqua_planet) then
drym_loc = D101325_0 - D245_0
end if
! Check global maximum/minimum
call gmeanxy
( grid, ps, psm0 )
allocate (psdk(ifirstxy:ilastxy,jfirstxy:jlastxy,km))
allocate (psdkg(ifirstxy:ilastxy,jfirstxy:jlastxy,km))
!$omp parallel do private(i,j,k)
do k=1,km
do j=jfirstxy,jlastxy
do i=ifirstxy,ilastxy
psdk(i,j,k) = 0.
enddo
enddo
enddo
!$omp parallel do private(i,j,k)
do k=1,km
do j=jfirstxy,jlastxy
do i=ifirstxy,ilastxy
psdkg(i,j,k) = 0.
enddo
enddo
enddo
!$omp parallel do private(i,j)
do j=jfirstxy,jlastxy
do i=ifirstxy,ilastxy
psdk(i,j,1) = ptop
enddo
enddo
if( nq .ne. 0 ) then
!$omp parallel do private(i,j,k)
do k=1,km
do j=jfirstxy,jlastxy
do i=ifirstxy,ilastxy
psdk(i,j,k) = psdk(i,j,k) + &
(1.-tracer(i,j,k,1))*(pe(i,k+1,j)-pe(i,k,j))
enddo
enddo
enddo
else
!$omp parallel do private(i,j,k)
do k=1,km
do j=jfirstxy,jlastxy
do i=ifirstxy,ilastxy
psdk(i,j,k) = psdk(i,j,k) + pe(i,k+1,j) - pe(i,k,j)
enddo
enddo
enddo
endif
!$omp parallel do private(i,j,k)
do k=1,km
do j=jfirstxy,jlastxy
do i=ifirstxy,ilastxy
psdkg(i,j,k) = psdk(i,j,k)
enddo
enddo
enddo
!$omp parallel do private(i,j)
do j=jfirstxy,jlastxy
do i=ifirstxy,ilastxy
psd(i,j) = 0.
enddo
enddo
!$omp parallel do private(i,j,k)
do j=jfirstxy,jlastxy
do k=1,km
do i=ifirstxy,ilastxy
psd(i,j) = psd(i,j) + psdkg(i,j,k)
enddo
enddo
enddo
call gmeanxy
( grid, psd, psdry )
CPP_PRT_PREFIX write(iulog,*) 'Total Mass=', 0.01*psm0, '(mb), Dry Mass=', 0.01*psdry, '(mb)'
CPP_PRT_PREFIX write(iulog,*) 'Total Precipitable Water =', (psm0-psdry)/9.80616, '(kg/m**2)'
deallocate (psdk)
deallocate (psdkg)
if( nlres_loc ) return
if(moun) then
dpd = drym_loc - psdry
else
dpd = 1000.*100. - psdry
endif
CPP_PRT_PREFIX write(iulog,*) 'dry mass to be added =', 0.01*dpd
!$omp parallel do private(i, j, ic)
do j=jfirstxy,jlastxy
do ic=1,nq
do i=ifirstxy,ilastxy
! fvitt
! don't want to change the initial dry mixing ratios of tracers
if (cnst_type(ic).ne.'dry') tracer(i,j,km,ic) = &
tracer(i,j,km,ic)*delp(i,j,km)/(delp(i,j,km)+dpd)
enddo
enddo
! Adjust the lowest Lagrangian layer
do i=ifirstxy,ilastxy
delp(i,j,km) = delp(i,j,km) + dpd
pe(i,km+1,j) = pe(i,km,j) + delp(i,j,km)
ps(i,j) = pe(i,km+1,j)
enddo
enddo
call gmeanxy
( grid, ps, psm1 )
CPP_PRT_PREFIX write(iulog,*) 'Total moist surface pressure after adjustment (mb) = ',0.01*psm1
return
!EOC
end subroutine dryairm
!---------------------------------------------------------------------