/wrfv2_fire/phys/module_bl_mfshconvpbl.F
FORTRAN Legacy | 2762 lines | 1452 code | 491 blank | 819 comment | 0 complexity | 73cea942faaa30204009a0d19e3208f1 MD5 | raw file
Possible License(s): AGPL-1.0
Large files files are truncated, but you can click here to view the full file
- MODULE MODULE_BL_MFSHCONVPBL
- 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 &
- ,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,J,K-1) ! 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, &
- 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, &
- 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,&
- 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, &
- 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
- !
- !* 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, &
- 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 …
Large files files are truncated, but you can click here to view the full file