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

/wrfv2_fire/dyn_em/module_em.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 2017 lines | 1324 code | 389 blank | 304 comment | 30 complexity | 422bdbd307c09316d16f8380bf354f8d MD5 | raw file
Possible License(s): AGPL-1.0
  1. !WRF:MODEL_LAYER:DYNAMICS
  2. !
  3. MODULE module_em
  4. USE module_model_constants
  5. USE module_advect_em, only: advect_u, advect_v, advect_w, advect_scalar, advect_scalar_pd, advect_scalar_mono, &
  6. advect_weno_u, advect_weno_v, advect_weno_w, advect_scalar_weno, advect_scalar_wenopd
  7. USE module_big_step_utilities_em, only: grid_config_rec_type, calculate_full, couple_momentum, calc_mu_uv, calc_ww_cp, calc_cq, calc_alt, calc_php, set_tend, rhs_ph, &
  8. horizontal_pressure_gradient, pg_buoy_w, w_damp, perturbation_coriolis, coriolis, curvature, horizontal_diffusion, horizontal_diffusion_3dmp, vertical_diffusion_u, &
  9. vertical_diffusion_v, vertical_diffusion, vertical_diffusion_3dmp, sixth_order_diffusion, rk_rayleigh_damp, theta_relaxation, vertical_diffusion_mp, zero_tend
  10. USE module_state_description, only: param_first_scalar, p_qr, p_qv, p_qc, p_qg, p_qi, p_qs, tiedtkescheme, heldsuarez, positivedef, &
  11. gdscheme, g3scheme, kfetascheme, monotonic, wenopd_scalar, weno_scalar, weno_mom
  12. USE module_damping_em, only: held_suarez_damp
  13. CONTAINS
  14. !------------------------------------------------------------------------
  15. SUBROUTINE rk_step_prep ( config_flags, rk_step, &
  16. u, v, w, t, ph, mu, &
  17. moist, &
  18. ru, rv, rw, ww, php, alt, &
  19. muu, muv, &
  20. mub, mut, phb, pb, p, al, alb, &
  21. cqu, cqv, cqw, &
  22. msfux, msfuy, &
  23. msfvx, msfvx_inv, msfvy, &
  24. msftx, msfty, &
  25. fnm, fnp, dnw, rdx, rdy, &
  26. n_moist, &
  27. ids, ide, jds, jde, kds, kde, &
  28. ims, ime, jms, jme, kms, kme, &
  29. its, ite, jts, jte, kts, kte )
  30. IMPLICIT NONE
  31. ! Input data.
  32. TYPE(grid_config_rec_type ) , INTENT(IN ) :: config_flags
  33. INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
  34. ims, ime, jms, jme, kms, kme, &
  35. its, ite, jts, jte, kts, kte
  36. INTEGER , INTENT(IN ) :: n_moist, rk_step
  37. REAL , INTENT(IN ) :: rdx, rdy
  38. REAL , DIMENSION( ims:ime , kms:kme, jms:jme ) , &
  39. INTENT(IN ) :: u, &
  40. v, &
  41. w, &
  42. t, &
  43. ph, &
  44. phb, &
  45. pb, &
  46. al, &
  47. alb
  48. REAL , DIMENSION( ims:ime , kms:kme , jms:jme ) , &
  49. INTENT( OUT) :: ru, &
  50. rv, &
  51. rw, &
  52. ww, &
  53. php, &
  54. cqu, &
  55. cqv, &
  56. cqw, &
  57. alt
  58. REAL , DIMENSION( ims:ime , kms:kme, jms:jme ) , &
  59. INTENT(IN ) :: p
  60. REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_moist ), INTENT( IN) :: &
  61. moist
  62. REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN ) :: msftx, &
  63. msfty, &
  64. msfux, &
  65. msfuy, &
  66. msfvx, &
  67. msfvx_inv, &
  68. msfvy, &
  69. mu, &
  70. mub
  71. REAL , DIMENSION( ims:ime , jms:jme ) , INTENT( OUT) :: muu, &
  72. muv, &
  73. mut
  74. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnm, fnp, dnw
  75. integer :: k
  76. !<DESCRIPTION>
  77. !
  78. ! rk_step_prep prepares a number of diagnostic quantities
  79. ! in preperation for a Runge-Kutta timestep. subroutines called
  80. ! by rk_step_prep calculate
  81. !
  82. ! (1) total column dry air mass (mut, call to calculate_full)
  83. !
  84. ! (2) total column dry air mass at u and v points
  85. ! (muu, muv, call to calculate_mu_uv)
  86. !
  87. ! (3) mass-coupled velocities for advection
  88. ! (ru, rv, and rw, call to couple_momentum)
  89. !
  90. ! (4) omega (call to calc_ww_cp)
  91. !
  92. ! (5) moisture coefficients (cqu, cqv, cqw, call to calc_cq)
  93. !
  94. ! (6) inverse density (alt, call to calc_alt)
  95. !
  96. ! (7) geopotential at pressure points (php, call to calc_php)
  97. !
  98. !</DESCRIPTION>
  99. CALL calculate_full( mut, mub, mu, &
  100. ids, ide, jds, jde, 1, 2, &
  101. ims, ime, jms, jme, 1, 1, &
  102. its, ite, jts, jte, 1, 1 )
  103. CALL calc_mu_uv ( config_flags, &
  104. mu, mub, muu, muv, &
  105. ids, ide, jds, jde, kds, kde, &
  106. ims, ime, jms, jme, kms, kme, &
  107. its, ite, jts, jte, kts, kte )
  108. CALL couple_momentum( muu, ru, u, msfuy, &
  109. muv, rv, v, msfvx, msfvx_inv, &
  110. mut, rw, w, msfty, &
  111. ids, ide, jds, jde, kds, kde, &
  112. ims, ime, jms, jme, kms, kme, &
  113. its, ite, jts, jte, kts, kte )
  114. ! new call, couples V with mu, also has correct map factors. WCS, 3 june 2001
  115. CALL calc_ww_cp ( u, v, mu, mub, ww, &
  116. rdx, rdy, msftx, msfty, &
  117. msfux, msfuy, msfvx, msfvx_inv, &
  118. msfvy, dnw, &
  119. ids, ide, jds, jde, kds, kde, &
  120. ims, ime, jms, jme, kms, kme, &
  121. its, ite, jts, jte, kts, kte )
  122. CALL calc_cq ( moist, cqu, cqv, cqw, n_moist, &
  123. ids, ide, jds, jde, kds, kde, &
  124. ims, ime, jms, jme, kms, kme, &
  125. its, ite, jts, jte, kts, kte )
  126. CALL calc_alt ( alt, al, alb, &
  127. ids, ide, jds, jde, kds, kde, &
  128. ims, ime, jms, jme, kms, kme, &
  129. its, ite, jts, jte, kts, kte )
  130. CALL calc_php ( php, ph, phb, &
  131. ids, ide, jds, jde, kds, kde, &
  132. ims, ime, jms, jme, kms, kme, &
  133. its, ite, jts, jte, kts, kte )
  134. END SUBROUTINE rk_step_prep
  135. !-------------------------------------------------------------------------------
  136. SUBROUTINE rk_tendency ( config_flags, rk_step, &
  137. ru_tend, rv_tend, rw_tend, ph_tend, t_tend, &
  138. ru_tendf, rv_tendf, rw_tendf, ph_tendf, t_tendf, &
  139. mu_tend, u_save, v_save, w_save, ph_save, &
  140. t_save, mu_save, RTHFTEN, &
  141. ru, rv, rw, ww, &
  142. u, v, w, t, ph, &
  143. u_old, v_old, w_old, t_old, ph_old, &
  144. h_diabatic, phb,t_init, &
  145. mu, mut, muu, muv, mub, &
  146. al, alt, p, pb, php, cqu, cqv, cqw, &
  147. u_base, v_base, t_base, qv_base, z_base, &
  148. msfux, msfuy, msfvx, msfvx_inv, &
  149. msfvy, msftx, msfty, &
  150. clat, f, e, sina, cosa, &
  151. fnm, fnp, rdn, rdnw, &
  152. dt, rdx, rdy, khdif, kvdif, xkmhd, xkhh, &
  153. diff_6th_opt, diff_6th_factor, &
  154. adv_opt, &
  155. dampcoef,zdamp,damp_opt,rad_nudge, &
  156. cf1, cf2, cf3, cfn, cfn1, n_moist, &
  157. non_hydrostatic, top_lid, &
  158. u_frame, v_frame, &
  159. ids, ide, jds, jde, kds, kde, &
  160. ims, ime, jms, jme, kms, kme, &
  161. its, ite, jts, jte, kts, kte, &
  162. max_vert_cfl, max_horiz_cfl)
  163. IMPLICIT NONE
  164. ! Input data.
  165. TYPE(grid_config_rec_type) , INTENT(IN ) :: config_flags
  166. INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
  167. ims, ime, jms, jme, kms, kme, &
  168. its, ite, jts, jte, kts, kte
  169. LOGICAL , INTENT(IN ) :: non_hydrostatic, top_lid
  170. INTEGER , INTENT(IN ) :: n_moist, rk_step
  171. REAL , DIMENSION( ims:ime , kms:kme, jms:jme ) , &
  172. INTENT(IN ) :: ru, &
  173. rv, &
  174. rw, &
  175. ww, &
  176. u, &
  177. v, &
  178. w, &
  179. t, &
  180. ph, &
  181. u_old, &
  182. v_old, &
  183. w_old, &
  184. t_old, &
  185. ph_old, &
  186. phb, &
  187. al, &
  188. alt, &
  189. p, &
  190. pb, &
  191. php, &
  192. cqu, &
  193. cqv, &
  194. t_init, &
  195. xkmhd, &
  196. xkhh, &
  197. h_diabatic
  198. REAL , DIMENSION( ims:ime , kms:kme, jms:jme ) , &
  199. INTENT(OUT ) :: ru_tend, &
  200. rv_tend, &
  201. rw_tend, &
  202. t_tend, &
  203. ph_tend, &
  204. RTHFTEN, &
  205. u_save, &
  206. v_save, &
  207. w_save, &
  208. ph_save, &
  209. t_save
  210. REAL , DIMENSION( ims:ime , kms:kme, jms:jme ) , &
  211. INTENT(INOUT) :: ru_tendf, &
  212. rv_tendf, &
  213. rw_tendf, &
  214. t_tendf, &
  215. ph_tendf, &
  216. cqw
  217. REAL , DIMENSION( ims:ime , jms:jme ) , INTENT( OUT) :: mu_tend, &
  218. mu_save
  219. REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN ) :: msfux, &
  220. msfuy, &
  221. msfvx, &
  222. msfvx_inv, &
  223. msfvy, &
  224. msftx, &
  225. msfty, &
  226. clat, &
  227. f, &
  228. e, &
  229. sina, &
  230. cosa, &
  231. mu, &
  232. mut, &
  233. mub, &
  234. muu, &
  235. muv
  236. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnm, &
  237. fnp, &
  238. rdn, &
  239. rdnw, &
  240. u_base, &
  241. v_base, &
  242. t_base, &
  243. qv_base, &
  244. z_base
  245. REAL , INTENT(IN ) :: rdx, &
  246. rdy, &
  247. dt, &
  248. u_frame, &
  249. v_frame, &
  250. khdif, &
  251. kvdif
  252. INTEGER, INTENT( IN ) :: diff_6th_opt
  253. REAL, INTENT( IN ) :: diff_6th_factor
  254. INTEGER, INTENT( IN ) :: adv_opt
  255. INTEGER, INTENT( IN ) :: damp_opt, rad_nudge
  256. REAL, INTENT( IN ) :: zdamp, dampcoef
  257. REAL, INTENT( OUT ) :: max_horiz_cfl
  258. REAL, INTENT( OUT ) :: max_vert_cfl
  259. REAL :: kdift, khdq, kvdq, cfn, cfn1, cf1, cf2, cf3
  260. INTEGER :: i,j,k
  261. INTEGER :: time_step
  262. !<DESCRIPTION>
  263. !
  264. ! rk_tendency computes the large-timestep tendency terms in the
  265. ! momentum, thermodynamic (theta), and geopotential equations.
  266. ! These terms include:
  267. !
  268. ! (1) advection (for u, v, w, theta - calls to advect_u, advect_v,
  269. ! advect_w, and advact_scalar).
  270. !
  271. ! (2) geopotential equation terms (advection and "gw" - call to rhs_ph).
  272. !
  273. ! (3) buoyancy term in vertical momentum equation (call to pg_buoy_w).
  274. !
  275. ! (4) Coriolis and curvature terms in u,v,w momentum equations
  276. ! (calls to subroutines coriolis, curvature)
  277. !
  278. ! (5) 3D diffusion on coordinate surfaces.
  279. !
  280. !</DESCRIPTION>
  281. CALL zero_tend ( ru_tend, &
  282. ids, ide, jds, jde, kds, kde, &
  283. ims, ime, jms, jme, kms, kme, &
  284. its, ite, jts, jte, kts, kte )
  285. CALL zero_tend ( rv_tend, &
  286. ids, ide, jds, jde, kds, kde, &
  287. ims, ime, jms, jme, kms, kme, &
  288. its, ite, jts, jte, kts, kte )
  289. CALL zero_tend ( rw_tend, &
  290. ids, ide, jds, jde, kds, kde, &
  291. ims, ime, jms, jme, kms, kme, &
  292. its, ite, jts, jte, kts, kte )
  293. CALL zero_tend ( t_tend, &
  294. ids, ide, jds, jde, kds, kde, &
  295. ims, ime, jms, jme, kms, kme, &
  296. its, ite, jts, jte, kts, kte )
  297. CALL zero_tend ( ph_tend, &
  298. ids, ide, jds, jde, kds, kde, &
  299. ims, ime, jms, jme, kms, kme, &
  300. its, ite, jts, jte, kts, kte )
  301. CALL zero_tend ( u_save, &
  302. ids, ide, jds, jde, kds, kde, &
  303. ims, ime, jms, jme, kms, kme, &
  304. its, ite, jts, jte, kts, kte )
  305. CALL zero_tend ( v_save, &
  306. ids, ide, jds, jde, kds, kde, &
  307. ims, ime, jms, jme, kms, kme, &
  308. its, ite, jts, jte, kts, kte )
  309. CALL zero_tend ( w_save, &
  310. ids, ide, jds, jde, kds, kde, &
  311. ims, ime, jms, jme, kms, kme, &
  312. its, ite, jts, jte, kts, kte )
  313. CALL zero_tend ( ph_save, &
  314. ids, ide, jds, jde, kds, kde, &
  315. ims, ime, jms, jme, kms, kme, &
  316. its, ite, jts, jte, kts, kte )
  317. CALL zero_tend ( t_save, &
  318. ids, ide, jds, jde, kds, kde, &
  319. ims, ime, jms, jme, kms, kme, &
  320. its, ite, jts, jte, kts, kte )
  321. CALL zero_tend ( mu_tend, &
  322. ids, ide, jds, jde, 1, 1, &
  323. ims, ime, jms, jme, 1, 1, &
  324. its, ite, jts, jte, 1, 1 )
  325. CALL zero_tend ( mu_save, &
  326. ids, ide, jds, jde, 1, 1, &
  327. ims, ime, jms, jme, 1, 1, &
  328. its, ite, jts, jte, 1, 1 )
  329. ! advection tendencies
  330. CALL nl_get_time_step ( 1, time_step )
  331. IF( (rk_step == 3) .and. ( adv_opt == WENO_MOM ) ) THEN
  332. CALL advect_weno_u ( u, u , ru_tend, ru, rv, ww, &
  333. mut, time_step, config_flags, &
  334. msfux, msfuy, msfvx, msfvy, &
  335. msftx, msfty, &
  336. fnm, fnp, rdx, rdy, rdnw, &
  337. ids, ide, jds, jde, kds, kde, &
  338. ims, ime, jms, jme, kms, kme, &
  339. its, ite, jts, jte, kts, kte )
  340. ELSE
  341. CALL advect_u ( u, u , ru_tend, ru, rv, ww, &
  342. mut, time_step, config_flags, &
  343. msfux, msfuy, msfvx, msfvy, &
  344. msftx, msfty, &
  345. fnm, fnp, rdx, rdy, rdnw, &
  346. ids, ide, jds, jde, kds, kde, &
  347. ims, ime, jms, jme, kms, kme, &
  348. its, ite, jts, jte, kts, kte )
  349. ENDIF
  350. IF( (rk_step == 3) .and. ( adv_opt == WENO_MOM ) ) THEN
  351. CALL advect_weno_v ( v, v , rv_tend, ru, rv, ww, &
  352. mut, time_step, config_flags, &
  353. msfux, msfuy, msfvx, msfvy, &
  354. msftx, msfty, &
  355. fnm, fnp, rdx, rdy, rdnw, &
  356. ids, ide, jds, jde, kds, kde, &
  357. ims, ime, jms, jme, kms, kme, &
  358. its, ite, jts, jte, kts, kte )
  359. ELSE
  360. CALL advect_v ( v, v , rv_tend, ru, rv, ww, &
  361. mut, time_step, config_flags, &
  362. msfux, msfuy, msfvx, msfvy, &
  363. msftx, msfty, &
  364. fnm, fnp, rdx, rdy, rdnw, &
  365. ids, ide, jds, jde, kds, kde, &
  366. ims, ime, jms, jme, kms, kme, &
  367. its, ite, jts, jte, kts, kte )
  368. ENDIF
  369. IF (non_hydrostatic) THEN
  370. IF( (rk_step == 3) .and. ( adv_opt == WENO_MOM ) ) THEN
  371. CALL advect_weno_w ( w, w, rw_tend, ru, rv, ww, &
  372. mut, time_step, config_flags, &
  373. msfux, msfuy, msfvx, msfvy, &
  374. msftx, msfty, &
  375. fnm, fnp, rdx, rdy, rdn, &
  376. ids, ide, jds, jde, kds, kde, &
  377. ims, ime, jms, jme, kms, kme, &
  378. its, ite, jts, jte, kts, kte )
  379. ELSE
  380. CALL advect_w ( w, w, rw_tend, ru, rv, ww, &
  381. mut, time_step, config_flags, &
  382. msfux, msfuy, msfvx, msfvy, &
  383. msftx, msfty, &
  384. fnm, fnp, rdx, rdy, rdn, &
  385. ids, ide, jds, jde, kds, kde, &
  386. ims, ime, jms, jme, kms, kme, &
  387. its, ite, jts, jte, kts, kte )
  388. ENDIF
  389. ENDIF
  390. ! theta flux divergence
  391. CALL advect_scalar ( t, t, t_tend, ru, rv, ww, &
  392. mut, time_step, config_flags, &
  393. msfux, msfuy, msfvx, msfvy, &
  394. msftx, msfty, fnm, fnp, &
  395. rdx, rdy, rdnw, &
  396. ids, ide, jds, jde, kds, kde, &
  397. ims, ime, jms, jme, kms, kme, &
  398. its, ite, jts, jte, kts, kte )
  399. IF ( config_flags%cu_physics == GDSCHEME .OR. &
  400. config_flags%cu_physics == G3SCHEME ) THEN
  401. ! theta advection only:
  402. CALL set_tend( RTHFTEN, t_tend, msfty, &
  403. ids, ide, jds, jde, kds, kde, &
  404. ims, ime, jms, jme, kms, kme, &
  405. its, ite, jts, jte, kts, kte )
  406. END IF
  407. CALL rhs_ph( ph_tend, u, v, ww, ph, ph, phb, w, &
  408. mut, muu, muv, &
  409. fnm, fnp, &
  410. rdnw, cfn, cfn1, rdx, rdy, &
  411. msfux, msfuy, msfvx, &
  412. msfvx_inv, msfvy, &
  413. msftx, msfty, &
  414. non_hydrostatic, &
  415. config_flags, &
  416. ids, ide, jds, jde, kds, kde, &
  417. ims, ime, jms, jme, kms, kme, &
  418. its, ite, jts, jte, kts, kte )
  419. CALL horizontal_pressure_gradient( ru_tend,rv_tend, &
  420. ph,alt,p,pb,al,php,cqu,cqv, &
  421. muu,muv,mu,fnm,fnp,rdnw, &
  422. cf1,cf2,cf3,rdx,rdy,msfux,msfuy,&
  423. msfvx,msfvy,msftx,msfty, &
  424. config_flags, non_hydrostatic, &
  425. top_lid, &
  426. ids, ide, jds, jde, kds, kde, &
  427. ims, ime, jms, jme, kms, kme, &
  428. its, ite, jts, jte, kts, kte )
  429. IF (non_hydrostatic) THEN
  430. CALL pg_buoy_w( rw_tend, p, cqw, mu, mub, &
  431. rdnw, rdn, g, msftx, msfty, &
  432. ids, ide, jds, jde, kds, kde, &
  433. ims, ime, jms, jme, kms, kme, &
  434. its, ite, jts, jte, kts, kte )
  435. ENDIF
  436. CALL w_damp ( rw_tend, max_vert_cfl, &
  437. max_horiz_cfl, &
  438. u, v, ww, w, mut, rdnw, &
  439. rdx, rdy, msfux, msfuy, msfvx, &
  440. msfvy, dt, config_flags, &
  441. ids, ide, jds, jde, kds, kde, &
  442. ims, ime, jms, jme, kms, kme, &
  443. its, ite, jts, jte, kts, kte )
  444. IF(config_flags%pert_coriolis) THEN
  445. CALL perturbation_coriolis ( ru, rv, rw, &
  446. ru_tend, rv_tend, rw_tend, &
  447. config_flags, &
  448. u_base, v_base, z_base, &
  449. muu, muv, phb, ph, &
  450. msftx, msfty, msfux, msfuy, &
  451. msfvx, msfvy, &
  452. f, e, sina, cosa, fnm, fnp, &
  453. ids, ide, jds, jde, kds, kde, &
  454. ims, ime, jms, jme, kms, kme, &
  455. its, ite, jts, jte, kts, kte )
  456. ELSE
  457. CALL coriolis ( ru, rv, rw, &
  458. ru_tend, rv_tend, rw_tend, &
  459. config_flags, &
  460. msftx, msfty, msfux, msfuy, &
  461. msfvx, msfvy, &
  462. f, e, sina, cosa, fnm, fnp, &
  463. ids, ide, jds, jde, kds, kde, &
  464. ims, ime, jms, jme, kms, kme, &
  465. its, ite, jts, jte, kts, kte )
  466. END IF
  467. CALL curvature ( ru, rv, rw, u, v, w, &
  468. ru_tend, rv_tend, rw_tend, &
  469. config_flags, &
  470. msfux, msfuy, msfvx, msfvy, &
  471. msftx, msfty, &
  472. clat, fnm, fnp, rdx, rdy, &
  473. ids, ide, jds, jde, kds, kde, &
  474. ims, ime, jms, jme, kms, kme, &
  475. its, ite, jts, jte, kts, kte )
  476. ! Damping option added for Held-Suarez test (also uses lw option HELDSUAREZ)
  477. IF (config_flags%ra_lw_physics == HELDSUAREZ) THEN
  478. CALL held_suarez_damp ( ru_tend, rv_tend, &
  479. ru,rv,p,pb, &
  480. ids, ide, jds, jde, kds, kde, &
  481. ims, ime, jms, jme, kms, kme, &
  482. its, ite, jts, jte, kts, kte )
  483. END IF
  484. !**************************************************************
  485. !
  486. ! Next, the terms that we integrate only with forward-in-time
  487. ! (evaluate with time t variables).
  488. !
  489. !**************************************************************
  490. forward_step: IF( rk_step == 1 ) THEN
  491. diff_opt1 : IF (config_flags%diff_opt .eq. 1) THEN
  492. CALL horizontal_diffusion ('u', u, ru_tendf, mut, config_flags, &
  493. msfux, msfuy, msfvx, msfvx_inv, &
  494. msfvy,msftx, msfty, &
  495. khdif, xkmhd, rdx, rdy, &
  496. ids, ide, jds, jde, kds, kde, &
  497. ims, ime, jms, jme, kms, kme, &
  498. its, ite, jts, jte, kts, kte )
  499. CALL horizontal_diffusion ('v', v, rv_tendf, mut, config_flags, &
  500. msfux, msfuy, msfvx, msfvx_inv, &
  501. msfvy,msftx, msfty, &
  502. khdif, xkmhd, rdx, rdy, &
  503. ids, ide, jds, jde, kds, kde, &
  504. ims, ime, jms, jme, kms, kme, &
  505. its, ite, jts, jte, kts, kte )
  506. CALL horizontal_diffusion ('w', w, rw_tendf, mut, config_flags, &
  507. msfux, msfuy, msfvx, msfvx_inv, &
  508. msfvy,msftx, msfty, &
  509. khdif, xkmhd, rdx, rdy, &
  510. ids, ide, jds, jde, kds, kde, &
  511. ims, ime, jms, jme, kms, kme, &
  512. its, ite, jts, jte, kts, kte )
  513. khdq = 3.*khdif
  514. CALL horizontal_diffusion_3dmp ( 'm', t, t_tendf, mut, &
  515. config_flags, t_init, &
  516. msfux, msfuy, msfvx, msfvx_inv, &
  517. msfvy, msftx, msfty, &
  518. khdq , xkhh, rdx, rdy, &
  519. ids, ide, jds, jde, kds, kde, &
  520. ims, ime, jms, jme, kms, kme, &
  521. its, ite, jts, jte, kts, kte )
  522. pbl_test : IF (config_flags%bl_pbl_physics .eq. 0) THEN
  523. CALL vertical_diffusion_u ( u, ru_tendf, config_flags, &
  524. u_base, &
  525. alt, muu, rdn, rdnw, kvdif, &
  526. ids, ide, jds, jde, kds, kde, &
  527. ims, ime, jms, jme, kms, kme, &
  528. its, ite, jts, jte, kts, kte )
  529. CALL vertical_diffusion_v ( v, rv_tendf, config_flags, &
  530. v_base, &
  531. alt, muv, rdn, rdnw, kvdif, &
  532. ids, ide, jds, jde, kds, kde, &
  533. ims, ime, jms, jme, kms, kme, &
  534. its, ite, jts, jte, kts, kte )
  535. IF (non_hydrostatic) &
  536. CALL vertical_diffusion ( 'w', w, rw_tendf, config_flags, &
  537. alt, mut, rdn, rdnw, kvdif, &
  538. ids, ide, jds, jde, kds, kde, &
  539. ims, ime, jms, jme, kms, kme, &
  540. its, ite, jts, jte, kts, kte )
  541. kvdq = 3.*kvdif
  542. CALL vertical_diffusion_3dmp ( t, t_tendf, config_flags, t_init, &
  543. alt, mut, rdn, rdnw, kvdq , &
  544. ids, ide, jds, jde, kds, kde, &
  545. ims, ime, jms, jme, kms, kme, &
  546. its, ite, jts, jte, kts, kte )
  547. ENDIF pbl_test
  548. ! Theta tendency computations.
  549. END IF diff_opt1
  550. IF ( diff_6th_opt .NE. 0 ) THEN
  551. CALL sixth_order_diffusion( 'u', u, ru_tendf, mut, dt, &
  552. config_flags, &
  553. diff_6th_opt, diff_6th_factor, &
  554. ids, ide, jds, jde, kds, kde, &
  555. ims, ime, jms, jme, kms, kme, &
  556. its, ite, jts, jte, kts, kte )
  557. CALL sixth_order_diffusion( 'v', v, rv_tendf, mut, dt, &
  558. config_flags, &
  559. diff_6th_opt, diff_6th_factor, &
  560. ids, ide, jds, jde, kds, kde, &
  561. ims, ime, jms, jme, kms, kme, &
  562. its, ite, jts, jte, kts, kte )
  563. IF (non_hydrostatic) &
  564. CALL sixth_order_diffusion( 'w', w, rw_tendf, mut, dt, &
  565. config_flags, &
  566. diff_6th_opt, diff_6th_factor, &
  567. ids, ide, jds, jde, kds, kde, &
  568. ims, ime, jms, jme, kms, kme, &
  569. its, ite, jts, jte, kts, kte )
  570. CALL sixth_order_diffusion( 'm', t, t_tendf, mut, dt, &
  571. config_flags, &
  572. diff_6th_opt, diff_6th_factor, &
  573. ids, ide, jds, jde, kds, kde, &
  574. ims, ime, jms, jme, kms, kme, &
  575. its, ite, jts, jte, kts, kte )
  576. ENDIF
  577. IF( damp_opt .eq. 2 ) &
  578. CALL rk_rayleigh_damp( ru_tendf, rv_tendf, &
  579. rw_tendf, t_tendf, &
  580. u, v, w, t, t_init, &
  581. mut, muu, muv, ph, phb, &
  582. u_base, v_base, t_base, z_base, &
  583. dampcoef, zdamp, &
  584. ids, ide, jds, jde, kds, kde, &
  585. ims, ime, jms, jme, kms, kme, &
  586. its, ite, jts, jte, kts, kte )
  587. IF( rad_nudge .eq. 1 ) &
  588. CALL theta_relaxation( t_tendf, t, t_init, &
  589. mut, ph, phb, &
  590. t_base, z_base, &
  591. ids, ide, jds, jde, kds, kde, &
  592. ims, ime, jms, jme, kms, kme, &
  593. its, ite, jts, jte, kts, kte )
  594. END IF forward_step
  595. END SUBROUTINE rk_tendency
  596. !-------------------------------------------------------------------------------
  597. SUBROUTINE rk_addtend_dry ( ru_tend, rv_tend, rw_tend, ph_tend, t_tend, &
  598. ru_tendf, rv_tendf, rw_tendf, ph_tendf, t_tendf, &
  599. u_save, v_save, w_save, ph_save, t_save, &
  600. mu_tend, mu_tendf, rk_step, &
  601. h_diabatic, mut, msftx, msfty, msfux, msfuy, &
  602. msfvx, msfvx_inv, msfvy, &
  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. IMPLICIT NONE
  608. ! Input data.
  609. INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
  610. ims, ime, jms, jme, kms, kme, &
  611. ips, ipe, jps, jpe, kps, kpe, &
  612. its, ite, jts, jte, kts, kte
  613. INTEGER , INTENT(IN ) :: rk_step
  614. REAL , DIMENSION( ims:ime , kms:kme, jms:jme ) , INTENT(INOUT) :: ru_tend, &
  615. rv_tend, &
  616. rw_tend, &
  617. ph_tend, &
  618. t_tend, &
  619. ru_tendf, &
  620. rv_tendf, &
  621. rw_tendf, &
  622. ph_tendf, &
  623. t_tendf
  624. REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(INOUT) :: mu_tend, &
  625. mu_tendf
  626. REAL , DIMENSION( ims:ime , kms:kme, jms:jme ) , INTENT(IN ) :: u_save, &
  627. v_save, &
  628. w_save, &
  629. ph_save, &
  630. t_save, &
  631. h_diabatic
  632. REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN ) :: mut, &
  633. msftx, &
  634. msfty, &
  635. msfux, &
  636. msfuy, &
  637. msfvx, &
  638. msfvx_inv, &
  639. msfvy
  640. ! Local
  641. INTEGER :: i, j, k
  642. !<DESCRIPTION>
  643. !
  644. ! rk_addtend_dry constructs the full large-timestep tendency terms for
  645. ! momentum (u,v,w), theta and geopotential equations. This is accomplished
  646. ! by combining the physics tendencies (in *tendf; these are computed
  647. ! the first RK substep, held fixed thereafter) with the RK tendencies
  648. ! (in *tend, these include advection, pressure gradient, etc;
  649. ! these change each rk substep). Output is in *tend.
  650. !
  651. !</DESCRIPTION>
  652. ! Finally, add the forward-step tendency to the rk_tendency
  653. ! u/v/w/save contain bc tendency that needs to be multiplied by msf
  654. ! (u by msfuy, v by msfvx)
  655. ! before adding it to physics tendency (*tendf)
  656. ! For momentum we need the final tendency to include an inverse msf
  657. ! physics/bc tendency needs to be divided, advection tendency already has it
  658. ! For scalars we need the final tendency to include an inverse msf (msfty)
  659. ! advection tendency is OK, physics/bc tendency needs to be divided by msf
  660. DO j = jts,MIN(jte,jde-1)
  661. DO k = kts,kte-1
  662. DO i = its,ite
  663. ! multiply by my to uncouple u
  664. IF(rk_step == 1)ru_tendf(i,k,j) = ru_tendf(i,k,j) + u_save(i,k,j)*msfuy(i,j)
  665. ! divide by my to couple u
  666. ru_tend(i,k,j) = ru_tend(i,k,j) + ru_tendf(i,k,j)/msfuy(i,j)
  667. ENDDO
  668. ENDDO
  669. ENDDO
  670. DO j = jts,jte
  671. DO k = kts,kte-1
  672. DO i = its,MIN(ite,ide-1)
  673. ! multiply by mx to uncouple v
  674. IF(rk_step == 1)rv_tendf(i,k,j) = rv_tendf(i,k,j) + v_save(i,k,j)*msfvx(i,j)
  675. ! divide by mx to couple v
  676. rv_tend(i,k,j) = rv_tend(i,k,j) + rv_tendf(i,k,j)*msfvx_inv(i,j)
  677. ENDDO
  678. ENDDO
  679. ENDDO
  680. DO j = jts,MIN(jte,jde-1)
  681. DO k = kts,kte
  682. DO i = its,MIN(ite,ide-1)
  683. ! multiply by my to uncouple w
  684. IF(rk_step == 1)rw_tendf(i,k,j) = rw_tendf(i,k,j) + w_save(i,k,j)*msfty(i,j)
  685. ! divide by my to couple w
  686. rw_tend(i,k,j) = rw_tend(i,k,j) + rw_tendf(i,k,j)/msfty(i,j)
  687. IF(rk_step == 1)ph_tendf(i,k,j) = ph_tendf(i,k,j) + ph_save(i,k,j)
  688. ! divide by my to couple scalar
  689. ph_tend(i,k,j) = ph_tend(i,k,j) + ph_tendf(i,k,j)/msfty(i,j)
  690. ENDDO
  691. ENDDO
  692. ENDDO
  693. DO j = jts,MIN(jte,jde-1)
  694. DO k = kts,kte-1
  695. DO i = its,MIN(ite,ide-1)
  696. IF(rk_step == 1)t_tendf(i,k,j) = t_tendf(i,k,j) + t_save(i,k,j)
  697. ! divide by my to couple theta
  698. t_tend(i,k,j) = t_tend(i,k,j) + t_tendf(i,k,j)/msfty(i,j) &
  699. + mut(i,j)*h_diabatic(i,k,j)/msfty(i,j)
  700. ! divide by my to couple heating
  701. ENDDO
  702. ENDDO
  703. ENDDO
  704. DO j = jts,MIN(jte,jde-1)
  705. DO i = its,MIN(ite,ide-1)
  706. ! mu tendencies not coupled with 1/msf
  707. mu_tend(i,j) = mu_tend(i,j) + mu_tendf(i,j)
  708. ENDDO
  709. ENDDO
  710. END SUBROUTINE rk_addtend_dry
  711. !-------------------------------------------------------------------------------
  712. SUBROUTINE rk_scalar_tend ( scs, sce, config_flags, &
  713. tenddec, &
  714. rk_step, dt, &
  715. ru, rv, ww, mut, mub, mu_old, &
  716. alt, &
  717. scalar_old, scalar, &
  718. scalar_tends, advect_tend, &
  719. h_tendency, z_tendency, &
  720. RQVFTEN, &
  721. base, moist_step, fnm, fnp, &
  722. msfux, msfuy, msfvx, msfvx_inv, &
  723. msfvy, msftx, msfty, &
  724. rdx, rdy, rdn, rdnw, &
  725. khdif, kvdif, xkmhd, &
  726. diff_6th_opt, diff_6th_factor, &
  727. adv_opt, &
  728. ids, ide, jds, jde, kds, kde, &
  729. ims, ime, jms, jme, kms, kme, &
  730. its, ite, jts, jte, kts, kte )
  731. IMPLICIT NONE
  732. ! Input data.
  733. TYPE(grid_config_rec_type ) , INTENT(IN ) :: config_flags
  734. LOGICAL , INTENT(IN ) :: tenddec ! tendency term
  735. INTEGER , INTENT(IN ) :: rk_step, scs, sce
  736. INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
  737. ims, ime, jms, jme, kms, kme, &
  738. its, ite, jts, jte, kts, kte
  739. LOGICAL , INTENT(IN ) :: moist_step
  740. REAL, DIMENSION(ims:ime, kms:kme, jms:jme , scs:sce ), &
  741. INTENT(IN ) :: scalar, scalar_old
  742. REAL, DIMENSION(ims:ime, kms:kme, jms:jme , scs:sce ), &
  743. INTENT(INOUT) :: scalar_tends
  744. REAL, DIMENSION(ims:ime, kms:kme, jms:jme ), INTENT(INOUT) :: advect_tend
  745. REAL, DIMENSION(ims:ime, kms:kme, jms:jme ), INTENT( OUT) :: h_tendency, z_tendency
  746. REAL, DIMENSION(ims:ime, kms:kme, jms:jme ), INTENT(OUT ) :: RQVFTEN
  747. REAL, DIMENSION(ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: ru, &
  748. rv, &
  749. ww, &
  750. xkmhd, &
  751. alt
  752. REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnm, &
  753. fnp, &
  754. rdn, &
  755. rdnw, &
  756. base
  757. REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN ) :: msfux, &
  758. msfuy, &
  759. msfvx, &
  760. msfvx_inv, &
  761. msfvy, &
  762. msftx, &
  763. msfty, &
  764. mub, &
  765. mut, &
  766. mu_old
  767. REAL , INTENT(IN ) :: rdx, &
  768. rdy, &
  769. khdif, &
  770. kvdif
  771. INTEGER, INTENT( IN ) :: diff_6th_opt
  772. REAL, INTENT( IN ) :: diff_6th_factor
  773. REAL , INTENT(IN ) :: dt
  774. INTEGER, INTENT(IN ) :: adv_opt
  775. ! Local data
  776. INTEGER :: im, i,j,k
  777. INTEGER :: time_step
  778. REAL :: khdq, kvdq, tendency
  779. !<DESCRIPTION>
  780. !
  781. ! rk_scalar_tend calls routines that computes scalar tendency from advection
  782. ! and 3D mixing (TKE or fixed eddy viscosities).
  783. !
  784. !</DESCRIPTION>
  785. khdq = khdif/prandtl
  786. kvdq = kvdif/prandtl
  787. scalar_loop : DO im = scs, sce
  788. CALL zero_tend ( advect_tend(ims,kms,jms), &
  789. ids, ide, jds, jde, kds, kde, &
  790. ims, ime, jms, jme, kms, kme, &
  791. its, ite, jts, jte, kts, kte )
  792. CALL zero_tend ( h_tendency(ims,kms,jms), &
  793. ids, ide, jds, jde, kds, kde, &
  794. ims, ime, jms, jme, kms, kme, &
  795. its, ite, jts, jte, kts, kte )
  796. CALL zero_tend ( z_tendency(ims,kms,jms), &
  797. ids, ide, jds, jde, kds, kde, &
  798. ims, ime, jms, jme, kms, kme, &
  799. its, ite, jts, jte, kts, kte )
  800. CALL nl_get_time_step ( 1, time_step )
  801. IF( (rk_step == 3) .and. (adv_opt == POSITIVEDEF) ) THEN
  802. CALL advect_scalar_pd ( scalar(ims,kms,jms,im), &
  803. scalar_old(ims,kms,jms,im), &
  804. advect_tend(ims,kms,jms), &
  805. h_tendency(ims,kms,jms), &
  806. z_tendency(ims,kms,jms), &
  807. ru, rv, ww, mut, mub, mu_old, &
  808. time_step, config_flags, tenddec, &
  809. msfux, msfuy, msfvx, msfvy, &
  810. msftx, msfty, fnm, fnp, &
  811. rdx, rdy, rdnw,dt, &
  812. ids, ide, jds, jde, kds, kde, &
  813. ims, ime, jms, jme, kms, kme, &
  814. its, ite, jts, jte, kts, kte )
  815. ELSE IF( (rk_step == 3) .and. (adv_opt == MONOTONIC) ) THEN
  816. CALL advect_scalar_mono ( scalar(ims,kms,jms,im), &
  817. scalar_old(ims,kms,jms,im), &
  818. advect_tend(ims,kms,jms), &
  819. h_tendency(ims,kms,jms), &
  820. z_tendency(ims,kms,jms), &
  821. ru, rv, ww, mut, mub, mu_old, &
  822. config_flags, tenddec, &
  823. msfux, msfuy, msfvx, msfvy, &
  824. msftx, msfty, fnm, fnp, &
  825. rdx, rdy, rdnw,dt, &
  826. ids, ide, jds, jde, kds, kde, &
  827. ims, ime, jms, jme, kms, kme, &
  828. its, ite, jts, jte, kts, kte )
  829. ELSE IF( (rk_step == 3) .and. (adv_opt == WENO_SCALAR) ) THEN
  830. CALL advect_scalar_weno ( scalar(ims,kms,jms,im), &
  831. scalar(ims,kms,jms,im), &
  832. advect_tend(ims,kms,jms), &
  833. ru, rv, ww, mut, time_step, &
  834. config_flags, &
  835. msfux, msfuy, msfvx, msfvy, &
  836. msftx, msfty, fnm, fnp, &
  837. rdx, rdy, rdnw, &
  838. ids, ide, jds, jde, kds, kde, &
  839. ims, ime, jms, jme, kms, kme, &
  840. its, ite, jts, jte, kts, kte )
  841. ELSEIF( (rk_step == 3) .and. (adv_opt == WENOPD_SCALAR) ) THEN
  842. CALL advect_scalar_wenopd ( scalar(ims,kms,jms,im), &
  843. scalar_old(ims,kms,jms,im), &
  844. advect_tend(ims,kms,jms), &
  845. ru, rv, ww, mut, mub, mu_old, &
  846. time_step, config_flags, &
  847. msfux, msfuy, msfvx, msfvy, &
  848. msftx, msfty, fnm, fnp, &
  849. rdx, rdy, rdnw,dt, &
  850. ids, ide, jds, jde, kds, kde, &
  851. ims, ime, jms, jme, kms, kme, &
  852. its, ite, jts, jte, kts, kte )
  853. ELSE
  854. CALL advect_scalar ( scalar(ims,kms,jms,im), &
  855. scalar(ims,kms,jms,im), &
  856. advect_tend(ims,kms,jms), &
  857. ru, rv, ww, mut, time_step, &
  858. config_flags, &
  859. msfux, msfuy, msfvx, msfvy, &
  860. msftx, msfty, fnm, fnp, &
  861. rdx, rdy, rdnw, &
  862. ids, ide, jds, jde, kds, kde, &
  863. ims, ime, jms, jme, kms, kme, &
  864. its, ite, jts, jte, kts, kte )
  865. END IF
  866. IF((config_flags%cu_physics == GDSCHEME .OR. config_flags%cu_physics == G3SCHEME .OR. &
  867. config_flags%cu_physics == KFETASCHEME .OR. & ! new trigger in KF
  868. config_flags%cu_physics == TIEDTKESCHEME ) & ! Tiedtke
  869. .and. moist_step .and. ( im == P_QV) ) THEN
  870. CALL set_tend( RQVFTEN, advect_tend, msfty, &
  871. ids, ide, jds, jde, kds, kde, &
  872. ims, ime, jms, jme, kms, kme, &
  873. its, ite, jts, jte, kts, kte )
  874. ENDIF
  875. rk_step_1: IF( rk_step == 1 ) THEN
  876. diff_opt1 : IF (config_flags%diff_opt .eq. 1) THEN
  877. CALL horizontal_diffusion ( 'm', scalar(ims,kms,jms,im), &
  878. scalar_tends(ims,kms,jms,im), mut, &
  879. config_flags, &
  880. msfux, msfuy, msfvx, msfvx_inv, &
  881. msfvy, msftx, msfty, &
  882. khdq , xkmhd, rdx, rdy, &
  883. ids, ide, jds, jde, kds, kde, &
  884. ims, ime, jms, jme, kms, kme, &
  885. its, ite, jts, jte, kts, kte )
  886. pbl_test : IF (config_flags%bl_pbl_physics .eq. 0) THEN
  887. IF( (moist_step) .and. ( im == P_QV)) THEN
  888. CALL vertical_diffusion_mp ( scalar(ims,kms,jms,im), &
  889. scalar_tends(ims,kms,jms,im), &
  890. config_flags, base, &
  891. alt, mut, rdn, rdnw, kvdq , &
  892. ids, ide, jds, jde, kds, kde, &
  893. ims, ime, jms, jme, kms, kme, &
  894. its, ite, jts, jte, kts, kte )
  895. ELSE
  896. CALL vertical_diffusion ( 'm', scalar(ims,kms,jms,im), &
  897. scalar_tends(ims,kms,jms,im), &
  898. config_flags, &
  899. alt, mut, rdn, rdnw, kvdq, &
  900. ids, ide, jds, jde, kds, kde, &
  901. ims, ime, jms, jme, kms, kme, &
  902. its, ite, jts, jte, kts, kte )
  903. END IF
  904. ENDIF pbl_test
  905. ENDIF diff_opt1
  906. IF ( diff_6th_opt .NE. 0 ) &
  907. CALL sixth_order_diffusion( 'm', scalar(ims,kms,jms,im), &
  908. scalar_tends(ims,kms,jms,im), &
  909. mut, dt, config_flags, &
  910. diff_6th_opt, diff_6th_factor, &
  911. ids, ide, jds, jde, kds, kde, &
  912. ims, ime, jms, jme, kms, kme, &
  913. its, ite, jts, jte, kts, kte )
  914. ENDIF rk_step_1
  915. END DO scalar_loop
  916. END SUBROUTINE rk_scalar_tend
  917. !-------------------------------------------------------------------------------
  918. SUBROUTINE rk_update_scalar( scs, sce, &
  919. scalar_1, scalar_2, sc_tend, &
  920. advh_t, advz_t, &
  921. advect_tend, &
  922. h_tendency, z_tendency, &
  923. msftx, msfty, &
  924. mu_old, mu_new, mu_base, &
  925. rk_step, dt, spec_zone, &
  926. config_flags, &
  927. tenddec, &
  928. ids, ide, jds, jde, kds, kde, &
  929. ims, ime, jms, jme, kms, kme, &
  930. its, ite, jts, jte, kts, kte )
  931. IMPLICIT NONE
  932. ! Input data.
  933. TYPE(grid_config_rec_type ) , INTENT(IN ) :: config_flags
  934. LOGICAL , INTENT(IN ) :: tenddec
  935. INTEGER , INTENT(IN ) :: scs, sce, rk_step, spec_zone
  936. INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
  937. ims, ime, jms, jme, kms, kme, &
  938. its, ite, jts, jte, kts, kte
  939. REAL, INTENT(IN ) :: dt
  940. REAL, DIMENSION(ims:ime, kms:kme, jms:jme , scs:sce), &
  941. INTENT(INOUT) :: scalar_1, &
  942. scalar_2
  943. REAL, DIMENSION(ims:ime, kms:kme, jms:jme , scs:sce), &
  944. INTENT(IN) :: sc_tend
  945. REAL, DIMENSION(ims:ime, kms:kme, jms:jme ), &
  946. INTENT(IN) :: advect_tend
  947. REAL, DIMENSION(ims:ime, kms:kme, jms:jme ), INTENT(INOUT) , OPTIONAL :: advh_t, advz_t ! accumulating for output
  948. REAL, DIMENSION(ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: h_tendency, z_tendency ! from rk_scalar_tend
  949. REAL, DIMENSION(ims:ime, jms:jme ), INTENT(IN ) :: mu_old, &
  950. mu_new, &
  951. mu_base, &
  952. msftx, &
  953. msfty
  954. INTEGER :: i,j,k,im
  955. REAL :: sc_middle, msfsq
  956. REAL, DIMENSION(its:ite) :: muold, r_munew
  957. REAL, DIMENSION(its:ite, kts:kte, jts:jte ) :: tendency
  958. INTEGER :: i_start,i_end,j_start,j_end,k_start,k_end
  959. INTEGER :: i_start_spc,i_end_spc,j_start_spc,j_end_spc,k_start_spc,k_end_spc
  960. !<DESCRIPTION>
  961. !
  962. ! rk_scalar_update advances the scalar equation given the time t value
  963. ! of the scalar and the scalar tendency.
  964. !
  965. !</DESCRIPTION>
  966. !
  967. ! set loop limits.
  968. i_start = its
  969. i_end = min(ite,ide-1)
  970. j_start = jts
  971. j_end = min(jte,jde-1)
  972. k_start = kts
  973. k_end = kte-1
  974. i_start_spc = i_start
  975. i_end_spc = i_end
  976. j_start_spc = j_start
  977. j_end_spc = j_end
  978. k_start_spc = k_start
  979. k_end_spc = k_end
  980. IF( config_flags%nested .or. config_flags%specified ) THEN
  981. IF( .NOT. config_flags%periodic_x)i_start = max( its,ids+spec_zone )
  982. IF( .NOT. config_flags%periodic_x)i_end = min( ite,ide-spec_zone-1 )
  983. j_start = max( jts,jds+spec_zone )
  984. j_end = min( jte,jde-spec_zone-1 )
  985. k_start = kts
  986. k_end = min( kte, kde-1 )
  987. ENDIF
  988. IF ( rk_step == 1 ) THEN
  989. ! replace t-dt values (in scalar_1) with t values scalar_2,
  990. ! then compute new values by adding tendency to values at t
  991. DO im = scs,sce
  992. DO j = jts, min(jte,jde-1)
  993. DO k = kts, min(kte,kde-1)
  994. DO i = its, min(ite,ide-1)
  995. tendency(i,k,j) = 0.
  996. ENDDO
  997. ENDDO
  998. ENDDO
  999. DO j = j_start,j_end
  1000. DO k = k_start,k_end
  1001. DO i = i_start,i_end
  1002. ! scalar was coupled with my
  1003. tendency(i,k,j) = advect_tend(i,k,j) * msfty(i,j)
  1004. ENDDO
  1005. ENDDO
  1006. ENDDO
  1007. DO j = j_start_spc,j_end_spc
  1008. DO k = k_start_spc,k_end_spc
  1009. DO i = i_start_spc,i_end_spc
  1010. tendency(i,k,j) = tendency(i,k,j) + sc_tend(i,k,j,im)
  1011. ENDDO
  1012. ENDDO
  1013. ENDDO
  1014. DO j = jts, min(jte,jde-1)
  1015. DO i = its, min(ite,ide-1)
  1016. muold(i) = mu_old(i,j) + mu_base(i,j)
  1017. r_munew(i) = 1./(mu_new(i,j) + mu_base(i,j))
  1018. ENDDO
  1019. DO k = kts, min(kte,kde-1)
  1020. DO i = its, min(ite,ide-1)
  1021. scalar_1(i,k,j,im) = scalar_2(i,k,j,im)
  1022. scalar_2(i,k,j,im) = (muold(i)*scalar_1(i,k,j,im) &
  1023. + dt*tendency(i,k,j))*r_munew(i)
  1024. ENDDO
  1025. ENDDO
  1026. ENDDO
  1027. ENDDO
  1028. ELSE
  1029. ! just compute new values, scalar_1 already at time t.
  1030. DO im = scs, sce
  1031. DO j = jts, min(jte,jde-1)
  1032. DO k = kts, min(kte,kde-1)
  1033. DO i = its, min(ite,ide-1)
  1034. tendency(i,k,j) = 0.
  1035. ENDDO
  1036. ENDDO
  1037. ENDDO
  1038. DO j = j_start,j_end
  1039. DO k = k_start,k_end
  1040. DO i = i_start,i_end
  1041. ! scalar was coupled with my
  1042. tendency(i,k,j) = advect_tend(i,k,j) * msfty(i,j)
  1043. ENDDO
  1044. ENDDO
  1045. ENDDO
  1046. DO j = j_start_spc,j_end_spc
  1047. DO k = k_start_spc,k_end_spc
  1048. DO i = i_start_spc,i_end_spc
  1049. tendency(i,k,j) = tendency(i,k,j) + sc_tend(i,k,j,im)
  1050. ENDDO
  1051. ENDDO
  1052. ENDDO
  1053. DO j = jts, min(jte,jde-1)
  1054. DO i = its, min(ite,ide-1)
  1055. muold(i) = mu_old(i,j) + mu_base(i,j)
  1056. r_munew(i) = 1./(mu_new(i,j) + mu_base(i,j))
  1057. ENDDO
  1058. DO k = kts, min(kte,kde-1)
  1059. DO i = its, min(ite,ide-1)
  1060. scalar_2(i,k,j,im) = (muold(i)*scalar_1(i,k,j,im) &
  1061. + dt*tendency(i,k,j))*r_munew(i)
  1062. ENDDO
  1063. ENDDO
  1064. ! This is separated from the k/i-loop above for better performance
  1065. IF ( PRESENT(advh_t) .AND. PRESENT(advz_t) ) THEN
  1066. IF(tenddec.and.rk_step.eq.config_flags%rk_ord) THEN
  1067. DO k = kts, min(kte,kde-1)
  1068. DO i = its, min(ite,ide-1)
  1069. advh_t(i,k,j) = advh_t(i,k,j) + (dt*h_tendency(i,k,j)* msfty(i,j))*r_munew(i)
  1070. advz_t(i,k,j) = advz_t(i,k,j) + (dt*z_tendency(i,k,j)* msfty(i,j))*r_munew(i)
  1071. ENDDO
  1072. ENDDO
  1073. END IF
  1074. END IF
  1075. ENDDO
  1076. ENDDO
  1077. END IF
  1078. END SUBROUTINE rk_update_scalar
  1079. !-------------------------------------------------------------------------------
  1080. SUBROUTINE rk_update_scalar_pd( scs, sce, &
  1081. scalar, sc_tend, &
  1082. mu_old, mu_new, mu_base, &
  1083. rk_step, dt, spec_zone, &
  1084. config_flags, &
  1085. ids, ide, jds, jde, kds, kde, &
  1086. ims, ime, jms, jme, kms, kme, &
  1087. its, ite, jts, jte, kts, kte )
  1088. IMPLICIT NONE
  1089. ! Input data.
  1090. TYPE(grid_config_rec_type ) , INTENT(IN ) :: config_flags
  1091. INTEGER , INTENT(IN ) :: scs, sce, rk_step, spec_zone
  1092. INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
  1093. ims, ime, jms, jme, kms, kme, &
  1094. its, ite, jts, jte, kts, kte
  1095. REAL, INTENT(IN ) :: dt
  1096. REAL, DIMENSION(ims:ime, kms:kme, jms:jme , scs:sce), &
  1097. INTENT(INOUT) :: scalar, &
  1098. sc_tend
  1099. REAL, DIMENSION(ims:ime, jms:jme ), INTENT(IN ) :: mu_old, &
  1100. mu_new, &
  1101. mu_base
  1102. INTEGER :: i,j,k,im
  1103. REAL :: sc_middle, msfsq
  1104. REAL, DIMENSION(its:ite) :: muold, r_munew
  1105. REAL, DIMENSION(its:ite, kts:kte, jts:jte ) :: tendency
  1106. INTEGER :: i_start,i_end,j_start,j_end,k_start,k_end
  1107. INTEGER :: i_start_spc,i_end_spc,j_start_spc,j_end_spc,k_start_spc,k_end_spc
  1108. !<DESCRIPTION>
  1109. !
  1110. ! rk_scalar_update advances the scalar equation given the time t value
  1111. ! of the scalar and the scalar tendency.
  1112. !
  1113. !</DESCRIPTION>
  1114. !
  1115. ! set loop limits.
  1116. i_start = its
  1117. i_end = min(ite,ide-1)
  1118. j_start = jts
  1119. j_end = min(jte,jde-1)
  1120. k_start = kts
  1121. k_end = kte-1
  1122. i_start_spc = i_start
  1123. i_end_spc = i_end
  1124. j_start_spc = j_start
  1125. j_end_spc = j_end
  1126. k_start_spc = k_start
  1127. k_end_spc = k_end
  1128. IF( config_flags%nested .or. config_flags%specified ) THEN
  1129. IF( .NOT. config_flags%periodic_x)i_start = max( its,ids+spec_zone )
  1130. IF( .NOT. config_flags%periodic_x)i_end = min( ite,ide-spec_zone-1 )
  1131. j_start = max( jts,jds+spec_zone )
  1132. j_end = min( jte,jde-spec_zone-1 )
  1133. k_start = kts
  1134. k_end = min( kte, kde-1 )
  1135. ENDIF
  1136. DO im = scs, sce
  1137. DO j = jts, min(jte,jde-1)
  1138. DO k = kts, min(kte,kde-1)
  1139. DO i = its, min(ite,ide-1)
  1140. tendency(i,k,j) = 0.
  1141. ENDDO
  1142. ENDDO
  1143. ENDDO
  1144. DO j = j_start_spc,j_end_spc
  1145. DO k = k_start_spc,k_end_spc
  1146. DO i = i_start_spc,i_end_spc
  1147. tendency(i,k,j) = tendency(i,k,j) + sc_tend(i,k,j,im)
  1148. sc_tend(i,k,j,im) = 0.
  1149. ENDDO
  1150. ENDDO
  1151. ENDDO
  1152. DO j = jts, min(jte,jde-1)
  1153. DO i = its, min(ite,ide-1)
  1154. muold(i) = mu_old(i,j) + mu_base(i,j)
  1155. r_munew(i) = 1./(mu_new(i,j) + mu_base(i,j))
  1156. ENDDO
  1157. DO k = kts, min(kte,kde-1)
  1158. DO i = its, min(ite,ide-1)
  1159. scalar(i,k,j,im) = (muold(i)*scalar(i,k,j,im) &
  1160. + dt*tendency(i,k,j))*r_munew(i)
  1161. ENDDO
  1162. ENDDO
  1163. ENDDO
  1164. ENDDO
  1165. END SUBROUTINE rk_update_scalar_pd
  1166. !------------------------------------------------------------
  1167. SUBROUTINE init_zero_tendency(ru_tendf, rv_tendf, rw_tendf, ph_tendf, &
  1168. t_tendf, tke_tendf, mu_tendf, &
  1169. moist_tendf,chem_tendf,scalar_tendf, &
  1170. tracer_tendf,n_tracer, &
  1171. n_moist,n_chem,n_scalar,rk_step, &
  1172. ids, ide, jds, jde, kds, kde, &
  1173. ims, ime, jms, jme, kms, kme, &
  1174. its, ite, jts, jte, kts, kte )
  1175. !-----------------------------------------------------------------------
  1176. IMPLICIT NONE
  1177. !-----------------------------------------------------------------------
  1178. INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
  1179. ims, ime, jms, jme, kms, kme, &
  1180. its, ite, jts, jte, kts, kte
  1181. INTEGER , INTENT(IN ) :: n_moist,n_chem,n_scalar,n_tracer,rk_step
  1182. REAL , DIMENSION( ims:ime , kms:kme, jms:jme ) , INTENT(INOUT) :: &
  1183. ru_tendf, &
  1184. rv_tendf, &
  1185. rw_tendf, &
  1186. ph_tendf, &
  1187. t_tendf, &
  1188. tke_tendf
  1189. REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(INOUT) :: mu_tendf
  1190. REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_moist),INTENT(INOUT)::&
  1191. moist_tendf
  1192. REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_chem ),INTENT(INOUT)::&
  1193. chem_tendf
  1194. REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_tracer ),INTENT(INOUT)::&
  1195. tracer_tendf
  1196. REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_scalar ),INTENT(INOUT)::&
  1197. scalar_tendf
  1198. ! LOCAL VARS
  1199. INTEGER :: im, ic, is
  1200. !<DESCRIPTION>
  1201. !
  1202. ! init_zero_tendency
  1203. ! sets tendency arrays to zero for all prognostic variables.
  1204. !
  1205. !</DESCRIPTION>
  1206. CALL zero_tend ( ru_tendf, &
  1207. ids, ide, jds, jde, kds, kde, &
  1208. ims, ime, jms, jme, kms, kme, &
  1209. its, ite, jts, jte, kts, kte )
  1210. CALL zero_tend ( rv_tendf, &
  1211. ids, ide, jds, jde, kds, kde, &
  1212. ims, ime, jms, jme, kms, kme, &
  1213. its, ite, jts, jte, kts, kte )
  1214. CALL zero_tend ( rw_tendf, &
  1215. ids, ide, jds, jde, kds, kde, &
  1216. ims, ime, jms, jme, kms, kme, &
  1217. its, ite, jts, jte, kts, kte )
  1218. CALL zero_tend ( ph_tendf, &
  1219. ids, ide, jds, jde, kds, kde, &
  1220. ims, ime, jms, jme, kms, kme, &
  1221. its, ite, jts, jte, kts, kte )
  1222. CALL zero_tend ( t_tendf, &
  1223. ids, ide, jds, jde, kds, kde, &
  1224. ims, ime, jms, jme, kms, kme, &
  1225. its, ite, jts, jte, kts, kte )
  1226. CALL zero_tend ( tke_tendf, &
  1227. ids, ide, jds, jde, kds, kde, &
  1228. ims, ime, jms, jme, kms, kme, &
  1229. its, ite, jts, jte, kts, kte )
  1230. CALL zero_tend ( mu_tendf, &
  1231. ids, ide, jds, jde, kds, kds, &
  1232. ims, ime, jms, jme, kms, kms, &
  1233. its, ite, jts, jte, kts, kts )
  1234. ! DO im=PARAM_FIRST_SCALAR,n_moist
  1235. DO im=1,n_moist ! make sure first one is zero too
  1236. CALL zero_tend ( moist_tendf(ims,kms,jms,im), &
  1237. ids, ide, jds, jde, kds, kde, &
  1238. ims, ime, jms, jme, kms, kme, &
  1239. its, ite, jts, jte, kts, kte )
  1240. ENDDO
  1241. ! DO ic=PARAM_FIRST_SCALAR,n_chem
  1242. DO ic=1,n_chem ! make sure first one is zero too
  1243. CALL zero_tend ( chem_tendf(ims,kms,jms,ic), &
  1244. ids, ide, jds, jde, kds, kde, &
  1245. ims, ime, jms, jme, kms, kme, &
  1246. its, ite, jts, jte, kts, kte )
  1247. ENDDO
  1248. ! DO ic=PARAM_FIRST_SCALAR,n_tracer
  1249. DO ic=1,n_tracer ! make sure first one is zero too
  1250. CALL zero_tend ( tracer_tendf(ims,kms,jms,ic), &
  1251. ids, ide, jds, jde, kds, kde, &
  1252. ims, ime, jms, jme, kms, kme, &
  1253. its, ite, jts, jte, kts, kte )
  1254. ENDDO
  1255. ! DO ic=PARAM_FIRST_SCALAR,n_scalar
  1256. DO ic=1,n_scalar ! make sure first one is zero too
  1257. CALL zero_tend ( scalar_tendf(ims,kms,jms,ic), &
  1258. ids, ide, jds, jde, kds, kde, &
  1259. ims, ime, jms, jme, kms, kme, &
  1260. its, ite, jts, jte, kts, kte )
  1261. ENDDO
  1262. END SUBROUTINE init_zero_tendency
  1263. !===================================================================
  1264. SUBROUTINE dump_data( a, field, io_unit, &
  1265. ims, ime, jms, jme, kms, kme, &
  1266. ids, ide, jds, jde, kds, kde )
  1267. implicit none
  1268. integer :: ims, ime, jms, jme, kms, kme, &
  1269. ids, ide, jds, jde, kds, kde
  1270. real, dimension(ims:ime, kms:kme, jds:jde) :: a
  1271. character :: field
  1272. integer :: io_unit
  1273. integer :: is,ie,js,je,ks,ke
  1274. !<DESCRIPTION
  1275. !
  1276. ! quick and dirty debug io utility
  1277. !
  1278. !</DESCRIPTION
  1279. is = ids
  1280. ie = ide-1
  1281. js = jds
  1282. je = jde-1
  1283. ks = kds
  1284. ke = kde-1
  1285. if(field == 'u') ie = ide
  1286. if(field == 'v') je = jde
  1287. if(field == 'w') ke = kde
  1288. write(io_unit) is,ie,ks,ke,js,je
  1289. write(io_unit) a(is:ie, ks:ke, js:je)
  1290. end subroutine dump_data
  1291. !-----------------------------------------------------------------------
  1292. SUBROUTINE calculate_phy_tend (config_flags,mu,muu,muv,pi3d, &
  1293. RTHRATEN, &
  1294. RUBLTEN,RVBLTEN,RTHBLTEN, &
  1295. RQVBLTEN,RQCBLTEN,RQIBLTEN, &
  1296. RUCUTEN,RVCUTEN,RTHCUTEN, &
  1297. RQVCUTEN,RQCCUTEN,RQRCUTEN, &
  1298. RQICUTEN,RQSCUTEN, &
  1299. RUSHTEN,RVSHTEN,RTHSHTEN, &
  1300. RQVSHTEN,RQCSHTEN,RQRSHTEN, &
  1301. RQISHTEN,RQSSHTEN,RQGSHTEN, &
  1302. RUNDGDTEN,RVNDGDTEN,RTHNDGDTEN,RQVNDGDTEN, &
  1303. RMUNDGDTEN, &
  1304. ids,ide, jds,jde, kds,kde, &
  1305. ims,ime, jms,jme, kms,kme, &
  1306. its,ite, jts,jte, kts,kte )
  1307. !-----------------------------------------------------------------------
  1308. IMPLICIT NONE
  1309. TYPE(grid_config_rec_type), INTENT(IN) :: config_flags
  1310. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
  1311. ims,ime, jms,jme, kms,kme, &
  1312. its,ite, jts,jte, kts,kte
  1313. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
  1314. INTENT(IN ) :: pi3d
  1315. REAL, DIMENSION( ims:ime, jms:jme ) , &
  1316. INTENT(IN ) :: mu, &
  1317. muu, &
  1318. muv
  1319. ! radiation
  1320. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
  1321. INTENT(INOUT) :: RTHRATEN
  1322. ! cumulus
  1323. REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
  1324. INTENT(INOUT) :: &
  1325. RUCUTEN, &
  1326. RVCUTEN, &
  1327. RTHCUTEN, &
  1328. RQVCUTEN, &
  1329. RQCCUTEN, &
  1330. RQRCUTEN, &
  1331. RQICUTEN, &
  1332. RQSCUTEN, &
  1333. RUSHTEN, &
  1334. RVSHTEN, &
  1335. RTHSHTEN, &
  1336. RQVSHTEN, &
  1337. RQCSHTEN, &
  1338. RQRSHTEN, &
  1339. RQISHTEN, &
  1340. RQSSHTEN, &
  1341. RQGSHTEN
  1342. ! pbl
  1343. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
  1344. INTENT(INOUT) :: RUBLTEN, &
  1345. RVBLTEN, &
  1346. RTHBLTEN, &
  1347. RQVBLTEN, &
  1348. RQCBLTEN, &
  1349. RQIBLTEN
  1350. ! fdda
  1351. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
  1352. INTENT(INOUT) :: RUNDGDTEN, &
  1353. RVNDGDTEN, &
  1354. RTHNDGDTEN, &
  1355. RQVNDGDTEN
  1356. REAL, DIMENSION( ims:ime, jms:jme ) , &
  1357. INTENT(INOUT) :: RMUNDGDTEN
  1358. INTEGER :: i,k,j
  1359. INTEGER :: itf,ktf,jtf,itsu,jtsv
  1360. !-----------------------------------------------------------------------
  1361. !<DESCRIPTION>
  1362. !
  1363. ! calculate_phy_tend couples the physics tendencies to the column mass (mu),
  1364. ! because prognostic equations are in flux form, but physics tendencies are
  1365. ! computed for uncoupled variables.
  1366. !
  1367. !</DESCRIPTION>
  1368. itf=MIN(ite,ide-1)
  1369. jtf=MIN(jte,jde-1)
  1370. ktf=MIN(kte,kde-1)
  1371. itsu=MAX(its,ids+1)
  1372. jtsv=MAX(jts,jds+1)
  1373. ! radiation
  1374. IF (config_flags%ra_lw_physics .gt. 0 .or. config_flags%ra_sw_physics .gt. 0) THEN
  1375. DO J=jts,jtf
  1376. DO K=kts,ktf
  1377. DO I=its,itf
  1378. RTHRATEN(I,K,J)=mu(I,J)*RTHRATEN(I,K,J)
  1379. ENDDO
  1380. ENDDO
  1381. ENDDO
  1382. ENDIF
  1383. ! cumulus
  1384. IF (config_flags%cu_physics .gt. 0) THEN
  1385. DO J=jts,jtf
  1386. DO I=its,itf
  1387. DO K=kts,ktf
  1388. RUCUTEN(I,K,J) =mu(I,J)*RUCUTEN(I,K,J)
  1389. RVCUTEN(I,K,J) =mu(I,J)*RVCUTEN(I,K,J)
  1390. RTHCUTEN(I,K,J)=mu(I,J)*RTHCUTEN(I,K,J)
  1391. RQVCUTEN(I,K,J)=mu(I,J)*RQVCUTEN(I,K,J)
  1392. ENDDO
  1393. ENDDO
  1394. ENDDO
  1395. IF (P_QC .ge. PARAM_FIRST_SCALAR)THEN
  1396. DO J=jts,jtf
  1397. DO I=its,itf
  1398. DO K=kts,ktf
  1399. RQCCUTEN(I,K,J)=mu(I,J)*RQCCUTEN(I,K,J)
  1400. ENDDO
  1401. ENDDO
  1402. ENDDO
  1403. ENDIF
  1404. IF (P_QR .ge. PARAM_FIRST_SCALAR)THEN
  1405. DO J=jts,jtf
  1406. DO I=its,itf
  1407. DO K=kts,ktf
  1408. RQRCUTEN(I,K,J)=mu(I,J)*RQRCUTEN(I,K,J)
  1409. ENDDO
  1410. ENDDO
  1411. ENDDO
  1412. ENDIF
  1413. IF (P_QI .ge. PARAM_FIRST_SCALAR)THEN
  1414. DO J=jts,jtf
  1415. DO I=its,itf
  1416. DO K=kts,ktf
  1417. RQICUTEN(I,K,J)=mu(I,J)*RQICUTEN(I,K,J)
  1418. ENDDO
  1419. ENDDO
  1420. ENDDO
  1421. ENDIF
  1422. IF(P_QS .ge. PARAM_FIRST_SCALAR)THEN
  1423. DO J=jts,jtf
  1424. DO I=its,itf
  1425. DO K=kts,ktf
  1426. RQSCUTEN(I,K,J)=mu(I,J)*RQSCUTEN(I,K,J)
  1427. ENDDO
  1428. ENDDO
  1429. ENDDO
  1430. ENDIF
  1431. ENDIF
  1432. ! shallow cumulus
  1433. IF (config_flags%shcu_physics .gt. 0) THEN
  1434. DO J=jts,jtf
  1435. DO I=its,itf
  1436. DO K=kts,ktf
  1437. RUSHTEN(I,K,J) =mu(I,J)*RUSHTEN(I,K,J)
  1438. RVSHTEN(I,K,J) =mu(I,J)*RVSHTEN(I,K,J)
  1439. RTHSHTEN(I,K,J)=mu(I,J)*RTHSHTEN(I,K,J)
  1440. RQVSHTEN(I,K,J)=mu(I,J)*RQVSHTEN(I,K,J)
  1441. ENDDO
  1442. ENDDO
  1443. ENDDO
  1444. IF (P_QC .ge. PARAM_FIRST_SCALAR)THEN
  1445. DO J=jts,jtf
  1446. DO I=its,itf
  1447. DO K=kts,ktf
  1448. RQCSHTEN(I,K,J)=mu(I,J)*RQCSHTEN(I,K,J)
  1449. ENDDO
  1450. ENDDO
  1451. ENDDO
  1452. ENDIF
  1453. IF (P_QR .ge. PARAM_FIRST_SCALAR)THEN
  1454. DO J=jts,jtf
  1455. DO I=its,itf
  1456. DO K=kts,ktf
  1457. RQRSHTEN(I,K,J)=mu(I,J)*RQRSHTEN(I,K,J)
  1458. ENDDO
  1459. ENDDO
  1460. ENDDO
  1461. ENDIF
  1462. IF (P_QI .ge. PARAM_FIRST_SCALAR)THEN
  1463. DO J=jts,jtf
  1464. DO I=its,itf
  1465. DO K=kts,ktf
  1466. RQISHTEN(I,K,J)=mu(I,J)*RQISHTEN(I,K,J)
  1467. ENDDO
  1468. ENDDO
  1469. ENDDO
  1470. ENDIF
  1471. IF(P_QS .ge. PARAM_FIRST_SCALAR)THEN
  1472. DO J=jts,jtf
  1473. DO I=its,itf
  1474. DO K=kts,ktf
  1475. RQSSHTEN(I,K,J)=mu(I,J)*RQSSHTEN(I,K,J)
  1476. ENDDO
  1477. ENDDO
  1478. ENDDO
  1479. ENDIF
  1480. IF(P_QG .ge. PARAM_FIRST_SCALAR)THEN
  1481. DO J=jts,jtf
  1482. DO I=its,itf
  1483. DO K=kts,ktf
  1484. RQGSHTEN(I,K,J)=mu(I,J)*RQGSHTEN(I,K,J)
  1485. ENDDO
  1486. ENDDO
  1487. ENDDO
  1488. ENDIF
  1489. ENDIF
  1490. ! pbl
  1491. IF (config_flags%bl_pbl_physics .gt. 0) THEN
  1492. DO J=jts,jtf
  1493. DO K=kts,ktf
  1494. DO I=its,itf
  1495. RUBLTEN(I,K,J) =mu(I,J)*RUBLTEN(I,K,J)
  1496. RVBLTEN(I,K,J) =mu(I,J)*RVBLTEN(I,K,J)
  1497. RTHBLTEN(I,K,J)=mu(I,J)*RTHBLTEN(I,K,J)
  1498. ENDDO
  1499. ENDDO
  1500. ENDDO
  1501. IF (P_QV .ge. PARAM_FIRST_SCALAR) THEN
  1502. DO J=jts,jtf
  1503. DO K=kts,ktf
  1504. DO I=its,itf
  1505. RQVBLTEN(I,K,J)=mu(I,J)*RQVBLTEN(I,K,J)
  1506. ENDDO
  1507. ENDDO
  1508. ENDDO
  1509. ENDIF
  1510. IF (P_QC .ge. PARAM_FIRST_SCALAR) THEN
  1511. DO J=jts,jtf
  1512. DO K=kts,ktf
  1513. DO I=its,itf
  1514. RQCBLTEN(I,K,J)=mu(I,J)*RQCBLTEN(I,K,J)
  1515. ENDDO
  1516. ENDDO
  1517. ENDDO
  1518. ENDIF
  1519. IF (P_QI .ge. PARAM_FIRST_SCALAR) THEN
  1520. DO J=jts,jtf
  1521. DO K=kts,ktf
  1522. DO I=its,itf
  1523. RQIBLTEN(I,K,J)=mu(I,J)*RQIBLTEN(I,K,J)
  1524. ENDDO
  1525. ENDDO
  1526. ENDDO
  1527. ENDIF
  1528. ENDIF
  1529. ! fdda
  1530. ! note fdda u and v tendencies are staggered, also only interior points have muu/muv,
  1531. ! so only couple those
  1532. IF (config_flags%grid_fdda .gt. 0) THEN
  1533. DO J=jts,jtf
  1534. DO K=kts,ktf
  1535. DO I=itsu,itf
  1536. ! if( i == itf/2 .AND. j == jtf/2 .AND. k == ktf/2 ) &
  1537. ! write(*,'(a,3i6,e15.5)') 'u_ten before=',i,k,j, RUNDGDTEN(i,k,j)
  1538. RUNDGDTEN(I,K,J) =muu(I,J)*RUNDGDTEN(I,K,J)
  1539. ! if( i == itf/2 .AND. j == jtf/2 .AND. k==ktf/2 ) &
  1540. ! write(*,'(a,2f15.5)') 'mu, muu=',mu(i,j), muu(i,j)
  1541. ! if( i == itf/2 .AND. j == jtf/2 .AND. k == ktf/2 ) &
  1542. ! write(*,'(a,3i6,e15.5)') 'u_ten after=',i,k,j, RUNDGDTEN(i,k,j)
  1543. ! if( RUNDGDTEN(i,k,j) > 30.0 ) write(*,*) 'IKJ=',i,k,j
  1544. ENDDO
  1545. ENDDO
  1546. ENDDO
  1547. ! write(*,'(a,e15.5)') 'u_ten MAXIMUM after=', maxval(RUNDGDTEN)
  1548. DO J=jtsv,jtf
  1549. DO K=kts,ktf
  1550. DO I=its,itf
  1551. RVNDGDTEN(I,K,J) =muv(I,J)*RVNDGDTEN(I,K,J)
  1552. ENDDO
  1553. ENDDO
  1554. ENDDO
  1555. DO J=jts,jtf
  1556. DO K=kts,ktf
  1557. DO I=its,itf
  1558. ! if( i == itf/2 .AND. j == jtf/2 .AND. k == ktf/2 ) &
  1559. ! write(*,'(a,3i6,e15.5)') 'th before=',i,k,j, RTHNDGDTEN(I,K,J)
  1560. RTHNDGDTEN(I,K,J)=mu(I,J)*RTHNDGDTEN(I,K,J)
  1561. ! RMUNDGDTEN(I,J) - no coupling
  1562. ! if( i == itf/2 .AND. j == jtf/2 .AND. k == ktf/2 ) &
  1563. ! write(*,'(a,3i6,e15.5)') 'th after=',i,k,j, RTHNDGDTEN(I,K,J)
  1564. ENDDO
  1565. ENDDO
  1566. ENDDO
  1567. IF (P_QV .ge. PARAM_FIRST_SCALAR) THEN
  1568. DO J=jts,jtf
  1569. DO K=kts,ktf
  1570. DO I=its,itf
  1571. RQVNDGDTEN(I,K,J)=mu(I,J)*RQVNDGDTEN(I,K,J)
  1572. ENDDO
  1573. ENDDO
  1574. ENDDO
  1575. ENDIF
  1576. ENDIF
  1577. END SUBROUTINE calculate_phy_tend
  1578. !-----------------------------------------------------------------------
  1579. SUBROUTINE positive_definite_filter ( a, &
  1580. ids,ide, jds,jde, kds,kde, &
  1581. ims,ime, jms,jme, kms,kme, &
  1582. its,ite, jts,jte, kts,kte )
  1583. IMPLICIT NONE
  1584. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
  1585. ims,ime, jms,jme, kms,kme, &
  1586. its,ite, jts,jte, kts,kte
  1587. REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), INTENT(INOUT) :: a
  1588. INTEGER :: i,k,j
  1589. !<DESCRIPTION>
  1590. !
  1591. ! debug and testing code for bounding a variable
  1592. !
  1593. !</DESCRIPTION>
  1594. DO j=jts,min(jte,jde-1)
  1595. DO k=kts,kte-1
  1596. DO i=its,min(ite,ide-1)
  1597. ! a(i,k,j) = max(a(i,k,j),0.)
  1598. a(i,k,j) = min(1000.,max(a(i,k,j),0.))
  1599. ENDDO
  1600. ENDDO
  1601. ENDDO
  1602. END SUBROUTINE positive_definite_filter
  1603. !-----------------------------------------------------------------------
  1604. SUBROUTINE bound_tke ( tke, tke_upper_bound, &
  1605. ids,ide, jds,jde, kds,kde, &
  1606. ims,ime, jms,jme, kms,kme, &
  1607. its,ite, jts,jte, kts,kte )
  1608. IMPLICIT NONE
  1609. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
  1610. ims,ime, jms,jme, kms,kme, &
  1611. its,ite, jts,jte, kts,kte
  1612. REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), INTENT(INOUT) :: tke
  1613. REAL, INTENT( IN) :: tke_upper_bound
  1614. INTEGER :: i,k,j
  1615. !<DESCRIPTION>
  1616. !
  1617. ! bounds tke between zero and tke_upper_bound.
  1618. !
  1619. !</DESCRIPTION>
  1620. DO j=jts,min(jte,jde-1)
  1621. DO k=kts,kte-1
  1622. DO i=its,min(ite,ide-1)
  1623. tke(i,k,j) = min(tke_upper_bound,max(tke(i,k,j),0.))
  1624. ENDDO
  1625. ENDDO
  1626. ENDDO
  1627. END SUBROUTINE bound_tke
  1628. END MODULE module_em