PageRenderTime 42ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 1ms

/wrfv2_fire/dyn_em/couple_or_uncouple_em.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 447 lines | 289 code | 81 blank | 77 comment | 0 complexity | c9916e6cb4f5137cb000a78d177bc945 MD5 | raw file
Possible License(s): AGPL-1.0
  1. !WRF:MEDIATION_LAYER:couple_uncouple_utility
  2. SUBROUTINE couple_or_uncouple_em ( grid , config_flags , couple &
  3. !
  4. #include "dummy_new_args.inc"
  5. !
  6. )
  7. ! #undef DM_PARALLEL
  8. ! Driver layer modules
  9. USE module_domain, ONLY : domain, get_ijk_from_grid
  10. USE module_configure, ONLY : grid_config_rec_type
  11. USE module_driver_constants
  12. USE module_machine
  13. USE module_tiles
  14. #ifdef DM_PARALLEL
  15. USE module_dm, ONLY : local_communicator, mytask, ntasks, ntasks_x, ntasks_y, local_communicator_periodic
  16. USE module_comm_dm, ONLY : halo_em_couple_a_sub,halo_em_couple_b_sub,period_em_couple_a_sub,period_em_couple_b_sub
  17. #else
  18. USE module_dm
  19. #endif
  20. USE module_bc
  21. ! Mediation layer modules
  22. ! Registry generated module
  23. USE module_state_description
  24. IMPLICIT NONE
  25. ! Subroutine interface block.
  26. TYPE(domain) , TARGET :: grid
  27. ! Definitions of dummy arguments to solve
  28. #include <dummy_new_decl.inc>
  29. ! WRF state bcs
  30. TYPE (grid_config_rec_type) , INTENT(IN) :: config_flags
  31. LOGICAL, INTENT( IN) :: couple
  32. ! Local data
  33. INTEGER :: k_start , k_end
  34. INTEGER :: ids , ide , jds , jde , kds , kde , &
  35. ims , ime , jms , jme , kms , kme , &
  36. ips , ipe , jps , jpe , kps , kpe
  37. INTEGER :: i,j,k, im
  38. INTEGER :: num_3d_c, num_3d_m, num_3d_s
  39. REAL :: mu_factor
  40. REAL, DIMENSION(grid%sm31:grid%em31,grid%sm33:grid%em33) :: mut_2, muut_2, muvt_2, muwt_2
  41. ! De-reference dimension information stored in the grid data structure.
  42. CALL get_ijk_from_grid ( grid , &
  43. ids, ide, jds, jde, kds, kde, &
  44. ims, ime, jms, jme, kms, kme, &
  45. ips, ipe, jps, jpe, kps, kpe )
  46. num_3d_m = num_moist
  47. num_3d_c = num_chem
  48. num_3d_s = num_scalar
  49. ! couple or uncouple mass-point variables
  50. ! first, compute mu or its reciprical as necessary
  51. ! write(6,*) ' in couple '
  52. ! write(6,*) ' x,y memory ', grid%sm31,grid%em31,grid%sm33,grid%em33
  53. ! write(6,*) ' x,y patch ', ips, ipe, jps, jpe
  54. ! if(couple) then
  55. ! write(6,*) ' coupling variables for grid ',grid%id
  56. ! write(6,*) ' ips, ipe, jps, jpe ',ips,ipe,jps,jpe
  57. ! else
  58. ! write(6,*) ' uncoupling variables for grid ',grid%id
  59. ! write(6,*) ' ips, ipe, jps, jpe ',ips,ipe,jps,jpe
  60. ! write(6,*) ' x, y, size ',size(mu_2,1),size(mu_2,2)
  61. ! end if
  62. IF ( config_flags%periodic_x .OR. config_flags%periodic_y ) THEN
  63. CALL set_physical_bc2d( grid%mub, 't', &
  64. config_flags, &
  65. ids,ide, jds,jde, & ! domain dims
  66. ims,ime, jms,jme, & ! memory dims
  67. ips,ipe, jps,jpe, & ! patch dims
  68. ips,ipe, jps,jpe )
  69. CALL set_physical_bc2d( grid%mu_1, 't', &
  70. config_flags, &
  71. ids,ide, jds,jde, & ! domain dims
  72. ims,ime, jms,jme, & ! memory dims
  73. ips,ipe, jps,jpe, & ! patch dims
  74. ips,ipe, jps,jpe )
  75. CALL set_physical_bc2d( grid%mu_2, 't', &
  76. config_flags, &
  77. ids,ide, jds,jde, & ! domain dims
  78. ims,ime, jms,jme, & ! memory dims
  79. ips,ipe, jps,jpe, & ! patch dims
  80. ips,ipe, jps,jpe )
  81. ENDIF
  82. #ifdef DM_PARALLEL
  83. # include "HALO_EM_COUPLE_A.inc"
  84. # include "PERIOD_EM_COUPLE_A.inc"
  85. #endif
  86. ! computations go out one row and column to avoid having to communicate before solver
  87. IF( couple ) THEN
  88. ! write(6,*) ' coupling: setting mu arrays '
  89. DO j = max(jds,jps),min(jde-1,jpe)
  90. DO i = max(ids,ips),min(ide-1,ipe)
  91. mut_2(i,j) = grid%mub(i,j) + grid%mu_2(i,j)
  92. muwt_2(i,j) = (grid%mub(i,j) + grid%mu_2(i,j))/grid%msfty(i,j) ! w coupled with y
  93. ENDDO
  94. ENDDO
  95. ! need boundary condition fixes for u and v ???
  96. ! write(6,*) ' coupling: setting muv and muv arrays '
  97. DO j = max(jds,jps),min(jde-1,jpe)
  98. DO i = max(ids,ips),min(ide-1,ipe)
  99. muut_2(i,j) = 0.5*(grid%mub(i,j)+grid%mub(i-1,j) + grid%mu_2(i,j) + grid%mu_2(i-1,j))/grid%msfuy(i,j) ! u coupled with y
  100. muvt_2(i,j) = 0.5*(grid%mub(i,j)+grid%mub(i,j-1) + grid%mu_2(i,j) + grid%mu_2(i,j-1))/grid%msfvx(i,j) ! v coupled with x
  101. ENDDO
  102. ENDDO
  103. IF ( config_flags%nested .or. config_flags%specified .or. config_flags%polar ) THEN
  104. IF ( jpe .eq. jde ) THEN
  105. j = jde
  106. DO i = max(ids,ips),min(ide-1,ipe)
  107. muvt_2(i,j) = (grid%mub(i,j-1) + grid%mu_2(i,j-1))/grid%msfvx(i,j) ! v coupled with x
  108. ENDDO
  109. ENDIF
  110. IF ( ipe .eq. ide .AND. .NOT. config_flags%periodic_x ) THEN
  111. i = ide
  112. DO j = max(jds,jps),min(jde-1,jpe)
  113. muut_2(i,j) = (grid%mub(i-1,j) + grid%mu_2(i-1,j))/grid%msfuy(i,j) ! u coupled with y
  114. ENDDO
  115. ENDIF
  116. ELSE
  117. IF ( jpe .eq. jde ) THEN
  118. j = jde
  119. DO i = max(ids,ips),min(ide-1,ipe)
  120. muvt_2(i,j) = 0.5*(grid%mub(i,j)+grid%mub(i,j-1) + grid%mu_2(i,j) + grid%mu_2(i,j-1))/grid%msfvx(i,j) ! v coupled with x
  121. ENDDO
  122. ENDIF
  123. IF ( ipe .eq. ide ) THEN
  124. i = ide
  125. DO j = max(jds,jps),min(jde-1,jpe)
  126. muut_2(i,j) = 0.5*(grid%mub(i,j)+grid%mub(i-1,j) + grid%mu_2(i,j) + grid%mu_2(i-1,j))/grid%msfuy(i,j) ! u coupled with y
  127. ENDDO
  128. ENDIF
  129. END IF
  130. ELSE
  131. ! write(6,*) ' uncoupling: setting mu arrays '
  132. DO j = max(jds,jps),min(jde-1,jpe)
  133. DO i = max(ids,ips),min(ide-1,ipe)
  134. mut_2(i,j) = 1./(grid%mub(i,j) + grid%mu_2(i,j))
  135. muwt_2(i,j) = grid%msfty(i,j)/(grid%mub(i,j) + grid%mu_2(i,j)) ! w coupled with y
  136. ENDDO
  137. ENDDO
  138. ! write(6,*) ' uncoupling: setting muv arrays '
  139. DO j = max(jds,jps),min(jde-1,jpe)
  140. DO i = max(ids,ips),min(ide-1,ipe)
  141. muut_2(i,j) = 2.*grid%msfuy(i,j)/(grid%mub(i,j)+grid%mub(i-1,j) + grid%mu_2(i,j) + grid%mu_2(i-1,j)) ! u coupled with y
  142. ENDDO
  143. ENDDO
  144. DO j = max(jds,jps),min(jde-1,jpe)
  145. DO i = max(ids,ips),min(ide-1,ipe)
  146. muvt_2(i,j) = 2.*grid%msfvx(i,j)/(grid%mub(i,j)+grid%mub(i,j-1) + grid%mu_2(i,j) + grid%mu_2(i,j-1)) ! v coupled with x
  147. ENDDO
  148. ENDDO
  149. IF ( config_flags%nested .or. config_flags%specified .or. config_flags%polar ) THEN
  150. IF ( jpe .eq. jde ) THEN
  151. j = jde
  152. DO i = max(ids,ips),min(ide-1,ipe)
  153. muvt_2(i,j) = grid%msfvx(i,j)/(grid%mub(i,j-1) + grid%mu_2(i,j-1)) ! v coupled with x
  154. ENDDO
  155. ENDIF
  156. IF ( ipe .eq. ide .AND. .NOT. config_flags%periodic_x ) THEN
  157. i = ide
  158. DO j = max(jds,jps),min(jde-1,jpe)
  159. muut_2(i,j) = grid%msfuy(i,j)/(grid%mub(i-1,j) + grid%mu_2(i-1,j)) ! u coupled with y
  160. ENDDO
  161. ENDIF
  162. ELSE
  163. IF ( jpe .eq. jde ) THEN
  164. j = jde
  165. DO i = max(ids,ips),min(ide-1,ipe)
  166. muvt_2(i,j) = 2.*grid%msfvx(i,j)/(grid%mub(i,j)+grid%mub(i,j-1) + grid%mu_2(i,j) + grid%mu_2(i,j-1)) ! v coupled with x
  167. ENDDO
  168. ENDIF
  169. IF ( ipe .eq. ide ) THEN
  170. i = ide
  171. DO j = max(jds,jps),min(jde-1,jpe)
  172. muut_2(i,j) = 2.*grid%msfuy(i,j)/(grid%mub(i,j)+grid%mub(i-1,j) + grid%mu_2(i,j) + grid%mu_2(i-1,j)) ! u coupled with y
  173. ENDDO
  174. ENDIF
  175. END IF
  176. END IF
  177. ! couple/uncouple mu point variables
  178. !$OMP PARALLEL DO &
  179. !$OMP PRIVATE ( i,j,k,im )
  180. DO j = max(jds,jps),min(jde-1,jpe)
  181. DO k = kps,kpe
  182. DO i = max(ids,ips),min(ide-1,ipe)
  183. grid%ph_2(i,k,j) = grid%ph_2(i,k,j)*mut_2(i,j)
  184. grid%w_2(i,k,j) = grid%w_2(i,k,j)*muwt_2(i,j)
  185. ENDDO
  186. ENDDO
  187. DO k = kps,kpe-1
  188. DO i = max(ids,ips),min(ide-1,ipe)
  189. grid%t_2(i,k,j) = grid%t_2(i,k,j)*mut_2(i,j)
  190. ENDDO
  191. ENDDO
  192. IF (num_3d_m >= PARAM_FIRST_SCALAR ) THEN
  193. DO im = PARAM_FIRST_SCALAR, num_3d_m
  194. DO k = kps,kpe-1
  195. DO i = max(ids,ips),min(ide-1,ipe)
  196. moist(i,k,j,im) = moist(i,k,j,im)*mut_2(i,j)
  197. ENDDO
  198. ENDDO
  199. ENDDO
  200. END IF
  201. IF (num_3d_c >= PARAM_FIRST_SCALAR ) THEN
  202. DO im = PARAM_FIRST_SCALAR, num_3d_c
  203. DO k = kps,kpe-1
  204. DO i = max(ids,ips),min(ide-1,ipe)
  205. chem(i,k,j,im) = chem(i,k,j,im)*mut_2(i,j)
  206. ENDDO
  207. ENDDO
  208. ENDDO
  209. END IF
  210. IF (num_3d_s >= PARAM_FIRST_SCALAR ) THEN
  211. DO im = PARAM_FIRST_SCALAR, num_3d_s
  212. DO k = kps,kpe-1
  213. DO i = max(ids,ips),min(ide-1,ipe)
  214. scalar(i,k,j,im) = scalar(i,k,j,im)*mut_2(i,j)
  215. ENDDO
  216. ENDDO
  217. ENDDO
  218. END IF
  219. IF (num_tracer >= PARAM_FIRST_SCALAR ) THEN
  220. DO im = PARAM_FIRST_SCALAR, num_tracer
  221. DO k = kps,kpe-1
  222. DO i = max(ids,ips),min(ide-1,ipe)
  223. tracer(i,k,j,im) = tracer(i,k,j,im)*mut_2(i,j)
  224. ENDDO
  225. ENDDO
  226. ENDDO
  227. END IF
  228. ! do u and v
  229. DO k = kps,kpe-1
  230. DO i = max(ids,ips),min(ide,ipe)
  231. grid%u_2(i,k,j) = grid%u_2(i,k,j)*muut_2(i,j)
  232. ENDDO
  233. ENDDO
  234. ENDDO ! j loop
  235. !$OMP END PARALLEL DO
  236. !$OMP PARALLEL DO &
  237. !$OMP PRIVATE ( i,j,k )
  238. DO j = max(jds,jps),min(jde,jpe)
  239. DO k = kps,kpe-1
  240. DO i = max(ids,ips),min(ide-1,ipe)
  241. grid%v_2(i,k,j) = grid%v_2(i,k,j)*muvt_2(i,j)
  242. ENDDO
  243. ENDDO
  244. ENDDO
  245. !$OMP END PARALLEL DO
  246. IF ( config_flags%periodic_x .OR. config_flags%periodic_y ) THEN
  247. CALL set_physical_bc3d( grid%ph_1, 'w', &
  248. config_flags, &
  249. ids,ide, jds,jde, kds,kde, & ! domain dims
  250. ims,ime, jms,jme, kms,kme, & ! memory dims
  251. ips,ipe, jps,jpe, kps,kpe, & ! patch dims
  252. ips,ipe, jps,jpe, kps,kpe )
  253. CALL set_physical_bc3d( grid%ph_2, 'w', &
  254. config_flags, &
  255. ids,ide, jds,jde, kds,kde, & ! domain dims
  256. ims,ime, jms,jme, kms,kme, & ! memory dims
  257. ips,ipe, jps,jpe, kps,kpe, & ! patch dims
  258. ips,ipe, jps,jpe, kps,kpe )
  259. CALL set_physical_bc3d( grid%w_1, 'w', &
  260. config_flags, &
  261. ids,ide, jds,jde, kds,kde, & ! domain dims
  262. ims,ime, jms,jme, kms,kme, & ! memory dims
  263. ips,ipe, jps,jpe, kps,kpe, & ! patch dims
  264. ips,ipe, jps,jpe, kps,kpe )
  265. CALL set_physical_bc3d( grid%w_2, 'w', &
  266. config_flags, &
  267. ids,ide, jds,jde, kds,kde, & ! domain dims
  268. ims,ime, jms,jme, kms,kme, & ! memory dims
  269. ips,ipe, jps,jpe, kps,kpe, & ! patch dims
  270. ips,ipe, jps,jpe, kps,kpe )
  271. CALL set_physical_bc3d( grid%t_1, 't', &
  272. config_flags, &
  273. ids,ide, jds,jde, kds,kde, & ! domain dims
  274. ims,ime, jms,jme, kms,kme, & ! memory dims
  275. ips,ipe, jps,jpe, kps,kpe, & ! patch dims
  276. ips,ipe, jps,jpe, kps,kpe )
  277. CALL set_physical_bc3d( grid%t_2, 't', &
  278. config_flags, &
  279. ids,ide, jds,jde, kds,kde, & ! domain dims
  280. ims,ime, jms,jme, kms,kme, & ! memory dims
  281. ips,ipe, jps,jpe, kps,kpe, & ! patch dims
  282. ips,ipe, jps,jpe, kps,kpe )
  283. CALL set_physical_bc3d( grid%u_1, 'u', &
  284. config_flags, &
  285. ids,ide, jds,jde, kds,kde, & ! domain dims
  286. ims,ime, jms,jme, kms,kme, & ! memory dims
  287. ips,ipe, jps,jpe, kps,kpe, & ! patch dims
  288. ips,ipe, jps,jpe, kps,kpe )
  289. CALL set_physical_bc3d( grid%u_2, 'u', &
  290. config_flags, &
  291. ids,ide, jds,jde, kds,kde, & ! domain dims
  292. ims,ime, jms,jme, kms,kme, & ! memory dims
  293. ips,ipe, jps,jpe, kps,kpe, & ! patch dims
  294. ips,ipe, jps,jpe, kps,kpe )
  295. CALL set_physical_bc3d( grid%v_1, 'v', &
  296. config_flags, &
  297. ids,ide, jds,jde, kds,kde, & ! domain dims
  298. ims,ime, jms,jme, kms,kme, & ! memory dims
  299. ips,ipe, jps,jpe, kps,kpe, & ! patch dims
  300. ips,ipe, jps,jpe, kps,kpe )
  301. CALL set_physical_bc3d( grid%v_2, 'v', &
  302. config_flags, &
  303. ids,ide, jds,jde, kds,kde, & ! domain dims
  304. ims,ime, jms,jme, kms,kme, & ! memory dims
  305. ips,ipe, jps,jpe, kps,kpe, & ! patch dims
  306. ips,ipe, jps,jpe, kps,kpe )
  307. IF (num_3d_m >= PARAM_FIRST_SCALAR) THEN
  308. DO im = PARAM_FIRST_SCALAR , num_3d_m
  309. CALL set_physical_bc3d( moist(ims,kms,jms,im), 'p', &
  310. config_flags, &
  311. ids,ide, jds,jde, kds,kde, & ! domain dims
  312. ims,ime, jms,jme, kms,kme, & ! memory dims
  313. ips,ipe, jps,jpe, kps,kpe, & ! patch dims
  314. ips,ipe, jps,jpe, kps,kpe )
  315. ENDDO
  316. ENDIF
  317. IF (num_3d_c >= PARAM_FIRST_SCALAR) THEN
  318. DO im = PARAM_FIRST_SCALAR , num_3d_c
  319. CALL set_physical_bc3d( chem(ims,kms,jms,im), 'p', &
  320. config_flags, &
  321. ids,ide, jds,jde, kds,kde, & ! domain dims
  322. ims,ime, jms,jme, kms,kme, & ! memory dims
  323. ips,ipe, jps,jpe, kps,kpe, & ! patch dims
  324. ips,ipe, jps,jpe, kps,kpe )
  325. ENDDO
  326. ENDIF
  327. IF (num_3d_s >= PARAM_FIRST_SCALAR) THEN
  328. DO im = PARAM_FIRST_SCALAR , num_3d_s
  329. CALL set_physical_bc3d( scalar(ims,kms,jms,im), 'p', &
  330. config_flags, &
  331. ids,ide, jds,jde, kds,kde, & ! domain dims
  332. ims,ime, jms,jme, kms,kme, & ! memory dims
  333. ips,ipe, jps,jpe, kps,kpe, & ! patch dims
  334. ips,ipe, jps,jpe, kps,kpe )
  335. ENDDO
  336. ENDIF
  337. IF (num_tracer >= PARAM_FIRST_SCALAR) THEN
  338. DO im = PARAM_FIRST_SCALAR , num_tracer
  339. CALL set_physical_bc3d( tracer(ims,kms,jms,im), 'p', &
  340. config_flags, &
  341. ids,ide, jds,jde, kds,kde, & ! domain dims
  342. ims,ime, jms,jme, kms,kme, & ! memory dims
  343. ips,ipe, jps,jpe, kps,kpe, & ! patch dims
  344. ips,ipe, jps,jpe, kps,kpe )
  345. ENDDO
  346. ENDIF
  347. ENDIF
  348. #ifdef DM_PARALLEL
  349. # include "HALO_EM_COUPLE_B.inc"
  350. # include "PERIOD_EM_COUPLE_B.inc"
  351. #endif
  352. END SUBROUTINE couple_or_uncouple_em
  353. LOGICAL FUNCTION cd_feedback_mask( pig, ips_save, ipe_save , pjg, jps_save, jpe_save, xstag, ystag )
  354. IMPLICIT NONE
  355. INTEGER, INTENT(IN) :: pig, ips_save, ipe_save , pjg, jps_save, jpe_save
  356. LOGICAL, INTENT(IN) :: xstag, ystag
  357. INTEGER ioff, joff, spec_zone
  358. CALL nl_get_spec_zone( 1, spec_zone )
  359. ioff = 0 ; joff = 0
  360. IF ( xstag ) ioff = 1
  361. IF ( ystag ) joff = 1
  362. cd_feedback_mask = ( pig .ge. ips_save+spec_zone .and. &
  363. pjg .ge. jps_save+spec_zone .and. &
  364. pig .le. ipe_save-spec_zone +ioff .and. &
  365. pjg .le. jpe_save-spec_zone +joff )
  366. END FUNCTION cd_feedback_mask