PageRenderTime 60ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 1ms

/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

Large files files are truncated, but you can click here to view the full file

  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

Large files files are truncated, but you can click here to view the full file