PageRenderTime 80ms CodeModel.GetById 26ms RepoModel.GetById 1ms app.codeStats 0ms

/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
  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(NK)*DILFRC(NK)
  1311. DETIC(NK) = UDR(NK)*QICE(NK)*DILFRC(NK)
  1312. ELSE
  1313. UMF(NK)=UMF(NK-1)-DP(NK)*DUMFDP
  1314. UER(NK)=UMF(NK)*(1.-1./DILFRC(NK))
  1315. UDR(NK)=UMF(NK-1)-UMF(NK)+UER(NK)
  1316. DETLQ(NK)=UDR(NK)*QLIQ(NK)*DILFRC(NK)
  1317. DETIC(NK)=UDR(NK)*QICE(NK)*DILFRC(NK)
  1318. ENDIF
  1319. IF(NK.GE.LET+2)THEN
  1320. TRPPT=TRPPT-PPTLIQ(NK)-PPTICE(NK)
  1321. PPTLIQ(NK)=UMF(NK-1)*QLQOUT(NK)
  1322. PPTICE(NK)=UMF(NK-1)*QICOUT(NK)
  1323. TRPPT=TRPPT+PPTLIQ(NK)+PPTICE(NK)
  1324. ENDIF
  1325. ENDDO
  1326. ENDIF
  1327. !
  1328. ! Initialize some arrays below cloud base and above cloud top...
  1329. !
  1330. DO NK=1,LTOP
  1331. IF(T0(NK).GT.T00)ML=NK
  1332. ENDDO
  1333. DO NK=1,K
  1334. IF(NK.GE.LC)THEN
  1335. IF(NK.EQ.LC)THEN
  1336. UMF(NK)=VMFLCL*DP(NK)/DPTHMX
  1337. UER(NK)=VMFLCL*DP(NK)/DPTHMX
  1338. ELSEIF(NK.LE.KPBL)THEN
  1339. UER(NK)=VMFLCL*DP(NK)/DPTHMX
  1340. UMF(NK)=UMF(NK-1)+UER(NK)
  1341. ELSE
  1342. UMF(NK)=VMFLCL
  1343. UER(NK)=0.
  1344. ENDIF
  1345. TU(NK)=TMIX+(Z0(NK)-ZMIX)*GDRY
  1346. QU(NK)=QMIX
  1347. WU(NK)=WLCL
  1348. ELSE
  1349. TU(NK)=0.
  1350. QU(NK)=0.
  1351. UMF(NK)=0.
  1352. WU(NK)=0.
  1353. UER(NK)=0.
  1354. ENDIF
  1355. UDR(NK)=0.
  1356. QDT(NK)=0.
  1357. QLIQ(NK)=0.
  1358. QICE(NK)=0.
  1359. QLQOUT(NK)=0.
  1360. QICOUT(NK)=0.
  1361. PPTLIQ(NK)=0.
  1362. PPTICE(NK)=0.
  1363. DETLQ(NK)=0.
  1364. DETIC(NK)=0.
  1365. RATIO2(NK)=0.
  1366. CALL ENVIRTHT(P0(NK),T0(NK),Q0(NK),THETEE(NK),ALIQ,BLIQ,CLIQ,DLIQ)
  1367. EQFRC(NK)=1.0
  1368. ENDDO
  1369. !
  1370. LTOP1=LTOP+1
  1371. LTOPM1=LTOP-1
  1372. !
  1373. !...DEFINE VARIABLES ABOVE CLOUD TOP...
  1374. !
  1375. DO NK=LTOP1,KX
  1376. UMF(NK)=0.
  1377. UDR(NK)=0.
  1378. UER(NK)=0.
  1379. QDT(NK)=0.
  1380. QLIQ(NK)=0.
  1381. QICE(NK)=0.
  1382. QLQOUT(NK)=0.
  1383. QICOUT(NK)=0.
  1384. DETLQ(NK)=0.
  1385. DETIC(NK)=0.
  1386. PPTLIQ(NK)=0.
  1387. PPTICE(NK)=0.
  1388. IF(NK.GT.LTOP1)THEN
  1389. TU(NK)=0.
  1390. QU(NK)=0.
  1391. WU(NK)=0.
  1392. ENDIF
  1393. THTA0(NK)=0.
  1394. THTAU(NK)=0.
  1395. EMS(NK)=0.
  1396. EMSD(NK)=0.
  1397. TG(NK)=T0(NK)
  1398. QG(NK)=Q0(NK)
  1399. QLG(NK)=0.
  1400. QIG(NK)=0.
  1401. QRG(NK)=0.
  1402. QSG(NK)=0.
  1403. OMG(NK)=0.
  1404. ENDDO
  1405. OMG(KX+1)=0.
  1406. DO NK=1,LTOP
  1407. EMS(NK)=DP(NK)*DXSQ/G
  1408. EMSD(NK)=1./EMS(NK)
  1409. !
  1410. !...INITIALIZE SOME VARIABLES TO BE USED LATER IN THE VERT ADVECTION SCHEME
  1411. !
  1412. EXN(NK)=(P00/P0(NK))**(0.2854*(1.-0.28*QDT(NK)))
  1413. THTAU(NK)=TU(NK)*EXN(NK)
  1414. EXN(NK)=(P00/P0(NK))**(0.2854*(1.-0.28*Q0(NK)))
  1415. THTA0(NK)=T0(NK)*EXN(NK)
  1416. DDILFRC(NK) = 1./DILFRC(NK)
  1417. OMG(NK)=0.
  1418. ENDDO
  1419. ! IF (XTIME.LT.10.)THEN
  1420. ! WRITE(98,1025)KLCL,ZLCL,DTLCL,LTOP,P0(LTOP),IFLAG,
  1421. ! * TMIX-T00,PMIX,QMIX,ABE
  1422. ! WRITE(98,1030)P0(LET)/100.,P0(LTOP)/100.,VMFLCL,PLCL/100.,
  1423. ! * WLCL,CLDHGT
  1424. ! ENDIF
  1425. !
  1426. !...COMPUTE CONVECTIVE TIME SCALE(TIMEC). THE MEAN WIND AT THE LCL
  1427. !...AND MIDTROPOSPHERE IS USED.
  1428. !
  1429. WSPD(KLCL)=SQRT(U0(KLCL)*U0(KLCL)+V0(KLCL)*V0(KLCL))
  1430. WSPD(L5)=SQRT(U0(L5)*U0(L5)+V0(L5)*V0(L5))
  1431. WSPD(LTOP)=SQRT(U0(LTOP)*U0(LTOP)+V0(LTOP)*V0(LTOP))
  1432. VCONV=.5*(WSPD(KLCL)+WSPD(L5))
  1433. !...for ETA model, DX is a function of location...
  1434. ! TIMEC=DX(I,J)/VCONV
  1435. TIMEC=DX/VCONV
  1436. TADVEC=TIMEC
  1437. TIMEC=AMAX1(1800.,TIMEC) ! 30 minutes >= TIMEC <= 60 minutes
  1438. TIMEC=AMIN1(3600.,TIMEC)
  1439. IF(ISHALL.EQ.1)TIMEC=2400. ! shallow convection TIMEC = 40 minutes
  1440. NIC=NINT(TIMEC/DT)
  1441. TIMEC=FLOAT(NIC)*DT
  1442. !
  1443. !...COMPUTE WIND SHEAR AND PRECIPITATION EFFICIENCY.
  1444. !
  1445. IF(WSPD(LTOP).GT.WSPD(KLCL))THEN
  1446. SHSIGN=1.
  1447. ELSE
  1448. SHSIGN=-1.
  1449. ENDIF
  1450. VWS=(U0(LTOP)-U0(KLCL))*(U0(LTOP)-U0(KLCL))+(V0(LTOP)-V0(KLCL))* &
  1451. (V0(LTOP)-V0(KLCL))
  1452. VWS=1.E3*SHSIGN*SQRT(VWS)/(Z0(LTOP)-Z0(LCL))
  1453. PEF=1.591+VWS*(-.639+VWS*(9.53E-2-VWS*4.96E-3))
  1454. PEF=AMAX1(PEF,.2)
  1455. PEF=AMIN1(PEF,.9)
  1456. !
  1457. !...PRECIPITATION EFFICIENCY IS A FUNCTION OF THE HEIGHT OF CLOUD BASE.
  1458. !
  1459. CBH=(ZLCL-Z0(1))*3.281E-3
  1460. IF(CBH.LT.3.)THEN
  1461. RCBH=.02
  1462. ELSE
  1463. RCBH=.96729352+CBH*(-.70034167+CBH*(.162179896+CBH*(- &
  1464. 1.2569798E-2+CBH*(4.2772E-4-CBH*5.44E-6))))
  1465. ENDIF
  1466. IF(CBH.GT.25)RCBH=2.4
  1467. PEFCBH=1./(1.+RCBH)
  1468. PEFCBH=AMIN1(PEFCBH,.9)
  1469. !
  1470. !... MEAN PEF. IS USED TO COMPUTE RAINFALL.
  1471. !
  1472. PEFF=.5*(PEF+PEFCBH)
  1473. PEFF2 = PEFF ! JSK MODS
  1474. IF(IPRNT)THEN
  1475. ! WRITE(98,1035)PEF,PEFCBH,LC,LET,WKL,VWS
  1476. WRITE(message,1035)PEF,PEFCBH,LC,LET,WKL,VWS
  1477. CALL wrf_message( message )
  1478. ! call flush(98)
  1479. endif
  1480. ! WRITE(98,1035)PEF,PEFCBH,LC,LET,WKL,VWS
  1481. !*****************************************************************
  1482. ! *
  1483. ! COMPUTE DOWNDRAFT PROPERTIES *
  1484. ! *
  1485. !*****************************************************************
  1486. !
  1487. !
  1488. TDER=0.
  1489. devap:IF(ISHALL.EQ.1)THEN
  1490. LFS = 1
  1491. ELSE
  1492. !
  1493. !...start downdraft about 150 mb above cloud base...
  1494. !
  1495. ! KSTART=MAX0(KPBL,KLCL)
  1496. ! KSTART=KPBL ! Changed 7/23/99
  1497. KSTART=KPBL+1 ! Changed 7/23/99
  1498. KLFS = LET-1
  1499. DO NK = KSTART+1,KL
  1500. DPPP = P0(KSTART)-P0(NK)
  1501. ! IF(DPPP.GT.200.E2)THEN
  1502. IF(DPPP.GT.150.E2)THEN
  1503. KLFS = NK
  1504. EXIT
  1505. ENDIF
  1506. ENDDO
  1507. KLFS = MIN0(KLFS,LET-1)
  1508. LFS = KLFS
  1509. !
  1510. !...if LFS is not at least 50 mb above cloud base (implying that the
  1511. !...level of equil temp, LET, is just above cloud base) do not allow a
  1512. !...downdraft...
  1513. !
  1514. IF((P0(KSTART)-P0(LFS)).GT.50.E2)THEN
  1515. THETED(LFS) = THETEE(LFS)
  1516. QD(LFS) = Q0(LFS)
  1517. !
  1518. !...call tpmix2dd to find wet-bulb temp, qv...
  1519. !
  1520. call tpmix2dd(p0(lfs),theted(lfs),tz(lfs),qss,i,j)
  1521. THTAD(LFS)=TZ(LFS)*(P00/P0(LFS))**(0.2854*(1.-0.28*QSS))
  1522. !
  1523. !...TAKE A FIRST GUESS AT THE INITIAL DOWNDRAFT MASS FLUX...
  1524. !
  1525. TVD(LFS)=TZ(LFS)*(1.+0.608*QSS)
  1526. RDD=P0(LFS)/(R*TVD(LFS))
  1527. A1=(1.-PEFF)*AU0
  1528. DMF(LFS)=-A1*RDD
  1529. DER(LFS)=DMF(LFS)
  1530. DDR(LFS)=0.
  1531. RHBAR = RH(LFS)*DP(LFS)
  1532. DPTT = DP(LFS)
  1533. DO ND = LFS-1,KSTART,-1
  1534. ND1 = ND+1
  1535. DER(ND)=DER(LFS)*EMS(ND)/EMS(LFS)
  1536. DDR(ND)=0.
  1537. DMF(ND)=DMF(ND1)+DER(ND)
  1538. THETED(ND)=(THETED(ND1)*DMF(ND1)+THETEE(ND)*DER(ND))/DMF(ND)
  1539. QD(ND)=(QD(ND1)*DMF(ND1)+Q0(ND)*DER(ND))/DMF(ND)
  1540. DPTT = DPTT+DP(ND)
  1541. RHBAR = RHBAR+RH(ND)*DP(ND)
  1542. ENDDO
  1543. RHBAR = RHBAR/DPTT
  1544. DMFFRC = 2.*(1.-RHBAR) ! Kain (2004) eq. 11
  1545. DPDD = 0.
  1546. !...Calculate melting effect
  1547. !... first, compute total frozen precipitation generated...
  1548. !
  1549. pptmlt = 0.
  1550. DO NK = KLCL,LTOP
  1551. PPTMLT = PPTMLT+PPTICE(NK)
  1552. ENDDO
  1553. if(lc.lt.ml)then
  1554. !...For now, calculate melting effect as if DMF = -UMF at KLCL, i.e., as
  1555. !...if DMFFRC=1. Otherwise, for small DMFFRC, DTMELT gets too large!
  1556. !...12/14/98 jsk...
  1557. DTMELT = RLF*PPTMLT/(CP*UMF(KLCL))
  1558. else
  1559. DTMELT = 0.
  1560. endif
  1561. LDT = MIN0(LFS-1,KSTART-1)
  1562. !
  1563. call tpmix2dd(p0(kstart),theted(kstart),tz(kstart),qss,i,j)
  1564. !
  1565. tz(kstart) = tz(kstart)-dtmelt
  1566. ES=ALIQ*EXP((BLIQ*TZ(KSTART)-CLIQ)/(TZ(KSTART)-DLIQ))
  1567. QSS=0.622*ES/(P0(KSTART)-ES)
  1568. THETED(KSTART)=TZ(KSTART)*(1.E5/P0(KSTART))**(0.2854*(1.-0.28*QSS))* &
  1569. EXP((3374.6525/TZ(KSTART)-2.5403)*QSS*(1.+0.81*QSS))
  1570. !....
  1571. LDT = MIN0(LFS-1,KSTART-1)
  1572. DO ND = LDT,1,-1
  1573. DPDD = DPDD+DP(ND)
  1574. THETED(ND) = THETED(KSTART)
  1575. QD(ND) = QD(KSTART)
  1576. !
  1577. !...call tpmix2dd to find wet bulb temp, saturation mixing ratio...
  1578. !
  1579. call tpmix2dd(p0(nd),theted(nd),tz(nd),qss,i,j)
  1580. qsd(nd) = qss
  1581. !
  1582. !...specify RH decrease of 20%/km in downdraft...
  1583. !
  1584. RHH = 1.-0.2/1000.*(Z0(KSTART)-Z0(ND))
  1585. !
  1586. !...adjust downdraft TEMP, Q to specified RH:
  1587. !
  1588. IF(RHH.LT.1.)THEN
  1589. DSSDT=(CLIQ-BLIQ*DLIQ)/((TZ(ND)-DLIQ)*(TZ(ND)-DLIQ))
  1590. RL=XLV0-XLV1*TZ(ND)
  1591. DTMP=RL*QSS*(1.-RHH)/(CP+RL*RHH*QSS*DSSDT)
  1592. T1RH=TZ(ND)+DTMP
  1593. ES=RHH*ALIQ*EXP((BLIQ*T1RH-CLIQ)/(T1RH-DLIQ))
  1594. QSRH=0.622*ES/(P0(ND)-ES)
  1595. !
  1596. !...CHECK TO SEE IF MIXING RATIO AT SPECIFIED RH IS LESS THAN ACTUAL
  1597. !...MIXING RATIO...IF SO, ADJUST TO GIVE ZERO EVAPORATION...
  1598. !
  1599. IF(QSRH.LT.QD(ND))THEN
  1600. QSRH=QD(ND)
  1601. T1RH=TZ(ND)+(QSS-QSRH)*RL/CP
  1602. ENDIF
  1603. TZ(ND)=T1RH
  1604. QSS=QSRH
  1605. QSD(ND) = QSS
  1606. ENDIF
  1607. TVD(nd) = tz(nd)*(1.+0.608*qsd(nd))
  1608. IF(TVD(ND).GT.TV0(ND).OR.ND.EQ.1)THEN
  1609. LDB=ND
  1610. EXIT
  1611. ENDIF
  1612. ENDDO
  1613. IF((P0(LDB)-P0(LFS)) .gt. 50.E2)THEN ! minimum Downdraft depth!
  1614. DO ND=LDT,LDB,-1
  1615. ND1 = ND+1
  1616. DDR(ND) = -DMF(KSTART)*DP(ND)/DPDD
  1617. DER(ND) = 0.
  1618. DMF(ND) = DMF(ND1)+DDR(ND)
  1619. TDER=TDER+(QSD(nd)-QD(ND))*DDR(ND)
  1620. QD(ND)=QSD(nd)
  1621. THTAD(ND)=TZ(ND)*(P00/P0(ND))**(0.2854*(1.-0.28*QD(ND)))
  1622. ENDDO
  1623. ENDIF
  1624. ENDIF
  1625. ENDIF devap
  1626. !
  1627. !...IF DOWNDRAFT DOES NOT EVAPORATE ANY WATER FOR SPECIFIED RELATIVE
  1628. !...HUMIDITY, NO DOWNDRAFT IS ALLOWED...
  1629. !
  1630. d_mf: IF(TDER.LT.1.)THEN
  1631. ! WRITE(98,3004)I,J
  1632. !3004 FORMAT(' ','No Downdraft!; I=',I3,2X,'J=',I3,'ISHALL =',I2)
  1633. PPTFLX=TRPPT
  1634. CPR=TRPPT
  1635. TDER=0.
  1636. CNDTNF=0.
  1637. UPDINC=1.
  1638. LDB=LFS
  1639. DO NDK=1,LTOP
  1640. DMF(NDK)=0.
  1641. DER(NDK)=0.
  1642. DDR(NDK)=0.
  1643. THTAD(NDK)=0.
  1644. WD(NDK)=0.
  1645. TZ(NDK)=0.
  1646. QD(NDK)=0.
  1647. ENDDO
  1648. AINCM2=100.
  1649. ELSE
  1650. DDINC = -DMFFRC*UMF(KLCL)/DMF(KSTART)
  1651. UPDINC=1.
  1652. IF(TDER*DDINC.GT.TRPPT)THEN
  1653. DDINC = TRPPT/TDER
  1654. ENDIF
  1655. TDER = TDER*DDINC
  1656. DO NK=LDB,LFS
  1657. DMF(NK)=DMF(NK)*DDINC
  1658. DER(NK)=DER(NK)*DDINC
  1659. DDR(NK)=DDR(NK)*DDINC
  1660. ENDDO
  1661. CPR=TRPPT
  1662. PPTFLX = TRPPT-TDER
  1663. PEFF=PPTFLX/TRPPT
  1664. IF(IPRNT)THEN
  1665. ! write(98,*)'PRECIP EFFICIENCY =',PEFF
  1666. write(message,*)'PRECIP EFFICIENCY =',PEFF
  1667. CALL wrf_message(message)
  1668. ! call flush(98)
  1669. ENDIF
  1670. !
  1671. !
  1672. !...ADJUST UPDRAFT MASS FLUX, MASS DETRAINMENT RATE, AND LIQUID WATER AN
  1673. ! DETRAINMENT RATES TO BE CONSISTENT WITH THE TRANSFER OF THE ESTIMATE
  1674. ! FROM THE UPDRAFT TO THE DOWNDRAFT AT THE LFS...
  1675. !
  1676. ! DO NK=LC,LFS
  1677. ! UMF(NK)=UMF(NK)*UPDINC
  1678. ! UDR(NK)=UDR(NK)*UPDINC
  1679. ! UER(NK)=UER(NK)*UPDINC
  1680. ! PPTLIQ(NK)=PPTLIQ(NK)*UPDINC
  1681. ! PPTICE(NK)=PPTICE(NK)*UPDINC
  1682. ! DETLQ(NK)=DETLQ(NK)*UPDINC
  1683. ! DETIC(NK)=DETIC(NK)*UPDINC
  1684. ! ENDDO
  1685. !
  1686. !...ZERO OUT THE ARRAYS FOR DOWNDRAFT DATA AT LEVELS ABOVE AND BELOW THE
  1687. !...DOWNDRAFT...
  1688. !
  1689. IF(LDB.GT.1)THEN
  1690. DO NK=1,LDB-1
  1691. DMF(NK)=0.
  1692. DER(NK)=0.
  1693. DDR(NK)=0.
  1694. WD(NK)=0.
  1695. TZ(NK)=0.
  1696. QD(NK)=0.
  1697. THTAD(NK)=0.
  1698. ENDDO
  1699. ENDIF
  1700. DO NK=LFS+1,KX
  1701. DMF(NK)=0.
  1702. DER(NK)=0.
  1703. DDR(NK)=0.
  1704. WD(NK)=0.
  1705. TZ(NK)=0.
  1706. QD(NK)=0.
  1707. THTAD(NK)=0.
  1708. ENDDO
  1709. DO NK=LDT+1,LFS-1
  1710. TZ(NK)=0.
  1711. QD(NK)=0.
  1712. THTAD(NK)=0.
  1713. ENDDO
  1714. ENDIF d_mf
  1715. !
  1716. !...SET LIMITS ON THE UPDRAFT AND DOWNDRAFT MASS FLUXES SO THAT THE INFLOW
  1717. ! INTO CONVECTIVE DRAFTS FROM A GIVEN LAYER IS NO MORE THAN IS AVAILABLE
  1718. ! IN THAT LAYER INITIALLY...
  1719. !
  1720. AINCMX=1000.
  1721. LMAX=MAX0(KLCL,LFS)
  1722. DO NK=LC,LMAX
  1723. IF((UER(NK)-DER(NK)).GT.1.e-3)THEN
  1724. AINCM1=EMS(NK)/((UER(NK)-DER(NK))*TIMEC)
  1725. AINCMX=AMIN1(AINCMX,AINCM1)
  1726. ENDIF
  1727. ENDDO
  1728. AINC=1.
  1729. IF(AINCMX.LT.AINC)AINC=AINCMX
  1730. !
  1731. !...SAVE THE RELEVENT VARIABLES FOR A UNIT UPDRAFT AND DOWNDRAFT...THEY WILL
  1732. !...BE ITERATIVELY ADJUSTED BY THE FACTOR AINC TO SATISFY THE STABILIZATION
  1733. !...CLOSURE...
  1734. !
  1735. TDER2=TDER
  1736. PPTFL2=PPTFLX
  1737. DO NK=1,LTOP
  1738. DETLQ2(NK)=DETLQ(NK)
  1739. DETIC2(NK)=DETIC(NK)
  1740. UDR2(NK)=UDR(NK)
  1741. UER2(NK)=UER(NK)
  1742. DDR2(NK)=DDR(NK)
  1743. DER2(NK)=DER(NK)
  1744. UMF2(NK)=UMF(NK)
  1745. DMF2(NK)=DMF(NK)
  1746. ENDDO
  1747. FABE=1.
  1748. STAB=0.95
  1749. NOITR=0
  1750. ISTOP=0
  1751. !
  1752. IF(ISHALL.EQ.1)THEN ! First for shallow convection
  1753. !
  1754. ! No iteration for shallow convection; if turbulent kinetic energy (TKE) is available
  1755. ! from a turbulence parameterization, scale cloud-base updraft mass flux as a function
  1756. ! of TKE, but for now, just specify shallow-cloud mass flux using TKEMAX = 5...
  1757. !
  1758. !...find the maximum TKE value between LC and KLCL...
  1759. ! TKEMAX = 0.
  1760. TKEMAX = 5.
  1761. ! DO 173 K = LC,KLCL
  1762. ! NK = KX-K+1
  1763. ! TKEMAX = AMAX1(TKEMAX,Q2(I,J,NK))
  1764. ! 173 CONTINUE
  1765. ! TKEMAX = AMIN1(TKEMAX,10.)
  1766. ! TKEMAX = AMAX1(TKEMAX,5.)
  1767. !c TKEMAX = 10.
  1768. !c...3_24_99...DPMIN was changed for shallow convection so that it is the
  1769. !c... the same as for deep convection (5.E3). Since this doubles
  1770. !c... (roughly) the value of DPTHMX, add a factor of 0.5 to calcu-
  1771. !c... lation of EVAC...
  1772. !c EVAC = TKEMAX*0.1
  1773. EVAC = 0.5*TKEMAX*0.1
  1774. ! AINC = 0.1*DPTHMX*DXIJ*DXIJ/(VMFLCL*G*TIMEC)
  1775. ! AINC = EVAC*DPTHMX*DX(I,J)*DX(I,J)/(VMFLCL*G*TIMEC)
  1776. AINC = EVAC*DPTHMX*DXSQ/(VMFLCL*G*TIMEC)
  1777. TDER=TDER2*AINC
  1778. PPTFLX=PPTFL2*AINC
  1779. DO NK=1,LTOP
  1780. UMF(NK)=UMF2(NK)*AINC
  1781. DMF(NK)=DMF2(NK)*AINC
  1782. DETLQ(NK)=DETLQ2(NK)*AINC
  1783. DETIC(NK)=DETIC2(NK)*AINC
  1784. UDR(NK)=UDR2(NK)*AINC
  1785. UER(NK)=UER2(NK)*AINC
  1786. DER(NK)=DER2(NK)*AINC
  1787. DDR(NK)=DDR2(NK)*AINC
  1788. ENDDO
  1789. ENDIF ! Otherwise for deep convection
  1790. ! use iterative procedure to find mass fluxes...
  1791. iter: DO NCOUNT=1,10
  1792. !
  1793. !*****************************************************************
  1794. ! *
  1795. ! COMPUTE PROPERTIES FOR COMPENSATIONAL SUBSIDENCE *
  1796. ! *
  1797. !*****************************************************************
  1798. !
  1799. !...DETERMINE OMEGA VALUE NECESSARY AT TOP AND BOTTOM OF EACH LAYER TO
  1800. !...SATISFY MASS CONTINUITY...
  1801. !
  1802. DTT=TIMEC
  1803. DO NK=1,LTOP
  1804. DOMGDP(NK)=-(UER(NK)-DER(NK)-UDR(NK)-DDR(NK))*EMSD(NK)
  1805. IF(NK.GT.1)THEN
  1806. OMG(NK)=OMG(NK-1)-DP(NK-1)*DOMGDP(NK-1)
  1807. ABSOMG = ABS(OMG(NK))
  1808. ABSOMGTC = ABSOMG*TIMEC
  1809. FRDP = 0.75*DP(NK-1)
  1810. IF(ABSOMGTC.GT.FRDP)THEN
  1811. DTT1 = FRDP/ABSOMG
  1812. DTT=AMIN1(DTT,DTT1)
  1813. ENDIF
  1814. ENDIF
  1815. ENDDO
  1816. DO NK=1,LTOP
  1817. THPA(NK)=THTA0(NK)
  1818. QPA(NK)=Q0(NK)
  1819. NSTEP=NINT(TIMEC/DTT+1)
  1820. DTIME=TIMEC/FLOAT(NSTEP)
  1821. FXM(NK)=OMG(NK)*DXSQ/G
  1822. ENDDO
  1823. !
  1824. !...DO AN UPSTREAM/FORWARD-IN-TIME ADVECTION OF THETA, QV...
  1825. !
  1826. DO NTC=1,NSTEP
  1827. !
  1828. !...ASSIGN THETA AND Q VALUES AT THE TOP AND BOTTOM OF EACH LAYER BASED ON
  1829. !...SIGN OF OMEGA...
  1830. !
  1831. DO NK=1,LTOP
  1832. THFXIN(NK)=0.
  1833. THFXOUT(NK)=0.
  1834. QFXIN(NK)=0.
  1835. QFXOUT(NK)=0.
  1836. ENDDO
  1837. DO NK=2,LTOP
  1838. IF(OMG(NK).LE.0.)THEN
  1839. THFXIN(NK)=-FXM(NK)*THPA(NK-1)
  1840. QFXIN(NK)=-FXM(NK)*QPA(NK-1)
  1841. THFXOUT(NK-1)=THFXOUT(NK-1)+THFXIN(NK)
  1842. QFXOUT(NK-1)=QFXOUT(NK-1)+QFXIN(NK)
  1843. ELSE
  1844. THFXOUT(NK)=FXM(NK)*THPA(NK)
  1845. QFXOUT(NK)=FXM(NK)*QPA(NK)
  1846. THFXIN(NK-1)=THFXIN(NK-1)+THFXOUT(NK)
  1847. QFXIN(NK-1)=QFXIN(NK-1)+QFXOUT(NK)
  1848. ENDIF
  1849. ENDDO
  1850. !
  1851. !...UPDATE THE THETA AND QV VALUES AT EACH LEVEL...
  1852. !
  1853. DO NK=1,LTOP
  1854. THPA(NK)=THPA(NK)+(THFXIN(NK)+UDR(NK)*THTAU(NK)+DDR(NK)* &
  1855. THTAD(NK)-THFXOUT(NK)-(UER(NK)-DER(NK))*THTA0(NK))* &
  1856. DTIME*EMSD(NK)
  1857. QPA(NK)=QPA(NK)+(QFXIN(NK)+UDR(NK)*QDT(NK)+DDR(NK)*QD(NK)- &
  1858. QFXOUT(NK)-(UER(NK)-DER(NK))*Q0(NK))*DTIME*EMSD(NK)
  1859. ENDDO
  1860. ENDDO
  1861. DO NK=1,LTOP
  1862. THTAG(NK)=THPA(NK)
  1863. QG(NK)=QPA(NK)
  1864. ENDDO
  1865. !
  1866. !...CHECK TO SEE IF MIXING RATIO DIPS BELOW ZERO ANYWHERE; IF SO, BORROW
  1867. !...MOISTURE FROM ADJACENT LAYERS TO BRING IT BACK UP ABOVE ZERO...
  1868. !
  1869. DO NK=1,LTOP
  1870. IF(QG(NK).LT.0.)THEN
  1871. IF(NK.EQ.1)THEN ! JSK MODS
  1872. ! PRINT *,' PROBLEM WITH KF SCHEME: ' ! JSK MODS
  1873. ! PRINT *,'QG = 0 AT THE SURFACE!!!!!!!' ! JSK MODS
  1874. CALL wrf_error_fatal ( 'QG, QG(NK).LT.0') ! JSK MODS
  1875. ENDIF ! JSK MODS
  1876. NK1=NK+1
  1877. IF(NK.EQ.LTOP)THEN
  1878. NK1=KLCL
  1879. ENDIF
  1880. TMA=QG(NK1)*EMS(NK1)
  1881. TMB=QG(NK-1)*EMS(NK-1)
  1882. TMM=(QG(NK)-1.E-9)*EMS(NK )
  1883. BCOEFF=-TMM/((TMA*TMA)/TMB+TMB)
  1884. ACOEFF=BCOEFF*TMA/TMB
  1885. TMB=TMB*(1.-BCOEFF)
  1886. TMA=TMA*(1.-ACOEFF)
  1887. IF(NK.EQ.LTOP)THEN
  1888. QVDIFF=(QG(NK1)-TMA*EMSD(NK1))*100./QG(NK1)
  1889. ! IF(ABS(QVDIFF).GT.1.)THEN
  1890. ! PRINT *,'!!!WARNING!!! CLOUD BASE WATER VAPOR CHANGES BY ', &
  1891. ! QVDIFF, &
  1892. ! '% WHEN MOISTURE IS BORROWED TO PREVENT NEGATIVE ', &
  1893. ! 'VALUES IN KAIN-FRITSCH'
  1894. ! ENDIF
  1895. ENDIF
  1896. QG(NK)=1.E-9
  1897. QG(NK1)=TMA*EMSD(NK1)
  1898. QG(NK-1)=TMB*EMSD(NK-1)
  1899. ENDIF
  1900. ENDDO
  1901. TOPOMG=(UDR(LTOP)-UER(LTOP))*DP(LTOP)*EMSD(LTOP)
  1902. IF(ABS(TOPOMG-OMG(LTOP)).GT.1.E-3)THEN
  1903. ! WRITE(99,*)'ERROR: MASS DOES NOT BALANCE IN KF SCHEME; &
  1904. ! TOPOMG, OMG =',TOPOMG,OMG(LTOP)
  1905. ! TOPOMG, OMG =',TOPOMG,OMG(LTOP)
  1906. ISTOP=1
  1907. IPRNT=.TRUE.
  1908. EXIT iter
  1909. ENDIF
  1910. !
  1911. !...CONVERT THETA TO T...
  1912. !
  1913. DO NK=1,LTOP
  1914. EXN(NK)=(P00/P0(NK))**(0.2854*(1.-0.28*QG(NK)))
  1915. TG(NK)=THTAG(NK)/EXN(NK)
  1916. TVG(NK)=TG(NK)*(1.+0.608*QG(NK))
  1917. ENDDO
  1918. IF(ISHALL.EQ.1)THEN
  1919. EXIT iter
  1920. ENDIF
  1921. !
  1922. !*******************************************************************
  1923. ! *
  1924. ! COMPUTE NEW CLOUD AND CHANGE IN AVAILABLE BUOYANT ENERGY. *
  1925. ! *
  1926. !*******************************************************************
  1927. !
  1928. !...THE FOLLOWING COMPUTATIONS ARE SIMILAR TO THAT FOR UPDRAFT
  1929. !
  1930. ! THMIX=0.
  1931. TMIX=0.
  1932. QMIX=0.
  1933. !
  1934. !...FIND THE THERMODYNAMIC CHARACTERISTICS OF THE LAYER BY
  1935. !...MASS-WEIGHTING THE CHARACTERISTICS OF THE INDIVIDUAL MODEL
  1936. !...LAYERS...
  1937. !
  1938. DO NK=LC,KPBL
  1939. TMIX=TMIX+DP(NK)*TG(NK)
  1940. QMIX=QMIX+DP(NK)*QG(NK)
  1941. ENDDO
  1942. TMIX=TMIX/DPTHMX
  1943. QMIX=QMIX/DPTHMX
  1944. ES=ALIQ*EXP((TMIX*BLIQ-CLIQ)/(TMIX-DLIQ))
  1945. QSS=0.622*ES/(PMIX-ES)
  1946. !
  1947. !...REMOVE SUPERSATURATION FOR DIAGNOSTIC PURPOSES, IF NECESSARY...
  1948. !
  1949. IF(QMIX.GT.QSS)THEN
  1950. RL=XLV0-XLV1*TMIX
  1951. CPM=CP*(1.+0.887*QMIX)
  1952. DSSDT=QSS*(CLIQ-BLIQ*DLIQ)/((TMIX-DLIQ)*(TMIX-DLIQ))
  1953. DQ=(QMIX-QSS)/(1.+RL*DSSDT/CPM)
  1954. TMIX=TMIX+RL/CP*DQ
  1955. QMIX=QMIX-DQ
  1956. TLCL=TMIX
  1957. ELSE
  1958. QMIX=AMAX1(QMIX,0.)
  1959. EMIX=QMIX*PMIX/(0.622+QMIX)
  1960. astrt=1.e-3
  1961. binc=0.075
  1962. a1=emix/aliq
  1963. tp=(a1-astrt)/binc
  1964. indlu=int(tp)+1
  1965. value=(indlu-1)*binc+astrt
  1966. aintrp=(a1-value)/binc
  1967. tlog=aintrp*alu(indlu+1)+(1-aintrp)*alu(indlu)
  1968. TDPT=(CLIQ-DLIQ*TLOG)/(BLIQ-TLOG)
  1969. TLCL=TDPT-(.212+1.571E-3*(TDPT-T00)-4.36E-4*(TMIX-T00))*(TMIX-TDPT)
  1970. TLCL=AMIN1(TLCL,TMIX)
  1971. ENDIF
  1972. TVLCL=TLCL*(1.+0.608*QMIX)
  1973. ZLCL = ZMIX+(TLCL-TMIX)/GDRY
  1974. DO NK = LC,KL
  1975. KLCL=NK
  1976. IF(ZLCL.LE.Z0(NK))THEN
  1977. EXIT
  1978. ENDIF
  1979. ENDDO
  1980. K=KLCL-1
  1981. DLP=(ZLCL-Z0(K))/(Z0(KLCL)-Z0(K))
  1982. !
  1983. !...ESTIMATE ENVIRONMENTAL TEMPERATURE AND MIXING RATIO AT THE LCL...
  1984. !
  1985. TENV=TG(K)+(TG(KLCL)-TG(K))*DLP
  1986. QENV=QG(K)+(QG(KLCL)-QG(K))*DLP
  1987. TVEN=TENV*(1.+0.608*QENV)
  1988. PLCL=P0(K)+(P0(KLCL)-P0(K))*DLP
  1989. THETEU(K)=TMIX*(1.E5/PMIX)**(0.2854*(1.-0.28*QMIX))* &
  1990. EXP((3374.6525/TLCL-2.5403)*QMIX*(1.+0.81*QMIX))
  1991. !
  1992. !...COMPUTE ADJUSTED ABE(ABEG).
  1993. !
  1994. ABEG=0.
  1995. DO NK=K,LTOPM1
  1996. NK1=NK+1
  1997. THETEU(NK1) = THETEU(NK)
  1998. !
  1999. call tpmix2dd(p0(nk1),theteu(nk1),tgu(nk1),qgu(nk1),i,j)
  2000. !
  2001. TVQU(NK1)=TGU(NK1)*(1.+0.608*QGU(NK1)-QLIQ(NK1)-QICE(NK1))
  2002. IF(NK.EQ.K)THEN
  2003. DZZ=Z0(KLCL)-ZLCL
  2004. DILBE=((TVLCL+TVQU(NK1))/(TVEN+TVG(NK1))-1.)*DZZ
  2005. ELSE
  2006. DZZ=DZA(NK)
  2007. DILBE=((TVQU(NK)+TVQU(NK1))/(TVG(NK)+TVG(NK1))-1.)*DZZ
  2008. ENDIF
  2009. IF(DILBE.GT.0.)ABEG=ABEG+DILBE*G
  2010. !
  2011. !...DILUTE BY ENTRAINMENT BY THE RATE AS ORIGINAL UPDRAFT...
  2012. !
  2013. CALL ENVIRTHT(P0(NK1),TG(NK1),QG(NK1),THTEEG(NK1),ALIQ,BLIQ,CLIQ,DLIQ)
  2014. THETEU(NK1)=THETEU(NK1)*DDILFRC(NK1)+THTEEG(NK1)*(1.-DDILFRC(NK1))
  2015. ENDDO
  2016. !
  2017. !...ASSUME AT LEAST 90% OF CAPE (ABE) IS REMOVED BY CONVECTION DURING
  2018. !...THE PERIOD TIMEC...
  2019. !
  2020. IF(NOITR.EQ.1)THEN
  2021. ! write(98,*)' '
  2022. ! write(98,*)'TAU, I, J, =',NTSD,I,J
  2023. ! WRITE(98,1060)FABE
  2024. ! GOTO 265
  2025. EXIT iter
  2026. ENDIF
  2027. DABE=AMAX1(ABE-ABEG,0.1*ABE)
  2028. FABE=ABEG/ABE
  2029. IF(FABE.GT.1. .and. ISHALL.EQ.0)THEN
  2030. ! WRITE(98,*)'UPDRAFT/DOWNDRAFT COUPLET INCREASES CAPE AT THIS
  2031. ! *GRID POINT; NO CONVECTION ALLOWED!'
  2032. RETURN
  2033. ENDIF
  2034. IF(NCOUNT.NE.1)THEN
  2035. IF(ABS(AINC-AINCOLD).LT.0.0001)THEN
  2036. NOITR=1
  2037. AINC=AINCOLD
  2038. CYCLE iter
  2039. ENDIF
  2040. DFDA=(FABE-FABEOLD)/(AINC-AINCOLD)
  2041. IF(DFDA.GT.0.)THEN
  2042. NOITR=1
  2043. AINC=AINCOLD
  2044. CYCLE iter
  2045. ENDIF
  2046. ENDIF
  2047. AINCOLD=AINC
  2048. FABEOLD=FABE
  2049. IF(AINC/AINCMX.GT.0.999.AND.FABE.GT.1.05-STAB)THEN
  2050. ! write(98,*)' '
  2051. ! write(98,*)'TAU, I, J, =',NTSD,I,J
  2052. ! WRITE(98,1055)FABE
  2053. ! GOTO 265
  2054. EXIT
  2055. ENDIF
  2056. IF((FABE.LE.1.05-STAB.AND.FABE.GE.0.95-STAB) .or. NCOUNT.EQ.10)THEN
  2057. EXIT iter
  2058. ELSE
  2059. IF(NCOUNT.GT.10)THEN
  2060. ! write(98,*)' '
  2061. ! write(98,*)'TAU, I, J, =',NTSD,I,J
  2062. ! WRITE(98,1060)FABE
  2063. ! GOTO 265
  2064. EXIT
  2065. ENDIF
  2066. !
  2067. !...IF MORE THAN 10% OF THE ORIGINAL CAPE REMAINS, INCREASE THE CONVECTIVE
  2068. !...MASS FLUX BY THE FACTOR AINC:
  2069. !
  2070. IF(FABE.EQ.0.)THEN
  2071. AINC=AINC*0.5
  2072. ELSE
  2073. IF(DABE.LT.1.e-4)THEN
  2074. NOITR=1
  2075. AINC=AINCOLD
  2076. CYCLE iter
  2077. ELSE
  2078. AINC=AINC*STAB*ABE/DABE
  2079. ENDIF
  2080. ENDIF
  2081. ! AINC=AMIN1(AINCMX,AINC)
  2082. AINC=AMIN1(AINCMX,AINC)
  2083. !...IF AINC BECOMES VERY SMALL, EFFECTS OF CONVECTION ! JSK MODS
  2084. !...WILL BE MINIMAL SO JUST IGNORE IT... ! JSK MODS
  2085. IF(AINC.LT.0.05)then
  2086. RETURN ! JSK MODS
  2087. ENDIF
  2088. ! AINC=AMAX1(AINC,0.05) ! JSK MODS
  2089. TDER=TDER2*AINC
  2090. PPTFLX=PPTFL2*AINC
  2091. ! IF (XTIME.LT.10.)THEN
  2092. ! WRITE(98,1080)LFS,LDB,LDT,TIMEC,TADVEC,NSTEP,NCOUNT,
  2093. ! * FABEOLD,AINCOLD
  2094. ! ENDIF
  2095. DO NK=1,LTOP
  2096. UMF(NK)=UMF2(NK)*AINC
  2097. DMF(NK)=DMF2(NK)*AINC
  2098. DETLQ(NK)=DETLQ2(NK)*AINC
  2099. DETIC(NK)=DETIC2(NK)*AINC
  2100. UDR(NK)=UDR2(NK)*AINC
  2101. UER(NK)=UER2(NK)*AINC
  2102. DER(NK)=DER2(NK)*AINC
  2103. DDR(NK)=DDR2(NK)*AINC
  2104. ENDDO
  2105. !
  2106. !...GO BACK UP FOR ANOTHER ITERATION...
  2107. !
  2108. ENDIF
  2109. ENDDO iter
  2110. !
  2111. !...COMPUTE HYDROMETEOR TENDENCIES AS IS DONE FOR T, QV...
  2112. !
  2113. !...FRC2 IS THE FRACTION OF TOTAL CONDENSATE ! PPT FB MODS
  2114. !...GENERATED THAT GOES INTO PRECIPITIATION ! PPT FB MODS
  2115. !
  2116. ! Redistribute hydormeteors according to the final mass-flux values:
  2117. !
  2118. IF(CPR.GT.0.)THEN
  2119. FRC2=PPTFLX/(CPR*AINC) ! PPT FB MODS
  2120. ELSE
  2121. FRC2=0.
  2122. ENDIF
  2123. DO NK=1,LTOP
  2124. QLPA(NK)=QL0(NK)
  2125. QIPA(NK)=QI0(NK)
  2126. QRPA(NK)=QR0(NK)
  2127. QSPA(NK)=QS0(NK)
  2128. RAINFB(NK)=PPTLIQ(NK)*AINC*FBFRC*FRC2 ! PPT FB MODS
  2129. SNOWFB(NK)=PPTICE(NK)*AINC*FBFRC*FRC2 ! PPT FB MODS
  2130. ENDDO
  2131. DO NTC=1,NSTEP
  2132. !
  2133. !...ASSIGN HYDROMETEORS CONCENTRATIONS AT THE TOP AND BOTTOM OF EACH LAYER
  2134. !...BASED ON THE SIGN OF OMEGA...
  2135. !
  2136. DO NK=1,LTOP
  2137. QLFXIN(NK)=0.
  2138. QLFXOUT(NK)=0.
  2139. QIFXIN(NK)=0.
  2140. QIFXOUT(NK)=0.
  2141. QRFXIN(NK)=0.
  2142. QRFXOUT(NK)=0.
  2143. QSFXIN(NK)=0.
  2144. QSFXOUT(NK)=0.
  2145. ENDDO
  2146. DO NK=2,LTOP
  2147. IF(OMG(NK).LE.0.)THEN
  2148. QLFXIN(NK)=-FXM(NK)*QLPA(NK-1)
  2149. QIFXIN(NK)=-FXM(NK)*QIPA(NK-1)
  2150. QRFXIN(NK)=-FXM(NK)*QRPA(NK-1)
  2151. QSFXIN(NK)=-FXM(NK)*QSPA(NK-1)
  2152. QLFXOUT(NK-1)=QLFXOUT(NK-1)+QLFXIN(NK)
  2153. QIFXOUT(NK-1)=QIFXOUT(NK-1)+QIFXIN(NK)
  2154. QRFXOUT(NK-1)=QRFXOUT(NK-1)+QRFXIN(NK)
  2155. QSFXOUT(NK-1)=QSFXOUT(NK-1)+QSFXIN(NK)
  2156. ELSE
  2157. QLFXOUT(NK)=FXM(NK)*QLPA(NK)
  2158. QIFXOUT(NK)=FXM(NK)*QIPA(NK)
  2159. QRFXOUT(NK)=FXM(NK)*QRPA(NK)
  2160. QSFXOUT(NK)=FXM(NK)*QSPA(NK)
  2161. QLFXIN(NK-1)=QLFXIN(NK-1)+QLFXOUT(NK)
  2162. QIFXIN(NK-1)=QIFXIN(NK-1)+QIFXOUT(NK)
  2163. QRFXIN(NK-1)=QRFXIN(NK-1)+QRFXOUT(NK)
  2164. QSFXIN(NK-1)=QSFXIN(NK-1)+QSFXOUT(NK)
  2165. ENDIF
  2166. ENDDO
  2167. !
  2168. !...UPDATE THE HYDROMETEOR CONCENTRATION VALUES AT EACH LEVEL...
  2169. !
  2170. DO NK=1,LTOP
  2171. QLPA(NK)=QLPA(NK)+(QLFXIN(NK)+DETLQ(NK)-QLFXOUT(NK))*DTIME*EMSD(NK)
  2172. QIPA(NK)=QIPA(NK)+(QIFXIN(NK)+DETIC(NK)-QIFXOUT(NK))*DTIME*EMSD(NK)
  2173. QRPA(NK)=QRPA(NK)+(QRFXIN(NK)-QRFXOUT(NK)+RAINFB(NK))*DTIME*EMSD(NK) ! PPT FB MODS
  2174. QSPA(NK)=QSPA(NK)+(QSFXIN(NK)-QSFXOUT(NK)+SNOWFB(NK))*DTIME*EMSD(NK) ! PPT FB MODS
  2175. ENDDO
  2176. ENDDO
  2177. DO NK=1,LTOP
  2178. QLG(NK)=QLPA(NK)
  2179. QIG(NK)=QIPA(NK)
  2180. QRG(NK)=QRPA(NK)
  2181. QSG(NK)=QSPA(NK)
  2182. ENDDO
  2183. !
  2184. !...CLEAN THINGS UP, CALCULATE CONVECTIVE FEEDBACK TENDENCIES FOR THIS
  2185. !...GRID POINT...
  2186. !
  2187. ! IF (XTIME.LT.10.)THEN
  2188. ! WRITE(98,1080)LFS,LDB,LDT,TIMEC,TADVEC,NSTEP,NCOUNT,FABE,AINC
  2189. ! ENDIF
  2190. IF(IPRNT)THEN
  2191. ! WRITE(98,1080)LFS,LDB,LDT,TIMEC,TADVEC,NSTEP,NCOUNT,FABE,AINC
  2192. WRITE(message,1080)LFS,LDB,LDT,TIMEC,TADVEC,NSTEP,NCOUNT,FABE,AINC
  2193. CALL wrf_message(message)
  2194. ! call flush(98)
  2195. endif
  2196. !
  2197. !...SEND FINAL PARAMETERIZED VALUES TO OUTPUT FILES...
  2198. !
  2199. !297 IF(IPRNT)then
  2200. IF(IPRNT)then
  2201. ! if(I.eq.16 .and. J.eq.41)then
  2202. ! IF(ISTOP.EQ.1)THEN
  2203. write(98,*)
  2204. ! write(98,*)'At t(h), I, J =',float(NTSD)*72./3600.,I,J
  2205. write(message,*)'P(LC), DTP, WKL, WKLCL =',p0(LC)/100., &
  2206. TLCL+DTLCL+dtrh-TENV,WKL,WKLCL
  2207. call wrf_message(message)
  2208. write(message,*)'TLCL, DTLCL, DTRH, TENV =',TLCL,DTLCL, &
  2209. DTRH,TENV
  2210. call wrf_message(message)
  2211. WRITE(message,1025)KLCL,ZLCL,DTLCL,LTOP,P0(LTOP),IFLAG, &
  2212. TMIX-T00,PMIX,QMIX,ABE
  2213. call wrf_message(message)
  2214. WRITE(message,1030)P0(LET)/100.,P0(LTOP)/100.,VMFLCL,PLCL/100., &
  2215. WLCL,CLDHGT(LC)
  2216. call wrf_message(message)
  2217. WRITE(message,1035)PEF,PEFCBH,LC,LET,WKL,VWS
  2218. call wrf_message(message)
  2219. write(message,*)'PRECIP EFFICIENCY =',PEFF
  2220. call wrf_message(message)
  2221. WRITE(message,1080)LFS,LDB,LDT,TIMEC,TADVEC,NSTEP,NCOUNT,FABE,AINC
  2222. call wrf_message(message)
  2223. ! ENDIF
  2224. !!!!! HERE !!!!!!!
  2225. WRITE(message,1070)' P ',' DP ',' DT K/D ',' DR K/D ',' OMG ', &
  2226. ' DOMGDP ',' UMF ',' UER ',' UDR ',' DMF ',' DER ' &
  2227. ,' DDR ',' EMS ',' W0 ',' DETLQ ',' DETIC '
  2228. call wrf_message(message)
  2229. write(message,*)'just before DO 300...'
  2230. call wrf_message(message)
  2231. ! call flush(98)
  2232. DO NK=1,LTOP
  2233. K=LTOP-NK+1
  2234. DTT=(TG(K)-T0(K))*86400./TIMEC
  2235. RL=XLV0-XLV1*TG(K)
  2236. DR=-(QG(K)-Q0(K))*RL*86400./(TIMEC*CP)
  2237. UDFRC=UDR(K)*TIMEC*EMSD(K)
  2238. UEFRC=UER(K)*TIMEC*EMSD(K)
  2239. DDFRC=DDR(K)*TIMEC*EMSD(K)
  2240. DEFRC=-DER(K)*TIMEC*EMSD(K)
  2241. WRITE(message,1075)P0(K)/100.,DP(K)/100.,DTT,DR,OMG(K),DOMGDP(K)*1.E4, &
  2242. UMF(K)/1.E6,UEFRC,UDFRC,DMF(K)/1.E6,DEFRC,DDFRC,EMS(K)/1.E11, &
  2243. W0AVG1D(K)*1.E2,DETLQ(K)*TIMEC*EMSD(K)*1.E3,DETIC(K)* &
  2244. TIMEC*EMSD(K)*1.E3
  2245. call wrf_message(message)
  2246. ENDDO
  2247. WRITE(message,1085)'K','P','Z','T0','TG','DT','TU','TD','Q0','QG', &
  2248. 'DQ','QU','QD','QLG','QIG','QRG','QSG','RH0','RHG'
  2249. call wrf_message(message)
  2250. DO NK=1,KL
  2251. K=KX-NK+1
  2252. DTT=TG(K)-T0(K)
  2253. TUC=TU(K)-T00
  2254. IF(K.LT.LC.OR.K.GT.LTOP)TUC=0.
  2255. TDC=TZ(K)-T00
  2256. IF((K.LT.LDB.OR.K.GT.LDT).AND.K.NE.LFS)TDC=0.
  2257. IF(T0(K).LT.T00)THEN
  2258. ES=ALIQ*EXP((BLIQ*TG(K)-CLIQ)/(TG(K)-DLIQ))
  2259. ELSE
  2260. ES=ALIQ*EXP((BLIQ*TG(K)-CLIQ)/(TG(K)-DLIQ))
  2261. ENDIF
  2262. QGS=ES*0.622/(P0(K)-ES)
  2263. RH0=Q0(K)/QES(K)
  2264. RHG=QG(K)/QGS
  2265. WRITE(message,1090)K,P0(K)/100.,Z0(K),T0(K)-T00,TG(K)-T00,DTT,TUC, &
  2266. TDC,Q0(K)*1000.,QG(K)*1000.,(QG(K)-Q0(K))*1000.,QU(K)* &
  2267. 1000.,QD(K)*1000.,QLG(K)*1000.,QIG(K)*1000.,QRG(K)*1000., &
  2268. QSG(K)*1000.,RH0,RHG
  2269. call wrf_message(message)
  2270. ENDDO
  2271. !
  2272. !...IF CALCULATIONS ABOVE SHOW AN ERROR IN THE MASS BUDGET, PRINT OUT A
  2273. !...TO BE USED LATER FOR DIAGNOSTIC PURPOSES, THEN ABORT RUN...
  2274. !
  2275. ! IF(ISTOP.EQ.1 .or. ISHALL.EQ.1)THEN
  2276. ! IF(ISHALL.NE.1)THEN
  2277. ! write(98,4421)i,j,iyr,imo,idy,ihr,imn
  2278. ! write(98)i,j,iyr,imo,idy,ihr,imn,kl
  2279. ! 4421 format(7i4)
  2280. ! write(98,4422)kl
  2281. ! 4422 format(i6)
  2282. DO 310 NK = 1,KL
  2283. k = kl - nk + 1
  2284. write(98,4455) p0(k)/100.,t0(k)-273.16,q0(k)*1000., &
  2285. u0(k),v0(k),W0AVG1D(K),dp(k),tke(k)
  2286. ! write(98) p0,t0,q0,u0,v0,w0,dp,tke
  2287. ! WRITE(98,1115)Z0(K),P0(K)/100.,T0(K)-273.16,Q0(K)*1000.,
  2288. ! * U0(K),V0(K),DP(K)/100.,W0AVG(I,J,K)
  2289. 310 CONTINUE
  2290. IF(ISTOP.EQ.1)THEN
  2291. CALL wrf_error_fatal ( 'KAIN-FRITSCH, istop=1, diags' )
  2292. ENDIF
  2293. ! ENDIF
  2294. 4455 format(8f11.3)
  2295. ENDIF
  2296. CNDTNF=(1.-EQFRC(LFS))*(QLIQ(LFS)+QICE(LFS))*DMF(LFS)
  2297. PRATEC(I,J)=PPTFLX*(1.-FBFRC)/DXSQ
  2298. RAINCV(I,J)=DT*PRATEC(I,J) ! PPT FB MODS
  2299. ! RAINCV(I,J)=.1*.5*DT*PPTFLX/DXSQ ! PPT FB MODS
  2300. ! RNC=0.1*TIMEC*PPTFLX/DXSQ
  2301. RNC=RAINCV(I,J)*NIC
  2302. IF(ISHALL.EQ.0.AND.IPRNT)write (98,909)I,J,RNC
  2303. ! WRITE(98,1095)CPR*AINC,TDER+PPTFLX+CNDTNF
  2304. !
  2305. ! EVALUATE MOISTURE BUDGET...
  2306. !
  2307. QINIT=0.
  2308. QFNL=0.
  2309. DPT=0.
  2310. DO 315 NK=1,LTOP
  2311. DPT=DPT+DP(NK)
  2312. QINIT=QINIT+Q0(NK)*EMS(NK)
  2313. QFNL=QFNL+QG(NK)*EMS(NK)
  2314. QFNL=QFNL+(QLG(NK)+QIG(NK)+QRG(NK)+QSG(NK))*EMS(NK)
  2315. 315 CONTINUE
  2316. QFNL=QFNL+PPTFLX*TIMEC*(1.-FBFRC) ! PPT FB MODS
  2317. ! QFNL=QFNL+PPTFLX*TIMEC ! PPT FB MODS
  2318. ERR2=(QFNL-QINIT)*100./QINIT
  2319. IF(IPRNT)WRITE(98,1110)QINIT,QFNL,ERR2
  2320. IF(ABS(ERR2).GT.0.05 .AND. ISTOP.EQ.0)THEN
  2321. ! write(99,*)'!!!!!!!! MOISTURE BUDGET ERROR IN KFPARA !!!'
  2322. ! WRITE(99,1110)QINIT,QFNL,ERR2
  2323. IPRNT=.TRUE.
  2324. ISTOP=1
  2325. write(98,4422)kl
  2326. 4422 format(i6)
  2327. DO 311 NK = 1,KL
  2328. k = kl - nk + 1
  2329. ! write(99,4455) p0(k)/100.,t0(k)-273.16,q0(k)*1000., &
  2330. ! u0(k),v0(k),W0AVG1D(K),dp(k)
  2331. ! write(98) p0,t0,q0,u0,v0,w0,dp,tke
  2332. ! WRITE(98,1115)P0(K)/100.,T0(K)-273.16,Q0(K)*1000., &
  2333. ! U0(K),V0(K),W0AVG1D(K),dp(k)/100.,tke(k)
  2334. WRITE(98,4456)P0(K)/100.,T0(K)-273.16,Q0(K)*1000., &
  2335. U0(K),V0(K),W0AVG1D(K),dp(k)/100.,tke(k)
  2336. 311 CONTINUE
  2337. ! call flush(98)
  2338. ! GOTO 297
  2339. ! STOP 'QVERR'
  2340. ENDIF
  2341. 1115 FORMAT (2X,F7.2,2X,F5.1,2X,F6.3,2(2X,F5.1),2X,F7.2,2X,F7.4)
  2342. 4456 format(8f12.3)
  2343. IF(PPTFLX.GT.0.)THEN
  2344. RELERR=ERR2*QINIT/(PPTFLX*TIMEC)
  2345. ELSE
  2346. RELERR=0.
  2347. ENDIF
  2348. IF(IPRNT)THEN
  2349. WRITE(98,1120)RELERR
  2350. WRITE(98,*)'TDER, CPR, TRPPT =', &
  2351. TDER,CPR*AINC,TRPPT*AINC
  2352. ENDIF
  2353. !
  2354. !...FEEDBACK TO RESOLVABLE SCALE TENDENCIES.
  2355. !
  2356. !...IF THE ADVECTIVE TIME PERIOD (TADVEC) IS LESS THAN SPECIFIED MINIMUM
  2357. !...TIMEC, ALLOW FEEDBACK TO OCCUR ONLY DURING TADVEC...
  2358. !
  2359. IF(TADVEC.LT.TIMEC)NIC=NINT(TADVEC/DT)
  2360. NCA(I,J) = REAL(NIC)*DT
  2361. IF(ISHALL.EQ.1)THEN
  2362. TIMEC = 2400.
  2363. NCA(I,J) = CUDT*60.
  2364. NSHALL = NSHALL+1
  2365. ENDIF
  2366. DO K=1,KX
  2367. ! IF(IMOIST(INEST).NE.2)THEN
  2368. !
  2369. !...IF HYDROMETEORS ARE NOT ALLOWED, THEY MUST BE EVAPORATED OR SUBLIMATED
  2370. !...AND FED BACK AS VAPOR, ALONG WITH ASSOCIATED CHANGES IN TEMPERATURE.
  2371. !...NOTE: THIS WILL INTRODUCE CHANGES IN THE CONVECTIVE TEMPERATURE AND
  2372. !...WATER VAPOR FEEDBACK TENDENCIES AND MAY LEAD TO SUPERSATURATED VALUE
  2373. !...OF QG...
  2374. !
  2375. ! RLC=XLV0-XLV1*TG(K)
  2376. ! RLS=XLS0-XLS1*TG(K)
  2377. ! CPM=CP*(1.+0.887*QG(K))
  2378. ! TG(K)=TG(K)-(RLC*(QLG(K)+QRG(K))+RLS*(QIG(K)+QSG(K)))/CPM
  2379. ! QG(K)=QG(K)+(QLG(K)+QRG(K)+QIG(K)+QSG(K))
  2380. ! DQLDT(I,J,NK)=0.
  2381. ! DQIDT(I,J,NK)=0.
  2382. ! DQRDT(I,J,NK)=0.
  2383. ! DQSDT(I,J,NK)=0.
  2384. ! ELSE
  2385. !
  2386. !...IF ICE PHASE IS NOT ALLOWED, MELT ALL FROZEN HYDROMETEORS...
  2387. !
  2388. IF(.NOT. F_QI .and. warm_rain)THEN
  2389. CPM=CP*(1.+0.887*QG(K))
  2390. TG(K)=TG(K)-(QIG(K)+QSG(K))*RLF/CPM
  2391. DQCDT(K)=(QLG(K)+QIG(K)-QL0(K)-QI0(K))/TIMEC
  2392. DQIDT(K)=0.
  2393. DQRDT(K)=(QRG(K)+QSG(K)-QR0(K)-QS0(K))/TIMEC
  2394. DQSDT(K)=0.
  2395. ELSEIF(.NOT. F_QI .and. .not. warm_rain)THEN
  2396. !
  2397. !...IF ICE PHASE IS ALLOWED, BUT MIXED PHASE IS NOT, MELT FROZEN HYDROMETEORS
  2398. !...BELOW THE MELTING LEVEL, FREEZE LIQUID WATER ABOVE THE MELTING LEVEL
  2399. !
  2400. CPM=CP*(1.+0.887*QG(K))
  2401. IF(K.LE.ML)THEN
  2402. TG(K)=TG(K)-(QIG(K)+QSG(K))*RLF/CPM
  2403. ELSEIF(K.GT.ML)THEN
  2404. TG(K)=TG(K)+(QLG(K)+QRG(K))*RLF/CPM
  2405. ENDIF
  2406. DQCDT(K)=(QLG(K)+QIG(K)-QL0(K)-QI0(K))/TIMEC
  2407. DQIDT(K)=0.
  2408. DQRDT(K)=(QRG(K)+QSG(K)-QR0(K)-QS0(K))/TIMEC
  2409. DQSDT(K)=0.
  2410. ELSEIF(F_QI) THEN
  2411. !
  2412. !...IF MIXED PHASE HYDROMETEORS ARE ALLOWED, FEED BACK CONVECTIVE TENDENCIES
  2413. !...OF HYDROMETEORS DIRECTLY...
  2414. !
  2415. DQCDT(K)=(QLG(K)-QL0(K))/TIMEC
  2416. DQIDT(K)=(QIG(K)-QI0(K))/TIMEC
  2417. DQRDT(K)=(QRG(K)-QR0(K))/TIMEC
  2418. IF (F_QS) THEN
  2419. DQSDT(K)=(QSG(K)-QS0(K))/TIMEC
  2420. ELSE
  2421. DQIDT(K)=DQIDT(K)+(QSG(K)-QS0(K))/TIMEC
  2422. ENDIF
  2423. ELSE
  2424. ! PRINT *,'THIS COMBINATION OF IMOIST, IEXICE, IICE NOT ALLOWED!'
  2425. CALL wrf_error_fatal ( 'KAIN-FRITSCH, THIS COMBINATION OF IMOIST, IEXICE, IICE NOT ALLOWED' )
  2426. ENDIF
  2427. DTDT(K)=(TG(K)-T0(K))/TIMEC
  2428. DQDT(K)=(QG(K)-Q0(K))/TIMEC
  2429. ENDDO
  2430. PRATEC(I,J)=PPTFLX*(1.-FBFRC)/DXSQ
  2431. RAINCV(I,J)=DT*PRATEC(I,J)
  2432. ! RAINCV(I,J)=.1*.5*DT*PPTFLX/DXSQ ! PPT FB MODS
  2433. ! RNC=0.1*TIMEC*PPTFLX/DXSQ
  2434. RNC=RAINCV(I,J)*NIC
  2435. 909 FORMAT('AT I, J =',i3,1x,i3,' CONVECTIVE RAINFALL =',F8.4,' mm')
  2436. ! write (98,909)I,J,RNC
  2437. ! write (6,909)I,J,RNC
  2438. ! WRITE(98,*)'at NTSD =',NTSD,',No. of KF points activated =',
  2439. ! * NCCNT
  2440. ! call flush(98)
  2441. 1000 FORMAT(' ',10A8)
  2442. 1005 FORMAT(' ',F6.0,2X,F6.4,2X,F7.3,1X,F6.4,2X,4(F6.3,2X),2(F7.3,1X))
  2443. 1010 FORMAT(' ',' VERTICAL VELOCITY IS NEGATIVE AT ',F4.0,' MB')
  2444. 1015 FORMAT(' ','ALL REMAINING MASS DETRAINS BELOW ',F4.0,' MB')
  2445. 1025 FORMAT(5X,' KLCL=',I2,' ZLCL=',F7.1,'M', &
  2446. ' DTLCL=',F5.2,' LTOP=',I2,' P0(LTOP)=',-2PF5.1,'MB FRZ LV=', &
  2447. I2,' TMIX=',0PF4.1,1X,'PMIX=',-2PF6.1,' QMIX=',3PF5.1, &
  2448. ' CAPE=',0PF7.1)
  2449. 1030 FORMAT(' ',' P0(LET) = ',F6.1,' P0(LTOP) = ',F6.1,' VMFLCL =', &
  2450. E12.3,' PLCL =',F6.1,' WLCL =',F6.3,' CLDHGT =', &
  2451. F8.1)
  2452. 1035 FORMAT(1X,'PEF(WS)=',F4.2,'(CB)=',F4.2,'LC,LET=',2I3,'WKL=' &
  2453. ,F6.3,'VWS=',F5.2)
  2454. !1055 FORMAT('*** DEGREE OF STABILIZATION =',F5.3, &
  2455. ! ', NO MORE MASS FLUX IS ALLOWED!')
  2456. !1060 FORMAT(' ITERATION DOES NOT CONVERGE TO GIVE THE SPECIFIED &
  2457. ! &DEGREE OF STABILIZATION! FABE= ',F6.4)
  2458. 1070 FORMAT (16A8)
  2459. 1075 FORMAT (F8.2,3(F8.2),2(F8.3),F8.2,2F8.3,F8.2,6F8.3)
  2460. 1080 FORMAT(2X,'LFS,LDB,LDT =',3I3,' TIMEC, TADVEC, NSTEP=', &
  2461. 2(1X,F5.0),I3,'NCOUNT, FABE, AINC=',I2,1X,F5.3,F6.2)
  2462. 1085 FORMAT (A3,16A7,2A8)
  2463. 1090 FORMAT (I3,F7.2,F7.0,10F7.2,4F7.3,2F8.3)
  2464. 1095 FORMAT(' ',' PPT PRODUCTION RATE= ',F10.0,' TOTAL EVAP+PPT= ',F10.0)
  2465. 1105 FORMAT(' ','NET LATENT HEAT RELEASE =',E12.5,' ACTUAL HEATING =',&
  2466. E12.5,' J/KG-S, DIFFERENCE = ',F9.3,'%')
  2467. 1110 FORMAT(' ','INITIAL WATER =',E12.5,' FINAL WATER =',E12.5, &
  2468. ' TOTAL WATER CHANGE =',F8.2,'%')
  2469. ! 1115 FORMAT (2X,F6.0,2X,F7.2,2X,F5.1,2X,F6.3,2(2X,F5.1),2X,F7.2,2X,F7.4)
  2470. 1120 FORMAT(' ','MOISTURE ERROR AS FUNCTION OF TOTAL PPT =',F9.3,'%')
  2471. !
  2472. !-----------------------------------------------------------------------
  2473. !--------------SAVE CLOUD TOP AND BOTTOM FOR RADIATION------------------
  2474. !-----------------------------------------------------------------------
  2475. !
  2476. CUTOP(I,J)=REAL(LTOP)
  2477. CUBOT(I,J)=REAL(LCL)
  2478. !
  2479. !-----------------------------------------------------------------------
  2480. END SUBROUTINE KF_eta_PARA
  2481. !********************************************************************
  2482. ! ***********************************************************************
  2483. SUBROUTINE TPMIX2(p,thes,tu,qu,qliq,qice,qnewlq,qnewic,XLV1,XLV0)
  2484. !
  2485. ! Lookup table variables:
  2486. ! INTEGER, PARAMETER :: (KFNT=250,KFNP=220)
  2487. ! REAL, SAVE, DIMENSION(1:KFNT,1:KFNP) :: TTAB,QSTAB
  2488. ! REAL, SAVE, DIMENSION(1:KFNP) :: THE0K
  2489. ! REAL, SAVE, DIMENSION(1:200) :: ALU
  2490. ! REAL, SAVE :: RDPR,RDTHK,PLUTOP
  2491. ! End of Lookup table variables:
  2492. !-----------------------------------------------------------------------
  2493. IMPLICIT NONE
  2494. !-----------------------------------------------------------------------
  2495. REAL, INTENT(IN ) :: P,THES,XLV1,XLV0
  2496. REAL, INTENT(OUT ) :: QNEWLQ,QNEWIC
  2497. REAL, INTENT(INOUT) :: TU,QU,QLIQ,QICE
  2498. REAL :: TP,QQ,BTH,TTH,PP,T00,T10,T01,T11,Q00,Q10,Q01,Q11, &
  2499. TEMP,QS,QNEW,DQ,QTOT,RLL,CPP
  2500. INTEGER :: IPTB,ITHTB
  2501. !-----------------------------------------------------------------------
  2502. !c******** LOOKUP TABLE VARIABLES... ****************************
  2503. ! parameter(kfnt=250,kfnp=220)
  2504. !c
  2505. ! COMMON/KFLUT/ ttab(kfnt,kfnp),qstab(kfnt,kfnp),the0k(kfnp),
  2506. ! * alu(200),rdpr,rdthk,plutop
  2507. !C***************************************************************
  2508. !c
  2509. !c***********************************************************************
  2510. !c scaling pressure and tt table index
  2511. !c***********************************************************************
  2512. !c
  2513. tp=(p-plutop)*rdpr
  2514. qq=tp-aint(tp)
  2515. iptb=int(tp)+1
  2516. !
  2517. !***********************************************************************
  2518. ! base and scaling factor for the
  2519. !***********************************************************************
  2520. !
  2521. ! scaling the and tt table index
  2522. bth=(the0k(iptb+1)-the0k(iptb))*qq+the0k(iptb)
  2523. tth=(thes-bth)*rdthk
  2524. pp =tth-aint(tth)
  2525. ithtb=int(tth)+1
  2526. IF(IPTB.GE.220 .OR. IPTB.LE.1 .OR. ITHTB.GE.250 .OR. ITHTB.LE.1)THEN
  2527. write(98,*)'**** OUT OF BOUNDS *********'
  2528. ! call flush(98)
  2529. ENDIF
  2530. !
  2531. t00=ttab(ithtb ,iptb )
  2532. t10=ttab(ithtb+1,iptb )
  2533. t01=ttab(ithtb ,iptb+1)
  2534. t11=ttab(ithtb+1,iptb+1)
  2535. !
  2536. q00=qstab(ithtb ,iptb )
  2537. q10=qstab(ithtb+1,iptb )
  2538. q01=qstab(ithtb ,iptb+1)
  2539. q11=qstab(ithtb+1,iptb+1)
  2540. !
  2541. !***********************************************************************
  2542. ! parcel temperature
  2543. !***********************************************************************
  2544. !
  2545. temp=(t00+(t10-t00)*pp+(t01-t00)*qq+(t00-t10-t01+t11)*pp*qq)
  2546. !
  2547. qs=(q00+(q10-q00)*pp+(q01-q00)*qq+(q00-q10-q01+q11)*pp*qq)
  2548. !
  2549. DQ=QS-QU
  2550. IF(DQ.LE.0.)THEN
  2551. QNEW=QU-QS
  2552. QU=QS
  2553. ELSE
  2554. !
  2555. ! IF THE PARCEL IS SUBSATURATED, TEMPERATURE AND MIXING RATIO MUST BE
  2556. ! ADJUSTED...IF LIQUID WATER IS PRESENT, IT IS ALLOWED TO EVAPORATE
  2557. !
  2558. QNEW=0.
  2559. QTOT=QLIQ+QICE
  2560. !
  2561. ! IF THERE IS ENOUGH LIQUID OR ICE TO SATURATE THE PARCEL, TEMP STAYS AT ITS
  2562. ! WET BULB VALUE, VAPOR MIXING RATIO IS AT SATURATED LEVEL, AND THE MIXING
  2563. ! RATIOS OF LIQUID AND ICE ARE ADJUSTED TO MAKE UP THE ORIGINAL SATURATION
  2564. ! DEFICIT... OTHERWISE, ANY AVAILABLE LIQ OR ICE VAPORIZES AND APPROPRIATE
  2565. ! ADJUSTMENTS TO PARCEL TEMP; VAPOR, LIQUID, AND ICE MIXING RATIOS ARE MADE.
  2566. !
  2567. !...subsaturated values only occur in calculations involving various mixtures of
  2568. !...updraft and environmental air for estimation of entrainment and detrainment.
  2569. !...For these purposes, assume that reasonable estimates can be given using
  2570. !...liquid water saturation calculations only - i.e., ignore the effect of the
  2571. !...ice phase in this process only...will not affect conservative properties...
  2572. !
  2573. IF(QTOT.GE.DQ)THEN
  2574. qliq=qliq-dq*qliq/(qtot+1.e-10)
  2575. qice=qice-dq*qice/(qtot+1.e-10)
  2576. QU=QS
  2577. ELSE
  2578. RLL=XLV0-XLV1*TEMP
  2579. CPP=1004.5*(1.+0.89*QU)
  2580. IF(QTOT.LT.1.E-10)THEN
  2581. !
  2582. !...IF NO LIQUID WATER OR ICE IS AVAILABLE, TEMPERATURE IS GIVEN BY:
  2583. TEMP=TEMP+RLL*(DQ/(1.+DQ))/CPP
  2584. ELSE
  2585. !
  2586. !...IF SOME LIQ WATER/ICE IS AVAILABLE, BUT NOT ENOUGH TO ACHIEVE SATURATION,
  2587. ! THE TEMPERATURE IS GIVEN BY:
  2588. !
  2589. TEMP=TEMP+RLL*((DQ-QTOT)/(1+DQ-QTOT))/CPP
  2590. QU=QU+QTOT
  2591. QTOT=0.
  2592. QLIQ=0.
  2593. QICE=0.
  2594. ENDIF
  2595. ENDIF
  2596. ENDIF
  2597. TU=TEMP
  2598. qnewlq=qnew
  2599. qnewic=0.
  2600. !
  2601. END SUBROUTINE TPMIX2
  2602. !******************************************************************************
  2603. SUBROUTINE DTFRZNEW(TU,P,THTEU,QU,QFRZ,QICE,ALIQ,BLIQ,CLIQ,DLIQ)
  2604. !-----------------------------------------------------------------------
  2605. IMPLICIT NONE
  2606. !-----------------------------------------------------------------------
  2607. REAL, INTENT(IN ) :: P,QFRZ,ALIQ,BLIQ,CLIQ,DLIQ
  2608. REAL, INTENT(INOUT) :: TU,THTEU,QU,QICE
  2609. REAL :: RLC,RLS,RLF,CPP,A,DTFRZ,ES,QS,DQEVAP,PII
  2610. !-----------------------------------------------------------------------
  2611. !
  2612. !...ALLOW THE FREEZING OF LIQUID WATER IN THE UPDRAFT TO PROCEED AS AN
  2613. !...APPROXIMATELY LINEAR FUNCTION OF TEMPERATURE IN THE TEMPERATURE RANGE
  2614. !...TTFRZ TO TBFRZ...
  2615. !...FOR COLDER TEMPERATURES, FREEZE ALL LIQUID WATER...
  2616. !...THERMODYNAMIC PROPERTIES ARE STILL CALCULATED WITH RESPECT TO LIQUID WATER
  2617. !...TO ALLOW THE USE OF LOOKUP TABLE TO EXTRACT TMP FROM THETAE...
  2618. !
  2619. RLC=2.5E6-2369.276*(TU-273.16)
  2620. RLS=2833922.-259.532*(TU-273.16)
  2621. RLF=RLS-RLC
  2622. CPP=1004.5*(1.+0.89*QU)
  2623. !
  2624. ! A = D(es)/DT IS THAT CALCULATED FROM BUCK (1981) EMPERICAL FORMULAS
  2625. ! FOR SATURATION VAPOR PRESSURE...
  2626. !
  2627. A=(CLIQ-BLIQ*DLIQ)/((TU-DLIQ)*(TU-DLIQ))
  2628. DTFRZ = RLF*QFRZ/(CPP+RLS*QU*A)
  2629. TU = TU+DTFRZ
  2630. ES = ALIQ*EXP((BLIQ*TU-CLIQ)/(TU-DLIQ))
  2631. QS = ES*0.622/(P-ES)
  2632. !
  2633. !...FREEZING WARMS THE AIR AND IT BECOMES UNSATURATED...ASSUME THAT SOME OF THE
  2634. !...LIQUID WATER THAT IS AVAILABLE FOR FREEZING EVAPORATES TO MAINTAIN SATURA-
  2635. !...TION...SINCE THIS WATER HAS ALREADY BEEN TRANSFERRED TO THE ICE CATEGORY,
  2636. !...SUBTRACT IT FROM ICE CONCENTRATION, THEN SET UPDRAFT MIXING RATIO AT THE NEW
  2637. !...TEMPERATURE TO THE SATURATION VALUE...
  2638. !
  2639. DQEVAP = QS-QU
  2640. QICE = QICE-DQEVAP
  2641. QU = QU+DQEVAP
  2642. PII=(1.E5/P)**(0.2854*(1.-0.28*QU))
  2643. THTEU=TU*PII*EXP((3374.6525/TU-2.5403)*QU*(1.+0.81*QU))
  2644. !
  2645. END SUBROUTINE DTFRZNEW
  2646. ! --------------------------------------------------------------------------------
  2647. SUBROUTINE CONDLOAD(QLIQ,QICE,WTW,DZ,BOTERM,ENTERM,RATE,QNEWLQ, &
  2648. QNEWIC,QLQOUT,QICOUT,G)
  2649. !-----------------------------------------------------------------------
  2650. IMPLICIT NONE
  2651. !-----------------------------------------------------------------------
  2652. ! 9/18/88...THIS PRECIPITATION FALLOUT SCHEME IS BASED ON THE SCHEME US
  2653. ! BY OGURA AND CHO (1973). LIQUID WATER FALLOUT FROM A PARCEL IS CAL-
  2654. ! CULATED USING THE EQUATION DQ=-RATE*Q*DT, BUT TO SIMULATE A QUASI-
  2655. ! CONTINUOUS PROCESS, AND TO ELIMINATE A DEPENDENCY ON VERTICAL
  2656. ! RESOLUTION THIS IS EXPRESSED AS Q=Q*EXP(-RATE*DZ).
  2657. REAL, INTENT(IN ) :: G
  2658. REAL, INTENT(IN ) :: DZ,BOTERM,ENTERM,RATE
  2659. REAL, INTENT(INOUT) :: QLQOUT,QICOUT,WTW,QLIQ,QICE,QNEWLQ,QNEWIC
  2660. REAL :: QTOT,QNEW,QEST,G1,WAVG,CONV,RATIO3,OLDQ,RATIO4,DQ,PPTDRG
  2661. !
  2662. QTOT=QLIQ+QICE
  2663. QNEW=QNEWLQ+QNEWIC
  2664. !
  2665. ! ESTIMATE THE VERTICAL VELOCITY SO THAT AN AVERAGE VERTICAL VELOCITY
  2666. ! BE CALCULATED TO ESTIMATE THE TIME REQUIRED FOR ASCENT BETWEEN MODEL
  2667. ! LEVELS...
  2668. !
  2669. QEST=0.5*(QTOT+QNEW)
  2670. G1=WTW+BOTERM-ENTERM-2.*G*DZ*QEST/1.5
  2671. IF(G1.LT.0.0)G1=0.
  2672. WAVG=0.5*(SQRT(WTW)+SQRT(G1))
  2673. CONV=RATE*DZ/WAVG ! KF90 Eq. 9
  2674. !
  2675. ! RATIO3 IS THE FRACTION OF LIQUID WATER IN FRESH CONDENSATE, RATIO4 IS
  2676. ! THE FRACTION OF LIQUID WATER IN THE TOTAL AMOUNT OF CONDENSATE INVOLV
  2677. ! IN THE PRECIPITATION PROCESS - NOTE THAT ONLY 60% OF THE FRESH CONDEN
  2678. ! SATE IS IS ALLOWED TO PARTICIPATE IN THE CONVERSION PROCESS...
  2679. !
  2680. RATIO3=QNEWLQ/(QNEW+1.E-8)
  2681. ! OLDQ=QTOT
  2682. QTOT=QTOT+0.6*QNEW
  2683. OLDQ=QTOT
  2684. RATIO4=(0.6*QNEWLQ+QLIQ)/(QTOT+1.E-8)
  2685. QTOT=QTOT*EXP(-CONV) ! KF90 Eq. 9
  2686. !
  2687. ! DETERMINE THE AMOUNT OF PRECIPITATION THAT FALLS OUT OF THE UPDRAFT
  2688. ! PARCEL AT THIS LEVEL...
  2689. !
  2690. DQ=OLDQ-QTOT
  2691. QLQOUT=RATIO4*DQ
  2692. QICOUT=(1.-RATIO4)*DQ
  2693. !
  2694. ! ESTIMATE THE MEAN LOAD OF CONDENSATE ON THE UPDRAFT IN THE LAYER, CAL
  2695. ! LATE VERTICAL VELOCITY
  2696. !
  2697. PPTDRG=0.5*(OLDQ+QTOT-0.2*QNEW)
  2698. WTW=WTW+BOTERM-ENTERM-2.*G*DZ*PPTDRG/1.5
  2699. IF(ABS(WTW).LT.1.E-4)WTW=1.E-4
  2700. !
  2701. ! DETERMINE THE NEW LIQUID WATER AND ICE CONCENTRATIONS INCLUDING LOSSE
  2702. ! DUE TO PRECIPITATION AND GAINS FROM CONDENSATION...
  2703. !
  2704. QLIQ=RATIO4*QTOT+RATIO3*0.4*QNEW
  2705. QICE=(1.-RATIO4)*QTOT+(1.-RATIO3)*0.4*QNEW
  2706. QNEWLQ=0.
  2707. QNEWIC=0.
  2708. END SUBROUTINE CONDLOAD
  2709. ! ----------------------------------------------------------------------
  2710. SUBROUTINE PROF5(EQ,EE,UD)
  2711. !
  2712. !***********************************************************************
  2713. !***** GAUSSIAN TYPE MIXING PROFILE....******************************
  2714. !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  2715. ! THIS SUBROUTINE INTEGRATES THE AREA UNDER THE CURVE IN THE GAUSSIAN
  2716. ! DISTRIBUTION...THE NUMERICAL APPROXIMATION TO THE INTEGRAL IS TAKEN FROM
  2717. ! "HANDBOOK OF MATHEMATICAL FUNCTIONS WITH FORMULAS, GRAPHS AND MATHEMATICS TABLES"
  2718. ! ED. BY ABRAMOWITZ AND STEGUN, NATL BUREAU OF STANDARDS APPLIED
  2719. ! MATHEMATICS SERIES. JUNE, 1964., MAY, 1968.
  2720. ! JACK KAIN
  2721. ! 7/6/89
  2722. ! Solves for KF90 Eq. 2
  2723. !
  2724. !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  2725. !-----------------------------------------------------------------------
  2726. IMPLICIT NONE
  2727. !-----------------------------------------------------------------------
  2728. REAL, INTENT(IN ) :: EQ
  2729. REAL, INTENT(INOUT) :: EE,UD
  2730. REAL :: SQRT2P,A1,A2,A3,P,SIGMA,FE,X,Y,EY,E45,T1,T2,C1,C2
  2731. DATA SQRT2P,A1,A2,A3,P,SIGMA,FE/2.506628,0.4361836,-0.1201676, &
  2732. 0.9372980,0.33267,0.166666667,0.202765151/
  2733. X=(EQ-0.5)/SIGMA
  2734. Y=6.*EQ-3.
  2735. EY=EXP(Y*Y/(-2))
  2736. E45=EXP(-4.5)
  2737. T2=1./(1.+P*ABS(Y))
  2738. T1=0.500498
  2739. C1=A1*T1+A2*T1*T1+A3*T1*T1*T1
  2740. C2=A1*T2+A2*T2*T2+A3*T2*T2*T2
  2741. IF(Y.GE.0.)THEN
  2742. EE=SIGMA*(0.5*(SQRT2P-E45*C1-EY*C2)+SIGMA*(E45-EY))-E45*EQ*EQ/2.
  2743. UD=SIGMA*(0.5*(EY*C2-E45*C1)+SIGMA*(E45-EY))-E45*(0.5+EQ*EQ/2.- &
  2744. EQ)
  2745. ELSE
  2746. EE=SIGMA*(0.5*(EY*C2-E45*C1)+SIGMA*(E45-EY))-E45*EQ*EQ/2.
  2747. UD=SIGMA*(0.5*(SQRT2P-E45*C1-EY*C2)+SIGMA*(E45-EY))-E45*(0.5+EQ* &
  2748. EQ/2.-EQ)
  2749. ENDIF
  2750. EE=EE/FE
  2751. UD=UD/FE
  2752. END SUBROUTINE PROF5
  2753. ! ------------------------------------------------------------------------
  2754. SUBROUTINE TPMIX2DD(p,thes,ts,qs,i,j)
  2755. !
  2756. ! Lookup table variables:
  2757. ! INTEGER, PARAMETER :: (KFNT=250,KFNP=220)
  2758. ! REAL, SAVE, DIMENSION(1:KFNT,1:KFNP) :: TTAB,QSTAB
  2759. ! REAL, SAVE, DIMENSION(1:KFNP) :: THE0K
  2760. ! REAL, SAVE, DIMENSION(1:200) :: ALU
  2761. ! REAL, SAVE :: RDPR,RDTHK,PLUTOP
  2762. ! End of Lookup table variables:
  2763. !-----------------------------------------------------------------------
  2764. IMPLICIT NONE
  2765. !-----------------------------------------------------------------------
  2766. REAL, INTENT(IN ) :: P,THES
  2767. REAL, INTENT(INOUT) :: TS,QS
  2768. INTEGER, INTENT(IN ) :: i,j ! avail for debugging
  2769. REAL :: TP,QQ,BTH,TTH,PP,T00,T10,T01,T11,Q00,Q10,Q01,Q11
  2770. INTEGER :: IPTB,ITHTB
  2771. CHARACTER*256 :: MESS
  2772. !-----------------------------------------------------------------------
  2773. !
  2774. !******** LOOKUP TABLE VARIABLES (F77 format)... ****************************
  2775. ! parameter(kfnt=250,kfnp=220)
  2776. !
  2777. ! COMMON/KFLUT/ ttab(kfnt,kfnp),qstab(kfnt,kfnp),the0k(kfnp), &
  2778. ! alu(200),rdpr,rdthk,plutop
  2779. !***************************************************************
  2780. !
  2781. !***********************************************************************
  2782. ! scaling pressure and tt table index
  2783. !***********************************************************************
  2784. !
  2785. tp=(p-plutop)*rdpr
  2786. qq=tp-aint(tp)
  2787. iptb=int(tp)+1
  2788. !
  2789. !***********************************************************************
  2790. ! base and scaling factor for the
  2791. !***********************************************************************
  2792. !
  2793. ! scaling the and tt table index
  2794. bth=(the0k(iptb+1)-the0k(iptb))*qq+the0k(iptb)
  2795. tth=(thes-bth)*rdthk
  2796. pp =tth-aint(tth)
  2797. ithtb=int(tth)+1
  2798. !
  2799. t00=ttab(ithtb ,iptb )
  2800. t10=ttab(ithtb+1,iptb )
  2801. t01=ttab(ithtb ,iptb+1)
  2802. t11=ttab(ithtb+1,iptb+1)
  2803. !
  2804. q00=qstab(ithtb ,iptb )
  2805. q10=qstab(ithtb+1,iptb )
  2806. q01=qstab(ithtb ,iptb+1)
  2807. q11=qstab(ithtb+1,iptb+1)
  2808. !
  2809. !***********************************************************************
  2810. ! parcel temperature and saturation mixing ratio
  2811. !***********************************************************************
  2812. !
  2813. ts=(t00+(t10-t00)*pp+(t01-t00)*qq+(t00-t10-t01+t11)*pp*qq)
  2814. !
  2815. qs=(q00+(q10-q00)*pp+(q01-q00)*qq+(q00-q10-q01+q11)*pp*qq)
  2816. !
  2817. END SUBROUTINE TPMIX2DD
  2818. ! -----------------------------------------------------------------------
  2819. SUBROUTINE ENVIRTHT(P1,T1,Q1,THT1,ALIQ,BLIQ,CLIQ,DLIQ)
  2820. !
  2821. !-----------------------------------------------------------------------
  2822. IMPLICIT NONE
  2823. !-----------------------------------------------------------------------
  2824. REAL, INTENT(IN ) :: P1,T1,Q1,ALIQ,BLIQ,CLIQ,DLIQ
  2825. REAL, INTENT(INOUT) :: THT1
  2826. REAL :: EE,TLOG,ASTRT,AINC,A1,TP,VALUE,AINTRP,TDPT,TSAT,THT, &
  2827. T00,P00,C1,C2,C3,C4,C5
  2828. INTEGER :: INDLU
  2829. !-----------------------------------------------------------------------
  2830. DATA T00,P00,C1,C2,C3,C4,C5/273.16,1.E5,3374.6525,2.5403,3114.834, &
  2831. 0.278296,1.0723E-3/
  2832. !
  2833. ! CALCULATE ENVIRONMENTAL EQUIVALENT POTENTIAL TEMPERATURE...
  2834. !
  2835. ! NOTE: Calculations for mixed/ice phase no longer used...jsk 8/00
  2836. ! For example, KF90 Eq. 10 no longer used
  2837. !
  2838. EE=Q1*P1/(0.622+Q1)
  2839. ! TLOG=ALOG(EE/ALIQ)
  2840. ! ...calculate LOG term using lookup table...
  2841. !
  2842. astrt=1.e-3
  2843. ainc=0.075
  2844. a1=ee/aliq
  2845. tp=(a1-astrt)/ainc
  2846. indlu=int(tp)+1
  2847. value=(indlu-1)*ainc+astrt
  2848. aintrp=(a1-value)/ainc
  2849. tlog=aintrp*alu(indlu+1)+(1-aintrp)*alu(indlu)
  2850. !
  2851. TDPT=(CLIQ-DLIQ*TLOG)/(BLIQ-TLOG)
  2852. TSAT=TDPT-(.212+1.571E-3*(TDPT-T00)-4.36E-4*(T1-T00))*(T1-TDPT)
  2853. THT=T1*(P00/P1)**(0.2854*(1.-0.28*Q1))
  2854. THT1=THT*EXP((C1/TSAT-C2)*Q1*(1.+0.81*Q1))
  2855. !
  2856. END SUBROUTINE ENVIRTHT
  2857. ! ***********************************************************************
  2858. !====================================================================
  2859. SUBROUTINE kf_eta_init(RTHCUTEN,RQVCUTEN,RQCCUTEN,RQRCUTEN, &
  2860. RQICUTEN,RQSCUTEN,NCA,W0AVG,P_QI,P_QS, &
  2861. SVP1,SVP2,SVP3,SVPT0, &
  2862. P_FIRST_SCALAR,restart,allowed_to_read, &
  2863. ids, ide, jds, jde, kds, kde, &
  2864. ims, ime, jms, jme, kms, kme, &
  2865. its, ite, jts, jte, kts, kte )
  2866. !--------------------------------------------------------------------
  2867. IMPLICIT NONE
  2868. !--------------------------------------------------------------------
  2869. LOGICAL , INTENT(IN) :: restart,allowed_to_read
  2870. INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
  2871. ims, ime, jms, jme, kms, kme, &
  2872. its, ite, jts, jte, kts, kte
  2873. INTEGER , INTENT(IN) :: P_QI,P_QS,P_FIRST_SCALAR
  2874. REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(OUT) :: &
  2875. RTHCUTEN, &
  2876. RQVCUTEN, &
  2877. RQCCUTEN, &
  2878. RQRCUTEN, &
  2879. RQICUTEN, &
  2880. RQSCUTEN
  2881. REAL , DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(OUT) :: W0AVG
  2882. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT):: NCA
  2883. INTEGER :: i, j, k, itf, jtf, ktf
  2884. REAL, INTENT(IN) :: SVP1,SVP2,SVP3,SVPT0
  2885. jtf=min0(jte,jde-1)
  2886. ktf=min0(kte,kde-1)
  2887. itf=min0(ite,ide-1)
  2888. IF(.not.restart)THEN
  2889. DO j=jts,jtf
  2890. DO k=kts,ktf
  2891. DO i=its,itf
  2892. RTHCUTEN(i,k,j)=0.
  2893. RQVCUTEN(i,k,j)=0.
  2894. RQCCUTEN(i,k,j)=0.
  2895. RQRCUTEN(i,k,j)=0.
  2896. ENDDO
  2897. ENDDO
  2898. ENDDO
  2899. IF (P_QI .ge. P_FIRST_SCALAR) THEN
  2900. DO j=jts,jtf
  2901. DO k=kts,ktf
  2902. DO i=its,itf
  2903. RQICUTEN(i,k,j)=0.
  2904. ENDDO
  2905. ENDDO
  2906. ENDDO
  2907. ENDIF
  2908. IF (P_QS .ge. P_FIRST_SCALAR) THEN
  2909. DO j=jts,jtf
  2910. DO k=kts,ktf
  2911. DO i=its,itf
  2912. RQSCUTEN(i,k,j)=0.
  2913. ENDDO
  2914. ENDDO
  2915. ENDDO
  2916. ENDIF
  2917. DO j=jts,jtf
  2918. DO i=its,itf
  2919. NCA(i,j)=-100.
  2920. ENDDO
  2921. ENDDO
  2922. DO j=jts,jtf
  2923. DO k=kts,ktf
  2924. DO i=its,itf
  2925. W0AVG(i,k,j)=0.
  2926. ENDDO
  2927. ENDDO
  2928. ENDDO
  2929. endif
  2930. CALL KF_LUTAB(SVP1,SVP2,SVP3,SVPT0)
  2931. END SUBROUTINE kf_eta_init
  2932. !-------------------------------------------------------
  2933. subroutine kf_lutab(SVP1,SVP2,SVP3,SVPT0)
  2934. !
  2935. ! This subroutine is a lookup table.
  2936. ! Given a series of series of saturation equivalent potential
  2937. ! temperatures, the temperature is calculated.
  2938. !
  2939. !--------------------------------------------------------------------
  2940. IMPLICIT NONE
  2941. !--------------------------------------------------------------------
  2942. ! Lookup table variables
  2943. ! INTEGER, SAVE, PARAMETER :: KFNT=250,KFNP=220
  2944. ! REAL, SAVE, DIMENSION(1:KFNT,1:KFNP) :: TTAB,QSTAB
  2945. ! REAL, SAVE, DIMENSION(1:KFNP) :: THE0K
  2946. ! REAL, SAVE, DIMENSION(1:200) :: ALU
  2947. ! REAL, SAVE :: RDPR,RDTHK,PLUTOP
  2948. ! End of Lookup table variables
  2949. INTEGER :: KP,IT,ITCNT,I
  2950. REAL :: DTH,TMIN,TOLER,PBOT,DPR, &
  2951. TEMP,P,ES,QS,PI,THES,TGUES,THGUES,F0,T1,T0,THGS,F1,DT, &
  2952. ASTRT,AINC,A1,THTGS
  2953. ! REAL :: ALIQ,BLIQ,CLIQ,DLIQ,SVP1,SVP2,SVP3,SVPT0
  2954. REAL :: ALIQ,BLIQ,CLIQ,DLIQ
  2955. REAL, INTENT(IN) :: SVP1,SVP2,SVP3,SVPT0
  2956. !
  2957. ! equivalent potential temperature increment
  2958. data dth/1./
  2959. ! minimum starting temp
  2960. data tmin/150./
  2961. ! tolerance for accuracy of temperature
  2962. data toler/0.001/
  2963. ! top pressure (pascals)
  2964. plutop=5000.0
  2965. ! bottom pressure (pascals)
  2966. pbot=110000.0
  2967. ALIQ = SVP1*1000.
  2968. BLIQ = SVP2
  2969. CLIQ = SVP2*SVPT0
  2970. DLIQ = SVP3
  2971. !
  2972. ! compute parameters
  2973. !
  2974. ! 1._over_(sat. equiv. theta increment)
  2975. rdthk=1./dth
  2976. ! pressure increment
  2977. !
  2978. DPR=(PBOT-PLUTOP)/REAL(KFNP-1)
  2979. ! dpr=(pbot-plutop)/REAL(kfnp-1)
  2980. ! 1._over_(pressure increment)
  2981. rdpr=1./dpr
  2982. ! compute the spread of thes
  2983. ! thespd=dth*(kfnt-1)
  2984. !
  2985. ! calculate the starting sat. equiv. theta
  2986. !
  2987. temp=tmin
  2988. p=plutop-dpr
  2989. do kp=1,kfnp
  2990. p=p+dpr
  2991. es=aliq*exp((bliq*temp-cliq)/(temp-dliq))
  2992. qs=0.622*es/(p-es)
  2993. pi=(1.e5/p)**(0.2854*(1.-0.28*qs))
  2994. the0k(kp)=temp*pi*exp((3374.6525/temp-2.5403)*qs* &
  2995. (1.+0.81*qs))
  2996. enddo
  2997. !
  2998. ! compute temperatures for each sat. equiv. potential temp.
  2999. !
  3000. p=plutop-dpr
  3001. do kp=1,kfnp
  3002. thes=the0k(kp)-dth
  3003. p=p+dpr
  3004. do it=1,kfnt
  3005. ! define sat. equiv. pot. temp.
  3006. thes=thes+dth
  3007. ! iterate to find temperature
  3008. ! find initial guess
  3009. if(it.eq.1) then
  3010. tgues=tmin
  3011. else
  3012. tgues=ttab(it-1,kp)
  3013. endif
  3014. es=aliq*exp((bliq*tgues-cliq)/(tgues-dliq))
  3015. qs=0.622*es/(p-es)
  3016. pi=(1.e5/p)**(0.2854*(1.-0.28*qs))
  3017. thgues=tgues*pi*exp((3374.6525/tgues-2.5403)*qs* &
  3018. (1.+0.81*qs))
  3019. f0=thgues-thes
  3020. t1=tgues-0.5*f0
  3021. t0=tgues
  3022. itcnt=0
  3023. ! iteration loop
  3024. do itcnt=1,11
  3025. es=aliq*exp((bliq*t1-cliq)/(t1-dliq))
  3026. qs=0.622*es/(p-es)
  3027. pi=(1.e5/p)**(0.2854*(1.-0.28*qs))
  3028. thtgs=t1*pi*exp((3374.6525/t1-2.5403)*qs*(1.+0.81*qs))
  3029. f1=thtgs-thes
  3030. if(abs(f1).lt.toler)then
  3031. exit
  3032. endif
  3033. ! itcnt=itcnt+1
  3034. dt=f1*(t1-t0)/(f1-f0)
  3035. t0=t1
  3036. f0=f1
  3037. t1=t1-dt
  3038. enddo
  3039. ttab(it,kp)=t1
  3040. qstab(it,kp)=qs
  3041. enddo
  3042. enddo
  3043. !
  3044. ! lookup table for tlog(emix/aliq)
  3045. !
  3046. ! set up intial values for lookup tables
  3047. !
  3048. astrt=1.e-3
  3049. ainc=0.075
  3050. !
  3051. a1=astrt-ainc
  3052. do i=1,200
  3053. a1=a1+ainc
  3054. alu(i)=alog(a1)
  3055. enddo
  3056. !
  3057. END SUBROUTINE KF_LUTAB
  3058. END MODULE module_cu_kfeta