PageRenderTime 52ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/wrfv2_fire/phys/module_bl_mfshconvpbl.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 2762 lines | 1452 code | 491 blank | 819 comment | 0 complexity | 73cea942faaa30204009a0d19e3208f1 MD5 | raw file
Possible License(s): AGPL-1.0
  1. MODULE MODULE_BL_MFSHCONVPBL
  2. USE MODULE_MODEL_CONSTANTS
  3. REAL,PARAMETER :: XG = 9.80665
  4. REAL,PARAMETER :: XP00= 1.E5 ! Reference pressure
  5. !
  6. !
  7. REAL,PARAMETER :: XMD= 28.9644E-3
  8. REAL,PARAMETER :: XMV= 18.0153E-3 ! Molar mass of dry air and molar mass of vapor
  9. REAL,PARAMETER :: XRD=R_D
  10. REAL,PARAMETER :: XRV=R_V ! Gaz constant for dry air, gaz constant for vapor
  11. REAL,PARAMETER :: XCPD=7.* XRD /2.
  12. REAL,PARAMETER :: XCPV=4.* XRV ! Cpd (dry air), Cpv (vapor)
  13. REAL,PARAMETER :: XCL= 4.218E+3
  14. REAL,PARAMETER :: XCI= 2.106E+3 ! Cl (liquid), Ci (ice)
  15. REAL,PARAMETER :: XTT= 273.16 ! Triple point temperature
  16. REAL,PARAMETER :: XLVTT=2.5008E+6 ! Vaporization heat constant
  17. REAL,PARAMETER :: XLSTT=2.8345E+6 ! Sublimation heat constant
  18. ! temperature
  19. REAL,PARAMETER :: XGAMW = (XCL - XCPV) / XRV! Constants for saturation vapor
  20. REAL,PARAMETER :: XBETAW= (XLVTT/XRV) + (XGAMW * XTT)
  21. !The use of intrinsics in an initialization expressions is a F2003 feature.
  22. !For backward compatibility, hard coded Log(644.11) & Log(XTT) here
  23. !REAL,PARAMETER :: XALPW= LOG(611.14) + (XBETAW /XTT) + (XGAMW *LOG(XTT))
  24. REAL,PARAMETER :: LOG_611_14 = 6.415326
  25. REAL,PARAMETER :: LOG_XTT = 5.610058
  26. REAL,PARAMETER :: XALPW= LOG_611_14 + (XBETAW /XTT) + (XGAMW *LOG_XTT)
  27. ! pressure function
  28. REAL,PARAMETER :: XGAMI = (XCI - XCPV) / XRV
  29. REAL,PARAMETER :: XBETAI = (XLSTT/XRV) + (XGAMI * XTT)
  30. !REAL,PARAMETER :: XALPI = LOG(611.14) + (XBETAI /XTT) + (XGAMI *LOG(XTT))
  31. REAL,PARAMETER :: XALPI = LOG_611_14 + (XBETAI /XTT) + (XGAMI *LOG_XTT)
  32. REAL,PARAMETER :: XLINI = 0.32
  33. REAL, PARAMETER :: XALP_PERT = 0.3 ! coefficient for the perturbation of
  34. ! theta_l and r_t at the first level of
  35. ! the updraft
  36. REAL, PARAMETER ::XABUO = 1. ! coefficient of the buoyancy term in the w_up equation
  37. REAL, PARAMETER ::XBENTR = 1. ! coefficient of the entrainment term in thew_up equation
  38. REAL, PARAMETER ::XBDETR = 0. ! coefficient of the detrainment term in thew_up equation
  39. REAL, PARAMETER ::XCMF = 0.065! coefficient for the mass flux at the firstlevel 0.065
  40. ! of the updraft (closure) XCMF = 0.065
  41. REAL, PARAMETER ::XENTR_DRY = 0.55 ! coefficient for entrainment in dry part XENTR_DRY = 0.55
  42. REAL, PARAMETER ::XDETR_DRY = 10. ! coefficient for detrainment in dry part XDETR_DRY = 10.
  43. REAL, PARAMETER ::XDETR_LUP = 1.0 ! coefficient for detrainment in dry part XDETR_LUP = 1.
  44. REAL, PARAMETER ::XENTR_MF = 0.035! entrainment constant (m/Pa) = 0.2 (m) XENTR_MF = 0.035
  45. REAL, PARAMETER ::XCRAD_MF = 50. ! cloud radius in cloudy part
  46. REAL, PARAMETER ::XKCF_MF = 2.75 ! coefficient for cloud fraction
  47. REAL, PARAMETER ::XKRC_MF = 1. ! coefficient for convective rc
  48. REAL, PARAMETER ::XTAUSIGMF = 600.
  49. REAL, PARAMETER ::XPRES_UV = 0.5 ! coefficient for pressure term in wind mixing
  50. !
  51. REAL, PARAMETER ::XFRAC_UP_MAX= 0.33 ! maximum Updraft fraction
  52. !
  53. CONTAINS
  54. SUBROUTINE MFSHCONVPBL (DT,STEPBL,HT,DZ &
  55. ,RHO,PMID,PINT,TH,EXNER &
  56. ,QV, QC, U, V &
  57. ,HFX, QFX, TKE &
  58. ,RUBLTEN,RVBLTEN,RTHBLTEN &
  59. ,RQVBLTEN,RQCBLTEN &
  60. ,IDS,IDE,JDS,JDE,KDS,KDE &
  61. ,IMS,IME,JMS,JME,KMS,KME &
  62. ,ITS,ITE,JTS,JTE,KTS,KTE,KRR &
  63. ,MASSFLUX_EDKF, ENTR_EDKF, DETR_EDKF &
  64. ,THL_UP, THV_UP, RT_UP, RV_UP &
  65. ,RC_UP, U_UP, V_UP, FRAC_UP, RC_MF &
  66. ,WTHV,PLM_BL89 )
  67. IMPLICIT NONE
  68. !
  69. !----------------------------------------------------------------------
  70. INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
  71. & ,IMS,IME,JMS,JME,KMS,KME &
  72. & ,ITS,ITE,JTS,JTE,KTS,KTE
  73. !
  74. INTEGER,INTENT(IN) :: KRR
  75. INTEGER,INTENT(IN) :: STEPBL
  76. REAL,INTENT(IN) :: DT
  77. !
  78. REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: HT, HFX, QFX
  79. !
  80. REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: DZ &
  81. & ,EXNER &
  82. & ,PMID,PINT &
  83. & ,QV,QC,RHO &
  84. & ,TH,U,V,TKE
  85. !
  86. REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(INOUT) :: RQCBLTEN,RQVBLTEN &
  87. & ,RTHBLTEN &
  88. & ,RUBLTEN,RVBLTEN
  89. REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),OPTIONAL,INTENT(OUT) :: &
  90. & MASSFLUX_EDKF, ENTR_EDKF, DETR_EDKF &
  91. & ,THL_UP, THV_UP, RT_UP, RV_UP &
  92. & ,RC_UP, U_UP, V_UP, FRAC_UP
  93. REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),OPTIONAL,INTENT(INOUT) :: &
  94. & RC_MF
  95. REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(INOUT) :: WTHV
  96. REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(INOUT) :: PLM_BL89
  97. !
  98. !Local declaration
  99. INTEGER :: KRRL ! number of liquid water var.
  100. INTEGER :: KRRI ! number of ice water var.
  101. LOGICAL :: OMIXUV ! True if mixing of momentum
  102. REAL :: PIMPL_MF ! degre of implicitness
  103. REAL :: PTSTEP ! Dynamical timestep
  104. REAL :: PTSTEP_MET! Timestep for meteorological variables
  105. REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PZZ ! Height at the flux point
  106. REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PZZM ! Height at the mass point
  107. REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PDZZ ! depth between mass levels
  108. REAL, DIMENSION(ITS:ITE,JTS:JTE) :: PSFTH,PSFRV
  109. ! normal surface fluxes of theta,rv
  110. !
  111. ! prognostic variables at t- deltat
  112. REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PPABSM ! Pressure at mass point
  113. !REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PPABSF ! Pressure at flux point
  114. REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PEXNM ! Exner function at t-dt
  115. REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PRHODREF ! dry density of the
  116. ! reference state
  117. REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PRHODJ ! dry density of the
  118. REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PTKEM ! TKE
  119. REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PUM,PVM ! momentum
  120. ! thermodynamical variables which are transformed in conservative var.
  121. REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PTHM ! pot. temp. = PTHLM in turb.f90
  122. REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE,KRR) :: PRM ! water species
  123. REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PRUS,PRVS,PRTHS
  124. REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE,KRR) :: PRRS
  125. ! For diagnostic output
  126. REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PEMF, PENTR, PDETR
  127. REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PTHL_UP, PRT_UP, PRV_UP, PRC_UP
  128. REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PU_UP, PV_UP, PTHV_UP, PFRAC_UP
  129. REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PRC_MF
  130. REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: WTHV_MF
  131. REAL, DIMENSION(ITS:ITE,JTS:JTE,KTS:KTE) :: PLM_MF
  132. INTEGER :: I,J,K ! loop variables
  133. ! Transform WRF Variable to input of mass flux scheme
  134. DO J=JTS,JTE
  135. DO K=KTS,KTE
  136. DO I=ITS,ITE
  137. IF (K==KTS) PZZ(I,J,K)=0.
  138. PEMF(I,J,K)=0.
  139. PENTR(I,J,K)=0.
  140. PDETR(I,J,K)=0.
  141. PTHL_UP(I,J,K)=0.
  142. PTHV_UP(I,J,K)=0.
  143. PRT_UP(I,J,K)=0.
  144. PRV_UP(I,J,K)=0.
  145. PRC_UP(I,J,K)=0.
  146. PU_UP(I,J,K)=0.
  147. PV_UP(I,J,K)=0.
  148. PFRAC_UP(I,J,K)=0.
  149. WTHV_MF(I,J,K)=0.
  150. PTHM(I,J,K)=TH(I,K,J)
  151. PTKEM(I,J,K)=TKE(I,K,J)
  152. PRM(I,J,K,1)=QV(I,K,J)-RC_MF(I,K,J)
  153. PRM(I,J,K,2)=RC_MF(I,K,J)
  154. PUM(I,J,K)=U(I,K,J)
  155. PVM(I,J,K)=V(I,K,J)
  156. PRHODREF(I,J,K)=RHO(I,K,J)/(1.+QV(I,K,J))
  157. PEXNM(I,J,K)=EXNER(I,K,J)
  158. PPABSM(I,J,K)=PMID(I,K,J)
  159. IF (K/=KTE) THEN
  160. PZZ(I,J,K+1)=PZZ(I,J,K)+DZ(I,K,J)
  161. PZZM(I,J,K)=0.5*(PZZ(I,J,K+1)+PZZ(I,J,K)) ! z at mass point
  162. ELSE
  163. PZZM(I,J,K)=PZZ(I,J,K)+0.5*DZ(I,J,K-1) ! z at mass point
  164. ENDIF
  165. IF (K==KTS) THEN
  166. PDZZ(I,J,K)=2*(PZZM(I,J,K))
  167. ELSE
  168. PDZZ(I,J,K)=PZZM(I,J,K)-PZZM(I,J,K-1)
  169. ENDIF
  170. PRHODJ(I,J,K)=PRHODREF(I,J,K)*DZ(I,K,J)
  171. ENDDO
  172. ENDDO
  173. ENDDO
  174. ! fill the kte+1 level
  175. PTHM(:,:,KTE)=PTHM(:,:,KTE-1)
  176. PTKEM(:,:,KTE)=PTKEM(:,:,KTE-1)
  177. PRM(:,:,KTE,1)=PRM(:,:,KTE-1,1)
  178. PRM(:,:,KTE,2)=PRM(:,:,KTE-1,2)
  179. PUM(:,:,KTE)=PUM(:,:,KTE-1)
  180. PVM(:,:,KTE)=PVM(:,:,KTE-1)
  181. PRHODREF(:,:,KTE)=PRHODREF(:,:,KTE-1)
  182. PEXNM(:,:,KTE)=PEXNM(:,:,KTE-1)
  183. PPABSM(:,:,KTE)=PPABSM(:,:,KTE-1)
  184. PRHODJ(:,:,KTE)=PRHODJ(:,:,KTE-1)
  185. PSFTH(:,:)=HFX(ITS:ITE,JTS:JTE)/(PRHODREF(:,:,KTS)*XCPD)
  186. PSFRV(:,:)=QFX(ITS:ITE,JTS:JTE)/(PRHODREF(:,:,KTS))
  187. ! Assign some variables
  188. OMIXUV=.FALSE.
  189. KRRL=1 !Qc is managed
  190. KRRI=0 !Qi not
  191. PIMPL_MF=0.
  192. PTSTEP=DT*STEPBL
  193. PTSTEP_MET=PTSTEP
  194. CALL MFSHCONVPBL_CORE(KRR,KRRL,KRRI, &
  195. OMIXUV, &
  196. PIMPL_MF,PTSTEP,PTSTEP_MET, &
  197. PDZZ, PZZ, &
  198. PRHODJ, PRHODREF, &
  199. PPABSM, PEXNM, &
  200. PSFTH,PSFRV, &
  201. PTHM,PRM,PUM,PVM,PTKEM, &
  202. PRTHS,PRRS,PRUS,PRVS,PEMF, PENTR, PDETR, &
  203. PTHL_UP, PRT_UP, PRV_UP, PRC_UP, &
  204. PU_UP, PV_UP, PTHV_UP, PFRAC_UP, PRC_MF, WTHV_MF,PLM_MF )
  205. DO J=JTS,JTE
  206. DO K=KTS,KTE
  207. DO I=ITS,ITE
  208. RQCBLTEN(I,K,J)=PRRS(I,J,K,2)
  209. RQVBLTEN(I,K,J)=PRRS(I,J,K,1)
  210. RTHBLTEN(I,K,J)=PRTHS(I,J,K)
  211. RUBLTEN(I,K,J)=PRUS(I,J,K)
  212. RVBLTEN(I,K,J)=PRVS(I,J,K)
  213. WTHV(I,K,J)=WTHV_MF(I,J,K)
  214. PLM_BL89(I,K,J)=PLM_MF(I,J,K)
  215. ENDDO
  216. ENDDO
  217. ENDDO
  218. IF ( PRESENT(MASSFLUX_EDKF) ) THEN
  219. DO J=JTS,JTE
  220. DO K=KTS,KTE
  221. DO I=ITS,ITE
  222. MASSFLUX_EDKF(I,K,J)=PEMF(I,J,K)
  223. ENTR_EDKF(I,K,J)=PENTR(I,J,K)
  224. DETR_EDKF(I,K,J)=PDETR(I,J,K)
  225. THL_UP(I,K,J)=PTHL_UP(I,J,K)
  226. THV_UP(I,K,J)=PTHV_UP(I,J,K)
  227. RT_UP(I,K,J)=PRT_UP(I,J,K)
  228. RV_UP(I,K,J)=PRV_UP(I,J,K)
  229. RC_UP(I,K,J)=PRC_UP(I,J,K)
  230. U_UP(I,K,J)=PU_UP(I,J,K)
  231. V_UP(I,K,J)=PV_UP(I,J,K)
  232. FRAC_UP(I,K,J)=PFRAC_UP(I,J,K)
  233. RC_MF(I,K,J)=PRC_MF(I,J,K)
  234. ENDDO
  235. ENDDO
  236. ENDDO
  237. ENDIF
  238. END SUBROUTINE MFSHCONVPBL
  239. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  240. ! WRAPPER from WRF to MASS FLUX SCHEME
  241. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  242. SUBROUTINE MFSHCONVPBL_CORE(KRR,KRRL,KRRI, &
  243. OMIXUV, &
  244. PIMPL_MF,PTSTEP,PTSTEP_MET, &
  245. PDZZ, PZZ, &
  246. PRHODJ, PRHODREF, &
  247. PPABSM, PEXNM, &
  248. PSFTH,PSFRV, &
  249. PTHM,PRM,PUM,PVM,PTKEM, &
  250. PRTHS,PRRS,PRUS,PRVS, PEMF, PENTR, PDETR, &
  251. PTHL_UP, PRT_UP, PRV_UP, PRC_UP, &
  252. PU_UP, PV_UP, PTHV_UP, PFRAC_UP, PRC_MF, &
  253. PFLXZTHVMF,PLM )
  254. !!
  255. !!**** *MFSHCONVPBL_CORE* - Interfacing routine
  256. !!
  257. !! --------------------------------------------------------------------------
  258. !
  259. IMPLICIT NONE
  260. INTEGER, INTENT(IN) :: KRR ! number of moist var.
  261. INTEGER, INTENT(IN) :: KRRL ! number of liquid water var.
  262. INTEGER, INTENT(IN) :: KRRI ! number of ice water var.
  263. LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum
  264. REAL, INTENT(IN) :: PIMPL_MF ! degre of implicitness
  265. REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep
  266. REAL, INTENT(IN) :: PTSTEP_MET! Timestep for meteorological variables
  267. REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height of flux point
  268. REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Metric coefficients
  269. REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size
  270. REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! dry density of the
  271. ! reference state
  272. REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Pressure at time t-1
  273. REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNM ! Exner function at t-dt
  274. REAL, DIMENSION(:,:), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv
  275. REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at t-dt
  276. REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! water var. at t-dt
  277. REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM ! wind components at t-dt
  278. REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! tke at t-dt
  279. REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRUS,PRVS,PRTHS ! Meso-NH sources
  280. REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PRRS
  281. REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEMF, PENTR, PDETR
  282. REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHL_UP, PRT_UP, PRV_UP, PRC_UP
  283. REAL, DIMENSION(:,:,:), INTENT(OUT) :: PU_UP, PV_UP, PTHV_UP, PFRAC_UP
  284. REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRC_MF
  285. REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFLXZTHVMF
  286. REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLM
  287. !
  288. ! 0.2 Declaration of local variables
  289. !
  290. REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: &
  291. ZEXN,ZCPH, &
  292. PRV,PRL,PTH, &
  293. ZTM, & ! Temperature at t-dt
  294. ZLVOCPEXN, & !
  295. ZCF_MF, &
  296. ZLSOCPEXN, & !
  297. ZAMOIST, & !
  298. ZATHETA, & !
  299. ZTHLM, & !
  300. ZRTM, & !
  301. ZTHVM,ZTHVREF,ZUMM,ZVMM, & !
  302. ZRI_UP,ZW_UP, & !
  303. ZEMF_O_RHODREF, & ! entrainment/detrainment
  304. ZTHLDT,ZRTDT,ZUDT,ZVDT, & ! tendencies
  305. ZFLXZTHMF,ZFLXZRMF,ZFLXZUMF,ZFLXZVMF ! fluxes
  306. INTEGER,DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: IKLCL,IKETL,IKCTL
  307. INTEGER :: IKU, IKB, IKE
  308. INTEGER :: JI,JJ,JK,JSV ! Loop counters
  309. INTEGER :: IRESP ! error code
  310. !------------------------------------------------------------------------
  311. !!! 1. Initialisation
  312. ! Internal Domain
  313. IKU=SIZE(PTHM,3)
  314. IKB=1 ! Modif WRF JP
  315. IKE=IKU-1
  316. ! number of scalar var
  317. ZUMM=PUM !Modif WRF JP
  318. ZVMM=PVM !Modif WRF JP
  319. ! Thermodynamics functions
  320. CALL COMPUTE_FUNCTION_THERMO_MF( KRR,KRRL,KRRI, &
  321. PTHM,PRM,PEXNM,PPABSM, &
  322. ZTM,ZLVOCPEXN,ZLSOCPEXN, &
  323. ZAMOIST,ZATHETA )
  324. ! Conservative variables at t-dt
  325. CALL THL_RT_FROM_TH_R_MF( KRR,KRRL,KRRI, &
  326. PTHM, PRM, ZLVOCPEXN, ZLSOCPEXN, &
  327. ZTHLM, ZRTM )
  328. ! Virtual potential temperature at t-dt
  329. ZTHVM(:,:,:) = PTHM(:,:,:)*((1.+XRV / XRD *PRM(:,:,:,1))/(1.+ZRTM(:,:,:)))
  330. ZTHVREF=XG/ZTHVM
  331. CALL BL89(PZZ,PDZZ,ZTHVREF,ZTHLM,KRR, &
  332. PRM,PTKEM,PLM)
  333. !!! 2. Compute updraft
  334. CALL UPDRAFT_SOPE (KRR,KRRL,KRRI,OMIXUV, &
  335. PZZ,PDZZ,PSFTH,PSFRV,PPABSM,PRHODREF, &
  336. PTKEM,PTHM,PRM,ZTHLM,ZRTM,ZUMM,ZVMM, &
  337. PTHL_UP,PRT_UP,PRV_UP,PU_UP,PV_UP, &
  338. PRC_UP,ZRI_UP,PTHV_UP,ZW_UP,PFRAC_UP,PEMF,&
  339. PDETR,PENTR,IKLCL,IKETL,IKCTL )
  340. !!! 3. Compute fluxes of conservative variables and their divergence = tendency
  341. ZEMF_O_RHODREF=PEMF/PRHODREF
  342. CALL MF_TURB(OMIXUV, PIMPL_MF, PTSTEP,PTSTEP_MET, &
  343. PDZZ, PRHODJ, ZTHLM,ZTHVM,ZRTM,ZUMM,ZVMM, &
  344. ZTHLDT,ZRTDT,ZUDT,ZVDT, &
  345. ZEMF_O_RHODREF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP,&
  346. ZFLXZTHMF,PFLXZTHVMF,ZFLXZRMF,ZFLXZUMF,ZFLXZVMF )
  347. !!! 5. Compute diagnostic convective cloud fraction and content
  348. ! ! ! ONLY liquid cloud implemented (yet)
  349. CALL COMPUTE_MF_CLOUD(KRRL,ZTHLM,PRC_UP,PFRAC_UP,PDZZ,IKLCL, &
  350. PRC_MF,ZCF_MF )
  351. !!! 6. Compute tendency terms for pronostic variables
  352. ZEXN(:,:,:)=(PPABSM(:,:,:)/XP00) ** (XRD/XCPD)
  353. !
  354. PRV(:,:,:)=PRM(:,:,:,1)-PRC_MF(:,:,:)
  355. PRL(:,:,:)=PRC_MF(:,:,:)
  356. ! 2.1 Cph
  357. ZCPH(:,:,:)=XCPD+ XCPV * PRV(:,:,:)+ XCL * PRL(:,:,:)
  358. PTH(:,:,:)=(ZTHLM(:,:,:)+ZTHLDT(:,:,:))+(XLVTT/(ZCPH*ZEXN(:,:,:))*PRL(:,:,:))
  359. PRTHS(:,:,:) = ZTHLDT(:,:,:)
  360. PRTHS(:,:,:) = (PTH(:,:,:)-PTHM(:,:,:))/PTSTEP_MET
  361. PRRS(:,:,:,2) = (PRC_MF-PRM(:,:,:,2))/PTSTEP_MET
  362. PRRS(:,:,:,1) = ZRTDT(:,:,:)-PRRS(:,:,:,2)
  363. PRTHS(:,:,:) = ZTHLDT(:,:,:)
  364. PRRS(:,:,:,1) = ZRTDT(:,:,:)
  365. PRRS(:,:,:,2) = 0
  366. PRUS(:,:,:) = ZUDT(:,:,:)
  367. PRVS(:,:,:) = ZVDT(:,:,:)
  368. END SUBROUTINE MFSHCONVPBL_CORE
  369. ! ###################################################################
  370. SUBROUTINE COMPUTE_BL89_ML(PDZZ2D, &
  371. PTKEM2D,PG_O_THVREF2D,PVPT,KK,OUPORDN,PLWORK)
  372. ! ###################################################################
  373. !!
  374. !! COMPUTE_BL89_ML routine to:
  375. !!
  376. !-------------------------------------------------------------------------------
  377. !
  378. !* 0. DECLARATIONS
  379. !
  380. ! ------------
  381. !USE MODD_CST
  382. !
  383. !
  384. IMPLICIT NONE
  385. !
  386. ! 0.1 arguments
  387. !
  388. REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ2D
  389. REAL, DIMENSION(:,:), INTENT(IN) :: PTKEM2D
  390. REAL, DIMENSION(:,:), INTENT(IN) :: PG_O_THVREF2D
  391. REAL, DIMENSION(:,:), INTENT(IN) :: PVPT
  392. INTEGER, INTENT(IN) :: KK
  393. LOGICAL, INTENT(IN) :: OUPORDN
  394. REAL, DIMENSION(:), INTENT(OUT) :: PLWORK
  395. ! 0.2 Local variable
  396. !
  397. REAL, DIMENSION(SIZE(PTKEM2D,1)) :: ZLWORK1,ZLWORK2 ! Temporary mixing length
  398. REAL, DIMENSION(SIZE(PTKEM2D,1)) :: ZINTE,ZPOTE ! TKE and potential energy
  399. ! between 2 levels
  400. INTEGER :: IKB,IKE
  401. !
  402. REAL, DIMENSION(SIZE(PTKEM2D,1),SIZE(PTKEM2D,2)) :: ZDELTVPT,ZHLVPT
  403. !Virtual Potential Temp at Half level and DeltaThv between
  404. !2 levels
  405. REAL, DIMENSION(SIZE(PTKEM2D,1)) :: ZTH! Potential Temp
  406. INTEGER :: IIJU,IKU !Internal Domain
  407. INTEGER :: J1D !horizontal loop counter
  408. INTEGER :: JKK !loop counters
  409. INTEGER :: JRR !moist loop counter
  410. INTEGER :: JIJK !loop counters
  411. REAL :: ZTEST,ZTEST0,ZTESTM !test for vectorization
  412. !-------------------------------------------------------------------------------------
  413. !
  414. !* 1. INITIALISATION
  415. ! --------------
  416. IIJU=SIZE(PTKEM2D,1)
  417. !
  418. IKB = 1 !Modif WRF JP
  419. IKE = SIZE(PTKEM2D,2)-1 !Modif WRF JP
  420. IKU = SIZE(PTKEM2D,2)
  421. ZDELTVPT(:,2:IKU)=PVPT(:,2:IKU)-PVPT(:,1:IKU-1)
  422. ZDELTVPT(:,1)=0.
  423. ! to prevent division by zero
  424. WHERE (ABS(ZDELTVPT(:,:))<1.E-10)
  425. ZDELTVPT(:,:)=1.E-10
  426. END WHERE
  427. !
  428. ZHLVPT(:,2:IKU)= 0.5 * ( PVPT(:,2:IKU)+PVPT(:,1:IKU-1) )
  429. ZHLVPT(:,1) = PVPT(:,1)
  430. !
  431. !
  432. !
  433. !* 2. CALCULATION OF THE UPWARD MIXING LENGTH
  434. ! ---------------------------------------
  435. !
  436. IF (OUPORDN.EQV..TRUE.) THEN
  437. ZINTE(:)=PTKEM2D(:,KK)
  438. PLWORK=0.
  439. ZLWORK1=0.
  440. ZLWORK2=0.
  441. ZTESTM=1.
  442. ZTH(:)=PVPT(:,KK)
  443. DO JKK=KK+1,IKE
  444. IF(ZTESTM > 0.) THEN
  445. ZTESTM=0
  446. DO J1D=1,IIJU
  447. ZTEST0=0.5+SIGN(0.5,ZINTE(J1D))
  448. ZPOTE(J1D) = ZTEST0*(PG_O_THVREF2D(J1D,KK) * &
  449. (ZHLVPT(J1D,JKK) - ZTH(J1D))) * PDZZ2D(J1D,JKK) !particle keeps its temperature
  450. ZTEST =0.5+SIGN(0.5,ZINTE(J1D)-ZPOTE(J1D))
  451. ZTESTM=ZTESTM+ZTEST0
  452. ZLWORK1(J1D)=PDZZ2D(J1D,JKK)
  453. !ZLWORK2 jump of the last reached level
  454. ZLWORK2(J1D)= ( - PG_O_THVREF2D(J1D,KK) * &
  455. ( PVPT(J1D,JKK-1) - ZTH(J1D) ) &
  456. + SQRT (ABS( &
  457. ( PG_O_THVREF2D(J1D,KK) * (PVPT(J1D,JKK-1) - ZTH(J1D)) )**2 &
  458. + 2. * ZINTE(J1D) * PG_O_THVREF2D(J1D,KK) &
  459. * ZDELTVPT(J1D,JKK) / PDZZ2D(J1D,JKK) )) ) / &
  460. ( PG_O_THVREF2D(J1D,KK) * ZDELTVPT(J1D,JKK) / PDZZ2D(J1D,JKK) )
  461. !
  462. PLWORK(J1D)=PLWORK(J1D)+ZTEST0*(ZTEST*ZLWORK1(J1D)+ &
  463. (1-ZTEST)*ZLWORK2(J1D))
  464. ZINTE(J1D) = ZINTE(J1D) - ZPOTE(J1D)
  465. END DO
  466. ENDIF
  467. END DO
  468. ENDIF
  469. !!
  470. !* 2. CALCULATION OF THE DOWNWARD MIXING LENGTH
  471. ! ---------------------------------------
  472. !
  473. IF (OUPORDN.EQV..FALSE.) THEN
  474. ZINTE(:)=PTKEM2D(:,KK)
  475. PLWORK=0.
  476. ZLWORK1=0.
  477. ZLWORK2=0.
  478. ZTESTM=1.
  479. ZTH(:)=PVPT(:,KK)
  480. DO JKK=KK,IKB,-1
  481. IF(ZTESTM > 0.) THEN
  482. ZTESTM=0
  483. DO J1D=1,IIJU
  484. ZTEST0=0.5+SIGN(0.5,ZINTE(J1D))
  485. ZPOTE(J1D) = -ZTEST0*(PG_O_THVREF2D(J1D,KK) * &
  486. (ZHLVPT(J1D,JKK) - ZTH(J1D))) * PDZZ2D(J1D,JKK) !particle keeps its temperature
  487. ZTEST =0.5+SIGN(0.5,ZINTE(J1D)-ZPOTE(J1D))
  488. ZTESTM=ZTESTM+ZTEST0
  489. ZLWORK1(J1D)=PDZZ2D(J1D,JKK)
  490. ZLWORK2(J1D)= ( + PG_O_THVREF2D(J1D,KK) * &
  491. ( PVPT(J1D,JKK) - ZTH(J1D) ) &
  492. + SQRT (ABS( &
  493. ( PG_O_THVREF2D(J1D,KK) * (PVPT(J1D,JKK) - ZTH(J1D)) )**2 &
  494. + 2. * ZINTE(J1D) * PG_O_THVREF2D(J1D,KK) &
  495. * ZDELTVPT(J1D,JKK) / PDZZ2D(J1D,JKK) )) ) / &
  496. ( PG_O_THVREF2D(J1D,KK) * ZDELTVPT(J1D,JKK) / PDZZ2D(J1D,JKK) )
  497. !
  498. PLWORK(J1D)=PLWORK(J1D)+ZTEST0*(ZTEST*ZLWORK1(J1D)+ &
  499. (1-ZTEST)*ZLWORK2(J1D))
  500. ZINTE(J1D) = ZINTE(J1D) - ZPOTE(J1D)
  501. END DO
  502. ENDIF
  503. END DO
  504. ENDIF
  505. END SUBROUTINE COMPUTE_BL89_ML
  506. !
  507. !
  508. ! #############################################################
  509. SUBROUTINE COMPUTE_ENTR_DETR(OTEST,OTESTLCL,&
  510. HFRAC_ICE,PFRAC_ICE,KK,PPABSM,PZZ,PDZZ,&
  511. PTHVM,PTHLM,PRTM,PW_UP2,&
  512. PTHL_UP,PRT_UP,PLUP,&
  513. PENTR,PDETR,PBUO_INTEG)
  514. ! #############################################################
  515. !!
  516. !!***COMPUTE_ENTR_DETR* - calculates caracteristics of the updraft or downdraft
  517. !! using model of the EDMF scheme
  518. !!
  519. !!
  520. !! --------------------------------------------------------------------------
  521. !
  522. IMPLICIT NONE
  523. !
  524. !
  525. !* 1.1 Declaration of Arguments
  526. !
  527. !
  528. LOGICAL,DIMENSION(:),INTENT(INOUT) :: OTEST ! test to see if updraft is running
  529. LOGICAL,DIMENSION(:),INTENT(INOUT) :: OTESTLCL !test of condensation
  530. CHARACTER*1 :: HFRAC_ICE ! frac_ice can be compute using
  531. ! Temperature (T) or prescribed
  532. ! (Y)
  533. REAL, DIMENSION(:), INTENT(INOUT) :: PFRAC_ICE ! if frac_ice is prescribed
  534. INTEGER, INTENT(IN) :: KK ! level where E and D are computed
  535. !
  536. ! prognostic variables at t- deltat
  537. !
  538. REAL, DIMENSION(:,:), INTENT(IN) :: PPABSM ! Pressure at time t-1
  539. REAL, DIMENSION(:,:), INTENT(IN) :: PZZ ! Height at the flux point
  540. REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! metrics coefficient
  541. REAL, DIMENSION(:,:), INTENT(IN) :: PTHVM ! ThetaV environment
  542. !
  543. ! thermodynamical variables which are transformed in conservative var.
  544. !
  545. REAL, DIMENSION(:), INTENT(IN) :: PTHLM ! Thetal
  546. REAL, DIMENSION(:), INTENT(IN) :: PRTM ! total mixing ratio
  547. REAL, DIMENSION(:,:), INTENT(INOUT) :: PW_UP2 ! Vertical velocity^2
  548. REAL, DIMENSION(:), INTENT(IN) :: PTHL_UP,PRT_UP ! updraft properties
  549. REAL, DIMENSION(:), INTENT(IN) :: PLUP ! LUP compute from the ground
  550. REAL, DIMENSION(:), INTENT(INOUT) :: PENTR ! Mass flux entrainment of the updraft
  551. REAL, DIMENSION(:), INTENT(INOUT) :: PDETR ! Mass flux detrainment of the updraft
  552. REAL, DIMENSION(:), INTENT(INOUT) :: PBUO_INTEG! Integral Buoyancy
  553. !
  554. !
  555. ! 1.2 Declaration of local variables
  556. !
  557. !
  558. ! Variables for cloudy part
  559. REAL, DIMENSION(SIZE(PTHLM)) :: ZKIC ! fraction of env. mass in the muxtures
  560. REAL, DIMENSION(SIZE(PTHLM)) :: ZEPSI,ZDELTA ! factor entrainment detrainment
  561. REAL, DIMENSION(SIZE(PTHLM)) :: ZEPSI_CLOUD ! factor entrainment detrainment
  562. REAL, DIMENSION(SIZE(PTHLM)) :: ZCOEFFMF_CLOUD ! factor for compputing entr. detr.
  563. REAL, DIMENSION(SIZE(PTHLM)) :: ZMIXTHL,ZMIXRT ! Thetal and rt in the mixtures
  564. !
  565. REAL, DIMENSION(SIZE(PTHLM)) :: ZTHMIX,ZTHVMIX ! Theta and Thetav of mixtures
  566. REAL, DIMENSION(SIZE(PTHLM)) :: ZRVMIX,ZRCMIX,ZRIMIX ! mixing ratios in mixtures
  567. REAL, DIMENSION(SIZE(PTHLM)) :: ZTHMIX_F2 ! Theta and Thetav of mixtures
  568. REAL, DIMENSION(SIZE(PTHLM)) :: ZRVMIX_F2,ZRCMIX_F2,ZRIMIX_F2 ! mixing ratios in mixtures
  569. REAL, DIMENSION(SIZE(PTHLM)) :: ZTHV_UP ! thvup at mass point kk
  570. REAL, DIMENSION(SIZE(PTHLM)) :: ZTHVMIX_1,ZTHVMIX_2 ! Theta and Thetav of mixtures
  571. ! Variables for dry part
  572. REAL, DIMENSION(SIZE(PTHLM)) :: ZBUO_INTEG,& ! Temporary integral Buoyancy
  573. ZDZ_HALF,& ! half-DeltaZ between 2 flux points
  574. ZDZ_STOP,& ! Exact Height of the LCL
  575. ZTHV_MINUS_HALF,& ! Thv at flux point(kk)
  576. ZTHV_PLUS_HALF,& ! Thv at flux point(kk+1)
  577. ZCOEFF_MINUS_HALF,& ! Variation of Thv between mass points kk-1 and kk
  578. ZCOEFF_PLUS_HALF,& ! Variation of Thv between mass points kk and kk+1
  579. ZCOTHVU_MINUS_HALF,& ! Variation of Thvup between flux point kk and mass point kk
  580. ZCOTHVU_PLUS_HALF,& ! Variation of Thvup between mass point kk and flux point kk+1
  581. ZW2_HALF ! w**2 at mass point KK
  582. REAL, DIMENSION(SIZE(PTHLM)) :: ZCOPRE_MINUS_HALF,& ! Variation of pressure between mass points kk-1 and kk
  583. ZCOPRE_PLUS_HALF,& ! Variation of pressure between mass points kk and kk+1
  584. ZPRE_MINUS_HALF,& ! pressure at flux point kk
  585. ZPRE_PLUS_HALF,& ! pressure at flux point kk+1
  586. ZTHV_UP_F1,& ! thv_up at flux point kk
  587. ZTHV_UP_F2 ! thv_up at flux point kk+1
  588. REAL, DIMENSION(SIZE(PTHLM)) :: ZCOEFF_QSAT,& ! variation of Qsat at the transition between dry part and cloudy part
  589. ZRC_ORD,& !
  590. ZPART_DRY ! part of dry part at the transition level
  591. !
  592. REAL, DIMENSION(SIZE(PTHLM)) :: ZQVSAT ! QV at saturation
  593. REAL, DIMENSION(SIZE(PTHLM)) :: PT ! temperature to compute saturation vapour mixing ratio
  594. REAL, DIMENSION(SIZE(PTHVM,1),SIZE(PTHVM,2)) ::ZG_O_THVREF
  595. !
  596. LOGICAL, DIMENSION(SIZE(OTEST,1)) :: GTEST_LOCAL_LCL,& ! true if LCL found between flux point KK and mass point KK
  597. GTEST_LOCAL_LCL2 ! true if LCL found between mass point KK and flux point KK+1
  598. !
  599. REAL :: ZRDORV ! RD/RV
  600. REAL :: ZRVORD ! RV/RD
  601. INTEGER :: ILON, ITEST, IKB !
  602. !----------------------------------------------------------------------------------
  603. ! 1.3 Initialisation
  604. ! ------------------
  605. IKB=1 ! modif WRF JP
  606. ZRDORV = XRD / XRV !=0.622
  607. ZRVORD = XRV / XRD !=1.607
  608. ZG_O_THVREF=XG/PTHVM
  609. ZCOEFF_QSAT=0.
  610. ZRC_ORD=0.
  611. ZPART_DRY=1.
  612. GTEST_LOCAL_LCL=.FALSE.
  613. ZDZ_HALF(:) = (PZZ(:,KK+1)-PZZ(:,KK))/2.
  614. ZDZ_STOP(:) = ZDZ_HALF(:)
  615. ZKIC(:)=0.1 ! starting value for critical mixed fraction for CLoudy Part
  616. ! Computation of KIC
  617. ! ---------------------
  618. ! 2.1 Compute critical mixed fraction by estimating unknown
  619. ! T^mix r_c^mix and r_i^mix from thl^mix and r_t^mix
  620. ! We determine the zero crossing of the linear curve
  621. ! evaluating the derivative using ZMIXF=0.1.
  622. ! -----------------------------------------------------
  623. ZMIXTHL(:) = ZKIC(:) * PTHLM(:)+(1. - ZKIC(:))*PTHL_UP(:)
  624. ZMIXRT(:) = ZKIC(:) * PRTM(:)+(1. - ZKIC(:))*PRT_UP(:)
  625. ! MIXTURE FOR CLOUDY PART
  626. ! Compute pressure at flux level KK and at flux Level KK+1
  627. IF (KK==IKB) THEN !MODIF WRF JP
  628. ZCOPRE_MINUS_HALF(:) = 0. !MODIF WRF JP
  629. ELSE!MODIF WRF JP
  630. ZCOPRE_MINUS_HALF(:) = ((PPABSM(:,KK)-PPABSM(:,KK-1))/PDZZ(:,KK))
  631. ENDIF!MODIF WRF JP
  632. ZCOPRE_PLUS_HALF(:) = ((PPABSM(:,KK+1)-PPABSM(:,KK))/PDZZ(:,KK+1))
  633. IF (KK==IKB) THEN !MODIF WRF JP
  634. ZPRE_MINUS_HALF(:)= PPABSM(:,KK)
  635. ELSE!MODIF WRF JP
  636. ZPRE_MINUS_HALF(:)= ZCOPRE_MINUS_HALF*0.5*(PZZ(:,KK)-PZZ(:,KK-1))+PPABSM(:,KK-1)
  637. ENDIF!MODIF WRF JP
  638. ZPRE_PLUS_HALF(:) = ZCOPRE_PLUS_HALF*0.5*(PZZ(:,KK+1)-PZZ(:,KK))+PPABSM(:,KK)
  639. ! Compute non cons. var. of mixture at the mass level
  640. CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE,&
  641. PPABSM(:,KK),ZMIXTHL,ZMIXRT,&
  642. ZTHMIX,ZRVMIX,ZRCMIX,ZRIMIX)
  643. ! Compute theta_v of mixture at mass level KK for KF90
  644. ZTHVMIX_1(:) = ZTHMIX(:)*(1.+ZRVORD*ZRVMIX(:))/(1.+ZMIXRT(:))
  645. ! Compute non cons. var. of mixture at the flux level KK+1
  646. CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE,&
  647. ZPRE_PLUS_HALF,ZMIXTHL,ZMIXRT,&
  648. ZTHMIX,ZRVMIX,ZRCMIX,ZRIMIX)
  649. ! compute theta_v of mixture at the flux level KK+1 for KF90
  650. ZTHVMIX_2(:) = ZTHMIX(:)*(1.+ZRVORD*ZRVMIX(:))/(1.+ZMIXRT(:))
  651. ! 2.1 Compute critical mixed fraction by estimating unknown
  652. ! T^mix r_c^mix and r_i^mix from thl^mix and r_t^mix
  653. ! We determine the zero crossing of the linear curve
  654. ! evaluating the derivative using ZMIXF=0.1.
  655. ! -----------------------------------------------------
  656. ! THV_UP FOR DRY PART
  657. ! Compute theta_v of updraft at flux level KK
  658. CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE,&
  659. ZPRE_MINUS_HALF,PTHL_UP,PRT_UP,&
  660. ZTHMIX,ZRVMIX,ZRCMIX,ZRIMIX)
  661. ZTHV_UP_F1(:) = ZTHMIX(:)*(1.+ZRVORD*ZRVMIX(:))/(1.+PRT_UP(:))
  662. ! Compute theta_v of updraft at mass level KK
  663. CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE,&
  664. PPABSM(:,KK),PTHL_UP,PRT_UP,&
  665. ZTHMIX,ZRVMIX,ZRCMIX,ZRIMIX)
  666. ZTHV_UP(:) = ZTHMIX(:)*(1.+ZRVORD*ZRVMIX(:))/(1.+PRT_UP(:))
  667. ! Compute theta_v of updraft at flux level KK+1
  668. CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE,&
  669. ZPRE_PLUS_HALF,PTHL_UP,PRT_UP,&
  670. ZTHMIX_F2,ZRVMIX_F2,ZRCMIX_F2,ZRIMIX_F2)
  671. ZTHV_UP_F2(:) = ZTHMIX_F2(:)*(1.+ZRVORD*ZRVMIX_F2(:))/(1.+PRT_UP(:))
  672. !
  673. !* 2.2 Compute final values for entr. and detr.
  674. ! ----------------------------------------
  675. !
  676. ! Dry PART
  677. ! Computation of integral entrainment and detrainment between flux level KK
  678. ! and mass level KK
  679. WHERE ((ZRCMIX(:)>0.).AND.(.NOT.OTESTLCL))
  680. ! If rc is found between flux level KK and mass level KK
  681. ! a part of dry entrainment/detrainment is defined
  682. ! the exact height of LCL is also determined
  683. ZCOEFF_QSAT(:) = (ZRCMIX_F2(:) - ZRCMIX(:))/ ZDZ_HALF(:)
  684. ZRC_ORD(:) = ZRCMIX(:) - ZCOEFF_QSAT(:) * ZDZ_HALF(:)
  685. ZDZ_STOP = (- ZRC_ORD(:)/ZCOEFF_QSAT(:))
  686. ZPART_DRY(:) = ZDZ_STOP / (PZZ(:,KK+1)-PZZ(:,KK))
  687. GTEST_LOCAL_LCL(:)=.TRUE.
  688. ENDWHERE
  689. IF (KK==IKB) THEN !MODIF WRF JP
  690. ZCOEFF_MINUS_HALF = 0.
  691. ELSE!MODIF WRF JP
  692. ZCOEFF_MINUS_HALF = ((PTHVM(:,KK)-PTHVM(:,KK-1))/PDZZ(:,KK))
  693. ENDIF!MODIF WRF JP
  694. ZCOEFF_PLUS_HALF = ((PTHVM(:,KK+1)-PTHVM(:,KK))/PDZZ(:,KK+1))
  695. ZCOTHVU_MINUS_HALF = (ZTHV_UP(:)-ZTHV_UP_F1(:))/ZDZ_HALF(:)
  696. ZCOTHVU_PLUS_HALF = (ZTHV_UP_F2(:)-ZTHV_UP(:))/ZDZ_HALF(:)
  697. IF (KK==IKB) THEN !MODIF WRF JP
  698. ZTHV_MINUS_HALF = PTHVM(:,KK)
  699. ELSE!MODIF WRF JP
  700. ZTHV_MINUS_HALF = ZCOEFF_MINUS_HALF*0.5*(PZZ(:,KK)-PZZ(:,KK-1))+PTHVM(:,KK-1)
  701. ENDIF!MODIF WRF JP
  702. ZTHV_PLUS_HALF = ZCOEFF_PLUS_HALF*0.5*(PZZ(:,KK+1)-PZZ(:,KK))+ ZTHV_MINUS_HALF ! BUG JP 16082010
  703. ! Integral Buoyancy between flux level KK and mass level KK
  704. PBUO_INTEG = ZG_O_THVREF(:,KK)*ZDZ_HALF(:)*&
  705. (0.5*( ZCOTHVU_MINUS_HALF - ZCOEFF_MINUS_HALF)*ZDZ_HALF(:) &
  706. - ZTHV_MINUS_HALF + ZTHV_UP_F1(:) )
  707. WHERE ((OTEST).AND.(.NOT.OTESTLCL))
  708. PENTR=0.
  709. PDETR=0.
  710. ZBUO_INTEG = ZG_O_THVREF(:,KK)*ZDZ_STOP(:)*&
  711. (0.5 * ( - ZCOEFF_MINUS_HALF)* ZDZ_STOP(:) &
  712. - ZTHV_MINUS_HALF + ZTHV_UP_F1(:) )
  713. WHERE (ZBUO_INTEG(:)>=0.)
  714. PENTR = 0.5/(XABUO-XBENTR*XENTR_DRY)*&
  715. LOG(1.+ (2.*(XABUO-XBENTR*XENTR_DRY)/PW_UP2(:,KK))* &
  716. ZBUO_INTEG)
  717. PDETR = 0.
  718. ZW2_HALF = PW_UP2(:,KK) + 2*(XABUO-XBENTR*XENTR_DRY)*(ZBUO_INTEG)
  719. ELSEWHERE
  720. PENTR = 0.
  721. PDETR = 0.5/(XABUO)*&
  722. LOG(1.+ (2.*(XABUO)/PW_UP2(:,KK))* &
  723. MAX(0.,-ZBUO_INTEG))
  724. ZW2_HALF = PW_UP2(:,KK) + 2*(XABUO)*(ZBUO_INTEG)
  725. ENDWHERE
  726. ENDWHERE
  727. ZDZ_STOP(:) = ZDZ_HALF(:)
  728. ! total Integral Buoyancy between flux level KK and flux level KK+1
  729. PBUO_INTEG = PBUO_INTEG + ZG_O_THVREF(:,KK)*ZDZ_HALF(:)*&
  730. (0.5*(ZCOTHVU_PLUS_HALF - ZCOEFF_PLUS_HALF)* ZDZ_HALF(:) - &
  731. PTHVM(:,KK) + ZTHV_UP(:) )
  732. WHERE ((((ZRCMIX_F2(:)>0.).AND.(ZRCMIX(:)<=0.)).AND.(.NOT.OTESTLCL)).AND.(.NOT.GTEST_LOCAL_LCL(:)))
  733. ! If rc is found between mass level KK and flux level KK+1
  734. ! a part of dry entrainment is defined
  735. ! the exact height of LCL is also determined
  736. PT(:)=ZTHMIX_F2(:)*((PPABSM(:,KK+1)/XP00)**(XRD/XCPD))
  737. ZQVSAT(:)=EXP( XALPW - XBETAW/PT(:) - XGAMW*LOG(PT(:)) )
  738. ZQVSAT(:)=XRD/XRV*ZQVSAT(:)/PPABSM(:,KK+1) &
  739. / (1.+(XRD/XRV-1.)*ZQVSAT(:)/PPABSM(:,KK+1))
  740. ZCOEFF_QSAT(:) = (PRT_UP(:) - ZQVSAT(:) - &
  741. ZRCMIX(:))/ (0.5* (PZZ(:,KK+2)-PZZ(:,KK+1)))
  742. ZRC_ORD(:) = ZRCMIX_F2(:) - ZCOEFF_QSAT(:) * ZDZ_HALF(:)
  743. ZDZ_STOP = (- ZRC_ORD(:)/ZCOEFF_QSAT(:))
  744. ZPART_DRY(:) = 0.5+ZDZ_STOP / (PZZ(:,KK+1)-PZZ(:,KK))
  745. GTEST_LOCAL_LCL2(:)=.TRUE.
  746. ENDWHERE
  747. WHERE (((OTEST).AND.(.NOT.OTESTLCL)).AND.(.NOT.GTEST_LOCAL_LCL(:)))
  748. ZBUO_INTEG = ZG_O_THVREF(:,KK)*ZDZ_STOP(:)*&
  749. (0.5*( - ZCOEFF_PLUS_HALF)* ZDZ_STOP(:)&
  750. - PTHVM(:,KK) + ZTHV_UP(:) )
  751. WHERE (ZW2_HALF>0.)
  752. WHERE (ZBUO_INTEG(:)>=0.)
  753. PENTR = PENTR + 0.5/(XABUO-XBENTR*XENTR_DRY)* &
  754. LOG(1.+ (2.*(XABUO-XBENTR*XENTR_DRY)/ZW2_HALF(:)) * ZBUO_INTEG)
  755. PDETR = PDETR
  756. ELSEWHERE
  757. PENTR = PENTR
  758. PDETR = PDETR + 0.5/(XABUO)* &
  759. LOG(1.+ (2.*(XABUO)/ZW2_HALF(:)) * &
  760. MAX(-ZBUO_INTEG,0.))
  761. ENDWHERE
  762. ELSEWHERE
  763. ! if w**2<0 the updraft is stopped
  764. OTEST=.FALSE.
  765. PENTR = PENTR
  766. PDETR = PDETR
  767. ENDWHERE
  768. ENDWHERE
  769. PENTR = XENTR_DRY*PENTR/(PZZ(:,KK+1)-PZZ(:,KK))
  770. PDETR = XDETR_DRY*PDETR/(PZZ(:,KK+1)-PZZ(:,KK))
  771. PDETR = MAX(ZPART_DRY(:)*XDETR_LUP/(PLUP-0.5*(PZZ(:,KK)+PZZ(:,KK+1))),PDETR)
  772. ! compute final value of critical mixed fraction using theta_v
  773. ! of mixture, grid-scale and updraft in cloud
  774. WHERE ((OTEST).AND.(OTESTLCL))
  775. ZKIC(:) = MAX(0.,ZTHV_UP(:)-PTHVM(:,KK))*ZKIC(:) / &
  776. (ZTHV_UP(:)-ZTHVMIX_1(:)+1.E-10)
  777. ZKIC(:) = MAX(0., MIN(1., ZKIC(:)))
  778. ZEPSI(:) = ZKIC(:) **2.
  779. ZDELTA(:) = (1.-ZKIC(:))**2.
  780. ZEPSI_CLOUD=MIN(ZDELTA,ZEPSI)
  781. ZCOEFFMF_CLOUD(:)=XENTR_MF * XG / XCRAD_MF
  782. PENTR(:) = ZCOEFFMF_CLOUD(:)*ZEPSI_CLOUD(:)
  783. PDETR(:) = ZCOEFFMF_CLOUD(:)*ZDELTA(:)
  784. ENDWHERE
  785. ! compute final value of critical mixed fraction using theta_v
  786. ! of mixture, grid-scale and updraft in cloud
  787. WHERE (((OTEST).AND.(.NOT.(OTESTLCL))).AND.((GTEST_LOCAL_LCL(:).OR.GTEST_LOCAL_LCL2(:))))
  788. ZKIC(:) = MAX(0.,ZTHV_UP_F2(:)-ZTHV_PLUS_HALF)*ZKIC(:) / &
  789. (ZTHV_UP_F2(:)-ZTHVMIX_2(:)+1.E-10)
  790. ZKIC(:) = MAX(0., MIN(1., ZKIC(:)))
  791. ZEPSI(:) = ZKIC(:) **2.
  792. ZDELTA(:) = (1.-ZKIC(:))**2.
  793. ZEPSI_CLOUD=MIN(ZDELTA,ZEPSI)
  794. ZCOEFFMF_CLOUD(:)=XENTR_MF * XG / XCRAD_MF
  795. PENTR(:) = PENTR+(1.-ZPART_DRY(:))*ZCOEFFMF_CLOUD(:)*ZEPSI_CLOUD(:)
  796. PDETR(:) = PDETR+(1.-ZPART_DRY(:))*ZCOEFFMF_CLOUD(:)*ZDELTA(:)
  797. ENDWHERE
  798. END SUBROUTINE COMPUTE_ENTR_DETR
  799. ! #################################################################
  800. SUBROUTINE COMPUTE_FUNCTION_THERMO_MF( KRR,KRRL,KRRI, &
  801. PTH, PR, PEXN, PPABS, &
  802. PT,PLVOCPEXN,PLSOCPEXN, &
  803. PAMOIST,PATHETA )
  804. ! #################################################################
  805. !
  806. !!
  807. !!**** *COMPUTE_FUNCTION_THERMO_MF* -
  808. !!
  809. !!
  810. !! --------------------------------------------------------------------------
  811. !
  812. !
  813. IMPLICIT NONE
  814. !
  815. !
  816. !* 0.1 declarations of arguments
  817. !
  818. INTEGER, INTENT(IN) :: KRR ! number of moist var.
  819. INTEGER, INTENT(IN) :: KRRL ! number of liquid water var.
  820. INTEGER, INTENT(IN) :: KRRI ! number of ice water var.
  821. REAL, DIMENSION(:,:,:), INTENT(IN) :: PTH ! theta
  822. REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PR ! water species
  823. REAL, DIMENSION(:,:,:) , INTENT(IN) :: PPABS,PEXN ! pressure, Exner funct.
  824. REAL, DIMENSION(:,:,:), INTENT(OUT) :: PT ! temperature
  825. REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLVOCPEXN,PLSOCPEXN ! L/(cp*Pi)
  826. REAL, DIMENSION(:,:,:), INTENT(OUT) :: PAMOIST,PATHETA
  827. !
  828. !-------------------------------------------------------------------------------
  829. !
  830. !* 0.2 Declarations of local variables
  831. !
  832. REAL :: ZEPS ! XMV / XMD
  833. REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: &
  834. ZCP, & ! Cp
  835. ZE, & ! Saturation mixing ratio
  836. ZDEDT, & ! Saturation mixing ratio derivative
  837. ZFRAC_ICE, & ! Ice fraction
  838. ZAMOIST_W, & ! Coefficients for s = f (Thetal,Rnp)
  839. ZATHETA_W, & !
  840. ZAMOIST_I, & !
  841. ZATHETA_I !
  842. INTEGER :: JRR
  843. !
  844. !-------------------------------------------------------------------------------
  845. !
  846. ZEPS = XMV / XMD
  847. PLVOCPEXN(:,:,:) = 0.
  848. PLSOCPEXN(:,:,:) = 0.
  849. PAMOIST(:,:,:) = 0.
  850. PATHETA(:,:,:) = 0.
  851. ZFRAC_ICE(:,:,:) = 0.0
  852. !
  853. !* Cph
  854. !
  855. ZCP=XCPD
  856. IF (KRR > 0) ZCP(:,:,:) = ZCP(:,:,:) + XCPV * PR(:,:,:,1)
  857. DO JRR = 2,1+KRRL ! loop on the liquid components
  858. ZCP(:,:,:) = ZCP(:,:,:) + XCL * PR(:,:,:,JRR)
  859. END DO
  860. DO JRR = 2+KRRL,1+KRRL+KRRI ! loop on the solid components
  861. ZCP(:,:,:) = ZCP(:,:,:) + XCI * PR(:,:,:,JRR)
  862. END DO
  863. !* Temperature
  864. !
  865. PT(:,:,:) = PTH(:,:,:) * PEXN(:,:,:)
  866. !
  867. !
  868. !! Liquid water
  869. !
  870. IF ( KRRL >= 1 ) THEN
  871. !
  872. !* Lv/Cph
  873. !
  874. PLVOCPEXN(:,:,:) = (XLVTT + (XCPV-XCL) * (PT(:,:,:)-XTT) ) / ZCP(:,:,:)
  875. !
  876. !* Saturation vapor pressure with respect to water
  877. !
  878. ZE(:,:,:) = EXP( XALPW - XBETAW/PT(:,:,:) - XGAMW*ALOG( PT(:,:,:) ) )
  879. !
  880. !* Saturation mixing ratio with respect to water
  881. !
  882. ZE(:,:,:) = ZE(:,:,:) * ZEPS / ( PPABS(:,:,:) - ZE(:,:,:) )
  883. !
  884. !* Compute the saturation mixing ratio derivative (rvs')
  885. !
  886. ZDEDT(:,:,:) = ( XBETAW / PT(:,:,:) - XGAMW ) / PT(:,:,:) &
  887. * ZE(:,:,:) * ( 1. + ZE(:,:,:) / ZEPS )
  888. !
  889. !* Compute Amoist
  890. !
  891. ZAMOIST_W(:,:,:)= 0.5 / ( 1.0 + ZDEDT(:,:,:) * PLVOCPEXN(:,:,:) )
  892. !
  893. !* Compute Atheta
  894. !
  895. ZATHETA_W(:,:,:)= ZAMOIST_W(:,:,:) * PEXN(:,:,:) * &
  896. ( ( ZE(:,:,:) - PR(:,:,:,1) ) * PLVOCPEXN(:,:,:) / &
  897. ( 1. + ZDEDT(:,:,:) * PLVOCPEXN(:,:,:) ) * &
  898. ( &
  899. ZE(:,:,:) * (1. + ZE(:,:,:)/ZEPS) &
  900. * ( -2.*XBETAW/PT(:,:,:) + XGAMW ) / PT(:,:,:)**2 &
  901. +ZDEDT(:,:,:) * (1. + 2. * ZE(:,:,:)/ZEPS) &
  902. * ( XBETAW/PT(:,:,:) - XGAMW ) / PT(:,:,:) &
  903. ) &
  904. - ZDEDT(:,:,:) &
  905. )
  906. !
  907. !! Solid water
  908. !
  909. IF ( KRRI >= 1 ) THEN
  910. !
  911. !* Fraction of ice
  912. !
  913. WHERE(PR(:,:,:,2)+PR(:,:,:,4)>0.0)
  914. ZFRAC_ICE(:,:,:) = PR(:,:,:,4) / ( PR(:,:,:,2)+PR(:,:,:,4) )
  915. END WHERE
  916. !
  917. !* Ls/Cph
  918. !
  919. PLSOCPEXN(:,:,:) = (XLSTT + (XCPV-XCI) * (PT(:,:,:)-XTT) ) / ZCP(:,:,:)
  920. !
  921. !* Saturation vapor pressure with respect to ice
  922. !
  923. ZE(:,:,:) = EXP( XALPI - XBETAI/PT(:,:,:) - XGAMI*ALOG( PT(:,:,:) ) )
  924. !
  925. !* Saturation mixing ratio with respect to ice
  926. !
  927. ZE(:,:,:) = ZE(:,:,:) * ZEPS / ( PPABS(:,:,:) - ZE(:,:,:) )
  928. !
  929. !* Compute the saturation mixing ratio derivative (rvs')
  930. !
  931. ZDEDT(:,:,:) = ( XBETAI / PT(:,:,:) - XGAMI ) / PT(:,:,:) &
  932. * ZE(:,:,:) * ( 1. + ZE(:,:,:) / ZEPS )
  933. !
  934. !* Compute Amoist
  935. !
  936. ZAMOIST_I(:,:,:)= 0.5 / ( 1.0 + ZDEDT(:,:,:) * PLSOCPEXN(:,:,:) )
  937. !
  938. !* Compute Atheta
  939. !
  940. ZATHETA_I(:,:,:)= ZAMOIST_I(:,:,:) * PEXN(:,:,:) * &
  941. ( ( ZE(:,:,:) - PR(:,:,:,1) ) * PLSOCPEXN(:,:,:) / &
  942. ( 1. + ZDEDT(:,:,:) * PLSOCPEXN(:,:,:) ) * &
  943. ( &
  944. ZE(:,:,:) * (1. + ZE(:,:,:)/ZEPS) &
  945. * ( -2.*XBETAI/PT(:,:,:) + XGAMI ) / PT(:,:,:)**2 &
  946. +ZDEDT(:,:,:) * (1. + 2. * ZE(:,:,:)/ZEPS) &
  947. * ( XBETAI/PT(:,:,:) - XGAMI ) / PT(:,:,:) &
  948. ) &
  949. - ZDEDT(:,:,:) &
  950. )
  951. ENDIF
  952. PAMOIST(:,:,:) = (1.0-ZFRAC_ICE(:,:,:))*ZAMOIST_W(:,:,:) &
  953. +ZFRAC_ICE(:,:,:) *ZAMOIST_I(:,:,:)
  954. PATHETA(:,:,:) = (1.0-ZFRAC_ICE(:,:,:))*ZATHETA_W(:,:,:) &
  955. +ZFRAC_ICE(:,:,:) *ZATHETA_I(:,:,:)
  956. !
  957. !* Lv/Cph/Exner and Ls/Cph/Exner
  958. !
  959. PLVOCPEXN(:,:,:) = PLVOCPEXN(:,:,:) / PEXN(:,:,:)
  960. PLSOCPEXN(:,:,:) = PLSOCPEXN(:,:,:) / PEXN(:,:,:)
  961. !
  962. ENDIF
  963. END SUBROUTINE COMPUTE_FUNCTION_THERMO_MF
  964. !
  965. ! #################################################################
  966. SUBROUTINE COMPUTE_UPDRAFT(OMIXUV,PZZ,PDZZ,KK, &
  967. PSFTH,PSFRV, &
  968. PPABSM,PRHODREF,PUM,PVM, PTKEM, &
  969. PTHM,PRVM,PRCM,PRIM,PTHLM,PRTM, &
  970. PTHL_UP,PRT_UP, &
  971. PRV_UP,PRC_UP,PRI_UP,PTHV_UP, &
  972. PW_UP,PU_UP, PV_UP, &
  973. PFRAC_UP,PEMF,PDETR,PENTR, &
  974. KKLCL,KKETL,KKCTL)
  975. ! #################################################################
  976. !!
  977. !!**** *COMPUTE_UPDRAFT* - calculates caracteristics of the updraft
  978. !!
  979. !! --------------------------------------------------------------------------
  980. IMPLICIT NONE
  981. !* 1.1 Declaration of Arguments
  982. !
  983. !
  984. !
  985. LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum
  986. REAL, DIMENSION(:,:), INTENT(IN) :: PZZ ! Height at the flux point
  987. REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Metrics coefficient
  988. INTEGER, INTENT(IN) :: KK
  989. REAL, DIMENSION(:), INTENT(IN) :: PSFTH,PSFRV
  990. ! normal surface fluxes of theta,rv,(u,v) parallel to the orography
  991. !
  992. REAL, DIMENSION(:,:), INTENT(IN) :: PPABSM ! Pressure at t-dt
  993. REAL, DIMENSION(:,:), INTENT(IN) :: PRHODREF ! dry density of the
  994. ! reference state
  995. REAL, DIMENSION(:,:), INTENT(IN) :: PUM ! u mean wind
  996. REAL, DIMENSION(:,:), INTENT(IN) :: PVM ! v mean wind
  997. REAL, DIMENSION(:,:), INTENT(IN) :: PTKEM ! TKE at t-dt
  998. !
  999. REAL, DIMENSION(:,:), INTENT(IN) :: PTHM ! liquid pot. temp. at t-dt
  1000. REAL, DIMENSION(:,:), INTENT(IN) :: PRVM,PRCM,PRIM ! vapor mixing ratio at t-dt
  1001. REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM,PRTM ! cons. var. at t-dt
  1002. REAL, DIMENSION(:,:), INTENT(OUT) :: PTHL_UP,PRT_UP ! updraft properties
  1003. REAL, DIMENSION(:,:), INTENT(OUT) :: PU_UP, PV_UP ! updraft wind components
  1004. REAL, DIMENSION(:,:), INTENT(OUT) :: PRV_UP,PRC_UP, & ! updraft rv, rc
  1005. PRI_UP,PTHV_UP,& ! updraft ri, THv
  1006. PW_UP,PFRAC_UP ! updraft w, fraction
  1007. REAL, DIMENSION(:,:), INTENT(OUT) :: PEMF,PDETR,PENTR ! Mass_flux,
  1008. ! detrainment,entrainment
  1009. INTEGER, DIMENSION(:), INTENT(OUT) :: KKLCL,KKETL,KKCTL! LCL, ETL, CTL
  1010. ! 1.2 Declaration of local variables
  1011. !
  1012. !
  1013. ! Mean environment variables at t-dt at flux point
  1014. REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: &
  1015. ZTHM_F,ZRVM_F,ZRCM_F,ZRIM_F ! Theta,rv,rl,ri of
  1016. ! updraft environnement
  1017. REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: &
  1018. ZRTM_F, ZTHLM_F, ZTKEM_F,& ! rt, thetal,TKE,pressure,
  1019. ZUM_F,ZVM_F,ZRHO_F, & ! density,momentum
  1020. ZPRES_F,ZTHVM_F,ZTHVM, & ! interpolated at the flux point
  1021. ZG_O_THVREF, & ! g*ThetaV ref
  1022. ZW_UP2 ! w**2 of the updraft
  1023. REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: &
  1024. ZTH_UP, & ! updraft THETA
  1025. ZFRAC_ICE ! Ice fraction
  1026. REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZCOEF ! diminution coefficient for too high clouds
  1027. REAL, DIMENSION(SIZE(PSFTH,1) ) :: ZWTHVSURF ! Surface w'thetav'
  1028. CHARACTER(LEN=1) :: YFRAC_ICE ! Ice Fraction
  1029. ! precribed or computed
  1030. REAL :: ZRDORV ! RD/RV
  1031. REAL :: ZRVORD ! RV/RD
  1032. REAL, DIMENSION(SIZE(PTHM,1)) :: ZMIX1,ZMIX2,ZMIX3
  1033. REAL, DIMENSION(SIZE(PTHM,1)) :: ZBUO_INTEG ! Integrated Buoyancy
  1034. REAL, DIMENSION(SIZE(PTHM,1)) :: ZLUP ! Upward Mixing length from the ground
  1035. REAL, DIMENSION(SIZE(PTHM,1)) :: ZDEPTH ! Deepness limit for cloud
  1036. INTEGER :: IKB,IKE ! index value for the Beginning and the End
  1037. ! of the physical domain for the mass points
  1038. INTEGER :: IKU ! array size in k
  1039. INTEGER :: JK,JI,JSV ! loop counters
  1040. LOGICAL, DIMENSION(SIZE(PTHM,1)) :: GTEST,GTESTLCL,GTESTETL
  1041. ! Test if the ascent continue, if LCL or ETL is reached
  1042. LOGICAL :: GLMIX
  1043. ! To choose upward or downward mixing length
  1044. LOGICAL, DIMENSION(SIZE(PTHM,1)) :: GWORK1
  1045. LOGICAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: GWORK2
  1046. INTEGER :: ITEST
  1047. REAL :: ZTMAX,ZRMAX ! control value
  1048. ! Thresholds for the perturbation of
  1049. ! theta_l and r_t at the first level of the updraft
  1050. ZTMAX=2.0
  1051. ZRMAX=1.E-3
  1052. !------------------------------------------------------------------------
  1053. ! INITIALISATION
  1054. ! Local variables, internal domain
  1055. ! Internal Domain
  1056. IKU=SIZE(PTHM,2)
  1057. IKB=1 ! modif WRF JP
  1058. IKE=IKU-1 ! modif WRF JP
  1059. ! Initialisation of intersesting Level :LCL,ETL,CTL
  1060. KKLCL(:)=IKE
  1061. KKETL(:)=IKE
  1062. KKCTL(:)=IKE
  1063. !
  1064. ! Initialisation
  1065. PRV_UP(:,:)=0.
  1066. PRC_UP(:,:)=0.
  1067. PW_UP(:,:)=0.
  1068. PEMF(:,:)=0.
  1069. PDETR(:,:)=0.
  1070. PENTR(:,:)=0.
  1071. ZTH_UP(:,:)=0.
  1072. PFRAC_UP(:,:)=0.
  1073. PTHV_UP(:,:)=0.
  1074. !no ice cloud coded yet
  1075. PRI_UP(:,:)=0.
  1076. ZFRAC_ICE(:,:)=0.
  1077. YFRAC_ICE='T'
  1078. ZBUO_INTEG=0.
  1079. ! Initialisation of the constants
  1080. ZRDORV = XRD / XRV !=0.622
  1081. ZRVORD = (XRV / XRD)
  1082. ! Initialisation of environment variables at t-dt
  1083. ! variables at flux level
  1084. ZTHM_F (:,IKB+1:IKU) = 0.5*(PTHM(:,IKB:IKU-1)+PTHM(:,IKB+1:IKU))
  1085. ZTHLM_F(:,IKB+1:IKU) = 0.5*(PTHLM(:,IKB:IKU-1)+PTHLM(:,IKB+1:IKU))
  1086. ZRTM_F (:,IKB+1:IKU) = 0.5*(PRTM(:,IKB:IKU-1)+PRTM(:,IKB+1:IKU))
  1087. ZTKEM_F(:,IKB+1:IKU) = 0.5*(PTKEM(:,IKB:IKU-1)+PTKEM(:,IKB+1:IKU))
  1088. ZPRES_F(:,IKB+1:IKU) = 0.5*(PPABSM(:,IKB:IKU-1)+PPABSM(:,IKB+1:IKU))
  1089. ZRHO_F (:,IKB+1:IKU) = 0.5*(PRHODREF(:,IKB:IKU-1)+PRHODREF(:,IKB+1:IKU))
  1090. ZRVM_F (:,IKB+1:IKU) = 0.5*(PRVM(:,IKB:IKU-1)+PRVM(:,IKB+1:IKU))
  1091. ZUM_F (:,IKB+1:IKU) = 0.5*(PUM(:,IKB:IKU-1)+PUM(:,IKB+1:IKU))
  1092. ZVM_F (:,IKB+1:IKU) = 0.5*(PVM(:,IKB:IKU-1)+PVM(:,IKB+1:IKU))
  1093. ZTHM_F (:,IKB) = PTHM(:,IKB)
  1094. ZTHLM_F(:,IKB) = PTHLM(:,IKB)
  1095. ZRTM_F (:,IKB) = PRTM (:,IKB)
  1096. ZTKEM_F(:,IKB) = PTKEM(:,IKB)
  1097. ZPRES_F(:,IKB) = PPABSM(:,IKB)
  1098. ZRHO_F(:,IKB) = PRHODREF(:,IKB)
  1099. ZRVM_F(:,IKB) = PRVM(:,IKB)
  1100. ZUM_F(:,IKB) = PUM(:,IKB)
  1101. ZVM_F(:,IKB) = PVM(:,IKB)
  1102. ! thetav at mass and flux levels
  1103. ZTHVM_F(:,:)=ZTHM_F(:,:)*((1.+ZRVORD*ZRVM_F(:,:))/(1.+ZRTM_F(:,:)))
  1104. ZTHVM(:,:)=PTHM(:,:)*((1.+ZRVORD*PRVM(:,:))/(1.+PRTM(:,:)))
  1105. !
  1106. ! Initialisation of updraft characteristics
  1107. PTHL_UP(:,:)=ZTHLM_F(:,:)
  1108. PRT_UP(:,:)=ZRTM_F(:,:)
  1109. ZW_UP2(:,:)=0.
  1110. PTHV_UP(:,:)=ZTHVM_F(:,:)
  1111. PU_UP(:,:)=ZUM_F(:,:)
  1112. PV_UP(:,:)=ZVM_F(:,:)
  1113. ! Computation or initialisation of updraft characteristics at the KK level
  1114. ! thetal_up,rt_up,thetaV_up, w²,Buoyancy term and mass flux (PEMF)
  1115. ! 03/2009
  1116. !PTHL_UP(:,KK)= ZTHLM_F(:,KK)+(PSFTH(:)/SQRT(ZTKEM_F(:,KK)))*XALP_PERT
  1117. !PRT_UP(:,KK) = ZRTM_F(:,KK)+(PSFRV(:)/SQRT(ZTKEM_F(:,KK)))*XALP_PERT
  1118. PTHL_UP(:,KK)= ZTHLM_F(:,KK)+MAX(0.,MIN(ZTMAX,(PSFTH(:)/SQRT(ZTKEM_F(:,KK)))*XALP_PERT))
  1119. PRT_UP(:,KK) = ZRTM_F(:,KK)+MAX(0.,MIN(ZRMAX,(PSFRV(:)/SQRT(ZTKEM_F(:,KK)))*XALP_PERT))
  1120. ZW_UP2(:,KK) = MAX(0.0001,(2./3.)*ZTKEM_F(:,KK))
  1121. ! Computation of non conservative variable for the KK level of the updraft
  1122. ! (all or nothing ajustement)
  1123. CALL TH_R_FROM_THL_RT_2D(YFRAC_ICE,ZFRAC_ICE(:,KK:KK),ZPRES_F(:,KK:KK), &
  1124. PTHL_UP(:,KK:KK),PRT_UP(:,KK:KK),ZTH_UP(:,KK:KK), &
  1125. PRV_UP(:,KK:KK),PRC_UP(:,KK:KK),PRI_UP(:,KK:KK))
  1126. ! compute updraft thevav and buoyancy term at KK level
  1127. PTHV_UP(:,KK) = ZTH_UP(:,KK)*((1+ZRVORD*PRV_UP(:,KK))/(1+PRT_UP(:,KK)))
  1128. ! Closure assumption for mass flux at KK level
  1129. ZG_O_THVREF=XG/ZTHVM_F
  1130. ! compute L_up
  1131. GLMIX=.TRUE.
  1132. ZTKEM_F(:,KK)=0.
  1133. CALL COMPUTE_BL89_ML(PDZZ,ZTKEM_F,ZG_O_THVREF,ZTHVM_F,KK,GLMIX,ZLUP)
  1134. ZLUP(:)=MAX(ZLUP(:),1.E-10)
  1135. ! Compute Buoyancy flux at the ground
  1136. ZWTHVSURF(:) = (ZTHVM_F(:,IKB)/ZTHM_F(:,IKB))*PSFTH(:)+ &
  1137. (0.61*ZTHM_F(:,IKB))*PSFRV(:)
  1138. ! Mass flux at KK level (updraft triggered if PSFTH>0.)
  1139. WHERE (ZWTHVSURF(:)>0.)
  1140. PEMF(:,KK) = XCMF * ZRHO_F(:,KK) * ((ZG_O_THVREF(:,KK))*ZWTHVSURF*ZLUP)**(1./3.)
  1141. PFRAC_UP(:,KK)=MIN(PEMF(:,KK)/(SQRT(ZW_UP2(:,KK))*ZRHO_F(:,KK)),XFRAC_UP_MAX)
  1142. ZW_UP2(:,KK)=(PEMF(:,KK)/(PFRAC_UP(:,KK)*ZRHO_F(:,KK)))**2
  1143. GTEST(:)=.TRUE.
  1144. ELSEWHERE
  1145. PEMF(:,KK) =0.
  1146. GTEST(:)=.FALSE.
  1147. ENDWHERE
  1148. !--------------------------------------------------------------------------
  1149. ! 3. Iteration
  1150. ! ---------
  1151. !
  1152. ! If GTEST = T the updraft starts from the KK level and stops when GTEST becomes F
  1153. !
  1154. !
  1155. GTESTLCL(:)=.FALSE.
  1156. GTESTETL(:)=.FALSE.
  1157. ! Loop on vertical level
  1158. DO JK=KK,IKE-1
  1159. ! IF the updraft top is reached for all column, stop the loop on levels
  1160. ITEST=COUNT(GTEST)
  1161. IF (ITEST==0) CYCLE
  1162. ! Computation of entrainment and detrainment with KF90
  1163. ! parameterization in clouds and LR01 in subcloud layer
  1164. ! to find the LCL (check if JK is LCL or not)
  1165. WHERE(GTEST)
  1166. WHERE ((PRC_UP(:,JK)>0.).AND.(.NOT.(GTESTLCL)))
  1167. KKLCL(:) = JK
  1168. GTESTLCL(:)=.TRUE.
  1169. ENDWHERE
  1170. ENDWHERE
  1171. ! COMPUTE PENTR and PDETR at mass level JK
  1172. CALL COMPUTE_ENTR_DETR(GTEST,GTESTLCL,YFRAC_ICE,ZFRAC_ICE(:,JK),JK,&
  1173. PPABSM(:,:),PZZ(:,:),PDZZ(:,:),ZTHVM(:,:),&
  1174. PTHLM(:,JK),PRTM(:,JK),ZW_UP2(:,:), &
  1175. PTHL_UP(:,JK),PRT_UP(:,JK),ZLUP(:), &
  1176. PENTR(:,JK),PDETR(:,JK),ZBUO_INTEG)
  1177. IF (JK==KK) THEN
  1178. PDETR(:,JK)=0.
  1179. ENDIF
  1180. ! Computation of updraft characteristics at level JK+1
  1181. WHERE(GTEST)
  1182. ZMIX1(:)=0.5*(PZZ(:,JK+1)-PZZ(:,JK))*(PENTR(:,JK)-PDETR(:,JK))
  1183. PEMF(:,JK+1)=PEMF(:,JK)*EXP(2*ZMIX1(:))
  1184. ENDWHERE
  1185. ! stop the updraft if MF becomes negative
  1186. WHERE (GTEST.AND.(PEMF(:,JK+1)<=0.))
  1187. PEMF(:,JK+1)=0.
  1188. GTEST(:)=.FALSE.
  1189. KKCTL(:) = JK+1
  1190. ENDWHERE
  1191. ! If the updraft did not stop, compute cons updraft characteritics at jk+1
  1192. WHERE(GTEST)
  1193. ZMIX2(:) = (PZZ(:,JK+1)-PZZ(:,JK))*PENTR(:,JK) !&
  1194. ZMIX3(:) = (PZZ(:,JK+1)-PZZ(:,JK))*PDETR(:,JK) !&
  1195. PTHL_UP(:,JK+1) = (PTHL_UP(:,JK)*(1.-0.5*ZMIX2(:)) + PTHLM(:,JK)*ZMIX2(:)) &
  1196. /(1.+0.5*ZMIX2(:))
  1197. PRT_UP(:,JK+1) = (PRT_UP (:,JK)*(1.-0.5*ZMIX2(:)) + PRTM(:,JK)*ZMIX2(:)) &
  1198. /(1.+0.5*ZMIX2(:))
  1199. ENDWHERE
  1200. IF(OMIXUV) THEN
  1201. WHERE(GTEST)
  1202. PU_UP(:,JK+1) = (PU_UP (:,JK)*(1-0.5*ZMIX2(:)) + PUM(:,JK)*ZMIX2(:)+ &
  1203. 0.5*XPRES_UV*(PZZ(:,JK+1)-PZZ(:,JK))*&
  1204. ((PUM(:,JK+1)-PUM(:,JK))/PDZZ(:,JK+1)+&
  1205. (PUM(:,JK)-PUM(:,JK-1))/PDZZ(:,JK)) ) &
  1206. /(1+0.5*ZMIX2(:))
  1207. PV_UP(:,JK+1) = (PV_UP (:,JK)*(1-0.5*ZMIX2(:)) + PVM(:,JK)*ZMIX2(:)+ &
  1208. 0.5*XPRES_UV*(PZZ(:,JK+1)-PZZ(:,JK))*&
  1209. ((PVM(:,JK+1)-PVM(:,JK))/PDZZ(:,JK+1)+&
  1210. (PVM(:,JK)-PVM(:,JK-1))/PDZZ(:,JK)) ) &
  1211. /(1+0.5*ZMIX2(:))
  1212. ENDWHERE
  1213. ENDIF
  1214. ! Compute non cons. var. at level JK+1
  1215. CALL TH_R_FROM_THL_RT_2D(YFRAC_ICE,ZFRAC_ICE(:,JK+1:JK+1),ZPRES_F(:,JK+1:JK+1), &
  1216. PTHL_UP(:,JK+1:JK+1),PRT_UP(:,JK+1:JK+1),ZTH_UP(:,JK+1:JK+1), &
  1217. PRV_UP(:,JK+1:JK+1),PRC_UP(:,JK+1:JK+1),PRI_UP(:,JK+1:JK+1))
  1218. ! Compute the updraft theta_v, buoyancy and w**2 for level JK+1
  1219. WHERE(GTEST)
  1220. PTHV_UP(:,JK+1) = ZTH_UP(:,JK+1)*((1+ZRVORD*PRV_UP(:,JK+1))/(1+PRT_UP(:,JK+1)))
  1221. WHERE (.NOT.(GTESTLCL))
  1222. WHERE (ZBUO_INTEG(:)>0.)
  1223. ZW_UP2(:,JK+1) = ZW_UP2(:,JK) + 2.*(XABUO-XBENTR*XENTR_DRY)* ZBUO_INTEG(:)
  1224. ENDWHERE
  1225. WHERE (ZBUO_INTEG(:)<=0.)
  1226. ZW_UP2(:,JK+1) = ZW_UP2(:,JK) + 2.*XABUO* ZBUO_INTEG(:)
  1227. ENDWHERE
  1228. ENDWHERE
  1229. WHERE (GTESTLCL)
  1230. ZW_UP2(:,JK+1) = ZW_UP2(:,JK)*(1.-(XBDETR*ZMIX3(:)+XBENTR*ZMIX2(:)))&
  1231. /(1.+(XBDETR*ZMIX3(:)+XBENTR*ZMIX2(:))) &
  1232. +2.*(XABUO)*ZBUO_INTEG/(1.+(XBDETR*ZMIX3(:)+XBENTR*ZMIX2(:)))
  1233. ENDWHERE
  1234. ENDWHERE
  1235. ! Test if the updraft has reach the ETL
  1236. GTESTETL(:)=.FALSE.
  1237. WHERE (GTEST.AND.(ZBUO_INTEG(:)<=0.))
  1238. KKETL(:) = JK+1
  1239. GTESTETL(:)=.TRUE.
  1240. ENDWHERE
  1241. ! Test is we have reached the top of the updraft
  1242. WHERE (GTEST.AND.((ZW_UP2(:,JK+1)<=0.).OR.(PEMF(:,JK+1)<=0.)))
  1243. ZW_UP2(:,JK+1)=0.
  1244. PEMF(:,JK+1)=0.
  1245. GTEST(:)=.FALSE.
  1246. PTHL_UP(:,JK+1)=ZTHLM_F(:,JK+1)
  1247. PRT_UP(:,JK+1)=ZRTM_F(:,JK+1)
  1248. PRC_UP(:,JK+1)=0.
  1249. PRV_UP(:,JK+1)=0.
  1250. PTHV_UP(:,JK+1)=ZTHVM_F(:,JK+1)
  1251. PFRAC_UP(:,JK+1)=0.
  1252. KKCTL(:)=JK+1
  1253. ENDWHERE
  1254. ! compute frac_up at JK+1
  1255. WHERE (GTEST)
  1256. PFRAC_UP(:,JK+1)=PEMF(:,JK+1)/(SQRT(ZW_UP2(:,JK+1))*ZRHO_F(:,JK+1))
  1257. ENDWHERE
  1258. ! Updraft fraction must be smaller than XFRAC_UP_MAX
  1259. WHERE (GTEST)
  1260. PFRAC_UP(:,JK+1)=MIN(XFRAC_UP_MAX,PFRAC_UP(:,JK+1))
  1261. ENDWHERE
  1262. ! When cloudy and non-buoyant, updraft fraction must decrease
  1263. WHERE ((GTEST.AND.GTESTETL).AND.GTESTLCL)
  1264. PFRAC_UP(:,JK+1)=MIN(PFRAC_UP(:,JK+1),PFRAC_UP(:,JK))
  1265. ENDWHERE
  1266. ! Mass flux is updated with the new updraft fraction
  1267. PEMF(:,JK+1)=PFRAC_UP(:,JK+1)*SQRT(ZW_UP2(:,JK+1))*ZRHO_F(:,JK+1)
  1268. ENDDO
  1269. PW_UP(:,:)=SQRT(ZW_UP2(:,:))
  1270. PEMF(:,KK) =0.
  1271. PEMF(:,IKU)=0. ! modif WRF JP
  1272. PFRAC_UP(:,IKU)=0.
  1273. DO JI=1,SIZE(PTHM,1)
  1274. ZDEPTH(JI) = (PZZ(JI,KKCTL(JI)) - PZZ(JI,KKLCL(JI)) )
  1275. END DO
  1276. GWORK1(:)= (GTESTLCL(:) .AND. (ZDEPTH(:) > 3000.) )
  1277. GWORK2(:,:) = SPREAD( GWORK1(:), DIM=2, NCOPIES=IKU )
  1278. ZCOEF(:,:) = SPREAD( (1.-(ZDEPTH(:)-3000.)/1000.), DIM=2, NCOPIES=IKU)
  1279. ZCOEF=MIN(MAX(ZCOEF,0.),1.)
  1280. WHERE (GWORK2)
  1281. PEMF(:,:) = PEMF(:,:) * ZCOEF(:,:)
  1282. PFRAC_UP(:,:) = PFRAC_UP(:,:) * ZCOEF(:,:)
  1283. ENDWHERE
  1284. END SUBROUTINE COMPUTE_UPDRAFT
  1285. ! #################################################################
  1286. SUBROUTINE MF_TURB(OMIXUV, PIMPL, PTSTEP, &
  1287. PTSTEP_MET, PDZZ, &
  1288. PRHODJ, &
  1289. PTHLM,PTHVM,PRTM,PUM,PVM, &
  1290. PTHLDT,PRTDT,PUDT,PVDT, &
  1291. PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP, &
  1292. PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF )
  1293. ! #################################################################
  1294. !
  1295. !
  1296. !!**** *MF_TURB* - computes the MF_turbulent source terms for the prognostic
  1297. !! variables.
  1298. !!
  1299. !! --------------------------------------------------------------------------
  1300. !
  1301. !
  1302. IMPLICIT NONE
  1303. !
  1304. !
  1305. !* 0.1 declarations of arguments
  1306. !
  1307. !
  1308. LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum
  1309. REAL, INTENT(IN) :: PIMPL ! degree of implicitness
  1310. REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep
  1311. REAL, INTENT(IN) :: PTSTEP_MET! Timestep for meteorological variables
  1312. !
  1313. REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficients
  1314. REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size
  1315. ! Conservative var. at t-dt
  1316. REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! conservative pot. temp.
  1317. REAL, DIMENSION(:,:,:), INTENT(IN) :: PRTM ! water var. where
  1318. ! Virtual potential temperature at t-dt
  1319. REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVM
  1320. ! Momentum at t-dt
  1321. REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM
  1322. REAL, DIMENSION(:,:,:), INTENT(IN) :: PVM
  1323. !
  1324. ! Tendencies of conservative variables
  1325. REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHLDT
  1326. REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRTDT
  1327. ! Tendencies of momentum
  1328. REAL, DIMENSION(:,:,:), INTENT(OUT) :: PUDT
  1329. REAL, DIMENSION(:,:,:), INTENT(OUT) :: PVDT
  1330. ! Tendencies of scalar variables
  1331. ! Updraft characteritics
  1332. REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP
  1333. ! Fluxes
  1334. REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF
  1335. !
  1336. !
  1337. !
  1338. !-------------------------------------------------------------------------------
  1339. !
  1340. ! 0.2 declaration of local variables
  1341. !
  1342. REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZVARS
  1343. !
  1344. !----------------------------------------------------------------------------
  1345. !
  1346. !* 1.PRELIMINARIES
  1347. ! -------------
  1348. !
  1349. !
  1350. !
  1351. PFLXZTHMF = 0.
  1352. PFLXZRMF = 0.
  1353. PFLXZTHVMF = 0.
  1354. PFLXZUMF = 0.
  1355. PFLXZVMF = 0.
  1356. PTHLDT = 0.
  1357. PRTDT = 0.
  1358. PUDT = 0.
  1359. PVDT = 0.
  1360. !
  1361. !----------------------------------------------------------------------------
  1362. !
  1363. !* 2. COMPUTE THE MEAN FLUX OF CONSERVATIVE VARIABLES at time t-dt
  1364. ! (equation (3) of Soares et al)
  1365. ! + THE MEAN FLUX OF THETA_V (buoyancy flux)
  1366. ! -----------------------------------------------
  1367. ! ( Resulting fluxes are in flux level (w-point) as PEMF and PTHL_UP )
  1368. !
  1369. PFLXZTHMF(:,:,:) = PEMF(:,:,:)*(PTHL_UP(:,:,:)-MZM(PTHLM(:,:,:)))
  1370. PFLXZRMF(:,:,:) = PEMF(:,:,:)*(PRT_UP(:,:,:)-MZM(PRTM(:,:,:)))
  1371. PFLXZTHVMF(:,:,:) = PEMF(:,:,:)*(PTHV_UP(:,:,:)-MZM(PTHVM(:,:,:)))
  1372. PFLXZTHVMF(:,:,:) = 9.81/PTHVM(:,:,:)* PEMF(:,:,:)*(PTHV_UP(:,:,:)-MZM(PTHVM(:,:,:))) !JP
  1373. IF (OMIXUV) THEN
  1374. PFLXZUMF(:,:,:) = PEMF(:,:,:)*(PU_UP(:,:,:)-MZM(PUM(:,:,:)))
  1375. PFLXZVMF(:,:,:) = PEMF(:,:,:)*(PV_UP(:,:,:)-MZM(PVM(:,:,:)))
  1376. ENDIF
  1377. !
  1378. !
  1379. !----------------------------------------------------------------------------
  1380. !
  1381. !* 3. COMPUTE TENDENCIES OF CONSERVATIVE VARIABLES (or treated as such...)
  1382. ! (implicit formulation)
  1383. ! --------------------------------------------
  1384. !
  1385. !
  1386. !
  1387. ! 3.1 Compute the tendency for the conservative potential temperature
  1388. ! (PDZZ and flux in w-point and PRHODJ is mass point, result in mass point)
  1389. !
  1390. CALL TRIDIAG_MASSFLUX(PTHLM,PFLXZTHMF,-PEMF,PTSTEP_MET,PIMPL, &
  1391. PDZZ,PRHODJ,ZVARS )
  1392. ! compute new flux
  1393. PFLXZTHMF(:,:,:) = PEMF(:,:,:)*(PTHL_UP(:,:,:)-MZM(ZVARS(:,:,:)))
  1394. !!! compute THL tendency
  1395. !
  1396. PTHLDT(:,:,:)= (ZVARS(:,:,:)-PTHLM(:,:,:))/PTSTEP_MET
  1397. !
  1398. ! 3.2 Compute the tendency for the conservative mixing ratio
  1399. !
  1400. CALL TRIDIAG_MASSFLUX(PRTM(:,:,:),PFLXZRMF,-PEMF,PTSTEP_MET,PIMPL, &
  1401. PDZZ,PRHODJ,ZVARS )
  1402. ! compute new flux
  1403. PFLXZRMF(:,:,:) = PEMF(:,:,:)*(PRT_UP(:,:,:)-MZM(ZVARS(:,:,:)))
  1404. !!! compute RT tendency
  1405. PRTDT(:,:,:) = (ZVARS(:,:,:)-PRTM(:,:,:))/PTSTEP_MET
  1406. !
  1407. ! 3.3 Compute the tendency for the (non conservative but treated as it) mixing ratio
  1408. !
  1409. !CALL TRIDIAG_MASSFLUX(PTHVM(:,:,:),PFLXZTHVMF,-PEMF,PTSTEP,PIMPL, &
  1410. ! PDZZ,PRHODJ,ZVARS )
  1411. ! compute new flux
  1412. !PFLXZTHVMF(:,:,:) = PEMF(:,:,:)*(PTHV_UP(:,:,:)-MZM(ZVARS(:,:,:)))
  1413. IF (OMIXUV) THEN
  1414. !
  1415. ! 3.3 Compute the tendency for the (non conservative but treated as it) zonal momentum
  1416. ! (PDZZ and flux in w-point and PRHODJ is mass point, result in mass point)
  1417. !
  1418. CALL TRIDIAG_MASSFLUX(PUM,PFLXZUMF,-PEMF,PTSTEP,PIMPL, &
  1419. PDZZ,PRHODJ,ZVARS )
  1420. ! compute new flux
  1421. PFLXZUMF(:,:,:) = PEMF(:,:,:)*(PU_UP(:,:,:)-MZM(ZVARS(:,:,:)))
  1422. ! compute U tendency
  1423. PUDT(:,:,:)= (ZVARS(:,:,:)-PUM(:,:,:))/PTSTEP_MET
  1424. !
  1425. !
  1426. ! 3.4 Compute the tendency for the (non conservative but treated as it for the time beiing)
  1427. ! meridian momentum
  1428. ! (PDZZ and flux in w-point and PRHODJ is mass point, result in mass point)
  1429. !
  1430. CALL TRIDIAG_MASSFLUX(PVM,PFLXZVMF,-PEMF,PTSTEP,PIMPL, &
  1431. PDZZ,PRHODJ,ZVARS )
  1432. ! compute new flux
  1433. PFLXZVMF(:,:,:) = PEMF(:,:,:)*(PV_UP(:,:,:)-MZM(ZVARS(:,:,:)))
  1434. ! compute V tendency
  1435. PVDT(:,:,:)= (ZVARS(:,:,:)-PVM(:,:,:))/PTSTEP_MET
  1436. ENDIF
  1437. !
  1438. END SUBROUTINE MF_TURB
  1439. FUNCTION MZM(PA) RESULT(PMZM)
  1440. !
  1441. IMPLICIT NONE
  1442. !
  1443. !* 0.1 Declarations of argument and result
  1444. ! ------------------------------------
  1445. !
  1446. REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass localization
  1447. REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZM ! result at flux localization
  1448. ! 0.2 Declarations of local variables
  1449. ! -------------------------------
  1450. !
  1451. INTEGER :: JK ! Loop index in z direction
  1452. INTEGER :: IKU ! upper bound in z direction of PA
  1453. !
  1454. IKU = SIZE(PA,3)
  1455. !DO JK=2,IKU MODIF WRF JP
  1456. DO JK=2,IKU
  1457. PMZM(:,:,JK)=0.5*(PA(:,:,JK)+PA(:,:,JK-1))
  1458. ENDDO
  1459. PMZM(:,:,1)=PA(:,:,2)
  1460. END FUNCTION MZM
  1461. !
  1462. !
  1463. ! #################################################################
  1464. SUBROUTINE TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE,PP, &
  1465. PTHL, PRT, PTH, PRV, PRL, PRI )
  1466. ! #################################################################
  1467. !
  1468. !
  1469. !!**** *TH_R_FROM_THL_RT_1D* - computes the non-conservative variables
  1470. !! from conservative variables
  1471. !!
  1472. !!
  1473. !! --------------------------------------------------------------------------
  1474. !
  1475. !
  1476. IMPLICIT NONE
  1477. !
  1478. !
  1479. !* 0.1 declarations of arguments
  1480. !
  1481. CHARACTER*1 , INTENT(IN) :: HFRAC_ICE
  1482. REAL, DIMENSION(:), INTENT(INOUT) :: PFRAC_ICE
  1483. REAL, DIMENSION(:), INTENT(IN) :: PP ! Pressure
  1484. REAL, DIMENSION(:), INTENT(IN) :: PTHL ! thetal (or thetal tendency) to
  1485. ! transform into th (or tendency)
  1486. REAL, DIMENSION(:),INTENT(IN) :: PRT ! Total mixing ratios (or tendency) to
  1487. ! transform into rv,rc and ri
  1488. ! (or its tendency)
  1489. REAL, DIMENSION(:), INTENT(OUT):: PTH ! th (or th_l tendency)
  1490. REAL, DIMENSION(:), INTENT(OUT):: PRV ! vapor mixing ratio (or its tendency)
  1491. REAL, DIMENSION(:), INTENT(OUT):: PRL ! vapor mixing ratio (or its tendency)
  1492. REAL, DIMENSION(:), INTENT(OUT):: PRI ! vapor mixing ratio (or its tendency)
  1493. !
  1494. !-------------------------------------------------------------------------------
  1495. !
  1496. ! 0.2 declaration of local variables
  1497. !
  1498. INTEGER :: II
  1499. ! Loop control
  1500. REAL :: ZCOEF
  1501. REAL, DIMENSION(SIZE(PP,1)) :: ZEXN,ZFOES,ZQVSAT
  1502. REAL, DIMENSION(SIZE(PTHL,1)) :: ZRVSAT,ZCPH,ZRLTEMP
  1503. REAL, DIMENSION(SIZE(PTHL,1)) :: ZT,ZLOVCPEXN,ZLOSCPEXN
  1504. !----------------------------------------------------------------------------
  1505. !
  1506. !* 1 Initialisation
  1507. ! --------------
  1508. !
  1509. !
  1510. ZCOEF = 0.8
  1511. PRL(:)=0.
  1512. PRI(:)=0.
  1513. ZRLTEMP(:)=0.
  1514. PRV(:)=PRT(:)
  1515. PTH(:)=PTHL(:)
  1516. ZEXN(:)=(PP(:)/XP00) ** (XRD/XCPD)
  1517. !
  1518. ! 2 Iteration
  1519. ! ---------
  1520. DO II=1,20
  1521. ZT(:)=PTH(:)*ZEXN(:)
  1522. WHERE (ZT(:) > 273.15)
  1523. ! warm cloud
  1524. ZFOES(:) = EXP( XALPW - XBETAW/ZT(:) - XGAMW*LOG(ZT(:)) )
  1525. ZQVSAT(:) = XRD/XRV*ZFOES(:)/PP(:) &
  1526. / (1.+(XRD/XRV-1.)*ZFOES(:)/PP(:))
  1527. ZRVSAT(:) = (1-ZCOEF)*ZQVSAT(:)*(1+PRT(:))+(ZCOEF)*PRV(:)
  1528. ! CALL COMPUTE_FRAC_ICE_1D(HFRAC_ICE,PFRAC_ICE,PP,ZT)
  1529. PFRAC_ICE(:)=0.
  1530. ZRLTEMP(:)=MAX(0.,PRV(:)-ZRVSAT(:))
  1531. PRV(:)=PRV(:)-ZRLTEMP(:)
  1532. PRL(:)=PRL(:)+PRI(:)+ZRLTEMP(:)
  1533. PRI(:) = PFRAC_ICE(:) * (PRL(:))
  1534. PRL(:) = (1-PFRAC_ICE(:))* (PRT(:) - PRV(:))
  1535. ! 2.1 Cph
  1536. ZCPH(:)=XCPD+ XCPV * PRV(:)+ XCL * PRL(:) + XCI * PRI(:)
  1537. ! 2.2 L/Cp/EXN
  1538. ZLOVCPEXN(:) = (XLVTT + (XCPV-XCL) * (ZT(:)-XTT)) &
  1539. /(ZCPH*ZEXN(:))
  1540. ZLOSCPEXN(:) = (XLSTT + (XCPV-XCI) * (ZT(:)-XTT)) &
  1541. /(ZCPH*ZEXN(:))
  1542. PTH(:)=PTHL(:)+ZLOVCPEXN*PRL(:)+ZLOSCPEXN(:)*PRI(:)
  1543. ELSEWHERE
  1544. ! cold shallow cloud not yet coded
  1545. ! probleme also for the highest level of fire case
  1546. PRL(:)=0.
  1547. PRI(:)=0.
  1548. PRV(:)=PRT(:)
  1549. PTH(:)=PTHL(:)
  1550. ENDWHERE
  1551. ENDDO
  1552. END SUBROUTINE TH_R_FROM_THL_RT_1D
  1553. ! #################################################################
  1554. SUBROUTINE TH_R_FROM_THL_RT_2D(HFRAC_ICE,PFRAC_ICE,PP, &
  1555. PTHL, PRT, PTH, PRV, PRL, PRI )
  1556. ! #################################################################
  1557. !
  1558. !
  1559. !!**** *TH_R_FROM_THL_RT_2D* - computes the non-conservative variables
  1560. !! from conservative variables
  1561. !!
  1562. !!
  1563. !!
  1564. !! --------------------------------------------------------------------------
  1565. !
  1566. IMPLICIT NONE
  1567. !
  1568. !
  1569. !* 0.1 declarations of arguments
  1570. !
  1571. CHARACTER*1 , INTENT(IN) :: HFRAC_ICE
  1572. REAL, DIMENSION(:,:), INTENT(INOUT) :: PFRAC_ICE
  1573. REAL, DIMENSION(:,:), INTENT(IN) :: PP ! Pressure
  1574. REAL, DIMENSION(:,:), INTENT(IN) :: PTHL ! thetal (or thetal tendency) to
  1575. ! transform into th (or tendency)
  1576. REAL, DIMENSION(:,:),INTENT(IN) :: PRT ! Total mixing ratios (or tendency) to
  1577. ! transform into rv,rc and ri
  1578. ! (or its tendency)
  1579. REAL, DIMENSION(:,:), INTENT(OUT):: PTH ! th (or th_l tendency)
  1580. REAL, DIMENSION(:,:), INTENT(OUT):: PRV ! vapor mixing ratio (or its tendency)
  1581. REAL, DIMENSION(:,:), INTENT(OUT):: PRL ! vapor mixing ratio (or its tendency)
  1582. REAL, DIMENSION(:,:), INTENT(OUT):: PRI ! vapor mixing ratio (or its tendency)
  1583. !
  1584. !-------------------------------------------------------------------------------
  1585. !
  1586. ! 0.2 declaration of local variables
  1587. !
  1588. INTEGER :: II
  1589. ! Loop control
  1590. REAL :: ZCOEF
  1591. REAL, DIMENSION(SIZE(PP,1),SIZE(PP,2)) :: ZEXN,ZFOES,ZQVSAT
  1592. REAL, DIMENSION(SIZE(PTHL,1),SIZE(PTHL,2)) :: ZRVSAT,ZCPH,ZRLTEMP
  1593. REAL, DIMENSION(SIZE(PTHL,1),SIZE(PTHL,2)) :: ZT,ZLOVCPEXN,ZLOSCPEXN
  1594. !----------------------------------------------------------------------------
  1595. !
  1596. !* 1 Initialisation
  1597. ! --------------
  1598. !
  1599. !
  1600. ZCOEF = 0.8
  1601. PRL(:,:)=0.
  1602. PRI(:,:)=0.
  1603. ZRLTEMP(:,:)=0.
  1604. PRV(:,:)=PRT(:,:)
  1605. PTH(:,:)=PTHL(:,:)
  1606. ZEXN(:,:)=(PP(:,:)/XP00) ** (XRD/XCPD)
  1607. !
  1608. ! 2 Iteration
  1609. ! ---------
  1610. DO II=1,20
  1611. ZT(:,:)=PTH(:,:)*ZEXN(:,:)
  1612. WHERE (ZT(:,:) > 273.15)
  1613. ! warm cloud
  1614. ZFOES(:,:) = EXP( XALPW - XBETAW/ZT(:,:) - XGAMW*LOG(ZT(:,:)) )
  1615. ZQVSAT(:,:) = XRD/XRV*ZFOES(:,:)/PP(:,:) &
  1616. / (1.+(XRD/XRV-1.)*ZFOES(:,:)/PP(:,:))
  1617. ZRVSAT(:,:) = (1-ZCOEF)*ZQVSAT(:,:)*(1+PRT(:,:))+(ZCOEF)*PRV(:,:)
  1618. ! CALL COMPUTE_FRAC_ICE_2D(HFRAC_ICE,PFRAC_ICE,PP,ZT)
  1619. PFRAC_ICE(:,:) = 0.
  1620. ZRLTEMP(:,:)=MAX(0.,PRV(:,:)-ZRVSAT(:,:))
  1621. PRV(:,:)=PRV(:,:)-ZRLTEMP(:,:)
  1622. PRL(:,:)=PRL(:,:)+PRI(:,:)+ZRLTEMP(:,:)
  1623. PRI(:,:) = PFRAC_ICE(:,:) * (PRL(:,:))
  1624. PRL(:,:) = (1-PFRAC_ICE(:,:))* (PRT(:,:) - PRV(:,:))
  1625. ! 2.1 Cph
  1626. ZCPH(:,:)=XCPD+ XCPV * PRV(:,:)+ XCL * PRL(:,:) + XCI * PRI(:,:)
  1627. ! 2.2 L/Cp/EXN
  1628. ZLOVCPEXN(:,:) = (XLVTT + (XCPV-XCL) * (ZT(:,:)-XTT)) &
  1629. /(ZCPH*ZEXN(:,:))
  1630. ZLOSCPEXN(:,:) = (XLSTT + (XCPV-XCI) * (ZT(:,:)-XTT)) &
  1631. /(ZCPH*ZEXN(:,:))
  1632. PTH(:,:)=PTHL(:,:)+ZLOVCPEXN*PRL(:,:)+ZLOSCPEXN(:,:)*PRI(:,:)
  1633. ELSEWHERE
  1634. ! cold shallow cloud not yet coded
  1635. ! probleme also for the highest level of fire case
  1636. PRL(:,:)=0.
  1637. PRI(:,:)=0.
  1638. PRV(:,:)=PRT(:,:)
  1639. PTH(:,:)=PTHL(:,:)
  1640. ENDWHERE
  1641. ENDDO
  1642. END SUBROUTINE TH_R_FROM_THL_RT_2D
  1643. ! #################################################################
  1644. SUBROUTINE THL_RT_FROM_TH_R_MF( KRR,KRRL,KRRI, &
  1645. PTH, PR, PLVOCPEXN, PLSOCPEXN, &
  1646. PTHL, PRT )
  1647. ! #################################################################
  1648. !
  1649. !!
  1650. !!**** *THL_RT_FROM_TH_R* - computes the conservative variables THL and RT
  1651. !! from TH and the non precipitating water species
  1652. !!
  1653. !! --------------------------------------------------------------------------
  1654. !
  1655. !* 0. DECLARATIONS
  1656. ! ------------
  1657. !
  1658. !USE MODD_CST
  1659. !
  1660. IMPLICIT NONE
  1661. !
  1662. !
  1663. !* 0.1 declarations of arguments
  1664. !
  1665. INTEGER, INTENT(IN) :: KRR ! number of moist var.
  1666. INTEGER, INTENT(IN) :: KRRL ! number of liquid water var.
  1667. INTEGER, INTENT(IN) :: KRRI ! number of ice water var.
  1668. REAL, DIMENSION(:,:,:), INTENT(IN) :: PTH ! theta
  1669. REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PR ! water species
  1670. REAL, DIMENSION(:,:,:), INTENT(IN) :: PLVOCPEXN, PLSOCPEXN ! L/(cp*Pi)
  1671. REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHL ! th_l
  1672. REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRT ! total non precip. water
  1673. !
  1674. !-------------------------------------------------------------------------------
  1675. !
  1676. ! 0.2 declaration of local variables
  1677. !
  1678. !----------------------------------------------------------------------------
  1679. !----------------------------------------------------------------------------
  1680. !
  1681. !
  1682. IF ( KRRL >= 1 ) THEN
  1683. IF ( KRRI >= 1 ) THEN
  1684. ! Rnp
  1685. PRT(:,:,:) = PR(:,:,:,1) + PR(:,:,:,2) + PR(:,:,:,4)
  1686. ! Theta_l
  1687. PTHL(:,:,:) = PTH(:,:,:) - PLVOCPEXN(:,:,:) * PR(:,:,:,2) &
  1688. - PLSOCPEXN(:,:,:) * PR(:,:,:,4)
  1689. ELSE
  1690. ! Rnp
  1691. PRT(:,:,:) = PR(:,:,:,1) + PR(:,:,:,2)
  1692. ! Theta_l
  1693. PTHL(:,:,:) = PTH(:,:,:) - PLVOCPEXN(:,:,:) * PR(:,:,:,2)
  1694. END IF
  1695. ELSE
  1696. ! Rnp = rv
  1697. PRT(:,:,:) = PR(:,:,:,1)
  1698. ! Theta_l = Theta
  1699. PTHL(:,:,:) = PTH(:,:,:)
  1700. END IF
  1701. END SUBROUTINE THL_RT_FROM_TH_R_MF
  1702. ! #################################################
  1703. SUBROUTINE TRIDIAG_MASSFLUX(PVARM,PF,PDFDT,PTSTEP,PIMPL, &
  1704. PDZZ,PRHODJ,PVARP )
  1705. ! #################################################
  1706. !
  1707. !
  1708. !!**** *TRIDIAG_MASSFLUX* - routine to solve a time implicit scheme
  1709. !!
  1710. !!
  1711. !! ---------------------------------------------------------------------
  1712. !
  1713. !* 0. DECLARATIONS
  1714. !
  1715. !
  1716. !
  1717. IMPLICIT NONE
  1718. !
  1719. !
  1720. !* 0.1 declarations of arguments
  1721. !
  1722. REAL, DIMENSION(:,:,:), INTENT(IN) :: PVARM ! variable at t-1 at mass point
  1723. REAL, DIMENSION(:,:,:), INTENT(IN) :: PF ! flux in dT/dt=-dF/dz at flux point
  1724. REAL, DIMENSION(:,:,:), INTENT(IN) :: PDFDT ! dF/dT at flux point
  1725. REAL, INTENT(IN) :: PTSTEP ! Double time step
  1726. REAL, INTENT(IN) :: PIMPL ! implicit weight
  1727. REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Dz at flux point
  1728. REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! (dry rho)*J at mass point
  1729. !
  1730. REAL, DIMENSION(:,:,:), INTENT(OUT):: PVARP ! variable at t+1 at mass point
  1731. !
  1732. !
  1733. !* 0.2 declarations of local variables
  1734. !
  1735. REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZRHODJ_DFDT_O_DZ
  1736. REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZMZM_RHODJ
  1737. REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZA, ZB, ZC
  1738. REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZY ,ZGAM
  1739. ! RHS of the equation, 3D work array
  1740. REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2)) :: ZBET
  1741. ! 2D work array
  1742. INTEGER :: JK ! loop counter
  1743. INTEGER :: IKB,IKE ! inner vertical limits
  1744. !
  1745. ! ---------------------------------------------------------------------------
  1746. !
  1747. !* 1. Preliminaries
  1748. ! -------------
  1749. !
  1750. IKB=1
  1751. IKE=SIZE(PVARM,3)-1
  1752. !
  1753. ZMZM_RHODJ = MZM(PRHODJ)
  1754. ZRHODJ_DFDT_O_DZ = ZMZM_RHODJ*PDFDT/PDZZ
  1755. !
  1756. ZA=0.
  1757. ZB=0.
  1758. ZC=0.
  1759. ZY=0.
  1760. !
  1761. !
  1762. !* 2. COMPUTE THE RIGHT HAND SIDE
  1763. ! ---------------------------
  1764. !
  1765. ZY(:,:,IKB) = PRHODJ(:,:,IKB)*PVARM(:,:,IKB)/PTSTEP &
  1766. - ZMZM_RHODJ(:,:,IKB+1) * PF(:,:,IKB+1)/PDZZ(:,:,IKB+1) &
  1767. + ZMZM_RHODJ(:,:,IKB ) * PF(:,:,IKB )/PDZZ(:,:,IKB ) &
  1768. + ZRHODJ_DFDT_O_DZ(:,:,IKB+1) * 0.5*PIMPL * PVARM(:,:,IKB+1) &
  1769. + ZRHODJ_DFDT_O_DZ(:,:,IKB+1) * 0.5*PIMPL * PVARM(:,:,IKB )
  1770. !
  1771. DO JK=IKB+1,IKE-1
  1772. ZY(:,:,JK) = PRHODJ(:,:,JK)*PVARM(:,:,JK)/PTSTEP &
  1773. - ZMZM_RHODJ(:,:,JK+1) * PF(:,:,JK+1)/PDZZ(:,:,JK+1) &
  1774. + ZMZM_RHODJ(:,:,JK ) * PF(:,:,JK )/PDZZ(:,:,JK ) &
  1775. + ZRHODJ_DFDT_O_DZ(:,:,JK+1) * 0.5*PIMPL * PVARM(:,:,JK+1) &
  1776. + ZRHODJ_DFDT_O_DZ(:,:,JK+1) * 0.5*PIMPL * PVARM(:,:,JK ) &
  1777. - ZRHODJ_DFDT_O_DZ(:,:,JK ) * 0.5*PIMPL * PVARM(:,:,JK ) &
  1778. - ZRHODJ_DFDT_O_DZ(:,:,JK ) * 0.5*PIMPL * PVARM(:,:,JK-1)
  1779. END DO
  1780. !
  1781. ZY(:,:,IKE) = PRHODJ(:,:,IKE)*PVARM(:,:,IKE)/PTSTEP &
  1782. - ZMZM_RHODJ(:,:,IKE+1) * PF(:,:,IKE+1)/PDZZ(:,:,IKE+1) &
  1783. + ZMZM_RHODJ(:,:,IKE ) * PF(:,:,IKE )/PDZZ(:,:,IKE ) &
  1784. - ZRHODJ_DFDT_O_DZ(:,:,IKE ) * 0.5*PIMPL * PVARM(:,:,IKE ) &
  1785. - ZRHODJ_DFDT_O_DZ(:,:,IKE ) * 0.5*PIMPL * PVARM(:,:,IKE-1)
  1786. !
  1787. !
  1788. !* 3. INVERSION OF THE TRIDIAGONAL SYSTEM
  1789. ! -----------------------------------
  1790. !
  1791. IF ( PIMPL > 1.E-10 ) THEN
  1792. !
  1793. !* 3.1 arrays A, B, C
  1794. ! --------------
  1795. !
  1796. ZB(:,:,IKB) = PRHODJ(:,:,IKB)/PTSTEP &
  1797. + ZRHODJ_DFDT_O_DZ(:,:,IKB+1) * 0.5*PIMPL
  1798. ZC(:,:,IKB) = ZRHODJ_DFDT_O_DZ(:,:,IKB+1) * 0.5*PIMPL
  1799. DO JK=IKB+1,IKE-1
  1800. ZA(:,:,JK) = - ZRHODJ_DFDT_O_DZ(:,:,JK ) * 0.5*PIMPL
  1801. ZB(:,:,JK) = PRHODJ(:,:,JK)/PTSTEP &
  1802. + ZRHODJ_DFDT_O_DZ(:,:,JK+1) * 0.5*PIMPL &
  1803. - ZRHODJ_DFDT_O_DZ(:,:,JK ) * 0.5*PIMPL
  1804. ZC(:,:,JK) = ZRHODJ_DFDT_O_DZ(:,:,JK+1) * 0.5*PIMPL
  1805. END DO
  1806. ZA(:,:,IKE) = - ZRHODJ_DFDT_O_DZ(:,:,IKE ) * 0.5*PIMPL
  1807. ZB(:,:,IKE) = PRHODJ(:,:,IKE)/PTSTEP &
  1808. - ZRHODJ_DFDT_O_DZ(:,:,IKE ) * 0.5*PIMPL
  1809. !
  1810. !* 3.2 going up
  1811. ! --------
  1812. !
  1813. ZBET(:,:) = ZB(:,:,IKB) ! bet = b(ikb)
  1814. PVARP(:,:,IKB) = ZY(:,:,IKB) / ZBET(:,:)
  1815. !
  1816. DO JK = IKB+1,IKE-1
  1817. ZGAM(:,:,JK) = ZC(:,:,JK-1) / ZBET(:,:)
  1818. ! gam(k) = c(k-1) / bet
  1819. ZBET(:,:) = ZB(:,:,JK) - ZA(:,:,JK) * ZGAM(:,:,JK)
  1820. ! bet = b(k) - a(k)* gam(k)
  1821. PVARP(:,:,JK)= ( ZY(:,:,JK) - ZA(:,:,JK) * PVARP(:,:,JK-1) ) / ZBET(:,:)
  1822. ! res(k) = (y(k) -a(k)*res(k-1))/ bet
  1823. END DO
  1824. ! special treatment for the last level
  1825. ZGAM(:,:,IKE) = ZC(:,:,IKE-1) / ZBET(:,:)
  1826. ! gam(k) = c(k-1) / bet
  1827. ZBET(:,:) = ZB(:,:,IKE) - ZA(:,:,IKE) * ZGAM(:,:,IKE)
  1828. ! bet = b(k) - a(k)* gam(k)
  1829. PVARP(:,:,IKE)= ( ZY(:,:,IKE) - ZA(:,:,IKE) * PVARP(:,:,IKE-1) ) / ZBET(:,:)
  1830. ! res(k) = (y(k) -a(k)*res(k-1))/ bet
  1831. !
  1832. !* 3.3 going down
  1833. ! ----------
  1834. !
  1835. DO JK = IKE-1,IKB,-1
  1836. PVARP(:,:,JK) = PVARP(:,:,JK) - ZGAM(:,:,JK+1) * PVARP(:,:,JK+1)
  1837. END DO
  1838. !
  1839. !
  1840. ELSE
  1841. !!! EXPLICIT FORMULATION
  1842. !
  1843. PVARP(:,:,IKB:IKE) = ZY(:,:,IKB:IKE) * PTSTEP / PRHODJ(:,:,IKB:IKE)
  1844. !
  1845. END IF
  1846. !
  1847. !
  1848. !* 4. FILL THE UPPER AND LOWER EXTERNAL VALUES
  1849. ! ----------------------------------------
  1850. !
  1851. !PVARP(:,:,IKB-1)=PVARP(:,:,IKB) MODIF WRF JP
  1852. PVARP(:,:,IKE+1)=PVARP(:,:,IKE)
  1853. !
  1854. !-------------------------------------------------------------------------------
  1855. !
  1856. END SUBROUTINE TRIDIAG_MASSFLUX
  1857. !
  1858. ! #################################################################
  1859. SUBROUTINE UPDRAFT_SOPE(KRR,KRRL,KRRI,OMIXUV, &
  1860. PZZ,PDZZ,PSFTH,PSFRV,PPABSM,PRHODREF, &
  1861. PTKEM,PTHM,PRM,PTHLM,PRTM,PUM,PVM, &
  1862. PTHL_UP,PRT_UP,PRV_UP,PU_UP,PV_UP, &
  1863. PRC_UP,PRI_UP,PTHV_UP,PW_UP,PFRAC_UP,PEMF, &
  1864. PDETR,PENTR,KKLCL,KKETL,KKCTL )
  1865. ! #################################################################
  1866. !!
  1867. !!**** *UPDRAFT_SOPE* - Interfacing routine
  1868. !!
  1869. !! --------------------------------------------------------------------------
  1870. !
  1871. !* 0. DECLARATIONS
  1872. ! ------------
  1873. !
  1874. IMPLICIT NONE
  1875. !* 1.1 Declaration of Arguments
  1876. !
  1877. !
  1878. INTEGER, INTENT(IN) :: KRR ! number of moist var.
  1879. INTEGER, INTENT(IN) :: KRRL ! number of liquid water var.
  1880. INTEGER, INTENT(IN) :: KRRI ! number of ice water var.
  1881. LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum
  1882. REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height at the flux point
  1883. REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! depth between mass levels
  1884. REAL, DIMENSION(:,:), INTENT(IN) :: PSFTH,PSFRV
  1885. ! normal surface fluxes of theta,rv
  1886. !
  1887. ! prognostic variables at t- deltat
  1888. REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Pressure at time t-1
  1889. REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! dry density of the
  1890. ! reference state
  1891. REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE
  1892. REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM ! momentum
  1893. !
  1894. ! thermodynamical variables which are transformed in conservative var.
  1895. REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! pot. temp. = PTHLM in turb.f90
  1896. REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! water species
  1897. REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM,PRTM !cons. var.
  1898. REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHL_UP,PRT_UP ! updraft properties
  1899. REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRV_UP,PRC_UP,PRI_UP,&!Thl,Rt,Rv,Rc,Ri
  1900. PW_UP,PFRAC_UP,PEMF, &!w,Updraft Fraction, Mass Flux
  1901. PDETR,PENTR,PTHV_UP, &!entrainment, detrainment, ThV
  1902. PU_UP, PV_UP !updraft wind component
  1903. INTEGER, DIMENSION(:,:), INTENT(OUT) :: KKLCL,KKETL,KKCTL !index for LCL,ETL,CTL
  1904. !
  1905. !
  1906. !
  1907. ! 1.2 Declaration of local variables
  1908. INTEGER :: IKB
  1909. !
  1910. ! Variables to transform 3D fields in 2D fields
  1911. REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZPABSM,ZRHODREF
  1912. REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZZZ,ZDZZ
  1913. REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZTHLM,ZRTM,&
  1914. ZTHM,ZTKEM,&
  1915. ZUM,ZVM
  1916. REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZRVM,ZRCM,ZRIM
  1917. REAL, DIMENSION(SIZE(PSFTH,1)*SIZE(PSFTH,2)) :: ZSFTH,ZSFRV
  1918. REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZTHL_UP,ZRT_UP,&
  1919. ZRV_UP,ZRC_UP, ZRI_UP, &
  1920. ZW_UP,ZU_UP,ZV_UP,ZTHV_UP, &
  1921. ZFRAC_UP,ZEMF_UP,ZENTR_UP,ZDETR_UP
  1922. REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2)) :: ZFRAC_GRID
  1923. INTEGER, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2)) :: JKETL,JKCTL,JKLCL
  1924. INTEGER :: IIU,IJU,IKU! Limit of the grid
  1925. INTEGER :: J1D ! horizontal loop counter
  1926. INTEGER :: JK,JKK,JSV ! loop counters
  1927. INTEGER :: JRR ! moist loop counter
  1928. REAL :: ZRVORD ! Rv/Rd (=1/0.622 cf glossaire)
  1929. !------------------------------------------------------------------------
  1930. ! 2. INITIALISATION
  1931. ! 2.1 Local variables, internal domain
  1932. IIU=SIZE(PTKEM,1)
  1933. IJU=SIZE(PTKEM,2)
  1934. !
  1935. IKB = 1 ! Modif WRF JP
  1936. IKU = SIZE(PTKEM,3)
  1937. ZRVORD = XRV / XRD
  1938. DO JK=IKB,IKU
  1939. ZZZ (:,JK) = RESHAPE(PZZ (:,:,JK),(/ IIU*IJU /) )
  1940. ZDZZ (:,JK) = RESHAPE(PDZZ (:,:,JK),(/ IIU*IJU /) )
  1941. ZTHM (:,JK) = RESHAPE(PTHM (:,:,JK),(/ IIU*IJU /) )
  1942. ZTKEM (:,JK) = RESHAPE(PTKEM (:,:,JK),(/ IIU*IJU /) )
  1943. ZPABSM (:,JK) = RESHAPE(PPABSM (:,:,JK),(/ IIU*IJU /) )
  1944. ZRHODREF(:,JK) = RESHAPE(PRHODREF(:,:,JK),(/ IIU*IJU /) )
  1945. ZRVM (:,JK) = RESHAPE(PRM (:,:,JK,1),(/ IIU*IJU /) )
  1946. ZTHLM (:,JK) = RESHAPE(PTHLM (:,:,JK),(/ IIU*IJU /) )
  1947. ZRTM (:,JK) = RESHAPE(PRTM (:,:,JK),(/ IIU*IJU /) )
  1948. ZUM (:,JK) = RESHAPE(PUM (:,:,JK),(/ IIU*IJU /) )
  1949. ZVM (:,JK) = RESHAPE(PVM (:,:,JK),(/ IIU*IJU /) )
  1950. END DO
  1951. IF (KRRL>1) THEN
  1952. DO JK=1,IKU
  1953. ZRCM (:,JK) = RESHAPE(PRM (:,:,JK,2),(/ IIU*IJU /) )
  1954. END DO
  1955. ELSE
  1956. ZRCM (:,:) =0.
  1957. ENDIF
  1958. IF (KRRI>1) THEN
  1959. DO JK=1,IKU
  1960. ZRIM (:,JK) = RESHAPE(PRM (:,:,JK,4),(/ IIU*IJU /) )
  1961. END DO
  1962. ELSE
  1963. ZRIM (:,:) =0.
  1964. ENDIF
  1965. ZSFTH(:)=RESHAPE(PSFTH(:,:),(/ IIU*IJU /) )
  1966. ZSFRV(:)=RESHAPE(PSFRV(:,:),(/ IIU*IJU /) )
  1967. !Updraft begins at level 1 (Modif WRF)
  1968. JK=IKB
  1969. ! 6.2 compute properties of the updraft
  1970. CALL COMPUTE_UPDRAFT(OMIXUV,ZZZ,ZDZZ,JK, &
  1971. ZSFTH,ZSFRV,ZPABSM,ZRHODREF,ZUM,ZVM,ZTKEM, &
  1972. ZTHM,ZRVM,ZRCM,ZRIM,ZTHLM,ZRTM, &
  1973. ZTHL_UP,ZRT_UP,ZRV_UP,ZRC_UP,ZRI_UP,&
  1974. ZTHV_UP,ZW_UP,ZU_UP,ZV_UP, &
  1975. ZFRAC_UP,ZEMF_UP,&
  1976. ZDETR_UP,ZENTR_UP,&
  1977. JKLCL,JKETL,JKCTL)
  1978. PTHL_UP(:,:,:)= RESHAPE(ZTHL_UP(:,:), (/ IIU,IJU,IKU /))
  1979. PRT_UP(:,:,:)=RESHAPE(ZRT_UP(:,:), (/ IIU,IJU,IKU /) )
  1980. PRV_UP(:,:,:)=RESHAPE(ZRV_UP(:,:), (/ IIU,IJU,IKU /) )
  1981. PRC_UP(:,:,:)=RESHAPE(ZRC_UP(:,:), (/ IIU,IJU,IKU /) )
  1982. PRI_UP(:,:,:)=RESHAPE(ZRI_UP(:,:), (/ IIU,IJU,IKU /) )
  1983. PW_UP(:,:,:)=RESHAPE(ZW_UP(:,:), (/ IIU,IJU,IKU /) )
  1984. PU_UP(:,:,:)=RESHAPE(ZU_UP(:,:), (/ IIU,IJU,IKU /) )
  1985. PV_UP(:,:,:)=RESHAPE(ZV_UP(:,:), (/ IIU,IJU,IKU /) )
  1986. PEMF(:,:,:)=RESHAPE(ZEMF_UP(:,:), (/ IIU,IJU,IKU /) )
  1987. PDETR(:,:,:)=RESHAPE(ZDETR_UP(:,:), (/ IIU,IJU,IKU /) )
  1988. PENTR(:,:,:)=RESHAPE(ZENTR_UP(:,:), (/ IIU,IJU,IKU /) )
  1989. PTHV_UP(:,:,:)=RESHAPE(ZTHV_UP(:,:), (/ IIU,IJU,IKU /) )
  1990. KKETL(:,:)=RESHAPE(JKETL(:),(/ IIU,IJU/) )
  1991. KKCTL(:,:)=RESHAPE(JKCTL(:),(/ IIU,IJU/) )
  1992. KKLCL(:,:)=RESHAPE(JKLCL(:),(/ IIU,IJU/) )
  1993. PFRAC_UP(:,:,:)=RESHAPE(ZFRAC_UP(:,:),(/ IIU,IJU,IKU /) )
  1994. END SUBROUTINE UPDRAFT_SOPE
  1995. ! #################################################################
  1996. SUBROUTINE COMPUTE_MF_CLOUD(KRRL, PTHLM,PRC_UP, PFRAC_UP, PDZZ, KKLCL,&
  1997. PRC_MF,PCF_MF )
  1998. ! #################################################################
  1999. !!
  2000. !!**** *COMPUTE_MF_CLOUD* -
  2001. !! compute diagnostic subgrid cumulus cloud caracteristics
  2002. !!
  2003. !! PURPOSE
  2004. !! -------
  2005. !!**** The purpose of this routine is to compute the cloud fraction and
  2006. !! the mean cloud content associated with clouds described by the
  2007. !! mass flux scheme
  2008. !!
  2009. !
  2010. !!** METHOD
  2011. !! ------
  2012. !!
  2013. !! EXTERNAL
  2014. !! --------
  2015. !!
  2016. !! IMPLICIT ARGUMENTS
  2017. !! ------------------
  2018. !!
  2019. !! REFERENCE
  2020. !! ---------
  2021. !!
  2022. !!
  2023. !! AUTHOR
  2024. !! ------
  2025. !! --------------------------------------------------------------------------
  2026. !
  2027. !* 0. DECLARATIONS
  2028. ! ------------
  2029. !
  2030. IMPLICIT NONE
  2031. !* 1.1 Declaration of Arguments
  2032. !
  2033. !
  2034. !
  2035. INTEGER, INTENT(IN) :: KRRL ! number of liquid water var.
  2036. ! scheme
  2037. REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! updraft characteritics
  2038. REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC_UP ! updraft characteritics
  2039. REAL, DIMENSION(:,:,:), INTENT(IN) :: PFRAC_UP ! Updraft Fraction
  2040. REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ
  2041. INTEGER, DIMENSION(:,:), INTENT(IN) :: KKLCL ! index of updraft condensation level
  2042. REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRC_MF, PCF_MF ! cloud content and
  2043. ! cloud fraction for MF scheme
  2044. !
  2045. ! 1.2 Declaration of local variables
  2046. !
  2047. REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZFLXZ
  2048. INTEGER :: IKU, IKB, IKE, JI,JJ,JK
  2049. !------------------------------------------------------------------------
  2050. ! 1. INITIALISATION
  2051. ! 2.1 Internal domain
  2052. ! Internal Domain
  2053. IKU=SIZE(PTHLM,3)
  2054. IKB=1
  2055. IKE=IKU-1
  2056. PCF_MF = 0.
  2057. PRC_MF = 0.
  2058. !
  2059. ! Direct cloud scheme
  2060. ! This scheme may be activated only if the selected updraft model
  2061. ! gives the updraft fraction as an output
  2062. !
  2063. ! attention, les variables de l'updraft sont en niveaux flux
  2064. ! ils faut les passer aux niveaux masse pour calculer PRC_MF et PCF_MF
  2065. DO JI=1,SIZE(PCF_MF,1)
  2066. DO JJ=1,SIZE(PCF_MF,2)
  2067. DO JK=KKLCL(JI,JJ),IKE
  2068. PCF_MF(JI,JJ,JK ) = XKCF_MF *0.5* ( &
  2069. & PFRAC_UP(JI,JJ,JK) + PFRAC_UP(JI,JJ,JK+1) )
  2070. PRC_MF(JI,JJ,JK) = 0.5* XKCF_MF * ( PFRAC_UP(JI,JJ,JK)*PRC_UP(JI,JJ,JK) &
  2071. + PFRAC_UP(JI,JJ,JK+1)*PRC_UP(JI,JJ,JK+1) )
  2072. END DO
  2073. END DO
  2074. END DO
  2075. END SUBROUTINE COMPUTE_MF_CLOUD
  2076. ! #################################################################
  2077. SUBROUTINE mfshconvpblinit(massflux_EDKF, entr_EDKF, detr_EDKF &
  2078. ,thl_up, thv_up, rt_up &
  2079. ,rv_up, rc_up, u_up, v_up &
  2080. ,frac_up,RESTART,ALLOWED_TO_READ, &
  2081. & IDS,IDE,JDS,JDE,KDS,KDE, &
  2082. & IMS,IME,JMS,JME,KMS,KME, &
  2083. & ITS,ITE,JTS,JTE,KTS,KTE )
  2084. ! #################################################################
  2085. IMPLICIT NONE
  2086. LOGICAL,INTENT(IN) :: ALLOWED_TO_READ,RESTART
  2087. INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE, &
  2088. & IMS,IME,JMS,JME,KMS,KME, &
  2089. & ITS,ITE,JTS,JTE,KTS,KTE
  2090. REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(OUT),OPTIONAL :: &
  2091. & MASSFLUX_EDKF, ENTR_EDKF, DETR_EDKF &
  2092. & ,THL_UP, THV_UP, RT_UP, RV_UP &
  2093. & ,RC_UP, U_UP, V_UP, FRAC_UP
  2094. INTEGER :: I,J,K,ITF,JTF,KTF
  2095. !---------------------------------------------
  2096. JTF=MIN0(JTE,JDE-1)
  2097. KTF=MIN0(KTE,KDE-1)
  2098. ITF=MIN0(ITE,IDE-1)
  2099. ! IF(.NOT.RESTART)THEN
  2100. IF( PRESENT (MASSFLUX_EDKF) ) THEN
  2101. DO J=JTS,JTF
  2102. DO K=KTS,KTF
  2103. DO I=ITS,ITF
  2104. MASSFLUX_EDKF(I,K,J)=0.
  2105. ENTR_EDKF(I,K,J)=0.
  2106. DETR_EDKF(I,K,J)=0.
  2107. THL_UP(I,K,J)=0.
  2108. THV_UP(I,K,J)=0.
  2109. RT_UP(I,K,J)=0.
  2110. RV_UP(I,K,J)=0.
  2111. RC_UP(I,K,J)=0.
  2112. U_UP(I,K,J)=0.
  2113. V_UP(I,K,J)=0.
  2114. FRAC_UP(I,K,J)=0.
  2115. ENDDO
  2116. ENDDO
  2117. ENDDO
  2118. ENDIF
  2119. END SUBROUTINE mfshconvpblinit
  2120. ! #########################################################
  2121. SUBROUTINE BL89(PZZ,PDZZ,PTHVREF,PTHLM,KRR, &
  2122. PRM,PTKEM,PLM)
  2123. ! #########################################################
  2124. !
  2125. !!**** *BL89* -
  2126. !!
  2127. !! PURPOSE
  2128. !! -------
  2129. !! This routine computes the mixing length from Bougeault-Lacarrere 89
  2130. !! formula.
  2131. !!
  2132. !!** METHOD
  2133. !! ------
  2134. !!
  2135. !* 0.1 Declaration of arguments
  2136. ! ------------------------
  2137. !
  2138. INTEGER, INTENT(IN) :: KRR
  2139. REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ
  2140. REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ
  2141. REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF
  2142. REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE
  2143. ! thermodynamical variables PTHLM=Theta at the begining
  2144. REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! conservative pot. temp.
  2145. REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! water var.
  2146. REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLM ! Mixing length
  2147. !* 0.2 Declaration of local variables
  2148. ! ------------------------------
  2149. !
  2150. INTEGER :: IKB,IKE
  2151. REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZRTM
  2152. REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) ::ZVPT ! Virtual Potential Temp at half levels
  2153. REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2)) :: ZLWORK
  2154. ! ! downwards then upwards vertical displacement,
  2155. REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZZZ,ZDZZ,&
  2156. ZG_O_THVREF, &
  2157. ZTHM,ZTKEM,ZLM,&
  2158. ZLMUP,ZLMDN,&
  2159. ZLMTEST
  2160. ! ! input and output arrays packed according one horizontal coord.
  2161. REAL, DIMENSION(SIZE(PRM,1)*SIZE(PRM,2),SIZE(PRM,3),SIZE(PRM,4)) :: ZRM
  2162. ! ! input array packed according one horizontal coord.
  2163. REAL, DIMENSION(SIZE(PRM,1)*SIZE(PRM,2),SIZE(PRM,3)) :: ZSUM ! to replace SUM function
  2164. REAL :: ZPOTE,ZLWORK1,ZLWORK2
  2165. INTEGER :: IIU,IJU,IKU,IICE
  2166. INTEGER :: J1D ! horizontal loop counter
  2167. INTEGER :: JK,JKK ! loop counters
  2168. INTEGER :: JRR ! moist loop counter
  2169. REAL :: ZRVORD ! Rv/Rd (=1/0.622 cf glossaire)
  2170. LOGICAL :: GUPORDN !Test for computation of upward or downward mixing length
  2171. REAL :: Z2SQRT2
  2172. !-------------------------------------------------------------------------------
  2173. !
  2174. Z2SQRT2=2.*SQRT(2.)
  2175. IIU=SIZE(PTKEM,1)
  2176. IJU=SIZE(PTKEM,2)
  2177. !
  2178. IKB = 1
  2179. IKE = SIZE(PTKEM,3)-1
  2180. IKU = SIZE(PTKEM,3)
  2181. ZRVORD = XRV / XRD
  2182. !-------------------------------------------------------------------------------
  2183. !
  2184. !* 1. pack the horizontal dimensions into one
  2185. ! ---------------------------------------
  2186. !
  2187. DO JK=1,IKU
  2188. ZZZ (:,JK) = RESHAPE(PZZ (:,:,JK),(/ IIU*IJU /) )
  2189. ZDZZ (:,JK) = RESHAPE(PDZZ (:,:,JK),(/ IIU*IJU /) )
  2190. ZTHM (:,JK) = RESHAPE(PTHLM (:,:,JK),(/ IIU*IJU /) )
  2191. ZTKEM (:,JK) = RESHAPE(PTKEM (:,:,JK),(/ IIU*IJU /) )
  2192. ZG_O_THVREF(:,JK) = RESHAPE(XG/PTHVREF(:,:,JK),(/ IIU*IJU /) )
  2193. DO JRR=1,KRR
  2194. ZRM (:,JK,JRR) = RESHAPE(PRM (:,:,JK,JRR),(/ IIU*IJU /) )
  2195. END DO
  2196. END DO
  2197. !-------------------------------------------------------------------------------
  2198. !
  2199. !* 2. Virtual potential temperature on the model grid
  2200. ! -----------------------------------------------
  2201. !
  2202. IF(KRR /= 0) THEN
  2203. ZSUM(:,:) = 0.
  2204. DO JRR=1,KRR
  2205. ZSUM(:,:) = ZSUM(:,:)+ZRM(:,:,JRR)
  2206. ENDDO
  2207. ZVPT(:,1:)=ZTHM(:,:) * ( 1. + ZRVORD*ZRM(:,:,1) ) &
  2208. / ( 1. + ZSUM(:,:) )
  2209. ELSE
  2210. ZVPT(:,1:)=ZTHM(:,:)
  2211. END IF
  2212. !
  2213. !-------------------------------------------------------------------------------
  2214. !
  2215. !* 3. loop on model levels
  2216. ! --------------------
  2217. !
  2218. DO JK=IKB,IKE
  2219. !-------------------------------------------------------------------------------
  2220. !
  2221. !* 4. mixing length for a downwards displacement
  2222. ! ------------------------------------------
  2223. GUPORDN=.FALSE.
  2224. CALL COMPUTE_BL89_ML(ZDZZ,ZTKEM,ZG_O_THVREF,ZVPT,JK,GUPORDN,ZLWORK)
  2225. !-------------------------------------------------------------------------------
  2226. !
  2227. !* 5. intermediate storage of the final mixing length
  2228. ! -----------------------------------------------
  2229. !
  2230. ZLMDN(:,JK)=MIN(ZLWORK(:),0.5*(ZZZ(:,JK)+ZZZ(:,JK+1))-ZZZ(:,IKB))
  2231. !
  2232. !-------------------------------------------------------------------------------
  2233. !
  2234. !* 6. mixing length for an upwards displacement
  2235. ! -----------------------------------------
  2236. GUPORDN=.TRUE.
  2237. CALL COMPUTE_BL89_ML(ZDZZ,ZTKEM,ZG_O_THVREF,ZVPT,JK,GUPORDN,ZLWORK)
  2238. ZLMUP(:,JK)=ZLWORK(:)
  2239. !-------------------------------------------------------------------------------
  2240. !
  2241. DO J1D=1,IIU*IJU
  2242. ZLWORK1=MAX(ZLMDN(J1D,JK),1.E-10)
  2243. ZLWORK2=MAX(ZLMUP(J1D,JK),1.E-10)
  2244. ZPOTE = ZLWORK1 / ZLWORK2
  2245. ZLWORK2=1.d0 + ZPOTE**(2./3.)
  2246. ZLM(J1D,JK) = Z2SQRT2*ZLWORK1/(ZLWORK2*SQRT(ZLWORK2))
  2247. END DO
  2248. ZLM(:,JK)=( 0.5* (MAX(ZLMDN(:,JK),1.E-10)**(-2./3.)+MAX(ZLMUP(:,JK),1.E-10)**(-2./3.)) )**(-1.5)
  2249. ZLM(:,JK)=MAX(ZLM(:,JK),XLINI)
  2250. !* 8. end of the loop on the vertical levels
  2251. ! --------------------------------------
  2252. !
  2253. END DO
  2254. !
  2255. !-------------------------------------------------------------------------------
  2256. !
  2257. !* 9. boundaries
  2258. ! ----------
  2259. !
  2260. ZLM(:,IKE) =ZLM(:,IKE-1)
  2261. ZLM(:,IKE+1)=ZLM(:,IKE-1)
  2262. ZLMUP(:,IKE) =ZLMUP(:,IKE-1)
  2263. ZLMUP(:,IKE+1)=ZLMUP(:,IKE-1)
  2264. ZLMDN(:,IKE) =ZLMDN(:,IKE-1)
  2265. ZLMDN(:,IKE+1)=ZLMDN(:,IKE-1)
  2266. !
  2267. DO JK=1,IKU
  2268. PLM (:,:,JK) = RESHAPE(ZLM (:,JK), (/ IIU,IJU /) )
  2269. END DO
  2270. END SUBROUTINE BL89
  2271. END MODULE MODULE_BL_MFSHCONVPBL