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

/wrfv2_fire/phys/module_cu_sas.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 5568 lines | 4146 code | 107 blank | 1315 comment | 325 complexity | a86d7ae44bfb23c8b96a4392f35319e5 MD5 | raw file
Possible License(s): AGPL-1.0

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

  1. !!
  2. MODULE module_cu_sas
  3. CONTAINS
  4. !-----------------------------------------------------------------
  5. SUBROUTINE CU_SAS(DT,ITIMESTEP,STEPCU, &
  6. RTHCUTEN,RQVCUTEN,RQCCUTEN,RQICUTEN, &
  7. RUCUTEN,RVCUTEN, &
  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. MOMMIX, & ! gopal's doing
  13. PGCON,sas_mass_flux, &
  14. shalconv,shal_pgcon, &
  15. HPBL2D,EVAP2D,HEAT2D, & !Kwon for shallow convection
  16. P_QI,P_FIRST_SCALAR, &
  17. CUDT, CURR_SECS, ADAPT_STEP_FLAG, &
  18. CUDTACTTIME, &
  19. ids,ide, jds,jde, kds,kde, &
  20. ims,ime, jms,jme, kms,kme, &
  21. its,ite, jts,jte, kts,kte )
  22. !-------------------------------------------------------------------
  23. USE MODULE_GFS_MACHINE , ONLY : kind_phys
  24. USE MODULE_GFS_FUNCPHYS , ONLY : gfuncphys
  25. USE MODULE_GFS_PHYSCONS, grav => con_g, CP => con_CP, HVAP => con_HVAP &
  26. &, RV => con_RV, FV => con_fvirt, T0C => con_T0C &
  27. &, CVAP => con_CVAP, CLIQ => con_CLIQ &
  28. &, EPS => con_eps, EPSM1 => con_epsm1 &
  29. &, ROVCP => con_rocp, RD => con_rd
  30. !-------------------------------------------------------------------
  31. IMPLICIT NONE
  32. !-------------------------------------------------------------------
  33. !-- U3D 3D u-velocity interpolated to theta points (m/s)
  34. !-- V3D 3D v-velocity interpolated to theta points (m/s)
  35. !-- TH3D 3D potential temperature (K)
  36. !-- T3D temperature (K)
  37. !-- QV3D 3D water vapor mixing ratio (Kg/Kg)
  38. !-- QC3D 3D cloud mixing ratio (Kg/Kg)
  39. !-- QI3D 3D ice mixing ratio (Kg/Kg)
  40. !-- P8w 3D pressure at full levels (Pa)
  41. !-- Pcps 3D pressure (Pa)
  42. !-- PI3D 3D exner function (dimensionless)
  43. !-- rr3D 3D dry air density (kg/m^3)
  44. !-- RUBLTEN U tendency due to
  45. ! PBL parameterization (m/s^2)
  46. !-- RVBLTEN V tendency due to
  47. ! PBL parameterization (m/s^2)
  48. !-- RTHBLTEN Theta tendency due to
  49. ! PBL parameterization (K/s)
  50. !-- RQVBLTEN Qv tendency due to
  51. ! PBL parameterization (kg/kg/s)
  52. !-- RQCBLTEN Qc tendency due to
  53. ! PBL parameterization (kg/kg/s)
  54. !-- RQIBLTEN Qi tendency due to
  55. ! PBL parameterization (kg/kg/s)
  56. !
  57. !-- MOMMIX MOMENTUM MIXING COEFFICIENT (can be set in the namelist)
  58. !-- RUCUTEN U tendency due to Cumulus Momentum Mixing (gopal's doing for SAS)
  59. !-- RVCUTEN V tendency due to Cumulus Momentum Mixing (gopal's doing for SAS)
  60. !
  61. !-- CP heat capacity at constant pressure for dry air (J/kg/K)
  62. !-- GRAV acceleration due to gravity (m/s^2)
  63. !-- ROVCP R/CP
  64. !-- RD gas constant for dry air (J/kg/K)
  65. !-- ROVG R/G
  66. !-- P_QI species index for cloud ice
  67. !-- dz8w dz between full levels (m)
  68. !-- z height above sea level (m)
  69. !-- PSFC pressure at the surface (Pa)
  70. !-- UST u* in similarity theory (m/s)
  71. !-- PBL PBL height (m)
  72. !-- PSIM similarity stability function for momentum
  73. !-- PSIH similarity stability function for heat
  74. !-- HFX upward heat flux at the surface (W/m^2)
  75. !-- QFX upward moisture flux at the surface (kg/m^2/s)
  76. !-- TSK surface temperature (K)
  77. !-- GZ1OZ0 log(z/z0) where z0 is roughness length
  78. !-- WSPD wind speed at lowest model level (m/s)
  79. !-- BR bulk Richardson number in surface layer
  80. !-- DT time step (s)
  81. !-- rvovrd R_v divided by R_d (dimensionless)
  82. !-- EP1 constant for virtual temperature (R_v/R_d - 1) (dimensionless)
  83. !-- KARMAN Von Karman constant
  84. !-- ids start index for i in domain
  85. !-- ide end index for i in domain
  86. !-- jds start index for j in domain
  87. !-- jde end index for j in domain
  88. !-- kds start index for k in domain
  89. !-- kde end index for k in domain
  90. !-- ims start index for i in memory
  91. !-- ime end index for i in memory
  92. !-- jms start index for j in memory
  93. !-- jme end index for j in memory
  94. !-- kms start index for k in memory
  95. !-- kme end index for k in memory
  96. !-- its start index for i in tile
  97. !-- ite end index for i in tile
  98. !-- jts start index for j in tile
  99. !-- jte end index for j in tile
  100. !-- kts start index for k in tile
  101. !-- kte end index for k in tile
  102. !-------------------------------------------------------------------
  103. INTEGER :: ICLDCK
  104. INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde, &
  105. ims,ime, jms,jme, kms,kme, &
  106. its,ite, jts,jte, kts,kte, &
  107. ITIMESTEP, & !NSTD
  108. P_FIRST_SCALAR, &
  109. P_QC, &
  110. P_QI, &
  111. STEPCU
  112. REAL, INTENT(IN) :: &
  113. DT
  114. REAL, OPTIONAL, INTENT(IN) :: PGCON,sas_mass_flux,shal_pgcon
  115. INTEGER, OPTIONAL, INTENT(IN) :: shalconv
  116. REAL(kind=kind_phys) :: PGCON_USE,SHAL_PGCON_USE,massf
  117. INTEGER :: shalconv_use
  118. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: &
  119. RQCCUTEN, &
  120. RQICUTEN, &
  121. RQVCUTEN, &
  122. RTHCUTEN
  123. REAL, DIMENSION(ims:ime, jms:jme, kms:kme), INTENT(INOUT) :: &
  124. RUCUTEN, &
  125. RVCUTEN
  126. REAL, OPTIONAL, INTENT(IN) :: MOMMIX
  127. REAL, DIMENSION( ims:ime , jms:jme ), OPTIONAL, &
  128. INTENT(IN) :: HPBL2D,EVAP2D,HEAT2D !Kwon for sha
  129. REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: &
  130. XLAND
  131. REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: &
  132. RAINCV, PRATEC
  133. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: &
  134. HBOT, &
  135. HTOP
  136. LOGICAL, DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: &
  137. CU_ACT_FLAG
  138. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: &
  139. DZ8W, &
  140. P8w, &
  141. Pcps, &
  142. PI3D, &
  143. QC3D, &
  144. QI3D, &
  145. QV3D, &
  146. RHO3D, &
  147. T3D, &
  148. U3D, &
  149. V3D, &
  150. W
  151. ! Adaptive time-step variables
  152. REAL, INTENT(IN ) :: CUDT
  153. REAL, INTENT(IN ) :: CURR_SECS
  154. LOGICAL,INTENT(IN ) , OPTIONAL :: ADAPT_STEP_FLAG
  155. REAL, INTENT (INOUT) :: CUDTACTTIME
  156. !--------------------------- LOCAL VARS ------------------------------
  157. REAL, DIMENSION(ims:ime, jms:jme) :: &
  158. PSFC
  159. REAL (kind=kind_phys) :: &
  160. DELT, &
  161. DPSHC, &
  162. RDELT, &
  163. RSEED
  164. REAL (kind=kind_phys), DIMENSION(its:ite) :: &
  165. CLDWRK, &
  166. PS, &
  167. RCS, &
  168. RN, &
  169. SLIMSK, &
  170. HPBL,EVAP,HEAT !Kwon for shallow convection
  171. REAL (kind=kind_phys), DIMENSION(its:ite, kts:kte+1) :: &
  172. PRSI
  173. REAL (kind=kind_phys), DIMENSION(its:ite, kts:kte) :: &
  174. DEL, &
  175. DOT, &
  176. PHIL, &
  177. PRSL, &
  178. PRSLK, &
  179. Q1, &
  180. T1, &
  181. U1, &
  182. V1, &
  183. ZI, &
  184. ZL
  185. REAL (kind=kind_phys), DIMENSION(its:ite, kts:kte, 2) :: &
  186. QL
  187. INTEGER, DIMENSION(its:ite) :: &
  188. KBOT, &
  189. KTOP, &
  190. KCNV
  191. INTEGER :: &
  192. I, &
  193. IGPVS, &
  194. IM, &
  195. J, &
  196. JCAP, &
  197. K, &
  198. KM, &
  199. KP, &
  200. KX, &
  201. NCLOUD
  202. LOGICAL :: run_param , doing_adapt_dt , decided
  203. DATA IGPVS/0/
  204. !-----------------------------------------------------------------------
  205. !
  206. !*** CHECK TO SEE IF THIS IS A CONVECTION TIMESTEP
  207. !
  208. ! Initialization for adaptive time step.
  209. doing_adapt_dt = .FALSE.
  210. IF ( PRESENT(adapt_step_flag) ) THEN
  211. IF ( adapt_step_flag ) THEN
  212. doing_adapt_dt = .TRUE.
  213. IF ( cudtacttime .EQ. 0. ) THEN
  214. cudtacttime = curr_secs + cudt*60.
  215. END IF
  216. END IF
  217. END IF
  218. ! Do we run through this scheme or not?
  219. ! Test 1: If this is the initial model time, then yes.
  220. ! ITIMESTEP=1
  221. ! Test 2: If the user asked for the cumulus to be run every time step, then yes.
  222. ! CUDT=0 or STEPCU=1
  223. ! Test 3: If not adaptive dt, and this is on the requested cumulus frequency, then yes.
  224. ! MOD(ITIMESTEP,STEPCU)=0
  225. ! Test 4: If using adaptive dt and the current time is past the last requested activate cumulus time, then yes.
  226. ! CURR_SECS >= CUDTACTTIME
  227. ! If we do run through the scheme, we set the flag run_param to TRUE and we set the decided flag
  228. ! to TRUE. The decided flag says that one of these tests was able to say "yes", run the scheme.
  229. ! We only proceed to other tests if the previous tests all have left decided as FALSE.
  230. ! If we set run_param to TRUE and this is adaptive time stepping, we set the time to the next
  231. ! cumulus run.
  232. decided = .FALSE.
  233. run_param = .FALSE.
  234. IF ( ( .NOT. decided ) .AND. &
  235. ( itimestep .EQ. 1 ) ) THEN
  236. run_param = .TRUE.
  237. decided = .TRUE.
  238. END IF
  239. IF ( ( .NOT. decided ) .AND. &
  240. ( ( cudt .EQ. 0. ) .OR. ( stepcu .EQ. 1 ) ) ) THEN
  241. run_param = .TRUE.
  242. decided = .TRUE.
  243. END IF
  244. IF ( ( .NOT. decided ) .AND. &
  245. ( .NOT. doing_adapt_dt ) .AND. &
  246. ( MOD(itimestep,stepcu) .EQ. 0 ) ) THEN
  247. run_param = .TRUE.
  248. decided = .TRUE.
  249. END IF
  250. IF ( ( .NOT. decided ) .AND. &
  251. ( doing_adapt_dt ) .AND. &
  252. ( curr_secs .GE. cudtacttime ) ) THEN
  253. run_param = .TRUE.
  254. decided = .TRUE.
  255. cudtacttime = curr_secs + cudt*60
  256. END IF
  257. !-----------------------------------------------------------------------
  258. if(present(shalconv)) then
  259. shalconv_use=shalconv
  260. else
  261. #if (NMM_CORE==1)
  262. shalconv_use=0
  263. #else
  264. #if (EM_CORE==1)
  265. shalconv_use=1
  266. #else
  267. shalconv_use=0
  268. #endif
  269. #endif
  270. endif
  271. if(present(pgcon)) then
  272. pgcon_use = pgcon
  273. else
  274. ! pgcon_use = 0.7 ! Gregory et al. (1997, QJRMS)
  275. pgcon_use = 0.55 ! Zhang & Wu (2003,JAS), used in GFS (25km res spectral)
  276. ! pgcon_use = 0.2 ! HWRF, for model tuning purposes
  277. ! pgcon_use = 0.3 ! GFDL, or so I am told
  278. ! For those attempting to tune pgcon:
  279. ! The value of 0.55 comes from an observational study of
  280. ! synoptic-scale deep convection and 0.7 came from an
  281. ! incorrect fit to the same data. That value is likely
  282. ! correct for deep convection at gridscales near that of GFS,
  283. ! but is questionable in shallow convection, or for scales
  284. ! much finer than synoptic scales.
  285. ! Then again, the assumptions of SAS break down when the
  286. ! gridscale is near the convection scale anyway. In a large
  287. ! storm such as a hurricane, there is often no environment to
  288. ! detrain into since adjancent gridsquares are also undergoing
  289. ! active convection. Each gridsquare will no longer have many
  290. ! updrafts and downdrafts. At sub-convective timescales, you
  291. ! will find unstable columns for many (say, 5 second length)
  292. ! timesteps in a real atmosphere during a convection cell's
  293. ! lifetime, so forcing it to be neutrally stable is unphysical.
  294. ! Hence, in scales near the convection scale (cells have
  295. ! ~0.5-4km diameter in hurricanes), this parameter is more of a
  296. ! tuning parameter to get a scheme that is inappropriate for
  297. ! that resolution to do a reasonable job.
  298. ! Your mileage might vary.
  299. ! - Sam Trahan
  300. endif
  301. if(present(sas_mass_flux)) then
  302. massf=sas_mass_flux
  303. ! Use this to reduce the fluxes added by SAS to prevent
  304. ! computational instability as a result of large fluxes.
  305. else
  306. massf=9e9 ! large number to disable check
  307. endif
  308. if(present(shal_pgcon)) then
  309. if(shal_pgcon>=0) then
  310. shal_pgcon_use = shal_pgcon
  311. else
  312. ! shal_pgcon<0 means use deep pgcon
  313. shal_pgcon_use = pgcon_use
  314. endif
  315. else
  316. ! Default: Same as deep convection pgcon
  317. shal_pgcon_use = pgcon_use
  318. ! Read the warning above though. It may be advisable for
  319. ! these to be different.
  320. endif
  321. if_run_param: IF(run_param) THEN
  322. DO J=JTS,JTE
  323. DO I=ITS,ITE
  324. CU_ACT_FLAG(I,J)=.TRUE.
  325. ENDDO
  326. ENDDO
  327. IM=ITE-ITS+1
  328. KX=KTE-KTS+1
  329. JCAP=126
  330. DPSHC=30_kind_phys
  331. DELT=DT*STEPCU
  332. RDELT=1./DELT
  333. NCLOUD=1
  334. DO J=jms,jme
  335. DO I=ims,ime
  336. PSFC(i,j)=P8w(i,kms,j)
  337. ENDDO
  338. ENDDO
  339. if(igpvs.eq.0) CALL GFUNCPHYS
  340. igpvs=1
  341. !------------- J LOOP (OUTER) --------------------------------------------------
  342. big_outer_j_loop: DO J=jts,jte
  343. ! --------------- compute zi and zl -----------------------------------------
  344. DO i=its,ite
  345. ZI(I,KTS)=0.0
  346. ENDDO
  347. DO k=kts+1,kte
  348. KM=K-1
  349. DO i=its,ite
  350. ZI(I,K)=ZI(I,KM)+dz8w(i,km,j)
  351. ENDDO
  352. ENDDO
  353. DO k=kts+1,kte
  354. KM=K-1
  355. DO i=its,ite
  356. ZL(I,KM)=(ZI(I,K)+ZI(I,KM))*0.5
  357. ENDDO
  358. ENDDO
  359. DO i=its,ite
  360. ZL(I,KTE)=2.*ZI(I,KTE)-ZL(I,KTE-1)
  361. ENDDO
  362. ! --------------- end compute zi and zl -------------------------------------
  363. DO i=its,ite
  364. PS(i)=PSFC(i,j)*.001
  365. RCS(i)=1.
  366. SLIMSK(i)=ABS(XLAND(i,j)-2.)
  367. ENDDO
  368. #if (NMM_CORE == 1)
  369. if(shalconv_use==1) then
  370. DO i=its,ite
  371. HPBL(I) = HPBL2D(I,J) !kwon for shallow convection
  372. EVAP(I) = EVAP2D(I,J) !kwon for shallow convection
  373. HEAT(I) = HEAT2D(I,J) !kwon for shallow convection
  374. ENDDO
  375. endif
  376. #endif
  377. DO i=its,ite
  378. PRSI(i,kts)=PS(i)
  379. ENDDO
  380. DO k=kts,kte
  381. kp=k+1
  382. DO i=its,ite
  383. PRSL(I,K)=Pcps(i,k,j)*.001
  384. PHIL(I,K)=ZL(I,K)*GRAV
  385. DOT(i,k)=-5.0E-4*GRAV*rho3d(i,k,j)*(w(i,k,j)+w(i,kp,j))
  386. ENDDO
  387. ENDDO
  388. DO k=kts,kte
  389. DO i=its,ite
  390. DEL(i,k)=PRSL(i,k)*GRAV/RD*dz8w(i,k,j)/T3D(i,k,j)
  391. U1(i,k)=U3D(i,k,j)
  392. V1(i,k)=V3D(i,k,j)
  393. Q1(i,k)=QV3D(i,k,j)/(1.+QV3D(i,k,j))
  394. T1(i,k)=T3D(i,k,j)
  395. QL(i,k,1)=QI3D(i,k,j)/(1.+QI3D(i,k,j))
  396. QL(i,k,2)=QC3D(i,k,j)/(1.+QC3D(i,k,j))
  397. PRSLK(I,K)=(PRSL(i,k)*.01)**ROVCP
  398. ENDDO
  399. ENDDO
  400. DO k=kts+1,kte+1
  401. km=k-1
  402. DO i=its,ite
  403. PRSI(i,k)=PRSI(i,km)-del(i,km)
  404. ENDDO
  405. ENDDO
  406. CALL SASCNVN(IM,IM,KX,JCAP,DELT,DEL,PRSL,PS,PHIL, &
  407. QL,Q1,T1,U1,V1,RCS,CLDWRK,RN,KBOT, &
  408. KTOP,KCNV,SLIMSK,DOT,NCLOUD,PGCON_USE,massf)
  409. if_shallow_conv: if(shalconv_use==1) then
  410. #if (NMM_CORE == 1)
  411. ! NMM calls the new shallow convection developed by J Han
  412. ! (Added to WRF by Y.Kwon)
  413. call shalcnv(im,im,kx,jcap,delt,del,prsl,ps,phil,ql, &
  414. & q1,t1,u1,v1,rcs,rn,kbot,ktop,kcnv,slimsk, &
  415. & dot,ncloud,hpbl,heat,evap,shal_pgcon_use)
  416. #else
  417. #if (EM_CORE == 1)
  418. ! NOTE: ARW should be able to call the new shalcnv here, but
  419. ! they need to add the three new variables, so I'm leaving the
  420. ! old shallow convection call here - Sam Trahan
  421. CALL OLD_ARW_SHALCV(IM,IM,KX,DELT,DEL,PRSI,PRSL,PRSLK,KCNV,Q1,T1,DPSHC)
  422. #else
  423. ! Shallow convection is untested for other cores.
  424. #endif
  425. #endif
  426. endif if_shallow_conv
  427. DO I=ITS,ITE
  428. RAINCV(I,J)=RN(I)*1000./STEPCU
  429. PRATEC(I,J)=RN(I)*1000./(STEPCU * DT)
  430. HBOT(I,J)=KBOT(I)
  431. HTOP(I,J)=KTOP(I)
  432. ENDDO
  433. DO K=KTS,KTE
  434. DO I=ITS,ITE
  435. RTHCUTEN(I,K,J)=(T1(I,K)-T3D(I,K,J))/PI3D(I,K,J)*RDELT
  436. RQVCUTEN(I,K,J)=(Q1(I,K)/(1.-q1(i,k))-QV3D(I,K,J))*RDELT
  437. ENDDO
  438. ENDDO
  439. !===============================================================================
  440. ! ADD MOMENTUM MIXING TERM AS TENDENCIES. This is gopal's doing for SAS
  441. ! MOMMIX is the reduction factor set to 0.7 by default. Because NMM has
  442. ! divergence damping term, a reducion factor for cumulum mixing may be
  443. ! required otherwise storms were too weak.
  444. !===============================================================================
  445. !
  446. #if (NMM_CORE == 1)
  447. DO K=KTS,KTE
  448. DO I=ITS,ITE
  449. ! RUCUTEN(I,J,K)=MOMMIX*(U1(I,K)-U3D(I,K,J))*RDELT
  450. ! RVCUTEN(I,J,K)=MOMMIX*(V1(I,K)-V3D(I,K,J))*RDELT
  451. RUCUTEN(I,J,K)=(U1(I,K)-U3D(I,K,J))*RDELT
  452. RVCUTEN(I,J,K)=(V1(I,K)-V3D(I,K,J))*RDELT
  453. ENDDO
  454. ENDDO
  455. #endif
  456. IF(P_QC .ge. P_FIRST_SCALAR)THEN
  457. DO K=KTS,KTE
  458. DO I=ITS,ITE
  459. RQCCUTEN(I,K,J)=(QL(I,K,2)/(1.-ql(i,k,2))-QC3D(I,K,J))*RDELT
  460. ENDDO
  461. ENDDO
  462. ENDIF
  463. IF(P_QI .ge. P_FIRST_SCALAR)THEN
  464. DO K=KTS,KTE
  465. DO I=ITS,ITE
  466. RQICUTEN(I,K,J)=(QL(I,K,1)/(1.-ql(i,k,1))-QI3D(I,K,J))*RDELT
  467. ENDDO
  468. ENDDO
  469. ENDIF
  470. ENDDO big_outer_j_loop ! Outer most J loop
  471. ENDIF if_run_param
  472. END SUBROUTINE CU_SAS
  473. !====================================================================
  474. SUBROUTINE sasinit(RTHCUTEN,RQVCUTEN,RQCCUTEN,RQICUTEN, &
  475. RUCUTEN,RVCUTEN, &
  476. RESTART,P_QC,P_QI,P_FIRST_SCALAR, &
  477. allowed_to_read, &
  478. ids, ide, jds, jde, kds, kde, &
  479. ims, ime, jms, jme, kms, kme, &
  480. its, ite, jts, jte, kts, kte )
  481. !--------------------------------------------------------------------
  482. IMPLICIT NONE
  483. !--------------------------------------------------------------------
  484. LOGICAL , INTENT(IN) :: allowed_to_read,restart
  485. INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
  486. ims, ime, jms, jme, kms, kme, &
  487. its, ite, jts, jte, kts, kte
  488. INTEGER , INTENT(IN) :: P_FIRST_SCALAR, P_QI, P_QC
  489. REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(OUT) :: &
  490. RTHCUTEN, &
  491. RQVCUTEN, &
  492. RQCCUTEN, &
  493. RQICUTEN
  494. REAL, DIMENSION( ims:ime , jms:jme , kms:kme ) , INTENT(OUT) :: &
  495. RUCUTEN, & ! gopal's doing for SAS
  496. RVCUTEN
  497. INTEGER :: i, j, k, itf, jtf, ktf
  498. jtf=min0(jte,jde-1)
  499. ktf=min0(kte,kde-1)
  500. itf=min0(ite,ide-1)
  501. #ifdef HWRF
  502. !zhang's doing
  503. IF(.not.restart .or. .not.allowed_to_read)THEN
  504. !end of zhang's doing
  505. #else
  506. IF(.not.restart)THEN
  507. #endif
  508. DO j=jts,jtf
  509. DO k=kts,ktf
  510. DO i=its,itf
  511. RTHCUTEN(i,k,j)=0.
  512. RQVCUTEN(i,k,j)=0.
  513. RUCUTEN(i,j,k)=0.
  514. RVCUTEN(i,j,k)=0.
  515. ENDDO
  516. ENDDO
  517. ENDDO
  518. IF (P_QC .ge. P_FIRST_SCALAR) THEN
  519. DO j=jts,jtf
  520. DO k=kts,ktf
  521. DO i=its,itf
  522. RQCCUTEN(i,k,j)=0.
  523. ENDDO
  524. ENDDO
  525. ENDDO
  526. ENDIF
  527. IF (P_QI .ge. P_FIRST_SCALAR) THEN
  528. DO j=jts,jtf
  529. DO k=kts,ktf
  530. DO i=its,itf
  531. RQICUTEN(i,k,j)=0.
  532. ENDDO
  533. ENDDO
  534. ENDDO
  535. ENDIF
  536. ENDIF
  537. END SUBROUTINE sasinit
  538. ! ------------------------------------------------------------------------
  539. SUBROUTINE SASCNV(IM,IX,KM,JCAP,DELT,DEL,PRSL,PS,PHIL,QL, &
  540. ! SUBROUTINE SASCNV(IM,IX,KM,JCAP,DLT,DEL,PRSL,PHIL,QL, &
  541. & Q1,T1,U1,V1,RCS,CLDWRK,RN,KBOT,KTOP,KUO,SLIMSK, &
  542. & DOT,XKT2,ncloud)
  543. ! for cloud water version
  544. ! parameter(ncloud=0)
  545. ! SUBROUTINE SASCNV(KM,JCAP,DELT,DEL,SL,SLK,PS,QL,
  546. ! & Q1,T1,U1,V1,RCS,CLDWRK,RN,KBOT,KTOP,KUO,SLIMSK,
  547. ! & DOT,xkt2,ncloud)
  548. !
  549. USE MODULE_GFS_MACHINE , ONLY : kind_phys
  550. USE MODULE_GFS_FUNCPHYS ,ONLY : fpvs
  551. USE MODULE_GFS_PHYSCONS, grav => con_g, CP => con_CP, HVAP => con_HVAP &
  552. &, RV => con_RV, FV => con_fvirt, T0C => con_T0C &
  553. &, CVAP => con_CVAP, CLIQ => con_CLIQ &
  554. &, EPS => con_eps, EPSM1 => con_epsm1
  555. implicit none
  556. !
  557. ! include 'constant.h'
  558. !
  559. integer IM, IX, KM, JCAP, ncloud, &
  560. & KBOT(IM), KTOP(IM), KUO(IM), J
  561. real(kind=kind_phys) DELT
  562. real(kind=kind_phys) PS(IM), DEL(IX,KM), PRSL(IX,KM), &
  563. ! real(kind=kind_phys) DEL(IX,KM), PRSL(IX,KM),
  564. & QL(IX,KM,2), Q1(IX,KM), T1(IX,KM), &
  565. & U1(IX,KM), V1(IX,KM), RCS(IM), &
  566. & CLDWRK(IM), RN(IM), SLIMSK(IM), &
  567. & DOT(IX,KM), XKT2(IM), PHIL(IX,KM)
  568. !
  569. integer I, INDX, jmn, k, knumb, latd, lond, km1
  570. !
  571. real(kind=kind_phys) adw, alpha, alphal, alphas, &
  572. & aup, beta, betal, betas, &
  573. & c0, cpoel, dellat, delta, &
  574. & desdt, deta, detad, dg, &
  575. & dh, dhh, dlnsig, dp, &
  576. & dq, dqsdp, dqsdt, dt, &
  577. & dt2, dtmax, dtmin, dv1, &
  578. & dv1q, dv2, dv2q, dv1u, &
  579. & dv1v, dv2u, dv2v, dv3u, &
  580. & dv3v, dv3, dv3q, dvq1, &
  581. & dz, dz1, e1, edtmax, &
  582. & edtmaxl, edtmaxs, el2orc, elocp, &
  583. & es, etah, &
  584. & evef, evfact, evfactl, fact1, &
  585. & fact2, factor, fjcap, fkm, &
  586. & fuv, g, gamma, onemf, &
  587. & onemfu, pdetrn, pdpdwn, pprime, &
  588. & qc, qlk, qrch, qs, &
  589. & rain, rfact, shear, tem1, &
  590. & tem2, terr, val, val1, &
  591. & val2, w1, w1l, w1s, &
  592. & w2, w2l, w2s, w3, &
  593. & w3l, w3s, w4, w4l, &
  594. & w4s, xdby, xpw, xpwd, &
  595. & xqc, xqrch, xlambu, mbdt, &
  596. & tem
  597. !
  598. !
  599. integer JMIN(IM), KB(IM), KBCON(IM), KBDTR(IM), &
  600. & KT2(IM), KTCON(IM), LMIN(IM), &
  601. & kbm(IM), kbmax(IM), kmax(IM)
  602. !
  603. real(kind=kind_phys) AA1(IM), ACRT(IM), ACRTFCT(IM), &
  604. & DELHBAR(IM), DELQ(IM), DELQ2(IM), &
  605. & DELQBAR(IM), DELQEV(IM), DELTBAR(IM), &
  606. & DELTV(IM), DTCONV(IM), EDT(IM), &
  607. & EDTO(IM), EDTX(IM), FLD(IM), &
  608. & HCDO(IM), HKBO(IM), HMAX(IM), &
  609. & HMIN(IM), HSBAR(IM), UCDO(IM), &
  610. & UKBO(IM), VCDO(IM), VKBO(IM), &
  611. & PBCDIF(IM), PDOT(IM), PO(IM,KM), &
  612. & PWAVO(IM), PWEVO(IM), &
  613. ! & PSFC(IM), PWAVO(IM), PWEVO(IM), &
  614. & QCDO(IM), QCOND(IM), QEVAP(IM), &
  615. & QKBO(IM), RNTOT(IM), VSHEAR(IM), &
  616. & XAA0(IM), XHCD(IM), XHKB(IM), &
  617. & XK(IM), XLAMB(IM), XLAMD(IM), &
  618. & XMB(IM), XMBMAX(IM), XPWAV(IM), &
  619. & XPWEV(IM), XQCD(IM), XQKB(IM)
  620. !
  621. ! PHYSICAL PARAMETERS
  622. PARAMETER(G=grav)
  623. PARAMETER(CPOEL=CP/HVAP,ELOCP=HVAP/CP, &
  624. & EL2ORC=HVAP*HVAP/(RV*CP))
  625. PARAMETER(TERR=0.,C0=.002,DELTA=fv)
  626. PARAMETER(FACT1=(CVAP-CLIQ)/RV,FACT2=HVAP/RV-FACT1*T0C)
  627. ! LOCAL VARIABLES AND ARRAYS
  628. real(kind=kind_phys) PFLD(IM,KM), TO(IM,KM), QO(IM,KM), &
  629. & UO(IM,KM), VO(IM,KM), QESO(IM,KM)
  630. ! cloud water
  631. real(kind=kind_phys) QLKO_KTCON(IM), DELLAL(IM), TVO(IM,KM), &
  632. & DBYO(IM,KM), ZO(IM,KM), SUMZ(IM,KM), &
  633. & SUMH(IM,KM), HEO(IM,KM), HESO(IM,KM), &
  634. & QRCD(IM,KM), DELLAH(IM,KM), DELLAQ(IM,KM),&
  635. & DELLAU(IM,KM), DELLAV(IM,KM), HCKO(IM,KM), &
  636. & UCKO(IM,KM), VCKO(IM,KM), QCKO(IM,KM), &
  637. & ETA(IM,KM), ETAU(IM,KM), ETAD(IM,KM), &
  638. & QRCDO(IM,KM), PWO(IM,KM), PWDO(IM,KM), &
  639. & RHBAR(IM), TX1(IM)
  640. !
  641. LOGICAL TOTFLG, CNVFLG(IM), DWNFLG(IM), DWNFLG2(IM), FLG(IM)
  642. !
  643. real(kind=kind_phys) PCRIT(15), ACRITT(15), ACRIT(15)
  644. ! SAVE PCRIT, ACRITT
  645. DATA PCRIT/850.,800.,750.,700.,650.,600.,550.,500.,450.,400., &
  646. & 350.,300.,250.,200.,150./
  647. DATA ACRITT/.0633,.0445,.0553,.0664,.075,.1082,.1521,.2216, &
  648. & .3151,.3677,.41,.5255,.7663,1.1686,1.6851/
  649. ! GDAS DERIVED ACRIT
  650. ! DATA ACRITT/.203,.515,.521,.566,.625,.665,.659,.688, &
  651. ! & .743,.813,.886,.947,1.138,1.377,1.896/
  652. !
  653. real(kind=kind_phys) TF, TCR, TCRF, RZERO, RONE
  654. parameter (TF=233.16, TCR=263.16, TCRF=1.0/(TCR-TF))
  655. parameter (RZERO=0.0,RONE=1.0)
  656. !-----------------------------------------------------------------------
  657. !
  658. km1 = km - 1
  659. ! INITIALIZE ARRAYS
  660. !
  661. DO I=1,IM
  662. RN(I)=0.
  663. KBOT(I)=KM+1
  664. KTOP(I)=0
  665. KUO(I)=0
  666. CNVFLG(I) = .TRUE.
  667. DTCONV(I) = 3600.
  668. CLDWRK(I) = 0.
  669. PDOT(I) = 0.
  670. KT2(I) = 0
  671. QLKO_KTCON(I) = 0.
  672. DELLAL(I) = 0.
  673. ENDDO
  674. !!
  675. DO K = 1, 15
  676. ACRIT(K) = ACRITT(K) * (975. - PCRIT(K))
  677. ENDDO
  678. DT2 = DELT
  679. !cmr dtmin = max(dt2,1200.)
  680. val = 1200.
  681. dtmin = max(dt2, val )
  682. !cmr dtmax = max(dt2,3600.)
  683. val = 3600.
  684. dtmax = max(dt2, val )
  685. ! MODEL TUNABLE PARAMETERS ARE ALL HERE
  686. MBDT = 10.
  687. EDTMAXl = .3
  688. EDTMAXs = .3
  689. ALPHAl = .5
  690. ALPHAs = .5
  691. BETAl = .15
  692. betas = .15
  693. BETAl = .05
  694. betas = .05
  695. ! change for hurricane model
  696. BETAl = .5
  697. betas = .5
  698. ! EVEF = 0.07
  699. evfact = 0.3
  700. evfactl = 0.3
  701. ! change for hurricane model
  702. evfact = 0.6
  703. evfactl = .6
  704. #if ( EM_CORE == 1 )
  705. ! HAWAII TEST - ZCX
  706. ALPHAl = .5
  707. ALPHAs = .75
  708. BETAl = .05
  709. betas = .05
  710. evfact = 0.5
  711. evfactl = 0.5
  712. #endif
  713. PDPDWN = 0.
  714. PDETRN = 200.
  715. xlambu = 1.e-4
  716. fjcap = (float(jcap) / 126.) ** 2
  717. !cmr fjcap = max(fjcap,1.)
  718. val = 1.
  719. fjcap = max(fjcap,val)
  720. fkm = (float(km) / 28.) ** 2
  721. !cmr fkm = max(fkm,1.)
  722. fkm = max(fkm,val)
  723. W1l = -8.E-3
  724. W2l = -4.E-2
  725. W3l = -5.E-3
  726. W4l = -5.E-4
  727. W1s = -2.E-4
  728. W2s = -2.E-3
  729. W3s = -1.E-3
  730. W4s = -2.E-5
  731. !CCCC IF(IM.EQ.384) THEN
  732. LATD = 92
  733. lond = 189
  734. !CCCC ELSEIF(IM.EQ.768) THEN
  735. !CCCC LATD = 80
  736. !CCCC ELSE
  737. !CCCC LATD = 0
  738. !CCCC ENDIF
  739. !
  740. ! DEFINE TOP LAYER FOR SEARCH OF THE DOWNDRAFT ORIGINATING LAYER
  741. ! AND THE MAXIMUM THETAE FOR UPDRAFT
  742. !
  743. DO I=1,IM
  744. KBMAX(I) = KM
  745. KBM(I) = KM
  746. KMAX(I) = KM
  747. TX1(I) = 1.0 / PS(I)
  748. ENDDO
  749. !
  750. DO K = 1, KM
  751. DO I=1,IM
  752. IF (prSL(I,K)*tx1(I) .GT. 0.45) KBMAX(I) = K + 1
  753. IF (prSL(I,K)*tx1(I) .GT. 0.70) KBM(I) = K + 1
  754. IF (prSL(I,K)*tx1(I) .GT. 0.04) KMAX(I) = MIN(KM,K + 1)
  755. ENDDO
  756. ENDDO
  757. DO I=1,IM
  758. KBMAX(I) = MIN(KBMAX(I),KMAX(I))
  759. KBM(I) = MIN(KBM(I),KMAX(I))
  760. ENDDO
  761. !
  762. ! CONVERT SURFACE PRESSURE TO MB FROM CB
  763. !
  764. !!
  765. DO K = 1, KM
  766. DO I=1,IM
  767. if (K .le. kmax(i)) then
  768. PFLD(I,k) = PRSL(I,K) * 10.0
  769. PWO(I,k) = 0.
  770. PWDO(I,k) = 0.
  771. TO(I,k) = T1(I,k)
  772. QO(I,k) = Q1(I,k)
  773. UO(I,k) = U1(I,k)
  774. VO(I,k) = V1(I,k)
  775. DBYO(I,k) = 0.
  776. SUMZ(I,k) = 0.
  777. SUMH(I,k) = 0.
  778. endif
  779. ENDDO
  780. ENDDO
  781. !
  782. ! COLUMN VARIABLES
  783. ! P IS PRESSURE OF THE LAYER (MB)
  784. ! T IS TEMPERATURE AT T-DT (K)..TN
  785. ! Q IS MIXING RATIO AT T-DT (KG/KG)..QN
  786. ! TO IS TEMPERATURE AT T+DT (K)... THIS IS AFTER ADVECTION AND TURBULAN
  787. ! QO IS MIXING RATIO AT T+DT (KG/KG)..Q1
  788. !
  789. DO K = 1, KM
  790. DO I=1,IM
  791. if (k .le. kmax(i)) then
  792. !jfe QESO(I,k) = 10. * FPVS(T1(I,k))
  793. !
  794. QESO(I,k) = 0.01 * fpvs(T1(I,K)) ! fpvs is in Pa
  795. !
  796. QESO(I,k) = EPS * QESO(I,k) / (PFLD(I,k) + EPSM1*QESO(I,k))
  797. !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
  798. val1 = 1.E-8
  799. QESO(I,k) = MAX(QESO(I,k), val1)
  800. !cmr QO(I,k) = max(QO(I,k),1.e-10)
  801. val2 = 1.e-10
  802. QO(I,k) = max(QO(I,k), val2 )
  803. ! QO(I,k) = MIN(QO(I,k),QESO(I,k))
  804. TVO(I,k) = TO(I,k) + DELTA * TO(I,k) * QO(I,k)
  805. endif
  806. ENDDO
  807. ENDDO
  808. !
  809. ! HYDROSTATIC HEIGHT ASSUME ZERO TERR
  810. !
  811. DO K = 1, KM
  812. DO I=1,IM
  813. ZO(I,k) = PHIL(I,k) / G
  814. ENDDO
  815. ENDDO
  816. ! COMPUTE MOIST STATIC ENERGY
  817. DO K = 1, KM
  818. DO I=1,IM
  819. if (K .le. kmax(i)) then
  820. ! tem = G * ZO(I,k) + CP * TO(I,k)
  821. tem = PHIL(I,k) + CP * TO(I,k)
  822. HEO(I,k) = tem + HVAP * QO(I,k)
  823. HESO(I,k) = tem + HVAP * QESO(I,k)
  824. ! HEO(I,k) = MIN(HEO(I,k),HESO(I,k))
  825. endif
  826. ENDDO
  827. ENDDO
  828. !
  829. ! DETERMINE LEVEL WITH LARGEST MOIST STATIC ENERGY
  830. ! THIS IS THE LEVEL WHERE UPDRAFT STARTS
  831. !
  832. DO I=1,IM
  833. HMAX(I) = HEO(I,1)
  834. KB(I) = 1
  835. ENDDO
  836. !!
  837. DO K = 2, KM
  838. DO I=1,IM
  839. if (k .le. kbm(i)) then
  840. IF(HEO(I,k).GT.HMAX(I).AND.CNVFLG(I)) THEN
  841. KB(I) = K
  842. HMAX(I) = HEO(I,k)
  843. ENDIF
  844. endif
  845. ENDDO
  846. ENDDO
  847. ! DO K = 1, KMAX - 1
  848. ! TOL(k) = .5 * (TO(I,k) + TO(I,k+1))
  849. ! QOL(k) = .5 * (QO(I,k) + QO(I,k+1))
  850. ! QESOL(I,k) = .5 * (QESO(I,k) + QESO(I,k+1))
  851. ! HEOL(I,k) = .5 * (HEO(I,k) + HEO(I,k+1))
  852. ! HESOL(I,k) = .5 * (HESO(I,k) + HESO(I,k+1))
  853. ! ENDDO
  854. DO K = 1, KM1
  855. DO I=1,IM
  856. if (k .le. kmax(i)-1) then
  857. DZ = .5 * (ZO(I,k+1) - ZO(I,k))
  858. DP = .5 * (PFLD(I,k+1) - PFLD(I,k))
  859. !jfe ES = 10. * FPVS(TO(I,k+1))
  860. !
  861. ES = 0.01 * fpvs(TO(I,K+1)) ! fpvs is in Pa
  862. !
  863. PPRIME = PFLD(I,k+1) + EPSM1 * ES
  864. QS = EPS * ES / PPRIME
  865. DQSDP = - QS / PPRIME
  866. DESDT = ES * (FACT1 / TO(I,k+1) + FACT2 / (TO(I,k+1)**2))
  867. DQSDT = QS * PFLD(I,k+1) * DESDT / (ES * PPRIME)
  868. GAMMA = EL2ORC * QESO(I,k+1) / (TO(I,k+1)**2)
  869. DT = (G * DZ + HVAP * DQSDP * DP) / (CP * (1. + GAMMA))
  870. DQ = DQSDT * DT + DQSDP * DP
  871. TO(I,k) = TO(I,k+1) + DT
  872. QO(I,k) = QO(I,k+1) + DQ
  873. PO(I,k) = .5 * (PFLD(I,k) + PFLD(I,k+1))
  874. endif
  875. ENDDO
  876. ENDDO
  877. !
  878. DO K = 1, KM1
  879. DO I=1,IM
  880. if (k .le. kmax(I)-1) then
  881. !jfe QESO(I,k) = 10. * FPVS(TO(I,k))
  882. !
  883. QESO(I,k) = 0.01 * fpvs(TO(I,K)) ! fpvs is in Pa
  884. !
  885. QESO(I,k) = EPS * QESO(I,k) / (PO(I,k) + EPSM1*QESO(I,k))
  886. !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
  887. val1 = 1.E-8
  888. QESO(I,k) = MAX(QESO(I,k), val1)
  889. !cmr QO(I,k) = max(QO(I,k),1.e-10)
  890. val2 = 1.e-10
  891. QO(I,k) = max(QO(I,k), val2 )
  892. ! QO(I,k) = MIN(QO(I,k),QESO(I,k))
  893. HEO(I,k) = .5 * G * (ZO(I,k) + ZO(I,k+1)) + &
  894. & CP * TO(I,k) + HVAP * QO(I,k)
  895. HESO(I,k) = .5 * G * (ZO(I,k) + ZO(I,k+1)) + &
  896. & CP * TO(I,k) + HVAP * QESO(I,k)
  897. UO(I,k) = .5 * (UO(I,k) + UO(I,k+1))
  898. VO(I,k) = .5 * (VO(I,k) + VO(I,k+1))
  899. endif
  900. ENDDO
  901. ENDDO
  902. ! k = kmax
  903. ! HEO(I,k) = HEO(I,k)
  904. ! hesol(k) = HESO(I,k)
  905. ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
  906. ! PRINT *, ' HEO ='
  907. ! PRINT 6001, (HEO(I,K),K=1,KMAX)
  908. ! PRINT *, ' HESO ='
  909. ! PRINT 6001, (HESO(I,K),K=1,KMAX)
  910. ! PRINT *, ' TO ='
  911. ! PRINT 6002, (TO(I,K)-273.16,K=1,KMAX)
  912. ! PRINT *, ' QO ='
  913. ! PRINT 6003, (QO(I,K),K=1,KMAX)
  914. ! PRINT *, ' QSO ='
  915. ! PRINT 6003, (QESO(I,K),K=1,KMAX)
  916. ! ENDIF
  917. !
  918. ! LOOK FOR CONVECTIVE CLOUD BASE AS THE LEVEL OF FREE CONVECTION
  919. !
  920. DO I=1,IM
  921. IF(CNVFLG(I)) THEN
  922. INDX = KB(I)
  923. HKBO(I) = HEO(I,INDX)
  924. QKBO(I) = QO(I,INDX)
  925. UKBO(I) = UO(I,INDX)
  926. VKBO(I) = VO(I,INDX)
  927. ENDIF
  928. FLG(I) = CNVFLG(I)
  929. KBCON(I) = KMAX(I)
  930. ENDDO
  931. !!
  932. DO K = 1, KM
  933. DO I=1,IM
  934. if (k .le. kbmax(i)) then
  935. IF(FLG(I).AND.K.GT.KB(I)) THEN
  936. HSBAR(I) = HESO(I,k)
  937. IF(HKBO(I).GT.HSBAR(I)) THEN
  938. FLG(I) = .FALSE.
  939. KBCON(I) = K
  940. ENDIF
  941. ENDIF
  942. endif
  943. ENDDO
  944. ENDDO
  945. DO I=1,IM
  946. IF(CNVFLG(I)) THEN
  947. PBCDIF(I) = -PFLD(I,KBCON(I)) + PFLD(I,KB(I))
  948. PDOT(I) = 10.* DOT(I,KBCON(I))
  949. IF(PBCDIF(I).GT.150.) CNVFLG(I) = .FALSE.
  950. IF(KBCON(I).EQ.KMAX(I)) CNVFLG(I) = .FALSE.
  951. ENDIF
  952. ENDDO
  953. !!
  954. TOTFLG = .TRUE.
  955. DO I=1,IM
  956. TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
  957. ENDDO
  958. IF(TOTFLG) RETURN
  959. ! FOUND LFC, CAN DEFINE REST OF VARIABLES
  960. 6001 FORMAT(2X,-2P10F12.2)
  961. 6002 FORMAT(2X,10F12.2)
  962. 6003 FORMAT(2X,3P10F12.2)
  963. !
  964. ! DETERMINE ENTRAINMENT RATE BETWEEN KB AND KBCON
  965. !
  966. DO I = 1, IM
  967. alpha = alphas
  968. if(SLIMSK(I).eq.1.) alpha = alphal
  969. IF(CNVFLG(I)) THEN
  970. IF(KB(I).EQ.1) THEN
  971. DZ = .5 * (ZO(I,KBCON(I)) + ZO(I,KBCON(I)-1)) - ZO(I,1)
  972. ELSE
  973. DZ = .5 * (ZO(I,KBCON(I)) + ZO(I,KBCON(I)-1)) &
  974. & - .5 * (ZO(I,KB(I)) + ZO(I,KB(I)-1))
  975. ENDIF
  976. IF(KBCON(I).NE.KB(I)) THEN
  977. !cmr XLAMB(I) = -ALOG(ALPHA) / DZ
  978. XLAMB(I) = - LOG(ALPHA) / DZ
  979. ELSE
  980. XLAMB(I) = 0.
  981. ENDIF
  982. ENDIF
  983. ENDDO
  984. ! DETERMINE UPDRAFT MASS FLUX
  985. DO K = 1, KM
  986. DO I = 1, IM
  987. if (k .le. kmax(i) .and. CNVFLG(I)) then
  988. ETA(I,k) = 1.
  989. ETAU(I,k) = 1.
  990. ENDIF
  991. ENDDO
  992. ENDDO
  993. DO K = KM1, 2, -1
  994. DO I = 1, IM
  995. if (k .le. kbmax(i)) then
  996. IF(CNVFLG(I).AND.K.LT.KBCON(I).AND.K.GE.KB(I)) THEN
  997. DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
  998. ETA(I,k) = ETA(I,k+1) * EXP(-XLAMB(I) * DZ)
  999. ETAU(I,k) = ETA(I,k)
  1000. ENDIF
  1001. endif
  1002. ENDDO
  1003. ENDDO
  1004. DO I = 1, IM
  1005. IF(CNVFLG(I).AND.KB(I).EQ.1.AND.KBCON(I).GT.1) THEN
  1006. DZ = .5 * (ZO(I,2) - ZO(I,1))
  1007. ETA(I,1) = ETA(I,2) * EXP(-XLAMB(I) * DZ)
  1008. ETAU(I,1) = ETA(I,1)
  1009. ENDIF
  1010. ENDDO
  1011. !
  1012. ! WORK UP UPDRAFT CLOUD PROPERTIES
  1013. !
  1014. DO I = 1, IM
  1015. IF(CNVFLG(I)) THEN
  1016. INDX = KB(I)
  1017. HCKO(I,INDX) = HKBO(I)
  1018. QCKO(I,INDX) = QKBO(I)
  1019. UCKO(I,INDX) = UKBO(I)
  1020. VCKO(I,INDX) = VKBO(I)
  1021. PWAVO(I) = 0.
  1022. ENDIF
  1023. ENDDO
  1024. !
  1025. ! CLOUD PROPERTY BELOW CLOUD BASE IS MODIFIED BY THE ENTRAINMENT PROCES
  1026. !
  1027. DO K = 2, KM1
  1028. DO I = 1, IM
  1029. if (k .le. kmax(i)-1) then
  1030. IF(CNVFLG(I).AND.K.GT.KB(I).AND.K.LE.KBCON(I)) THEN
  1031. FACTOR = ETA(I,k-1) / ETA(I,k)
  1032. ONEMF = 1. - FACTOR
  1033. HCKO(I,k) = FACTOR * HCKO(I,k-1) + ONEMF * &
  1034. & .5 * (HEO(I,k) + HEO(I,k+1))
  1035. UCKO(I,k) = FACTOR * UCKO(I,k-1) + ONEMF * &
  1036. & .5 * (UO(I,k) + UO(I,k+1))
  1037. VCKO(I,k) = FACTOR * VCKO(I,k-1) + ONEMF * &
  1038. & .5 * (VO(I,k) + VO(I,k+1))
  1039. DBYO(I,k) = HCKO(I,k) - HESO(I,k)
  1040. ENDIF
  1041. IF(CNVFLG(I).AND.K.GT.KBCON(I)) THEN
  1042. HCKO(I,k) = HCKO(I,k-1)
  1043. UCKO(I,k) = UCKO(I,k-1)
  1044. VCKO(I,k) = VCKO(I,k-1)
  1045. DBYO(I,k) = HCKO(I,k) - HESO(I,k)
  1046. ENDIF
  1047. endif
  1048. ENDDO
  1049. ENDDO
  1050. ! DETERMINE CLOUD TOP
  1051. DO I = 1, IM
  1052. FLG(I) = CNVFLG(I)
  1053. KTCON(I) = 1
  1054. ENDDO
  1055. ! DO K = 2, KMAX
  1056. ! KK = KMAX - K + 1
  1057. ! IF(DBYO(I,kK).GE.0..AND.FLG(I).AND.KK.GT.KBCON(I)) THEN
  1058. ! KTCON(I) = KK + 1
  1059. ! FLG(I) = .FALSE.
  1060. ! ENDIF
  1061. ! ENDDO
  1062. DO K = 2, KM
  1063. DO I = 1, IM
  1064. if (k .le. kmax(i)) then
  1065. IF(DBYO(I,k).LT.0..AND.FLG(I).AND.K.GT.KBCON(I)) THEN
  1066. KTCON(I) = K
  1067. FLG(I) = .FALSE.
  1068. ENDIF
  1069. endif
  1070. ENDDO
  1071. ENDDO
  1072. DO I = 1, IM
  1073. IF(CNVFLG(I).AND.(PFLD(I,KBCON(I)) - PFLD(I,KTCON(I))).LT.150.) &
  1074. & CNVFLG(I) = .FALSE.
  1075. ENDDO
  1076. TOTFLG = .TRUE.
  1077. DO I = 1, IM
  1078. TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
  1079. ENDDO
  1080. IF(TOTFLG) RETURN
  1081. !
  1082. ! SEARCH FOR DOWNDRAFT ORIGINATING LEVEL ABOVE THETA-E MINIMUM
  1083. !
  1084. DO I = 1, IM
  1085. HMIN(I) = HEO(I,KBCON(I))
  1086. LMIN(I) = KBMAX(I)
  1087. JMIN(I) = KBMAX(I)
  1088. ENDDO
  1089. DO I = 1, IM
  1090. DO K = KBCON(I), KBMAX(I)
  1091. IF(HEO(I,k).LT.HMIN(I).AND.CNVFLG(I)) THEN
  1092. LMIN(I) = K + 1
  1093. HMIN(I) = HEO(I,k)
  1094. ENDIF
  1095. ENDDO
  1096. ENDDO
  1097. !
  1098. ! Make sure that JMIN(I) is within the cloud
  1099. !
  1100. DO I = 1, IM
  1101. IF(CNVFLG(I)) THEN
  1102. JMIN(I) = MIN(LMIN(I),KTCON(I)-1)
  1103. XMBMAX(I) = .1
  1104. JMIN(I) = MAX(JMIN(I),KBCON(I)+1)
  1105. ENDIF
  1106. ENDDO
  1107. !
  1108. ! ENTRAINING CLOUD
  1109. !
  1110. do k = 2, km1
  1111. DO I = 1, IM
  1112. if (k .le. kmax(i)-1) then
  1113. if(CNVFLG(I).and.k.gt.JMIN(I).and.k.le.KTCON(I)) THEN
  1114. SUMZ(I,k) = SUMZ(I,k-1) + .5 * (ZO(I,k+1) - ZO(I,k-1))
  1115. SUMH(I,k) = SUMH(I,k-1) + .5 * (ZO(I,k+1) - ZO(I,k-1)) &
  1116. & * HEO(I,k)
  1117. ENDIF
  1118. endif
  1119. enddo
  1120. enddo
  1121. !!
  1122. DO I = 1, IM
  1123. IF(CNVFLG(I)) THEN
  1124. ! call random_number(XKT2)
  1125. ! call srand(fhour)
  1126. ! XKT2(I) = rand()
  1127. KT2(I) = nint(XKT2(I)*float(KTCON(I)-JMIN(I))-.5)+JMIN(I)+1
  1128. ! KT2(I) = nint(sqrt(XKT2(I))*float(KTCON(I)-JMIN(I))-.5) + JMIN(I) + 1
  1129. ! KT2(I) = nint(ranf() *float(KTCON(I)-JMIN(I))-.5) + JMIN(I) + 1
  1130. tem1 = (HCKO(I,JMIN(I)) - HESO(I,KT2(I)))
  1131. tem2 = (SUMZ(I,KT2(I)) * HESO(I,KT2(I)) - SUMH(I,KT2(I)))
  1132. if (abs(tem2) .gt. 0.000001) THEN
  1133. XLAMB(I) = tem1 / tem2
  1134. else
  1135. CNVFLG(I) = .false.
  1136. ENDIF
  1137. ! XLAMB(I) = (HCKO(I,JMIN(I)) - HESO(I,KT2(I)))
  1138. ! & / (SUMZ(I,KT2(I)) * HESO(I,KT2(I)) - SUMH(I,KT2(I)))
  1139. XLAMB(I) = max(XLAMB(I),RZERO)
  1140. XLAMB(I) = min(XLAMB(I),2.3/SUMZ(I,KT2(I)))
  1141. ENDIF
  1142. ENDDO
  1143. !!
  1144. DO I = 1, IM
  1145. DWNFLG(I) = CNVFLG(I)
  1146. DWNFLG2(I) = CNVFLG(I)
  1147. IF(CNVFLG(I)) THEN
  1148. if(KT2(I).ge.KTCON(I)) DWNFLG(I) = .false.
  1149. if(XLAMB(I).le.1.e-30.or.HCKO(I,JMIN(I))-HESO(I,KT2(I)).le.1.e-30)&
  1150. & DWNFLG(I) = .false.
  1151. do k = JMIN(I), KT2(I)
  1152. if(DWNFLG(I).and.HEO(I,k).gt.HESO(I,KT2(I))) DWNFLG(I)=.false.
  1153. enddo
  1154. ! IF(CNVFLG(I).AND.(PFLD(KBCON(I))-PFLD(KTCON(I))).GT.PDETRN)
  1155. ! & DWNFLG(I)=.FALSE.
  1156. IF(CNVFLG(I).AND.(PFLD(I,KBCON(I))-PFLD(I,KTCON(I))).LT.PDPDWN) &
  1157. & DWNFLG2(I)=.FALSE.
  1158. ENDIF
  1159. ENDDO
  1160. !!
  1161. DO K = 2, KM1
  1162. DO I = 1, IM
  1163. if (k .le. kmax(i)-1) then
  1164. IF(DWNFLG(I).AND.K.GT.JMIN(I).AND.K.LE.KT2(I)) THEN
  1165. DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
  1166. ! ETA(I,k) = ETA(I,k-1) * EXP( XLAMB(I) * DZ)
  1167. ! to simplify matter, we will take the linear approach here
  1168. !
  1169. ETA(I,k) = ETA(I,k-1) * (1. + XLAMB(I) * dz)
  1170. ETAU(I,k) = ETAU(I,k-1) * (1. + (XLAMB(I)+xlambu) * dz)
  1171. ENDIF
  1172. endif
  1173. ENDDO
  1174. ENDDO
  1175. !!
  1176. DO K = 2, KM1
  1177. DO I = 1, IM
  1178. if (k .le. kmax(i)-1) then
  1179. ! IF(.NOT.DWNFLG(I).AND.K.GT.JMIN(I).AND.K.LE.KT2(I)) THEN
  1180. IF(.NOT.DWNFLG(I).AND.K.GT.JMIN(I).AND.K.LE.KTCON(I)) THEN
  1181. DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
  1182. ETAU(I,k) = ETAU(I,k-1) * (1. + xlambu * dz)
  1183. ENDIF
  1184. endif
  1185. ENDDO
  1186. ENDDO
  1187. ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
  1188. ! PRINT *, ' LMIN(I), KT2(I)=', LMIN(I), KT2(I)
  1189. ! PRINT *, ' KBOT, KTOP, JMIN(I) =', KBCON(I), KTCON(I), JMIN(I)
  1190. ! ENDIF
  1191. ! IF(LAT.EQ.LATD.AND.lon.eq.lond) THEN
  1192. ! print *, ' xlamb =', xlamb
  1193. ! print *, ' eta =', (eta(k),k=1,KT2(I))
  1194. ! print *, ' ETAU =', (ETAU(I,k),k=1,KT2(I))
  1195. ! print *, ' HCKO =', (HCKO(I,k),k=1,KT2(I))
  1196. ! print *, ' SUMZ =', (SUMZ(I,k),k=1,KT2(I))
  1197. ! print *, ' SUMH =', (SUMH(I,k),k=1,KT2(I))
  1198. ! ENDIF
  1199. DO I = 1, IM
  1200. if(DWNFLG(I)) THEN
  1201. KTCON(I) = KT2(I)
  1202. ENDIF
  1203. ENDDO
  1204. !
  1205. ! CLOUD PROPERTY ABOVE CLOUD Base IS MODIFIED BY THE DETRAINMENT PROCESS
  1206. !
  1207. DO K = 2, KM1
  1208. DO I = 1, IM
  1209. if (k .le. kmax(i)-1) then
  1210. !jfe
  1211. IF(CNVFLG(I).AND.K.GT.KBCON(I).AND.K.LE.KTCON(I)) THEN
  1212. !jfe IF(K.GT.KBCON(I).AND.K.LE.KTCON(I)) THEN
  1213. FACTOR = ETA(I,k-1) / ETA(I,k)
  1214. ONEMF = 1. - FACTOR
  1215. fuv = ETAU(I,k-1) / ETAU(I,k)
  1216. onemfu = 1. - fuv
  1217. HCKO(I,k) = FACTOR * HCKO(I,k-1) + ONEMF * &
  1218. & .5 * (HEO(I,k) + HEO(I,k+1))
  1219. UCKO(I,k) = fuv * UCKO(I,k-1) + ONEMFu * &
  1220. & .5 * (UO(I,k) + UO(I,k+1))
  1221. VCKO(I,k) = fuv * VCKO(I,k-1) + ONEMFu * &
  1222. & .5 * (VO(I,k) + VO(I,k+1))
  1223. DBYO(I,k) = HCKO(I,k) - HESO(I,k)
  1224. ENDIF
  1225. endif
  1226. ENDDO
  1227. ENDDO
  1228. ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
  1229. ! PRINT *, ' UCKO=', (UCKO(I,k),k=KBCON(I)+1,KTCON(I))
  1230. ! PRINT *, ' uenv=', (.5*(UO(I,k)+UO(I,k-1)),k=KBCON(I)+1,KTCON(I))
  1231. ! ENDIF
  1232. DO I = 1, IM
  1233. if(CNVFLG(I).and.DWNFLG2(I).and.JMIN(I).le.KBCON(I)) &
  1234. & THEN
  1235. CNVFLG(I) = .false.
  1236. DWNFLG(I) = .false.
  1237. DWNFLG2(I) = .false.
  1238. ENDIF
  1239. ENDDO
  1240. !!
  1241. TOTFLG = .TRUE.
  1242. DO I = 1, IM
  1243. TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
  1244. ENDDO
  1245. IF(TOTFLG) RETURN
  1246. !!
  1247. !
  1248. ! COMPUTE CLOUD MOISTURE PROPERTY AND PRECIPITATION
  1249. !
  1250. DO I = 1, IM
  1251. AA1(I) = 0.
  1252. RHBAR(I) = 0.
  1253. ENDDO
  1254. DO K = 1, KM
  1255. DO I = 1, IM
  1256. if (k .le. kmax(i)) then
  1257. IF(CNVFLG(I).AND.K.GT.KB(I).AND.K.LT.KTCON(I)) THEN
  1258. DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
  1259. DZ1 = (ZO(I,k) - ZO(I,k-1))
  1260. GAMMA = EL2ORC * QESO(I,k) / (TO(I,k)**2)
  1261. QRCH = QESO(I,k) &
  1262. & + GAMMA * DBYO(I,k) / (HVAP * (1. + GAMMA))
  1263. FACTOR = ETA(I,k-1) / ETA(I,k)
  1264. ONEMF = 1. - FACTOR
  1265. QCKO(I,k) = FACTOR * QCKO(I,k-1) + ONEMF * &
  1266. & .5 * (QO(I,k) + QO(I,k+1))
  1267. DQ = ETA(I,k) * QCKO(I,k) - ETA(I,k) * QRCH
  1268. RHBAR(I) = RHBAR(I) + QO(I,k) / QESO(I,k)
  1269. !
  1270. ! BELOW LFC CHECK IF THERE IS EXCESS MOISTURE TO RELEASE LATENT HEAT
  1271. !
  1272. IF(DQ.GT.0.) THEN
  1273. ETAH = .5 * (ETA(I,k) + ETA(I,k-1))
  1274. QLK = DQ / (ETA(I,k) + ETAH * C0 * DZ)
  1275. AA1(I) = AA1(I) - DZ1 * G * QLK
  1276. QC = QLK + QRCH
  1277. PWO(I,k) = ETA

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