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

/wrfv2_fire/dyn_em/module_sfs_nba.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 1229 lines | 762 code | 259 blank | 208 comment | 0 complexity | 54c98acff721f452522846cd757de226 MD5 | raw file
Possible License(s): AGPL-1.0
  1. !WRF:MODEL_LAYER:PHYSICS
  2. !==============================================================================
  3. !
  4. ! © 2009. Lawrence Livermore National Security, LLC. All rights reserved.
  5. ! This work was produced at the Lawrence Livermore National Laboratory (LLNL) under
  6. ! contract no. DE-AC52-07NA27344 (Contract 44) between the U.S. Department of Energy (DOE)
  7. ! and Lawrence Livermore National Security, LLC (LLNS) for the operation of LLNL. Copyright
  8. ! is reserved to Lawrence Livermore National Security, LLC for purposes of controlled
  9. ! dissemination, commercialization through formal licensing, or other disposition under
  10. ! terms of Contract 44; DOE policies, regulations and orders; and U.S. statutes. The rights
  11. ! of the Federal Government are reserved under Contract 44.
  12. !
  13. ! DISCLAIMER
  14. ! This work was prepared as an account of work sponsored by an agency of the United States
  15. ! Government. Neither the United States Government nor Lawrence Livermore National
  16. ! Security, LLC nor any of their employees, makes any warranty, express or implied, or
  17. ! assumes any liability or responsibility for the accuracy, completeness, or usefulness of
  18. ! any information, apparatus, product, or process disclosed, or represents that its use
  19. ! would not infringe privately-owned rights. Reference herein to any specific commercial
  20. ! products, process, or service by trade name, trademark, manufacturer or otherwise does
  21. ! not necessarily constitute or imply its endorsement, recommendation, or favoring by the
  22. ! United States Government or Lawrence Livermore National Security, LLC. The views and
  23. ! opinions of authors expressed herein do not necessarily state or reflect those of the
  24. ! United States Government or Lawrence Livermore National Security, LLC, and shall not be
  25. ! used for advertising or product endorsement purposes.
  26. !
  27. ! LICENSING REQUIREMENTS
  28. ! Any use, reproduction, modification, or distribution of this software or documentation
  29. ! for commercial purposes requires a license from Lawrence Livermore National Security,
  30. ! LLC. Contact: Lawrence Livermore National Laboratory, Industrial Partnerships Office,
  31. ! P.O. Box 808, L-795, Livermore, CA 94551
  32. !
  33. !=============================================================================
  34. !
  35. ! Modification History:
  36. !
  37. ! Implemented 12/2009 by Jeff Mirocha, jmirocha@llnl.gov
  38. !
  39. !=============================================================================
  40. MODULE module_sfs_nba
  41. USE module_configure, ONLY : grid_config_rec_type
  42. IMPLICIT NONE
  43. REAL :: c1, c2, c3, ce, cb, cs ! global model parameters
  44. CONTAINS
  45. !=============================================================================
  46. SUBROUTINE calc_mij_constants( )
  47. !-----------------------------------------------------------------------------
  48. !
  49. ! PURPOSE: Compute constants for Mij calculations
  50. !
  51. !-----------------------------------------------------------------------------
  52. IMPLICIT NONE
  53. REAL :: sk, pi ! local model parameters
  54. !-----------------------------------------------------------------------------
  55. sk = 0.5
  56. pi = 3.1415927
  57. cb = 0.36
  58. cs = ( ( 8.0*( 1.0+cb ) )/( 27.0*pi**2 ) )**0.5
  59. c1 = ( ( 960.0**0.5 )*cb )/( 7.0*( 1.0+cb )*sk )
  60. c2 = c1
  61. ce = ( ( 8.0*pi/27.0 )**( 1.0/3.0 ) )*cs**( 4.0/3.0 )
  62. c3 = ( ( 27.0/( 8.0*pi ) )**( 1.0/3.0 ) )*cs**( 2.0/3.0 )
  63. RETURN
  64. END SUBROUTINE calc_mij_constants
  65. !=============================================================================
  66. SUBROUTINE calc_smnsmn( smnsmn, &
  67. s11, s22, s33, &
  68. s12, s13, s23, &
  69. config_flags, &
  70. ids, ide, jds, jde, kds, kde, &
  71. ims, ime, jms, jme, kms, kme, &
  72. ips, ipe, jps, jpe, kps, kpe, &
  73. its, ite, jts, jte, kts, kte )
  74. !-----------------------------------------------------------------------------
  75. !
  76. ! PURPOSE: Compute Smn*Smn = S11^2 + S22^2 + S33^2 + 2*(S12^2 + S13^2 +S23^2)
  77. !
  78. !-----------------------------------------------------------------------------
  79. IMPLICIT NONE
  80. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( OUT ) &
  81. :: smnsmn ! Smn*Smn (s-2)
  82. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
  83. :: s11 & ! 2*deformation element 11 (s-1)
  84. , s22 & ! 2*deformation element 22 (s-1)
  85. , s33 & ! 2*deformation element 33 (s-1)
  86. , s12 & ! 2*deformation element 12 (s-1)
  87. , s13 & ! 2*deformation element 13 (s-1)
  88. , s23 ! 2*deformation element 23 (s-1)
  89. TYPE (grid_config_rec_type), INTENT( IN ) &
  90. :: config_flags
  91. INTEGER, INTENT( IN ) &
  92. :: ids, ide, jds, jde, kds, kde, &
  93. ims, ime, jms, jme, kms, kme, &
  94. ips, ipe, jps, jpe, kps, kpe, &
  95. its, ite, jts, jte, kts, kte
  96. ! LOCAL VARIABLES ------------------------------------------------------------
  97. REAL :: tmp
  98. INTEGER :: i, j, k, i_start, i_end, j_start, j_end, ktf
  99. !-----------------------------------------------------------------------------
  100. !
  101. ! Set loop limits,
  102. ! taken from /dyn_em/module_diffusion_em.F SUBROUTINE smag_km
  103. !
  104. !-----------------------------------------------------------------------------
  105. ktf = min(kte,kde-1)
  106. i_start = its
  107. i_end = MIN(ite,ide-1)
  108. j_start = jts
  109. j_end = MIN(jte,jde-1)
  110. IF ( config_flags%open_xs .or. config_flags%specified .or. &
  111. config_flags%nested) i_start = MAX(ids+1,its)
  112. IF ( config_flags%open_xe .or. config_flags%specified .or. &
  113. config_flags%nested) i_end = MIN(ide-2,ite)
  114. IF ( config_flags%open_ys .or. config_flags%specified .or. &
  115. config_flags%nested) j_start = MAX(jds+1,jts)
  116. IF ( config_flags%open_ye .or. config_flags%specified .or. &
  117. config_flags%nested) j_end = MIN(jde-2,jte)
  118. IF ( config_flags%periodic_x ) i_start = its
  119. IF ( config_flags%periodic_x ) i_end = MIN( ite, ide-1 )
  120. !-----------------------------------------------------------------------------
  121. ! Below the 0.25 factor divides the incoming WRF deformations,
  122. ! which are multiplied by a factor of 2, by 2
  123. DO j=j_start,j_end
  124. DO k=kts,ktf
  125. DO i=i_start,i_end
  126. smnsmn(i,k,j) = 0.25*( s11(i,k,j)*s11(i,k,j) + &
  127. s22(i,k,j)*s22(i,k,j) + &
  128. s33(i,k,j)*s33(i,k,j) )
  129. END DO
  130. END DO
  131. END DO
  132. ! Below the 0.125 factor accounts for the four-point averaging (0.25)
  133. ! and divides the incoming WRF deformation elements by 2 (0.5)
  134. DO j=j_start,j_end
  135. DO k=kts,ktf
  136. DO i=i_start,i_end
  137. tmp = 0.125*( s12(i ,k,j) + s12(i ,k,j+1) + &
  138. s12(i+1,k,j) + s12(i+1,k,j+1) )
  139. smnsmn(i,k,j) = smnsmn(i,k,j) + 2.0*tmp*tmp
  140. END DO
  141. END DO
  142. END DO
  143. DO j=j_start,j_end
  144. DO k=kts,ktf
  145. DO i=i_start,i_end
  146. tmp = 0.125*( s13(i ,k+1,j) + s13(i ,k,j) + &
  147. s13(i+1,k+1,j) + s13(i+1,k,j) )
  148. smnsmn(i,k,j) = smnsmn(i,k,j) + 2.0*tmp*tmp
  149. END DO
  150. END DO
  151. END DO
  152. DO j=j_start,j_end
  153. DO k=kts,ktf
  154. DO i=i_start,i_end
  155. tmp = 0.125*( s23(i,k+1,j ) + s23(i,k,j ) + &
  156. s23(i,k+1,j+1) + s23(i,k,j+1) )
  157. smnsmn(i,k,j) = smnsmn(i,k,j) + 2.0*tmp*tmp
  158. END DO
  159. END DO
  160. END DO
  161. RETURN
  162. END SUBROUTINE calc_smnsmn
  163. !=============================================================================
  164. SUBROUTINE calc_mii( m11, m22, m33, &
  165. s11, s22, s33, &
  166. s12, s13, s23, &
  167. r12, r13, r23, smnsmn, &
  168. tke, rdzw, dx, dy, &
  169. config_flags, &
  170. ids, ide, jds, jde, kds, kde, &
  171. ims, ime, jms, jme, kms, kme, &
  172. ips, ipe, jps, jpe, kps, kpe, &
  173. its, ite, jts, jte, kts, kte )
  174. !-----------------------------------------------------------------------------
  175. !
  176. ! PURPOSE: Compute Mij for i = j
  177. !
  178. !-----------------------------------------------------------------------------
  179. IMPLICIT NONE
  180. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( OUT ) &
  181. :: m11 & ! NBA stress element 11 (m2 s-2)
  182. , m22 & ! NBA stress element 22 (m2 s-2)
  183. , m33 ! NBA stress element 33 (m2 s-2)
  184. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
  185. :: s11 & ! 2*deformation element 11 (s-1)
  186. , s22 & ! 2*deformation element 22 (s-1)
  187. , s33 & ! 2*deformation element 33 (s-1)
  188. , s12 & ! 2*deformation element 12 (s-1)
  189. , s13 & ! 2*deformation element 13 (s-1)
  190. , s23 & ! 2*deformation element 23 (s-1)
  191. , r12 & ! 2*rotation element 12 (s-1)
  192. , r13 & ! 2*rotation element 13 (s-1)
  193. , r23 & ! 2*rotation element 23 (s-1)
  194. , smnsmn & ! Smn*Smn (s-2)
  195. , tke & ! tke (m2 s-2)
  196. , rdzw ! 1/dz at w-levels (m-1)
  197. REAL, INTENT( IN ) &
  198. :: dx & ! grid spacing in x (m)
  199. , dy ! grid spacing in y (m)
  200. TYPE (grid_config_rec_type), INTENT( IN ) &
  201. :: config_flags
  202. INTEGER, INTENT( IN ) &
  203. :: ids, ide, jds, jde, kds, kde, &
  204. ims, ime, jms, jme, kms, kme, &
  205. ips, ipe, jps, jpe, kps, kpe, &
  206. its, ite, jts, jte, kts, kte
  207. ! LOCAL VARIABLES ------------------------------------------------------------
  208. REAL, DIMENSION( its-1:ite+1, kms:kme, jts-1:jte+1 ) & ! sij/2, rij/2
  209. :: ss11 &
  210. , ss22 &
  211. , ss33 &
  212. , ss12 &
  213. , ss13 &
  214. , ss23 &
  215. , rr12 &
  216. , rr13 &
  217. , rr23
  218. REAL, DIMENSION( its-1:ite+1, kms:kme, jts-1:jte+1 ) & ! projected to c
  219. :: ss12c &
  220. , rr12c &
  221. , ss13c &
  222. , rr13c &
  223. , ss23c &
  224. , rr23c
  225. REAL :: delta, a, b
  226. INTEGER :: i, j, k, i_start, i_end, j_start, j_end, ktf, is_ext, js_ext
  227. !-----------------------------------------------------------------------------
  228. !
  229. ! Set loop limits,
  230. ! taken from /dyn_em/module_diffusion_em.F SUBROUTINE cal_titau_11_22_33
  231. !
  232. !-----------------------------------------------------------------------------
  233. ktf = MIN( kte, kde-1 )
  234. i_start = its
  235. i_end = ite
  236. j_start = jts
  237. j_end = jte
  238. IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
  239. config_flags%nested) i_start = MAX( ids+1, its )
  240. IF ( config_flags%open_xe .OR. config_flags%specified .OR. &
  241. config_flags%nested) i_end = MIN( ide-1, ite )
  242. IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
  243. config_flags%nested) j_start = MAX( jds+1, jts )
  244. IF ( config_flags%open_ye .OR. config_flags%specified .OR. &
  245. config_flags%nested) j_end = MIN( jde-1, jte )
  246. IF ( config_flags%periodic_x ) i_start = its
  247. IF ( config_flags%periodic_x ) i_end = ite
  248. is_ext = 1
  249. js_ext = 1
  250. i_start = i_start - is_ext
  251. j_start = j_start - js_ext
  252. !-----------------------------------------------------------------------------
  253. !
  254. ! Divide WRF deformations, which are multiplied by 2, by 2
  255. !
  256. !-----------------------------------------------------------------------------
  257. DO j=j_start,j_end+1
  258. DO k=kts,ktf
  259. DO i=i_start,i_end+1
  260. ss11(i,k,j)=s11(i,k,j)/2.0
  261. ss22(i,k,j)=s22(i,k,j)/2.0
  262. ss33(i,k,j)=s33(i,k,j)/2.0
  263. ss12(i,k,j)=s12(i,k,j)/2.0
  264. ss13(i,k,j)=s13(i,k,j)/2.0
  265. ss23(i,k,j)=s23(i,k,j)/2.0
  266. rr12(i,k,j)=r12(i,k,j)/2.0
  267. rr13(i,k,j)=r13(i,k,j)/2.0
  268. rr23(i,k,j)=r23(i,k,j)/2.0
  269. END DO
  270. END DO
  271. END DO
  272. DO j=j_start,j_end+1
  273. DO i=i_start,i_end+1
  274. ss13(i,kde,j) = 0.0
  275. ss23(i,kde,j) = 0.0
  276. rr13(i,kde,j) = 0.0
  277. rr23(i,kde,j) = 0.0
  278. END DO
  279. END DO
  280. !-----------------------------------------------------------------------------
  281. !
  282. ! Project variables to c
  283. !
  284. !-----------------------------------------------------------------------------
  285. DO j = j_start, j_end
  286. DO k = kts, ktf
  287. DO i = i_start, i_end
  288. ss12c(i,k,j) = 0.25*( ss12(i ,k ,j ) + ss12(i ,k ,j+1) + &
  289. ss12(i+1,k ,j ) + ss12(i+1,k ,j+1) )
  290. rr12c(i,k,j) = 0.25*( rr12(i ,k ,j ) + rr12(i ,k ,j+1) + &
  291. rr12(i+1,k ,j ) + rr12(i+1,k ,j+1) )
  292. ss13c(i,k,j) = 0.25*( ss13(i ,k+1,j ) + ss13(i ,k ,j ) + &
  293. ss13(i+1,k+1,j ) + ss13(i+1,k ,j ) )
  294. rr13c(i,k,j) = 0.25*( rr13(i ,k+1,j ) + rr13(i ,k ,j ) + &
  295. rr13(i+1,k+1,j ) + rr13(i+1,k ,j ) )
  296. ss23c(i,k,j) = 0.25*( ss23(i ,k+1,j ) + ss23(i ,k ,j ) + &
  297. ss23(i ,k+1,j+1) + ss23(i ,k ,j+1) )
  298. rr23c(i,k,j) = 0.25*( rr23(i ,k+1,j ) + rr23(i ,k ,j ) + &
  299. rr23(i ,k+1,j+1) + rr23(i ,k ,j+1) )
  300. ENDDO
  301. ENDDO
  302. ENDDO
  303. !-----------------------------------------------------------------------------
  304. !
  305. ! Calculate M11, M22 and M33
  306. !
  307. !-----------------------------------------------------------------------------
  308. IF ( config_flags%sfs_opt .EQ. 1 ) THEN !Do not use TKE
  309. DO j=j_start,j_end
  310. DO k=kts,ktf
  311. DO i=i_start,i_end
  312. delta = ( dx * dy / rdzw(i,k,j) )**0.33333333
  313. a = -1.0*( cs*delta )**2
  314. m11(i,k,j) = a*( 2.0*sqrt( 2.0*smnsmn(i,k,j) )*ss11(i,k,j) &
  315. + c1*( ss11(i,k,j) *ss11(i,k,j) &
  316. + ss12c(i,k,j)*ss12c(i,k,j) &
  317. + ss13c(i,k,j)*ss13c(i,k,j) &
  318. - smnsmn(i,k,j)/3.0 &
  319. ) &
  320. + c2*( -2.0*( ss12c(i,k,j)*rr12c(i,k,j) &
  321. + ss13c(i,k,j)*rr13c(i,k,j) &
  322. ) &
  323. ) &
  324. )
  325. m22(i,k,j) = a*( 2.0*sqrt( 2.0*smnsmn(i,k,j) )*ss22(i,k,j) &
  326. + c1*( ss22(i,k,j) *ss22(i,k,j) &
  327. + ss12c(i,k,j)*ss12c(i,k,j) &
  328. + ss23c(i,k,j)*ss23c(i,k,j) &
  329. - smnsmn(i,k,j)/3.0 &
  330. ) &
  331. + c2*( 2.0*( ss12c(i,k,j)*rr12c(i,k,j) &
  332. - ss23c(i,k,j)*rr23c(i,k,j) &
  333. ) &
  334. ) &
  335. )
  336. m33(i,k,j) = a*( 2.0*sqrt( 2.0*smnsmn(i,k,j) )*ss33(i,k,j) &
  337. + c1*( ss33(i,k,j) *ss33(i,k,j) &
  338. + ss13c(i,k,j)*ss13c(i,k,j) &
  339. + ss23c(i,k,j)*ss23c(i,k,j) &
  340. - smnsmn(i,k,j)/3.0 &
  341. ) &
  342. + c2*( 2.0*( ss13c(i,k,j)*rr13c(i,k,j) &
  343. + ss23c(i,k,j)*rr23c(i,k,j) &
  344. ) &
  345. ) &
  346. )
  347. ENDDO
  348. ENDDO
  349. ENDDO
  350. ELSE !(config_flags%sfs_opt .EQ. 2) Use TKE
  351. DO j=j_start,j_end
  352. DO k=kts,ktf
  353. DO i=i_start,i_end
  354. delta = ( dx * dy / rdzw(i,k,j) )**0.33333333
  355. a = -1.0*ce*delta
  356. b = c3*delta
  357. m11(i,k,j) = a*( 2.0*sqrt( tke(i,k,j) )*ss11(i,k,j) &
  358. + b*( &
  359. c1*( ss11(i,k,j) *ss11(i,k,j) &
  360. + ss12c(i,k,j)*ss12c(i,k,j) &
  361. + ss13c(i,k,j)*ss13c(i,k,j) &
  362. - smnsmn(i,k,j)/3.0 &
  363. ) &
  364. + c2*( -2.0*( ss12c(i,k,j)*rr12c(i,k,j) &
  365. + ss13c(i,k,j)*rr13c(i,k,j) &
  366. ) &
  367. ) &
  368. ) &
  369. )
  370. m22(i,k,j) = a*( 2.0*sqrt( tke(i,k,j) )*ss22(i,k,j) &
  371. + b*( &
  372. c1*( ss22(i,k,j) *ss22(i,k,j) &
  373. + ss12c(i,k,j)*ss12c(i,k,j) &
  374. + ss23c(i,k,j)*ss23c(i,k,j) &
  375. - smnsmn(i,k,j)/3.0 &
  376. ) &
  377. + c2*( 2.0*( ss12c(i,k,j)*rr12c(i,k,j) &
  378. - ss23c(i,k,j)*rr23c(i,k,j) &
  379. ) &
  380. ) &
  381. ) &
  382. )
  383. m33(i,k,j) = a*( 2.0*sqrt( tke(i,k,j) )*ss33(i,k,j) &
  384. + b*( &
  385. c1*( ss33(i,k,j) *ss33(i,k,j) &
  386. + ss13c(i,k,j)*ss13c(i,k,j) &
  387. + ss23c(i,k,j)*ss23c(i,k,j) &
  388. - smnsmn(i,k,j)/3.0 &
  389. ) &
  390. + c2*( 2.0*( ss13c(i,k,j)*rr13c(i,k,j) &
  391. + ss23c(i,k,j)*rr23c(i,k,j) &
  392. ) &
  393. ) &
  394. ) &
  395. )
  396. ENDDO
  397. ENDDO
  398. ENDDO
  399. ENDIF
  400. RETURN
  401. END SUBROUTINE calc_mii
  402. !=============================================================================
  403. SUBROUTINE calc_m12( m12, &
  404. s11, s22, &
  405. s12, s13, s23, &
  406. r12, r13, r23, smnsmn, &
  407. tke, rdzw, dx, dy, &
  408. config_flags, &
  409. ids, ide, jds, jde, kds, kde, &
  410. ims, ime, jms, jme, kms, kme, &
  411. ips, ipe, jps, jpe, kps, kpe, &
  412. its, ite, jts, jte, kts, kte )
  413. !-----------------------------------------------------------------------------
  414. !
  415. ! PURPOSE: Compute M12
  416. !
  417. !-----------------------------------------------------------------------------
  418. IMPLICIT NONE
  419. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( OUT ) &
  420. :: m12 ! NBA stress element 12 (m2 s-2)
  421. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
  422. :: s11 & ! 2*deformation element 11 (s-1)
  423. , s22 & ! 2*deformation element 22 (s-1)
  424. , s12 & ! 2*deformation element 12 (s-1)
  425. , s13 & ! 2*deformation element 13 (s-1)
  426. , s23 & ! 2*deformation element 23 (s-1)
  427. , r12 & ! 2*rotation element 12 (s-1)
  428. , r13 & ! 2*rotation element 13 (s-1)
  429. , r23 & ! 2*rotation element 23 (s-1)
  430. , smnsmn & ! Smn*Smn (s-2)
  431. , tke & ! tke (m2 s-2)
  432. , rdzw ! 1/dz at w-levels (m-1)
  433. REAL, INTENT( IN ) &
  434. :: dx & ! grid spacing in x (m)
  435. , dy ! grid spacing in y (m)
  436. TYPE (grid_config_rec_type), INTENT( IN ) &
  437. :: config_flags
  438. INTEGER, INTENT( IN ) &
  439. :: ids, ide, jds, jde, kds, kde, &
  440. ims, ime, jms, jme, kms, kme, &
  441. ips, ipe, jps, jpe, kps, kpe, &
  442. its, ite, jts, jte, kts, kte
  443. ! LOCAL VARIABLES ------------------------------------------------------------
  444. REAL, DIMENSION( its-1:ite+1, kms:kme, jts-1:jte+1 ) & ! sij/2, rij/2
  445. :: ss11 &
  446. , ss22 &
  447. , ss12 &
  448. , ss13 &
  449. , ss23 &
  450. , rr12 &
  451. , rr13 &
  452. , rr23
  453. REAL, DIMENSION( its-1:ite+1, kms:kme, jts-1:jte+1 ) & ! projected to d
  454. :: tked &
  455. , ss11d &
  456. , ss22d &
  457. , ss13d &
  458. , ss23d &
  459. , rr13d &
  460. , rr23d &
  461. , smnsmnd
  462. REAL :: delta, a, b
  463. INTEGER :: i, j, k, i_start, i_end, j_start, j_end, ktf, je_ext, ie_ext
  464. !-----------------------------------------------------------------------------
  465. !
  466. ! Set loop limits,
  467. ! taken from /dyn_em/module_diffusion_em.F SUBROUTINE cal_titau_12_21
  468. !
  469. !-----------------------------------------------------------------------------
  470. ktf = MIN( kte, kde-1 )
  471. ! Needs one more point in the x and y directions.
  472. i_start = its
  473. i_end = ite
  474. j_start = jts
  475. j_end = jte
  476. IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
  477. config_flags%nested ) i_start = MAX( ids+1, its )
  478. IF ( config_flags%open_xe .OR. config_flags%specified .OR. &
  479. config_flags%nested ) i_end = MIN( ide-1, ite )
  480. IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
  481. config_flags%nested ) j_start = MAX( jds+1, jts )
  482. IF ( config_flags%open_ye .OR. config_flags%specified .OR. &
  483. config_flags%nested ) j_end = MIN( jde-1, jte )
  484. IF ( config_flags%periodic_x ) i_start = its
  485. IF ( config_flags%periodic_x ) i_end = ite
  486. je_ext = 1
  487. ie_ext = 1
  488. i_end = i_end + ie_ext
  489. j_end = j_end + je_ext
  490. !-----------------------------------------------------------------------------
  491. !
  492. ! Divide WRF deformations, which are multiplied by 2, by 2
  493. !
  494. !-----------------------------------------------------------------------------
  495. DO j=j_start-1,j_end
  496. DO k=kts,ktf
  497. DO i=i_start-1,i_end
  498. ss11(i,k,j)=s11(i,k,j)/2.0
  499. ss22(i,k,j)=s22(i,k,j)/2.0
  500. ss12(i,k,j)=s12(i,k,j)/2.0
  501. ss13(i,k,j)=s13(i,k,j)/2.0
  502. ss23(i,k,j)=s23(i,k,j)/2.0
  503. rr12(i,k,j)=r12(i,k,j)/2.0
  504. rr13(i,k,j)=r13(i,k,j)/2.0
  505. rr23(i,k,j)=r23(i,k,j)/2.0
  506. END DO
  507. END DO
  508. END DO
  509. DO j=j_start-1,j_end
  510. DO i=i_start-1,i_end
  511. ss13(i,kde,j) = 0.0
  512. ss23(i,kde,j) = 0.0
  513. rr13(i,kde,j) = 0.0
  514. rr23(i,kde,j) = 0.0
  515. END DO
  516. END DO
  517. !-----------------------------------------------------------------------------
  518. !
  519. ! Project variables to d
  520. !
  521. !-----------------------------------------------------------------------------
  522. DO j = j_start, j_end
  523. DO k = kts, ktf
  524. DO i = i_start, i_end
  525. tked(i,k,j) = 0.25*( tke(i-1,k ,j ) + tke(i ,k ,j ) + &
  526. tke(i-1,k ,j-1) + tke(i ,k ,j-1) )
  527. smnsmnd(i,k,j) = 0.25*( smnsmn(i-1,k ,j ) + smnsmn(i ,k ,j ) + &
  528. smnsmn(i-1,k ,j-1) + smnsmn(i ,k ,j-1) )
  529. ss11d(i,k,j) = 0.25*( ss11(i-1,k ,j ) + ss11(i ,k ,j ) + &
  530. ss11(i-1,k ,j-1) + ss11(i ,k ,j-1) )
  531. ss22d(i,k,j) = 0.25*( ss22(i-1,k ,j ) + ss22(i ,k ,j ) + &
  532. ss22(i-1,k ,j-1) + ss22(i ,k ,j-1) )
  533. ss13d(i,k,j) = 0.25*( ss13(i ,k+1,j ) + ss13(i ,k+1,j-1) + &
  534. ss13(i ,k ,j ) + ss13(i ,k ,j-1) )
  535. rr13d(i,k,j) = 0.25*( rr13(i ,k+1,j ) + rr13(i ,k+1,j-1) + &
  536. rr13(i ,k ,j ) + rr13(i ,k ,j-1) )
  537. ss23d(i,k,j) = 0.25*( ss23(i ,k+1,j ) + ss23(i-1,k+1,j ) + &
  538. ss23(i ,k ,j ) + ss23(i-1,k ,j ) )
  539. rr23d(i,k,j) = 0.25*( rr23(i ,k+1,j ) + rr23(i-1,k+1,j ) + &
  540. rr23(i ,k ,j ) + rr23(i-1,k ,j ) )
  541. END DO
  542. END DO
  543. END DO
  544. !-----------------------------------------------------------------------------
  545. !
  546. ! Calculate M12
  547. !
  548. !-----------------------------------------------------------------------------
  549. IF ( config_flags%sfs_opt .EQ. 1 ) THEN !Do not use TKE
  550. DO j=j_start,j_end
  551. DO k=kts,ktf
  552. DO i=i_start,i_end
  553. delta = ( dx * dy / rdzw(i,k,j) )**0.33333333
  554. a = -1.0*( cs*delta )**2
  555. m12(i,k,j) = a*( 2.0*sqrt( 2.0*smnsmnd(i,k,j) )*ss12(i,k,j) &
  556. + c1*( ss11d(i,k,j)*ss12(i,k,j) &
  557. + ss22d(i,k,j)*ss12(i,k,j) &
  558. + ss13d(i,k,j)*ss23d(i,k,j) &
  559. ) &
  560. + c2*( ss11d(i,k,j)*rr12(i,k,j) &
  561. - ss13d(i,k,j)*rr23d(i,k,j) &
  562. - ss22d(i,k,j)*rr12(i,k,j) &
  563. - ss23d(i,k,j)*rr13d(i,k,j) &
  564. ) &
  565. )
  566. ENDDO
  567. ENDDO
  568. ENDDO
  569. ELSE !(config_flags%sfs_opt .EQ. 2) Use TKE
  570. DO j=j_start,j_end
  571. DO k=kts,ktf
  572. DO i=i_start,i_end
  573. delta = ( dx * dy / rdzw(i,k,j) )**0.33333333
  574. a = -1.0*ce*delta
  575. b = c3*delta
  576. m12(i,k,j) = a*( 2.0*sqrt( tked(i,k,j) )*s12(i,k,j) &
  577. + b*( &
  578. c1*( ss11d(i,k,j)*ss12(i,k,j) &
  579. + ss22d(i,k,j)*ss12(i,k,j) &
  580. + ss13d(i,k,j)*ss23d(i,k,j) &
  581. ) &
  582. + c2*( ss11d(i,k,j)*rr12(i,k,j) &
  583. - ss13d(i,k,j)*rr23d(i,k,j) &
  584. - ss22d(i,k,j)*rr12(i,k,j) &
  585. - ss23d(i,k,j)*rr13d(i,k,j) &
  586. ) &
  587. ) &
  588. )
  589. ENDDO
  590. ENDDO
  591. ENDDO
  592. ENDIF
  593. RETURN
  594. END SUBROUTINE calc_m12
  595. !=============================================================================
  596. SUBROUTINE calc_m13( m13, &
  597. s11, s33, &
  598. s12, s13, s23, &
  599. r12, r13, r23, smnsmn, &
  600. tke, rdzw, dx, dy, &
  601. fnm, fnp, &
  602. config_flags, &
  603. ids, ide, jds, jde, kds, kde, &
  604. ims, ime, jms, jme, kms, kme, &
  605. ips, ipe, jps, jpe, kps, kpe, &
  606. its, ite, jts, jte, kts, kte )
  607. !-----------------------------------------------------------------------------
  608. !
  609. ! PURPOSE: Compute M13
  610. !
  611. !-----------------------------------------------------------------------------
  612. IMPLICIT NONE
  613. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( OUT ) &
  614. :: m13 ! (m2 s-2)
  615. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
  616. :: s11 & ! 2*deformation element 11 (s-1)
  617. , s33 & ! 2*deformation element 33 (s-1)
  618. , s12 & ! 2*deformation element 12 (s-1)
  619. , s13 & ! 2*deformation element 13 (s-1)
  620. , s23 & ! 2*deformation element 23 (s-1)
  621. , r12 & ! 2*rotation element 12 (s-1)
  622. , r13 & ! 2*rotation element 13 (s-1)
  623. , r23 & ! 2*rotation element 23 (s-1)
  624. , smnsmn & ! Smn*Smn (s-2)
  625. , tke & ! tke (m2 s-2)
  626. , rdzw ! 1/dz at w-levels (m-1)
  627. REAL, INTENT( IN ) &
  628. :: dx & ! grid spacing in x (m)
  629. , dy ! grid spacing in y (m)
  630. REAL, DIMENSION( kms:kme ), INTENT( IN ) &
  631. :: fnm & ! vertical interpolation coefficients
  632. , fnp !
  633. TYPE (grid_config_rec_type), INTENT( IN ) &
  634. :: config_flags
  635. INTEGER, INTENT( IN ) &
  636. :: ids, ide, jds, jde, kds, kde, &
  637. ims, ime, jms, jme, kms, kme, &
  638. ips, ipe, jps, jpe, kps, kpe, &
  639. its, ite, jts, jte, kts, kte
  640. ! LOCAL VARIABLES ------------------------------------------------------------
  641. REAL, DIMENSION( its-1:ite+1, kms:kme, jts-1:jte+1 ) & ! sij/2, rij/2
  642. :: ss11 &
  643. , ss33 &
  644. , ss12 &
  645. , ss13 &
  646. , ss23 &
  647. , rr12 &
  648. , rr13 &
  649. , rr23
  650. REAL, DIMENSION( its-1:ite+1, kms:kme, jts-1:jte+1 ) & ! projected to e
  651. :: tkee &
  652. , ss11e &
  653. , ss33e &
  654. , ss12e &
  655. , ss23e &
  656. , rr12e &
  657. , rr23e &
  658. , smnsmne
  659. REAL :: delta, a, b
  660. INTEGER :: i, j, k, i_start, i_end, j_start, j_end, ktf, ie_ext
  661. !-----------------------------------------------------------------------------
  662. !
  663. ! Set loop limits,
  664. ! taken from /dyn_em/module_diffusion_em.F SUBROUTINE cal_titau_13_31
  665. !
  666. !-----------------------------------------------------------------------------
  667. ktf = MIN( kte, kde-1 )
  668. ! Find ide-1 and jde-1 for averaging to p point.
  669. i_start = its
  670. i_end = ite
  671. j_start = jts
  672. j_end = MIN( jte, jde-1 )
  673. IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
  674. config_flags%nested) i_start = MAX( ids+1, its )
  675. IF ( config_flags%open_xe .OR. config_flags%specified .OR. &
  676. config_flags%nested) i_end = MIN( ide-1, ite )
  677. IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
  678. config_flags%nested) j_start = MAX( jds+1, jts )
  679. IF ( config_flags%open_ye .OR. config_flags%specified .OR. &
  680. config_flags%nested) j_end = MIN( jde-2, jte )
  681. IF ( config_flags%periodic_x ) i_start = its
  682. IF ( config_flags%periodic_x ) i_end = ite
  683. ie_ext = 1
  684. i_end = i_end + ie_ext
  685. !-----------------------------------------------------------------------------
  686. !
  687. ! Divide WRF deformations, which are multiplied by 2, by 2
  688. !
  689. !-----------------------------------------------------------------------------
  690. DO j=j_start,j_end+1
  691. DO k=kts,ktf
  692. DO i=i_start-1,i_end
  693. ss11(i,k,j)=s11(i,k,j)/2.0
  694. ss33(i,k,j)=s33(i,k,j)/2.0
  695. ss12(i,k,j)=s12(i,k,j)/2.0
  696. ss13(i,k,j)=s13(i,k,j)/2.0
  697. ss23(i,k,j)=s23(i,k,j)/2.0
  698. rr12(i,k,j)=r12(i,k,j)/2.0
  699. rr13(i,k,j)=r13(i,k,j)/2.0
  700. rr23(i,k,j)=r23(i,k,j)/2.0
  701. END DO
  702. END DO
  703. END DO
  704. !-----------------------------------------------------------------------------
  705. !
  706. ! Project variables to e
  707. !
  708. !-----------------------------------------------------------------------------
  709. DO j = j_start, j_end
  710. DO k = kts+1, ktf
  711. DO i = i_start, i_end
  712. tkee(i,k,j) = 0.5*( fnm(k)*( tke(i,k ,j) + tke(i-1,k ,j) ) + &
  713. fnp(k)*( tke(i,k-1,j) + tke(i-1,k-1,j) ) )
  714. smnsmne(i,k,j) = 0.5*( fnm(k)*( smnsmn(i,k ,j) + smnsmn(i-1,k ,j) ) + &
  715. fnp(k)*( smnsmn(i,k-1,j) + smnsmn(i-1,k-1,j) ) )
  716. ss11e(i,k,j) = 0.5*( fnm(k)*( ss11(i ,k ,j ) + ss11(i-1,k ,j ) ) + &
  717. fnp(k)*( ss11(i ,k-1,j ) + ss11(i-1,k-1,j ) ) )
  718. ss33e(i,k,j) = 0.5*( fnm(k)*( ss33(i ,k ,j ) + ss33(i-1,k ,j ) ) + &
  719. fnp(k)*( ss33(i ,k-1,j ) + ss33(i-1,k-1,j ) ) )
  720. ss12e(i,k,j) = 0.5*( fnm(k)*( ss12(i ,k ,j ) + ss12(i ,k ,j+1) ) + &
  721. fnp(k)*( ss12(i ,k-1,j ) + ss12(i ,k-1,j+1) ) )
  722. rr12e(i,k,j) = 0.5*( fnm(k)*( rr12(i ,k ,j ) + rr12(i ,k ,j+1) ) + &
  723. fnp(k)*( rr12(i ,k-1,j ) + rr12(i ,k-1,j+1) ) )
  724. ss23e(i,k,j) = 0.25*( ss23(i ,k ,j) + ss23(i ,k ,j+1) + &
  725. ss23(i-1,k ,j) + ss23(i-1,k ,j+1) )
  726. rr23e(i,k,j) = 0.25*( rr23(i ,k ,j) + rr23(i ,k ,j+1) + &
  727. rr23(i-1,k ,j) + rr23(i-1,k ,j+1) )
  728. END DO
  729. END DO
  730. END DO
  731. !-----------------------------------------------------------------------------
  732. !
  733. ! Calculate M_13
  734. !
  735. !-----------------------------------------------------------------------------
  736. IF ( config_flags%sfs_opt .EQ. 1 ) THEN !Do not use TKE
  737. DO j=j_start,j_end
  738. DO k=kts+1,ktf
  739. DO i=i_start,i_end
  740. delta = ( dx * dy / rdzw(i,k,j) )**0.33333333
  741. a = -1.0*( cs*delta )**2
  742. m13(i,k,j) = a*( 2.0*sqrt( 2.0*smnsmne(i,k,j) )*ss13(i,k,j) &
  743. + c1*( ss11e(i,k,j)*ss13(i,k,j) &
  744. + ss12e(i,k,j)*ss23e(i,k,j) &
  745. + ss13(i,k,j)*ss33e(i,k,j) &
  746. ) &
  747. + c2*( ss11e(i,k,j)*rr13(i,k,j) &
  748. + ss12e(i,k,j)*rr23e(i,k,j) &
  749. - ss23e(i,k,j)*rr12e(i,k,j) &
  750. - ss33e(i,k,j)*rr13(i,k,j) &
  751. ) &
  752. )
  753. ENDDO
  754. ENDDO
  755. ENDDO
  756. ELSE !(config_flags%sfs_opt .EQ. 2) Use TKE
  757. DO j=j_start,j_end
  758. DO k=kts+1,ktf
  759. DO i=i_start,i_end
  760. delta = ( dx * dy / rdzw(i,k,j) )**0.33333333
  761. a = -1.0*ce*delta
  762. b = c3*delta
  763. m13(i,k,j) = a*( 2.0*sqrt( tkee(i,k,j) )*ss13(i,k,j) &
  764. + b*( &
  765. c1*( ss11e(i,k,j)*ss13(i,k,j) &
  766. + ss12e(i,k,j)*ss23e(i,k,j) &
  767. + ss13(i,k,j)*ss33e(i,k,j) &
  768. ) &
  769. + c2*( ss11e(i,k,j)*rr13(i,k,j) &
  770. + ss12e(i,k,j)*rr23e(i,k,j) &
  771. - ss23e(i,k,j)*rr12e(i,k,j) &
  772. - ss33e(i,k,j)*rr13(i,k,j) &
  773. ) &
  774. ) &
  775. )
  776. ENDDO
  777. ENDDO
  778. ENDDO
  779. ENDIF
  780. RETURN
  781. END SUBROUTINE calc_m13
  782. !=============================================================================
  783. SUBROUTINE calc_m23( m23, &
  784. s22, s33, &
  785. s12, s13, s23, &
  786. r12, r13, r23, smnsmn, &
  787. tke, rdzw, dx, dy, &
  788. fnm, fnp, &
  789. config_flags, &
  790. ids, ide, jds, jde, kds, kde, &
  791. ims, ime, jms, jme, kms, kme, &
  792. ips, ipe, jps, jpe, kps, kpe, &
  793. its, ite, jts, jte, kts, kte )
  794. !-----------------------------------------------------------------------------
  795. !
  796. ! PURPOSE: Compute M23
  797. !
  798. !-----------------------------------------------------------------------------
  799. IMPLICIT NONE
  800. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( OUT ) &
  801. :: m23 ! (m2 s-2)
  802. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
  803. :: s22 & ! 2*deformation element 22 (s-1)
  804. , s33 & ! 2*deformation element 33 (s-1)
  805. , s12 & ! 2*deformation element 12 (s-1)
  806. , s13 & ! 2*deformation element 13 (s-1)
  807. , s23 & ! 2*deformation element 23 (s-1)
  808. , r12 & ! 2*rotation element 12 (s-1)
  809. , r13 & ! 2*rotation element 13 (s-1)
  810. , r23 & ! 2*rotation element 23 (s-1)
  811. , smnsmn & ! Smn*Smn (s-2)
  812. , tke & ! tke (m2 s-2)
  813. , rdzw ! 1/dz at w-levels (m-1)
  814. REAL, INTENT( IN ) &
  815. :: dx & ! grid spacing in x (m)
  816. , dy ! grid spacing in y (m)
  817. REAL, DIMENSION( kms:kme ), INTENT( IN ) &
  818. :: fnm & ! vertical interpolation coefficients
  819. , fnp !
  820. TYPE (grid_config_rec_type), INTENT( IN ) &
  821. :: config_flags
  822. INTEGER, INTENT( IN ) &
  823. :: ids, ide, jds, jde, kds, kde, &
  824. ims, ime, jms, jme, kms, kme, &
  825. ips, ipe, jps, jpe, kps, kpe, &
  826. its, ite, jts, jte, kts, kte
  827. ! LOCAL VARIABLES ------------------------------------------------------------
  828. REAL, DIMENSION( its-1:ite+1, kms:kme, jts-1:jte+1 ) & ! sij/2, rij/2
  829. :: ss22 &
  830. , ss33 &
  831. , ss12 &
  832. , ss13 &
  833. , ss23 &
  834. , rr12 &
  835. , rr13 &
  836. , rr23
  837. REAL, DIMENSION( its-1:ite+1, kms:kme, jts-1:jte+1 ) & ! projected to f
  838. :: tkef &
  839. , ss22f &
  840. , ss33f &
  841. , ss12f &
  842. , ss13f &
  843. , rr12f &
  844. , rr13f &
  845. , smnsmnf
  846. REAL :: delta, a, b
  847. INTEGER :: i, j, k, i_start, i_end, j_start, j_end, ktf, je_ext
  848. !-----------------------------------------------------------------------------
  849. !
  850. ! Set loop limits,
  851. ! taken from /dyn_em/module_diffusion_em.F SUBROUTINE cal_titau_23_32
  852. !
  853. !-----------------------------------------------------------------------------
  854. ktf = MIN( kte, kde-1 )
  855. ! Find ide-1 and jde-1 for averaging to p point.
  856. i_start = its
  857. i_end = MIN( ite, ide-1 )
  858. j_start = jts
  859. j_end = jte
  860. IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
  861. config_flags%nested) i_start = MAX( ids+1, its )
  862. IF ( config_flags%open_xe .OR. config_flags%specified .OR. &
  863. config_flags%nested) i_end = MIN( ide-2, ite )
  864. IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
  865. config_flags%nested) j_start = MAX( jds+1, jts )
  866. IF ( config_flags%open_ye .OR. config_flags%specified .OR. &
  867. config_flags%nested) j_end = MIN( jde-1, jte )
  868. IF ( config_flags%periodic_x ) i_start = its
  869. IF ( config_flags%periodic_x ) i_end = MIN( ite, ide-1 )
  870. je_ext = 1
  871. j_end = j_end + je_ext
  872. !-----------------------------------------------------------------------------
  873. !
  874. ! Divide WRF deformations, which are multiplied by 2, by 2
  875. !
  876. !-----------------------------------------------------------------------------
  877. DO j=j_start-1,j_end
  878. DO k=kts,ktf
  879. DO i=i_start,i_end+1
  880. ss22(i,k,j)=s22(i,k,j)/2.0
  881. ss33(i,k,j)=s33(i,k,j)/2.0
  882. ss12(i,k,j)=s12(i,k,j)/2.0
  883. ss13(i,k,j)=s13(i,k,j)/2.0
  884. ss23(i,k,j)=s23(i,k,j)/2.0
  885. rr12(i,k,j)=r12(i,k,j)/2.0
  886. rr13(i,k,j)=r13(i,k,j)/2.0
  887. rr23(i,k,j)=r23(i,k,j)/2.0
  888. END DO
  889. END DO
  890. END DO
  891. !-----------------------------------------------------------------------------
  892. !
  893. ! Project variables to f
  894. !
  895. !-----------------------------------------------------------------------------
  896. DO j = j_start, j_end
  897. DO k = kts+1, ktf
  898. DO i = i_start, i_end
  899. tkef(i,k,j) = 0.5*( fnm(k)*( tke(i ,k ,j ) + tke(i ,k ,j-1) ) + &
  900. fnp(k)*( tke(i ,k-1,j ) + tke(i ,k-1,j-1) ) )
  901. smnsmnf(i,k,j) = 0.5*( fnm(k)*( smnsmn(i ,k ,j ) + smnsmn(i ,k ,j-1) ) + &
  902. fnp(k)*( smnsmn(i ,k-1,j ) + smnsmn(i ,k-1,j-1) ) )
  903. ss22f(i,k,j) = 0.5*( fnm(k)*( ss22(i ,k ,j ) + ss22(i ,k ,j-1) ) + &
  904. fnp(k)*( ss22(i ,k-1,j ) + ss22(i ,k-1,j-1) ) )
  905. ss33f(i,k,j) = 0.5*( fnm(k)*( ss33(i ,k ,j ) + ss33(i ,k ,j-1) ) + &
  906. fnp(k)*( ss33(i ,k-1,j ) + ss33(i ,k-1,j-1) ) )
  907. ss12f(i,k,j) = 0.5*( fnm(k)*( ss12(i ,k ,j ) + ss12(i+1,k ,j ) ) + &
  908. fnp(k)*( ss12(i ,k-1,j ) + ss12(i+1,k-1,j ) ) )
  909. rr12f(i,k,j) = 0.5*( fnm(k)*( rr12(i ,k ,j ) + rr12(i+1,k ,j ) ) + &
  910. fnp(k)*( rr12(i ,k-1,j ) + rr12(i+1,k-1,j ) ) )
  911. ss13f(i,k,j) = 0.25*( ss13(i ,k ,j ) + ss13(i ,k ,j-1) + &
  912. ss13(i+1,k ,j-1) + ss13(i+1,k ,j ) )
  913. rr13f(i,k,j) = 0.25*( rr13(i ,k ,j ) + rr13(i ,k ,j-1) + &
  914. rr13(i+1,k ,j-1) + rr13(i+1,k ,j ) )
  915. END DO
  916. END DO
  917. END DO
  918. !-----------------------------------------------------------------------------
  919. !
  920. ! Calculate M23
  921. !
  922. !-----------------------------------------------------------------------------
  923. IF ( config_flags%sfs_opt .EQ. 1 ) THEN !Do not use TKE
  924. DO j=j_start,j_end
  925. DO k=kts+1,ktf
  926. DO i=i_start,i_end
  927. delta = ( dx * dy / rdzw(i,k,j) )**0.33333333
  928. a = -1.0*( cs*delta )**2
  929. m23(i,k,j) = a*( 2.0*sqrt( 2.0*smnsmnf(i,k,j) )*ss23(i,k,j) &
  930. + c1*( ss12f(i,k,j)*ss13f(i,k,j) &
  931. + ss22f(i,k,j)*ss23(i,k,j) &
  932. + ss23(i,k,j) *ss33f(i,k,j) &
  933. ) &
  934. + c2*( ss12f(i,k,j)*rr13f(i,k,j) &
  935. + ss22f(i,k,j)*rr23(i,k,j) &
  936. + ss13f(i,k,j)*rr12f(i,k,j) &
  937. - ss33f(i,k,j)*rr23(i,k,j) &
  938. ) &
  939. )
  940. ENDDO
  941. ENDDO
  942. ENDDO
  943. ELSE !(config_flags%sfs_opt .EQ. 2) Use TKE
  944. DO j=j_start,j_end
  945. DO k=kts+1,ktf
  946. DO i=i_start,i_end
  947. delta = ( dx * dy / rdzw(i,k,j) )**0.33333333
  948. a = -1.0*ce*delta
  949. b = c3*delta
  950. m23(i,k,j) = a*( 2.0*sqrt( tkef(i,k,j) )*ss23(i,k,j) &
  951. + b*( &
  952. c1*( ss12f(i,k,j)*ss13f(i,k,j) &
  953. + ss22f(i,k,j)*ss23(i,k,j) &
  954. + ss23(i,k,j) *ss33f(i,k,j) &
  955. ) &
  956. + c2*( ss12f(i,k,j)*rr13f(i,k,j) &
  957. + ss22f(i,k,j)*rr23(i,k,j) &
  958. + ss13f(i,k,j)*rr12f(i,k,j) &
  959. - ss33f(i,k,j)*rr23(i,k,j) &
  960. ) &
  961. ) &
  962. )
  963. ENDDO
  964. ENDDO
  965. ENDDO
  966. ENDIF
  967. RETURN
  968. END SUBROUTINE calc_m23
  969. !=============================================================================
  970. END MODULE module_sfs_nba