PageRenderTime 70ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 1ms

/wrfv2_fire/phys/module_cu_osas.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 2586 lines | 1848 code | 99 blank | 639 comment | 53 complexity | e5e0d51bc82750324794a1aad415c4a7 MD5 | raw file
Possible License(s): AGPL-1.0
  1. !!
  2. MODULE module_cu_osas
  3. CONTAINS
  4. !-----------------------------------------------------------------
  5. SUBROUTINE CU_OSAS(DT,ITIMESTEP,STEPCU, &
  6. RTHCUTEN,RQVCUTEN,RQCCUTEN,RQICUTEN, &
  7. RUCUTEN,RVCUTEN, & ! gopal's doing for SAS
  8. RAINCV,PRATEC,HTOP,HBOT, &
  9. U3D,V3D,W,T3D,QV3D,QC3D,QI3D,PI3D,RHO3D, &
  10. DZ8W,PCPS,P8W,XLAND,CU_ACT_FLAG, &
  11. P_QC, &
  12. STORE_RAND,MOMMIX, & ! gopal's doing
  13. P_QI,P_FIRST_SCALAR, &
  14. CUDT, CURR_SECS, ADAPT_STEP_FLAG, &
  15. CUDTACTTIME, &
  16. ids,ide, jds,jde, kds,kde, &
  17. ims,ime, jms,jme, kms,kme, &
  18. its,ite, jts,jte, kts,kte )
  19. !-------------------------------------------------------------------
  20. USE MODULE_GFS_MACHINE , ONLY : kind_phys
  21. USE MODULE_GFS_FUNCPHYS , ONLY : gfuncphys
  22. USE MODULE_GFS_PHYSCONS, grav => con_g, CP => con_CP, HVAP => con_HVAP &
  23. &, RV => con_RV, FV => con_fvirt, T0C => con_T0C &
  24. &, CVAP => con_CVAP, CLIQ => con_CLIQ &
  25. &, EPS => con_eps, EPSM1 => con_epsm1 &
  26. &, ROVCP => con_rocp, RD => con_rd
  27. !-------------------------------------------------------------------
  28. IMPLICIT NONE
  29. !-------------------------------------------------------------------
  30. !-- U3D 3D u-velocity interpolated to theta points (m/s)
  31. !-- V3D 3D v-velocity interpolated to theta points (m/s)
  32. !-- TH3D 3D potential temperature (K)
  33. !-- T3D temperature (K)
  34. !-- QV3D 3D water vapor mixing ratio (Kg/Kg)
  35. !-- QC3D 3D cloud mixing ratio (Kg/Kg)
  36. !-- QI3D 3D ice mixing ratio (Kg/Kg)
  37. !-- P8w 3D pressure at full levels (Pa)
  38. !-- Pcps 3D pressure (Pa)
  39. !-- PI3D 3D exner function (dimensionless)
  40. !-- rr3D 3D dry air density (kg/m^3)
  41. !-- RUBLTEN U tendency due to
  42. ! PBL parameterization (m/s^2)
  43. !-- RVBLTEN V tendency due to
  44. ! PBL parameterization (m/s^2)
  45. !-- RTHBLTEN Theta tendency due to
  46. ! PBL parameterization (K/s)
  47. !-- RQVBLTEN Qv tendency due to
  48. ! PBL parameterization (kg/kg/s)
  49. !-- RQCBLTEN Qc tendency due to
  50. ! PBL parameterization (kg/kg/s)
  51. !-- RQIBLTEN Qi tendency due to
  52. ! PBL parameterization (kg/kg/s)
  53. !
  54. !-- MOMMIX MOMENTUM MIXING COEFFICIENT (can be set in the namelist)
  55. !-- RUCUTEN U tendency due to Cumulus Momentum Mixing (gopal's doing for SAS)
  56. !-- RVCUTEN V tendency due to Cumulus Momentum Mixing (gopal's doing for SAS)
  57. !
  58. !-- CP heat capacity at constant pressure for dry air (J/kg/K)
  59. !-- GRAV acceleration due to gravity (m/s^2)
  60. !-- ROVCP R/CP
  61. !-- RD gas constant for dry air (J/kg/K)
  62. !-- ROVG R/G
  63. !-- P_QI species index for cloud ice
  64. !-- dz8w dz between full levels (m)
  65. !-- z height above sea level (m)
  66. !-- PSFC pressure at the surface (Pa)
  67. !-- UST u* in similarity theory (m/s)
  68. !-- PBL PBL height (m)
  69. !-- PSIM similarity stability function for momentum
  70. !-- PSIH similarity stability function for heat
  71. !-- HFX upward heat flux at the surface (W/m^2)
  72. !-- QFX upward moisture flux at the surface (kg/m^2/s)
  73. !-- TSK surface temperature (K)
  74. !-- GZ1OZ0 log(z/z0) where z0 is roughness length
  75. !-- WSPD wind speed at lowest model level (m/s)
  76. !-- BR bulk Richardson number in surface layer
  77. !-- DT time step (s)
  78. !-- rvovrd R_v divided by R_d (dimensionless)
  79. !-- EP1 constant for virtual temperature (R_v/R_d - 1) (dimensionless)
  80. !-- KARMAN Von Karman constant
  81. !-- ids start index for i in domain
  82. !-- ide end index for i in domain
  83. !-- jds start index for j in domain
  84. !-- jde end index for j in domain
  85. !-- kds start index for k in domain
  86. !-- kde end index for k in domain
  87. !-- ims start index for i in memory
  88. !-- ime end index for i in memory
  89. !-- jms start index for j in memory
  90. !-- jme end index for j in memory
  91. !-- kms start index for k in memory
  92. !-- kme end index for k in memory
  93. !-- its start index for i in tile
  94. !-- ite end index for i in tile
  95. !-- jts start index for j in tile
  96. !-- jte end index for j in tile
  97. !-- kts start index for k in tile
  98. !-- kte end index for k in tile
  99. !-------------------------------------------------------------------
  100. INTEGER :: ICLDCK
  101. INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde, &
  102. ims,ime, jms,jme, kms,kme, &
  103. its,ite, jts,jte, kts,kte, &
  104. ITIMESTEP, & !NSTD
  105. P_FIRST_SCALAR, &
  106. P_QC, &
  107. P_QI, &
  108. STEPCU
  109. REAL, INTENT(IN) :: &
  110. DT
  111. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: &
  112. RQCCUTEN, &
  113. RQICUTEN, &
  114. RQVCUTEN, &
  115. RTHCUTEN
  116. REAL, DIMENSION(ims:ime, jms:jme, kms:kme), INTENT(INOUT) :: &
  117. RUCUTEN, & ! gopal's doing for SAS
  118. RVCUTEN ! gopal's doing for SAS
  119. REAL, OPTIONAL, INTENT(IN) :: MOMMIX
  120. REAL, DIMENSION( ims:ime , jms:jme ), OPTIONAL, &
  121. INTENT(IN) :: STORE_RAND
  122. REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: &
  123. XLAND
  124. REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: &
  125. RAINCV, PRATEC
  126. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: &
  127. HBOT, &
  128. HTOP
  129. LOGICAL, DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: &
  130. CU_ACT_FLAG
  131. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: &
  132. DZ8W, &
  133. P8w, &
  134. Pcps, &
  135. PI3D, &
  136. QC3D, &
  137. QI3D, &
  138. QV3D, &
  139. RHO3D, &
  140. T3D, &
  141. U3D, &
  142. V3D, &
  143. W
  144. ! Adaptive time-step variables
  145. REAL, INTENT(IN ) :: CUDT
  146. REAL, INTENT(IN ) :: CURR_SECS
  147. LOGICAL,INTENT(IN ) , OPTIONAL :: ADAPT_STEP_FLAG
  148. REAL, INTENT (INOUT) :: CUDTACTTIME
  149. !--------------------------- LOCAL VARS ------------------------------
  150. REAL, DIMENSION(ims:ime, jms:jme) :: &
  151. PSFC
  152. REAL (kind=kind_phys) :: &
  153. DELT, &
  154. DPSHC, &
  155. RDELT, &
  156. RSEED
  157. REAL (kind=kind_phys), DIMENSION(its:ite) :: &
  158. CLDWRK, &
  159. PS, &
  160. RCS, &
  161. RN, &
  162. SLIMSK, &
  163. XKT2
  164. REAL (kind=kind_phys), DIMENSION(its:ite, kts:kte+1) :: &
  165. PRSI
  166. REAL (kind=kind_phys), DIMENSION(its:ite, kts:kte) :: &
  167. DEL, &
  168. DOT, &
  169. PHIL, &
  170. PRSL, &
  171. PRSLK, &
  172. Q1, &
  173. T1, &
  174. U1, &
  175. V1, &
  176. ZI, &
  177. ZL
  178. REAL (kind=kind_phys), DIMENSION(its:ite, kts:kte, 2) :: &
  179. QL
  180. INTEGER, DIMENSION(its:ite) :: &
  181. KBOT, &
  182. KTOP, &
  183. KUO
  184. INTEGER :: &
  185. I, &
  186. IGPVS, &
  187. IM, &
  188. J, &
  189. JCAP, &
  190. K, &
  191. KM, &
  192. KP, &
  193. KX, &
  194. NCLOUD
  195. LOGICAL :: run_param , doing_adapt_dt , decided
  196. DATA IGPVS/0/
  197. !-----------------------------------------------------------------------
  198. !
  199. !*** CHECK TO SEE IF THIS IS A CONVECTION TIMESTEP
  200. !
  201. ! Initialization for adaptive time step.
  202. doing_adapt_dt = .FALSE.
  203. IF ( PRESENT(adapt_step_flag) ) THEN
  204. IF ( adapt_step_flag ) THEN
  205. doing_adapt_dt = .TRUE.
  206. IF ( cudtacttime .EQ. 0. ) THEN
  207. cudtacttime = curr_secs + cudt*60.
  208. END IF
  209. END IF
  210. END IF
  211. ! Do we run through this scheme or not?
  212. ! Test 1: If this is the initial model time, then yes.
  213. ! ITIMESTEP=1
  214. ! Test 2: If the user asked for the cumulus to be run every time step, then yes.
  215. ! CUDT=0 or STEPCU=1
  216. ! Test 3: If not adaptive dt, and this is on the requested cumulus frequency, then yes.
  217. ! MOD(ITIMESTEP,STEPCU)=0
  218. ! Test 4: If using adaptive dt and the current time is past the last requested activate cumulus time, then yes.
  219. ! CURR_SECS >= CUDTACTTIME
  220. ! If we do run through the scheme, we set the flag run_param to TRUE and we set the decided flag
  221. ! to TRUE. The decided flag says that one of these tests was able to say "yes", run the scheme.
  222. ! We only proceed to other tests if the previous tests all have left decided as FALSE.
  223. ! If we set run_param to TRUE and this is adaptive time stepping, we set the time to the next
  224. ! cumulus run.
  225. decided = .FALSE.
  226. run_param = .FALSE.
  227. IF ( ( .NOT. decided ) .AND. &
  228. ( itimestep .EQ. 1 ) ) THEN
  229. run_param = .TRUE.
  230. decided = .TRUE.
  231. END IF
  232. IF ( ( .NOT. decided ) .AND. &
  233. ( ( cudt .EQ. 0. ) .OR. ( stepcu .EQ. 1 ) ) ) THEN
  234. run_param = .TRUE.
  235. decided = .TRUE.
  236. END IF
  237. IF ( ( .NOT. decided ) .AND. &
  238. ( .NOT. doing_adapt_dt ) .AND. &
  239. ( MOD(itimestep,stepcu) .EQ. 0 ) ) THEN
  240. run_param = .TRUE.
  241. decided = .TRUE.
  242. END IF
  243. IF ( ( .NOT. decided ) .AND. &
  244. ( doing_adapt_dt ) .AND. &
  245. ( curr_secs .GE. cudtacttime ) ) THEN
  246. run_param = .TRUE.
  247. decided = .TRUE.
  248. cudtacttime = curr_secs + cudt*60
  249. END IF
  250. !-----------------------------------------------------------------------
  251. IF(run_param) THEN
  252. DO J=JTS,JTE
  253. DO I=ITS,ITE
  254. CU_ACT_FLAG(I,J)=.TRUE.
  255. ENDDO
  256. ENDDO
  257. IM=ITE-ITS+1
  258. KX=KTE-KTS+1
  259. JCAP=126
  260. DPSHC=30_kind_phys
  261. DELT=DT*STEPCU
  262. RDELT=1./DELT
  263. NCLOUD=1
  264. DO J=jms,jme
  265. DO I=ims,ime
  266. PSFC(i,j)=P8w(i,kms,j)
  267. ENDDO
  268. ENDDO
  269. if(igpvs.eq.0) CALL GFUNCPHYS
  270. igpvs=1
  271. !------------- J LOOP (OUTER) --------------------------------------------------
  272. DO J=jts,jte
  273. ! --------------- compute zi and zl -----------------------------------------
  274. DO i=its,ite
  275. ZI(I,KTS)=0.0
  276. ENDDO
  277. DO k=kts+1,kte
  278. KM=K-1
  279. DO i=its,ite
  280. ZI(I,K)=ZI(I,KM)+dz8w(i,km,j)
  281. ENDDO
  282. ENDDO
  283. DO k=kts+1,kte
  284. KM=K-1
  285. DO i=its,ite
  286. ZL(I,KM)=(ZI(I,K)+ZI(I,KM))*0.5
  287. ENDDO
  288. ENDDO
  289. DO i=its,ite
  290. ZL(I,KTE)=2.*ZI(I,KTE)-ZL(I,KTE-1)
  291. ENDDO
  292. ! --------------- end compute zi and zl -------------------------------------
  293. ! Based on some important findings from Morris Bender, XKT2 was defined in
  294. ! terms of random number instead of random number based cloud tops
  295. ! Also, these random numbers are stored and are changed only once in
  296. ! approximately 5 minutes interval now. This is gopal's doing for HWRF.
  297. ! call random_number(XKT2)
  298. #if (EM_CORE == 1)
  299. ! XKT2 was defined in terms of random number instead of random number based cloud tops
  300. ! ZCX
  301. call init_random_seed()
  302. call random_number(XKT2)
  303. #ifdef REGTEST
  304. ! for regtest only
  305. xkt2 = 0.1
  306. #endif
  307. #endif
  308. !
  309. #if (NMM_CORE == 1)
  310. DO i=its,ite
  311. XKT2(i) = STORE_RAND(i,j)
  312. ENDDO
  313. #endif
  314. DO i=its,ite
  315. PS(i)=PSFC(i,j)*.001
  316. RCS(i)=1.
  317. SLIMSK(i)=ABS(XLAND(i,j)-2.)
  318. ENDDO
  319. DO i=its,ite
  320. PRSI(i,kts)=PS(i)
  321. ENDDO
  322. DO k=kts,kte
  323. kp=k+1
  324. DO i=its,ite
  325. PRSL(I,K)=Pcps(i,k,j)*.001
  326. PHIL(I,K)=ZL(I,K)*GRAV
  327. DOT(i,k)=-5.0E-4*GRAV*rho3d(i,k,j)*(w(i,k,j)+w(i,kp,j))
  328. ENDDO
  329. ENDDO
  330. DO k=kts,kte
  331. DO i=its,ite
  332. DEL(i,k)=PRSL(i,k)*GRAV/RD*dz8w(i,k,j)/T3D(i,k,j)
  333. U1(i,k)=U3D(i,k,j)
  334. V1(i,k)=V3D(i,k,j)
  335. Q1(i,k)=QV3D(i,k,j)/(1.+QV3D(i,k,j))
  336. T1(i,k)=T3D(i,k,j)
  337. QL(i,k,1)=QI3D(i,k,j)/(1.+QI3D(i,k,j))
  338. QL(i,k,2)=QC3D(i,k,j)/(1.+QC3D(i,k,j))
  339. PRSLK(I,K)=(PRSL(i,k)*.01)**ROVCP
  340. ENDDO
  341. ENDDO
  342. DO k=kts+1,kte+1
  343. km=k-1
  344. DO i=its,ite
  345. PRSI(i,k)=PRSI(i,km)-del(i,km)
  346. ENDDO
  347. ENDDO
  348. CALL OSASCNV(IM,IM,KX,JCAP,DELT,DEL,PRSL,PS,PHIL, &
  349. QL,Q1,T1,U1,V1,RCS,CLDWRK,RN,KBOT, &
  350. KTOP,KUO,SLIMSK,DOT,XKT2,NCLOUD)
  351. !!! make more like GFDL ... eliminate shallow convection.....
  352. !!! CALL SHALCV(IM,IM,KX,DELT,DEL,PRSI,PRSL,PRSLK,KUO,Q1,T1,DPSHC)
  353. #if (EM_CORE == 1)
  354. CALL SHALCV(IM,IM,KX,DELT,DEL,PRSI,PRSL,PRSLK,KUO,Q1,T1,DPSHC)
  355. #endif
  356. DO I=ITS,ITE
  357. RAINCV(I,J)=RN(I)*1000./STEPCU
  358. PRATEC(I,J)=RN(I)*1000./(STEPCU * DT)
  359. HBOT(I,J)=KBOT(I)
  360. HTOP(I,J)=KTOP(I)
  361. ENDDO
  362. DO K=KTS,KTE
  363. DO I=ITS,ITE
  364. RTHCUTEN(I,K,J)=(T1(I,K)-T3D(I,K,J))/PI3D(I,K,J)*RDELT
  365. RQVCUTEN(I,K,J)=(Q1(I,K)/(1.-q1(i,k))-QV3D(I,K,J))*RDELT
  366. ENDDO
  367. ENDDO
  368. !===============================================================================
  369. ! ADD MOMENTUM MIXING TERM AS TENDENCIES. This is gopal's doing for SAS
  370. ! MOMMIX is the reduction factor set to 0.7 by default. Because NMM has
  371. ! divergence damping term, a reducion factor for cumulum mixing may be
  372. ! required otherwise storms were too weak.
  373. !===============================================================================
  374. !
  375. #if (NMM_CORE == 1)
  376. DO K=KTS,KTE
  377. DO I=ITS,ITE
  378. RUCUTEN(I,J,K)=MOMMIX*(U1(I,K)-U3D(I,K,J))*RDELT
  379. RVCUTEN(I,J,K)=MOMMIX*(V1(I,K)-V3D(I,K,J))*RDELT
  380. ENDDO
  381. ENDDO
  382. #endif
  383. IF(P_QC .ge. P_FIRST_SCALAR)THEN
  384. DO K=KTS,KTE
  385. DO I=ITS,ITE
  386. RQCCUTEN(I,K,J)=(QL(I,K,2)/(1.-ql(i,k,2))-QC3D(I,K,J))*RDELT
  387. ENDDO
  388. ENDDO
  389. ENDIF
  390. IF(P_QI .ge. P_FIRST_SCALAR)THEN
  391. DO K=KTS,KTE
  392. DO I=ITS,ITE
  393. RQICUTEN(I,K,J)=(QL(I,K,1)/(1.-ql(i,k,1))-QI3D(I,K,J))*RDELT
  394. ENDDO
  395. ENDDO
  396. ENDIF
  397. ENDDO ! Outer most J loop
  398. ENDIF
  399. END SUBROUTINE CU_OSAS
  400. !====================================================================
  401. SUBROUTINE osasinit(RTHCUTEN,RQVCUTEN,RQCCUTEN,RQICUTEN, &
  402. RUCUTEN,RVCUTEN, & ! gopal's doing for SAS
  403. RESTART,P_QC,P_QI,P_FIRST_SCALAR, &
  404. allowed_to_read, &
  405. ids, ide, jds, jde, kds, kde, &
  406. ims, ime, jms, jme, kms, kme, &
  407. its, ite, jts, jte, kts, kte )
  408. !--------------------------------------------------------------------
  409. IMPLICIT NONE
  410. !--------------------------------------------------------------------
  411. LOGICAL , INTENT(IN) :: allowed_to_read,restart
  412. INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
  413. ims, ime, jms, jme, kms, kme, &
  414. its, ite, jts, jte, kts, kte
  415. INTEGER , INTENT(IN) :: P_FIRST_SCALAR, P_QI, P_QC
  416. REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(OUT) :: &
  417. RTHCUTEN, &
  418. RQVCUTEN, &
  419. RQCCUTEN, &
  420. RQICUTEN
  421. REAL, DIMENSION( ims:ime , jms:jme , kms:kme ) , INTENT(OUT) :: &
  422. RUCUTEN, & ! gopal's doing for SAS
  423. RVCUTEN
  424. INTEGER :: i, j, k, itf, jtf, ktf
  425. jtf=min0(jte,jde-1)
  426. ktf=min0(kte,kde-1)
  427. itf=min0(ite,ide-1)
  428. #ifdef HWRF
  429. !zhang's doing
  430. IF(.not.restart .or. .not.allowed_to_read)THEN
  431. !end of zhang's doing
  432. #else
  433. IF(.not.restart)THEN
  434. #endif
  435. DO j=jts,jtf
  436. DO k=kts,ktf
  437. DO i=its,itf
  438. RTHCUTEN(i,k,j)=0.
  439. RQVCUTEN(i,k,j)=0.
  440. RUCUTEN(i,j,k)=0. ! gopal's doing for SAS
  441. RVCUTEN(i,j,k)=0. ! gopal's doing for SAS
  442. ENDDO
  443. ENDDO
  444. ENDDO
  445. IF (P_QC .ge. P_FIRST_SCALAR) THEN
  446. DO j=jts,jtf
  447. DO k=kts,ktf
  448. DO i=its,itf
  449. RQCCUTEN(i,k,j)=0.
  450. ENDDO
  451. ENDDO
  452. ENDDO
  453. ENDIF
  454. IF (P_QI .ge. P_FIRST_SCALAR) THEN
  455. DO j=jts,jtf
  456. DO k=kts,ktf
  457. DO i=its,itf
  458. RQICUTEN(i,k,j)=0.
  459. ENDDO
  460. ENDDO
  461. ENDDO
  462. ENDIF
  463. ENDIF
  464. END SUBROUTINE osasinit
  465. ! ------------------------------------------------------------------------
  466. SUBROUTINE OSASCNV(IM,IX,KM,JCAP,DELT,DEL,PRSL,PS,PHIL,QL, &
  467. & Q1,T1,U1,V1,RCS,CLDWRK,RN,KBOT,KTOP,KUO,SLIMSK, &
  468. & DOT,XKT2,ncloud)
  469. ! for cloud water version
  470. ! parameter(ncloud=0)
  471. ! SUBROUTINE OSASCNV(KM,JCAP,DELT,DEL,SL,SLK,PS,QL,
  472. ! & Q1,T1,U1,V1,RCS,CLDWRK,RN,KBOT,KTOP,KUO,SLIMSK,
  473. ! & DOT,xkt2,ncloud)
  474. !
  475. USE MODULE_GFS_MACHINE , ONLY : kind_phys
  476. USE MODULE_GFS_FUNCPHYS ,ONLY : fpvs
  477. USE MODULE_GFS_PHYSCONS, grav => con_g, CP => con_CP, HVAP => con_HVAP &
  478. &, RV => con_RV, FV => con_fvirt, T0C => con_T0C &
  479. &, CVAP => con_CVAP, CLIQ => con_CLIQ &
  480. &, EPS => con_eps, EPSM1 => con_epsm1
  481. implicit none
  482. !
  483. ! include 'constant.h'
  484. !
  485. integer IM, IX, KM, JCAP, ncloud, &
  486. & KBOT(IM), KTOP(IM), KUO(IM), J
  487. real(kind=kind_phys) DELT
  488. real(kind=kind_phys) PS(IM), DEL(IX,KM), PRSL(IX,KM), &
  489. ! real(kind=kind_phys) DEL(IX,KM), PRSL(IX,KM),
  490. & QL(IX,KM,2), Q1(IX,KM), T1(IX,KM), &
  491. & U1(IX,KM), V1(IX,KM), RCS(IM), &
  492. & CLDWRK(IM), RN(IM), SLIMSK(IM), &
  493. & DOT(IX,KM), XKT2(IM), PHIL(IX,KM)
  494. !
  495. integer I, INDX, jmn, k, knumb, latd, lond, km1
  496. !
  497. real(kind=kind_phys) adw, alpha, alphal, alphas, &
  498. & aup, beta, betal, betas, &
  499. & c0, cpoel, dellat, delta, &
  500. & desdt, deta, detad, dg, &
  501. & dh, dhh, dlnsig, dp, &
  502. & dq, dqsdp, dqsdt, dt, &
  503. & dt2, dtmax, dtmin, dv1, &
  504. & dv1q, dv2, dv2q, dv1u, &
  505. & dv1v, dv2u, dv2v, dv3u, &
  506. & dv3v, dv3, dv3q, dvq1, &
  507. & dz, dz1, e1, edtmax, &
  508. & edtmaxl, edtmaxs, el2orc, elocp, &
  509. & es, etah, &
  510. & evef, evfact, evfactl, fact1, &
  511. & fact2, factor, fjcap, fkm, &
  512. & fuv, g, gamma, onemf, &
  513. & onemfu, pdetrn, pdpdwn, pprime, &
  514. & qc, qlk, qrch, qs, &
  515. & rain, rfact, shear, tem1, &
  516. & tem2, terr, val, val1, &
  517. & val2, w1, w1l, w1s, &
  518. & w2, w2l, w2s, w3, &
  519. & w3l, w3s, w4, w4l, &
  520. & w4s, xdby, xpw, xpwd, &
  521. & xqc, xqrch, xlambu, mbdt, &
  522. & tem
  523. !
  524. !
  525. integer JMIN(IM), KB(IM), KBCON(IM), KBDTR(IM), &
  526. & KT2(IM), KTCON(IM), LMIN(IM), &
  527. & kbm(IM), kbmax(IM), kmax(IM)
  528. !
  529. real(kind=kind_phys) AA1(IM), ACRT(IM), ACRTFCT(IM), &
  530. & DELHBAR(IM), DELQ(IM), DELQ2(IM), &
  531. & DELQBAR(IM), DELQEV(IM), DELTBAR(IM), &
  532. & DELTV(IM), DTCONV(IM), EDT(IM), &
  533. & EDTO(IM), EDTX(IM), FLD(IM), &
  534. & HCDO(IM), HKBO(IM), HMAX(IM), &
  535. & HMIN(IM), HSBAR(IM), UCDO(IM), &
  536. & UKBO(IM), VCDO(IM), VKBO(IM), &
  537. & PBCDIF(IM), PDOT(IM), PO(IM,KM), &
  538. & PWAVO(IM), PWEVO(IM), &
  539. ! & PSFC(IM), PWAVO(IM), PWEVO(IM), &
  540. & QCDO(IM), QCOND(IM), QEVAP(IM), &
  541. & QKBO(IM), RNTOT(IM), VSHEAR(IM), &
  542. & XAA0(IM), XHCD(IM), XHKB(IM), &
  543. & XK(IM), XLAMB(IM), XLAMD(IM), &
  544. & XMB(IM), XMBMAX(IM), XPWAV(IM), &
  545. & XPWEV(IM), XQCD(IM), XQKB(IM)
  546. !
  547. ! PHYSICAL PARAMETERS
  548. PARAMETER(G=grav)
  549. PARAMETER(CPOEL=CP/HVAP,ELOCP=HVAP/CP, &
  550. & EL2ORC=HVAP*HVAP/(RV*CP))
  551. PARAMETER(TERR=0.,C0=.002,DELTA=fv)
  552. PARAMETER(FACT1=(CVAP-CLIQ)/RV,FACT2=HVAP/RV-FACT1*T0C)
  553. ! LOCAL VARIABLES AND ARRAYS
  554. real(kind=kind_phys) PFLD(IM,KM), TO(IM,KM), QO(IM,KM), &
  555. & UO(IM,KM), VO(IM,KM), QESO(IM,KM)
  556. ! cloud water
  557. real(kind=kind_phys) QLKO_KTCON(IM), DELLAL(IM), TVO(IM,KM), &
  558. & DBYO(IM,KM), ZO(IM,KM), SUMZ(IM,KM), &
  559. & SUMH(IM,KM), HEO(IM,KM), HESO(IM,KM), &
  560. & QRCD(IM,KM), DELLAH(IM,KM), DELLAQ(IM,KM),&
  561. & DELLAU(IM,KM), DELLAV(IM,KM), HCKO(IM,KM), &
  562. & UCKO(IM,KM), VCKO(IM,KM), QCKO(IM,KM), &
  563. & ETA(IM,KM), ETAU(IM,KM), ETAD(IM,KM), &
  564. & QRCDO(IM,KM), PWO(IM,KM), PWDO(IM,KM), &
  565. & RHBAR(IM), TX1(IM)
  566. !
  567. LOGICAL TOTFLG, CNVFLG(IM), DWNFLG(IM), DWNFLG2(IM), FLG(IM)
  568. !
  569. real(kind=kind_phys) PCRIT(15), ACRITT(15), ACRIT(15)
  570. ! SAVE PCRIT, ACRITT
  571. DATA PCRIT/850.,800.,750.,700.,650.,600.,550.,500.,450.,400., &
  572. & 350.,300.,250.,200.,150./
  573. DATA ACRITT/.0633,.0445,.0553,.0664,.075,.1082,.1521,.2216, &
  574. & .3151,.3677,.41,.5255,.7663,1.1686,1.6851/
  575. ! GDAS DERIVED ACRIT
  576. ! DATA ACRITT/.203,.515,.521,.566,.625,.665,.659,.688, &
  577. ! & .743,.813,.886,.947,1.138,1.377,1.896/
  578. !
  579. real(kind=kind_phys) TF, TCR, TCRF, RZERO, RONE
  580. parameter (TF=233.16, TCR=263.16, TCRF=1.0/(TCR-TF))
  581. parameter (RZERO=0.0,RONE=1.0)
  582. !-----------------------------------------------------------------------
  583. !
  584. km1 = km - 1
  585. ! INITIALIZE ARRAYS
  586. !
  587. DO I=1,IM
  588. RN(I)=0.
  589. KBOT(I)=KM+1
  590. KTOP(I)=0
  591. KUO(I)=0
  592. CNVFLG(I) = .TRUE.
  593. DTCONV(I) = 3600.
  594. CLDWRK(I) = 0.
  595. PDOT(I) = 0.
  596. KT2(I) = 0
  597. QLKO_KTCON(I) = 0.
  598. DELLAL(I) = 0.
  599. ENDDO
  600. !!
  601. DO K = 1, 15
  602. ACRIT(K) = ACRITT(K) * (975. - PCRIT(K))
  603. ENDDO
  604. DT2 = DELT
  605. !cmr dtmin = max(dt2,1200.)
  606. val = 1200.
  607. dtmin = max(dt2, val )
  608. !cmr dtmax = max(dt2,3600.)
  609. val = 3600.
  610. dtmax = max(dt2, val )
  611. ! MODEL TUNABLE PARAMETERS ARE ALL HERE
  612. MBDT = 10.
  613. EDTMAXl = .3
  614. EDTMAXs = .3
  615. ALPHAl = .5
  616. ALPHAs = .5
  617. BETAl = .15
  618. betas = .15
  619. BETAl = .05
  620. betas = .05
  621. ! change for hurricane model
  622. BETAl = .5
  623. betas = .5
  624. ! EVEF = 0.07
  625. evfact = 0.3
  626. evfactl = 0.3
  627. ! change for hurricane model
  628. evfact = 0.6
  629. evfactl = .6
  630. #if ( EM_CORE == 1 )
  631. ! HAWAII TEST - ZCX
  632. ALPHAl = .5
  633. ALPHAs = .75
  634. BETAl = .05
  635. betas = .05
  636. evfact = 0.5
  637. evfactl = 0.5
  638. #endif
  639. PDPDWN = 0.
  640. PDETRN = 200.
  641. xlambu = 1.e-4
  642. fjcap = (float(jcap) / 126.) ** 2
  643. !cmr fjcap = max(fjcap,1.)
  644. val = 1.
  645. fjcap = max(fjcap,val)
  646. fkm = (float(km) / 28.) ** 2
  647. !cmr fkm = max(fkm,1.)
  648. fkm = max(fkm,val)
  649. W1l = -8.E-3
  650. W2l = -4.E-2
  651. W3l = -5.E-3
  652. W4l = -5.E-4
  653. W1s = -2.E-4
  654. W2s = -2.E-3
  655. W3s = -1.E-3
  656. W4s = -2.E-5
  657. !CCCC IF(IM.EQ.384) THEN
  658. LATD = 92
  659. lond = 189
  660. !CCCC ELSEIF(IM.EQ.768) THEN
  661. !CCCC LATD = 80
  662. !CCCC ELSE
  663. !CCCC LATD = 0
  664. !CCCC ENDIF
  665. !
  666. ! DEFINE TOP LAYER FOR SEARCH OF THE DOWNDRAFT ORIGINATING LAYER
  667. ! AND THE MAXIMUM THETAE FOR UPDRAFT
  668. !
  669. DO I=1,IM
  670. KBMAX(I) = KM
  671. KBM(I) = KM
  672. KMAX(I) = KM
  673. TX1(I) = 1.0 / PS(I)
  674. ENDDO
  675. !
  676. DO K = 1, KM
  677. DO I=1,IM
  678. IF (prSL(I,K)*tx1(I) .GT. 0.45) KBMAX(I) = K + 1
  679. IF (prSL(I,K)*tx1(I) .GT. 0.70) KBM(I) = K + 1
  680. IF (prSL(I,K)*tx1(I) .GT. 0.04) KMAX(I) = MIN(KM,K + 1)
  681. ENDDO
  682. ENDDO
  683. DO I=1,IM
  684. KBMAX(I) = MIN(KBMAX(I),KMAX(I))
  685. KBM(I) = MIN(KBM(I),KMAX(I))
  686. ENDDO
  687. !
  688. ! CONVERT SURFACE PRESSURE TO MB FROM CB
  689. !
  690. !!
  691. DO K = 1, KM
  692. DO I=1,IM
  693. if (K .le. kmax(i)) then
  694. PFLD(I,k) = PRSL(I,K) * 10.0
  695. PWO(I,k) = 0.
  696. PWDO(I,k) = 0.
  697. TO(I,k) = T1(I,k)
  698. QO(I,k) = Q1(I,k)
  699. UO(I,k) = U1(I,k)
  700. VO(I,k) = V1(I,k)
  701. DBYO(I,k) = 0.
  702. SUMZ(I,k) = 0.
  703. SUMH(I,k) = 0.
  704. endif
  705. ENDDO
  706. ENDDO
  707. !
  708. ! COLUMN VARIABLES
  709. ! P IS PRESSURE OF THE LAYER (MB)
  710. ! T IS TEMPERATURE AT T-DT (K)..TN
  711. ! Q IS MIXING RATIO AT T-DT (KG/KG)..QN
  712. ! TO IS TEMPERATURE AT T+DT (K)... THIS IS AFTER ADVECTION AND TURBULAN
  713. ! QO IS MIXING RATIO AT T+DT (KG/KG)..Q1
  714. !
  715. DO K = 1, KM
  716. DO I=1,IM
  717. if (k .le. kmax(i)) then
  718. !jfe QESO(I,k) = 10. * FPVS(T1(I,k))
  719. !
  720. QESO(I,k) = 0.01 * fpvs(T1(I,K)) ! fpvs is in Pa
  721. !
  722. QESO(I,k) = EPS * QESO(I,k) / (PFLD(I,k) + EPSM1*QESO(I,k))
  723. !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
  724. val1 = 1.E-8
  725. QESO(I,k) = MAX(QESO(I,k), val1)
  726. !cmr QO(I,k) = max(QO(I,k),1.e-10)
  727. val2 = 1.e-10
  728. QO(I,k) = max(QO(I,k), val2 )
  729. ! QO(I,k) = MIN(QO(I,k),QESO(I,k))
  730. TVO(I,k) = TO(I,k) + DELTA * TO(I,k) * QO(I,k)
  731. endif
  732. ENDDO
  733. ENDDO
  734. !
  735. ! HYDROSTATIC HEIGHT ASSUME ZERO TERR
  736. !
  737. DO K = 1, KM
  738. DO I=1,IM
  739. ZO(I,k) = PHIL(I,k) / G
  740. ENDDO
  741. ENDDO
  742. ! COMPUTE MOIST STATIC ENERGY
  743. DO K = 1, KM
  744. DO I=1,IM
  745. if (K .le. kmax(i)) then
  746. ! tem = G * ZO(I,k) + CP * TO(I,k)
  747. tem = PHIL(I,k) + CP * TO(I,k)
  748. HEO(I,k) = tem + HVAP * QO(I,k)
  749. HESO(I,k) = tem + HVAP * QESO(I,k)
  750. ! HEO(I,k) = MIN(HEO(I,k),HESO(I,k))
  751. endif
  752. ENDDO
  753. ENDDO
  754. !
  755. ! DETERMINE LEVEL WITH LARGEST MOIST STATIC ENERGY
  756. ! THIS IS THE LEVEL WHERE UPDRAFT STARTS
  757. !
  758. DO I=1,IM
  759. HMAX(I) = HEO(I,1)
  760. KB(I) = 1
  761. ENDDO
  762. !!
  763. DO K = 2, KM
  764. DO I=1,IM
  765. if (k .le. kbm(i)) then
  766. IF(HEO(I,k).GT.HMAX(I).AND.CNVFLG(I)) THEN
  767. KB(I) = K
  768. HMAX(I) = HEO(I,k)
  769. ENDIF
  770. endif
  771. ENDDO
  772. ENDDO
  773. ! DO K = 1, KMAX - 1
  774. ! TOL(k) = .5 * (TO(I,k) + TO(I,k+1))
  775. ! QOL(k) = .5 * (QO(I,k) + QO(I,k+1))
  776. ! QESOL(I,k) = .5 * (QESO(I,k) + QESO(I,k+1))
  777. ! HEOL(I,k) = .5 * (HEO(I,k) + HEO(I,k+1))
  778. ! HESOL(I,k) = .5 * (HESO(I,k) + HESO(I,k+1))
  779. ! ENDDO
  780. DO K = 1, KM1
  781. DO I=1,IM
  782. if (k .le. kmax(i)-1) then
  783. DZ = .5 * (ZO(I,k+1) - ZO(I,k))
  784. DP = .5 * (PFLD(I,k+1) - PFLD(I,k))
  785. !jfe ES = 10. * FPVS(TO(I,k+1))
  786. !
  787. ES = 0.01 * fpvs(TO(I,K+1)) ! fpvs is in Pa
  788. !
  789. PPRIME = PFLD(I,k+1) + EPSM1 * ES
  790. QS = EPS * ES / PPRIME
  791. DQSDP = - QS / PPRIME
  792. DESDT = ES * (FACT1 / TO(I,k+1) + FACT2 / (TO(I,k+1)**2))
  793. DQSDT = QS * PFLD(I,k+1) * DESDT / (ES * PPRIME)
  794. GAMMA = EL2ORC * QESO(I,k+1) / (TO(I,k+1)**2)
  795. DT = (G * DZ + HVAP * DQSDP * DP) / (CP * (1. + GAMMA))
  796. DQ = DQSDT * DT + DQSDP * DP
  797. TO(I,k) = TO(I,k+1) + DT
  798. QO(I,k) = QO(I,k+1) + DQ
  799. PO(I,k) = .5 * (PFLD(I,k) + PFLD(I,k+1))
  800. endif
  801. ENDDO
  802. ENDDO
  803. !
  804. DO K = 1, KM1
  805. DO I=1,IM
  806. if (k .le. kmax(I)-1) then
  807. !jfe QESO(I,k) = 10. * FPVS(TO(I,k))
  808. !
  809. QESO(I,k) = 0.01 * fpvs(TO(I,K)) ! fpvs is in Pa
  810. !
  811. QESO(I,k) = EPS * QESO(I,k) / (PO(I,k) + EPSM1*QESO(I,k))
  812. !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
  813. val1 = 1.E-8
  814. QESO(I,k) = MAX(QESO(I,k), val1)
  815. !cmr QO(I,k) = max(QO(I,k),1.e-10)
  816. val2 = 1.e-10
  817. QO(I,k) = max(QO(I,k), val2 )
  818. ! QO(I,k) = MIN(QO(I,k),QESO(I,k))
  819. HEO(I,k) = .5 * G * (ZO(I,k) + ZO(I,k+1)) + &
  820. & CP * TO(I,k) + HVAP * QO(I,k)
  821. HESO(I,k) = .5 * G * (ZO(I,k) + ZO(I,k+1)) + &
  822. & CP * TO(I,k) + HVAP * QESO(I,k)
  823. UO(I,k) = .5 * (UO(I,k) + UO(I,k+1))
  824. VO(I,k) = .5 * (VO(I,k) + VO(I,k+1))
  825. endif
  826. ENDDO
  827. ENDDO
  828. ! k = kmax
  829. ! HEO(I,k) = HEO(I,k)
  830. ! hesol(k) = HESO(I,k)
  831. ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
  832. ! PRINT *, ' HEO ='
  833. ! PRINT 6001, (HEO(I,K),K=1,KMAX)
  834. ! PRINT *, ' HESO ='
  835. ! PRINT 6001, (HESO(I,K),K=1,KMAX)
  836. ! PRINT *, ' TO ='
  837. ! PRINT 6002, (TO(I,K)-273.16,K=1,KMAX)
  838. ! PRINT *, ' QO ='
  839. ! PRINT 6003, (QO(I,K),K=1,KMAX)
  840. ! PRINT *, ' QSO ='
  841. ! PRINT 6003, (QESO(I,K),K=1,KMAX)
  842. ! ENDIF
  843. !
  844. ! LOOK FOR CONVECTIVE CLOUD BASE AS THE LEVEL OF FREE CONVECTION
  845. !
  846. DO I=1,IM
  847. IF(CNVFLG(I)) THEN
  848. INDX = KB(I)
  849. HKBO(I) = HEO(I,INDX)
  850. QKBO(I) = QO(I,INDX)
  851. UKBO(I) = UO(I,INDX)
  852. VKBO(I) = VO(I,INDX)
  853. ENDIF
  854. FLG(I) = CNVFLG(I)
  855. KBCON(I) = KMAX(I)
  856. ENDDO
  857. !!
  858. DO K = 1, KM
  859. DO I=1,IM
  860. if (k .le. kbmax(i)) then
  861. IF(FLG(I).AND.K.GT.KB(I)) THEN
  862. HSBAR(I) = HESO(I,k)
  863. IF(HKBO(I).GT.HSBAR(I)) THEN
  864. FLG(I) = .FALSE.
  865. KBCON(I) = K
  866. ENDIF
  867. ENDIF
  868. endif
  869. ENDDO
  870. ENDDO
  871. DO I=1,IM
  872. IF(CNVFLG(I)) THEN
  873. PBCDIF(I) = -PFLD(I,KBCON(I)) + PFLD(I,KB(I))
  874. PDOT(I) = 10.* DOT(I,KBCON(I))
  875. IF(PBCDIF(I).GT.150.) CNVFLG(I) = .FALSE.
  876. IF(KBCON(I).EQ.KMAX(I)) CNVFLG(I) = .FALSE.
  877. ENDIF
  878. ENDDO
  879. !!
  880. TOTFLG = .TRUE.
  881. DO I=1,IM
  882. TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
  883. ENDDO
  884. IF(TOTFLG) RETURN
  885. ! FOUND LFC, CAN DEFINE REST OF VARIABLES
  886. 6001 FORMAT(2X,-2P10F12.2)
  887. 6002 FORMAT(2X,10F12.2)
  888. 6003 FORMAT(2X,3P10F12.2)
  889. !
  890. ! DETERMINE ENTRAINMENT RATE BETWEEN KB AND KBCON
  891. !
  892. DO I = 1, IM
  893. alpha = alphas
  894. if(SLIMSK(I).eq.1.) alpha = alphal
  895. IF(CNVFLG(I)) THEN
  896. IF(KB(I).EQ.1) THEN
  897. DZ = .5 * (ZO(I,KBCON(I)) + ZO(I,KBCON(I)-1)) - ZO(I,1)
  898. ELSE
  899. DZ = .5 * (ZO(I,KBCON(I)) + ZO(I,KBCON(I)-1)) &
  900. & - .5 * (ZO(I,KB(I)) + ZO(I,KB(I)-1))
  901. ENDIF
  902. IF(KBCON(I).NE.KB(I)) THEN
  903. !cmr XLAMB(I) = -ALOG(ALPHA) / DZ
  904. XLAMB(I) = - LOG(ALPHA) / DZ
  905. ELSE
  906. XLAMB(I) = 0.
  907. ENDIF
  908. ENDIF
  909. ENDDO
  910. ! DETERMINE UPDRAFT MASS FLUX
  911. DO K = 1, KM
  912. DO I = 1, IM
  913. if (k .le. kmax(i) .and. CNVFLG(I)) then
  914. ETA(I,k) = 1.
  915. ETAU(I,k) = 1.
  916. ENDIF
  917. ENDDO
  918. ENDDO
  919. DO K = KM1, 2, -1
  920. DO I = 1, IM
  921. if (k .le. kbmax(i)) then
  922. IF(CNVFLG(I).AND.K.LT.KBCON(I).AND.K.GE.KB(I)) THEN
  923. DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
  924. ETA(I,k) = ETA(I,k+1) * EXP(-XLAMB(I) * DZ)
  925. ETAU(I,k) = ETA(I,k)
  926. ENDIF
  927. endif
  928. ENDDO
  929. ENDDO
  930. DO I = 1, IM
  931. IF(CNVFLG(I).AND.KB(I).EQ.1.AND.KBCON(I).GT.1) THEN
  932. DZ = .5 * (ZO(I,2) - ZO(I,1))
  933. ETA(I,1) = ETA(I,2) * EXP(-XLAMB(I) * DZ)
  934. ETAU(I,1) = ETA(I,1)
  935. ENDIF
  936. ENDDO
  937. !
  938. ! WORK UP UPDRAFT CLOUD PROPERTIES
  939. !
  940. DO I = 1, IM
  941. IF(CNVFLG(I)) THEN
  942. INDX = KB(I)
  943. HCKO(I,INDX) = HKBO(I)
  944. QCKO(I,INDX) = QKBO(I)
  945. UCKO(I,INDX) = UKBO(I)
  946. VCKO(I,INDX) = VKBO(I)
  947. PWAVO(I) = 0.
  948. ENDIF
  949. ENDDO
  950. !
  951. ! CLOUD PROPERTY BELOW CLOUD BASE IS MODIFIED BY THE ENTRAINMENT PROCES
  952. !
  953. DO K = 2, KM1
  954. DO I = 1, IM
  955. if (k .le. kmax(i)-1) then
  956. IF(CNVFLG(I).AND.K.GT.KB(I).AND.K.LE.KBCON(I)) THEN
  957. FACTOR = ETA(I,k-1) / ETA(I,k)
  958. ONEMF = 1. - FACTOR
  959. HCKO(I,k) = FACTOR * HCKO(I,k-1) + ONEMF * &
  960. & .5 * (HEO(I,k) + HEO(I,k+1))
  961. UCKO(I,k) = FACTOR * UCKO(I,k-1) + ONEMF * &
  962. & .5 * (UO(I,k) + UO(I,k+1))
  963. VCKO(I,k) = FACTOR * VCKO(I,k-1) + ONEMF * &
  964. & .5 * (VO(I,k) + VO(I,k+1))
  965. DBYO(I,k) = HCKO(I,k) - HESO(I,k)
  966. ENDIF
  967. IF(CNVFLG(I).AND.K.GT.KBCON(I)) THEN
  968. HCKO(I,k) = HCKO(I,k-1)
  969. UCKO(I,k) = UCKO(I,k-1)
  970. VCKO(I,k) = VCKO(I,k-1)
  971. DBYO(I,k) = HCKO(I,k) - HESO(I,k)
  972. ENDIF
  973. endif
  974. ENDDO
  975. ENDDO
  976. ! DETERMINE CLOUD TOP
  977. DO I = 1, IM
  978. FLG(I) = CNVFLG(I)
  979. KTCON(I) = 1
  980. ENDDO
  981. ! DO K = 2, KMAX
  982. ! KK = KMAX - K + 1
  983. ! IF(DBYO(I,kK).GE.0..AND.FLG(I).AND.KK.GT.KBCON(I)) THEN
  984. ! KTCON(I) = KK + 1
  985. ! FLG(I) = .FALSE.
  986. ! ENDIF
  987. ! ENDDO
  988. DO K = 2, KM
  989. DO I = 1, IM
  990. if (k .le. kmax(i)) then
  991. IF(DBYO(I,k).LT.0..AND.FLG(I).AND.K.GT.KBCON(I)) THEN
  992. KTCON(I) = K
  993. FLG(I) = .FALSE.
  994. ENDIF
  995. endif
  996. ENDDO
  997. ENDDO
  998. DO I = 1, IM
  999. IF(CNVFLG(I).AND.(PFLD(I,KBCON(I)) - PFLD(I,KTCON(I))).LT.150.) &
  1000. & CNVFLG(I) = .FALSE.
  1001. ENDDO
  1002. TOTFLG = .TRUE.
  1003. DO I = 1, IM
  1004. TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
  1005. ENDDO
  1006. IF(TOTFLG) RETURN
  1007. !
  1008. ! SEARCH FOR DOWNDRAFT ORIGINATING LEVEL ABOVE THETA-E MINIMUM
  1009. !
  1010. DO I = 1, IM
  1011. HMIN(I) = HEO(I,KBCON(I))
  1012. LMIN(I) = KBMAX(I)
  1013. JMIN(I) = KBMAX(I)
  1014. ENDDO
  1015. DO I = 1, IM
  1016. DO K = KBCON(I), KBMAX(I)
  1017. IF(HEO(I,k).LT.HMIN(I).AND.CNVFLG(I)) THEN
  1018. LMIN(I) = K + 1
  1019. HMIN(I) = HEO(I,k)
  1020. ENDIF
  1021. ENDDO
  1022. ENDDO
  1023. !
  1024. ! Make sure that JMIN(I) is within the cloud
  1025. !
  1026. DO I = 1, IM
  1027. IF(CNVFLG(I)) THEN
  1028. JMIN(I) = MIN(LMIN(I),KTCON(I)-1)
  1029. XMBMAX(I) = .1
  1030. JMIN(I) = MAX(JMIN(I),KBCON(I)+1)
  1031. ENDIF
  1032. ENDDO
  1033. !
  1034. ! ENTRAINING CLOUD
  1035. !
  1036. do k = 2, km1
  1037. DO I = 1, IM
  1038. if (k .le. kmax(i)-1) then
  1039. if(CNVFLG(I).and.k.gt.JMIN(I).and.k.le.KTCON(I)) THEN
  1040. SUMZ(I,k) = SUMZ(I,k-1) + .5 * (ZO(I,k+1) - ZO(I,k-1))
  1041. SUMH(I,k) = SUMH(I,k-1) + .5 * (ZO(I,k+1) - ZO(I,k-1)) &
  1042. & * HEO(I,k)
  1043. ENDIF
  1044. endif
  1045. enddo
  1046. enddo
  1047. !!
  1048. DO I = 1, IM
  1049. IF(CNVFLG(I)) THEN
  1050. ! call random_number(XKT2)
  1051. ! call srand(fhour)
  1052. ! XKT2(I) = rand()
  1053. KT2(I) = nint(XKT2(I)*float(KTCON(I)-JMIN(I))-.5)+JMIN(I)+1
  1054. ! KT2(I) = nint(sqrt(XKT2(I))*float(KTCON(I)-JMIN(I))-.5) + JMIN(I) + 1
  1055. ! KT2(I) = nint(ranf() *float(KTCON(I)-JMIN(I))-.5) + JMIN(I) + 1
  1056. tem1 = (HCKO(I,JMIN(I)) - HESO(I,KT2(I)))
  1057. tem2 = (SUMZ(I,KT2(I)) * HESO(I,KT2(I)) - SUMH(I,KT2(I)))
  1058. if (abs(tem2) .gt. 0.000001) THEN
  1059. XLAMB(I) = tem1 / tem2
  1060. else
  1061. CNVFLG(I) = .false.
  1062. ENDIF
  1063. ! XLAMB(I) = (HCKO(I,JMIN(I)) - HESO(I,KT2(I)))
  1064. ! & / (SUMZ(I,KT2(I)) * HESO(I,KT2(I)) - SUMH(I,KT2(I)))
  1065. XLAMB(I) = max(XLAMB(I),RZERO)
  1066. XLAMB(I) = min(XLAMB(I),2.3/SUMZ(I,KT2(I)))
  1067. ENDIF
  1068. ENDDO
  1069. !!
  1070. DO I = 1, IM
  1071. DWNFLG(I) = CNVFLG(I)
  1072. DWNFLG2(I) = CNVFLG(I)
  1073. IF(CNVFLG(I)) THEN
  1074. if(KT2(I).ge.KTCON(I)) DWNFLG(I) = .false.
  1075. if(XLAMB(I).le.1.e-30.or.HCKO(I,JMIN(I))-HESO(I,KT2(I)).le.1.e-30)&
  1076. & DWNFLG(I) = .false.
  1077. do k = JMIN(I), KT2(I)
  1078. if(DWNFLG(I).and.HEO(I,k).gt.HESO(I,KT2(I))) DWNFLG(I)=.false.
  1079. enddo
  1080. ! IF(CNVFLG(I).AND.(PFLD(KBCON(I))-PFLD(KTCON(I))).GT.PDETRN)
  1081. ! & DWNFLG(I)=.FALSE.
  1082. IF(CNVFLG(I).AND.(PFLD(I,KBCON(I))-PFLD(I,KTCON(I))).LT.PDPDWN) &
  1083. & DWNFLG2(I)=.FALSE.
  1084. ENDIF
  1085. ENDDO
  1086. !!
  1087. DO K = 2, KM1
  1088. DO I = 1, IM
  1089. if (k .le. kmax(i)-1) then
  1090. IF(DWNFLG(I).AND.K.GT.JMIN(I).AND.K.LE.KT2(I)) THEN
  1091. DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
  1092. ! ETA(I,k) = ETA(I,k-1) * EXP( XLAMB(I) * DZ)
  1093. ! to simplify matter, we will take the linear approach here
  1094. !
  1095. ETA(I,k) = ETA(I,k-1) * (1. + XLAMB(I) * dz)
  1096. ETAU(I,k) = ETAU(I,k-1) * (1. + (XLAMB(I)+xlambu) * dz)
  1097. ENDIF
  1098. endif
  1099. ENDDO
  1100. ENDDO
  1101. !!
  1102. DO K = 2, KM1
  1103. DO I = 1, IM
  1104. if (k .le. kmax(i)-1) then
  1105. ! IF(.NOT.DWNFLG(I).AND.K.GT.JMIN(I).AND.K.LE.KT2(I)) THEN
  1106. IF(.NOT.DWNFLG(I).AND.K.GT.JMIN(I).AND.K.LE.KTCON(I)) THEN
  1107. DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
  1108. ETAU(I,k) = ETAU(I,k-1) * (1. + xlambu * dz)
  1109. ENDIF
  1110. endif
  1111. ENDDO
  1112. ENDDO
  1113. ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
  1114. ! PRINT *, ' LMIN(I), KT2(I)=', LMIN(I), KT2(I)
  1115. ! PRINT *, ' KBOT, KTOP, JMIN(I) =', KBCON(I), KTCON(I), JMIN(I)
  1116. ! ENDIF
  1117. ! IF(LAT.EQ.LATD.AND.lon.eq.lond) THEN
  1118. ! print *, ' xlamb =', xlamb
  1119. ! print *, ' eta =', (eta(k),k=1,KT2(I))
  1120. ! print *, ' ETAU =', (ETAU(I,k),k=1,KT2(I))
  1121. ! print *, ' HCKO =', (HCKO(I,k),k=1,KT2(I))
  1122. ! print *, ' SUMZ =', (SUMZ(I,k),k=1,KT2(I))
  1123. ! print *, ' SUMH =', (SUMH(I,k),k=1,KT2(I))
  1124. ! ENDIF
  1125. DO I = 1, IM
  1126. if(DWNFLG(I)) THEN
  1127. KTCON(I) = KT2(I)
  1128. ENDIF
  1129. ENDDO
  1130. !
  1131. ! CLOUD PROPERTY ABOVE CLOUD Base IS MODIFIED BY THE DETRAINMENT PROCESS
  1132. !
  1133. DO K = 2, KM1
  1134. DO I = 1, IM
  1135. if (k .le. kmax(i)-1) then
  1136. !jfe
  1137. IF(CNVFLG(I).AND.K.GT.KBCON(I).AND.K.LE.KTCON(I)) THEN
  1138. !jfe IF(K.GT.KBCON(I).AND.K.LE.KTCON(I)) THEN
  1139. FACTOR = ETA(I,k-1) / ETA(I,k)
  1140. ONEMF = 1. - FACTOR
  1141. fuv = ETAU(I,k-1) / ETAU(I,k)
  1142. onemfu = 1. - fuv
  1143. HCKO(I,k) = FACTOR * HCKO(I,k-1) + ONEMF * &
  1144. & .5 * (HEO(I,k) + HEO(I,k+1))
  1145. UCKO(I,k) = fuv * UCKO(I,k-1) + ONEMFu * &
  1146. & .5 * (UO(I,k) + UO(I,k+1))
  1147. VCKO(I,k) = fuv * VCKO(I,k-1) + ONEMFu * &
  1148. & .5 * (VO(I,k) + VO(I,k+1))
  1149. DBYO(I,k) = HCKO(I,k) - HESO(I,k)
  1150. ENDIF
  1151. endif
  1152. ENDDO
  1153. ENDDO
  1154. ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
  1155. ! PRINT *, ' UCKO=', (UCKO(I,k),k=KBCON(I)+1,KTCON(I))
  1156. ! PRINT *, ' uenv=', (.5*(UO(I,k)+UO(I,k-1)),k=KBCON(I)+1,KTCON(I))
  1157. ! ENDIF
  1158. DO I = 1, IM
  1159. if(CNVFLG(I).and.DWNFLG2(I).and.JMIN(I).le.KBCON(I)) &
  1160. & THEN
  1161. CNVFLG(I) = .false.
  1162. DWNFLG(I) = .false.
  1163. DWNFLG2(I) = .false.
  1164. ENDIF
  1165. ENDDO
  1166. !!
  1167. TOTFLG = .TRUE.
  1168. DO I = 1, IM
  1169. TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
  1170. ENDDO
  1171. IF(TOTFLG) RETURN
  1172. !!
  1173. !
  1174. ! COMPUTE CLOUD MOISTURE PROPERTY AND PRECIPITATION
  1175. !
  1176. DO I = 1, IM
  1177. AA1(I) = 0.
  1178. RHBAR(I) = 0.
  1179. ENDDO
  1180. DO K = 1, KM
  1181. DO I = 1, IM
  1182. if (k .le. kmax(i)) then
  1183. IF(CNVFLG(I).AND.K.GT.KB(I).AND.K.LT.KTCON(I)) THEN
  1184. DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
  1185. DZ1 = (ZO(I,k) - ZO(I,k-1))
  1186. GAMMA = EL2ORC * QESO(I,k) / (TO(I,k)**2)
  1187. QRCH = QESO(I,k) &
  1188. & + GAMMA * DBYO(I,k) / (HVAP * (1. + GAMMA))
  1189. FACTOR = ETA(I,k-1) / ETA(I,k)
  1190. ONEMF = 1. - FACTOR
  1191. QCKO(I,k) = FACTOR * QCKO(I,k-1) + ONEMF * &
  1192. & .5 * (QO(I,k) + QO(I,k+1))
  1193. DQ = ETA(I,k) * QCKO(I,k) - ETA(I,k) * QRCH
  1194. RHBAR(I) = RHBAR(I) + QO(I,k) / QESO(I,k)
  1195. !
  1196. ! BELOW LFC CHECK IF THERE IS EXCESS MOISTURE TO RELEASE LATENT HEAT
  1197. !
  1198. IF(DQ.GT.0.) THEN
  1199. ETAH = .5 * (ETA(I,k) + ETA(I,k-1))
  1200. QLK = DQ / (ETA(I,k) + ETAH * C0 * DZ)
  1201. AA1(I) = AA1(I) - DZ1 * G * QLK
  1202. QC = QLK + QRCH
  1203. PWO(I,k) = ETAH * C0 * DZ * QLK
  1204. QCKO(I,k) = QC
  1205. PWAVO(I) = PWAVO(I) + PWO(I,k)
  1206. ENDIF
  1207. ENDIF
  1208. endif
  1209. ENDDO
  1210. ENDDO
  1211. DO I = 1, IM
  1212. RHBAR(I) = RHBAR(I) / float(KTCON(I) - KB(I) - 1)
  1213. ENDDO
  1214. !
  1215. ! this section is ready for cloud water
  1216. !
  1217. if(ncloud.gt.0) THEN
  1218. !
  1219. ! compute liquid and vapor separation at cloud top
  1220. !
  1221. DO I = 1, IM
  1222. k = KTCON(I)
  1223. IF(CNVFLG(I)) THEN
  1224. GAMMA = EL2ORC * QESO(I,K) / (TO(I,K)**2)
  1225. QRCH = QESO(I,K) &
  1226. & + GAMMA * DBYO(I,K) / (HVAP * (1. + GAMMA))
  1227. DQ = QCKO(I,K-1) - QRCH
  1228. !
  1229. ! CHECK IF THERE IS EXCESS MOISTURE TO RELEASE LATENT HEAT
  1230. !
  1231. IF(DQ.GT.0.) THEN
  1232. QLKO_KTCON(I) = dq
  1233. QCKO(I,K-1) = QRCH
  1234. ENDIF
  1235. ENDIF
  1236. ENDDO
  1237. ENDIF
  1238. !
  1239. ! CALCULATE CLOUD WORK FUNCTION AT T+DT
  1240. !
  1241. DO K = 1, KM
  1242. DO I = 1, IM
  1243. if (k .le. kmax(i)) then
  1244. IF(CNVFLG(I).AND.K.GT.KBCON(I).AND.K.LE.KTCON(I)) THEN
  1245. DZ1 = ZO(I,k) - ZO(I,k-1)
  1246. GAMMA = EL2ORC * QESO(I,k-1) / (TO(I,k-1)**2)
  1247. RFACT = 1. + DELTA * CP * GAMMA &
  1248. & * TO(I,k-1) / HVAP
  1249. AA1(I) = AA1(I) + &
  1250. & DZ1 * (G / (CP * TO(I,k-1))) &
  1251. & * DBYO(I,k-1) / (1. + GAMMA) &
  1252. & * RFACT
  1253. val = 0.
  1254. AA1(I)=AA1(I)+ &
  1255. & DZ1 * G * DELTA * &
  1256. !cmr & MAX( 0.,(QESO(I,k-1) - QO(I,k-1))) &
  1257. & MAX(val,(QESO(I,k-1) - QO(I,k-1)))
  1258. ENDIF
  1259. endif
  1260. ENDDO
  1261. ENDDO
  1262. DO I = 1, IM
  1263. IF(CNVFLG(I).AND.AA1(I).LE.0.) DWNFLG(I) = .FALSE.
  1264. IF(CNVFLG(I).AND.AA1(I).LE.0.) DWNFLG2(I) = .FALSE.
  1265. IF(CNVFLG(I).AND.AA1(I).LE.0.) CNVFLG(I) = .FALSE.
  1266. ENDDO
  1267. !!
  1268. TOTFLG = .TRUE.
  1269. DO I = 1, IM
  1270. TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
  1271. ENDDO
  1272. IF(TOTFLG) RETURN
  1273. !!
  1274. !cccc IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
  1275. !cccc PRINT *, ' AA1(I) BEFORE DWNDRFT =', AA1(I)
  1276. !cccc ENDIF
  1277. !
  1278. !------- DOWNDRAFT CALCULATIONS
  1279. !
  1280. !
  1281. !--- DETERMINE DOWNDRAFT STRENGTH IN TERMS OF WINDSHEAR
  1282. !
  1283. DO I = 1, IM
  1284. IF(CNVFLG(I)) THEN
  1285. VSHEAR(I) = 0.
  1286. ENDIF
  1287. ENDDO
  1288. DO K = 1, KM
  1289. DO I = 1, IM
  1290. if (k .le. kmax(i)) then
  1291. IF(K.GE.KB(I).AND.K.LE.KTCON(I).AND.CNVFLG(I)) THEN
  1292. shear=rcs(I) * sqrt((UO(I,k+1)-UO(I,k)) ** 2 &
  1293. & + (VO(I,k+1)-VO(I,k)) ** 2)
  1294. VSHEAR(I) = VSHEAR(I) + SHEAR
  1295. ENDIF
  1296. endif
  1297. ENDDO
  1298. ENDDO
  1299. DO I = 1, IM
  1300. EDT(I) = 0.
  1301. IF(CNVFLG(I)) THEN
  1302. KNUMB = KTCON(I) - KB(I) + 1
  1303. KNUMB = MAX(KNUMB,1)
  1304. VSHEAR(I) = 1.E3 * VSHEAR(I) / (ZO(I,KTCON(I))-ZO(I,KB(I)))
  1305. E1=1.591-.639*VSHEAR(I) &
  1306. & +.0953*(VSHEAR(I)**2)-.00496*(VSHEAR(I)**3)
  1307. EDT(I)=1.-E1
  1308. !cmr EDT(I) = MIN(EDT(I),.9)
  1309. val = .9
  1310. EDT(I) = MIN(EDT(I),val)
  1311. !cmr EDT(I) = MAX(EDT(I),.0)
  1312. val = .0
  1313. EDT(I) = MAX(EDT(I),val)
  1314. EDTO(I)=EDT(I)
  1315. EDTX(I)=EDT(I)
  1316. ENDIF
  1317. ENDDO
  1318. ! DETERMINE DETRAINMENT RATE BETWEEN 1 AND KBDTR
  1319. DO I = 1, IM
  1320. KBDTR(I) = KBCON(I)
  1321. beta = betas
  1322. if(SLIMSK(I).eq.1.) beta = betal
  1323. IF(CNVFLG(I)) THEN
  1324. KBDTR(I) = KBCON(I)
  1325. KBDTR(I) = MAX(KBDTR(I),1)
  1326. XLAMD(I) = 0.
  1327. IF(KBDTR(I).GT.1) THEN
  1328. DZ = .5 * ZO(I,KBDTR(I)) + .5 * ZO(I,KBDTR(I)-1) &
  1329. & - ZO(I,1)
  1330. XLAMD(I) = LOG(BETA) / DZ
  1331. ENDIF
  1332. ENDIF
  1333. ENDDO
  1334. ! DETERMINE DOWNDRAFT MASS FLUX
  1335. DO K = 1, KM
  1336. DO I = 1, IM
  1337. IF(k .le. kmax(i)) then
  1338. IF(CNVFLG(I)) THEN
  1339. ETAD(I,k) = 1.
  1340. ENDIF
  1341. QRCDO(I,k) = 0.
  1342. endif
  1343. ENDDO
  1344. ENDDO
  1345. DO K = KM1, 2, -1
  1346. DO I = 1, IM
  1347. if (k .le. kbmax(i)) then
  1348. IF(CNVFLG(I).AND.K.LT.KBDTR(I)) THEN
  1349. DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
  1350. ETAD(I,k) = ETAD(I,k+1) * EXP(XLAMD(I) * DZ)
  1351. ENDIF
  1352. endif
  1353. ENDDO
  1354. ENDDO
  1355. K = 1
  1356. DO I = 1, IM
  1357. IF(CNVFLG(I).AND.KBDTR(I).GT.1) THEN
  1358. DZ = .5 * (ZO(I,2) - ZO(I,1))
  1359. ETAD(I,k) = ETAD(I,k+1) * EXP(XLAMD(I) * DZ)
  1360. ENDIF
  1361. ENDDO
  1362. !
  1363. !--- DOWNDRAFT MOISTURE PROPERTIES
  1364. !
  1365. DO I = 1, IM
  1366. PWEVO(I) = 0.
  1367. FLG(I) = CNVFLG(I)
  1368. ENDDO
  1369. DO I = 1, IM
  1370. IF(CNVFLG(I)) THEN
  1371. JMN = JMIN(I)
  1372. HCDO(I) = HEO(I,JMN)
  1373. QCDO(I) = QO(I,JMN)
  1374. QRCDO(I,JMN) = QESO(I,JMN)
  1375. UCDO(I) = UO(I,JMN)
  1376. VCDO(I) = VO(I,JMN)
  1377. ENDIF
  1378. ENDDO
  1379. DO K = KM1, 1, -1
  1380. DO I = 1, IM
  1381. if (k .le. kmax(i)-1) then
  1382. IF(CNVFLG(I).AND.K.LT.JMIN(I)) THEN
  1383. DQ = QESO(I,k)
  1384. DT = TO(I,k)
  1385. GAMMA = EL2ORC * DQ / DT**2
  1386. DH = HCDO(I) - HESO(I,k)
  1387. QRCDO(I,k) = DQ+(1./HVAP)*(GAMMA/(1.+GAMMA))*DH
  1388. DETAD = ETAD(I,k+1) - ETAD(I,k)
  1389. PWDO(I,k) = ETAD(I,k+1) * QCDO(I) - &
  1390. & ETAD(I,k) * QRCDO(I,k)
  1391. PWDO(I,k) = PWDO(I,k) - DETAD * &
  1392. & .5 * (QRCDO(I,k) + QRCDO(I,k+1))
  1393. QCDO(I) = QRCDO(I,k)
  1394. PWEVO(I) = PWEVO(I) + PWDO(I,k)
  1395. ENDIF
  1396. endif
  1397. ENDDO
  1398. ENDDO
  1399. ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.DWNFLG(I)) THEN
  1400. ! PRINT *, ' PWAVO(I), PWEVO(I) =', PWAVO(I), PWEVO(I)
  1401. ! ENDIF
  1402. !
  1403. !--- FINAL DOWNDRAFT STRENGTH DEPENDENT ON PRECIP
  1404. !--- EFFICIENCY (EDT), NORMALIZED CONDENSATE (PWAV), AND
  1405. !--- EVAPORATE (PWEV)
  1406. !
  1407. DO I = 1, IM
  1408. edtmax = edtmaxl
  1409. if(SLIMSK(I).eq.0.) edtmax = edtmaxs
  1410. IF(DWNFLG2(I)) THEN
  1411. IF(PWEVO(I).LT.0.) THEN
  1412. EDTO(I) = -EDTO(I) * PWAVO(I) / PWEVO(I)
  1413. EDTO(I) = MIN(EDTO(I),EDTMAX)
  1414. ELSE
  1415. EDTO(I) = 0.
  1416. ENDIF
  1417. ELSE
  1418. EDTO(I) = 0.
  1419. ENDIF
  1420. ENDDO
  1421. !
  1422. !
  1423. !--- DOWNDRAFT CLOUDWORK FUNCTIONS
  1424. !
  1425. !
  1426. DO K = KM1, 1, -1
  1427. DO I = 1, IM
  1428. if (k .le. kmax(i)-1) then
  1429. IF(DWNFLG2(I).AND.K.LT.JMIN(I)) THEN
  1430. GAMMA = EL2ORC * QESO(I,k+1) / TO(I,k+1)**2
  1431. DHH=HCDO(I)
  1432. DT=TO(I,k+1)
  1433. DG=GAMMA
  1434. DH=HESO(I,k+1)
  1435. DZ=-1.*(ZO(I,k+1)-ZO(I,k))
  1436. AA1(I)=AA1(I)+EDTO(I)*DZ*(G/(CP*DT))*((DHH-DH)/(1.+DG)) &
  1437. & *(1.+DELTA*CP*DG*DT/HVAP)
  1438. val=0.
  1439. AA1(I)=AA1(I)+EDTO(I)* &
  1440. !cmr & DZ*G*DELTA*MAX( 0.,(QESO(I,k+1)-QO(I,k+1))) &
  1441. & DZ*G*DELTA*MAX(val,(QESO(I,k+1)-QO(I,k+1)))
  1442. ENDIF
  1443. endif
  1444. ENDDO
  1445. ENDDO
  1446. !cccc IF(LAT.EQ.LATD.AND.lon.eq.lond.and.DWNFLG2(I)) THEN
  1447. !cccc PRINT *, ' AA1(I) AFTER DWNDRFT =', AA1(I)
  1448. !cccc ENDIF
  1449. DO I = 1, IM
  1450. IF(AA1(I).LE.0.) CNVFLG(I) = .FALSE.
  1451. IF(AA1(I).LE.0.) DWNFLG(I) = .FALSE.
  1452. IF(AA1(I).LE.0.) DWNFLG2(I) = .FALSE.
  1453. ENDDO
  1454. !!
  1455. TOTFLG = .TRUE.
  1456. DO I = 1, IM
  1457. TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
  1458. ENDDO
  1459. IF(TOTFLG) RETURN
  1460. !!
  1461. !
  1462. !
  1463. !--- WHAT WOULD THE CHANGE BE, THAT A CLOUD WITH UNIT MASS
  1464. !--- WILL DO TO THE ENVIRONMENT?
  1465. !
  1466. DO K = 1, KM
  1467. DO I = 1, IM
  1468. IF(k .le. kmax(i) .and. CNVFLG(I)) THEN
  1469. DELLAH(I,k) = 0.
  1470. DELLAQ(I,k) = 0.
  1471. DELLAU(I,k) = 0.
  1472. DELLAV(I,k) = 0.
  1473. ENDIF
  1474. ENDDO
  1475. ENDDO
  1476. DO I = 1, IM
  1477. IF(CNVFLG(I)) THEN
  1478. DP = 1000. * DEL(I,1)
  1479. DELLAH(I,1) = EDTO(I) * ETAD(I,1) * (HCDO(I) &
  1480. & - HEO(I,1)) * G / DP
  1481. DELLAQ(I,1) = EDTO(I) * ETAD(I,1) * (QCDO(I) &
  1482. & - QO(I,1)) * G / DP
  1483. DELLAU(I,1) = EDTO(I) * ETAD(I,1) * (UCDO(I) &
  1484. & - UO(I,1)) * G / DP
  1485. DELLAV(I,1) = EDTO(I) * ETAD(I,1) * (VCDO(I) &
  1486. & - VO(I,1)) * G / DP
  1487. ENDIF
  1488. ENDDO
  1489. !
  1490. !--- CHANGED DUE TO SUBSIDENCE AND ENTRAINMENT
  1491. !
  1492. DO K = 2, KM1
  1493. DO I = 1, IM
  1494. if (k .le. kmax(i)-1) then
  1495. IF(CNVFLG(I).AND.K.LT.KTCON(I)) THEN
  1496. AUP = 1.
  1497. IF(K.LE.KB(I)) AUP = 0.
  1498. ADW = 1.
  1499. IF(K.GT.JMIN(I)) ADW = 0.
  1500. DV1= HEO(I,k)
  1501. DV2 = .5 * (HEO(I,k) + HEO(I,k+1))
  1502. DV3= HEO(I,k-1)
  1503. DV1Q= QO(I,k)
  1504. DV2Q = .5 * (QO(I,k) + QO(I,k+1))
  1505. DV3Q= QO(I,k-1)
  1506. DV1U= UO(I,k)
  1507. DV2U = .5 * (UO(I,k) + UO(I,k+1))
  1508. DV3U= UO(I,k-1)
  1509. DV1V= VO(I,k)
  1510. DV2V = .5 * (VO(I,k) + VO(I,k+1))
  1511. DV3V= VO(I,k-1)
  1512. DP = 1000. * DEL(I,K)
  1513. DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
  1514. DETA = ETA(I,k) - ETA(I,k-1)
  1515. DETAD = ETAD(I,k) - ETAD(I,k-1)
  1516. DELLAH(I,k) = DELLAH(I,k) + &
  1517. & ((AUP * ETA(I,k) - ADW * EDTO(I) * ETAD(I,k)) * DV1 &
  1518. & - (AUP * ETA(I,k-1) - ADW * EDTO(I) * ETAD(I,k-1))* DV3 &
  1519. & - AUP * DETA * DV2 &
  1520. & + ADW * EDTO(I) * DETAD * HCDO(I)) * G / DP
  1521. DELLAQ(I,k) = DELLAQ(I,k) + &
  1522. & ((AUP * ETA(I,k) - ADW * EDTO(I) * ETAD(I,k)) * DV1Q &
  1523. & - (AUP * ETA(I,k-1) - ADW * EDTO(I) * ETAD(I,k-1))* DV3Q &
  1524. & - AUP * DETA * DV2Q &
  1525. & +ADW*EDTO(I)*DETAD*.5*(QRCDO(I,k)+QRCDO(I,k-1))) * G / DP
  1526. DELLAU(I,k) = DELLAU(I,k) + &
  1527. & ((AUP * ETA(I,k) - ADW * EDTO(I) * ETAD(I,k)) * DV1U &
  1528. & - (AUP * ETA(I,k-1) - ADW * EDTO(I) * ETAD(I,k-1))* DV3U &
  1529. & - AUP * DETA * DV2U &
  1530. & + ADW * EDTO(I) * DETAD * UCDO(I) &
  1531. & ) * G / DP
  1532. DELLAV(I,k) = DELLAV(I,k) + &
  1533. & ((AUP * ETA(I,k) - ADW * EDTO(I) * ETAD(I,k)) * DV1V &
  1534. & - (AUP * ETA(I,k-1) - ADW * EDTO(I) * ETAD(I,k-1))* DV3V &
  1535. & - AUP * DETA * DV2V &
  1536. & + ADW * EDTO(I) * DETAD * VCDO(I) &
  1537. & ) * G / DP
  1538. ENDIF
  1539. endif
  1540. ENDDO
  1541. ENDDO
  1542. !
  1543. !------- CLOUD TOP
  1544. !
  1545. DO I = 1, IM
  1546. IF(CNVFLG(I)) THEN
  1547. INDX = KTCON(I)
  1548. DP = 1000. * DEL(I,INDX)
  1549. DV1 = HEO(I,INDX-1)
  1550. DELLAH(I,INDX) = ETA(I,INDX-1) * &
  1551. & (HCKO(I,INDX-1) - DV1) * G / DP
  1552. DVQ1 = QO(I,INDX-1)
  1553. DELLAQ(I,INDX) = ETA(I,INDX-1) * &
  1554. & (QCKO(I,INDX-1) - DVQ1) * G / DP
  1555. DV1U = UO(I,INDX-1)
  1556. DELLAU(I,INDX) = ETA(I,INDX-1) * &
  1557. & (UCKO(I,INDX-1) - DV1U) * G / DP
  1558. DV1V = VO(I,INDX-1)
  1559. DELLAV(I,INDX) = ETA(I,INDX-1) * &
  1560. & (VCKO(I,INDX-1) - DV1V) * G / DP
  1561. !
  1562. ! cloud water
  1563. !
  1564. DELLAL(I) = ETA(I,INDX-1) * QLKO_KTCON(I) * g / dp
  1565. ENDIF
  1566. ENDDO
  1567. !
  1568. !------- FINAL CHANGED VARIABLE PER UNIT MASS FLUX
  1569. !
  1570. DO K = 1, KM
  1571. DO I = 1, IM
  1572. if (k .le. kmax(i)) then
  1573. IF(CNVFLG(I).and.k.gt.KTCON(I)) THEN
  1574. QO(I,k) = Q1(I,k)
  1575. TO(I,k) = T1(I,k)
  1576. UO(I,k) = U1(I,k)
  1577. VO(I,k) = V1(I,k)
  1578. ENDIF
  1579. IF(CNVFLG(I).AND.K.LE.KTCON(I)) THEN
  1580. QO(I,k) = DELLAQ(I,k) * MBDT + Q1(I,k)
  1581. DELLAT = (DELLAH(I,k) - HVAP * DELLAQ(I,k)) / CP
  1582. TO(I,k) = DELLAT * MBDT + T1(I,k)
  1583. !cmr QO(I,k) = max(QO(I,k),1.e-10)
  1584. val = 1.e-10
  1585. QO(I,k) = max(QO(I,k), val )
  1586. ENDIF
  1587. endif
  1588. ENDDO
  1589. ENDDO
  1590. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  1591. !
  1592. !--- THE ABOVE CHANGED ENVIRONMENT IS NOW USED TO CALULATE THE
  1593. !--- EFFECT THE ARBITRARY CLOUD (WITH UNIT MASS FLUX)
  1594. !--- WOULD HAVE ON THE STABILITY,
  1595. !--- WHICH THEN IS USED TO CALCULATE THE REAL MASS FLUX,
  1596. !--- NECESSARY TO KEEP THIS CHANGE IN BALANCE WITH THE LARGE-SCALE
  1597. !--- DESTABILIZATION.
  1598. !
  1599. !--- ENVIRONMENTAL CONDITIONS AGAIN, FIRST HEIGHTS
  1600. !
  1601. DO K = 1, KM
  1602. DO I = 1, IM
  1603. IF(k .le. kmax(i) .and. CNVFLG(I)) THEN
  1604. !jfe QESO(I,k) = 10. * FPVS(TO(I,k))
  1605. !
  1606. QESO(I,k) = 0.01 * fpvs(TO(I,K)) ! fpvs is in Pa
  1607. !
  1608. QESO(I,k) = EPS * QESO(I,k) / (PFLD(I,k)+EPSM1*QESO(I,k))
  1609. !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
  1610. val = 1.E-8
  1611. QESO(I,k) = MAX(QESO(I,k), val )
  1612. TVO(I,k) = TO(I,k) + DELTA * TO(I,k) * QO(I,k)
  1613. ENDIF
  1614. ENDDO
  1615. ENDDO
  1616. DO I = 1, IM
  1617. IF(CNVFLG(I)) THEN
  1618. XAA0(I) = 0.
  1619. XPWAV(I) = 0.
  1620. ENDIF
  1621. ENDDO
  1622. !
  1623. ! HYDROSTATIC HEIGHT ASSUME ZERO TERR
  1624. !
  1625. ! DO I = 1, IM
  1626. ! IF(CNVFLG(I)) THEN
  1627. ! DLNSIG = LOG(PRSL(I,1)/PS(I))
  1628. ! ZO(I,1) = TERR - DLNSIG * RD / G * TVO(I,1)
  1629. ! ENDIF
  1630. ! ENDDO
  1631. ! DO K = 2, KM
  1632. ! DO I = 1, IM
  1633. ! IF(k .le. kmax(i) .and. CNVFLG(I)) THEN
  1634. ! DLNSIG = LOG(PRSL(I,K) / PRSL(I,K-1))
  1635. ! ZO(I,k) = ZO(I,k-1) - DLNSIG * RD / G
  1636. ! & * .5 * (TVO(I,k) + TVO(I,k-1))
  1637. ! ENDIF
  1638. ! ENDDO
  1639. ! ENDDO
  1640. !
  1641. !--- MOIST STATIC ENERGY
  1642. !
  1643. DO K = 1, KM1
  1644. DO I = 1, IM
  1645. IF(k .le. kmax(i)-1 .and. CNVFLG(I)) THEN
  1646. DZ = .5 * (ZO(I,k+1) - ZO(I,k))
  1647. DP = .5 * (PFLD(I,k+1) - PFLD(I,k))
  1648. !jfe ES = 10. * FPVS(TO(I,k+1))
  1649. !
  1650. ES = 0.01 * fpvs(TO(I,K+1)) ! fpvs is in Pa
  1651. !
  1652. PPRIME = PFLD(I,k+1) + EPSM1 * ES
  1653. QS = EPS * ES / PPRIME
  1654. DQSDP = - QS / PPRIME
  1655. DESDT = ES * (FACT1 / TO(I,k+1) + FACT2 / (TO(I,k+1)**2))
  1656. DQSDT = QS * PFLD(I,k+1) * DESDT / (ES * PPRIME)
  1657. GAMMA = EL2ORC * QESO(I,k+1) / (TO(I,k+1)**2)
  1658. DT = (G * DZ + HVAP * DQSDP * DP) / (CP * (1. + GAMMA))
  1659. DQ = DQSDT * DT + DQSDP * DP
  1660. TO(I,k) = TO(I,k+1) + DT
  1661. QO(I,k) = QO(I,k+1) + DQ
  1662. PO(I,k) = .5 * (PFLD(I,k) + PFLD(I,k+1))
  1663. ENDIF
  1664. ENDDO
  1665. ENDDO
  1666. DO K = 1, KM1
  1667. DO I = 1, IM
  1668. IF(k .le. kmax(i)-1 .and. CNVFLG(I)) THEN
  1669. !jfe QESO(I,k) = 10. * FPVS(TO(I,k))
  1670. !
  1671. QESO(I,k) = 0.01 * fpvs(TO(I,K)) ! fpvs is in Pa
  1672. !
  1673. QESO(I,k) = EPS * QESO(I,k) / (PO(I,k) + EPSM1 * QESO(I,k))
  1674. !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
  1675. val1 = 1.E-8
  1676. QESO(I,k) = MAX(QESO(I,k), val1)
  1677. !cmr QO(I,k) = max(QO(I,k),1.e-10)
  1678. val2 = 1.e-10
  1679. QO(I,k) = max(QO(I,k), val2 )
  1680. ! QO(I,k) = MIN(QO(I,k),QESO(I,k))
  1681. HEO(I,k) = .5 * G * (ZO(I,k) + ZO(I,k+1)) + &
  1682. & CP * TO(I,k) + HVAP * QO(I,k)
  1683. HESO(I,k) = .5 * G * (ZO(I,k) + ZO(I,k+1)) + &
  1684. & CP * TO(I,k) + HVAP * QESO(I,k)
  1685. ENDIF
  1686. ENDDO
  1687. ENDDO
  1688. DO I = 1, IM
  1689. k = kmax(i)
  1690. IF(CNVFLG(I)) THEN
  1691. HEO(I,k) = G * ZO(I,k) + CP * TO(I,k) + HVAP * QO(I,k)
  1692. HESO(I,k) = G * ZO(I,k) + CP * TO(I,k) + HVAP * QESO(I,k)
  1693. ! HEO(I,k) = MIN(HEO(I,k),HESO(I,k))
  1694. ENDIF
  1695. ENDDO
  1696. DO I = 1, IM
  1697. IF(CNVFLG(I)) THEN
  1698. INDX = KB(I)
  1699. XHKB(I) = HEO(I,INDX)
  1700. XQKB(I) = QO(I,INDX)
  1701. HCKO(I,INDX) = XHKB(I)
  1702. QCKO(I,INDX) = XQKB(I)
  1703. ENDIF
  1704. ENDDO
  1705. !
  1706. !
  1707. !**************************** STATIC CONTROL
  1708. !
  1709. !
  1710. !------- MOISTURE AND CLOUD WORK FUNCTIONS
  1711. !
  1712. DO K = 2, KM1
  1713. DO I = 1, IM
  1714. if (k .le. kmax(i)-1) then
  1715. ! IF(CNVFLG(I).AND.K.GT.KB(I).AND.K.LE.KBCON(I)) THEN
  1716. IF(CNVFLG(I).AND.K.GT.KB(I).AND.K.LE.KTCON(I)) THEN
  1717. FACTOR = ETA(I,k-1) / ETA(I,k)
  1718. ONEMF = 1. - FACTOR
  1719. HCKO(I,k) = FACTOR * HCKO(I,k-1) + ONEMF * &
  1720. & .5 * (HEO(I,k) + HEO(I,k+1))
  1721. ENDIF
  1722. ! IF(CNVFLG(I).AND.K.GT.KBCON(I)) THEN
  1723. ! HEO(I,k) = HEO(I,k-1)
  1724. ! ENDIF
  1725. endif
  1726. ENDDO
  1727. ENDDO
  1728. DO K = 2, KM1
  1729. DO I = 1, IM
  1730. if (k .le. kmax(i)-1) then
  1731. IF(CNVFLG(I).AND.K.GT.KB(I).AND.K.LT.KTCON(I)) THEN
  1732. DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
  1733. GAMMA = EL2ORC * QESO(I,k) / (TO(I,k)**2)
  1734. XDBY = HCKO(I,k) - HESO(I,k)
  1735. !cmr XDBY = MAX(XDBY,0.)
  1736. val = 0.
  1737. XDBY = MAX(XDBY,val)
  1738. XQRCH = QESO(I,k) &
  1739. & + GAMMA * XDBY / (HVAP * (1. + GAMMA))
  1740. FACTOR = ETA(I,k-1) / ETA(I,k)
  1741. ONEMF = 1. - FACTOR
  1742. QCKO(I,k) = FACTOR * QCKO(I,k-1) + ONEMF * &
  1743. & .5 * (QO(I,k) + QO(I,k+1))
  1744. DQ = ETA(I,k) * QCKO(I,k) - ETA(I,k) * XQRCH
  1745. IF(DQ.GT.0.) THEN
  1746. ETAH = .5 * (ETA(I,k) + ETA(I,k-1))
  1747. QLK = DQ / (ETA(I,k) + ETAH * C0 * DZ)
  1748. XAA0(I) = XAA0(I) - (ZO(I,k) - ZO(I,k-1)) * G * QLK
  1749. XQC = QLK + XQRCH
  1750. XPW = ETAH * C0 * DZ * QLK
  1751. QCKO(I,k) = XQC
  1752. XPWAV(I) = XPWAV(I) + XPW
  1753. ENDIF
  1754. ENDIF
  1755. ! IF(CNVFLG(I).AND.K.GT.KBCON(I).AND.K.LT.KTCON(I)) THEN
  1756. IF(CNVFLG(I).AND.K.GT.KBCON(I).AND.K.LE.KTCON(I)) THEN
  1757. DZ1 = ZO(I,k) - ZO(I,k-1)
  1758. GAMMA = EL2ORC * QESO(I,k-1) / (TO(I,k-1)**2)
  1759. RFACT = 1. + DELTA * CP * GAMMA &
  1760. & * TO(I,k-1) / HVAP
  1761. XDBY = HCKO(I,k-1) - HESO(I,k-1)
  1762. XAA0(I) = XAA0(I) &
  1763. & + DZ1 * (G / (CP * TO(I,k-1))) &
  1764. & * XDBY / (1. + GAMMA) &
  1765. & * RFACT
  1766. val=0.
  1767. XAA0(I)=XAA0(I)+ &
  1768. & DZ1 * G * DELTA * &
  1769. !cmr & MAX( 0.,(QESO(I,k-1) - QO(I,k-1))) &
  1770. & MAX(val,(QESO(I,k-1) - QO(I,k-1)))
  1771. ENDIF
  1772. endif
  1773. ENDDO
  1774. ENDDO
  1775. !cccc IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
  1776. !cccc PRINT *, ' XAA BEFORE DWNDRFT =', XAA0(I)
  1777. !cccc ENDIF
  1778. !
  1779. !------- DOWNDRAFT CALCULATIONS
  1780. !
  1781. !
  1782. !--- DOWNDRAFT MOISTURE PROPERTIES
  1783. !
  1784. DO I = 1, IM
  1785. XPWEV(I) = 0.
  1786. ENDDO
  1787. DO I = 1, IM
  1788. IF(DWNFLG2(I)) THEN
  1789. JMN = JMIN(I)
  1790. XHCD(I) = HEO(I,JMN)
  1791. XQCD(I) = QO(I,JMN)
  1792. QRCD(I,JMN) = QESO(I,JMN)
  1793. ENDIF
  1794. ENDDO
  1795. DO K = KM1, 1, -1
  1796. DO I = 1, IM
  1797. if (k .le. kmax(i)-1) then
  1798. IF(DWNFLG2(I).AND.K.LT.JMIN(I)) THEN
  1799. DQ = QESO(I,k)
  1800. DT = TO(I,k)
  1801. GAMMA = EL2ORC * DQ / DT**2
  1802. DH = XHCD(I) - HESO(I,k)
  1803. QRCD(I,k)=DQ+(1./HVAP)*(GAMMA/(1.+GAMMA))*DH
  1804. DETAD = ETAD(I,k+1) - ETAD(I,k)
  1805. XPWD = ETAD(I,k+1) * QRCD(I,k+1) - &
  1806. & ETAD(I,k) * QRCD(I,k)
  1807. XPWD = XPWD - DETAD * &
  1808. & .5 * (QRCD(I,k) + QRCD(I,k+1))
  1809. XPWEV(I) = XPWEV(I) + XPWD
  1810. ENDIF
  1811. endif
  1812. ENDDO
  1813. ENDDO
  1814. !
  1815. DO I = 1, IM
  1816. edtmax = edtmaxl
  1817. if(SLIMSK(I).eq.0.) edtmax = edtmaxs
  1818. IF(DWNFLG2(I)) THEN
  1819. IF(XPWEV(I).GE.0.) THEN
  1820. EDTX(I) = 0.
  1821. ELSE
  1822. EDTX(I) = -EDTX(I) * XPWAV(I) / XPWEV(I)
  1823. EDTX(I) = MIN(EDTX(I),EDTMAX)
  1824. ENDIF
  1825. ELSE
  1826. EDTX(I) = 0.
  1827. ENDIF
  1828. ENDDO
  1829. !
  1830. !
  1831. !
  1832. !--- DOWNDRAFT CLOUDWORK FUNCTIONS
  1833. !
  1834. !
  1835. DO K = KM1, 1, -1
  1836. DO I = 1, IM
  1837. if (k .le. kmax(i)-1) then
  1838. IF(DWNFLG2(I).AND.K.LT.JMIN(I)) THEN
  1839. GAMMA = EL2ORC * QESO(I,k+1) / TO(I,k+1)**2
  1840. DHH=XHCD(I)
  1841. DT= TO(I,k+1)
  1842. DG= GAMMA
  1843. DH= HESO(I,k+1)
  1844. DZ=-1.*(ZO(I,k+1)-ZO(I,k))
  1845. XAA0(I)=XAA0(I)+EDTX(I)*DZ*(G/(CP*DT))*((DHH-DH)/(1.+DG)) &
  1846. & *(1.+DELTA*CP*DG*DT/HVAP)
  1847. val=0.
  1848. XAA0(I)=XAA0(I)+EDTX(I)* &
  1849. !cmr & DZ*G*DELTA*MAX( 0.,(QESO(I,k+1)-QO(I,k+1))) &
  1850. & DZ*G*DELTA*MAX(val,(QESO(I,k+1)-QO(I,k+1)))
  1851. ENDIF
  1852. endif
  1853. ENDDO
  1854. ENDDO
  1855. !cccc IF(LAT.EQ.LATD.AND.lon.eq.lond.and.DWNFLG2(I)) THEN
  1856. !cccc PRINT *, ' XAA AFTER DWNDRFT =', XAA0(I)
  1857. !cccc ENDIF
  1858. !
  1859. ! CALCULATE CRITICAL CLOUD WORK FUNCTION
  1860. !
  1861. DO I = 1, IM
  1862. ACRT(I) = 0.
  1863. IF(CNVFLG(I)) THEN
  1864. ! IF(CNVFLG(I).AND.SLIMSK(I).NE.1.) THEN
  1865. IF(PFLD(I,KTCON(I)).LT.PCRIT(15))THEN
  1866. ACRT(I)=ACRIT(15)*(975.-PFLD(I,KTCON(I))) &
  1867. & /(975.-PCRIT(15))
  1868. ELSE IF(PFLD(I,KTCON(I)).GT.PCRIT(1))THEN
  1869. ACRT(I)=ACRIT(1)
  1870. ELSE
  1871. !cmr K = IFIX((850. - PFLD(I,KTCON(I)))/50.) + 2
  1872. K = int((850. - PFLD(I,KTCON(I)))/50.) + 2
  1873. K = MIN(K,15)
  1874. K = MAX(K,2)
  1875. ACRT(I)=ACRIT(K)+(ACRIT(K-1)-ACRIT(K))* &
  1876. & (PFLD(I,KTCON(I))-PCRIT(K))/(PCRIT(K-1)-PCRIT(K))
  1877. ENDIF
  1878. ! ELSE
  1879. ! ACRT(I) = .5 * (PFLD(I,KBCON(I)) - PFLD(I,KTCON(I)))
  1880. ENDIF
  1881. ENDDO
  1882. DO I = 1, IM
  1883. ACRTFCT(I) = 1.
  1884. IF(CNVFLG(I)) THEN
  1885. if(SLIMSK(I).eq.1.) THEN
  1886. w1 = w1l
  1887. w2 = w2l
  1888. w3 = w3l
  1889. w4 = w4l
  1890. else
  1891. w1 = w1s
  1892. w2 = w2s
  1893. w3 = w3s
  1894. w4 = w4s
  1895. ENDIF
  1896. !C IF(CNVFLG(I).AND.SLIMSK(I).EQ.1.) THEN
  1897. ! ACRTFCT(I) = PDOT(I) / W3
  1898. !
  1899. ! modify critical cloud workfunction by cloud base vertical velocity
  1900. !
  1901. IF(PDOT(I).LE.W4) THEN
  1902. ACRTFCT(I) = (PDOT(I) - W4) / (W3 - W4)
  1903. ELSEIF(PDOT(I).GE.-W4) THEN
  1904. ACRTFCT(I) = - (PDOT(I) + W4) / (W4 - W3)
  1905. ELSE
  1906. ACRTFCT(I) = 0.
  1907. ENDIF
  1908. !cmr ACRTFCT(I) = MAX(ACRTFCT(I),-1.)
  1909. val1 = -1.
  1910. ACRTFCT(I) = MAX(ACRTFCT(I),val1)
  1911. !cmr ACRTFCT(I) = MIN(ACRTFCT(I),1.)
  1912. val2 = 1.
  1913. ACRTFCT(I) = MIN(ACRTFCT(I),val2)
  1914. ACRTFCT(I) = 1. - ACRTFCT(I)
  1915. !
  1916. ! modify ACRTFCT(I) by colume mean rh if RHBAR(I) is greater than 80 percent
  1917. !
  1918. ! if(RHBAR(I).ge..8) THEN
  1919. ! ACRTFCT(I) = ACRTFCT(I) * (.9 - min(RHBAR(I),.9)) * 10.
  1920. ! ENDIF
  1921. !
  1922. ! modify adjustment time scale by cloud base vertical velocity
  1923. !
  1924. DTCONV(I) = DT2 + max((1800. - DT2),RZERO) * &
  1925. & (PDOT(I) - W2) / (W1 - W2)
  1926. ! DTCONV(I) = MAX(DTCONV(I), DT2)
  1927. ! DTCONV(I) = 1800. * (PDOT(I) - w2) / (w1 - w2)
  1928. DTCONV(I) = max(DTCONV(I),dtmin)
  1929. DTCONV(I) = min(DTCONV(I),dtmax)
  1930. ENDIF
  1931. ENDDO
  1932. !
  1933. !--- LARGE SCALE FORCING
  1934. !
  1935. DO I= 1, IM
  1936. FLG(I) = CNVFLG(I)
  1937. IF(CNVFLG(I)) THEN
  1938. ! F = AA1(I) / DTCONV(I)
  1939. FLD(I) = (AA1(I) - ACRT(I) * ACRTFCT(I)) / DTCONV(I)
  1940. IF(FLD(I).LE.0.) FLG(I) = .FALSE.
  1941. ENDIF
  1942. CNVFLG(I) = FLG(I)
  1943. IF(CNVFLG(I)) THEN
  1944. ! XAA0(I) = MAX(XAA0(I),0.)
  1945. XK(I) = (XAA0(I) - AA1(I)) / MBDT
  1946. IF(XK(I).GE.0.) FLG(I) = .FALSE.
  1947. ENDIF
  1948. !
  1949. !--- KERNEL, CLOUD BASE MASS FLUX
  1950. !
  1951. CNVFLG(I) = FLG(I)
  1952. IF(CNVFLG(I)) THEN
  1953. XMB(I) = -FLD(I) / XK(I)
  1954. XMB(I) = MIN(XMB(I),XMBMAX(I))
  1955. ENDIF
  1956. ENDDO
  1957. ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
  1958. ! print *, ' RHBAR(I), ACRTFCT(I) =', RHBAR(I), ACRTFCT(I)
  1959. ! PRINT *, ' A1, XA =', AA1(I), XAA0(I)
  1960. ! PRINT *, ' XMB(I), ACRT =', XMB(I), ACRT
  1961. ! ENDIF
  1962. TOTFLG = .TRUE.
  1963. DO I = 1, IM
  1964. TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
  1965. ENDDO
  1966. IF(TOTFLG) RETURN
  1967. !
  1968. ! restore t0 and QO to t1 and q1 in case convection stops
  1969. !
  1970. do k = 1, km
  1971. DO I = 1, IM
  1972. if (k .le. kmax(i)) then
  1973. TO(I,k) = T1(I,k)
  1974. QO(I,k) = Q1(I,k)
  1975. !jfe QESO(I,k) = 10. * FPVS(T1(I,k))
  1976. !
  1977. QESO(I,k) = 0.01 * fpvs(T1(I,K)) ! fpvs is in Pa
  1978. !
  1979. QESO(I,k) = EPS * QESO(I,k) / (PFLD(I,k) + EPSM1*QESO(I,k))
  1980. !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
  1981. val = 1.E-8
  1982. QESO(I,k) = MAX(QESO(I,k), val )
  1983. endif
  1984. enddo
  1985. enddo
  1986. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  1987. !
  1988. !--- FEEDBACK: SIMPLY THE CHANGES FROM THE CLOUD WITH UNIT MASS FLUX
  1989. !--- MULTIPLIED BY THE MASS FLUX NECESSARY TO KEEP THE
  1990. !--- EQUILIBRIUM WITH THE LARGER-SCALE.
  1991. !
  1992. DO I = 1, IM
  1993. DELHBAR(I) = 0.
  1994. DELQBAR(I) = 0.
  1995. DELTBAR(I) = 0.
  1996. QCOND(I) = 0.
  1997. ENDDO
  1998. DO K = 1, KM
  1999. DO I = 1, IM
  2000. if (k .le. kmax(i)) then
  2001. IF(CNVFLG(I).AND.K.LE.KTCON(I)) THEN
  2002. AUP = 1.
  2003. IF(K.Le.KB(I)) AUP = 0.
  2004. ADW = 1.
  2005. IF(K.GT.JMIN(I)) ADW = 0.
  2006. DELLAT = (DELLAH(I,k) - HVAP * DELLAQ(I,k)) / CP
  2007. T1(I,k) = T1(I,k) + DELLAT * XMB(I) * DT2
  2008. Q1(I,k) = Q1(I,k) + DELLAQ(I,k) * XMB(I) * DT2
  2009. U1(I,k) = U1(I,k) + DELLAU(I,k) * XMB(I) * DT2
  2010. V1(I,k) = V1(I,k) + DELLAV(I,k) * XMB(I) * DT2
  2011. DP = 1000. * DEL(I,K)
  2012. DELHBAR(I) = DELHBAR(I) + DELLAH(I,k)*XMB(I)*DP/G
  2013. DELQBAR(I) = DELQBAR(I) + DELLAQ(I,k)*XMB(I)*DP/G
  2014. DELTBAR(I) = DELTBAR(I) + DELLAT*XMB(I)*DP/G
  2015. ENDIF
  2016. endif
  2017. ENDDO
  2018. ENDDO
  2019. DO K = 1, KM
  2020. DO I = 1, IM
  2021. if (k .le. kmax(i)) then
  2022. IF(CNVFLG(I).AND.K.LE.KTCON(I)) THEN
  2023. !jfe QESO(I,k) = 10. * FPVS(T1(I,k))
  2024. !
  2025. QESO(I,k) = 0.01 * fpvs(T1(I,K)) ! fpvs is in Pa
  2026. !
  2027. QESO(I,k) = EPS * QESO(I,k)/(PFLD(I,k) + EPSM1*QESO(I,k))
  2028. !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
  2029. val = 1.E-8
  2030. QESO(I,k) = MAX(QESO(I,k), val )
  2031. !
  2032. ! cloud water
  2033. !
  2034. if(ncloud.gt.0.and.CNVFLG(I).and.k.eq.KTCON(I)) THEN
  2035. tem = DELLAL(I) * XMB(I) * dt2
  2036. tem1 = MAX(RZERO, MIN(RONE, (TCR-t1(I,K))*TCRF))
  2037. if (QL(I,k,2) .gt. -999.0) then
  2038. QL(I,k,1) = QL(I,k,1) + tem * tem1 ! Ice
  2039. QL(I,k,2) = QL(I,k,2) + tem *(1.0-tem1) ! Water
  2040. else
  2041. tem2 = QL(I,k,1) + tem
  2042. QL(I,k,1) = tem2 * tem1 ! Ice
  2043. QL(I,k,2) = tem2 - QL(I,k,1) ! Water
  2044. endif
  2045. ! QL(I,k) = QL(I,k) + DELLAL(I) * XMB(I) * dt2
  2046. dp = 1000. * del(i,k)
  2047. DELLAL(I) = DELLAL(I) * XMB(I) * dp / g
  2048. ENDIF
  2049. ENDIF
  2050. endif
  2051. ENDDO
  2052. ENDDO
  2053. ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I) ) THEN
  2054. ! PRINT *, ' DELHBAR, DELQBAR, DELTBAR ='
  2055. ! PRINT *, DELHBAR, HVAP*DELQBAR, CP*DELTBAR
  2056. ! PRINT *, ' DELLBAR ='
  2057. ! PRINT 6003, HVAP*DELLbar
  2058. ! PRINT *, ' DELLAQ ='
  2059. ! PRINT 6003, (HVAP*DELLAQ(I,k)*XMB(I),K=1,KMAX)
  2060. ! PRINT *, ' DELLAT ='
  2061. ! PRINT 6003, (DELLAH(i,k)*XMB(I)-HVAP*DELLAQ(I,k)*XMB(I), &
  2062. ! & K=1,KMAX)
  2063. ! ENDIF
  2064. DO I = 1, IM
  2065. RNTOT(I) = 0.
  2066. DELQEV(I) = 0.
  2067. DELQ2(I) = 0.
  2068. FLG(I) = CNVFLG(I)
  2069. ENDDO
  2070. DO K = KM, 1, -1
  2071. DO I = 1, IM
  2072. if (k .le. kmax(i)) then
  2073. IF(CNVFLG(I).AND.K.LE.KTCON(I)) THEN
  2074. AUP = 1.
  2075. IF(K.Le.KB(I)) AUP = 0.
  2076. ADW = 1.
  2077. IF(K.GT.JMIN(I)) ADW = 0.
  2078. rain = AUP * PWO(I,k) + ADW * EDTO(I) * PWDO(I,k)
  2079. RNTOT(I) = RNTOT(I) + rain * XMB(I) * .001 * dt2
  2080. ENDIF
  2081. endif
  2082. ENDDO
  2083. ENDDO
  2084. DO K = KM, 1, -1
  2085. DO I = 1, IM
  2086. if (k .le. kmax(i)) then
  2087. DELTV(I) = 0.
  2088. DELQ(I) = 0.
  2089. QEVAP(I) = 0.
  2090. IF(CNVFLG(I).AND.K.LE.KTCON(I)) THEN
  2091. AUP = 1.
  2092. IF(K.Le.KB(I)) AUP = 0.
  2093. ADW = 1.
  2094. IF(K.GT.JMIN(I)) ADW = 0.
  2095. rain = AUP * PWO(I,k) + ADW * EDTO(I) * PWDO(I,k)
  2096. RN(I) = RN(I) + rain * XMB(I) * .001 * dt2
  2097. ENDIF
  2098. IF(FLG(I).AND.K.LE.KTCON(I)) THEN
  2099. evef = EDT(I) * evfact
  2100. if(SLIMSK(I).eq.1.) evef=EDT(I) * evfactl
  2101. ! if(SLIMSK(I).eq.1.) evef=.07
  2102. ! if(SLIMSK(I).ne.1.) evef = 0.
  2103. QCOND(I) = EVEF * (Q1(I,k) - QESO(I,k)) &
  2104. & / (1. + EL2ORC * QESO(I,k) / T1(I,k)**2)
  2105. DP = 1000. * DEL(I,K)
  2106. IF(RN(I).GT.0..AND.QCOND(I).LT.0.) THEN
  2107. QEVAP(I) = -QCOND(I) * (1.-EXP(-.32*SQRT(DT2*RN(I))))
  2108. QEVAP(I) = MIN(QEVAP(I), RN(I)*1000.*G/DP)
  2109. DELQ2(I) = DELQEV(I) + .001 * QEVAP(I) * dp / g
  2110. ENDIF
  2111. if(RN(I).gt.0..and.QCOND(I).LT.0..and. &
  2112. & DELQ2(I).gt.RNTOT(I)) THEN
  2113. QEVAP(I) = 1000.* g * (RNTOT(I) - DELQEV(I)) / dp
  2114. FLG(I) = .false.
  2115. ENDIF
  2116. IF(RN(I).GT.0..AND.QEVAP(I).gt.0.) THEN
  2117. Q1(I,k) = Q1(I,k) + QEVAP(I)
  2118. T1(I,k) = T1(I,k) - ELOCP * QEVAP(I)
  2119. RN(I) = RN(I) - .001 * QEVAP(I) * DP / G
  2120. DELTV(I) = - ELOCP*QEVAP(I)/DT2
  2121. DELQ(I) = + QEVAP(I)/DT2
  2122. DELQEV(I) = DELQEV(I) + .001*dp*QEVAP(I)/g
  2123. ENDIF
  2124. DELLAQ(I,k) = DELLAQ(I,k) + DELQ(I) / XMB(I)
  2125. DELQBAR(I) = DELQBAR(I) + DELQ(I)*DP/G
  2126. DELTBAR(I) = DELTBAR(I) + DELTV(I)*DP/G
  2127. ENDIF
  2128. endif
  2129. ENDDO
  2130. ENDDO
  2131. ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I) ) THEN
  2132. ! PRINT *, ' DELLAH ='
  2133. ! PRINT 6003, (DELLAH(k)*XMB(I),K=1,KMAX)
  2134. ! PRINT *, ' DELLAQ ='
  2135. ! PRINT 6003, (HVAP*DELLAQ(I,k)*XMB(I),K=1,KMAX)
  2136. ! PRINT *, ' DELHBAR, DELQBAR, DELTBAR ='
  2137. ! PRINT *, DELHBAR, HVAP*DELQBAR, CP*DELTBAR
  2138. ! PRINT *, ' PRECIP =', HVAP*RN(I)*1000./DT2
  2139. !CCCC PRINT *, ' DELLBAR ='
  2140. !CCCC PRINT *, HVAP*DELLbar
  2141. ! ENDIF
  2142. !
  2143. ! PRECIPITATION RATE CONVERTED TO ACTUAL PRECIP
  2144. ! IN UNIT OF M INSTEAD OF KG
  2145. !
  2146. DO I = 1, IM
  2147. IF(CNVFLG(I)) THEN
  2148. !
  2149. ! IN THE EVENT OF UPPER LEVEL RAIN EVAPORATION AND LOWER LEVEL DOWNDRAF
  2150. ! MOISTENING, RN CAN BECOME NEGATIVE, IN THIS CASE, WE BACK OUT OF TH
  2151. ! HEATING AND THE MOISTENING
  2152. !
  2153. if(RN(I).lt.0..and..not.FLG(I)) RN(I) = 0.
  2154. IF(RN(I).LE.0.) THEN
  2155. RN(I) = 0.
  2156. ELSE
  2157. KTOP(I) = KTCON(I)
  2158. KBOT(I) = KBCON(I)
  2159. KUO(I) = 1
  2160. CLDWRK(I) = AA1(I)
  2161. ENDIF
  2162. ENDIF
  2163. ENDDO
  2164. DO K = 1, KM
  2165. DO I = 1, IM
  2166. if (k .le. kmax(i)) then
  2167. IF(CNVFLG(I).AND.RN(I).LE.0.) THEN
  2168. T1(I,k) = TO(I,k)
  2169. Q1(I,k) = QO(I,k)
  2170. ENDIF
  2171. endif
  2172. ENDDO
  2173. ENDDO
  2174. !!
  2175. RETURN
  2176. END SUBROUTINE OSASCNV
  2177. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  2178. SUBROUTINE SHALCV(IM,IX,KM,DT,DEL,PRSI,PRSL,PRSLK,KUO,Q,T,DPSHC)
  2179. !
  2180. USE MODULE_GFS_MACHINE , ONLY : kind_phys
  2181. USE MODULE_GFS_PHYSCONS, grav => con_g, CP => con_CP, HVAP => con_HVAP &
  2182. &, RD => con_RD
  2183. implicit none
  2184. !
  2185. ! include 'constant.h'
  2186. !
  2187. integer IM, IX, KM, KUO(IM)
  2188. real(kind=kind_phys) DEL(IX,KM), PRSI(IX,KM+1), PRSL(IX,KM), &
  2189. & PRSLK(IX,KM), &
  2190. & Q(IX,KM), T(IX,KM), DT, DPSHC
  2191. !
  2192. ! Locals
  2193. !
  2194. real(kind=kind_phys) ck, cpdt, dmse, dsdz1, dsdz2, &
  2195. & dsig, dtodsl, dtodsu, eldq, g, &
  2196. & gocp, rtdls
  2197. !
  2198. integer k,k1,k2,kliftl,kliftu,kt,N2,I,iku,ik1,ik,ii
  2199. integer INDEX2(IM), KLCL(IM), KBOT(IM), KTOP(IM),kk &
  2200. &, KTOPM(IM)
  2201. !!
  2202. ! PHYSICAL PARAMETERS
  2203. PARAMETER(G=GRAV, GOCP=G/CP)
  2204. ! BOUNDS OF PARCEL ORIGIN
  2205. PARAMETER(KLIFTL=2,KLIFTU=2)
  2206. LOGICAL LSHC(IM)
  2207. real(kind=kind_phys) Q2(IM*KM), T2(IM*KM), &
  2208. & PRSL2(IM*KM), PRSLK2(IM*KM), &
  2209. & AL(IM*(KM-1)), AD(IM*KM), AU(IM*(KM-1))
  2210. !-----------------------------------------------------------------------
  2211. ! COMPRESS FIELDS TO POINTS WITH NO DEEP CONVECTION
  2212. ! AND MOIST STATIC INSTABILITY.
  2213. DO I=1,IM
  2214. LSHC(I)=.FALSE.
  2215. ENDDO
  2216. DO K=1,KM-1
  2217. DO I=1,IM
  2218. IF(KUO(I).EQ.0) THEN
  2219. ELDQ = HVAP*(Q(I,K)-Q(I,K+1))
  2220. CPDT = CP*(T(I,K)-T(I,K+1))
  2221. RTDLS = (PRSL(I,K)-PRSL(I,K+1)) / &
  2222. & PRSI(I,K+1)*RD*0.5*(T(I,K)+T(I,K+1))
  2223. DMSE = ELDQ+CPDT-RTDLS
  2224. LSHC(I) = LSHC(I).OR.DMSE.GT.0.
  2225. ENDIF
  2226. ENDDO
  2227. ENDDO
  2228. N2 = 0
  2229. DO I=1,IM
  2230. IF(LSHC(I)) THEN
  2231. N2 = N2 + 1
  2232. INDEX2(N2) = I
  2233. ENDIF
  2234. ENDDO
  2235. IF(N2.EQ.0) RETURN
  2236. DO K=1,KM
  2237. KK = (K-1)*N2
  2238. DO I=1,N2
  2239. IK = KK + I
  2240. ii = index2(i)
  2241. Q2(IK) = Q(II,K)
  2242. T2(IK) = T(II,K)
  2243. PRSL2(IK) = PRSL(II,K)
  2244. PRSLK2(IK) = PRSLK(II,K)
  2245. ENDDO
  2246. ENDDO
  2247. do i=1,N2
  2248. ktopm(i) = KM
  2249. enddo
  2250. do k=2,KM
  2251. do i=1,N2
  2252. ii = index2(i)
  2253. if (prsi(ii,1)-prsi(ii,k) .le. dpshc) ktopm(i) = k
  2254. enddo
  2255. enddo
  2256. !-----------------------------------------------------------------------
  2257. ! COMPUTE MOIST ADIABAT AND DETERMINE LIMITS OF SHALLOW CONVECTION.
  2258. ! CHECK FOR MOIST STATIC INSTABILITY AGAIN WITHIN CLOUD.
  2259. CALL MSTADBT3(N2,KM-1,KLIFTL,KLIFTU,PRSL2,PRSLK2,T2,Q2, &
  2260. & KLCL,KBOT,KTOP,AL,AU)
  2261. DO I=1,N2
  2262. KBOT(I) = min(KLCL(I)-1, ktopm(i)-1)
  2263. KTOP(I) = min(KTOP(I)+1, ktopm(i))
  2264. LSHC(I) = .FALSE.
  2265. ENDDO
  2266. DO K=1,KM-1
  2267. KK = (K-1)*N2
  2268. DO I=1,N2
  2269. IF(K.GE.KBOT(I).AND.K.LT.KTOP(I)) THEN
  2270. IK = KK + I
  2271. IKU = IK + N2
  2272. ELDQ = HVAP * (Q2(IK)-Q2(IKU))
  2273. CPDT = CP * (T2(IK)-T2(IKU))
  2274. RTDLS = (PRSL2(IK)-PRSL2(IKU)) / &
  2275. & PRSI(index2(i),K+1)*RD*0.5*(T2(IK)+T2(IKU))
  2276. DMSE = ELDQ + CPDT - RTDLS
  2277. LSHC(I) = LSHC(I).OR.DMSE.GT.0.
  2278. AU(IK) = G/RTDLS
  2279. ENDIF
  2280. ENDDO
  2281. ENDDO
  2282. K1=KM+1
  2283. K2=0
  2284. DO I=1,N2
  2285. IF(.NOT.LSHC(I)) THEN
  2286. KBOT(I) = KM+1
  2287. KTOP(I) = 0
  2288. ENDIF
  2289. K1 = MIN(K1,KBOT(I))
  2290. K2 = MAX(K2,KTOP(I))
  2291. ENDDO
  2292. KT = K2-K1+1
  2293. IF(KT.LT.2) RETURN
  2294. !-----------------------------------------------------------------------
  2295. ! SET EDDY VISCOSITY COEFFICIENT CKU AT SIGMA INTERFACES.
  2296. ! COMPUTE DIAGONALS AND RHS FOR TRIDIAGONAL MATRIX SOLVER.
  2297. ! EXPAND FINAL FIELDS.
  2298. KK = (K1-1) * N2
  2299. DO I=1,N2
  2300. IK = KK + I
  2301. AD(IK) = 1.
  2302. ENDDO
  2303. !
  2304. ! DTODSU=DT/DEL(K1)
  2305. DO K=K1,K2-1
  2306. ! DTODSL=DTODSU
  2307. ! DTODSU= DT/DEL(K+1)
  2308. ! DSIG=SL(K)-SL(K+1)
  2309. KK = (K-1) * N2
  2310. DO I=1,N2
  2311. ii = index2(i)
  2312. DTODSL = DT/DEL(II,K)
  2313. DTODSU = DT/DEL(II,K+1)
  2314. DSIG = PRSL(II,K) - PRSL(II,K+1)
  2315. IK = KK + I
  2316. IKU = IK + N2
  2317. IF(K.EQ.KBOT(I)) THEN
  2318. CK=1.5
  2319. ELSEIF(K.EQ.KTOP(I)-1) THEN
  2320. CK=1.
  2321. ELSEIF(K.EQ.KTOP(I)-2) THEN
  2322. CK=3.
  2323. ELSEIF(K.GT.KBOT(I).AND.K.LT.KTOP(I)-2) THEN
  2324. CK=5.
  2325. ELSE
  2326. CK=0.
  2327. ENDIF
  2328. DSDZ1 = CK*DSIG*AU(IK)*GOCP
  2329. DSDZ2 = CK*DSIG*AU(IK)*AU(IK)
  2330. AU(IK) = -DTODSL*DSDZ2
  2331. AL(IK) = -DTODSU*DSDZ2
  2332. AD(IK) = AD(IK)-AU(IK)
  2333. AD(IKU) = 1.-AL(IK)
  2334. T2(IK) = T2(IK)+DTODSL*DSDZ1
  2335. T2(IKU) = T2(IKU)-DTODSU*DSDZ1
  2336. ENDDO
  2337. ENDDO
  2338. IK1=(K1-1)*N2+1
  2339. CALL TRIDI2T3(N2,KT,AL(IK1),AD(IK1),AU(IK1),Q2(IK1),T2(IK1), &
  2340. & AU(IK1),Q2(IK1),T2(IK1))
  2341. DO K=K1,K2
  2342. KK = (K-1)*N2
  2343. DO I=1,N2
  2344. IK = KK + I
  2345. Q(INDEX2(I),K) = Q2(IK)
  2346. T(INDEX2(I),K) = T2(IK)
  2347. ENDDO
  2348. ENDDO
  2349. !-----------------------------------------------------------------------
  2350. RETURN
  2351. END SUBROUTINE SHALCV
  2352. !-----------------------------------------------------------------------
  2353. SUBROUTINE TRIDI2T3(L,N,CL,CM,CU,R1,R2,AU,A1,A2)
  2354. !yt INCLUDE DBTRIDI2;
  2355. !!
  2356. USE MODULE_GFS_MACHINE , ONLY : kind_phys
  2357. implicit none
  2358. integer k,n,l,i
  2359. real(kind=kind_phys) fk
  2360. !!
  2361. real(kind=kind_phys) &
  2362. & CL(L,2:N),CM(L,N),CU(L,N-1),R1(L,N),R2(L,N), &
  2363. & AU(L,N-1),A1(L,N),A2(L,N)
  2364. !-----------------------------------------------------------------------
  2365. DO I=1,L
  2366. FK=1./CM(I,1)
  2367. AU(I,1)=FK*CU(I,1)
  2368. A1(I,1)=FK*R1(I,1)
  2369. A2(I,1)=FK*R2(I,1)
  2370. ENDDO
  2371. DO K=2,N-1
  2372. DO I=1,L
  2373. FK=1./(CM(I,K)-CL(I,K)*AU(I,K-1))
  2374. AU(I,K)=FK*CU(I,K)
  2375. A1(I,K)=FK*(R1(I,K)-CL(I,K)*A1(I,K-1))
  2376. A2(I,K)=FK*(R2(I,K)-CL(I,K)*A2(I,K-1))
  2377. ENDDO
  2378. ENDDO
  2379. DO I=1,L
  2380. FK=1./(CM(I,N)-CL(I,N)*AU(I,N-1))
  2381. A1(I,N)=FK*(R1(I,N)-CL(I,N)*A1(I,N-1))
  2382. A2(I,N)=FK*(R2(I,N)-CL(I,N)*A2(I,N-1))
  2383. ENDDO
  2384. DO K=N-1,1,-1
  2385. DO I=1,L
  2386. A1(I,K)=A1(I,K)-AU(I,K)*A1(I,K+1)
  2387. A2(I,K)=A2(I,K)-AU(I,K)*A2(I,K+1)
  2388. ENDDO
  2389. ENDDO
  2390. !-----------------------------------------------------------------------
  2391. RETURN
  2392. END SUBROUTINE TRIDI2T3
  2393. !-----------------------------------------------------------------------
  2394. SUBROUTINE MSTADBT3(IM,KM,K1,K2,PRSL,PRSLK,TENV,QENV, &
  2395. & KLCL,KBOT,KTOP,TCLD,QCLD)
  2396. !yt INCLUDE DBMSTADB;
  2397. !!
  2398. USE MODULE_GFS_MACHINE, ONLY : kind_phys
  2399. USE MODULE_GFS_FUNCPHYS, ONLY : FTDP, FTHE, FTLCL, STMA
  2400. USE MODULE_GFS_PHYSCONS, EPS => con_eps, EPSM1 => con_epsm1, FV => con_FVirt
  2401. implicit none
  2402. !!
  2403. ! include 'constant.h'
  2404. !!
  2405. integer k,k1,k2,km,i,im
  2406. real(kind=kind_phys) pv,qma,slklcl,tdpd,thelcl,tlcl
  2407. real(kind=kind_phys) tma,tvcld,tvenv
  2408. !!
  2409. real(kind=kind_phys) PRSL(IM,KM), PRSLK(IM,KM), TENV(IM,KM), &
  2410. & QENV(IM,KM), TCLD(IM,KM), QCLD(IM,KM)
  2411. INTEGER KLCL(IM), KBOT(IM), KTOP(IM)
  2412. ! LOCAL ARRAYS
  2413. real(kind=kind_phys) SLKMA(IM), THEMA(IM)
  2414. !-----------------------------------------------------------------------
  2415. ! DETERMINE WARMEST POTENTIAL WET-BULB TEMPERATURE BETWEEN K1 AND K2.
  2416. ! COMPUTE ITS LIFTING CONDENSATION LEVEL.
  2417. !
  2418. DO I=1,IM
  2419. SLKMA(I) = 0.
  2420. THEMA(I) = 0.
  2421. ENDDO
  2422. DO K=K1,K2
  2423. DO I=1,IM
  2424. PV = 1000.0 * PRSL(I,K)*QENV(I,K)/(EPS-EPSM1*QENV(I,K))
  2425. TDPD = TENV(I,K)-FTDP(PV)
  2426. IF(TDPD.GT.0.) THEN
  2427. TLCL = FTLCL(TENV(I,K),TDPD)
  2428. SLKLCL = PRSLK(I,K)*TLCL/TENV(I,K)
  2429. ELSE
  2430. TLCL = TENV(I,K)
  2431. SLKLCL = PRSLK(I,K)
  2432. ENDIF
  2433. THELCL=FTHE(TLCL,SLKLCL)
  2434. IF(THELCL.GT.THEMA(I)) THEN
  2435. SLKMA(I) = SLKLCL
  2436. THEMA(I) = THELCL
  2437. ENDIF
  2438. ENDDO
  2439. ENDDO
  2440. !-----------------------------------------------------------------------
  2441. ! SET CLOUD TEMPERATURES AND HUMIDITIES WHEREVER THE PARCEL LIFTED UP
  2442. ! THE MOIST ADIABAT IS BUOYANT WITH RESPECT TO THE ENVIRONMENT.
  2443. DO I=1,IM
  2444. KLCL(I)=KM+1
  2445. KBOT(I)=KM+1
  2446. KTOP(I)=0
  2447. ENDDO
  2448. DO K=1,KM
  2449. DO I=1,IM
  2450. TCLD(I,K)=0.
  2451. QCLD(I,K)=0.
  2452. ENDDO
  2453. ENDDO
  2454. DO K=K1,KM
  2455. DO I=1,IM
  2456. IF(PRSLK(I,K).LE.SLKMA(I)) THEN
  2457. KLCL(I)=MIN(KLCL(I),K)
  2458. CALL STMA(THEMA(I),PRSLK(I,K),TMA,QMA)
  2459. ! TMA=FTMA(THEMA(I),PRSLK(I,K),QMA)
  2460. TVCLD=TMA*(1.+FV*QMA)
  2461. TVENV=TENV(I,K)*(1.+FV*QENV(I,K))
  2462. IF(TVCLD.GT.TVENV) THEN
  2463. KBOT(I)=MIN(KBOT(I),K)
  2464. KTOP(I)=MAX(KTOP(I),K)
  2465. TCLD(I,K)=TMA-TENV(I,K)
  2466. QCLD(I,K)=QMA-QENV(I,K)
  2467. ENDIF
  2468. ENDIF
  2469. ENDDO
  2470. ENDDO
  2471. !-----------------------------------------------------------------------
  2472. RETURN
  2473. END SUBROUTINE MSTADBT3
  2474. #if (EM_CORE == 1)
  2475. ! random seeds - ZCX
  2476. SUBROUTINE init_random_seed()
  2477. INTEGER :: i, n, clock
  2478. INTEGER, DIMENSION(:), ALLOCATABLE :: seed
  2479. CALL RANDOM_SEED(size = n)
  2480. ALLOCATE(seed(n))
  2481. CALL SYSTEM_CLOCK(COUNT=clock)
  2482. seed = clock + 37 * (/ (i - 1, i = 1, n) /)
  2483. CALL RANDOM_SEED(PUT = seed)
  2484. DEALLOCATE(seed)
  2485. END SUBROUTINE
  2486. #endif
  2487. END MODULE module_cu_osas