PageRenderTime 91ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 1ms

/wrfv2_fire/dyn_em/module_diffusion_em.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 6015 lines | 3731 code | 1233 blank | 1051 comment | 10 complexity | 4a8d72e31f9f2c2d1120d5720275b558 MD5 | raw file
Possible License(s): AGPL-1.0
  1. ! WRF:MODEL_LAYER:PHYSICS
  2. MODULE module_diffusion_em
  3. USE module_bc, only: set_physical_bc3d
  4. USE module_state_description, only: p_m23, p_m13, p_m22, p_m33, p_r23, p_r13, p_r12, p_m12, p_m11
  5. USE module_big_step_utilities_em, only: grid_config_rec_type, param_first_scalar, p_qv, p_qi, p_qc
  6. USE module_model_constants
  7. CONTAINS
  8. !=======================================================================
  9. !=======================================================================
  10. SUBROUTINE cal_deform_and_div( config_flags, u, v, w, div, &
  11. defor11, defor22, defor33, &
  12. defor12, defor13, defor23, &
  13. nba_rij, n_nba_rij, & !JDM
  14. u_base, v_base, msfux, msfuy, &
  15. msfvx, msfvy, msftx, msfty, &
  16. rdx, rdy, dn, dnw, rdz, rdzw, &
  17. fnm, fnp, cf1, cf2, cf3, zx, zy, &
  18. ids, ide, jds, jde, kds, kde, &
  19. ims, ime, jms, jme, kms, kme, &
  20. its, ite, jts, jte, kts, kte )
  21. ! History: Sep 2003 Changes by Jason Knievel and George Bryan, NCAR
  22. ! Oct 2001 Converted to mass core by Bill Skamarock, NCAR
  23. ! ... ...
  24. ! Purpose: This routine calculates deformation and 3-d divergence.
  25. ! References: Klemp and Wilhelmson (JAS 1978)
  26. ! Chen and Dudhia (NCAR WRF physics report 2000)
  27. !-----------------------------------------------------------------------
  28. ! Comments 10-MAR-05
  29. ! Equations 13a-f, Chen and Dudhia 2000, Appendix A:
  30. ! Eqn 13a: D11=defor11= 2m^2 * (partial du^/dX + partial dpsi/dx * partial du^/dpsi)
  31. ! Eqn 13b: D22=defor22= 2m^2 * (partial dv^/dY + partial dpsi/dy * partial dv^/dpsi)
  32. ! Eqn 13c: D33=defor33= 2 * partial dw/dz [SIMPLER FORM]
  33. ! Eqn 13d: D12=defor12= m^2 * (partial dv^/dX + partial du^/dY +
  34. ! partial dpsi/dx * partial dv^/dpsi +
  35. ! partial dpsi/dy * partial du^/dpsi)
  36. ! Eqn 13e: D13=defor13= m^2 * (partial dw^/dX + partial dpsi/dx * partial dw^/dpsi)
  37. ! + partial du/dz [SIMPLER FORM]
  38. ! Eqn 13f: D23=defor23= m^2 * (partial dw^/dY + partial dpsi/dy * partial dw^/dpsi)
  39. ! + partial dv/dz [SIMPLER FORM]
  40. !-----------------------------------------------------------------------
  41. ! Begin declarations.
  42. IMPLICIT NONE
  43. TYPE( grid_config_rec_type ), INTENT( IN ) &
  44. :: config_flags
  45. INTEGER, INTENT( IN ) &
  46. :: ids, ide, jds, jde, kds, kde, &
  47. ims, ime, jms, jme, kms, kme, &
  48. its, ite, jts, jte, kts, kte
  49. REAL, INTENT( IN ) &
  50. :: rdx, rdy, cf1, cf2, cf3
  51. REAL, DIMENSION( kms:kme ), INTENT( IN ) &
  52. :: fnm, fnp, dn, dnw, u_base, v_base
  53. REAL, DIMENSION( ims:ime , jms:jme ), INTENT( IN ) &
  54. :: msfux, msfuy, msfvx, msfvy, msftx, msfty
  55. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
  56. :: u, v, w, zx, zy, rdz, rdzw
  57. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) &
  58. :: defor11, defor22, defor33, defor12, defor13, defor23, div
  59. INTEGER, INTENT( IN ) :: n_nba_rij !JDM
  60. REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_nba_rij), INTENT(INOUT) & !JDM
  61. :: nba_rij
  62. ! Local variables.
  63. INTEGER &
  64. :: i, j, k, ktf, ktes1, ktes2, i_start, i_end, j_start, j_end
  65. REAL &
  66. :: tmp, tmpzx, tmpzy, tmpzeta_z, cft1, cft2
  67. REAL, DIMENSION( its:ite, jts:jte ) &
  68. :: mm, zzavg, zeta_zd12
  69. REAL, DIMENSION( its-2:ite+2, kts:kte, jts-2:jte+2 ) &
  70. :: tmp1, hat, hatavg
  71. ! End declarations.
  72. !-----------------------------------------------------------------------
  73. ! Comments 10-MAR-2005
  74. ! Treat all differentials as 'div-style' [or 'curl-style'],
  75. ! i.e., du/dX becomes (in map coordinate space) mx*my * d(u/my)/dx,
  76. ! NB - all equations referred to here are from Chen and Dudhia 2002, from the
  77. ! WRF physics documents web pages:
  78. ! http://www.mmm.ucar.edu/wrf/users/docs/wrf-doc-physics.pdf
  79. !=======================================================================
  80. ! In the following section, calculate 3-d divergence and the first three
  81. ! (defor11, defor22, defor33) of six deformation terms.
  82. ktes1 = kte-1
  83. ktes2 = kte-2
  84. cft2 = - 0.5 * dnw(ktes1) / dn(ktes1)
  85. cft1 = 1.0 - cft2
  86. ktf = MIN( kte, kde-1 )
  87. i_start = its
  88. i_end = MIN( ite, ide-1 )
  89. j_start = jts
  90. j_end = MIN( jte, jde-1 )
  91. ! Square the map scale factor.
  92. DO j = j_start, j_end
  93. DO i = i_start, i_end
  94. mm(i,j) = msftx(i,j) * msfty(i,j)
  95. END DO
  96. END DO
  97. !-----------------------------------------------------------------------
  98. ! Calculate du/dx.
  99. ! Apply a coordinate transformation to zonal velocity, u.
  100. DO j = j_start, j_end
  101. DO k = kts, ktf
  102. DO i = i_start, i_end+1
  103. hat(i,k,j) = u(i,k,j) / msfuy(i,j)
  104. END DO
  105. END DO
  106. END DO
  107. ! Average in x and z.
  108. DO j=j_start,j_end
  109. DO k=kts+1,ktf
  110. DO i=i_start,i_end
  111. hatavg(i,k,j) = 0.5 * &
  112. ( fnm(k) * ( hat(i,k ,j) + hat(i+1, k,j) ) + &
  113. fnp(k) * ( hat(i,k-1,j) + hat(i+1,k-1,j) ) )
  114. END DO
  115. END DO
  116. END DO
  117. ! Extrapolate to top and bottom of domain (to w levels).
  118. DO j = j_start, j_end
  119. DO i = i_start, i_end
  120. hatavg(i,1,j) = 0.5 * ( &
  121. cf1 * hat(i ,1,j) + &
  122. cf2 * hat(i ,2,j) + &
  123. cf3 * hat(i ,3,j) + &
  124. cf1 * hat(i+1,1,j) + &
  125. cf2 * hat(i+1,2,j) + &
  126. cf3 * hat(i+1,3,j) )
  127. hatavg(i,kte,j) = 0.5 * ( &
  128. cft1 * ( hat(i,ktes1,j) + hat(i+1,ktes1,j) ) + &
  129. cft2 * ( hat(i,ktes2,j) + hat(i+1,ktes2,j) ) )
  130. END DO
  131. END DO
  132. ! Comments 10-MAR-05
  133. ! Eqn 13a: D11=defor11= 2m^2 * (partial du^/dX + partial dpsi/dx * partial du^/dpsi)
  134. ! Below, D11 is set = 2*tmp1
  135. ! => tmp1 = m^2 * (partial du^/dX + partial dpsi/dx * partial du^/dpsi)
  136. ! tmpzx = averaged value of dpsi/dx (=zx)
  137. DO j = j_start, j_end
  138. DO k = kts, ktf
  139. DO i = i_start, i_end
  140. tmpzx = 0.25 * ( &
  141. zx(i,k ,j) + zx(i+1,k ,j) + &
  142. zx(i,k+1,j) + zx(i+1,k+1,j) )
  143. tmp1(i,k,j) = ( hatavg(i,k+1,j) - hatavg(i,k,j) ) *tmpzx * rdzw(i,k,j)
  144. ! tmp1 to here = partial dpsi/dx * partial du^/dpsi:
  145. END DO
  146. END DO
  147. END DO
  148. DO j = j_start, j_end
  149. DO k = kts, ktf
  150. DO i = i_start, i_end
  151. tmp1(i,k,j) = mm(i,j) * ( rdx * ( hat(i+1,k,j) - hat(i,k,j) ) - &
  152. tmp1(i,k,j))
  153. END DO
  154. END DO
  155. END DO
  156. ! End calculation of du/dx.
  157. !-----------------------------------------------------------------------
  158. !-----------------------------------------------------------------------
  159. ! Calculate defor11 (2*du/dx).
  160. ! Comments 10-MAR-05
  161. ! Eqn 13a: D11=defor11= 2 m^2 * (partial du^/dX + partial dpsi/dx * partial du^/dpsi)
  162. ! = 2*tmp1
  163. DO j = j_start, j_end
  164. DO k = kts, ktf
  165. DO i = i_start, i_end
  166. defor11(i,k,j) = 2.0 * tmp1(i,k,j)
  167. END DO
  168. END DO
  169. END DO
  170. ! End calculation of defor11.
  171. !-----------------------------------------------------------------------
  172. !-----------------------------------------------------------------------
  173. ! Calculate zonal divergence (du/dx) and add it to the divergence array.
  174. DO j = j_start, j_end
  175. DO k = kts, ktf
  176. DO i = i_start, i_end
  177. div(i,k,j) = tmp1(i,k,j)
  178. END DO
  179. END DO
  180. END DO
  181. ! End calculation of zonal divergence.
  182. !-----------------------------------------------------------------------
  183. !-----------------------------------------------------------------------
  184. ! Calculate dv/dy.
  185. ! Apply a coordinate transformation to meridional velocity, v.
  186. DO j = j_start, j_end+1
  187. DO k = kts, ktf
  188. DO i = i_start, i_end
  189. ! Because msfvx at the poles will be undefined (1./0.), we will have
  190. ! trouble. But we are OK since v at the poles is 0., and that takes
  191. ! precedence in this case.
  192. IF ((config_flags%polar) .AND. ((j == jds) .OR. (j == jde))) THEN
  193. hat(i,k,j) = 0.
  194. ELSE ! normal code
  195. hat(i,k,j) = v(i,k,j) / msfvx(i,j)
  196. ENDIF
  197. END DO
  198. END DO
  199. END DO
  200. ! Account for the slope in y of eta surfaces.
  201. DO j=j_start,j_end
  202. DO k=kts+1,ktf
  203. DO i=i_start,i_end
  204. hatavg(i,k,j) = 0.5 * ( &
  205. fnm(k) * ( hat(i,k ,j) + hat(i,k ,j+1) ) + &
  206. fnp(k) * ( hat(i,k-1,j) + hat(i,k-1,j+1) ) )
  207. END DO
  208. END DO
  209. END DO
  210. ! Extrapolate to top and bottom of domain (to w levels).
  211. DO j = j_start, j_end
  212. DO i = i_start, i_end
  213. hatavg(i,1,j) = 0.5 * ( &
  214. cf1 * hat(i,1,j ) + &
  215. cf2 * hat(i,2,j ) + &
  216. cf3 * hat(i,3,j ) + &
  217. cf1 * hat(i,1,j+1) + &
  218. cf2 * hat(i,2,j+1) + &
  219. cf3 * hat(i,3,j+1) )
  220. hatavg(i,kte,j) = 0.5 * ( &
  221. cft1 * ( hat(i,ktes1,j) + hat(i,ktes1,j+1) ) + &
  222. cft2 * ( hat(i,ktes2,j) + hat(i,ktes2,j+1) ) )
  223. END DO
  224. END DO
  225. ! Comments 10-MAR-05
  226. ! Eqn 13b: D22=defor22= 2m^2 * (partial dv^/dY + partial dpsi/dy * partial dv^/dpsi)
  227. ! Below, D22 is set = 2*tmp1
  228. ! => tmp1 = m^2 * (partial dv^/dY + partial dpsi/dy * partial dv^/dpsi)
  229. ! tmpzy = averaged value of dpsi/dy (=zy)
  230. DO j = j_start, j_end
  231. DO k = kts, ktf
  232. DO i = i_start, i_end
  233. tmpzy = 0.25 * ( &
  234. zy(i,k ,j) + zy(i,k ,j+1) + &
  235. zy(i,k+1,j) + zy(i,k+1,j+1) )
  236. tmp1(i,k,j) = ( hatavg(i,k+1,j) - hatavg(i,k,j) ) * tmpzy * rdzw(i,k,j)
  237. ! tmp1 to here = partial dpsi/dy * partial dv^/dpsi:
  238. END DO
  239. END DO
  240. END DO
  241. DO j = j_start, j_end
  242. DO k = kts, ktf
  243. DO i = i_start, i_end
  244. tmp1(i,k,j) = mm(i,j) * ( &
  245. rdy * ( hat(i,k,j+1) - hat(i,k,j) ) - tmp1(i,k,j) )
  246. END DO
  247. END DO
  248. END DO
  249. ! End calculation of dv/dy.
  250. !-----------------------------------------------------------------------
  251. !-----------------------------------------------------------------------
  252. ! Calculate defor22 (2*dv/dy).
  253. ! Comments 10-MAR-05
  254. ! Eqn 13b: D22=defor22= 2 m^2 * (partial dv^/dY + partial dpsi/dy * partial dv^/dpsi)
  255. ! = 2*tmp1
  256. DO j = j_start, j_end
  257. DO k = kts, ktf
  258. DO i = i_start, i_end
  259. defor22(i,k,j) = 2.0 * tmp1(i,k,j)
  260. END DO
  261. END DO
  262. END DO
  263. ! End calculation of defor22.
  264. !-----------------------------------------------------------------------
  265. !-----------------------------------------------------------------------
  266. ! Calculate meridional divergence (dv/dy) and add it to the divergence
  267. ! array.
  268. DO j = j_start, j_end
  269. DO k = kts, ktf
  270. DO i = i_start, i_end
  271. div(i,k,j) = div(i,k,j) + tmp1(i,k,j)
  272. END DO
  273. END DO
  274. END DO
  275. ! End calculation of meridional divergence.
  276. !-----------------------------------------------------------------------
  277. !-----------------------------------------------------------------------
  278. ! Comments 10-MAR-05
  279. ! Eqn 13c: D33=defor33= 2 * partial dw/dz
  280. ! Below, D33 is set = 2*tmp1
  281. ! => tmp1 = partial dw/dz
  282. ! Calculate dw/dz.
  283. DO j = j_start, j_end
  284. DO k = kts, ktf
  285. DO i = i_start, i_end
  286. tmp1(i,k,j) = ( w(i,k+1,j) - w(i,k,j) ) * rdzw(i,k,j)
  287. END DO
  288. END DO
  289. END DO
  290. ! End calculation of dw/dz.
  291. !-----------------------------------------------------------------------
  292. !-----------------------------------------------------------------------
  293. ! Calculate defor33 (2*dw/dz).
  294. DO j = j_start, j_end
  295. DO k = kts, ktf
  296. DO i = i_start, i_end
  297. defor33(i,k,j) = 2.0 * tmp1(i,k,j)
  298. END DO
  299. END DO
  300. END DO
  301. ! End calculation of defor33.
  302. !-----------------------------------------------------------------------
  303. !-----------------------------------------------------------------------
  304. ! Calculate vertical divergence (dw/dz) and add it to the divergence
  305. ! array.
  306. DO j = j_start, j_end
  307. DO k = kts, ktf
  308. DO i = i_start, i_end
  309. div(i,k,j) = div(i,k,j) + tmp1(i,k,j)
  310. END DO
  311. END DO
  312. END DO
  313. ! End calculation of vertical divergence.
  314. !-----------------------------------------------------------------------
  315. ! Three-dimensional divergence is now finished and values are in array
  316. ! "div." Also, the first three (defor11, defor22, defor33) of six
  317. ! deformation terms are now calculated at pressure points.
  318. !=======================================================================
  319. ! Comments 10-MAR-2005
  320. ! Treat all differentials as 'div-style' [or 'curl-style'],
  321. ! i.e., du/dY becomes (in map coordinate space) mx*my * d(u/mx)/dy,
  322. ! dv/dX becomes (in map coordinate space) mx*my * d(v/my)/dx,
  323. ! (see e.g. Haltiner and Williams p. 441)
  324. !=======================================================================
  325. ! Calculate the final three deformations (defor12, defor13, defor23) at
  326. ! vorticity points.
  327. i_start = its
  328. i_end = ite
  329. j_start = jts
  330. j_end = jte
  331. IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
  332. config_flags%nested) i_start = MAX( ids+1, its )
  333. IF ( config_flags%open_xe .OR. config_flags%specified .OR. &
  334. config_flags%nested) i_end = MIN( ide-1, ite )
  335. IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
  336. config_flags%nested) j_start = MAX( jds+1, jts )
  337. IF ( config_flags%open_ye .OR. config_flags%specified .OR. &
  338. config_flags%nested) j_end = MIN( jde-1, jte )
  339. IF ( config_flags%periodic_x ) i_start = its
  340. IF ( config_flags%periodic_x ) i_end = ite
  341. !-----------------------------------------------------------------------
  342. ! Calculate du/dy.
  343. ! First, calculate an average mapscale factor.
  344. ! Comments 10-MAR-05
  345. ! du/dy => need u map scale factor in x (which is defined at u points)
  346. ! averaged over j and j-1
  347. ! dv/dx => need v map scale factor in y (which is defined at v points)
  348. ! averaged over i and i-1
  349. DO j = j_start, j_end
  350. DO i = i_start, i_end
  351. mm(i,j) = 0.25 * ( msfux(i,j-1) + msfux(i,j) ) * ( msfvy(i-1,j) + msfvy(i,j) )
  352. END DO
  353. END DO
  354. ! Apply a coordinate transformation to zonal velocity, u.
  355. DO j =j_start-1, j_end
  356. DO k =kts, ktf
  357. DO i =i_start, i_end
  358. ! Fixes to set_physical_bc2/3d for polar boundary conditions
  359. ! remove issues with loop over j
  360. hat(i,k,j) = u(i,k,j) / msfux(i,j)
  361. END DO
  362. END DO
  363. END DO
  364. ! Average in y and z.
  365. DO j=j_start,j_end
  366. DO k=kts+1,ktf
  367. DO i=i_start,i_end
  368. hatavg(i,k,j) = 0.5 * ( &
  369. fnm(k) * ( hat(i,k ,j-1) + hat(i,k ,j) ) + &
  370. fnp(k) * ( hat(i,k-1,j-1) + hat(i,k-1,j) ) )
  371. END DO
  372. END DO
  373. END DO
  374. ! Extrapolate to top and bottom of domain (to w levels).
  375. DO j = j_start, j_end
  376. DO i = i_start, i_end
  377. hatavg(i,1,j) = 0.5 * ( &
  378. cf1 * hat(i,1,j-1) + &
  379. cf2 * hat(i,2,j-1) + &
  380. cf3 * hat(i,3,j-1) + &
  381. cf1 * hat(i,1,j ) + &
  382. cf2 * hat(i,2,j ) + &
  383. cf3 * hat(i,3,j ) )
  384. hatavg(i,kte,j) = 0.5 * ( &
  385. cft1 * ( hat(i,ktes1,j-1) + hat(i,ktes1,j) ) + &
  386. cft2 * ( hat(i,ktes2,j-1) + hat(i,ktes2,j) ) )
  387. END DO
  388. END DO
  389. ! tmpzy = averaged value of dpsi/dy (=zy) on vorticity grid
  390. ! tmp1 = partial dpsi/dy * partial du^/dpsi
  391. DO j = j_start, j_end
  392. DO k = kts, ktf
  393. DO i = i_start, i_end
  394. tmpzy = 0.25 * ( &
  395. zy(i-1,k ,j) + zy(i,k ,j) + &
  396. zy(i-1,k+1,j) + zy(i,k+1,j) )
  397. tmp1(i,k,j) = ( hatavg(i,k+1,j) - hatavg(i,k,j) ) * &
  398. 0.25 * tmpzy * ( rdzw(i,k,j) + rdzw(i-1,k,j) + &
  399. rdzw(i-1,k,j-1) + rdzw(i,k,j-1) )
  400. END DO
  401. END DO
  402. END DO
  403. ! End calculation of du/dy.
  404. !----------------------------------------------------------------------
  405. !-----------------------------------------------------------------------
  406. ! Add the first term to defor12 (du/dy+dv/dx) at vorticity points.
  407. ! Comments 10-MAR-05
  408. ! Eqn 13d: D12=defor12= m^2 * (partial dv^/dX + partial du^/dY +
  409. ! partial dpsi/dx * partial dv^/dpsi +
  410. ! partial dpsi/dy * partial du^/dpsi)
  411. ! Here deal with m^2 * (partial du^/dY + partial dpsi/dy * partial du^/dpsi)
  412. ! Still need to add v^ terms:
  413. ! m^2 * (partial dv^/dX + partial dpsi/dx * partial dv^/dpsi)
  414. DO j = j_start, j_end
  415. DO k = kts, ktf
  416. DO i = i_start, i_end
  417. defor12(i,k,j) = mm(i,j) * ( &
  418. rdy * ( hat(i,k,j) - hat(i,k,j-1) ) - tmp1(i,k,j) )
  419. END DO
  420. END DO
  421. END DO
  422. ! End addition of the first term to defor12.
  423. !-----------------------------------------------------------------------
  424. !-----------------------------------------------------------------------
  425. ! Calculate dv/dx.
  426. ! Apply a coordinate transformation to meridional velocity, v.
  427. DO j = j_start, j_end
  428. DO k = kts, ktf
  429. DO i = i_start-1, i_end
  430. hat(i,k,j) = v(i,k,j) / msfvy(i,j)
  431. END DO
  432. END DO
  433. END DO
  434. ! Account for the slope in x of eta surfaces.
  435. DO j = j_start, j_end
  436. DO k = kts+1, ktf
  437. DO i = i_start, i_end
  438. hatavg(i,k,j) = 0.5 * ( &
  439. fnm(k) * ( hat(i-1,k ,j) + hat(i,k ,j) ) + &
  440. fnp(k) * ( hat(i-1,k-1,j) + hat(i,k-1,j) ) )
  441. END DO
  442. END DO
  443. END DO
  444. ! Extrapolate to top and bottom of domain (to w levels).
  445. DO j = j_start, j_end
  446. DO i = i_start, i_end
  447. hatavg(i,1,j) = 0.5 * ( &
  448. cf1 * hat(i-1,1,j) + &
  449. cf2 * hat(i-1,2,j) + &
  450. cf3 * hat(i-1,3,j) + &
  451. cf1 * hat(i ,1,j) + &
  452. cf2 * hat(i ,2,j) + &
  453. cf3 * hat(i ,3,j) )
  454. hatavg(i,kte,j) = 0.5 * ( &
  455. cft1 * ( hat(i,ktes1,j) + hat(i-1,ktes1,j) ) + &
  456. cft2 * ( hat(i,ktes2,j) + hat(i-1,ktes2,j) ) )
  457. END DO
  458. END DO
  459. ! Fixes to set_physical_bc2/3d have made any check for polar B.C.'s
  460. ! unnecessary in this place. zx, rdzw, and hatavg are all defined
  461. ! in places they need to be and the values at the poles are replications
  462. ! of the values one grid point in, so the averaging over j and j-1 works
  463. ! to act as just using the value at j or j-1 (with out extra code).
  464. !
  465. ! tmpzx = averaged value of dpsi/dx (=zx) on vorticity grid
  466. ! tmp1 = partial dpsi/dx * partial dv^/dpsi
  467. DO j = j_start, j_end
  468. DO k = kts, ktf
  469. DO i = i_start, i_end
  470. tmpzx = 0.25 * ( &
  471. zx(i,k ,j-1) + zx(i,k ,j) + &
  472. zx(i,k+1,j-1) + zx(i,k+1,j) )
  473. tmp1(i,k,j) = ( hatavg(i,k+1,j) - hatavg(i,k,j) ) * &
  474. 0.25 * tmpzx * ( rdzw(i,k,j) + rdzw(i,k,j-1) + &
  475. rdzw(i-1,k,j-1) + rdzw(i-1,k,j) )
  476. END DO
  477. END DO
  478. END DO
  479. ! End calculation of dv/dx.
  480. !-----------------------------------------------------------------------
  481. !-----------------------------------------------------------------------
  482. ! Add the second term to defor12 (du/dy+dv/dx) at vorticity points.
  483. ! Comments 10-MAR-05
  484. ! Eqn 13d: D12=defor12= m^2 * (partial dv^/dX + partial du^/dY +
  485. ! partial dpsi/dx * partial dv^/dpsi +
  486. ! partial dpsi/dy * partial du^/dpsi)
  487. ! Here adding v^ terms:
  488. ! m^2 * (partial dv^/dX + partial dpsi/dx * partial dv^/dpsi)
  489. IF ( config_flags%sfs_opt .GT. 0 ) THEN ! NBA--
  490. !JDM____________________________________________________________________
  491. !
  492. ! s12 = du/dy + dv/dx
  493. ! = (du/dy - dz/dy*du/dz) + (dv/dx - dz/dx*dv/dz)
  494. ! ______defor12______ ___tmp1___
  495. !
  496. ! r12 = du/dy - dv/dx
  497. ! = (du/dy - dz/dy*du/dz) - (dv/dx - dz/dx*dv/dz)
  498. ! ______defor12______ ___tmp1___
  499. !_______________________________________________________________________
  500. DO j = j_start, j_end
  501. DO k = kts, ktf
  502. DO i = i_start, i_end
  503. nba_rij(i,k,j,P_r12) = defor12(i,k,j) - &
  504. mm(i,j) * ( &
  505. rdx * ( hat(i,k,j) - hat(i-1,k,j) ) - tmp1(i,k,j) )
  506. defor12(i,k,j) = defor12(i,k,j) + &
  507. mm(i,j) * ( &
  508. rdx * ( hat(i,k,j) - hat(i-1,k,j) ) - tmp1(i,k,j) )
  509. END DO
  510. END DO
  511. END DO
  512. ! End addition of the second term to defor12.
  513. !-----------------------------------------------------------------------
  514. !-----------------------------------------------------------------------
  515. ! Update the boundary for defor12 (might need to change later).
  516. IF ( .NOT. config_flags%periodic_x .AND. i_start .EQ. ids+1 ) THEN
  517. DO j = jts, jte
  518. DO k = kts, kte
  519. defor12(ids,k,j) = defor12(ids+1,k,j)
  520. nba_rij(ids,k,j,P_r12) = nba_rij(ids+1,k,j,P_r12)
  521. END DO
  522. END DO
  523. END IF
  524. IF ( .NOT. config_flags%periodic_y .AND. j_start .EQ. jds+1) THEN
  525. DO k = kts, kte
  526. DO i = its, ite
  527. defor12(i,k,jds) = defor12(i,k,jds+1)
  528. nba_rij(i,k,jds,P_r12) = nba_rij(i,k,jds+1,P_r12)
  529. END DO
  530. END DO
  531. END IF
  532. IF ( .NOT. config_flags%periodic_x .AND. i_end .EQ. ide-1) THEN
  533. DO j = jts, jte
  534. DO k = kts, kte
  535. defor12(ide,k,j) = defor12(ide-1,k,j)
  536. nba_rij(ide,k,j,P_r12) = nba_rij(ide-1,k,j,P_r12)
  537. END DO
  538. END DO
  539. END IF
  540. IF ( .NOT. config_flags%periodic_y .AND. j_end .EQ. jde-1) THEN
  541. DO k = kts, kte
  542. DO i = its, ite
  543. defor12(i,k,jde) = defor12(i,k,jde-1)
  544. nba_rij(i,k,jde,P_r12) = nba_rij(i,k,jde-1,P_r12)
  545. END DO
  546. END DO
  547. END IF
  548. ELSE ! NOT NBA--------------------------------------------------------
  549. DO j = j_start, j_end
  550. DO k = kts, ktf
  551. DO i = i_start, i_end
  552. defor12(i,k,j) = defor12(i,k,j) + &
  553. mm(i,j) * ( &
  554. rdx * ( hat(i,k,j) - hat(i-1,k,j) ) - tmp1(i,k,j) )
  555. END DO
  556. END DO
  557. END DO
  558. ! End addition of the second term to defor12.
  559. !-----------------------------------------------------------------------
  560. !-----------------------------------------------------------------------
  561. ! Update the boundary for defor12 (might need to change later).
  562. IF ( .NOT. config_flags%periodic_x .AND. i_start .EQ. ids+1 ) THEN
  563. DO j = jts, jte
  564. DO k = kts, kte
  565. defor12(ids,k,j) = defor12(ids+1,k,j)
  566. END DO
  567. END DO
  568. END IF
  569. IF ( .NOT. config_flags%periodic_y .AND. j_start .EQ. jds+1) THEN
  570. DO k = kts, kte
  571. DO i = its, ite
  572. defor12(i,k,jds) = defor12(i,k,jds+1)
  573. END DO
  574. END DO
  575. END IF
  576. IF ( .NOT. config_flags%periodic_x .AND. i_end .EQ. ide-1) THEN
  577. DO j = jts, jte
  578. DO k = kts, kte
  579. defor12(ide,k,j) = defor12(ide-1,k,j)
  580. END DO
  581. END DO
  582. END IF
  583. IF ( .NOT. config_flags%periodic_y .AND. j_end .EQ. jde-1) THEN
  584. DO k = kts, kte
  585. DO i = its, ite
  586. defor12(i,k,jde) = defor12(i,k,jde-1)
  587. END DO
  588. END DO
  589. END IF
  590. ENDIF ! NBA-----------------------------------------------------------
  591. ! End update of boundary for defor12.
  592. !-----------------------------------------------------------------------
  593. ! Comments 10-MAR-05
  594. ! Further deformation terms not needed for 2-dimensional Smagorinsky diffusion,
  595. ! so those terms have not been dealt with yet.
  596. ! A "y" has simply been added to all map scale factors to allow the model to
  597. ! compile without errors.
  598. !-----------------------------------------------------------------------
  599. ! Calculate dw/dx.
  600. i_start = its
  601. i_end = MIN( ite, ide-1 )
  602. j_start = jts
  603. j_end = MIN( jte, jde-1 )
  604. IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
  605. config_flags%nested) i_start = MAX( ids+1, its )
  606. IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
  607. config_flags%nested) j_start = MAX( jds+1, jts )
  608. IF ( config_flags%periodic_x ) i_start = its
  609. IF ( config_flags%periodic_x ) i_end = MIN( ite, ide )
  610. IF ( config_flags%periodic_y ) j_end = MIN( jte, jde )
  611. ! Square the mapscale factor.
  612. DO j = jts, jte
  613. DO i = its, ite
  614. mm(i,j) = msfux(i,j) * msfuy(i,j)
  615. END DO
  616. END DO
  617. ! Apply a coordinate transformation to vertical velocity, w. This is for both
  618. ! defor13 and defor23.
  619. DO j = j_start, j_end
  620. DO k = kts, kte
  621. DO i = i_start, i_end
  622. hat(i,k,j) = w(i,k,j) / msfty(i,j)
  623. END DO
  624. END DO
  625. END DO
  626. i = i_start-1
  627. DO j = j_start, MIN( jte, jde-1 )
  628. DO k = kts, kte
  629. hat(i,k,j) = w(i,k,j) / msfty(i,j)
  630. END DO
  631. END DO
  632. j = j_start-1
  633. DO k = kts, kte
  634. DO i = i_start, MIN( ite, ide-1 )
  635. hat(i,k,j) = w(i,k,j) / msfty(i,j)
  636. END DO
  637. END DO
  638. ! QUESTION: What is this for?
  639. DO j = j_start, j_end
  640. DO k = kts, ktf
  641. DO i = i_start, i_end
  642. hatavg(i,k,j) = 0.25 * ( &
  643. hat(i ,k ,j) + &
  644. hat(i ,k+1,j) + &
  645. hat(i-1,k ,j) + &
  646. hat(i-1,k+1,j) )
  647. END DO
  648. END DO
  649. END DO
  650. ! Calculate dw/dx.
  651. DO j = j_start, j_end
  652. DO k = kts+1, ktf
  653. DO i = i_start, i_end
  654. tmp1(i,k,j) = ( hatavg(i,k,j) - hatavg(i,k-1,j) ) * zx(i,k,j) * &
  655. 0.5 * ( rdz(i,k,j) + rdz(i-1,k,j) )
  656. END DO
  657. END DO
  658. END DO
  659. ! End calculation of dw/dx.
  660. !-----------------------------------------------------------------------
  661. !-----------------------------------------------------------------------
  662. ! Add the first term (dw/dx) to defor13 (dw/dx+du/dz) at vorticity
  663. ! points.
  664. DO j = j_start, j_end
  665. DO k = kts+1, ktf
  666. DO i = i_start, i_end
  667. defor13(i,k,j) = mm(i,j) * ( &
  668. rdx * ( hat(i,k,j) - hat(i-1,k,j) ) - tmp1(i,k,j) )
  669. END DO
  670. END DO
  671. END DO
  672. DO j = j_start, j_end
  673. DO i = i_start, i_end
  674. defor13(i,kts,j ) = 0.0
  675. defor13(i,ktf+1,j) = 0.0
  676. END DO
  677. END DO
  678. ! End addition of the first term to defor13.
  679. !-----------------------------------------------------------------------
  680. !-----------------------------------------------------------------------
  681. ! Calculate du/dz.
  682. IF ( config_flags%mix_full_fields ) THEN
  683. DO j = j_start, j_end
  684. DO k = kts+1, ktf
  685. DO i = i_start, i_end
  686. tmp1(i,k,j) = ( u(i,k,j) - u(i,k-1,j) ) * &
  687. 0.5 * ( rdz(i,k,j) + rdz(i-1,k,j) )
  688. END DO
  689. END DO
  690. END DO
  691. ELSE
  692. DO j = j_start, j_end
  693. DO k = kts+1, ktf
  694. DO i = i_start, i_end
  695. tmp1(i,k,j) = ( u(i,k,j) - u_base(k) - u(i,k-1,j) + u_base(k-1) ) * &
  696. 0.5 * ( rdz(i,k,j) + rdz(i-1,k,j) )
  697. END DO
  698. END DO
  699. END DO
  700. END IF
  701. !-----------------------------------------------------------------------
  702. ! Add the second term (du/dz) to defor13 (dw/dx+du/dz) at vorticity
  703. ! points.
  704. IF ( config_flags%sfs_opt .GT. 0 ) THEN ! NBA--
  705. !JDM____________________________________________________________________
  706. !
  707. ! s13 = du/dz + dw/dx
  708. ! = du/dz + (dw/dx - dz/dx*dw/dz)
  709. ! = tmp1 + ______defor13______
  710. !
  711. ! r13 = du/dz - dw/dx
  712. ! = du/dz - (dw/dx - dz/dx*dw/dz)
  713. ! = tmp1 - ______defor13______
  714. !_______________________________________________________________________
  715. DO j = j_start, j_end
  716. DO k = kts+1, ktf
  717. DO i = i_start, i_end
  718. nba_rij(i,k,j,P_r13) = tmp1(i,k,j) - defor13(i,k,j)
  719. defor13(i,k,j) = defor13(i,k,j) + tmp1(i,k,j)
  720. END DO
  721. END DO
  722. END DO
  723. DO j = j_start, j_end !change for different surface B. C.
  724. DO i = i_start, i_end
  725. nba_rij(i,kts ,j,P_r13) = 0.0
  726. nba_rij(i,ktf+1,j,P_r13) = 0.0
  727. END DO
  728. END DO
  729. ELSE ! NOT NBA--------------------------------------------------------
  730. DO j = j_start, j_end
  731. DO k = kts+1, ktf
  732. DO i = i_start, i_end
  733. defor13(i,k,j) = defor13(i,k,j) + tmp1(i,k,j)
  734. END DO
  735. END DO
  736. END DO
  737. ENDIF ! NBA-----------------------------------------------------------
  738. ! End addition of the second term to defor13.
  739. !-----------------------------------------------------------------------
  740. !-----------------------------------------------------------------------
  741. ! Calculate dw/dy.
  742. i_start = its
  743. i_end = MIN( ite, ide-1 )
  744. j_start = jts
  745. j_end = MIN( jte, jde-1 )
  746. IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
  747. config_flags%nested) i_start = MAX( ids+1, its )
  748. IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
  749. config_flags%nested) j_start = MAX( jds+1, jts )
  750. IF ( config_flags%periodic_y ) j_end = MIN( jte, jde )
  751. IF ( config_flags%periodic_x ) i_start = its
  752. IF ( config_flags%periodic_x ) i_end = MIN( ite, ide-1 )
  753. ! Square mapscale factor.
  754. DO j = jts, jte
  755. DO i = its, ite
  756. mm(i,j) = msfvx(i,j) * msfvy(i,j)
  757. END DO
  758. END DO
  759. ! Apply a coordinate transformation to vertical velocity, w. Added by CW 7/19/07
  760. DO j = j_start, j_end
  761. DO k = kts, kte
  762. DO i = i_start, i_end
  763. hat(i,k,j) = w(i,k,j) / msftx(i,j)
  764. END DO
  765. END DO
  766. END DO
  767. i = i_start-1
  768. DO j = j_start, MIN( jte, jde-1 )
  769. DO k = kts, kte
  770. hat(i,k,j) = w(i,k,j) / msftx(i,j)
  771. END DO
  772. END DO
  773. j = j_start-1
  774. DO k = kts, kte
  775. DO i = i_start, MIN( ite, ide-1 )
  776. hat(i,k,j) = w(i,k,j) / msftx(i,j)
  777. END DO
  778. END DO
  779. ! QUESTION: What is this for?
  780. DO j = j_start, j_end
  781. DO k = kts, ktf
  782. DO i = i_start, i_end
  783. hatavg(i,k,j) = 0.25 * ( &
  784. hat(i,k ,j ) + &
  785. hat(i,k+1,j ) + &
  786. hat(i,k ,j-1) + &
  787. hat(i,k+1,j-1) )
  788. END DO
  789. END DO
  790. END DO
  791. ! Calculate dw/dy and store in tmp1.
  792. DO j = j_start, j_end
  793. DO k = kts+1, ktf
  794. DO i = i_start, i_end
  795. tmp1(i,k,j) = ( hatavg(i,k,j) - hatavg(i,k-1,j) ) * zy(i,k,j) * &
  796. 0.5 * ( rdz(i,k,j) + rdz(i,k,j-1) )
  797. END DO
  798. END DO
  799. END DO
  800. ! End calculation of dw/dy.
  801. !-----------------------------------------------------------------------
  802. !-----------------------------------------------------------------------
  803. ! Add the first term (dw/dy) to defor23 (dw/dy+dv/dz) at vorticity
  804. ! points.
  805. DO j = j_start, j_end
  806. DO k = kts+1, ktf
  807. DO i = i_start, i_end
  808. defor23(i,k,j) = mm(i,j) * ( &
  809. rdy * ( hat(i,k,j) - hat(i,k,j-1) ) - tmp1(i,k,j) )
  810. END DO
  811. END DO
  812. END DO
  813. DO j = j_start, j_end
  814. DO i = i_start, i_end
  815. defor23(i,kts,j ) = 0.0
  816. defor23(i,ktf+1,j) = 0.0
  817. END DO
  818. END DO
  819. ! End addition of the first term to defor23.
  820. !-----------------------------------------------------------------------
  821. !-----------------------------------------------------------------------
  822. ! Calculate dv/dz.
  823. IF ( config_flags%mix_full_fields ) THEN
  824. DO j = j_start, j_end
  825. DO k = kts+1, ktf
  826. DO i = i_start, i_end
  827. tmp1(i,k,j) = ( v(i,k,j) - v(i,k-1,j) ) * &
  828. 0.5 * ( rdz(i,k,j) + rdz(i,k,j-1) )
  829. END DO
  830. END DO
  831. END DO
  832. ELSE
  833. DO j = j_start, j_end
  834. DO k = kts+1, ktf
  835. DO i = i_start, i_end
  836. tmp1(i,k,j) = ( v(i,k,j) - v_base(k) - v(i,k-1,j) + v_base(k-1) ) * &
  837. 0.5 * ( rdz(i,k,j) + rdz(i,k,j-1) )
  838. END DO
  839. END DO
  840. END DO
  841. END IF
  842. ! End calculation of dv/dz.
  843. !-----------------------------------------------------------------------
  844. !-----------------------------------------------------------------------
  845. ! Add the second term (dv/dz) to defor23 (dw/dy+dv/dz) at vorticity
  846. ! points.
  847. IF ( config_flags%sfs_opt .GT. 0 ) THEN ! NBA--
  848. !JDM___________________________________________________________________
  849. !
  850. ! s23 = dv/dz + dw/dy
  851. ! = dv/dz + (dw/dy - dz/dy*dw/dz)
  852. ! tmp1 + ______defor23______
  853. !
  854. ! r23 = dv/dz - dw/dy
  855. ! = dv/dz - (dw/dy - dz/dy*dw/dz)
  856. ! = tmp1 - ______defor23______
  857. ! Add tmp1 to defor23.
  858. DO j = j_start, j_end
  859. DO k = kts+1, ktf
  860. DO i = i_start, i_end
  861. nba_rij(i,k,j,P_r23) = tmp1(i,k,j) - defor23(i,k,j)
  862. defor23(i,k,j) = defor23(i,k,j) + tmp1(i,k,j)
  863. END DO
  864. END DO
  865. END DO
  866. DO j = j_start, j_end
  867. DO i = i_start, i_end
  868. nba_rij(i,kts ,j,P_r23) = 0.0
  869. nba_rij(i,ktf+1,j,P_r23) = 0.0
  870. END DO
  871. END DO
  872. ! End addition of the second term to defor23.
  873. !-----------------------------------------------------------------------
  874. !-----------------------------------------------------------------------
  875. ! Update the boundary for defor13 and defor23 (might need to change
  876. ! later).
  877. IF ( .NOT. config_flags%periodic_x .AND. i_start .EQ. ids+1) THEN
  878. DO j = jts, jte
  879. DO k = kts, kte
  880. defor13(ids,k,j) = defor13(ids+1,k,j)
  881. defor23(ids,k,j) = defor23(ids+1,k,j)
  882. nba_rij(ids,k,j,P_r13) = nba_rij(ids+1,k,j,P_r13)
  883. nba_rij(ids,k,j,P_r23) = nba_rij(ids+1,k,j,P_r23)
  884. END DO
  885. END DO
  886. END IF
  887. IF ( .NOT. config_flags%periodic_y .AND. j_start .EQ. jds+1) THEN
  888. DO k = kts, kte
  889. DO i = its, ite
  890. defor13(i,k,jds) = defor13(i,k,jds+1)
  891. defor23(i,k,jds) = defor23(i,k,jds+1)
  892. nba_rij(i,k,jds,P_r13) = nba_rij(i,k,jds+1,P_r13)
  893. nba_rij(i,k,jds,P_r23) = nba_rij(i,k,jds+1,P_r23)
  894. END DO
  895. END DO
  896. END IF
  897. IF ( .NOT. config_flags%periodic_x .AND. i_end .EQ. ide-1) THEN
  898. DO j = jts, jte
  899. DO k = kts, kte
  900. defor13(ide,k,j) = defor13(ide-1,k,j)
  901. defor23(ide,k,j) = defor23(ide-1,k,j)
  902. nba_rij(ide,k,j,P_r13) = nba_rij(ide-1,k,j,P_r13)
  903. nba_rij(ide,k,j,P_r23) = nba_rij(ide-1,k,j,P_r23)
  904. END DO
  905. END DO
  906. END IF
  907. IF ( .NOT. config_flags%periodic_y .AND. j_end .EQ. jde-1) THEN
  908. DO k = kts, kte
  909. DO i = its, ite
  910. defor13(i,k,jde) = defor13(i,k,jde-1)
  911. defor23(i,k,jde) = defor23(i,k,jde-1)
  912. nba_rij(i,k,jde,P_r13) = nba_rij(i,k,jde-1,P_r13)
  913. nba_rij(i,k,jde,P_r23) = nba_rij(i,k,jde-1,P_r23)
  914. END DO
  915. END DO
  916. END IF
  917. ELSE ! NOT NBA--------------------------------------------------------
  918. ! Add tmp1 to defor23.
  919. DO j = j_start, j_end
  920. DO k = kts+1, ktf
  921. DO i = i_start, i_end
  922. defor23(i,k,j) = defor23(i,k,j) + tmp1(i,k,j)
  923. END DO
  924. END DO
  925. END DO
  926. ! End addition of the second term to defor23.
  927. !-----------------------------------------------------------------------
  928. !-----------------------------------------------------------------------
  929. ! Update the boundary for defor13 and defor23 (might need to change
  930. ! later).
  931. IF ( .NOT. config_flags%periodic_x .AND. i_start .EQ. ids+1) THEN
  932. DO j = jts, jte
  933. DO k = kts, kte
  934. defor13(ids,k,j) = defor13(ids+1,k,j)
  935. defor23(ids,k,j) = defor23(ids+1,k,j)
  936. END DO
  937. END DO
  938. END IF
  939. IF ( .NOT. config_flags%periodic_y .AND. j_start .EQ. jds+1) THEN
  940. DO k = kts, kte
  941. DO i = its, ite
  942. defor13(i,k,jds) = defor13(i,k,jds+1)
  943. defor23(i,k,jds) = defor23(i,k,jds+1)
  944. END DO
  945. END DO
  946. END IF
  947. IF ( .NOT. config_flags%periodic_x .AND. i_end .EQ. ide-1) THEN
  948. DO j = jts, jte
  949. DO k = kts, kte
  950. defor13(ide,k,j) = defor13(ide-1,k,j)
  951. defor23(ide,k,j) = defor23(ide-1,k,j)
  952. END DO
  953. END DO
  954. END IF
  955. IF ( .NOT. config_flags%periodic_y .AND. j_end .EQ. jde-1) THEN
  956. DO k = kts, kte
  957. DO i = its, ite
  958. defor13(i,k,jde) = defor13(i,k,jde-1)
  959. defor23(i,k,jde) = defor23(i,k,jde-1)
  960. END DO
  961. END DO
  962. END IF
  963. ENDIF ! NBA-----------------------------------------------------------
  964. ! End update of boundary for defor13 and defor23.
  965. !-----------------------------------------------------------------------
  966. ! The second three (defor12, defor13, defor23) of six deformation terms
  967. ! are now calculated at vorticity points.
  968. !=======================================================================
  969. END SUBROUTINE cal_deform_and_div
  970. !=======================================================================
  971. !=======================================================================
  972. SUBROUTINE calculate_km_kh( config_flags, dt, &
  973. dampcoef, zdamp, damp_opt, &
  974. xkmh, xkmv, xkhh, xkhv, &
  975. BN2, khdif, kvdif, div, &
  976. defor11, defor22, defor33, &
  977. defor12, defor13, defor23, &
  978. tke, p8w, t8w, theta, t, p, moist, &
  979. dn, dnw, dx, dy, rdz, rdzw, isotropic, &
  980. n_moist, cf1, cf2, cf3, warm_rain, &
  981. mix_upper_bound, &
  982. msftx, msfty, &
  983. ids, ide, jds, jde, kds, kde, &
  984. ims, ime, jms, jme, kms, kme, &
  985. its, ite, jts, jte, kts, kte )
  986. ! History: Sep 2003 Changes by George Bryan and Jason Knievel, NCAR
  987. ! Oct 2001 Converted to mass core by Bill Skamarock, NCAR
  988. ! ... ...
  989. ! Purpose: This routine calculates exchange coefficients for the TKE
  990. ! scheme.
  991. ! References: Klemp and Wilhelmson (JAS 1978)
  992. ! Deardorff (B-L Meteor 1980)
  993. ! Chen and Dudhia (NCAR WRF physics report 2000)
  994. !-----------------------------------------------------------------------
  995. ! Begin declarations.
  996. IMPLICIT NONE
  997. TYPE( grid_config_rec_type ), INTENT( IN ) &
  998. :: config_flags
  999. INTEGER, INTENT( IN ) &
  1000. :: n_moist, damp_opt, isotropic, &
  1001. ids, ide, jds, jde, kds, kde, &
  1002. ims, ime, jms, jme, kms, kme, &
  1003. its, ite, jts, jte, kts, kte
  1004. LOGICAL, INTENT( IN ) &
  1005. :: warm_rain
  1006. REAL, INTENT( IN ) &
  1007. :: dx, dy, zdamp, dt, dampcoef, cf1, cf2, cf3, khdif, kvdif
  1008. REAL, DIMENSION( kms:kme ), INTENT( IN ) &
  1009. :: dnw, dn
  1010. REAL, DIMENSION( ims:ime, kms:kme, jms:jme, n_moist ), INTENT( INOUT ) &
  1011. :: moist
  1012. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) &
  1013. :: xkmv, xkmh, xkhv, xkhh, BN2
  1014. REAL, DIMENSION( ims:ime , kms:kme, jms:jme ), INTENT( IN ) &
  1015. :: defor11, defor22, defor33, defor12, defor13, defor23, &
  1016. div, rdz, rdzw, p8w, t8w, theta, t, p
  1017. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) &
  1018. :: tke
  1019. REAL, INTENT( IN ) &
  1020. :: mix_upper_bound
  1021. REAL, DIMENSION( ims:ime, jms:jme ), INTENT( IN ) &
  1022. :: msftx, msfty
  1023. ! Local variables.
  1024. INTEGER &
  1025. :: i_start, i_end, j_start, j_end, ktf, i, j, k
  1026. ! End declarations.
  1027. !-----------------------------------------------------------------------
  1028. ktf = MIN( kte, kde-1 )
  1029. i_start = its
  1030. i_end = MIN( ite, ide-1 )
  1031. j_start = jts
  1032. j_end = MIN( jte, jde-1 )
  1033. CALL calculate_N2( config_flags, BN2, moist, &
  1034. theta, t, p, p8w, t8w, &
  1035. dnw, dn, rdz, rdzw, &
  1036. n_moist, cf1, cf2, cf3, warm_rain, &
  1037. ids, ide, jds, jde, kds, kde, &
  1038. ims, ime, jms, jme, kms, kme, &
  1039. its, ite, jts, jte, kts, kte )
  1040. ! Select a scheme for calculating diffusion coefficients.
  1041. km_coef: SELECT CASE( config_flags%km_opt )
  1042. CASE (1)
  1043. CALL isotropic_km( config_flags, xkmh, xkmv, &
  1044. xkhh, xkhv, khdif, kvdif, &
  1045. ids, ide, jds, jde, kds, kde, &
  1046. ims, ime, jms, jme, kms, kme, &
  1047. its, ite, jts, jte, kts, kte )
  1048. CASE (2)
  1049. CALL tke_km( config_flags, xkmh, xkmv, &
  1050. xkhh, xkhv, BN2, tke, p8w, t8w, theta, &
  1051. rdz, rdzw, dx, dy, dt, isotropic, &
  1052. mix_upper_bound, msftx, msfty, &
  1053. ids, ide, jds, jde, kds, kde, &
  1054. ims, ime, jms, jme, kms, kme, &
  1055. its, ite, jts, jte, kts, kte )
  1056. CASE (3)
  1057. CALL smag_km( config_flags, xkmh, xkmv, &
  1058. xkhh, xkhv, BN2, div, &
  1059. defor11, defor22, defor33, &
  1060. defor12, defor13, defor23, &
  1061. rdzw, dx, dy, dt, isotropic, &
  1062. mix_upper_bound, msftx, msfty, &
  1063. ids, ide, jds, jde, kds, kde, &
  1064. ims, ime, jms, jme, kms, kme, &
  1065. its, ite, jts, jte, kts, kte )
  1066. CASE (4)
  1067. CALL smag2d_km( config_flags, xkmh, xkmv, &
  1068. xkhh, xkhv, defor11, defor22, defor12, &
  1069. rdzw, dx, dy, msftx, msfty, &
  1070. ids, ide, jds, jde, kds, kde, &
  1071. ims, ime, jms, jme, kms, kme, &
  1072. its, ite, jts, jte, kts, kte )
  1073. CASE DEFAULT
  1074. CALL wrf_error_fatal( 'Please choose diffusion coefficient scheme' )
  1075. END SELECT km_coef
  1076. IF ( damp_opt .eq. 1 ) THEN
  1077. CALL cal_dampkm( config_flags, xkmh, xkhh, xkmv, xkhv, &
  1078. dx, dy, dt, dampcoef, rdz, rdzw, zdamp, &
  1079. msftx, msfty, &
  1080. ids, ide, jds, jde, kds, kde, &
  1081. ims, ime, jms, jme, kms, kme, &
  1082. its, ite, jts, jte, kts, kte )
  1083. END IF
  1084. END SUBROUTINE calculate_km_kh
  1085. !=======================================================================
  1086. SUBROUTINE cal_dampkm( config_flags,xkmh,xkhh,xkmv,xkhv, &
  1087. dx,dy,dt,dampcoef, &
  1088. rdz, rdzw ,zdamp, &
  1089. msftx, msfty, &
  1090. ids,ide, jds,jde, kds,kde, &
  1091. ims,ime, jms,jme, kms,kme, &
  1092. its,ite, jts,jte, kts,kte )
  1093. !-----------------------------------------------------------------------
  1094. ! Begin declarations.
  1095. IMPLICIT NONE
  1096. TYPE(grid_config_rec_type) , INTENT(IN ) :: config_flags
  1097. INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
  1098. ims, ime, jms, jme, kms, kme, &
  1099. its, ite, jts, jte, kts, kte
  1100. REAL , INTENT(IN ) :: zdamp,dx,dy,dt,dampcoef
  1101. REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: xkmh , &
  1102. xkhh , &
  1103. xkmv , &
  1104. xkhv
  1105. REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(IN ) :: rdz, &
  1106. rdzw
  1107. REAL , DIMENSION( ims:ime, jms:jme), INTENT(IN ) :: msftx, &
  1108. msfty
  1109. ! LOCAL VARS
  1110. INTEGER :: i_start, i_end, j_start, j_end, ktf, ktfm1, i, j, k
  1111. REAL :: kmmax,kmmvmax,degrad90,dz,tmp
  1112. REAL :: ds
  1113. REAL , DIMENSION( its:ite ) :: deltaz
  1114. REAL , DIMENSION( its:ite, kts:kte, jts:jte) :: dampk,dampkv
  1115. ! End declarations.
  1116. !-----------------------------------------------------------------------
  1117. ktf = min(kte,kde-1)
  1118. ktfm1 = ktf-1
  1119. i_start = its
  1120. i_end = MIN(ite,ide-1)
  1121. j_start = jts
  1122. j_end = MIN(jte,jde-1)
  1123. ! keep upper damping diffusion away from relaxation zones at boundaries if used
  1124. IF(config_flags%specified .OR. config_flags%nested)THEN
  1125. i_start = MAX(i_start,ids+config_flags%spec_bdy_width-1)
  1126. i_end = MIN(i_end,ide-config_flags%spec_bdy_width)
  1127. j_start = MAX(j_start,jds+config_flags%spec_bdy_width-1)
  1128. j_end = MIN(j_end,jde-config_flags%spec_bdy_width)
  1129. ENDIF
  1130. kmmax=dx*dx/dt
  1131. degrad90=DEGRAD*90.
  1132. DO j = j_start, j_end
  1133. k=ktf
  1134. DO i = i_start, i_end
  1135. ! Unmodified dx used above may produce very large diffusivities
  1136. ! when msftx is very large. And the above formula ignores the fact
  1137. ! that dy may now be different from dx as well. Let's fix that by
  1138. ! defining a "ds" as the minimum of the "real-space" (physical
  1139. ! distance) values of dx and dy, and then using that smallest value
  1140. ! to calculate a point-by-point kmmax
  1141. ds = MIN(dx/msftx(i,j),dy/msfty(i,j))
  1142. kmmax=ds*ds/dt
  1143. ! deltaz(i)=0.5*dnw(k)/zeta_z(i,j)
  1144. ! dz=dnw(k)/zeta_z(i,j)
  1145. dz = 1./rdzw(i,k,j)
  1146. deltaz(i) = 0.5*dz
  1147. kmmvmax=dz*dz/dt
  1148. tmp=min(deltaz(i)/zdamp,1.)
  1149. dampk(i,k,j)=cos(degrad90*tmp)*cos(degrad90*tmp)*kmmax*dampcoef
  1150. dampkv(i,k,j)=cos(degrad90*tmp)*cos(degrad90*tmp)*kmmvmax*dampcoef
  1151. ! set upper limit on vertical K (based on horizontal K)
  1152. dampkv(i,k,j)=min(dampkv(i,k,j),dampk(i,k,j))
  1153. ENDDO
  1154. DO k = ktfm1,kts,-1
  1155. DO i = i_start, i_end
  1156. ! Unmodified dx used above may produce very large diffusivities
  1157. ! when msftx is very large. And the above formula ignores the fact
  1158. ! that dy may now be different from dx as well. Let's fix that by
  1159. ! defining a "ds" as the minimum of the "real-space" (physical
  1160. ! distance) values of dx and dy, and then using that smallest value
  1161. ! to calculate a point-by-point kmmax
  1162. ds = MIN(dx/msftx(i,j),dy/msfty(i,j))
  1163. kmmax=ds*ds/dt
  1164. ! deltaz(i)=deltaz(i)+dn(k)/zeta_z(i,j)
  1165. ! dz=dnw(k)/zeta_z(i,j)
  1166. dz = 1./rdz(i,k,j)
  1167. deltaz(i) = deltaz(i) + dz
  1168. dz = 1./rdzw(i,k,j)
  1169. kmmvmax=dz*dz/dt
  1170. tmp=min(deltaz(i)/zdamp,1.)
  1171. dampk(i,k,j)=cos(degrad90*tmp)*cos(degrad90*tmp)*kmmax*dampcoef
  1172. dampkv(i,k,j)=cos(degrad90*tmp)*cos(degrad90*tmp)*kmmvmax*dampcoef
  1173. ! set upper limit on vertical K (based on horizontal K)
  1174. dampkv(i,k,j)=min(dampkv(i,k,j),dampk(i,k,j))
  1175. ENDDO
  1176. ENDDO
  1177. ENDDO
  1178. DO j = j_start, j_end
  1179. DO k = kts,ktf
  1180. DO i = i_start, i_end
  1181. xkmh(i,k,j)=max(xkmh(i,k,j),dampk(i,k,j))
  1182. xkhh(i,k,j)=max(xkhh(i,k,j),dampk(i,k,j))
  1183. xkmv(i,k,j)=max(xkmv(i,k,j),dampkv(i,k,j))
  1184. xkhv(i,k,j)=max(xkhv(i,k,j),dampkv(i,k,j))
  1185. ENDDO
  1186. ENDDO
  1187. ENDDO
  1188. END SUBROUTINE cal_dampkm
  1189. !=======================================================================
  1190. !=======================================================================
  1191. SUBROUTINE calculate_N2( config_flags, BN2, moist, &
  1192. theta, t, p, p8w, t8w, &
  1193. dnw, dn, rdz, rdzw, &
  1194. n_moist, cf1, cf2, cf3, warm_rain, &
  1195. ids, ide, jds, jde, kds, kde, &
  1196. ims, ime, jms, jme, kms, kme, &
  1197. its, ite, jts, jte, kts, kte )
  1198. !-----------------------------------------------------------------------
  1199. ! Begin declarations.
  1200. IMPLICIT NONE
  1201. TYPE( grid_config_rec_type ), INTENT( IN ) &
  1202. :: config_flags
  1203. INTEGER, INTENT( IN ) &
  1204. :: n_moist, &
  1205. ids, ide, jds, jde, kds, kde, &
  1206. ims, ime, jms, jme, kms, kme, &
  1207. its, ite, jts, jte, kts, kte
  1208. LOGICAL, INTENT( IN ) &
  1209. :: warm_rain
  1210. REAL, INTENT( IN ) &
  1211. :: cf1, cf2, cf3
  1212. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) &
  1213. :: BN2
  1214. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
  1215. :: rdz, rdzw, theta, t, p, p8w, t8w
  1216. REAL, DIMENSION( kms:kme ), INTENT( IN ) &
  1217. :: dnw, dn
  1218. REAL, DIMENSION( ims:ime, kms:kme, jms:jme, n_moist), INTENT( INOUT ) &
  1219. :: moist
  1220. ! Local variables.
  1221. INTEGER &
  1222. :: i, j, k, ktf, ispe, ktes1, ktes2, &
  1223. i_start, i_end, j_start, j_end
  1224. REAL &
  1225. :: coefa, thetaep1, thetaem1, qc_cr, es, tc, qlpqi, qsw, qsi, &
  1226. tmpdz, xlvqv, thetaesfc, thetasfc, qvtop, qvsfc, thetatop, thetaetop
  1227. REAL, DIMENSION( its:ite, jts:jte ) &
  1228. :: tmp1sfc, tmp1top
  1229. REAL, DIMENSION( its:ite, kts:kte, jts:jte ) &
  1230. :: tmp1, qvs, qctmp
  1231. ! End declarations.
  1232. !-----------------------------------------------------------------------
  1233. qc_cr = 0.00001 ! in Kg/Kg
  1234. ktf = MIN( kte, kde-1 )
  1235. ktes1 = kte-1
  1236. ktes2 = kte-2
  1237. i_start = its
  1238. i_end = MIN( ite, ide-1 )
  1239. j_start = jts
  1240. j_end = MIN( jte, jde-1 )
  1241. IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
  1242. config_flags%nested) i_start = MAX( ids+1, its )
  1243. IF ( config_flags%open_xe .OR. config_flags%specified .OR. &
  1244. config_flags%nested) i_end = MIN( ide-2, ite )
  1245. IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
  1246. config_flags%nested) j_start = MAX( jds+1, jts )
  1247. IF ( config_flags%open_ye .OR. config_flags%specified .OR. &
  1248. config_flags%nested) j_end = MIN( jde-2 ,jte )
  1249. IF ( config_flags%periodic_x ) i_start = its
  1250. IF ( config_flags%periodic_x ) i_end = MIN( ite, ide-1 )
  1251. IF ( P_QC .GT. PARAM_FIRST_SCALAR) THEN
  1252. DO j = j_start, j_end
  1253. DO k = kts, ktf
  1254. DO i = i_start, i_end
  1255. qctmp(i,k,j) = moist(i,k,j,P_QC)
  1256. END DO
  1257. END DO
  1258. END DO
  1259. ELSE
  1260. DO j = j_start, j_end
  1261. DO k = kts, ktf
  1262. DO i = i_start, i_end
  1263. qctmp(i,k,j) = 0.0
  1264. END DO
  1265. END DO
  1266. END DO
  1267. END IF
  1268. DO j = jts, jte
  1269. DO k = kts, kte
  1270. DO i = its, ite
  1271. tmp1(i,k,j) = 0.0
  1272. END DO
  1273. END DO
  1274. END DO
  1275. DO j = jts,jte
  1276. DO i = its,ite
  1277. tmp1sfc(i,j) = 0.0
  1278. tmp1top(i,j) = 0.0
  1279. END DO
  1280. END DO
  1281. DO ispe = PARAM_FIRST_SCALAR, n_moist
  1282. IF ( ispe .EQ. P_QV .OR. ispe .EQ. P_QC .OR. ispe .EQ. P_QI) THEN
  1283. DO j = j_start, j_end
  1284. DO k = kts, ktf
  1285. DO i = i_start, i_end
  1286. tmp1(i,k,j) = tmp1(i,k,j) + moist(i,k,j,ispe)
  1287. END DO
  1288. END DO
  1289. END DO
  1290. DO j = j_start, j_end
  1291. DO i = i_start, i_end
  1292. tmp1sfc(i,j) = tmp1sfc(i,j) + &
  1293. cf1 * moist(i,1,j,ispe) + &
  1294. cf2 * moist(i,2,j,ispe) + &
  1295. cf3 * moist(i,3,j,ispe)
  1296. tmp1top(i,j) = tmp1top(i,j) + &
  1297. moist(i,ktes1,j,ispe) + &
  1298. ( moist(i,ktes1,j,ispe) - moist(i,ktes2,j,ispe) ) * &
  1299. 0.5 * dnw(ktes1) / dn(ktes1)
  1300. END DO
  1301. END DO
  1302. END IF
  1303. END DO
  1304. ! Calculate saturation mixing ratio.
  1305. DO j = j_start, j_end
  1306. DO k = kts, ktf
  1307. DO i = i_start, i_end
  1308. tc = t(i,k,j) - SVPT0
  1309. es = 1000.0 * SVP1 * EXP( SVP2 * tc / ( t(i,k,j) - SVP3 ) )
  1310. qvs(i,k,j) = EP_2 * es / ( p(i,k,j) - es )
  1311. END DO
  1312. END DO
  1313. END DO
  1314. DO j = j_start, j_end
  1315. DO k = kts+1, ktf-1
  1316. DO i = i_start, i_end
  1317. tmpdz = 1.0 / rdz(i,k,j) + 1.0 / rdz(i,k+1,j)
  1318. IF ( moist(i,k,j,P_QV) .GE. qvs(i,k,j) .OR. qctmp(i,k,j) .GE. qc_cr) THEN
  1319. xlvqv = XLV * moist(i,k,j,P_QV)
  1320. coefa = ( 1.0 + xlvqv / R_d / t(i,k,j) ) / &
  1321. ( 1.0 + XLV * xlvqv / Cp / R_v / t(i,k,j) / t(i,k,j) ) / &
  1322. theta(i,k,j)
  1323. thetaep1 = theta(i,k+1,j) * &
  1324. ( 1.0 + XLV * qvs(i,k+1,j) / Cp / t(i,k+1,j) )
  1325. thetaem1 = theta(i,k-1,j) * &
  1326. ( 1.0 + XLV * qvs(i,k-1,j) / Cp / t(i,k-1,j) )
  1327. BN2(i,k,j) = g * ( coefa * ( thetaep1 - thetaem1 ) / tmpdz - &
  1328. ( tmp1(i,k+1,j) - tmp1(i,k-1,j) ) / tmpdz )
  1329. ELSE
  1330. BN2(i,k,j) = g * ( (theta(i,k+1,j) - theta(i,k-1,j) ) / &
  1331. theta(i,k,j) / tmpdz + &
  1332. 1.61 * ( moist(i,k+1,j,P_QV) - moist(i,k-1,j,P_QV) ) / &
  1333. tmpdz - &
  1334. ( tmp1(i,k+1,j) - tmp1(i,k-1,j) ) / tmpdz )
  1335. ENDIF
  1336. END DO
  1337. END DO
  1338. END DO
  1339. k = kts
  1340. DO j = j_start, j_end
  1341. DO i = i_start, i_end
  1342. tmpdz = 1.0 / rdz(i,k+1,j) + 0.5 / rdzw(i,k,j)
  1343. thetasfc = T8w(i,kts,j) / ( p8w(i,k,j) / p1000mb )**( R_d / Cp )
  1344. IF ( moist(i,k,j,P_QV) .GE. qvs(i,k,j) .OR. qctmp(i,k,j) .GE. qc_cr) THEN
  1345. qvsfc = cf1 * qvs(i,1,j) + &
  1346. cf2 * qvs(i,2,j) + &
  1347. cf3 * qvs(i,3,j)
  1348. xlvqv = XLV * moist(i,k,j,P_QV)
  1349. coefa = ( 1.0 + xlvqv / R_d / t(i,k,j) ) / &
  1350. ( 1.0 + XLV * xlvqv / Cp / R_v / t(i,k,j) / t(i,k,j) ) / &
  1351. theta(i,k,j)
  1352. thetaep1 = theta(i,k+1,j) * &
  1353. ( 1.0 + XLV * qvs(i,k+1,j) / Cp / t(i,k+1,j) )
  1354. thetaesfc = thetasfc * &
  1355. ( 1.0 + XLV * qvsfc / Cp / t8w(i,kts,j) )
  1356. BN2(i,k,j) = g * ( coefa * ( thetaep1 - thetaesfc ) / tmpdz - &
  1357. ( tmp1(i,k+1,j) - tmp1sfc(i,j) ) / tmpdz )
  1358. ELSE
  1359. qvsfc = cf1 * moist(i,1,j,P_QV) + &
  1360. cf2 * moist(i,2,j,P_QV) + &
  1361. cf3 * moist(i,3,j,P_QV)
  1362. ! BN2(i,k,j) = g * ( ( theta(i,k+1,j) - thetasfc ) / &
  1363. ! theta(i,k,j) / tmpdz + &
  1364. ! 1.61 * ( moist(i,k+1,j,P_QV) - qvsfc ) / &
  1365. ! tmpdz - &
  1366. ! ( tmp1(i,k+1,j) - tmp1sfc(i,j) ) / tmpdz )
  1367. !...... MARTA: change in computation of BN2 at the surface, WCS 040331
  1368. tmpdz= 1./rdzw(i,k,j) ! controlare come calcola rdzw
  1369. BN2(i,k,j) = g * ( ( theta(i,k+1,j) - theta(i,k,j)) / &
  1370. theta(i,k,j) / tmpdz + &
  1371. 1.61 * ( moist(i,k+1,j,P_QV) - qvsfc ) / &
  1372. tmpdz - &
  1373. ( tmp1(i,k+1,j) - tmp1sfc(i,j) ) / tmpdz )
  1374. ! end of MARTA/WCS change
  1375. ENDIF
  1376. END DO
  1377. END DO
  1378. !...... MARTA: change in computation of BN2 at the top, WCS 040331
  1379. DO j = j_start, j_end
  1380. DO i = i_start, i_end
  1381. BN2(i,ktf,j)=BN2(i,ktf-1,j)
  1382. END DO
  1383. END DO
  1384. ! end of MARTA/WCS change
  1385. END SUBROUTINE calculate_N2
  1386. !=======================================================================
  1387. !=======================================================================
  1388. SUBROUTINE isotropic_km( config_flags, &
  1389. xkmh,xkmv,xkhh,xkhv,khdif,kvdif, &
  1390. ids,ide, jds,jde, kds,kde, &
  1391. ims,ime, jms,jme, kms,kme, &
  1392. its,ite, jts,jte, kts,kte )
  1393. !-----------------------------------------------------------------------
  1394. ! Begin declarations.
  1395. IMPLICIT NONE
  1396. TYPE(grid_config_rec_type) , INTENT(IN ) :: config_flags
  1397. INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
  1398. ims, ime, jms, jme, kms, kme, &
  1399. its, ite, jts, jte, kts, kte
  1400. REAL , INTENT(IN ) :: khdif,kvdif
  1401. REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(INOUT) :: xkmh, &
  1402. xkmv, &
  1403. xkhh, &
  1404. xkhv
  1405. ! LOCAL VARS
  1406. INTEGER :: i_start, i_end, j_start, j_end, ktf, i, j, k
  1407. REAL :: khdif3,kvdif3
  1408. ! End declarations.
  1409. !-----------------------------------------------------------------------
  1410. ktf = kte
  1411. i_start = its
  1412. i_end = MIN(ite,ide-1)
  1413. j_start = jts
  1414. j_end = MIN(jte,jde-1)
  1415. ! khdif3=khdif*3.
  1416. ! kvdif3=kvdif*3.
  1417. khdif3=khdif/prandtl
  1418. kvdif3=kvdif/prandtl
  1419. DO j = j_start, j_end
  1420. DO k = kts, ktf
  1421. DO i = i_start, i_end
  1422. xkmh(i,k,j)=khdif
  1423. xkmv(i,k,j)=kvdif
  1424. xkhh(i,k,j)=khdif3
  1425. xkhv(i,k,j)=kvdif3
  1426. ENDDO
  1427. ENDDO
  1428. ENDDO
  1429. END SUBROUTINE isotropic_km
  1430. !=======================================================================
  1431. !=======================================================================
  1432. SUBROUTINE smag_km( config_flags,xkmh,xkmv,xkhh,xkhv,BN2, &
  1433. div,defor11,defor22,defor33,defor12, &
  1434. defor13,defor23, &
  1435. rdzw,dx,dy,dt,isotropic, &
  1436. mix_upper_bound, msftx, msfty, &
  1437. ids,ide, jds,jde, kds,kde, &
  1438. ims,ime, jms,jme, kms,kme, &
  1439. its,ite, jts,jte, kts,kte )
  1440. !-----------------------------------------------------------------------
  1441. ! Begin declarations.
  1442. IMPLICIT NONE
  1443. TYPE(grid_config_rec_type) , INTENT(IN ) :: config_flags
  1444. INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
  1445. ims, ime, jms, jme, kms, kme, &
  1446. its, ite, jts, jte, kts, kte
  1447. INTEGER , INTENT(IN ) :: isotropic
  1448. REAL , INTENT(IN ) :: dx, dy, dt, mix_upper_bound
  1449. REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(IN ) :: BN2, &
  1450. rdzw
  1451. REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(INOUT) :: xkmh, &
  1452. xkmv, &
  1453. xkhh, &
  1454. xkhv
  1455. REAL , DIMENSION( ims:ime , kms:kme, jms:jme ), INTENT(IN ) :: &
  1456. defor11, &
  1457. defor22, &
  1458. defor33, &
  1459. defor12, &
  1460. defor13, &
  1461. defor23, &
  1462. div
  1463. REAL , DIMENSION( ims:ime, jms:jme), INTENT(IN ) :: msftx, &
  1464. msfty
  1465. ! LOCAL VARS
  1466. INTEGER :: i_start, i_end, j_start, j_end, ktf, i, j, k
  1467. REAL :: deltas, tmp, pr, mlen_h, mlen_v, c_s
  1468. REAL, DIMENSION( its:ite , kts:kte , jts:jte ) :: def2
  1469. ! End declarations.
  1470. !-----------------------------------------------------------------------
  1471. ktf = min(kte,kde-1)
  1472. i_start = its
  1473. i_end = MIN(ite,ide-1)
  1474. j_start = jts
  1475. j_end = MIN(jte,jde-1)
  1476. IF ( config_flags%open_xs .or. config_flags%specified .or. &
  1477. config_flags%nested) i_start = MAX(ids+1,its)
  1478. IF ( config_flags%open_xe .or. config_flags%specified .or. &
  1479. config_flags%nested) i_end = MIN(ide-2,ite)
  1480. IF ( config_flags%open_ys .or. config_flags%specified .or. &
  1481. config_flags%nested) j_start = MAX(jds+1,jts)
  1482. IF ( config_flags%open_ye .or. config_flags%specified .or. &
  1483. config_flags%nested) j_end = MIN(jde-2,jte)
  1484. IF ( config_flags%periodic_x ) i_start = its
  1485. IF ( config_flags%periodic_x ) i_end = MIN( ite, ide-1 )
  1486. pr = prandtl
  1487. c_s = config_flags%c_s
  1488. do j=j_start,j_end
  1489. do k=kts,ktf
  1490. do i=i_start,i_end
  1491. def2(i,k,j)=0.5*(defor11(i,k,j)*defor11(i,k,j) + &
  1492. defor22(i,k,j)*defor22(i,k,j) + &
  1493. defor33(i,k,j)*defor33(i,k,j))
  1494. enddo
  1495. enddo
  1496. enddo
  1497. do j=j_start,j_end
  1498. do k=kts,ktf
  1499. do i=i_start,i_end
  1500. tmp=0.25*(defor12(i ,k,j)+defor12(i ,k,j+1)+ &
  1501. defor12(i+1,k,j)+defor12(i+1,k,j+1))
  1502. def2(i,k,j)=def2(i,k,j)+tmp*tmp
  1503. enddo
  1504. enddo
  1505. enddo
  1506. do j=j_start,j_end
  1507. do k=kts,ktf
  1508. do i=i_start,i_end
  1509. tmp=0.25*(defor13(i ,k+1,j)+defor13(i ,k,j)+ &
  1510. defor13(i+1,k+1,j)+defor13(i+1,k,j))
  1511. def2(i,k,j)=def2(i,k,j)+tmp*tmp
  1512. enddo
  1513. enddo
  1514. enddo
  1515. do j=j_start,j_end
  1516. do k=kts,ktf
  1517. do i=i_start,i_end
  1518. tmp=0.25*(defor23(i,k+1,j )+defor23(i,k,j )+ &
  1519. defor23(i,k+1,j+1)+defor23(i,k,j+1))
  1520. def2(i,k,j)=def2(i,k,j)+tmp*tmp
  1521. enddo
  1522. enddo
  1523. enddo
  1524. !
  1525. IF (isotropic .EQ. 0) THEN
  1526. DO j = j_start, j_end
  1527. DO k = kts, ktf
  1528. DO i = i_start, i_end
  1529. mlen_h=sqrt(dx/msftx(i,j) * dy/msfty(i,j))
  1530. mlen_v= 1./rdzw(i,k,j)
  1531. tmp=max(0.,def2(i,k,j)-BN2(i,k,j)/pr)
  1532. tmp=tmp**0.5
  1533. xkmh(i,k,j)=max(c_s*c_s*mlen_h*mlen_h*tmp, 1.0E-6*mlen_h*mlen_h )
  1534. xkmh(i,k,j)=min(xkmh(i,k,j), mix_upper_bound * mlen_h * mlen_h / dt )
  1535. xkmv(i,k,j)=max(c_s*c_s*mlen_v*mlen_v*tmp, 1.0E-6*mlen_v*mlen_v )
  1536. xkmv(i,k,j)=min(xkmv(i,k,j), mix_upper_bound * mlen_v * mlen_v / dt )
  1537. xkhh(i,k,j)=xkmh(i,k,j)/pr
  1538. xkhh(i,k,j)=min(xkhh(i,k,j), mix_upper_bound * mlen_h * mlen_h / dt )
  1539. xkhv(i,k,j)=xkmv(i,k,j)/pr
  1540. xkhv(i,k,j)=min(xkhv(i,k,j), mix_upper_bound * mlen_v * mlen_v / dt )
  1541. ENDDO
  1542. ENDDO
  1543. ENDDO
  1544. ELSE
  1545. DO j = j_start, j_end
  1546. DO k = kts, ktf
  1547. DO i = i_start, i_end
  1548. deltas=(dx/msftx(i,j) * dy/msfty(i,j)/rdzw(i,k,j))**0.33333333
  1549. tmp=max(0.,def2(i,k,j)-BN2(i,k,j)/pr)
  1550. tmp=tmp**0.5
  1551. xkmh(i,k,j)=max(c_s*c_s*deltas*deltas*tmp, 1.0E-6*deltas*deltas )
  1552. xkmh(i,k,j)=min(xkmh(i,k,j), mix_upper_bound * dx/msftx(i,j) * dy/msfty(i,j) / dt )
  1553. xkmv(i,k,j)=xkmh(i,k,j)
  1554. xkmv(i,k,j)=min(xkmv(i,k,j), mix_upper_bound / rdzw(i,k,j) / rdzw(i,k,j) / dt )
  1555. xkhh(i,k,j)=xkmh(i,k,j)/pr
  1556. xkhh(i,k,j)=min(xkhh(i,k,j), mix_upper_bound * dx/msftx(i,j) * dy/msfty(i,j) / dt )
  1557. xkhv(i,k,j)=xkmv(i,k,j)/pr
  1558. xkhv(i,k,j)=min(xkhv(i,k,j), mix_upper_bound / rdzw(i,k,j) / rdzw(i,k,j) / dt )
  1559. ENDDO
  1560. ENDDO
  1561. ENDDO
  1562. ENDIF
  1563. END SUBROUTINE smag_km
  1564. !=======================================================================
  1565. !=======================================================================
  1566. SUBROUTINE smag2d_km( config_flags,xkmh,xkmv,xkhh,xkhv, &
  1567. defor11,defor22,defor12, &
  1568. rdzw,dx,dy,msftx, msfty, &
  1569. ids,ide, jds,jde, kds,kde, &
  1570. ims,ime, jms,jme, kms,kme, &
  1571. its,ite, jts,jte, kts,kte )
  1572. !-----------------------------------------------------------------------
  1573. ! Begin declarations.
  1574. IMPLICIT NONE
  1575. TYPE(grid_config_rec_type) , INTENT(IN ) :: config_flags
  1576. INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
  1577. ims, ime, jms, jme, kms, kme, &
  1578. its, ite, jts, jte, kts, kte
  1579. REAL , INTENT(IN ) :: dx, dy
  1580. REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(IN ) :: rdzw
  1581. REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(INOUT) :: xkmh, &
  1582. xkmv, &
  1583. xkhh, &
  1584. xkhv
  1585. REAL , DIMENSION( ims:ime , kms:kme, jms:jme ), INTENT(IN ) :: &
  1586. defor11, &
  1587. defor22, &
  1588. defor12
  1589. REAL , DIMENSION( ims:ime, jms:jme), INTENT(IN ) :: msftx, &
  1590. msfty
  1591. ! LOCAL VARS
  1592. INTEGER :: i_start, i_end, j_start, j_end, ktf, i, j, k
  1593. REAL :: deltas, tmp, pr, mlen_h, c_s
  1594. REAL, DIMENSION( its:ite , kts:kte , jts:jte ) :: def2
  1595. ! End declarations.
  1596. !-----------------------------------------------------------------------
  1597. ktf = min(kte,kde-1)
  1598. i_start = its
  1599. i_end = MIN(ite,ide-1)
  1600. j_start = jts
  1601. j_end = MIN(jte,jde-1)
  1602. IF ( config_flags%open_xs .or. config_flags%specified .or. &
  1603. config_flags%nested) i_start = MAX(ids+1,its)
  1604. IF ( config_flags%open_xe .or. config_flags%specified .or. &
  1605. config_flags%nested) i_end = MIN(ide-2,ite)
  1606. IF ( config_flags%open_ys .or. config_flags%specified .or. &
  1607. config_flags%nested) j_start = MAX(jds+1,jts)
  1608. IF ( config_flags%open_ye .or. config_flags%specified .or. &
  1609. config_flags%nested) j_end = MIN(jde-2,jte)
  1610. IF ( config_flags%periodic_x ) i_start = its
  1611. IF ( config_flags%periodic_x ) i_end = MIN( ite, ide-1 )
  1612. pr=prandtl
  1613. c_s = config_flags%c_s
  1614. do j=j_start,j_end
  1615. do k=kts,ktf
  1616. do i=i_start,i_end
  1617. def2(i,k,j)=0.25*((defor11(i,k,j)-defor22(i,k,j))*(defor11(i,k,j)-defor22(i,k,j)))
  1618. tmp=0.25*(defor12(i ,k,j)+defor12(i ,k,j+1)+ &
  1619. defor12(i+1,k,j)+defor12(i+1,k,j+1))
  1620. def2(i,k,j)=def2(i,k,j)+tmp*tmp
  1621. enddo
  1622. enddo
  1623. enddo
  1624. !
  1625. DO j = j_start, j_end
  1626. DO k = kts, ktf
  1627. DO i = i_start, i_end
  1628. mlen_h=sqrt(dx/msftx(i,j) * dy/msfty(i,j))
  1629. tmp=sqrt(def2(i,k,j))
  1630. ! xkmh(i,k,j)=max(c_s*c_s*mlen_h*mlen_h*tmp, 1.0E-6*mlen_h*mlen_h )
  1631. xkmh(i,k,j)=c_s*c_s*mlen_h*mlen_h*tmp
  1632. xkmh(i,k,j)=min(xkmh(i,k,j), 10.*mlen_h )
  1633. xkmv(i,k,j)=0.
  1634. xkhh(i,k,j)=xkmh(i,k,j)/pr
  1635. xkhv(i,k,j)=0.
  1636. ENDDO
  1637. ENDDO
  1638. ENDDO
  1639. END SUBROUTINE smag2d_km
  1640. !=======================================================================
  1641. !=======================================================================
  1642. SUBROUTINE tke_km( config_flags, xkmh, xkmv, xkhh, xkhv, &
  1643. bn2, tke, p8w, t8w, theta, &
  1644. rdz, rdzw, dx,dy, dt, isotropic, &
  1645. mix_upper_bound, msftx, msfty, &
  1646. ids, ide, jds, jde, kds, kde, &
  1647. ims, ime, jms, jme, kms, kme, &
  1648. its, ite, jts, jte, kts, kte )
  1649. ! History: Sep 2003 Changes by Jason Knievel and George Bryan, NCAR
  1650. ! Oct 2001 Converted to mass core by Bill Skamarock, NCAR
  1651. ! ... ...
  1652. ! Purpose: This routine calculates the exchange coefficients for the
  1653. ! TKE turbulence parameterization.
  1654. ! References: Klemp and Wilhelmson (JAS 1978)
  1655. ! Chen and Dudhia (NCAR WRF physics report 2000)
  1656. !-----------------------------------------------------------------------
  1657. ! Begin declarations.
  1658. IMPLICIT NONE
  1659. TYPE( grid_config_rec_type ), INTENT( IN ) &
  1660. :: config_flags
  1661. INTEGER, INTENT( IN ) &
  1662. :: ids, ide, jds, jde, kds, kde, &
  1663. ims, ime, jms, jme, kms, kme, &
  1664. its, ite, jts, jte, kts, kte
  1665. INTEGER, INTENT( IN ) :: isotropic
  1666. REAL, INTENT( IN ) &
  1667. :: dx, dy, dt
  1668. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
  1669. :: tke, p8w, t8w, theta, rdz, rdzw, bn2
  1670. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) &
  1671. :: xkmh, xkmv, xkhh, xkhv
  1672. REAL, INTENT( IN ) &
  1673. :: mix_upper_bound
  1674. REAL , DIMENSION( ims:ime, jms:jme), INTENT(IN ) :: msftx, &
  1675. msfty
  1676. ! Local variables.
  1677. REAL, DIMENSION( its:ite, kts:kte, jts:jte ) &
  1678. :: l_scale
  1679. REAL, DIMENSION( its:ite, kts:kte, jts:jte ) &
  1680. :: dthrdn
  1681. REAL &
  1682. :: deltas, tmp, mlen_s, mlen_h, mlen_v, tmpdz, &
  1683. thetasfc, thetatop, minkx, pr_inv, pr_inv_h, pr_inv_v, c_k
  1684. INTEGER &
  1685. :: i_start, i_end, j_start, j_end, ktf, i, j, k
  1686. REAL, PARAMETER :: tke_seed_value = 1.e-06
  1687. REAL :: tke_seed
  1688. REAL, PARAMETER :: epsilon = 1.e-10
  1689. ! End declarations.
  1690. !-----------------------------------------------------------------------
  1691. ktf = MIN( kte, kde-1 )
  1692. i_start = its
  1693. i_end = MIN( ite, ide-1 )
  1694. j_start = jts
  1695. j_end = MIN( jte, jde-1 )
  1696. IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
  1697. config_flags%nested) i_start = MAX( ids+1, its )
  1698. IF ( config_flags%open_xe .OR. config_flags%specified .OR. &
  1699. config_flags%nested) i_end = MIN( ide-2, ite )
  1700. IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
  1701. config_flags%nested) j_start = MAX( jds+1, jts )
  1702. IF ( config_flags%open_ye .OR. config_flags%specified .OR. &
  1703. config_flags%nested) j_end = MIN( jde-2, jte)
  1704. IF ( config_flags%periodic_x ) i_start = its
  1705. IF ( config_flags%periodic_x ) i_end = MIN( ite, ide-1 )
  1706. ! in the absence of surface drag or a surface heat flux, there
  1707. ! is no way to generate tke without pre-existing tke. Use
  1708. ! tke_seed if the drag and flux are off.
  1709. c_k = config_flags%c_k
  1710. tke_seed = tke_seed_value
  1711. if( (config_flags%tke_drag_coefficient .gt. epsilon) .or. &
  1712. (config_flags%tke_heat_flux .gt. epsilon) ) tke_seed = 0.
  1713. DO j = j_start, j_end
  1714. DO k = kts+1, ktf-1
  1715. DO i = i_start, i_end
  1716. tmpdz = 1.0 / ( rdz(i,k+1,j) + rdz(i,k,j) )
  1717. dthrdn(i,k,j) = ( theta(i,k+1,j) - theta(i,k-1,j) ) / tmpdz
  1718. END DO
  1719. END DO
  1720. END DO
  1721. k = kts
  1722. DO j = j_start, j_end
  1723. DO i = i_start, i_end
  1724. tmpdz = 1.0 / ( rdzw(i,k+1,j) + rdzw(i,k,j) )
  1725. thetasfc = T8w(i,kts,j) / ( p8w(i,k,j) / p1000mb )**( R_d / Cp )
  1726. dthrdn(i,k,j) = ( theta(i,k+1,j) - thetasfc ) / tmpdz
  1727. END DO
  1728. END DO
  1729. k = ktf
  1730. DO j = j_start, j_end
  1731. DO i = i_start, i_end
  1732. tmpdz = 1.0 / rdz(i,k,j) + 0.5 / rdzw(i,k,j)
  1733. thetatop = T8w(i,kde,j) / ( p8w(i,kde,j) / p1000mb )**( R_d / Cp )
  1734. dthrdn(i,k,j) = ( thetatop - theta(i,k-1,j) ) / tmpdz
  1735. END DO
  1736. END DO
  1737. IF ( isotropic .EQ. 0 ) THEN
  1738. DO j = j_start, j_end
  1739. DO k = kts, ktf
  1740. DO i = i_start, i_end
  1741. mlen_h = SQRT( dx/msftx(i,j) * dy/msfty(i,j) )
  1742. tmp = SQRT( MAX( tke(i,k,j), tke_seed ) )
  1743. deltas = 1.0 / rdzw(i,k,j)
  1744. mlen_v = deltas
  1745. IF ( dthrdn(i,k,j) .GT. 0.) THEN
  1746. mlen_s = 0.76 * tmp / ( ABS( g / theta(i,k,j) * dthrdn(i,k,j) ) )**0.5
  1747. mlen_v = MIN( mlen_v, mlen_s )
  1748. END IF
  1749. xkmh(i,k,j) = MAX( c_k * tmp * mlen_h, 1.0E-6 * mlen_h * mlen_h )
  1750. xkmh(i,k,j) = MIN( xkmh(i,k,j), mix_upper_bound * mlen_h *mlen_h / dt )
  1751. xkmv(i,k,j) = MAX( c_k * tmp * mlen_v, 1.0E-6 * deltas * deltas )
  1752. xkmv(i,k,j) = MIN( xkmv(i,k,j), mix_upper_bound * deltas *deltas / dt )
  1753. pr_inv_h = 1./prandtl
  1754. pr_inv_v = 1.0 + 2.0 * mlen_v / deltas
  1755. xkhh(i,k,j) = xkmh(i,k,j) * pr_inv_h
  1756. xkhv(i,k,j) = xkmv(i,k,j) * pr_inv_v
  1757. END DO
  1758. END DO
  1759. END DO
  1760. ELSE
  1761. CALL calc_l_scale( config_flags, tke, BN2, l_scale, &
  1762. i_start, i_end, ktf, j_start, j_end, &
  1763. dx, dy, rdzw, msftx, msfty, &
  1764. ids, ide, jds, jde, kds, kde, &
  1765. ims, ime, jms, jme, kms, kme, &
  1766. its, ite, jts, jte, kts, kte )
  1767. DO j = j_start, j_end
  1768. DO k = kts, ktf
  1769. DO i = i_start, i_end
  1770. tmp = SQRT( MAX( tke(i,k,j), tke_seed ) )
  1771. deltas = ( dx/msftx(i,j) * dy/msfty(i,j) / rdzw(i,k,j) )**0.33333333
  1772. xkmh(i,k,j) = c_k * tmp * l_scale(i,k,j)
  1773. xkmh(i,k,j) = MIN( mix_upper_bound * dx/msftx(i,j) * dy/msfty(i,j) / dt, xkmh(i,k,j) )
  1774. xkmv(i,k,j) = c_k * tmp * l_scale(i,k,j)
  1775. xkmv(i,k,j) = MIN( mix_upper_bound / rdzw(i,k,j) / rdzw(i,k,j) / dt , xkmv(i,k,j) )
  1776. pr_inv = 1.0 + 2.0 * l_scale(i,k,j) / deltas
  1777. xkhh(i,k,j) = MIN( mix_upper_bound * dx/msftx(i,j) * dy/msfty(i,j) / dt, xkmh(i,k,j) * pr_inv )
  1778. xkhv(i,k,j) = MIN( mix_upper_bound / rdzw(i,k,j) / rdzw(i,k,j) / dt, xkmv(i,k,j) * pr_inv )
  1779. END DO
  1780. END DO
  1781. END DO
  1782. END IF
  1783. END SUBROUTINE tke_km
  1784. !=======================================================================
  1785. !=======================================================================
  1786. SUBROUTINE calc_l_scale( config_flags, tke, BN2, l_scale, &
  1787. i_start, i_end, ktf, j_start, j_end, &
  1788. dx, dy, rdzw, msftx, msfty, &
  1789. ids, ide, jds, jde, kds, kde, &
  1790. ims, ime, jms, jme, kms, kme, &
  1791. its, ite, jts, jte, kts, kte )
  1792. ! History: Sep 2003 Written by Bryan and Knievel, NCAR
  1793. ! Purpose: This routine calculates the length scale, based on stability,
  1794. ! for TKE parameterization of subgrid-scale turbulence.
  1795. !-----------------------------------------------------------------------
  1796. ! Begin declarations.
  1797. IMPLICIT NONE
  1798. TYPE( grid_config_rec_type ), INTENT( IN ) &
  1799. :: config_flags
  1800. INTEGER, INTENT( IN ) &
  1801. :: i_start, i_end, ktf, j_start, j_end, &
  1802. ids, ide, jds, jde, kds, kde, &
  1803. ims, ime, jms, jme, kms, kme, &
  1804. its, ite, jts, jte, kts, kte
  1805. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
  1806. :: BN2, tke, rdzw
  1807. REAL, INTENT( IN ) &
  1808. :: dx, dy
  1809. REAL, DIMENSION( its:ite, kts:kte, jts:jte ), INTENT( OUT ) &
  1810. :: l_scale
  1811. REAL , DIMENSION( ims:ime, jms:jme), INTENT(IN ) :: msftx, &
  1812. msfty
  1813. ! Local variables.
  1814. INTEGER &
  1815. :: i, j, k
  1816. REAL &
  1817. :: deltas, tmp
  1818. ! End declarations.
  1819. !-----------------------------------------------------------------------
  1820. DO j = j_start, j_end
  1821. DO k = kts, ktf
  1822. DO i = i_start, i_end
  1823. deltas = ( dx/msftx(i,j) * dy/msfty(i,j) / rdzw(i,k,j) )**0.33333333
  1824. l_scale(i,k,j) = deltas
  1825. IF ( BN2(i,k,j) .gt. 1.0e-6 ) THEN
  1826. tmp = SQRT( MAX( tke(i,k,j), 1.0e-6 ) )
  1827. l_scale(i,k,j) = 0.76 * tmp / SQRT( BN2(i,k,j) )
  1828. l_scale(i,k,j) = MIN( l_scale(i,k,j), deltas)
  1829. l_scale(i,k,j) = MAX( l_scale(i,k,j), 0.001 * deltas )
  1830. END IF
  1831. END DO
  1832. END DO
  1833. END DO
  1834. END SUBROUTINE calc_l_scale
  1835. !=======================================================================
  1836. !=======================================================================
  1837. SUBROUTINE horizontal_diffusion_2 ( rt_tendf, ru_tendf, rv_tendf, rw_tendf, &
  1838. tke_tendf, &
  1839. moist_tendf, n_moist, &
  1840. chem_tendf, n_chem, &
  1841. scalar_tendf, n_scalar, &
  1842. tracer_tendf, n_tracer, &
  1843. thp, theta, mu, tke, config_flags, &
  1844. defor11, defor22, defor12, &
  1845. defor13, defor23, &
  1846. nba_mij, n_nba_mij, & !JDM
  1847. div, &
  1848. moist, chem, scalar,tracer, &
  1849. msfux, msfuy, msfvx, msfvy, &
  1850. msftx, msfty, xkmh, xkhh,km_opt, &
  1851. rdx, rdy, rdz, rdzw, fnm, fnp, &
  1852. cf1, cf2, cf3, zx, zy, dn, dnw, &
  1853. ids, ide, jds, jde, kds, kde, &
  1854. ims, ime, jms, jme, kms, kme, &
  1855. its, ite, jts, jte, kts, kte )
  1856. !-----------------------------------------------------------------------
  1857. ! Begin declarations.
  1858. IMPLICIT NONE
  1859. TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
  1860. INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
  1861. ims, ime, jms, jme, kms, kme, &
  1862. its, ite, jts, jte, kts, kte
  1863. INTEGER , INTENT(IN ) :: n_moist,n_chem,n_scalar,n_tracer,km_opt
  1864. REAL , INTENT(IN ) :: cf1, cf2, cf3
  1865. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnm
  1866. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnp
  1867. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: dnw
  1868. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: dn
  1869. REAL , DIMENSION( ims:ime, jms:jme) , INTENT(IN ) :: msfux, &
  1870. msfuy, &
  1871. msfvx, &
  1872. msfvy, &
  1873. msftx, &
  1874. msfty, &
  1875. mu
  1876. REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) ::rt_tendf,&
  1877. ru_tendf,&
  1878. rv_tendf,&
  1879. rw_tendf,&
  1880. tke_tendf
  1881. REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_moist), &
  1882. INTENT(INOUT) :: moist_tendf
  1883. REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_chem), &
  1884. INTENT(INOUT) :: chem_tendf
  1885. REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_scalar), &
  1886. INTENT(INOUT) :: scalar_tendf
  1887. REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_tracer), &
  1888. INTENT(INOUT) :: tracer_tendf
  1889. REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_moist), &
  1890. INTENT(IN ) :: moist
  1891. REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_chem), &
  1892. INTENT(IN ) :: chem
  1893. REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_scalar) , &
  1894. INTENT(IN ) :: scalar
  1895. REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_tracer) , &
  1896. INTENT(IN ) :: tracer
  1897. REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(IN ) ::defor11, &
  1898. defor22, &
  1899. defor12, &
  1900. defor13, &
  1901. defor23, &
  1902. div, &
  1903. xkmh, &
  1904. xkhh, &
  1905. zx, &
  1906. zy, &
  1907. theta, &
  1908. thp, &
  1909. tke, &
  1910. rdz, &
  1911. rdzw
  1912. REAL , INTENT(IN ) :: rdx, &
  1913. rdy
  1914. INTEGER, INTENT( IN ) :: n_nba_mij !JDM
  1915. REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_nba_mij), INTENT(INOUT) & !JDM
  1916. :: nba_mij
  1917. ! LOCAL VARS
  1918. INTEGER :: im, ic, is
  1919. ! REAL , DIMENSION(its-1:ite+1, kts:kte, jts-1:jte+1) :: xkhh
  1920. ! End declarations.
  1921. !-----------------------------------------------------------------------
  1922. !-----------------------------------------------------------------------
  1923. ! Call diffusion subroutines.
  1924. CALL horizontal_diffusion_u_2( ru_tendf, mu, config_flags, &
  1925. defor11, defor12, div, &
  1926. nba_mij, n_nba_mij, & !JDM
  1927. tke(ims,kms,jms), &
  1928. msfux, msfuy, xkmh, rdx, rdy, fnm, fnp, &
  1929. zx, zy, rdzw, &
  1930. ids, ide, jds, jde, kds, kde, &
  1931. ims, ime, jms, jme, kms, kme, &
  1932. its, ite, jts, jte, kts, kte )
  1933. CALL horizontal_diffusion_v_2( rv_tendf, mu, config_flags, &
  1934. defor12, defor22, div, &
  1935. nba_mij, n_nba_mij, & !JDM
  1936. tke(ims,kms,jms), &
  1937. msfvx, msfvy, xkmh, rdx, rdy, fnm, fnp, &
  1938. zx, zy, rdzw, &
  1939. ids, ide, jds, jde, kds, kde, &
  1940. ims, ime, jms, jme, kms, kme, &
  1941. its, ite, jts, jte, kts, kte )
  1942. CALL horizontal_diffusion_w_2( rw_tendf, mu, config_flags, &
  1943. defor13, defor23, div, &
  1944. nba_mij, n_nba_mij, & !JDM
  1945. tke(ims,kms,jms), &
  1946. msftx, msfty, xkmh, rdx, rdy, fnm, fnp, &
  1947. zx, zy, rdz, &
  1948. ids, ide, jds, jde, kds, kde, &
  1949. ims, ime, jms, jme, kms, kme, &
  1950. its, ite, jts, jte, kts, kte )
  1951. CALL horizontal_diffusion_s ( rt_tendf, mu, config_flags, thp, &
  1952. msftx, msfty, msfux, msfuy, &
  1953. msfvx, msfvy, xkhh, rdx, rdy, &
  1954. fnm, fnp, cf1, cf2, cf3, &
  1955. zx, zy, rdz, rdzw, dnw, dn, &
  1956. .false., &
  1957. ids, ide, jds, jde, kds, kde, &
  1958. ims, ime, jms, jme, kms, kme, &
  1959. its, ite, jts, jte, kts, kte )
  1960. IF (km_opt .eq. 2) &
  1961. CALL horizontal_diffusion_s ( tke_tendf(ims,kms,jms), &
  1962. mu, config_flags, &
  1963. tke(ims,kms,jms), &
  1964. msftx, msfty, msfux, msfuy, &
  1965. msfvx, msfvy, xkhh, rdx, rdy, &
  1966. fnm, fnp, cf1, cf2, cf3, &
  1967. zx, zy, rdz, rdzw, dnw, dn, &
  1968. .true., &
  1969. ids, ide, jds, jde, kds, kde, &
  1970. ims, ime, jms, jme, kms, kme, &
  1971. its, ite, jts, jte, kts, kte )
  1972. IF (n_moist .ge. PARAM_FIRST_SCALAR) THEN
  1973. moist_loop: do im = PARAM_FIRST_SCALAR, n_moist
  1974. CALL horizontal_diffusion_s( moist_tendf(ims,kms,jms,im), &
  1975. mu, config_flags, &
  1976. moist(ims,kms,jms,im), &
  1977. msftx, msfty, msfux, msfuy, &
  1978. msfvx, msfvy, xkhh, rdx, rdy, &
  1979. fnm, fnp, cf1, cf2, cf3, &
  1980. zx, zy, rdz, rdzw, dnw, dn, &
  1981. .false., &
  1982. ids, ide, jds, jde, kds, kde, &
  1983. ims, ime, jms, jme, kms, kme, &
  1984. its, ite, jts, jte, kts, kte )
  1985. ENDDO moist_loop
  1986. ENDIF
  1987. IF (n_chem .ge. PARAM_FIRST_SCALAR) THEN
  1988. chem_loop: do ic = PARAM_FIRST_SCALAR, n_chem
  1989. CALL horizontal_diffusion_s( chem_tendf(ims,kms,jms,ic), &
  1990. mu, config_flags, &
  1991. chem(ims,kms,jms,ic), &
  1992. msftx, msfty, msfux, msfuy, &
  1993. msfvx, msfvy, xkhh, rdx, rdy, &
  1994. fnm, fnp, cf1, cf2, cf3, &
  1995. zx, zy, rdz, rdzw, dnw, dn, &
  1996. .false., &
  1997. ids, ide, jds, jde, kds, kde, &
  1998. ims, ime, jms, jme, kms, kme, &
  1999. its, ite, jts, jte, kts, kte )
  2000. ENDDO chem_loop
  2001. ENDIF
  2002. IF (n_tracer .ge. PARAM_FIRST_SCALAR) THEN
  2003. tracer_loop: do ic = PARAM_FIRST_SCALAR, n_tracer
  2004. CALL horizontal_diffusion_s( tracer_tendf(ims,kms,jms,ic), &
  2005. mu, config_flags, &
  2006. tracer(ims,kms,jms,ic), &
  2007. msftx, msfty, msfux, msfuy, &
  2008. msfvx, msfvy, xkhh, rdx, rdy, &
  2009. fnm, fnp, cf1, cf2, cf3, &
  2010. zx, zy, rdz, rdzw, dnw, dn, &
  2011. .false., &
  2012. ids, ide, jds, jde, kds, kde, &
  2013. ims, ime, jms, jme, kms, kme, &
  2014. its, ite, jts, jte, kts, kte )
  2015. ENDDO tracer_loop
  2016. ENDIF
  2017. IF (n_scalar .ge. PARAM_FIRST_SCALAR) THEN
  2018. scalar_loop: do is = PARAM_FIRST_SCALAR, n_scalar
  2019. CALL horizontal_diffusion_s( scalar_tendf(ims,kms,jms,is), &
  2020. mu, config_flags, &
  2021. scalar(ims,kms,jms,is), &
  2022. msftx, msfty, msfux, msfuy, &
  2023. msfvx, msfvy, xkhh, rdx, rdy, &
  2024. fnm, fnp, cf1, cf2, cf3, &
  2025. zx, zy, rdz, rdzw, dnw, dn, &
  2026. .false., &
  2027. ids, ide, jds, jde, kds, kde, &
  2028. ims, ime, jms, jme, kms, kme, &
  2029. its, ite, jts, jte, kts, kte )
  2030. ENDDO scalar_loop
  2031. ENDIF
  2032. END SUBROUTINE horizontal_diffusion_2
  2033. !=======================================================================
  2034. !=======================================================================
  2035. SUBROUTINE horizontal_diffusion_u_2( tendency, mu, config_flags, &
  2036. defor11, defor12, div, &
  2037. nba_mij, n_nba_mij, & !JDM
  2038. tke, &
  2039. msfux, msfuy, &
  2040. xkmh, rdx, rdy, fnm, fnp, &
  2041. zx, zy, rdzw, &
  2042. ids, ide, jds, jde, kds, kde, &
  2043. ims, ime, jms, jme, kms, kme, &
  2044. its, ite, jts, jte, kts, kte )
  2045. !-----------------------------------------------------------------------
  2046. ! Begin declarations.
  2047. IMPLICIT NONE
  2048. TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
  2049. INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
  2050. ims, ime, jms, jme, kms, kme, &
  2051. its, ite, jts, jte, kts, kte
  2052. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnm
  2053. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnp
  2054. REAL , DIMENSION( ims:ime, jms:jme) , INTENT(IN ) :: msfux, &
  2055. msfuy, &
  2056. mu
  2057. REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) ::tendency
  2058. REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(IN ) :: rdzw
  2059. REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(IN ) ::defor11, &
  2060. defor12, &
  2061. div, &
  2062. tke, &
  2063. xkmh, &
  2064. zx, &
  2065. zy
  2066. INTEGER, INTENT( IN ) :: n_nba_mij !JDM
  2067. REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_nba_mij), INTENT(INOUT) & !JDM
  2068. :: nba_mij
  2069. REAL , INTENT(IN ) :: rdx, &
  2070. rdy
  2071. ! Local data
  2072. INTEGER :: i, j, k, ktf
  2073. INTEGER :: i_start, i_end, j_start, j_end
  2074. INTEGER :: is_ext,ie_ext,js_ext,je_ext
  2075. REAL , DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1) :: titau1avg, &
  2076. titau2avg, &
  2077. titau1, &
  2078. titau2, &
  2079. xkxavg, &
  2080. rravg
  2081. ! new
  2082. ! zxavg, &
  2083. ! zyavg
  2084. REAL :: mrdx, mrdy, rcoup
  2085. REAL :: tmpzy, tmpzeta_z
  2086. REAL :: term1, term2, term3
  2087. ! End declarations.
  2088. !-----------------------------------------------------------------------
  2089. ktf=MIN(kte,kde-1)
  2090. !-----------------------------------------------------------------------
  2091. ! u : p (.), u(|), w(-)
  2092. !
  2093. ! p u p u u u
  2094. !
  2095. ! p | . | . | . | k+1 | . | . | . | k+1
  2096. !
  2097. ! w - 13 - - k+1 13 k+1
  2098. !
  2099. ! p | 11 O 11 | . | k | 12 O 12 | . | k
  2100. !
  2101. ! w - 13 - - k 13 k
  2102. !
  2103. ! p | . | . | . | k-1 | . | . | . | k-1
  2104. !
  2105. ! i-1 i i i+1 j-1 j j j+1 j+1
  2106. !
  2107. i_start = its
  2108. i_end = ite
  2109. j_start = jts
  2110. j_end = MIN(jte,jde-1)
  2111. IF ( config_flags%open_xs .or. config_flags%specified .or. &
  2112. config_flags%nested) i_start = MAX(ids+1,its)
  2113. IF ( config_flags%open_xe .or. config_flags%specified .or. &
  2114. config_flags%nested) i_end = MIN(ide-1,ite)
  2115. IF ( config_flags%open_ys .or. config_flags%specified .or. &
  2116. config_flags%nested) j_start = MAX(jds+1,jts)
  2117. IF ( config_flags%open_ye .or. config_flags%specified .or. &
  2118. config_flags%nested) j_end = MIN(jde-2,jte)
  2119. IF ( config_flags%periodic_x ) i_start = its
  2120. IF ( config_flags%periodic_x ) i_end = ite
  2121. ! titau1 = titau11
  2122. is_ext=1
  2123. ie_ext=0
  2124. js_ext=0
  2125. je_ext=0
  2126. CALL cal_titau_11_22_33( config_flags, titau1, &
  2127. mu, tke, xkmh, defor11, &
  2128. nba_mij(ims,kms,jms,P_m11), & !JDM
  2129. is_ext, ie_ext, js_ext, je_ext, &
  2130. ids, ide, jds, jde, kds, kde, &
  2131. ims, ime, jms, jme, kms, kme, &
  2132. its, ite, jts, jte, kts, kte )
  2133. ! titau2 = titau12
  2134. is_ext=0
  2135. ie_ext=0
  2136. js_ext=0
  2137. je_ext=1
  2138. CALL cal_titau_12_21( config_flags, titau2, &
  2139. mu, xkmh, defor12, &
  2140. nba_mij(ims,kms,jms,P_m12), & !JDM
  2141. is_ext, ie_ext, js_ext, je_ext, &
  2142. ids, ide, jds, jde, kds, kde, &
  2143. ims, ime, jms, jme, kms, kme, &
  2144. its, ite, jts, jte, kts, kte )
  2145. ! titau1avg = titau11avg
  2146. ! titau2avg = titau12avg
  2147. DO j = j_start, j_end
  2148. DO k = kts+1,ktf
  2149. DO i = i_start, i_end
  2150. titau1avg(i,k,j)=0.5*(fnm(k)*(titau1(i-1,k ,j)+titau1(i,k ,j))+ &
  2151. fnp(k)*(titau1(i-1,k-1,j)+titau1(i,k-1,j)))
  2152. titau2avg(i,k,j)=0.5*(fnm(k)*(titau2(i,k ,j+1)+titau2(i,k ,j))+ &
  2153. fnp(k)*(titau2(i,k-1,j+1)+titau2(i,k-1,j)))
  2154. tmpzy = 0.25*( zy(i-1,k,j )+zy(i,k,j )+ &
  2155. zy(i-1,k,j+1)+zy(i,k,j+1) )
  2156. ! tmpzeta_z = 0.5*(zeta_z(i,j)+zeta_z(i-1,j))
  2157. ! titau1avg(i,k,j)=titau1avg(i,k,j)*zx(i,k,j)*tmpzeta_z
  2158. ! titau2avg(i,k,j)=titau2avg(i,k,j)*tmpzy *tmpzeta_z
  2159. titau1avg(i,k,j)=titau1avg(i,k,j)*zx(i,k,j)
  2160. titau2avg(i,k,j)=titau2avg(i,k,j)*tmpzy
  2161. ENDDO
  2162. ENDDO
  2163. ENDDO
  2164. !
  2165. DO j = j_start, j_end
  2166. DO i = i_start, i_end
  2167. titau1avg(i,kts,j)=0.
  2168. titau1avg(i,ktf+1,j)=0.
  2169. titau2avg(i,kts,j)=0.
  2170. titau2avg(i,ktf+1,j)=0.
  2171. ENDDO
  2172. ENDDO
  2173. !
  2174. DO j = j_start, j_end
  2175. DO k = kts,ktf
  2176. DO i = i_start, i_end
  2177. mrdx=msfux(i,j)*rdx
  2178. mrdy=msfuy(i,j)*rdy
  2179. tendency(i,k,j)=tendency(i,k,j)- &
  2180. (mrdx*(titau1(i,k,j )-titau1(i-1,k,j))+ &
  2181. mrdy*(titau2(i,k,j+1)-titau2(i,k,j ))- &
  2182. msfuy(i,j)*rdzw(i,k,j)*((titau1avg(i,k+1,j)-titau1avg(i,k,j))+ &
  2183. (titau2avg(i,k+1,j)-titau2avg(i,k,j)) &
  2184. ) )
  2185. ENDDO
  2186. ENDDO
  2187. ENDDO
  2188. END SUBROUTINE horizontal_diffusion_u_2
  2189. !=======================================================================
  2190. !=======================================================================
  2191. SUBROUTINE horizontal_diffusion_v_2( tendency, mu, config_flags, &
  2192. defor12, defor22, div, &
  2193. nba_mij, n_nba_mij, & !JDM
  2194. tke, &
  2195. msfvx, msfvy, &
  2196. xkmh, rdx, rdy, fnm, fnp, &
  2197. zx, zy, rdzw, &
  2198. ids, ide, jds, jde, kds, kde, &
  2199. ims, ime, jms, jme, kms, kme, &
  2200. its, ite, jts, jte, kts, kte )
  2201. !-----------------------------------------------------------------------
  2202. ! Begin declarations.
  2203. IMPLICIT NONE
  2204. TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
  2205. INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
  2206. ims, ime, jms, jme, kms, kme, &
  2207. its, ite, jts, jte, kts, kte
  2208. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnm
  2209. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnp
  2210. REAL , DIMENSION( ims:ime, jms:jme) , INTENT(IN ) :: msfvx, &
  2211. msfvy, &
  2212. mu
  2213. REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: tendency
  2214. REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(IN ) ::defor12, &
  2215. defor22, &
  2216. div, &
  2217. tke, &
  2218. xkmh, &
  2219. zx, &
  2220. zy, &
  2221. rdzw
  2222. INTEGER, INTENT( IN ) :: n_nba_mij !JDM
  2223. REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_nba_mij), INTENT(INOUT) & !JDM
  2224. :: nba_mij
  2225. REAL , INTENT(IN ) :: rdx, &
  2226. rdy
  2227. ! Local data
  2228. INTEGER :: i, j, k, ktf
  2229. INTEGER :: i_start, i_end, j_start, j_end
  2230. INTEGER :: is_ext,ie_ext,js_ext,je_ext
  2231. REAL , DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1) :: titau1avg, &
  2232. titau2avg, &
  2233. titau1, &
  2234. titau2, &
  2235. xkxavg, &
  2236. rravg
  2237. ! new
  2238. ! zxavg, &
  2239. ! zyavg
  2240. REAL :: mrdx, mrdy, rcoup
  2241. REAL :: tmpzx, tmpzeta_z
  2242. ! End declarations.
  2243. !-----------------------------------------------------------------------
  2244. ktf=MIN(kte,kde-1)
  2245. !-----------------------------------------------------------------------
  2246. ! v : p (.), v(+), w(-)
  2247. !
  2248. ! p v p v v v
  2249. !
  2250. ! p + . + . + . + k+1 + . + . + . + k+1
  2251. !
  2252. ! w - 23 - - k+1 23 k+1
  2253. !
  2254. ! p + 22 O 22 + . + k + 21 O 21 + . + k
  2255. !
  2256. ! w - 23 - - k 23 k
  2257. !
  2258. ! p + . + . + . + k-1 + . + . + . + k-1
  2259. !
  2260. ! j-1 j j j+1 i-1 i i i+1 i+1
  2261. !
  2262. i_start = its
  2263. i_end = MIN(ite,ide-1)
  2264. j_start = jts
  2265. j_end = jte
  2266. IF ( config_flags%open_xs .or. config_flags%specified .or. &
  2267. config_flags%nested) i_start = MAX(ids+1,its)
  2268. IF ( config_flags%open_xe .or. config_flags%specified .or. &
  2269. config_flags%nested) i_end = MIN(ide-2,ite)
  2270. IF ( config_flags%open_ys .or. config_flags%specified .or. &
  2271. config_flags%nested) j_start = MAX(jds+1,jts)
  2272. IF ( config_flags%open_ye .or. config_flags%specified .or. &
  2273. config_flags%nested) j_end = MIN(jde-1,jte)
  2274. IF ( config_flags%periodic_x ) i_start = its
  2275. IF ( config_flags%periodic_x ) i_end = MIN(ite,ide-1)
  2276. ! titau1 = titau21
  2277. is_ext=0
  2278. ie_ext=1
  2279. js_ext=0
  2280. je_ext=0
  2281. CALL cal_titau_12_21( config_flags, titau1, &
  2282. mu, xkmh, defor12, &
  2283. nba_mij(ims,kms,jms,P_m12), & !JDM
  2284. is_ext,ie_ext,js_ext,je_ext, &
  2285. ids, ide, jds, jde, kds, kde, &
  2286. ims, ime, jms, jme, kms, kme, &
  2287. its, ite, jts, jte, kts, kte )
  2288. ! titau2 = titau22
  2289. is_ext=0
  2290. ie_ext=0
  2291. js_ext=1
  2292. je_ext=0
  2293. CALL cal_titau_11_22_33( config_flags, titau2, &
  2294. mu, tke, xkmh, defor22, &
  2295. nba_mij(ims,kms,jms,P_m22), & !JDM
  2296. is_ext, ie_ext, js_ext, je_ext, &
  2297. ids, ide, jds, jde, kds, kde, &
  2298. ims, ime, jms, jme, kms, kme, &
  2299. its, ite, jts, jte, kts, kte )
  2300. DO j = j_start, j_end
  2301. DO k = kts+1,ktf
  2302. DO i = i_start, i_end
  2303. titau1avg(i,k,j)=0.5*(fnm(k)*(titau1(i+1,k ,j)+titau1(i,k ,j))+ &
  2304. fnp(k)*(titau1(i+1,k-1,j)+titau1(i,k-1,j)))
  2305. titau2avg(i,k,j)=0.5*(fnm(k)*(titau2(i,k ,j-1)+titau2(i,k ,j))+ &
  2306. fnp(k)*(titau2(i,k-1,j-1)+titau2(i,k-1,j)))
  2307. tmpzx = 0.25*( zx(i,k,j )+zx(i+1,k,j )+ &
  2308. zx(i,k,j-1)+zx(i+1,k,j-1) )
  2309. titau1avg(i,k,j)=titau1avg(i,k,j)*tmpzx
  2310. titau2avg(i,k,j)=titau2avg(i,k,j)*zy(i,k,j)
  2311. ENDDO
  2312. ENDDO
  2313. ENDDO
  2314. DO j = j_start, j_end
  2315. DO i = i_start, i_end
  2316. titau1avg(i,kts,j)=0.
  2317. titau1avg(i,ktf+1,j)=0.
  2318. titau2avg(i,kts,j)=0.
  2319. titau2avg(i,ktf+1,j)=0.
  2320. ENDDO
  2321. ENDDO
  2322. !
  2323. DO j = j_start, j_end
  2324. DO k = kts,ktf
  2325. DO i = i_start, i_end
  2326. mrdx=msfvx(i,j)*rdx
  2327. mrdy=msfvy(i,j)*rdy
  2328. tendency(i,k,j)=tendency(i,k,j)- &
  2329. (mrdy*(titau2(i ,k,j)-titau2(i,k,j-1))+ &
  2330. mrdx*(titau1(i+1,k,j)-titau1(i,k,j ))- &
  2331. msfvy(i,j)*rdzw(i,k,j)*((titau1avg(i,k+1,j)-titau1avg(i,k,j))+ &
  2332. (titau2avg(i,k+1,j)-titau2avg(i,k,j)) &
  2333. ) &
  2334. )
  2335. ENDDO
  2336. ENDDO
  2337. ENDDO
  2338. END SUBROUTINE horizontal_diffusion_v_2
  2339. !=======================================================================
  2340. !=======================================================================
  2341. SUBROUTINE horizontal_diffusion_w_2( tendency, mu, config_flags, &
  2342. defor13, defor23, div, &
  2343. nba_mij, n_nba_mij, & !JDM
  2344. tke, &
  2345. msftx, msfty, &
  2346. xkmh, rdx, rdy, fnm, fnp, &
  2347. zx, zy, rdz, &
  2348. ids, ide, jds, jde, kds, kde, &
  2349. ims, ime, jms, jme, kms, kme, &
  2350. its, ite, jts, jte, kts, kte )
  2351. !-----------------------------------------------------------------------
  2352. ! Begin declarations.
  2353. IMPLICIT NONE
  2354. TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
  2355. INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
  2356. ims, ime, jms, jme, kms, kme, &
  2357. its, ite, jts, jte, kts, kte
  2358. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnm
  2359. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnp
  2360. REAL , DIMENSION( ims:ime, jms:jme) , INTENT(IN ) :: msftx, &
  2361. msfty, &
  2362. mu
  2363. REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: tendency
  2364. REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(IN ) ::defor13, &
  2365. defor23, &
  2366. div, &
  2367. tke, &
  2368. xkmh, &
  2369. zx, &
  2370. zy, &
  2371. rdz
  2372. INTEGER, INTENT( IN ) :: n_nba_mij !JDM
  2373. REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_nba_mij), INTENT(INOUT) & !JDM
  2374. :: nba_mij
  2375. REAL , INTENT(IN ) :: rdx, &
  2376. rdy
  2377. ! Local data
  2378. INTEGER :: i, j, k, ktf
  2379. INTEGER :: i_start, i_end, j_start, j_end
  2380. INTEGER :: is_ext,ie_ext,js_ext,je_ext
  2381. REAL , DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1) :: titau1avg, &
  2382. titau2avg, &
  2383. titau1, &
  2384. titau2, &
  2385. xkxavg, &
  2386. rravg
  2387. ! new
  2388. ! zxavg, &
  2389. ! zyavg
  2390. REAL :: mrdx, mrdy, rcoup
  2391. REAL :: tmpzx, tmpzy, tmpzeta_z
  2392. ! End declarations.
  2393. !-----------------------------------------------------------------------
  2394. ktf=MIN(kte,kde-1)
  2395. !-----------------------------------------------------------------------
  2396. ! w : p (.), u(|), v(+), w(-)
  2397. !
  2398. ! p u p u p v p v
  2399. !
  2400. ! w - - - k+1 w - - - k+1
  2401. !
  2402. ! p . | 33 | . k p . + 33 + . k
  2403. !
  2404. ! w - 31 O 31 - k w - 32 O 32 - k
  2405. !
  2406. ! p . | 33 | . k-1 p . | 33 | . k-1
  2407. !
  2408. ! w - - - k-1 w - - - k-1
  2409. !
  2410. ! i-1 i i i+1 j-1 j j j+1
  2411. !
  2412. i_start = its
  2413. i_end = MIN(ite,ide-1)
  2414. j_start = jts
  2415. j_end = MIN(jte,jde-1)
  2416. IF ( config_flags%open_xs .or. config_flags%specified .or. &
  2417. config_flags%nested) i_start = MAX(ids+1,its)
  2418. IF ( config_flags%open_xe .or. config_flags%specified .or. &
  2419. config_flags%nested) i_end = MIN(ide-2,ite)
  2420. IF ( config_flags%open_ys .or. config_flags%specified .or. &
  2421. config_flags%nested) j_start = MAX(jds+1,jts)
  2422. IF ( config_flags%open_ye .or. config_flags%specified .or. &
  2423. config_flags%nested) j_end = MIN(jde-2,jte)
  2424. IF ( config_flags%periodic_x ) i_start = its
  2425. IF ( config_flags%periodic_x ) i_end = MIN(ite,ide-1)
  2426. ! titau1 = titau31
  2427. is_ext=0
  2428. ie_ext=1
  2429. js_ext=0
  2430. je_ext=0
  2431. CALL cal_titau_13_31( config_flags, titau1, defor13, &
  2432. nba_mij(ims,kms,jms,P_m13), & !JDM
  2433. mu, xkmh, fnm, fnp, &
  2434. is_ext, ie_ext, js_ext, je_ext, &
  2435. ids, ide, jds, jde, kds, kde, &
  2436. ims, ime, jms, jme, kms, kme, &
  2437. its, ite, jts, jte, kts, kte )
  2438. ! titau2 = titau32
  2439. is_ext=0
  2440. ie_ext=0
  2441. js_ext=0
  2442. je_ext=1
  2443. CALL cal_titau_23_32( config_flags, titau2, defor23, &
  2444. nba_mij(ims,kms,jms,P_m23), & !JDM
  2445. mu, xkmh, fnm, fnp, &
  2446. is_ext, ie_ext, js_ext, je_ext, &
  2447. ids, ide, jds, jde, kds, kde, &
  2448. ims, ime, jms, jme, kms, kme, &
  2449. its, ite, jts, jte, kts, kte )
  2450. ! titau1avg = titau31avg * zx * zeta_z = titau13avg * zx * zeta_z
  2451. ! titau2avg = titau32avg * zy * zeta_z = titau23avg * zy * zeta_z
  2452. DO j = j_start, j_end
  2453. DO k = kts,ktf
  2454. DO i = i_start, i_end
  2455. titau1avg(i,k,j)=0.25*(titau1(i+1,k+1,j)+titau1(i,k+1,j)+ &
  2456. titau1(i+1,k ,j)+titau1(i,k ,j))
  2457. titau2avg(i,k,j)=0.25*(titau2(i,k+1,j+1)+titau2(i,k+1,j)+ &
  2458. titau2(i,k ,j+1)+titau2(i,k ,j))
  2459. ! new
  2460. tmpzx =0.25*( zx(i,k ,j)+zx(i+1,k ,j)+ &
  2461. zx(i,k+1,j)+zx(i+1,k+1,j) )
  2462. tmpzy =0.25*( zy(i,k ,j)+zy(i,k ,j+1)+ &
  2463. zy(i,k+1,j)+zy(i,k+1,j+1) )
  2464. titau1avg(i,k,j)=titau1avg(i,k,j)*tmpzx
  2465. titau2avg(i,k,j)=titau2avg(i,k,j)*tmpzy
  2466. ! titau1avg(i,k,j)=titau1avg(i,k,j)*tmpzx*zeta_z(i,j)
  2467. ! titau2avg(i,k,j)=titau2avg(i,k,j)*tmpzy*zeta_z(i,j)
  2468. ENDDO
  2469. ENDDO
  2470. ENDDO
  2471. DO j = j_start, j_end
  2472. DO i = i_start, i_end
  2473. titau1avg(i,ktf+1,j)=0.
  2474. titau2avg(i,ktf+1,j)=0.
  2475. ENDDO
  2476. ENDDO
  2477. DO j = j_start, j_end
  2478. DO k = kts+1,ktf
  2479. DO i = i_start, i_end
  2480. mrdx=msftx(i,j)*rdx
  2481. mrdy=msfty(i,j)*rdy
  2482. tendency(i,k,j)=tendency(i,k,j)- &
  2483. (mrdx*(titau1(i+1,k,j)-titau1(i,k,j))+ &
  2484. mrdy*(titau2(i,k,j+1)-titau2(i,k,j))- &
  2485. msfty(i,j)*rdz(i,k,j)*(titau1avg(i,k,j)-titau1avg(i,k-1,j)+ &
  2486. titau2avg(i,k,j)-titau2avg(i,k-1,j) &
  2487. ) &
  2488. )
  2489. ! msft(i,j)/dn(k)*(titau1avg(i,k,j)-titau1avg(i,k-1,j)+ &
  2490. ! titau2avg(i,k,j)-titau2avg(i,k-1,j) &
  2491. ! ) &
  2492. ! )
  2493. ENDDO
  2494. ENDDO
  2495. ENDDO
  2496. END SUBROUTINE horizontal_diffusion_w_2
  2497. !=======================================================================
  2498. !=======================================================================
  2499. SUBROUTINE horizontal_diffusion_s (tendency, mu, config_flags, var, &
  2500. msftx, msfty, msfux, msfuy, &
  2501. msfvx, msfvy, xkhh, rdx, rdy, &
  2502. fnm, fnp, cf1, cf2, cf3, &
  2503. zx, zy, rdz, rdzw, dnw, dn, &
  2504. doing_tke, &
  2505. ids, ide, jds, jde, kds, kde, &
  2506. ims, ime, jms, jme, kms, kme, &
  2507. its, ite, jts, jte, kts, kte )
  2508. !-----------------------------------------------------------------------
  2509. ! Begin declarations.
  2510. IMPLICIT NONE
  2511. TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
  2512. INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
  2513. ims, ime, jms, jme, kms, kme, &
  2514. its, ite, jts, jte, kts, kte
  2515. LOGICAL, INTENT(IN ) :: doing_tke
  2516. REAL , INTENT(IN ) :: cf1, cf2, cf3
  2517. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnm
  2518. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnp
  2519. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: dn
  2520. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: dnw
  2521. REAL , DIMENSION( ims:ime, jms:jme) , INTENT(IN ) :: msfux
  2522. REAL , DIMENSION( ims:ime, jms:jme) , INTENT(IN ) :: msfuy
  2523. REAL , DIMENSION( ims:ime, jms:jme) , INTENT(IN ) :: msfvx
  2524. REAL , DIMENSION( ims:ime, jms:jme) , INTENT(IN ) :: msfvy
  2525. REAL , DIMENSION( ims:ime, jms:jme) , INTENT(IN ) :: msftx
  2526. REAL , DIMENSION( ims:ime, jms:jme) , INTENT(IN ) :: msfty
  2527. REAL , DIMENSION( ims:ime, jms:jme) , INTENT(IN ) :: mu
  2528. ! REAL , DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1), &
  2529. ! INTENT(IN ) :: xkhh
  2530. REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: tendency
  2531. REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(IN ) :: &
  2532. xkhh, &
  2533. rdz, &
  2534. rdzw
  2535. REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(IN ) :: var, &
  2536. zx, &
  2537. zy
  2538. REAL , INTENT(IN ) :: rdx, &
  2539. rdy
  2540. ! Local data
  2541. INTEGER :: i, j, k, ktf
  2542. INTEGER :: i_start, i_end, j_start, j_end
  2543. REAL , DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1) :: H1avg, &
  2544. H2avg, &
  2545. H1, &
  2546. H2, &
  2547. xkxavg
  2548. ! new
  2549. ! zxavg, &
  2550. ! zyavg
  2551. REAL , DIMENSION( its:ite, kts:kte, jts:jte) :: tmptendf
  2552. REAL :: mrdx, mrdy, rcoup
  2553. REAL :: tmpzx, tmpzy, tmpzeta_z, rdzu, rdzv
  2554. INTEGER :: ktes1,ktes2
  2555. ! End declarations.
  2556. !-----------------------------------------------------------------------
  2557. ktf=MIN(kte,kde-1)
  2558. !-----------------------------------------------------------------------
  2559. ! scalars: t (.), u(|), v(+), w(-)
  2560. !
  2561. ! t u t u t v t v
  2562. !
  2563. ! w - 3 - k+1 w - 3 - k+1
  2564. !
  2565. ! t . 1 O 1 . k t . 2 O 2 . k
  2566. !
  2567. ! w - 3 - k w - 3 - k
  2568. !
  2569. ! t . | . | . k-1 t . + . + . k-1
  2570. !
  2571. ! w - - - k-1 w - - - k-1
  2572. !
  2573. ! t i-1 i i i+1 j-1 j j j+1
  2574. !
  2575. ktes1=kte-1
  2576. ktes2=kte-2
  2577. i_start = its
  2578. i_end = MIN(ite,ide-1)
  2579. j_start = jts
  2580. j_end = MIN(jte,jde-1)
  2581. IF ( config_flags%open_xs .or. config_flags%specified .or. &
  2582. config_flags%nested) i_start = MAX(ids+1,its)
  2583. IF ( config_flags%open_xe .or. config_flags%specified .or. &
  2584. config_flags%nested) i_end = MIN(ide-2,ite)
  2585. IF ( config_flags%open_ys .or. config_flags%specified .or. &
  2586. config_flags%nested) j_start = MAX(jds+1,jts)
  2587. IF ( config_flags%open_ye .or. config_flags%specified .or. &
  2588. config_flags%nested) j_end = MIN(jde-2,jte)
  2589. IF ( config_flags%periodic_x ) i_start = its
  2590. IF ( config_flags%periodic_x ) i_end = MIN(ite,ide-1)
  2591. ! diffusion of the TKE needs mutiple 2
  2592. IF ( doing_tke ) THEN
  2593. DO j = j_start, j_end
  2594. DO k = kts,ktf
  2595. DO i = i_start, i_end
  2596. tmptendf(i,k,j)=tendency(i,k,j)
  2597. ENDDO
  2598. ENDDO
  2599. ENDDO
  2600. ENDIF
  2601. ! H1 = partial var over partial x
  2602. DO j = j_start, j_end
  2603. DO k = kts, ktf
  2604. DO i = i_start, i_end + 1
  2605. ! new
  2606. ! zxavg(i,k,j) =0.5*( zx(i-1,k,j)+ zx(i,k,j))
  2607. xkxavg(i,k,j)=0.5*(xkhh(i-1,k,j)+xkhh(i,k,j))
  2608. ENDDO
  2609. ENDDO
  2610. ENDDO
  2611. DO j = j_start, j_end
  2612. DO k = kts+1, ktf
  2613. DO i = i_start, i_end + 1
  2614. H1avg(i,k,j)=0.5*(fnm(k)*(var(i-1,k ,j)+var(i,k ,j))+ &
  2615. fnp(k)*(var(i-1,k-1,j)+var(i,k-1,j)))
  2616. ENDDO
  2617. ENDDO
  2618. ENDDO
  2619. DO j = j_start, j_end
  2620. DO i = i_start, i_end + 1
  2621. H1avg(i,kts ,j)=0.5*(cf1*var(i ,1,j)+cf2*var(i ,2,j)+ &
  2622. cf3*var(i ,3,j)+cf1*var(i-1,1,j)+ &
  2623. cf2*var(i-1,2,j)+cf3*var(i-1,3,j))
  2624. H1avg(i,ktf+1,j)=0.5*(var(i,ktes1,j)+(var(i,ktes1,j)- &
  2625. var(i,ktes2,j))*0.5*dnw(ktes1)/dn(ktes1)+ &
  2626. var(i-1,ktes1,j)+(var(i-1,ktes1,j)- &
  2627. var(i-1,ktes2,j))*0.5*dnw(ktes1)/dn(ktes1))
  2628. ENDDO
  2629. ENDDO
  2630. DO j = j_start, j_end
  2631. DO k = kts, ktf
  2632. DO i = i_start, i_end + 1
  2633. ! new
  2634. tmpzx = 0.5*( zx(i,k,j)+ zx(i,k+1,j))
  2635. rdzu = 2./(1./rdzw(i,k,j) + 1./rdzw(i-1,k,j))
  2636. H1(i,k,j)=-msfuy(i,j)*xkxavg(i,k,j)*( &
  2637. rdx*(var(i,k,j)-var(i-1,k,j)) - tmpzx* &
  2638. (H1avg(i,k+1,j)-H1avg(i,k,j))*rdzu )
  2639. ! tmpzeta_z = 0.5*(zeta_z(i,j)+zeta_z(i-1,j))
  2640. ! H1(i,k,j)=-msfuy(i,j)*xkxavg(i,k,j)*( &
  2641. ! rdx*(var(i,k,j)-var(i-1,k,j)) - tmpzx*tmpzeta_z* &
  2642. ! (H1avg(i,k+1,j)-H1avg(i,k,j))/dnw(k))
  2643. ENDDO
  2644. ENDDO
  2645. ENDDO
  2646. ! H2 = partial var over partial y
  2647. DO j = j_start, j_end + 1
  2648. DO k = kts, ktf
  2649. DO i = i_start, i_end
  2650. ! new
  2651. ! zyavg(i,k,j) =0.5*( zy(i,k,j-1)+ zy(i,k,j))
  2652. xkxavg(i,k,j)=0.5*(xkhh(i,k,j-1)+xkhh(i,k,j))
  2653. ENDDO
  2654. ENDDO
  2655. ENDDO
  2656. DO j = j_start, j_end + 1
  2657. DO k = kts+1, ktf
  2658. DO i = i_start, i_end
  2659. ! new
  2660. H2avg(i,k,j)=0.5*(fnm(k)*(var(i,k ,j-1)+var(i,k ,j))+ &
  2661. fnp(k)*(var(i,k-1,j-1)+var(i,k-1,j)))
  2662. ENDDO
  2663. ENDDO
  2664. ENDDO
  2665. DO j = j_start, j_end + 1
  2666. DO i = i_start, i_end
  2667. H2avg(i,kts ,j)=0.5*(cf1*var(i,1,j )+cf2*var(i ,2,j)+ &
  2668. cf3*var(i,3,j )+cf1*var(i,1,j-1)+ &
  2669. cf2*var(i,2,j-1)+cf3*var(i,3,j-1))
  2670. H2avg(i,ktf+1,j)=0.5*(var(i,ktes1,j)+(var(i,ktes1,j)- &
  2671. var(i,ktes2,j))*0.5*dnw(ktes1)/dn(ktes1)+ &
  2672. var(i,ktes1,j-1)+(var(i,ktes1,j-1)- &
  2673. var(i,ktes2,j-1))*0.5*dnw(ktes1)/dn(ktes1))
  2674. ENDDO
  2675. ENDDO
  2676. DO j = j_start, j_end + 1
  2677. DO k = kts, ktf
  2678. DO i = i_start, i_end
  2679. ! new
  2680. tmpzy = 0.5*( zy(i,k,j)+ zy(i,k+1,j))
  2681. rdzv = 2./(1./rdzw(i,k,j) + 1./rdzw(i,k,j-1))
  2682. H2(i,k,j)=-msfvy(i,j)*xkxavg(i,k,j)*( &
  2683. rdy*(var(i,k,j)-var(i,k,j-1)) - tmpzy* &
  2684. (H2avg(i ,k+1,j)-H2avg(i,k,j))*rdzv)
  2685. ! tmpzeta_z = 0.5*(zeta_z(i,j)+zeta_z(i,j-1))
  2686. ! H2(i,k,j)=-msfvy(i,j)*xkxavg(i,k,j)*( &
  2687. ! rdy*(var(i,k,j)-var(i,k,j-1)) - tmpzy*tmpzeta_z* &
  2688. ! (H2avg(i ,k+1,j)-H2avg(i,k,j))/dnw(k))
  2689. ENDDO
  2690. ENDDO
  2691. ENDDO
  2692. DO j = j_start, j_end
  2693. DO k = kts+1, ktf
  2694. DO i = i_start, i_end
  2695. H1avg(i,k,j)=0.5*(fnm(k)*(H1(i+1,k ,j)+H1(i,k ,j))+ &
  2696. fnp(k)*(H1(i+1,k-1,j)+H1(i,k-1,j)))
  2697. H2avg(i,k,j)=0.5*(fnm(k)*(H2(i,k ,j+1)+H2(i,k ,j))+ &
  2698. fnp(k)*(H2(i,k-1,j+1)+H2(i,k-1,j)))
  2699. ! new
  2700. ! zxavg(i,k,j)=fnm(k)*zx(i,k,j)+fnp(k)*zx(i,k-1,j)
  2701. ! zyavg(i,k,j)=fnm(k)*zy(i,k,j)+fnp(k)*zy(i,k-1,j)
  2702. ! H1avg(i,k,j)=zx*H1avg*zeta_z
  2703. ! H2avg(i,k,j)=zy*H2avg*zeta_z
  2704. tmpzx = 0.5*( zx(i,k,j)+ zx(i+1,k,j ))
  2705. tmpzy = 0.5*( zy(i,k,j)+ zy(i ,k,j+1))
  2706. H1avg(i,k,j)=H1avg(i,k,j)*tmpzx
  2707. H2avg(i,k,j)=H2avg(i,k,j)*tmpzy
  2708. ! H1avg(i,k,j)=H1avg(i,k,j)*tmpzx*zeta_z(i,j)
  2709. ! H2avg(i,k,j)=H2avg(i,k,j)*tmpzy*zeta_z(i,j)
  2710. ENDDO
  2711. ENDDO
  2712. ENDDO
  2713. DO j = j_start, j_end
  2714. DO i = i_start, i_end
  2715. H1avg(i,kts ,j)=0.
  2716. H1avg(i,ktf+1,j)=0.
  2717. H2avg(i,kts ,j)=0.
  2718. H2avg(i,ktf+1,j)=0.
  2719. ENDDO
  2720. ENDDO
  2721. DO j = j_start, j_end
  2722. DO k = kts,ktf
  2723. DO i = i_start, i_end
  2724. mrdx=msftx(i,j)*rdx
  2725. mrdy=msfty(i,j)*rdy
  2726. tendency(i,k,j)=tendency(i,k,j)- &
  2727. (mrdx*0.5*((mu(i+1,j)+mu(i,j))*H1(i+1,k,j)- &
  2728. (mu(i-1,j)+mu(i,j))*H1(i ,k,j))+ &
  2729. mrdy*0.5*((mu(i,j+1)+mu(i,j))*H2(i,k,j+1)- &
  2730. (mu(i,j-1)+mu(i,j))*H2(i,k,j ))- &
  2731. msfty(i,j)*mu(i,j)*(H1avg(i,k+1,j)-H1avg(i,k,j)+ &
  2732. H2avg(i,k+1,j)-H2avg(i,k,j) &
  2733. )*rdzw(i,k,j) &
  2734. )
  2735. ENDDO
  2736. ENDDO
  2737. ENDDO
  2738. IF ( doing_tke ) THEN
  2739. DO j = j_start, j_end
  2740. DO k = kts,ktf
  2741. DO i = i_start, i_end
  2742. tendency(i,k,j)=tmptendf(i,k,j)+2.* &
  2743. (tendency(i,k,j)-tmptendf(i,k,j))
  2744. ENDDO
  2745. ENDDO
  2746. ENDDO
  2747. ENDIF
  2748. END SUBROUTINE horizontal_diffusion_s
  2749. !=======================================================================
  2750. !=======================================================================
  2751. SUBROUTINE vertical_diffusion_2 ( ru_tendf, rv_tendf, rw_tendf, rt_tendf, &
  2752. tke_tendf, moist_tendf, n_moist, &
  2753. chem_tendf, n_chem, &
  2754. scalar_tendf, n_scalar, &
  2755. tracer_tendf, n_tracer, &
  2756. u_2, v_2, &
  2757. thp,u_base,v_base,t_base,qv_base,mu,tke, &
  2758. config_flags,defor13,defor23,defor33, &
  2759. nba_mij, n_nba_mij, & !JDM
  2760. div, &
  2761. moist,chem,scalar,tracer,xkmv,xkhv,km_opt,&
  2762. fnm, fnp, dn, dnw, rdz, rdzw, &
  2763. hfx, qfx, ust, rho, &
  2764. ids, ide, jds, jde, kds, kde, &
  2765. ims, ime, jms, jme, kms, kme, &
  2766. its, ite, jts, jte, kts, kte )
  2767. !-----------------------------------------------------------------------
  2768. ! Begin declarations.
  2769. IMPLICIT NONE
  2770. TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
  2771. INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
  2772. ims, ime, jms, jme, kms, kme, &
  2773. its, ite, jts, jte, kts, kte
  2774. INTEGER , INTENT(IN ) :: n_moist,n_chem,n_scalar,n_tracer,km_opt
  2775. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnm
  2776. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnp
  2777. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: dnw
  2778. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: dn
  2779. REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN ) :: mu
  2780. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: qv_base
  2781. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: u_base
  2782. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: v_base
  2783. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: t_base
  2784. REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) ::ru_tendf,&
  2785. rv_tendf,&
  2786. rw_tendf,&
  2787. tke_tendf,&
  2788. rt_tendf
  2789. REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_moist), &
  2790. INTENT(INOUT) :: moist_tendf
  2791. REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_chem), &
  2792. INTENT(INOUT) :: chem_tendf
  2793. REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_scalar) , &
  2794. INTENT(INOUT) :: scalar_tendf
  2795. REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_tracer) , &
  2796. INTENT(INOUT) :: tracer_tendf
  2797. REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_moist), &
  2798. INTENT(INOUT) :: moist
  2799. REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_chem), &
  2800. INTENT(INOUT) :: chem
  2801. REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_scalar) , &
  2802. INTENT(IN ) :: scalar
  2803. REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_tracer) , &
  2804. INTENT(IN ) :: tracer
  2805. REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(IN ) ::defor13, &
  2806. defor23, &
  2807. defor33, &
  2808. div, &
  2809. xkmv, &
  2810. xkhv, &
  2811. tke, &
  2812. rdz, &
  2813. u_2, &
  2814. v_2, &
  2815. rdzw
  2816. INTEGER, INTENT( IN ) :: n_nba_mij !JDM
  2817. REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_nba_mij), INTENT(INOUT) & !JDM
  2818. :: nba_mij
  2819. REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(IN ) :: rho
  2820. REAL , DIMENSION( ims:ime, jms:jme), INTENT(INOUT) :: hfx, &
  2821. qfx
  2822. REAL , DIMENSION( ims:ime, jms:jme), INTENT(IN ) :: ust
  2823. REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: thp
  2824. ! LOCAL VAR
  2825. REAL , DIMENSION( ims:ime, kms:kme, jms:jme) :: var_mix
  2826. INTEGER :: im, i,j,k
  2827. INTEGER :: i_start, i_end, j_start, j_end
  2828. ! REAL , DIMENSION( its:ite, kts:kte, jts:jte) :: xkhv
  2829. !***************************************************************************
  2830. !***************************************************************************
  2831. !MODIFICA VARIABILI PER I FLUSSI
  2832. !
  2833. REAL :: V0_u,V0_v,tao_xz,tao_yz,ustar,cd0
  2834. REAL :: xsfc,psi1,vk2,zrough,lnz
  2835. REAL :: heat_flux, moist_flux, heat_flux0
  2836. REAL :: cpm
  2837. !
  2838. !FINE MODIFICA VARIABILI PER I FLUSSI
  2839. !***************************************************************************
  2840. !
  2841. ! End declarations.
  2842. !-----------------------------------------------------------------------
  2843. i_start = its
  2844. i_end = MIN(ite,ide-1)
  2845. j_start = jts
  2846. j_end = MIN(jte,jde-1)
  2847. !
  2848. !-----------------------------------------------------------------------
  2849. CALL vertical_diffusion_u_2( ru_tendf, config_flags, mu, &
  2850. defor13, xkmv, &
  2851. nba_mij, n_nba_mij, & !JDM
  2852. dnw, rdzw, fnm, fnp, &
  2853. ids, ide, jds, jde, kds, kde, &
  2854. ims, ime, jms, jme, kms, kme, &
  2855. its, ite, jts, jte, kts, kte )
  2856. CALL vertical_diffusion_v_2( rv_tendf, config_flags, mu, &
  2857. defor23, xkmv, &
  2858. nba_mij, n_nba_mij, & !JDM
  2859. dnw, rdzw, fnm, fnp, &
  2860. ids, ide, jds, jde, kds, kde, &
  2861. ims, ime, jms, jme, kms, kme, &
  2862. its, ite, jts, jte, kts, kte )
  2863. CALL vertical_diffusion_w_2( rw_tendf, config_flags, mu, &
  2864. defor33, tke(ims,kms,jms), &
  2865. nba_mij, n_nba_mij, & !JDM
  2866. div, xkmv, &
  2867. dn, rdz, &
  2868. ids, ide, jds, jde, kds, kde, &
  2869. ims, ime, jms, jme, kms, kme, &
  2870. its, ite, jts, jte, kts, kte )
  2871. !*****************************************
  2872. !*****************************************
  2873. ! MODIFICA al flusso di momento alla parete
  2874. !
  2875. vflux: SELECT CASE( config_flags%isfflx )
  2876. CASE (0) ! Assume cd a constant, specified in namelist
  2877. cd0 = config_flags%tke_drag_coefficient ! constant drag coefficient
  2878. ! set in namelist.input
  2879. !
  2880. !calcolo del modulo della velocita
  2881. DO j = j_start, j_end
  2882. DO i = i_start, ite
  2883. V0_u=0.
  2884. tao_xz=0.
  2885. V0_u= sqrt((u_2(i,kts,j)**2) + &
  2886. (((v_2(i ,kts,j )+ &
  2887. v_2(i ,kts,j+1)+ &
  2888. v_2(i-1,kts,j )+ &
  2889. v_2(i-1,kts,j+1))/4)**2))+epsilon
  2890. tao_xz=cd0*V0_u*u_2(i,kts,j)
  2891. ru_tendf(i,kts,j)=ru_tendf(i,kts,j) &
  2892. -0.25*(mu(i,j)+mu(i-1,j))*tao_xz*(rdzw(i,kts,j)+rdzw(i-1,kts,j))
  2893. ENDDO
  2894. ENDDO
  2895. !
  2896. DO j = j_start, jte
  2897. DO i = i_start, i_end
  2898. V0_v=0.
  2899. tao_yz=0.
  2900. V0_v= sqrt((v_2(i,kts,j)**2) + &
  2901. (((u_2(i ,kts,j )+ &
  2902. u_2(i ,kts,j-1)+ &
  2903. u_2(i+1,kts,j )+ &
  2904. u_2(i+1,kts,j-1))/4)**2))+epsilon
  2905. tao_yz=cd0*V0_v*v_2(i,kts,j)
  2906. rv_tendf(i,kts,j)=rv_tendf(i,kts,j) &
  2907. -0.25*(mu(i,j)+mu(i,j-1))*tao_yz*(rdzw(i,kts,j)+rdzw(i,kts,j-1))
  2908. ENDDO
  2909. ENDDO
  2910. CASE (1,2) ! ustar computed from surface routine
  2911. DO j = j_start, j_end
  2912. DO i = i_start, ite
  2913. V0_u=0.
  2914. tao_xz=0.
  2915. V0_u= sqrt((u_2(i,kts,j)**2) + &
  2916. (((v_2(i ,kts,j )+ &
  2917. v_2(i ,kts,j+1)+ &
  2918. v_2(i-1,kts,j )+ &
  2919. v_2(i-1,kts,j+1))/4)**2))+epsilon
  2920. ustar=0.5*(ust(i,j)+ust(i-1,j))
  2921. tao_xz=ustar*ustar*u_2(i,kts,j)/V0_u
  2922. ru_tendf(i,kts,j)=ru_tendf(i,kts,j) &
  2923. -0.25*(mu(i,j)+mu(i-1,j))*tao_xz*(rdzw(i,kts,j)+rdzw(i-1,kts,j))
  2924. ENDDO
  2925. ENDDO
  2926. DO j = j_start, jte
  2927. DO i = i_start, i_end
  2928. V0_v=0.
  2929. tao_yz=0.
  2930. V0_v= sqrt((v_2(i,kts,j)**2) + &
  2931. (((u_2(i ,kts,j )+ &
  2932. u_2(i ,kts,j-1)+ &
  2933. u_2(i+1,kts,j )+ &
  2934. u_2(i+1,kts,j-1))/4)**2))+epsilon
  2935. ustar=0.5*(ust(i,j)+ust(i,j-1))
  2936. tao_yz=ustar*ustar*v_2(i,kts,j)/V0_v
  2937. rv_tendf(i,kts,j)=rv_tendf(i,kts,j) &
  2938. -0.25*(mu(i,j)+mu(i,j-1))*tao_yz*(rdzw(i,kts,j)+rdzw(i,kts,j-1))
  2939. ENDDO
  2940. ENDDO
  2941. CASE DEFAULT
  2942. CALL wrf_error_fatal( 'isfflx value invalid for diff_opt=2' )
  2943. END SELECT vflux
  2944. !
  2945. ! FINE MODIFICA al flusso di momento alla parete
  2946. !*****************************************
  2947. !*****************************************
  2948. IF ( config_flags%mix_full_fields ) THEN
  2949. DO j=jts,min(jte,jde-1)
  2950. DO k=kts,kte-1
  2951. DO i=its,min(ite,ide-1)
  2952. var_mix(i,k,j) = thp(i,k,j)
  2953. ENDDO
  2954. ENDDO
  2955. ENDDO
  2956. ELSE
  2957. DO j=jts,min(jte,jde-1)
  2958. DO k=kts,kte-1
  2959. DO i=its,min(ite,ide-1)
  2960. var_mix(i,k,j) = thp(i,k,j) - t_base(k)
  2961. ENDDO
  2962. ENDDO
  2963. ENDDO
  2964. END IF
  2965. CALL vertical_diffusion_s( rt_tendf, config_flags, var_mix, mu, xkhv, &
  2966. dn, dnw, rdz, rdzw, fnm, fnp, &
  2967. .false., &
  2968. ids, ide, jds, jde, kds, kde, &
  2969. ims, ime, jms, jme, kms, kme, &
  2970. its, ite, jts, jte, kts, kte )
  2971. !*****************************************
  2972. !*****************************************
  2973. !MODIFICA al flusso di calore
  2974. !
  2975. !
  2976. hflux: SELECT CASE( config_flags%isfflx )
  2977. CASE (0,2) ! with fixed surface heat flux given in the namelist
  2978. heat_flux = config_flags%tke_heat_flux ! constant heat flux value
  2979. ! set in namelist.input
  2980. DO j = j_start, j_end
  2981. DO i = i_start, i_end
  2982. cpm = cp * (1. + 0.8 * moist(i,kts,j,P_QV))
  2983. hfx(i,j)=heat_flux*cp*rho(i,1,j) ! provided for output only
  2984. rt_tendf(i,kts,j)=rt_tendf(i,kts,j) &
  2985. +mu(i,j)*heat_flux*rdzw(i,kts,j)
  2986. ENDDO
  2987. ENDDO
  2988. CASE (1) ! use surface heat flux computed from surface routine
  2989. DO j = j_start, j_end
  2990. DO i = i_start, i_end
  2991. cpm = cp * (1. + 0.8 * moist(i,kts,j,P_QV))
  2992. heat_flux = hfx(i,j)/cpm/rho(i,1,j)
  2993. rt_tendf(i,kts,j)=rt_tendf(i,kts,j) &
  2994. +mu(i,j)*heat_flux*rdzw(i,kts,j)
  2995. ENDDO
  2996. ENDDO
  2997. CASE DEFAULT
  2998. CALL wrf_error_fatal( 'isfflx value invalid for diff_opt=2' )
  2999. END SELECT hflux
  3000. !
  3001. ! FINE MODIFICA al flusso di calore
  3002. !*****************************************
  3003. !*****************************************
  3004. If (km_opt .eq. 2) then
  3005. CALL vertical_diffusion_s( tke_tendf(ims,kms,jms), &
  3006. config_flags, tke(ims,kms,jms), &
  3007. mu, xkhv, &
  3008. dn, dnw, rdz, rdzw, fnm, fnp, &
  3009. .true., &
  3010. ids, ide, jds, jde, kds, kde, &
  3011. ims, ime, jms, jme, kms, kme, &
  3012. its, ite, jts, jte, kts, kte )
  3013. endif
  3014. IF (n_moist .ge. PARAM_FIRST_SCALAR) THEN
  3015. moist_loop: do im = PARAM_FIRST_SCALAR, n_moist
  3016. IF ( (.not. config_flags%mix_full_fields) .and. (im == P_QV) ) THEN
  3017. DO j=jts,min(jte,jde-1)
  3018. DO k=kts,kte-1
  3019. DO i=its,min(ite,ide-1)
  3020. var_mix(i,k,j) = moist(i,k,j,im) - qv_base(k)
  3021. ENDDO
  3022. ENDDO
  3023. ENDDO
  3024. ELSE
  3025. DO j=jts,min(jte,jde-1)
  3026. DO k=kts,kte-1
  3027. DO i=its,min(ite,ide-1)
  3028. var_mix(i,k,j) = moist(i,k,j,im)
  3029. ENDDO
  3030. ENDDO
  3031. ENDDO
  3032. END IF
  3033. CALL vertical_diffusion_s( moist_tendf(ims,kms,jms,im), &
  3034. config_flags, var_mix, &
  3035. mu, xkhv, &
  3036. dn, dnw, rdz, rdzw, fnm, fnp, &
  3037. .false., &
  3038. ids, ide, jds, jde, kds, kde, &
  3039. ims, ime, jms, jme, kms, kme, &
  3040. its, ite, jts, jte, kts, kte )
  3041. !*****************************************
  3042. !*****************************************
  3043. !MODIFICATIONS for water vapor flux
  3044. !
  3045. !
  3046. qflux: SELECT CASE( config_flags%isfflx )
  3047. CASE (0)
  3048. ! do nothing
  3049. CASE (1,2) ! with surface moisture flux
  3050. IF ( im == P_QV ) THEN
  3051. DO j = j_start, j_end
  3052. DO i = i_start, i_end
  3053. moist_flux = qfx(i,j)/rho(i,1,j)/(1.+moist(i,kts,j,P_QV))
  3054. moist_tendf(i,kts,j,im)=moist_tendf(i,kts,j,im) &
  3055. +mu(i,j)*moist_flux*rdzw(i,kts,j)
  3056. ENDDO
  3057. ENDDO
  3058. ENDIF
  3059. CASE DEFAULT
  3060. CALL wrf_error_fatal( 'isfflx value invalid for diff_opt=2' )
  3061. END SELECT qflux
  3062. !
  3063. ! END MODIFICATIONS for water vapor flux
  3064. !*****************************************
  3065. !*****************************************
  3066. ENDDO moist_loop
  3067. ENDIF
  3068. IF (n_chem .ge. PARAM_FIRST_SCALAR) THEN
  3069. chem_loop: do im = PARAM_FIRST_SCALAR, n_chem
  3070. CALL vertical_diffusion_s( chem_tendf(ims,kms,jms,im), &
  3071. config_flags, chem(ims,kms,jms,im), &
  3072. mu, xkhv, &
  3073. dn, dnw, rdz, rdzw, fnm, fnp, &
  3074. .false., &
  3075. ids, ide, jds, jde, kds, kde, &
  3076. ims, ime, jms, jme, kms, kme, &
  3077. its, ite, jts, jte, kts, kte )
  3078. ENDDO chem_loop
  3079. ENDIF
  3080. IF (n_tracer .ge. PARAM_FIRST_SCALAR) THEN
  3081. tracer_loop: do im = PARAM_FIRST_SCALAR, n_tracer
  3082. CALL vertical_diffusion_s( tracer_tendf(ims,kms,jms,im), &
  3083. config_flags, tracer(ims,kms,jms,im), &
  3084. mu, xkhv, &
  3085. dn, dnw, rdz, rdzw, fnm, fnp, &
  3086. .false., &
  3087. ids, ide, jds, jde, kds, kde, &
  3088. ims, ime, jms, jme, kms, kme, &
  3089. its, ite, jts, jte, kts, kte )
  3090. ENDDO tracer_loop
  3091. ENDIF
  3092. IF (n_scalar .ge. PARAM_FIRST_SCALAR) THEN
  3093. scalar_loop: do im = PARAM_FIRST_SCALAR, n_scalar
  3094. CALL vertical_diffusion_s( scalar_tendf(ims,kms,jms,im), &
  3095. config_flags, scalar(ims,kms,jms,im), &
  3096. mu, xkhv, &
  3097. dn, dnw, rdz, rdzw, fnm, fnp, &
  3098. .false., &
  3099. ids, ide, jds, jde, kds, kde, &
  3100. ims, ime, jms, jme, kms, kme, &
  3101. its, ite, jts, jte, kts, kte )
  3102. ENDDO scalar_loop
  3103. ENDIF
  3104. END SUBROUTINE vertical_diffusion_2
  3105. !=======================================================================
  3106. !=======================================================================
  3107. SUBROUTINE vertical_diffusion_u_2( tendency, config_flags, mu, &
  3108. defor13, xkmv, &
  3109. nba_mij, n_nba_mij, & !JDM
  3110. dnw, rdzw, fnm, fnp, &
  3111. ids, ide, jds, jde, kds, kde, &
  3112. ims, ime, jms, jme, kms, kme, &
  3113. its, ite, jts, jte, kts, kte )
  3114. !-----------------------------------------------------------------------
  3115. ! Begin declarations.
  3116. IMPLICIT NONE
  3117. TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
  3118. INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
  3119. ims, ime, jms, jme, kms, kme, &
  3120. its, ite, jts, jte, kts, kte
  3121. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnm
  3122. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnp
  3123. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: dnw
  3124. ! REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN ) :: zeta_z
  3125. REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) ::tendency
  3126. REAL , DIMENSION( ims:ime , kms:kme, jms:jme ) , &
  3127. INTENT(IN ) ::defor13, &
  3128. xkmv, &
  3129. rdzw
  3130. INTEGER, INTENT( IN ) :: n_nba_mij !JDM
  3131. REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_nba_mij), INTENT(INOUT) & !JDM
  3132. :: nba_mij
  3133. REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN ) :: mu
  3134. ! LOCAL VARS
  3135. INTEGER :: i, j, k, ktf
  3136. INTEGER :: i_start, i_end, j_start, j_end
  3137. INTEGER :: is_ext,ie_ext,js_ext,je_ext
  3138. REAL , DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1) :: titau3
  3139. REAL , DIMENSION( its:ite, jts:jte) :: zzavg
  3140. REAL :: rdzu
  3141. ! End declarations.
  3142. !-----------------------------------------------------------------------
  3143. ktf=MIN(kte,kde-1)
  3144. i_start = its
  3145. i_end = ite
  3146. j_start = jts
  3147. j_end = MIN(jte,jde-1)
  3148. IF ( config_flags%open_xs .or. config_flags%specified .or. &
  3149. config_flags%nested) i_start = MAX(ids+1,its)
  3150. IF ( config_flags%open_xe .or. config_flags%specified .or. &
  3151. config_flags%nested) i_end = MIN(ide-1,ite)
  3152. IF ( config_flags%open_ys .or. config_flags%specified .or. &
  3153. config_flags%nested) j_start = MAX(jds+1,jts)
  3154. IF ( config_flags%open_ye .or. config_flags%specified .or. &
  3155. config_flags%nested) j_end = MIN(jde-2,jte)
  3156. IF ( config_flags%periodic_x ) i_start = its
  3157. IF ( config_flags%periodic_x ) i_end = ite
  3158. ! titau3 = titau13
  3159. is_ext=0
  3160. ie_ext=0
  3161. js_ext=0
  3162. je_ext=0
  3163. CALL cal_titau_13_31( config_flags, titau3, defor13, &
  3164. nba_mij(ims,kms,jms,P_m13), & !JDM
  3165. mu, xkmv, fnm, fnp, &
  3166. is_ext, ie_ext, js_ext, je_ext, &
  3167. ids, ide, jds, jde, kds, kde, &
  3168. ims, ime, jms, jme, kms, kme, &
  3169. its, ite, jts, jte, kts, kte )
  3170. !
  3171. DO j = j_start, j_end
  3172. DO k=kts+1,ktf
  3173. DO i = i_start, i_end
  3174. rdzu = 2./(1./rdzw(i,k,j) + 1./rdzw(i-1,k,j))
  3175. tendency(i,k,j)=tendency(i,k,j)-rdzu*(titau3(i,k+1,j)-titau3(i,k,j))
  3176. ENDDO
  3177. ENDDO
  3178. ENDDO
  3179. ! ******** MODIF...
  3180. ! we will pick up the surface drag (titau3(i,kts,j)) later
  3181. !
  3182. DO j = j_start, j_end
  3183. k=kts
  3184. DO i = i_start, i_end
  3185. rdzu = 2./(1./rdzw(i,k,j) + 1./rdzw(i-1,k,j))
  3186. tendency(i,k,j)=tendency(i,k,j)-rdzu*(titau3(i,k+1,j))
  3187. ENDDO
  3188. ENDDO
  3189. ! ******** MODIF...
  3190. END SUBROUTINE vertical_diffusion_u_2
  3191. !=======================================================================
  3192. !=======================================================================
  3193. SUBROUTINE vertical_diffusion_v_2( tendency, config_flags, mu, &
  3194. defor23, xkmv, &
  3195. nba_mij, n_nba_mij, & !JDM
  3196. dnw, rdzw, fnm, fnp, &
  3197. ids, ide, jds, jde, kds, kde, &
  3198. ims, ime, jms, jme, kms, kme, &
  3199. its, ite, jts, jte, kts, kte )
  3200. !-----------------------------------------------------------------------
  3201. ! Begin declarations.
  3202. IMPLICIT NONE
  3203. TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
  3204. INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
  3205. ims, ime, jms, jme, kms, kme, &
  3206. its, ite, jts, jte, kts, kte
  3207. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnm
  3208. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnp
  3209. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: dnw
  3210. ! REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN ) :: zeta_z
  3211. REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) ::tendency
  3212. REAL , DIMENSION( ims:ime , kms:kme, jms:jme ) , &
  3213. INTENT(IN ) ::defor23, &
  3214. xkmv, &
  3215. rdzw
  3216. INTEGER, INTENT( IN ) :: n_nba_mij !JDM
  3217. REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_nba_mij), INTENT(INOUT) & !JDM
  3218. :: nba_mij
  3219. REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN ) :: mu
  3220. ! LOCAL VARS
  3221. INTEGER :: i, j, k, ktf
  3222. INTEGER :: i_start, i_end, j_start, j_end
  3223. INTEGER :: is_ext,ie_ext,js_ext,je_ext
  3224. REAL , DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1) :: titau3
  3225. REAL , DIMENSION( its:ite, jts:jte) :: zzavg
  3226. REAL :: rdzv
  3227. ! End declarations.
  3228. !-----------------------------------------------------------------------
  3229. ktf=MIN(kte,kde-1)
  3230. i_start = its
  3231. i_end = MIN(ite,ide-1)
  3232. j_start = jts
  3233. j_end = jte
  3234. IF ( config_flags%open_xs .or. config_flags%specified .or. &
  3235. config_flags%nested) i_start = MAX(ids+1,its)
  3236. IF ( config_flags%open_xe .or. config_flags%specified .or. &
  3237. config_flags%nested) i_end = MIN(ide-2,ite)
  3238. IF ( config_flags%open_ys .or. config_flags%specified .or. &
  3239. config_flags%nested) j_start = MAX(jds+1,jts)
  3240. IF ( config_flags%open_ye .or. config_flags%specified .or. &
  3241. config_flags%nested) j_end = MIN(jde-1,jte)
  3242. IF ( config_flags%periodic_x ) i_start = its
  3243. IF ( config_flags%periodic_x ) i_end = MIN(ite,ide-1)
  3244. ! titau3 = titau23
  3245. is_ext=0
  3246. ie_ext=0
  3247. js_ext=0
  3248. je_ext=0
  3249. CALL cal_titau_23_32( config_flags, titau3, defor23, &
  3250. nba_mij(ims,kms,jms,P_m23), & !JDM
  3251. mu, xkmv, fnm, fnp, &
  3252. is_ext, ie_ext, js_ext, je_ext, &
  3253. ids, ide, jds, jde, kds, kde, &
  3254. ims, ime, jms, jme, kms, kme, &
  3255. its, ite, jts, jte, kts, kte )
  3256. DO j = j_start, j_end
  3257. DO k = kts+1,ktf
  3258. DO i = i_start, i_end
  3259. rdzv = 2./(1./rdzw(i,k,j) + 1./rdzw(i,k,j-1))
  3260. tendency(i,k,j)=tendency(i,k,j)-rdzv*(titau3(i,k+1,j)-titau3(i,k,j))
  3261. ENDDO
  3262. ENDDO
  3263. ENDDO
  3264. ! ******** MODIF...
  3265. ! we will pick up the surface drag (titau3(i,kts,j)) later
  3266. !
  3267. DO j = j_start, j_end
  3268. k=kts
  3269. DO i = i_start, i_end
  3270. rdzv = 2./(1./rdzw(i,k,j) + 1./rdzw(i,k,j-1))
  3271. tendency(i,k,j)=tendency(i,k,j)-rdzv*(titau3(i,k+1,j))
  3272. ENDDO
  3273. ENDDO
  3274. ! ******** MODIF...
  3275. END SUBROUTINE vertical_diffusion_v_2
  3276. !=======================================================================
  3277. !=======================================================================
  3278. SUBROUTINE vertical_diffusion_w_2(tendency, config_flags, mu, &
  3279. defor33, tke, &
  3280. nba_mij, n_nba_mij, & !JDM
  3281. div, xkmv, &
  3282. dn, rdz, &
  3283. ids, ide, jds, jde, kds, kde, &
  3284. ims, ime, jms, jme, kms, kme, &
  3285. its, ite, jts, jte, kts, kte )
  3286. !-----------------------------------------------------------------------
  3287. ! Begin declarations.
  3288. IMPLICIT NONE
  3289. TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
  3290. INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
  3291. ims, ime, jms, jme, kms, kme, &
  3292. its, ite, jts, jte, kts, kte
  3293. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: dn
  3294. REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) ::tendency
  3295. REAL , DIMENSION( ims:ime , kms:kme, jms:jme ) , &
  3296. INTENT(IN ) ::defor33, &
  3297. tke, &
  3298. div, &
  3299. xkmv, &
  3300. rdz
  3301. INTEGER, INTENT( IN ) :: n_nba_mij !JDM
  3302. REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_nba_mij), INTENT(INOUT) & !JDM
  3303. :: nba_mij
  3304. REAL , DIMENSION( ims:ime, jms:jme), INTENT(IN ) :: mu
  3305. ! LOCAL VARS
  3306. INTEGER :: i, j, k, ktf
  3307. INTEGER :: i_start, i_end, j_start, j_end
  3308. INTEGER :: is_ext,ie_ext,js_ext,je_ext
  3309. REAL , DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1) :: titau3
  3310. ! End declarations.
  3311. !-----------------------------------------------------------------------
  3312. ktf=MIN(kte,kde-1)
  3313. i_start = its
  3314. i_end = MIN(ite,ide-1)
  3315. j_start = jts
  3316. j_end = MIN(jte,jde-1)
  3317. IF ( config_flags%open_xs .or. config_flags%specified .or. &
  3318. config_flags%nested) i_start = MAX(ids+1,its)
  3319. IF ( config_flags%open_xe .or. config_flags%specified .or. &
  3320. config_flags%nested) i_end = MIN(ide-2,ite)
  3321. IF ( config_flags%open_ys .or. config_flags%specified .or. &
  3322. config_flags%nested) j_start = MAX(jds+1,jts)
  3323. IF ( config_flags%open_ye .or. config_flags%specified .or. &
  3324. config_flags%nested) j_end = MIN(jde-2,jte)
  3325. IF ( config_flags%periodic_x ) i_start = its
  3326. IF ( config_flags%periodic_x ) i_end = MIN(ite,ide-1)
  3327. ! titau3 = titau33
  3328. is_ext=0
  3329. ie_ext=0
  3330. js_ext=0
  3331. je_ext=0
  3332. CALL cal_titau_11_22_33( config_flags, titau3, &
  3333. mu, tke, xkmv, defor33, &
  3334. nba_mij(ims,kms,jms,P_m33), & !JDM
  3335. is_ext, ie_ext, js_ext, je_ext, &
  3336. ids, ide, jds, jde, kds, kde, &
  3337. ims, ime, jms, jme, kms, kme, &
  3338. its, ite, jts, jte, kts, kte )
  3339. ! DO j = j_start, j_end
  3340. ! DO k = kts+1, ktf
  3341. ! DO i = i_start, i_end
  3342. ! titau3(i,k,j)=titau3(i,k,j)*zeta_z(i,j)
  3343. ! ENDDO
  3344. ! ENDDO
  3345. ! ENDDO
  3346. DO j = j_start, j_end
  3347. DO k = kts+1, ktf
  3348. DO i = i_start, i_end
  3349. tendency(i,k,j)=tendency(i,k,j)-rdz(i,k,j)*(titau3(i,k,j)-titau3(i,k-1,j))
  3350. ENDDO
  3351. ENDDO
  3352. ENDDO
  3353. END SUBROUTINE vertical_diffusion_w_2
  3354. !=======================================================================
  3355. !=======================================================================
  3356. SUBROUTINE vertical_diffusion_s( tendency, config_flags, var, mu, xkhv, &
  3357. dn, dnw, rdz, rdzw, fnm, fnp, &
  3358. doing_tke, &
  3359. ids, ide, jds, jde, kds, kde, &
  3360. ims, ime, jms, jme, kms, kme, &
  3361. its, ite, jts, jte, kts, kte )
  3362. !-----------------------------------------------------------------------
  3363. ! Begin declarations.
  3364. IMPLICIT NONE
  3365. TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
  3366. INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
  3367. ims, ime, jms, jme, kms, kme, &
  3368. its, ite, jts, jte, kts, kte
  3369. LOGICAL, INTENT(IN ) :: doing_tke
  3370. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnm
  3371. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnp
  3372. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: dn
  3373. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: dnw
  3374. REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) ::tendency
  3375. REAL , DIMENSION( ims:ime , kms:kme, jms:jme ) , INTENT(IN) :: xkhv
  3376. REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN) :: mu
  3377. REAL , DIMENSION( ims:ime , kms:kme, jms:jme ) , &
  3378. INTENT(IN ) :: var, &
  3379. rdz, &
  3380. rdzw
  3381. ! LOCAL VARS
  3382. INTEGER :: i, j, k, ktf
  3383. INTEGER :: i_start, i_end, j_start, j_end
  3384. REAL , DIMENSION( its:ite, kts:kte, jts:jte) :: H3, &
  3385. xkxavg, &
  3386. rravg
  3387. REAL , DIMENSION( its:ite, kts:kte, jts:jte) :: tmptendf
  3388. ! End declarations.
  3389. !-----------------------------------------------------------------------
  3390. ktf=MIN(kte,kde-1)
  3391. i_start = its
  3392. i_end = MIN(ite,ide-1)
  3393. j_start = jts
  3394. j_end = MIN(jte,jde-1)
  3395. IF ( config_flags%open_xs .or. config_flags%specified .or. &
  3396. config_flags%nested) i_start = MAX(ids+1,its)
  3397. IF ( config_flags%open_xe .or. config_flags%specified .or. &
  3398. config_flags%nested) i_end = MIN(ide-2,ite)
  3399. IF ( config_flags%open_ys .or. config_flags%specified .or. &
  3400. config_flags%nested) j_start = MAX(jds+1,jts)
  3401. IF ( config_flags%open_ye .or. config_flags%specified .or. &
  3402. config_flags%nested) j_end = MIN(jde-2,jte)
  3403. IF ( config_flags%periodic_x ) i_start = its
  3404. IF ( config_flags%periodic_x ) i_end = MIN(ite,ide-1)
  3405. IF (doing_tke) THEN
  3406. DO j = j_start, j_end
  3407. DO k = kts,ktf
  3408. DO i = i_start, i_end
  3409. tmptendf(i,k,j)=tendency(i,k,j)
  3410. ENDDO
  3411. ENDDO
  3412. ENDDO
  3413. ENDIF
  3414. ! H3
  3415. xkxavg = 0.
  3416. DO j = j_start, j_end
  3417. DO k = kts+1,ktf
  3418. DO i = i_start, i_end
  3419. xkxavg(i,k,j)=fnm(k)*xkhv(i,k,j)+fnp(k)*xkhv(i,k-1,j)
  3420. H3(i,k,j)=-xkxavg(i,k,j)*(var(i,k,j)-var(i,k-1,j))*rdz(i,k,j)
  3421. ! H3(i,k,j)=-xkxavg(i,k,j)*zeta_z(i,j)* &
  3422. ! (var(i,k,j)-var(i,k-1,j))/dn(k)
  3423. ENDDO
  3424. ENDDO
  3425. ENDDO
  3426. DO j = j_start, j_end
  3427. DO i = i_start, i_end
  3428. H3(i,kts,j)=0.
  3429. H3(i,ktf+1,j)=0.
  3430. ! H3(i,kts,j)=H3(i,kts+1,j)
  3431. ! H3(i,ktf+1,j)=H3(i,ktf,j)
  3432. ENDDO
  3433. ENDDO
  3434. DO j = j_start, j_end
  3435. DO k = kts,ktf
  3436. DO i = i_start, i_end
  3437. tendency(i,k,j)=tendency(i,k,j) &
  3438. -mu(i,j)*(H3(i,k+1,j)-H3(i,k,j))*rdzw(i,k,j)
  3439. ENDDO
  3440. ENDDO
  3441. ENDDO
  3442. IF (doing_tke) THEN
  3443. DO j = j_start, j_end
  3444. DO k = kts,ktf
  3445. DO i = i_start, i_end
  3446. tendency(i,k,j)=tmptendf(i,k,j)+2.* &
  3447. (tendency(i,k,j)-tmptendf(i,k,j))
  3448. ENDDO
  3449. ENDDO
  3450. ENDDO
  3451. ENDIF
  3452. END SUBROUTINE vertical_diffusion_s
  3453. !=======================================================================
  3454. !=======================================================================
  3455. SUBROUTINE cal_titau_11_22_33( config_flags, titau, &
  3456. mu, tke, xkx, defor, &
  3457. mtau, & !JDM
  3458. is_ext, ie_ext, js_ext, je_ext, &
  3459. ids, ide, jds, jde, kds, kde, &
  3460. ims, ime, jms, jme, kms, kme, &
  3461. its, ite, jts, jte, kts, kte )
  3462. ! History: Sep 2003 Changes by George Bryan and Jason Knievel, NCAR
  3463. ! Oct 2001 Converted to mass core by Bill Skamarock, NCAR
  3464. ! Aug 2000 Original code by Shu-Hua Chen, UC-Davis
  3465. ! Purpose: This routine calculates stress terms (taus) for use in
  3466. ! the calculation of production of TKE by sheared wind
  3467. ! References: Klemp and Wilhelmson (JAS 1978)
  3468. ! Deardorff (B-L Meteor 1980)
  3469. ! Chen and Dudhia (NCAR WRF physics report 2000)
  3470. ! Key:
  3471. !-----------------------------------------------------------------------
  3472. ! Begin declarations.
  3473. IMPLICIT NONE
  3474. TYPE( grid_config_rec_type ), INTENT( IN ) &
  3475. :: config_flags
  3476. INTEGER, INTENT( IN ) &
  3477. :: ids, ide, jds, jde, kds, kde, &
  3478. ims, ime, jms, jme, kms, kme, &
  3479. its, ite, jts, jte, kts, kte
  3480. INTEGER, INTENT( IN ) &
  3481. :: is_ext, ie_ext, js_ext, je_ext
  3482. REAL, DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1 ), INTENT( INOUT ) &
  3483. :: titau
  3484. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
  3485. :: defor, xkx, tke
  3486. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) & !JDM
  3487. :: mtau
  3488. REAL, DIMENSION( ims:ime, jms:jme ), INTENT( IN ) &
  3489. :: mu
  3490. ! Local variables.
  3491. INTEGER &
  3492. :: i, j, k, ktf, i_start, i_end, j_start, j_end
  3493. ! End declarations.
  3494. !-----------------------------------------------------------------------
  3495. ktf = MIN( kte, kde-1 )
  3496. i_start = its
  3497. i_end = ite
  3498. j_start = jts
  3499. j_end = jte
  3500. IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
  3501. config_flags%nested) i_start = MAX( ids+1, its )
  3502. IF ( config_flags%open_xe .OR. config_flags%specified .OR. &
  3503. config_flags%nested) i_end = MIN( ide-1, ite )
  3504. IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
  3505. config_flags%nested) j_start = MAX( jds+1, jts )
  3506. IF ( config_flags%open_ye .OR. config_flags%specified .OR. &
  3507. config_flags%nested) j_end = MIN( jde-1, jte )
  3508. IF ( config_flags%periodic_x ) i_start = its
  3509. IF ( config_flags%periodic_x ) i_end = ite
  3510. i_start = i_start - is_ext
  3511. i_end = i_end + ie_ext
  3512. j_start = j_start - js_ext
  3513. j_end = j_end + je_ext
  3514. IF ( config_flags%sfs_opt .GT. 0 ) THEN ! USE NBA MODEL SFS STRESSES
  3515. DO j = j_start, j_end
  3516. DO k = kts, ktf
  3517. DO i = i_start, i_end
  3518. titau(i,k,j) = mu(i,j) * mtau(i,k,j)
  3519. END DO
  3520. END DO
  3521. END DO
  3522. ELSE !NOT NBA
  3523. IF ( config_flags%m_opt .EQ. 1 ) THEN ! ASSIGN STRESS TO MTAU FOR OUTPUT
  3524. DO j = j_start, j_end
  3525. DO k = kts, ktf
  3526. DO i = i_start, i_end
  3527. titau(i,k,j) = - mu(i,j) * xkx(i,k,j) * defor(i,k,j)
  3528. mtau(i,k,j) = - xkx(i,k,j) * defor(i,k,j)
  3529. END DO
  3530. END DO
  3531. END DO
  3532. ELSE !NO STRESS OUTPUT
  3533. DO j = j_start, j_end
  3534. DO k = kts, ktf
  3535. DO i = i_start, i_end
  3536. titau(i,k,j) = - mu(i,j) * xkx(i,k,j) * defor(i,k,j)
  3537. END DO
  3538. END DO
  3539. END DO
  3540. ENDIF
  3541. ENDIF
  3542. END SUBROUTINE cal_titau_11_22_33
  3543. !=======================================================================
  3544. !=======================================================================
  3545. SUBROUTINE cal_titau_12_21( config_flags, titau, &
  3546. mu, xkx, defor, &
  3547. mtau, & !JDM
  3548. is_ext, ie_ext, js_ext, je_ext, &
  3549. ids, ide, jds, jde, kds, kde, &
  3550. ims, ime, jms, jme, kms, kme, &
  3551. its, ite, jts, jte, kts, kte )
  3552. ! History: Sep 2003 Modifications by George Bryan and Jason Knievel, NCAR
  3553. ! Oct 2001 Converted to mass core by Bill Skamarock, NCAR
  3554. ! Aug 2000 Original code by Shu-Hua Chen, UC-Davis
  3555. ! Pusrpose This routine calculates the stress terms (taus) for use in
  3556. ! the calculation of production of TKE by sheared wind
  3557. ! References: Klemp and Wilhelmson (JAS 1978)
  3558. ! Deardorff (B-L Meteor 1980)
  3559. ! Chen and Dudhia (NCAR WRF physics report 2000)
  3560. ! Key:
  3561. !-----------------------------------------------------------------------
  3562. ! Begin declarations.
  3563. IMPLICIT NONE
  3564. TYPE( grid_config_rec_type), INTENT( IN ) &
  3565. :: config_flags
  3566. INTEGER, INTENT( IN ) &
  3567. :: ids, ide, jds, jde, kds, kde, &
  3568. ims, ime, jms, jme, kms, kme, &
  3569. its, ite, jts, jte, kts, kte
  3570. INTEGER, INTENT( IN ) &
  3571. :: is_ext, ie_ext, js_ext, je_ext
  3572. REAL, DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1 ), INTENT( INOUT ) &
  3573. :: titau
  3574. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
  3575. :: defor, xkx
  3576. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) & !JDM
  3577. :: mtau
  3578. REAL, DIMENSION( ims:ime, jms:jme ), INTENT( IN ) &
  3579. :: mu
  3580. ! Local variables.
  3581. INTEGER &
  3582. :: i, j, k, ktf, i_start, i_end, j_start, j_end
  3583. REAL, DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1 ) &
  3584. :: xkxavg
  3585. REAL, DIMENSION( its-1:ite+1, jts-1:jte+1 ) &
  3586. :: muavg
  3587. ! End declarations.
  3588. !-----------------------------------------------------------------------
  3589. ktf = MIN( kte, kde-1 )
  3590. ! Needs one more point in the x and y directions.
  3591. i_start = its
  3592. i_end = ite
  3593. j_start = jts
  3594. j_end = jte
  3595. IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
  3596. config_flags%nested ) i_start = MAX( ids+1, its )
  3597. IF ( config_flags%open_xe .OR. config_flags%specified .OR. &
  3598. config_flags%nested ) i_end = MIN( ide-1, ite )
  3599. IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
  3600. config_flags%nested ) j_start = MAX( jds+1, jts )
  3601. IF ( config_flags%open_ye .OR. config_flags%specified .OR. &
  3602. config_flags%nested ) j_end = MIN( jde-1, jte )
  3603. IF ( config_flags%periodic_x ) i_start = its
  3604. IF ( config_flags%periodic_x ) i_end = ite
  3605. i_start = i_start - is_ext
  3606. i_end = i_end + ie_ext
  3607. j_start = j_start - js_ext
  3608. j_end = j_end + je_ext
  3609. DO j = j_start, j_end
  3610. DO k = kts, ktf
  3611. DO i = i_start, i_end
  3612. xkxavg(i,k,j) = 0.25 * ( xkx(i-1,k,j ) + xkx(i,k,j ) + &
  3613. xkx(i-1,k,j-1) + xkx(i,k,j-1) )
  3614. END DO
  3615. END DO
  3616. END DO
  3617. DO j = j_start, j_end
  3618. DO i = i_start, i_end
  3619. muavg(i,j) = 0.25 * ( mu(i-1,j ) + mu(i,j ) + &
  3620. mu(i-1,j-1) + mu(i,j-1) )
  3621. END DO
  3622. END DO
  3623. ! titau12 or titau21
  3624. IF ( config_flags%sfs_opt .GT. 0 ) THEN ! USE NBA MODEL SFS STRESSES
  3625. DO j = j_start, j_end
  3626. DO k = kts, ktf
  3627. DO i = i_start, i_end
  3628. titau(i,k,j) = muavg(i,j) * mtau(i,k,j)
  3629. END DO
  3630. END DO
  3631. END DO
  3632. ELSE ! NOT NBA
  3633. IF ( config_flags%m_opt .EQ. 1 ) THEN ! ASSIGN STRESS TO MTAU FOR OUTPUT
  3634. DO j = j_start, j_end
  3635. DO k = kts, ktf
  3636. DO i = i_start, i_end
  3637. titau(i,k,j) = - muavg(i,j) * xkxavg(i,k,j) * defor(i,k,j)
  3638. mtau(i,k,j) = - xkxavg(i,k,j) * defor(i,k,j)
  3639. END DO
  3640. END DO
  3641. END DO
  3642. ELSE ! NO STRESS OUTPUT
  3643. DO j = j_start, j_end
  3644. DO k = kts, ktf
  3645. DO i = i_start, i_end
  3646. titau(i,k,j) = - muavg(i,j) * xkxavg(i,k,j) * defor(i,k,j)
  3647. END DO
  3648. END DO
  3649. END DO
  3650. ENDIF
  3651. ENDIF
  3652. END SUBROUTINE cal_titau_12_21
  3653. !=======================================================================
  3654. SUBROUTINE cal_titau_13_31( config_flags, titau, &
  3655. defor, &
  3656. mtau, & !JDM
  3657. mu, xkx, fnm, fnp, &
  3658. is_ext, ie_ext, js_ext, je_ext, &
  3659. ids, ide, jds, jde, kds, kde, &
  3660. ims, ime, jms, jme, kms, kme, &
  3661. its, ite, jts, jte, kts, kte )
  3662. ! History: Sep 2003 Modifications by George Bryan and Jason Knievel, NCAR
  3663. ! Oct 2001 Converted to mass core by Bill Skamarock, NCAR
  3664. ! Aug 2000 Original code by Shu-Hua Chen, UC-Davis
  3665. ! Purpose: This routine calculates the stress terms (taus) for use in
  3666. ! the calculation of production of TKE by sheared wind
  3667. ! References: Klemp and Wilhelmson (JAS 1978)
  3668. ! Deardorff (B-L Meteor 1980)
  3669. ! Chen and Dudhia (NCAR WRF physics report 2000)
  3670. ! Key:
  3671. !-----------------------------------------------------------------------
  3672. ! Begin declarations.
  3673. IMPLICIT NONE
  3674. TYPE( grid_config_rec_type), INTENT( IN ) &
  3675. :: config_flags
  3676. INTEGER, INTENT( IN ) &
  3677. :: ids, ide, jds, jde, kds, kde, &
  3678. ims, ime, jms, jme, kms, kme, &
  3679. its, ite, jts, jte, kts, kte
  3680. INTEGER, INTENT( IN ) &
  3681. :: is_ext, ie_ext, js_ext, je_ext
  3682. REAL, DIMENSION( kms:kme ), INTENT( IN ) &
  3683. :: fnm, fnp
  3684. REAL, DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1 ), INTENT( INOUT ) &
  3685. :: titau
  3686. REAL, DIMENSION( ims:ime, kms:kme, jms:jme), INTENT( IN ) &
  3687. :: defor, xkx
  3688. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) & !JDM
  3689. :: mtau
  3690. REAL, DIMENSION( ims:ime, jms:jme), INTENT( IN ) &
  3691. :: mu
  3692. ! Local variables.
  3693. INTEGER &
  3694. :: i, j, k, ktf, i_start, i_end, j_start, j_end
  3695. REAL, DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1 ) &
  3696. :: xkxavg
  3697. REAL, DIMENSION( its-1:ite+1, jts-1:jte+1 ) &
  3698. :: muavg
  3699. ! End declarations.
  3700. !-----------------------------------------------------------------------
  3701. ktf = MIN( kte, kde-1 )
  3702. ! Find ide-1 and jde-1 for averaging to p point.
  3703. i_start = its
  3704. i_end = ite
  3705. j_start = jts
  3706. j_end = MIN( jte, jde-1 )
  3707. IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
  3708. config_flags%nested) i_start = MAX( ids+1, its )
  3709. IF ( config_flags%open_xe .OR. config_flags%specified .OR. &
  3710. config_flags%nested) i_end = MIN( ide-1, ite )
  3711. IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
  3712. config_flags%nested) j_start = MAX( jds+1, jts )
  3713. IF ( config_flags%open_ye .OR. config_flags%specified .OR. &
  3714. config_flags%nested) j_end = MIN( jde-2, jte )
  3715. IF ( config_flags%periodic_x ) i_start = its
  3716. IF ( config_flags%periodic_x ) i_end = ite
  3717. i_start = i_start - is_ext
  3718. i_end = i_end + ie_ext
  3719. j_start = j_start - js_ext
  3720. j_end = j_end + je_ext
  3721. DO j = j_start, j_end
  3722. DO k = kts+1, ktf
  3723. DO i = i_start, i_end
  3724. xkxavg(i,k,j) = 0.5 * ( fnm(k) * ( xkx(i,k ,j) + xkx(i-1,k ,j) ) + &
  3725. fnp(k) * ( xkx(i,k-1,j) + xkx(i-1,k-1,j) ) )
  3726. END DO
  3727. END DO
  3728. END DO
  3729. DO j = j_start, j_end
  3730. DO i = i_start, i_end
  3731. muavg(i,j) = 0.5 * ( mu(i,j) + mu(i-1,j) )
  3732. END DO
  3733. END DO
  3734. IF ( config_flags%sfs_opt .GT. 0 ) THEN ! USE NBA MODEL SFS STRESSES
  3735. DO j = j_start, j_end
  3736. DO k = kts+1, ktf
  3737. DO i = i_start, i_end
  3738. titau(i,k,j) = muavg(i,j) * mtau(i,k,j)
  3739. ENDDO
  3740. ENDDO
  3741. ENDDO
  3742. ELSE ! NOT NBA
  3743. IF ( config_flags%m_opt .EQ. 1 ) THEN ! ASSIGN STRESS TO MTAU FOR OUTPUT
  3744. DO j = j_start, j_end
  3745. DO k = kts+1, ktf
  3746. DO i = i_start, i_end
  3747. titau(i,k,j) = - muavg(i,j) * xkxavg(i,k,j) * defor(i,k,j)
  3748. mtau(i,k,j) = - xkxavg(i,k,j) * defor(i,k,j)
  3749. ENDDO
  3750. ENDDO
  3751. ENDDO
  3752. ELSE ! NO STRESS OUTPUT
  3753. DO j = j_start, j_end
  3754. DO k = kts+1, ktf
  3755. DO i = i_start, i_end
  3756. titau(i,k,j) = - muavg(i,j) * xkxavg(i,k,j) * defor(i,k,j)
  3757. ENDDO
  3758. ENDDO
  3759. ENDDO
  3760. ENDIF
  3761. ENDIF
  3762. DO j = j_start, j_end
  3763. DO i = i_start, i_end
  3764. titau(i,kts ,j) = 0.0
  3765. titau(i,ktf+1,j) = 0.0
  3766. ENDDO
  3767. ENDDO
  3768. END SUBROUTINE cal_titau_13_31
  3769. !=======================================================================
  3770. !=======================================================================
  3771. SUBROUTINE cal_titau_23_32( config_flags, titau, defor, &
  3772. mtau, & !JDM
  3773. mu, xkx, fnm, fnp, &
  3774. is_ext, ie_ext, js_ext, je_ext, &
  3775. ids, ide, jds, jde, kds, kde, &
  3776. ims, ime, jms, jme, kms, kme, &
  3777. its, ite, jts, jte, kts, kte )
  3778. ! History: Sep 2003 Changes by George Bryan and Jason Knievel, NCAR
  3779. ! Oct 2001 Converted to mass core by Bill Skamarock, NCAR
  3780. ! Aug 2000 Original code by Shu-Hua Chen, UC-Davis
  3781. ! Purpose: This routine calculates stress terms (taus) for use in
  3782. ! the calculation of production of TKE by sheared wind
  3783. ! References: Klemp and Wilhelmson (JAS 1978)
  3784. ! Deardorff (B-L Meteor 1980)
  3785. ! Chen and Dudhia (NCAR WRF physics report 2000)
  3786. ! Key:
  3787. !-----------------------------------------------------------------------
  3788. ! Begin declarations.
  3789. IMPLICIT NONE
  3790. TYPE( grid_config_rec_type ), INTENT( IN ) &
  3791. :: config_flags
  3792. INTEGER, INTENT( IN ) &
  3793. :: ids, ide, jds, jde, kds, kde, &
  3794. ims, ime, jms, jme, kms, kme, &
  3795. its, ite, jts, jte, kts, kte
  3796. INTEGER, INTENT( IN ) &
  3797. :: is_ext,ie_ext,js_ext,je_ext
  3798. REAL, DIMENSION( kms:kme ), INTENT( IN ) &
  3799. :: fnm, fnp
  3800. REAL, DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1 ), INTENT( INOUT ) &
  3801. :: titau
  3802. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
  3803. :: defor, xkx
  3804. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) & !JDM
  3805. :: mtau
  3806. REAL, DIMENSION( ims:ime, jms:jme ), INTENT( IN ) &
  3807. :: mu
  3808. ! Local variables.
  3809. INTEGER &
  3810. :: i, j, k, ktf, i_start, i_end, j_start, j_end
  3811. REAL, DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1 ) &
  3812. :: xkxavg
  3813. REAL, DIMENSION( its-1:ite+1, jts-1:jte+1 ) &
  3814. :: muavg
  3815. ! End declarations.
  3816. !-----------------------------------------------------------------------
  3817. ktf = MIN( kte, kde-1 )
  3818. ! Find ide-1 and jde-1 for averaging to p point.
  3819. i_start = its
  3820. i_end = MIN( ite, ide-1 )
  3821. j_start = jts
  3822. j_end = jte
  3823. IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
  3824. config_flags%nested) i_start = MAX( ids+1, its )
  3825. IF ( config_flags%open_xe .OR. config_flags%specified .OR. &
  3826. config_flags%nested) i_end = MIN( ide-2, ite )
  3827. IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
  3828. config_flags%nested) j_start = MAX( jds+1, jts )
  3829. IF ( config_flags%open_ye .OR. config_flags%specified .OR. &
  3830. config_flags%nested) j_end = MIN( jde-1, jte )
  3831. IF ( config_flags%periodic_x ) i_start = its
  3832. IF ( config_flags%periodic_x ) i_end = MIN( ite, ide-1 )
  3833. i_start = i_start - is_ext
  3834. i_end = i_end + ie_ext
  3835. j_start = j_start - js_ext
  3836. j_end = j_end + je_ext
  3837. DO j = j_start, j_end
  3838. DO k = kts+1, ktf
  3839. DO i = i_start, i_end
  3840. xkxavg(i,k,j) = 0.5 * ( fnm(k) * ( xkx(i,k ,j) + xkx(i,k ,j-1) ) + &
  3841. fnp(k) * ( xkx(i,k-1,j) + xkx(i,k-1,j-1) ) )
  3842. END DO
  3843. END DO
  3844. END DO
  3845. DO j = j_start, j_end
  3846. DO i = i_start, i_end
  3847. muavg(i,j) = 0.5 * ( mu(i,j) + mu(i,j-1) )
  3848. END DO
  3849. END DO
  3850. IF ( config_flags%sfs_opt .EQ. 1 ) THEN ! USE NBA MODEL SFS STRESSES
  3851. DO j = j_start, j_end
  3852. DO k = kts+1, ktf
  3853. DO i = i_start, i_end
  3854. titau(i,k,j) = muavg(i,j) * mtau(i,k,j)
  3855. END DO
  3856. END DO
  3857. END DO
  3858. ELSE ! NOT NBA
  3859. IF ( config_flags%m_opt .EQ. 1 ) THEN ! ASSIGN STRESS TO MTAU FOR OUTPUT
  3860. DO j = j_start, j_end
  3861. DO k = kts+1, ktf
  3862. DO i = i_start, i_end
  3863. titau(i,k,j) = - muavg(i,j) * xkxavg(i,k,j) * defor(i,k,j)
  3864. mtau(i,k,j) = - xkxavg(i,k,j) * defor(i,k,j)
  3865. END DO
  3866. END DO
  3867. END DO
  3868. ELSE ! NO STRESS OUTPUT
  3869. DO j = j_start, j_end
  3870. DO k = kts+1, ktf
  3871. DO i = i_start, i_end
  3872. titau(i,k,j) = - muavg(i,j) * xkxavg(i,k,j) * defor(i,k,j)
  3873. END DO
  3874. END DO
  3875. END DO
  3876. ENDIF
  3877. ENDIF
  3878. DO j = j_start, j_end
  3879. DO i = i_start, i_end
  3880. titau(i,kts ,j) = 0.0
  3881. titau(i,ktf+1,j) = 0.0
  3882. END DO
  3883. END DO
  3884. END SUBROUTINE cal_titau_23_32
  3885. !=======================================================================
  3886. !=======================================================================
  3887. SUBROUTINE phy_bc ( config_flags,div,defor11,defor22,defor33, &
  3888. defor12,defor13,defor23,xkmh,xkmv,xkhh,xkhv,tke, &
  3889. RUBLTEN, RVBLTEN, &
  3890. RUCUTEN, RVCUTEN, &
  3891. RUSHTEN, RVSHTEN, &
  3892. ids, ide, jds, jde, kds, kde, &
  3893. ims, ime, jms, jme, kms, kme, &
  3894. ips, ipe, jps, jpe, kps, kpe, &
  3895. its, ite, jts, jte, kts, kte )
  3896. !------------------------------------------------------------------------------
  3897. ! Begin declarations.
  3898. IMPLICIT NONE
  3899. TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
  3900. INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
  3901. ims, ime, jms, jme, kms, kme, &
  3902. ips, ipe, jps, jpe, kps, kpe, &
  3903. its, ite, jts, jte, kts, kte
  3904. REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) ::RUBLTEN, &
  3905. RVBLTEN, &
  3906. RUCUTEN, &
  3907. RVCUTEN, &
  3908. RUSHTEN, &
  3909. RVSHTEN, &
  3910. defor11, &
  3911. defor22, &
  3912. defor33, &
  3913. defor12, &
  3914. defor13, &
  3915. defor23, &
  3916. xkmh, &
  3917. xkmv, &
  3918. xkhh, &
  3919. xkhv, &
  3920. tke, &
  3921. div
  3922. ! End declarations.
  3923. !-----------------------------------------------------------------------
  3924. IF(config_flags%bl_pbl_physics .GT. 0) THEN
  3925. CALL set_physical_bc3d( RUBLTEN , 't', config_flags, &
  3926. ids, ide, jds, jde, kds, kde, &
  3927. ims, ime, jms, jme, kms, kme, &
  3928. ips, ipe, jps, jpe, kps, kpe, &
  3929. its, ite, jts, jte, kts, kte )
  3930. CALL set_physical_bc3d( RVBLTEN , 't', config_flags, &
  3931. ids, ide, jds, jde, kds, kde, &
  3932. ims, ime, jms, jme, kms, kme, &
  3933. ips, ipe, jps, jpe, kps, kpe, &
  3934. its, ite, jts, jte, kts, kte )
  3935. ENDIF
  3936. IF(config_flags%cu_physics .GT. 0) THEN
  3937. CALL set_physical_bc3d( RUCUTEN , 't', config_flags, &
  3938. ids, ide, jds, jde, kds, kde, &
  3939. ims, ime, jms, jme, kms, kme, &
  3940. ips, ipe, jps, jpe, kps, kpe, &
  3941. its, ite, jts, jte, kts, kte )
  3942. CALL set_physical_bc3d( RVCUTEN , 't', config_flags, &
  3943. ids, ide, jds, jde, kds, kde, &
  3944. ims, ime, jms, jme, kms, kme, &
  3945. ips, ipe, jps, jpe, kps, kpe, &
  3946. its, ite, jts, jte, kts, kte )
  3947. ENDIF
  3948. IF(config_flags%shcu_physics .GT. 0) THEN
  3949. CALL set_physical_bc3d( RUSHTEN , 't', config_flags, &
  3950. ids, ide, jds, jde, kds, kde, &
  3951. ims, ime, jms, jme, kms, kme, &
  3952. ips, ipe, jps, jpe, kps, kpe, &
  3953. its, ite, jts, jte, kts, kte )
  3954. CALL set_physical_bc3d( RVSHTEN , 't', config_flags, &
  3955. ids, ide, jds, jde, kds, kde, &
  3956. ims, ime, jms, jme, kms, kme, &
  3957. ips, ipe, jps, jpe, kps, kpe, &
  3958. its, ite, jts, jte, kts, kte )
  3959. ENDIF
  3960. ! move out of the conditional, below; horiz coeffs needed for
  3961. ! all diff_opt cases. JM
  3962. CALL set_physical_bc3d( xkmh , 't', config_flags, &
  3963. ids, ide, jds, jde, kds, kde, &
  3964. ims, ime, jms, jme, kms, kme, &
  3965. ips, ipe, jps, jpe, kps, kpe, &
  3966. its, ite, jts, jte, kts, kte )
  3967. CALL set_physical_bc3d( xkhh , 't', config_flags, &
  3968. ids, ide, jds, jde, kds, kde, &
  3969. ims, ime, jms, jme, kms, kme, &
  3970. ips, ipe, jps, jpe, kps, kpe, &
  3971. its, ite, jts, jte, kts, kte )
  3972. IF(config_flags%diff_opt .eq. 2) THEN
  3973. CALL set_physical_bc3d( xkmv , 't', config_flags, &
  3974. ids, ide, jds, jde, kds, kde, &
  3975. ims, ime, jms, jme, kms, kme, &
  3976. ips, ipe, jps, jpe, kps, kpe, &
  3977. its, ite, jts, jte, kts, kte )
  3978. CALL set_physical_bc3d( xkhv , 't', config_flags, &
  3979. ids, ide, jds, jde, kds, kde, &
  3980. ims, ime, jms, jme, kms, kme, &
  3981. ips, ipe, jps, jpe, kps, kpe, &
  3982. its, ite, jts, jte, kts, kte )
  3983. CALL set_physical_bc3d( div , 't', config_flags, &
  3984. ids, ide, jds, jde, kds, kde, &
  3985. ims, ime, jms, jme, kms, kme, &
  3986. ips, ipe, jps, jpe, kps, kpe, &
  3987. its, ite, jts, jte, kts, kte )
  3988. CALL set_physical_bc3d( defor11 , 't', config_flags, &
  3989. ids, ide, jds, jde, kds, kde, &
  3990. ims, ime, jms, jme, kms, kme, &
  3991. ips, ipe, jps, jpe, kps, kpe, &
  3992. its, ite, jts, jte, kts, kte )
  3993. CALL set_physical_bc3d( defor22 , 't', config_flags, &
  3994. ids, ide, jds, jde, kds, kde, &
  3995. ims, ime, jms, jme, kms, kme, &
  3996. ips, ipe, jps, jpe, kps, kpe, &
  3997. its, ite, jts, jte, kts, kte )
  3998. CALL set_physical_bc3d( defor33 , 't', config_flags, &
  3999. ids, ide, jds, jde, kds, kde, &
  4000. ims, ime, jms, jme, kms, kme, &
  4001. ips, ipe, jps, jpe, kps, kpe, &
  4002. its, ite, jts, jte, kts, kte )
  4003. CALL set_physical_bc3d( defor12 , 'd', config_flags, &
  4004. ids, ide, jds, jde, kds, kde, &
  4005. ims, ime, jms, jme, kms, kme, &
  4006. ips, ipe, jps, jpe, kps, kpe, &
  4007. its, ite, jts, jte, kts, kte )
  4008. CALL set_physical_bc3d( defor13 , 'e', config_flags, &
  4009. ids, ide, jds, jde, kds, kde, &
  4010. ims, ime, jms, jme, kms, kme, &
  4011. ips, ipe, jps, jpe, kps, kpe, &
  4012. its, ite, jts, jte, kts, kte )
  4013. CALL set_physical_bc3d( defor23 , 'f', config_flags, &
  4014. ids, ide, jds, jde, kds, kde, &
  4015. ims, ime, jms, jme, kms, kme, &
  4016. ips, ipe, jps, jpe, kps, kpe, &
  4017. its, ite, jts, jte, kts, kte )
  4018. ENDIF
  4019. END SUBROUTINE phy_bc
  4020. !=======================================================================
  4021. !=======================================================================
  4022. SUBROUTINE tke_rhs( tendency, BN2, config_flags, &
  4023. defor11, defor22, defor33, &
  4024. defor12, defor13, defor23, &
  4025. u, v, w, div, tke, mu, &
  4026. theta, p, p8w, t8w, z, fnm, fnp, &
  4027. cf1, cf2, cf3, msftx, msfty, &
  4028. xkmh, xkmv, xkhv, &
  4029. rdx, rdy, dx, dy, dt, zx, zy, &
  4030. rdz, rdzw, dn, dnw, isotropic, &
  4031. hfx, qfx, qv, ust, rho, &
  4032. ids, ide, jds, jde, kds, kde, &
  4033. ims, ime, jms, jme, kms, kme, &
  4034. its, ite, jts, jte, kts, kte )
  4035. !-----------------------------------------------------------------------
  4036. ! Begin declarations.
  4037. IMPLICIT NONE
  4038. TYPE( grid_config_rec_type ), INTENT( IN ) &
  4039. :: config_flags
  4040. INTEGER, INTENT( IN ) &
  4041. :: ids, ide, jds, jde, kds, kde, &
  4042. ims, ime, jms, jme, kms, kme, &
  4043. its, ite, jts, jte, kts, kte
  4044. INTEGER, INTENT( IN ) :: isotropic
  4045. REAL, INTENT( IN ) &
  4046. :: cf1, cf2, cf3, dt, rdx, rdy, dx, dy
  4047. REAL, DIMENSION( kms:kme ), INTENT( IN ) &
  4048. :: fnm, fnp, dnw, dn
  4049. REAL, DIMENSION( ims:ime, jms:jme ), INTENT( IN ) &
  4050. :: msftx, msfty
  4051. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) &
  4052. :: tendency
  4053. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
  4054. :: defor11, defor22, defor33, defor12, defor13, defor23, &
  4055. div, BN2, tke, xkmh, xkmv, xkhv, zx, zy, u, v, w, theta, &
  4056. p, p8w, t8w, z, rdz, rdzw
  4057. REAL, DIMENSION( ims:ime, jms:jme ), INTENT( IN ) &
  4058. :: mu
  4059. REAL, DIMENSION ( ims:ime, jms:jme ), INTENT( IN ) &
  4060. :: hfx, ust, qfx
  4061. REAL, DIMENSION ( ims:ime, kms:kme, jms:jme ), INTENT ( IN ) &
  4062. :: qv, rho
  4063. ! Local variables.
  4064. INTEGER &
  4065. :: i, j, k, ktf, i_start, i_end, j_start, j_end
  4066. ! End declarations.
  4067. !-----------------------------------------------------------------------
  4068. CALL tke_shear( tendency, config_flags, &
  4069. defor11, defor22, defor33, &
  4070. defor12, defor13, defor23, &
  4071. u, v, w, tke, ust, mu, fnm, fnp, &
  4072. cf1, cf2, cf3, msftx, msfty, &
  4073. xkmh, xkmv, &
  4074. rdx, rdy, zx, zy, rdz, rdzw, dnw, dn, &
  4075. ids, ide, jds, jde, kds, kde, &
  4076. ims, ime, jms, jme, kms, kme, &
  4077. its, ite, jts, jte, kts, kte )
  4078. CALL tke_buoyancy( tendency, config_flags, mu, &
  4079. tke, xkhv, BN2, theta, dt, &
  4080. hfx, qfx, qv, rho, &
  4081. ids, ide, jds, jde, kds, kde, &
  4082. ims, ime, jms, jme, kms, kme, &
  4083. its, ite, jts, jte, kts, kte )
  4084. CALL tke_dissip( tendency, config_flags, &
  4085. mu, tke, bn2, theta, p8w, t8w, z, &
  4086. dx, dy,rdz, rdzw, isotropic, &
  4087. msftx, msfty, &
  4088. ids, ide, jds, jde, kds, kde, &
  4089. ims, ime, jms, jme, kms, kme, &
  4090. its, ite, jts, jte, kts, kte )
  4091. ! Set a lower limit on TKE.
  4092. ktf = MIN( kte, kde-1 )
  4093. i_start = its
  4094. i_end = MIN( ite, ide-1 )
  4095. j_start = jts
  4096. j_end = MIN( jte, jde-1 )
  4097. IF ( config_flags%open_xs .or. config_flags%specified .or. &
  4098. config_flags%nested) i_start = MAX(ids+1,its)
  4099. IF ( config_flags%open_xe .or. config_flags%specified .or. &
  4100. config_flags%nested) i_end = MIN(ide-2,ite)
  4101. IF ( config_flags%open_ys .or. config_flags%specified .or. &
  4102. config_flags%nested) j_start = MAX(jds+1,jts)
  4103. IF ( config_flags%open_ye .or. config_flags%specified .or. &
  4104. config_flags%nested) j_end = MIN(jde-2,jte)
  4105. IF ( config_flags%periodic_x ) i_start = its
  4106. IF ( config_flags%periodic_x ) i_end = MIN( ite, ide-1 )
  4107. DO j = j_start, j_end
  4108. DO k = kts, ktf
  4109. DO i = i_start, i_end
  4110. tendency(i,k,j) = max( tendency(i,k,j), -mu(i,j) * max( 0.0 , tke(i,k,j) ) / dt )
  4111. END DO
  4112. END DO
  4113. END DO
  4114. END SUBROUTINE tke_rhs
  4115. !=======================================================================
  4116. !=======================================================================
  4117. SUBROUTINE tke_buoyancy( tendency, config_flags, mu, &
  4118. tke, xkhv, BN2, theta, dt, &
  4119. hfx, qfx, qv, rho, &
  4120. ids, ide, jds, jde, kds, kde, &
  4121. ims, ime, jms, jme, kms, kme, &
  4122. its, ite, jts, jte, kts, kte )
  4123. !-----------------------------------------------------------------------
  4124. ! Begin declarations.
  4125. IMPLICIT NONE
  4126. TYPE( grid_config_rec_type ), INTENT( IN ) &
  4127. :: config_flags
  4128. INTEGER, INTENT( IN ) &
  4129. :: ids, ide, jds, jde, kds, kde, &
  4130. ims, ime, jms, jme, kms, kme, &
  4131. its, ite, jts, jte, kts, kte
  4132. REAL, INTENT( IN ) &
  4133. :: dt
  4134. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) &
  4135. :: tendency
  4136. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
  4137. :: xkhv, tke, BN2, theta
  4138. REAL, DIMENSION( ims:ime, jms:jme ), INTENT( IN ) &
  4139. :: mu
  4140. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT ( IN ) &
  4141. :: qv, rho
  4142. REAL, DIMENSION(ims:ime, jms:jme ), INTENT ( IN ) :: hfx, qfx
  4143. ! Local variables.
  4144. INTEGER &
  4145. :: i, j, k, ktf
  4146. INTEGER &
  4147. :: i_start, i_end, j_start, j_end
  4148. REAL :: heat_flux, heat_flux0
  4149. REAL :: cpm
  4150. ! End declarations.
  4151. !-----------------------------------------------------------------------
  4152. !-----------------------------------------------------------------------
  4153. ! Add to the TKE tendency the term that accounts for production of TKE
  4154. ! due to buoyant motions.
  4155. ktf = MIN( kte, kde-1 )
  4156. i_start = its
  4157. i_end = MIN( ite, ide-1 )
  4158. j_start = jts
  4159. j_end = MIN( jte, jde-1 )
  4160. IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
  4161. config_flags%nested ) i_start = MAX( ids+1, its )
  4162. IF ( config_flags%open_xe .OR. config_flags%specified .OR. &
  4163. config_flags%nested ) i_end = MIN( ide-2, ite )
  4164. IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
  4165. config_flags%nested ) j_start = MAX( jds+1, jts )
  4166. IF ( config_flags%open_ye .OR. config_flags%specified .OR. &
  4167. config_flags%nested ) j_end = MIN( jde-2, jte )
  4168. IF ( config_flags%periodic_x ) i_start = its
  4169. IF ( config_flags%periodic_x ) i_end = MIN( ite, ide-1 )
  4170. DO j = j_start, j_end
  4171. DO k = kts+1, ktf
  4172. DO i = i_start, i_end
  4173. tendency(i,k,j) = tendency(i,k,j) - mu(i,j) * xkhv(i,k,j) * BN2(i,k,j)
  4174. END DO
  4175. END DO
  4176. END DO
  4177. ! MARTA: change in the computation of the tke's tendency at the surface.
  4178. ! the buoyancy flux is the average of the surface heat flux (0.06) and the
  4179. ! flux at the first w level
  4180. !
  4181. ! WCS 040331
  4182. hflux: SELECT CASE( config_flags%isfflx )
  4183. CASE (0,2) ! with fixed surface heat flux given in the namelist
  4184. heat_flux0 = config_flags%tke_heat_flux ! constant heat flux value
  4185. ! set in namelist.input
  4186. ! LES mods
  4187. K=KTS
  4188. DO j = j_start, j_end
  4189. DO i = i_start, i_end
  4190. heat_flux = heat_flux0
  4191. tendency(i,k,j)= tendency(i,k,j) - &
  4192. mu(i,j)*((xkhv(i,k,j)*BN2(i,k,j))- (g/theta(i,k,j))*heat_flux)/2.
  4193. ENDDO
  4194. ENDDO
  4195. CASE (1) ! use surface heat flux computed from surface routine
  4196. K=KTS
  4197. DO j = j_start, j_end
  4198. DO i = i_start, i_end
  4199. cpm = cp * (1. + 0.8*qv(i,k,j))
  4200. heat_flux = (hfx(i,j)/cpm)/rho(i,k,j)
  4201. tendency(i,k,j)= tendency(i,k,j) - &
  4202. mu(i,j)*((xkhv(i,k,j)*BN2(i,k,j))- (g/theta(i,k,j))*heat_flux)/2.
  4203. ENDDO
  4204. ENDDO
  4205. CASE DEFAULT
  4206. CALL wrf_error_fatal( 'isfflx value invalid for diff_opt=2' )
  4207. END SELECT hflux
  4208. ! end of MARTA/WCS change
  4209. ! The tendency array now includes production of TKE from buoyant
  4210. ! motions.
  4211. !-----------------------------------------------------------------------
  4212. END SUBROUTINE tke_buoyancy
  4213. !=======================================================================
  4214. !=======================================================================
  4215. SUBROUTINE tke_dissip( tendency, config_flags, &
  4216. mu, tke, bn2, theta, p8w, t8w, z, &
  4217. dx, dy, rdz, rdzw, isotropic, &
  4218. msftx, msfty, &
  4219. ids, ide, jds, jde, kds, kde, &
  4220. ims, ime, jms, jme, kms, kme, &
  4221. its, ite, jts, jte, kts, kte )
  4222. ! History: Sep 2003 Changes by George Bryan and Jason Knievel, NCAR
  4223. ! Oct 2001 Converted to mass core by Bill Skamarock, NCAR
  4224. ! Aug 2000 Original code by Shu-Hua Chen, UC-Davis
  4225. ! Purpose: This routine calculates dissipation of turbulent kinetic
  4226. ! energy.
  4227. ! References: Klemp and Wilhelmson (JAS 1978)
  4228. ! Deardorff (B-L Meteor 1980)
  4229. ! Chen and Dudhia (NCAR WRF physics report 2000)
  4230. !-----------------------------------------------------------------------
  4231. ! Begin declarations.
  4232. IMPLICIT NONE
  4233. TYPE( grid_config_rec_type ), INTENT( IN ) &
  4234. :: config_flags
  4235. INTEGER, INTENT( IN ) &
  4236. :: ids, ide, jds, jde, kds, kde, &
  4237. ims, ime, jms, jme, kms, kme, &
  4238. its, ite, jts, jte, kts, kte
  4239. INTEGER, INTENT( IN ) :: isotropic
  4240. REAL, INTENT( IN ) &
  4241. :: dx, dy
  4242. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) &
  4243. :: tendency
  4244. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
  4245. :: tke, bn2, theta, p8w, t8w, z, rdz, rdzw
  4246. REAL, DIMENSION( ims:ime, jms:jme ), INTENT( IN ) &
  4247. :: mu
  4248. REAL, DIMENSION( ims:ime, jms:jme ), INTENT( IN ) &
  4249. :: msftx, msfty
  4250. ! Local variables.
  4251. REAL, DIMENSION( its:ite, kts:kte, jts:jte ) &
  4252. :: dthrdn
  4253. REAL, DIMENSION( its:ite, kts:kte, jts:jte ) &
  4254. :: l_scale
  4255. REAL, DIMENSION( its:ite ) &
  4256. :: sumtke, sumtkez
  4257. INTEGER &
  4258. :: i, j, k, ktf, i_start, i_end, j_start, j_end
  4259. REAL &
  4260. :: disp_len, deltas, coefc, tmpdz, len_s, thetasfc, &
  4261. thetatop, len_0, tketmp, tmp, ce1, ce2, c_k
  4262. ! End declarations.
  4263. !-----------------------------------------------------------------------
  4264. c_k = config_flags%c_k
  4265. ce1 = ( c_k / 0.10 ) * 0.19
  4266. ce2 = max( 0.0 , 0.93 - ce1 )
  4267. ktf = MIN( kte, kde-1 )
  4268. i_start = its
  4269. i_end = MIN(ite,ide-1)
  4270. j_start = jts
  4271. j_end = MIN(jte,jde-1)
  4272. IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
  4273. config_flags%nested) i_start = MAX( ids+1, its )
  4274. IF ( config_flags%open_xe .OR. config_flags%specified .OR. &
  4275. config_flags%nested) i_end = MIN( ide-2, ite )
  4276. IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
  4277. config_flags%nested) j_start = MAX( jds+1, jts )
  4278. IF ( config_flags%open_ye .OR. config_flags%specified .OR. &
  4279. config_flags%nested) j_end = MIN( jde-2, jte )
  4280. IF ( config_flags%periodic_x ) i_start = its
  4281. IF ( config_flags%periodic_x ) i_end = MIN( ite, ide-1 )
  4282. CALL calc_l_scale( config_flags, tke, BN2, l_scale, &
  4283. i_start, i_end, ktf, j_start, j_end, &
  4284. dx, dy, rdzw, msftx, msfty, &
  4285. ids, ide, jds, jde, kds, kde, &
  4286. ims, ime, jms, jme, kms, kme, &
  4287. its, ite, jts, jte, kts, kte )
  4288. DO j = j_start, j_end
  4289. DO k = kts, ktf
  4290. DO i = i_start, i_end
  4291. deltas = ( dx/msftx(i,j) * dy/msfty(i,j) / rdzw(i,k,j) )**0.33333333
  4292. tketmp = MAX( tke(i,k,j), 1.0e-6 )
  4293. ! Apply Deardorff's (1980) "wall effect" at the bottom of the domain.
  4294. ! For LES with fine grid, no need for this wall effect!
  4295. IF ( k .eq. kts .or. k .eq. ktf ) then
  4296. coefc = 3.9
  4297. ELSE
  4298. coefc = ce1 + ce2 * l_scale(i,k,j) / deltas
  4299. END IF
  4300. tendency(i,k,j) = tendency(i,k,j) - &
  4301. mu(i,j) * coefc * tketmp**1.5 / l_scale(i,k,j)
  4302. END DO
  4303. END DO
  4304. END DO
  4305. END SUBROUTINE tke_dissip
  4306. !=======================================================================
  4307. !=======================================================================
  4308. SUBROUTINE tke_shear( tendency, config_flags, &
  4309. defor11, defor22, defor33, &
  4310. defor12, defor13, defor23, &
  4311. u, v, w, tke, ust, mu, fnm, fnp, &
  4312. cf1, cf2, cf3, msftx, msfty, &
  4313. xkmh, xkmv, &
  4314. rdx, rdy, zx, zy, rdz, rdzw, dn, dnw, &
  4315. ids, ide, jds, jde, kds, kde, &
  4316. ims, ime, jms, jme, kms, kme, &
  4317. its, ite, jts, jte, kts, kte )
  4318. ! History: Sep 2003 Rewritten by George Bryan and Jason Knievel,
  4319. ! NCAR
  4320. ! Oct 2001 Converted to mass core by Bill Skamarock, NCAR
  4321. ! Aug 2000 Original code by Shu-Hua Chen, UC-Davis
  4322. ! Purpose: This routine calculates the production of turbulent
  4323. ! kinetic energy by stresses due to sheared wind.
  4324. ! References: Klemp and Wilhelmson (JAS 1978)
  4325. ! Deardorff (B-L Meteor 1980)
  4326. ! Chen and Dudhia (NCAR WRF physics report 2000)
  4327. ! Key:
  4328. ! avg temporary working array
  4329. ! cf1
  4330. ! cf2
  4331. ! cf3
  4332. ! defor11 deformation term ( du/dx + du/dx )
  4333. ! defor12 deformation term ( dv/dx + du/dy ); same as defor21
  4334. ! defor13 deformation term ( dw/dx + du/dz ); same as defor31
  4335. ! defor22 deformation term ( dv/dy + dv/dy )
  4336. ! defor23 deformation term ( dw/dy + dv/dz ); same as defor32
  4337. ! defor33 deformation term ( dw/dz + dw/dz )
  4338. ! div 3-d divergence
  4339. ! dn
  4340. ! dnw
  4341. ! fnm
  4342. ! fnp
  4343. ! msftx
  4344. ! msfty
  4345. ! rdx
  4346. ! rdy
  4347. ! tendency
  4348. ! titau tau (stress tensor) with a tilde, indicating division by
  4349. ! a map-scale factor and the fraction of the total modeled
  4350. ! atmosphere beneath a given altitude (titau = tau/m/zeta)
  4351. ! tke turbulent kinetic energy
  4352. !-----------------------------------------------------------------------
  4353. ! Begin declarations.
  4354. IMPLICIT NONE
  4355. TYPE( grid_config_rec_type ), INTENT( IN ) &
  4356. :: config_flags
  4357. INTEGER, INTENT( IN ) &
  4358. :: ids, ide, jds, jde, kds, kde, &
  4359. ims, ime, jms, jme, kms, kme, &
  4360. its, ite, jts, jte, kts, kte
  4361. REAL, INTENT( IN ) &
  4362. :: cf1, cf2, cf3, rdx, rdy
  4363. REAL, DIMENSION( kms:kme ), INTENT( IN ) &
  4364. :: fnm, fnp, dn, dnw
  4365. REAL, DIMENSION( ims:ime, jms:jme ), INTENT( IN ) &
  4366. :: msftx, msfty
  4367. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) &
  4368. :: tendency
  4369. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
  4370. :: defor11, defor22, defor33, defor12, defor13, defor23, &
  4371. tke, xkmh, xkmv, zx, zy, u, v, w, rdz, rdzw
  4372. REAL, DIMENSION( ims:ime, jms:jme ), INTENT( IN ) &
  4373. :: mu
  4374. REAL, DIMENSION( ims:ime, jms:jme ), INTENT( IN ) &
  4375. :: ust
  4376. ! Local variables.
  4377. INTEGER &
  4378. :: i, j, k, ktf, ktes1, ktes2, &
  4379. i_start, i_end, j_start, j_end, &
  4380. is_ext, ie_ext, js_ext, je_ext
  4381. REAL &
  4382. :: mtau
  4383. REAL, DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1 ) &
  4384. :: avg, titau, tmp2
  4385. REAL, DIMENSION( its:ite, kts:kte, jts:jte ) &
  4386. :: titau12, tmp1, zxavg, zyavg
  4387. REAL :: absU, cd0, Cd
  4388. ! End declarations.
  4389. !-----------------------------------------------------------------------
  4390. ktf = MIN( kte, kde-1 )
  4391. ktes1 = kte-1
  4392. ktes2 = kte-2
  4393. i_start = its
  4394. i_end = MIN( ite, ide-1 )
  4395. j_start = jts
  4396. j_end = MIN( jte, jde-1 )
  4397. IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
  4398. config_flags%nested ) i_start = MAX( ids+1, its )
  4399. IF ( config_flags%open_xe .OR. config_flags%specified .OR. &
  4400. config_flags%nested ) i_end = MIN( ide-2, ite )
  4401. IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
  4402. config_flags%nested ) j_start = MAX( jds+1, jts )
  4403. IF ( config_flags%open_ye .OR. config_flags%specified .OR. &
  4404. config_flags%nested ) j_end = MIN( jde-2, jte )
  4405. IF ( config_flags%periodic_x ) i_start = its
  4406. IF ( config_flags%periodic_x ) i_end = MIN( ite, ide-1 )
  4407. DO j = j_start, j_end
  4408. DO k = kts, ktf
  4409. DO i = i_start, i_end
  4410. zxavg(i,k,j) = 0.25 * ( zx(i,k ,j) + zx(i+1,k ,j) + &
  4411. zx(i,k+1,j) + zx(i+1,k+1,j) )
  4412. zyavg(i,k,j) = 0.25 * ( zy(i,k ,j) + zy(i,k ,j+1) + &
  4413. zy(i,k+1,j) + zy(i,k+1,j+1) )
  4414. END DO
  4415. END DO
  4416. END DO
  4417. ! Begin calculating production of turbulence due to shear. The approach
  4418. ! is to add together contributions from six terms, each of which is the
  4419. ! square of a deformation that is then multiplied by an exchange
  4420. ! coefficiant. The same exchange coefficient is assumed for horizontal
  4421. ! and vertical coefficients for some of the terms (the vertical value is
  4422. ! the one used).
  4423. ! For defor11.
  4424. DO j = j_start, j_end
  4425. DO k = kts, ktf
  4426. DO i = i_start, i_end
  4427. tendency(i,k,j) = tendency(i,k,j) + 0.5 * &
  4428. mu(i,j) * xkmh(i,k,j) * ( ( defor11(i,k,j) )**2 )
  4429. END DO
  4430. END DO
  4431. END DO
  4432. ! For defor22.
  4433. DO j = j_start, j_end
  4434. DO k = kts, ktf
  4435. DO i = i_start, i_end
  4436. tendency(i,k,j) = tendency(i,k,j) + 0.5 * &
  4437. mu(i,j) * xkmh(i,k,j) * ( ( defor22(i,k,j) )**2 )
  4438. END DO
  4439. END DO
  4440. END DO
  4441. ! For defor33.
  4442. DO j = j_start, j_end
  4443. DO k = kts, ktf
  4444. DO i = i_start, i_end
  4445. tendency(i,k,j) = tendency(i,k,j) + 0.5 * &
  4446. mu(i,j) * xkmv(i,k,j) * ( ( defor33(i,k,j) )**2 )
  4447. END DO
  4448. END DO
  4449. END DO
  4450. ! For defor12.
  4451. DO j = j_start, j_end
  4452. DO k = kts, ktf
  4453. DO i = i_start, i_end
  4454. avg(i,k,j) = 0.25 * &
  4455. ( ( defor12(i ,k,j)**2 ) + ( defor12(i ,k,j+1)**2 ) + &
  4456. ( defor12(i+1,k,j)**2 ) + ( defor12(i+1,k,j+1)**2 ) )
  4457. END DO
  4458. END DO
  4459. END DO
  4460. DO j = j_start, j_end
  4461. DO k = kts, ktf
  4462. DO i = i_start, i_end
  4463. tendency(i,k,j) = tendency(i,k,j) + mu(i,j) * xkmh(i,k,j) * avg(i,k,j)
  4464. END DO
  4465. END DO
  4466. END DO
  4467. ! For defor13.
  4468. DO j = j_start, j_end
  4469. DO k = kts+1, ktf
  4470. DO i = i_start, i_end+1
  4471. tmp2(i,k,j) = defor13(i,k,j)
  4472. END DO
  4473. END DO
  4474. END DO
  4475. DO j = j_start, j_end
  4476. DO i = i_start, i_end+1
  4477. tmp2(i,kts ,j) = 0.0
  4478. tmp2(i,ktf+1,j) = 0.0
  4479. END DO
  4480. END DO
  4481. DO j = j_start, j_end
  4482. DO k = kts, ktf
  4483. DO i = i_start, i_end
  4484. avg(i,k,j) = 0.25 * &
  4485. ( ( tmp2(i ,k+1,j)**2 ) + ( tmp2(i ,k,j)**2 ) + &
  4486. ( tmp2(i+1,k+1,j)**2 ) + ( tmp2(i+1,k,j)**2 ) )
  4487. END DO
  4488. END DO
  4489. END DO
  4490. DO j = j_start, j_end
  4491. DO k = kts, ktf
  4492. DO i = i_start, i_end
  4493. tendency(i,k,j) = tendency(i,k,j) + mu(i,j) * xkmv(i,k,j) * avg(i,k,j)
  4494. END DO
  4495. END DO
  4496. END DO
  4497. !MARTA: add the drag at the surface; WCS 040331
  4498. K=KTS
  4499. uflux: SELECT CASE( config_flags%isfflx )
  4500. CASE (0) ! Assume cd a constant, specified in namelist
  4501. cd0 = config_flags%tke_drag_coefficient ! drag coefficient set
  4502. ! in namelist.input
  4503. DO j = j_start, j_end
  4504. DO i = i_start, i_end
  4505. absU=0.5*sqrt((u(i,k,j)+u(i+1,k,j))**2+(v(i,k,j)+v(i,k,j+1))**2)
  4506. Cd = cd0
  4507. tendency(i,k,j) = tendency(i,k,j) + &
  4508. mu(i,j)*( (u(i,k,j)+u(i+1,k,j))*0.5* &
  4509. Cd*absU*(defor13(i,kts+1,j)+defor13(i+1,kts+1,j))*0.5 )
  4510. END DO
  4511. END DO
  4512. CASE (1,2) ! ustar computed from surface routine
  4513. DO j = j_start, j_end
  4514. DO i = i_start, i_end
  4515. absU=0.5*sqrt((u(i,k,j)+u(i+1,k,j))**2+(v(i,k,j)+v(i,k,j+1))**2)+epsilon
  4516. Cd = (ust(i,j)**2)/(absU**2)
  4517. tendency(i,k,j) = tendency(i,k,j) + &
  4518. mu(i,j)*( (u(i,k,j)+u(i+1,k,j))*0.5* &
  4519. Cd*absU*(defor13(i,kts+1,j)+defor13(i+1,kts+1,j))*0.5 )
  4520. END DO
  4521. END DO
  4522. CASE DEFAULT
  4523. CALL wrf_error_fatal( 'isfflx value invalid for diff_opt=2' )
  4524. END SELECT uflux
  4525. ! end of MARTA/WCS change
  4526. ! For defor23.
  4527. DO j = j_start, j_end+1
  4528. DO k = kts+1, ktf
  4529. DO i = i_start, i_end
  4530. tmp2(i,k,j) = defor23(i,k,j)
  4531. END DO
  4532. END DO
  4533. END DO
  4534. DO j = j_start, j_end+1
  4535. DO i = i_start, i_end
  4536. tmp2(i,kts, j) = 0.0
  4537. tmp2(i,ktf+1,j) = 0.0
  4538. END DO
  4539. END DO
  4540. DO j = j_start, j_end
  4541. DO k = kts, ktf
  4542. DO i = i_start, i_end
  4543. avg(i,k,j) = 0.25 * &
  4544. ( ( tmp2(i,k+1,j )**2 ) + ( tmp2(i,k,j )**2) + &
  4545. ( tmp2(i,k+1,j+1)**2 ) + ( tmp2(i,k,j+1)**2) )
  4546. END DO
  4547. END DO
  4548. END DO
  4549. DO j = j_start, j_end
  4550. DO k = kts, ktf
  4551. DO i = i_start, i_end
  4552. tendency(i,k,j) = tendency(i,k,j) + mu(i,j) * xkmv(i,k,j) * avg(i,k,j)
  4553. END DO
  4554. END DO
  4555. END DO
  4556. !MARTA: add the drag at the surface; WCS 040331
  4557. K=KTS
  4558. vflux: SELECT CASE( config_flags%isfflx )
  4559. CASE (0) ! Assume cd a constant, specified in namelist
  4560. cd0 = config_flags%tke_drag_coefficient ! constant drag coefficient
  4561. ! set in namelist.input
  4562. DO j = j_start, j_end
  4563. DO i = i_start, i_end
  4564. absU=0.5*sqrt((u(i,k,j)+u(i+1,k,j))**2+(v(i,k,j)+v(i,k,j+1))**2)
  4565. Cd = cd0
  4566. tendency(i,k,j) = tendency(i,k,j) + &
  4567. mu(i,j)*( (v(i,k,j)+v(i,k,j+1))*0.5* &
  4568. Cd*absU*(defor23(i,kts+1,j)+defor23(i,kts+1,j+1))*0.5 )
  4569. END DO
  4570. END DO
  4571. CASE (1,2) ! ustar computed from surface routine
  4572. DO j = j_start, j_end
  4573. DO i = i_start, i_end
  4574. absU=0.5*sqrt((u(i,k,j)+u(i+1,k,j))**2+(v(i,k,j)+v(i,k,j+1))**2)+epsilon
  4575. Cd = (ust(i,j)**2)/(absU**2)
  4576. tendency(i,k,j) = tendency(i,k,j) + &
  4577. mu(i,j)*( (v(i,k,j)+v(i,k,j+1))*0.5* &
  4578. Cd*absU*(defor23(i,kts+1,j)+defor23(i,kts+1,j+1))*0.5 )
  4579. END DO
  4580. END DO
  4581. CASE DEFAULT
  4582. CALL wrf_error_fatal( 'isfflx value invalid for diff_opt=2' )
  4583. END SELECT vflux
  4584. ! end of MARTA/WCS change
  4585. END SUBROUTINE tke_shear
  4586. !=======================================================================
  4587. !=======================================================================
  4588. SUBROUTINE compute_diff_metrics( config_flags, ph, phb, z, rdz, rdzw, &
  4589. zx, zy, rdx, rdy, &
  4590. ids, ide, jds, jde, kds, kde, &
  4591. ims, ime, jms, jme, kms, kme, &
  4592. its, ite, jts, jte, kts, kte )
  4593. !-----------------------------------------------------------------------
  4594. ! Begin declarations.
  4595. IMPLICIT NONE
  4596. TYPE( grid_config_rec_type ), INTENT( IN ) &
  4597. :: config_flags
  4598. INTEGER, INTENT( IN ) &
  4599. :: ids, ide, jds, jde, kds, kde, &
  4600. ims, ime, jms, jme, kms, kme, &
  4601. its, ite, jts, jte, kts, kte
  4602. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
  4603. :: ph, phb
  4604. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( OUT ) &
  4605. :: rdz, rdzw, zx, zy, z
  4606. REAL, INTENT( IN ) &
  4607. :: rdx, rdy
  4608. ! Local variables.
  4609. INTEGER &
  4610. :: i, j, k, i_start, i_end, j_start, j_end, ktf
  4611. ! End declarations.
  4612. !-----------------------------------------------------------------------
  4613. ktf = MIN( kte, kde-1 )
  4614. ! Bug fix, WCS, 22 april 2002.
  4615. ! We need rdzw in halo for average to u and v points.
  4616. j_start = jts-1
  4617. j_end = jte
  4618. ! Begin with dz computations.
  4619. DO j = j_start, j_end
  4620. IF ( ( j_start >= jts ) .AND. ( j_end <= MIN( jte, jde-1 ) ) ) THEN
  4621. i_start = its-1
  4622. i_end = ite
  4623. ELSE
  4624. i_start = its
  4625. i_end = MIN( ite, ide-1 )
  4626. END IF
  4627. ! Compute z at w points for rdz and rdzw computations. We'll switch z
  4628. ! to z at p points before returning
  4629. DO k = 1, kte
  4630. ! Bug fix, WCS, 22 april 2002
  4631. DO i = i_start, i_end
  4632. z(i,k,j) = ( ph(i,k,j) + phb(i,k,j) ) / g
  4633. END DO
  4634. END DO
  4635. DO k = 1, ktf
  4636. DO i = i_start, i_end
  4637. rdzw(i,k,j) = 1.0 / ( z(i,k+1,j) - z(i,k,j) )
  4638. END DO
  4639. END DO
  4640. DO k = 2, ktf
  4641. DO i = i_start, i_end
  4642. rdz(i,k,j) = 2.0 / ( z(i,k+1,j) - z(i,k-1,j) )
  4643. END DO
  4644. END DO
  4645. ! Bug fix, WCS, 22 april 2002; added the following code
  4646. DO i = i_start, i_end
  4647. rdz(i,1,j) = 2./(z(i,2,j)-z(i,1,j))
  4648. END DO
  4649. END DO
  4650. ! End bug fix.
  4651. ! Now compute zx and zy; we'll assume that the halo for ph and phb is
  4652. ! properly filled.
  4653. i_start = its
  4654. i_end = MIN( ite, ide-1 )
  4655. j_start = jts
  4656. j_end = MIN( jte, jde-1 )
  4657. DO j = j_start, j_end
  4658. DO k = 1, kte
  4659. DO i = MAX( ids+1, its ), i_end
  4660. zx(i,k,j) = rdx * ( phb(i,k,j) - phb(i-1,k,j) ) / g
  4661. END DO
  4662. END DO
  4663. END DO
  4664. DO j = j_start, j_end
  4665. DO k = 1, kte
  4666. DO i = MAX( ids+1, its ), i_end
  4667. zx(i,k,j) = zx(i,k,j) + rdx * ( ph(i,k,j) - ph(i-1,k,j) ) / g
  4668. END DO
  4669. END DO
  4670. END DO
  4671. DO j = MAX( jds+1, jts ), j_end
  4672. DO k = 1, kte
  4673. DO i = i_start, i_end
  4674. zy(i,k,j) = rdy * ( phb(i,k,j) - phb(i,k,j-1) ) / g
  4675. END DO
  4676. END DO
  4677. END DO
  4678. DO j = MAX( jds+1, jts ), j_end
  4679. DO k = 1, kte
  4680. DO i = i_start, i_end
  4681. zy(i,k,j) = zy(i,k,j) + rdy * ( ph(i,k,j) - ph(i,k,j-1) ) / g
  4682. END DO
  4683. END DO
  4684. END DO
  4685. ! Some b.c. on zx and zy.
  4686. IF ( .NOT. config_flags%periodic_x ) THEN
  4687. IF ( ite == ide ) THEN
  4688. DO j = j_start, j_end
  4689. DO k = 1, ktf
  4690. zx(ide,k,j) = 0.0
  4691. END DO
  4692. END DO
  4693. END IF
  4694. IF ( its == ids ) THEN
  4695. DO j = j_start, j_end
  4696. DO k = 1, ktf
  4697. zx(ids,k,j) = 0.0
  4698. END DO
  4699. END DO
  4700. END IF
  4701. ELSE
  4702. IF ( ite == ide ) THEN
  4703. DO j=j_start,j_end
  4704. DO k=1,ktf
  4705. zx(ide,k,j) = rdx * ( phb(ide,k,j) - phb(ide-1,k,j) ) / g
  4706. END DO
  4707. END DO
  4708. DO j = j_start, j_end
  4709. DO k = 1, ktf
  4710. zx(ide,k,j) = zx(ide,k,j) + rdx * ( ph(ide,k,j) - ph(ide-1,k,j) ) / g
  4711. END DO
  4712. END DO
  4713. END IF
  4714. IF ( its == ids ) THEN
  4715. DO j = j_start, j_end
  4716. DO k = 1, ktf
  4717. zx(ids,k,j) = rdx * ( phb(ids,k,j) - phb(ids-1,k,j) ) / g
  4718. END DO
  4719. END DO
  4720. DO j =j_start,j_end
  4721. DO k =1,ktf
  4722. zx(ids,k,j) = zx(ids,k,j) + rdx * ( ph(ids,k,j) - ph(ids-1,k,j) ) / g
  4723. END DO
  4724. END DO
  4725. END IF
  4726. END IF
  4727. IF ( .NOT. config_flags%periodic_y ) THEN
  4728. IF ( jte == jde ) THEN
  4729. DO k =1, ktf
  4730. DO i =i_start, i_end
  4731. zy(i,k,jde) = 0.0
  4732. END DO
  4733. END DO
  4734. END IF
  4735. IF ( jts == jds ) THEN
  4736. DO k =1, ktf
  4737. DO i =i_start, i_end
  4738. zy(i,k,jds) = 0.0
  4739. END DO
  4740. END DO
  4741. END IF
  4742. ELSE
  4743. IF ( jte == jde ) THEN
  4744. DO j=j_start, j_end
  4745. DO k=1, ktf
  4746. zy(i,k,jde) = rdy * ( phb(i,k,jde) - phb(i,k,jde-1) ) / g
  4747. END DO
  4748. END DO
  4749. DO j = j_start, j_end
  4750. DO k = 1, ktf
  4751. zy(i,k,jde) = zy(i,k,jde) + rdy * ( ph(i,k,jde) - ph(i,k,jde-1) ) / g
  4752. END DO
  4753. END DO
  4754. END IF
  4755. IF ( jts == jds ) THEN
  4756. DO j = j_start, j_end
  4757. DO k = 1, ktf
  4758. zy(i,k,jds) = rdy * ( phb(i,k,jds) - phb(i,k,jds-1) ) / g
  4759. END DO
  4760. END DO
  4761. DO j = j_start, j_end
  4762. DO k = 1, ktf
  4763. zy(i,k,jds) = zy(i,k,jds) + rdy * ( ph(i,k,jds) - ph(i,k,jds-1) ) / g
  4764. END DO
  4765. END DO
  4766. END IF
  4767. END IF
  4768. ! Calculate z at p points.
  4769. DO j = j_start, j_end
  4770. DO k = 1, ktf
  4771. DO i = i_start, i_end
  4772. z(i,k,j) = 0.5 * &
  4773. ( ph(i,k,j) + phb(i,k,j) + ph(i,k+1,j) + phb(i,k+1,j) ) / g
  4774. END DO
  4775. END DO
  4776. END DO
  4777. END SUBROUTINE compute_diff_metrics
  4778. !=======================================================================
  4779. !=======================================================================
  4780. END MODULE module_diffusion_em
  4781. !=======================================================================
  4782. !=======================================================================