#define WRF_PORT
#define MODAL_AERO
module conv_water 1,4
! --------------------------------------------------------------------- !
! Purpose: !
! Computes grid-box average liquid (and ice) from stratus and cumulus !
! Just for the purposes of radiation. !
! !
! Method: !
! Extract information about deep+shallow liquid and cloud fraction from !
! the physics buffer. !
! !
! Author: Rich Neale, August 2006 !
! October 2006: Allow averaging of liquid to give a linear !
! average in emissivity. !
! Andrew Gettelman October 2010 Separate module !
!---------------------------------------------------------------------- !
use shr_kind_mod
, only: r8=>shr_kind_r8
#ifndef WRF_PORT
use ppgrid, only: pcols, pver, pverp
#else
use module_cam_support
, only: pcols, pver, pverp
#endif
use physconst
, only: gravit, latvap, latice
#ifndef WRF_PORT
use abortutils, only: endrun
use perf_mod
use cam_logfile, only: iulog
#else
use module_cam_support
, only: endrun, iulog
#endif
implicit none
private
save
public :: conv_water_register, conv_water_4rad, conv_water_init
! pbuf indices
integer :: icwmrsh_idx, icwmrdp_idx, fice_idx, sh_frac_idx, dp_frac_idx, concldql_idx, &
ast_idx, alst_idx, aist_idx, qlst_idx, qist_idx, sh_cldliq1_idx, sh_cldice1_idx
contains
!============================================================================ !
subroutine conv_water_register,2
!---------------------------------------------------------------------- !
! !
! Register the fields in the physics buffer. !
! !
!---------------------------------------------------------------------- !
#ifndef WRF_PORT
use constituents
, only: cnst_add, pcnst
use physconst
, only: mwdry, cpair
use phys_buffer, only: pbuf_times, pbuf_add
!-----------------------------------------------------------------------
! these calls were already done in convect_shallow...so here I add the same fields to the physics buffer with a "1" at the end
call pbuf_add('SH_CLDLIQ1', 'physpkg', 1, pver, 1, sh_cldliq1_idx) ! shallow gbm cloud liquid water (kg/kg)
call pbuf_add('SH_CLDICE1', 'physpkg', 1, pver, 1, sh_cldice1_idx) ! shallow gbm cloud ice water (kg/kg)
#endif
end subroutine conv_water_register
!============================================================================ !
! !
!============================================================================ !
subroutine conv_water_init()
! --------------------------------------------------------------------- !
! Purpose: !
! Initializes the pbuf indices required by conv_water
! --------------------------------------------------------------------- !
#ifndef WRF_PORT
use phys_buffer, only: pbuf_size_max, pbuf_fld, pbuf_old_tim_idx, pbuf_get_fld_idx
#endif
implicit none
#ifndef WRF_PORT
icwmrsh_idx = pbuf_get_fld_idx('ICWMRSH')
icwmrdp_idx = pbuf_get_fld_idx('ICWMRDP')
fice_idx = pbuf_get_fld_idx('FICE')
sh_frac_idx = pbuf_get_fld_idx('SH_FRAC')
dp_frac_idx = pbuf_get_fld_idx('DP_FRAC')
concldql_idx = pbuf_get_fld_idx('CONCLDQL')
ast_idx = pbuf_get_fld_idx('AST')
alst_idx = pbuf_get_fld_idx('ALST')
aist_idx = pbuf_get_fld_idx('AIST')
qlst_idx = pbuf_get_fld_idx('QLST')
qist_idx = pbuf_get_fld_idx('QIST')
#endif
end subroutine conv_water_init
#ifndef WRF_PORT
subroutine conv_water_4rad( lchnk, ncol, pbuf, conv_water_mode, & 1,9
rei, pdel, ls_liq, ls_ice, totg_liq, totg_ice )
#else
!Replace pbuf with actual variables
subroutine conv_water_4rad( lchnk, ncol, ast, sh_icwmr, dp_icwmr, & 1,9
fice, sh_frac, dp_frac, conv_water_mode, rei, pdel, ls_liq, &
ls_ice, totg_liq, totg_ice )
#endif
! --------------------------------------------------------------------- !
! Purpose: !
! Computes grid-box average liquid (and ice) from stratus and cumulus !
! Just for the purposes of radiation. !
! !
! Method: !
! Extract information about deep+shallow liquid and cloud fraction from !
! the physics buffer. !
! !
! Author: Rich Neale, August 2006 !
! October 2006: Allow averaging of liquid to give a linear !
! average in emissivity. !
! !
!---------------------------------------------------------------------- !
#ifndef WRF_PORT
use phys_buffer, only: pbuf_size_max, pbuf_fld, pbuf_old_tim_idx, pbuf_get_fld_idx
use cam_history, only: outfld
use phys_control, only: phys_getopts
use phys_debug_util, only: phys_debug_col
#else
use module_cam_support
, only: outfld
#endif
implicit none
! ---------------------- !
! Input-Output Arguments !
! ---------------------- !
#ifndef WRF_PORT
type(pbuf_fld), intent(inout), dimension(pbuf_size_max) :: pbuf
#endif
integer, intent(in) :: lchnk
integer, intent(in) :: ncol
integer, intent(in) :: conv_water_mode
real(r8), intent(in) :: rei(pcols,pver) ! Ice effective drop size (microns)
real(r8), intent(in) :: pdel(pcols,pver) ! Moist pressure difference across layer
real(r8), intent(in) :: ls_liq(pcols,pver) ! Large-scale contributions to GBA cloud liq
real(r8), intent(in) :: ls_ice(pcols,pver) ! Large-scale contributions to GBA cloud ice
#ifdef WRF_PORT
real(r8), intent(in) :: ast(pcols,pver)
real(r8), intent(in) :: sh_icwmr(pcols,pver)
real(r8), intent(in) :: dp_icwmr(pcols,pver)
real(r8), intent(in) :: fice(pcols,pver)
real(r8), intent(in) :: sh_frac(pcols,pver)
real(r8), intent(in) :: dp_frac(pcols,pver)
#endif
real(r8), intent(out):: totg_ice(pcols,pver) ! Total GBA in-cloud ice
real(r8), intent(out):: totg_liq(pcols,pver) ! Total GBA in-cloud liquid
! --------------- !
! Local Workspace !
! --------------- !
! Physics buffer fields
#ifndef WRF_PORT
real(r8), pointer, dimension(:,:) :: ast ! Physical liquid+ice stratus cloud fraction
real(r8), pointer, dimension(:,:) :: cu_frac ! Final convective cloud fraction
real(r8), pointer, dimension(:,:) :: sh_frac ! Shallow convective cloud fraction
real(r8), pointer, dimension(:,:) :: dp_frac ! Deep convective cloud fraction
real(r8), pointer, dimension(:,:) :: alst ! Physical liquid stratus cloud fraction
real(r8), pointer, dimension(:,:) :: aist ! Physical ice stratus cloud fraction
real(r8), pointer, dimension(:,:) :: qlst ! Physical in-stratus LWC [kg/kg]
real(r8), pointer, dimension(:,:) :: qist ! Physical in-stratus IWC [kg/kg]
real(r8), pointer, dimension(:,:) :: dp_icwmr ! Deep conv. cloud water
real(r8), pointer, dimension(:,:) :: sh_icwmr ! Shallow conv. cloud water
real(r8), pointer, dimension(:,:) :: fice ! Ice partitioning ratio
real(r8), pointer, dimension(:,:) :: sh_cldliq ! shallow convection gbx liq cld mixing ratio for COSP
real(r8), pointer, dimension(:,:) :: sh_cldice ! shallow convection gbx ice cld mixing ratio for COSP
#else
real(r8), dimension(pcols,pver) :: sh_cldliq ! shallow convection gbx liq cld mixing ratio for COSP
real(r8), dimension(pcols,pver) :: sh_cldice ! shallow convection gbx ice cld mixing ratio for COSP
#endif
! Local Variables
real(r8) :: conv_ice(pcols,pver) ! Convective contributions to IC cloud ice
real(r8) :: conv_liq(pcols,pver) ! Convective contributions to IC cloud liquid
real(r8) :: tot_ice(pcols,pver) ! Total IC ice
real(r8) :: tot_liq(pcols,pver) ! Total IC liquid
integer :: i,k,itim ! Lon, lev indices buff stuff.
real(r8) :: cu_icwmr ! Convective water for this grid-box.
real(r8) :: ls_icwmr ! Large-scale water for this grid-box.
real(r8) :: tot_icwmr ! Large-scale water for this grid-box.
real(r8) :: ls_frac ! Large-scale cloud frac for this grid-box.
real(r8) :: tot0_frac, cu0_frac, dp0_frac, sh0_frac
real(r8) :: kabs, kabsi, kabsl, alpha, dp0, sh0, ic_limit, frac_limit
real(r8) :: wrk1
! --------- !
! Parameter !
! --------- !
parameter( kabsl = 0.090361_r8, frac_limit = 0.01_r8, ic_limit = 1.e-12_r8 )
! Get microphysics option
character(len=16) :: microp_scheme
#ifndef WRF_PORT
call phys_getopts( microp_scheme_out = microp_scheme )
#else
microp_scheme = 'MG'
#endif
! Get convective in-cloud water and ice/water temperature partitioning.
#ifndef WRF_PORT
sh_icwmr => pbuf(icwmrsh_idx)%fld_ptr(1,1:pcols,1:pver,lchnk,1)
dp_icwmr => pbuf(icwmrdp_idx)%fld_ptr(1,1:pcols,1:pver,lchnk,1)
fice => pbuf(fice_idx)%fld_ptr(1,1:pcols,1:pver,lchnk,1)
! Get convective in-cloud fraction
sh_frac => pbuf(sh_frac_idx)%fld_ptr(1,1:pcols,1:pver,lchnk,1)
dp_frac => pbuf(dp_frac_idx)%fld_ptr(1,1:pcols,1:pver,lchnk,1)
cu_frac => pbuf(concldql_idx)%fld_ptr(1,1:pcols,1:pver,lchnk,1)
itim = pbuf_old_tim_idx()
ast => pbuf(ast_idx)%fld_ptr(1,1:pcols,1:pver,lchnk,itim)
itim = pbuf_old_tim_idx()
alst => pbuf(alst_idx)%fld_ptr(1,1:pcols,1:pver,lchnk,itim)
itim = pbuf_old_tim_idx()
aist => pbuf(aist_idx)%fld_ptr(1,1:pcols,1:pver,lchnk,itim)
itim = pbuf_old_tim_idx()
qlst => pbuf(qlst_idx)%fld_ptr(1,1:pcols,1:pver,lchnk,itim)
itim = pbuf_old_tim_idx()
qist => pbuf(qist_idx)%fld_ptr(1,1:pcols,1:pver,lchnk,itim)
#endif
! --------------------------------------------------------------- !
! Loop through grid-boxes and determine: !
! 1. Effective mean in-cloud convective ice/liquid (deep+shallow) !
! 2. Effective mean in-cloud total ice/liquid (ls+convective) !
! --------------------------------------------------------------- !
do k = 1, pver
do i = 1, ncol
if( sh_frac(i,k) <= frac_limit .or. sh_icwmr(i,k) <= ic_limit ) then
sh0_frac = 0._r8
else
sh0_frac = sh_frac(i,k)
endif
if( dp_frac(i,k) <= frac_limit .or. dp_icwmr(i,k) <= ic_limit ) then
dp0_frac = 0._r8
else
dp0_frac = dp_frac(i,k)
endif
cu0_frac = sh0_frac + dp0_frac
! For the moment calculate the emissivity based upon the ls clouds ice fraction
wrk1 = min(1._r8,max(0._r8, ls_ice(i,k)/(ls_ice(i,k)+ls_liq(i,k)+1.e-36_r8)))
if( ( cu0_frac < frac_limit ) .or. ( ( sh_icwmr(i,k) + dp_icwmr(i,k) ) < ic_limit ) ) then
cu0_frac = 0._r8
cu_icwmr = 0._r8
ls_frac = ast(i,k)
if( ls_frac < frac_limit ) then
ls_frac = 0._r8
ls_icwmr = 0._r8
else
ls_icwmr = ( ls_liq(i,k) + ls_ice(i,k) )/max(frac_limit,ls_frac) ! Convert to IC value.
end if
tot0_frac = ls_frac
tot_icwmr = ls_icwmr
else
! Select radiation constants (effective radii) for emissivity averaging.
if( microp_scheme .eq. 'MG' ) then
kabsi = 0.005_r8 + 1._r8/min(max(13._r8,rei(i,k)),130._r8)
elseif( microp_scheme .eq. 'RK' ) then
kabsi = 0.005_r8 + 1._r8/rei(i,k)
endif
kabs = kabsl * ( 1._r8 - wrk1 ) + kabsi * wrk1
alpha = -1.66_r8*kabs*pdel(i,k)/gravit*1000.0_r8
! Selecting cumulus in-cloud water.
select case (conv_water_mode) ! Type of average
case (1) ! Area weighted arithmetic average
cu_icwmr = ( sh0_frac * sh_icwmr(i,k) + dp0_frac*dp_icwmr(i,k))/max(frac_limit,cu0_frac)
case (2)
sh0 = exp(alpha*sh_icwmr(i,k))
dp0 = exp(alpha*dp_icwmr(i,k))
cu_icwmr = log((sh0_frac*sh0+dp0_frac*dp0)/max(frac_limit,cu0_frac))
cu_icwmr = cu_icwmr/alpha
case default ! Area weighted 'arithmetic in emissivity' average.
! call endrun ('CONV_WATER_4_RAD: Unknown option for conv_water_in_rad - exiting')
end select
! Selecting total in-cloud water.
! Attribute large-scale/convective area fraction differently from default.
ls_frac = ast(i,k)
ls_icwmr = (ls_liq(i,k) + ls_ice(i,k))/max(frac_limit,ls_frac) ! Convert to IC value.
tot0_frac = (ls_frac + cu0_frac)
select case (conv_water_mode) ! Type of average
case (1) ! Area weighted 'arithmetic in emissivity' average
tot_icwmr = (ls_frac*ls_icwmr + cu0_frac*cu_icwmr)/max(frac_limit,tot0_frac)
case (2)
tot_icwmr = log((ls_frac*exp(alpha*ls_icwmr)+cu0_frac*exp(alpha*cu_icwmr))/max(frac_limit,tot0_frac))
tot_icwmr = tot_icwmr/alpha
case default ! Area weighted 'arithmetic in emissivity' average.
! call endrun ('CONV_WATER_4_RAD: Unknown option for conv_water_in_rad - exiting')
end select
end if
! Repartition convective cloud water into liquid and ice phase.
! Currently, this partition is made using the ice fraction of stratus condensate.
! In future, we should use ice fraction explicitly computed from the convection scheme.
conv_ice(i,k) = cu_icwmr * wrk1
conv_liq(i,k) = cu_icwmr * (1._r8-wrk1)
tot_ice(i,k) = tot_icwmr * wrk1
tot_liq(i,k) = tot_icwmr * (1._r8-wrk1)
totg_ice(i,k) = tot0_frac * tot_icwmr * wrk1
totg_liq(i,k) = tot0_frac * tot_icwmr * (1._r8-wrk1)
end do
end do
!add pbuff calls for COSP
#ifndef WRF_PORT
sh_cldliq => pbuf(sh_cldliq1_idx)%fld_ptr(1,1:pcols,1:pver,lchnk,1)
sh_cldice => pbuf(sh_cldice1_idx)%fld_ptr(1,1:pcols,1:pver,lchnk,1)
#endif
sh_cldliq(:ncol,:pver)= sh_icwmr(:ncol,:pver)*(1-fice(:ncol,:pver))*sh_frac(:ncol,:pver)
sh_cldice(:ncol,:pver)=sh_icwmr(:ncol,:pver)*fice(:ncol,:pver)*sh_frac(:ncol,:pver)
! Output convective IC WMRs
call outfld
( 'ICLMRCU ', conv_liq , pcols, lchnk )
call outfld
( 'ICIMRCU ', conv_ice , pcols, lchnk )
call outfld
( 'ICWMRSH ', sh_icwmr , pcols, lchnk )
call outfld
( 'ICWMRDP ', dp_icwmr , pcols, lchnk )
call outfld
( 'ICLMRTOT', tot_liq , pcols, lchnk )
call outfld
( 'ICIMRTOT', tot_ice , pcols, lchnk )
call outfld
( 'SH_CLD ', sh_frac , pcols, lchnk )
call outfld
( 'DP_CLD ', dp_frac , pcols, lchnk )
end subroutine conv_water_4rad
end module conv_water