PageRenderTime 71ms CodeModel.GetById 35ms RepoModel.GetById 0ms app.codeStats 1ms

/wrfv2_fire/phys/module_bl_gfs2011.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 1509 lines | 1091 code | 54 blank | 364 comment | 55 complexity | 4b4b1c9eeae2ad684b94cbac2d86c420 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. !LWRF:MODEL_LAYER:PHYSICS
  2. !
  3. MODULE module_bl_gfs2011
  4. CONTAINS
  5. !-------------------------------------------------------------------
  6. SUBROUTINE BL_GFS2011(U3D,V3D,TH3D,T3D,QV3D,QC3D,QI3D,P3D,PI3D, &
  7. RUBLTEN,RVBLTEN,RTHBLTEN, &
  8. RQVBLTEN,RQCBLTEN,RQIBLTEN, &
  9. CP,G,ROVCP,R,ROVG,P_QI,P_FIRST_SCALAR, &
  10. dz8w,z,PSFC, &
  11. UST,PBL,PSIM,PSIH, &
  12. HFX,QFX,TSK,GZ1OZ0,WSPD,BR, &
  13. DT,KPBL2D,EP1,KARMAN, &
  14. #if (NMM_CORE==1)
  15. DISHEAT, &
  16. #endif
  17. RTHRATEN, & !Kwon add RTHRATEN
  18. HPBL2D, EVAP2D, HEAT2D, & !Kwon add FOR SHAL. CON.
  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. !-------------------------------------------------------------------
  25. IMPLICIT NONE
  26. !-------------------------------------------------------------------
  27. !-- U3D 3D u-velocity interpolated to theta points (m/s)
  28. !-- V3D 3D v-velocity interpolated to theta points (m/s)
  29. !-- TH3D 3D potential temperature (K)
  30. !-- T3D temperature (K)
  31. !-- QV3D 3D water vapor mixing ratio (Kg/Kg)
  32. !-- QC3D 3D cloud mixing ratio (Kg/Kg)
  33. !-- QI3D 3D ice mixing ratio (Kg/Kg)
  34. !-- P3D 3D pressure (Pa)
  35. !-- PI3D 3D exner function (dimensionless)
  36. !-- rr3D 3D dry air density (kg/m^3)
  37. !-- RUBLTEN U tendency due to
  38. ! PBL parameterization (m/s^2)
  39. !-- RVBLTEN V tendency due to
  40. ! PBL parameterization (m/s^2)
  41. !-- RTHBLTEN Theta tendency due to
  42. ! PBL parameterization (K/s)
  43. !-- RQVBLTEN Qv tendency due to
  44. ! PBL parameterization (kg/kg/s)
  45. !-- RQCBLTEN Qc tendency due to
  46. ! PBL parameterization (kg/kg/s)
  47. !-- RQIBLTEN Qi tendency due to
  48. ! PBL parameterization (kg/kg/s)
  49. !-- CP heat capacity at constant pressure for dry air (J/kg/K)
  50. !-- G acceleration due to gravity (m/s^2)
  51. !-- ROVCP R/CP
  52. !-- R gas constant for dry air (J/kg/K)
  53. !-- ROVG R/G
  54. !-- P_QI species index for cloud ice
  55. !-- dz8w dz between full levels (m)
  56. !-- z height above sea level (m)
  57. !-- PSFC pressure at the surface (Pa)
  58. !-- UST u* in similarity theory (m/s)
  59. !-- PBL PBL height (m)
  60. !-- PSIM similarity stability function for momentum
  61. !-- PSIH similarity stability function for heat
  62. !-- HFX upward heat flux at the surface (W/m^2)
  63. !-- QFX upward moisture flux at the surface (kg/m^2/s)
  64. !-- TSK surface temperature (K)
  65. !-- GZ1OZ0 log(z/z0) where z0 is roughness length
  66. !-- WSPD wind speed at lowest model level (m/s)
  67. !-- BR bulk Richardson number in surface layer
  68. !-- DT time step (s)
  69. !-- rvovrd R_v divided by R_d (dimensionless)
  70. !-- EP1 constant for virtual temperature (R_v/R_d - 1) (dimensionless)
  71. !-- KARMAN Von Karman constant
  72. !-- ids start index for i in domain
  73. !-- ide end index for i in domain
  74. !-- jds start index for j in domain
  75. !-- jde end index for j in domain
  76. !-- kds start index for k in domain
  77. !-- kde end index for k in domain
  78. !-- ims start index for i in memory
  79. !-- ime end index for i in memory
  80. !-- jms start index for j in memory
  81. !-- jme end index for j in memory
  82. !-- kms start index for k in memory
  83. !-- kme end index for k in memory
  84. !-- its start index for i in tile
  85. !-- ite end index for i in tile
  86. !-- jts start index for j in tile
  87. !-- jte end index for j in tile
  88. !-- kts start index for k in tile
  89. !-- kte end index for k in tile
  90. !-------------------------------------------------------------------
  91. INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde, &
  92. ims,ime, jms,jme, kms,kme, &
  93. its,ite, jts,jte, kts,kte, &
  94. P_QI,P_FIRST_SCALAR
  95. #if (NMM_CORE==1)
  96. LOGICAL , INTENT(IN):: DISHEAT !gopal's doing
  97. #endif
  98. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: RTHRATEN !Kwon
  99. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: &
  100. HPBL2D, & !ADDED BY KWON FOR SHALLOW CONV.
  101. EVAP2D, & !ADDED BY KWON FOR SHALLOW CONV.
  102. HEAT2D !ADDED BY KWON FOR SHALLOW CONV.
  103. REAL, INTENT(IN) :: &
  104. CP, &
  105. DT, &
  106. EP1, &
  107. G, &
  108. KARMAN, &
  109. R, &
  110. ROVCP, &
  111. ROVG
  112. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: &
  113. DZ8W, &
  114. P3D, &
  115. PI3D, &
  116. QC3D, &
  117. QI3D, &
  118. QV3D, &
  119. T3D, &
  120. TH3D, &
  121. U3D, &
  122. V3D, &
  123. Z
  124. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: &
  125. RTHBLTEN, &
  126. RQCBLTEN, &
  127. RQIBLTEN, &
  128. RQVBLTEN, &
  129. RUBLTEN, &
  130. RVBLTEN
  131. REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: &
  132. BR, &
  133. GZ1OZ0, &
  134. HFX, &
  135. PSFC, &
  136. PSIM, &
  137. PSIH, &
  138. QFX, &
  139. TSK
  140. REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: &
  141. PBL, &
  142. UST, &
  143. WSPD
  144. INTEGER, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: &
  145. KPBL2D
  146. !--------------------------- LOCAL VARS ------------------------------
  147. REAL (kind=kind_phys), DIMENSION(its:ite, kts:kte) :: &
  148. DEL, &
  149. DU, &
  150. DV, &
  151. PHIL, &
  152. PRSL, &
  153. PRSLK, &
  154. T1, &
  155. TAU, &
  156. dishx, &
  157. THRATEN, & !Kwon
  158. U1, &
  159. V1
  160. REAL (kind=kind_phys), DIMENSION(its:ite, kts:kte+1) :: &
  161. PHII, &
  162. PRSI
  163. REAL (kind=kind_phys), DIMENSION(its:ite, kts:kte, 3) :: &
  164. Q1, &
  165. RTG
  166. REAL (kind=kind_phys), DIMENSION(its:ite) :: &
  167. DQSFC, &
  168. DTSFC, &
  169. DUSFC, &
  170. DVSFC, &
  171. EVAP, &
  172. FH, &
  173. FM, &
  174. HEAT, &
  175. HGAMQ, &
  176. HGAMT, &
  177. HPBL, &
  178. PSK, &
  179. QSS, &
  180. RBSOIL, &
  181. RCL, &
  182. SPD1, &
  183. STRESS, &
  184. TSEA
  185. REAL (kind=kind_phys) :: &
  186. CPM, &
  187. cpmikj, &
  188. DELTIM, &
  189. FMTMP, &
  190. RRHOX
  191. INTEGER, DIMENSION( its:ite ) :: &
  192. KPBL
  193. INTEGER :: &
  194. I, &
  195. IM, &
  196. J, &
  197. K, &
  198. KM, &
  199. KTEM, &
  200. KTEP, &
  201. KX, &
  202. L, &
  203. NTRAC
  204. IM=ITE-ITS+1
  205. KX=KTE-KTS+1
  206. KTEM=KTE-1
  207. KTEP=KTE+1
  208. NTRAC=2
  209. DELTIM=DT
  210. IF (P_QI.ge.P_FIRST_SCALAR) NTRAC=3
  211. DO J=jts,jte
  212. DO i=its,ite
  213. RRHOX=(R*T3D(I,KTS,J)*(1.+EP1*QV3D(I,KTS,J)))/PSFC(I,J)
  214. CPM=CP*(1.+0.8*QV3D(i,kts,j))
  215. FMTMP=GZ1OZ0(i,j)-PSIM(i,j)
  216. PSK(i)=(PSFC(i,j)*.00001)**ROVCP
  217. FM(i)=FMTMP
  218. FH(i)=GZ1OZ0(i,j)-PSIH(i,j)
  219. TSEA(i)=TSK(i,j)
  220. QSS(i)=QV3D(i,kts,j) ! not used in moninq so set to qv3d for now
  221. HEAT(i)=HFX(i,j)/CPM*RRHOX
  222. EVAP(i)=QFX(i,j)*RRHOX
  223. ! Kwon FOR NEW SHALLOW CONVECTION
  224. HEAT2D(i,j)=HFX(i,j)/CPM*RRHOX
  225. EVAP2D(i,j)=QFX(i,j)*RRHOX
  226. !
  227. STRESS(i)=KARMAN*KARMAN*WSPD(i,j)*WSPD(i,j)/(FMTMP*FMTMP)
  228. SPD1(i)=WSPD(i,j)
  229. PRSI(i,kts)=PSFC(i,j)*.001
  230. PHII(I,kts)=0.
  231. RCL(i)=1.
  232. RBSOIL(I)=BR(i,j)
  233. ENDDO
  234. DO k=kts,kte
  235. DO i=its,ite
  236. DV(I,K) = 0.
  237. DU(I,K) = 0.
  238. TAU(I,K) = 0.
  239. U1(I,K) = U3D(i,k,j)
  240. V1(I,K) = V3D(i,k,j)
  241. T1(I,K) = T3D(i,k,j)
  242. #ifdef NMM_CORE
  243. THRATEN(I,K) = RTHRATEN(I,K,J)
  244. #else
  245. THRATEN(I,K) = 0.0
  246. #endif
  247. Q1(I,K,1) = QV3D(i,k,j)/(1.+QV3D(i,k,j))
  248. Q1(I,K,2) = QC3D(i,k,j)/(1.+QC3D(i,k,j))
  249. PRSL(I,K)=P3D(i,k,j)*.001
  250. ENDDO
  251. ENDDO
  252. DO k=kts,kte
  253. DO i=its,ite
  254. PRSLK(I,K)=(PRSL(i,k)*.01)**ROVCP
  255. ENDDO
  256. ENDDO
  257. DO k=kts+1,kte
  258. km=k-1
  259. DO i=its,ite
  260. DEL(i,km)=PRSL(i,km)/ROVG*dz8w(i,km,j)/T3D(i,km,j)
  261. PRSI(i,k)=PRSI(i,km)-DEL(i,km)
  262. PHII(I,K)=(Z(i,k,j)-Z(i,kts,j))*G
  263. PHIL(I,KM)=0.5*(Z(i,k,j)+Z(i,km,j)-2.*Z(i,kts,j))*G
  264. ENDDO
  265. ENDDO
  266. DO i=its,ite
  267. DEL(i,kte)=DEL(i,ktem)
  268. PRSI(i,ktep)=PRSI(i,kte)-DEL(i,ktem)
  269. PHII(I,KTEP)=PHII(I,KTE)+dz8w(i,kte,j)*G
  270. PHIL(I,KTE)=PHII(I,KTE)-PHIL(I,KTEM)+PHII(I,KTE)
  271. ENDDO
  272. IF (P_QI.ge.P_FIRST_SCALAR) THEN
  273. DO k=kts,kte
  274. DO i=its,ite
  275. Q1(I,K,3) = QI3D(i,k,j)/(1.+QI3D(i,k,j))
  276. ENDDO
  277. ENDDO
  278. ENDIF
  279. DO l=1,ntrac
  280. DO k=kts,kte
  281. DO i=its,ite
  282. RTG(I,K,L) = 0.
  283. ENDDO
  284. ENDDO
  285. ENDDO
  286. !
  287. ! 2010 new gfs pbl
  288. !
  289. call moninq(im,im,km,ntrac,dv,du,tau,rtg, &
  290. & u1,v1,t1,q1,thraten, & !kwon
  291. & psk,rbsoil,fm,fh,tsea,qss,heat,evap,stress,spd1,kpbl, &
  292. & prsi,del,prsl,prslk,phii,phil,rcl,deltim, &
  293. & dusfc,dvsfc,dtsfc,dqsfc,hpbl,hgamt,hgamq)
  294. !============================================================================
  295. ! ADD IN DISSIPATIVE HEATING .... v*dv. This is Bob's doing
  296. !============================================================================
  297. #if (NMM_CORE==1)
  298. IF(DISHEAT)THEN
  299. DO k=kts,kte
  300. DO i=its,ite
  301. dishx(i,k)=u1(i,k)*du(i,k) + v1(i,k)*dv(i,k)
  302. cpmikj=CP*(1.+0.8*QV3D(i,k,j))
  303. dishx(i,k)=-dishx(i,k)/cpmikj
  304. ! IF(k==1)WRITE(0,*)'ADDITIONAL DISSIPATIVE HEATING',tau(i,k),dishx(i,k)
  305. tau(i,k)=tau(i,k)+dishx(i,k)
  306. ENDDO
  307. ENDDO
  308. ENDIF
  309. #endif
  310. !=============================================================================
  311. DO k=kts,kte
  312. DO i=its,ite
  313. RVBLTEN(I,K,J)=DV(I,K)
  314. RUBLTEN(I,K,J)=DU(I,K)
  315. RTHBLTEN(I,K,J)=TAU(I,K)/PI3D(I,K,J)
  316. RQVBLTEN(I,K,J)=RTG(I,K,1)/(1.-Q1(I,K,1))**2
  317. RQCBLTEN(I,K,J)=RTG(I,K,2)/(1.-Q1(I,K,2))**2
  318. ENDDO
  319. ENDDO
  320. IF (P_QI.ge.P_FIRST_SCALAR) THEN
  321. DO k=kts,kte
  322. DO i=its,ite
  323. RQIBLTEN(I,K,J)=RTG(I,K,3)/(1.-Q1(I,K,3))**2
  324. ENDDO
  325. ENDDO
  326. ENDIF
  327. DO i=its,ite
  328. UST(i,j)=SQRT(STRESS(i))
  329. WSPD(i,j)=SQRT(U3D(I,KTS,J)*U3D(I,KTS,J)+ &
  330. V3D(I,KTS,J)*V3D(I,KTS,J))+1.E-9
  331. PBL(i,j)=HPBL(i)
  332. !Kwon For new shallow convection
  333. HPBL2D(i,j)=HPBL(i)
  334. !
  335. KPBL2D(i,j)=kpbl(i)
  336. ENDDO
  337. ENDDO
  338. END SUBROUTINE BL_GFS2011
  339. !===================================================================
  340. SUBROUTINE gfs2011init(RUBLTEN,RVBLTEN,RTHBLTEN,RQVBLTEN, &
  341. RQCBLTEN,RQIBLTEN,P_QI,P_FIRST_SCALAR, &
  342. restart, &
  343. allowed_to_read, &
  344. ids, ide, jds, jde, kds, kde, &
  345. ims, ime, jms, jme, kms, kme, &
  346. its, ite, jts, jte, kts, kte )
  347. !-------------------------------------------------------------------
  348. IMPLICIT NONE
  349. !-------------------------------------------------------------------
  350. LOGICAL , INTENT(IN) :: allowed_to_read,restart
  351. INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
  352. ims, ime, jms, jme, kms, kme, &
  353. its, ite, jts, jte, kts, kte
  354. INTEGER , INTENT(IN) :: P_QI,P_FIRST_SCALAR
  355. REAL , DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(OUT) :: &
  356. RUBLTEN, &
  357. RVBLTEN, &
  358. RTHBLTEN, &
  359. RQVBLTEN, &
  360. RQCBLTEN, &
  361. RQIBLTEN
  362. INTEGER :: i, j, k, itf, jtf, ktf
  363. jtf=min0(jte,jde-1)
  364. ktf=min0(kte,kde-1)
  365. itf=min0(ite,ide-1)
  366. IF(.not.restart)THEN
  367. DO j=jts,jtf
  368. DO k=kts,ktf
  369. DO i=its,itf
  370. RUBLTEN(i,k,j)=0.
  371. RVBLTEN(i,k,j)=0.
  372. RTHBLTEN(i,k,j)=0.
  373. RQVBLTEN(i,k,j)=0.
  374. RQCBLTEN(i,k,j)=0.
  375. ENDDO
  376. ENDDO
  377. ENDDO
  378. ENDIF
  379. IF (P_QI .ge. P_FIRST_SCALAR .and. .not.restart) THEN
  380. DO j=jts,jtf
  381. DO k=kts,ktf
  382. DO i=its,itf
  383. RQIBLTEN(i,k,j)=0.
  384. ENDDO
  385. ENDDO
  386. ENDDO
  387. ENDIF
  388. IF (P_QI .ge. P_FIRST_SCALAR) THEN
  389. DO j=jts,jtf
  390. DO k=kts,ktf
  391. DO i=its,itf
  392. RQIBLTEN(i,k,j)=0.
  393. ENDDO
  394. ENDDO
  395. ENDDO
  396. ENDIF
  397. END SUBROUTINE gfs2011init
  398. ! --------------------------------------------------------------
  399. !======================================================== 2010 NEW GFS PBL
  400. !FPP$ NOCONCUR R
  401. !-----------------------------------------------------------------------
  402. subroutine moninq(ix,im,km,ntrac,dv,du,tau,rtg, &
  403. & uo,vo,t1,q1,thraten, & !kwon
  404. & psk,rbsoil,fm,fh,tsea,qss,heat,evap,stress,spd1,kpbl, &
  405. & prsi,del,prsl,prslk,phii,phil,rcs,deltim, &
  406. & dusfc,dvsfc,dtsfc,dqsfc,hpbl,hgamt,hgamq) !kwon
  407. ! & dusfc,dvsfc,dtsfc,dqsfc,hpbl,hgamt,hgamq,dkt)
  408. !
  409. ! use machine , only : kind_phys
  410. ! use funcphys , only : fpvs
  411. ! use physcons, grav => con_g, rd => con_rd, cp => con_cp &
  412. ! &, hvap => con_hvap, fv => con_fvirt
  413. !
  414. USE MODULE_GFS_MACHINE, ONLY : kind_phys !kwon
  415. ! USE MODULE_GFS_FUNCPHYS, ONLY : fpvs !kwon
  416. USE MODULE_GFS_PHYSCONS, grav => con_g, rd => con_rd, & !kwon
  417. & cp => con_cp, hvap => con_hvap, fv => con_fvirt !kwon
  418. !
  419. implicit none
  420. !
  421. ! include 'constant.h'
  422. !
  423. !
  424. ! arguments
  425. !
  426. integer ix, im, km, ntrac, kpbl(im), kpblx(im)
  427. !
  428. real(kind=kind_phys) deltim
  429. real(kind=kind_phys) dv(im,km), du(im,km), &
  430. & tau(im,km), rtg(im,km,ntrac), &
  431. & uo(ix,km), vo(ix,km), &
  432. & t1(ix,km), q1(ix,km,ntrac), &
  433. & swh(ix,km), hlw(ix,km), &
  434. & xmu(im), &
  435. & psk(im), rbsoil(im), &
  436. ! & cd(im), ch(im), &
  437. & fm(im), fh(im), &
  438. & tsea(im), qss(im), &
  439. & spd1(im), &
  440. ! & dphi(im), spd1(im), &
  441. & prsi(ix,km+1), del(ix,km), &
  442. & prsl(ix,km), prslk(ix,km), &
  443. & phii(ix,km+1), phil(ix,km), &
  444. & rcs(im), dusfc(im), &
  445. & dvsfc(im), dtsfc(im), &
  446. & dqsfc(im), hpbl(im), hpblx(im), &
  447. & hgamt(im), hgamq(im)
  448. ! &, hgamu(im), hgamv(im), hgams(im)
  449. !
  450. ! locals
  451. !
  452. integer i,iprt,is,iun,k,kk,km1,kmpbl,latd,lond
  453. integer lcld(im),icld(im),kcld(im),krad(im)
  454. integer kemx(im)
  455. !
  456. ! real(kind=kind_phys) betaq(im), betat(im), betaw(im),
  457. real(kind=kind_phys) evap(im), heat(im), phih(im), &
  458. & phim(im), rbdn(im), rbup(im), &
  459. & stress(im),beta(im), &
  460. & ustar(im), wscale(im), thermal(im), &
  461. & wstar3(im)
  462. !
  463. real(kind=kind_phys) thvx(im,km), thlvx(im,km),thraten(im,km), & !Kwon
  464. & qlx(im,km), thetae(im,km), &
  465. & qtx(im,km), bf(im,km-1), &
  466. & u1(im,km), v1(im,km), radx(im,km-1), &
  467. & govrth(im), hrad(im), cteit(im), &
  468. ! & hradm(im), radmin(im), vrad(im), &
  469. & radmin(im), vrad(im), &
  470. & zd(im), zdd(im), thlvx1(im)
  471. !
  472. real(kind=kind_phys) rdzt(im,km-1),dktx(im,km-1),dkux(im,km-1), &
  473. & zi(im,km+1), zl(im,km), xkzo(im,km-1), &
  474. & dku(im,km-1), dkt(im,km-1),xkzmo(im,km-1), &
  475. & cku(im,km-1), ckt(im,km-1), &
  476. & al(im,km-1), ad(im,km), &
  477. & au(im,km-1), a1(im,km), &
  478. & a2(im,km*ntrac), theta(im,km)
  479. !
  480. ! real(kind=kind_phys) prinv(im), hpbl01(im), rent(im)
  481. real(kind=kind_phys) prinv(im), rent(im)
  482. !
  483. logical pblflg(im), sfcflg(im), scuflg(im), flg(im)
  484. !
  485. real(kind=kind_phys) aphi16, aphi5, bvf2, wfac, &
  486. & cfac, conq, cont, conw, &
  487. & dk, dkmax, dkmin, &
  488. & dq1, dsdz2, dsdzq, dsdzt, &
  489. & dsdzu, dsdzv, sfac, &
  490. & dsig, dt, dthe1, dtodsd, &
  491. & dtodsu, dw2, dw2min, g, &
  492. & gamcrq, gamcrt, gocp, gor, gravi, &
  493. & hol, hol1, pfac, prmax, prmin, &
  494. & prnum, qmin, tdzmin, qtend, rbcr, &
  495. & rbint, rdt, rdz, qlmin, &
  496. ! & rbint, rdt, rdz, rdzt1, &
  497. & ri, rimin, rl2, rlam, rlamun, &
  498. & rone, rzero, sfcfrac,sflux, &
  499. & shr2, spdk2, sri, &
  500. & tem, ti, ttend, tvd, &
  501. & tvu, utend, vk, vk2, &
  502. & vtend, zfac, vpert, cpert, &
  503. & rentf1, rentf2, radfac, &
  504. & zfmin, zk, tem1, tem2, &
  505. & xkzm, xkzmu, xkzminv, &
  506. & ptem, ptem1, ptem2
  507. !
  508. real(kind=kind_phys) zstblmax,h1, h2, qlcr, actei, &
  509. & cldtime, u01, v01, delu, delv
  510. !
  511. parameter(gravi=1.0/grav)
  512. parameter(g=grav)
  513. parameter(gor=g/rd,gocp=g/cp)
  514. parameter(cont=1000.*cp/g,conq=1000.*hvap/g,conw=1000./g)
  515. parameter(rlam=30.0,vk=0.4,vk2=vk*vk)
  516. parameter(prmin=0.25,prmax=4.)
  517. parameter(dw2min=0.0001,dkmin=0.0,dkmax=1000.,rimin=-100.)
  518. parameter(rbcr=0.25,wfac=7.0,cfac=6.5,pfac=2.0,sfcfrac=0.1)
  519. parameter(qmin=1.e-8,xkzm=1.0,zfmin=1.e-8,aphi5=5.,aphi16=16.)
  520. parameter(tdzmin=1.e-3,qlmin=1.e-12,cpert=0.25,sfac=5.4)
  521. parameter(h1=0.33333333,h2=0.66666667)
  522. parameter(cldtime=500.,xkzmu=3.0,xkzminv=0.3)
  523. ! parameter(gamcrt=3.,gamcrq=2.e-3,rlamun=150.0)
  524. parameter(gamcrt=3.,gamcrq=0.,rlamun=150.0)
  525. parameter(rentf1=0.2,rentf2=1.0,radfac=0.85)
  526. parameter(iun=84)
  527. !
  528. ! parameter (zstblmax = 2500., qlcr=1.0e-5)
  529. ! parameter (zstblmax = 2500., qlcr=3.0e-5)
  530. ! parameter (zstblmax = 2500., qlcr=3.5e-5)
  531. ! parameter (zstblmax = 2500., qlcr=1.0e-4)
  532. parameter (zstblmax = 2500., qlcr=3.5e-5)
  533. ! parameter (actei = 0.23)
  534. parameter (actei = 0.7)
  535. !
  536. !-----------------------------------------------------------------------
  537. !
  538. 601 format(1x,' moninp lat lon step hour ',3i6,f6.1)
  539. 602 format(1x,' k',' z',' t',' th', &
  540. & ' tvh',' q',' u',' v', &
  541. & ' sp')
  542. 603 format(1x,i5,8f9.1)
  543. 604 format(1x,' sfc',9x,f9.1,18x,f9.1)
  544. 605 format(1x,' k zl spd2 thekv the1v' &
  545. & ,' thermal rbup')
  546. 606 format(1x,i5,6f8.2)
  547. 607 format(1x,' kpbl hpbl fm fh hgamt', &
  548. & ' hgamq ws ustar cd ch')
  549. 608 format(1x,i5,9f8.2)
  550. 609 format(1x,' k pr dkt dku ',i5,3f8.2)
  551. 610 format(1x,' k pr dkt dku ',i5,3f8.2,' l2 ri t2', &
  552. & ' sr2 ',2f8.2,2e10.2)
  553. ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  554. ! compute preliminary variables
  555. !
  556. if (ix .lt. im) stop
  557. !
  558. ! iprt = 0
  559. ! if(iprt.eq.1) then
  560. !ccc latd = 0
  561. ! lond = 0
  562. ! else
  563. !ccc latd = 0
  564. ! lond = 0
  565. ! endif
  566. !c
  567. dt = 2. * deltim
  568. rdt = 1. / dt
  569. km1 = km - 1
  570. kmpbl = km / 2
  571. !
  572. do k=1,km
  573. do i=1,im
  574. zi(i,k) = phii(i,k) * gravi
  575. zl(i,k) = phil(i,k) * gravi
  576. u1(i,k) = uo(i,k) * rcs(i)
  577. v1(i,k) = vo(i,k) * rcs(i)
  578. enddo
  579. enddo
  580. do i=1,im
  581. zi(i,km+1) = phii(i,km+1) * gravi
  582. enddo
  583. !c
  584. do k = 1,km1
  585. do i=1,im
  586. rdzt(i,k) = 1.0 / (zl(i,k+1) - zl(i,k))
  587. enddo
  588. enddo
  589. !c
  590. !c vertical background diffusivity
  591. !c
  592. do k = 1,km1
  593. do i=1,im
  594. tem1 = 1.0 - prsi(i,k+1) / prsi(i,1)
  595. tem1 = tem1 * tem1 * 10.0
  596. xkzo(i,k) = xkzm * min(real(1.0,kind=kind_phys), exp(-tem1))
  597. enddo
  598. enddo
  599. !c
  600. !c vertical background diffusivity for momentum
  601. !c
  602. do k = 1,km1
  603. do i=1,im
  604. ptem = prsi(i,k+1) / prsi(i,1)
  605. if(ptem.ge.0.2) then
  606. xkzmo(i,k) = xkzmu
  607. ptem1 = prsi(i,k+1)
  608. else
  609. tem1 = 1.0 - prsi(i,k+1) / ptem1
  610. tem1 = tem1 * tem1 * 5.0
  611. xkzmo(i,k) = xkzmu * min(real(1.0,kind=kind_phys), exp(-tem1))
  612. endif
  613. enddo
  614. enddo
  615. !c
  616. !c diffusivity in the inversion layer is set to be xkzminv (m^2/s)
  617. !c
  618. do k = 1,kmpbl
  619. do i=1,im
  620. ! if(zi(i,k+1).gt.200..and.zi(i,k+1).lt.zstblmax) then
  621. if(zi(i,k+1).gt.250.) then
  622. tem1 = (t1(i,k+1)-t1(i,k)) * rdzt(i,k)
  623. if(tem1 .gt. 1.e-5) then
  624. xkzo(i,k) = min(xkzo(i,k),xkzminv)
  625. endif
  626. endif
  627. enddo
  628. enddo
  629. !c
  630. do i = 1,im
  631. dusfc(i) = 0.
  632. dvsfc(i) = 0.
  633. dtsfc(i) = 0.
  634. dqsfc(i) = 0.
  635. hgamt(i) = 0.
  636. hgamq(i) = 0.
  637. ! hgamu(i) = 0.
  638. ! hgamv(i) = 0.
  639. ! hgams(i) = 0.
  640. wscale(i)= 0.
  641. kpbl(i) = 1
  642. kpblx(i) = 1
  643. hpbl(i) = zi(i,1)
  644. hpblx(i) = zi(i,1)
  645. pblflg(i)= .true.
  646. sfcflg(i)= .true.
  647. if(rbsoil(i).gt.0.0) sfcflg(i) = .false.
  648. scuflg(i)= .true.
  649. if(scuflg(i)) then
  650. radmin(i)= 0.
  651. cteit(i) = 0.
  652. rent(i) = rentf1
  653. hrad(i) = zi(i,1)
  654. ! hradm(i) = zi(i,1)
  655. krad(i) = 1
  656. icld(i) = 0
  657. lcld(i) = km1
  658. kcld(i) = km1
  659. zd(i) = 0.
  660. endif
  661. enddo
  662. !
  663. do k = 1,km
  664. do i = 1,im
  665. theta(i,k) = t1(i,k) * psk(i) / prslk(i,k)
  666. qlx(i,k) = max(q1(i,k,ntrac),qlmin)
  667. qtx(i,k) = max(q1(i,k,1),qmin)+qlx(i,k)
  668. ptem = qlx(i,k)
  669. ptem1 = hvap*max(q1(i,k,1),qmin)/(cp*t1(i,k))
  670. thetae(i,k)= theta(i,k)*(1.+ptem1)
  671. thvx(i,k) = theta(i,k)*(1.+fv*max(q1(i,k,1),qmin)-ptem)
  672. ptem2 = theta(i,k)-(hvap/cp)*ptem
  673. thlvx(i,k) = ptem2*(1.+fv*qtx(i,k))
  674. enddo
  675. enddo
  676. do k = 1,km1
  677. do i = 1,im
  678. dku(i,k) = 0.
  679. dkt(i,k) = 0.
  680. dktx(i,k) = 0.
  681. dkux(i,k) = 0.
  682. cku(i,k) = 0.
  683. ckt(i,k) = 0.
  684. tem = zi(i,k+1)-zi(i,k)
  685. ! radx(i,k) = tem*(swh(i,k)*xmu(i)+hlw(i,k))
  686. radx(i,k) = tem*thraten(i,k) !Kwon
  687. enddo
  688. enddo
  689. !c
  690. do i=1,im
  691. flg(i) = scuflg(i)
  692. enddo
  693. do k = 1, km1
  694. do i=1,im
  695. if(flg(i).and.zl(i,k).ge.zstblmax) then
  696. lcld(i)=k
  697. flg(i)=.false.
  698. endif
  699. enddo
  700. enddo
  701. !c
  702. !c compute buoyancy flux
  703. !c
  704. do k = 1, km1
  705. do i = 1, im
  706. bf(i,k) = (thvx(i,k+1)-thvx(i,k))*rdzt(i,k)
  707. enddo
  708. enddo
  709. !c
  710. do i = 1,im
  711. govrth(i) = g/theta(i,1)
  712. enddo
  713. !c
  714. do i=1,im
  715. beta(i) = dt / (zi(i,2)-zi(i,1))
  716. enddo
  717. !c
  718. do i=1,im
  719. ustar(i) = sqrt(stress(i))
  720. thermal(i) = thvx(i,1)
  721. enddo
  722. !c
  723. !c compute the first guess pbl height
  724. !c
  725. do i=1,im
  726. flg(i) = .false.
  727. rbup(i) = rbsoil(i)
  728. enddo
  729. do k = 2, kmpbl
  730. do i = 1, im
  731. if(.not.flg(i)) then
  732. rbdn(i) = rbup(i)
  733. spdk2 = max((u1(i,k)**2+v1(i,k)**2),real(1.0,kind=kind_phys))
  734. rbup(i) = (thvx(i,k)-thermal(i))* &
  735. & (g*zl(i,k)/thvx(i,1))/spdk2
  736. kpbl(i) = k
  737. flg(i) = rbup(i).gt.rbcr
  738. endif
  739. enddo
  740. enddo
  741. do i = 1,im
  742. k = kpbl(i)
  743. if(rbdn(i).ge.rbcr) then
  744. rbint = 0.
  745. elseif(rbup(i).le.rbcr) then
  746. rbint = 1.
  747. else
  748. rbint = (rbcr-rbdn(i))/(rbup(i)-rbdn(i))
  749. endif
  750. hpbl(i) = zl(i,k-1) + rbint*(zl(i,k)-zl(i,k-1))
  751. if(hpbl(i).lt.zi(i,kpbl(i))) kpbl(i) = kpbl(i) - 1
  752. hpblx(i) = hpbl(i)
  753. kpblx(i) = kpbl(i)
  754. enddo
  755. !c
  756. !c compute similarity parameters
  757. !c
  758. do i=1,im
  759. sflux = heat(i) + evap(i)*fv*theta(i,1)
  760. if(sfcflg(i).and.sflux.gt.0.) then
  761. hol = max(rbsoil(i)*fm(i)*fm(i)/fh(i),rimin)
  762. hol = min(hol,-zfmin)
  763. !c
  764. hol1 = hol*hpbl(i)/zl(i,1)*sfcfrac
  765. ! phim(i) = (1.-aphi16*hol1)**(-1./4.)
  766. ! phih(i) = (1.-aphi16*hol1)**(-1./2.)
  767. tem = 1.0 / (1. - aphi16*hol1)
  768. phih(i) = sqrt(tem)
  769. phim(i) = sqrt(phih(i))
  770. wstar3(i) = govrth(i)*sflux*hpbl(i)
  771. tem1 = ustar(i)**3.
  772. wscale(i) = (tem1+wfac*vk*wstar3(i)*sfcfrac)**h1
  773. ! wscale(i) = ustar(i)/phim(i)
  774. wscale(i) = min(wscale(i),ustar(i)*aphi16)
  775. wscale(i) = max(wscale(i),ustar(i)/aphi5)
  776. else
  777. pblflg(i)=.false.
  778. endif
  779. enddo
  780. !c
  781. !c compute counter-gradient mixing term for heat and moisture
  782. !c
  783. do i = 1,im
  784. if(pblflg(i)) then
  785. hgamt(i) = min(cfac*heat(i)/wscale(i),gamcrt)
  786. hgamq(i) = min(cfac*evap(i)/wscale(i),gamcrq)
  787. vpert = hgamt(i) + hgamq(i)*fv*theta(i,1)
  788. vpert = min(vpert,gamcrt)
  789. thermal(i)= thermal(i)+max(vpert,real(0.0,kind=kind_phys))
  790. hgamt(i) = max(hgamt(i),real(0.0,kind=kind_phys))
  791. hgamq(i) = max(hgamq(i),real(0.0,kind=kind_phys))
  792. endif
  793. enddo
  794. !c
  795. !c compute large-scale mixing term for momentum
  796. !c
  797. ! do i = 1,im
  798. ! flg(i) = pblflg(i)
  799. ! kemx(i)= 1
  800. ! hpbl01(i)= sfcfrac*hpbl(i)
  801. ! enddo
  802. ! do k = 1, kmpbl
  803. ! do i = 1, im
  804. ! if(flg(i).and.zl(i,k).gt.hpbl01(i)) then
  805. ! kemx(i) = k
  806. ! flg(i) = .false.
  807. ! endif
  808. ! enddo
  809. ! enddo
  810. ! do i = 1, im
  811. ! if(pblflg(i)) then
  812. ! kk = kpbl(i)
  813. ! if(kemx(i).le.1) then
  814. ! ptem = u1(i,1)/zl(i,1)
  815. ! ptem1 = v1(i,1)/zl(i,1)
  816. ! u01 = ptem*hpbl01(i)
  817. ! v01 = ptem1*hpbl01(i)
  818. ! else
  819. ! tem = zl(i,kemx(i))-zl(i,kemx(i)-1)
  820. ! ptem = (u1(i,kemx(i))-u1(i,kemx(i)-1))/tem
  821. ! ptem1 = (v1(i,kemx(i))-v1(i,kemx(i)-1))/tem
  822. ! tem1 = hpbl01(i)-zl(i,kemx(i)-1)
  823. ! u01 = u1(i,kemx(i)-1)+ptem*tem1
  824. ! v01 = v1(i,kemx(i)-1)+ptem1*tem1
  825. ! endif
  826. ! if(kk.gt.kemx(i)) then
  827. ! delu = u1(i,kk)-u01
  828. ! delv = v1(i,kk)-v01
  829. ! tem2 = sqrt(delu**2+delv**2)
  830. ! tem2 = max(tem2,0.1)
  831. ! ptem2 = -sfac*ustar(i)*ustar(i)*wstar3(i)
  832. ! 1 /(wscale(i)**4.)
  833. ! hgamu(i) = ptem2*delu/tem2
  834. ! hgamv(i) = ptem2*delv/tem2
  835. ! tem = sqrt(u1(i,kk)**2+v1(i,kk)**2)
  836. ! tem1 = sqrt(u01**2+v01**2)
  837. ! ptem = tem - tem1
  838. ! if(ptem.gt.0.) then
  839. ! hgams(i)=-sfac*vk*sfcfrac*wstar3(i)/(wscale(i)**3.)
  840. ! else
  841. ! hgams(i)=sfac*vk*sfcfrac*wstar3(i)/(wscale(i)**3.)
  842. ! endif
  843. ! else
  844. ! hgams(i) = 0.
  845. ! endif
  846. ! endif
  847. ! enddo
  848. !c
  849. !c enhance the pbl height by considering the thermal excess
  850. !c
  851. do i=1,im
  852. flg(i) = .true.
  853. if(pblflg(i)) then
  854. flg(i) = .false.
  855. rbup(i) = rbsoil(i)
  856. endif
  857. enddo
  858. do k = 2, kmpbl
  859. do i = 1, im
  860. if(.not.flg(i)) then
  861. rbdn(i) = rbup(i)
  862. spdk2 = max((u1(i,k)**2+v1(i,k)**2),real(1.0,kind=kind_phys))
  863. rbup(i) = (thvx(i,k)-thermal(i))* &
  864. & (g*zl(i,k)/thvx(i,1))/spdk2
  865. kpbl(i) = k
  866. flg(i) = rbup(i).gt.rbcr
  867. endif
  868. enddo
  869. enddo
  870. do i = 1,im
  871. if(pblflg(i)) then
  872. k = kpbl(i)
  873. if(rbdn(i).ge.rbcr) then
  874. rbint = 0.
  875. elseif(rbup(i).le.rbcr) then
  876. rbint = 1.
  877. else
  878. rbint = (rbcr-rbdn(i))/(rbup(i)-rbdn(i))
  879. endif
  880. hpbl(i) = zl(i,k-1) + rbint*(zl(i,k)-zl(i,k-1))
  881. if(hpbl(i).lt.zi(i,kpbl(i))) kpbl(i) = kpbl(i) - 1
  882. if(kpbl(i).le.1) pblflg(i) = .false.
  883. endif
  884. enddo
  885. !c
  886. !c look for stratocumulus
  887. !c
  888. do i = 1, im
  889. flg(i)=scuflg(i)
  890. enddo
  891. do k = kmpbl,1,-1
  892. do i = 1, im
  893. if(flg(i).and.k.le.lcld(i)) then
  894. if(qlx(i,k).ge.qlcr) then
  895. kcld(i)=k
  896. flg(i)=.false.
  897. endif
  898. endif
  899. enddo
  900. enddo
  901. do i = 1, im
  902. if(scuflg(i).and.kcld(i).eq.km1) scuflg(i)=.false.
  903. enddo
  904. !c
  905. do i = 1, im
  906. flg(i)=scuflg(i)
  907. enddo
  908. do k = kmpbl,1,-1
  909. do i = 1, im
  910. if(flg(i).and.k.le.kcld(i)) then
  911. if(qlx(i,k).ge.qlcr) then
  912. if(radx(i,k).lt.radmin(i)) then
  913. radmin(i)=radx(i,k)
  914. krad(i)=k
  915. endif
  916. else
  917. flg(i)=.false.
  918. endif
  919. endif
  920. enddo
  921. enddo
  922. do i = 1, im
  923. if(scuflg(i).and.krad(i).le.1) scuflg(i)=.false.
  924. if(scuflg(i).and.radmin(i).ge.0.) scuflg(i)=.false.
  925. enddo
  926. !c
  927. do i = 1, im
  928. flg(i)=scuflg(i)
  929. enddo
  930. do k = kmpbl,2,-1
  931. do i = 1, im
  932. if(flg(i).and.k.le.krad(i)) then
  933. if(qlx(i,k).ge.qlcr) then
  934. icld(i)=icld(i)+1
  935. else
  936. flg(i)=.false.
  937. endif
  938. endif
  939. enddo
  940. enddo
  941. do i = 1, im
  942. if(scuflg(i).and.icld(i).lt.1) scuflg(i)=.false.
  943. enddo
  944. !c
  945. do i = 1, im
  946. if(scuflg(i)) then
  947. hrad(i) = zi(i,krad(i)+1)
  948. ! hradm(i)= zl(i,krad(i))
  949. endif
  950. enddo
  951. !c
  952. do i = 1, im
  953. if(scuflg(i).and.hrad(i).lt.zi(i,2)) scuflg(i)=.false.
  954. enddo
  955. !c
  956. do i = 1, im
  957. if(scuflg(i)) then
  958. k = krad(i)
  959. tem = zi(i,k+1)-zi(i,k)
  960. tem1 = cldtime*radmin(i)/tem
  961. thlvx1(i) = thlvx(i,k)+tem1
  962. ! if(thlvx1(i).gt.thlvx(i,k-1)) scuflg(i)=.false.
  963. endif
  964. enddo
  965. !c
  966. do i = 1, im
  967. flg(i)=scuflg(i)
  968. enddo
  969. do k = kmpbl,1,-1
  970. do i = 1, im
  971. if(flg(i).and.k.le.krad(i))then
  972. if(thlvx1(i).le.thlvx(i,k))then
  973. tem=zi(i,k+1)-zi(i,k)
  974. zd(i)=zd(i)+tem
  975. else
  976. flg(i)=.false.
  977. endif
  978. endif
  979. enddo
  980. enddo
  981. do i = 1, im
  982. if(scuflg(i))then
  983. kk = max(1, krad(i)+1-icld(i))
  984. zdd(i) = hrad(i)-zi(i,kk)
  985. endif
  986. enddo
  987. do i = 1, im
  988. if(scuflg(i))then
  989. zd(i) = max(zd(i),zdd(i))
  990. zd(i) = min(zd(i),hrad(i))
  991. tem = govrth(i)*zd(i)*(-radmin(i))
  992. vrad(i)= tem**h1
  993. endif
  994. enddo
  995. !c
  996. !c compute inverse Prandtl number
  997. !c
  998. do i = 1, im
  999. if(pblflg(i)) then
  1000. tem = phih(i)/phim(i)+cfac*vk*sfcfrac
  1001. ! prinv(i) = (1.0-hgams(i))/tem
  1002. prinv(i) = 1.0 / tem
  1003. prinv(i) = min(prinv(i),prmax)
  1004. prinv(i) = max(prinv(i),prmin)
  1005. endif
  1006. enddo
  1007. !c
  1008. !c compute diffusion coefficients below pbl
  1009. !c
  1010. do k = 1, kmpbl
  1011. do i=1,im
  1012. if(pblflg(i).and.k.lt.kpbl(i)) then
  1013. ! zfac = max((1.-(zi(i,k+1)-zl(i,1))/
  1014. ! 1 (hpbl(i)-zl(i,1))), zfmin)
  1015. zfac = max((1.-zi(i,k+1)/hpbl(i)), zfmin)
  1016. tem = wscale(i)*vk*zi(i,k+1)*zfac**pfac
  1017. ! dku(i,k) = xkzo(i,k)+wscale(i)*vk*zi(i,k+1)
  1018. ! 1 *zfac**pfac
  1019. dku(i,k) = xkzmo(i,k) + tem
  1020. dkt(i,k) = xkzo(i,k) + tem * prinv(i)
  1021. dku(i,k) = min(dku(i,k),dkmax)
  1022. ! dku(i,k) = max(dku(i,k),xkzmo(i,k))
  1023. dkt(i,k) = min(dkt(i,k),dkmax)
  1024. ! dkt(i,k) = max(dkt(i,k),xkzo(i,k))
  1025. dktx(i,k)= dkt(i,k)
  1026. dkux(i,k)= dku(i,k)
  1027. endif
  1028. enddo
  1029. enddo
  1030. !c
  1031. !c compute diffusion coefficients based on local scheme
  1032. !c
  1033. do i = 1, im
  1034. if(.not.pblflg(i)) then
  1035. kpbl(i) = 1
  1036. endif
  1037. enddo
  1038. do k = 1, km1
  1039. do i=1,im
  1040. if(k.ge.kpbl(i)) then
  1041. rdz = rdzt(i,k)
  1042. ti = 2./(t1(i,k)+t1(i,k+1))
  1043. dw2 = (u1(i,k)-u1(i,k+1))**2 &
  1044. & +(v1(i,k)-v1(i,k+1))**2
  1045. shr2 = max(dw2,dw2min)*rdz*rdz
  1046. bvf2 = g*bf(i,k)*ti
  1047. ri = max(bvf2/shr2,rimin)
  1048. zk = vk*zi(i,k+1)
  1049. if(ri.lt.0.) then ! unstable regime
  1050. rl2 = zk*rlamun/(rlamun+zk)
  1051. dk = rl2*rl2*sqrt(shr2)
  1052. sri = sqrt(-ri)
  1053. dku(i,k) = xkzmo(i,k) + dk*(1+8.*(-ri)/(1+1.746*sri))
  1054. dkt(i,k) = xkzo(i,k) + dk*(1+8.*(-ri)/(1+1.286*sri))
  1055. else ! stable regime
  1056. rl2 = zk*rlam/(rlam+zk)
  1057. !! tem = rlam * sqrt(0.01*prsi(i,k))
  1058. !! rl2 = zk*tem/(tem+zk)
  1059. dk = rl2*rl2*sqrt(shr2)
  1060. tem1 = dk/(1+5.*ri)**2
  1061. if(k.ge.kpblx(i)) then
  1062. prnum = 1.0 + 2.1*ri
  1063. prnum = min(prnum,prmax)
  1064. else
  1065. prnum = 1.0
  1066. endif
  1067. dkt(i,k) = xkzo(i,k) + tem1
  1068. dku(i,k) = xkzmo(i,k) + tem1 * prnum
  1069. endif
  1070. !c
  1071. dku(i,k) = min(dku(i,k),dkmax)
  1072. ! dku(i,k) = max(dku(i,k),xkzmo(i,k))
  1073. dkt(i,k) = min(dkt(i,k),dkmax)
  1074. ! dkt(i,k) = max(dkt(i,k),xkzo(i,k))
  1075. !c
  1076. endif
  1077. !c
  1078. enddo
  1079. enddo
  1080. !c
  1081. !c compute diffusion coefficients for cloud-top driven diffusion
  1082. !c if the condition for cloud-top instability is met,
  1083. !c increase entrainment flux at cloud top
  1084. !c
  1085. do i = 1, im
  1086. if(scuflg(i)) then
  1087. k = krad(i)
  1088. tem = thetae(i,k) - thetae(i,k+1)
  1089. tem1 = qtx(i,k) - qtx(i,k+1)
  1090. if (tem.gt.0..and.tem1.gt.0.) then
  1091. cteit(i)= cp*tem/(hvap*tem1)
  1092. if(cteit(i).gt.actei) rent(i) = rentf2
  1093. endif
  1094. endif
  1095. enddo
  1096. do i = 1, im
  1097. if(scuflg(i)) then
  1098. k = krad(i)
  1099. tem1 = max(bf(i,k),tdzmin)
  1100. ckt(i,k) = -rent(i)*radmin(i)/tem1
  1101. cku(i,k) = ckt(i,k)
  1102. endif
  1103. enddo
  1104. !c
  1105. do k = 1, kmpbl
  1106. do i=1,im
  1107. if(scuflg(i).and.k.lt.krad(i)) then
  1108. tem1=hrad(i)-zd(i)
  1109. tem2=zi(i,k+1)-tem1
  1110. if(tem2.gt.0.) then
  1111. ptem= tem2/zd(i)
  1112. if(ptem.ge.1.) ptem= 1.
  1113. ptem= tem2*ptem*sqrt(1.-ptem)
  1114. ckt(i,k) = radfac*vk*vrad(i)*ptem
  1115. cku(i,k) = 0.75*ckt(i,k)
  1116. ckt(i,k) = max(ckt(i,k),dkmin)
  1117. ckt(i,k) = min(ckt(i,k),dkmax)
  1118. cku(i,k) = max(cku(i,k),dkmin)
  1119. cku(i,k) = min(cku(i,k),dkmax)
  1120. endif
  1121. endif
  1122. enddo
  1123. enddo
  1124. !
  1125. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  1126. !
  1127. do k = 1, kmpbl
  1128. do i=1,im
  1129. if(scuflg(i)) then
  1130. dkt(i,k) = dkt(i,k)+ckt(i,k)
  1131. dku(i,k) = dku(i,k)+cku(i,k)
  1132. dkt(i,k) = min(dkt(i,k),dkmax)
  1133. dku(i,k) = min(dku(i,k),dkmax)
  1134. endif
  1135. enddo
  1136. enddo
  1137. !c
  1138. !c compute tridiagonal matrix elements for heat and moisture
  1139. !c
  1140. do i=1,im
  1141. ad(i,1) = 1.
  1142. a1(i,1) = t1(i,1) + beta(i) * heat(i)
  1143. a2(i,1) = q1(i,1,1) + beta(i) * evap(i)
  1144. enddo
  1145. if(ntrac.ge.2) then
  1146. do k = 2, ntrac
  1147. is = (k-1) * km
  1148. do i = 1, im
  1149. a2(i,1+is) = q1(i,1,k)
  1150. enddo
  1151. enddo
  1152. endif
  1153. !c
  1154. do k = 1,km1
  1155. do i = 1,im
  1156. dtodsd = dt/del(i,k)
  1157. dtodsu = dt/del(i,k+1)
  1158. dsig = prsl(i,k)-prsl(i,k+1)
  1159. ! rdz = rdzt(i,k)*2./(t1(i,k)+t1(i,k+1))
  1160. rdz = rdzt(i,k)
  1161. tem1 = dsig * dkt(i,k) * rdz
  1162. if(pblflg(i).and.k.lt.kpbl(i)) then
  1163. ! dsdzt = dsig*dkt(i,k)*rdz*(gocp-hgamt(i)/hpbl(i))
  1164. ! dsdzq = dsig*dkt(i,k)*rdz*(-hgamq(i)/hpbl(i))
  1165. ptem1 = dsig * dktx(i,k) * rdz
  1166. tem = 1.0 / hpbl(i)
  1167. dsdzt = tem1 * gocp - ptem1*hgamt(i)*tem
  1168. dsdzq = ptem1 * (-hgamq(i)*tem)
  1169. a2(i,k) = a2(i,k)+dtodsd*dsdzq
  1170. a2(i,k+1) = q1(i,k+1,1)-dtodsu*dsdzq
  1171. else
  1172. ! dsdzt = dsig*dkt(i,k)*rdz*(gocp)
  1173. dsdzt = tem1 * gocp
  1174. a2(i,k+1) = q1(i,k+1,1)
  1175. endif
  1176. ! dsdz2 = dsig*dkt(i,k)*rdz*rdz
  1177. dsdz2 = tem1 * rdz
  1178. au(i,k) = -dtodsd*dsdz2
  1179. al(i,k) = -dtodsu*dsdz2
  1180. ad(i,k) = ad(i,k)-au(i,k)
  1181. ad(i,k+1) = 1.-al(i,k)
  1182. a1(i,k) = a1(i,k)+dtodsd*dsdzt
  1183. a1(i,k+1) = t1(i,k+1)-dtodsu*dsdzt
  1184. enddo
  1185. enddo
  1186. if(ntrac.ge.2) then
  1187. do kk = 2, ntrac
  1188. is = (kk-1) * km
  1189. do k = 1, km1
  1190. do i = 1, im
  1191. a2(i,k+1+is) = q1(i,k+1,kk)
  1192. enddo
  1193. enddo
  1194. enddo
  1195. endif
  1196. !c
  1197. !c solve tridiagonal problem for heat and moisture
  1198. !c
  1199. call tridin(im,km,ntrac,al,ad,au,a1,a2,au,a1,a2)
  1200. !c
  1201. !c recover tendencies of heat and moisture
  1202. !c
  1203. do k = 1,km
  1204. do i = 1,im
  1205. ttend = (a1(i,k)-t1(i,k))*rdt
  1206. qtend = (a2(i,k)-q1(i,k,1))*rdt
  1207. tau(i,k) = tau(i,k)+ttend
  1208. rtg(i,k,1) = rtg(i,k,1)+qtend
  1209. dtsfc(i) = dtsfc(i)+cont*del(i,k)*ttend
  1210. dqsfc(i) = dqsfc(i)+conq*del(i,k)*qtend
  1211. enddo
  1212. enddo
  1213. if(ntrac.ge.2) then
  1214. do kk = 2, ntrac
  1215. is = (kk-1) * km
  1216. do k = 1, km
  1217. do i = 1, im
  1218. qtend = (a2(i,k+is)-q1(i,k,kk))*rdt
  1219. rtg(i,k,kk) = rtg(i,k,kk)+qtend
  1220. enddo
  1221. enddo
  1222. enddo
  1223. endif
  1224. !c
  1225. !c compute tridiagonal matrix elements for momentum
  1226. !c
  1227. do i=1,im
  1228. ad(i,1) = 1.0 + beta(i) * stress(i) / spd1(i)
  1229. a1(i,1) = u1(i,1)
  1230. a2(i,1) = v1(i,1)
  1231. enddo
  1232. !c
  1233. do k = 1,km1
  1234. do i=1,im
  1235. dtodsd = dt/del(i,k)
  1236. dtodsu = dt/del(i,k+1)
  1237. dsig = prsl(i,k)-prsl(i,k+1)
  1238. rdz = rdzt(i,k)
  1239. tem1 = dsig*dku(i,k)*rdz
  1240. ! if(pblflg(i).and.k.lt.kpbl(i))then
  1241. ! ptem1 = dsig*dkux(i,k)*rdz
  1242. ! dsdzu = ptem1*(-hgamu(i)/hpbl(i))
  1243. ! dsdzv = ptem1*(-hgamv(i)/hpbl(i))
  1244. ! a1(i,k) = a1(i,k)+dtodsd*dsdzu
  1245. ! a1(i,k+1) = u1(i,k+1)-dtodsu*dsdzu
  1246. ! a2(i,k) = a2(i,k)+dtodsd*dsdzv
  1247. ! a2(i,k+1) = v1(i,k+1)-dtodsu*dsdzv
  1248. ! else
  1249. a1(i,k+1) = u1(i,k+1)
  1250. a2(i,k+1) = v1(i,k+1)
  1251. ! endif
  1252. ! dsdz2 = dsig*dku(i,k)*rdz*rdz
  1253. dsdz2 = tem1*rdz
  1254. au(i,k) = -dtodsd*dsdz2
  1255. al(i,k) = -dtodsu*dsdz2
  1256. ad(i,k) = ad(i,k)-au(i,k)
  1257. ad(i,k+1) = 1.-al(i,k)
  1258. enddo
  1259. enddo
  1260. !c
  1261. !c solve tridiagonal problem for momentum
  1262. !c
  1263. call tridi2(im,km,al,ad,au,a1,a2,au,a1,a2)
  1264. !c
  1265. !c recover tendencies of momentum
  1266. !c
  1267. do k = 1,km
  1268. do i = 1,im
  1269. ptem = 1./rcs(i)
  1270. utend = (a1(i,k)-u1(i,k))*rdt
  1271. vtend = (a2(i,k)-v1(i,k))*rdt
  1272. du(i,k) = du(i,k)+utend*ptem
  1273. dv(i,k) = dv(i,k)+vtend*ptem
  1274. dusfc(i) = dusfc(i)+conw*del(i,k)*utend
  1275. dvsfc(i) = dvsfc(i)+conw*del(i,k)*vtend
  1276. enddo
  1277. enddo
  1278. !c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  1279. !c pbl height for diagnostic purpose
  1280. !c
  1281. do i = 1, im
  1282. hpbl(i) = hpblx(i)
  1283. kpbl(i) = kpblx(i)
  1284. enddo
  1285. !c
  1286. !c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  1287. return
  1288. end subroutine moninq
  1289. !FPP$ NOCONCUR R
  1290. !-----------------------------------------------------------------------
  1291. SUBROUTINE TRIDI2(L,N,CL,CM,CU,R1,R2,AU,A1,A2)
  1292. !sela %INCLUDE DBTRIDI2;
  1293. !
  1294. USE MODULE_GFS_MACHINE, ONLY : kind_phys
  1295. implicit none
  1296. integer k,n,l,i
  1297. real(kind=kind_phys) fk
  1298. !
  1299. real(kind=kind_phys) CL(L,2:N),CM(L,N),CU(L,N-1),R1(L,N),R2(L,N), &
  1300. & AU(L,N-1),A1(L,N),A2(L,N)
  1301. !-----------------------------------------------------------------------
  1302. DO I=1,L
  1303. FK = 1./CM(I,1)
  1304. AU(I,1) = FK*CU(I,1)
  1305. A1(I,1) = FK*R1(I,1)
  1306. A2(I,1) = FK*R2(I,1)
  1307. ENDDO
  1308. DO K=2,N-1
  1309. DO I=1,L
  1310. FK = 1./(CM(I,K)-CL(I,K)*AU(I,K-1))
  1311. AU(I,K) = FK*CU(I,K)
  1312. A1(I,K) = FK*(R1(I,K)-CL(I,K)*A1(I,K-1))
  1313. A2(I,K) = FK*(R2(I,K)-CL(I,K)*A2(I,K-1))
  1314. ENDDO
  1315. ENDDO
  1316. DO I=1,L
  1317. FK = 1./(CM(I,N)-CL(I,N)*AU(I,N-1))
  1318. A1(I,N) = FK*(R1(I,N)-CL(I,N)*A1(I,N-1))
  1319. A2(I,N) = FK*(R2(I,N)-CL(I,N)*A2(I,N-1))
  1320. ENDDO
  1321. DO K=N-1,1,-1
  1322. DO I=1,L
  1323. A1(I,K) = A1(I,K)-AU(I,K)*A1(I,K+1)
  1324. A2(I,K) = A2(I,K)-AU(I,K)*A2(I,K+1)
  1325. ENDDO
  1326. ENDDO
  1327. !-----------------------------------------------------------------------
  1328. RETURN
  1329. END SUBROUTINE TRIDI2
  1330. !FPP$ NOCONCUR R
  1331. !-----------------------------------------------------------------------
  1332. SUBROUTINE TRIDIN(L,N,nt,CL,CM,CU,R1,R2,AU,A1,A2)
  1333. !sela %INCLUDE DBTRIDI2;
  1334. !
  1335. USE MODULE_GFS_MACHINE, ONLY : kind_phys
  1336. implicit none
  1337. integer is,k,kk,n,nt,l,i
  1338. real(kind=kind_phys) fk(L)
  1339. !
  1340. real(kind=kind_phys) CL(L,2:N), CM(L,N), CU(L,N-1), &
  1341. & R1(L,N), R2(L,N*nt), &
  1342. & AU(L,N-1), A1(L,N), A2(L,N*nt), &
  1343. & FKK(L,2:N-1)
  1344. !-----------------------------------------------------------------------
  1345. DO I=1,L
  1346. FK(I) = 1./CM(I,1)
  1347. AU(I,1) = FK(I)*CU(I,1)
  1348. A1(I,1) = FK(I)*R1(I,1)
  1349. ENDDO
  1350. do k = 1, nt
  1351. is = (k-1) * n
  1352. do i = 1, l
  1353. a2(i,1+is) = fk(I) * r2(i,1+is)
  1354. enddo
  1355. enddo
  1356. DO K=2,N-1
  1357. DO I=1,L
  1358. FKK(I,K) = 1./(CM(I,K)-CL(I,K)*AU(I,K-1))
  1359. AU(I,K) = FKK(I,K)*CU(I,K)
  1360. A1(I,K) = FKK(I,K)*(R1(I,K)-CL(I,K)*A1(I,K-1))
  1361. ENDDO
  1362. ENDDO
  1363. do kk = 1, nt
  1364. is = (kk-1) * n
  1365. DO K=2,N-1

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