! $Id: cloudnew.F90,v 1.40.2.7.2.2.10.1.4.1.4.8.2.1.2.3.6.10 2008/04/25 19:15:33 ltakacs Exp $ ! $Name: GEOSagcm-Eros_7_24 $ module cloudnew 1,2 use GEOS_UtilsMod, only : QSAT=>GEOS_Qsat, DQSAT=>GEOS_DQsat use MAPL_ConstantsMod use DDF implicit none private PUBLIC PROGNO_CLOUD PUBLIC ICE_FRACTION PUBLIC T_CLOUD_CTL type T_CLOUD_CTL real :: SCLMFDFR real :: RSUB_RADIUS end type T_CLOUD_CTL real, parameter :: T_ICE_MAX= MAPL_TICE ! -7.0+TICE real, parameter :: RHO_W = 1.0e3 ! Density of liquid water in kg/m^3 real, parameter :: MIN_CLD_FRAC =1.0e-8 !! Some parameters set by PHYSPARAMS real :: T_ICE_ALL ! =-40.+MAPL_TICE ! -40.+TICE real :: RH00 ! = PHYSPARAMS(11) ! Critical relative humidity real :: C_00 ! = PHYSPARAMS(12) real :: LWCRIT ! = PHYSPARAMS(13) real :: C_ACC ! = PHYSPARAMS(14) ! m^2/kg real :: C_EV ! = PHYSPARAMS(19) ! 1/s !!real :: ICEFRPWR integer :: ICEFRPWR integer :: NSMAX ! = PHYSPARAMS(46) real :: MIN_CLD_WATER ! = PHYSPARAMS(18) real :: CLD_EVP_EFF ! = PHYSPARAMS(28) ! 1/s real :: PRC_MAX_FALL ! = PHYSPARAMS(34) / DAYLEN real :: CNV_BETA ! = PHYSPARAMS(1) ! Area factor for convective rain showers (non-dim) real :: ANV_BETA real :: LS_BETA real :: SHR_EVAP_FAC real :: CLDVOL2FRC, RHSUP_ICE real :: LS_SDQV2 , LS_SDQV3 , LS_SDQVT1 real :: ANV_SDQV2 , ANV_SDQV3 , ANV_SDQVT1 real :: ANV_TO_LS, ANV_ICEFALL_C, LS_ICEFALL_C real :: REVAP_OFF_P REAL :: N_ICE,N_WARM,N_ANVIL,N_PBL !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! contains subroutine progno_cloud ( & 1,18 !!! first vars are (in) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! DT , & ZLO , & ZLE , & PP , & PPE , & EXNP , & EXNPE , & FRLAND , & KH , & RMFDTR , & QLWDTR , & QRN_CU , & CNV_MFC , & CNV_UPDFRC , & U , & V , & TH , & Q , & QLW_LS , & QLW_AN , & QIW_LS , & QIW_AN , & ANVFRC , & CLDFRC , & RAD_CLDFRC , & RAD_QL , & RAD_QI , & CLDREFFL , & CLDREFFI , & CLDNCCN , & PRELS , & PRECU , & PREAN , & LSARF , & CUARF , & ANARF , & SNRLS , & SNRCU , & SNRAN , & PHYSPARAMS , & CTLV , & RHX , & REV_LS , & REV_AN , & REV_CN , & RSU_LS , & RSU_AN , & RSU_CN , & ACLL_CN,ACIL_CN, & ACLL_AN,ACIL_AN, & ACLL_LS,ACIL_LS, & PFL_CN,PFI_CN, & PFL_AN,PFI_AN, & PFL_LS,PFI_LS, & PDFL,PDFI,FIXL,FIXI, & AUT, EVAPC, SDM, SUBLC, & FRZ_TT, DCNVL, DCNVi, & ALPHT, ALPH1, ALPH2, & CFPDF, CFPDFX, RHXX, & DQRL,FRZ_PP ) type (T_CLOUD_CTL) , intent(in) :: CTLV real , intent(in) :: DT real , intent(in) , dimension(:,:,:) :: PP, EXNP, ZLO real , intent(in) , dimension(:,:,0:) :: PPE, EXNPE, KH, CNV_MFC, ZLE real , intent(in) , dimension(:,: ) :: FRLAND real , intent(inout) , dimension(:,:,:) :: TH !,TEMP real , intent(inout) , dimension(:,:,:) :: Q real , intent(in) , dimension(:,:,:) :: RMFDTR real , intent(in) , dimension(:,:,:) :: QLWDTR real , intent(inout) , dimension(:,:,:) :: QRN_CU real , intent(inout) , dimension(:,:,:) :: CNV_UPDFRC ! on edges, but dims=1:LM real , intent(in) , dimension(:,:,:) :: U real , intent(in) , dimension(:,:,:) :: V real , intent(inout) , dimension(:,:,:) :: QLW_LS real , intent(inout) , dimension(:,:,:) :: QLW_AN real , intent(inout) , dimension(:,:,:) :: QIW_LS real , intent(inout) , dimension(:,:,:) :: QIW_AN real , intent(inout) , dimension(:,:,:) :: ANVFRC real , intent(inout) , dimension(:,:,:) :: CLDFRC real , intent(out) , dimension(:,:,:) :: RAD_CLDFRC real , intent(out) , dimension(:,:,:) :: RAD_QL real , intent(out) , dimension(:,:,:) :: RAD_QI real , intent(out) , dimension(:,:,:) :: CLDREFFL real , intent(out) , dimension(:,:,:) :: CLDREFFI real , intent(out) , dimension(:,:,:) :: CLDNCCN real , intent(out) , dimension(:,: ) :: PRELS real , intent(out) , dimension(:,: ) :: PRECU real , intent(out) , dimension(:,: ) :: PREAN real , intent(out) , dimension(:,: ) :: LSARF real , intent(out) , dimension(:,: ) :: CUARF real , intent(out) , dimension(:,: ) :: ANARF real , intent(out) , dimension(:,: ) :: SNRLS real , intent(out) , dimension(:,: ) :: SNRCU real , intent(out) , dimension(:,: ) :: SNRAN real , intent(in) , dimension(:) :: PHYSPARAMS real , pointer , dimension(:,:,:) :: REV_CN real , pointer , dimension(:,:,:) :: REV_AN real , pointer , dimension(:,:,:) :: REV_LS real , pointer , dimension(:,:,:) :: RSU_CN real , pointer , dimension(:,:,:) :: RSU_AN real , pointer , dimension(:,:,:) :: RSU_LS real , pointer , dimension(:,:,:) :: ACIL_CN,ACLL_CN real , pointer , dimension(:,:,:) :: ACIL_AN,ACLL_AN real , pointer , dimension(:,:,:) :: ACIL_LS,ACLL_LS real , pointer , dimension(:,:,:) :: PFI_CN,PFL_CN real , pointer , dimension(:,:,:) :: PFI_AN,PFL_AN real , pointer , dimension(:,:,:) :: PFI_LS,PFL_LS real , pointer , dimension(:,:,:) :: PDFL,PDFI,FIXL,FIXI real , pointer , dimension(:,:,:) :: AUT, EVAPC, SDM, SUBLC real , pointer , dimension(:,:,:) :: FRZ_TT, DCNVL, DCNVi,FRZ_PP real , pointer , dimension(:,:,:) :: DQRL, VF_LS, VF_AN real , pointer , dimension(:,:,:) :: RHX, ALPHT, ALPH1, ALPH2, CFPDF real , pointer , dimension(:,:,:) :: RHXX, CFPDFX integer :: IM , JM , LM , UNIT , I , J , K , ITEST, L integer :: DISABLE_RAD, FRACTION_REMOVAL real , dimension( 1:size(Q,1) , 1:size(Q,2) , 1:size(Q,3) ) :: MASS, iMASS real , dimension( 1:size(Q,1) , 1:size(Q,2) , 1:size(Q,3) ) :: TOTAL_WATER real , dimension( 1:size(Q,1) , 1:size(Q,2) , 1:size(Q,3) ) :: DQST3,QST3 real , dimension( 1:size(Q,1) , 1:size(Q,2) , 1:size(Q,3) ) :: TOTFRC,OTHFRC ! these are needed, but should not be real , dimension( 1:size(Q,1) , 1:size(Q,2) , 1:size(Q,3) ) :: QRN_LS, QRN_AN ,QV,TE real , dimension( 1:size(Q,1) , 1:size(Q,2) , 1:size(Q,3) ) :: QSN_LS, QSN_AN, QSN_CU real , dimension( 1:size(Q,1) , 1:size(Q,2) , 1:size(Q,3) ) :: QTMP1,QTMP2,QTMP3 real , dimension( 1:size(Q,1) , 1:size(Q,2) ) :: TOT_WATER_VMI_0 real , dimension( 1:size(Q,1) , 1:size(Q,2) ) :: TOT_WATER_VMI_2 real , dimension( 1:size(Q,1) , 1:size(Q,2) ) :: TOT_WATER_VMI_1 real , dimension( 1:size(Q,1) , 1:size(Q,2) ) :: TOT_WATER_VMI_3 real , dimension( 1:size(Q,1) , 1:size(Q,2) ) :: TOT_WATER_VMI_4 real , dimension( 1:size(Q,1) , 1:size(Q,2) ) :: TOT_WATER_VMI_5 real , dimension( 1:size(Q,1) , 1:size(Q,2) ) :: TOT_PREC_VMI real , dimension( 1:size(Q,1) , 1:size(Q,2) ) :: TOT_ENERG_VMI_0 real , dimension( 1:size(Q,1) , 1:size(Q,2) ) :: TOT_ENERG_VMI_1 real , dimension( 1:size(Q,1) , 1:size(Q,2) ) :: TOT_ENERG_VMI_2 real , dimension( 1:size(Q,1) , 1:size(Q,2) ) :: TOT_ENERG_VMI_3,TOT_ENERG_VMI_4,TOT_ENERG_VMI_5 real , dimension( 1:size(Q,1) , 1:size(Q,2) ) :: TOT_ENERG_PREC real , dimension( 1:size(Q,1) , 1:size(Q,2) ) :: AREA_UPD_PRC real , dimension( 1:size(Q,1) , 1:size(Q,2) ) :: AREA_ANV_PRC real , dimension( 1:size(Q,1) , 1:size(Q,2) ) :: AREA_LS_PRC real , dimension( 1:size(Q,1) , 1:size(Q,2) ) :: SHEAR_ENHANCE real , dimension( 1:size(Q,1) , 1:size(Q,2) , 1:size(Q,3) ) :: TEMP real , dimension( 1:size(Q,1) , 1:size(Q,2) , 1:size(Q,3) ) :: THETV,DZET,SHEAR !! EXNP real , dimension( 1:size(Q,1) , 1:size(Q,2) , 1:size(Q,3) ) :: ICEFRCT real , dimension( 1:size(Q,1) , 1:size(Q,2) , 1:size(Q,3) ) :: RHCRIT, ALPHA real , dimension( 1:size(Q,1) , 1:size(Q,2) , 1:size(Q,3) ) :: AA3,BB3,VFALL real , dimension( 1:size(Q,1) , 1:size(Q,2) ) :: TOT_PREC_EVAP real :: LW ,QO ,TEMPR ,Q_SAT ,ACF ,PREC ,PRESS_0 ,TAU, AREA, SHOWER_INTEN0,NN_ANVIL,NN_ICE,NN_WARM,CNVENVFC real :: WRHODEP,CNVICEPARAM,CNVDDRFC,ANVDDRFC,LSDDRFC CNV_BETA = PHYSPARAMS(1) ! 1 Area factor for convective rain showers (non-dim) ANV_BETA = PHYSPARAMS(2) ! 2 Area factor for anvil rain showers (non-dim) LS_BETA = PHYSPARAMS(3) ! 3 Area factor for Large Scale rain showers (non-dim) RH00 = PHYSPARAMS(4) ! 4 ! Critical relative humidity C_00 = PHYSPARAMS(5) ! 5 LWCRIT = PHYSPARAMS(6) ! 6 C_ACC = PHYSPARAMS(7) ! 7 ! m^2/kg C_EV = PHYSPARAMS(8) ! 8 ! 1/s CLDVOL2FRC = PHYSPARAMS(9) ! 9 RHSUP_ICE = PHYSPARAMS(10) ! 10 SHR_EVAP_FAC = PHYSPARAMS(11) ! 11 MIN_CLD_WATER = PHYSPARAMS(12) ! 12 CLD_EVP_EFF = PHYSPARAMS(13) ! 13 NSMAX = INT( PHYSPARAMS(14) ) ! 14 LS_SDQV2 = PHYSPARAMS(15) ! 15 LS_SDQV3 = PHYSPARAMS(16) ! 16 LS_SDQVT1 = PHYSPARAMS(17) ! 17 ANV_SDQV2 = PHYSPARAMS(18) ! 18 ANV_SDQV3 = PHYSPARAMS(19) ! 19 ANV_SDQVT1 = PHYSPARAMS(20) ! 20 ANV_TO_LS = PHYSPARAMS(21) ! 21 N_WARM = PHYSPARAMS(22) N_ICE = PHYSPARAMS(23) N_ANVIL = PHYSPARAMS(24) N_PBL = PHYSPARAMS(25) DISABLE_RAD = INT( PHYSPARAMS(26) ) ANV_ICEFALL_C = PHYSPARAMS(28) LS_ICEFALL_C = PHYSPARAMS(29) REVAP_OFF_P = PHYSPARAMS(30) CNVENVFC = PHYSPARAMS(31) WRHODEP = PHYSPARAMS(32) T_ICE_ALL = PHYSPARAMS(33) + MAPL_TICE CNVICEPARAM = PHYSPARAMS(34) ICEFRPWR = INT( PHYSPARAMS(35) + .001 ) CNVDDRFC = PHYSPARAMS(36) ANVDDRFC = PHYSPARAMS(37) LSDDRFC = PHYSPARAMS(38) IM = size( Q , 1) JM = size( Q , 2) LM = size( Q , 3) !Zero out/initialize precips, except QRN_CU which comes from RAS QRN_LS =0. QRN_AN =0. QSN_LS =0. QSN_AN =0. QSN_CU =0. MASS(:,:,1:LM) = ( PPE(:,:,1:LM) - PPE(:,:,0:LM-1) )*100./MAPL_GRAV ! layer-mass (kg/m**2) iMASS = 1.0 / MASS TEMP = EXNP * TH DZET(:,:,1:LM) = TH(:,:,1:LM)*( EXNPE(:,:,1:LM) - EXNPE(:,:,0:LM-1) )*MAPL_CP/MAPL_GRAV DQST3 = DQSAT ( & TEMP , & PP , QSAT = QST3 ) ! Energy defined relative to liquid phase TOT_ENERG_VMI_0 = SUM( ( MAPL_CP*TEMP & + MAPL_ALHL*Q & - MAPL_ALHF*(QIW_LS+QIW_AN) )*MASS, 3 ) ! Intitial total water (all phases, temporary reservoirs, etc.) !! TOT_WATER_VMI_0 = SUM( ( Q + QLW_LS + QLW_AN + QIW_LS + QIW_AN + QRN_CU)*MASS + QLWDTR*DT , 3 ) IF( ASSOCIATED(FRZ_PP) ) FRZ_PP = 0.00 !!!!!!!!!!!!!!!!!!!!!!!!!!! ! Total Condensate Source !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!! IF( ASSOCIATED(FIXL) ) FIXL = QLW_AN + QLW_LS IF( ASSOCIATED(FIXI) ) FIXI = QIW_AN + QIW_LS CALL fix_up_clouds( & IM,JM,LM , & Q , & TEMP , & QLW_LS , & QIW_LS , & CLDFRC , & QLW_AN , & QIW_AN , & ANVFRC ) IF( ASSOCIATED(FIXL) ) FIXL = -( QLW_AN + QLW_LS - FIXL ) / DT IF( ASSOCIATED(FIXI) ) FIXI = -( QIW_AN + QIW_LS - FIXI ) / DT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! IF( ASSOCIATED(FRZ_TT) ) FRZ_TT = QIW_AN + QIW_LS CALL meltfrz ( & IM,JM,LM , & DT , & TEMP , & QLW_LS , & QIW_LS ) CALL meltfrz ( & IM,JM,LM , & DT , & TEMP , & QLW_AN , & QIW_AN ) IF( ASSOCIATED(FRZ_TT) ) FRZ_TT = ( QIW_AN + QIW_LS - FRZ_TT ) / DT !! TOT_WATER_VMI_1 = SUM( ( Q + QLW_LS + QLW_AN + QIW_LS + QIW_AN + QRN_CU)*MASS + QLWDTR*DT , 3 ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! IF( ASSOCIATED(DCNVi) ) DCNVi = QIW_AN IF( ASSOCIATED(DCNVL) ) DCNVL = QLW_AN CALL cnvsrc ( & IM,JM,LM , & DT , & CNVICEPARAM , & CTLV%SCLMFDFR , & MASS , & iMASS , & PP , & TEMP , & Q , & QLWDTR , & RMFDTR , & QLW_AN , & QIW_AN , & CLDFRC , & ANVFRC , & QST3 ) IF( ASSOCIATED(DCNVi) ) DCNVi = ( QIW_AN - DCNVi ) / DT IF( ASSOCIATED(DCNVL) ) DCNVL = ( QLW_AN - DCNVL ) / DT !! TOT_WATER_VMI_1 = SUM( ( Q + QLW_LS + QLW_AN + QIW_LS + QIW_AN + QRN_CU)*MASS , 3 ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! IF( ASSOCIATED(PDFL) ) PDFL = QLW_LS+QLW_AN IF( ASSOCIATED(PDFI) ) PDFI = QIW_LS+QIW_AN call pdf_spread (U,V,KH,DZET,CNV_UPDFRC,ALPHA,ALPHT,ALPH1,ALPH2 ) ! impose a minimum amount of variability ALPHA = MAX( ALPHA , 1.0 - RH00 ) RHCRIT = 1.0 - ALPHA call hystpdf( & IM,JM,LM , & DT,ALPHA , & PP , & Q , & QLW_LS , & QLW_AN , & QIW_LS , & QIW_AN , & TEMP , & CLDFRC , & ANVFRC , & RHXX , & CFPDFX ) IF( ASSOCIATED(RHX) ) RHX = Q/QSAT( TEMP, PP ) IF( ASSOCIATED(CFPDF) ) CFPDF = CLDFRC IF( ASSOCIATED(PDFL) ) PDFL = ( QLW_LS + QLW_AN - PDFL ) / DT IF( ASSOCIATED(PDFI) ) PDFI = ( QIW_LS + QIW_AN - PDFI ) / DT !! TOT_WATER_VMI_1 = SUM( ( Q + QLW_LS + QLW_AN + QIW_LS + QIW_AN + QRN_CU)*MASS , 3 ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! TOTFRC = CLDFRC + ANVFRC WHERE ( TOTFRC > 1.00 ) CLDFRC = CLDFRC*(1.00 / TOTFRC ) ANVFRC = ANVFRC*(1.00 / TOTFRC ) ENDWHERE TOTFRC = CLDFRC + ANVFRC !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! ! Total Condensate Source !!!!!!!!!!!!!!!!!!!!!!!!!!! QTMP1 = QLW_LS + QLW_AN !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! CONDENSATE/FRACTION SOURCES FINISHED. NOW LOSE CLOUD CONDENSATE !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! ! Total Condensate Sink !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! E V A P O R A T I O N !! A N D !! S U B L I M A T I O N !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! IF( ASSOCIATED(EVAPC) ) EVAPC = QLW_LS+QLW_AN IF( ASSOCIATED(SUBLC) ) SUBLC = QIW_LS+QIW_AN call evap3( & IM,JM,LM , & DT , & RHCRIT , & PP , & TEMP , & Q , & QLW_AN , & QIW_AN , & ANVFRC , & CLDFRC , & QST3 ) call subl3( & IM,JM,LM , & DT , & RHCRIT , & PP , & TEMP , & Q , & QLW_AN , & QIW_AN , & ANVFRC , & CLDFRC , & QST3 ) IF( ASSOCIATED(EVAPC) ) EVAPC = ( EVAPC - (QLW_LS+QLW_AN) ) / DT IF( ASSOCIATED(SUBLC) ) SUBLC = ( SUBLC - (QIW_LS+QIW_AN) ) / DT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! QTMP1 = QLW_LS + QLW_AN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! TOT_WATER_VMI_1 = SUM( ( Q + QLW_LS + QLW_AN + QIW_LS + QIW_AN + QRN_CU)*MASS , 3 ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! A U T O C O N V E R S I O N !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! FRACTION_REMOVAL = 0 -> none ! 1 -> constant in-cloud QC ! 2 -> trim high edge of PDF !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! IF( ASSOCIATED(AUT) ) AUT = QLW_LS+QLW_AN FRACTION_REMOVAL = 1 call autocon3( & IM,JM,LM , & DT , & QLW_LS , & QRN_LS , & TEMP , & PP , & KH , & CLDFRC , & LS_SDQV2 , & LS_SDQV3 , & LS_SDQVT1 , & FRACTION_REMOVAL ) FRACTION_REMOVAL = 0 call autocon3( & IM,JM,LM , & DT , & QLW_AN , & QRN_AN , & TEMP , & PP , & KH , & ANVFRC , & ANV_SDQV2 , & ANV_SDQV3 , & ANV_SDQVT1 , & FRACTION_REMOVAL ) IF( ASSOCIATED(AUT) ) AUT = ( AUT - ( QLW_AN + QLW_LS ) )/DT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Ice cloud settling !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! IF( ASSOCIATED(SDM) ) SDM = QIW_AN+QIW_LS FRACTION_REMOVAL = 0 CALL SETTLE_VEL( & IM, JM, LM , & WRHODEP , & QIW_AN , & PP , & TEMP , & ANVFRC , & KH , & VFALL , & ANVIL = 1 ) VFALL = ANV_ICEFALL_C * VFALL CALL ICEFALL( & QIW_AN , & DZET , & QSN_AN , & VFALL , & ANVFRC , & DT , & FRACTION_REMOVAL ) FRACTION_REMOVAL = 1 CALL SETTLE_VEL( & IM, JM, LM , & WRHODEP , & QIW_LS , & PP , & TEMP , & CLDFRC , & KH , & VFALL , & LARGESCALE = 1 ) VFALL = LS_ICEFALL_C * VFALL CALL ICEFALL( & QIW_LS , & DZET , & QSN_LS , & VFALL , & CLDFRC , & DT , & FRACTION_REMOVAL ) IF( ASSOCIATED(SDM) ) SDM = ( SDM - (QIW_LS + QIW_AN) )/DT IF( ASSOCIATED(DQRL) ) DQRL = ( QRN_LS + QRN_AN + QSN_LS + QSN_AN ) / DT !! TOT_WATER_VMI_2 = SUM( ( Q + QLW_LS + QLW_AN + QIW_LS + QIW_AN + QRN_CU & !! + QRN_LS + QRN_AN + QSN_LS + QSN_AN)*MASS , 3 ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Add in convective rain !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! CU-FREEZE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Also "freeze" out any conv. precip that needs ! to be since this isn't done in RAS. This is ! precip w/ large particles, so freezing is ! strict. Check up on this!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! QTMP2 = 0. where( TEMP < MAPL_TICE ) QTMP2 = QRN_CU QSN_CU = QRN_CU QRN_CU = 0. TEMP = TEMP + QSN_CU*(MAPL_ALHS-MAPL_ALHL) / MAPL_CP endwhere IF( ASSOCIATED(FRZ_PP) ) FRZ_PP = FRZ_PP + QTMP2/DT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Water after all local conversions !! TOT_WATER_VMI_2 = SUM( ( Q + QLW_LS + QLW_AN + QIW_LS + QIW_AN + QRN_CU + QSN_CU & !! + QRN_LS + QRN_AN + QSN_LS + QSN_AN)*MASS , 3 ) !---------------------------------------------------------------------------------------------- ! Column will now be swept from top-down for precip accumulation/accretion/re-evaporation !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! ZERO DIAGNOSTIC OUTPUTS BEFORE SHOWERS !! PRELS(:,:) = 0. PRECU(:,:) = 0. PREAN(:,:) = 0. SNRCU(:,:) = 0. SNRLS(:,:) = 0. SNRAN(:,:) = 0. !!FRAC_SHOWERS(:) = 1./NSHOWERS TOT_PREC_VMI = SUM( ( QRN_CU + QSN_CU ) * MASS , 3 ) AREA_UPD_PRC = SUM( CNV_UPDFRC* ( QRN_CU + QSN_CU )* MASS , 3 ) WHERE ( TOT_PREC_VMI > 0.0 ) AREA_UPD_PRC = MAX( AREA_UPD_PRC/TOT_PREC_VMI, 1.E-6 ) ENDWHERE TOT_PREC_VMI = SUM( ( QRN_AN + QSN_AN ) * MASS , 3 ) AREA_ANV_PRC = SUM( ANVFRC*( QRN_AN + QSN_AN ) * MASS , 3 ) WHERE ( TOT_PREC_VMI > 0.0 ) AREA_ANV_PRC = MAX( AREA_ANV_PRC/TOT_PREC_VMI, 1.E-6 ) ENDWHERE TOT_PREC_VMI = SUM( ( QRN_LS + QSN_LS ) * MASS , 3 ) AREA_LS_PRC = SUM( CLDFRC* ( QRN_LS + QSN_LS ) * MASS , 3 ) WHERE ( TOT_PREC_VMI > 0.0 ) AREA_LS_PRC = MAX( AREA_LS_PRC/TOT_PREC_VMI , 1.E-6 ) ENDWHERE AREA_LS_PRC = LS_BETA * AREA_LS_PRC AREA_UPD_PRC= CNV_BETA * AREA_UPD_PRC AREA_ANV_PRC= ANV_BETA * AREA_ANV_PRC !! "couple" to diagnostic areal fraction output !! Intensity factor in PRECIP3 is floored at !! 1.0. So this is fair. LSARF = MIN( AREA_LS_PRC, 1.0 ) CUARF = MIN( AREA_UPD_PRC, 1.0 ) ANARF = MIN( AREA_ANV_PRC, 1.0 ) ! First a downdraft involving anvil precip !call DNDRFTDRVR ( DT, TEMP, Q, QLW_AN, QIW_AN, QRN_AN, QSN_AN , & ! ZLO, ZLE, PP , PPE, EXNP, CNV_MFC ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! GET SOME MICROPHYSICAL QUANTITIES CALL MICRO_AA_BB_3( TEMP,PP,QST3,AA3,BB3 ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! QTMP1 = QLW_LS + QLW_AN QTMP2 = QIW_LS + QIW_AN call PRECIP3 ( & IM,JM,LM , & DT , & FRLAND , & RHCRIT , & QRN_CU , & QSN_CU , & QTMP1 , & QTMP2 , & TEMP , & Q , & mass , & imass , & PPE , & PP , & DZET , & AA3 , & BB3 , & AREA_UPD_PRC , & PRECU , & SNRCU , & REV_CN , & RSU_CN , & ACLL_CN , & ACIL_CN , & PFL_CN , & PFI_CN , & FRZ_PP , & ENVFC = CNVENVFC , DDRFC = CNVDDRFC ) call PRECIP3 ( & IM,JM,LM , & DT , & FRLAND , & RHCRIT , & QRN_AN , & QSN_AN , & QTMP1 , & QTMP2 , & TEMP , & Q , & mass , & imass , & PPE , & PP , & DZET , & AA3 , & BB3 , & AREA_ANV_PRC , & PREAN , & SNRAN , & REV_AN , & RSU_AN , & ACLL_AN , & ACIL_AN , & PFL_AN , & PFI_AN , & FRZ_PP , & DDRFC = ANVDDRFC ) call PRECIP3 ( & IM,JM,LM , & DT , & FRLAND , & RHCRIT , & QRN_LS , & QSN_LS , & QTMP1 , & QTMP2 , & TEMP , & Q , & mass , & imass , & PPE , & PP , & DZET , & AA3 , & BB3 , & AREA_LS_PRC , & PRELS , & SNRLS , & REV_LS , & RSU_LS , & ACLL_LS , & ACIL_LS , & PFL_LS , & PFI_LS , & FRZ_PP , & DDRFC = LSDDRFC ) WHERE ( (QLW_LS+QLW_AN) > 0.00 ) QTMP3 = 1./(QLW_LS+QLW_AN) ELSEWHERE QTMP3 = 0.0 ENDWHERE QLW_LS = QLW_LS * QTMP1 * QTMP3 QLW_AN = QLW_AN * QTMP1 * QTMP3 WHERE ( (QIW_LS+QIW_AN) > 0.00 ) QTMP3 = 1./(QIW_LS+QIW_AN) ELSEWHERE QTMP3 = 0.0 ENDWHERE QIW_LS = QIW_LS * QTMP2 * QTMP3 QIW_AN = QIW_AN * QTMP2 * QTMP3 !! TOT_WATER_VMI_3 = SUM( ( Q + QLW_LS + QLW_AN + QIW_LS + QIW_AN)*MASS , 3 ) & !! + (PRECU + SNRCU + PRELS + SNRLS + PREAN + SNRAN )*DT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! TH = TEMP / EXNP NN_ANVIL = N_ANVIL * 1.e6 NN_ICE = N_ICE * 1.e6 NN_WARM = N_WARM * 1.e6 !!#if 0 call RADCOUPLE ( & IM, JM, LM, & TEMP, & PP, & CLDFRC, & ANVFRC, & QLW_LS, & QIW_LS, & QLW_AN, & QIW_AN, & RAD_QL, & RAD_QI, & RAD_CLDFRC, & CLDREFFL, & CLDREFFI, & CLDVOL2FRC, & NN_ANVIL,NN_ICE,NN_WARM, & DISABLE_RAD ) END SUBROUTINE PROGNO_CLOUD !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! P R O C E S S S U B R O U T I N E S !! !! * * * * * !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! P R O C E S S S U B R O U T I N E S !! !! * * * * * !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! P R O C E S S S U B R O U T I N E S !! !! * * * * * !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine pdf_spread (U,V,KH,DZ,UPDF,ALPHA, ALPHT, ALPH1, ALPH2 ) real , intent(in), dimension(:,:,:) :: U,V,DZ,UPDF real , intent(in), dimension(:,:,0:) :: KH real , intent(out), dimension(:,:,:) :: ALPHA real , pointer, dimension(:,:,:) :: ALPH1, ALPH2, ALPHT integer :: i,j,l,im,jm,lm real, dimension( size(u,1) , size(u,2) , size(u,3) ) :: A1,A2,A3 ! why SHOULDNT RH-crit = 100% ???? ! alpha is the 1/2*width so RH_crit=1.0-alpha IM = size(u,1) JM = size(u,2) LM = size(u,3) alpha = 0.001 ! 0.1% RH SLOP !! DIRECTIONAL SHEAR == ABS( e_normal dot [U_z,V_z] ) A1=0. A3 = 1./SQRT( U**2 + V**2 + 0.01 ) ! inverse of wind mag A2 = V * A3 ! x-component of unit normal to (U,V) A1(:,:,2:lm-1) = ( A2(:,:,2:lm-1) * ( U(:,:,1:LM-2) - U(:,:,3:LM) ) & / ( DZ(:,:,1:LM-2)+DZ(:,:,3:LM) ) ) A2 = -U * A3 ! y-component of unit normal to (U,V) A1(:,:,2:lm-1) = ( A2(:,:,2:lm-1) * ( V(:,:,1:LM-2) - V(:,:,3:LM) ) & / ( DZ(:,:,1:LM-2)+DZ(:,:,3:LM) ) ) + A1(:,:,2:lm-1) A1 = ABS( A1 ) ! A1 is now magnitude of veering shear at layers in (m/s) /m. Thus, A1=.001 ==> 1 m/s/km ALPHA = ALPHA + 10.*A1 if(associated(ALPH1)) ALPH1 = 10.*A1 !! Total shear = SQRT( [U_z,V_z] dot [U_z,V_z] ) A1 = 0. A1(:,:,2:lm-1) = ( ( U(:,:,1:LM-2) - U(:,:,3:LM) )/ ( DZ(:,:,1:LM-2)+DZ(:,:,3:LM) ) )**2 & + ( ( V(:,:,1:LM-2) - V(:,:,3:LM) )/ ( DZ(:,:,1:LM-2)+DZ(:,:,3:LM) ) )**2 A1 = SQRT ( A1 ) ! A1 is now magnitude of TOTAL shear at layers in (m/s) /m. Thus, A1=.001 ==> 1 m/s/km ALPHA = ALPHA + 3.33*A1 !! KH values ~100 m+2 s-1 typical of strong PBLs ALPHA = ALPHA + 0.002*KH(:,:,0:LM-1) if(associated(ALPH2)) ALPH2 = 0.002*KH(:,:,0:LM-1) if(associated(ALPHT)) ALPHT = ALPHA ALPHA = MIN( ALPHA , 0.25 ) ! restrict RHcrit to > 75% end subroutine pdf_spread !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine fix_up_clouds ( & 1 IM,JM,LM , & QV , & TE , & QLC , & QIC , & CF , & QLA , & QIA , & AF ) integer, intent(in) :: IM,JM,LM real , intent(inout), dimension(IM,JM,LM) :: TE,QV,QLC,CF,QLA,AF,QIC,QIA ! Fix if Anvil cloud fraction too small WHERE ( AF < 1.E-5 ) QV = QV + QLA + QIA TE = TE - (MAPL_ALHL/MAPL_CP)*QLA - (MAPL_ALHS/MAPL_CP)*QIA AF = 0. QLA = 0. QIA = 0. ENDWHERE ! Fix if LS cloud fraction too small WHERE ( CF < 1.E-5 ) QV = QV + QLC + QIC TE = TE - (MAPL_ALHL/MAPL_CP)*QLC - (MAPL_ALHS/MAPL_CP)*QIC CF = 0. QLC = 0. QIC = 0. ENDWHERE ! LS LIQUID too small WHERE ( QLC < 1.E-8 ) QV = QV + QLC TE = TE - (MAPL_ALHL/MAPL_CP)*QLC QLC = 0. ENDWHERE ! LS ICE too small WHERE ( QIC < 1.E-8 ) QV = QV + QIC TE = TE - (MAPL_ALHS/MAPL_CP)*QIC QIC = 0. ENDWHERE ! Anvil LIQUID too small WHERE ( QLA < 1.E-8 ) QV = QV + QLA TE = TE - (MAPL_ALHL/MAPL_CP)*QLA QLA = 0. ENDWHERE ! Anvil ICE too small WHERE ( QIA < 1.E-8 ) QV = QV + QIA TE = TE - (MAPL_ALHS/MAPL_CP)*QIA QIA = 0. ENDWHERE ! Fix ALL cloud quants if Anvil cloud LIQUID+ICE too small WHERE ( ( QLA + QIA ) < 1.E-8 ) QV = QV + QLA + QIA TE = TE - (MAPL_ALHL/MAPL_CP)*QLA - (MAPL_ALHS/MAPL_CP)*QIA AF = 0. QLA = 0. QIA = 0. ENDWHERE ! Ditto if LS cloud LIQUID+ICE too small WHERE ( ( QLC + QIC ) < 1.E-8 ) QV = QV + QLC + QIC TE = TE - (MAPL_ALHL/MAPL_CP)*QLC - (MAPL_ALHS/MAPL_CP)*QIC CF = 0. QLC = 0. QIC = 0. ENDWHERE end subroutine fix_up_clouds !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine meltfrz ( & 2 IM,JM,LM , & DT , & TE , & QL , & QI ) real , intent(in) :: DT integer, intent(in) :: IM,JM,LM real , intent(inout), dimension(:,:,:) :: TE,QL,QI real , dimension(im,jm,lm) :: fQi,dQil real :: taufrz taufrz = 1000. fQi = ice_fraction( TE ) dQil = 0. ! freeze liquid where( TE <= T_ICE_MAX ) dQil = Ql *(1.0 - EXP( -Dt * fQi / taufrz ) ) endwhere dQil = max( 0., dQil ) Qi = Qi + dQil Ql = Ql - dQil TE = TE + (MAPL_ALHS-MAPL_ALHL)*dQil/MAPL_CP dQil = 0. ! melt ice instantly above 0^C where( TE > T_ICE_MAX ) dQil = -Qi endwhere dQil = max( 0., dQil ) Qi = Qi + dQil Ql = Ql - dQil TE = TE + (MAPL_ALHS-MAPL_ALHL)*dQil/MAPL_CP end subroutine meltfrz !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine hystpdf ( & 1 IM,JM,LM , & DT,ALPHA , & PL , & QV , & QCl , & QAl , & QCi , & QAi , & TE , & CF , & AF , & RH_DIAG , & CF_DIAG ) real , intent(in) :: DT ! ,ALPHA integer, intent(in) :: IM,JM,LM real , intent(in) , dimension(IM,JM,LM) :: PL,ALPHA real , intent(inout), dimension(IM,JM,LM) :: TE,QV,QCl,QCi,CF,QAl,QAi,AF ! optional diagnostics real , pointer, dimension(:,:,:) :: RH_DIAG,CF_DIAG ! internal arrays real , dimension(IM,JM,LM) :: QCO, QVO, CFO, QAO, TAU real , dimension(IM,JM,LM) :: QT, QMX, QMN, DQ, QVtop real , dimension(IM,JM,LM) :: TEO,QSx,DQsx,QS,DQs real , dimension(IM,JM,LM) :: QCx, QVx, CFx, QAx, QC, QA, fQi, fQi_A real , dimension(IM,JM,LM) :: dQAi, dQAl, dQCi, dQCl real , dimension(IM,JM,LM) :: tmpARR ! internal scalars integer :: N QC = QCl + QCi QA = QAl + QAi where( QA > 0.0 ) fQi_A = QAi / QA elsewhere fQi_A = 0.0 endwhere TEo = TE DQSx = DQSAT( & TEo , & PL , QSAT=QSx ) where( AF < 1.0 ) tmpARR = 1./(1.-AF) elsewhere tmpARR = 0.0 endwhere CFx = CF*tmpARR QCx = QC*tmpARR QVx = ( QV - QSx*AF )*tmpARR where( AF >= 1.0 ) QVx = QSx*1.e-4 endwhere where( AF > 0. ) QAx = QA/AF elsewhere QAx = 0. endwhere QT = QCx + QVx fQi = ice_fraction( TE ) do n=1,3 ! DQS = DQSAT( & ! TEo , & ! PL ,QSAT = QS ) DQS = DQSx QS = QSx + DQS*(TEo - TE ) QS = MAX( QS , 1.0e-7 ) DQ = 2.0*ALPHA*QS DQ = MIN( DQ , QT ) ! Disallow PDF from going into negative QTs QMX = QT + 0.5*DQ QMN = QT - 0.5*DQ WHERE( QMX < QS ) CFo = 0. QCo = 0. ENDWHERE WHERE( (QMN < QS) .AND. (QS <= QMX) ) CFo = (QMX - QS)/DQ QCo = 0.5*CFo*(QMX -QS) ENDWHERE WHERE( QMN >= QS ) CFo = 1.0 QCo = QT - QS ENDWHERE TAU = DT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! These lines represent adjustments ! to anvil condensate due to the ! assumption of a stationary TOTAL ! water PDF subject to a varying ! QSAT value during the iteration !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! where( AF > 0. ) QAo = QAx ! + QSx - QS elsewhere QAo = 0. endwhere !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! CFo = CFx + (DT/TAU)*( CFo - CFx ) QCo = QCx + (DT/TAU)*( QCo - QCx ) / ( 1.0 + DQS*MAPL_ALHL/MAPL_CP ) QVo = QVx - (QCo - QCx) TEo = TE + (1.0-fQi)*(MAPL_ALHL/MAPL_CP)*( (QCo - QCx)*(1.-AF) + (QAo-QAx)*AF ) & + fQi* (MAPL_ALHS/MAPL_CP)*( (QCo - QCx)*(1.-AF) + (QAo-QAx)*AF ) if(associated(RH_DIAG)) RH_DIAG = QVo / QS if(associated(CF_DIAG)) CF_DIAG = CFo enddo ! qsat iteration ! Update prognostic variables. Deal with special case of AF=1 ! Temporary variables QCo, QAo become updated grid means. where( AF < 1.0 ) CF = CFo * ( 1.-AF) QCo = QCo * ( 1.-AF) QAo = QAo * AF elsewhere ! Special case AF=1, i.e., box filled with anvil. ! - Note: no guarantee QV_box > QS_box CF = 0. ! Remove any other cloud QAo = QA + QC ! Add any LS condensate to anvil type QCo = 0. ! Remove same from LS QT = QAo + QV ! Total water ! Now set anvil condensate to any excess of total water ! over QSx (saturation value at top) QAo = MAX( QT - QSx, 0. ) endwhere ! Now take {\em New} condensate and partition into ice and liquid ! taking care to keep both >=0 separately. New condensate can be ! less than old, so $\Delta$ can be < 0. QCx = QCo - QC dQCl = (1.0-fQi)*QCx dQCi = fQi * QCx where((QCl+dQCl)<0.) dQCi = dQCi + (QCl+dQCl) dQCl = -QCl !== dQCl - (QCl+dQCl) endwhere where((QCi+dQCi)<0.) dQCl = dQCl + (QCi+dQCi) dQCi = -QCi !== dQCi - (QCi+dQCi) endwhere QAx = QAo - QA dQAl = QAx ! (1.0-fQi)*QAx dQAi = 0. ! fQi * QAx where((QAl+dQAl)<0.) dQAi = dQAi + (QAl+dQAl) dQAl = -QAl endwhere where((QAi+dQAi)<0.) dQAl = dQAl + (QAi+dQAi) dQAi = -QAi endwhere ! Clean-up cloud if fractions are too small where( AF < 1.e-5 ) dQAi = -QAi dQAl = -QAl endwhere where( CF < 1.e-5 ) dQCi = -QCi dQCl = -QCl endwhere QAi = QAi + dQAi QAl = QAl + dQAl QCi = QCi + dQCi QCl = QCl + dQCl QV = QV - ( dQAi+dQCi+dQAl+dQCl) !!TE = TE + (MAPL_ALHS/MAPL_CP)*(dQAi+dQCi) + (MAPL_ALHL/MAPL_CP)*(dQAl+dQCl) TE = TE + (MAPL_ALHL*( dQAi+dQCi+dQAl+dQCl)+MAPL_ALHF*(dQAi+dQCi))/ MAPL_CP ! We need to take care of situations where QS moves past QA ! during QSAT iteration. This should be only when QA/AF is small ! to begin with. Effect is to make QAo negative. So, we ! "evaporate" offending QA's ! ! We get rid of anvil fraction also, although strictly ! speaking, PDF-wise, we should not do this. where( QAo <= 0. ) QV = QV + QAi + QAl TE = TE - (MAPL_ALHS/MAPL_CP)*QAi - (MAPL_ALHL/MAPL_CP)*QAl QAi = 0. QAl = 0. AF = 0. endwhere end subroutine hystpdf !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine cnvsrc ( & 1 IM,JM,LM , & DT , & ICEPARAM , & SCLMFDFR , & MASS , & iMASS , & PL , & TE , & QV , & DCF , & DMF , & QLA , & QIA , & CF , & AF , & QS ) !INPUTS: ! ! ICEPARAM: 0-1 controls how strongly new conv condensate is partitioned in ice-liquid ! 1 means partitioning follows ice_fraction(TE). 0 means all new condensate is ! liquid ! ! SCLMFDFR: Scales detraining mass flux to a cloud fraction source - kludge. Thinly justified ! by fuzziness of cloud boundaries and existence of PDF of condensates (for choices ! 0.-1.0) or by subgrid layering (for choices >1.0) integer , intent(in) :: IM,JM,LM real , intent(in) :: DT,ICEPARAM,SCLMFDFR real , dimension(IM,JM,LM), intent(in) :: MASS,iMASS real , dimension(IM,JM,LM), intent(in) :: DMF,PL real , dimension(IM,JM,LM), intent(in) :: DCF,CF,QS real , dimension(IM,JM,LM), intent(inout) :: AF,TE,QV real , dimension(IM,JM,LM), intent(inout) :: QLA, QIA real , dimension(IM,JM,LM) :: TEND,QVx,QCA,fQi integer :: STRATEGY real :: minrhx STRATEGY = 1 !Minimum allowed env RH minrhx = 0.001 !Addition of condensate from RAS TEND = DCF*iMASS fQi = 0.0 + ICEPARAM*ice_fraction( TE ) QLA = QLA + (1.0-fQi)* TEND*DT QIA = QIA + fQi * TEND*DT ! dont forget that conv cond has never frozen !!!! TE = TE + (MAPL_ALHS-MAPL_ALHL) * fQi * TEND*DT/MAPL_CP QCA = QLA + QIA !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! Tiedtke-style anvil fraction !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! TEND=DMF*iMASS * SCLMFDFR AF = AF + TEND*DT AF = MIN( AF , 0.99 ) ! where ( (AF+CF) > 1.00 ) ! AF=1.00-CF ! endwhere !!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Check for funny (tiny, negative) ! external QV s, resulting from assumed ! QV=QSAT within anvil. ! ! Two strategies to fix ! 1) Simply constrain AF assume condensate ! just gets "packed" in ! 2) Evaporate QCA to bring up QVx leave AF alone ! Should include QSAT iteration, but ... !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! QS = QSAT( & ! TE , & ! PL ) where ( AF < 1.0 ) QVx = ( QV - QS * AF )/(1.-AF) elsewhere QVx = QS endwhere if (STRATEGY==1) then where ( (( QVx - minrhx*QS ) < 0.0 ) .and. (AF > 0.) ) AF = (QV - minrhx*QS )/( QS*(1.0-minrhx) ) endwhere where ( AF < 0. ) ! If still cant make suitable env RH then destroy anvil AF = 0. QV = QV + QLA + QIA TE = TE - (MAPL_ALHL*QLA + MAPL_ALHS*QIA)/MAPL_CP QLA = 0. QIA = 0. endwhere endif if (STRATEGY==2) then where ( (( QVx - minrhx*QS ) < 0.0 ) .and. (AF > 0.) ) QV = QV + (1.-AF)*( minrhx*QS - QVx ) QCA = QCA - (1.-AF)*( minrhx*QS - QVx ) TE = TE - (1.-AF)*( minrhx*QS - QVx )*MAPL_ALHL/MAPL_CP endwhere endif end subroutine cnvsrc !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine evap3 ( & 1 IM,JM,LM , & DT, RHCR , & PL , & TE , & QV , & QL , & QI , & F , & XF , & QS ) ! , & !! NN ) integer, intent(in) :: IM,JM,LM real , intent(in ) :: DT ! , RHCR real , dimension(IM,JM,LM) , intent(in ) :: PL, RHCR real , dimension(IM,JM,LM) , intent(inout) :: TE real , dimension(IM,JM,LM) , intent(inout) :: QV real , dimension(IM,JM,LM) , intent(inout) :: QL,QI real , dimension(IM,JM,LM) , intent(inout) :: F real , dimension(IM,JM,LM) , intent(in ) :: XF real , dimension(IM,JM,LM) , intent(in ) :: QS !real , dimension(IM,JM,LM) , intent(in ) :: NN real , dimension(IM,JM,LM) :: ES,NN,RADIUS,K1,K2,TEFF,QCm,EVAP,RHx,QC !,QS real, parameter :: epsilon = MAPL_H2OMW/MAPL_AIRMW real, parameter :: K_COND = 2.4e-2 ! J m**-1 s**-1 K**-1 real, parameter :: DIFFU = 2.2e-5 ! m**2 s**-1 real :: A_eff A_EFF = CLD_EVP_EFF !NN = N_CCN*1.0E6 ! convert to particles per cubic METER from N/(cm**3) NN = 50.*1.0e6 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! EVAPORATION OF CLOUD WATER. !! !! !! !! DelGenio et al (1996, J. Clim., 9, 270-303) !! !! formulation (Eq.'s 15-17) !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! QS = QSAT( & ! TE , & ! PL ) ES = 100.* PL * QS / ( EPSILON + (1.0-EPSILON)*QS ) ! (100's <-^ convert from mbar to Pa) RHx = MIN( QV/QS , 1.00 ) K1 = (MAPL_ALHL**2) * RHO_W / ( K_COND*MAPL_RVAP*(TE**2)) K2 = MAPL_RVAP * TE * RHO_W / ( DIFFU * (1000./PL) * ES ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! Here DIFFU is given for 1000 mb !! !! so 1000./PR accounts for inc- !! !! reased diffusivity at lower !! !! pressure. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! where ( ( F > 0.) .and. ( QL > 0. ) ) QCm=QL/F elsewhere QCm=0. endwhere RADIUS = LDRADIUS3(PL,TE,QCm,NN) where( (RHx < RHCR ) .and.(RADIUS > 0.0) ) TEFF = (RHCR - RHx) / ((K1+K2)*RADIUS**2) ! / (1.00 - RHx) elsewhere TEFF = 0.0 ! -999. endwhere EVAP = a_eff*QL*DT*TEFF EVAP = MIN( EVAP , QL ) QC=QL+QI where (QC > 0.) F = F * ( QC - EVAP ) / QC endwhere QV = QV + EVAP QL = QL - EVAP TE = TE - (MAPL_ALHL/MAPL_CP)*EVAP end subroutine evap3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine subl3 ( & 1 IM,JM,LM , & DT, RHCR , & PL , & TE , & QV , & QL , & QI , & F , & XF , & QS ) ! , & !! NN ) integer, intent(in) :: IM,JM,LM real , intent(in ) :: DT !, RHCR real , dimension(IM,JM,LM) , intent(in ) :: PL, RHCR real , dimension(IM,JM,LM) , intent(inout) :: TE real , dimension(IM,JM,LM) , intent(inout) :: QV real , dimension(IM,JM,LM) , intent(inout) :: QL,QI real , dimension(IM,JM,LM) , intent(inout) :: F real , dimension(IM,JM,LM) , intent(in ) :: XF real , dimension(IM,JM,LM) , intent(in ) :: QS !real , dimension(IM,JM,LM) , intent(in ) :: NN real , dimension(IM,JM,LM) :: ES,NN,RADIUS,K1,K2,TEFF,QCm,SUBL,RHx,QC !, QS real, parameter :: epsilon = MAPL_H2OMW/MAPL_AIRMW real, parameter :: K_COND = 2.4e-2 ! J m**-1 s**-1 K**-1 real, parameter :: DIFFU = 2.2e-5 ! m**2 s**-1 real :: A_eff A_EFF = CLD_EVP_EFF !NN = N_CCN*1.0E6 ! convert to particles per cubic METER from N/(cm**3) NN = 5.*1.0e6 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! SUBLORATION OF CLOUD WATER. !! !! !! !! DelGenio et al (1996, J. Clim., 9, 270-303) !! !! formulation (Eq.'s 15-17) !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! QS = QSAT( & ! TE , & ! PL ) ES = 100.* PL * QS / ( EPSILON + (1.0-EPSILON)*QS ) ! (100's <-^ convert from mbar to Pa) RHx = MIN( QV/QS , 1.00 ) K1 = (MAPL_ALHL**2) * RHO_W / ( K_COND*MAPL_RVAP*(TE**2)) K2 = MAPL_RVAP * TE * RHO_W / ( DIFFU * (1000./PL) * ES ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! Here DIFFU is given for 1000 mb !! !! so 1000./PR accounts for inc- !! !! reased diffusivity at lower !! !! pressure. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! where ( ( F > 0.) .and. ( QI > 0. ) ) QCm=QI/F elsewhere QCm=0. endwhere RADIUS = LDRADIUS3(PL,TE,QCm,NN) where( (RHx < RHCR ) .and.(RADIUS > 0.0) ) TEFF = ( RHCR - RHx) / ((K1+K2)*RADIUS**2) ! / (1.00 - RHx) elsewhere TEFF = 0.0 ! -999. endwhere SUBL = a_eff*QI*DT*TEFF SUBL = MIN( SUBL , QI ) QC=QL+QI where (QC > 0.) F = F * ( QC - SUBL ) / QC endwhere QV = QV + SUBL QI = QI - SUBL TE = TE - (MAPL_ALHS/MAPL_CP)*SUBL end subroutine subl3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine autocon3 ( & 2,1 IM,JM,LM, & DT , & QC , & QP , & TE , & PL , & KH , & F , & SUNDQV2 , & SUNDQV3 , & SUNDQT1 , & FRACTION_REMOVAL ) integer, intent(in) :: IM,JM,LM,FRACTION_REMOVAL real , intent(in ) :: DT real , dimension(IM,JM,LM) , intent(in ) :: TE real , dimension(IM,JM,LM) , intent(in ) :: PL real, intent(in ) , dimension(IM,JM,0:LM) :: KH real , dimension(IM,JM,LM) , intent(inout) :: QC real , dimension(IM,JM,LM) , intent(inout) :: QP real , dimension(IM,JM,LM) , intent(inout) :: F real , intent(in) :: SUNDQV2, SUNDQV3, SUNDQT1 integer :: NSMX real :: ACF0, ACF, DTX real , dimension(IM,JM,LM) :: C00x, iQCcrx, F2, F3,RATE,dQP,QCm integer :: NS !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Precip. conversion from Smith (1990, ! ! QJRMS, 116, 435, Eq. 2.29). Similar ! ! to Del Genio's Eq.(10). ! ! ! ! Coalesence term needs to be determined ! ! through entire column and is done in ! ! subroutine "ACCRETE_EVAP_PRECIP" ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! NSMX = NSMAX DTX = DT/NSMX CALL SUNDQ3_ICE3( IM, JM, LM, TE, SUNDQV2, SUNDQV3, SUNDQT1, F2, F3 ) C00x = C_00 * F2 * F3 !QCcrx = LWCRIT / ( F2 * F3 ) iQCcrx = F2 * F3 / LWCRIT where ( ( F > 0.) .and. ( QC > 0. ) ) QCm = QC/F elsewhere QCm = 0. endwhere RATE = C00x * ( 1.0 - EXP( - ( QCm * iQCcrx )**2 ) ) !! temporary kluge until we can figure a better to make !! thicker low clouds ( reuse arrays F2 and F3 ) F2 = 1.0 !where( KH(:,:,0:LM-1) > 10. ) ! F2 = 0.1 !endwhere F3 = 1.0 where( PL > 700. ) F3 = MAX( 1.0 - (PL - 700.)/300. , 0.1 ) endwhere F3 = MAX( F3*F2 , 0.1 ) RATE = F3 * RATE dQP = QC*( 1.0 - EXP( -RATE * DT ) ) dQP = MAX( dQP , 0.0 ) ! Protects against floating point problems for tiny RATE QC = QC - dQP QP = QP + dQP SELECT CASE( FRACTION_REMOVAL ) CASE( 0 ) ! do NOTHING CASE( 1 ) where( (QC + dQP) > 0. ) F = QC * F / (QC + dQP ) endwhere CASE( 2 ) where( (QC + dQP) > 0. .and. QC > 0. ) F = F * SQRT( QC / (QC + dQP ) ) endwhere CASE( 3 ) where( (QC + dQP) > 0. .and. QC > 0. ) F = F * ( QC / (QC + dQP ) )**0.333 endwhere END SELECT RETURN END SUBROUTINE AUTOCON3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine DNDRFTDRVR ( DT, TEMP, QV, QL, QI, QPL, QPI, & ZLO, ZLE, PLO, PLE, PK, UMFC ) real, intent(in ) :: DT real, dimension(:,:,:), intent(inout) :: TEMP,QV,QL,QI,QPL,QPI real, dimension(:,:,:), intent(in ) :: ZLO,PLO,PK real, dimension(:,:,0:), intent(in ) :: UMFC,ZLE,PLE type (T_DDF_CTL) :: CTL integer :: I,J,L,IM,JM,LM !!real, dimension( 1 : size(TEMP,3) ) :: DDF_DQDTz, DDF_DTDTz !!real, dimension( 0 : size(TEMP,3) ) :: DDF_MFCz !!real :: DDF_ZSCALEz real, dimension(:), pointer :: DDF_DQDTz, DDF_DTDTz, DDF_MUPHz, DDF_TCz,DDF_QCz real, dimension(:), pointer :: DDF_MFCz, DDF_RH1z, DDF_RH2z, DDF_BYNCz real :: DDF_ZSCALEz IM=size(TEMP,1) JM=size(TEMP,2) LM=size(TEMP,3) allocate( DDF_MFCz(0:LM) ) allocate( DDF_MUPHz(1:LM) ) allocate( DDF_DQDTz(1:LM) ) allocate( DDF_DTDTz(1:LM) ) allocate( DDF_BYNCz(1:LM) ) allocate( DDF_RH1z(1:LM) ) allocate( DDF_RH2z(1:LM) ) allocate( DDF_QCz(1:LM) ) allocate( DDF_TCz(1:LM) ) CTL%ALPHA_DDF_UDF = 0.1 CTL%AREAL_FRACTION = 0.1 ! CTL%PARTITION%TYPE = "UNIFORM" ! CTL%PARTITION%RATIO = 0.5 CTL%PARTITION%TYPE = "HEIGHT_DEP" CTL%PARTITION%MAX_RATIO = 0.9 CTL%PARTITION%MIN_RATIO = 0.1 CTL%THETA_IS_THVAR = .FALSE. ! Comment out to avoid conflicts at compilation if ddf changes !-------------------------------------------------------------- ! do I=1,IM ! do J=1,JM ! ! call DDF1( CTL , DT , TEMP(I,J,:) , & ! QV(I,J,:), QL(I,J,:), QI(I,J,:), & ! QPL(I,j,:), QPI(I,j,:), & ! ZLO(I,J,:), ZLE(I,J,:), PLO(I,J,:), & ! PLE(I,J,:), PK(I,J,:), UMFC(I,J,:) , & ! DDF_ZSCALEz, DDF_DQDTz, DDF_DTDTz, & ! DDF_MUPHz, DDF_RH1z, DDF_RH2z, DDF_BYNCz, DDF_TCz, DDF_QCz, DDF_MFCz ) ! !end do !end do ! clean up !-------------------- deallocate( DDF_MFCz ) deallocate( DDF_BYNCz ) deallocate( DDF_DQDTz ) deallocate( DDF_DTDTz ) deallocate( DDF_MUPHz ) deallocate( DDF_RH1z ) deallocate( DDF_RH2z ) deallocate( DDF_TCz ) deallocate( DDF_QCz ) end subroutine DNDRFTDRVR !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine PRECIP3 ( & 3,2 IM,JM,LM , & DT, FRLAND , & RHCR3 , & QPl , & QPi , & QCl , & QCi , & TE , & QV , & mass , & imass , & PE , & PL , & dZE , & AA , & BB , & AREA , & RAIN , & SNOW , & REVAP , & RSUBL , & ACRLL , & ACRIL , & PFL_DIAG , & PFI_DIAG , & FRZ_DIAG , & ENVFC,DDRFC ) integer, intent(in) :: IM,LM,JM real, intent(in) :: DT !, RHCR real, intent(inout), dimension(IM,JM,LM) :: QPl,QPi,QCl,QCi,TE,QV real, intent(in), dimension(IM,JM,LM) :: mass,imass,dZE,PL,AA,BB,RHCR3 real, intent(in), dimension(IM,JM,0:LM) :: PE real, intent(inout), dimension(IM,JM) :: RAIN,SNOW real, intent(in ), dimension(IM,JM) :: AREA,FRLAND real , pointer , dimension(:,:,:) :: REVAP real , pointer , dimension(:,:,:) :: RSUBL real , pointer , dimension(:,:,:) :: ACRLL,ACRIL real , pointer , dimension(:,:,: ) :: PFL_DIAG, PFI_DIAG, FRZ_DIAG real, intent(in), optional :: ENVFC,DDRFC !!real, intent(in), optional, dimension(IM,JM) :: shearf real, dimension(IM,JM,LM+1) :: ZE real, dimension(IM,JM,LM) :: PFi,PFl,QS,dQS,QDDF3,ENVFRAC real, dimension(IM,JM) :: TKo,QKo,QSTKo,DQSTKo,RH_BOX,T_ED,RHCR,QPlKo,QPiKo real, dimension(IM,JM) :: Ifactor,AREAx,RAINRAT0,SNOWRAT0 real, dimension(IM,JM) :: FALLRN,FALLSN,VEsn,VErn,NRAIN,NSNOW,Efactor real, dimension(IM,JM) :: TinLAYERrn,DIAMrn,DROPRAD real, dimension(IM,JM) :: TinLAYERsn,DIAMsn,FLAKRAD real :: B_SUB real, dimension(IM,JM) :: EVAP,SUBL,ACCR,MLTFRZ,EVAPx,SUBLx real, dimension(IM,JM) :: EVAP_DD,SUBL_DD,DDFRACT real, dimension(IM,JM) :: PSCL_QP,VMIP,LANDSEAF real, parameter :: TRMV_L = 1.0 ! m/s real :: TAU_FRZ, TAU_MLT integer :: K, NS, NSMX, itr,L !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! fraction of precip falling through "environment" vs ! through cloud IF(PRESENT(ENVFC)) THEN ENVFRAC = ENVFC ELSE ENVFRAC = 1.00 ENDIF AREAx = AREA !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! WHERE ( AREAx > 0. ) Ifactor = 1./ ( AREAx ) ELSEwhere Ifactor = 1.00 ENDwhere Ifactor = MAX( Ifactor, 1.) ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! Start at top of precip column: ! ! a) Accrete ! b) Evaporate/Sublimate ! c) Rain/Snow-out to next level down ! d) return to (a) ! ! .................................................................... ! ! Accretion formulated according to Smith (1990, Q.J.R.M.S., 116, 435 ! Eq. 2.29) ! ! Evaporation (ibid. Eq. 2.32) ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! PFl=0. PFi=0. !!! INITIALIZE DIAGNOSTIC ARRAYS !!!!!!!!!!!!!!!!!!!!! IF (ASSOCIATED(PFL_DIAG)) PFL_DIAG = 0. IF (ASSOCIATED(PFI_DIAG)) PFI_DIAG = 0. IF (ASSOCIATED(ACRIL)) ACRIL = 0. IF (ASSOCIATED(ACRLL)) ACRLL = 0. IF (ASSOCIATED(REVAP)) REVAP = 0. IF (ASSOCIATED(RSUBL)) RSUBL = 0. !!!!!!!!!!!!!! UPDATE SATURATED HUMIDITY !!!!!!!!!!!!! dQS = DQSAT ( & TE , & PL, QSAT = QS ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Calculate relative edge heights !________________________________ ZE(:,:,LM+1)=0. DO K=LM,1,-1 ZE(:,:,K)=ZE(:,:,K+1)+dZE(:,:,K) end do ! Determine a pressure depth scale ! for mass wgtd prec (==PSCL_QP) !---------------------------------- VMIP = SUM( (QPi+QPl)*MASS, 3 ) PSCL_QP = SUM( (QPi+QPl)*MASS*PL, 3 ) where(VMIP > 0.) PSCL_QP = PSCL_QP/VMIP elsewhere PSCL_QP = 999999. endwhere B_SUB = 1.00 PFl(:,:,1)=QPl(:,:,1)*MASS(:,:,1) PFi(:,:,1)=QPi(:,:,1)*MASS(:,:,1) EVAP_DD(:,:) = 0. SUBL_DD(:,:) = 0. IF(PRESENT(DDRFC)) THEN DDFRACT(:,:) = DDRFC ELSE DDFRACT(:,:) = 0.00 ENDIF DO K=2,LM RHCR = RHCR3(:,:,K) QPl(:,:,K) = QPl(:,:,K) + PFl(:,:,K-1) * iMASS(:,:,K) PFl(:,:,K-1) = 0.00 QPl(:,:,K-1) = 0.00 QPi(:,:,K) = QPi(:,:,K) + PFi(:,:,K-1) * iMASS(:,:,K) PFi(:,:,K-1) = 0.00 QPi(:,:,K-1) = 0.00 ACCR(:,:) = B_SUB * C_ACC* & ( QPl(:,:,K)*MASS(:,:,K) & ) *QCl(:,:,K) ACCR = MIN( ACCR , QCl(:,:,K) ) QPl(:,:,K) = QPl(:,:,K) + ACCR QCl(:,:,K) = QCl(:,:,K) - ACCR IF (ASSOCIATED(ACRLL)) THEN ACRLL(:,:,K) = ACCR / DT END IF !! Accretion of liquid condensate by falling ice/snow ACCR(:,:) = B_SUB * C_ACC* & ( QPi(:,:,K)*MASS(:,:,K) & ) *QCl(:,:,K) ACCR = MIN( ACCR , QCl(:,:,K) ) QPi(:,:,K) = QPi(:,:,K) + ACCR QCl(:,:,K) = QCl(:,:,K) - ACCR !! Liquid freezes when accreted by snow TE(:,:,K) = TE(:,:,K) + MAPL_ALHF*ACCR/MAPL_CP IF (ASSOCIATED(ACRIL)) THEN ACRIL(:,:,K) = ACCR / DT END IF RAINRAT0 = Ifactor*QPl(:,:,K)*MASS(:,:,K)/DT SNOWRAT0 = Ifactor*QPi(:,:,K)*MASS(:,:,K)/DT call MARSHPALMQ2(IM, JM, RAINRAT0,PL(:,:,K),DIAMrn,NRAIN,FALLrn,VErn) call MARSHPALMQ2(IM, JM, SNOWRAT0,PL(:,:,K),DIAMsn,NSNOW,FALLsn,VEsn) where( FRLAND < 0.1 ) DIAMsn = MAX( DIAMsn, 1.0e-3 ) ! Over Ocean endwhere TinLAYERrn = dZE(:,:,K) / ( FALLrn+0.01 ) TinLAYERsn = dZE(:,:,K) / ( FALLsn+0.01 ) !***************************************** ! Melting of Frozen precipitation !***************************************** TAU_FRZ = 5000. ! time scale for freezing (s). MLTFRZ = 0.0 where ( (TE(:,:,K) > MAPL_TICE ) .and.(TE(:,:,K) <= MAPL_TICE+5. ) ) MLTFRZ = TinLAYERsn * QPi(:,:,K) *( TE(:,:,K) - MAPL_TICE ) / TAU_FRZ MLTFRZ = MIN( QPi(:,:,K) , MLTFRZ ) TE(:,:,K) = TE(:,:,K) - MAPL_ALHF*MLTFRZ/MAPL_CP QPl(:,:,K) = QPl(:,:,K) + MLTFRZ QPi(:,:,K) = QPi(:,:,K) - MLTFRZ endwhere IF (ASSOCIATED(FRZ_DIAG)) FRZ_DIAG(:,:,K) = FRZ_DIAG(:,:,K) - MLTFRZ / DT MLTFRZ = 0.0 where ( TE(:,:,K) > MAPL_TICE+5. ) ! Go Ahead and melt any snow/hail left above 5 C MLTFRZ = QPi(:,:,K) TE(:,:,K) = TE(:,:,K) - MAPL_ALHF*MLTFRZ/MAPL_CP QPl(:,:,K) = QPl(:,:,K) + MLTFRZ QPi(:,:,K) = QPi(:,:,K) - MLTFRZ endwhere IF (ASSOCIATED(FRZ_DIAG)) FRZ_DIAG(:,:,K) = FRZ_DIAG(:,:,K) - MLTFRZ / DT MLTFRZ = 0.0 if ( K >= LM-1 ) THEN where ( TE(:,:,K) > MAPL_TICE+0. ) ! Go Ahead and melt any snow/hail left above 0 C in lowest layers MLTFRZ = QPi(:,:,K) TE(:,:,K) = TE(:,:,K) - MAPL_ALHF*MLTFRZ/MAPL_CP QPl(:,:,K) = QPl(:,:,K) + MLTFRZ QPi(:,:,K) = QPi(:,:,K) - MLTFRZ endwhere endif IF (ASSOCIATED(FRZ_DIAG)) FRZ_DIAG(:,:,K) = FRZ_DIAG(:,:,K) - MLTFRZ / DT !***************************************** ! Freezing of liquid precipitation !***************************************** MLTFRZ = 0.0 where ( TE(:,:,K) <= MAPL_TICE ) TE(:,:,K) = TE(:,:,K) + MAPL_ALHF*QPl(:,:,K)/MAPL_CP QPi(:,:,K) = QPl(:,:,K) + QPi(:,:,K) MLTFRZ = QPl(:,:,K) QPl(:,:,K) = 0. endwhere IF (ASSOCIATED(FRZ_DIAG)) FRZ_DIAG(:,:,K) = FRZ_DIAG(:,:,K) + MLTFRZ / DT ! ****************************************** ! In the exp below, evaporation time ! scale is determined "microphysically" ! from temp, press, and drop size. In this ! context C_EV becomes a dimensionless ! fudge-fraction. ! Also remember that these microphysics ! are still only for liquid. ! ****************************************** QKo = QV(:,:,K) TKo = TE(:,:,K) QPlKo = QPl(:,:,K) QPiKo = QPi(:,:,K) do itr = 1,3 !!! do itr = 1,1 ! DQSTKo = DQSAT ( & ! TKo , & ! PL(:,:,K),QSAT=QSTko ) DQSTKo = dQS(:,:, K) QSTKo = QS(:,:,K) + DQSTKo * ( TKo - TE(:,:,K) ) QSTKo = MAX( QSTKo , 1.0e-7 ) RH_BOX = QKo/QSTKo RH_BOX = MAX( RH_BOX , 0.55 ) ! attempt to increase precip over arid land. JTB- 11/09/2007 where( TE(:,:,K) > 294. ) RH_BOX = MAX( RH_BOX , 0.70 ) ! endwhere QKo = QV(:,:,K) TKo = TE(:,:,K) WHERE ( RH_BOX < RHCR ) Efactor = RHO_W * ( AA(:,:,K) + BB(:,:,K) ) / (RHCR - RH_BOX ) elsewhere Efactor = 9.99e9 endwhere where( FRLAND < 0.1 ) LANDSEAF = 0.5 ! Over Ocean elsewhere LANDSEAF = 0.5 ! Over Land endwhere !!!!! RAin falling !!!!!!!!!!!!!!!!!!!!!!! WHERE ( ( RH_BOX < RHCR ) .AND. ( DIAMrn > 0.00 ) .AND. ( PL(:,:,K) > 100. ) .AND. ( PL(:,:,K) < REVAP_OFF_P ) ) DROPRAD=0.5*DIAMrn T_ED = Efactor * DROPRAD**2 T_ED = T_ED * ( 1.0 + DQSTKo*MAPL_ALHL/MAPL_CP ) EVAP = QPl(:,:,K)*(1.0 - EXP( -C_EV * VErn * LANDSEAF * ENVFRAC(:,:,K) * TinLAYERrn / T_ED ) ) ELSEwhere EVAP = 0.0 ENDwhere !!!!! Snow falling !!!!!!!!!!!!!!!!!!!!!!! WHERE ( ( RH_BOX < RHCR ) .AND. ( DIAMsn > 0.00 ) .AND. ( PL(:,:,K) > 100. ) .AND. ( PL(:,:,K) < REVAP_OFF_P ) ) FLAKRAD=0.5*DIAMsn T_ED = Efactor * FLAKRAD**2 T_ED = T_ED * ( 1.0 + DQSTKo*MAPL_ALHS/MAPL_CP ) SUBL = QPi(:,:,K)*(1.0 - EXP( -C_EV * VEsn * LANDSEAF * ENVFRAC(:,:,K) * TinLAYERsn / T_ED ) ) ELSEwhere SUBL = 0.0 ENDwhere if (itr == 1) then EVAPx = EVAP SUBLx = SUBL else EVAP = (EVAP+EVAPx) /2.0 SUBL = (SUBL+SUBLx) /2.0 endif QKo=QV(:,:,K) + EVAP + SUBL TKo=TE(:,:,K) - EVAP * MAPL_ALHL / MAPL_CP - SUBL * MAPL_ALHS / MAPL_CP enddo ! Knock out weak drizzle near surface if box is dry enough (keep for MERRA??) ! if ( K >= LM-3 ) then ! where ( ( QPl(:,:,K)<1.0e-5 ) .AND. ( RH_BOX < RHCR ) ) ! EVAP = QPl(:,:,K) ! endwhere ! end if QPi(:,:,K) = QPi(:,:,K) - SUBL QPl(:,:,K) = QPl(:,:,K) - EVAP !! Put some re-evap/re-subl precip in to a \quote{downdraft} to be applied later EVAP_DD = EVAP_DD + DDFRACT*EVAP*MASS(:,:,K) EVAP = EVAP - DDFRACT*EVAP SUBL_DD = SUBL_DD + DDFRACT*SUBL*MASS(:,:,K) SUBL = SUBL - DDFRACT*SUBL ! ----- QV(:,:,K) = QV(:,:,K) + EVAP + SUBL TE(:,:,K) = TE(:,:,K) - EVAP * MAPL_ALHL / MAPL_CP - SUBL * MAPL_ALHS / MAPL_CP IF (ASSOCIATED(REVAP)) THEN REVAP(:,:,K) = EVAP / DT END IF IF (ASSOCIATED(RSUBL)) THEN RSUBL(:,:,K) = SUBL / DT END IF PFl(:,:,K) = QPl(:,:,K)*MASS(:,:,K) PFi(:,:,K) = QPi(:,:,K)*MASS(:,:,K) IF (ASSOCIATED(PFL_DIAG)) PFL_DIAG(:,:,K) = PFl(:,:,K)/DT IF (ASSOCIATED(PFI_DIAG)) PFI_DIAG(:,:,K) = PFi(:,:,K)/DT END DO ! Now re-add evap and subl from \quote(downdraft) to QV and TE field ! QDDF3 is fraction of total added in a given layer. Vertical sum ! should add up to 1.00 !--------------------------------------------------------------------------- where( ZE(:,:,1:LM) < 3000. ) QDDF3 = -( ZE(:,:,1:LM)-3000. ) * ZE(:,:,1:LM) * MASS elsewhere QDDF3 = 0. endwhere VMIP = SUM(QDDF3, 3 ) DO K=1,LM QDDF3(:,:,K) = QDDF3(:,:,K) / VMIP end do vmip = sum( qddf3 , 3) ! check DO K=1,LM EVAP = QDDF3(:,:,K)*EVAP_DD(:,:)/MASS(:,:,K) SUBL = QDDF3(:,:,K)*SUBL_DD(:,:)/MASS(:,:,K) QV(:,:,K) = QV(:,:,K) + EVAP + SUBL TE(:,:,K) = TE(:,:,K) - EVAP * MAPL_ALHL / MAPL_CP - SUBL * MAPL_ALHS / MAPL_CP IF (ASSOCIATED(REVAP)) THEN REVAP(:,:,K) = REVAP(:,:,K) + EVAP / DT END IF IF (ASSOCIATED(RSUBL)) THEN RSUBL(:,:,K) = RSUBL(:,:,K) + SUBL / DT END IF END DO RAIN = PFl(:,:,LM)/DT SNOW = PFi(:,:,LM)/DT ! For budgets etc. clear precipitating cond out layer LM QPi(:,:,LM) = 0. QPl(:,:,LM) = 0. end subroutine precip3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine ICEFALL( QI, DZ, QP, VF, F, DT, FRACTION_REMOVAL ) 2 integer, intent(in) :: FRACTION_REMOVAL real, dimension(:,:,:) :: QI , QP, DZ, F, VF real :: DT real, dimension(size(QI,1),size(QI,2),size(QI,3)) :: QIxP QIxP = QI * ( VF * DT / DZ ) QIxP = MIN( QIxP , QI ) QIxP = MAX( QIxP, 0.0 ) ! protects against precision problem QP = QP + QIxP QI = QI - QIxP SELECT CASE( FRACTION_REMOVAL ) CASE( 0 ) ! do NOTHING CASE( 1 ) where( (QI + QIxP) > 0. ) F = QI * F / (QI + QIxP ) endwhere CASE( 2 ) where( (QI + QIxP) > 0. .and. QI > 0. ) F = F * SQRT( QI / (QI + QIxP ) ) endwhere CASE( 3 ) where( (QI + QIxP) > 0. .and. QI > 0. ) F = F * ( QI / (QI + QIxP ) )**0.333 endwhere END SELECT end subroutine ICEFALL !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine SETTLE_VEL( IM, JM, LM, WXR, QI , PL, TE , F , KH , VF , LARGESCALE, ANVIL ) 2 integer, intent(in) :: IM,LM,JM real, intent(in ) :: WXR real, intent(in ) , dimension(IM,JM,LM) :: QI , F, TE, PL real, intent(in ) , dimension(IM,JM,0:LM) :: KH real, intent(out ) , dimension(IM,JM,LM) :: VF integer, intent(in), optional :: ANVIL, LARGESCALE real, dimension(IM,JM,LM) :: RHO, XIm,LXIm !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Uses Eq. 1 Lawrence and Crutzen (1998, Tellus 50B, 263-289) ! Except midlat form is taken to be for LS cloud, and tropical ! form is taken to be for ANVIL cloud !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! RHO = 1000.*100.*PL/(MAPL_RGAS*TE) ! 1000 TAKES TO g m^-3 ; 100 takes mb TO Pa where ( ( F > 0.) .and. ( QI > 0. ) ) XIm = (QI/F)*RHO elsewhere XIm = 0. endwhere WHERE( XIm > 0.) LXIm = ALOG10(XIm) elsewhere LXIm = 0.0 endwhere IF (PRESENT(ANVIL)) then VF = 128.6 + 53.2*LXIm + 5.5*LXIm**2 ENDIF IF (PRESENT(LARGESCALE)) then VF = 109.0*(XIm**0.16) ENDIF !VF = VF*100./MAX(PL,10.) ! Reduce/increase fall speeds for high/low pressure (NOT in LC98!!! ) ! Assume unmodified they represent situation at 100 mb if (WXR > 0.) then VF = VF * ( 100./MAX(PL,10.) )**WXR endif VF = VF/100. where( KH(:,:,0:LM-1) > 2.0 ) VF = 0.01 * VF endwhere !where(PL > 700.) ! VF = 0.1*VF !endwhere !where( (TE >= 250.) .and. (TE<260.)) ! VF = ( ( -0.75/10.)*(TE-250.) + 1.0 ) * VF !endwhere !where(TE >= 260.) ! VF = 0.25*VF !endwhere end SUBROUTINE SETTLE_VEL !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine VENTILATION(PRESS,TEMPR,DIAM,W,VENT) real, intent(in ) :: PRESS,TEMPR,DIAM,W ! in kg m**-2 s**-1 real, intent(out) :: VENT real :: RHO,SCHM,ALPH,BET,RE,Wc,DIAMc,PR,DIFFx real, parameter :: mu = 2.0e-4 ! "g cm^-1 s^-1 " real, parameter :: diff = 0.25 ! "cm^2 s^-1 " PR = PRESS*100. RHO=(1.0e-3)*PR/(MAPL_RGAS*TEMPR) DIFFx = DIFF*1000./PRESS SCHM = mu/(rho*diffx) SCHM = SCHM**0.3333 Wc = W*100. DIAMc = DIAM*100. re = rho*Wc*DIAMc/mu alph=1.00 bet =0.22 VENT = alph + bet * SCHM * sqrt(Re) end subroutine VENTILATION !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine MARSHPALM(RAIN,DIAM1,DIAM3,NTOTAL,W) real, intent(in ) :: RAIN ! in kg m**-2 s**-1 real, intent(out) :: DIAM1,DIAM3,NTOTAL,W real :: RAIN_HR,LAMBDA,A,B real, parameter :: N0 = 0.08 ! # cm**-3 RAIN_HR = RAIN * 3600. IF ( RAIN_HR <= 0.00 ) THEN DIAM1 = 0.00 DIAM3 = 0.00 NTOTAL= 0.00 W = 0.00 RETURN END IF LAMBDA=41.*(RAIN_HR**(-0.21)) ntotal = 0.08 / lambda DIAM1 = 1.0 / ( lambda**2 ) /ntotal DIAM3 = 6.0 / ( lambda**4 ) /ntotal DIAM3 = DIAM3**0.3333 A=2115. B=0.8 W=A*(DIAM3**B) ! Change back to MKS units DIAM1 = DIAM1/100. DIAM3 = DIAM3/100. W = W/100. NTOTAL = NTOTAL*1.0e6 end subroutine MARSHPALM !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine MARSHPALMX(RAIN,DIAM1,DIAM3,NTOTAL,W) real, intent(in ) :: RAIN ! in kg m**-2 s**-1 real, intent(out) :: DIAM1,DIAM3,NTOTAL,W real :: RAIN_HR,LAMBDA,A,B real, parameter :: N0 = 0.08 ! # cm**-3 RAIN_HR = RAIN * 3600. IF ( RAIN_HR <= 0.00 ) THEN DIAM1 = 0.00 DIAM3 = 0.00 NTOTAL= 0.00 W = 0.00 RETURN END IF DIAM1 = 2.0e-3 DIAM3 = 2.0e-3 W = 5.00 NTOTAL = 0.1*1.0e6 end subroutine MARSHPALMX !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine MARSHPALMQ2(IM,JM,RAIN,PR,DIAM3,NTOTAL,W,VE) 2 integer, intent(in) :: IM, JM real, dimension(IM,JM), intent(in ) :: RAIN,PR ! in kg m**-2 s**-1, mbar real, dimension(IM,JM), intent(out) :: DIAM3,NTOTAL,W,VE real, dimension(IM,JM) :: RAIN_DAY,LAMBDA,A,B,SLOPR,DIAM1 real, parameter :: N0 = 0.08 ! # cm**-3 real :: RX(8) , D3X(8) INTEGER :: IQD ! Marshall-Palmer sizes at different rain-rates: avg(D^3) RX = (/ 0. , 5. , 20. , 80. , 320. , 1280., 4*1280., 16*1280. /) ! rain per in mm/day D3X= (/ 0.019, 0.032, 0.043, 0.057, 0.076, 0.102, 0.137 , 0.183 /) RAIN_DAY = RAIN * 3600. *24. where( RAIN_DAY <= 0.00 ) DIAM1 = 0.00 DIAM3 = 0.00 NTOTAL= 0.00 W = 0.00 ENDwhere DO IQD = 1,7 where( (RAIN_DAY <= RX(IQD+1)) .AND. (RAIN_DAY > RX(IQD) ) ) SLOPR =( D3X(IQD+1)-D3X(IQD) ) / ( RX(IQD+1)-RX(IQD) ) DIAM3 = D3X(IQD) + (RAIN_DAY-RX(IQD))*SLOPR endwhere ENDDO where ( RAIN_DAY >= RX(8) ) DIAM3=D3X(8) endwhere NTOTAL = 0.019*DIAM3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! DIAM3 = 0.664 * DIAM3 !! DRYING/EVAP SHOULD PROBABLY GO AS !! !! D_1.5 == <<D^(3/2)>>^(2/3) NOT AS !! !! D_3 == <<D^3>>^(1/3) !! !! RATIO D_1.5/D_3 =~ 0.66 (JTB 10/17/2002) !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! W = (2483.8 * DIAM3 + 80.)*SQRT(1000./PR) !VE = 1.0 + 28.0*DIAM3 VE = MAX( 0.99*W/100. , 1.000 ) DIAM1 = 3.0*DIAM3 ! Change back to MKS units DIAM1 = DIAM1/100. DIAM3 = DIAM3/100. W = W/100. NTOTAL = NTOTAL*1.0e6 end subroutine MARSHPALMQ2 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine MARSHPALMQ(RAIN,PR,DIAM3,NTOTAL,W,VE) real, intent(in ) :: RAIN,PR ! in kg m**-2 s**-1, mbar real, intent(out) :: DIAM3,NTOTAL,W,VE real :: RAIN_DAY,LAMBDA,A,B,SLOPR,DIAM1 real, parameter :: N0 = 0.08 ! # cm**-3 real :: RX(8) , D3X(8) INTEGER :: IQD ! Marshall-Palmer sizes at different rain-rates: avg(D^3) RX = (/ 0. , 5. , 20. , 80. , 320. , 1280., 4*1280., 16*1280. /) ! rain per in mm/day D3X= (/ 0.019, 0.032, 0.043, 0.057, 0.076, 0.102, 0.137 , 0.183 /) ! D3X= (/ 0.045, 0.074, 0.098, 0.132, 0.178, 0.238, 0.318 , 0.423 /) ! Old incorrectly scaled values RAIN_DAY = RAIN * 3600. *24. IF ( RAIN_DAY <= 0.00 ) THEN DIAM1 = 0.00 DIAM3 = 0.00 NTOTAL= 0.00 W = 0.00 RETURN END IF DO IQD = 1,7 IF( (RAIN_DAY <= RX(IQD+1)) .AND. (RAIN_DAY > RX(IQD) ) ) THEN SLOPR =( D3X(IQD+1)-D3X(IQD) ) / ( RX(IQD+1)-RX(IQD) ) DIAM3 = D3X(IQD) + (RAIN_DAY-RX(IQD))*SLOPR ENDIF ENDDO IF ( RAIN_DAY >= RX(8) ) DIAM3=D3X(8) NTOTAL = 0.019*DIAM3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! DIAM3 = 0.664 * DIAM3 !! DRYING/EVAP SHOULD PROBABLY GO AS !! !! D_1.5 == <<D^(3/2)>>^(2/3) NOT AS !! !! D_3 == <<D^3>>^(1/3) !! !! RATIO D_1.5/D_3 =~ 0.66 (JTB 10/17/2002) !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! W = (2483.8 * DIAM3 + 80.)*SQRT(1000./PR) !VE = 1.0 + 28.0*DIAM3 VE = MAX( 0.99*W/100. , 1.000 ) DIAM1 = 3.0*DIAM3 ! Change back to MKS units DIAM1 = DIAM1/100. DIAM3 = DIAM3/100. W = W/100. NTOTAL = NTOTAL*1.0e6 end subroutine MARSHPALMQ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine MICRO_AA_BB(TEMP,PR,Q_SAT,AA,BB) 1 real, intent(in ) :: TEMP,PR,Q_SAT real, intent(out) :: AA,BB real :: E_SAT real, parameter :: K_COND = 2.4e-2 ! J m**-1 s**-1 K**-1 real, parameter :: DIFFU = 2.2e-5 ! m**2 s**-1 real, parameter :: epsilon = MAPL_H2OMW/MAPL_AIRMW E_SAT = 100.* PR * Q_SAT /( EPSILON + (1.0-EPSILON)*Q_SAT ) ! (100 converts ! from mbar to Pa) AA = ( ALHX(Temp)**2 ) / ( K_COND*MAPL_RVAP*(TEMP**2) ) BB = MAPL_RVAP*TEMP / ( DIFFU*(1000./PR)*E_SAT ) end subroutine MICRO_AA_BB !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine MICRO_AA_BB_3(TEMP,PR,Q_SAT,AA,BB) 1 real, dimension(:,:,:), intent(in ) :: TEMP,PR,Q_SAT real, dimension(:,:,:), intent(out) :: AA,BB real, dimension(size(TEMP,1),size(TEMP,2),size(TEMP,3)) :: E_SAT real, parameter :: K_COND = 2.4e-2 ! J m**-1 s**-1 K**-1 real, parameter :: DIFFU = 2.2e-5 ! m**2 s**-1 real, parameter :: epsilon = MAPL_H2OMW/MAPL_AIRMW E_SAT = 100.* PR * Q_SAT /( EPSILON + (1.0-EPSILON)*Q_SAT ) ! (100 converts ! from mbar to Pa) AA = ( GET_ALHX3(Temp)**2 ) / ( K_COND*MAPL_RVAP*(TEMP**2) ) ! AA = ( MAPL_ALHL**2 ) / ( K_COND*MAPL_RVAP*(TEMP**2) ) BB = MAPL_RVAP*TEMP / ( DIFFU*(1000./PR)*E_SAT ) end subroutine MICRO_AA_BB_3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! real function OPTDPTH(PL,PE0,PE1,T,LW,FRCVOL,RADIUS,N_CCN) real, intent(in) :: PL,PE0,PE1,T,LW,FRCVOL integer, intent(in) :: N_CCN real, intent(inout) :: RADIUS real :: MUU , DELZ , RHO , LWC IF (FRCVOL < MIN_CLD_FRAC) THEN OPTDPTH=0.0 RADIUS =0.0 RETURN ENDIF IF (LW < MIN_CLD_WATER) THEN OPTDPTH=0.0 RADIUS =0.0 RETURN ENDIF RADIUS=PRADIUS(PL,T,LW,FRCVOL,N_CCN,RHO_o=RHO,MUU_o=MUU) ! Cloud Drop Radius in m !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! Optical thickness !! !! formulation from DelGenio !! !! (J. Clim., 9, 270, [Eq.26]) !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! DELZ = 100.*( PE1 -PE0 ) / (RHO*MAPL_GRAV) OPTDPTH = 3*MUU*DELZ / (2*RHO_W*RADIUS) end function OPTDPTH !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! function LDRADIUS3(PL,TE,QCL,NN) RESULT(RADIUS) real, dimension(:,:,:), intent(in) :: TE,PL,NN,QCL real, dimension( size(TE,1), size(TE,2), size(TE,3) ) :: RADIUS real, dimension( size(TE,1), size(TE,2), size(TE,3) ) :: MUU,RHO RHO = 100.*PL / (MAPL_RGAS*TE ) MUU = QCL * RHO RADIUS = MUU/(NN*RHO_W*(4./3.)*MAPL_PI) RADIUS = RADIUS**(1./3.) ! Equiv. Spherical Cloud Particle Radius in m end function LDRADIUS3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! real function PRADIUS(PL,T,LW,FRCVOL,N_CCN,RHO_o,MUU_o) real, intent(in) :: PL,T,LW,FRCVOL integer, intent(in) :: N_CCN real, intent(out) , optional :: MUU_o, RHO_o real :: DELZ ,LWC, RHO, MUU IF (FRCVOL < MIN_CLD_FRAC ) THEN PRADIUS =0.0 RETURN ENDIF IF (LW < MIN_CLD_WATER ) THEN PRADIUS =0.0 RETURN ENDIF LWC=LW/FRCVOL RHO = 100.*PL / (MAPL_RGAS*T ) MUU = LWC * RHO PRADIUS = MUU/(N_CCN*RHO_W*(4./3.)*MAPL_PI) PRADIUS = PRADIUS**(1./3.) ! Equiv. Spherical Cloud Particle Radius in m IF (PRESENT(MUU_O)) MUU_O=MUU IF (PRESENT(RHO_O)) RHO_O=MUU end function PRADIUS !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! real function ALHX(T,T_TRANS) real, intent(in) :: T real, intent(in),optional :: T_TRANS real :: T_X if (present( T_TRANS )) then T_X = T_TRANS else T_X = T_ICE_MAX endif if ( T < T_ICE_ALL ) ALHX=MAPL_ALHS if ( T > T_X ) ALHX=MAPL_ALHL if ( T <= T_X .and. T >= T_ICE_ALL ) then ALHX = MAPL_ALHS + (MAPL_ALHL-MAPL_ALHS)*( T - T_ICE_ALL ) /( T_X - T_ICE_ALL ) endif end function ALHX !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! function ICE_FRACTION (TEMP) RESULT(ICEFRCT) real, dimension(:,:,:), intent(in) :: TEMP real, dimension( size(TEMP,1), size(TEMP,2), size(TEMP,3) ) :: ICEFRCT ICEFRCT(:,:,:) = 0.00 WHERE( TEMP <= T_ICE_ALL ) ICEFRCT = 1.000 ENDWHERE WHERE( (TEMP > T_ICE_ALL) .AND. (TEMP <= T_ICE_MAX) ) ICEFRCT = 1.00 - ( TEMP - T_ICE_ALL ) / ( T_ICE_MAX - T_ICE_ALL ) ENDWHERE ICEFRCT = MIN(ICEFRCT,1.00) ICEFRCT = MAX(ICEFRCT,0.00) !!ICEFRCT = ICEFRCT**4 ICEFRCT = ICEFRCT**ICEFRPWR end function ICE_FRACTION !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! function GET_ALHX3(T,T_TRANS) RESULT(ALHX3) real, dimension(:,:,:), intent(in) :: T real, dimension( size(T,1), size(T,2), size(T,3) ) :: ALHX3 real ,intent(in),optional :: T_TRANS real :: T_X if (present( T_TRANS )) then T_X = T_TRANS else T_X = T_ICE_MAX endif where ( T < T_ICE_ALL ) ALHX3=MAPL_ALHS endwhere where ( T > T_X ) ALHX3=MAPL_ALHL endwhere where( (T <= T_X) .and. (T >= T_ICE_ALL) ) ALHX3 = MAPL_ALHS + (MAPL_ALHL-MAPL_ALHS)*( T - T_ICE_ALL ) /( T_X - T_ICE_ALL ) endwhere end function GET_ALHX3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! real function ICEFRAC(T,T_TRANS,T_FREEZ) real, intent(in) :: T real, intent(in),optional :: T_TRANS real, intent(in),optional :: T_FREEZ real :: T_X,T_F if (present( T_TRANS )) then T_X = T_TRANS else T_X = T_ICE_MAX endif if (present( T_FREEZ )) then T_F = T_FREEZ else T_F = T_ICE_ALL endif if ( T < T_F ) ICEFRAC=1.000 if ( T > T_X ) ICEFRAC=0.000 if ( T <= T_X .and. T >= T_F ) then ICEFRAC = 1.00 - ( T - T_F ) /( T_X - T_F ) endif end function ICEFRAC !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SUBROUTINE SUNDQ_ICE( TEMP, F2, F3) REAL, INTENT( IN) :: TEMP REAL, INTENT(OUT) :: F2, F3 REAL :: XX, YY !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! Ice - phase treatment from Sundquist 1988 !! (also~ Sud and Walker 1998) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! IF ( TEMP >= 268. ) THEN F2 = 1.0 F3 = 1.0 ENDIF IF ( ( TEMP >= 253. ) .AND. ( TEMP < 268. ) )THEN F2 = 1.0 + 0.65 * SQRT( 268. - TEMP ) F3 = 1.0 ENDIF IF ( ( TEMP >= 233. ) .AND. ( TEMP < 253. ) )THEN F2 = 1.0 XX = ABS( TEMP - 233.) / 17. YY = XX*( 1.0 + XX + (4./3.)*XX**2 ) F3 = 0.15 * ( 1.07 + YY/(1.0+YY) ) F3 = 1./F3 ENDIF IF ( ( TEMP >= 213. ) .AND. ( TEMP < 233. ) )THEN F2 = 1.0 XX = ABS( TEMP - 233.) / 17. YY = XX*( 1.0 + XX + (4./3.)*XX**2 ) F3 = 0.15 * ( 1.07 - YY/(1.0+YY) ) F3 = 1./F3 ENDIF IF ( ( TEMP >= 0.00 ) .AND. ( TEMP < 213. ) )THEN F2 = 1.0 XX = ABS( 213. - 233.) / 17. YY = XX*( 1.0 + XX + (4./3.)*XX**2 ) F3 = 0.15 * ( 1.07 - YY/(1.0+YY) ) F3 = 1./F3 ENDIF !!!!!!!!!!!!!!!!!!!!!!!!!!!!! end subroutine sundq_ice !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SUBROUTINE SUNDQ2_ICE( TEMP, F2, F3) REAL, INTENT( IN) :: TEMP REAL, INTENT(OUT) :: F2, F3 REAL :: XX, YY !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! Ice - phase treatment ADAPTED !! from Sundquist 1988 !! (also~ Sud and Walker 1998). !! Modified to give earlier and more rapid !! increase in autoconversion in range !! ~~260K ~< T < 273K . !! (JTB, 1/16/2002) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! IF ( TEMP >= 273. ) THEN F2 = 1.0 F3 = 1.0 ENDIF IF ( ( TEMP >= 253. ) .AND. ( TEMP < 273. ) )THEN F2 = 1.0 + 0.93 * ( ( 273. - TEMP )*(0.333) ) F3 = 1.0 ENDIF IF ( ( TEMP >= 233. ) .AND. ( TEMP < 253. ) )THEN F2 = 1.0 XX = ABS( TEMP - 233.) / 17. YY = XX*( 1.0 + XX + (4./3.)*XX**2 ) F3 = 0.15 * ( 1.07 + YY/(1.0+YY) ) F3 = 1./F3 ENDIF IF ( ( TEMP >= 213. ) .AND. ( TEMP < 233. ) )THEN F2 = 1.0 XX = ABS( TEMP - 233.) / 17. YY = XX*( 1.0 + XX + (4./3.)*XX**2 ) F3 = 0.15 * ( 1.07 - YY/(1.0+YY) ) F3 = 1./F3 ENDIF IF ( ( TEMP >= 0.00 ) .AND. ( TEMP < 213. ) )THEN F2 = 1.0 XX = ABS( 213. - 233.) / 17. YY = XX*( 1.0 + XX + (4./3.)*XX**2 ) F3 = 0.15 * ( 1.07 - YY/(1.0+YY) ) F3 = 1./F3 ENDIF !!!!!!!!!!!!!!!!!!!!!!!!!!!!! end subroutine sundq2_ice !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SUBROUTINE SUNDQ3_ICE( TEMP,RATE2,RATE3,TE1, F2, F3) 1 REAL, INTENT( IN) :: TEMP,RATE2,RATE3,TE1 REAL, INTENT(OUT) :: F2, F3 REAL :: XX, YY,TE0,TE2,JUMP1 !,RATE2,RATE3,TE1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! Ice - phase treatment totally invented !! Sharp increase in autoconversion in range !! ~~TE1 K ~< T < TE0 K . !! (JTB, 3/25/2003) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! TE0=273. !TE1=263. TE2=200. !RATE2= 10. JUMP1= (RATE2-1.0) / ( ( TE0-TE1 )**0.333 ) !RATE3= 25. !!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Ice - phase treatment !! !!!!!!!!!!!!!!!!!!!!!!!!!!!! IF ( TEMP .GE. TE0 ) THEN F2 = 1.0 F3 = 1.0 ENDIF IF ( ( TEMP .GE. TE1 ) .AND. ( TEMP .LT. TE0 ) )THEN F2 = 1.0 + JUMP1 * (( TE0 - TEMP )**0.3333) F3 = 1.0 ENDIF IF ( TEMP .LT. TE1 ) THEN F2 = RATE2 + (RATE3-RATE2)*(TE1-TEMP)/(TE1-TE2) F3 = 1.0 ENDIF !!!!!!!!!!!!!!!!!!!!!!!!!!!! IF ( F2 .GT. 27.0 ) F2=27.0 end subroutine sundq3_ice !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SUBROUTINE SUNDQ3_ICE3( IM,JM,LM,TEMP,RATE2,RATE3,TE1, F2, F3) 1 INTEGER, INTENT(IN) :: IM,JM,LM REAL, INTENT( IN) :: RATE2,RATE3,TE1 REAL, DIMENSION(IM,JM,LM), INTENT( IN) :: TEMP REAL, DIMENSION(IM,JM,LM), INTENT(OUT) :: F2, F3 REAL :: XX, YY,TE0,TE2,JUMP1 !,RATE2,RATE3,TE1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! Ice - phase treatment totally invented !! Sharp increase in autoconversion in range !! ~~TE1 K ~< T < TE0 K . !! (JTB, 3/25/2003) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! TE0=273. !TE1=263. TE2=200. !RATE2= 10. JUMP1= (RATE2-1.0) / ( ( TE0-TE1 )**0.333 ) !RATE3= 25. !!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Ice - phase treatment !! !!!!!!!!!!!!!!!!!!!!!!!!!!!! where ( TEMP .GE. TE0 ) F2 = 1.0 F3 = 1.0 ENDWHERE WHERE ( ( TEMP .GE. TE1 ) .AND. ( TEMP .LT. TE0 ) ) F2 = 1.0 + JUMP1 * (( TE0 - TEMP )**0.3333) F3 = 1.0 ENDWHERE WHERE ( TEMP .LT. TE1 ) F2 = RATE2 + (RATE3-RATE2)*(TE1-TEMP)/(TE1-TE2) F3 = 1.0 ENDWHERE !!!!!!!!!!!!!!!!!!!!!!!!!!!! F2 = MIN(F2,27.0) end subroutine sundq3_ice3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine RADCOUPLE ( & 1 IM, JM, LM, & TE, & PL, & CF, & AF, & QClLS, & QCiLS, & QClAN, & QCiAN, & RAD_QL, & RAD_QI, & RAD_CF, & RAD_RL, & RAD_RI, & CLDVOL2FRC, & NN_ANVIL,NN_ICE,NN_WARM, & DISABLE_RAD ) integer, intent(in ) :: IM,JM,LM real, intent(in ) :: NN_ANVIL,NN_ICE,NN_WARM real, intent(in ) :: CLDVOL2FRC real, dimension(IM,JM,LM), intent(in ) :: TE,PL real, dimension(IM,JM,LM), intent(in ) :: AF,CF, QClAN, QCiAN, QClLS, QCiLS real, dimension(IM,JM,LM), intent(out) :: RAD_QL,RAD_QI,RAD_CF,RAD_RL,RAD_RI real, dimension(IM,JM,LM) :: RElAN, REiAN, RElLS, REiLS, QCm, NN, ss, RAD_RI_AN real, dimension(IM,JM,LM) :: QClANm, QCiANm, QClLSm, QCiLSm, QCtot, AFx integer, optional, intent(in) :: DISABLE_RAD integer :: L real :: MIN_RI, MAX_RI, MIN_RL, MAX_RL, ALPH, POLAR_RL ! Limits on Radii needed to ensure ! correct behavior of cloud optical ! properties currently calculated in ! sorad and irrad (1e-6 m = micron) MIN_RI = 20.0e-6 MAX_RI = 75.0e-6 ! 03/23/2007 JTB - to bring SWCF/LWCF UP IN MID-LEV/MID-LAT ICE CLOUDS !!MIN_RL = 10.0e-6 ! 03/15/2007 JTB - TO BRING MERRA SWCF UP IN LOW CLOUD !!MIN_RL = 15.0e-6 ! 06/20/2007 JTB - SWCF WAS TOO HIGH IN LOW CLOUDS. THIS SHOULD BRING IT DOWN. ! THIS IS BAD WAY TO GET BETTER SWCF. LWP IN LOW CLOUDS ! IS TOO HIGH. WOULD BE BETTER TO TUNE AUTOCON, BUT NO ! TIME BEFORE MERRA MIN_RL = 10.0e-6 ! 09/12/2007 JTB - BACK!! SWCF NEED TO ADDRESS LWP. POLAR_RL= 5.0e-6 ! 11/09/2007 JTB - COLD low level clouds MAX_RL = 21.0e-6 IF (PRESENT(DISABLE_RAD )) THEN IF (DISABLE_RAD==1 ) THEN RAD_QL = 0. RAD_QI = 0. RAD_CF = 0. RAD_RL = 0. RAD_RI = 0. RETURN ENDIF ENDIF !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Adjust Anvil fractions for ! warm clouds !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ALPH = 0.1 SS = (280.-TE)/20. SS = MIN( 1.0 , SS ) SS = MAX( 0.0 , SS ) SS = ALPH + (SS**3) * ( 1.0 - ALPH ) AFx = AF * SS !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Total cloud fraction !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! RAD_CF = MIN( CF + AFx, 1.00 ) ! Total In-cloud liquid where( RAD_CF > 0. ) RAD_QL = ( QClLS + QClAN ) / RAD_CF elsewhere RAD_QL = 0.0 endwhere RAD_QL = MIN( RAD_QL, 0.01 ) ! Total In-cloud ice where( RAD_CF >0. ) RAD_QI = ( QCiLS + QCiAN ) / RAD_CF elsewhere RAD_QI = 0.0 endwhere RAD_QI = MIN( RAD_QI, 0.01 ) where (PL < 150. ) RAD_RI = MAX_RI endwhere where (PL >= 150. ) RAD_RI = MAX_RI*150./PL endwhere !! weigh in a separate R_ice for Anvil Ice according to ! ! R_net_eff = (q_anv + q_ls) / ( q_anv/R_ice_anv + q_ls/R_ice_ls ) !------------------------------------------------------------------------- RAD_RI_AN = RAD_RI ! 40.0e-6 ! MIN_RI where ( ( QCiLS + QCiAN ) > 0.0 ) RAD_RI_AN = ( QCiLS + QCiAN ) / ( (QCiLS/RAD_RI) + (QCiAN/20.0e-6) ) endwhere RAD_RI = MIN( RAD_RI, RAD_RI_AN ) RAD_RI = MAX( RAD_RI, MIN_RI ) where (PL < 300. ) RAD_RL = MAX_RL endwhere where (PL >= 300. ) RAD_RL = MAX_RL*300./PL endwhere RAD_RL = MAX( RAD_RL, MIN_RL ) where ( ( PL >= 900. ) .AND. (TE < 280. ) ) RAD_RL = POLAR_RL endwhere where ( RAD_CF < 1.e-5 ) RAD_QL = 0. RAD_QI = 0. RAD_CF = 0. endwhere end subroutine RADCOUPLE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SUBROUTINE GET_REFF(TL,PL,QCL,QCI,ANV,REFFL,REFFI,NCCN,BKH) REAL, INTENT(IN) :: TL(:,:,:) REAL, INTENT(IN) :: PL(:,:,:) REAL, INTENT(IN) :: ANV(:,:,:) REAL, INTENT(IN) :: QCL(:,:,:) REAL, INTENT(IN) :: QCI(:,:,:) REAL, INTENT(OUT) :: REFFL(:,:,:) REAL, INTENT(OUT) :: REFFI(:,:,:) REAL, INTENT(OUT) :: NCCN(:,:,:) REAL, OPTIONAL, INTENT(IN) :: BKH(:,:,:) REAL :: QC(SIZE(TL,1),SIZE(TL,2),SIZE(TL,3)) !!REAL :: NCCN(SIZE(TL,1),SIZE(TL,2),SIZE(TL,3)) REAL :: RHOD(SIZE(TL,1),SIZE(TL,2),SIZE(TL,3)) REAL :: BKHF(SIZE(TL,1),SIZE(TL,2),SIZE(TL,3)) INTEGER :: LM REAL :: RHO_STD REAL, PARAMETER :: RHOI=1.0 * 1000. ! DENSITY OF ICE H2O (kg/m**3) REAL, PARAMETER :: RHOL=1.0 * 1000. ! DENSITY OF LIQ. H2O (kg/m**3) LM=SIZE(TL,3) RHO_STD = 100000./(MAPL_RGAS*300.) RHOD = 100.*PL/(MAPL_RGAS*TL) RHOD = ( RHOD/RHO_STD ) WHERE( TL > MAPL_TICE ) NCCN = N_WARM*RHOD ENDWHERE WHERE( (TL > MAPL_TICE-20.) .AND. (TL <=MAPL_TICE ) ) NCCN = (N_ICE + (N_WARM-N_ICE )*( TL - (MAPL_TICE-20.) )/20.)*RHOD ENDWHERE WHERE( TL <= MAPL_TICE-20. ) NCCN = N_ICE*RHOD ENDWHERE IF(PRESENT(BKH)) THEN BKHF = BKH BKHF(:,:,LM) = BKH(:,:,LM-1) IF (N_PBL > 0) THEN WHERE( BKHF >= 1. ) NCCN = N_PBL*RHOD ENDWHERE ENDIF ENDIF IF (N_ANVIL > 0) THEN WHERE( ( ANV >= 0.001 ) .AND. (TL <=MAPL_TICE ) ) NCCN = ANV * N_ANVIL * RHOD + & (1.0-ANV)*NCCN ENDWHERE ENDIF NCCN = NCCN * 1.0e6 ! go to N/m^3 from N/cm^3 RHOD = ( RHOD*RHO_STD ) QC = QCI QC = QC*RHOD REFFI= 3.0 * QC / ( RHOI * 4.*MAPL_PI*NCCN ) QC = QCL QC = QC*RHOD REFFL= 3.0 * QC / ( RHOL * 4.*MAPL_PI*NCCN ) REFFI = REFFI**(0.3333) REFFL = REFFL**(0.3333) RETURN END SUBROUTINE GET_REFF !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! function ARE_WE_INSIDE(I,J, I1,IN,J1,JN) RESULT(IS_INSIDE) INTEGER, INTENT(IN) :: I1,I,IN,J1,J,JN LOGICAL :: IS_INSIDE if ( (I <= IN) .and. (I >= I1 ) .and. (J <= JN) .and. (J >= J1 ) ) then IS_INSIDE = .TRUE. ELSE IS_INSIDE = .FALSE. ENDIF END FUNCTION ARE_WE_INSIDE end module cloudnew