PageRenderTime 1385ms CodeModel.GetById 39ms RepoModel.GetById 1ms app.codeStats 1ms

/wrfv2_fire/phys/module_cu_kfeta.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 3174 lines | 2002 code | 116 blank | 1056 comment | 19 complexity | 83c977654d6529edf366d4c5881efc42 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_cu_kfeta
  2. USE module_wrf_error
  3. !
  4. ! V3.3: A new trigger function is added based Ma and Tan (2009):
  5. ! Ma, L.-M. and Z.-M. Tan, 2009: Improving the behavior of
  6. ! the cumulus parameterization for tropical cyclone prediction:
  7. ! Convection trigger. Atmospheric Research, 92, 190 - 211.
  8. !
  9. !--------------------------------------------------------------------
  10. ! Lookup table variables:
  11. INTEGER, PARAMETER :: KFNT=250,KFNP=220
  12. REAL, DIMENSION(KFNT,KFNP),PRIVATE, SAVE :: TTAB,QSTAB
  13. REAL, DIMENSION(KFNP),PRIVATE, SAVE :: THE0K
  14. REAL, DIMENSION(200),PRIVATE, SAVE :: ALU
  15. REAL, PRIVATE, SAVE :: RDPR,RDTHK,PLUTOP
  16. ! Note: KF Lookup table is used by subroutines KF_eta_PARA, TPMIX2,
  17. ! TPMIX2DD, ENVIRTHT
  18. ! End of Lookup table variables:
  19. CONTAINS
  20. SUBROUTINE KF_eta_CPS( &
  21. ids,ide, jds,jde, kds,kde &
  22. ,ims,ime, jms,jme, kms,kme &
  23. ,its,ite, jts,jte, kts,kte &
  24. ,trigger &
  25. ,DT,KTAU,DX,CUDT,CURR_SECS,ADAPT_STEP_FLAG &
  26. ,CUDTACTTIME &
  27. ,rho,RAINCV,PRATEC,NCA &
  28. ,U,V,TH,T,W,dz8w,Pcps,pi &
  29. ,W0AVG,XLV0,XLV1,XLS0,XLS1,CP,R,G,EP1 &
  30. ,EP2,SVP1,SVP2,SVP3,SVPT0 &
  31. ,STEPCU,CU_ACT_FLAG,warm_rain,CUTOP,CUBOT &
  32. ,QV &
  33. ! optionals
  34. ,F_QV ,F_QC ,F_QR ,F_QI ,F_QS &
  35. ,RTHCUTEN,RQVCUTEN,RQCCUTEN,RQRCUTEN &
  36. ,RQICUTEN,RQSCUTEN, RQVFTEN &
  37. )
  38. !
  39. !-------------------------------------------------------------
  40. IMPLICIT NONE
  41. !-------------------------------------------------------------
  42. INTEGER, INTENT(IN ) :: &
  43. ids,ide, jds,jde, kds,kde, &
  44. ims,ime, jms,jme, kms,kme, &
  45. its,ite, jts,jte, kts,kte
  46. INTEGER, INTENT(IN ) :: trigger
  47. INTEGER, INTENT(IN ) :: STEPCU
  48. LOGICAL, INTENT(IN ) :: warm_rain
  49. REAL, INTENT(IN ) :: XLV0,XLV1,XLS0,XLS1
  50. REAL, INTENT(IN ) :: CP,R,G,EP1,EP2
  51. REAL, INTENT(IN ) :: SVP1,SVP2,SVP3,SVPT0
  52. INTEGER, INTENT(IN ) :: KTAU
  53. REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , &
  54. INTENT(IN ) :: &
  55. U, &
  56. V, &
  57. W, &
  58. TH, &
  59. T, &
  60. QV, &
  61. dz8w, &
  62. Pcps, &
  63. rho, &
  64. pi
  65. !
  66. REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , &
  67. INTENT(INOUT) :: &
  68. W0AVG
  69. REAL, INTENT(IN ) :: DT, DX
  70. REAL, INTENT(IN ) :: CUDT
  71. REAL, INTENT(IN ) :: CURR_SECS
  72. LOGICAL,OPTIONAL,INTENT(IN ) :: ADAPT_STEP_FLAG
  73. REAL, INTENT (INOUT) :: CUDTACTTIME
  74. !
  75. REAL, DIMENSION( ims:ime , jms:jme ), &
  76. INTENT(INOUT) :: RAINCV
  77. REAL, DIMENSION( ims:ime , jms:jme ), &
  78. INTENT(INOUT) :: PRATEC
  79. REAL, DIMENSION( ims:ime , jms:jme ), &
  80. INTENT(INOUT) :: NCA
  81. REAL, DIMENSION( ims:ime , jms:jme ), &
  82. INTENT(OUT) :: CUBOT, &
  83. CUTOP
  84. LOGICAL, DIMENSION( ims:ime , jms:jme ), &
  85. INTENT(INOUT) :: CU_ACT_FLAG
  86. !
  87. ! Optional arguments
  88. !
  89. REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
  90. OPTIONAL, &
  91. INTENT(INOUT) :: &
  92. RTHCUTEN, &
  93. RQVCUTEN, &
  94. RQCCUTEN, &
  95. RQRCUTEN, &
  96. RQICUTEN, &
  97. RQSCUTEN, &
  98. RQVFTEN
  99. !
  100. ! Flags relating to the optional tendency arrays declared above
  101. ! Models that carry the optional tendencies will provdide the
  102. ! optional arguments at compile time; these flags all the model
  103. ! to determine at run-time whether a particular tracer is in
  104. ! use or not.
  105. !
  106. LOGICAL, OPTIONAL :: &
  107. F_QV &
  108. ,F_QC &
  109. ,F_QR &
  110. ,F_QI &
  111. ,F_QS
  112. ! LOCAL VARS
  113. LOGICAL :: flag_qr, flag_qi, flag_qs
  114. REAL, DIMENSION( kts:kte ) :: &
  115. U1D, &
  116. V1D, &
  117. T1D, &
  118. DZ1D, &
  119. QV1D, &
  120. P1D, &
  121. RHO1D, &
  122. tpart_v1D, &
  123. tpart_h1D, &
  124. W0AVG1D
  125. REAL, DIMENSION( kts:kte ):: &
  126. DQDT, &
  127. DQIDT, &
  128. DQCDT, &
  129. DQRDT, &
  130. DQSDT, &
  131. DTDT
  132. REAL, DIMENSION (its-1:ite+1,kts:kte,jts-1:jte+1) :: aveh_t, aveh_q
  133. REAL, DIMENSION (its:ite,kts:kte,jts:jte) :: aveh_qmax, aveh_qmin
  134. REAL, DIMENSION (its:ite,kts:kte,jts:jte) :: avev_t, avev_q
  135. REAL, DIMENSION (its:ite,kts:kte,jts:jte) :: avev_qmax, avev_qmin
  136. REAL, DIMENSION (its:ite,kts:kte,jts:jte) :: coef_v, coef_h, tpart_h, tpart_v
  137. INTEGER :: ii,jj,kk
  138. REAL :: ttop
  139. REAL, DIMENSION (kts:kte) :: z0
  140. REAL :: TST,tv,PRS,RHOE,W0,SCR1,DXSQ,tmp
  141. integer :: ibegh,iendh,jbegh,jendh
  142. integer :: istart,iend,jstart,jend
  143. INTEGER :: i,j,k,NTST
  144. REAL :: lastdt = -1.0
  145. REAL :: W0AVGfctr, W0fctr, W0den
  146. LOGICAL :: run_param , doing_adapt_dt , decided
  147. !
  148. DXSQ=DX*DX
  149. !----------------------
  150. NTST=STEPCU
  151. TST=float(NTST*2)
  152. flag_qr = .FALSE.
  153. flag_qi = .FALSE.
  154. flag_qs = .FALSE.
  155. IF ( PRESENT(F_QR) ) flag_qr = F_QR
  156. IF ( PRESENT(F_QI) ) flag_qi = F_QI
  157. IF ( PRESENT(F_QS) ) flag_qs = F_QS
  158. !
  159. if (lastdt < 0) then
  160. lastdt = dt
  161. endif
  162. if (ADAPT_STEP_FLAG) then
  163. W0AVGfctr = 2 * MAX(CUDT*60,dt) - dt
  164. W0fctr = dt
  165. W0den = 2 * MAX(CUDT*60,dt)
  166. else
  167. W0AVGfctr = (TST-1.)
  168. W0fctr = 1.
  169. W0den = TST
  170. endif
  171. DO J = jts,jte
  172. DO K=kts,kte
  173. DO I= its,ite
  174. ! SCR1=-5.0E-4*G*rho(I,K,J)*(w(I,K,J)+w(I,K+1,J))
  175. ! TV=T(I,K,J)*(1.+EP1*QV(I,K,J))
  176. ! RHOE=Pcps(I,K,J)/(R*TV)
  177. ! W0=-101.9368*SCR1/RHOE
  178. W0=0.5*(w(I,K,J)+w(I,K+1,J))
  179. ! Old:
  180. !
  181. ! W0AVG(I,K,J)=(W0AVG(I,K,J)*(TST-1.)+W0)/TST
  182. !
  183. ! New, to support adaptive time step:
  184. !
  185. W0AVG(I,K,J) = ( W0AVG(I,K,J) * W0AVGfctr + W0 * W0fctr ) / W0den
  186. ENDDO
  187. ENDDO
  188. ENDDO
  189. lastdt = dt
  190. ! Initialization for adaptive time step.
  191. doing_adapt_dt = .FALSE.
  192. IF ( PRESENT(adapt_step_flag) ) THEN
  193. IF ( adapt_step_flag ) THEN
  194. doing_adapt_dt = .TRUE.
  195. IF ( cudtacttime .EQ. 0. ) THEN
  196. cudtacttime = curr_secs + cudt*60.
  197. END IF
  198. END IF
  199. END IF
  200. ! Do we run through this scheme or not?
  201. ! Test 1: If this is the initial model time, then yes.
  202. ! KTAU=1
  203. ! Test 2: If the user asked for the cumulus to be run every time step, then yes.
  204. ! CUDT=0 or STEPCU=1
  205. ! Test 3: If not adaptive dt, and this is on the requested cumulus frequency, then yes.
  206. ! MOD(KTAU,NST)=0
  207. ! Test 4: If using adaptive dt and the current time is past the last requested activate cumulus time, then yes.
  208. ! CURR_SECS >= CUDTACTTIME
  209. ! If we do run through the scheme, we set the flag run_param to TRUE and we set the decided flag
  210. ! to TRUE. The decided flag says that one of these tests was able to say "yes", run the scheme.
  211. ! We only proceed to other tests if the previous tests all have left decided as FALSE.
  212. ! If we set run_param to TRUE and this is adaptive time stepping, we set the time to the next
  213. ! cumulus run.
  214. decided = .FALSE.
  215. run_param = .FALSE.
  216. IF ( ( .NOT. decided ) .AND. &
  217. ( ktau .EQ. 1 ) ) THEN
  218. run_param = .TRUE.
  219. decided = .TRUE.
  220. END IF
  221. IF ( ( .NOT. decided ) .AND. &
  222. ( ( cudt .EQ. 0. ) .OR. ( stepcu .EQ. 1 ) ) ) THEN
  223. run_param = .TRUE.
  224. decided = .TRUE.
  225. END IF
  226. IF ( ( .NOT. decided ) .AND. &
  227. ( .NOT. doing_adapt_dt ) .AND. &
  228. ( MOD(ktau,ntst) .EQ. 0 ) ) THEN
  229. run_param = .TRUE.
  230. decided = .TRUE.
  231. END IF
  232. IF ( ( .NOT. decided ) .AND. &
  233. ( doing_adapt_dt ) .AND. &
  234. ( curr_secs .GE. cudtacttime ) ) THEN
  235. run_param = .TRUE.
  236. decided = .TRUE.
  237. cudtacttime = curr_secs + cudt*60
  238. END IF
  239. if (run_param) then
  240. ! New trigger function
  241. IF (trigger.eq.2) THEN
  242. !
  243. ! calculate 9-point average of moisture advection and temperature using halo (Horizontal)
  244. !
  245. aveh_t=-999 ! horizontal 9-point ave
  246. aveh_q=-999
  247. avev_t=0 ! vertical 3-level ave
  248. avev_q=0
  249. avev_qmax=0
  250. avev_qmin=0
  251. aveh_qmax=0
  252. aveh_qmin=0
  253. tpart_h=0
  254. tpart_v=0
  255. coef_h=0
  256. coef_v=0
  257. ibegh=max(its-1, ids+1) ! start from 2
  258. jbegh=max(jts-1, jds+1)
  259. iendh=min(ite+1, ide-2) ! end at ide-2
  260. jendh=min(jte+1, jde-2)
  261. DO J = jbegh,jendh
  262. DO K = kts,kte
  263. DO I = ibegh,iendh
  264. aveh_t(i,k,j)=(T(i-1,k,j-1)+T(i-1,k,j) +T(i-1,k,j+1)+ &
  265. T(i,k,j-1) +T(i,k,j) +T(i,k,j+1)+ &
  266. T(i+1,k,j-1) +T(i+1,k,j) +T(i+1,k,j+1))/9.
  267. aveh_q(i,k,j)=(rqvften(i-1,k,j-1)+rqvften(i-1,k,j) +rqvften(i-1,k,j+1)+ &
  268. rqvften(i,k,j-1) +rqvften(i,k,j) +rqvften(i,k,j+1)+ &
  269. rqvften(i+1,k,j-1) +rqvften(i+1,k,j) +rqvften(i+1,k,j+1))/9.
  270. ENDDO
  271. ENDDO
  272. ENDDO
  273. ! boundary value ( all processors will do the following? Or just those processsors handling sub-area including boundary)
  274. DO K = kts,kte
  275. DO J = jts-1,jte+1
  276. DO I = its-1,ite+1
  277. if(i.eq.ids) then
  278. aveh_t(i,k,j)=aveh_t(i+1,k,j)
  279. aveh_q(i,k,j)=aveh_q(i+1,k,j)
  280. elseif(i.eq.ide-1) then
  281. aveh_t(i,k,j)=aveh_t(i-1,k,j)
  282. aveh_q(i,k,j)=aveh_q(i-1,k,j)
  283. endif
  284. if(j.eq.jds) then
  285. aveh_t(i,k,j)=aveh_t(i,k,j+1)
  286. aveh_q(i,k,j)=aveh_q(i,k,j+1)
  287. elseif(j.eq.jde-1) then
  288. aveh_t(i,k,j)=aveh_t(i,k,j-1)
  289. aveh_q(i,k,j)=aveh_q(i,k,j-1)
  290. endif
  291. if(j.eq.jds.and.i.eq.ids) then
  292. aveh_q(i,k,j)=aveh_q(i+1,k,j+1)
  293. aveh_t(i,k,j)=aveh_t(i+1,k,j+1)
  294. endif
  295. if(j.eq.jde-1.and.i.eq.ids) then
  296. aveh_q(i,k,j)=aveh_q(i+1,k,j-1)
  297. aveh_t(i,k,j)=aveh_t(i+1,k,j-1)
  298. endif
  299. if(j.eq.jde-1.and.i.eq.ide-1) then
  300. aveh_q(i,k,j)=aveh_q(i-1,k,j-1)
  301. aveh_t(i,k,j)=aveh_t(i-1,k,j-1)
  302. endif
  303. if(j.eq.jds.and.i.eq.ide-1) then
  304. aveh_q(i,k,j)=aveh_q(i-1,k,j+1)
  305. aveh_t(i,k,j)=aveh_t(i-1,k,j+1)
  306. endif
  307. ENDDO
  308. ENDDO
  309. ENDDO
  310. ! search for max/min moisture advection in 9-point range, calculate horizontal T-perturbation (tpart_h)
  311. istart=max(its, ids+1) ! start from 2
  312. jstart=max(jts, jds+1)
  313. iend=min(ite, ide-2) ! end at ide-2
  314. jend=min(jte, jde-2)
  315. DO K = kts,kte
  316. DO J = jstart,jend
  317. DO I = istart,iend
  318. aveh_qmax(i,k,j)=aveh_q(i,k,j)
  319. aveh_qmin(i,k,j)=aveh_q(i,k,j)
  320. DO ii=-1, 1
  321. DO jj=-1,1
  322. if(aveh_q(i+II,k,j+JJ).gt.aveh_qmax(i,k,j)) aveh_qmax(i,k,j)=aveh_q(i+II,k,j+JJ)
  323. if(aveh_q(i+II,k,j+JJ).lt.aveh_qmin(i,k,j)) aveh_qmin(i,k,j)=aveh_q(i+II,k,j+JJ)
  324. ENDDO
  325. ENDDO
  326. if(aveh_qmax(i,k,j).gt.aveh_qmin(i,k,j))then
  327. coef_h(i,k,j)=(aveh_q(i,k,j)-aveh_qmin(i,k,j))/(aveh_qmax(i,k,j)-aveh_qmin(i,k,j))
  328. else
  329. coef_h(i,k,j)=0.
  330. endif
  331. coef_h(i,k,j)=amin1(coef_h(i,k,j),1.0)
  332. coef_h(i,k,j)=amax1(coef_h(i,k,j),0.0)
  333. tpart_h(i,k,j)=coef_h(i,k,j)*(T(i,k,j)-aveh_t(i,k,j))
  334. ENDDO
  335. ENDDO
  336. ENDDO
  337. 89 continue
  338. ! vertical 3-layer calculation
  339. DO J = jts, jte
  340. DO I = its, ite
  341. z0(1) = 0.5 * dz8w(i,1,j)
  342. DO K = 2, kte
  343. Z0(K) = Z0(K-1) + .5 * (DZ8W(i,K,j) + DZ8W(i,K-1,j))
  344. ENDDO
  345. DO K = kts+1,kte-1
  346. ttop = t(i,k,j) + ((t(i,k,j) - t(i,k+1,j)) / (z0(k) - z0(k+1))) * (z0(k)-z0(k-1))
  347. avev_t(i,k,j)=(T(i,k-1,j) + T(i,k,j) + ttop)/3.
  348. ! avev_t(i,k,j)=(T(i,k-1,j)+T(i,k,j) + T(i,k+1,j))/3.
  349. avev_q(i,k,j)=(rqvften(i,k-1,j)+rqvften(i,k,j) + rqvften(i,k+1,j))/3.
  350. ENDDO
  351. avev_t(i,kts,j)=avev_t(i,kts+1,j) ! lowest level value, is it the same as avev_t(i,kds,j)=avev_t(i,kds+1,j)?
  352. avev_q(i,kts,j)=avev_q(i,kts+1,j)
  353. avev_t(i,kte,j)=avev_t(i,kte-1,j) ! highest level value
  354. avev_q(i,kte,j)=avev_q(i,kte-1,j)
  355. ENDDO
  356. ENDDO
  357. ! max /min value
  358. DO J = jts, jte
  359. DO I = its, ite
  360. DO K = kts+1,kte-1
  361. avev_qmax(i,k,j)=avev_q(i,k,j)
  362. avev_qmin(i,k,j)=avev_q(i,k,j)
  363. DO kk=-1,1
  364. if(avev_q(i,k+kk,j).gt.avev_qmax(i,k,j)) avev_qmax(i,k,j)=avev_q(i,k+kk,j)
  365. if(avev_q(i,k+kk,j).lt.avev_qmin(i,k,j)) avev_qmin(i,k,j)=avev_q(i,k+kk,j)
  366. ENDDO
  367. if(avev_qmax(i,k,j).gt.avev_qmin(i,k,j)) then
  368. coef_v(i,k,j)=(avev_q(i,k,j)-avev_qmin(i,k,j))/(avev_qmax(i,k,j)-avev_qmin(i,k,j))
  369. else
  370. coef_v(i,k,j)=0
  371. endif
  372. tpart_v(i,k,j)=coef_v(i,k,j)*(T(i,k,j)-avev_t(i,k,j))
  373. ENDDO
  374. tpart_v(i,kts,j)= tpart_v(i,kts+1,j) ! lowest level
  375. tpart_v(i,kte,j)= tpart_v(i,kte-1,j) ! highest level
  376. ENDDO
  377. ENDDO
  378. ENDIF ! endif (trigger.eq.2)
  379. !
  380. DO J = jts,jte
  381. DO I= its,ite
  382. CU_ACT_FLAG(i,j) = .true.
  383. ENDDO
  384. ENDDO
  385. DO J = jts,jte
  386. DO I=its,ite
  387. IF ( NCA(I,J) .ge. 0.5*DT ) then
  388. CU_ACT_FLAG(i,j) = .false.
  389. ELSE
  390. DO k=kts,kte
  391. DQDT(k)=0.
  392. DQIDT(k)=0.
  393. DQCDT(k)=0.
  394. DQRDT(k)=0.
  395. DQSDT(k)=0.
  396. DTDT(k)=0.
  397. ENDDO
  398. RAINCV(I,J)=0.
  399. CUTOP(I,J)=KTS
  400. CUBOT(I,J)=KTE+1
  401. PRATEC(I,J)=0.
  402. !
  403. ! assign vars from 3D to 1D
  404. DO K=kts,kte
  405. U1D(K) =U(I,K,J)
  406. V1D(K) =V(I,K,J)
  407. T1D(K) =T(I,K,J)
  408. RHO1D(K) =rho(I,K,J)
  409. QV1D(K)=QV(I,K,J)
  410. P1D(K) =Pcps(I,K,J)
  411. W0AVG1D(K) =W0AVG(I,K,J)
  412. DZ1D(k)=dz8w(I,K,J)
  413. IF (trigger.eq.2) THEN
  414. tpart_h1D(K) =tpart_h(I,K,J)
  415. tpart_v1D(K) =tpart_v(I,K,J)
  416. ELSE
  417. tpart_h1D(K) = 0.
  418. tpart_v1D(K) = 0.
  419. ENDIF
  420. ENDDO
  421. CALL KF_eta_PARA(I, J, &
  422. U1D,V1D,T1D,QV1D,P1D,DZ1D,W0AVG1D, &
  423. tpart_h1D,tpart_v1D, &
  424. trigger, &
  425. DT,DX,DXSQ,RHO1D, &
  426. XLV0,XLV1,XLS0,XLS1,CP,R,G, &
  427. EP2,SVP1,SVP2,SVP3,SVPT0, &
  428. DQDT,DQIDT,DQCDT,DQRDT,DQSDT,DTDT, &
  429. RAINCV,PRATEC,NCA, &
  430. flag_QI,flag_QS,warm_rain, &
  431. CUTOP,CUBOT,CUDT, &
  432. ids,ide, jds,jde, kds,kde, &
  433. ims,ime, jms,jme, kms,kme, &
  434. its,ite, jts,jte, kts,kte)
  435. IF(PRESENT(rthcuten).AND.PRESENT(rqvcuten)) THEN
  436. DO K=kts,kte
  437. RTHCUTEN(I,K,J)=DTDT(K)/pi(I,K,J)
  438. RQVCUTEN(I,K,J)=DQDT(K)
  439. ENDDO
  440. ENDIF
  441. IF(PRESENT(rqrcuten).AND.PRESENT(rqccuten)) THEN
  442. IF( F_QR )THEN
  443. DO K=kts,kte
  444. RQRCUTEN(I,K,J)=DQRDT(K)
  445. RQCCUTEN(I,K,J)=DQCDT(K)
  446. ENDDO
  447. ELSE
  448. ! This is the case for Eta microphysics without 3d rain field
  449. DO K=kts,kte
  450. RQRCUTEN(I,K,J)=0.
  451. RQCCUTEN(I,K,J)=DQRDT(K)+DQCDT(K)
  452. ENDDO
  453. ENDIF
  454. ENDIF
  455. !...... QSTEN STORES GRAUPEL TENDENCY IF IT EXISTS, OTHERISE SNOW (V2)
  456. IF(PRESENT( rqicuten )) THEN
  457. IF ( F_QI ) THEN
  458. DO K=kts,kte
  459. RQICUTEN(I,K,J)=DQIDT(K)
  460. ENDDO
  461. ENDIF
  462. ENDIF
  463. IF(PRESENT( rqscuten )) THEN
  464. IF ( F_QS ) THEN
  465. DO K=kts,kte
  466. RQSCUTEN(I,K,J)=DQSDT(K)
  467. ENDDO
  468. ENDIF
  469. ENDIF
  470. !
  471. ENDIF
  472. ENDDO ! i-loop
  473. ENDDO ! j-loop
  474. ENDIF ! run_param
  475. !
  476. END SUBROUTINE KF_eta_CPS
  477. ! ****************************************************************************
  478. !-----------------------------------------------------------
  479. SUBROUTINE KF_eta_PARA (I, J, &
  480. U0,V0,T0,QV0,P0,DZQ,W0AVG1D, &
  481. TPART_H0,TPART_V0, &
  482. trigger, &
  483. DT,DX,DXSQ,rhoe, &
  484. XLV0,XLV1,XLS0,XLS1,CP,R,G, &
  485. EP2,SVP1,SVP2,SVP3,SVPT0, &
  486. DQDT,DQIDT,DQCDT,DQRDT,DQSDT,DTDT, &
  487. RAINCV,PRATEC,NCA, &
  488. F_QI,F_QS,warm_rain, &
  489. CUTOP,CUBOT,CUDT, &
  490. ids,ide, jds,jde, kds,kde, &
  491. ims,ime, jms,jme, kms,kme, &
  492. its,ite, jts,jte, kts,kte)
  493. !-----------------------------------------------------------
  494. !***** The KF scheme that is currently used in experimental runs of EMCs
  495. !***** Eta model....jsk 8/00
  496. !
  497. IMPLICIT NONE
  498. !-----------------------------------------------------------
  499. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
  500. ims,ime, jms,jme, kms,kme, &
  501. its,ite, jts,jte, kts,kte, &
  502. I,J
  503. ! ,P_QI,P_QS,P_FIRST_SCALAR
  504. INTEGER, INTENT(IN ) :: trigger
  505. LOGICAL, INTENT(IN ) :: F_QI, F_QS
  506. LOGICAL, INTENT(IN ) :: warm_rain
  507. !
  508. REAL, DIMENSION( kts:kte ), &
  509. INTENT(IN ) :: U0, &
  510. V0, &
  511. TPART_H0, &
  512. TPART_V0, &
  513. T0, &
  514. QV0, &
  515. P0, &
  516. rhoe, &
  517. DZQ, &
  518. W0AVG1D
  519. !
  520. REAL, INTENT(IN ) :: DT,DX,DXSQ
  521. !
  522. REAL, INTENT(IN ) :: XLV0,XLV1,XLS0,XLS1,CP,R,G
  523. REAL, INTENT(IN ) :: EP2,SVP1,SVP2,SVP3,SVPT0
  524. !
  525. REAL, DIMENSION( kts:kte ), INTENT(INOUT) :: &
  526. DQDT, &
  527. DQIDT, &
  528. DQCDT, &
  529. DQRDT, &
  530. DQSDT, &
  531. DTDT
  532. REAL, DIMENSION( ims:ime , jms:jme ), &
  533. INTENT(INOUT) :: NCA
  534. REAL, DIMENSION( ims:ime , jms:jme ), &
  535. INTENT(INOUT) :: RAINCV
  536. REAL, DIMENSION( ims:ime , jms:jme ), &
  537. INTENT(INOUT) :: PRATEC
  538. REAL, DIMENSION( ims:ime , jms:jme ), &
  539. INTENT(OUT) :: CUBOT, &
  540. CUTOP
  541. REAL, INTENT(IN ) :: CUDT
  542. !
  543. !...DEFINE LOCAL VARIABLES...
  544. !
  545. REAL, DIMENSION( kts:kte ) :: &
  546. Q0,Z0,TV0,TU,TVU,QU,TZ,TVD, &
  547. QD,QES,THTES,TG,TVG,QG,WU,WD,W0,EMS,EMSD, &
  548. UMF,UER,UDR,DMF,DER,DDR,UMF2,UER2, &
  549. UDR2,DMF2,DER2,DDR2,DZA,THTA0,THETEE, &
  550. THTAU,THETEU,THTAD,THETED,QLIQ,QICE, &
  551. QLQOUT,QICOUT,PPTLIQ,PPTICE,DETLQ,DETIC, &
  552. DETLQ2,DETIC2,RATIO,RATIO2
  553. REAL, DIMENSION( kts:kte ) :: &
  554. DOMGDP,EXN,TVQU,DP,RH,EQFRC,WSPD, &
  555. QDT,FXM,THTAG,THPA,THFXOUT, &
  556. THFXIN,QPA,QFXOUT,QFXIN,QLPA,QLFXIN, &
  557. QLFXOUT,QIPA,QIFXIN,QIFXOUT,QRPA, &
  558. QRFXIN,QRFXOUT,QSPA,QSFXIN,QSFXOUT, &
  559. QL0,QLG,QI0,QIG,QR0,QRG,QS0,QSG
  560. REAL, DIMENSION( kts:kte+1 ) :: OMG
  561. REAL, DIMENSION( kts:kte ) :: RAINFB,SNOWFB
  562. REAL, DIMENSION( kts:kte ) :: &
  563. CLDHGT,QSD,DILFRC,DDILFRC,TKE,TGU,QGU,THTEEG
  564. ! LOCAL VARS
  565. REAL :: P00,T00,RLF,RHIC,RHBC,PIE, &
  566. TTFRZ,TBFRZ,C5,RATE
  567. REAL :: GDRY,ROCP,ALIQ,BLIQ, &
  568. CLIQ,DLIQ
  569. REAL :: FBFRC,P300,DPTHMX,THMIX,QMIX,ZMIX,PMIX, &
  570. ROCPQ,TMIX,EMIX,TLOG,TDPT,TLCL,TVLCL, &
  571. CPORQ,PLCL,ES,DLP,TENV,QENV,TVEN,TVBAR, &
  572. ZLCL,WKL,WABS,TRPPT,WSIGNE,DTLCL,GDT,WLCL,&
  573. TVAVG,QESE,WTW,RHOLCL,AU0,VMFLCL,UPOLD, &
  574. UPNEW,ABE,WKLCL,TTEMP,FRC1, &
  575. QNEWIC,RL,R1,QNWFRZ,EFFQ,BE,BOTERM,ENTERM,&
  576. DZZ,UDLBE,REI,EE2,UD2,TTMP,F1,F2, &
  577. THTTMP,QTMP,TMPLIQ,TMPICE,TU95,TU10,EE1, &
  578. UD1,DPTT,QNEWLQ,DUMFDP,EE,TSAT, &
  579. THTA,VCONV,TIMEC,SHSIGN,VWS,PEF, &
  580. CBH,RCBH,PEFCBH,PEFF,PEFF2,TDER,THTMIN, &
  581. DTMLTD,QS,TADVEC,DPDD,FRC,DPT,RDD,A1, &
  582. DSSDT,DTMP,T1RH,QSRH,PPTFLX,CPR,CNDTNF, &
  583. UPDINC,AINCM2,DEVDMF,PPR,RCED,DPPTDF, &
  584. DMFLFS,DMFLFS2,RCED2,DDINC,AINCMX,AINCM1, &
  585. AINC,TDER2,PPTFL2,FABE,STAB,DTT,DTT1, &
  586. DTIME,TMA,TMB,TMM,BCOEFF,ACOEFF,QVDIFF, &
  587. TOPOMG,CPM,DQ,ABEG,DABE,DFDA,FRC2,DR, &
  588. UDFRC,TUC,QGS,RH0,RHG,QINIT,QFNL,ERR2, &
  589. RELERR,RLC,RLS,RNC,FABEOLD,AINCOLD,UEFRC, &
  590. DDFRC,TDC,DEFRC,RHBAR,DMFFRC,DPMIN,DILBE
  591. REAL :: ASTRT,TP,VALUE,AINTRP,TKEMAX,QFRZ,&
  592. QSS,PPTMLT,DTMELT,RHH,EVAC,BINC
  593. !
  594. INTEGER :: INDLU,NU,NUCHM,NNN,KLFS
  595. REAL :: CHMIN,PM15,CHMAX,DTRH,RAD,DPPP
  596. REAL :: TVDIFF,DTTOT,ABSOMG,ABSOMGTC,FRDP
  597. INTEGER :: KX,K,KL
  598. !
  599. INTEGER :: NCHECK
  600. INTEGER, DIMENSION (kts:kte) :: KCHECK
  601. INTEGER :: ISTOP,ML,L5,KMIX,LOW, &
  602. LC,MXLAYR,LLFC,NLAYRS,NK, &
  603. KPBL,KLCL,LCL,LET,IFLAG, &
  604. NK1,LTOP,NJ,LTOP1, &
  605. LTOPM1,LVF,KSTART,KMIN,LFS, &
  606. ND,NIC,LDB,LDT,ND1,NDK, &
  607. NM,LMAX,NCOUNT,NOITR, &
  608. NSTEP,NTC,NCHM,ISHALL,NSHALL
  609. LOGICAL :: IPRNT
  610. REAL :: u00,qslcl,rhlcl,dqssdt !jfb
  611. CHARACTER*1024 message
  612. !
  613. DATA P00,T00/1.E5,273.16/
  614. DATA RLF/3.339E5/
  615. DATA RHIC,RHBC/1.,0.90/
  616. DATA PIE,TTFRZ,TBFRZ,C5/3.141592654,268.16,248.16,1.0723E-3/
  617. DATA RATE/0.03/ ! wrf default
  618. ! DATA RATE/0.01/ ! value used in NRCM
  619. ! DATA RATE/0.001/ ! effectively turn off autoconversion
  620. !-----------------------------------------------------------
  621. IPRNT=.FALSE.
  622. GDRY=-G/CP
  623. ROCP=R/CP
  624. NSHALL = 0
  625. KL=kte
  626. KX=kte
  627. !
  628. ! ALIQ = 613.3
  629. ! BLIQ = 17.502
  630. ! CLIQ = 4780.8
  631. ! DLIQ = 32.19
  632. ALIQ = SVP1*1000.
  633. BLIQ = SVP2
  634. CLIQ = SVP2*SVPT0
  635. DLIQ = SVP3
  636. !
  637. !
  638. !****************************************************************************
  639. ! ! PPT FB MODS
  640. !...OPTION TO FEED CONVECTIVELY GENERATED RAINWATER ! PPT FB MODS
  641. !...INTO GRID-RESOLVED RAINWATER (OR SNOW/GRAUPEL) ! PPT FB MODS
  642. !...FIELD. "FBFRC" IS THE FRACTION OF AVAILABLE ! PPT FB MODS
  643. !...PRECIPITATION TO BE FED BACK (0.0 - 1.0)... ! PPT FB MODS
  644. FBFRC=0.0 ! PPT FB MODS
  645. !...mods to allow shallow convection...
  646. NCHM = 0
  647. ISHALL = 0
  648. DPMIN = 5.E3
  649. !...
  650. P300=P0(1)-30000.
  651. !
  652. !...PRESSURE PERTURBATION TERM IS ONLY DEFINED AT MID-POINT OF
  653. !...VERTICAL LAYERS...SINCE TOTAL PRESSURE IS NEEDED AT THE TOP AND
  654. !...BOTTOM OF LAYERS BELOW, DO AN INTERPOLATION...
  655. !
  656. !...INPUT A VERTICAL SOUNDING ... NOTE THAT MODEL LAYERS ARE NUMBERED
  657. !...FROM BOTTOM-UP IN THE KF SCHEME...
  658. !
  659. ML=0
  660. !SUE tmprpsb=1./PSB(I,J)
  661. !SUE CELL=PTOP*tmprpsb
  662. !
  663. DO K=1,KX
  664. !
  665. ! Saturation vapor pressure (ES) is calculated following Buck (1981)
  666. !...IF Q0 IS ABOVE SATURATION VALUE, REDUCE IT TO SATURATION LEVEL...
  667. !
  668. ES=ALIQ*EXP((BLIQ*T0(K)-CLIQ)/(T0(K)-DLIQ))
  669. QES(K)=0.622*ES/(P0(K)-ES)
  670. Q0(K)=AMIN1(QES(K),QV0(K))
  671. Q0(K)=AMAX1(0.000001,Q0(K))
  672. QL0(K)=0.
  673. QI0(K)=0.
  674. QR0(K)=0.
  675. QS0(K)=0.
  676. RH(K) = Q0(K)/QES(K)
  677. DILFRC(K) = 1.
  678. TV0(K)=T0(K)*(1.+0.608*Q0(K))
  679. ! RHOE(K)=P0(K)/(R*TV0(K))
  680. ! DP IS THE PRESSURE INTERVAL BETWEEN FULL SIGMA LEVELS...
  681. DP(K)=rhoe(k)*g*DZQ(k)
  682. ! IF Turbulent Kinetic Energy (TKE) is available from turbulent mixing scheme
  683. ! use it for shallow convection...For now, assume it is not available....
  684. ! TKE(K) = Q2(I,J,NK)
  685. TKE(K) = 0.
  686. CLDHGT(K) = 0.
  687. ! IF(P0(K).GE.500E2)L5=K
  688. IF(P0(K).GE.0.5*P0(1))L5=K
  689. IF(P0(K).GE.P300)LLFC=K
  690. ENDDO
  691. !
  692. !...DZQ IS DZ BETWEEN SIGMA SURFACES, DZA IS DZ BETWEEN MODEL HALF LEVEL
  693. Z0(1)=.5*DZQ(1)
  694. !cdir novector
  695. DO K=2,KL
  696. Z0(K)=Z0(K-1)+.5*(DZQ(K)+DZQ(K-1))
  697. DZA(K-1)=Z0(K)-Z0(K-1)
  698. ENDDO
  699. DZA(KL)=0.
  700. !
  701. !
  702. ! To save time, specify a pressure interval to move up in sequential
  703. ! check of different ~50 mb deep groups of adjacent model layers in
  704. ! the process of identifying updraft source layer (USL). Note that
  705. ! this search is terminated as soon as a buoyant parcel is found and
  706. ! this parcel can produce a cloud greater than specifed minimum depth
  707. ! (CHMIN)...For now, set interval at 15 mb...
  708. !
  709. NCHECK = 1
  710. KCHECK(NCHECK)=1
  711. PM15 = P0(1)-15.E2
  712. DO K=2,LLFC
  713. IF(P0(K).LT.PM15)THEN
  714. NCHECK = NCHECK+1
  715. KCHECK(NCHECK) = K
  716. PM15 = PM15-15.E2
  717. ENDIF
  718. ENDDO
  719. !
  720. NU=0
  721. NUCHM=0
  722. usl: DO
  723. NU = NU+1
  724. IF(NU.GT.NCHECK)THEN
  725. IF(ISHALL.EQ.1)THEN
  726. CHMAX = 0.
  727. NCHM = 0
  728. DO NK = 1,NCHECK
  729. NNN=KCHECK(NK)
  730. IF(CLDHGT(NNN).GT.CHMAX)THEN
  731. NCHM = NNN
  732. NUCHM = NK
  733. CHMAX = CLDHGT(NNN)
  734. ENDIF
  735. ENDDO
  736. NU = NUCHM-1
  737. FBFRC=1.
  738. CYCLE usl
  739. ELSE
  740. RETURN
  741. ENDIF
  742. ENDIF
  743. KMIX = KCHECK(NU)
  744. LOW=KMIX
  745. !...
  746. LC = LOW
  747. !
  748. !...ASSUME THAT IN ORDER TO SUPPORT A DEEP UPDRAFT YOU NEED A LAYER OF
  749. !...UNSTABLE AIR AT LEAST 50 mb DEEP...TO APPROXIMATE THIS, ISOLATE A
  750. !...GROUP OF ADJACENT INDIVIDUAL MODEL LAYERS, WITH THE BASE AT LEVEL
  751. !...LC, SUCH THAT THE COMBINED DEPTH OF THESE LAYERS IS AT LEAST 50 mb..
  752. !
  753. NLAYRS=0
  754. DPTHMX=0.
  755. NK=LC-1
  756. IF ( NK+1 .LT. KTS ) THEN
  757. WRITE(message,*)'WOULD GO OFF BOTTOM: KF_ETA_PARA I,J,NK',I,J,NK
  758. CALL wrf_message (TRIM(message))
  759. ELSE
  760. DO
  761. NK=NK+1
  762. IF ( NK .GT. KTE ) THEN
  763. WRITE(message,*)'WOULD GO OFF TOP: KF_ETA_PARA I,J,DPTHMX,DPMIN',I,J,DPTHMX,DPMIN
  764. CALL wrf_message (TRIM(message))
  765. EXIT
  766. ENDIF
  767. DPTHMX=DPTHMX+DP(NK)
  768. NLAYRS=NLAYRS+1
  769. IF(DPTHMX.GT.DPMIN)THEN
  770. EXIT
  771. ENDIF
  772. END DO
  773. ENDIF
  774. IF(DPTHMX.LT.DPMIN)THEN
  775. RETURN
  776. ENDIF
  777. KPBL=LC+NLAYRS-1
  778. !
  779. !...********************************************************
  780. !...for computational simplicity without much loss in accuracy,
  781. !...mix temperature instead of theta for evaluating convective
  782. !...initiation (triggering) potential...
  783. ! THMIX=0.
  784. TMIX=0.
  785. QMIX=0.
  786. ZMIX=0.
  787. PMIX=0.
  788. !
  789. !...FIND THE THERMODYNAMIC CHARACTERISTICS OF THE LAYER BY
  790. !...MASS-WEIGHTING THE CHARACTERISTICS OF THE INDIVIDUAL MODEL
  791. !...LAYERS...
  792. !
  793. !cdir novector
  794. DO NK=LC,KPBL
  795. TMIX=TMIX+DP(NK)*T0(NK)
  796. QMIX=QMIX+DP(NK)*Q0(NK)
  797. ZMIX=ZMIX+DP(NK)*Z0(NK)
  798. PMIX=PMIX+DP(NK)*P0(NK)
  799. ENDDO
  800. ! THMIX=THMIX/DPTHMX
  801. TMIX=TMIX/DPTHMX
  802. QMIX=QMIX/DPTHMX
  803. ZMIX=ZMIX/DPTHMX
  804. PMIX=PMIX/DPTHMX
  805. EMIX=QMIX*PMIX/(0.622+QMIX)
  806. !
  807. !...FIND THE TEMPERATURE OF THE MIXTURE AT ITS LCL...
  808. !
  809. ! TLOG=ALOG(EMIX/ALIQ)
  810. ! ...calculate dewpoint using lookup table...
  811. !
  812. astrt=1.e-3
  813. ainc=0.075
  814. a1=emix/aliq
  815. tp=(a1-astrt)/ainc
  816. indlu=int(tp)+1
  817. value=(indlu-1)*ainc+astrt
  818. aintrp=(a1-value)/ainc
  819. tlog=aintrp*alu(indlu+1)+(1-aintrp)*alu(indlu)
  820. TDPT=(CLIQ-DLIQ*TLOG)/(BLIQ-TLOG)
  821. TLCL=TDPT-(.212+1.571E-3*(TDPT-T00)-4.36E-4*(TMIX-T00))*(TMIX-TDPT)
  822. TLCL=AMIN1(TLCL,TMIX)
  823. TVLCL=TLCL*(1.+0.608*QMIX)
  824. ZLCL = ZMIX+(TLCL-TMIX)/GDRY
  825. NK = LC-1
  826. DO
  827. NK = NK+1
  828. KLCL=NK
  829. IF(ZLCL.LE.Z0(NK) .or. NK.GT.KL)THEN
  830. EXIT
  831. ENDIF
  832. ENDDO
  833. IF(NK.GT.KL)THEN
  834. RETURN
  835. ENDIF
  836. K=KLCL-1
  837. ! calculate DLP using Z instead of log(P)
  838. DLP=(ZLCL-Z0(K))/(Z0(KLCL)-Z0(K))
  839. !
  840. !...ESTIMATE ENVIRONMENTAL TEMPERATURE AND MIXING RATIO AT THE LCL...
  841. !
  842. TENV=T0(K)+(T0(KLCL)-T0(K))*DLP
  843. QENV=Q0(K)+(Q0(KLCL)-Q0(K))*DLP
  844. TVEN=TENV*(1.+0.608*QENV)
  845. !
  846. !...CHECK TO SEE IF CLOUD IS BUOYANT USING FRITSCH-CHAPPELL TRIGGER
  847. !...FUNCTION DESCRIBED IN KAIN AND FRITSCH (1992)...W0 IS AN
  848. !...APROXIMATE VALUE FOR THE RUNNING-MEAN GRID-SCALE VERTICAL
  849. !...VELOCITY, WHICH GIVES SMOOTHER FIELDS OF CONVECTIVE INITIATION
  850. !...THAN THE INSTANTANEOUS VALUE...FORMULA RELATING TEMPERATURE
  851. !...PERTURBATION TO VERTICAL VELOCITY HAS BEEN USED WITH THE MOST
  852. !...SUCCESS AT GRID LENGTHS NEAR 25 km. FOR DIFFERENT GRID-LENGTHS,
  853. !...ADJUST VERTICAL VELOCITY TO EQUIVALENT VALUE FOR 25 KM GRID
  854. !...LENGTH, ASSUMING LINEAR DEPENDENCE OF W ON GRID LENGTH...
  855. !
  856. IF(ZLCL.LT.2.E3)THEN ! Kain (2004) Eq. 2
  857. WKLCL=0.02*ZLCL/2.E3
  858. ELSE
  859. WKLCL=0.02 ! units of m/s
  860. ENDIF
  861. WKL=(W0AVG1D(K)+(W0AVG1D(KLCL)-W0AVG1D(K))*DLP)*DX/25.E3-WKLCL
  862. IF(WKL.LT.0.0001)THEN
  863. DTLCL=0.
  864. ELSE
  865. DTLCL=4.64*WKL**0.33 ! Kain (2004) Eq. 1
  866. ENDIF
  867. ! New trigger function
  868. IF(trigger.eq.2) then
  869. DTLCL=amax1(TPART_H0(KLCL)+TPART_V0(KLCL),0.0)
  870. ENDIF
  871. ! end for trigger function
  872. !
  873. dtrh = 0.
  874. if (trigger .eq. 3) then
  875. !...for ETA model, give parcel an extra temperature perturbation based
  876. !...the threshold RH for condensation (U00)...
  877. ! as described in Narita and Ohmori (2007, 12th Mesoscale Conf.
  878. !
  879. !...for now, just assume U00=0.75...
  880. !...!!!!!! for MM5, SET DTRH = 0. !!!!!!!!
  881. U00 = 0.75
  882. IF(U00.lt.1.)THEN
  883. QSLCL=QES(K)+(QES(KLCL)-QES(K))*DLP
  884. RHLCL = QENV/QSLCL
  885. DQSSDT = QMIX*(CLIQ-BLIQ*DLIQ)/((TLCL-DLIQ)*(TLCL-DLIQ))
  886. IF(RHLCL.ge.0.75 .and. RHLCL.le.0.95)then
  887. DTRH = 0.25*(RHLCL-0.75)*QMIX/DQSSDT
  888. ELSEIF(RHLCL.GT.0.95)THEN
  889. DTRH = (1./RHLCL-1.)*QMIX/DQSSDT
  890. ELSE
  891. DTRH = 0.
  892. ENDIF
  893. ENDIF
  894. endif ! trigger 3
  895. ! IF(ISHALL.EQ.1)IPRNT=.TRUE.
  896. ! IPRNT=.TRUE.
  897. ! IF(TLCL+DTLCL.GT.TENV)GOTO 45
  898. trigger2: IF(TLCL+DTLCL+DTRH.LT.TENV)THEN
  899. !
  900. ! Parcel not buoyant, CYCLE back to start of trigger and evaluate next potential USL...
  901. !
  902. CYCLE usl
  903. !
  904. ELSE ! Parcel is buoyant, determine updraft
  905. !
  906. !...CONVECTIVE TRIGGERING CRITERIA HAS BEEN SATISFIED...COMPUTE
  907. !...EQUIVALENT POTENTIAL TEMPERATURE
  908. !...(THETEU) AND VERTICAL VELOCITY OF THE RISING PARCEL AT THE LCL...
  909. !
  910. CALL ENVIRTHT(PMIX,TMIX,QMIX,THETEU(K),ALIQ,BLIQ,CLIQ,DLIQ)
  911. !
  912. !...modify calculation of initial parcel vertical velocity...jsk 11/26/97
  913. !
  914. DTTOT = DTLCL+DTRH
  915. IF(DTTOT.GT.1.E-4)THEN
  916. GDT=2.*G*DTTOT*500./TVEN ! Kain (2004) Eq. 3 (sort of)
  917. WLCL=1.+0.5*SQRT(GDT)
  918. WLCL = AMIN1(WLCL,3.)
  919. ELSE
  920. WLCL=1.
  921. ENDIF
  922. PLCL=P0(K)+(P0(KLCL)-P0(K))*DLP
  923. WTW=WLCL*WLCL
  924. !
  925. TVLCL=TLCL*(1.+0.608*QMIX)
  926. RHOLCL=PLCL/(R*TVLCL)
  927. !
  928. LCL=KLCL
  929. LET=LCL
  930. ! make RAD a function of background vertical velocity... (Kain (2004) Eq. 6)
  931. IF(WKL.LT.0.)THEN
  932. RAD = 1000.
  933. ELSEIF(WKL.GT.0.1)THEN
  934. RAD = 2000.
  935. ELSE
  936. RAD = 1000.+1000*WKL/0.1
  937. ENDIF
  938. !
  939. !*******************************************************************
  940. ! *
  941. ! COMPUTE UPDRAFT PROPERTIES *
  942. ! *
  943. !*******************************************************************
  944. !
  945. !
  946. !...
  947. !...ESTIMATE INITIAL UPDRAFT MASS FLUX (UMF(K))...
  948. !
  949. WU(K)=WLCL
  950. AU0=0.01*DXSQ
  951. UMF(K)=RHOLCL*AU0
  952. VMFLCL=UMF(K)
  953. UPOLD=VMFLCL
  954. UPNEW=UPOLD
  955. !
  956. !...RATIO2 IS THE DEGREE OF GLACIATION IN THE CLOUD (0 TO 1),
  957. !...UER IS THE ENVIR ENTRAINMENT RATE, ABE IS AVAILABLE
  958. !...BUOYANT ENERGY, TRPPT IS THE TOTAL RATE OF PRECIPITATION
  959. !...PRODUCTION...
  960. !
  961. RATIO2(K)=0.
  962. UER(K)=0.
  963. ABE=0.
  964. TRPPT=0.
  965. TU(K)=TLCL
  966. TVU(K)=TVLCL
  967. QU(K)=QMIX
  968. EQFRC(K)=1.
  969. QLIQ(K)=0.
  970. QICE(K)=0.
  971. QLQOUT(K)=0.
  972. QICOUT(K)=0.
  973. DETLQ(K)=0.
  974. DETIC(K)=0.
  975. PPTLIQ(K)=0.
  976. PPTICE(K)=0.
  977. IFLAG=0
  978. !
  979. !...TTEMP IS USED DURING CALCULATION OF THE LINEAR GLACIATION
  980. !...PROCESS; IT IS INITIALLY SET TO THE TEMPERATURE AT WHICH
  981. !...FREEZING IS SPECIFIED TO BEGIN. WITHIN THE GLACIATION
  982. !...INTERVAL, IT IS SET EQUAL TO THE UPDRAFT TEMP AT THE
  983. !...PREVIOUS MODEL LEVEL...
  984. !
  985. TTEMP=TTFRZ
  986. !
  987. !...ENTER THE LOOP FOR UPDRAFT CALCULATIONS...CALCULATE UPDRAFT TEMP,
  988. !...MIXING RATIO, VERTICAL MASS FLUX, LATERAL DETRAINMENT OF MASS AND
  989. !...MOISTURE, PRECIPITATION RATES AT EACH MODEL LEVEL...
  990. !
  991. ! **1 variables indicate the bottom of a model layer
  992. ! **2 variables indicate the top of a model layer
  993. !
  994. EE1=1.
  995. UD1=0.
  996. REI = 0.
  997. DILBE = 0.
  998. updraft: DO NK=K,KL-1
  999. NK1=NK+1
  1000. RATIO2(NK1)=RATIO2(NK)
  1001. FRC1=0.
  1002. TU(NK1)=T0(NK1)
  1003. THETEU(NK1)=THETEU(NK)
  1004. QU(NK1)=QU(NK)
  1005. QLIQ(NK1)=QLIQ(NK)
  1006. QICE(NK1)=QICE(NK)
  1007. call tpmix2(p0(nk1),theteu(nk1),tu(nk1),qu(nk1),qliq(nk1), &
  1008. qice(nk1),qnewlq,qnewic,XLV1,XLV0)
  1009. !
  1010. !
  1011. !...CHECK TO SEE IF UPDRAFT TEMP IS ABOVE THE TEMPERATURE AT WHICH
  1012. !...GLACIATION IS ASSUMED TO INITIATE; IF IT IS, CALCULATE THE
  1013. !...FRACTION OF REMAINING LIQUID WATER TO FREEZE...TTFRZ IS THE
  1014. !...TEMP AT WHICH FREEZING BEGINS, TBFRZ THE TEMP BELOW WHICH ALL
  1015. !...LIQUID WATER IS FROZEN AT EACH LEVEL...
  1016. !
  1017. IF(TU(NK1).LE.TTFRZ)THEN
  1018. IF(TU(NK1).GT.TBFRZ)THEN
  1019. IF(TTEMP.GT.TTFRZ)TTEMP=TTFRZ
  1020. FRC1=(TTEMP-TU(NK1))/(TTEMP-TBFRZ)
  1021. ELSE
  1022. FRC1=1.
  1023. IFLAG=1
  1024. ENDIF
  1025. TTEMP=TU(NK1)
  1026. !
  1027. ! DETERMINE THE EFFECTS OF LIQUID WATER FREEZING WHEN TEMPERATURE
  1028. !...IS BELOW TTFRZ...
  1029. !
  1030. QFRZ = (QLIQ(NK1)+QNEWLQ)*FRC1
  1031. QNEWIC=QNEWIC+QNEWLQ*FRC1
  1032. QNEWLQ=QNEWLQ-QNEWLQ*FRC1
  1033. QICE(NK1) = QICE(NK1)+QLIQ(NK1)*FRC1
  1034. QLIQ(NK1) = QLIQ(NK1)-QLIQ(NK1)*FRC1
  1035. CALL DTFRZNEW(TU(NK1),P0(NK1),THETEU(NK1),QU(NK1),QFRZ, &
  1036. QICE(NK1),ALIQ,BLIQ,CLIQ,DLIQ)
  1037. ENDIF
  1038. TVU(NK1)=TU(NK1)*(1.+0.608*QU(NK1))
  1039. !
  1040. ! CALCULATE UPDRAFT VERTICAL VELOCITY AND PRECIPITATION FALLOUT...
  1041. !
  1042. IF(NK.EQ.K)THEN
  1043. BE=(TVLCL+TVU(NK1))/(TVEN+TV0(NK1))-1.
  1044. BOTERM=2.*(Z0(NK1)-ZLCL)*G*BE/1.5
  1045. DZZ=Z0(NK1)-ZLCL
  1046. ELSE
  1047. BE=(TVU(NK)+TVU(NK1))/(TV0(NK)+TV0(NK1))-1.
  1048. BOTERM=2.*DZA(NK)*G*BE/1.5
  1049. DZZ=DZA(NK)
  1050. ENDIF
  1051. ENTERM=2.*REI*WTW/UPOLD
  1052. CALL CONDLOAD(QLIQ(NK1),QICE(NK1),WTW,DZZ,BOTERM,ENTERM, &
  1053. RATE,QNEWLQ,QNEWIC,QLQOUT(NK1),QICOUT(NK1),G)
  1054. !
  1055. !...IF VERT VELOCITY IS LESS THAN ZERO, EXIT THE UPDRAFT LOOP AND,
  1056. !...IF CLOUD IS TALL ENOUGH, FINALIZE UPDRAFT CALCULATIONS...
  1057. !
  1058. IF(WTW.LT.1.E-3)THEN
  1059. EXIT
  1060. ELSE
  1061. WU(NK1)=SQRT(WTW)
  1062. ENDIF
  1063. !...Calculate value of THETA-E in environment to entrain into updraft...
  1064. !
  1065. CALL ENVIRTHT(P0(NK1),T0(NK1),Q0(NK1),THETEE(NK1),ALIQ,BLIQ,CLIQ,DLIQ)
  1066. !
  1067. !...REI IS THE RATE OF ENVIRONMENTAL INFLOW...
  1068. !
  1069. REI=VMFLCL*DP(NK1)*0.03/RAD ! KF (1990) Eq. 1; Kain (2004) Eq. 5
  1070. TVQU(NK1)=TU(NK1)*(1.+0.608*QU(NK1)-QLIQ(NK1)-QICE(NK1))
  1071. IF(NK.EQ.K)THEN
  1072. DILBE=((TVLCL+TVQU(NK1))/(TVEN+TV0(NK1))-1.)*DZZ
  1073. ELSE
  1074. DILBE=((TVQU(NK)+TVQU(NK1))/(TV0(NK)+TV0(NK1))-1.)*DZZ
  1075. ENDIF
  1076. IF(DILBE.GT.0.)ABE=ABE+DILBE*G
  1077. !
  1078. !...IF CLOUD PARCELS ARE VIRTUALLY COLDER THAN THE ENVIRONMENT, MINIMAL
  1079. !...ENTRAINMENT (0.5*REI) IS IMPOSED...
  1080. !
  1081. IF(TVQU(NK1).LE.TV0(NK1))THEN ! Entrain/Detrain IF BLOCK
  1082. EE2=0.5 ! Kain (2004) Eq. 4
  1083. UD2=1.
  1084. EQFRC(NK1)=0.
  1085. ELSE
  1086. LET=NK1
  1087. TTMP=TVQU(NK1)
  1088. !
  1089. !...DETERMINE THE CRITICAL MIXED FRACTION OF UPDRAFT AND ENVIRONMENTAL AIR...
  1090. !
  1091. F1=0.95
  1092. F2=1.-F1
  1093. THTTMP=F1*THETEE(NK1)+F2*THETEU(NK1)
  1094. QTMP=F1*Q0(NK1)+F2*QU(NK1)
  1095. TMPLIQ=F2*QLIQ(NK1)
  1096. TMPICE=F2*QICE(NK1)
  1097. call tpmix2(p0(nk1),thttmp,ttmp,qtmp,tmpliq,tmpice, &
  1098. qnewlq,qnewic,XLV1,XLV0)
  1099. TU95=TTMP*(1.+0.608*QTMP-TMPLIQ-TMPICE)
  1100. IF(TU95.GT.TV0(NK1))THEN
  1101. EE2=1.
  1102. UD2=0.
  1103. EQFRC(NK1)=1.0
  1104. ELSE
  1105. F1=0.10
  1106. F2=1.-F1
  1107. THTTMP=F1*THETEE(NK1)+F2*THETEU(NK1)
  1108. QTMP=F1*Q0(NK1)+F2*QU(NK1)
  1109. TMPLIQ=F2*QLIQ(NK1)
  1110. TMPICE=F2*QICE(NK1)
  1111. call tpmix2(p0(nk1),thttmp,ttmp,qtmp,tmpliq,tmpice, &
  1112. qnewlq,qnewic,XLV1,XLV0)
  1113. TU10=TTMP*(1.+0.608*QTMP-TMPLIQ-TMPICE)
  1114. TVDIFF = ABS(TU10-TVQU(NK1))
  1115. IF(TVDIFF.LT.1.e-3)THEN
  1116. EE2=1.
  1117. UD2=0.
  1118. EQFRC(NK1)=1.0
  1119. ELSE
  1120. EQFRC(NK1)=(TV0(NK1)-TVQU(NK1))*F1/(TU10-TVQU(NK1))
  1121. EQFRC(NK1)=AMAX1(0.0,EQFRC(NK1))
  1122. EQFRC(NK1)=AMIN1(1.0,EQFRC(NK1))
  1123. IF(EQFRC(NK1).EQ.1)THEN
  1124. EE2=1.
  1125. UD2=0.
  1126. ELSEIF(EQFRC(NK1).EQ.0.)THEN
  1127. EE2=0.
  1128. UD2=1.
  1129. ELSE
  1130. !
  1131. !...SUBROUTINE PROF5 INTEGRATES OVER THE GAUSSIAN DIST TO DETERMINE THE
  1132. ! FRACTIONAL ENTRAINMENT AND DETRAINMENT RATES...
  1133. !
  1134. CALL PROF5(EQFRC(NK1),EE2,UD2)
  1135. ENDIF
  1136. ENDIF
  1137. ENDIF
  1138. ENDIF ! End of Entrain/Detrain IF BLOCK
  1139. !
  1140. !
  1141. !...NET ENTRAINMENT AND DETRAINMENT RATES ARE GIVEN BY THE AVERAGE FRACTIONAL
  1142. ! VALUES IN THE LAYER...
  1143. !
  1144. EE2 = AMAX1(EE2,0.5)
  1145. UD2 = 1.5*UD2
  1146. UER(NK1)=0.5*REI*(EE1+EE2)
  1147. UDR(NK1)=0.5*REI*(UD1+UD2)
  1148. !
  1149. !...IF THE CALCULATED UPDRAFT DETRAINMENT RATE IS GREATER THAN THE TOTAL
  1150. ! UPDRAFT MASS FLUX, ALL CLOUD MASS DETRAINS, EXIT UPDRAFT CALCULATIONS...
  1151. !
  1152. IF(UMF(NK)-UDR(NK1).LT.10.)THEN
  1153. !
  1154. !...IF THE CALCULATED DETRAINED MASS FLUX IS GREATER THAN THE TOTAL UPD MASS
  1155. ! FLUX, IMPOSE TOTAL DETRAINMENT OF UPDRAFT MASS AT THE PREVIOUS MODEL LVL..
  1156. ! First, correct ABE calculation if needed...
  1157. !
  1158. IF(DILBE.GT.0.)THEN
  1159. ABE=ABE-DILBE*G
  1160. ENDIF
  1161. LET=NK
  1162. ! WRITE(98,1015)P0(NK1)/100.
  1163. EXIT
  1164. ELSE
  1165. EE1=EE2
  1166. UD1=UD2
  1167. UPOLD=UMF(NK)-UDR(NK1)
  1168. UPNEW=UPOLD+UER(NK1)
  1169. UMF(NK1)=UPNEW
  1170. DILFRC(NK1) = UPNEW/UPOLD
  1171. !
  1172. !...DETLQ AND DETIC ARE THE RATES OF DETRAINMENT OF LIQUID AND
  1173. !...ICE IN THE DETRAINING UPDRAFT MASS...
  1174. !
  1175. DETLQ(NK1)=QLIQ(NK1)*UDR(NK1)
  1176. DETIC(NK1)=QICE(NK1)*UDR(NK1)
  1177. QDT(NK1)=QU(NK1)
  1178. QU(NK1)=(UPOLD*QU(NK1)+UER(NK1)*Q0(NK1))/UPNEW
  1179. THETEU(NK1)=(THETEU(NK1)*UPOLD+THETEE(NK1)*UER(NK1))/UPNEW
  1180. QLIQ(NK1)=QLIQ(NK1)*UPOLD/UPNEW
  1181. QICE(NK1)=QICE(NK1)*UPOLD/UPNEW
  1182. !
  1183. !...PPTLIQ IS THE RATE OF GENERATION (FALLOUT) OF
  1184. !...LIQUID PRECIP AT A GIVEN MODEL LVL, PPTICE THE SAME FOR ICE,
  1185. !...TRPPT IS THE TOTAL RATE OF PRODUCTION OF PRECIP UP TO THE
  1186. !...CURRENT MODEL LEVEL...
  1187. !
  1188. PPTLIQ(NK1)=QLQOUT(NK1)*UMF(NK)
  1189. PPTICE(NK1)=QICOUT(NK1)*UMF(NK)
  1190. !
  1191. TRPPT=TRPPT+PPTLIQ(NK1)+PPTICE(NK1)
  1192. IF(NK1.LE.KPBL)UER(NK1)=UER(NK1)+VMFLCL*DP(NK1)/DPTHMX
  1193. ENDIF
  1194. !
  1195. END DO updraft
  1196. !
  1197. !...CHECK CLOUD DEPTH...IF CLOUD IS TALL ENOUGH, ESTIMATE THE EQUILIBRIUM
  1198. ! TEMPERATURE LEVEL (LET) AND ADJUST MASS FLUX PROFILE AT CLOUD TOP SO
  1199. ! THAT MASS FLUX DECREASES TO ZERO AS A LINEAR FUNCTION OF PRESSURE BETWEEN
  1200. ! THE LET AND CLOUD TOP...
  1201. !
  1202. !...LTOP IS THE MODEL LEVEL JUST BELOW THE LEVEL AT WHICH VERTICAL VELOCITY
  1203. ! FIRST BECOMES NEGATIVE...
  1204. !
  1205. LTOP=NK
  1206. CLDHGT(LC)=Z0(LTOP)-ZLCL
  1207. !
  1208. !...Instead of using the same minimum cloud height (for deep convection)
  1209. !...everywhere, try specifying minimum cloud depth as a function of TLCL...
  1210. !
  1211. ! Kain (2004) Eq. 7
  1212. !
  1213. IF(TLCL.GT.293.)THEN
  1214. CHMIN = 4.E3
  1215. ELSEIF(TLCL.LE.293. .and. TLCL.GE.273)THEN
  1216. CHMIN = 2.E3 + 100.*(TLCL-273.)
  1217. ELSEIF(TLCL.LT.273.)THEN
  1218. CHMIN = 2.E3
  1219. ENDIF
  1220. !
  1221. !...If cloud top height is less than the specified minimum for deep
  1222. !...convection, save value to consider this level as source for
  1223. !...shallow convection, go back up to check next level...
  1224. !
  1225. !...Try specifying minimum cloud depth as a function of TLCL...
  1226. !
  1227. !
  1228. !...DO NOT ALLOW ANY CLOUD FROM THIS LAYER IF:
  1229. !
  1230. !... 1.) if there is no CAPE, or
  1231. !... 2.) cloud top is at model level just above LCL, or
  1232. !... 3.) cloud top is within updraft source layer, or
  1233. !... 4.) cloud-top detrainment layer begins within
  1234. !... updraft source layer.
  1235. !
  1236. IF(LTOP.LE.KLCL .or. LTOP.LE.KPBL .or. LET+1.LE.KPBL)THEN ! No Convection Allowed
  1237. CLDHGT(LC)=0.
  1238. DO NK=K,LTOP
  1239. UMF(NK)=0.
  1240. UDR(NK)=0.
  1241. UER(NK)=0.
  1242. DETLQ(NK)=0.
  1243. DETIC(NK)=0.
  1244. PPTLIQ(NK)=0.
  1245. PPTICE(NK)=0.
  1246. ENDDO
  1247. !
  1248. ELSEIF(CLDHGT(LC).GT.CHMIN .and. ABE.GT.1)THEN ! Deep Convection allowed
  1249. ISHALL=0
  1250. EXIT usl
  1251. ELSE
  1252. !
  1253. !...TO DISALLOW SHALLOW CONVECTION, COMMENT OUT NEXT LINE !!!!!!!!
  1254. ISHALL = 1
  1255. IF(NU.EQ.NUCHM)THEN
  1256. EXIT usl ! Shallow Convection from this layer
  1257. ELSE
  1258. ! Remember this layer (by virtue of non-zero CLDHGT) as potential shallow-cloud layer
  1259. DO NK=K,LTOP
  1260. UMF(NK)=0.
  1261. UDR(NK)=0.
  1262. UER(NK)=0.
  1263. DETLQ(NK)=0.
  1264. DETIC(NK)=0.
  1265. PPTLIQ(NK)=0.
  1266. PPTICE(NK)=0.
  1267. ENDDO
  1268. ENDIF
  1269. ENDIF
  1270. ENDIF trigger2
  1271. END DO usl
  1272. IF(ISHALL.EQ.1)THEN
  1273. KSTART=MAX0(KPBL,KLCL)
  1274. LET=KSTART
  1275. endif
  1276. !
  1277. !...IF THE LET AND LTOP ARE THE SAME, DETRAIN ALL OF THE UPDRAFT MASS FL
  1278. ! THIS LEVEL...
  1279. !
  1280. IF(LET.EQ.LTOP)THEN
  1281. UDR(LTOP)=UMF(LTOP)+UDR(LTOP)-UER(LTOP)
  1282. DETLQ(LTOP)=QLIQ(LTOP)*UDR(LTOP)*UPNEW/UPOLD
  1283. DETIC(LTOP)=QICE(LTOP)*UDR(LTOP)*UPNEW/UPOLD
  1284. UER(LTOP)=0.
  1285. UMF(LTOP)=0.
  1286. ELSE
  1287. !
  1288. ! BEGIN TOTAL DETRAINMENT AT THE LEVEL ABOVE THE LET...
  1289. !
  1290. DPTT=0.
  1291. DO NJ=LET+1,LTOP
  1292. DPTT=DPTT+DP(NJ)
  1293. ENDDO
  1294. DUMFDP=UMF(LET)/DPTT
  1295. !
  1296. !...ADJUST MASS FLUX PROFILES, DETRAINMENT RATES, AND PRECIPITATION FALL
  1297. ! RATES TO REFLECT THE LINEAR DECREASE IN MASS FLX BETWEEN THE LET AND
  1298. !
  1299. DO NK=LET+1,LTOP
  1300. !
  1301. !...entrainment is allowed at every level except for LTOP, so disallow
  1302. !...entrainment at LTOP and adjust entrainment rates between LET and LTOP
  1303. !...so the the dilution factor due to entyrianment is not changed but
  1304. !...the actual entrainment rate will change due due forced total
  1305. !...detrainment in this layer...
  1306. !
  1307. IF(NK.EQ.LTOP)THEN
  1308. UDR(NK) = UMF(NK-1)
  1309. UER(NK) = 0.
  1310. DETLQ(NK) = UDR(NK)*QLIQ(N

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