MODULE MODULE_BL_MFSHCONVPBL 2 USE MODULE_MODEL_CONSTANTS REAL,PARAMETER :: XG = 9.80665 REAL,PARAMETER :: XP00= 1.E5 ! Reference pressure ! ! REAL,PARAMETER :: XMD= 28.9644E-3 REAL,PARAMETER :: XMV= 18.0153E-3 ! Molar mass of dry air and molar mass of vapor REAL,PARAMETER :: XRD=R_D REAL,PARAMETER :: XRV=R_V ! Gaz constant for dry air, gaz constant for vapor REAL,PARAMETER :: XCPD=7.* XRD /2. REAL,PARAMETER :: XCPV=4.* XRV ! Cpd (dry air), Cpv (vapor) REAL,PARAMETER :: XCL= 4.218E+3 REAL,PARAMETER :: XCI= 2.106E+3 ! Cl (liquid), Ci (ice) REAL,PARAMETER :: XTT= 273.16 ! Triple point temperature REAL,PARAMETER :: XLVTT=2.5008E+6 ! Vaporization heat constant REAL,PARAMETER :: XLSTT=2.8345E+6 ! Sublimation heat constant ! temperature REAL,PARAMETER :: XGAMW = (XCL - XCPV) / XRV! Constants for saturation vapor REAL,PARAMETER :: XBETAW= (XLVTT/XRV) + (XGAMW * XTT) !The use of intrinsics in an initialization expressions is a F2003 feature. !For backward compatibility, hard coded Log(644.11) & Log(XTT) here !REAL,PARAMETER :: XALPW= LOG(611.14) + (XBETAW /XTT) + (XGAMW *LOG(XTT)) REAL,PARAMETER :: LOG_611_14 = 6.415326 REAL,PARAMETER :: LOG_XTT = 5.610058 REAL,PARAMETER :: XALPW= LOG_611_14 + (XBETAW /XTT) + (XGAMW *LOG_XTT) ! pressure function REAL,PARAMETER :: XGAMI = (XCI - XCPV) / XRV REAL,PARAMETER :: XBETAI = (XLSTT/XRV) + (XGAMI * XTT) !REAL,PARAMETER :: XALPI = LOG(611.14) + (XBETAI /XTT) + (XGAMI *LOG(XTT)) REAL,PARAMETER :: XALPI = LOG_611_14 + (XBETAI /XTT) + (XGAMI *LOG_XTT) REAL,PARAMETER :: XLINI = 0.32 REAL, PARAMETER :: XALP_PERT = 0.3 ! coefficient for the perturbation of ! theta_l and r_t at the first level of ! the updraft REAL, PARAMETER ::XABUO = 1. ! coefficient of the buoyancy term in the w_up equation REAL, PARAMETER ::XBENTR = 1. ! coefficient of the entrainment term in thew_up equation REAL, PARAMETER ::XBDETR = 0. ! coefficient of the detrainment term in thew_up equation REAL, PARAMETER ::XCMF = 0.065! coefficient for the mass flux at the firstlevel 0.065 ! of the updraft (closure) XCMF = 0.065 REAL, PARAMETER ::XENTR_DRY = 0.55 ! coefficient for entrainment in dry part XENTR_DRY = 0.55 REAL, PARAMETER ::XDETR_DRY = 10. ! coefficient for detrainment in dry part XDETR_DRY = 10. REAL, PARAMETER ::XDETR_LUP = 1.0 ! coefficient for detrainment in dry part XDETR_LUP = 1. REAL, PARAMETER ::XENTR_MF = 0.035! entrainment constant (m/Pa) = 0.2 (m) XENTR_MF = 0.035 REAL, PARAMETER ::XCRAD_MF = 50. ! cloud radius in cloudy part REAL, PARAMETER ::XKCF_MF = 2.75 ! coefficient for cloud fraction REAL, PARAMETER ::XKRC_MF = 1. ! coefficient for convective rc REAL, PARAMETER ::XTAUSIGMF = 600. REAL, PARAMETER ::XPRES_UV = 0.5 ! coefficient for pressure term in wind mixing ! REAL, PARAMETER ::XFRAC_UP_MAX= 0.33 ! maximum Updraft fraction ! CONTAINS SUBROUTINE MFSHCONVPBL (DT,STEPBL,HT,DZ & 1,1 ,RHO,PMID,PINT,TH,EXNER & ,QV, QC, U, V & ,HFX, QFX, TKE & ,RUBLTEN,RVBLTEN,RTHBLTEN & ,RQVBLTEN,RQCBLTEN & ,IDS,IDE,JDS,JDE,KDS,KDE & ,IMS,IME,JMS,JME,KMS,KME & ,ITS,ITE,JTS,JTE,KTS,KTE,KRR & ,MASSFLUX_EDKF, ENTR_EDKF, DETR_EDKF & ,THL_UP, THV_UP, RT_UP, RV_UP & ,RC_UP, U_UP, V_UP, FRAC_UP, RC_MF & ,WTHV,PLM_BL89 ) IMPLICIT NONE ! !---------------------------------------------------------------------- INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & & ,IMS,IME,JMS,JME,KMS,KME & & ,ITS,ITE,JTS,JTE,KTS,KTE ! INTEGER,INTENT(IN) :: KRR INTEGER,INTENT(IN) :: STEPBL REAL,INTENT(IN) :: DT ! REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: HT, HFX, QFX ! REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: DZ & & ,EXNER & & ,PMID,PINT & & ,QV,QC,RHO & & ,TH,U,V,TKE ! REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(INOUT) :: RQCBLTEN,RQVBLTEN & & ,RTHBLTEN & & ,RUBLTEN,RVBLTEN REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),OPTIONAL,INTENT(OUT) :: & & MASSFLUX_EDKF, ENTR_EDKF, DETR_EDKF & & ,THL_UP, THV_UP, RT_UP, RV_UP & & ,RC_UP, U_UP, V_UP, FRAC_UP REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),OPTIONAL,INTENT(INOUT) :: & & RC_MF REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(INOUT) :: WTHV REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(INOUT) :: PLM_BL89 ! !Local declaration INTEGER :: KRRL ! number of liquid water var. INTEGER :: KRRI ! number of ice water var. LOGICAL :: OMIXUV ! True if mixing of momentum REAL :: PIMPL_MF ! degre of implicitness REAL :: PTSTEP ! Dynamical timestep REAL :: PTSTEP_MET! Timestep for meteorological variables REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PZZ ! Height at the flux point REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PZZM ! Height at the mass point REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PDZZ ! depth between mass levels REAL, DIMENSION(ITS:ITE,JTS:JTE) :: PSFTH,PSFRV ! normal surface fluxes of theta,rv ! ! prognostic variables at t- deltat REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PPABSM ! Pressure at mass point !REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PPABSF ! Pressure at flux point REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PEXNM ! Exner function at t-dt REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PRHODREF ! dry density of the ! reference state REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PRHODJ ! dry density of the REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PTKEM ! TKE REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PUM,PVM ! momentum ! thermodynamical variables which are transformed in conservative var. REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PTHM ! pot. temp. = PTHLM in turb.f90 REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE,KRR) :: PRM ! water species REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PRUS,PRVS,PRTHS REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE,KRR) :: PRRS ! For diagnostic output REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PEMF, PENTR, PDETR REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PTHL_UP, PRT_UP, PRV_UP, PRC_UP REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PU_UP, PV_UP, PTHV_UP, PFRAC_UP REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PRC_MF REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: WTHV_MF REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PLM_MF INTEGER :: I,J,K ! loop variables ! Transform WRF Variable to input of mass flux scheme DO J=JTS,JTE DO K=KTS,KTE DO I=ITS,ITE IF (K==KTS) PZZ(I,J,K)=0. PEMF(I,J,K)=0. PENTR(I,J,K)=0. PDETR(I,J,K)=0. PTHL_UP(I,J,K)=0. PTHV_UP(I,J,K)=0. PRT_UP(I,J,K)=0. PRV_UP(I,J,K)=0. PRC_UP(I,J,K)=0. PU_UP(I,J,K)=0. PV_UP(I,J,K)=0. PFRAC_UP(I,J,K)=0. WTHV_MF(I,J,K)=0. PTHM(I,J,K)=TH(I,K,J) PTKEM(I,J,K)=TKE(I,K,J) PRM(I,J,K,1)=QV(I,K,J)-RC_MF(I,K,J) PRM(I,J,K,2)=RC_MF(I,K,J) PUM(I,J,K)=U(I,K,J) PVM(I,J,K)=V(I,K,J) PRHODREF(I,J,K)=RHO(I,K,J)/(1.+QV(I,K,J)) PEXNM(I,J,K)=EXNER(I,K,J) PPABSM(I,J,K)=PMID(I,K,J) IF (K/=KTE) THEN PZZ(I,J,K+1)=PZZ(I,J,K)+DZ(I,K,J) PZZM(I,J,K)=0.5*(PZZ(I,J,K+1)+PZZ(I,J,K)) ! z at mass point ELSE PZZM(I,J,K)=PZZ(I,J,K)+0.5*DZ(I,K-1,J) ! z at mass point ENDIF IF (K==KTS) THEN PDZZ(I,J,K)=2*(PZZM(I,J,K)) ELSE PDZZ(I,J,K)=PZZM(I,J,K)-PZZM(I,J,K-1) ENDIF PRHODJ(I,J,K)=PRHODREF(I,J,K)*DZ(I,K,J) ENDDO ENDDO ENDDO ! fill the kte+1 level PTHM(:,:,KTE)=PTHM(:,:,KTE-1) PTKEM(:,:,KTE)=PTKEM(:,:,KTE-1) PRM(:,:,KTE,1)=PRM(:,:,KTE-1,1) PRM(:,:,KTE,2)=PRM(:,:,KTE-1,2) PUM(:,:,KTE)=PUM(:,:,KTE-1) PVM(:,:,KTE)=PVM(:,:,KTE-1) PRHODREF(:,:,KTE)=PRHODREF(:,:,KTE-1) PEXNM(:,:,KTE)=PEXNM(:,:,KTE-1) PPABSM(:,:,KTE)=PPABSM(:,:,KTE-1) PRHODJ(:,:,KTE)=PRHODJ(:,:,KTE-1) PSFTH(:,:)=HFX(ITS:ITE,JTS:JTE)/(PRHODREF(:,:,KTS)*XCPD) PSFRV(:,:)=QFX(ITS:ITE,JTS:JTE)/(PRHODREF(:,:,KTS)) ! Assign some variables OMIXUV=.FALSE. KRRL=1 !Qc is managed KRRI=0 !Qi not PIMPL_MF=0. PTSTEP=DT*STEPBL PTSTEP_MET=PTSTEP CALL MFSHCONVPBL_CORE(KRR,KRRL,KRRI, & OMIXUV, & PIMPL_MF,PTSTEP,PTSTEP_MET, & PDZZ, PZZ, & PRHODJ, PRHODREF, & PPABSM, PEXNM, & PSFTH,PSFRV, & PTHM,PRM,PUM,PVM,PTKEM, & PRTHS,PRRS,PRUS,PRVS,PEMF, PENTR, PDETR, & PTHL_UP, PRT_UP, PRV_UP, PRC_UP, & PU_UP, PV_UP, PTHV_UP, PFRAC_UP, PRC_MF, WTHV_MF,PLM_MF ) DO J=JTS,JTE DO K=KTS,KTE DO I=ITS,ITE RQCBLTEN(I,K,J)=PRRS(I,J,K,2) RQVBLTEN(I,K,J)=PRRS(I,J,K,1) RTHBLTEN(I,K,J)=PRTHS(I,J,K) RUBLTEN(I,K,J)=PRUS(I,J,K) RVBLTEN(I,K,J)=PRVS(I,J,K) WTHV(I,K,J)=WTHV_MF(I,J,K) PLM_BL89(I,K,J)=PLM_MF(I,J,K) ENDDO ENDDO ENDDO IF ( PRESENT(MASSFLUX_EDKF) ) THEN DO J=JTS,JTE DO K=KTS,KTE DO I=ITS,ITE MASSFLUX_EDKF(I,K,J)=PEMF(I,J,K) ENTR_EDKF(I,K,J)=PENTR(I,J,K) DETR_EDKF(I,K,J)=PDETR(I,J,K) THL_UP(I,K,J)=PTHL_UP(I,J,K) THV_UP(I,K,J)=PTHV_UP(I,J,K) RT_UP(I,K,J)=PRT_UP(I,J,K) RV_UP(I,K,J)=PRV_UP(I,J,K) RC_UP(I,K,J)=PRC_UP(I,J,K) U_UP(I,K,J)=PU_UP(I,J,K) V_UP(I,K,J)=PV_UP(I,J,K) FRAC_UP(I,K,J)=PFRAC_UP(I,J,K) RC_MF(I,K,J)=PRC_MF(I,J,K) ENDDO ENDDO ENDDO ENDIF END SUBROUTINE MFSHCONVPBL !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! WRAPPER from WRF to MASS FLUX SCHEME !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SUBROUTINE MFSHCONVPBL_CORE(KRR,KRRL,KRRI, & 1,6 OMIXUV, & PIMPL_MF,PTSTEP,PTSTEP_MET, & PDZZ, PZZ, & PRHODJ, PRHODREF, & PPABSM, PEXNM, & PSFTH,PSFRV, & PTHM,PRM,PUM,PVM,PTKEM, & PRTHS,PRRS,PRUS,PRVS, PEMF, PENTR, PDETR, & PTHL_UP, PRT_UP, PRV_UP, PRC_UP, & PU_UP, PV_UP, PTHV_UP, PFRAC_UP, PRC_MF, & PFLXZTHVMF,PLM ) !! !!**** *MFSHCONVPBL_CORE* - Interfacing routine !! !! -------------------------------------------------------------------------- ! IMPLICIT NONE INTEGER, INTENT(IN) :: KRR ! number of moist var. INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. INTEGER, INTENT(IN) :: KRRI ! number of ice water var. LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum REAL, INTENT(IN) :: PIMPL_MF ! degre of implicitness REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep REAL, INTENT(IN) :: PTSTEP_MET! Timestep for meteorological variables REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height of flux point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Metric coefficients REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! dry density of the ! reference state REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Pressure at time t-1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNM ! Exner function at t-dt REAL, DIMENSION(:,:), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at t-dt REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! water var. at t-dt REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM ! wind components at t-dt REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! tke at t-dt REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRUS,PRVS,PRTHS ! Meso-NH sources REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PRRS REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEMF, PENTR, PDETR REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHL_UP, PRT_UP, PRV_UP, PRC_UP REAL, DIMENSION(:,:,:), INTENT(OUT) :: PU_UP, PV_UP, PTHV_UP, PFRAC_UP REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRC_MF REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFLXZTHVMF REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLM ! ! 0.2 Declaration of local variables ! REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: & ZEXN,ZCPH, & PRV,PRL,PTH, & ZTM, & ! Temperature at t-dt ZLVOCPEXN, & ! ZCF_MF, & ZLSOCPEXN, & ! ZAMOIST, & ! ZATHETA, & ! ZTHLM, & ! ZRTM, & ! ZTHVM,ZTHVREF,ZUMM,ZVMM, & ! ZRI_UP,ZW_UP, & ! ZEMF_O_RHODREF, & ! entrainment/detrainment ZTHLDT,ZRTDT,ZUDT,ZVDT, & ! tendencies ZFLXZTHMF,ZFLXZRMF,ZFLXZUMF,ZFLXZVMF ! fluxes INTEGER,DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: IKLCL,IKETL,IKCTL INTEGER :: IKU, IKB, IKE INTEGER :: JI,JJ,JK,JSV ! Loop counters INTEGER :: IRESP ! error code !------------------------------------------------------------------------ !!! 1. Initialisation ! Internal Domain IKU=SIZE(PTHM,3) IKB=1 ! Modif WRF JP IKE=IKU-1 ! number of scalar var ZUMM=PUM !Modif WRF JP ZVMM=PVM !Modif WRF JP ! Thermodynamics functions CALL COMPUTE_FUNCTION_THERMO_MF( KRR,KRRL,KRRI, & PTHM,PRM,PEXNM,PPABSM, & ZTM,ZLVOCPEXN,ZLSOCPEXN, & ZAMOIST,ZATHETA ) ! Conservative variables at t-dt CALL THL_RT_FROM_TH_R_MF( KRR,KRRL,KRRI, & PTHM, PRM, ZLVOCPEXN, ZLSOCPEXN, & ZTHLM, ZRTM ) ! Virtual potential temperature at t-dt ZTHVM(:,:,:) = PTHM(:,:,:)*((1.+XRV / XRD *PRM(:,:,:,1))/(1.+ZRTM(:,:,:))) ZTHVREF=XG/ZTHVM CALL BL89(PZZ,PDZZ,ZTHVREF,ZTHLM,KRR, & PRM,PTKEM,PLM) !!! 2. Compute updraft CALL UPDRAFT_SOPE (KRR,KRRL,KRRI,OMIXUV, & PZZ,PDZZ,PSFTH,PSFRV,PPABSM,PRHODREF, & PTKEM,PTHM,PRM,ZTHLM,ZRTM,ZUMM,ZVMM, & PTHL_UP,PRT_UP,PRV_UP,PU_UP,PV_UP, & PRC_UP,ZRI_UP,PTHV_UP,ZW_UP,PFRAC_UP,PEMF,& PDETR,PENTR,IKLCL,IKETL,IKCTL ) !!! 3. Compute fluxes of conservative variables and their divergence = tendency ZEMF_O_RHODREF=PEMF/PRHODREF CALL MF_TURB(OMIXUV, PIMPL_MF, PTSTEP,PTSTEP_MET, & PDZZ, PRHODJ, ZTHLM,ZTHVM,ZRTM,ZUMM,ZVMM, & ZTHLDT,ZRTDT,ZUDT,ZVDT, & ZEMF_O_RHODREF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP,& ZFLXZTHMF,PFLXZTHVMF,ZFLXZRMF,ZFLXZUMF,ZFLXZVMF ) !!! 5. Compute diagnostic convective cloud fraction and content ! ! ! ONLY liquid cloud implemented (yet) CALL COMPUTE_MF_CLOUD(KRRL,ZTHLM,PRC_UP,PFRAC_UP,PDZZ,IKLCL, & PRC_MF,ZCF_MF ) !!! 6. Compute tendency terms for pronostic variables ZEXN(:,:,:)=(PPABSM(:,:,:)/XP00) ** (XRD/XCPD) ! PRV(:,:,:)=PRM(:,:,:,1)-PRC_MF(:,:,:) PRL(:,:,:)=PRC_MF(:,:,:) ! 2.1 Cph ZCPH(:,:,:)=XCPD+ XCPV * PRV(:,:,:)+ XCL * PRL(:,:,:) PTH(:,:,:)=(ZTHLM(:,:,:)+ZTHLDT(:,:,:))+(XLVTT/(ZCPH*ZEXN(:,:,:))*PRL(:,:,:)) PRTHS(:,:,:) = ZTHLDT(:,:,:) PRTHS(:,:,:) = (PTH(:,:,:)-PTHM(:,:,:))/PTSTEP_MET PRRS(:,:,:,2) = (PRC_MF-PRM(:,:,:,2))/PTSTEP_MET PRRS(:,:,:,1) = ZRTDT(:,:,:)-PRRS(:,:,:,2) PRTHS(:,:,:) = ZTHLDT(:,:,:) PRRS(:,:,:,1) = ZRTDT(:,:,:) PRRS(:,:,:,2) = 0 PRUS(:,:,:) = ZUDT(:,:,:) PRVS(:,:,:) = ZVDT(:,:,:) END SUBROUTINE MFSHCONVPBL_CORE ! ################################################################### SUBROUTINE COMPUTE_BL89_ML(PDZZ2D, & 3 PTKEM2D,PG_O_THVREF2D,PVPT,KK,OUPORDN,PLWORK) ! ################################################################### !! !! COMPUTE_BL89_ML routine to: !! !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ! ------------ !USE MODD_CST ! ! IMPLICIT NONE ! ! 0.1 arguments ! REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ2D REAL, DIMENSION(:,:), INTENT(IN) :: PTKEM2D REAL, DIMENSION(:,:), INTENT(IN) :: PG_O_THVREF2D REAL, DIMENSION(:,:), INTENT(IN) :: PVPT INTEGER, INTENT(IN) :: KK LOGICAL, INTENT(IN) :: OUPORDN REAL, DIMENSION(:), INTENT(OUT) :: PLWORK ! 0.2 Local variable ! REAL, DIMENSION(SIZE(PTKEM2D,1)) :: ZLWORK1,ZLWORK2 ! Temporary mixing length REAL, DIMENSION(SIZE(PTKEM2D,1)) :: ZINTE,ZPOTE ! TKE and potential energy ! between 2 levels INTEGER :: IKB,IKE ! REAL, DIMENSION(SIZE(PTKEM2D,1),SIZE(PTKEM2D,2)) :: ZDELTVPT,ZHLVPT !Virtual Potential Temp at Half level and DeltaThv between !2 levels REAL, DIMENSION(SIZE(PTKEM2D,1)) :: ZTH! Potential Temp INTEGER :: IIJU,IKU !Internal Domain INTEGER :: J1D !horizontal loop counter INTEGER :: JKK !loop counters INTEGER :: JRR !moist loop counter INTEGER :: JIJK !loop counters REAL :: ZTEST,ZTEST0,ZTESTM !test for vectorization !------------------------------------------------------------------------------------- ! !* 1. INITIALISATION ! -------------- IIJU=SIZE(PTKEM2D,1) ! IKB = 1 !Modif WRF JP IKE = SIZE(PTKEM2D,2)-1 !Modif WRF JP IKU = SIZE(PTKEM2D,2) ZDELTVPT(:,2:IKU)=PVPT(:,2:IKU)-PVPT(:,1:IKU-1) ZDELTVPT(:,1)=0. ! to prevent division by zero WHERE (ABS(ZDELTVPT(:,:))<1.E-10) ZDELTVPT(:,:)=1.E-10 END WHERE ! ZHLVPT(:,2:IKU)= 0.5 * ( PVPT(:,2:IKU)+PVPT(:,1:IKU-1) ) ZHLVPT(:,1) = PVPT(:,1) ! ! ! !* 2. CALCULATION OF THE UPWARD MIXING LENGTH ! --------------------------------------- ! IF (OUPORDN.EQV..TRUE.) THEN ZINTE(:)=PTKEM2D(:,KK) PLWORK=0. ZLWORK1=0. ZLWORK2=0. ZTESTM=1. ZTH(:)=PVPT(:,KK) DO JKK=KK+1,IKE IF(ZTESTM > 0.) THEN ZTESTM=0 DO J1D=1,IIJU ZTEST0=0.5+SIGN(0.5,ZINTE(J1D)) ZPOTE(J1D) = ZTEST0*(PG_O_THVREF2D(J1D,KK) * & (ZHLVPT(J1D,JKK) - ZTH(J1D))) * PDZZ2D(J1D,JKK) !particle keeps its temperature ZTEST =0.5+SIGN(0.5,ZINTE(J1D)-ZPOTE(J1D)) ZTESTM=ZTESTM+ZTEST0 ZLWORK1(J1D)=PDZZ2D(J1D,JKK) !ZLWORK2 jump of the last reached level ZLWORK2(J1D)= ( - PG_O_THVREF2D(J1D,KK) * & ( PVPT(J1D,JKK-1) - ZTH(J1D) ) & + SQRT (ABS( & ( PG_O_THVREF2D(J1D,KK) * (PVPT(J1D,JKK-1) - ZTH(J1D)) )**2 & + 2. * ZINTE(J1D) * PG_O_THVREF2D(J1D,KK) & * ZDELTVPT(J1D,JKK) / PDZZ2D(J1D,JKK) )) ) / & ( PG_O_THVREF2D(J1D,KK) * ZDELTVPT(J1D,JKK) / PDZZ2D(J1D,JKK) ) ! PLWORK(J1D)=PLWORK(J1D)+ZTEST0*(ZTEST*ZLWORK1(J1D)+ & (1-ZTEST)*ZLWORK2(J1D)) ZINTE(J1D) = ZINTE(J1D) - ZPOTE(J1D) END DO ENDIF END DO ENDIF !! !* 2. CALCULATION OF THE DOWNWARD MIXING LENGTH ! --------------------------------------- ! IF (OUPORDN.EQV..FALSE.) THEN ZINTE(:)=PTKEM2D(:,KK) PLWORK=0. ZLWORK1=0. ZLWORK2=0. ZTESTM=1. ZTH(:)=PVPT(:,KK) DO JKK=KK,IKB,-1 IF(ZTESTM > 0.) THEN ZTESTM=0 DO J1D=1,IIJU ZTEST0=0.5+SIGN(0.5,ZINTE(J1D)) ZPOTE(J1D) = -ZTEST0*(PG_O_THVREF2D(J1D,KK) * & (ZHLVPT(J1D,JKK) - ZTH(J1D))) * PDZZ2D(J1D,JKK) !particle keeps its temperature ZTEST =0.5+SIGN(0.5,ZINTE(J1D)-ZPOTE(J1D)) ZTESTM=ZTESTM+ZTEST0 ZLWORK1(J1D)=PDZZ2D(J1D,JKK) ZLWORK2(J1D)= ( + PG_O_THVREF2D(J1D,KK) * & ( PVPT(J1D,JKK) - ZTH(J1D) ) & + SQRT (ABS( & ( PG_O_THVREF2D(J1D,KK) * (PVPT(J1D,JKK) - ZTH(J1D)) )**2 & + 2. * ZINTE(J1D) * PG_O_THVREF2D(J1D,KK) & * ZDELTVPT(J1D,JKK) / PDZZ2D(J1D,JKK) )) ) / & ( PG_O_THVREF2D(J1D,KK) * ZDELTVPT(J1D,JKK) / PDZZ2D(J1D,JKK) ) ! PLWORK(J1D)=PLWORK(J1D)+ZTEST0*(ZTEST*ZLWORK1(J1D)+ & (1-ZTEST)*ZLWORK2(J1D)) ZINTE(J1D) = ZINTE(J1D) - ZPOTE(J1D) END DO ENDIF END DO ENDIF END SUBROUTINE COMPUTE_BL89_ML ! ! ! ############################################################# SUBROUTINE COMPUTE_ENTR_DETR(OTEST,OTESTLCL,& 1,5 HFRAC_ICE,PFRAC_ICE,KK,PPABSM,PZZ,PDZZ,& PTHVM,PTHLM,PRTM,PW_UP2,& PTHL_UP,PRT_UP,PLUP,& PENTR,PDETR,PBUO_INTEG) ! ############################################################# !! !!***COMPUTE_ENTR_DETR* - calculates caracteristics of the updraft or downdraft !! using model of the EDMF scheme !! !! !! -------------------------------------------------------------------------- ! IMPLICIT NONE ! ! !* 1.1 Declaration of Arguments ! ! LOGICAL,DIMENSION(:),INTENT(INOUT) :: OTEST ! test to see if updraft is running LOGICAL,DIMENSION(:),INTENT(INOUT) :: OTESTLCL !test of condensation CHARACTER*1 :: HFRAC_ICE ! frac_ice can be compute using ! Temperature (T) or prescribed ! (Y) REAL, DIMENSION(:), INTENT(INOUT) :: PFRAC_ICE ! if frac_ice is prescribed INTEGER, INTENT(IN) :: KK ! level where E and D are computed ! ! prognostic variables at t- deltat ! REAL, DIMENSION(:,:), INTENT(IN) :: PPABSM ! Pressure at time t-1 REAL, DIMENSION(:,:), INTENT(IN) :: PZZ ! Height at the flux point REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! metrics coefficient REAL, DIMENSION(:,:), INTENT(IN) :: PTHVM ! ThetaV environment ! ! thermodynamical variables which are transformed in conservative var. ! REAL, DIMENSION(:), INTENT(IN) :: PTHLM ! Thetal REAL, DIMENSION(:), INTENT(IN) :: PRTM ! total mixing ratio REAL, DIMENSION(:,:), INTENT(INOUT) :: PW_UP2 ! Vertical velocity^2 REAL, DIMENSION(:), INTENT(IN) :: PTHL_UP,PRT_UP ! updraft properties REAL, DIMENSION(:), INTENT(IN) :: PLUP ! LUP compute from the ground REAL, DIMENSION(:), INTENT(INOUT) :: PENTR ! Mass flux entrainment of the updraft REAL, DIMENSION(:), INTENT(INOUT) :: PDETR ! Mass flux detrainment of the updraft REAL, DIMENSION(:), INTENT(INOUT) :: PBUO_INTEG! Integral Buoyancy ! ! ! 1.2 Declaration of local variables ! ! ! Variables for cloudy part REAL, DIMENSION(SIZE(PTHLM)) :: ZKIC ! fraction of env. mass in the muxtures REAL, DIMENSION(SIZE(PTHLM)) :: ZEPSI,ZDELTA ! factor entrainment detrainment REAL, DIMENSION(SIZE(PTHLM)) :: ZEPSI_CLOUD ! factor entrainment detrainment REAL, DIMENSION(SIZE(PTHLM)) :: ZCOEFFMF_CLOUD ! factor for compputing entr. detr. REAL, DIMENSION(SIZE(PTHLM)) :: ZMIXTHL,ZMIXRT ! Thetal and rt in the mixtures ! REAL, DIMENSION(SIZE(PTHLM)) :: ZTHMIX,ZTHVMIX ! Theta and Thetav of mixtures REAL, DIMENSION(SIZE(PTHLM)) :: ZRVMIX,ZRCMIX,ZRIMIX ! mixing ratios in mixtures REAL, DIMENSION(SIZE(PTHLM)) :: ZTHMIX_F2 ! Theta and Thetav of mixtures REAL, DIMENSION(SIZE(PTHLM)) :: ZRVMIX_F2,ZRCMIX_F2,ZRIMIX_F2 ! mixing ratios in mixtures REAL, DIMENSION(SIZE(PTHLM)) :: ZTHV_UP ! thvup at mass point kk REAL, DIMENSION(SIZE(PTHLM)) :: ZTHVMIX_1,ZTHVMIX_2 ! Theta and Thetav of mixtures ! Variables for dry part REAL, DIMENSION(SIZE(PTHLM)) :: ZBUO_INTEG,& ! Temporary integral Buoyancy ZDZ_HALF,& ! half-DeltaZ between 2 flux points ZDZ_STOP,& ! Exact Height of the LCL ZTHV_MINUS_HALF,& ! Thv at flux point(kk) ZTHV_PLUS_HALF,& ! Thv at flux point(kk+1) ZCOEFF_MINUS_HALF,& ! Variation of Thv between mass points kk-1 and kk ZCOEFF_PLUS_HALF,& ! Variation of Thv between mass points kk and kk+1 ZCOTHVU_MINUS_HALF,& ! Variation of Thvup between flux point kk and mass point kk ZCOTHVU_PLUS_HALF,& ! Variation of Thvup between mass point kk and flux point kk+1 ZW2_HALF ! w**2 at mass point KK REAL, DIMENSION(SIZE(PTHLM)) :: ZCOPRE_MINUS_HALF,& ! Variation of pressure between mass points kk-1 and kk ZCOPRE_PLUS_HALF,& ! Variation of pressure between mass points kk and kk+1 ZPRE_MINUS_HALF,& ! pressure at flux point kk ZPRE_PLUS_HALF,& ! pressure at flux point kk+1 ZTHV_UP_F1,& ! thv_up at flux point kk ZTHV_UP_F2 ! thv_up at flux point kk+1 REAL, DIMENSION(SIZE(PTHLM)) :: ZCOEFF_QSAT,& ! variation of Qsat at the transition between dry part and cloudy part ZRC_ORD,& ! ZPART_DRY ! part of dry part at the transition level ! REAL, DIMENSION(SIZE(PTHLM)) :: ZQVSAT ! QV at saturation REAL, DIMENSION(SIZE(PTHLM)) :: PT ! temperature to compute saturation vapour mixing ratio REAL, DIMENSION(SIZE(PTHVM,1),SIZE(PTHVM,2)) ::ZG_O_THVREF ! LOGICAL, DIMENSION(SIZE(OTEST,1)) :: GTEST_LOCAL_LCL,& ! true if LCL found between flux point KK and mass point KK GTEST_LOCAL_LCL2 ! true if LCL found between mass point KK and flux point KK+1 ! REAL :: ZRDORV ! RD/RV REAL :: ZRVORD ! RV/RD INTEGER :: ILON, ITEST, IKB ! !---------------------------------------------------------------------------------- ! 1.3 Initialisation ! ------------------ IKB=1 ! modif WRF JP ZRDORV = XRD / XRV !=0.622 ZRVORD = XRV / XRD !=1.607 ZG_O_THVREF=XG/PTHVM ZCOEFF_QSAT=0. ZRC_ORD=0. ZPART_DRY=1. GTEST_LOCAL_LCL=.FALSE. ZDZ_HALF(:) = (PZZ(:,KK+1)-PZZ(:,KK))/2. ZDZ_STOP(:) = ZDZ_HALF(:) ZKIC(:)=0.1 ! starting value for critical mixed fraction for CLoudy Part ! Computation of KIC ! --------------------- ! 2.1 Compute critical mixed fraction by estimating unknown ! T^mix r_c^mix and r_i^mix from thl^mix and r_t^mix ! We determine the zero crossing of the linear curve ! evaluating the derivative using ZMIXF=0.1. ! ----------------------------------------------------- ZMIXTHL(:) = ZKIC(:) * PTHLM(:)+(1. - ZKIC(:))*PTHL_UP(:) ZMIXRT(:) = ZKIC(:) * PRTM(:)+(1. - ZKIC(:))*PRT_UP(:) ! MIXTURE FOR CLOUDY PART ! Compute pressure at flux level KK and at flux Level KK+1 IF (KK==IKB) THEN !MODIF WRF JP ZCOPRE_MINUS_HALF(:) = 0. !MODIF WRF JP ELSE!MODIF WRF JP ZCOPRE_MINUS_HALF(:) = ((PPABSM(:,KK)-PPABSM(:,KK-1))/PDZZ(:,KK)) ENDIF!MODIF WRF JP ZCOPRE_PLUS_HALF(:) = ((PPABSM(:,KK+1)-PPABSM(:,KK))/PDZZ(:,KK+1)) IF (KK==IKB) THEN !MODIF WRF JP ZPRE_MINUS_HALF(:)= PPABSM(:,KK) ELSE!MODIF WRF JP ZPRE_MINUS_HALF(:)= ZCOPRE_MINUS_HALF*0.5*(PZZ(:,KK)-PZZ(:,KK-1))+PPABSM(:,KK-1) ENDIF!MODIF WRF JP ZPRE_PLUS_HALF(:) = ZCOPRE_PLUS_HALF*0.5*(PZZ(:,KK+1)-PZZ(:,KK))+PPABSM(:,KK) ! Compute non cons. var. of mixture at the mass level CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE,& PPABSM(:,KK),ZMIXTHL,ZMIXRT,& ZTHMIX,ZRVMIX,ZRCMIX,ZRIMIX) ! Compute theta_v of mixture at mass level KK for KF90 ZTHVMIX_1(:) = ZTHMIX(:)*(1.+ZRVORD*ZRVMIX(:))/(1.+ZMIXRT(:)) ! Compute non cons. var. of mixture at the flux level KK+1 CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE,& ZPRE_PLUS_HALF,ZMIXTHL,ZMIXRT,& ZTHMIX,ZRVMIX,ZRCMIX,ZRIMIX) ! compute theta_v of mixture at the flux level KK+1 for KF90 ZTHVMIX_2(:) = ZTHMIX(:)*(1.+ZRVORD*ZRVMIX(:))/(1.+ZMIXRT(:)) ! 2.1 Compute critical mixed fraction by estimating unknown ! T^mix r_c^mix and r_i^mix from thl^mix and r_t^mix ! We determine the zero crossing of the linear curve ! evaluating the derivative using ZMIXF=0.1. ! ----------------------------------------------------- ! THV_UP FOR DRY PART ! Compute theta_v of updraft at flux level KK CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE,& ZPRE_MINUS_HALF,PTHL_UP,PRT_UP,& ZTHMIX,ZRVMIX,ZRCMIX,ZRIMIX) ZTHV_UP_F1(:) = ZTHMIX(:)*(1.+ZRVORD*ZRVMIX(:))/(1.+PRT_UP(:)) ! Compute theta_v of updraft at mass level KK CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE,& PPABSM(:,KK),PTHL_UP,PRT_UP,& ZTHMIX,ZRVMIX,ZRCMIX,ZRIMIX) ZTHV_UP(:) = ZTHMIX(:)*(1.+ZRVORD*ZRVMIX(:))/(1.+PRT_UP(:)) ! Compute theta_v of updraft at flux level KK+1 CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE,& ZPRE_PLUS_HALF,PTHL_UP,PRT_UP,& ZTHMIX_F2,ZRVMIX_F2,ZRCMIX_F2,ZRIMIX_F2) ZTHV_UP_F2(:) = ZTHMIX_F2(:)*(1.+ZRVORD*ZRVMIX_F2(:))/(1.+PRT_UP(:)) ! !* 2.2 Compute final values for entr. and detr. ! ---------------------------------------- ! ! Dry PART ! Computation of integral entrainment and detrainment between flux level KK ! and mass level KK WHERE ((ZRCMIX(:)>0.).AND.(.NOT.OTESTLCL)) ! If rc is found between flux level KK and mass level KK ! a part of dry entrainment/detrainment is defined ! the exact height of LCL is also determined ZCOEFF_QSAT(:) = (ZRCMIX_F2(:) - ZRCMIX(:))/ ZDZ_HALF(:) ZRC_ORD(:) = ZRCMIX(:) - ZCOEFF_QSAT(:) * ZDZ_HALF(:) ZDZ_STOP = (- ZRC_ORD(:)/ZCOEFF_QSAT(:)) ZPART_DRY(:) = ZDZ_STOP / (PZZ(:,KK+1)-PZZ(:,KK)) GTEST_LOCAL_LCL(:)=.TRUE. ENDWHERE IF (KK==IKB) THEN !MODIF WRF JP ZCOEFF_MINUS_HALF = 0. ELSE!MODIF WRF JP ZCOEFF_MINUS_HALF = ((PTHVM(:,KK)-PTHVM(:,KK-1))/PDZZ(:,KK)) ENDIF!MODIF WRF JP ZCOEFF_PLUS_HALF = ((PTHVM(:,KK+1)-PTHVM(:,KK))/PDZZ(:,KK+1)) ZCOTHVU_MINUS_HALF = (ZTHV_UP(:)-ZTHV_UP_F1(:))/ZDZ_HALF(:) ZCOTHVU_PLUS_HALF = (ZTHV_UP_F2(:)-ZTHV_UP(:))/ZDZ_HALF(:) IF (KK==IKB) THEN !MODIF WRF JP ZTHV_MINUS_HALF = PTHVM(:,KK) ELSE!MODIF WRF JP ZTHV_MINUS_HALF = ZCOEFF_MINUS_HALF*0.5*(PZZ(:,KK)-PZZ(:,KK-1))+PTHVM(:,KK-1) ENDIF!MODIF WRF JP ZTHV_PLUS_HALF = ZCOEFF_PLUS_HALF*0.5*(PZZ(:,KK+1)-PZZ(:,KK))+ ZTHV_MINUS_HALF ! BUG JP 16082010 ! Integral Buoyancy between flux level KK and mass level KK PBUO_INTEG = ZG_O_THVREF(:,KK)*ZDZ_HALF(:)*& (0.5*( ZCOTHVU_MINUS_HALF - ZCOEFF_MINUS_HALF)*ZDZ_HALF(:) & - ZTHV_MINUS_HALF + ZTHV_UP_F1(:) ) WHERE ((OTEST).AND.(.NOT.OTESTLCL)) PENTR=0. PDETR=0. ZBUO_INTEG = ZG_O_THVREF(:,KK)*ZDZ_STOP(:)*& (0.5 * ( - ZCOEFF_MINUS_HALF)* ZDZ_STOP(:) & - ZTHV_MINUS_HALF + ZTHV_UP_F1(:) ) WHERE (ZBUO_INTEG(:)>=0.) PENTR = 0.5/(XABUO-XBENTR*XENTR_DRY)*& LOG(1.+ (2.*(XABUO-XBENTR*XENTR_DRY)/PW_UP2(:,KK))* & ZBUO_INTEG) PDETR = 0. ZW2_HALF = PW_UP2(:,KK) + 2*(XABUO-XBENTR*XENTR_DRY)*(ZBUO_INTEG) ELSEWHERE PENTR = 0. PDETR = 0.5/(XABUO)*& LOG(1.+ (2.*(XABUO)/PW_UP2(:,KK))* & MAX(0.,-ZBUO_INTEG)) ZW2_HALF = PW_UP2(:,KK) + 2*(XABUO)*(ZBUO_INTEG) ENDWHERE ENDWHERE ZDZ_STOP(:) = ZDZ_HALF(:) ! total Integral Buoyancy between flux level KK and flux level KK+1 PBUO_INTEG = PBUO_INTEG + ZG_O_THVREF(:,KK)*ZDZ_HALF(:)*& (0.5*(ZCOTHVU_PLUS_HALF - ZCOEFF_PLUS_HALF)* ZDZ_HALF(:) - & PTHVM(:,KK) + ZTHV_UP(:) ) WHERE ((((ZRCMIX_F2(:)>0.).AND.(ZRCMIX(:)<=0.)).AND.(.NOT.OTESTLCL)).AND.(.NOT.GTEST_LOCAL_LCL(:))) ! If rc is found between mass level KK and flux level KK+1 ! a part of dry entrainment is defined ! the exact height of LCL is also determined PT(:)=ZTHMIX_F2(:)*((PPABSM(:,KK+1)/XP00)**(XRD/XCPD)) ZQVSAT(:)=EXP( XALPW - XBETAW/PT(:) - XGAMW*LOG(PT(:)) ) ZQVSAT(:)=XRD/XRV*ZQVSAT(:)/PPABSM(:,KK+1) & / (1.+(XRD/XRV-1.)*ZQVSAT(:)/PPABSM(:,KK+1)) ZCOEFF_QSAT(:) = (PRT_UP(:) - ZQVSAT(:) - & ZRCMIX(:))/ (0.5* (PZZ(:,KK+2)-PZZ(:,KK+1))) ZRC_ORD(:) = ZRCMIX_F2(:) - ZCOEFF_QSAT(:) * ZDZ_HALF(:) ZDZ_STOP = (- ZRC_ORD(:)/ZCOEFF_QSAT(:)) ZPART_DRY(:) = 0.5+ZDZ_STOP / (PZZ(:,KK+1)-PZZ(:,KK)) GTEST_LOCAL_LCL2(:)=.TRUE. ENDWHERE WHERE (((OTEST).AND.(.NOT.OTESTLCL)).AND.(.NOT.GTEST_LOCAL_LCL(:))) ZBUO_INTEG = ZG_O_THVREF(:,KK)*ZDZ_STOP(:)*& (0.5*( - ZCOEFF_PLUS_HALF)* ZDZ_STOP(:)& - PTHVM(:,KK) + ZTHV_UP(:) ) WHERE (ZW2_HALF>0.) WHERE (ZBUO_INTEG(:)>=0.) PENTR = PENTR + 0.5/(XABUO-XBENTR*XENTR_DRY)* & LOG(1.+ (2.*(XABUO-XBENTR*XENTR_DRY)/ZW2_HALF(:)) * ZBUO_INTEG) PDETR = PDETR ELSEWHERE PENTR = PENTR PDETR = PDETR + 0.5/(XABUO)* & LOG(1.+ (2.*(XABUO)/ZW2_HALF(:)) * & MAX(-ZBUO_INTEG,0.)) ENDWHERE ELSEWHERE ! if w**2<0 the updraft is stopped OTEST=.FALSE. PENTR = PENTR PDETR = PDETR ENDWHERE ENDWHERE PENTR = XENTR_DRY*PENTR/(PZZ(:,KK+1)-PZZ(:,KK)) PDETR = XDETR_DRY*PDETR/(PZZ(:,KK+1)-PZZ(:,KK)) PDETR = MAX(ZPART_DRY(:)*XDETR_LUP/(PLUP-0.5*(PZZ(:,KK)+PZZ(:,KK+1))),PDETR) ! compute final value of critical mixed fraction using theta_v ! of mixture, grid-scale and updraft in cloud WHERE ((OTEST).AND.(OTESTLCL)) ZKIC(:) = MAX(0.,ZTHV_UP(:)-PTHVM(:,KK))*ZKIC(:) / & (ZTHV_UP(:)-ZTHVMIX_1(:)+1.E-10) ZKIC(:) = MAX(0., MIN(1., ZKIC(:))) ZEPSI(:) = ZKIC(:) **2. ZDELTA(:) = (1.-ZKIC(:))**2. ZEPSI_CLOUD=MIN(ZDELTA,ZEPSI) ZCOEFFMF_CLOUD(:)=XENTR_MF * XG / XCRAD_MF PENTR(:) = ZCOEFFMF_CLOUD(:)*ZEPSI_CLOUD(:) PDETR(:) = ZCOEFFMF_CLOUD(:)*ZDELTA(:) ENDWHERE ! compute final value of critical mixed fraction using theta_v ! of mixture, grid-scale and updraft in cloud WHERE (((OTEST).AND.(.NOT.(OTESTLCL))).AND.((GTEST_LOCAL_LCL(:).OR.GTEST_LOCAL_LCL2(:)))) ZKIC(:) = MAX(0.,ZTHV_UP_F2(:)-ZTHV_PLUS_HALF)*ZKIC(:) / & (ZTHV_UP_F2(:)-ZTHVMIX_2(:)+1.E-10) ZKIC(:) = MAX(0., MIN(1., ZKIC(:))) ZEPSI(:) = ZKIC(:) **2. ZDELTA(:) = (1.-ZKIC(:))**2. ZEPSI_CLOUD=MIN(ZDELTA,ZEPSI) ZCOEFFMF_CLOUD(:)=XENTR_MF * XG / XCRAD_MF PENTR(:) = PENTR+(1.-ZPART_DRY(:))*ZCOEFFMF_CLOUD(:)*ZEPSI_CLOUD(:) PDETR(:) = PDETR+(1.-ZPART_DRY(:))*ZCOEFFMF_CLOUD(:)*ZDELTA(:) ENDWHERE END SUBROUTINE COMPUTE_ENTR_DETR ! ################################################################# SUBROUTINE COMPUTE_FUNCTION_THERMO_MF( KRR,KRRL,KRRI, & 1 PTH, PR, PEXN, PPABS, & PT,PLVOCPEXN,PLSOCPEXN, & PAMOIST,PATHETA ) ! ################################################################# ! !! !!**** *COMPUTE_FUNCTION_THERMO_MF* - !! !! !! -------------------------------------------------------------------------- ! ! IMPLICIT NONE ! ! !* 0.1 declarations of arguments ! INTEGER, INTENT(IN) :: KRR ! number of moist var. INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. INTEGER, INTENT(IN) :: KRRI ! number of ice water var. REAL, DIMENSION(:,:,:), INTENT(IN) :: PTH ! theta REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PR ! water species REAL, DIMENSION(:,:,:) , INTENT(IN) :: PPABS,PEXN ! pressure, Exner funct. REAL, DIMENSION(:,:,:), INTENT(OUT) :: PT ! temperature REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLVOCPEXN,PLSOCPEXN ! L/(cp*Pi) REAL, DIMENSION(:,:,:), INTENT(OUT) :: PAMOIST,PATHETA ! !------------------------------------------------------------------------------- ! !* 0.2 Declarations of local variables ! REAL :: ZEPS ! XMV / XMD REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: & ZCP, & ! Cp ZE, & ! Saturation mixing ratio ZDEDT, & ! Saturation mixing ratio derivative ZFRAC_ICE, & ! Ice fraction ZAMOIST_W, & ! Coefficients for s = f (Thetal,Rnp) ZATHETA_W, & ! ZAMOIST_I, & ! ZATHETA_I ! INTEGER :: JRR ! !------------------------------------------------------------------------------- ! ZEPS = XMV / XMD PLVOCPEXN(:,:,:) = 0. PLSOCPEXN(:,:,:) = 0. PAMOIST(:,:,:) = 0. PATHETA(:,:,:) = 0. ZFRAC_ICE(:,:,:) = 0.0 ZAMOIST_W(:,:,:) = 0.0 ZATHETA_W(:,:,:) = 0.0 ZAMOIST_I(:,:,:) = 0.0 ZATHETA_I(:,:,:) = 0.0 ! !* Cph ! ZCP=XCPD IF (KRR > 0) ZCP(:,:,:) = ZCP(:,:,:) + XCPV * PR(:,:,:,1) DO JRR = 2,1+KRRL ! loop on the liquid components ZCP(:,:,:) = ZCP(:,:,:) + XCL * PR(:,:,:,JRR) END DO DO JRR = 2+KRRL,1+KRRL+KRRI ! loop on the solid components ZCP(:,:,:) = ZCP(:,:,:) + XCI * PR(:,:,:,JRR) END DO !* Temperature ! PT(:,:,:) = PTH(:,:,:) * PEXN(:,:,:) ! ! !! Liquid water ! IF ( KRRL >= 1 ) THEN ! !* Lv/Cph ! PLVOCPEXN(:,:,:) = (XLVTT + (XCPV-XCL) * (PT(:,:,:)-XTT) ) / ZCP(:,:,:) ! !* Saturation vapor pressure with respect to water ! ZE(:,:,:) = EXP( XALPW - XBETAW/PT(:,:,:) - XGAMW*ALOG( PT(:,:,:) ) ) ! !* Saturation mixing ratio with respect to water ! ZE(:,:,:) = ZE(:,:,:) * ZEPS / ( PPABS(:,:,:) - ZE(:,:,:) ) ! !* Compute the saturation mixing ratio derivative (rvs') ! ZDEDT(:,:,:) = ( XBETAW / PT(:,:,:) - XGAMW ) / PT(:,:,:) & * ZE(:,:,:) * ( 1. + ZE(:,:,:) / ZEPS ) ! !* Compute Amoist ! ZAMOIST_W(:,:,:)= 0.5 / ( 1.0 + ZDEDT(:,:,:) * PLVOCPEXN(:,:,:) ) ! !* Compute Atheta ! ZATHETA_W(:,:,:)= ZAMOIST_W(:,:,:) * PEXN(:,:,:) * & ( ( ZE(:,:,:) - PR(:,:,:,1) ) * PLVOCPEXN(:,:,:) / & ( 1. + ZDEDT(:,:,:) * PLVOCPEXN(:,:,:) ) * & ( & ZE(:,:,:) * (1. + ZE(:,:,:)/ZEPS) & * ( -2.*XBETAW/PT(:,:,:) + XGAMW ) / PT(:,:,:)**2 & +ZDEDT(:,:,:) * (1. + 2. * ZE(:,:,:)/ZEPS) & * ( XBETAW/PT(:,:,:) - XGAMW ) / PT(:,:,:) & ) & - ZDEDT(:,:,:) & ) ! !! Solid water ! IF ( KRRI >= 1 ) THEN ! !* Fraction of ice ! WHERE(PR(:,:,:,2)+PR(:,:,:,4)>0.0) ZFRAC_ICE(:,:,:) = PR(:,:,:,4) / ( PR(:,:,:,2)+PR(:,:,:,4) ) END WHERE ! !* Ls/Cph ! PLSOCPEXN(:,:,:) = (XLSTT + (XCPV-XCI) * (PT(:,:,:)-XTT) ) / ZCP(:,:,:) ! !* Saturation vapor pressure with respect to ice ! ZE(:,:,:) = EXP( XALPI - XBETAI/PT(:,:,:) - XGAMI*ALOG( PT(:,:,:) ) ) ! !* Saturation mixing ratio with respect to ice ! ZE(:,:,:) = ZE(:,:,:) * ZEPS / ( PPABS(:,:,:) - ZE(:,:,:) ) ! !* Compute the saturation mixing ratio derivative (rvs') ! ZDEDT(:,:,:) = ( XBETAI / PT(:,:,:) - XGAMI ) / PT(:,:,:) & * ZE(:,:,:) * ( 1. + ZE(:,:,:) / ZEPS ) ! !* Compute Amoist ! ZAMOIST_I(:,:,:)= 0.5 / ( 1.0 + ZDEDT(:,:,:) * PLSOCPEXN(:,:,:) ) ! !* Compute Atheta ! ZATHETA_I(:,:,:)= ZAMOIST_I(:,:,:) * PEXN(:,:,:) * & ( ( ZE(:,:,:) - PR(:,:,:,1) ) * PLSOCPEXN(:,:,:) / & ( 1. + ZDEDT(:,:,:) * PLSOCPEXN(:,:,:) ) * & ( & ZE(:,:,:) * (1. + ZE(:,:,:)/ZEPS) & * ( -2.*XBETAI/PT(:,:,:) + XGAMI ) / PT(:,:,:)**2 & +ZDEDT(:,:,:) * (1. + 2. * ZE(:,:,:)/ZEPS) & * ( XBETAI/PT(:,:,:) - XGAMI ) / PT(:,:,:) & ) & - ZDEDT(:,:,:) & ) ENDIF PAMOIST(:,:,:) = (1.0-ZFRAC_ICE(:,:,:))*ZAMOIST_W(:,:,:) & +ZFRAC_ICE(:,:,:) *ZAMOIST_I(:,:,:) PATHETA(:,:,:) = (1.0-ZFRAC_ICE(:,:,:))*ZATHETA_W(:,:,:) & +ZFRAC_ICE(:,:,:) *ZATHETA_I(:,:,:) ! !* Lv/Cph/Exner and Ls/Cph/Exner ! PLVOCPEXN(:,:,:) = PLVOCPEXN(:,:,:) / PEXN(:,:,:) PLSOCPEXN(:,:,:) = PLSOCPEXN(:,:,:) / PEXN(:,:,:) ! ENDIF END SUBROUTINE COMPUTE_FUNCTION_THERMO_MF ! ! ################################################################# SUBROUTINE COMPUTE_UPDRAFT(OMIXUV,PZZ,PDZZ,KK, & 1,4 PSFTH,PSFRV, & PPABSM,PRHODREF,PUM,PVM, PTKEM, & PTHM,PRVM,PRCM,PRIM,PTHLM,PRTM, & PTHL_UP,PRT_UP, & PRV_UP,PRC_UP,PRI_UP,PTHV_UP, & PW_UP,PU_UP, PV_UP, & PFRAC_UP,PEMF,PDETR,PENTR, & KKLCL,KKETL,KKCTL) ! ################################################################# !! !!**** *COMPUTE_UPDRAFT* - calculates caracteristics of the updraft !! !! -------------------------------------------------------------------------- IMPLICIT NONE !* 1.1 Declaration of Arguments ! ! ! LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum REAL, DIMENSION(:,:), INTENT(IN) :: PZZ ! Height at the flux point REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Metrics coefficient INTEGER, INTENT(IN) :: KK REAL, DIMENSION(:), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta,rv,(u,v) parallel to the orography ! REAL, DIMENSION(:,:), INTENT(IN) :: PPABSM ! Pressure at t-dt REAL, DIMENSION(:,:), INTENT(IN) :: PRHODREF ! dry density of the ! reference state REAL, DIMENSION(:,:), INTENT(IN) :: PUM ! u mean wind REAL, DIMENSION(:,:), INTENT(IN) :: PVM ! v mean wind REAL, DIMENSION(:,:), INTENT(IN) :: PTKEM ! TKE at t-dt ! REAL, DIMENSION(:,:), INTENT(IN) :: PTHM ! liquid pot. temp. at t-dt REAL, DIMENSION(:,:), INTENT(IN) :: PRVM,PRCM,PRIM ! vapor mixing ratio at t-dt REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM,PRTM ! cons. var. at t-dt REAL, DIMENSION(:,:), INTENT(OUT) :: PTHL_UP,PRT_UP ! updraft properties REAL, DIMENSION(:,:), INTENT(OUT) :: PU_UP, PV_UP ! updraft wind components REAL, DIMENSION(:,:), INTENT(OUT) :: PRV_UP,PRC_UP, & ! updraft rv, rc PRI_UP,PTHV_UP,& ! updraft ri, THv PW_UP,PFRAC_UP ! updraft w, fraction REAL, DIMENSION(:,:), INTENT(OUT) :: PEMF,PDETR,PENTR ! Mass_flux, ! detrainment,entrainment INTEGER, DIMENSION(:), INTENT(OUT) :: KKLCL,KKETL,KKCTL! LCL, ETL, CTL ! 1.2 Declaration of local variables ! ! ! Mean environment variables at t-dt at flux point REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: & ZTHM_F,ZRVM_F,ZRCM_F,ZRIM_F ! Theta,rv,rl,ri of ! updraft environnement REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: & ZRTM_F, ZTHLM_F, ZTKEM_F,& ! rt, thetal,TKE,pressure, ZUM_F,ZVM_F,ZRHO_F, & ! density,momentum ZPRES_F,ZTHVM_F,ZTHVM, & ! interpolated at the flux point ZG_O_THVREF, & ! g*ThetaV ref ZW_UP2 ! w**2 of the updraft REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: & ZTH_UP, & ! updraft THETA ZFRAC_ICE ! Ice fraction REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZCOEF ! diminution coefficient for too high clouds REAL, DIMENSION(SIZE(PSFTH,1) ) :: ZWTHVSURF ! Surface w'thetav' CHARACTER(LEN=1) :: YFRAC_ICE ! Ice Fraction ! precribed or computed REAL :: ZRDORV ! RD/RV REAL :: ZRVORD ! RV/RD REAL, DIMENSION(SIZE(PTHM,1)) :: ZMIX1,ZMIX2,ZMIX3 REAL, DIMENSION(SIZE(PTHM,1)) :: ZBUO_INTEG ! Integrated Buoyancy REAL, DIMENSION(SIZE(PTHM,1)) :: ZLUP ! Upward Mixing length from the ground REAL, DIMENSION(SIZE(PTHM,1)) :: ZDEPTH ! Deepness limit for cloud INTEGER :: IKB,IKE ! index value for the Beginning and the End ! of the physical domain for the mass points INTEGER :: IKU ! array size in k INTEGER :: JK,JI,JSV ! loop counters LOGICAL, DIMENSION(SIZE(PTHM,1)) :: GTEST,GTESTLCL,GTESTETL ! Test if the ascent continue, if LCL or ETL is reached LOGICAL :: GLMIX ! To choose upward or downward mixing length LOGICAL, DIMENSION(SIZE(PTHM,1)) :: GWORK1 LOGICAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: GWORK2 INTEGER :: ITEST REAL :: ZTMAX,ZRMAX ! control value ! Thresholds for the perturbation of ! theta_l and r_t at the first level of the updraft ZTMAX=2.0 ZRMAX=1.E-3 !------------------------------------------------------------------------ ! INITIALISATION ! Local variables, internal domain ! Internal Domain IKU=SIZE(PTHM,2) IKB=1 ! modif WRF JP IKE=IKU-1 ! modif WRF JP ! Initialisation of intersesting Level :LCL,ETL,CTL KKLCL(:)=IKE KKETL(:)=IKE KKCTL(:)=IKE ! ! Initialisation PRV_UP(:,:)=0. PRC_UP(:,:)=0. PW_UP(:,:)=0. PEMF(:,:)=0. PDETR(:,:)=0. PENTR(:,:)=0. ZTH_UP(:,:)=0. PFRAC_UP(:,:)=0. PTHV_UP(:,:)=0. !no ice cloud coded yet PRI_UP(:,:)=0. ZFRAC_ICE(:,:)=0. YFRAC_ICE='T' ZBUO_INTEG=0. ! Initialisation of the constants ZRDORV = XRD / XRV !=0.622 ZRVORD = (XRV / XRD) ! Initialisation of environment variables at t-dt ! variables at flux level ZTHM_F (:,IKB+1:IKU) = 0.5*(PTHM(:,IKB:IKU-1)+PTHM(:,IKB+1:IKU)) ZTHLM_F(:,IKB+1:IKU) = 0.5*(PTHLM(:,IKB:IKU-1)+PTHLM(:,IKB+1:IKU)) ZRTM_F (:,IKB+1:IKU) = 0.5*(PRTM(:,IKB:IKU-1)+PRTM(:,IKB+1:IKU)) ZTKEM_F(:,IKB+1:IKU) = 0.5*(PTKEM(:,IKB:IKU-1)+PTKEM(:,IKB+1:IKU)) ZPRES_F(:,IKB+1:IKU) = 0.5*(PPABSM(:,IKB:IKU-1)+PPABSM(:,IKB+1:IKU)) ZRHO_F (:,IKB+1:IKU) = 0.5*(PRHODREF(:,IKB:IKU-1)+PRHODREF(:,IKB+1:IKU)) ZRVM_F (:,IKB+1:IKU) = 0.5*(PRVM(:,IKB:IKU-1)+PRVM(:,IKB+1:IKU)) ZUM_F (:,IKB+1:IKU) = 0.5*(PUM(:,IKB:IKU-1)+PUM(:,IKB+1:IKU)) ZVM_F (:,IKB+1:IKU) = 0.5*(PVM(:,IKB:IKU-1)+PVM(:,IKB+1:IKU)) ZTHM_F (:,IKB) = PTHM(:,IKB) ZTHLM_F(:,IKB) = PTHLM(:,IKB) ZRTM_F (:,IKB) = PRTM (:,IKB) ZTKEM_F(:,IKB) = PTKEM(:,IKB) ZPRES_F(:,IKB) = PPABSM(:,IKB) ZRHO_F(:,IKB) = PRHODREF(:,IKB) ZRVM_F(:,IKB) = PRVM(:,IKB) ZUM_F(:,IKB) = PUM(:,IKB) ZVM_F(:,IKB) = PVM(:,IKB) ! thetav at mass and flux levels ZTHVM_F(:,:)=ZTHM_F(:,:)*((1.+ZRVORD*ZRVM_F(:,:))/(1.+ZRTM_F(:,:))) ZTHVM(:,:)=PTHM(:,:)*((1.+ZRVORD*PRVM(:,:))/(1.+PRTM(:,:))) ! ! Initialisation of updraft characteristics PTHL_UP(:,:)=ZTHLM_F(:,:) PRT_UP(:,:)=ZRTM_F(:,:) ZW_UP2(:,:)=0. PTHV_UP(:,:)=ZTHVM_F(:,:) PU_UP(:,:)=ZUM_F(:,:) PV_UP(:,:)=ZVM_F(:,:) ! Computation or initialisation of updraft characteristics at the KK level ! thetal_up,rt_up,thetaV_up, w²,Buoyancy term and mass flux (PEMF) ! 03/2009 !PTHL_UP(:,KK)= ZTHLM_F(:,KK)+(PSFTH(:)/SQRT(ZTKEM_F(:,KK)))*XALP_PERT !PRT_UP(:,KK) = ZRTM_F(:,KK)+(PSFRV(:)/SQRT(ZTKEM_F(:,KK)))*XALP_PERT PTHL_UP(:,KK)= ZTHLM_F(:,KK)+MAX(0.,MIN(ZTMAX,(PSFTH(:)/SQRT(ZTKEM_F(:,KK)))*XALP_PERT)) PRT_UP(:,KK) = ZRTM_F(:,KK)+MAX(0.,MIN(ZRMAX,(PSFRV(:)/SQRT(ZTKEM_F(:,KK)))*XALP_PERT)) ZW_UP2(:,KK) = MAX(0.0001,(2./3.)*ZTKEM_F(:,KK)) ! Computation of non conservative variable for the KK level of the updraft ! (all or nothing ajustement) CALL TH_R_FROM_THL_RT_2D(YFRAC_ICE,ZFRAC_ICE(:,KK:KK),ZPRES_F(:,KK:KK), & PTHL_UP(:,KK:KK),PRT_UP(:,KK:KK),ZTH_UP(:,KK:KK), & PRV_UP(:,KK:KK),PRC_UP(:,KK:KK),PRI_UP(:,KK:KK)) ! compute updraft thevav and buoyancy term at KK level PTHV_UP(:,KK) = ZTH_UP(:,KK)*((1+ZRVORD*PRV_UP(:,KK))/(1+PRT_UP(:,KK))) ! Closure assumption for mass flux at KK level ZG_O_THVREF=XG/ZTHVM_F ! compute L_up GLMIX=.TRUE. ZTKEM_F(:,KK)=0. CALL COMPUTE_BL89_ML(PDZZ,ZTKEM_F,ZG_O_THVREF,ZTHVM_F,KK,GLMIX,ZLUP) ZLUP(:)=MAX(ZLUP(:),1.E-10) ! Compute Buoyancy flux at the ground ZWTHVSURF(:) = (ZTHVM_F(:,IKB)/ZTHM_F(:,IKB))*PSFTH(:)+ & (0.61*ZTHM_F(:,IKB))*PSFRV(:) ! Mass flux at KK level (updraft triggered if PSFTH>0.) WHERE (ZWTHVSURF(:)>0.) PEMF(:,KK) = XCMF * ZRHO_F(:,KK) * ((ZG_O_THVREF(:,KK))*ZWTHVSURF*ZLUP)**(1./3.) PFRAC_UP(:,KK)=MIN(PEMF(:,KK)/(SQRT(ZW_UP2(:,KK))*ZRHO_F(:,KK)),XFRAC_UP_MAX) ZW_UP2(:,KK)=(PEMF(:,KK)/(PFRAC_UP(:,KK)*ZRHO_F(:,KK)))**2 GTEST(:)=.TRUE. ELSEWHERE PEMF(:,KK) =0. GTEST(:)=.FALSE. ENDWHERE !-------------------------------------------------------------------------- ! 3. Iteration ! --------- ! ! If GTEST = T the updraft starts from the KK level and stops when GTEST becomes F ! ! GTESTLCL(:)=.FALSE. GTESTETL(:)=.FALSE. ! Loop on vertical level DO JK=KK,IKE-1 ! IF the updraft top is reached for all column, stop the loop on levels ITEST=COUNT(GTEST) IF (ITEST==0) CYCLE ! Computation of entrainment and detrainment with KF90 ! parameterization in clouds and LR01 in subcloud layer ! to find the LCL (check if JK is LCL or not) WHERE(GTEST) WHERE ((PRC_UP(:,JK)>0.).AND.(.NOT.(GTESTLCL))) KKLCL(:) = JK GTESTLCL(:)=.TRUE. ENDWHERE ENDWHERE ! COMPUTE PENTR and PDETR at mass level JK CALL COMPUTE_ENTR_DETR(GTEST,GTESTLCL,YFRAC_ICE,ZFRAC_ICE(:,JK),JK,& PPABSM(:,:),PZZ(:,:),PDZZ(:,:),ZTHVM(:,:),& PTHLM(:,JK),PRTM(:,JK),ZW_UP2(:,:), & PTHL_UP(:,JK),PRT_UP(:,JK),ZLUP(:), & PENTR(:,JK),PDETR(:,JK),ZBUO_INTEG) IF (JK==KK) THEN PDETR(:,JK)=0. ENDIF ! Computation of updraft characteristics at level JK+1 WHERE(GTEST) ZMIX1(:)=0.5*(PZZ(:,JK+1)-PZZ(:,JK))*(PENTR(:,JK)-PDETR(:,JK)) PEMF(:,JK+1)=PEMF(:,JK)*EXP(2*ZMIX1(:)) ENDWHERE ! stop the updraft if MF becomes negative WHERE (GTEST.AND.(PEMF(:,JK+1)<=0.)) PEMF(:,JK+1)=0. GTEST(:)=.FALSE. KKCTL(:) = JK+1 ENDWHERE ! If the updraft did not stop, compute cons updraft characteritics at jk+1 WHERE(GTEST) ZMIX2(:) = (PZZ(:,JK+1)-PZZ(:,JK))*PENTR(:,JK) !& ZMIX3(:) = (PZZ(:,JK+1)-PZZ(:,JK))*PDETR(:,JK) !& PTHL_UP(:,JK+1) = (PTHL_UP(:,JK)*(1.-0.5*ZMIX2(:)) + PTHLM(:,JK)*ZMIX2(:)) & /(1.+0.5*ZMIX2(:)) PRT_UP(:,JK+1) = (PRT_UP (:,JK)*(1.-0.5*ZMIX2(:)) + PRTM(:,JK)*ZMIX2(:)) & /(1.+0.5*ZMIX2(:)) ENDWHERE IF(OMIXUV) THEN WHERE(GTEST) PU_UP(:,JK+1) = (PU_UP (:,JK)*(1-0.5*ZMIX2(:)) + PUM(:,JK)*ZMIX2(:)+ & 0.5*XPRES_UV*(PZZ(:,JK+1)-PZZ(:,JK))*& ((PUM(:,JK+1)-PUM(:,JK))/PDZZ(:,JK+1)+& (PUM(:,JK)-PUM(:,JK-1))/PDZZ(:,JK)) ) & /(1+0.5*ZMIX2(:)) PV_UP(:,JK+1) = (PV_UP (:,JK)*(1-0.5*ZMIX2(:)) + PVM(:,JK)*ZMIX2(:)+ & 0.5*XPRES_UV*(PZZ(:,JK+1)-PZZ(:,JK))*& ((PVM(:,JK+1)-PVM(:,JK))/PDZZ(:,JK+1)+& (PVM(:,JK)-PVM(:,JK-1))/PDZZ(:,JK)) ) & /(1+0.5*ZMIX2(:)) ENDWHERE ENDIF ! Compute non cons. var. at level JK+1 CALL TH_R_FROM_THL_RT_2D(YFRAC_ICE,ZFRAC_ICE(:,JK+1:JK+1),ZPRES_F(:,JK+1:JK+1), & PTHL_UP(:,JK+1:JK+1),PRT_UP(:,JK+1:JK+1),ZTH_UP(:,JK+1:JK+1), & PRV_UP(:,JK+1:JK+1),PRC_UP(:,JK+1:JK+1),PRI_UP(:,JK+1:JK+1)) ! Compute the updraft theta_v, buoyancy and w**2 for level JK+1 WHERE(GTEST) PTHV_UP(:,JK+1) = ZTH_UP(:,JK+1)*((1+ZRVORD*PRV_UP(:,JK+1))/(1+PRT_UP(:,JK+1))) WHERE (.NOT.(GTESTLCL)) WHERE (ZBUO_INTEG(:)>0.) ZW_UP2(:,JK+1) = ZW_UP2(:,JK) + 2.*(XABUO-XBENTR*XENTR_DRY)* ZBUO_INTEG(:) ENDWHERE WHERE (ZBUO_INTEG(:)<=0.) ZW_UP2(:,JK+1) = ZW_UP2(:,JK) + 2.*XABUO* ZBUO_INTEG(:) ENDWHERE ENDWHERE WHERE (GTESTLCL) ZW_UP2(:,JK+1) = ZW_UP2(:,JK)*(1.-(XBDETR*ZMIX3(:)+XBENTR*ZMIX2(:)))& /(1.+(XBDETR*ZMIX3(:)+XBENTR*ZMIX2(:))) & +2.*(XABUO)*ZBUO_INTEG/(1.+(XBDETR*ZMIX3(:)+XBENTR*ZMIX2(:))) ENDWHERE ENDWHERE ! Test if the updraft has reach the ETL GTESTETL(:)=.FALSE. WHERE (GTEST.AND.(ZBUO_INTEG(:)<=0.)) KKETL(:) = JK+1 GTESTETL(:)=.TRUE. ENDWHERE ! Test is we have reached the top of the updraft WHERE (GTEST.AND.((ZW_UP2(:,JK+1)<=0.).OR.(PEMF(:,JK+1)<=0.))) ZW_UP2(:,JK+1)=0. PEMF(:,JK+1)=0. GTEST(:)=.FALSE. PTHL_UP(:,JK+1)=ZTHLM_F(:,JK+1) PRT_UP(:,JK+1)=ZRTM_F(:,JK+1) PRC_UP(:,JK+1)=0. PRV_UP(:,JK+1)=0. PTHV_UP(:,JK+1)=ZTHVM_F(:,JK+1) PFRAC_UP(:,JK+1)=0. KKCTL(:)=JK+1 ENDWHERE ! compute frac_up at JK+1 WHERE (GTEST) PFRAC_UP(:,JK+1)=PEMF(:,JK+1)/(SQRT(ZW_UP2(:,JK+1))*ZRHO_F(:,JK+1)) ENDWHERE ! Updraft fraction must be smaller than XFRAC_UP_MAX WHERE (GTEST) PFRAC_UP(:,JK+1)=MIN(XFRAC_UP_MAX,PFRAC_UP(:,JK+1)) ENDWHERE ! When cloudy and non-buoyant, updraft fraction must decrease WHERE ((GTEST.AND.GTESTETL).AND.GTESTLCL) PFRAC_UP(:,JK+1)=MIN(PFRAC_UP(:,JK+1),PFRAC_UP(:,JK)) ENDWHERE ! Mass flux is updated with the new updraft fraction PEMF(:,JK+1)=PFRAC_UP(:,JK+1)*SQRT(ZW_UP2(:,JK+1))*ZRHO_F(:,JK+1) ENDDO PW_UP(:,:)=SQRT(ZW_UP2(:,:)) PEMF(:,KK) =0. PEMF(:,IKU)=0. ! modif WRF JP PFRAC_UP(:,IKU)=0. DO JI=1,SIZE(PTHM,1) ZDEPTH(JI) = (PZZ(JI,KKCTL(JI)) - PZZ(JI,KKLCL(JI)) ) END DO GWORK1(:)= (GTESTLCL(:) .AND. (ZDEPTH(:) > 3000.) ) GWORK2(:,:) = SPREAD( GWORK1(:), DIM=2, NCOPIES=IKU ) ZCOEF(:,:) = SPREAD( (1.-(ZDEPTH(:)-3000.)/1000.), DIM=2, NCOPIES=IKU) ZCOEF=MIN(MAX(ZCOEF,0.),1.) WHERE (GWORK2) PEMF(:,:) = PEMF(:,:) * ZCOEF(:,:) PFRAC_UP(:,:) = PFRAC_UP(:,:) * ZCOEF(:,:) ENDWHERE END SUBROUTINE COMPUTE_UPDRAFT ! ################################################################# SUBROUTINE MF_TURB(OMIXUV, PIMPL, PTSTEP, & 1,4 PTSTEP_MET, PDZZ, & PRHODJ, & PTHLM,PTHVM,PRTM,PUM,PVM, & PTHLDT,PRTDT,PUDT,PVDT, & PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP, & PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF ) ! ################################################################# ! ! !!**** *MF_TURB* - computes the MF_turbulent source terms for the prognostic !! variables. !! !! -------------------------------------------------------------------------- ! ! IMPLICIT NONE ! ! !* 0.1 declarations of arguments ! ! LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum REAL, INTENT(IN) :: PIMPL ! degree of implicitness REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep REAL, INTENT(IN) :: PTSTEP_MET! Timestep for meteorological variables ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficients REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size ! Conservative var. at t-dt REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! conservative pot. temp. REAL, DIMENSION(:,:,:), INTENT(IN) :: PRTM ! water var. where ! Virtual potential temperature at t-dt REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVM ! Momentum at t-dt REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM REAL, DIMENSION(:,:,:), INTENT(IN) :: PVM ! ! Tendencies of conservative variables REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHLDT REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRTDT ! Tendencies of momentum REAL, DIMENSION(:,:,:), INTENT(OUT) :: PUDT REAL, DIMENSION(:,:,:), INTENT(OUT) :: PVDT ! Tendencies of scalar variables ! Updraft characteritics REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP ! Fluxes REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF ! ! ! !------------------------------------------------------------------------------- ! ! 0.2 declaration of local variables ! REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZVARS ! !---------------------------------------------------------------------------- ! !* 1.PRELIMINARIES ! ------------- ! ! ! PFLXZTHMF = 0. PFLXZRMF = 0. PFLXZTHVMF = 0. PFLXZUMF = 0. PFLXZVMF = 0. PTHLDT = 0. PRTDT = 0. PUDT = 0. PVDT = 0. ! !---------------------------------------------------------------------------- ! !* 2. COMPUTE THE MEAN FLUX OF CONSERVATIVE VARIABLES at time t-dt ! (equation (3) of Soares et al) ! + THE MEAN FLUX OF THETA_V (buoyancy flux) ! ----------------------------------------------- ! ( Resulting fluxes are in flux level (w-point) as PEMF and PTHL_UP ) ! PFLXZTHMF(:,:,:) = PEMF(:,:,:)*(PTHL_UP(:,:,:)-MZM(PTHLM(:,:,:))) PFLXZRMF(:,:,:) = PEMF(:,:,:)*(PRT_UP(:,:,:)-MZM(PRTM(:,:,:))) PFLXZTHVMF(:,:,:) = PEMF(:,:,:)*(PTHV_UP(:,:,:)-MZM(PTHVM(:,:,:))) PFLXZTHVMF(:,:,:) = 9.81/PTHVM(:,:,:)* PEMF(:,:,:)*(PTHV_UP(:,:,:)-MZM(PTHVM(:,:,:))) !JP IF (OMIXUV) THEN PFLXZUMF(:,:,:) = PEMF(:,:,:)*(PU_UP(:,:,:)-MZM(PUM(:,:,:))) PFLXZVMF(:,:,:) = PEMF(:,:,:)*(PV_UP(:,:,:)-MZM(PVM(:,:,:))) ENDIF ! ! !---------------------------------------------------------------------------- ! !* 3. COMPUTE TENDENCIES OF CONSERVATIVE VARIABLES (or treated as such...) ! (implicit formulation) ! -------------------------------------------- ! ! ! ! 3.1 Compute the tendency for the conservative potential temperature ! (PDZZ and flux in w-point and PRHODJ is mass point, result in mass point) ! CALL TRIDIAG_MASSFLUX(PTHLM,PFLXZTHMF,-PEMF,PTSTEP_MET,PIMPL, & PDZZ,PRHODJ,ZVARS ) ! compute new flux PFLXZTHMF(:,:,:) = PEMF(:,:,:)*(PTHL_UP(:,:,:)-MZM(ZVARS(:,:,:))) !!! compute THL tendency ! PTHLDT(:,:,:)= (ZVARS(:,:,:)-PTHLM(:,:,:))/PTSTEP_MET ! ! 3.2 Compute the tendency for the conservative mixing ratio ! CALL TRIDIAG_MASSFLUX(PRTM(:,:,:),PFLXZRMF,-PEMF,PTSTEP_MET,PIMPL, & PDZZ,PRHODJ,ZVARS ) ! compute new flux PFLXZRMF(:,:,:) = PEMF(:,:,:)*(PRT_UP(:,:,:)-MZM(ZVARS(:,:,:))) !!! compute RT tendency PRTDT(:,:,:) = (ZVARS(:,:,:)-PRTM(:,:,:))/PTSTEP_MET ! ! 3.3 Compute the tendency for the (non conservative but treated as it) mixing ratio ! !CALL TRIDIAG_MASSFLUX(PTHVM(:,:,:),PFLXZTHVMF,-PEMF,PTSTEP,PIMPL, & ! PDZZ,PRHODJ,ZVARS ) ! compute new flux !PFLXZTHVMF(:,:,:) = PEMF(:,:,:)*(PTHV_UP(:,:,:)-MZM(ZVARS(:,:,:))) IF (OMIXUV) THEN ! ! 3.3 Compute the tendency for the (non conservative but treated as it) zonal momentum ! (PDZZ and flux in w-point and PRHODJ is mass point, result in mass point) ! CALL TRIDIAG_MASSFLUX(PUM,PFLXZUMF,-PEMF,PTSTEP,PIMPL, & PDZZ,PRHODJ,ZVARS ) ! compute new flux PFLXZUMF(:,:,:) = PEMF(:,:,:)*(PU_UP(:,:,:)-MZM(ZVARS(:,:,:))) ! compute U tendency PUDT(:,:,:)= (ZVARS(:,:,:)-PUM(:,:,:))/PTSTEP_MET ! ! ! 3.4 Compute the tendency for the (non conservative but treated as it for the time beiing) ! meridian momentum ! (PDZZ and flux in w-point and PRHODJ is mass point, result in mass point) ! CALL TRIDIAG_MASSFLUX(PVM,PFLXZVMF,-PEMF,PTSTEP,PIMPL, & PDZZ,PRHODJ,ZVARS ) ! compute new flux PFLXZVMF(:,:,:) = PEMF(:,:,:)*(PV_UP(:,:,:)-MZM(ZVARS(:,:,:))) ! compute V tendency PVDT(:,:,:)= (ZVARS(:,:,:)-PVM(:,:,:))/PTSTEP_MET ENDIF ! END SUBROUTINE MF_TURB FUNCTION MZM(PA) RESULT(PMZM) 1 ! IMPLICIT NONE ! !* 0.1 Declarations of argument and result ! ------------------------------------ ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass localization REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZM ! result at flux localization ! 0.2 Declarations of local variables ! ------------------------------- ! INTEGER :: JK ! Loop index in z direction INTEGER :: IKU ! upper bound in z direction of PA ! IKU = SIZE(PA,3) !DO JK=2,IKU MODIF WRF JP DO JK=2,IKU PMZM(:,:,JK)=0.5*(PA(:,:,JK)+PA(:,:,JK-1)) ENDDO PMZM(:,:,1)=PA(:,:,2) END FUNCTION MZM ! ! ! ################################################################# SUBROUTINE TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE,PP, & 5 PTHL, PRT, PTH, PRV, PRL, PRI ) ! ################################################################# ! ! !!**** *TH_R_FROM_THL_RT_1D* - computes the non-conservative variables !! from conservative variables !! !! !! -------------------------------------------------------------------------- ! ! IMPLICIT NONE ! ! !* 0.1 declarations of arguments ! CHARACTER*1 , INTENT(IN) :: HFRAC_ICE REAL, DIMENSION(:), INTENT(INOUT) :: PFRAC_ICE REAL, DIMENSION(:), INTENT(IN) :: PP ! Pressure REAL, DIMENSION(:), INTENT(IN) :: PTHL ! thetal (or thetal tendency) to ! transform into th (or tendency) REAL, DIMENSION(:),INTENT(IN) :: PRT ! Total mixing ratios (or tendency) to ! transform into rv,rc and ri ! (or its tendency) REAL, DIMENSION(:), INTENT(OUT):: PTH ! th (or th_l tendency) REAL, DIMENSION(:), INTENT(OUT):: PRV ! vapor mixing ratio (or its tendency) REAL, DIMENSION(:), INTENT(OUT):: PRL ! vapor mixing ratio (or its tendency) REAL, DIMENSION(:), INTENT(OUT):: PRI ! vapor mixing ratio (or its tendency) ! !------------------------------------------------------------------------------- ! ! 0.2 declaration of local variables ! INTEGER :: II ! Loop control REAL :: ZCOEF REAL, DIMENSION(SIZE(PP,1)) :: ZEXN,ZFOES,ZQVSAT REAL, DIMENSION(SIZE(PTHL,1)) :: ZRVSAT,ZCPH,ZRLTEMP REAL, DIMENSION(SIZE(PTHL,1)) :: ZT,ZLOVCPEXN,ZLOSCPEXN !---------------------------------------------------------------------------- ! !* 1 Initialisation ! -------------- ! ! ZCOEF = 0.8 PRL(:)=0. PRI(:)=0. ZRLTEMP(:)=0. PRV(:)=PRT(:) PTH(:)=PTHL(:) ZEXN(:)=(PP(:)/XP00) ** (XRD/XCPD) ! ! 2 Iteration ! --------- DO II=1,20 ZT(:)=PTH(:)*ZEXN(:) WHERE (ZT(:) > 273.15) ! warm cloud ZFOES(:) = EXP( XALPW - XBETAW/ZT(:) - XGAMW*LOG(ZT(:)) ) ZQVSAT(:) = XRD/XRV*ZFOES(:)/PP(:) & / (1.+(XRD/XRV-1.)*ZFOES(:)/PP(:)) ZRVSAT(:) = (1-ZCOEF)*ZQVSAT(:)*(1+PRT(:))+(ZCOEF)*PRV(:) ! CALL COMPUTE_FRAC_ICE_1D(HFRAC_ICE,PFRAC_ICE,PP,ZT) PFRAC_ICE(:)=0. ZRLTEMP(:)=MAX(0.,PRV(:)-ZRVSAT(:)) PRV(:)=PRV(:)-ZRLTEMP(:) PRL(:)=PRL(:)+PRI(:)+ZRLTEMP(:) PRI(:) = PFRAC_ICE(:) * (PRL(:)) PRL(:) = (1-PFRAC_ICE(:))* (PRT(:) - PRV(:)) ! 2.1 Cph ZCPH(:)=XCPD+ XCPV * PRV(:)+ XCL * PRL(:) + XCI * PRI(:) ! 2.2 L/Cp/EXN ZLOVCPEXN(:) = (XLVTT + (XCPV-XCL) * (ZT(:)-XTT)) & /(ZCPH*ZEXN(:)) ZLOSCPEXN(:) = (XLSTT + (XCPV-XCI) * (ZT(:)-XTT)) & /(ZCPH*ZEXN(:)) PTH(:)=PTHL(:)+ZLOVCPEXN*PRL(:)+ZLOSCPEXN(:)*PRI(:) ELSEWHERE ! cold shallow cloud not yet coded ! probleme also for the highest level of fire case PRL(:)=0. PRI(:)=0. PRV(:)=PRT(:) PTH(:)=PTHL(:) ENDWHERE ENDDO END SUBROUTINE TH_R_FROM_THL_RT_1D ! ################################################################# SUBROUTINE TH_R_FROM_THL_RT_2D(HFRAC_ICE,PFRAC_ICE,PP, & 2 PTHL, PRT, PTH, PRV, PRL, PRI ) ! ################################################################# ! ! !!**** *TH_R_FROM_THL_RT_2D* - computes the non-conservative variables !! from conservative variables !! !! !! !! -------------------------------------------------------------------------- ! IMPLICIT NONE ! ! !* 0.1 declarations of arguments ! CHARACTER*1 , INTENT(IN) :: HFRAC_ICE REAL, DIMENSION(:,:), INTENT(INOUT) :: PFRAC_ICE REAL, DIMENSION(:,:), INTENT(IN) :: PP ! Pressure REAL, DIMENSION(:,:), INTENT(IN) :: PTHL ! thetal (or thetal tendency) to ! transform into th (or tendency) REAL, DIMENSION(:,:),INTENT(IN) :: PRT ! Total mixing ratios (or tendency) to ! transform into rv,rc and ri ! (or its tendency) REAL, DIMENSION(:,:), INTENT(OUT):: PTH ! th (or th_l tendency) REAL, DIMENSION(:,:), INTENT(OUT):: PRV ! vapor mixing ratio (or its tendency) REAL, DIMENSION(:,:), INTENT(OUT):: PRL ! vapor mixing ratio (or its tendency) REAL, DIMENSION(:,:), INTENT(OUT):: PRI ! vapor mixing ratio (or its tendency) ! !------------------------------------------------------------------------------- ! ! 0.2 declaration of local variables ! INTEGER :: II ! Loop control REAL :: ZCOEF REAL, DIMENSION(SIZE(PP,1),SIZE(PP,2)) :: ZEXN,ZFOES,ZQVSAT REAL, DIMENSION(SIZE(PTHL,1),SIZE(PTHL,2)) :: ZRVSAT,ZCPH,ZRLTEMP REAL, DIMENSION(SIZE(PTHL,1),SIZE(PTHL,2)) :: ZT,ZLOVCPEXN,ZLOSCPEXN !---------------------------------------------------------------------------- ! !* 1 Initialisation ! -------------- ! ! ZCOEF = 0.8 PRL(:,:)=0. PRI(:,:)=0. ZRLTEMP(:,:)=0. PRV(:,:)=PRT(:,:) PTH(:,:)=PTHL(:,:) ZEXN(:,:)=(PP(:,:)/XP00) ** (XRD/XCPD) ! ! 2 Iteration ! --------- DO II=1,20 ZT(:,:)=PTH(:,:)*ZEXN(:,:) WHERE (ZT(:,:) > 273.15) ! warm cloud ZFOES(:,:) = EXP( XALPW - XBETAW/ZT(:,:) - XGAMW*LOG(ZT(:,:)) ) ZQVSAT(:,:) = XRD/XRV*ZFOES(:,:)/PP(:,:) & / (1.+(XRD/XRV-1.)*ZFOES(:,:)/PP(:,:)) ZRVSAT(:,:) = (1-ZCOEF)*ZQVSAT(:,:)*(1+PRT(:,:))+(ZCOEF)*PRV(:,:) ! CALL COMPUTE_FRAC_ICE_2D(HFRAC_ICE,PFRAC_ICE,PP,ZT) PFRAC_ICE(:,:) = 0. ZRLTEMP(:,:)=MAX(0.,PRV(:,:)-ZRVSAT(:,:)) PRV(:,:)=PRV(:,:)-ZRLTEMP(:,:) PRL(:,:)=PRL(:,:)+PRI(:,:)+ZRLTEMP(:,:) PRI(:,:) = PFRAC_ICE(:,:) * (PRL(:,:)) PRL(:,:) = (1-PFRAC_ICE(:,:))* (PRT(:,:) - PRV(:,:)) ! 2.1 Cph ZCPH(:,:)=XCPD+ XCPV * PRV(:,:)+ XCL * PRL(:,:) + XCI * PRI(:,:) ! 2.2 L/Cp/EXN ZLOVCPEXN(:,:) = (XLVTT + (XCPV-XCL) * (ZT(:,:)-XTT)) & /(ZCPH*ZEXN(:,:)) ZLOSCPEXN(:,:) = (XLSTT + (XCPV-XCI) * (ZT(:,:)-XTT)) & /(ZCPH*ZEXN(:,:)) PTH(:,:)=PTHL(:,:)+ZLOVCPEXN*PRL(:,:)+ZLOSCPEXN(:,:)*PRI(:,:) ELSEWHERE ! cold shallow cloud not yet coded ! probleme also for the highest level of fire case PRL(:,:)=0. PRI(:,:)=0. PRV(:,:)=PRT(:,:) PTH(:,:)=PTHL(:,:) ENDWHERE ENDDO END SUBROUTINE TH_R_FROM_THL_RT_2D ! ################################################################# SUBROUTINE THL_RT_FROM_TH_R_MF( KRR,KRRL,KRRI, & 1 PTH, PR, PLVOCPEXN, PLSOCPEXN, & PTHL, PRT ) ! ################################################################# ! !! !!**** *THL_RT_FROM_TH_R* - computes the conservative variables THL and RT !! from TH and the non precipitating water species !! !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! !USE MODD_CST ! IMPLICIT NONE ! ! !* 0.1 declarations of arguments ! INTEGER, INTENT(IN) :: KRR ! number of moist var. INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. INTEGER, INTENT(IN) :: KRRI ! number of ice water var. REAL, DIMENSION(:,:,:), INTENT(IN) :: PTH ! theta REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PR ! water species REAL, DIMENSION(:,:,:), INTENT(IN) :: PLVOCPEXN, PLSOCPEXN ! L/(cp*Pi) REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHL ! th_l REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRT ! total non precip. water ! !------------------------------------------------------------------------------- ! ! 0.2 declaration of local variables ! !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- ! ! IF ( KRRL >= 1 ) THEN IF ( KRRI >= 1 ) THEN ! Rnp PRT(:,:,:) = PR(:,:,:,1) + PR(:,:,:,2) + PR(:,:,:,4) ! Theta_l PTHL(:,:,:) = PTH(:,:,:) - PLVOCPEXN(:,:,:) * PR(:,:,:,2) & - PLSOCPEXN(:,:,:) * PR(:,:,:,4) ELSE ! Rnp PRT(:,:,:) = PR(:,:,:,1) + PR(:,:,:,2) ! Theta_l PTHL(:,:,:) = PTH(:,:,:) - PLVOCPEXN(:,:,:) * PR(:,:,:,2) END IF ELSE ! Rnp = rv PRT(:,:,:) = PR(:,:,:,1) ! Theta_l = Theta PTHL(:,:,:) = PTH(:,:,:) END IF END SUBROUTINE THL_RT_FROM_TH_R_MF ! ################################################# SUBROUTINE TRIDIAG_MASSFLUX(PVARM,PF,PDFDT,PTSTEP,PIMPL, & 4,1 PDZZ,PRHODJ,PVARP ) ! ################################################# ! ! !!**** *TRIDIAG_MASSFLUX* - routine to solve a time implicit scheme !! !! !! --------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ! ! IMPLICIT NONE ! ! !* 0.1 declarations of arguments ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PVARM ! variable at t-1 at mass point REAL, DIMENSION(:,:,:), INTENT(IN) :: PF ! flux in dT/dt=-dF/dz at flux point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDFDT ! dF/dT at flux point REAL, INTENT(IN) :: PTSTEP ! Double time step REAL, INTENT(IN) :: PIMPL ! implicit weight REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Dz at flux point REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! (dry rho)*J at mass point ! REAL, DIMENSION(:,:,:), INTENT(OUT):: PVARP ! variable at t+1 at mass point ! ! !* 0.2 declarations of local variables ! REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZRHODJ_DFDT_O_DZ REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZMZM_RHODJ REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZA, ZB, ZC REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZY ,ZGAM ! RHS of the equation, 3D work array REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2)) :: ZBET ! 2D work array INTEGER :: JK ! loop counter INTEGER :: IKB,IKE ! inner vertical limits ! ! --------------------------------------------------------------------------- ! !* 1. Preliminaries ! ------------- ! IKB=1 IKE=SIZE(PVARM,3)-1 ! ZMZM_RHODJ = MZM(PRHODJ) ZRHODJ_DFDT_O_DZ = ZMZM_RHODJ*PDFDT/PDZZ ! ZA=0. ZB=0. ZC=0. ZY=0. ! ! !* 2. COMPUTE THE RIGHT HAND SIDE ! --------------------------- ! ZY(:,:,IKB) = PRHODJ(:,:,IKB)*PVARM(:,:,IKB)/PTSTEP & - ZMZM_RHODJ(:,:,IKB+1) * PF(:,:,IKB+1)/PDZZ(:,:,IKB+1) & + ZMZM_RHODJ(:,:,IKB ) * PF(:,:,IKB )/PDZZ(:,:,IKB ) & + ZRHODJ_DFDT_O_DZ(:,:,IKB+1) * 0.5*PIMPL * PVARM(:,:,IKB+1) & + ZRHODJ_DFDT_O_DZ(:,:,IKB+1) * 0.5*PIMPL * PVARM(:,:,IKB ) ! DO JK=IKB+1,IKE-1 ZY(:,:,JK) = PRHODJ(:,:,JK)*PVARM(:,:,JK)/PTSTEP & - ZMZM_RHODJ(:,:,JK+1) * PF(:,:,JK+1)/PDZZ(:,:,JK+1) & + ZMZM_RHODJ(:,:,JK ) * PF(:,:,JK )/PDZZ(:,:,JK ) & + ZRHODJ_DFDT_O_DZ(:,:,JK+1) * 0.5*PIMPL * PVARM(:,:,JK+1) & + ZRHODJ_DFDT_O_DZ(:,:,JK+1) * 0.5*PIMPL * PVARM(:,:,JK ) & - ZRHODJ_DFDT_O_DZ(:,:,JK ) * 0.5*PIMPL * PVARM(:,:,JK ) & - ZRHODJ_DFDT_O_DZ(:,:,JK ) * 0.5*PIMPL * PVARM(:,:,JK-1) END DO ! ZY(:,:,IKE) = PRHODJ(:,:,IKE)*PVARM(:,:,IKE)/PTSTEP & - ZMZM_RHODJ(:,:,IKE+1) * PF(:,:,IKE+1)/PDZZ(:,:,IKE+1) & + ZMZM_RHODJ(:,:,IKE ) * PF(:,:,IKE )/PDZZ(:,:,IKE ) & - ZRHODJ_DFDT_O_DZ(:,:,IKE ) * 0.5*PIMPL * PVARM(:,:,IKE ) & - ZRHODJ_DFDT_O_DZ(:,:,IKE ) * 0.5*PIMPL * PVARM(:,:,IKE-1) ! ! !* 3. INVERSION OF THE TRIDIAGONAL SYSTEM ! ----------------------------------- ! IF ( PIMPL > 1.E-10 ) THEN ! !* 3.1 arrays A, B, C ! -------------- ! ZB(:,:,IKB) = PRHODJ(:,:,IKB)/PTSTEP & + ZRHODJ_DFDT_O_DZ(:,:,IKB+1) * 0.5*PIMPL ZC(:,:,IKB) = ZRHODJ_DFDT_O_DZ(:,:,IKB+1) * 0.5*PIMPL DO JK=IKB+1,IKE-1 ZA(:,:,JK) = - ZRHODJ_DFDT_O_DZ(:,:,JK ) * 0.5*PIMPL ZB(:,:,JK) = PRHODJ(:,:,JK)/PTSTEP & + ZRHODJ_DFDT_O_DZ(:,:,JK+1) * 0.5*PIMPL & - ZRHODJ_DFDT_O_DZ(:,:,JK ) * 0.5*PIMPL ZC(:,:,JK) = ZRHODJ_DFDT_O_DZ(:,:,JK+1) * 0.5*PIMPL END DO ZA(:,:,IKE) = - ZRHODJ_DFDT_O_DZ(:,:,IKE ) * 0.5*PIMPL ZB(:,:,IKE) = PRHODJ(:,:,IKE)/PTSTEP & - ZRHODJ_DFDT_O_DZ(:,:,IKE ) * 0.5*PIMPL ! !* 3.2 going up ! -------- ! ZBET(:,:) = ZB(:,:,IKB) ! bet = b(ikb) PVARP(:,:,IKB) = ZY(:,:,IKB) / ZBET(:,:) ! DO JK = IKB+1,IKE-1 ZGAM(:,:,JK) = ZC(:,:,JK-1) / ZBET(:,:) ! gam(k) = c(k-1) / bet ZBET(:,:) = ZB(:,:,JK) - ZA(:,:,JK) * ZGAM(:,:,JK) ! bet = b(k) - a(k)* gam(k) PVARP(:,:,JK)= ( ZY(:,:,JK) - ZA(:,:,JK) * PVARP(:,:,JK-1) ) / ZBET(:,:) ! res(k) = (y(k) -a(k)*res(k-1))/ bet END DO ! special treatment for the last level ZGAM(:,:,IKE) = ZC(:,:,IKE-1) / ZBET(:,:) ! gam(k) = c(k-1) / bet ZBET(:,:) = ZB(:,:,IKE) - ZA(:,:,IKE) * ZGAM(:,:,IKE) ! bet = b(k) - a(k)* gam(k) PVARP(:,:,IKE)= ( ZY(:,:,IKE) - ZA(:,:,IKE) * PVARP(:,:,IKE-1) ) / ZBET(:,:) ! res(k) = (y(k) -a(k)*res(k-1))/ bet ! !* 3.3 going down ! ---------- ! DO JK = IKE-1,IKB,-1 PVARP(:,:,JK) = PVARP(:,:,JK) - ZGAM(:,:,JK+1) * PVARP(:,:,JK+1) END DO ! ! ELSE !!! EXPLICIT FORMULATION ! PVARP(:,:,IKB:IKE) = ZY(:,:,IKB:IKE) * PTSTEP / PRHODJ(:,:,IKB:IKE) ! END IF ! ! !* 4. FILL THE UPPER AND LOWER EXTERNAL VALUES ! ---------------------------------------- ! !PVARP(:,:,IKB-1)=PVARP(:,:,IKB) MODIF WRF JP PVARP(:,:,IKE+1)=PVARP(:,:,IKE) ! !------------------------------------------------------------------------------- ! END SUBROUTINE TRIDIAG_MASSFLUX ! ! ################################################################# SUBROUTINE UPDRAFT_SOPE(KRR,KRRL,KRRI,OMIXUV, & 1,1 PZZ,PDZZ,PSFTH,PSFRV,PPABSM,PRHODREF, & PTKEM,PTHM,PRM,PTHLM,PRTM,PUM,PVM, & PTHL_UP,PRT_UP,PRV_UP,PU_UP,PV_UP, & PRC_UP,PRI_UP,PTHV_UP,PW_UP,PFRAC_UP,PEMF, & PDETR,PENTR,KKLCL,KKETL,KKCTL ) ! ################################################################# !! !!**** *UPDRAFT_SOPE* - Interfacing routine !! !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! IMPLICIT NONE !* 1.1 Declaration of Arguments ! ! INTEGER, INTENT(IN) :: KRR ! number of moist var. INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. INTEGER, INTENT(IN) :: KRRI ! number of ice water var. LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height at the flux point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! depth between mass levels REAL, DIMENSION(:,:), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta,rv ! ! prognostic variables at t- deltat REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Pressure at time t-1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! dry density of the ! reference state REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM ! momentum ! ! thermodynamical variables which are transformed in conservative var. REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! pot. temp. = PTHLM in turb.f90 REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! water species REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM,PRTM !cons. var. REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHL_UP,PRT_UP ! updraft properties REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRV_UP,PRC_UP,PRI_UP,&!Thl,Rt,Rv,Rc,Ri PW_UP,PFRAC_UP,PEMF, &!w,Updraft Fraction, Mass Flux PDETR,PENTR,PTHV_UP, &!entrainment, detrainment, ThV PU_UP, PV_UP !updraft wind component INTEGER, DIMENSION(:,:), INTENT(OUT) :: KKLCL,KKETL,KKCTL !index for LCL,ETL,CTL ! ! ! ! 1.2 Declaration of local variables INTEGER :: IKB ! ! Variables to transform 3D fields in 2D fields REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZPABSM,ZRHODREF REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZZZ,ZDZZ REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZTHLM,ZRTM,& ZTHM,ZTKEM,& ZUM,ZVM REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZRVM,ZRCM,ZRIM REAL, DIMENSION(SIZE(PSFTH,1)*SIZE(PSFTH,2)) :: ZSFTH,ZSFRV REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZTHL_UP,ZRT_UP,& ZRV_UP,ZRC_UP, ZRI_UP, & ZW_UP,ZU_UP,ZV_UP,ZTHV_UP, & ZFRAC_UP,ZEMF_UP,ZENTR_UP,ZDETR_UP REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2)) :: ZFRAC_GRID INTEGER, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2)) :: JKETL,JKCTL,JKLCL INTEGER :: IIU,IJU,IKU! Limit of the grid INTEGER :: J1D ! horizontal loop counter INTEGER :: JK,JKK,JSV ! loop counters INTEGER :: JRR ! moist loop counter REAL :: ZRVORD ! Rv/Rd (=1/0.622 cf glossaire) !------------------------------------------------------------------------ ! 2. INITIALISATION ! 2.1 Local variables, internal domain IIU=SIZE(PTKEM,1) IJU=SIZE(PTKEM,2) ! IKB = 1 ! Modif WRF JP IKU = SIZE(PTKEM,3) ZRVORD = XRV / XRD DO JK=IKB,IKU ZZZ (:,JK) = RESHAPE(PZZ (:,:,JK),(/ IIU*IJU /) ) ZDZZ (:,JK) = RESHAPE(PDZZ (:,:,JK),(/ IIU*IJU /) ) ZTHM (:,JK) = RESHAPE(PTHM (:,:,JK),(/ IIU*IJU /) ) ZTKEM (:,JK) = RESHAPE(PTKEM (:,:,JK),(/ IIU*IJU /) ) ZPABSM (:,JK) = RESHAPE(PPABSM (:,:,JK),(/ IIU*IJU /) ) ZRHODREF(:,JK) = RESHAPE(PRHODREF(:,:,JK),(/ IIU*IJU /) ) ZRVM (:,JK) = RESHAPE(PRM (:,:,JK,1),(/ IIU*IJU /) ) ZTHLM (:,JK) = RESHAPE(PTHLM (:,:,JK),(/ IIU*IJU /) ) ZRTM (:,JK) = RESHAPE(PRTM (:,:,JK),(/ IIU*IJU /) ) ZUM (:,JK) = RESHAPE(PUM (:,:,JK),(/ IIU*IJU /) ) ZVM (:,JK) = RESHAPE(PVM (:,:,JK),(/ IIU*IJU /) ) END DO IF (KRRL>1) THEN DO JK=1,IKU ZRCM (:,JK) = RESHAPE(PRM (:,:,JK,2),(/ IIU*IJU /) ) END DO ELSE ZRCM (:,:) =0. ENDIF IF (KRRI>1) THEN DO JK=1,IKU ZRIM (:,JK) = RESHAPE(PRM (:,:,JK,4),(/ IIU*IJU /) ) END DO ELSE ZRIM (:,:) =0. ENDIF ZSFTH(:)=RESHAPE(PSFTH(:,:),(/ IIU*IJU /) ) ZSFRV(:)=RESHAPE(PSFRV(:,:),(/ IIU*IJU /) ) !Updraft begins at level 1 (Modif WRF) JK=IKB ! 6.2 compute properties of the updraft CALL COMPUTE_UPDRAFT(OMIXUV,ZZZ,ZDZZ,JK, & ZSFTH,ZSFRV,ZPABSM,ZRHODREF,ZUM,ZVM,ZTKEM, & ZTHM,ZRVM,ZRCM,ZRIM,ZTHLM,ZRTM, & ZTHL_UP,ZRT_UP,ZRV_UP,ZRC_UP,ZRI_UP,& ZTHV_UP,ZW_UP,ZU_UP,ZV_UP, & ZFRAC_UP,ZEMF_UP,& ZDETR_UP,ZENTR_UP,& JKLCL,JKETL,JKCTL) PTHL_UP(:,:,:)= RESHAPE(ZTHL_UP(:,:), (/ IIU,IJU,IKU /)) PRT_UP(:,:,:)=RESHAPE(ZRT_UP(:,:), (/ IIU,IJU,IKU /) ) PRV_UP(:,:,:)=RESHAPE(ZRV_UP(:,:), (/ IIU,IJU,IKU /) ) PRC_UP(:,:,:)=RESHAPE(ZRC_UP(:,:), (/ IIU,IJU,IKU /) ) PRI_UP(:,:,:)=RESHAPE(ZRI_UP(:,:), (/ IIU,IJU,IKU /) ) PW_UP(:,:,:)=RESHAPE(ZW_UP(:,:), (/ IIU,IJU,IKU /) ) PU_UP(:,:,:)=RESHAPE(ZU_UP(:,:), (/ IIU,IJU,IKU /) ) PV_UP(:,:,:)=RESHAPE(ZV_UP(:,:), (/ IIU,IJU,IKU /) ) PEMF(:,:,:)=RESHAPE(ZEMF_UP(:,:), (/ IIU,IJU,IKU /) ) PDETR(:,:,:)=RESHAPE(ZDETR_UP(:,:), (/ IIU,IJU,IKU /) ) PENTR(:,:,:)=RESHAPE(ZENTR_UP(:,:), (/ IIU,IJU,IKU /) ) PTHV_UP(:,:,:)=RESHAPE(ZTHV_UP(:,:), (/ IIU,IJU,IKU /) ) KKETL(:,:)=RESHAPE(JKETL(:),(/ IIU,IJU/) ) KKCTL(:,:)=RESHAPE(JKCTL(:),(/ IIU,IJU/) ) KKLCL(:,:)=RESHAPE(JKLCL(:),(/ IIU,IJU/) ) PFRAC_UP(:,:,:)=RESHAPE(ZFRAC_UP(:,:),(/ IIU,IJU,IKU /) ) END SUBROUTINE UPDRAFT_SOPE ! ################################################################# SUBROUTINE COMPUTE_MF_CLOUD(KRRL, PTHLM,PRC_UP, PFRAC_UP, PDZZ, KKLCL,& 1 PRC_MF,PCF_MF ) ! ################################################################# !! !!**** *COMPUTE_MF_CLOUD* - !! compute diagnostic subgrid cumulus cloud caracteristics !! !! PURPOSE !! ------- !!**** The purpose of this routine is to compute the cloud fraction and !! the mean cloud content associated with clouds described by the !! mass flux scheme !! ! !!** METHOD !! ------ !! !! EXTERNAL !! -------- !! !! IMPLICIT ARGUMENTS !! ------------------ !! !! REFERENCE !! --------- !! !! !! AUTHOR !! ------ !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! IMPLICIT NONE !* 1.1 Declaration of Arguments ! ! ! INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. ! scheme REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! updraft characteritics REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC_UP ! updraft characteritics REAL, DIMENSION(:,:,:), INTENT(IN) :: PFRAC_UP ! Updraft Fraction REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ INTEGER, DIMENSION(:,:), INTENT(IN) :: KKLCL ! index of updraft condensation level REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRC_MF, PCF_MF ! cloud content and ! cloud fraction for MF scheme ! ! 1.2 Declaration of local variables ! REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZFLXZ INTEGER :: IKU, IKB, IKE, JI,JJ,JK !------------------------------------------------------------------------ ! 1. INITIALISATION ! 2.1 Internal domain ! Internal Domain IKU=SIZE(PTHLM,3) IKB=1 IKE=IKU-1 PCF_MF = 0. PRC_MF = 0. ! ! Direct cloud scheme ! This scheme may be activated only if the selected updraft model ! gives the updraft fraction as an output ! ! attention, les variables de l'updraft sont en niveaux flux ! ils faut les passer aux niveaux masse pour calculer PRC_MF et PCF_MF DO JI=1,SIZE(PCF_MF,1) DO JJ=1,SIZE(PCF_MF,2) DO JK=KKLCL(JI,JJ),IKE PCF_MF(JI,JJ,JK ) = XKCF_MF *0.5* ( & & PFRAC_UP(JI,JJ,JK) + PFRAC_UP(JI,JJ,JK+1) ) PRC_MF(JI,JJ,JK) = 0.5* XKCF_MF * ( PFRAC_UP(JI,JJ,JK)*PRC_UP(JI,JJ,JK) & + PFRAC_UP(JI,JJ,JK+1)*PRC_UP(JI,JJ,JK+1) ) END DO END DO END DO END SUBROUTINE COMPUTE_MF_CLOUD ! ################################################################# SUBROUTINE mfshconvpblinit(massflux_EDKF, entr_EDKF, detr_EDKF & 1 ,thl_up, thv_up, rt_up & ,rv_up, rc_up, u_up, v_up & ,frac_up,RESTART,ALLOWED_TO_READ, & & IDS,IDE,JDS,JDE,KDS,KDE, & & IMS,IME,JMS,JME,KMS,KME, & & ITS,ITE,JTS,JTE,KTS,KTE ) ! ################################################################# IMPLICIT NONE LOGICAL,INTENT(IN) :: ALLOWED_TO_READ,RESTART INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE, & & IMS,IME,JMS,JME,KMS,KME, & & ITS,ITE,JTS,JTE,KTS,KTE REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(OUT),OPTIONAL :: & & MASSFLUX_EDKF, ENTR_EDKF, DETR_EDKF & & ,THL_UP, THV_UP, RT_UP, RV_UP & & ,RC_UP, U_UP, V_UP, FRAC_UP INTEGER :: I,J,K,ITF,JTF,KTF !--------------------------------------------- JTF=MIN0(JTE,JDE-1) KTF=MIN0(KTE,KDE-1) ITF=MIN0(ITE,IDE-1) ! IF(.NOT.RESTART)THEN IF( PRESENT (MASSFLUX_EDKF) ) THEN DO J=JTS,JTF DO K=KTS,KTF DO I=ITS,ITF MASSFLUX_EDKF(I,K,J)=0. ENTR_EDKF(I,K,J)=0. DETR_EDKF(I,K,J)=0. THL_UP(I,K,J)=0. THV_UP(I,K,J)=0. RT_UP(I,K,J)=0. RV_UP(I,K,J)=0. RC_UP(I,K,J)=0. U_UP(I,K,J)=0. V_UP(I,K,J)=0. FRAC_UP(I,K,J)=0. ENDDO ENDDO ENDDO ENDIF END SUBROUTINE mfshconvpblinit ! ######################################################### SUBROUTINE BL89(PZZ,PDZZ,PTHVREF,PTHLM,KRR, & 1,2 PRM,PTKEM,PLM) ! ######################################################### ! !!**** *BL89* - !! !! PURPOSE !! ------- !! This routine computes the mixing length from Bougeault-Lacarrere 89 !! formula. !! !!** METHOD !! ------ !! !* 0.1 Declaration of arguments ! ------------------------ ! INTEGER, INTENT(IN) :: KRR REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE ! thermodynamical variables PTHLM=Theta at the begining REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! conservative pot. temp. REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! water var. REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLM ! Mixing length !* 0.2 Declaration of local variables ! ------------------------------ ! INTEGER :: IKB,IKE REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZRTM REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) ::ZVPT ! Virtual Potential Temp at half levels REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2)) :: ZLWORK ! ! downwards then upwards vertical displacement, REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZZZ,ZDZZ,& ZG_O_THVREF, & ZTHM,ZTKEM,ZLM,& ZLMUP,ZLMDN,& ZLMTEST ! ! input and output arrays packed according one horizontal coord. REAL, DIMENSION(SIZE(PRM,1)*SIZE(PRM,2),SIZE(PRM,3),SIZE(PRM,4)) :: ZRM ! ! input array packed according one horizontal coord. REAL, DIMENSION(SIZE(PRM,1)*SIZE(PRM,2),SIZE(PRM,3)) :: ZSUM ! to replace SUM function REAL :: ZPOTE,ZLWORK1,ZLWORK2 INTEGER :: IIU,IJU,IKU,IICE INTEGER :: J1D ! horizontal loop counter INTEGER :: JK,JKK ! loop counters INTEGER :: JRR ! moist loop counter REAL :: ZRVORD ! Rv/Rd (=1/0.622 cf glossaire) LOGICAL :: GUPORDN !Test for computation of upward or downward mixing length REAL :: Z2SQRT2 !------------------------------------------------------------------------------- ! Z2SQRT2=2.*SQRT(2.) IIU=SIZE(PTKEM,1) IJU=SIZE(PTKEM,2) ! IKB = 1 IKE = SIZE(PTKEM,3)-1 IKU = SIZE(PTKEM,3) ZRVORD = XRV / XRD !------------------------------------------------------------------------------- ! !* 1. pack the horizontal dimensions into one ! --------------------------------------- ! DO JK=1,IKU ZZZ (:,JK) = RESHAPE(PZZ (:,:,JK),(/ IIU*IJU /) ) ZDZZ (:,JK) = RESHAPE(PDZZ (:,:,JK),(/ IIU*IJU /) ) ZTHM (:,JK) = RESHAPE(PTHLM (:,:,JK),(/ IIU*IJU /) ) ZTKEM (:,JK) = RESHAPE(PTKEM (:,:,JK),(/ IIU*IJU /) ) ZG_O_THVREF(:,JK) = RESHAPE(XG/PTHVREF(:,:,JK),(/ IIU*IJU /) ) DO JRR=1,KRR ZRM (:,JK,JRR) = RESHAPE(PRM (:,:,JK,JRR),(/ IIU*IJU /) ) END DO END DO !------------------------------------------------------------------------------- ! !* 2. Virtual potential temperature on the model grid ! ----------------------------------------------- ! IF(KRR /= 0) THEN ZSUM(:,:) = 0. DO JRR=1,KRR ZSUM(:,:) = ZSUM(:,:)+ZRM(:,:,JRR) ENDDO ZVPT(:,1:)=ZTHM(:,:) * ( 1. + ZRVORD*ZRM(:,:,1) ) & / ( 1. + ZSUM(:,:) ) ELSE ZVPT(:,1:)=ZTHM(:,:) END IF ! !------------------------------------------------------------------------------- ! !* 3. loop on model levels ! -------------------- ! DO JK=IKB,IKE !------------------------------------------------------------------------------- ! !* 4. mixing length for a downwards displacement ! ------------------------------------------ GUPORDN=.FALSE. CALL COMPUTE_BL89_ML(ZDZZ,ZTKEM,ZG_O_THVREF,ZVPT,JK,GUPORDN,ZLWORK) !------------------------------------------------------------------------------- ! !* 5. intermediate storage of the final mixing length ! ----------------------------------------------- ! ZLMDN(:,JK)=MIN(ZLWORK(:),0.5*(ZZZ(:,JK)+ZZZ(:,JK+1))-ZZZ(:,IKB)) ! !------------------------------------------------------------------------------- ! !* 6. mixing length for an upwards displacement ! ----------------------------------------- GUPORDN=.TRUE. CALL COMPUTE_BL89_ML(ZDZZ,ZTKEM,ZG_O_THVREF,ZVPT,JK,GUPORDN,ZLWORK) ZLMUP(:,JK)=ZLWORK(:) !------------------------------------------------------------------------------- ! DO J1D=1,IIU*IJU ZLWORK1=MAX(ZLMDN(J1D,JK),1.E-10) ZLWORK2=MAX(ZLMUP(J1D,JK),1.E-10) ZPOTE = ZLWORK1 / ZLWORK2 ZLWORK2=1.d0 + ZPOTE**(2./3.) ZLM(J1D,JK) = Z2SQRT2*ZLWORK1/(ZLWORK2*SQRT(ZLWORK2)) END DO ZLM(:,JK)=( 0.5* (MAX(ZLMDN(:,JK),1.E-10)**(-2./3.)+MAX(ZLMUP(:,JK),1.E-10)**(-2./3.)) )**(-1.5) ZLM(:,JK)=MAX(ZLM(:,JK),XLINI) !* 8. end of the loop on the vertical levels ! -------------------------------------- ! END DO ! !------------------------------------------------------------------------------- ! !* 9. boundaries ! ---------- ! ZLM(:,IKE) =ZLM(:,IKE-1) ZLM(:,IKE+1)=ZLM(:,IKE-1) ZLMUP(:,IKE) =ZLMUP(:,IKE-1) ZLMUP(:,IKE+1)=ZLMUP(:,IKE-1) ZLMDN(:,IKE) =ZLMDN(:,IKE-1) ZLMDN(:,IKE+1)=ZLMDN(:,IKE-1) ! DO JK=1,IKU PLM (:,:,JK) = RESHAPE(ZLM (:,JK), (/ IIU,IJU /) ) END DO END SUBROUTINE BL89 END MODULE MODULE_BL_MFSHCONVPBL