PageRenderTime 62ms CodeModel.GetById 20ms 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

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

  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,

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