module phys_debug 2,6
! This module contains subroutines that are intended to print diagnostic
! information about a single column to the log file. The module uses the
! phys_debug_util module to locate the column using local indices of the
! physics decomposition. The reason to encapsulate the debug print
! statements into a subroutine is to minimize the impact of the debugging
! code on the development code. This makes it easier to maintain debug
! code on a branch which can be updated to the head of the trunk when
! convenient. Minimizing the footprint of debug code helps to minimize the
! chances of conflicts that can occur while updating between the debug code
! and changes that have occurred on the trunk.
use shr_kind_mod
, only: r8 => shr_kind_r8
use phys_debug_util
, only: phys_debug_col
use ppgrid
, only: pcols, pver, pverp
use physics_types
, only: physics_state, physics_ptend
use camsrfexch_types
,only: srfflx_state
use cam_logfile
, only: iulog
implicit none
private
save
! User defined public methods for debugging
public phys_debug_vdiff1
public phys_debug_shallow1
public phys_debug_strat1
public phys_debug_srf1
public phys_debug_hbdiff1
public phys_debug_flux1
public phys_debug_flux2
!================================================================================
contains
!================================================================================
subroutine phys_debug_vdiff1(state, kvm, tautotx, tautoty),1
type(physics_state), intent(in) :: state ! Physics state variables
real(r8), intent(in) :: kvm(pcols,pverp) ! eddy diffusivity for momentum [m2/s]
real(r8), intent(in) :: tautotx(pcols) ! u component of total surface stress
real(r8), intent(in) :: tautoty(pcols) ! v component of total surface stress
integer :: icol
!-----------------------------------------------------------------------------
icol = phys_debug_col
(state%lchnk)
if (icol > 0) then
write(iulog,*) ' vert_diff: kvm, u ', kvm(icol,pver), kvm(icol,pver-1), &
state%u(icol, pver), state%u(icol,pver-1), &
state%v(icol, pver), state%v(icol,pver-1)
write(iulog,*) ' vert_diff: taux, tauy ', tautotx(icol), tautoty(icol)
endif
end subroutine phys_debug_vdiff1
!================================================================================
subroutine phys_debug_shallow1(state, ptend, nstep, prec_cmf, rliq2, ztodt, kmx),3
use constituents
, only: cnst_get_ind
type(physics_state), intent(in) :: state ! Physics state variables
type(physics_ptend), intent(in) :: ptend ! Physics process tendencies
integer, intent(in) :: nstep
real(r8), intent(in) :: prec_cmf(pcols) ! total precipitation from Hack convection
real(r8), intent(in) :: rliq2(pcols) ! vertical integral of liquid from shallow scheme
real(r8), intent(in) :: ztodt ! physics time step
integer, intent(out) :: kmx
integer :: icol, k, kmn, ixcldliq
real(r8) :: qtmx, qtmn
!-----------------------------------------------------------------------------
icol = phys_debug_col
(state%lchnk)
if (icol > 0) then
qtmx = 0.
kmx = 0
qtmn = 0.
kmn = 0
do k = 1,pver
! write (iulog,*) 'aaa ', k, ptend%q(icol,k,1), ptend%q(icol,k,2)
if (ptend%q(icol,k,1).ge.qtmx) then
kmx = k
qtmx = ptend%q(icol,k,1)
endif
if (ptend%q(icol,k,1).le.qtmn) then
kmn = k
qtmn = ptend%q(icol,k,1)
endif
end do
k = kmx
66 format ('tphysbc, aft shallow:', 4i5, 6f9.4)
call cnst_get_ind
('CLDLIQ', ixcldliq, abort=.false.)
write (iulog,66) nstep, icol, &
kmx, kmn, &
prec_cmf(icol)*8.64e7, rliq2(icol)*8.64e7, &
qtmx*8.64e7, qtmn*8.64e7, &
(state%q(icol,k,1)+ptend%q(icol,k,1)*ztodt)*1.e3, &
(state%q(icol,k,ixcldliq)+ptend%q(icol,k,ixcldliq)*ztodt)*1.e3
endif
end subroutine phys_debug_shallow1
!================================================================================
subroutine phys_debug_strat1(state, ptend, nstep, prec_str, rliq, ztodt, kmx),3
use constituents
, only: cnst_get_ind
type(physics_state), intent(in) :: state ! Physics state variables
type(physics_ptend), intent(in) :: ptend ! Physics process tendencies
integer, intent(in) :: nstep
real(r8), intent(in) :: prec_str(pcols) ! sfc flux of precip from stratiform (m/s)
real(r8), intent(in) :: rliq(pcols) ! vertical integral of liquid not yet in q(ixcldliq)
real(r8), intent(in) :: ztodt ! physics time step
integer, intent(in) :: kmx
integer :: icol, k, ixcldliq
!-----------------------------------------------------------------------------
icol = phys_debug_col
(state%lchnk)
if (icol > 0) then
k = kmx
67 format ('tphysbc, aft strat:', i5, 6f9.4)
call cnst_get_ind
('CLDLIQ', ixcldliq, abort=.false.)
write (iulog,67) nstep, prec_str(icol)*8.64e7, rliq(icol)*8.64e7, &
(ptend%q(icol,k,1)*ztodt)*1.e3, &
(ptend%q(icol,k,ixcldliq)*ztodt)*1.e3, &
(state%q(icol,k,1)+ptend%q(icol,k,1)*ztodt)*1.e3, &
(state%q(icol,k,ixcldliq)+ptend%q(icol,k,ixcldliq)*ztodt)*1.e3
endif
end subroutine phys_debug_strat1
!================================================================================
subroutine phys_debug_srf1(lchnk, cam_in),1
integer, intent(in) :: lchnk ! local chunk index
type(srfflx_state), intent(in) :: cam_in ! CAM's import state
integer :: icol
!-----------------------------------------------------------------------------
icol = phys_debug_col
(lchnk)
if (icol > 0) then
write(iulog,*) 'bot tphysbc: srfflx_state2d%tref', cam_in%tref(icol)
endif
end subroutine phys_debug_srf1
!================================================================================
subroutine phys_debug_hbdiff1(lchnk, pblh, zl, zh) 1,1
integer, intent(in) :: lchnk ! local chunk index
real(r8), intent(in) :: pblh(pcols) ! boundary-layer height [m]
real(r8), intent(in) :: zl(pcols) ! zmzp / Obukhov length
real(r8), intent(in) :: zh(pcols) ! zmzp / pblh
integer :: icol
!-----------------------------------------------------------------------------
icol = phys_debug_col
(lchnk)
if (icol > 0) then
write(iulog,*) ' austach_pbl, pblh, zl, zh: ', pblh(icol), zl(icol), zh(icol)
endif
end subroutine phys_debug_hbdiff1
!================================================================================
subroutine phys_debug_flux1(lchnk, srfflx, lhflx, shflx, taux, tauy, qflx, & 1,1
lhflx_res, shflx_res, taux_res, tauy_res, qflx_res)
integer, intent(in) :: lchnk ! local chunk index
type(srfflx_state), intent(in) :: srfflx ! cam import state
real(r8), intent(in) :: lhflx(:) ! latent heat flux
real(r8), intent(in) :: shflx(:) ! sensible heat flux
real(r8), intent(in) :: taux(:) ! x momentum flux
real(r8), intent(in) :: tauy(:) ! y momentum flux
real(r8), intent(in) :: qflx(:) ! water vapor heat flux
real(r8), intent(in) :: lhflx_res(:) ! latent heat flux
real(r8), intent(in) :: shflx_res(:) ! sensible heat flux
real(r8), intent(in) :: taux_res(:) ! x momentum flux
real(r8), intent(in) :: tauy_res(:) ! y momentum flux
real(r8), intent(in) :: qflx_res(:) ! water vapor heat flux
integer :: icol
!-----------------------------------------------------------------------------
icol = phys_debug_col
(lchnk)
if (icol > 0) then
write(iulog,*) ' b flux_tweak called, lhflx, oldlhflx ', &
srfflx%lhf(icol), lhflx(icol)
write(iulog,*) ' sfmodel fluxes lhf, shf, taux, tauy, q: ', &
srfflx%lhf(icol), &
srfflx%shf(icol), &
srfflx%wsx(icol), &
srfflx%wsy(icol), &
srfflx%cflx(icol,1)
write(iulog,*) ' last fluxes used lhf, shf, taux, tauy, q: ', &
lhflx(icol), &
shflx(icol), &
taux(icol), &
tauy(icol), &
qflx(icol)
write(iulog,*) ' current residuals lhf, shf, taux, tauy, q: ', &
lhflx_res(icol), &
shflx_res(icol), &
taux_res(icol), &
tauy_res(icol), &
qflx_res(icol)
endif
end subroutine phys_debug_flux1
!================================================================================
subroutine phys_debug_flux2(lchnk, srfflx, lhflx, & 1,1
lhflx_res, shflx_res, taux_res, tauy_res, qflx_res)
integer, intent(in) :: lchnk ! local chunk index
type(srfflx_state), intent(in) :: srfflx ! cam import state
real(r8), intent(in) :: lhflx(:) ! latent heat flux
real(r8), intent(in) :: lhflx_res(:) ! latent heat flux
real(r8), intent(in) :: shflx_res(:) ! sensible heat flux
real(r8), intent(in) :: taux_res(:) ! x momentum flux
real(r8), intent(in) :: tauy_res(:) ! y momentum flux
real(r8), intent(in) :: qflx_res(:) ! water vapor heat flux
integer :: icol
!-----------------------------------------------------------------------------
icol = phys_debug_col
(lchnk)
if (icol > 0) then
write(iulog,*) ' a flux_tweak called, lhflx, oldlhflx ', &
srfflx%lhf(icol), lhflx(icol)
write (iulog,66) ' residual fractions lhf, shf, taux, tauy, q ', &
lhflx_res(icol)/srfflx%lhf(icol), &
shflx_res(icol)/srfflx%shf(icol), &
taux_res(icol)/srfflx%wsx(icol), &
tauy_res(icol)/srfflx%wsy(icol), &
qflx_res(icol)/srfflx%cflx(icol,1)
write(iulog,66) ' residual lhf, shf, taux, tauy, q: ', &
lhflx_res(icol), &
shflx_res(icol), &
taux_res(icol), &
tauy_res(icol), &
qflx_res(icol)
write(iulog,*) ' used fluxes lhf, shf, taux, tauy, q: ', &
srfflx%lhf(icol), &
srfflx%shf(icol), &
srfflx%wsx(icol), &
srfflx%wsy(icol), &
srfflx%cflx(icol,1)
66 format (a, 1p, 5e15.5)
endif
end subroutine phys_debug_flux2
!================================================================================
end module phys_debug