#undef DEBUG module stratiform 5,7 !-------------------------------------------------------------------------- ! ! Purpose: ! ! ! ! Provides the CAM interface to the prognostic cloud macro and microphysics ! ! ! ! Author: Byron Boville Sept 04, 2002 ! ! modified by D.B. Coleman May 2004 ! ! modified by Sungsu Park. Dec.2009 ! !-------------------------------------------------------------------------- ! use shr_kind_mod, only: r8=>shr_kind_r8 use ppgrid, only: pcols, pver, pverp use physconst, only: gravit, latvap, latice use abortutils, only: endrun use chemistry, only: chem_is use phys_control, only: phys_getopts use perf_mod use cam_logfile, only: iulog implicit none private save public :: stratiform_register, stratiform_init_cnst, stratiform_implements_cnst public :: stratiform_init, conv_water_4rad public :: stratiform_tend ! ------------------------- ! ! Private Module Parameters ! ! ------------------------- ! ! Choose either 'intermediate' ('inter') or complete ('compl') cloud microphysics ! inter : Microphysics assumes 'liquid stratus frac = ice stratus frac = max( liquid stratus frac, ice stratus frac )'. ! compl : Microphysics explicitly treats 'liquid stratus frac .ne. ice stratus frac' ! for CAM5, only 'inter' is functional character(len=5), private, parameter :: micro_treatment = 'inter' ! 'cu_det_st' : If .true. (.false.), detrain cumulus liquid condensate into the pre-existing liquid stratus ! (environment) without (with) macrophysical evaporation. If there is no pre-esisting stratus, ! evaporate cumulus liquid condensate. This option only influences the treatment of cumulus ! liquid condensate, not cumulus ice condensate. logical, private, parameter :: cu_det_st = .false. ! -------------------------------- ! ! End of Private Module Parameters ! ! -------------------------------- ! integer, parameter :: ncnstmax = 4 ! Number of constituents integer :: ncnst ! Number of constituents (can vary) character(len=8), dimension(ncnstmax), parameter & ! Constituent names :: cnst_names = (/'CLDLIQ', 'CLDICE','NUMLIQ','NUMICE'/) logical :: use_shfrc ! Local copy of flag from convect_shallow_use_shfrc character(len=16) :: microp_scheme ! Microphysics scheme integer :: & cldo_idx, &! old cld index in physics buffer kvh_idx, &! kvh index in physics buffer #ifdef MODAL_AERO qqcw_idx, &! qqcw index in physics buffer #endif ixcldliq, &! cloud liquid amount index ixcldice, &! cloud ice amount index ixnumliq, &! cloud liquid number index ixnumice, &! cloud ice water index qcwat_idx, &! qcwat index in physics buffer lcwat_idx, &! lcwat index in physics buffer iccwat_idx, &! iccwat index in physics buffer nlwat_idx, &! nlwat index in physics buffer niwat_idx, &! niwat index in physics buffer tcwat_idx, &! tcwat index in physics buffer CC_T_idx, &! CC_qv_idx, &! CC_ql_idx, &! CC_qi_idx, &! CC_nl_idx, &! CC_ni_idx, &! CC_qlst_idx, &! cld_idx, &! cld index in physics buffer ast_idx, &! stratiform cloud fraction index in physics buffer aist_idx, &! ice stratiform cloud fraction index in physics buffer alst_idx, &! liquid stratiform cloud fraction index in physics buffer qist_idx, &! ice stratiform in-cloud IWC qlst_idx, &! liquid stratiform in-cloud LWC concld_idx, &! concld index in physics buffer rhdfda_idx, &! rhdfda index in physics buffer rhu00_idx, &! rhu00 index in physics buffer rel2_idx, &! rel2 index in physics buffer rei2_idx ! rei2 index in physics buffer contains ! =============================================================================== subroutine stratiform_register 1,65 !---------------------------------------------------------------------- ! ! ! ! Register the constituents (cloud liquid and cloud ice) and the fields ! ! in the physics buffer. ! ! ! !---------------------------------------------------------------------- ! use constituents, only: cnst_add, pcnst use physconst, only: mwdry, cpair use phys_buffer, only: pbuf_times, pbuf_add integer idx !----------------------------------------------------------------------- call phys_getopts(microp_scheme_out=microp_scheme) if ( microp_scheme .eq. 'MG' ) then ncnst = 4 else if ( microp_scheme .eq. 'RK' ) then ncnst = 2 end if ! Register cloud water and determine index. call cnst_add(cnst_names(1), mwdry, cpair, 0._r8, ixcldliq, & longname='Grid box averaged cloud liquid amount') call cnst_add(cnst_names(2), mwdry, cpair, 0._r8, ixcldice, & longname='Grid box averaged cloud ice amount') if ( microp_scheme .eq. 'MG' ) then call cnst_add(cnst_names(3), mwdry, cpair, 0._r8, ixnumliq, & longname='Grid box averaged cloud liquid number') call cnst_add(cnst_names(4), mwdry, cpair, 0._r8, ixnumice, & longname='Grid box averaged cloud ice number') end if ! Request physics buffer space for fields that persist across timesteps. call pbuf_add('QCWAT', 'global', 1, pver, pbuf_times, qcwat_idx) call pbuf_add('LCWAT', 'global', 1, pver, pbuf_times, lcwat_idx) call pbuf_add('ICCWAT', 'global', 1, pver, pbuf_times, iccwat_idx) call pbuf_add('NLWAT', 'global', 1, pver, pbuf_times, nlwat_idx) call pbuf_add('NIWAT', 'global', 1, pver, pbuf_times, niwat_idx) call pbuf_add('CC_T', 'global', 1, pver, pbuf_times, CC_T_idx) call pbuf_add('CC_qv', 'global', 1, pver, pbuf_times, CC_qv_idx) call pbuf_add('CC_ql', 'global', 1, pver, pbuf_times, CC_ql_idx) call pbuf_add('CC_qi', 'global', 1, pver, pbuf_times, CC_qi_idx) call pbuf_add('CC_nl', 'global', 1, pver, pbuf_times, CC_nl_idx) call pbuf_add('CC_ni', 'global', 1, pver, pbuf_times, CC_ni_idx) call pbuf_add('CC_qlst', 'global', 1, pver, pbuf_times, CC_qlst_idx) call pbuf_add('TCWAT', 'global', 1, pver, pbuf_times, tcwat_idx) call pbuf_add('CLD', 'global', 1, pver, pbuf_times, cld_idx) call pbuf_add('CLDO', 'global', 1, pver, pbuf_times, cldo_idx) call pbuf_add('AST', 'global', 1, pver, pbuf_times, ast_idx) call pbuf_add('AIST', 'global', 1, pver, pbuf_times, aist_idx) call pbuf_add('ALST', 'global', 1, pver, pbuf_times, alst_idx) call pbuf_add('QIST', 'global', 1, pver, pbuf_times, qist_idx) call pbuf_add('QLST', 'global', 1, pver, pbuf_times, qlst_idx) call pbuf_add('CONCLD', 'global', 1, pver, pbuf_times, concld_idx) call pbuf_add('RHDFDA', 'global', 1, pver, pbuf_times, rhdfda_idx) call pbuf_add('RHU00', 'global', 1, pver, pbuf_times, rhu00_idx) call pbuf_add('REL2', 'global', 1, pver, pbuf_times, rel2_idx) call pbuf_add('REI2', 'global', 1, pver, pbuf_times, rei2_idx) ! Physics buffer variables for convective cloud properties. call pbuf_add('CONCLDQL', 'physpkg', 1, pver, 1, idx) call pbuf_add('FICE', 'physpkg', 1, pver, 1, idx) call pbuf_add('SH_FRAC', 'physpkg', 1, pver, 1, idx) call pbuf_add('DP_FRAC', 'physpkg', 1, pver, 1, idx) call pbuf_add('QINI' , 'physpkg', 1,pver, 1, idx) call pbuf_add('CLDLIQINI' , 'physpkg', 1,pver, 1, idx) call pbuf_add('CLDICEINI' , 'physpkg', 1,pver, 1, idx) call pbuf_add('TINI' , 'physpkg', 1,pver, 1, idx) call pbuf_add('QME', 'physpkg', 1, pver, 1, idx) call pbuf_add('PRAIN' , 'physpkg', 1, pver, 1, idx) call pbuf_add('NEVAPR' , 'physpkg', 1, pver, 1, idx) call pbuf_add('WSEDL', 'physpkg', 1, pver, 1, idx) call pbuf_add('REI', 'physpkg', 1, pver, 1, idx) call pbuf_add('REL', 'physpkg', 1, pver, 1, idx) call pbuf_add('REL_FN', 'physpkg', 1, pver, 1, idx) ! REL at fixed number for indirect rad forcing call pbuf_add('DEI', 'physpkg', 1, pver, 1, idx) ! Mitchell ice effective diameter for radiation call pbuf_add('MU', 'physpkg', 1, pver, 1, idx) ! Size distribution shape parameter for radiation call pbuf_add('LAMBDAC', 'physpkg', 1, pver, 1, idx) ! Size distribution shape parameter for radiation call pbuf_add('ICIWP', 'physpkg', 1, pver, 1, idx) ! In cloud ice water path for radiation call pbuf_add('ICLWP', 'physpkg', 1, pver, 1, idx) ! In cloud liquid water path for radiation call pbuf_add('DEICONV', 'physpkg', 1, pver, 1, idx) ! Convective ice effective diameter for radiation call pbuf_add('MUCONV', 'physpkg', 1, pver, 1, idx) ! Convective size distribution shape parameter for radiation call pbuf_add('LAMBDACONV', 'physpkg', 1, pver, 1, idx) ! Convective size distribution shape parameter for radiation call pbuf_add('ICIWPST', 'physpkg', 1, pver, 1, idx) ! Stratiform only in cloud ice water path for radiation call pbuf_add('ICLWPST', 'physpkg', 1, pver, 1, idx) ! Stratiform in cloud liquid water path for radiation call pbuf_add('ICIWPCONV', 'physpkg', 1, pver, 1, idx) ! Convective only in cloud ice water path for radiation call pbuf_add('ICLWPCONV', 'physpkg', 1, pver, 1, idx) ! Convective in cloud liquid water path for radiation call pbuf_add('DES', 'physpkg', 1, pver, 1, idx) ! Snow effective diameter for radiation call pbuf_add('ICSWP', 'physpkg', 1, pver, 1, idx) ! In cloud snow water path for radiation call pbuf_add('CLDFSNOW', 'physpkg', 1, pver ,pbuf_times, idx) ! Cloud fraction for liquid drops + snow #ifdef MODAL_AERO call pbuf_add('QQCW', 'global', 1, pver, pcnst, qqcw_idx) call pbuf_add('RATE1_CW2PR_ST', 'physpkg', 1, pver, 1, idx) ! rce 2010/05/01 #endif end subroutine stratiform_register !============================================================================ ! ! ! !============================================================================ ! function stratiform_implements_cnst(name) 1 !----------------------------------------------------------------------------- ! ! ! ! Purpose: return true if specified constituent is implemented by this package ! ! ! ! Author: B. Eaton ! ! ! !----------------------------------------------------------------------------- ! implicit none !-----------------------------Arguments--------------------------------- character(len=*), intent(in) :: name ! constituent name logical :: stratiform_implements_cnst ! return value !---------------------------Local workspace----------------------------- integer :: m !----------------------------------------------------------------------- stratiform_implements_cnst = .false. do m = 1, ncnst if (name == cnst_names(m)) then stratiform_implements_cnst = .true. return end if end do end function stratiform_implements_cnst !============================================================================ ! ! ! !============================================================================ ! subroutine stratiform_init_cnst(name, q, gcid) 1 !----------------------------------------------------------------------- ! ! ! ! Initialize the cloud water mixing ratios (liquid and ice), if they are ! ! not read from the initial file ! ! ! !----------------------------------------------------------------------- ! implicit none !---------------------------- Arguments --------------------------------- character(len=*), intent(in) :: name ! constituent name real(r8), intent(out) :: q(:,:) ! mass mixing ratio (gcol, plev) integer, intent(in) :: gcid(:) ! global column id !----------------------------------------------------------------------- if ( name == 'CLDLIQ' ) then q = 0.0_r8 return else if ( name == 'CLDICE' ) then q = 0.0_r8 return else if ( name == 'NUMLIQ' ) then q = 0.0_r8 return else if ( name == 'NUMICE' ) then q = 0.0_r8 return end if end subroutine stratiform_init_cnst !============================================================================ ! ! ! !============================================================================ ! subroutine stratiform_init 1,246 !-------------------------------------------- ! ! ! ! Initialize the cloud water parameterization ! ! ! !-------------------------------------------- ! use cldwat, only: inimc use cldwat2m_micro, only: ini_micro use cldwat2m_macro, only: ini_macro use constituents, only: cnst_get_ind, cnst_name, cnst_longname, sflxnam, apcnst, bpcnst use cam_history, only: addfld, add_default, phys_decomp use physconst, only: tmelt, rh2o, rhodair use convect_shallow, only: convect_shallow_use_shfrc use dycore, only: dycore_is use phys_control, only: cam_physpkg_is #ifdef MODAL_AERO use ndrop, only: activate_init use cam_history, only: fieldname_len use spmd_utils, only: masterproc use modal_aero_data, only: cnst_name_cw, & lmassptr_amode, lmassptrcw_amode, & nspec_amode, ntot_amode, numptr_amode, numptrcw_amode, maxd_amode #endif integer :: m, mm character(len=1) :: avg_flag ! History field averaging flag logical :: history_aerosol ! Output the MAM aerosol tendencies logical :: history_microphysics ! Output variables for microphysics diagnostics package logical :: history_budget ! Output tendencies and state variables for CAM4 ! temperature, water vapor, cloud ice and cloud ! liquid budgets. #ifdef MODAL_AERO integer :: l, lphase, lspec character(len=fieldname_len) :: tmpname character(len=fieldname_len+3) :: fieldname character(128) :: long_name character(8) :: unit #endif !----------------------------------------------------------------------- call phys_getopts( history_aerosol_out = history_aerosol , & history_microphysics_out = history_microphysics , & history_budget_out = history_budget ) ! Initialization routine for cloud macrophysics and microphysics if( microp_scheme .eq. 'MG' ) then call ini_micro call ini_macro elseif( microp_scheme .eq. 'RK' ) then call inimc(tmelt, rhodair/1000.0_r8, gravit, rh2o) endif #ifdef MODAL_AERO call activate_init #endif ! Find out whether shfrc from convect_shallow will be used in cldfrc if( convect_shallow_use_shfrc() ) then use_shfrc = .true. else use_shfrc = .false. endif ! Register history variables if( history_budget ) then avg_flag = 'I' else avg_flag = 'A' endif do m = 1, ncnst call cnst_get_ind( cnst_names(m), mm ) call addfld( cnst_name(mm), 'kg/kg ', pver, avg_flag, cnst_longname(mm), phys_decomp ) call addfld( sflxnam(mm), 'kg/m2/s ', 1, 'A' , trim(cnst_name(mm))//' surface flux', phys_decomp ) call add_default( cnst_name(mm), 1, ' ' ) call add_default( sflxnam(mm), 1, ' ' ) enddo call cnst_get_ind( 'CLDLIQ', m ) call addfld (apcnst(m), 'kg/kg ', pver, avg_flag, trim(cnst_name(m))//' after physics' , phys_decomp) call addfld (bpcnst(m), 'kg/kg ', pver, avg_flag, trim(cnst_name(m))//' before physics' , phys_decomp) if( history_budget) call add_default (apcnst(m), 1, ' ') if( history_budget) call add_default (bpcnst(m), 1, ' ') call cnst_get_ind('CLDICE', m ) call addfld (apcnst(m), 'kg/kg ', pver, avg_flag, trim(cnst_name(m))//' after physics' , phys_decomp) call addfld (bpcnst(m), 'kg/kg ', pver, avg_flag, trim(cnst_name(m))//' before physics' , phys_decomp) if( history_budget) call add_default (apcnst(m), 1, ' ') if( history_budget) call add_default (bpcnst(m), 1, ' ') call addfld ('FWAUT ', 'fraction', pver, 'A', 'Relative importance of liquid autoconversion' ,phys_decomp) call addfld ('FSAUT ', 'fraction', pver, 'A', 'Relative importance of ice autoconversion' ,phys_decomp) call addfld ('FRACW ', 'fraction', pver, 'A', 'Relative importance of rain accreting liquid' ,phys_decomp) call addfld ('FSACW ', 'fraction', pver, 'A', 'Relative importance of snow accreting liquid' ,phys_decomp) call addfld ('FSACI ', 'fraction', pver, 'A', 'Relative importance of snow accreting ice' ,phys_decomp) call addfld ('CME ', 'kg/kg/s ', pver, 'A', 'Rate of cond-evap within the cloud' ,phys_decomp) call addfld ('CMEICE ', 'kg/kg/s ', pver, 'A', 'Rate of cond-evap of ice within the cloud' ,phys_decomp) call addfld ('CMELIQ ', 'kg/kg/s ', pver, 'A', 'Rate of cond-evap of liq within the cloud' ,phys_decomp) call addfld ('ICE2PR ', 'kg/kg/s ', pver, 'A', 'Rate of conversion of ice to precip' ,phys_decomp) call addfld ('LIQ2PR ', 'kg/kg/s ', pver, 'A', 'Rate of conversion of liq to precip' ,phys_decomp) call addfld ('ZMDLF ', 'kg/kg/s ', pver, 'A', 'Detrained liquid water from ZM convection' ,phys_decomp) call addfld ('DPDLFLIQ ', 'kg/kg/s ', pver, 'A', 'Detrained liquid water from deep convection' ,phys_decomp) call addfld ('DPDLFICE ', 'kg/kg/s ', pver, 'A', 'Detrained ice from deep convection' ,phys_decomp) call addfld ('SHDLFLIQ ', 'kg/kg/s ', pver, 'A', 'Detrained liquid water from shallow convection' ,phys_decomp) call addfld ('SHDLFICE ', 'kg/kg/s ', pver, 'A', 'Detrained ice from shallow convection' ,phys_decomp) call addfld ('DPDLFT ', 'K/s ', pver, 'A', 'T-tendency due to deep convective detrainment' ,phys_decomp) call addfld ('SHDLFT ', 'K/s ', pver, 'A', 'T-tendency due to shallow convective detrainment' ,phys_decomp) call addfld ('PRODPREC ', 'kg/kg/s ', pver, 'A', 'Rate of conversion of condensate to precip' ,phys_decomp) call addfld ('EVAPPREC ', 'kg/kg/s ', pver, 'A', 'Rate of evaporation of falling precip' ,phys_decomp) call addfld ('EVAPSNOW ', 'kg/kg/s ', pver, 'A', 'Rate of evaporation of falling snow' ,phys_decomp) call addfld ('HPROGCLD ', 'W/kg' , pver, 'A', 'Heating from prognostic clouds' ,phys_decomp) call addfld ('HCME ', 'W/kg' , pver, 'A', 'Heating from cond-evap within the cloud' ,phys_decomp) call addfld ('HEVAP ', 'W/kg' , pver, 'A', 'Heating from evaporation of falling precip' ,phys_decomp) call addfld ('HFREEZ ', 'W/kg' , pver, 'A', 'Heating rate due to freezing of precip' ,phys_decomp) call addfld ('HMELT ', 'W/kg' , pver, 'A', 'Heating from snow melt' ,phys_decomp) call addfld ('HREPART ', 'W/kg' , pver, 'A', 'Heating from cloud ice/liquid repartitioning' ,phys_decomp) call addfld ('REPARTICE', 'kg/kg/s' , pver, 'A', 'Cloud ice tendency from cloud ice/liquid repartitioning' ,phys_decomp) call addfld ('REPARTLIQ', 'kg/kg/s' , pver, 'A', 'Cloud liq tendency from cloud ice/liquid repartitioning' ,phys_decomp) call addfld ('FICE ', 'fraction', pver, 'A', 'Fractional ice content within cloud' ,phys_decomp) call addfld ('ICWMR ', 'kg/kg ', pver, 'A', 'Prognostic in-cloud water mixing ratio' ,phys_decomp) call addfld ('ICIMR ', 'kg/kg ', pver, 'A', 'Prognostic in-cloud ice mixing ratio' ,phys_decomp) call addfld ('ICWMRST ', 'kg/kg ', pver, 'A', 'Prognostic in-stratus water mixing ratio' ,phys_decomp) call addfld ('ICIMRST ', 'kg/kg ', pver, 'A', 'Prognostic in-stratus ice mixing ratio' ,phys_decomp) call addfld ('PCSNOW ', 'm/s ', 1 , 'A', 'Snow fall from prognostic clouds' ,phys_decomp) ! MG microphysics diagnostics call addfld ('QCSEVAP ', 'kg/kg/s ', pver, 'A', 'Rate of evaporation of falling cloud water' ,phys_decomp) call addfld ('QISEVAP ', 'kg/kg/s ', pver, 'A', 'Rate of sublimation of falling cloud ice' ,phys_decomp) call addfld ('QVRES ', 'kg/kg/s ', pver, 'A', 'Rate of residual condensation term' ,phys_decomp) call addfld ('CMEIOUT ', 'kg/kg/s ', pver, 'A', 'Rate of deposition/sublimation of cloud ice' ,phys_decomp) call addfld ('VTRMC ', 'm/s ', pver, 'A', 'Mass-weighted cloud water fallspeed' ,phys_decomp) call addfld ('VTRMI ', 'm/s ', pver, 'A', 'Mass-weighted cloud ice fallspeed' ,phys_decomp) call addfld ('QCSEDTEN ', 'kg/kg/s ', pver, 'A', 'Cloud water mixing ratio tendency from sedimentation' ,phys_decomp) call addfld ('QISEDTEN ', 'kg/kg/s ', pver, 'A', 'Cloud ice mixing ratio tendency from sedimentation' ,phys_decomp) call addfld ('PRAO ', '1/s ', pver, 'A', 'Accretion of cloud water by rain' ,phys_decomp) call addfld ('PRCO ', '1/s ', pver, 'A', 'Autoconversion of cloud water' ,phys_decomp) call addfld ('MNUCCCO ', '1/s ', pver, 'A', 'Immersion freezing of cloud water' ,phys_decomp) call addfld ('MNUCCTO ', '1/s ', pver, 'A', 'Contact freezing of cloud water' ,phys_decomp) call addfld ('MSACWIO ', '1/s ', pver, 'A', 'Conversion of cloud water from rime-splintering' ,phys_decomp) call addfld ('PSACWSO ', '1/s ', pver, 'A', 'Accretion of cloud water by snow' ,phys_decomp) call addfld ('BERGSO ', '1/s ', pver, 'A', 'Conversion of cloud water to snow from bergeron' ,phys_decomp) call addfld ('BERGO ', '1/s ', pver, 'A', 'Conversion of cloud water to cloud ice from bergeron' ,phys_decomp) call addfld ('MELTO ', '1/s ', pver, 'A', 'Melting of cloud ice' ,phys_decomp) call addfld ('HOMOO ', '1/s ', pver, 'A', 'Homogeneous freezing of cloud water' ,phys_decomp) call addfld ('QCRESO ', '1/s ', pver, 'A', 'Residual condensation term for cloud water' ,phys_decomp) call addfld ('PRCIO ', '1/s ', pver, 'A', 'Autoconversion of cloud ice' ,phys_decomp) call addfld ('PRAIO ', '1/s ', pver, 'A', 'Accretion of cloud ice by rain' ,phys_decomp) call addfld ('QIRESO ', '1/s ', pver, 'A', 'Residual deposition term for cloud ice' ,phys_decomp) call addfld ('MNUCCRO ', '1/s ', pver, 'A', 'Heterogeneous freezing of rain to snow' ,phys_decomp) call addfld ('PRACSO ', '1/s ', pver, 'A', 'Accretion of rain by snow' ,phys_decomp) call addfld ('MELTSDT ', 'W/kg ', pver, 'A', 'Latent heating rate due to melting of snow' ,phys_decomp) call addfld ('FRZRDT ', 'W/kg ', pver, 'A', 'Latent heating rate due to homogeneous freezing of rain' ,phys_decomp) ! Convective cloud water variables. call addfld ('ICIMRCU ', 'kg/kg ', pver, 'A', 'Convection in-cloud ice mixing ratio ' ,phys_decomp) call addfld ('ICLMRCU ', 'kg/kg ', pver, 'A', 'Convection in-cloud liquid mixing ratio ' ,phys_decomp) call addfld ('ICIMRTOT ', 'kg/kg ', pver, 'A', 'Total in-cloud ice mixing ratio ' ,phys_decomp) call addfld ('ICLMRTOT ', 'kg/kg ', pver, 'A', 'Total in-cloud liquid mixing ratio ' ,phys_decomp) call addfld ('ICWMRSH ', 'kg/kg ', pver, 'A', 'Shallow Convection in-cloud water mixing ratio ' ,phys_decomp) call addfld ('ICWMRDP ', 'kg/kg ', pver, 'A', 'Deep Convection in-cloud water mixing ratio ' ,phys_decomp) call addfld ('DQSED ', 'kg/kg/s ', pver, 'A', 'Water vapor tendency from cloud sedimentation' ,phys_decomp) call addfld ('DLSED ', 'kg/kg/s ', pver, 'A', 'Cloud liquid tendency from sedimentation' ,phys_decomp) call addfld ('DISED ', 'kg/kg/s ', pver, 'A', 'Cloud ice tendency from sedimentation' ,phys_decomp) call addfld ('HSED ', 'W/kg ', pver, 'A', 'Heating from cloud sediment evaporation' ,phys_decomp) call addfld ('SNOWSED ', 'm/s ', 1 , 'A', 'Snow from cloud ice sedimentation' ,phys_decomp) call addfld ('RAINSED ', 'm/s ', 1 , 'A', 'Rain from cloud liquid sedimentation' ,phys_decomp) call addfld ('PRECSED ', 'm/s ', 1 , 'A', 'Precipitation from cloud sedimentation' ,phys_decomp) call add_default ('FICE ', 1, ' ') call addfld ('CNVCLD ', 'fraction', 1, 'A', 'Vertically integrated convective cloud amount' ,phys_decomp) call addfld ('CLDST ', 'fraction', pver, 'A', 'Stratus cloud fraction' ,phys_decomp) call addfld ('CONCLD ', 'fraction', pver, 'A', 'Convective cloud cover' ,phys_decomp) call addfld ('SH_CLD ', 'fraction', pver, 'A', 'Shallow convective cloud cover' ,phys_decomp) call addfld ('DP_CLD ', 'fraction', pver, 'A', 'Deep convective cloud cover' ,phys_decomp) call add_default ('CONCLD ', 1, ' ') call addfld ('AST','fraction',pver, 'A','Stratus cloud fraction',phys_decomp) ! History variables for CAM5 macro-microphysics call addfld ('MPDT ', 'W/kg ', pver, 'A', 'Heating tendency - Morrison microphysics' ,phys_decomp) call addfld ('MACPDT ', 'W/kg ', pver, 'A', 'Heating tendency - Revised macrophysics' ,phys_decomp) call addfld ('MPDQ ', 'kg/kg/s ', pver, 'A', 'Q tendency - Morrison microphysics' ,phys_decomp) call addfld ('MACPDQ ', 'kg/kg/s ', pver, 'A', 'Q tendency - Revised macrophysics' ,phys_decomp) call addfld ('MPDLIQ ', 'kg/kg/s ', pver, 'A', 'CLDLIQ tendency - Morrison microphysics' ,phys_decomp) call addfld ('MACPDLIQ ', 'kg/kg/s ', pver, 'A', 'CLDLIQ tendency - Revised macrophysics' ,phys_decomp) call addfld ('MPDICE ', 'kg/kg/s ', pver, 'A', 'CLDICE tendency - Morrison microphysics' ,phys_decomp) call addfld ('MACPDICE ', 'kg/kg/s ', pver, 'A', 'CLDICE tendency - Revised macrophysics' ,phys_decomp) call addfld ('MPDW2V ', 'kg/kg/s ', pver, 'A', 'Water <--> Vapor tendency - Morrison microphysics' ,phys_decomp) call addfld ('MPDW2I ', 'kg/kg/s ', pver, 'A', 'Water <--> Ice tendency - Morrison microphysics' ,phys_decomp) call addfld ('MPDW2P ', 'kg/kg/s ', pver, 'A', 'Water <--> Precip tendency - Morrison microphysics' ,phys_decomp) call addfld ('MPDI2V ', 'kg/kg/s ', pver, 'A', 'Ice <--> Vapor tendency - Morrison microphysics' ,phys_decomp) call addfld ('MPDI2W ', 'kg/kg/s ', pver, 'A', 'Ice <--> Water tendency - Morrison microphysics' ,phys_decomp) call addfld ('MPDI2P ', 'kg/kg/s ', pver, 'A', 'Ice <--> Precip tendency - Morrison microphysics' ,phys_decomp) call addfld ('CLDVAPADJ', 'kg/kg/s ', pver, 'A', 'Q tendency associated with liq/ice adjustment - Revised macrophysics' ,phys_decomp) call addfld ('CLDLIQADJ', 'kg/kg/s ', pver, 'A', 'CLDLIQ adjustment tendency - Revised macrophysics' ,phys_decomp) call addfld ('CLDICEADJ', 'kg/kg/s ', pver, 'A', 'CLDICE adjustment tendency - Revised macrophysics' ,phys_decomp) call addfld ('CLDLIQDET', 'kg/kg/s ', pver, 'A', 'Detrainment of conv cld liq into envrionment - Revised macrophysics' ,phys_decomp) call addfld ('CLDICEDET', 'kg/kg/s ', pver, 'A', 'Detrainment of conv cld ice into envrionment - Revised macrophysics' ,phys_decomp) call addfld ('CLDLIQLIM', 'kg/kg/s ', pver, 'A', 'CLDLIQ limiting tendency - Revised macrophysics' ,phys_decomp) call addfld ('CLDICELIM', 'kg/kg/s ', pver, 'A', 'CLDICE limiting tendency - Revised macrophysics' ,phys_decomp) call addfld ('LIQCLDF ', 'fraction', pver, 'A', 'Stratus Liquid cloud fraction' ,phys_decomp) call addfld ('ICECLDF ', 'fraction', pver, 'A', 'Stratus ICE cloud fraction' ,phys_decomp) call addfld ('IWC ', 'kg/m3 ', pver, 'A', 'Grid box average ice water content' ,phys_decomp) call addfld ('LWC ', 'kg/m3 ', pver, 'A', 'Grid box average liquid water content' ,phys_decomp) call addfld ('ICWNC ', 'm-3 ', pver, 'A', 'Prognostic in-cloud water number conc' ,phys_decomp) call addfld ('ICINC ', 'm-3 ', pver, 'A', 'Prognostic in-cloud ice number conc' ,phys_decomp) call addfld ('EFFLIQ ', 'Micron ', pver, 'A', 'Prognostic droplet effective radius' ,phys_decomp) call addfld ('EFFLIQ_IND','Micron ', pver, 'A', 'Prognostic droplet effective radius (indirect effect)' ,phys_decomp) call addfld ('EFFICE ', 'Micron ', pver, 'A', 'Prognostic ice effective radius' ,phys_decomp) call addfld ('WSUB ', 'm/s ', pver, 'A', 'Diagnostic sub-grid vertical velocity' ,phys_decomp) call addfld ('WSUBI ', 'm/s ', pver, 'A', 'Diagnostic sub-grid vertical velocity for ice' ,phys_decomp) call addfld ('CDNUMC ', '#/m2 ', 1, 'A', 'Vertically-integrated droplet concentration' ,phys_decomp) if ( history_budget ) then call add_default ('EVAPSNOW ', 1, ' ') call add_default ('EVAPPREC ', 1, ' ') call add_default ('CMELIQ ', 1, ' ') if( cam_physpkg_is('cam3') .or. cam_physpkg_is('cam4') ) then call add_default ('ZMDLF ', 1, ' ') call add_default ('CME ', 1, ' ') call add_default ('DQSED ', 1, ' ') call add_default ('DISED ', 1, ' ') call add_default ('DLSED ', 1, ' ') call add_default ('HSED ', 1, ' ') call add_default ('CMEICE ', 1, ' ') call add_default ('LIQ2PR ', 1, ' ') call add_default ('ICE2PR ', 1, ' ') call add_default ('HCME ', 1, ' ') call add_default ('HEVAP ', 1, ' ') call add_default ('HFREEZ ', 1, ' ') call add_default ('HMELT ', 1, ' ') call add_default ('HREPART ', 1, ' ') call add_default ('HPROGCLD ', 1, ' ') call add_default ('REPARTLIQ', 1, ' ') call add_default ('REPARTICE', 1, ' ') elseif( cam_physpkg_is('cam5') ) then call add_default ('QVRES ', 1, ' ') call add_default ('QISEVAP ', 1, ' ') call add_default ('QCSEVAP ', 1, ' ') call add_default ('QISEDTEN ', 1, ' ') call add_default ('QCSEDTEN ', 1, ' ') call add_default ('QIRESO ', 1, ' ') call add_default ('QCRESO ', 1, ' ') call add_default ('PSACWSO ', 1, ' ') call add_default ('PRCO ', 1, ' ') call add_default ('PRCIO ', 1, ' ') call add_default ('PRAO ', 1, ' ') call add_default ('PRAIO ', 1, ' ') call add_default ('PRACSO ', 1, ' ') call add_default ('MSACWIO ', 1, ' ') call add_default ('MPDW2V ', 1, ' ') call add_default ('MPDW2P ', 1, ' ') call add_default ('MPDW2I ', 1, ' ') call add_default ('MPDT ', 1, ' ') call add_default ('MPDQ ', 1, ' ') call add_default ('MPDLIQ ', 1, ' ') call add_default ('MPDICE ', 1, ' ') call add_default ('MPDI2W ', 1, ' ') call add_default ('MPDI2V ', 1, ' ') call add_default ('MPDI2P ', 1, ' ') call add_default ('MNUCCTO ', 1, ' ') call add_default ('MNUCCRO ', 1, ' ') call add_default ('MNUCCCO ', 1, ' ') call add_default ('MELTSDT ', 1, ' ') call add_default ('MELTO ', 1, ' ') call add_default ('MACPDT ', 1, ' ') call add_default ('MACPDQ ', 1, ' ') call add_default ('MACPDLIQ ', 1, ' ') call add_default ('MACPDICE ', 1, ' ') call add_default ('HOMOO ', 1, ' ') call add_default ('FRZRDT ', 1, ' ') call add_default ('CMEIOUT ', 1, ' ') call add_default ('CLDVAPADJ', 1, ' ') call add_default ('CLDLIQLIM', 1, ' ') call add_default ('CLDLIQDET', 1, ' ') call add_default ('CLDLIQADJ', 1, ' ') call add_default ('CLDICELIM', 1, ' ') call add_default ('CLDICEDET', 1, ' ') call add_default ('CLDICEADJ', 1, ' ') call add_default ('BERGSO ', 1, ' ') call add_default ('BERGO ', 1, ' ') call add_default ('DPDLFLIQ ', 1, ' ') call add_default ('DPDLFICE ', 1, ' ') call add_default ('SHDLFLIQ ', 1, ' ') call add_default ('SHDLFICE ', 1, ' ') call add_default ('DPDLFT ', 1, ' ') call add_default ('SHDLFT ', 1, ' ') end if end if ! Averaging for cloud particle number and size call addfld ('AWNC ', 'm-3 ', pver, 'A', 'Average cloud water number conc' ,phys_decomp) call addfld ('AWNI ', 'm-3 ', pver, 'A', 'Average cloud ice number conc' ,phys_decomp) call addfld ('AREL ', 'Micron ', pver, 'A', 'Average droplet effective radius' ,phys_decomp) call addfld ('AREI ', 'Micron ', pver, 'A', 'Average ice effective radius' ,phys_decomp) ! Frequency arrays for above call addfld ('FREQL ', 'fraction', pver, 'A', 'Fractional occurance of liquid' ,phys_decomp) call addfld ('FREQI ', 'fraction', pver, 'A', 'Fractional occurance of ice' ,phys_decomp) if( history_microphysics) then call add_default ('CDNUMC ', 1, ' ') call add_default ('IWC ', 1, ' ') call add_default ('WSUB ', 1, ' ') call add_default ('FREQL ', 1, ' ') call add_default ('FREQI ', 1, ' ') call add_default ('AREI ', 1, ' ') call add_default ('AREL ', 1, ' ') call add_default ('AWNC ', 1, ' ') call add_default ('AWNI ', 1, ' ') endif ! Average cloud top particle size and number (liq, ice) and frequency call addfld ('ACTREL ', 'Micron ', 1, 'A', 'Average Cloud Top droplet effective radius' ,phys_decomp) call addfld ('ACTREI ', 'Micron ', 1, 'A', 'Average Cloud Top ice effective radius' ,phys_decomp) call addfld ('ACTNL ', 'Micron ', 1, 'A', 'Average Cloud Top droplet number' ,phys_decomp) call addfld ('ACTNI ', 'Micron ', 1, 'A', 'Average Cloud Top ice number' ,phys_decomp) call addfld ('FCTL ', 'fraction', 1, 'A', 'Fractional occurance of cloud top liquid' ,phys_decomp) call addfld ('FCTI ', 'fraction', 1, 'A', 'Fractional occurance of cloud top ice' ,phys_decomp) call add_default ('ICWMR', 1, ' ') call add_default ('ICIMR', 1, ' ') #ifdef MODAL_AERO ! Add dropmixnuc tendencies for all modal aerosol species do m = 1, ntot_amode do lphase = 1, 2 do lspec = 0, nspec_amode(m)+1 ! loop over number + chem constituents + water unit = 'kg/m2/s' if (lspec == 0) then ! number unit = '#/m2/s' if (lphase == 1) then l = numptr_amode(m) else l = numptrcw_amode(m) endif else if (lspec <= nspec_amode(m)) then ! non-water mass if (lphase == 1) then l = lmassptr_amode(lspec,m) else l = lmassptrcw_amode(lspec,m) endif else ! water mass cycle end if if (lphase == 1) then tmpname = cnst_name(l) else tmpname = cnst_name_cw(l) end if fieldname = trim(tmpname) // '_mixnuc1' long_name = trim(tmpname) // ' dropmixnuc mixnuc column tendency' call addfld( fieldname, unit, 1, 'A', long_name, phys_decomp ) if ( history_aerosol ) then call add_default( fieldname, 1, ' ' ) if ( masterproc ) write(*,'(2a)') 'stratiform_init addfld - ', fieldname endif end do ! lspec end do ! lphase end do ! m #endif return end subroutine stratiform_init !============================================================================ ! ! ! !============================================================================ ! subroutine stratiform_tend( & 1,234 state, ptend_all, dtime, icefrac, landfrac, & ocnfrac, landm, snowh, & #ifdef MODAL_AERO cflx, & #endif dlf, dlf2, rliq, cmfmc, cmfmc2, ts, & sst, zdu, prec_str, snow_str, prec_sed, & snow_sed, prec_pcw, snow_pcw, pbuf, state_eq ) !-------------------------------------------------------- ! ! ! ! Purpose: ! ! ! ! Interface to sedimentation, detrain, cloud fraction and ! ! cloud macro - microphysics subroutines ! ! ! ! Author: D.B. Coleman ! ! Date: Apr 2004 ! ! ! !-------------------------------------------------------- ! use shr_kind_mod, only: r8 => shr_kind_r8 use ppgrid use cloud_fraction, only: cldfrc use physics_types, only: physics_state, physics_ptend, physics_tend use physics_types, only: physics_ptend_init, physics_update, physics_tend_init use physics_types, only: physics_ptend_sum, physics_state_copy use cam_history, only: outfld use phys_buffer, only: pbuf_size_max, pbuf_fld, pbuf_old_tim_idx, pbuf_get_fld_idx use constituents, only: cnst_get_ind, pcnst use pkg_cld_sediment, only: cld_sediment_vel, cld_sediment_tend use cldwat, only: pcond, cldwat_fice use cldwat2m_micro, only: mmicro_pcond use cldwat2m_macro, only: mmacro_pcond use physconst, only: cpair use rad_constituents, only: rad_cnst_get_clim_info, rad_cnst_get_clim_aer use time_manager, only: is_first_step, get_nstep use pkg_cldoptics, only: cldefr #ifdef MODAL_AERO use modal_aero_data #endif ! Debug use phys_debug_util, only: phys_debug_col ! Debug implicit none ! Debug integer icol ! Debug ! ! Parameters ! real(r8) pnot ! Reference pressure parameter (pnot = 1.e5_r8) ! ! Input arguments ! type(physics_state), intent(in) :: state ! State variables type(physics_ptend), intent(out) :: ptend_all ! Package tendencies type(pbuf_fld), intent(inout), dimension(pbuf_size_max) :: pbuf real(r8), intent(in) :: dtime ! Timestep real(r8), intent(in) :: icefrac (pcols) ! Sea ice fraction (fraction) real(r8), intent(in) :: landfrac(pcols) ! Land fraction (fraction) real(r8), intent(in) :: ocnfrac (pcols) ! Ocean fraction (fraction) real(r8), intent(in) :: landm(pcols) ! Land fraction ramped over water real(r8), intent(in) :: snowh(pcols) ! Snow depth over land, water equivalent (m) #ifdef MODAL_AERO real(r8), intent(in) :: cflx(pcols,pcnst) ! Constituent flux from surface #endif real(r8), intent(in) :: dlf(pcols,pver) ! Detrained water from convection schemes real(r8), intent(in) :: dlf2(pcols,pver) ! Detrained water from shallow convection scheme real(r8), intent(in) :: rliq(pcols) ! Vertical integral of liquid not yet in q(ixcldliq) real(r8), intent(in) :: cmfmc(pcols,pverp) ! Deep + Shallow Convective mass flux [ kg /s/m^2 ] real(r8), intent(in) :: cmfmc2(pcols,pverp) ! Shallow convective mass flux [ kg/s/m^2 ] real(r8), intent(in) :: ts(pcols) ! Surface temperature real(r8), intent(in) :: sst(pcols) ! Sea surface temperature real(r8), intent(in) :: zdu(pcols,pver) ! Detrainment rate from deep convection real(r8), intent(out) :: prec_str(pcols) ! [Total] Sfc flux of precip from stratiform [ m/s ] real(r8), intent(out) :: snow_str(pcols) ! [Total] Sfc flux of snow from stratiform [ m/s ] real(r8), intent(out) :: prec_sed(pcols) ! Surface flux of total cloud water from sedimentation real(r8), intent(out) :: snow_sed(pcols) ! Surface flux of cloud ice from sedimentation real(r8), intent(out) :: prec_pcw(pcols) ! Sfc flux of precip from microphysics [ m/s ] real(r8), intent(out) :: snow_pcw(pcols) ! Sfc flux of snow from microphysics [ m/s ] ! Equilibrium state variables at the end of macrophysics ! Below 'state_eq' is for future use as the input of radiation'PBL scheme type(physics_state), intent(out) :: state_eq ! Equilibrium state variables at the end of macrophysics ! ! Local variables ! type(physics_state) :: state1 ! Local copy of the state variable type(physics_tend ) :: tend ! Physics tendencies (empty, needed for physics_update call) type(physics_ptend) :: ptend_loc ! Package tendencies integer i,k,m integer :: lchnk ! Chunk identifier integer :: ncol ! Number of atmospheric columns integer :: conv_water_in_rad ! Physics buffer fields integer itim, ifld real(r8), pointer, dimension(:,:) :: rhdfda ! real(r8), pointer, dimension(:,:) :: rhu00 ! real(r8), pointer, dimension(:,:) :: qcwat ! Cloud water old q real(r8), pointer, dimension(:,:) :: tcwat ! Cloud water old temperature real(r8), pointer, dimension(:,:) :: lcwat ! Cloud liquid water old q real(r8), pointer, dimension(:,:) :: iccwat ! Cloud ice water old q real(r8), pointer, dimension(:,:) :: nlwat ! Cloud liquid droplet number condentration. old. real(r8), pointer, dimension(:,:) :: niwat ! Cloud ice droplet number condentration. old. real(r8), pointer, dimension(:,:) :: CC_T ! Grid-mean microphysical tendency real(r8), pointer, dimension(:,:) :: CC_qv ! Grid-mean microphysical tendency real(r8), pointer, dimension(:,:) :: CC_ql ! Grid-mean microphysical tendency real(r8), pointer, dimension(:,:) :: CC_qi ! Grid-mean microphysical tendency real(r8), pointer, dimension(:,:) :: CC_nl ! Grid-mean microphysical tendency real(r8), pointer, dimension(:,:) :: CC_ni ! Grid-mean microphysical tendency real(r8), pointer, dimension(:,:) :: CC_qlst ! In-liquid stratus microphysical tendency real(r8), pointer, dimension(:,:) :: cld ! Total cloud fraction real(r8), pointer, dimension(:,:) :: ast ! Relative humidity cloud fraction real(r8), pointer, dimension(:,:) :: aist ! Physical ice stratus fraction real(r8), pointer, dimension(:,:) :: alst ! Physical liquid stratus fraction real(r8), pointer, dimension(:,:) :: qist ! Physical in-cloud IWC real(r8), pointer, dimension(:,:) :: qlst ! Physical in-cloud LWC real(r8), pointer, dimension(:,:) :: concld ! Convective cloud fraction real(r8), pointer, dimension(:,:) :: qme real(r8), pointer, dimension(:,:) :: prain ! Total precipitation (rain + snow) real(r8), pointer, dimension(:,:) :: nevapr ! Evaporation of total precipitation (rain + snow) real(r8), pointer, dimension(:,:) :: rel ! Liquid effective drop radius (microns) real(r8), pointer, dimension(:,:) :: rei ! Ice effective drop size (microns) real(r8), pointer, dimension(:,:) :: rel2 ! Liquid effective drop radius (microns) real(r8), pointer, dimension(:,:) :: rei2 ! Ice effective drop size (microns) real(r8), pointer, dimension(:,:) :: cldo ! Old cloud fraction real(r8), pointer, dimension(:,:) :: kkvh ! Vertical eddy diffusivity real(r8), pointer, dimension(:,:) :: wsedl ! Sedimentation velocity of liquid stratus cloud droplet [ m/s ] #ifdef MODAL_AERO real(r8), pointer, dimension(:,:,:) :: qqcw ! Cloud-borne aerosol real(r8), pointer, dimension(:,:,:) :: dgnumwet ! Number mode diameter real(r8), pointer, dimension(:,:,:) :: dgnum ! Number mode diameter real(r8), pointer, dimension(:,:) :: rate1ord_cw2pr_st ! 1st order rate for direct conversion of ! strat. cloud water to precip (1/s) ! rce 2010/05/01 #endif real(r8) :: shfrc(pcols,pver) ! Cloud fraction from shallow convection scheme real(r8), pointer, dimension(:,:) :: rel_fn ! Ice effective drop size at fixed number (indirect effect) (microns) ! physics buffer fields for radiation real(r8), pointer, dimension(:,:) :: dei ! Ice effective diameter (meters) (AG: microns?) real(r8), pointer, dimension(:,:) :: mu ! Size distribution shape parameter for radiation real(r8), pointer, dimension(:,:) :: lambdac ! Size distribution slope parameter for radiation real(r8), pointer, dimension(:,:) :: iciwp ! In-cloud ice water path for radiation real(r8), pointer, dimension(:,:) :: iclwp ! In-cloud liquid water path for radiation ! For rrtm optics. specificed distribution. real(r8) :: mucon ! Convective size distribution shape parameter real(r8) :: dcon ! Convective size distribution effective radius (meters) real(r8) :: lamcon ! Convective size distribution slope parameter (meters-1) real(r8) :: deicon ! Convective ice effective diameter (meters) ! Physics buffer fields real(r8), pointer, dimension(:,:) :: deiconv ! Ice effective diameter (microns) real(r8), pointer, dimension(:,:) :: muconv ! Size distribution shape parameter for radiation real(r8), pointer, dimension(:,:) :: lambdaconv ! Size distribution slope parameter for radiation real(r8), pointer, dimension(:,:) :: iciwpst ! Stratiform in-cloud ice water path for radiation real(r8), pointer, dimension(:,:) :: iclwpst ! Stratiform in-cloud liquid water path for radiation real(r8), pointer, dimension(:,:) :: iciwpconv ! Convective in-cloud ice water path for radiation real(r8), pointer, dimension(:,:) :: iclwpconv ! Convective in-cloud liquid water path for radiation real(r8), pointer, dimension(:,:) :: tke ! TKE from the moist PBL scheme real(r8), pointer, dimension(:,:) :: turbtype ! Turbulence type from the moist PBL scheme real(r8), pointer, dimension(:,:) :: smaw ! Instability function of momentum from the moist PBL scheme ! Convective cloud to the physics buffer for purposes of ql contrib. to radn. real(r8), pointer, dimension(:,:) :: concld_ql ! Convective cloud real(r8), pointer, dimension(:,:) :: fice_ql ! Cloud ice/water partitioning ratio. ! Local variables for in-cloud water quantities adjusted for convective water real(r8) allcld_ice (pcols,pver) ! All-cloud cloud ice real(r8) allcld_liq (pcols,pver) ! All-cloud liquid ! Snow real(r8), pointer, dimension(:,:) :: cldfsnow ! Cloud fraction for liquid+snow real(r8), pointer, dimension(:,:) :: icswp ! In-cloud snow water path real(r8), pointer, dimension(:,:) :: des ! Snow effective diameter (m) real(r8) qsout(pcols,pver) ! Snow mixing ratio ! Local variables for stratiform_sediment real(r8) rain(pcols) ! Surface flux of cloud liquid real(r8) pvliq(pcols,pver+1) ! Vertical velocity of cloud liquid drops (Pa/s) real(r8) pvice(pcols,pver+1) ! Vertical velocity of cloud ice particles (Pa/s) ! Local variables for cldfrc real(r8) cldst(pcols,pver) ! Stratus cloud fraction real(r8) rhcloud(pcols,pver) ! Relative humidity cloud (last timestep) real(r8) rhcloud2(pcols,pver) ! Relative humidity cloud (perturbation) real(r8) clc(pcols) ! Column convective cloud amount real(r8) relhum(pcols,pver) ! RH, output to determine drh/da real(r8) rhu002(pcols,pver) ! Same as rhu00 but for perturbed rh real(r8) cld2(pcols,pver) ! Same as cld but for perturbed rh real(r8) concld2(pcols,pver) ! Same as concld but for perturbed rh real(r8) cldst2(pcols,pver) ! Same as cldst but for perturbed rh real(r8) relhum2(pcols,pver) ! RH after perturbation real(r8) icecldf(pcols,pver) ! Ice cloud fraction real(r8) liqcldf(pcols,pver) ! Liquid cloud fraction (combined into cloud) real(r8) icecldf_out(pcols,pver) ! Ice cloud fraction real(r8) liqcldf_out(pcols,pver) ! Liquid cloud fraction (combined into cloud) real(r8) icecldf2(pcols,pver) ! Ice cloud fraction real(r8) liqcldf2(pcols,pver) ! Liquid cloud fraction (combined into cloud) ! Local variables for microphysics real(r8) rdtime ! 1./dtime real(r8) qtend(pcols,pver) ! Moisture tendencies real(r8) ttend(pcols,pver) ! Temperature tendencies real(r8) ltend(pcols,pver) ! Cloud liquid water tendencies real(r8) evapheat(pcols,pver) ! Heating rate due to evaporation of precip real(r8) evapsnow(pcols,pver) ! Local evaporation of snow real(r8) prfzheat(pcols,pver) ! Heating rate due to freezing of precip (W/kg) real(r8) meltheat(pcols,pver) ! Heating rate due to phase change of precip real(r8) cmeheat (pcols,pver) ! Heating rate due to phase change of precip real(r8) prodsnow(pcols,pver) ! Local production of snow real(r8) totcw(pcols,pver) ! Total cloud water mixing ratio real(r8) fice(pcols,pver) ! Fractional ice content within cloud real(r8) fsnow(pcols,pver) ! Fractional snow production real(r8) repartht(pcols,pver) ! Heating rate due to phase repartition of input precip real(r8) icimr(pcols,pver) ! In cloud ice mixing ratio real(r8) icwmr(pcols,pver) ! In cloud water mixing ratio real(r8) icimrst(pcols,pver) ! In stratus ice mixing ratio real(r8) icwmrst(pcols,pver) ! In stratus water mixing ratio real(r8) icimrst_out(pcols,pver) ! In stratus ice mixing ratio real(r8) icwmrst_out(pcols,pver) ! In stratus water mixing ratio real(r8) fwaut(pcols,pver) real(r8) fsaut(pcols,pver) real(r8) fracw(pcols,pver) real(r8) fsacw(pcols,pver) real(r8) fsaci(pcols,pver) real(r8) cmeice(pcols,pver) ! Rate of cond-evap of ice within the cloud real(r8) cmeliq(pcols,pver) ! Rate of cond-evap of liq within the cloud real(r8) ice2pr(pcols,pver) ! Rate of conversion of ice to precip real(r8) liq2pr(pcols,pver) ! Rate of conversion of liquid to precip real(r8) liq2snow(pcols,pver) ! Rate of conversion of liquid to snow real(r8) temp(pcols) real(r8) res(pcols,pver) real(r8) droprad ! Radius of droplets detrained from cumulus (m) real(r8) invdropmass ! Inverse of mean droplet mass (#/kg) ! MG micro diagnostics real(r8) qcsevap(pcols,pver) ! Evaporation of falling cloud water real(r8) qisevap(pcols,pver) ! Sublimation of falling cloud ice real(r8) qvres(pcols,pver) ! Residual condensation term to remove excess saturation real(r8) cmeiout(pcols,pver) ! Deposition/sublimation rate of cloud ice real(r8) vtrmc(pcols,pver) ! Mass-weighted cloud water fallspeed real(r8) vtrmi(pcols,pver) ! Mass-weighted cloud ice fallspeed real(r8) qcsedten(pcols,pver) ! Cloud water mixing ratio tendency from sedimentation real(r8) qisedten(pcols,pver) ! Cloud ice mixing ratio tendency from sedimentation real(r8) prao(pcols,pver) real(r8) prco(pcols,pver) real(r8) mnuccco(pcols,pver) real(r8) mnuccto(pcols,pver) real(r8) msacwio(pcols,pver) real(r8) psacwso(pcols,pver) real(r8) bergso(pcols,pver) real(r8) bergo(pcols,pver) real(r8) melto(pcols,pver) real(r8) homoo(pcols,pver) real(r8) qcreso(pcols,pver) real(r8) prcio(pcols,pver) real(r8) praio(pcols,pver) real(r8) qireso(pcols,pver) real(r8) ftem(pcols,pver) real(r8) mnuccro(pcols,pver) real(r8) pracso (pcols,pver) real(r8) meltsdt(pcols,pver) real(r8) frzrdt (pcols,pver) real(r8) dpdlfliq(pcols,pver) real(r8) dpdlfice(pcols,pver) real(r8) shdlfliq(pcols,pver) real(r8) shdlfice(pcols,pver) real(r8) dpdlft (pcols,pver) real(r8) shdlft (pcols,pver) #ifdef MODAL_AERO integer l, lnum, lnumcw, lmass, lmasscw #endif ! Variables for MG microphysics real(r8) dum1,dum2 real(r8) qc(pcols,pver) real(r8) qi(pcols,pver) real(r8) nc(pcols,pver) real(r8) ni(pcols,pver) real(r8) icinc(pcols,pver) ! In cloud ice number conc real(r8) cdnumc(pcols) ! Vertically-integrated droplet concentration real(r8) icwnc(pcols,pver) ! In cloud water number conc real(r8) iwc(pcols,pver) ! Grid box average ice water content real(r8) lwc(pcols,pver) ! Grid box average liquid water content real(r8) effliq(pcols,pver) ! In cloud liq eff rad real(r8) effice(pcols,pver) ! In cloud ice eff rad real(r8) effliq_fn(pcols,pver) ! In cloud liq eff rad at fixed number concentration real(r8) wsub(pcols,pver) ! Sub-grid vertical velocity (m/s) real(r8) wsubi(pcols,pver) ! Sub-grid vertical velocity for ice (m/s) ! Output from mmicro_pcond real(r8) tlat(pcols,pver) real(r8) qvlat(pcols,pver) real(r8) qcten(pcols,pver) real(r8) qiten(pcols,pver) real(r8) ncten(pcols,pver) real(r8) niten(pcols,pver) real(r8) effc(pcols,pver) real(r8) effc_fn(pcols,pver) ! Liquid effective radius at fixed number (for indirect calc) real(r8) effi(pcols,pver) real(r8) prect(pcols) real(r8) preci(pcols) ! Output from mmacro_pcond real(r8) qvadj(pcols,pver) ! Macro-physics adjustment tendency from "positive_moisture" call (vapor) real(r8) qladj(pcols,pver) ! Macro-physics adjustment tendency from "positive_moisture" call (liquid) real(r8) qiadj(pcols,pver) ! Macro-physics adjustment tendency from "positive_moisture" call (ice) real(r8) qllim(pcols,pver) ! Macro-physics tendency from "instratus_condensate" call (liquid) real(r8) qilim(pcols,pver) ! Macro-physics tendency from "instratus_condensate" call (ice) ! Averaging arrays for effective radius and number.... real(r8) efiout(pcols,pver) real(r8) efcout(pcols,pver) real(r8) ncout(pcols,pver) real(r8) niout(pcols,pver) real(r8) freqi(pcols,pver) real(r8) freql(pcols,pver) ! Average cloud top radius & number real(r8) ctrel(pcols) real(r8) ctrei(pcols) real(r8) ctnl(pcols) real(r8) ctni(pcols) real(r8) fcti(pcols) real(r8) fctl(pcols) ! Gather mass mixing ratio for all aerosols affecting the climate integer :: naer_all real(r8), pointer :: aermmr1(:,:) real(r8), allocatable :: aer_mmr(:,:,:) ! Aerosol mass mixing ratio ! For revised macophysics, mmacro_pcond real(r8) itend(pcols,pver) real(r8) lmitend(pcols,pver) real(r8) zeros(pcols,pver) real(r8) t_inout(pcols,pver) real(r8) qv_inout(pcols,pver) real(r8) ql_inout(pcols,pver) real(r8) qi_inout(pcols,pver) real(r8) prsed(pcols,pver) real(r8) pssed(pcols,pver) real(r8) ersed(pcols,pver) real(r8) essed(pcols,pver) real(r8) alst_mic(pcols,pver) real(r8) aist_mic(pcols,pver) real(r8) concld_old(pcols,pver) real(r8) nl_inout(pcols,pver) real(r8) ni_inout(pcols,pver) real(r8) dum1D(pcols) real(r8) nltend(pcols,pver) real(r8) nitend(pcols,pver) real(r8) zero1D(pcols) real(r8) t_out(pcols,pver) real(r8) qv_out(pcols,pver) real(r8) ql_out(pcols,pver) real(r8) qi_out(pcols,pver) real(r8) nl_out(pcols,pver) real(r8) ni_out(pcols,pver) real(r8) QQw(pcols,pver) real(r8) QQi(pcols,pver) real(r8) QQnl(pcols,pver) real(r8) QQni(pcols,pver) ! For detraining cumulus condensate into the 'stratus' without evaporation ! This is for use in mmacro_pcond real(r8) dlf_T(pcols,pver) real(r8) dlf_qv(pcols,pver) real(r8) dlf_ql(pcols,pver) real(r8) dlf_qi(pcols,pver) real(r8) dlf_nl(pcols,pver) real(r8) dlf_ni(pcols,pver) real(r8) rel_detcu real(r8) rei_detcu ! ====================================================================== lchnk = state%lchnk ncol = state%ncol call phys_getopts( conv_water_in_rad_out = conv_water_in_rad ) call physics_state_copy(state,state1) ! Copy state to local state1. call physics_ptend_init(ptend_loc) ! Initialize local ptend type call physics_ptend_init(ptend_all) ! Initialize output ptend type call physics_tend_init(tend) ! tend here is just a null place holder ! Associate pointers with physics buffer fields itim = pbuf_old_tim_idx() ifld = pbuf_get_fld_idx('QCWAT') qcwat => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ifld = pbuf_get_fld_idx('RHDFDA') rhdfda => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ifld = pbuf_get_fld_idx('RHU00') rhu00 => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ifld = pbuf_get_fld_idx('TCWAT') tcwat => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ifld = pbuf_get_fld_idx('LCWAT') lcwat => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ifld = pbuf_get_fld_idx('ICCWAT') iccwat => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ifld = pbuf_get_fld_idx('NLWAT') nlwat => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ifld = pbuf_get_fld_idx('NIWAT') niwat => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ifld = pbuf_get_fld_idx('CC_T') CC_T => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ifld = pbuf_get_fld_idx('CC_qv') CC_qv => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ifld = pbuf_get_fld_idx('CC_ql') CC_ql => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ifld = pbuf_get_fld_idx('CC_qi') CC_qi => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ifld = pbuf_get_fld_idx('CC_nl') CC_nl => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ifld = pbuf_get_fld_idx('CC_ni') CC_ni => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ifld = pbuf_get_fld_idx('CC_qlst') CC_qlst => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ifld = pbuf_get_fld_idx('CLD') cld => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ifld = pbuf_get_fld_idx('AST') ast => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ifld = pbuf_get_fld_idx('AIST') aist => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ifld = pbuf_get_fld_idx('ALST') alst => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ifld = pbuf_get_fld_idx('QIST') qist => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ifld = pbuf_get_fld_idx('QLST') qlst => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ifld = pbuf_get_fld_idx('CONCLD') concld => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ifld = pbuf_get_fld_idx('CLDO') cldo => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ifld = pbuf_get_fld_idx('REL2') rel2 => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ifld = pbuf_get_fld_idx('REI2') rei2 => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) #ifdef MODAL_AERO ifld = pbuf_get_fld_idx('QQCW') qqcw => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,1:pcnst) ifld = pbuf_get_fld_idx('DGNUMWET') dgnumwet => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,1:maxd_amode) ifld = pbuf_get_fld_idx('DGNUM' ) dgnum => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,1:maxd_amode) ifld = pbuf_get_fld_idx('RATE1_CW2PR_ST') rate1ord_cw2pr_st => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk, 1) if( is_first_step() ) then qqcw(1:pcols,1:pver,1:pcnst) = 1.e-38_r8 dgnumwet(1:pcols,1:pver,1:maxd_amode) = 0.0_r8 dgnum(1:pcols,1:pver,1:maxd_amode) = 0.0_r8 rate1ord_cw2pr_st(1:pcols,1:pver) = 0.0_r8 endif #endif ! For purposes of convective ql. ifld = pbuf_get_fld_idx('CONCLDQL') concld_ql => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,1) ifld = pbuf_get_fld_idx('FICE') fice_ql => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,1) ifld = pbuf_get_fld_idx('QME') qme => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk, 1) ifld = pbuf_get_fld_idx('PRAIN') prain => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk, 1) ifld = pbuf_get_fld_idx('NEVAPR') nevapr => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk, 1) ifld = pbuf_get_fld_idx('REL') rel => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk, 1) ifld = pbuf_get_fld_idx('REI') rei => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk, 1) ifld = pbuf_get_fld_idx('REL_FN') rel_fn => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk, 1) ifld = pbuf_get_fld_idx('KVH') kkvh => pbuf(ifld)%fld_ptr(1,1:pcols,1:pverp,lchnk, 1) ifld = pbuf_get_fld_idx('DEI') dei => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk, 1) ifld = pbuf_get_fld_idx('MU') mu => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk, 1) ifld = pbuf_get_fld_idx('LAMBDAC') lambdac => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk, 1) ifld = pbuf_get_fld_idx('ICIWP') iciwp => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk, 1) ifld = pbuf_get_fld_idx('ICLWP') iclwp => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk, 1) ifld = pbuf_get_fld_idx('DEICONV') deiconv => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk, 1) ifld = pbuf_get_fld_idx('MUCONV') muconv => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk, 1) ifld = pbuf_get_fld_idx('LAMBDACONV') lambdaconv => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk, 1) ifld = pbuf_get_fld_idx('ICIWPST') iciwpst => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk, 1) ifld = pbuf_get_fld_idx('ICLWPST') iclwpst => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk, 1) ifld = pbuf_get_fld_idx('ICIWPCONV') iciwpconv => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk, 1) ifld = pbuf_get_fld_idx('ICLWPCONV') iclwpconv => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk, 1) ifld = pbuf_get_fld_idx('DES') des => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk, 1) ifld = pbuf_get_fld_idx('ICSWP') icswp => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk, 1) ifld = pbuf_get_fld_idx('CLDFSNOW') cldfsnow => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk, itim) ifld = pbuf_get_fld_idx('TKE') tke => pbuf(ifld)%fld_ptr(1,1:pcols,1:pverp,lchnk, 1) ifld = pbuf_get_fld_idx('TURBTYPE') turbtype => pbuf(ifld)%fld_ptr(1,1:pcols,1:pverp,lchnk, 1) ifld = pbuf_get_fld_idx('SMAW') smaw => pbuf(ifld)%fld_ptr(1,1:pcols,1:pverp,lchnk, 1) ifld = pbuf_get_fld_idx('WSEDL') wsedl => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk, 1) ! If first timestep, initialize heatflux....in pbuf at all time levels. if( is_first_step() ) then kkvh(:,:) = 0._r8 tke(:,:) = 0._r8 turbtype(:,:) = 0._r8 smaw(:,:) = 0._r8 endif ! Assign default size distribution parameters for no-stratiform clouds (convection only) ! Also put into physics buffer for possible separate use by radiation dcon = 25.e-6_r8 mucon = 5.3_r8 deicon = 50._r8 muconv(:,:) = mucon lambdaconv(:,:) = (mucon + 1._r8)/dcon deiconv(:,:) = deicon ! Initialize convective detrainment tendency dlf_T(:,:) = 0._r8 dlf_qv(:,:) = 0._r8 dlf_ql(:,:) = 0._r8 dlf_qi(:,:) = 0._r8 dlf_nl(:,:) = 0._r8 dlf_ni(:,:) = 0._r8 ! ------------------------------------- ! ! From here, process computation begins ! ! ------------------------------------- ! ! ------------- ! ! Sedimentation ! ! ------------- ! if( microp_scheme .eq. 'RK' ) then ! Allow the cloud liquid drops and ice particles to sediment. ! This is done before adding convectively detrained cloud water, ! because the phase of the detrained water is unknown. call t_startf('stratiform_sediment') ptend_loc%name = 'pcwsediment' ptend_loc%ls = .TRUE. ptend_loc%lq(1) = .TRUE. ptend_loc%lq(ixcldice) = .TRUE. ptend_loc%lq(ixcldliq) = .TRUE. call cld_sediment_vel( ncol, & icefrac, landfrac, ocnfrac, state1%pmid, state1%pdel, state1%t, & cld, state1%q(:,:,ixcldliq), state1%q(:,:,ixcldice), & pvliq, pvice, landm, snowh ) wsedl(:ncol,:pver) = pvliq(:ncol,:pver)/gravit/(state1%pmid(:ncol,:pver)/(287.15_r8*state1%t(:ncol,:pver))) call cld_sediment_tend( ncol, dtime , & state1%pint, state1%pmid, state1%pdel, state1%t, & cld, state1%q(:,:,ixcldliq), state1%q(:,:,ixcldice), pvliq, pvice, & ptend_loc%q(:,:,ixcldliq), ptend_loc%q(:,:,ixcldice), ptend_loc%q(:,:,1), & ptend_loc%s, rain, snow_sed ) ! Convert rain and snow fluxes at the surface from [kg/m2/s] to [m/s] ! Compute total precipitation flux at the surface in [m/s] snow_sed(:ncol) = snow_sed(:ncol)/1000._r8 rain(:ncol) = rain(:ncol)/1000._r8 prec_sed(:ncol) = rain(:ncol) + snow_sed(:ncol) ! Record history variables lchnk = state1%lchnk call outfld( 'DQSED' ,ptend_loc%q(:,:,1) , pcols,lchnk ) call outfld( 'DISED' ,ptend_loc%q(:,:,ixcldice), pcols,lchnk ) call outfld( 'DLSED' ,ptend_loc%q(:,:,ixcldliq), pcols,lchnk ) call outfld( 'HSED' ,ptend_loc%s , pcols,lchnk ) call outfld( 'PRECSED' ,prec_sed , pcols,lchnk ) call outfld( 'SNOWSED' ,snow_sed , pcols,lchnk ) call outfld( 'RAINSED' ,rain , pcols,lchnk ) ! Add tendency from this process to tend from other processes here call physics_ptend_sum( ptend_loc, ptend_all, state ) ! Update physics state type state1 with ptend_loc call physics_update( state1, tend, ptend_loc, dtime ) call physics_ptend_init( ptend_loc ) call t_stopf('stratiform_sediment') ! Accumulate prec and snow flux at the surface [ m/s ] prec_str(:ncol) = prec_sed(:ncol) snow_str(:ncol) = snow_sed(:ncol) endif ! End of 'Sediment' ! ----------------------------------------------------------------------------- ! ! Detrainment of convective condensate into the environment or stratiform cloud ! ! ----------------------------------------------------------------------------- ! ptend_loc%name = 'pcwdetrain' if( microp_scheme .eq. 'MG' ) then ptend_loc%lq(ixcldliq) = .TRUE. ptend_loc%lq(ixcldice) = .TRUE. ptend_loc%lq(ixnumliq) = .TRUE. ptend_loc%lq(ixnumice) = .TRUE. ptend_loc%ls = .TRUE. ! Procedures : ! (1) Partition detrained convective cloud water into liquid and ice based on T. ! This also involves heating. ! If convection scheme can handle this internally, this step is not necssary. ! (2) Assuming a certain effective droplet radius, computes number concentration ! of detrained convective cloud liquid and ice. ! (3) If 'cu_det_st = .true' ('false'), detrain convective cloud 'liquid' into ! the pre-existing 'liquid' stratus ( mean environment ). The former does ! not involve any macrophysical evaporation while the latter does. This is ! a kind of 'targetted' deposition. Then, force in-stratus LWC to be bounded ! by qcst_min and qcst_max in mmacro_pcond. ! (4) In contrast to liquid, convective ice is detrained into the environment ! and involved in the sublimation. Similar bounds as liquid stratus are imposed. ! This is the key procesure generating upper-level cirrus clouds. ! The unit of dlf : [ kg/kg/s ] do k = 1, pver do i = 1, state1%ncol if( state1%t(i,k) > 268.15_r8 ) then dum1 = 0.0_r8 elseif( state1%t(i,k) < 238.15_r8 ) then dum1 = 1.0_r8 else dum1 = ( 268.15_r8 - state1%t(i,k) ) / 30._r8 endif ptend_loc%q(i,k,ixcldliq) = dlf(i,k) * ( 1._r8 - dum1 ) ptend_loc%q(i,k,ixcldice) = dlf(i,k) * dum1 ! dum2 = dlf(i,k) * ( 1._r8 - dum1 ) ptend_loc%q(i,k,ixnumliq) = 3._r8 * ( max(0._r8, ( dlf(i,k) - dlf2(i,k) )) * ( 1._r8 - dum1 ) ) / (4._r8*3.14_r8* 8.e-6_r8**3*997._r8) + & ! Deep Convection 3._r8 * ( dlf2(i,k) * ( 1._r8 - dum1 ) ) / (4._r8*3.14_r8*10.e-6_r8**3*997._r8) ! Shallow Convection ! dum2 = dlf(i,k) * dum1 ptend_loc%q(i,k,ixnumice) = 3._r8 * ( max(0._r8, ( dlf(i,k) - dlf2(i,k) )) * dum1 ) / (4._r8*3.14_r8*25.e-6_r8**3*500._r8) + & ! Deep Convection 3._r8 * ( dlf2(i,k) * dum1 ) / (4._r8*3.14_r8*50.e-6_r8**3*500._r8) ! Shallow Convection ptend_loc%s(i,k) = dlf(i,k) * dum1 * latice ! Targetted detrainment of convective liquid water either directly into the ! existing liquid stratus or into the environment. if( cu_det_st ) then dlf_T(i,k) = ptend_loc%s(i,k)/cpair dlf_qv(i,k) = 0._r8 dlf_ql(i,k) = ptend_loc%q(i,k,ixcldliq) dlf_qi(i,k) = ptend_loc%q(i,k,ixcldice) dlf_nl(i,k) = ptend_loc%q(i,k,ixnumliq) dlf_ni(i,k) = ptend_loc%q(i,k,ixnumice) ptend_loc%q(i,k,ixcldliq) = 0._r8 ptend_loc%q(i,k,ixcldice) = 0._r8 ptend_loc%q(i,k,ixnumliq) = 0._r8 ptend_loc%q(i,k,ixnumice) = 0._r8 ptend_loc%s(i,k) = 0._r8 dpdlfliq(i,k) = 0._r8 dpdlfice(i,k) = 0._r8 shdlfliq(i,k) = 0._r8 shdlfice(i,k) = 0._r8 dpdlft (i,k) = 0._r8 shdlft (i,k) = 0._r8 else dpdlfliq(i,k) = ( dlf(i,k) - dlf2(i,k) ) * ( 1._r8 - dum1 ) dpdlfice(i,k) = ( dlf(i,k) - dlf2(i,k) ) * ( dum1 ) shdlfliq(i,k) = dlf2(i,k) * ( 1._r8 - dum1 ) shdlfice(i,k) = dlf2(i,k) * ( dum1 ) dpdlft (i,k) = ( dlf(i,k) - dlf2(i,k) ) * dum1 * latice/cpair shdlft (i,k) = dlf2(i,k) * dum1 * latice/cpair endif end do end do call outfld( 'DPDLFLIQ ', dpdlfliq, pcols, lchnk ) call outfld( 'DPDLFICE ', dpdlfice, pcols, lchnk ) call outfld( 'SHDLFLIQ ', shdlfliq, pcols, lchnk ) call outfld( 'SHDLFICE ', shdlfice, pcols, lchnk ) call outfld( 'DPDLFT ', dpdlft , pcols, lchnk ) call outfld( 'SHDLFT ', shdlft , pcols, lchnk ) else if ( microp_scheme .eq. 'RK' ) then ! Put all of the detraining cloud water from convection into the large scale cloud. ! It all goes in liquid for the moment. ! Strictly speaking, this approach is detraining all the cconvective water into ! the environment, not the large-scale cloud. ptend_loc%lq(ixcldliq) = .TRUE. do k = 1, pver do i = 1, state1%ncol ptend_loc%q(i,k,ixcldliq) = dlf(i,k) end do end do end if call outfld( 'ZMDLF', dlf, pcols, state1%lchnk ) ! Add hie detrainment tendency to tend from the other prior processes call physics_ptend_sum( ptend_loc, ptend_all, state ) call physics_update( state1, tend, ptend_loc, dtime ) call physics_ptend_init( ptend_loc ) ! Accumulate prec and snow, reserved liquid has now been used. ! For MG, this is performed later. if( microp_scheme .eq. 'RK' ) then prec_str(:ncol) = prec_str(:ncol) - rliq(:ncol) ! ( snow contribution is zero ) endif ! -------------------------------------- ! ! Computation of Various Cloud Fractions ! ! -------------------------------------- ! ! ----------------------------------------------------------------------------- ! ! Treatment of cloud fraction in CAM4 and CAM5 differs ! ! (1) CAM4 ! ! . Cumulus AMT = Deep Cumulus AMT ( empirical fcn of mass flux ) + ! ! Shallow Cumulus AMT ( empirical fcn of mass flux ) ! ! . Stratus AMT = max( RH stratus AMT, Stability Stratus AMT ) ! ! . Cumulus and Stratus are 'minimally' overlapped without hierarchy. ! ! . Cumulus LWC,IWC is assumed to be the same as Stratus LWC,IWC ! ! (2) CAM5 ! ! . Cumulus AMT = Deep Cumulus AMT ( empirical fcn of mass flux ) + ! ! Shallow Cumulus AMT ( internally fcn of mass flux and w ) ! ! . Stratus AMT = fcn of environmental-mean RH ( no Stability Stratus ) ! ! . Cumulus and Stratus are non-overlapped with higher priority on Cumulus ! ! . Cumulus ( both Deep and Shallow ) has its own LWC and IWC. ! ! ----------------------------------------------------------------------------- ! concld_old(:ncol,:pver) = concld(:ncol,:pver) if( use_shfrc ) then ifld = pbuf_get_fld_idx('shfrc') shfrc(:pcols,:pver) = pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,1) else shfrc(:,:) = 0._r8 endif ! CAM5 only uses 'concld' output from the below subroutine. ! Stratus ('ast' = max(alst,aist)) and total cloud fraction ('cld = ast + concld') ! will be computed using this updated 'concld' in the stratiform macrophysics ! scheme (mmacro_pcond) later below. ! Note 'shfrc' and' deep convective cloud fraction' will be saved into the ! physical buffer (SH_FRAC,DP_FRAC) within cldfrc. call t_startf("cldfrc") call cldfrc( lchnk, ncol, pbuf, & state1%pmid, state1%t, state1%q(:,:,1), state1%omega, state1%phis, & shfrc, use_shfrc, & cld, rhcloud, clc, state1%pdel, & cmfmc, cmfmc2, landfrac,snowh, concld, cldst, & ts, sst, state1%pint(:,pverp), zdu, ocnfrac, rhu00, & state1%q(:,:,ixcldice), icecldf, liqcldf, & relhum, 0 ) ! Re-calculate cloud with perturbed rh add call cldfrc call cldfrc( lchnk, ncol, pbuf, & state1%pmid, state1%t, state1%q(:,:,1), state1%omega, state1%phis, & shfrc, use_shfrc, & cld2, rhcloud2, clc, state1%pdel, & cmfmc, cmfmc2, landfrac, snowh, concld2, cldst2, & ts, sst, state1%pint(:,pverp), zdu, ocnfrac, rhu002, & state1%q(:,:,ixcldice), icecldf2, liqcldf2, & relhum2, 1 ) call t_stopf("cldfrc") ! Add following to estimate rhdfda. Below block is only for CAM4 rhu00(:ncol,1) = 2.0_r8 do k = 1, pver do i = 1, ncol if( relhum(i,k) < rhu00(i,k) ) then rhdfda(i,k) = 0.0_r8 elseif( relhum(i,k) >= 1.0_r8 ) then rhdfda(i,k) = 0.0_r8 else ! Under certain circumstances, rh+ cause cld not to changed ! when at an upper limit, or w/ strong subsidence if( ( cld2(i,k) - cld(i,k) ) < 1.e-4_r8 ) then rhdfda(i,k) = 0.01_r8*relhum(i,k)*1.e+4_r8 else rhdfda(i,k) = 0.01_r8*relhum(i,k)/(cld2(i,k)-cld(i,k)) endif endif enddo enddo ! ---------------------------------------------- ! ! Stratiform Cloud Macrophysics and Microphysics ! ! ---------------------------------------------- ! call t_startf('stratiform_microphys') lchnk = state1%lchnk ncol = state1%ncol rdtime = 1._r8/dtime ! Define fractional amount of stratus condensate and precipitation in ice phase. ! This uses a ramp ( -30 ~ -10 for fice, -5 ~ 0 for fsnow ). ! The ramp within convective cloud may be different call cldwat_fice( ncol, state1%t, fice, fsnow ) if( microp_scheme .eq. 'RK' ) then ! Perform repartitioning of stratiform condensate. ! Corresponding heating tendency will be added later. totcw(:ncol,:pver) = state1%q(:ncol,:pver,ixcldice) + state1%q(:ncol,:pver,ixcldliq) repartht(:ncol,:pver) = state1%q(:ncol,:pver,ixcldice) ptend_loc%q(:ncol,:pver,ixcldice) = rdtime * ( totcw(:ncol,:pver)*fice(:ncol,:pver) - state1%q(:ncol,:pver,ixcldice) ) ptend_loc%q(:ncol,:pver,ixcldliq) = rdtime * ( totcw(:ncol,:pver)*(1.0_r8-fice(:ncol,:pver)) - state1%q(:ncol,:pver,ixcldliq) ) call outfld( 'REPARTICE', ptend_loc%q(:,:,ixcldice), pcols, lchnk ) call outfld( 'REPARTLIQ', ptend_loc%q(:,:,ixcldliq), pcols, lchnk ) ptend_loc%name = 'cldwat-repartition' ptend_loc%lq(ixcldice) = .true. ptend_loc%lq(ixcldliq) = .true. call physics_ptend_sum( ptend_loc, ptend_all, state ) call physics_update( state1, tend, ptend_loc, dtime ) call physics_ptend_init( ptend_loc ) endif ptend_loc%name = 'cldwat' ptend_loc%ls = .true. ptend_loc%lq(1) = .true. ptend_loc%lq(ixcldice) = .true. ptend_loc%lq(ixcldliq) = .true. if( microp_scheme .eq. 'MG' ) then ptend_loc%lq(ixnumliq) = .true. ptend_loc%lq(ixnumice) = .true. #ifdef MODAL_AERO do m = 1, ntot_amode lnum = numptr_amode(m) if( lnum > 0 ) then ptend_loc%lq(lnum)= .true. endif do l = 1, nspec_amode(m) lmass = lmassptr_amode(l,m) ptend_loc%lq(lmass)= .true. enddo enddo #endif end if if( microp_scheme .eq. 'RK' ) then ! Determine repartition heating from change in cloud ice. repartht(:ncol,:pver) = (latice/dtime) * ( state1%q(:ncol,:pver,ixcldice) - repartht(:ncol,:pver) ) ! Non-micro and non-macrophysical external advective forcings to compute net condensation rate. ! Note that advective forcing of condensate is aggregated into liquid phase. qtend(:ncol,:pver) = ( state1%q(:ncol,:pver,1) - qcwat(:ncol,:pver) ) * rdtime ttend(:ncol,:pver) = ( state1%t(:ncol,:pver) - tcwat(:ncol,:pver) ) * rdtime ltend(:ncol,:pver) = ( totcw (:ncol,:pver) - lcwat(:ncol,:pver) ) * rdtime ! Compute Stratiform Macro-Microphysical Tendencies call t_startf('pcond') call pcond( lchnk, ncol, & state1%t, ttend, state1%q(1,1,1), qtend, state1%omega, & totcw, state1%pmid , state1%pdel, cld, fice, fsnow, & qme, prain, prodsnow, nevapr, evapsnow, evapheat, prfzheat, & meltheat, prec_pcw, snow_pcw, dtime, fwaut, & fsaut, fracw, fsacw, fsaci, ltend, & rhdfda, rhu00, icefrac, state1%zi, ice2pr, liq2pr, liq2snow, snowh ) call t_stopf('pcond') elseif( microp_scheme .eq. 'MG' ) then ! ------------------------------ ! ! Liquid Stratiform Macrophysics ! ! ------------------------------ ! call t_startf('mmacro_pcond') zeros(:ncol,:pver) = 0._r8 qc(:ncol,:pver) = state1%q(:ncol,:pver,ixcldliq) qi(:ncol,:pver) = state1%q(:ncol,:pver,ixcldice) nc(:ncol,:pver) = state1%q(:ncol,:pver,ixnumliq) ni(:ncol,:pver) = state1%q(:ncol,:pver,ixnumice) ! In CAM5, 'microphysical forcing' ( CC_... ) and 'the other advective forcings' ( ttend, ... ) ! are separately provided into the prognostic stratiform macrophysics scheme. This is an ! attempt to resolve in-cloud and out-cloud forcings. if( get_nstep() .le. 1 ) then tcwat(:ncol,:pver) = state1%t(:ncol,:pver) qcwat(:ncol,:pver) = state1%q(:ncol,:pver,1) lcwat(:ncol,:pver) = qc(:ncol,:pver) + qi(:ncol,:pver) iccwat(:ncol,:pver) = qi(:ncol,:pver) nlwat(:ncol,:pver) = nc(:ncol,:pver) niwat(:ncol,:pver) = ni(:ncol,:pver) ttend(:ncol,:pver) = 0._r8 qtend(:ncol,:pver) = 0._r8 ltend(:ncol,:pver) = 0._r8 itend(:ncol,:pver) = 0._r8 nltend(:ncol,:pver) = 0._r8 nitend(:ncol,:pver) = 0._r8 CC_T(:ncol,:pver) = 0._r8 CC_qv(:ncol,:pver) = 0._r8 CC_ql(:ncol,:pver) = 0._r8 CC_qi(:ncol,:pver) = 0._r8 CC_nl(:ncol,:pver) = 0._r8 CC_ni(:ncol,:pver) = 0._r8 CC_qlst(:ncol,:pver) = 0._r8 else ttend(:ncol,:pver) = ( state1%t(:ncol,:pver) - tcwat(:ncol,:pver)) * rdtime - CC_T(:ncol,:pver) qtend(:ncol,:pver) = ( state1%q(:ncol,:pver,1) - qcwat(:ncol,:pver)) * rdtime - CC_qv(:ncol,:pver) ltend(:ncol,:pver) = ( qc(:ncol,:pver) + qi(:ncol,:pver) - & lcwat(:ncol,:pver) ) * rdtime - (CC_ql(:ncol,:pver) + CC_qi(:ncol,:pver)) itend(:ncol,:pver) = ( qi(:ncol,:pver) - iccwat(:ncol,:pver)) * rdtime - CC_qi(:ncol,:pver) nltend(:ncol,:pver) = ( nc(:ncol,:pver) - nlwat(:ncol,:pver)) * rdtime - CC_nl(:ncol,:pver) nitend(:ncol,:pver) = ( ni(:ncol,:pver) - niwat(:ncol,:pver)) * rdtime - CC_ni(:ncol,:pver) endif lmitend(:ncol,:pver) = ltend(:ncol,:pver) - itend(:ncol,:pver) t_inout(:ncol,:pver) = tcwat(:ncol,:pver) qv_inout(:ncol,:pver) = qcwat(:ncol,:pver) ql_inout(:ncol,:pver) = lcwat(:ncol,:pver) - iccwat(:ncol,:pver) qi_inout(:ncol,:pver) = iccwat(:ncol,:pver) nl_inout(:ncol,:pver) = nlwat(:ncol,:pver) ni_inout(:ncol,:pver) = niwat(:ncol,:pver) ! Liquid Stratiform Macrophysics. ! The main roles of this subroutines are ! (1) compute net condensation rate of strayiform liquid ( cmeliq ) ! (2) compute liquid stratus and ice stratus fractions. ! Note 'ttend...' are advective tendencies except microphysical process while ! 'CC...' are microphysical tendencies. call mmacro_pcond( lchnk, ncol, dtime, state1%pmid, state1%pdel, & t_inout, qv_inout, ql_inout, qi_inout, nl_inout, ni_inout, & ttend, qtend, lmitend, itend, nltend, nitend, & CC_T, CC_qv, CC_ql, CC_qi, CC_nl, CC_ni, CC_qlst, & dlf_T, dlf_qv, dlf_ql, dlf_qi, dlf_nl, dlf_ni, & concld_old, concld, landfrac, snowh, & tlat, qvlat, qcten, qiten, ncten, niten, & cmeliq, qvadj, qladj, qiadj, qllim, qilim, & cld, alst, aist, qlst, qist ) ! Compute net stratus fraction using maximum over-lapping assumption do k = 1, pver do i = 1, ncol ast(i,k) = max( alst(i,k), aist(i,k) ) enddo enddo call t_stopf('mmacro_pcond') do k = 1, pver do i = 1, ncol ptend_loc%s(i,k) = tlat(i,k) ptend_loc%q(i,k,1) = qvlat(i,k) ptend_loc%q(i,k,ixcldliq) = qcten(i,k) ptend_loc%q(i,k,ixcldice) = qiten(i,k) ptend_loc%q(i,k,ixnumliq) = ncten(i,k) ptend_loc%q(i,k,ixnumice) = niten(i,k) end do end do call outfld( 'MACPDT ', tlat , pcols, lchnk ) call outfld( 'MACPDQ ', qvlat, pcols, lchnk ) call outfld( 'MACPDLIQ ', qcten, pcols, lchnk ) call outfld( 'MACPDICE ', qiten, pcols, lchnk ) call outfld( 'CLDVAPADJ', qvadj, pcols, lchnk ) call outfld( 'CLDLIQADJ', qladj, pcols, lchnk ) call outfld( 'CLDICEADJ', qiadj, pcols, lchnk ) call outfld( 'CLDLIQDET', dlf_ql, pcols, lchnk ) call outfld( 'CLDICEDET', dlf_qi, pcols, lchnk ) call outfld( 'CLDLIQLIM', qllim, pcols, lchnk ) call outfld( 'CLDICELIM', qilim, pcols, lchnk ) ! Here 'state_eq' is the equlibrium state after macrophysics for potential ! use in the radiation scheme later. call physics_ptend_sum( ptend_loc, ptend_all, state ) call physics_update( state1, tend, ptend_loc, dtime ) call physics_ptend_init( ptend_loc ) call physics_state_copy( state1, state_eq ) ! ----------------------- ! ! Stratiform Microphysics ! ! ----------------------- ! ptend_loc%name = 'cldmicro' ptend_loc%ls = .true. ptend_loc%lq(1) = .true. ptend_loc%lq(ixcldliq) = .true. ptend_loc%lq(ixcldice) = .true. ptend_loc%lq(ixnumliq) = .true. ptend_loc%lq(ixnumice) = .true. #ifndef MODAL_AERO call rad_cnst_get_clim_info( naero = naer_all ) allocate( aer_mmr( pcols, pver, naer_all ) ) do m = 1, naer_all call rad_cnst_get_clim_aer( m, state1, pbuf, aermmr1 ) aer_mmr(:ncol,:,m) = aermmr1(:ncol,:) enddo #endif #ifdef MODAL_AERO do m = 1, ntot_amode lnum = numptr_amode(m) if( lnum > 0 ) then ptend_loc%lq(lnum)= .true. endif do l = 1, nspec_amode(m) lmass = lmassptr_amode(l,m) ptend_loc%lq(lmass)= .true. enddo enddo #endif call t_startf('mmicro_pcond') qc(:ncol,:pver) = state1%q(:ncol,:pver,ixcldliq) qi(:ncol,:pver) = state1%q(:ncol,:pver,ixcldice) nc(:ncol,:pver) = state1%q(:ncol,:pver,ixnumliq) ni(:ncol,:pver) = state1%q(:ncol,:pver,ixnumice) if( micro_treatment .eq. 'inter' ) then alst_mic(:ncol,:pver) = ast(:ncol,:pver) aist_mic(:ncol,:pver) = ast(:ncol,:pver) elseif( micro_treatment .eq. 'compl' ) then alst_mic(:ncol,:pver) = alst(:ncol,:pver) aist_mic(:ncol,:pver) = aist(:ncol,:pver) endif call mmicro_pcond( lchnk, ncol, dtime, state1%t, zeros, & state1%q(1,1,1), zeros, zeros, qc, qi, & nc, ni, state1%pmid, state1%pdel, ast, & alst_mic, aist_mic, & cldo, state1%pint, state1%rpdel, state1%zm, state1%omega, & #ifdef MODAL_AERO state1%q, cflx, ptend_loc%q, qqcw, dgnumwet, dgnum, & rate1ord_cw2pr_st, & #else aer_mmr, & #endif rhdfda, rhu00, fice, tlat, qvlat, & qcten, qiten, ncten, niten, effc, & effc_fn, effi, prect, preci, kkvh, & tke, turbtype, smaw , wsub, wsubi, nevapr, evapsnow, & prain, prodsnow, cmeice, dei, mu, & lambdac, qsout, des, & qcsevap, qisevap, qvres, cmeiout, & vtrmc, vtrmi, qcsedten, qisedten, & prao, prco, mnuccco, mnuccto, msacwio, psacwso, & bergso, bergo, melto, homoo, qcreso, prcio, praio, qireso, & mnuccro, pracso, meltsdt, frzrdt ) ! Sedimentation velocity for liquid stratus cloud droplet wsedl(:ncol,:pver) = vtrmc(:ncol,:pver) ! Nominal values for no stratiform (convective only) cloud. ! Convert snow mixing ratio to microns do k = 1, pver do i = 1, ncol des(i,k) = des(i,k) * 1.e6_r8 if( ast(i,k) .lt. 1.e-4_r8 ) then mu(i,k) = mucon lambdac(i,k) = (mucon + 1._r8)/dcon dei(i,k) = deicon endif end do end do ! Microphysical tendencies for use in the macrophysics at the next time step CC_T(:ncol,:pver) = tlat(:ncol,:pver)/cpair CC_qv(:ncol,:pver) = qvlat(:ncol,:pver) CC_ql(:ncol,:pver) = qcten(:ncol,:pver) CC_qi(:ncol,:pver) = qiten(:ncol,:pver) CC_nl(:ncol,:pver) = ncten(:ncol,:pver) CC_ni(:ncol,:pver) = niten(:ncol,:pver) CC_qlst(:ncol,:pver) = qcten(:ncol,:pver)/max(0.01_r8,alst_mic(:ncol,:pver)) ! Net stratiform condensation rate qme(:ncol,:pver) = cmeliq(:ncol,:pver) + cmeiout(:ncol,:pver) call t_stopf('mmicro_pcond') #ifndef MODAL_AERO deallocate(aer_mmr) #endif end if if( microp_scheme .eq. 'RK' ) then do k = 1, pver do i = 1, ncol ptend_loc%s(i,k) = qme(i,k)*( latvap + latice*fice(i,k) ) + & evapheat(i,k) + prfzheat(i,k) + meltheat(i,k) + repartht(i,k) ptend_loc%q(i,k,1) = - qme(i,k) + nevapr(i,k) ptend_loc%q(i,k,ixcldice) = qme(i,k)*fice(i,k) - ice2pr(i,k) ptend_loc%q(i,k,ixcldliq) = qme(i,k)*(1._r8-fice(i,k)) - liq2pr(i,k) end do end do do k = 1, pver do i = 1, ncol aist(i,k) = cld(i,k) alst(i,k) = cld(i,k) ast(i,k) = cld(i,k) icimr(i,k) = (state1%q(i,k,ixcldice) + dtime*ptend_loc%q(i,k,ixcldice)) / max(0.01_r8,aist(i,k)) icwmr(i,k) = (state1%q(i,k,ixcldliq) + dtime*ptend_loc%q(i,k,ixcldliq)) / max(0.01_r8,alst(i,k)) end do end do ! Convert precipitation from [ kg/m2 ] to [ m/s ] snow_pcw(:ncol) = snow_pcw(:ncol)/1000._r8 prec_pcw(:ncol) = prec_pcw(:ncol)/1000._r8 do k = 1, pver do i = 1, ncol cmeheat(i,k) = qme(i,k) * ( latvap + latice*fice(i,k) ) cmeice (i,k) = qme(i,k) * fice(i,k) cmeliq (i,k) = qme(i,k) * ( 1._r8 - fice(i,k) ) end do end do ! Record history variables call outfld( 'FWAUT' , fwaut, pcols, lchnk ) call outfld( 'FSAUT' , fsaut, pcols, lchnk ) call outfld( 'FRACW' , fracw, pcols, lchnk ) call outfld( 'FSACW' , fsacw, pcols, lchnk ) call outfld( 'FSACI' , fsaci, pcols, lchnk ) call outfld( 'PCSNOW' , snow_pcw, pcols, lchnk ) call outfld( 'FICE' , fice, pcols, lchnk ) call outfld( 'CMEICE' , cmeice, pcols, lchnk ) call outfld( 'CMELIQ' , cmeliq, pcols, lchnk ) call outfld( 'ICE2PR' , ice2pr, pcols, lchnk ) call outfld( 'LIQ2PR' , liq2pr, pcols, lchnk ) call outfld( 'HPROGCLD', ptend_loc%s, pcols, lchnk ) call outfld( 'HEVAP ', evapheat, pcols, lchnk ) call outfld( 'HMELT' , meltheat, pcols, lchnk ) call outfld( 'HCME' , cmeheat , pcols, lchnk ) call outfld( 'HFREEZ' , prfzheat, pcols, lchnk ) call outfld( 'HREPART' , repartht, pcols, lchnk ) elseif( microp_scheme .eq. 'MG' ) then do k = 1, pver do i = 1, ncol ptend_loc%s(i,k) = tlat(i,k) ptend_loc%q(i,k,1) = qvlat(i,k) ptend_loc%q(i,k,ixcldliq) = qcten(i,k) ptend_loc%q(i,k,ixcldice) = qiten(i,k) ptend_loc%q(i,k,ixnumliq) = ncten(i,k) ptend_loc%q(i,k,ixnumice) = niten(i,k) enddo enddo ! For precip, accumulate only total precip in prec_pwc and snow_pwc variables. ! Other precip output varirables are set to 0 prec_pcw(:ncol) = prect(:ncol) snow_pcw(:ncol) = preci(:ncol) prec_sed(:ncol) = 0._r8 snow_sed(:ncol) = 0._r8 prec_str(:ncol) = prec_pcw(:ncol) + prec_sed(:ncol) - rliq(:ncol) snow_str(:ncol) = snow_pcw(:ncol) + snow_sed(:ncol) endif ! ------------------------------- ! ! Update microphysical tendencies ! ! ------------------------------- ! call physics_ptend_sum( ptend_loc, ptend_all, state ) ptend_all%name = 'stratiform' call physics_update( state1, tend, ptend_loc, dtime ) call physics_ptend_init( ptend_loc ) ! Below 'cldfrc' block should not be performed for MG since ! 'cld' has already been computed from the mmacro_pcond. if ( microp_scheme .ne. 'MG' ) then call t_startf("cldfrc") call cldfrc( lchnk, ncol, pbuf, & state1%pmid, state1%t, state1%q(:,:,1), state1%omega, state1%phis, & shfrc, use_shfrc, & cld, rhcloud, clc, state1%pdel, & cmfmc, cmfmc2, landfrac, snowh, concld, cldst, & ts, sst, state1%pint(:,pverp), zdu, ocnfrac, rhu00, & state1%q(:,:,ixcldice), icecldf, liqcldf, & relhum, 0 ) call cldfrc( lchnk, ncol, pbuf, & state1%pmid, state1%t, state1%q(:,:,1), state1%omega, state1%phis, & shfrc, use_shfrc, & cld2, rhcloud2, clc, state1%pdel, & cmfmc, cmfmc2, landfrac, snowh, concld2, cldst2, & ts, sst, state1%pint(:,pverp), zdu, ocnfrac, rhu002, & state1%q(:,:,ixcldice), icecldf2, liqcldf2, & relhum2, 1 ) call t_stopf("cldfrc") do k = 1, pver do i = 1, ncol if( relhum(i,k) < rhu00(i,k) ) then rhdfda(i,k)=0.0_r8 elseif( relhum(i,k) >= 1.0_r8 ) then rhdfda(i,k)=0.0_r8 else ! Under certain circumstances, rh+ causes cld not to changed ! when at an upper limit, or w/ strong subsidence if( ( rhcloud2(i,k) - rhcloud(i,k) ) < 1.e-4_r8 ) then rhdfda(i,k) = 0.01_r8*relhum(i,k)*1.e+4_r8 else rhdfda(i,k) = 0.01_r8*relhum(i,k)/(rhcloud2(i,k)-rhcloud(i,k)) endif endif enddo enddo endif ! Copy of concld/fice to put in physics buffer ! Below are used only for convective cloud. concld_ql(:ncol,:pver) = concld(:ncol,:pver) fice_ql(:ncol,:pver) = fice(:ncol,:pver) if( micro_treatment .eq. 'inter' ) then icecldf(:ncol,:pver) = ast(:ncol,:pver) liqcldf(:ncol,:pver) = ast(:ncol,:pver) elseif( micro_treatment .eq. 'compl' ) then icecldf(:ncol,:pver) = aist(:ncol,:pver) liqcldf(:ncol,:pver) = alst(:ncol,:pver) endif call outfld( 'CONCLD ', concld, pcols, lchnk ) call outfld( 'CLDST ', cldst, pcols, lchnk ) call outfld( 'CNVCLD ', clc, pcols, lchnk ) call outfld( 'ICECLDF ', aist, pcols, lchnk ) call outfld( 'LIQCLDF ', alst, pcols, lchnk ) call outfld( 'AST', ast, pcols, lchnk ) if( microp_scheme .eq. 'MG' ) then ! ------------------------------------------------- ! ! Save equilibrium state variables for macrophysics ! ! at the next time step ! ! ------------------------------------------------- ! do k = 1, pver tcwat(:ncol,k) = state_eq%t(:ncol,k) qcwat(:ncol,k) = state_eq%q(:ncol,k,1) lcwat(:ncol,k) = state_eq%q(:ncol,k,ixcldliq) + state_eq%q(:ncol,k,ixcldice) iccwat(:ncol,k) = state_eq%q(:ncol,k,ixcldice) nlwat(:ncol,k) = state_eq%q(:ncol,k,ixnumliq) niwat(:ncol,k) = state_eq%q(:ncol,k,ixnumice) end do ! Effective droplet radius rel(:ncol,:pver) = effc(:ncol,:pver) rel_fn(:ncol,:pver) = effc_fn(:ncol,:pver) rei(:ncol,:pver) = effi(:ncol,:pver) rel2(:ncol,:pver) = rel(:ncol,:pver) * 0.9071_r8 ! Convect to effective volume radius assuming pgam = 8 rei2(:ncol,:pver) = rei(:ncol,:pver) * 0.6057_r8 ! Convect to effective volume radius at pgam = 0 for ice ! ----------------------------------------------------------- ! ! Adjust in-cloud water values to take account of convective ! ! in-cloud water. It is used to calculate the values of ! ! icwlp and iciwp to pass to the radiation. ! ! ----------------------------------------------------------- ! allcld_ice(:ncol,:pver) = 0._r8 ! Grid-avg all cloud liquid allcld_liq(:ncol,:pver) = 0._r8 ! Grid-avg all cloud ice if( conv_water_in_rad /= 0 ) then call conv_water_4rad( lchnk, ncol, pbuf, conv_water_in_rad, rei, state1%pdel, & state1%q(:,:,ixcldliq), state1%q(:,:,ixcldice), & allcld_liq, allcld_ice ) else allcld_liq(:ncol,:) = state1%q(:ncol,:,ixcldliq) ! Grid-ave all cloud liquid allcld_ice(:ncol,:) = state1%q(:ncol,:,ixcldice) ! " ice end if ! ------------------------------------------------------------ ! ! Compute in cloud ice and liquid mixing ratios ! ! Note that 'iclwp, iciwp' are used for radiation computation. ! ! ------------------------------------------------------------ ! do k = 1, pver do i = 1, ncol ! Limits for in-cloud mixing ratios consistent with MG microphysics ! in-cloud mixing ratio 0.0001 to 0.005 kg/kg icimr(i,k) = min( allcld_ice(i,k) / max(0.0001_r8,cld(i,k)),0.005_r8 ) icwmr(i,k) = min( allcld_liq(i,k) / max(0.0001_r8,cld(i,k)),0.005_r8 ) icimrst(i,k) = min( state1%q(i,k,ixcldice) / max(0.0001_r8,icecldf(i,k)),0.005_r8 ) icwmrst(i,k) = min( state1%q(i,k,ixcldliq) / max(0.0001_r8,liqcldf(i,k)),0.005_r8 ) icinc(i,k) = state1%q(i,k,ixnumice) / max(0.0001_r8,icecldf(i,k)) * state1%pmid(i,k) / (287.15_r8*state1%t(i,k)) icwnc(i,k) = state1%q(i,k,ixnumliq) / max(0.0001_r8,liqcldf(i,k)) * state1%pmid(i,k) / (287.15_r8*state1%t(i,k)) iwc(i,k) = allcld_ice(i,k) * state1%pmid(i,k) / (287.15_r8*state1%t(i,k)) lwc(i,k) = allcld_liq(i,k) * state1%pmid(i,k) / (287.15_r8*state1%t(i,k)) effliq(i,k) = effc(i,k) effliq_fn(i,k) = effc_fn(i,k) effice(i,k) = effi(i,k) ! Calculate total cloud water paths in each layer iciwp(i,k) = icimr(i,k) * state1%pdel(i,k) / gravit iclwp(i,k) = icwmr(i,k) * state1%pdel(i,k) / gravit ! Calculate stratiform cloud water paths in each layer ! Note: uses stratiform cloud fraction! iciwpst(i,k) = min(state1%q(i,k,ixcldice)/max(0.0001_r8,ast(i,k)),0.005_r8) * state1%pdel(i,k) / gravit iclwpst(i,k) = min(state1%q(i,k,ixcldliq)/max(0.0001_r8,ast(i,k)),0.005_r8) * state1%pdel(i,k) / gravit ! Calculate convective in-cloud LWP. iclwpconv(i,k) = max(allcld_liq(i,k) - state%q(i,k,ixcldliq),0._r8)/max(0.0001_r8,concld(i,k)) iciwpconv(i,k) = max(allcld_ice(i,k) - state%q(i,k,ixcldice),0._r8)/max(0.0001_r8,concld(i,k)) ! ------------------------------ ! ! Adjust cloud fraction for snow ! ! ------------------------------ ! cldfsnow(i,k) = cld(i,k) ! If cloud and only ice ( no convective cloud or ice ), then set to 0. if( ( cldfsnow(i,k) .gt. 1.e-4_r8 ) .and. & ( concld(i,k) .lt. 1.e-4_r8 ) .and. & ( state1%q(i,k,ixcldliq) .lt. 1.e-10_r8 ) ) then cldfsnow(i,k) = 0._r8 endif ! If no cloud and snow, then set to 0.25 if( ( cldfsnow(i,k) .lt. 1.e-4_r8 ) .and. ( qsout(i,k) .gt. 1.e-6_r8 ) ) then cldfsnow(i,k) = 0.25_r8 endif ! Calculate in-cloud snow water path icswp(i,k) = qsout(i,k) / max( 0.0001_r8, cldfsnow(i,k) ) * state1%pdel(i,k) / gravit enddo enddo ! --------------------- ! ! History Output Fields ! ! --------------------- ! ! Column droplet concentration do i = 1, ncol cdnumc(i) = 0._r8 do k = 1, pver cdnumc(i) = cdnumc(i) + state1%q(i,k,ixnumliq)*state1%pdel(i,k)/gravit end do end do ! Averaging for new output fields efcout(:,:) = 0._r8 efiout(:,:) = 0._r8 ncout(:,:) = 0._r8 niout(:,:) = 0._r8 freql(:,:) = 0._r8 freqi(:,:) = 0._r8 liqcldf_out(:,:) = 0._r8 icecldf_out(:,:) = 0._r8 icwmrst_out(:,:) = 0._r8 icimrst_out(:,:) = 0._r8 do k = 1, pver do i = 1, ncol if( liqcldf(i,k) .gt. 0.01_r8 .and. icwmrst(i,k) .gt. 5.e-5_r8 ) then efcout(i,k) = effc(i,k) ncout(i,k) = icwnc(i,k) freql(i,k) = 1._r8 liqcldf_out(i,k) = liqcldf(i,k) icwmrst_out(i,k) = icwmrst(i,k) endif if( icecldf(i,k) .gt. 0.01_r8 .and. icimrst(i,k) .gt. 1.e-6_r8 ) then efiout(i,k) = effi(i,k) niout(i,k) = icinc(i,k) freqi(i,k) = 1._r8 icecldf_out(i,k) = icecldf(i,k) icimrst_out(i,k) = icimrst(i,k) endif end do end do call outfld( 'AREL' , efcout, pcols, lchnk ) call outfld( 'AREI' , efiout, pcols, lchnk ) call outfld( 'AWNC' , ncout, pcols, lchnk ) call outfld( 'AWNI' , niout, pcols, lchnk ) call outfld( 'FREQL', freql, pcols, lchnk ) call outfld( 'FREQI', freqi, pcols, lchnk ) ! Cloud top effective radius and number. fcti(:) = 0._r8 fctl(:) = 0._r8 ctrel(:) = 0._r8 ctrei(:) = 0._r8 ctnl(:) = 0._r8 ctni(:) = 0._r8 do i = 1, ncol do k = 1, pver if( liqcldf(i,k) .gt. 0.01_r8 .and. icwmrst(i,k) .gt. 1.e-7_r8 ) then ctrel(i) = effc(i,k) ctnl(i) = icwnc(i,k) fctl(i) = 1._r8 exit endif if( icecldf(i,k) .gt. 0.01_r8 .and. icimrst(i,k) .gt. 1.e-7_r8 ) then ctrei(i) = effi(i,k) ctni(i) = icinc(i,k) fcti(i) = 1._r8 exit endif enddo enddo call outfld( 'ACTREL' , ctrel, pcols, lchnk ) call outfld( 'ACTREI' , ctrei, pcols, lchnk ) call outfld( 'ACTNL' , ctnl, pcols, lchnk ) call outfld( 'ACTNI' , ctni, pcols, lchnk ) call outfld( 'FCTL' , fctl, pcols, lchnk ) call outfld( 'FCTI' , fcti, pcols, lchnk ) call outfld( 'MPDT' , tlat, pcols, lchnk ) call outfld( 'MPDQ' , qvlat, pcols, lchnk ) call outfld( 'MPDLIQ' , qcten, pcols, lchnk ) call outfld( 'MPDICE' , qiten, pcols, lchnk ) call outfld( 'ICINC' , icinc, pcols, lchnk ) call outfld( 'ICWNC' , icwnc, pcols, lchnk ) call outfld( 'EFFLIQ' , effliq, pcols, lchnk ) call outfld( 'EFFLIQ_IND' , effliq_fn, pcols, lchnk ) call outfld( 'EFFICE' , effice, pcols, lchnk ) call outfld( 'WSUB' , wsub, pcols, lchnk ) call outfld( 'WSUBI' , wsubi, pcols, lchnk ) call outfld( 'CDNUMC' , cdnumc, pcols, lchnk ) elseif( microp_scheme .eq. 'RK' ) then do k = 1, pver do i = 1, ncol iwc(i,k) = state1%q(i,k,ixcldice)*state1%pmid(i,k)/(287.15_r8*state1%t(i,k)) lwc(i,k) = state1%q(i,k,ixcldliq)*state1%pmid(i,k)/(287.15_r8*state1%t(i,k)) icimr(i,k) = state1%q(i,k,ixcldice) / max(0.01_r8,rhcloud(i,k)) icwmr(i,k) = state1%q(i,k,ixcldliq) / max(0.01_r8,rhcloud(i,k)) end do end do endif ! RK,MG microphysics ! --------------------------------------------- ! ! Common outfield calls for either microphysics ! ! --------------------------------------------- ! call outfld( 'IWC' , iwc, pcols, lchnk ) call outfld( 'LWC' , lwc, pcols, lchnk ) call outfld( 'ICIMR' , icimr, pcols, lchnk ) call outfld( 'ICWMR' , icwmr, pcols, lchnk ) call outfld( 'ICIMRST' , icimrst_out, pcols, lchnk ) call outfld( 'ICWMRST' , icwmrst_out, pcols, lchnk ) call outfld( 'CME' , qme, pcols, lchnk ) call outfld( 'PRODPREC' , prain, pcols, lchnk ) call outfld( 'EVAPPREC' , nevapr, pcols, lchnk ) call outfld( 'EVAPSNOW' , evapsnow, pcols, lchnk ) call outfld( 'QCSEVAP' , qcsevap, pcols, lchnk ) call outfld( 'QISEVAP' , qisevap, pcols, lchnk ) call outfld( 'QVRES' , qvres, pcols, lchnk ) call outfld( 'CMEIOUT' , cmeiout, pcols, lchnk ) call outfld( 'CMELIQ' , cmeliq, pcols, lchnk ) call outfld( 'VTRMC' , vtrmc, pcols, lchnk ) call outfld( 'VTRMI' , vtrmi, pcols, lchnk ) call outfld( 'QCSEDTEN' , qcsedten, pcols, lchnk ) call outfld( 'QISEDTEN' , qisedten, pcols, lchnk ) call outfld( 'PRAO' , prao, pcols, lchnk ) call outfld( 'PRCO' , prco, pcols, lchnk ) call outfld( 'MNUCCCO' , mnuccco, pcols, lchnk ) call outfld( 'MNUCCTO' , mnuccto, pcols, lchnk ) call outfld( 'MSACWIO' , msacwio, pcols, lchnk ) call outfld( 'PSACWSO' , psacwso, pcols, lchnk ) call outfld( 'BERGSO' , bergso, pcols, lchnk ) call outfld( 'BERGO' , bergo, pcols, lchnk ) call outfld( 'MELTO' , melto, pcols, lchnk ) call outfld( 'HOMOO' , homoo, pcols, lchnk ) call outfld( 'QCRESO' , qcreso, pcols, lchnk ) call outfld( 'PRCIO' , prcio, pcols, lchnk ) call outfld( 'PRAIO' , praio, pcols, lchnk ) call outfld( 'QIRESO' , qireso, pcols, lchnk ) call outfld( 'MNUCCRO' , mnuccro, pcols, lchnk ) call outfld( 'PRACSO' , pracso , pcols, lchnk ) call outfld( 'MELTSDT' , meltsdt, pcols, lchnk ) call outfld( 'FRZRDT' , frzrdt , pcols, lchnk ) if( microp_scheme .eq. 'MG' ) then ftem(:ncol,:pver) = qcreso(:ncol,:pver) call outfld( 'MPDW2V', ftem, pcols, lchnk ) ftem(:ncol,:pver) = melto(:ncol,:pver) - mnuccco(:ncol,:pver) - mnuccto(:ncol,:pver) - & bergo(:ncol,:pver) - homoo (:ncol,:pver) - msacwio(:ncol,:pver) call outfld( 'MPDW2I', ftem, pcols, lchnk ) ftem(:ncol,:pver) = -prao(:ncol,:pver) - prco(:ncol,:pver) - psacwso(:ncol,:pver) - & bergso(:ncol,:pver) call outfld( 'MPDW2P', ftem, pcols, lchnk ) ftem(:ncol,:pver) = cmeiout(:ncol,:pver) + qireso (:ncol,:pver) call outfld( 'MPDI2V', ftem, pcols, lchnk ) ftem(:ncol,:pver) = -melto(:ncol,:pver) + mnuccco(:ncol,:pver) + mnuccto(:ncol,:pver) + & bergo(:ncol,:pver) + homoo (:ncol,:pver) + msacwio(:ncol,:pver) call outfld( 'MPDI2W', ftem, pcols, lchnk ) ftem(:ncol,:pver) = -prcio(:ncol,:pver) - praio (:ncol,:pver) call outfld( 'MPDI2P', ftem, pcols, lchnk ) endif call t_stopf('stratiform_microphys') if( microp_scheme .eq. 'RK' ) then prec_str(:ncol) = prec_str(:ncol) + prec_pcw(:ncol) snow_str(:ncol) = snow_str(:ncol) + snow_pcw(:ncol) call cnst_get_ind('CLDLIQ', ixcldliq) call cnst_get_ind('CLDICE', ixcldice) ! Save variables for use in the macrophysics at the next time step do k = 1, pver qcwat(:ncol,k) = state1%q(:ncol,k,1) tcwat(:ncol,k) = state1%t(:ncol,k) lcwat(:ncol,k) = state1%q(:ncol,k,ixcldice) + state1%q(:ncol,k,ixcldliq) end do ! Cloud water and ice particle sizes, saved in physics buffer for radiation call cldefr( lchnk, ncol, landfrac, state1%t, rel, rei, state1%ps, state1%pmid, landm, icefrac, snowh ) rel2(:ncol,:pver) = rel(:ncol,:pver) rei2(:ncol,:pver) = rei(:ncol,:pver) end if end subroutine stratiform_tend !============================================================================ ! ! ! !============================================================================ ! subroutine debug_microphys_1(state1,ptend,i,k, &,3 dtime,qme,fice,snow_pcw,prec_pcw, & prain,nevapr,prodsnow, evapsnow, & ice2pr,liq2pr,liq2snow) use physics_types, only: physics_state, physics_ptend use physconst, only: tmelt implicit none integer, intent(in) :: i,k type(physics_state), intent(in) :: state1 ! local copy of the state variable type(physics_ptend), intent(in) :: ptend ! local copy of the ptend variable real(r8), intent(in) :: dtime ! timestep real(r8), intent(in) :: qme(pcols,pver) ! local condensation - evaporation of cloud water real(r8), intent(in) :: prain(pcols,pver) ! local production of precipitation real(r8), intent(in) :: nevapr(pcols,pver) ! local evaporation of precipitation real(r8), intent(in) :: prodsnow(pcols,pver) ! local production of snow real(r8), intent(in) :: evapsnow(pcols,pver) ! local evaporation of snow real(r8), intent(in) :: ice2pr(pcols,pver) ! rate of conversion of ice to precip real(r8), intent(in) :: liq2pr(pcols,pver) ! rate of conversion of liquid to precip real(r8), intent(in) :: liq2snow(pcols,pver) ! rate of conversion of liquid to snow real(r8), intent(in) :: fice (pcols,pver) ! Fractional ice content within cloud real(r8), intent(in) :: snow_pcw(pcols) real(r8), intent(in) :: prec_pcw(pcols) real(r8) hs1, qv1, ql1, qi1, qs1, qr1, fice2, pr1, w1, w2, w3, fliq, res real(r8) w4, wl, wv, wi, wlf, wvf, wif, qif, qlf, qvf pr1 = 0 hs1 = 0 qv1 = 0 ql1 = 0 qi1 = 0 qs1 = 0 qr1 = 0 w1 = 0 wl = 0 wv = 0 wi = 0 wlf = 0 wvf = 0 wif = 0 write(iulog,*) write(iulog,*) ' input state, t, q, l, i ', k, state1%t(i,k), state1%q(i,k,1), state1%q(i,k,ixcldliq), state1%q(i,k,ixcldice) write(iulog,*) ' rain, snow, total from components before accumulation ', qr1, qs1, qr1+qs1 write(iulog,*) ' total precip before accumulation ', k, pr1 wv = wv + state1%q(i,k,1 )*state1%pdel(i,k)/gravit wl = wl + state1%q(i,k,ixcldliq)*state1%pdel(i,k)/gravit wi = wi + state1%q(i,k,ixcldice)*state1%pdel(i,k)/gravit qvf = state1%q(i,k,1) + ptend%q(i,k,1)*dtime qlf = state1%q(i,k,ixcldliq) + ptend%q(i,k,ixcldliq)*dtime qif = state1%q(i,k,ixcldice) + ptend%q(i,k,ixcldice)*dtime if (qvf.lt.0._r8) then write(iulog,*) ' qvf is negative *******', qvf endif if (qlf.lt.0._r8) then write(iulog,*) ' qlf is negative *******', qlf endif if (qif.lt.0._r8) then write(iulog,*) ' qif is negative *******', qif endif write(iulog,*) ' qvf, qlf, qif ', qvf, qlf, qif wvf = wvf + qvf*state1%pdel(i,k)/gravit wlf = wlf + qlf*state1%pdel(i,k)/gravit wif = wif + qif*state1%pdel(i,k)/gravit hs1 = hs1 + ptend%s(i,k)*state1%pdel(i,k)/gravit pr1 = pr1 + state1%pdel(i,k)/gravit*(prain(i,k)-nevapr(i,k)) qv1 = qv1 - (qme(i,k)-nevapr(i,k))*state1%pdel(i,k)/gravit ! vdot w1 = w1 + (qme(i,k)-prain(i,k))*state1%pdel(i,k)/gravit ! cdot qi1 = qi1 + ((qme(i,k))*fice(i,k) -ice2pr(i,k) )*state1%pdel(i,k)/gravit ! idot ql1 = ql1 + ((qme(i,k))*(1._r8-fice(i,k))-liq2pr(i,k) )*state1%pdel(i,k)/gravit ! ldot qr1 = qr1 & + ( liq2pr(i,k)-liq2snow(i,k) & ! production of rain -(nevapr(i,k)-evapsnow(i,k)) & ! rain evaporation )*state1%pdel(i,k)/gravit qs1 = qs1 & + ( ice2pr(i,k) + liq2snow(i,k) & ! production of snow.Note last term has phase change -evapsnow(i,k) & ! snow evaporation )*state1%pdel(i,k)/gravit if (state1%t(i,k).gt.tmelt) then qr1 = qr1 + qs1 qs1 = 0._r8 endif write(iulog,*) ' rain, snow, total after accumulation ', qr1, qs1, qr1+qs1 write(iulog,*) ' total precip after accumulation ', k, pr1 write(iulog,*) write(iulog,*) ' layer prain, nevapr, pdel ', prain(i,k), nevapr(i,k), state1%pdel(i,k) write(iulog,*) ' layer prodsnow, ice2pr+liq2snow ', prodsnow(i,k), ice2pr(i,k)+liq2snow(i,k) write(iulog,*) ' layer prain-prodsnow, liq2pr-liq2snow ', prain(i,k)-prodsnow(i,k), liq2pr(i,k)-liq2snow(i,k) write(iulog,*) ' layer evapsnow, evaprain ', k, evapsnow(i,k), nevapr(i,k)-evapsnow(i,k) write(iulog,*) ' layer ice2pr, liq2pr, liq2snow ', ice2pr(i,k), liq2pr(i,k), liq2snow(i,k) write(iulog,*) ' layer ice2pr+liq2pr, prain ', ice2pr(i,k)+liq2pr(i,k), prain(i,k) write(iulog,*) write(iulog,*) ' qv1 vapor removed from col after accum (vdot) ', k, qv1 write(iulog,*) ' - (precip produced - vapor removed) after accum ', k, -pr1-qv1 write(iulog,*) ' condensate produce after accum ', k, w1 write(iulog,*) ' liq+ice tends accum ', k, ql1+qi1 write(iulog,*) ' change in total water after accum ', k, qv1+ql1+qi1 write(iulog,*) ' imbalance in colum after accum ', k, qs1+qr1+qv1+ql1+qi1 write(iulog,*) ' fice at this lev ', fice(i,k) write(iulog,*) res = abs((qs1+qr1+qv1+ql1+qi1)/max(abs(qv1),abs(ql1),abs(qi1),abs(qs1),abs(qr1),1.e-36_r8)) write(iulog,*) ' relative residual in column method 1 ', k, res write(iulog,*) ' relative residual in column method 2 ',& k, abs((qs1+qr1+qv1+ql1+qi1)/max(abs(qv1+ql1+qi1),1.e-36_r8)) ! if (abs((qs1+qr1+qv1+ql1+qi1)/(qs1+qr1+1.e-36)).gt.1.e-14) then if (res.gt.1.e-14_r8) then call endrun ('STRATIFORM_TEND') endif ! w3 = qme(i,k) * (latvap + latice*fice(i,k)) & ! + evapheat(i,k) + prfzheat(i,k) + meltheat(i,k) res = qs1+qr1-pr1 w4 = max(abs(qs1),abs(qr1),abs(pr1)) if (w4.gt.0._r8) then if (res/w4.gt.1.e-14_r8) then write(iulog,*) ' imbalance in precips calculated two ways ' write(iulog,*) ' res/w4, pr1, qr1, qs1, qr1+qs1 ', & res/w4, pr1, qr1, qs1, qr1+qs1 ! call endrun() endif endif if (k.eq.pver) then write(iulog,*) ' pcond returned precip, rain and snow rates ', prec_pcw(i), prec_pcw(i)-snow_pcw(i), snow_pcw(i) write(iulog,*) ' I calculate ', pr1, qr1, qs1 ! call endrun write(iulog,*) ' byrons water check ', wv+wl+wi-pr1*dtime, wvf+wlf+wif endif write(iulog,*) end subroutine debug_microphys_1 !============================================================================ ! ! ! !============================================================================ ! subroutine debug_microphys_2(state1,&,5 snow_pcw,fsaut,fsacw ,fsaci, meltheat) use ppgrid, only: pver use physconst, only: tmelt use physics_types, only: physics_state implicit none type(physics_state), intent(in) :: state1 ! local copy of the state variable real(r8), intent(in) :: snow_pcw(pcols) real(r8), intent(in) :: fsaut(pcols,pver) real(r8), intent(in) :: fsacw(pcols,pver) real(r8), intent(in) :: fsaci(pcols,pver) real(r8), intent(in) :: meltheat(pcols,pver) ! heating rate due to phase change of precip integer i,ncol,lchnk ncol = state1%ncol lchnk = state1%lchnk do i = 1,ncol if (snow_pcw(i) .gt. 0.01_r8/8.64e4_r8 .and. state1%t(i,pver) .gt. tmelt) then write(iulog,*) ' stratiform: snow, temp, ', i, lchnk, & snow_pcw(i), state1%t(i,pver) write(iulog,*) ' t ', state1%t(i,:) write(iulog,*) ' fsaut ', fsaut(i,:) write(iulog,*) ' fsacw ', fsacw(i,:) write(iulog,*) ' fsaci ', fsaci(i,:) write(iulog,*) ' meltheat ', meltheat(i,:) call endrun ('STRATIFORM_TEND') endif if (snow_pcw(i)*8.64e4_r8 .lt. -1.e-5_r8) then write(iulog,*) ' neg snow ', snow_pcw(i)*8.64e4_r8 write(iulog,*) ' stratiform: snow_pcw, temp, ', i, lchnk, & snow_pcw(i), state1%t(i,pver) write(iulog,*) ' t ', state1%t(i,:) write(iulog,*) ' fsaut ', fsaut(i,:) write(iulog,*) ' fsacw ', fsacw(i,:) write(iulog,*) ' fsaci ', fsaci(i,:) write(iulog,*) ' meltheat ', meltheat(i,:) call endrun ('STRATIFORM_TEND') endif end do end subroutine debug_microphys_2 !============================================================================ ! ! ! !============================================================================ ! subroutine conv_water_4rad( lchnk, ncol, pbuf, conv_water_mode, & 2,29 rei, pdel, ls_liq, ls_ice, totg_liq, totg_ice ) ! --------------------------------------------------------------------- ! ! 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. ! ! ! !---------------------------------------------------------------------- ! 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 implicit none ! ---------------------- ! ! Input-Output Arguments ! ! ---------------------- ! type(pbuf_fld), intent(inout), dimension(pbuf_size_max) :: pbuf 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 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 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 ! 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,ifld ! 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 call phys_getopts( microp_scheme_out = microp_scheme ) ! Get convective in-cloud water and ice/water temperature partitioning. ifld = pbuf_get_fld_idx('ICWMRSH') sh_icwmr => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,1) ifld = pbuf_get_fld_idx('ICWMRDP') dp_icwmr => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,1) ifld = pbuf_get_fld_idx('FICE') fice => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,1) ! Get convective in-cloud fraction ifld = pbuf_get_fld_idx('SH_FRAC') sh_frac => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,1) ifld = pbuf_get_fld_idx('DP_FRAC') dp_frac => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,1) ifld = pbuf_get_fld_idx('CONCLDQL') cu_frac => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,1) itim = pbuf_old_tim_idx() ifld = pbuf_get_fld_idx('AST') ast => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) itim = pbuf_old_tim_idx() ifld = pbuf_get_fld_idx('ALST') alst => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) itim = pbuf_old_tim_idx() ifld = pbuf_get_fld_idx('AIST') aist => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) itim = pbuf_old_tim_idx() ifld = pbuf_get_fld_idx('QLST') qlst => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) itim = pbuf_old_tim_idx() ifld = pbuf_get_fld_idx('QIST') qist => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ! --------------------------------------------------------------- ! ! 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 ! 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 stratiform