PageRenderTime 63ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/wrfv2_fire/phys/module_bl_acm.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 1210 lines | 722 code | 153 blank | 335 comment | 1 complexity | 596dc859b7d9c664a4454fbd0a5733c4 MD5 | raw file
Possible License(s): AGPL-1.0
  1. !WRF:MODEL_LAYER:PHYSICS
  2. !
  3. MODULE module_bl_acm
  4. ! USE module_model_constants
  5. REAL, PARAMETER :: RIC = 0.25 ! critical Richardson number
  6. REAL, PARAMETER :: CRANKP = 0.5 ! CRANK-NIC PARAMETER
  7. CONTAINS
  8. !-----------------------------------------------------------------------
  9. !-----------------------------------------------------------------------
  10. SUBROUTINE ACMPBL(XTIME, DTPBL, ZNW, SIGMAH, &
  11. U3D, V3D, PP3D, DZ8W, TH3D, T3D, &
  12. QV3D, QC3D, QI3D, RR3D, &
  13. UST, HFX, QFX, TSK, &
  14. PSFC, EP1, G, &
  15. ROVCP, RD, CPD, &
  16. PBLH, KPBL2D, REGIME, &
  17. GZ1OZ0, WSPD, PSIM, MUT, &
  18. RUBLTEN, RVBLTEN, RTHBLTEN, &
  19. RQVBLTEN, RQCBLTEN, RQIBLTEN, &
  20. ids,ide, jds,jde, kds,kde, &
  21. ims,ime, jms,jme, kms,kme, &
  22. its,ite, jts,jte, kts,kte)
  23. !-----------------------------------------------------------------------
  24. !-----------------------------------------------------------------------
  25. ! THIS MODULE COMPUTES VERTICAL MIXING IN AND ABOVE THE PBL ACCORDING TO
  26. ! THE ASYMMETRICAL CONVECTIVE MODEL, VERSION 2 (ACM2), WHICH IS A COMBINED
  27. ! LOCAL NON-LOCAL CLOSURE SCHEME BASED ON THE ORIGINAL ACM (PLEIM AND CHANG 1992)
  28. !
  29. ! REFERENCES:
  30. ! Pleim (2007) A combined local and non-local closure model for the atmospheric
  31. ! boundary layer. Part1: Model description and testing.
  32. ! JAMC, 46, 1383-1395
  33. ! Pleim (2007) A combined local and non-local closure model for the atmospheric
  34. ! boundary layer. Part2: Application and evaluation in a mesoscale
  35. ! meteorology model. JAMC, 46, 1396-1409
  36. !
  37. ! REVISION HISTORY:
  38. ! AX 3/2005 - developed WRF version based on the MM5 PX LSM
  39. ! RG and JP 7/2006 - Finished WRF adaptation
  40. ! JP 12/2011 12/2011 - ACM2 modified so it's not dependent on first layer thickness.
  41. !
  42. !**********************************************************************
  43. ! ARGUMENT LIST:
  44. !
  45. !... Inputs:
  46. !-- XTIME Time since simulation start (min)
  47. !-- DTPBL PBL time step
  48. !-- ZNW Sigma at full layer
  49. !-- SIGMAH Sigma at half layer
  50. !-- U3D 3D u-velocity interpolated to theta points (m/s)
  51. !-- V3D 3D v-velocity interpolated to theta points (m/s)
  52. !-- PP3D Pressure at half levels (Pa)
  53. !-- DZ8W dz between full levels (m)
  54. !-- TH3D Potential Temperature (K)
  55. !-- T3D Temperature (K)
  56. !-- QV3D 3D water vapor mixing ratio (Kg/Kg)
  57. !-- QC3D 3D cloud mixing ratio (Kg/Kg)
  58. !-- QI3D 3D ice mixing ratio (Kg/Kg)
  59. !-- RR3D 3D dry air density (kg/m^3)
  60. !-- UST Friction Velocity (m/s)
  61. !-- HFX Upward heat flux at the surface (w/m^2)
  62. !-- QFX Upward moisture flux at the surface (Kg/m^2/s)
  63. !-- TSK Surface temperature (K)
  64. !-- PSFC Pressure at the surface (Pa)
  65. !-- EP1 Constant for virtual temperature (r_v/r_d-1) (dimensionless)
  66. !-- G Gravity (m/s^2)
  67. !-- ROVCP r/cp
  68. !-- RD gas constant for dry air (j/kg/k)
  69. !-- CPD heat capacity at constant pressure for dry air (j/kg/k)
  70. !-- GZ1OZ0 log(z/z0) where z0 is roughness length
  71. !-- WSPD wind speed at lowest model level (m/s)
  72. !-- PSIM similarity stability function for momentum
  73. !-- MUT Total Mu : Psfc - Ptop
  74. !-- ids start index for i in domain
  75. !-- ide end index for i in domain
  76. !-- jds start index for j in domain
  77. !-- jde end index for j in domain
  78. !-- kds start index for k in domain
  79. !-- kde end index for k in domain
  80. !-- ims start index for i in memory
  81. !-- ime end index for i in memory
  82. !-- jms start index for j in memory
  83. !-- jme end index for j in memory
  84. !-- kms start index for k in memory
  85. !-- kme end index for k in memory
  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. !... Outputs:
  92. !-- PBLH PBL height (m)
  93. !-- KPBL2D K index for PBL layer
  94. !-- REGIME Flag indicating PBL regime (stable, unstable, etc.)
  95. !-- RUBLTEN U tendency due to PBL parameterization (m/s^2)
  96. !-- RVBLTEN V tendency due to PBL parameterization (m/s^2)
  97. !-- RTHBLTEN Theta tendency due to PBL parameterization (K/s)
  98. !-- RQVBLTEN Qv tendency due to PBL parameterization (kg/kg/s)
  99. !-- RQCBLTEN Qc tendency due to PBL parameterization (kg/kg/s)
  100. !-- RQIBLTEN Qi tendency due to PBL parameterization (kg/kg/s)
  101. !-----------------------------------------------------------------------
  102. !-----------------------------------------------------------------------
  103. IMPLICIT NONE
  104. !.......Arguments
  105. ! DECLARATIONS - INTEGER
  106. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
  107. ims,ime, jms,jme, kms,kme, &
  108. its,ite, jts,jte, kts,kte, XTIME
  109. ! DECLARATIONS - REAL
  110. REAL, INTENT(IN) :: DTPBL, EP1, &
  111. G, ROVCP, RD, CPD
  112. REAL, DIMENSION( kms:kme ), INTENT(IN) :: ZNW, SIGMAH
  113. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
  114. INTENT(IN) :: U3D, V3D, &
  115. PP3D, DZ8W, T3D, &
  116. QV3D, QC3D, QI3D, &
  117. RR3D, TH3D
  118. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: PSIM, GZ1OZ0, &
  119. HFX, QFX, TSK, &
  120. PSFC, WSPD, MUT
  121. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: PBLH, REGIME, UST
  122. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
  123. INTENT(INOUT) :: RUBLTEN, RVBLTEN, &
  124. RTHBLTEN, RQVBLTEN, &
  125. RQCBLTEN, RQIBLTEN
  126. INTEGER, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: KPBL2D
  127. !... Local Variables
  128. !... Integer
  129. INTEGER :: J, K
  130. !... Real
  131. REAL, DIMENSION( kts:kte ) :: DSIGH, DSIGHI, DSIGFI
  132. REAL, DIMENSION( 0:kte ) :: SIGMAF
  133. REAL RDT
  134. REAL, PARAMETER :: KARMAN = 0.4
  135. !...
  136. RDT = 1.0 / DTPBL
  137. DO K = 1, kte
  138. SIGMAF(K-1) = ZNW(K)
  139. ENDDO
  140. SIGMAF(kte) = 0.0
  141. DO K = 1, kte
  142. DSIGH(K) = SIGMAF(K) - SIGMAF(K-1)
  143. DSIGHI(K) = 1.0 / DSIGH(K)
  144. ENDDO
  145. DO K = kts,kte-1
  146. DSIGFI(K) = 1.0 / (SIGMAH(K+1) - SIGMAH(K))
  147. ENDDO
  148. DSIGFI(kte) = DSIGFI(kte-1)
  149. DO j = jts,jte
  150. CALL ACM2D(j=J,xtime=XTIME, dtpbl=DTPBL, sigmaf=SIGMAF, sigmah=SIGMAH &
  151. ,dsigfi=DSIGFI,dsighi=DSIGHI,dsigh=DSIGH &
  152. ,us=u3d(ims,kms,j),vs=v3d(ims,kms,j) &
  153. ,theta=th3d(ims,kms,j),tt=t3d(ims,kms,j) &
  154. ,qvs=qv3d(ims,kms,j),qcs=qc3d(ims,kms,j) &
  155. ,qis=qi3d(ims,kms,j),dzf=DZ8W(ims,kms,j) &
  156. ,densx=RR3D(ims,kms,j) &
  157. ,utnp=rublten(ims,kms,j),vtnp=rvblten(ims,kms,j) &
  158. ,ttnp=rthblten(ims,kms,j),qvtnp=rqvblten(ims,kms,j) &
  159. ,qctnp=rqcblten(ims,kms,j),qitnp=rqiblten(ims,kms,j) &
  160. ,cpd=cpd,g=g,rovcp=rovcp,rd=rd,rdt=rdt &
  161. ,psfcpa=psfc(ims,j),ust=ust(ims,j) &
  162. ,pbl=pblh(ims,j) &
  163. ,regime=regime(ims,j),psim=psim(ims,j) &
  164. ,hfx=hfx(ims,j),qfx=qfx(ims,j) &
  165. ,tg=tsk(ims,j),gz1oz0=gz1oz0(ims,j) &
  166. ,wspd=wspd(ims,j) ,klpbl=kpbl2d(ims,j) &
  167. ,mut=mut(ims,j) &
  168. ,ep1=ep1,karman=karman &
  169. ,ids=ids,ide=ide, jds=jds,jde=jde, kds=kds,kde=kde &
  170. ,ims=ims,ime=ime, jms=jms,jme=jme, kms=kms,kme=kme &
  171. ,its=its,ite=ite, jts=jts,jte=jte, kts=kts,kte=kte )
  172. ENDDO
  173. END SUBROUTINE ACMPBL
  174. !-----------------------------------------------------------------------
  175. !-----------------------------------------------------------------------
  176. !-----------------------------------------------------------------------
  177. !-----------------------------------------------------------------------
  178. SUBROUTINE ACM2D(j,XTIME, DTPBL, sigmaf, sigmah &
  179. ,dsigfi,dsighi,dsigh &
  180. ,us,vs,theta,tt,qvs,qcs,qis &
  181. ,dzf,densx,utnp,vtnp,ttnp,qvtnp,qctnp,qitnp &
  182. ,cpd,g,rovcp,rd,rdt,psfcpa,ust &
  183. ,pbl,regime,psim &
  184. ,hfx,qfx,tg,gz1oz0,wspd ,klpbl &
  185. ,mut &
  186. ,ep1,karman &
  187. ,ids,ide, jds,jde, kds,kde &
  188. ,ims,ime, jms,jme, kms,kme &
  189. ,its,ite, jts,jte, kts,kte )
  190. !-----------------------------------------------------------------------
  191. !-----------------------------------------------------------------------
  192. IMPLICIT NONE
  193. !.......Arguments
  194. !... Real
  195. REAL, DIMENSION( 0:kte ), INTENT(IN) :: SIGMAF
  196. REAL, DIMENSION( kms:kme ), INTENT(IN) :: SIGMAH
  197. REAL, DIMENSION( kts:kte ), INTENT(IN) :: DSIGH, DSIGHI, DSIGFI
  198. REAL , INTENT(IN) :: DTPBL, G, RD,ep1,karman,CPD,ROVCP,RDT
  199. REAL , DIMENSION( ims:ime ), INTENT(INOUT) :: PBL, UST
  200. REAL , DIMENSION( ims:ime, kms:kme ), INTENT(IN) :: US,VS, THETA, TT, &
  201. QVS, QCS, QIS, DENSX
  202. REAL, DIMENSION( ims:ime, kms:kme ), intent(in) :: DZF
  203. REAL, DIMENSION( ims:ime, kms:kme ), intent(inout) :: utnp, &
  204. vtnp, &
  205. ttnp, &
  206. qvtnp, &
  207. qctnp, &
  208. qitnp
  209. real, dimension( ims:ime ), intent(in ) :: psfcpa
  210. real, dimension( ims:ime ), intent(in ) :: tg
  211. real, dimension( ims:ime ), intent(inout) :: regime
  212. real, dimension( ims:ime ), intent(in) :: wspd, psim, gz1oz0
  213. real, dimension( ims:ime ), intent(in) :: hfx, qfx
  214. real, dimension( ims:ime ), intent(in) :: mut
  215. !... Integer
  216. INTEGER, DIMENSION( ims:ime ), INTENT(OUT):: KLPBL
  217. INTEGER, INTENT(IN) :: XTIME
  218. integer, intent(in ) :: ids,ide, jds,jde, kds,kde, &
  219. ims,ime, jms,jme, kms,kme, &
  220. its,ite, jts,jte, kts,kte, j
  221. !--------------------------------------------------------------------
  222. !--Local
  223. INTEGER I, K
  224. INTEGER :: KPBLHT
  225. INTEGER, DIMENSION( its:ite ) :: KPBLH, NOCONV
  226. !... Real
  227. REAL :: TVCON, WSS, TCONV, TH1, TOG, DTMP, WSSQ
  228. REAL :: psix, THV1
  229. REAL, DIMENSION( its:ite ) :: FINT, PSTAR, CPAIR
  230. REAL, DIMENSION( its:ite, kts:kte ) :: THETAV, RIB, &
  231. EDDYZ, UX, VX, THETAX, &
  232. QVX, QCX, QIX, ZA
  233. REAL, DIMENSION( its:ite, 0:kte ) :: ZF
  234. REAL, DIMENSION( its:ite) :: WST, TST, QST, USTM, TSTV
  235. REAL, DIMENSION( its:ite ) :: PBLSIG, MOL
  236. REAL :: FINTT, ZMIX, UMIX, VMIX
  237. REAL :: TMPFX, TMPVTCON, TMPP, TMPTHS, TMPTH1, TMPVCONV, WS1, DTH
  238. REAL :: A,TST12,RL,ZFUNC
  239. ! REAL, PARAMETER :: KARMAN = 0.4
  240. !... Integer
  241. INTEGER :: KL, jtf, ktf, itf, KMIX, KSRC
  242. !...
  243. character*256 :: message
  244. !-----initialize vertical tendencies and
  245. DO i = its,ite
  246. DO k = kts,kte
  247. utnp(i,k) = 0.
  248. vtnp(i,k) = 0.
  249. ttnp(i,k) = 0.
  250. ENDDO
  251. ENDDO
  252. DO k = kts,kte
  253. DO i = its,ite
  254. qvtnp(i,k) = 0.
  255. ENDDO
  256. ENDDO
  257. DO k = kts,kte
  258. DO i = its,ite
  259. qctnp(i,k) = 0.
  260. qitnp(i,k) = 0.
  261. ENDDO
  262. ENDDO
  263. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  264. !!! Compute Micromet Scaling variables, not availiable in WRF for ACM
  265. DO I = its,ite
  266. CPAIR(I) = CPD * (1.0 + 0.84 * QVS(I,1)) ! J/(K KG)
  267. TMPFX = HFX(I) / (cpair(i) * DENSX(I,1))
  268. TMPVTCON = 1.0 + EP1 * QVS(I,1) ! COnversion factor for virtual temperature
  269. WS1 = SQRT(US(I,1)**2 + VS(I,1)**2) ! Level 1 wind speed
  270. TST(I) = -TMPFX / UST(I)
  271. QST(I) = -QFX(I) / (UST(I)*DENSX(I,1))
  272. USTM(I) = UST(I) * WS1 / wspd(i)
  273. THV1 = TMPVTCON * THETA(I,1)
  274. TSTV(I) = TST(I)*TMPVTCON + THV1*EP1*QST(I)
  275. IF(ABS(TSTV(I)).LT.1.0E-6) THEN
  276. TSTV(I) = SIGN(1.0E-6,TSTV(I))
  277. ENDIF
  278. MOL(I) = THV1 * UST(i)**2/(KARMAN*G*TSTV(I))
  279. WST(I) = UST(I) * (PBL(I)/(KARMAN*ABS(MOL(I)))) ** 0.333333
  280. PSTAR(I) = MUT(I)/1000. ! P* in cb
  281. ENDDO
  282. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  283. !... Compute PBL height
  284. !... compute the height of full- and half-sigma level above ground level
  285. DO I = its,ite
  286. ZF(I,0) = 0.0
  287. KLPBL(I) = 1
  288. ENDDO
  289. DO K = kts, kte
  290. DO I = its,ite
  291. ZF(I,K) = DZF(I,K) + ZF(I,K-1)
  292. ZA(I,K) = 0.5 * (ZF(I,K) + ZF(I,K-1))
  293. ENDDO
  294. ENDDO
  295. DO K = kts, kte
  296. DO I = its,ite
  297. TVCON = 1.0 + EP1 * QVS(I,K)
  298. THETAV(I,K) = THETA(I,K) * TVCON
  299. ENDDO
  300. ENDDO
  301. !... COMPUTE PBL WHERE RICHARDSON NUMBER = RIC (0.25) HOLTSLAG ET AL 1990
  302. DO 100 I = its,ite
  303. DO K = 1,kte
  304. KSRC = K
  305. IF (SIGMAF(K).lT.0.9955) GO TO 69
  306. ENDDO
  307. 69 CONTINUE
  308. TH1 = 0.0
  309. DO K = 1,KSRC
  310. TH1 = TH1 + THETAV(I,K)
  311. ENDDO
  312. TH1 = TH1/KSRC
  313. IF(MOL(I).LT.0.0 .AND. XTIME.GT.1) then
  314. WSS = (UST(I) ** 3 + 0.6 * WST(I) ** 3) ** 0.33333
  315. TCONV = -8.5 * UST(I) * TSTV(I) / WSS
  316. TH1 = TH1 + TCONV
  317. ENDIF
  318. 99 KMIX = 1
  319. DO K = 1,kte
  320. DTMP = THETAV(I,K) - TH1
  321. IF (DTMP.LT.0.0) KMIX = K
  322. ENDDO
  323. IF(KMIX.GT.1) THEN
  324. FINTT = (TH1 - THETAV(I,KMIX)) / (THETAV(I,KMIX+1) &
  325. - THETAV(I,KMIX))
  326. ZMIX = FINTT * (ZA(I,KMIX+1)-ZA(I,KMIX)) + ZA(I,KMIX)
  327. UMIX = FINTT * (US(I,KMIX+1)-US(I,KMIX)) + US(I,KMIX)
  328. VMIX = FINTT * (VS(I,KMIX+1)-VS(I,KMIX)) + VS(I,KMIX)
  329. ELSE
  330. ZMIX = ZA(I,1)
  331. UMIX = US(I,1)
  332. VMIX = VS(I,1)
  333. ENDIF
  334. DO K = KMIX,kte
  335. DTMP = THETAV(I,K) - TH1
  336. TOG = 0.5 * (THETAV(I,K) + TH1) / G
  337. WSSQ = (US(I,K)-UMIX)**2 &
  338. + (VS(I,K)-VMIX)**2
  339. IF (KMIX == 1) WSSQ = WSSQ + 100.*UST(I)*UST(I)
  340. WSSQ = MAX( WSSQ, 0.1 )
  341. RIB(I,K) = ABS(ZA(I,K)-ZMIX) * DTMP / (TOG * WSSQ)
  342. IF (RIB(I,K) .GE. RIC) GO TO 201
  343. ENDDO
  344. write (message, *)' RIBX never exceeds RIC, RIB(i,kte) = ',rib(i,5), &
  345. ' THETAV(i,1) = ',thetav(i,1),' MOL=',mol(i), &
  346. ' TCONV = ',TCONV,' WST = ',WST(I), &
  347. ' KMIX = ',kmix,' UST = ',UST(I), &
  348. ' TST = ',TST(I),' U,V = ',US(I,1),VS(I,1), &
  349. ' I,J=',I,J
  350. CALL wrf_error_fatal ( message )
  351. 201 CONTINUE
  352. KPBLH(I) = K
  353. 100 CONTINUE
  354. DO I = its,ite
  355. IF (KPBLH(I) .NE. 1) THEN
  356. !---------INTERPOLATE BETWEEN LEVELS -- jp 7/93
  357. FINT(I) = (RIC - RIB(I,KPBLH(I)-1)) / (RIB(I,KPBLH(I)) - &
  358. RIB(I,KPBLH(I)-1))
  359. IF (FINT(I) .GT. 0.5) THEN
  360. KPBLHT = KPBLH(I)
  361. FINT(I) = FINT(I) - 0.5
  362. ELSE
  363. KPBLHT = KPBLH(I) - 1
  364. FINT(I) = FINT(I) + 0.5
  365. ENDIF
  366. PBL(I) = FINT(I) * (ZF(I,KPBLHT) - ZF(I,KPBLHT-1)) + &
  367. ZF(I,KPBLHT-1)
  368. KLPBL(I) = KPBLHT
  369. PBLSIG(I) = FINT(I) * DSIGH(KPBLHT) + SIGMAF(KPBLHT-1) ! sigma at PBL height
  370. ELSE
  371. KLPBL(I) = 1
  372. PBL(I) = ZF(I,1)
  373. PBLSIG(I) = SIGMAF(1)
  374. ENDIF
  375. ENDDO
  376. DO I = its,ite
  377. NOCONV(I) = 0
  378. ! Check for CBL and identify conv. vs. non-conv cells
  379. IF (PBL(I) / MOL(I) .LT. -0.02 .AND. KLPBL(I) .GT. 3 &
  380. .AND. THETAV(I,1) .GT. THETAV(I,2) .AND. XTIME .GT. 1) THEN
  381. NOCONV(I) = 1
  382. REGIME(I) = 4.0 ! FREE CONVECTIVE - ACM
  383. ENDIF
  384. ENDDO
  385. !... Calculate Kz
  386. CALL EDDYX(DTPBL, ZF, ZA, MOL, PBL, UST, &
  387. US, VS, TT, THETAV, DENSX, PSTAR, &
  388. QVS, QCS, QIS, DSIGFI, G, RD, CPAIR, &
  389. EDDYZ, its,ite, kts,kte,ims,ime, kms,kme)
  390. CALL ACM(DTPBL, PSTAR, NOCONV, SIGMAF, DSIGH, DSIGHI, J, &
  391. KLPBL, PBL, PBLSIG, MOL, UST, &
  392. TST, QST, USTM, EDDYZ, DENSX, &
  393. US, VS, THETA, QVS, QCS, QIS, &
  394. UX, VX, THETAX, QVX, QCX, QIX, &
  395. ids,ide, jds,jde, kds,kde, &
  396. ims,ime, jms,jme, kms,kme, &
  397. its,ite, jts,jte, kts,kte)
  398. !... Calculate tendency due to PBL parameterization
  399. DO K = kts, kte
  400. DO I = its, ite
  401. UTNP(I,K) = UTNP(I,K) + (UX(I,K) - US(I,K)) * RDT
  402. VTNP(I,K) = VTNP(I,K) + (VX(I,K) - VS(I,K)) * RDT
  403. TTNP(I,K) = TTNP(I,K) + (THETAX(I,K) - THETA(I,K)) * RDT
  404. QVTNP(I,K) = QVTNP(I,K) + (QVX(I,K) - QVS(I,K)) * RDT
  405. QCTNP(I,K) = QCTNP(I,K) + (QCX(I,K) - QCS(I,K)) * RDT
  406. QITNP(I,K) = QITNP(I,K) + (QIX(I,K) - QIS(I,K)) * RDT
  407. ENDDO
  408. ENDDO
  409. END SUBROUTINE ACM2D
  410. !-----------------------------------------------------------------------
  411. !-----------------------------------------------------------------------
  412. !-----------------------------------------------------------------------
  413. !-----------------------------------------------------------------------
  414. SUBROUTINE ACMINIT(RUBLTEN,RVBLTEN,RTHBLTEN,RQVBLTEN, &
  415. RQCBLTEN,RQIBLTEN,P_QI,P_FIRST_SCALAR, &
  416. restart, allowed_to_read , &
  417. ids, ide, jds, jde, kds, kde, &
  418. ims, ime, jms, jme, kms, kme, &
  419. its, ite, jts, jte, kts, kte )
  420. !-----------------------------------------------------------------------
  421. !
  422. ! This subroutine is for preparing ACM PBL variables.
  423. ! Called from module_physics_init.F
  424. !
  425. ! REVISION HISTORY:
  426. ! AX 3/2005 - Originally developed
  427. !-----------------------------------------------------------------------
  428. ! ARGUMENT LIST:
  429. !
  430. !-----------------------------------------------------------------------
  431. !-----------------------------------------------------------------------
  432. IMPLICIT NONE
  433. !
  434. LOGICAL , INTENT(IN) :: restart , allowed_to_read
  435. INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
  436. ims, ime, jms, jme, kms, kme, &
  437. its, ite, jts, jte, kts, kte
  438. INTEGER , INTENT(IN) :: P_QI,P_FIRST_SCALAR
  439. ! REAL , DIMENSION( kms:kme ), INTENT(IN) :: SHALF
  440. REAL , DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(OUT) :: &
  441. RUBLTEN, &
  442. RVBLTEN, &
  443. RTHBLTEN, &
  444. RQVBLTEN, &
  445. RQCBLTEN, &
  446. RQIBLTEN
  447. !... Local Variables
  448. INTEGER :: i, j, k, itf, jtf, ktf
  449. !
  450. jtf=min0(jte,jde-1)
  451. ktf=min0(kte,kde-1)
  452. itf=min0(ite,ide-1)
  453. IF(.not.restart)THEN
  454. DO j=jts,jtf
  455. DO k=kts,ktf
  456. DO i=its,itf
  457. RUBLTEN(i,k,j)=0.
  458. RVBLTEN(i,k,j)=0.
  459. RTHBLTEN(i,k,j)=0.
  460. RQVBLTEN(i,k,j)=0.
  461. RQCBLTEN(i,k,j)=0.
  462. ENDDO
  463. ENDDO
  464. ENDDO
  465. ENDIF
  466. IF (P_QI .ge. P_FIRST_SCALAR .and. .not.restart) THEN
  467. DO j=jts,jtf
  468. DO k=kts,ktf
  469. DO i=its,itf
  470. RQIBLTEN(i,k,j)=0.
  471. ENDDO
  472. ENDDO
  473. ENDDO
  474. ENDIF
  475. END SUBROUTINE acminit
  476. !-----------------------------------------------------------------------
  477. !-----------------------------------------------------------------------
  478. !-----------------------------------------------------------------------
  479. !-------------------------------------------------------------------
  480. SUBROUTINE EDDYX(DTPBL, ZF, ZA, MOL, PBL, UST, &
  481. US, VS, TT, THETAV, DENSX, PSTAR, &
  482. QVS, QCS, QIS, DSIGFI, G, RD, CPAIR, &
  483. EDDYZ, its,ite, kts,kte,ims,ime,kms,kme )
  484. !**********************************************************************
  485. ! Two methods for computing Kz:
  486. ! 1. Boundary scaling similar to Holtslag and Boville (1993)
  487. ! 2. Local Kz computed as function of local Richardson # and vertical
  488. ! wind shear, similar to LIU & CARROLL (1996)
  489. !
  490. !**********************************************************************
  491. !
  492. !-- DTPBL time step of the minor loop for the land-surface/pbl model
  493. !-- ZF height of full sigma level
  494. !-- ZA height of half sigma level
  495. !-- MOL Monin-Obukhov length in 1D form
  496. !-- PBL PBL height in 1D form
  497. !-- UST friction velocity U* in 1D form (m/s)
  498. !-- US U wind
  499. !-- VS V wind
  500. !-- TT temperature
  501. !-- THETAV potential virtual temperature
  502. !-- DENSX dry air density (kg/m^3)
  503. !-- PSTAR P*=Psfc-Ptop
  504. !-- QVS water vapor mixing ratio (Kg/Kg)
  505. !-- QCS cloud mixing ratio (Kg/Kg)
  506. !-- QIS ice mixing ratio (Kg/Kg)
  507. !-- DSIGFI inverse of sigma layer delta
  508. !-- G gravity
  509. !-- RD gas constant for dry air (j/kg/k)
  510. !-- CPAIR specific heat of moist air (M^2 S^-2 K^-1)
  511. !-- EDDYZ eddy diffusivity KZ
  512. !-----------------------------------------------------------------------
  513. !-----------------------------------------------------------------------
  514. IMPLICIT NONE
  515. !.......Arguments
  516. !... Integer
  517. INTEGER, INTENT(IN) :: its,ite, kts,kte,ims,ime,kms,kme
  518. !... Real
  519. REAL , DIMENSION( ims:ime ), INTENT(IN) :: PBL, UST
  520. REAL , INTENT(IN) :: DTPBL, G, RD
  521. REAL , DIMENSION( kts:kte ), INTENT(IN) :: DSIGFI
  522. REAL , DIMENSION( its:ite ), INTENT(IN) :: MOL, PSTAR, CPAIR
  523. REAL , DIMENSION( ims:ime, kms:kme ), INTENT(IN) :: US,VS, TT, &
  524. QVS, QCS, QIS, DENSX
  525. REAL, DIMENSION( its:ite, kts:kte ), INTENT(IN) :: ZA, THETAV
  526. REAL, DIMENSION( its:ite, 0:kte ) , INTENT(IN) :: ZF
  527. REAL , DIMENSION( its:ite, kts:kte ), INTENT(OUT) :: EDDYZ
  528. !.......Local variables
  529. !... Integer
  530. INTEGER :: ILX, KL, KLM, K, I
  531. !... Real
  532. REAL :: ZOVL, PHIH, WT, ZSOL, ZFUNC, DZF, SS, GOTH, EDYZ
  533. REAL :: RI, QMEAN, TMEAN, XLV, ALPH, CHI, ZK, SQL, DENSF, KZO
  534. REAL :: FH
  535. !... Parameters
  536. REAL, PARAMETER :: RV = 461.5
  537. REAL, PARAMETER :: RC = 0.25
  538. REAL, PARAMETER :: RLAM = 80.0
  539. REAL, PARAMETER :: GAMH = 16.0 !15.0 ! Holtslag and Boville (1993)
  540. REAL, PARAMETER :: BETAH = 5.0 ! Holtslag and Boville (1993)
  541. REAL, PARAMETER :: KARMAN = 0.4
  542. REAL, PARAMETER :: EDYZ0 = 0.01 ! New Min Kz
  543. ! REAL, PARAMETER :: EDYZ0 = 0.1
  544. !-- IMVDIF imvdif=1 for moist adiabat vertical diffusion
  545. INTEGER, PARAMETER :: imvdif = 1
  546. !
  547. ILX = ite
  548. KL = kte
  549. KLM = kte - 1
  550. DO K = kts,KLM
  551. DO I = its,ILX
  552. EDYZ = 0.0
  553. ZOVL = 0.0
  554. DZF = ZA(I,K+1) - ZA(I,K)
  555. KZO = EDYZ0
  556. !--------------------------------------------------------------------------
  557. IF (ZF(I,K) .LT. PBL(I)) THEN
  558. ZOVL = ZF(I,K) / MOL(I)
  559. IF (ZOVL .LT. 0.0) THEN
  560. IF (ZF(I,K) .LT. 0.1 * PBL(I)) THEN
  561. PHIH = 1.0 / SQRT(1.0 - GAMH * ZOVL)
  562. WT = UST(I) / PHIH
  563. ELSE
  564. ZSOL = 0.1 * PBL(I) / MOL(I)
  565. PHIH = 1.0 / SQRT(1.0 - GAMH * ZSOL)
  566. WT = UST(I) / PHIH
  567. ENDIF
  568. ELSE IF (ZOVL .LT. 1.0) THEN
  569. PHIH = 1.0 + BETAH * ZOVL
  570. WT = UST(I) / PHIH
  571. ELSE
  572. PHIH = BETAH + ZOVL
  573. WT = UST(I) / PHIH
  574. ENDIF
  575. ZFUNC = ZF(I,K) * (1.0 - ZF(I,K) / PBL(I)) ** 2
  576. EDYZ = KARMAN * WT * ZFUNC
  577. ENDIF
  578. !--------------------------------------------------------------------------
  579. SS = ((US(I,K+1) - US(I,K)) ** 2 + (VS(I,K+1) - VS(I,K)) ** 2) &
  580. / (DZF * DZF) + 1.0E-9
  581. GOTH = 2.0 * G / (THETAV(I,K+1) + THETAV(I,K))
  582. RI = GOTH * (THETAV(I,K+1) - THETAV(I,K)) / (DZF * SS)
  583. !--------------------------------------------------------------------------
  584. ! Adjustment to vert diff in Moist air
  585. IF(imvdif.eq.1)then
  586. IF ((QCS(I,K)+QIS(I,K)) .GT. 0.01E-3 .OR. (QCS(I,K+1)+ &
  587. QIS(I,K+1)) .GT. 0.01E-3) THEN
  588. QMEAN = 0.5 * (QVS(I,K) + QVS(I,K+1))
  589. TMEAN = 0.5 * (TT(I,K) + TT(I,K+1))
  590. XLV = (2.501 - 0.00237 * (TMEAN - 273.15)) * 1.E6
  591. ALPH = XLV * QMEAN / RD / TMEAN
  592. CHI = XLV * XLV * QMEAN / CPAIR(I) / RV / TMEAN / TMEAN
  593. RI = (1.0 + ALPH) * (RI -G * G / SS / TMEAN / CPAIR(I) * &
  594. ((CHI - ALPH) / (1.0 + CHI)))
  595. ENDIF
  596. ENDIF
  597. !--------------------------------------------------------------------------
  598. ZK = 0.4 * ZF(I,K)
  599. SQL = (ZK * RLAM / (RLAM + ZK)) ** 2
  600. IF (RI .GE. 0.0) THEN
  601. IF (ZF(I,K).LT.PBL(I).AND.ZOVL.GT.0.0) THEN
  602. FH = MAX((1.-ZF(I,K)/PBL(I))**2,0.01) * PHIH **(-2)
  603. SQL = ZK ** 2
  604. ELSE
  605. FH = (MAX(1.-RI/RC,0.01))**2
  606. ENDIF
  607. EDDYZ(I,K) = KZO + SQRT(SS) * FH * SQL
  608. ELSE
  609. EDDYZ(I,K) = KZO + SQRT(SS * (1.0 - 25.0 * RI)) * SQL
  610. ENDIF
  611. IF(EDYZ.GT.EDDYZ(I,K)) THEN
  612. EDDYZ(I,K) = EDYZ
  613. ENDIF
  614. EDDYZ(I,K) = MIN(1000.0,EDDYZ(I,K))
  615. EDDYZ(I,K) = MAX(KZO,EDDYZ(I,K))
  616. DENSF = 0.5 * (DENSX(I,K+1) + DENSX(I,K))
  617. EDDYZ(I,K) = EDDYZ(I,K) * (DENSF * G / PSTAR(I)) ** 2 * &
  618. DTPBL * DSIGFI(K)*1E-6
  619. ENDDO ! for I loop
  620. ENDDO ! for k loop
  621. !
  622. DO I = its,ILX
  623. EDDYZ(I,KL) = 0.0 ! EDDYZ(I,KLM) -- changed jp 3/08
  624. ENDDO
  625. END SUBROUTINE EDDYX
  626. !-----------------------------------------------------------------------
  627. !-----------------------------------------------------------------------
  628. !-----------------------------------------------------------------------
  629. !-------------------------------------------------------------------
  630. SUBROUTINE ACM (DTPBL, PSTAR, NOCONV, SIGMAF, DSIGH, DSIGHI, JX, &
  631. KLPBL, PBL, PBLSIG, MOL, UST, &
  632. TST, QST, USTM, EDDYZ, DENSX, &
  633. US, VS, THETA, QVS, QCS, QIS, &
  634. UX, VX, THETAX, QVX, QCX, QIX, &
  635. ids,ide, jds,jde, kds,kde, &
  636. ims,ime, jms,jme, kms,kme, &
  637. its,ite, jts,jte, kts,kte)
  638. !**********************************************************************
  639. ! PBL model called the Asymmetric Convective Model, Version 2 (ACM2)
  640. ! -- See top of module for summary and references
  641. !
  642. !---- REVISION HISTORY:
  643. ! AX 3/2005 - developed WRF version based on ACM2 in the MM5 PX LSM
  644. ! JP and RG 8/2006 - updates
  645. !
  646. !**********************************************************************
  647. ! ARGUMENTS:
  648. !-- DTPBL PBL time step
  649. !-- PSTAR Psurf - Ptop in cb
  650. !-- NOCONV If free convection =0, no; =1, yes
  651. !-- SIGMAF Sigma for full layer
  652. !-- DSIGH Sigma thickness
  653. !-- DSIGHI Inverse of sigma thickness
  654. !-- JX N-S index
  655. !-- KLPBL PBL level at K index
  656. !-- PBL PBL height in m
  657. !-- PBLSIG Sigma level for PBL
  658. !-- MOL Monin-Obukhov length in 1D form
  659. !-- UST U* in 1D form
  660. !-- TST Theta* in 1D form
  661. !-- QST Q* in 1D form
  662. !-- USTM U* for computation of momemtum flux
  663. !-- EDDYZ eddy diffusivity KZ
  664. !-- DENSX dry air density (kg/m^3)
  665. !-- US U wind
  666. !-- VS V wind
  667. !-- THETA potential temperature
  668. !-- QVS water vapor mixing ratio (Kg/Kg)
  669. !-- QCS cloud mixing ratio (Kg/Kg)
  670. !-- QIS ice mixing ratio (Kg/Kg)
  671. !-- UX new U wind
  672. !-- VX new V wind
  673. !-- THETAX new potential temperature
  674. !-- QVX new water vapor mixing ratio (Kg/Kg)
  675. !-- QCX new cloud mixing ratio (Kg/Kg)
  676. !-- QIX new ice mixing ratio (Kg/Kg)
  677. !-----------------------------------------------------------------------
  678. !-----------------------------------------------------------------------
  679. IMPLICIT NONE
  680. !.......Arguments
  681. !... Integer
  682. INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde, &
  683. ims,ime, jms,jme, kms,kme, &
  684. its,ite, jts,jte, kts,kte, JX
  685. INTEGER, DIMENSION( its:ite ), INTENT(IN) :: NOCONV
  686. INTEGER, DIMENSION( ims:ime ), INTENT(IN) :: KLPBL
  687. !... Real
  688. REAL , DIMENSION( ims:ime ), INTENT(IN) :: PBL, UST
  689. REAL , INTENT(IN) :: DTPBL
  690. REAL , DIMENSION( its:ite ), INTENT(IN) :: PSTAR, PBLSIG, &
  691. MOL, TST, &
  692. QST, USTM
  693. REAL , DIMENSION( kts:kte ), INTENT(IN) :: DSIGHI, DSIGH
  694. REAL , DIMENSION( 0:kte ), INTENT(IN) :: SIGMAF
  695. REAL , DIMENSION( its:ite, kts:kte ), INTENT(INOUT) :: EDDYZ
  696. REAL , DIMENSION( ims:ime, kms:kme ), INTENT(IN) :: US,VS, THETA, &
  697. QVS, QCS, QIS, DENSX
  698. REAL , DIMENSION( its:ite, kts:kte ), INTENT(OUT) :: UX, VX, THETAX, &
  699. QVX, QCX, QIX
  700. !.......Local variables
  701. !... Parameters
  702. INTEGER, PARAMETER :: NSP = 6
  703. !
  704. !......ACM2 Parameters
  705. ! INTEGER, PARAMETER :: IFACM = 0
  706. !
  707. REAL, PARAMETER :: G1000 = 9.8 * 1.0E-3
  708. REAL, PARAMETER :: XX = 0.5 ! FACTOR APPLIED TO CONV MIXING TIME STEP
  709. REAL, PARAMETER :: KARMAN = 0.4
  710. !... Integer
  711. INTEGER :: ILX, KL, KLM, I, K, NSPX, NLP, NL, JJ, L
  712. INTEGER :: KCBLMX
  713. INTEGER, DIMENSION( its:ite ) :: KCBL
  714. !... Real
  715. REAL :: G1000I, MBMAX, HOVL, MEDDY, MBAR
  716. REAL :: EKZ, RZ, FM, WSPD, DTS, DTRAT, F1
  717. REAL, DIMENSION( its:ite ) :: PSTARI, FSACM, DTLIM
  718. REAL, DIMENSION( kts:kte, its:ite) :: MBARKS, MDWN
  719. REAL, DIMENSION( 1:NSP, its:ite ) :: FS, BCBOTN
  720. REAL, DIMENSION( kts:kte ) :: XPLUS, XMINUS
  721. REAL DELC
  722. REAL, DIMENSION( 1:NSP,its:ite,kts:kte ) :: VCI
  723. REAL, DIMENSION( kts:kte ) :: AI, BI, CI, EI !, Y
  724. REAL, DIMENSION( 1:NSP,kts:kte ) :: DI, UI
  725. !
  726. !--Start Exicutable ----
  727. ILX = ite
  728. KL = kte
  729. KLM = kte - 1
  730. G1000I = 1.0 / G1000
  731. KCBLMX = 0
  732. MBMAX = 0.0
  733. !---COMPUTE ACM MIXING RATE
  734. DO I = its, ILX
  735. DTLIM(I) = DTPBL
  736. PSTARI(I) = 1.0 / PSTAR(I)
  737. KCBL(I) = 1
  738. FSACM(I) = 0.0
  739. IF (NOCONV(I) .EQ. 1) THEN
  740. KCBL(I) = KLPBL(I)
  741. !-------MBARKS IS UPWARD MIXING RATE; MDWN IS DOWNWARD MIXING RATE
  742. !--New couple ACM & EDDY-------------------------------------------------------------
  743. HOVL = -PBL(I) / MOL(I)
  744. FSACM(I) = 1./(1.+((KARMAN/(HOVL))**0.3333)/(0.72*KARMAN))
  745. MEDDY = EDDYZ(I,1) / (DTPBL * (PBLSIG(I) - SIGMAF(1)))
  746. MBAR = MEDDY * FSACM(I)
  747. DO K = kts,KCBL(I)-1
  748. EDDYZ(I,K) = EDDYZ(I,K) * (1.0 - FSACM(I))
  749. ENDDO
  750. MBMAX = AMAX1(MBMAX,MBAR)
  751. DO K = kts+1,KCBL(I)
  752. MBARKS(K,I) = MBAR
  753. MDWN(K,I) = MBAR * (PBLSIG(I) - SIGMAF(K-1)) * DSIGHI(K)
  754. ENDDO
  755. MBARKS(1,I) = MBAR
  756. MBARKS(KCBL(I),I) = MDWN(KCBL(I),I)
  757. MDWN(KCBL(I)+1,I) = 0.0
  758. ENDIF
  759. ENDDO ! end of I loop
  760. DO K = kts,KLM
  761. DO I = its,ILX
  762. EKZ = EDDYZ(I,K) / DTPBL * DSIGHI(K)
  763. DTLIM(I) = AMIN1(0.75 / EKZ,DTLIM(I))
  764. ENDDO
  765. ENDDO
  766. DO I = its,ILX
  767. IF (NOCONV(I) .EQ. 1) THEN
  768. KCBLMX = AMAX0(KLPBL(I),KCBLMX)
  769. RZ = (SIGMAF(KCBL(I)) - SIGMAF(1)) * DSIGHI(1)
  770. DTLIM(I) = AMIN1(XX / (MBARKS(1,I) * RZ),DTLIM(I))
  771. ENDIF
  772. ENDDO
  773. DO K = kts,KL
  774. DO I = its,ILX
  775. VCI(1,I,K) = THETA(I,K)
  776. VCI(2,I,K) = QVS(I,K)
  777. VCI(3,I,K) = US(I,K)
  778. VCI(4,I,K) = VS(I,K)
  779. ! -- Also mix cloud water and ice IF necessary
  780. ! IF (IMOISTX.NE.1.AND.IMOISTX.NE.3) THEN !!! Check other PBL models
  781. VCI(5,I,K) = QCS(I,K)
  782. VCI(6,I,K) = QIS(I,K)
  783. ENDDO
  784. ENDDO
  785. NSPX=6
  786. DO I = its,ILX
  787. FS(1,I) = -UST(I) * TST(I) * DENSX(I,1) * PSTARI(I)
  788. FS(2,I) = -UST(I) * QST(I) * DENSX(I,1) * PSTARI(I)
  789. FM = -USTM(I) * USTM(I) * DENSX(I,1) * PSTARI(I)
  790. WSPD = SQRT(US(I,1) * US(I,1) + VS(I,1) * VS(I,1)) + 1.E-9
  791. FS(3,I) = FM * US(I,1) / WSPD
  792. FS(4,I) = FM * VS(I,1) / WSPD
  793. FS(5,I) = 0.0
  794. FS(6,I) = 0.0 ! SURFACE FLUXES OF CLOUD WATER AND ICE = 0
  795. ENDDO
  796. !
  797. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  798. DO I = its,ILX
  799. NLP = INT(DTPBL / DTLIM(I) + 1.0)
  800. DTS = (DTPBL / NLP)
  801. DTRAT = DTS / DTPBL
  802. DO NL = 1,NLP ! LOOP OVER SUB TIME LOOP
  803. !-- COMPUTE ARRAY ELEMENTS THAT ARE INDEPENDANT OF SPECIES
  804. DO K = kts,KL
  805. AI(K) = 0.0
  806. BI(K) = 0.0
  807. CI(K) = 0.0
  808. EI(K) = 0.0
  809. ENDDO
  810. DO K = 2, KCBL(I)
  811. EI(K-1) = -CRANKP * MDWN(K,I) * DTS * DSIGH(K) * DSIGHI(K-1)
  812. BI(K) = 1.0 + CRANKP * MDWN(K,I) * DTS
  813. AI(K) = -CRANKP * MBARKS(K,I) * DTS
  814. ENDDO
  815. EI(1) = EI(1) -EDDYZ(I,1) * CRANKP * DSIGHI(1 )* DTRAT
  816. AI(2) = AI(2) -EDDYZ(I,1) * CRANKP * DSIGHI(2) * DTRAT
  817. DO K = KCBL(I)+1, KL
  818. BI(K) = 1.0
  819. ENDDO
  820. DO K = 2,KL
  821. XPLUS(K) = EDDYZ(I,K) * DSIGHI(K) * DTRAT
  822. XMINUS(K) = EDDYZ(I,K-1) * DSIGHI(K) * DTRAT
  823. CI(K) = - XMINUS(K) * CRANKP
  824. EI(K) = EI(K) - XPLUS(K) * CRANKP
  825. BI(K) = BI(K) + XPLUS(K) * CRANKP + XMINUS(K) * CRANKP
  826. ENDDO
  827. IF (NOCONV(I) .EQ. 1) THEN
  828. BI(1) = 1.0 + CRANKP * MBARKS(1,I) * (PBLSIG(I) - SIGMAF(1)) * &
  829. DTS * DSIGHI(1) + EDDYZ(I,1) * DSIGHI(1) * CRANKP * DTRAT
  830. ELSE
  831. BI(1) = 1.0 + EDDYZ(I,1) * DSIGHI(1) * CRANKP * DTRAT
  832. ENDIF
  833. DO K = 1,KL
  834. DO L = 1,NSPX
  835. DI(L,K) = 0.0
  836. ENDDO
  837. ENDDO
  838. !
  839. !** COMPUTE TENDENCY OF CBL CONCENTRATIONS - SEMI-IMPLICIT SOLUTION
  840. DO K = 2,KCBL(I)
  841. DO L = 1,NSPX
  842. DELC = DTS * (MBARKS(K,I) * VCI(L,I,1) - MDWN(K,I) * &
  843. VCI(L,I,K) + DSIGH(K+1) * DSIGHI(K) * &
  844. MDWN(K+1,I) * VCI(L,I,K+1))
  845. DI(L,K) = VCI(L,I,K) + (1.0 - CRANKP) * DELC
  846. ENDDO
  847. ENDDO
  848. DO K = KCBL(I)+1, KL
  849. DO L = 1,NSPX
  850. DI(L,K) = VCI(L,I,K)
  851. ENDDO
  852. ENDDO
  853. DO K = 2,KL
  854. IF (K .EQ. KL) THEN
  855. DO L = 1,NSPX
  856. DI(L,K) = DI(L,K) - (1.0 - CRANKP) * XMINUS(K) * &
  857. (VCI(L,I,K) - VCI(L,I,K-1))
  858. ENDDO
  859. ELSE
  860. DO L = 1,NSPX
  861. DI(L,K) = DI(L,K) + (1.0 - CRANKP) * XPLUS(K) * &
  862. (VCI(L,I,K+1) - VCI(L,I,K)) - &
  863. (1.0 - CRANKP) * XMINUS(K) * &
  864. (VCI(L,I,K) - VCI(L,I,K-1))
  865. ENDDO
  866. ENDIF
  867. ENDDO
  868. IF (NOCONV(I) .EQ. 1) THEN
  869. DO L = 1,NSPX
  870. F1 = -G1000I * (MBARKS(1,I) * &
  871. (PBLSIG(I) - SIGMAF(1)) * VCI(L,I,1) - &
  872. MDWN(2,I) * VCI(L,I,2) * DSIGH(2))
  873. DI(L,1) = VCI(L,I,1) - G1000 * (FS(L,I) - (1.0 - CRANKP) &
  874. * F1) * DSIGHI(1) * DTS
  875. ENDDO
  876. ELSE
  877. DO L = 1,NSPX
  878. DI(L,1) = VCI(L,I,1) - G1000 * FS(L,I) * DSIGHI(1) * DTS
  879. ENDDO
  880. ENDIF
  881. DO L = 1,NSPX
  882. DI(L,1) = DI(L,1) + (1.0 - CRANKP) * EDDYZ(I,1) * DSIGHI(1) &
  883. * DTRAT * (VCI(L,I,2) - VCI(L,I,1))
  884. ENDDO
  885. IF ( NOCONV(I) .EQ. 1 ) THEN
  886. CALL MATRIX (AI, BI, CI, DI, EI, UI, KL, NSPX)
  887. ELSE
  888. CALL TRI (CI, BI, EI, DI, UI, KL, NSPX)
  889. END IF
  890. !
  891. !-- COMPUTE NEW THETAV AND Q
  892. DO K = 1,KL
  893. DO L = 1,NSPX
  894. VCI(L,I,K) = UI(L,K)
  895. ENDDO
  896. ENDDO
  897. ENDDO ! END I LOOP
  898. ENDDO ! END SUB TIME LOOP
  899. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  900. !
  901. DO K = kts,KL
  902. DO I = its,ILX
  903. THETAX(I,K) = VCI(1,I,K)
  904. QVX(I,K) = VCI(2,I,K)
  905. UX(I,K) = VCI(3,I,K)
  906. VX(I,K) = VCI(4,I,K)
  907. ENDDO
  908. ENDDO
  909. DO K = kts,KL
  910. DO I = its,ILX
  911. QCX(I,K) = VCI(5,I,K)
  912. QIX(I,K) = VCI(6,I,K)
  913. ENDDO
  914. ENDDO
  915. END SUBROUTINE ACM
  916. !-----------------------------------------------------------------------
  917. !-----------------------------------------------------------------------
  918. !-----------------------------------------------------------------------
  919. !-----------------------------------------------------------------------
  920. SUBROUTINE MATRIX(A,B,C,D,E,X,KL,NSP)
  921. !-----------------------------------------------------------------------
  922. !-----------------------------------------------------------------------
  923. IMPLICIT NONE
  924. !
  925. !-- Bordered band diagonal matrix solver for ACM2
  926. !-- ACM2 Matrix is in this form:
  927. ! B1 E1
  928. ! A2 B2 E2
  929. ! A3 C3 B3 E3
  930. ! A4 C4 B4 E4
  931. ! A5 C5 B5 E5
  932. ! A6 C6 B6
  933. !--Upper Matrix is
  934. ! U11 U12
  935. ! U22 U23
  936. ! U33 U34
  937. ! U44 U45
  938. ! U55 U56
  939. ! U66
  940. !--Lower Matrix is:
  941. ! 1
  942. ! L21 1
  943. ! L31 L32 1
  944. ! L41 L42 L43 1
  945. ! L51 L52 L53 L54 1
  946. ! L61 L62 L63 L64 L65 1
  947. !---------------------------------------------------------
  948. !...Arguments
  949. INTEGER, INTENT(IN) :: KL
  950. INTEGER, INTENT(IN) :: NSP
  951. REAL A(KL),B(KL),E(KL)
  952. REAL C(KL),D(NSP,KL),X(NSP,KL)
  953. !...Locals
  954. REAL Y(NSP,KL),AIJ,SUM
  955. REAL L(KL,KL),UII(KL),UIIP1(KL),RUII(KL)
  956. INTEGER I,J,V
  957. !-- Define Upper and Lower matrices
  958. L(1,1) = 1.
  959. UII(1) = B(1)
  960. RUII(1) = 1./UII(1)
  961. DO I = 2, KL
  962. L(I,I) = 1.
  963. L(I,1) = A(I)/B(1)
  964. UIIP1(I-1)=E(I-1)
  965. IF(I.GE.3) THEN
  966. DO J = 2,I-1
  967. IF(I.EQ.J+1) THEN
  968. AIJ = C(I)
  969. ELSE
  970. AIJ = 0.
  971. ENDIF
  972. L(I,J) = (AIJ-L(I,J-1)*E(J-1))/ &
  973. (B(J)-L(J,J-1)*E(J-1))
  974. ENDDO
  975. ENDIF
  976. ENDDO
  977. DO I = 2,KL
  978. UII(I) = B(I)-L(I,I-1)*E(I-1)
  979. RUII(I) = 1./UII(I)
  980. ENDDO
  981. !-- Forward sub for Ly=d
  982. DO V= 1, NSP
  983. Y(V,1) = D(V,1)
  984. DO I=2,KL
  985. SUM = D(V,I)
  986. DO J=1,I-1
  987. SUM = SUM - L(I,J)*Y(V,J)
  988. ENDDO
  989. Y(V,I) = SUM
  990. ENDDO
  991. ENDDO
  992. !-- Back sub for Ux=y
  993. DO V= 1, NSP
  994. X(V,KL) = Y(V,KL)*RUII(KL)
  995. ENDDO
  996. DO I = KL-1,1,-1
  997. DO V= 1, NSP
  998. X(V,I) = (Y(V,I)-UIIP1(I)*X(V,I+1))*RUII(I)
  999. ENDDO
  1000. ENDDO
  1001. END SUBROUTINE MATRIX
  1002. !-----------------------------------------------------------------------
  1003. !-----------------------------------------------------------------------
  1004. SUBROUTINE TRI ( L, D, U, B, X,KL,NSP)
  1005. !-----------------------------------------------------------------------
  1006. !-----------------------------------------------------------------------
  1007. ! FUNCTION:
  1008. ! Solves tridiagonal system by Thomas algorithm.
  1009. ! The associated tri-diagonal system is stored in 3 arrays
  1010. ! D : diagonal
  1011. ! L : sub-diagonal
  1012. ! U : super-diagonal
  1013. ! B : right hand side function
  1014. ! X : return solution from tridiagonal solver
  1015. ! [ D(1) U(1) 0 0 0 ... 0 ]
  1016. ! [ L(2) D(2) U(2) 0 0 ... . ]
  1017. ! [ 0 L(3) D(3) U(3) 0 ... . ]
  1018. ! [ . . . . . ] X(i) = B(i)
  1019. ! [ . . . . 0 ]
  1020. ! [ . . . . ]
  1021. ! [ 0 L(n) D(n) ]
  1022. !-----------------------------------------------------------------------
  1023. IMPLICIT NONE
  1024. ! Arguments:
  1025. INTEGER, INTENT(IN) :: KL
  1026. INTEGER, INTENT(IN) :: NSP
  1027. REAL L( KL ) ! subdiagonal
  1028. REAL D(KL) ! diagonal
  1029. REAL U( KL ) ! superdiagonal
  1030. REAL B(NSP,KL ) ! R.H. side
  1031. REAL X( NSP,KL ) ! solution
  1032. ! Local Variables:
  1033. REAL GAM( KL )
  1034. REAL BET
  1035. INTEGER V, K
  1036. ! Decomposition and forward substitution:
  1037. BET = 1.0 / D( 1 )
  1038. DO V = 1, NSP
  1039. X( V,1 ) = BET * B(V,1 )
  1040. ENDDO
  1041. DO K = 2, KL
  1042. GAM(K ) = BET * U( K-1 )
  1043. BET = 1.0 / ( D( K ) - L( K ) * GAM( K ) )
  1044. DO V = 1, NSP
  1045. X( V, K ) = BET * ( B( V,K ) - L( K ) * X( V,K-1 ) )
  1046. ENDDO
  1047. ENDDO
  1048. ! Back-substitution:
  1049. DO K = KL - 1, 1, -1
  1050. DO V = 1, NSP
  1051. X( V,K ) = X( V,K ) - GAM( K+1 ) * X( V,K+1 )
  1052. ENDDO
  1053. ENDDO
  1054. END SUBROUTINE TRI
  1055. !-----------------------------------------------------------------------
  1056. !-----------------------------------------------------------------------
  1057. END MODULE module_bl_acm