module param_cldoptics 2,5
!---------------------------------------------------------------------------------
! Purpose:
!
! Interface module for the calculation of cloud optical properties
!
! Author: Byron Boville Sept 06, 2002
!
!---------------------------------------------------------------------------------
use shr_kind_mod
, only: r8=>shr_kind_r8
use ppgrid
, only: pcols, pver
use constituents
, only: cnst_get_ind
use physconst
, only: gravit, latvap, zvir
use phys_control
, only: phys_getopts
implicit none
private
save
public :: param_cldoptics_init, param_cldoptics_calc
! Local variables
integer :: &
ixcldice, & ! cloud ice water index
ixcldliq ! cloud liquid water index
contains
!===============================================================================
subroutine param_cldoptics_init() 1,20
!-----------------------------------------------------------------------
use cam_history
, only: addfld, add_default, phys_decomp
!-----------------------------------------------------------------------
! get index of (liquid+ice) cloud water
call cnst_get_ind
('CLDICE', ixcldice)
call cnst_get_ind
('CLDLIQ', ixcldliq)
! register history variables
call addfld
('GCLDLWP ','gram/m2 ',pver, 'A','Grid-box cloud water path' ,phys_decomp, sampling_seq='rad_lwsw')
call addfld
('ICLDTWP ','gram/m2 ',pver, 'A','In-cloud cloud total water path (liquid and ice)'&
,phys_decomp, sampling_seq='rad_lwsw')
call addfld
('TGCLDCWP','gram/m2 ',1, 'A','Total grid-box cloud water path (liquid and ice)',phys_decomp, &
sampling_seq='rad_lwsw')
call addfld
('TGCLDLWP','gram/m2 ',1, 'A','Total grid-box cloud liquid water path',phys_decomp, sampling_seq='rad_lwsw')
call addfld
('TGCLDIWP','gram/m2 ',1, 'A','Total grid-box cloud ice water path' ,phys_decomp, sampling_seq='rad_lwsw')
call addfld
('EFFCLD ','fraction',pver, 'A','Effective cloud fraction' ,phys_decomp, sampling_seq='rad_lwsw')
call addfld
('SETLWP ','gram/m2 ',pver, 'A','Prescribed liquid water path' ,phys_decomp, sampling_seq='rad_lwsw')
call addfld
('LWSH ','m ',1, 'A','Liquid water scale height' ,phys_decomp, sampling_seq='rad_lwsw')
call addfld
('ICLDIWP', 'gram/m2', pver, 'A','In-cloud ice water path' ,phys_decomp, sampling_seq='rad_lwsw')
call addfld
('EMIS', '1', pver, 'A','cloud emissivity' ,phys_decomp, sampling_seq='rad_lwsw')
call addfld
('REL', 'micron', pver, 'A','effective liquid drop radius' ,phys_decomp, sampling_seq='rad_lwsw')
call addfld
('REI', 'micron', pver, 'A','effective ice particle radius' ,phys_decomp, sampling_seq='rad_lwsw')
call add_default
('GCLDLWP ', 1, ' ')
call add_default
('ICLDTWP ', 1, ' ')
call add_default
('ICLDIWP', 1, ' ')
call add_default
('TGCLDLWP', 1, ' ')
call add_default
('TGCLDIWP', 1, ' ')
return
end subroutine param_cldoptics_init
!===============================================================================
subroutine param_cldoptics_calc(state, cldn, landfrac, landm,icefrac, & 1,22
cicewp, cliqwp, emis, cldtau, rel, rei, pmxrgn, nmxrgn, snowh, pbuf )
!
! Compute (liquid+ice) water path and cloud water/ice diagnostics
! *** soon this code will compute liquid and ice paths from input liquid and ice mixing ratios
!
! **** mixes interface and physics code temporarily
!-----------------------------------------------------------------------
use physics_types
, only: physics_state
use cam_history
, only: outfld
use phys_buffer
, only: pbuf_size_max, pbuf_fld, pbuf_old_tim_idx, pbuf_get_fld_idx
use pkg_cldoptics
, only: cldefr, cldems, cldovrlap, cldclw
use stratiform
, only: conv_water_4rad
! Arguments
type(physics_state), intent(in) :: state ! state variables
type(pbuf_fld), intent(inout), dimension(pbuf_size_max) :: pbuf
real(r8), intent(in) :: cldn(pcols,pver) ! new cloud fraction
real(r8), intent(in) :: landfrac(pcols) ! Land fraction
real(r8), intent(in) :: icefrac(pcols) ! Ice fraction
real(r8), intent(in) :: landm(pcols) ! Land fraction ramped
real(r8), intent(in) :: snowh(pcols) ! Snow depth over land, water equivalent (m)
!!$ real(r8), intent(out) :: cwp (pcols,pver) ! in-cloud cloud (total) water path
real(r8), intent(out) :: cicewp(pcols,pver) ! in-cloud cloud ice water path
real(r8), intent(out) :: cliqwp(pcols,pver) ! in-cloud cloud liquid water path
real(r8), intent(out) :: emis (pcols,pver) ! cloud emissivity
real(r8), intent(out) :: cldtau(pcols,pver) ! cloud optical depth
real(r8), intent(in) :: rel (pcols,pver) ! effective drop radius (microns)
real(r8), intent(in) :: rei (pcols,pver) ! ice effective drop size (microns)
real(r8), intent(out) :: pmxrgn(pcols,pver+1) ! Maximum values of pressure for each
integer , intent(out) :: nmxrgn(pcols) ! Number of maximally overlapped regions
! Local variables
real(r8) :: cwp (pcols,pver) ! in-cloud cloud (total) water path
!!$ real(r8) :: cicewp(pcols,pver) ! in-cloud cloud ice water path
!!$ real(r8) :: cliqwp(pcols,pver) ! in-cloud cloud liquid water path
real(r8) :: effcld(pcols,pver) ! effective cloud=cld*emis
real(r8) :: gicewp(pcols,pver) ! grid-box cloud ice water path
real(r8) :: gliqwp(pcols,pver) ! grid-box cloud liquid water path
real(r8) :: gwp (pcols,pver) ! grid-box cloud (total) water path
real(r8) :: hl (pcols) ! Liquid water scale height
real(r8) :: tgicewp(pcols) ! Vertically integrated ice water path
real(r8) :: tgliqwp(pcols) ! Vertically integrated liquid water path
real(r8) :: tgwp (pcols) ! Vertically integrated (total) cloud water path
real(r8) :: tpw (pcols) ! total precipitable water
real(r8) :: clwpold(pcols,pver) ! Presribed cloud liq. h2o path
real(r8) :: ficemr (pcols,pver) ! Ice fraction from ice and liquid mixing ratios
real(r8) :: allcld_ice (pcols,pver) ! Convective cloud ice
real(r8) :: allcld_liq (pcols,pver) ! Convective cloud liquid
real(r8) :: rgrav ! inverse gravitational acceleration
integer :: i,k ! loop indexes
integer :: ncol, lchnk
integer :: conv_water_in_rad
!-----------------------------------------------------------------------
ncol = state%ncol
lchnk = state%lchnk
call phys_getopts
(conv_water_in_rad_out=conv_water_in_rad)
! Compute liquid and ice water paths
tgicewp(:ncol) = 0._r8
tgliqwp(:ncol) = 0._r8
! Initialize convective cloud water variables
allcld_ice(:ncol,:pver) = 0._r8
allcld_liq(:ncol,:pver) = 0._r8
! Add in convective cloud core water if requested.
if (conv_water_in_rad /= 0) then
call conv_water_4rad
(lchnk,ncol,pbuf,conv_water_in_rad,rei,state%pdel/gravit*1000.0_r8, &
state%q(:,:,ixcldliq),state%q(:,:,ixcldice),allcld_liq,allcld_ice)
else
allcld_liq = state%q(:,:,ixcldliq)
allcld_ice = state%q(:,:,ixcldice)
end if
do k=1,pver
do i = 1,ncol
gicewp(i,k) = allcld_ice(i,k)*state%pdel(i,k)/gravit*1000.0_r8 ! Grid box ice water path.
gliqwp(i,k) = allcld_liq(i,k)*state%pdel(i,k)/gravit*1000.0_r8 ! Grid box liquid water path.
!!$ gwp (i,k) = gicewp(i,k) + gliqwp(i,k)
cicewp(i,k) = gicewp(i,k) / max(0.01_r8,cldn(i,k)) ! In-cloud ice water path.
cliqwp(i,k) = gliqwp(i,k) / max(0.01_r8,cldn(i,k)) ! In-cloud liquid water path.
!!$ cwp (i,k) = gwp (i,k) / max(0.01_r8,cldn(i,k))
ficemr(i,k) = allcld_ice(i,k) / &
max(1.e-10_r8,(allcld_ice(i,k) + allcld_liq(i,k)))
tgicewp(i) = tgicewp(i) + gicewp(i,k)
tgliqwp(i) = tgliqwp(i) + gliqwp(i,k)
end do
end do
tgwp(:ncol) = tgicewp(:ncol) + tgliqwp(:ncol)
gwp(:ncol,:pver) = gicewp(:ncol,:pver) + gliqwp(:ncol,:pver)
cwp(:ncol,:pver) = cicewp(:ncol,:pver) + cliqwp(:ncol,:pver)
! Compute total preciptable water in column (in mm)
tpw(:ncol) = 0.0_r8
rgrav = 1.0_r8/gravit
do k=1,pver
do i=1,ncol
tpw(i) = tpw(i) + state%pdel(i,k)*state%q(i,k,1)*rgrav
end do
end do
! Diagnostic liquid water path (old specified form)
call cldclw
(lchnk, ncol, state%zi, clwpold, tpw, hl)
! Cloud emissivity.
call cldems
(lchnk, ncol, cwp, ficemr, rei, emis, cldtau)
! Effective cloud cover
do k=1,pver
do i=1,ncol
effcld(i,k) = cldn(i,k)*emis(i,k)
end do
end do
! Determine parameters for maximum/random overlap
call cldovrlap
(lchnk, ncol, state%pint, cldn, nmxrgn, pmxrgn)
call outfld
('GCLDLWP' ,gwp , pcols,lchnk)
call outfld
('TGCLDCWP',tgwp , pcols,lchnk)
call outfld
('TGCLDLWP',tgliqwp, pcols,lchnk)
call outfld
('TGCLDIWP',tgicewp, pcols,lchnk)
call outfld
('ICLDTWP' ,cwp , pcols,lchnk)
call outfld
('ICLDIWP' ,cicewp , pcols,lchnk)
call outfld
('SETLWP' ,clwpold, pcols,lchnk)
call outfld
('EFFCLD' ,effcld , pcols,lchnk)
call outfld
('LWSH' ,hl , pcols,lchnk)
call outfld
('EMIS' ,emis , pcols,lchnk)
call outfld
('REL' ,rel , pcols,lchnk)
call outfld
('REI' ,rei , pcols,lchnk)
end subroutine param_cldoptics_calc
end module param_cldoptics