!-----------------------------------------------------------------------------
! circulation diagnostics
!-----------------------------------------------------------------------------
module ctem 2,4
use shr_kind_mod
, only: r8 => shr_kind_r8
use pmgrid
, only: plon, plev, plevp
use cam_logfile
, only: iulog
use cam_history
, only: addfld, outfld, add_default, dyn_decomp
implicit none
private
public :: ctem_init
public :: ctem_diags
public :: do_circulation_diags
real(r8) :: rplon
real(r8) :: iref_p(plevp) ! interface reference pressure for vertical interpolation
integer :: ip_b ! level index where hybrid levels become purely pressure
integer :: zm_limit
logical :: twod_output
logical :: do_circulation_diags = .false.
contains
!================================================================================
subroutine ctem_diags( u3, v3, omga, pt, h2o, ps, pe, grid, uzm ) 1,38
use physconst
, only : zvir, cappa
use spmd_utils
, only : iam
use abortutils
, only : endrun
use dynamics_vars
, only : T_FVDYCORE_GRID
use hycoef
, only : ps0
use interpolate_data
, only : vertinterp
#ifdef SPMD
use mpishorthand
, only : mpilog, mpiint
use parutilitiesmodule
, only : pargatherint
#endif
!-------------------------------------------------------------
! ... dummy arguments
!-------------------------------------------------------------
type(T_FVDYCORE_GRID), intent(in) :: grid ! FV Dynamics grid
real(r8), intent(in) :: ps(grid%ifirstxy:grid%ilastxy,grid%jfirstxy:grid%jlastxy) ! surface pressure (pa)
real(r8), intent(in) :: u3(grid%ifirstxy:grid%ilastxy,plev,grid%jfirstxy:grid%jlastxy) ! zonal velocity (m/s)
real(r8), intent(in) :: v3(grid%ifirstxy:grid%ilastxy,plev,grid%jfirstxy:grid%jlastxy) ! meridional velocity (m/s)
real(r8), intent(in) :: omga(grid%ifirstxy:grid%ilastxy,plev,grid%jfirstxy:grid%jlastxy) ! pressure velocity
real(r8), intent(in) :: pe(grid%ifirstxy:grid%ilastxy,plevp,grid%jfirstxy:grid%jlastxy) ! interface pressure (pa)
real(r8), intent(in) :: pt(grid%ifirstxy:grid%ilastxy,grid%jfirstxy:grid%jlastxy,plev) ! virtual temperature
real(r8), intent(in) :: h2o(grid%ifirstxy:grid%ilastxy,grid%jfirstxy:grid%jlastxy,plev) ! water constituent (kg/kg)
real(r8), intent(out) :: uzm(plev,grid%jfirstxy:grid%jlastxy) ! zonally averaged U
!-------------------------------------------------------------
! ... local variables
!-------------------------------------------------------------
real(r8), parameter :: hscale = 7000._r8 ! pressure scale height
real(r8), parameter :: navp = 1.e35_r8
real(r8) :: pinterp
real(r8) :: w(grid%ifirstxy:grid%ilastxy,plev,grid%jfirstxy:grid%jlastxy) ! vertical velocity
real(r8) :: th(grid%ifirstxy:grid%ilastxy,plev,grid%jfirstxy:grid%jlastxy) ! pot. temperature
real(r8) :: pm(grid%ifirstxy:grid%ilastxy,plev,grid%jfirstxy:grid%jlastxy) ! mid-point pressure
real(r8) :: pexf ! Exner function
real(r8) :: psurf
real(r8) :: ui(grid%ifirstxy:grid%ilastxy,plevp) ! interpolated zonal velocity
real(r8) :: vi(grid%ifirstxy:grid%ilastxy,plevp) ! interpolated meridional velocity
real(r8) :: wi(grid%ifirstxy:grid%ilastxy,plevp) ! interpolated vertical velocity
real(r8) :: thi(grid%ifirstxy:grid%ilastxy,plevp) ! interpolated pot. temperature
real(r8) :: um(plevp) ! zonal mean zonal velocity
real(r8) :: vm(plevp) ! zonal mean meridional velocity
real(r8) :: wm(plevp) ! zonal mean vertical velocity
real(r8) :: thm(plevp) ! zonal mean pot. temperature
real(r8) :: ud(grid%ifirstxy:grid%ilastxy,plevp) ! zonal deviation of zonal velocity
real(r8) :: vd(grid%ifirstxy:grid%ilastxy,plevp) ! zonal deviation of meridional velocity
real(r8) :: wd(grid%ifirstxy:grid%ilastxy,plevp) ! zonal deviation of vertical velocity
real(r8) :: thd(grid%ifirstxy:grid%ilastxy,plevp) ! zonal deviation of pot. temperature
real(r8) :: vthp(grid%ifirstxy:grid%ilastxy,plevp) ! zonal deviation of zonal velocity
real(r8) :: wthp(grid%ifirstxy:grid%ilastxy,plevp) ! zonal deviation of meridional velocity
real(r8) :: uvp(grid%ifirstxy:grid%ilastxy,plevp) ! zonal deviation of vertical velocity
real(r8) :: uwp(grid%ifirstxy:grid%ilastxy,plevp) ! zonal deviation of pot. temperature
real(r8) :: dummy(plon,plevp)
real(r8) :: dum2(plon)
real(r8) :: rdiv(plevp)
integer :: ip_gm1g(plon,grid%jfirstxy:grid%jlastxy) ! contains level index-1 where blocked points begin
integer :: zm_cnt(plevp) ! counter
integer :: i,j,k
integer :: nlons
integer :: astat
integer :: t, dest, src
logical :: has_zm(plevp,grid%jfirstxy:grid%jlastxy) ! .true. the (z,y) point is a valid zonal mean
integer :: ip_gm1(grid%ifirstxy:grid%ilastxy,grid%jfirstxy:grid%jlastxy) ! contains level index-1 where blocked points begin
real(r8) :: vth(plevp,grid%jfirstxy:grid%jlastxy) ! VTH flux
real(r8) :: uv(plevp,grid%jfirstxy:grid%jlastxy) ! UV flux
real(r8) :: wth(plevp,grid%jfirstxy:grid%jlastxy) ! WTH flux
real(r8) :: uw(plevp,grid%jfirstxy:grid%jlastxy) ! UW flux
real(r8) :: u2d(plevp,grid%jfirstxy:grid%jlastxy) ! zonally averaged U
real(r8) :: v2d(plevp,grid%jfirstxy:grid%jlastxy) ! zonally averaged V
real(r8) :: th2d(plevp,grid%jfirstxy:grid%jlastxy) ! zonally averaged TH
real(r8) :: w2d(plevp,grid%jfirstxy:grid%jlastxy) ! zonally averaged W
real(r8) :: thig(grid%ifirstxy:grid%ilastxy,plevp,grid%jfirstxy:grid%jlastxy) ! interpolated pot. temperature
real(r8) :: tmp2(grid%ifirstxy:grid%ilastxy)
real(r8) :: tmp3(grid%ifirstxy:grid%ilastxy,plevp)
integer :: beglat, endlat ! begin,end latitude indicies
integer :: beglon, endlon ! begin,end longitude indicies
beglon = grid%ifirstxy
endlon = grid%ilastxy
beglat = grid%jfirstxy
endlat = grid%jlastxy
!omp parallel do private (i,j,k,pexf,psurf)
lat_loop1 : &
do j = beglat, endlat
do k = 1, plev
do i = beglon, endlon
!-------------------------------------------------------------
! Calculate pressure and Exner function
!-------------------------------------------------------------
pm(i,k,j) = 0.5 * ( pe(i,k,j) + pe(i,k+1,j) )
pexf = (ps0 / pm(i,k,j))**cappa
!-------------------------------------------------------------
! Convert virtual temperature to temperature and calculate potential temperature
!-------------------------------------------------------------
th(i,k,j) = pt(i,j,k) / (1. + zvir*h2o(i,j,k))
th(i,k,j) = th(i,k,j) * pexf
!-------------------------------------------------------------
! Calculate vertical velocity
!-------------------------------------------------------------
w(i,k,j) = - hscale * omga(i,k,j) / pm(i,k,j)
end do
end do
!-------------------------------------------------------------
! Keep track of where the bottom is in each column
! (i.e., largest index for which P(k) <= PS)
!-------------------------------------------------------------
ip_gm1(:,j) = plevp
do i = beglon, endlon
psurf = ps(i,j)
do k = ip_b+1, plevp
if( iref_p(k) <= psurf ) then
ip_gm1(i,j) = k
end if
end do
end do
end do lat_loop1
nlons = endlon - beglon + 1
#ifdef SPMD
if( grid%twod_decomp == 1 ) then
if (grid%iam .lt. grid%npes_xy) then
call pargatherint
( grid%commxy_x, 0, ip_gm1, grid%strip2dx, ip_gm1g )
endif
else
ip_gm1g(:,:) = ip_gm1(:,:)
end if
#else
ip_gm1g(:,:) = ip_gm1(:,:)
#endif
#ifdef CTEM_DIAGS
write(iulog,*) '===================================================='
do j = beglat,endlat
write(iulog,'(''iam,myidxy_x,myidxy_y,j = '',4i4)') iam,grid%myidxy_x,grid%myidxy_y,j
write(iulog,'(20i3)') ip_gm1(:,j)
end do
if( grid%myidxy_x == 0 ) then
do j = beglat,endlat
write(iulog,*) '===================================================='
write(iulog,'(''iam,myidxy_x,myidxy_y,j = '',4i4)') iam,grid%myidxy_x,grid%myidxy_y,j
write(iulog,'(20i3)') ip_gm1g(:,j)
end do
write(iulog,*) '===================================================='
#else
#ifdef SPMD
if( grid%myidxy_x == 0 ) then
#endif
#endif
lat_loop2 : &
do j = beglat, endlat
zm_cnt(:ip_b) = plon
do k = ip_b+1, plevp
zm_cnt(k) = count( ip_gm1g(:,j) >= k )
end do
has_zm(:ip_b,j) = .true.
do k = ip_b+1, plevp
has_zm(k,j) = zm_cnt(k) >= zm_limit
end do
end do lat_loop2
#ifdef SPMD
end if
if( grid%twod_decomp == 1 ) then
call mpibcast
( has_zm, plevp*(endlat-beglat+1), mpilog, 0, grid%commxy_x )
call mpibcast
( ip_gm1g, plon*(endlat-beglat+1), mpiint, 0, grid%commxy_x )
end if
#endif
#ifdef CTEM_DIAGS
if( grid%myidxy_y == 12 ) then
write(iulog,*) '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^'
write(iulog,'(''iam,myidxy_x,myidxy_y,j = '',4i4)') iam,grid%myidxy_x,grid%myidxy_y,beglat
write(iulog,*) 'has_zm'
write(iulog,'(20l2)') has_zm(:,beglat)
write(iulog,*) 'ip_gm1g'
write(iulog,'(20i4)') ip_gm1g(:,beglat)
write(iulog,*) '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^'
end if
#endif
lat_loop3 : &
do j = beglat, endlat
!-------------------------------------------------------------
! Vertical interpolation
!-------------------------------------------------------------
do k = 1, plevp
pinterp = iref_p(k)
!-------------------------------------------------------------
! Zonal velocity
!-------------------------------------------------------------
call vertinterp
( nlons, nlons, plev, pm(beglon,1,j), pinterp, &
u3(beglon,1,j), ui(beglon,k) )
!-------------------------------------------------------------
! Meridional velocity
!-------------------------------------------------------------
call vertinterp
( nlons, nlons, plev, pm(beglon,1,j), pinterp, &
v3(beglon,1,j), vi(beglon,k) )
!-------------------------------------------------------------
! Vertical velocity
!-------------------------------------------------------------
call vertinterp
( nlons, nlons, plev, pm(beglon,1,j), pinterp, &
w(beglon,1,j), wi(beglon,k) )
!-------------------------------------------------------------
! Pot. Temperature
!-------------------------------------------------------------
call vertinterp
( nlons, nlons, plev, pm(beglon,1,j), pinterp, &
th(beglon,1,j), thi(beglon,k) )
end do
#ifdef CTEM_DIAGS
if( j == endlat ) then
write(iulog,*) '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^'
write(iulog,'(''iam,myidxy_x,myidxy_y,j = '',4i4)') iam,grid%myidxy_x,grid%myidxy_y,j
write(iulog,*) 'iref_p'
write(iulog,'(5g15.7)') iref_p(:)
write(iulog,'(''pm(endlon,:,'',i2,'')'')') j
write(iulog,'(5g15.7)') pm(endlon,:,j)
write(iulog,'(''u3(endlon,:,'',i2,'')'')') j
write(iulog,'(5g15.7)') u3(endlon,:,j)
write(iulog,*) 'ui(endlon,:)'
write(iulog,'(5g15.7)') ui(endlon,:)
write(iulog,*) '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^'
end if
#endif
!-------------------------------------------------------------
! Calculate zonal averages
!-------------------------------------------------------------
do k = ip_b+1, plevp
if( has_zm(k,j) ) then
where( ip_gm1(beglon:endlon,j) < k )
ui(beglon:endlon,k) = 0._r8
vi(beglon:endlon,k) = 0._r8
wi(beglon:endlon,k) = 0._r8
thi(beglon:endlon,k) = 0._r8
endwhere
end if
end do
call par_xsum
( grid, u3(beglon,1,j), plev, uzm(1,j) )
call par_xsum
( grid, ui, plevp, um )
call par_xsum
( grid, vi, plevp, vm )
call par_xsum
( grid, wi, plevp, wm )
call par_xsum
( grid, thi, plevp, thm )
do k = 1,plev
uzm(k,j) = uzm(k,j) * rplon
end do
#ifdef CTEM_DIAGS
if( j == endlat .and. grid%myidxy_y == 12 ) then
write(iulog,*) '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'
write(iulog,'(''iam,myidxy_x,myidxy_y,j = '',4i4)') iam,grid%myidxy_x,grid%myidxy_y,j
write(iulog,*) 'um after par_xsum'
write(iulog,'(5g15.7)') um(:)
write(iulog,*) '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'
end if
#endif
do k = 1, ip_b
um(k) = um(k) * rplon
vm(k) = vm(k) * rplon
wm(k) = wm(k) * rplon
thm(k) = thm(k) * rplon
u2d(k,j) = um(k)
v2d(k,j) = vm(k)
th2d(k,j) = thm(k)
w2d(k,j) = wm(k)
end do
do k = ip_b+1, plevp
if( has_zm(k,j) ) then
rdiv(k) = 1._r8/count( ip_gm1g(:,j) >= k )
um(k) = um(k) * rdiv(k)
vm(k) = vm(k) * rdiv(k)
wm(k) = wm(k) * rdiv(k)
thm(k) = thm(k) * rdiv(k)
u2d(k,j) = um(k)
v2d(k,j) = vm(k)
th2d(k,j) = thm(k)
w2d(k,j) = wm(k)
else
u2d(k,j) = navp
v2d(k,j) = navp
th2d(k,j) = navp
w2d(k,j) = navp
end if
end do
!-------------------------------------------------------------
! Calculate zonal deviations
!-------------------------------------------------------------
do k = 1, ip_b
ud(beglon:endlon,k) = ui(beglon:endlon,k) - um(k)
vd(beglon:endlon,k) = vi(beglon:endlon,k) - vm(k)
wd(beglon:endlon,k) = wi(beglon:endlon,k) - wm(k)
thd(beglon:endlon,k) = thi(beglon:endlon,k) - thm(k)
end do
do k = ip_b+1, plevp
if( has_zm(k,j) ) then
where( ip_gm1g(beglon:endlon,j) >= k )
ud(beglon:endlon,k) = ui(beglon:endlon,k) - um(k)
vd(beglon:endlon,k) = vi(beglon:endlon,k) - vm(k)
wd(beglon:endlon,k) = wi(beglon:endlon,k) - wm(k)
thd(beglon:endlon,k) = thi(beglon:endlon,k) - thm(k)
elsewhere
ud(beglon:endlon,k) = 0._r8
vd(beglon:endlon,k) = 0._r8
wd(beglon:endlon,k) = 0._r8
thd(beglon:endlon,k) = 0._r8
endwhere
end if
end do
!-------------------------------------------------------------
! Calculate fluxes
!-------------------------------------------------------------
do k = 1, ip_b
vthp(:,k) = vd(:,k) * thd(:,k)
wthp(:,k) = wd(:,k) * thd(:,k)
uwp(:,k) = wd(:,k) * ud(:,k)
uvp(:,k) = vd(:,k) * ud(:,k)
end do
do k = ip_b+1, plevp
if( has_zm(k,j) ) then
vthp(:,k) = vd(:,k) * thd(:,k)
wthp(:,k) = wd(:,k) * thd(:,k)
uwp(:,k) = wd(:,k) * ud(:,k)
uvp(:,k) = vd(:,k) * ud(:,k)
else
vthp(:,k) = 0._r8
wthp(:,k) = 0._r8
uwp(:,k) = 0._r8
uvp(:,k) = 0._r8
end if
end do
#ifdef CTEM_DIAGS
if( j == endlat .and. grid%myidxy_y == 12 ) then
write(iulog,*) '#################################################'
write(iulog,*) 'DIAGNOSTICS before par_xsum'
write(iulog,'(''iam,myidxy_x,myidxy_y,j = '',4i4)') iam,grid%myidxy_x,grid%myidxy_y,j
write(iulog,*) 'has_zm'
write(iulog,*) has_zm(:,j)
write(iulog,*) 'rdiv'
write(iulog,'(5g15.7)') rdiv(:)
write(iulog,*) 'wm'
write(iulog,'(5g15.7)') wm(:)
write(iulog,*) 'um'
write(iulog,'(5g15.7)') um(:)
write(iulog,*) 'uw'
write(iulog,'(5g15.7)') uw(:)
write(iulog,*) '#################################################'
end if
#endif
call par_xsum
( grid, vthp, plevp, vth(1,j) )
call par_xsum
( grid, wthp, plevp, wth(1,j) )
call par_xsum
( grid, uvp, plevp, uv(1,j) )
call par_xsum
( grid, uwp, plevp, uw(1,j) )
#ifdef CTEM_DIAGS
if( j == endlat .and. grid%myidxy_y == 12 ) then
write(iulog,*) '#################################################'
write(iulog,'(''iam,myidxy_x,myidxy_y,j = '',4i4)') iam,grid%myidxy_x,grid%myidxy_y,j
write(iulog,*) 'uw after par_xsum'
write(iulog,'(5g15.7)') uw(:,j)
write(iulog,*) '#################################################'
end if
#endif
do k = 1, ip_b
vth(k,j) = vth(k,j) * rplon
wth(k,j) = wth(k,j) * rplon
uw(k,j) = uw(k,j) * rplon
uv(k,j) = uv(k,j) * rplon
end do
do k = ip_b+1, plevp
if( has_zm(k,j) ) then
vth(k,j) = vth(k,j) * rdiv(k)
wth(k,j) = wth(k,j) * rdiv(k)
uw(k,j) = uw(k,j) * rdiv(k)
uv(k,j) = uv(k,j) * rdiv(k)
else
vth(k,j) = navp
wth(k,j) = navp
uw(k,j) = navp
uv(k,j) = navp
end if
end do
thig(:,:,j) = thi(:,:)
end do lat_loop3
!-------------------------------------------------------------
! Do the 2D output
!-------------------------------------------------------------
latloop: do j = beglat,endlat
out2d: if( twod_output ) then
tmp2(:) = 0._r8
do i = beglon,endlon
if ( i <= plevp ) then
tmp2(i) = vth(i,j)
endif
enddo
call outfld
( 'VTH2d', tmp2, nlons, j )
tmp2(:) = 0._r8
do i = beglon,endlon
if ( i <= plevp ) then
tmp2(i) = wth(i,j)
endif
enddo
call outfld
( 'WTH2d', tmp2, nlons, j )
tmp2(:) = 0._r8
do i = beglon,endlon
if ( i <= plevp ) then
tmp2(i) = uv(i,j)
endif
enddo
call outfld
( 'UV2d', tmp2, nlons, j )
tmp2(:) = 0._r8
do i = beglon,endlon
if ( i <= plevp ) then
tmp2(i) = uw(i,j)
endif
enddo
call outfld
( 'UW2d', tmp2, nlons, j )
tmp2(:) = 0._r8
do i = beglon,endlon
if ( i <= plevp ) then
tmp2(i) = u2d(i,j)
endif
enddo
call outfld
( 'U2d', tmp2, nlons, j )
tmp2(:) = 0._r8
do i = beglon,endlon
if ( i <= plevp ) then
tmp2(i) = v2d(i,j)
endif
enddo
call outfld
( 'V2d', tmp2, nlons, j )
tmp2(:) = 0._r8
do i = beglon,endlon
if ( i <= plevp ) then
tmp2(i) = th2d(i,j)
endif
enddo
call outfld
( 'TH2d', tmp2, nlons, j )
tmp2(:) = 0._r8
do i = beglon,endlon
if ( i <= plevp ) then
tmp2(i) = w2d(i,j)
endif
enddo
call outfld
( 'W2d', tmp2, nlons, j )
end if out2d
tmp2(beglon:endlon) = ip_gm1(beglon:endlon,j)
call outfld
( 'MSKtem', tmp2, nlons, j )
!-------------------------------------------------------------
! 3D output
!-------------------------------------------------------------
do k = 1,plevp
do i = beglon,endlon
tmp3(i,k) = vth(k,j)
enddo
enddo
call outfld
( 'VTH3d', tmp3, nlons, j )
do k = 1,plevp
do i = beglon,endlon
tmp3(i,k) = wth(k,j)
enddo
enddo
call outfld
( 'WTH3d', tmp3, nlons, j )
do k = 1,plevp
do i = beglon,endlon
tmp3(i,k) = uv(k,j)
enddo
enddo
call outfld
( 'UV3d', tmp3, nlons, j )
do k = 1,plevp
do i = beglon,endlon
tmp3(i,k) = uw(k,j)
enddo
enddo
call outfld
( 'UW3d', tmp3, nlons, j )
do k = 1,plevp
do i = beglon,endlon
tmp3(i,k) = thig(i,k,j)
enddo
enddo
call outfld
( 'TH', tmp3, nlons, j )
enddo latloop
end subroutine ctem_diags
!=================================================================================
subroutine ctem_init(nlfile) 1,29
use spmd_utils
, only : masterproc
use hycoef
, only : hyai, hybi, ps0
implicit none
character(len=*), intent(in) :: nlfile ! filepath for file containing namelist input
!-------------------------------------------------------------
! ... local variables
!-------------------------------------------------------------
integer :: k
call circ_diag_readnl
(nlfile)
if (.not.do_circulation_diags) return
twod_output = plon >= plevp
if( masterproc ) then
if( .not. twod_output ) then
write(iulog,*) 'At this resolution, no TEM diagnostic is provided in the seconday tapes.'
end if
end if
rplon = 1._r8/plon
zm_limit = plon/3
!-------------------------------------------------------------
! Calculate reference pressure
!-------------------------------------------------------------
do k = 1, plevp
iref_p(k) = (hyai(k) + hybi(k)) * ps0
end do
if( masterproc ) then
write(iulog,*) 'ctem_inti: iref_p'
write(iulog,'(1p5g15.7)') iref_p(:)
end if
!-------------------------------------------------------------
! Find level where hybrid levels become purely pressure
!-------------------------------------------------------------
ip_b = -1
do k = 1,plev
if( hybi(k) == 0._r8 ) ip_b = k
end do
!-------------------------------------------------------------
! Initialize output buffer
!-------------------------------------------------------------
call addfld
('VTH3d ','MK/S ',plevp, 'A','Meridional Heat Flux: 3D zon. mean', dyn_decomp )
call addfld
('WTH3d ','MK/S ',plevp, 'A','Vertical Heat Flux: 3D zon. mean', dyn_decomp )
call addfld
('UV3d ','M2/S2 ',plevp, 'A','Meridional Flux of Zonal Momentum: 3D zon. mean', dyn_decomp )
call addfld
('UW3d ','M2/S2 ',plevp, 'A','Vertical Flux of Zonal Momentum: 3D zon. mean', dyn_decomp )
if( twod_output ) then
call addfld
('VTH2d ','MK/S ',1, 'A','Meridional Heat Flux: 2D prj of zon. mean',dyn_decomp )
call addfld
('WTH2d ','MK/S ',1, 'A','Vertical Heat Flux: 2D prj of zon. mean',dyn_decomp )
call addfld
('UV2d ','M2/S2 ',1, 'A','Meridional Flux of Zonal Momentum: 2D prj of zon. mean',dyn_decomp )
call addfld
('UW2d ','M2/S2 ',1, 'A','Vertical Flux of Zonal Momentum; 2D prj of zon. mean',dyn_decomp )
call addfld
('U2d ','M/S ',1, 'A','Zonal-Mean zonal wind',dyn_decomp )
call addfld
('V2d ','M/S ',1, 'A','Zonal-Mean meridional wind',dyn_decomp )
call addfld
('W2d ','M/S ',1, 'A','Zonal-Mean vertical wind',dyn_decomp )
call addfld
('TH2d ','K ',1, 'A','Zonal-Mean potential temp',dyn_decomp )
end if
call addfld
('TH ','K ',plevp, 'A','Potential Temperature', dyn_decomp )
call addfld
('MSKtem','unitless',1 , 'A','TEM mask', dyn_decomp )
!-------------------------------------------------------------
! primary tapes: 3D fields
!-------------------------------------------------------------
call add_default
('VTH3d', 1, ' ')
call add_default
('WTH3d', 1, ' ')
call add_default
('UV3d' , 1, ' ')
call add_default
('UW3d' , 1, ' ')
call add_default
('TH' , 1, ' ')
call add_default
('MSKtem',1, ' ')
!-------------------------------------------------------------
! secondary tapes: 2D fields
!-------------------------------------------------------------
if( twod_output ) then
call add_default
('VTH2d', 2, ' ')
call add_default
('WTH2d', 2, ' ')
call add_default
('UV2d' , 2, ' ')
call add_default
('UW2d' , 2, ' ')
call add_default
('TH' , 2, ' ')
call add_default
('MSKtem',2, ' ')
end if
if (masterproc) then
write(iulog,*) 'ctem_inti: do_circulation_diags = ',do_circulation_diags
endif
end subroutine ctem_init
!================================================================================
subroutine circ_diag_readnl(nlfile) 1,10
use spmd_utils
, only: masterproc
use namelist_utils
, only: find_group_name
use units
, only: getunit, freeunit
use mpishorthand
use abortutils
, only: endrun
implicit none
character(len=*), intent(in) :: nlfile ! filepath for file containing namelist input
! Local variables
integer :: unitn, ierr
character(len=*), parameter :: subname = 'circ_diag_readnl'
namelist /circ_diag_nl/ do_circulation_diags
!-----------------------------------------------------------------------------
if (masterproc) then
unitn = getunit
()
open( unitn, file=trim(nlfile), status='old' )
call find_group_name
(unitn, 'circ_diag_nl', status=ierr)
if (ierr == 0) then
read(unitn, circ_diag_nl, iostat=ierr)
if (ierr /= 0) then
call endrun
(subname // ':: ERROR reading namelist')
end if
end if
close(unitn)
call freeunit
(unitn)
end if
#ifdef SPMD
call mpibcast
(do_circulation_diags, 1, mpilog, 0, mpicom)
#endif
endsubroutine circ_diag_readnl
end module ctem