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

/wrfv2_fire/dyn_nmm/module_NEST_UTIL.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 729 lines | 457 code | 84 blank | 188 comment | 1 complexity | 371a740adb10afa605eea6b5266221e7 MD5 | raw file
Possible License(s): AGPL-1.0
  1. !
  2. !NCEP_MESO:MODEL_LAYER: BOUNDARY CONDITION UPDATES
  3. !
  4. !----------------------------------------------------------------------
  5. !
  6. MODULE module_NEST_UTIL
  7. !
  8. !----------------------------------------------------------------------
  9. USE MODULE_MPP
  10. USE MODULE_STATE_DESCRIPTION
  11. USE MODULE_DM
  12. !
  13. !#ifdef DM_PARALLEL
  14. ! INCLUDE "mpif.h"
  15. !#endif
  16. !----------------------------------------------------------------------
  17. CONTAINS
  18. !
  19. !*********************************************************************************************
  20. SUBROUTINE NESTBC_PATCH(PD_BXS,PD_BXE,PD_BYS,PD_BYE &
  21. ,T_BXS,T_BXE,T_BYS,T_BYE,Q_BXS,Q_BXE,Q_BYS,Q_BYE &
  22. ,U_BXS,U_BXE,U_BYS,U_BYE,V_BXS,V_BXE,V_BYS,V_BYE &
  23. ,Q2_BXS,Q2_BXE,Q2_BYS,Q2_BYE &
  24. ,CWM_BXS,CWM_BXE,CWM_BYS,CWM_BYE &
  25. ,PD_BTXS,PD_BTXE,PD_BTYS,PD_BTYE &
  26. ,T_BTXS,T_BTXE,T_BTYS,T_BTYE,Q_BTXS,Q_BTXE,Q_BTYS,Q_BTYE &
  27. ,U_BTXS,U_BTXE,U_BTYS,U_BTYE,V_BTXS,V_BTXE,V_BTYS,V_BTYE &
  28. ,Q2_BTXS,Q2_BTXE,Q2_BTYS,Q2_BTYE &
  29. ,CWM_BTXS,CWM_BTXE,CWM_BTYS,CWM_BTYE &
  30. !
  31. ,PDTMP_B,TTMP_B, QTMP_B,UTMP_B,VTMP_B,Q2TMP_B,CWMTMP_B &
  32. ,PDTMP_BT,TTMP_BT,QTMP_BT,UTMP_BT,VTMP_BT,Q2TMP_BT,CWMTMP_BT &
  33. !
  34. ,SPEC_BDY_WIDTH &
  35. ,IDS,IDE,JDS,JDE,KDS,KDE &
  36. ,IMS,IME,JMS,JME,KMS,KME &
  37. ,ITS,ITE,JTS,JTE,KTS,KTE )
  38. !**********************************************************************
  39. !$$$ SUBPROGRAM DOCUMENTATION BLOCK
  40. ! . . .
  41. ! SUBPROGRAM: PATCH
  42. ! PRGRMMR: gopal
  43. !
  44. ! ABSTRACT:
  45. ! THIS IS JUST A FIX FOR USING NESTED BOUNDARIES IN THE HALO REGION
  46. ! PROGRAM HISTORY LOG:
  47. ! 09-23-2004 : gopal
  48. !
  49. ! USAGE: CALL PATCH FROM SUBROUTINE SOLVE_RUNSTREAM FOR NESTED DOMAIN ONLY
  50. !
  51. ! ATTRIBUTES:
  52. ! LANGUAGE: FORTRAN 90
  53. ! MACHINE : IBM SP
  54. !$$$
  55. !**********************************************************************
  56. !----------------------------------------------------------------------
  57. !
  58. IMPLICIT NONE
  59. !
  60. !----------------------------------------------------------------------
  61. !
  62. INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
  63. ,IMS,IME,JMS,JME,KMS,KME &
  64. ,ITS,ITE,JTS,JTE,KTS,KTE
  65. INTEGER,INTENT(IN) :: SPEC_BDY_WIDTH
  66. !
  67. !
  68. REAL,DIMENSION(IMS:IME,1,SPEC_BDY_WIDTH) &
  69. ,INTENT(INOUT) :: PD_BYS,PD_BYE &
  70. ,PD_BTYS,PD_BTYE
  71. REAL,DIMENSION(IMS:IME,KMS:KME,SPEC_BDY_WIDTH) &
  72. ,INTENT(INOUT) :: CWM_BYS,CWM_BYE &
  73. ,Q_BYS,Q_BYE &
  74. ,Q2_BYS,Q2_BYE &
  75. ,T_BYS,T_BYE &
  76. ,U_BYS,U_BYE &
  77. ,V_BYS,V_BYE
  78. REAL,DIMENSION(IMS:IME,KMS:KME,SPEC_BDY_WIDTH) &
  79. ,INTENT(INOUT) :: CWM_BTYS,CWM_BTYE &
  80. ,Q_BTYS,Q_BTYE &
  81. ,Q2_BTYS,Q2_BTYE &
  82. ,T_BTYS,T_BTYE &
  83. ,U_BTYS,U_BTYE &
  84. ,V_BTYS,V_BTYE
  85. !
  86. REAL,DIMENSION(JMS:JME,1,SPEC_BDY_WIDTH) &
  87. ,INTENT(INOUT) :: PD_BXS,PD_BXE &
  88. ,PD_BTXS,PD_BTXE
  89. REAL,DIMENSION(JMS:JME,KMS:KME,SPEC_BDY_WIDTH) &
  90. ,INTENT(INOUT) :: CWM_BXS,CWM_BXE &
  91. ,Q_BXS,Q_BXE &
  92. ,Q2_BXS,Q2_BXE &
  93. ,T_BXS,T_BXE &
  94. ,U_BXS,U_BXE &
  95. ,V_BXS,V_BXE
  96. REAL,DIMENSION(JMS:JME,KMS:KME,SPEC_BDY_WIDTH) &
  97. ,INTENT(INOUT) :: CWM_BTXS,CWM_BTXE &
  98. ,Q_BTXS,Q_BTXE &
  99. ,Q2_BTXS,Q2_BTXE &
  100. ,T_BTXS,T_BTXE &
  101. ,U_BTXS,U_BTXE &
  102. ,V_BTXS,V_BTXE
  103. !
  104. REAL,DIMENSION(IMS:IME,JMS:JME) &
  105. ,INTENT(IN) :: PDTMP_B,PDTMP_BT
  106. REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME) &
  107. ,INTENT(IN) :: CWMTMP_B,CWMTMP_BT &
  108. ,QTMP_B,QTMP_BT &
  109. ,Q2TMP_B,Q2TMP_BT &
  110. ,TTMP_B,TTMP_BT &
  111. ,UTMP_B,UTMP_BT &
  112. ,VTMP_B,VTMP_BT
  113. !
  114. !----------------------------------------------------------------------
  115. !
  116. !*** LOCAL VARIABLES
  117. !
  118. LOGICAL :: E_BDY,W_BDY,N_BDY,S_BDY
  119. INTEGER :: I,J,K,IBDY,II,JJ,IB,JB,IIM,JJM,BF
  120. !----------------------------------------------------------------------
  121. !**********************************************************************
  122. !----------------------------------------------------------------------
  123. !
  124. W_BDY=(ITS==IDS)
  125. E_BDY=(ITE==IDE)
  126. S_BDY=(JTS==JDS)
  127. N_BDY=(JTE==JDE)
  128. !----------------------------------------------------------------------
  129. !*** WEST AND EAST BOUNDARIES
  130. !----------------------------------------------------------------------
  131. !
  132. !*** USE IBDY=1 FOR WEST; 2 FOR EAST.
  133. ! WRITE(0,*)'WESTERN BC FOR PATCH',IDS,MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
  134. !
  135. DO IBDY=1,2
  136. !
  137. !*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY.
  138. !
  139. IF(W_BDY.AND.IBDY.EQ.1)THEN
  140. ! BF=P_XSB ! Which boundary (XSB=the boundary where X is at its start)
  141. IB=1 ! Which cell in from boundary
  142. II=1 ! Which cell in the domain
  143. DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
  144. IF(MOD(J,2).EQ.1)THEN ! J=3,5,7,9
  145. PD_BXS(J,1,IB) =PDTMP_B(II,J)
  146. PD_BTXS(J,1,IB) =PDTMP_BT(II,J)
  147. ENDIF
  148. ENDDO
  149. !
  150. DO K=KTS,KTE
  151. DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
  152. IF(MOD(J,2).EQ.1)THEN ! J=3,5,7,9
  153. T_BXS(J,K,IB) = TTMP_B(II,J,K)
  154. T_BTXS(J,K,IB) = TTMP_BT(II,J,K)
  155. Q_BXS(J,K,IB) = QTMP_B(II,J,K)
  156. Q_BTXS(J,K,IB) = QTMP_BT(II,J,K)
  157. Q2_BXS(J,K,IB) = Q2TMP_B(II,J,K)
  158. Q2_BTXS(J,K,IB) = Q2TMP_BT(II,J,K)
  159. CWM_BXS(J,K,IB) = CWMTMP_B(II,J,K)
  160. CWM_BTXS(J,K,IB) = CWMTMP_BT(II,J,K)
  161. ENDIF
  162. ENDDO
  163. ENDDO
  164. DO K=KTS,KTE
  165. DO J=MAX(JTS-1,JDS+2-1),MIN(JTE+1,JDE-1)
  166. IF(MOD(J,2).EQ.0)THEN ! J=2,4,6,8
  167. U_BXS(J,K,IB) = UTMP_B(II,J,K)
  168. U_BTXS(J,K,IB) = UTMP_BT(II,J,K)
  169. V_BXS(J,K,IB) = VTMP_B(II,J,K)
  170. V_BTXS(J,K,IB) = VTMP_BT(II,J,K)
  171. ENDIF
  172. ENDDO
  173. ENDDO
  174. ELSEIF (E_BDY.AND.IBDY.EQ.2) THEN
  175. ! BF=P_XEB ! Which boundary (XEB=the boundary where X is at its end)
  176. IB=1 ! Which cell in from boundary
  177. II=IDE ! Which cell in the domain
  178. DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
  179. IF(MOD(J,2).EQ.1)THEN ! J=3,5,7,9
  180. PD_BXE(J,1,IB) =PDTMP_B(II,J)
  181. PD_BTXE(J,1,IB) =PDTMP_BT(II,J)
  182. ENDIF
  183. ENDDO
  184. !
  185. DO K=KTS,KTE
  186. DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
  187. IF(MOD(J,2).EQ.1)THEN ! J=3,5,7,9
  188. T_BXE(J,K,IB) = TTMP_B(II,J,K)
  189. T_BTXE(J,K,IB) = TTMP_BT(II,J,K)
  190. Q_BXE(J,K,IB) = QTMP_B(II,J,K)
  191. Q_BTXE(J,K,IB) = QTMP_BT(II,J,K)
  192. Q2_BXE(J,K,IB) = Q2TMP_B(II,J,K)
  193. Q2_BTXE(J,K,IB) = Q2TMP_BT(II,J,K)
  194. CWM_BXE(J,K,IB) = CWMTMP_B(II,J,K)
  195. CWM_BTXE(J,K,IB) = CWMTMP_BT(II,J,K)
  196. ENDIF
  197. ENDDO
  198. ENDDO
  199. DO K=KTS,KTE
  200. DO J=MAX(JTS-1,JDS+2-1),MIN(JTE+1,JDE-1)
  201. IF(MOD(J,2).EQ.0)THEN ! J=2,4,6,8
  202. U_BXE(J,K,IB) = UTMP_B(II,J,K)
  203. U_BTXE(J,K,IB) = UTMP_BT(II,J,K)
  204. V_BXE(J,K,IB) = VTMP_B(II,J,K)
  205. V_BTXE(J,K,IB) = VTMP_BT(II,J,K)
  206. ENDIF
  207. ENDDO
  208. ENDDO
  209. ENDIF
  210. ENDDO
  211. !
  212. !----------------------------------------------------------------------
  213. !*** SOUTH AND NORTH BOUNDARIES
  214. !----------------------------------------------------------------------
  215. !
  216. !*** USE IBDY=1 FOR SOUTH; 2 FOR NORTH
  217. !
  218. DO IBDY=1,2
  219. !
  220. !*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY.
  221. !
  222. IF(S_BDY.AND.IBDY.EQ.1) THEN
  223. !
  224. ! BF=P_YSB ! Which boundary (YSB=the boundary where Y is at its start)
  225. JB=1 ! Which cell in from boundary
  226. JJ=1 ! Which cell in the domain
  227. !
  228. DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
  229. PD_BYS(I,1,JB) = PDTMP_B(I,JJ)
  230. PD_BTYS(I,1,JB)= PDTMP_BT(I,JJ)
  231. ENDDO
  232. !
  233. DO K=KTS,KTE
  234. DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
  235. T_BYS(I,K,JB) = TTMP_B(I,JJ,K)
  236. T_BTYS(I,K,JB) = TTMP_BT(I,JJ,K)
  237. Q_BYS(I,K,JB) = QTMP_B(I,JJ,K)
  238. Q_BTYS(I,K,JB) = QTMP_BT(I,JJ,K)
  239. Q2_BYS(I,K,JB) = Q2TMP_B(I,JJ,K)
  240. Q2_BTYS(I,K,JB) = Q2TMP_BT(I,JJ,K)
  241. CWM_BYS(I,K,JB) = CWMTMP_B(I,JJ,K)
  242. CWM_BTYS(I,K,JB)= CWMTMP_BT(I,JJ,K)
  243. ENDDO
  244. ENDDO
  245. DO K=KTS,KTE
  246. DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
  247. U_BYS(I,K,JB) = UTMP_B(I,JJ,K)
  248. U_BTYS(I,K,JB) = UTMP_BT(I,JJ,K)
  249. V_BYS(I,K,JB) = VTMP_B(I,JJ,K)
  250. V_BTYS(I,K,JB) = VTMP_BT(I,JJ,K)
  251. ENDDO
  252. ENDDO
  253. ELSEIF (N_BDY.AND.IBDY.EQ.2) THEN
  254. ! BF=P_YEB ! Which boundary (YEB=the boundary where Y is at its end)
  255. JB=1 ! Which cell in from boundary
  256. JJ=JDE ! Which cell in the domain
  257. DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
  258. PD_BYE(I,1,JB) = PDTMP_B(I,JJ)
  259. PD_BTYE(I,1,JB)= PDTMP_BT(I,JJ)
  260. ENDDO
  261. !
  262. DO K=KTS,KTE
  263. DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
  264. T_BYE(I,K,JB) = TTMP_B(I,JJ,K)
  265. T_BTYE(I,K,JB) = TTMP_BT(I,JJ,K)
  266. Q_BYE(I,K,JB) = QTMP_B(I,JJ,K)
  267. Q_BTYE(I,K,JB) = QTMP_BT(I,JJ,K)
  268. Q2_BYE(I,K,JB) = Q2TMP_B(I,JJ,K)
  269. Q2_BTYE(I,K,JB) = Q2TMP_BT(I,JJ,K)
  270. CWM_BYE(I,K,JB) = CWMTMP_B(I,JJ,K)
  271. CWM_BTYE(I,K,JB)= CWMTMP_BT(I,JJ,K)
  272. ENDDO
  273. ENDDO
  274. DO K=KTS,KTE
  275. DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
  276. U_BYE(I,K,JB) = UTMP_B(I,JJ,K)
  277. U_BTYE(I,K,JB) = UTMP_BT(I,JJ,K)
  278. V_BYE(I,K,JB) = VTMP_B(I,JJ,K)
  279. V_BTYE(I,K,JB) = VTMP_BT(I,JJ,K)
  280. ENDDO
  281. ENDDO
  282. ENDIF
  283. ENDDO
  284. END SUBROUTINE NESTBC_PATCH
  285. !----------------------------------------------------------------------
  286. !
  287. SUBROUTINE STATS_FOR_MOVE (XLOC,YLOC,PDYN,MSLP,SQWS &
  288. ,PINT,T,Q,U,V &
  289. ,FIS,PD,SM,PDTOP,PTOP &
  290. ,DETA1,DETA2 &
  291. #ifdef HWRF
  292. ,RESTART,NTIME0 & ! zhang's doing
  293. ,MOVED,MVNEST,NTSD,NPHS,CFREQ & ! CFREQ*DT*NPHS=540s
  294. #else
  295. ,MOVED,MVNEST,NTSD,NPHS &
  296. #endif
  297. ,vortex_tracker &
  298. ,IDS,IDE,JDS,JDE,KDS,KDE &
  299. ,IMS,IME,JMS,JME,KMS,KME &
  300. ,ITS,ITE,JTS,JTE,KTS,KTE )
  301. !**********************************************************************
  302. !$$$ SUBPROGRAM DOCUMENTATION BLOCK
  303. ! . . .
  304. ! SUBPROGRAM: STATS_FOR_MOVE
  305. ! PRGRMMR: gopal
  306. !
  307. ! ABSTRACT:
  308. ! THIS ROUTINE COMPUTES SOME STATS REQUIRED FOR AUTOMATIC GRID MOTION
  309. ! THERE ARE THREE DIFFERENT MODES:
  310. ! vortex_tracker=1 -- follow vortex using old algorithm
  311. ! vortex_tracker=2 -- follow child
  312. ! vortex_tracker=3 -- follow vortex using new HRD algorithm
  313. ! otherwise -- do nothing
  314. ! PROGRAM HISTORY LOG:
  315. ! 05-18-2005 : gopal
  316. !
  317. ! USAGE: CALL STATS_FOR_MOVE FROM SUBROUTINE SOLVE_RUNSTREAM FOR NESTED DOMAIN ONLY
  318. !
  319. ! ATTRIBUTES:
  320. ! LANGUAGE: FORTRAN 90
  321. ! MACHINE : IBM SP
  322. !$$$
  323. !**********************************************************************
  324. USE MODULE_MODEL_CONSTANTS
  325. USE MODULE_DM
  326. IMPLICIT NONE
  327. !
  328. LOGICAL,EXTERNAL :: wrf_dm_on_monitor
  329. LOGICAL,INTENT(INOUT) :: MVNEST ! NMM SWITCH FOR GRID MOTION
  330. LOGICAL,INTENT(IN) :: MOVED
  331. INTEGER,INTENT(IN) :: vortex_tracker
  332. INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
  333. ,IMS,IME,JMS,JME,KMS,KME &
  334. ,ITS,ITE,JTS,JTE,KTS,KTE &
  335. #ifdef HWRF
  336. ,NTSD,NPHS,CFREQ
  337. #else
  338. ,NTSD,NPHS
  339. #endif
  340. !
  341. INTEGER, INTENT(OUT) :: XLOC,YLOC
  342. INTEGER :: NXLOC,NYLOC
  343. REAL :: NSUM1,NSUM2,NSUM3
  344. REAL, DIMENSION(KMS:KME), INTENT(IN) :: DETA1,DETA2
  345. REAL, INTENT(IN) :: PDTOP,PTOP
  346. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: FIS,PD,SM
  347. REAL, DIMENSION(IMS:IME,JMS:JME,KMS:KME), INTENT(IN) :: PINT,T,Q,U,V
  348. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: PDYN,MSLP,SQWS
  349. !
  350. ! LOCAL
  351. #ifdef HWRF
  352. !zhang's doing
  353. INTEGER,INTENT(INOUT) :: NTIME0
  354. LOGICAL,INTENT(IN) :: RESTART
  355. #else
  356. INTEGER,SAVE :: NTIME0
  357. #endif
  358. INTEGER :: IM,JM,IP,JP
  359. INTEGER :: I,K,J,XR,YR,DTMOVE,IDUM,JDUM,ITF,JTF
  360. REAL, PARAMETER :: LAPSR=6.5E-3, GI=1./G,D608=0.608
  361. REAL, PARAMETER :: COEF3=287.05*GI*LAPSR, COEF2=-1./COEF3
  362. REAL, PARAMETER :: TRG=2.0*R_D*GI,LAPSI=1.0/LAPSR
  363. REAL :: DZ,RTOPP,APELP,A,TSFC,STMP0,STMP1
  364. REAL :: SMSUM,SMOUT,XDIFF,YDIFF,PCUT,PGR
  365. REAL :: MINGBL_PDYN,MAXGBL_PDYN,MAXGBL_SQWS
  366. REAL :: MINGBL_MIJ
  367. REAL, DIMENSION(IMS:IME,JMS:JME) :: MIJ
  368. REAL, DIMENSION(IMS:IME,JMS:JME,KMS:KME) :: Z
  369. ! EXEC
  370. ITF=MIN(ITE,IDE-1)
  371. JTF=MIN(JTE,JDE-1)
  372. !----------------------------------------------------------------------------------
  373. ! KEEP NEST MOTION IN SINK WITH PHYSICS TIME STEPS
  374. #ifdef HWRF
  375. IF(MOD(NTSD+1,CFREQ*NPHS)/=0)THEN !FOR FULL COUPLING
  376. IF(MOVED) NTIME0=NTSD !FOR UPDATING NTIM0
  377. #else
  378. IF(MOD(NTSD+1,NPHS)/=0)THEN
  379. #endif
  380. MVNEST=.FALSE.
  381. RETURN
  382. ENDIF
  383. ! DETERMINE THE HEIGHTS ON THE PARENT DOMAIN
  384. DO J = JTS, MIN(JTE,JDE)
  385. DO I = ITS, MIN(ITE,IDE)
  386. Z(I,J,1)=FIS(I,J)*GI
  387. ENDDO
  388. ENDDO
  389. !
  390. DO K = KTS,KTE
  391. DO J = JTS, MIN(JTE,JDE)
  392. DO I = ITS, MIN(ITE,IDE)
  393. APELP = (PINT(I,J,K+1)+PINT(I,J,K))
  394. RTOPP = TRG*T(I,J,K)*(1.0+Q(I,J,K)*P608)/APELP
  395. DZ = RTOPP*(DETA1(K)*PDTOP+DETA2(K)*PD(I,J))
  396. Z(I,J,K+1) = Z(I,J,K) + DZ
  397. ENDDO
  398. ENDDO
  399. ENDDO
  400. ! DETERMINE THE MEAN SEA LEVEL PRESSURE, THE VERTICALLY AVERAGED WIND
  401. ! SPEED AT ABOUT LEVELS 9 10 AND 11 AND THE DYNAMIC PRESSURES DEFINED
  402. ! FROM BASIC BERNOULLI's THEOREM
  403. DO J = JTS, MIN(JTE,JDE)
  404. DO I = ITS, MIN(ITE,IDE)
  405. TSFC = T(I,J,1)*(1.+D608*Q(I,J,1)) + LAPSR*(Z(I,J,1)+Z(I,J,2))*0.5
  406. A = LAPSR*Z(I,J,1)/TSFC
  407. MSLP(I,J) = PINT(I,J,1)*(1-A)**COEF2
  408. SQWS(I,J) = (U(I,J,9)*U(I,J,9) + V(I,J,9)*V(I,J,9) &
  409. + U(I,J,10)*U(I,J,10) + V(I,J,10)*V(I,J,10) &
  410. + U(I,J,11)*U(I,J,11) + V(I,J,11)*V(I,J,11))/3.0
  411. #ifdef HWRF
  412. PDYN(I,J) = MSLP(I,J)
  413. #else
  414. PDYN(I,J) = MSLP(I,J) + 1.1*SQWS(I,J)/2.0
  415. #endif
  416. ENDDO
  417. ENDDO
  418. ! FILTER OUT PDYN AND STORE THAT IN MIJ. THE MAXIMUM VALUE OF MIJ GIVES THE STORM CENTER
  419. ! ALSO DO THAT WITHIN A SUB DOMAIN
  420. MAXGBL_PDYN=MAXVAL(PDYN(ITS:ITF,JTS:JTF))
  421. CALL WRF_DM_MAXVAL(MAXGBL_PDYN,IDUM,JDUM)
  422. MINGBL_PDYN=MINVAL(PDYN(ITS:ITF,JTS:JTF))
  423. CALL WRF_DM_MINVAL(MINGBL_PDYN,IDUM,JDUM)
  424. PCUT = 0.5*(MAXGBL_PDYN + MINGBL_PDYN)
  425. !
  426. IM=IDE/2 - IDE/6
  427. IP=IDE/2 + IDE/6
  428. JM=JDE/2 - JDE/4
  429. JP=JDE/2 + JDE/4
  430. !
  431. DO J = JTS, MIN(JTE,JDE)
  432. DO I = ITS, MIN(ITE,IDE)
  433. IF(I .GE. IM .AND. I .LE. IP .AND. J .GE. JM .AND. J .LE. JP &
  434. .AND. PCUT .GT. PDYN(I,J))THEN
  435. MIJ(I,J) = PDYN(I,J)
  436. ELSE
  437. MIJ(I,J) = 105000.0
  438. ENDIF
  439. ENDDO
  440. ENDDO
  441. DO J = JTS, MIN(JTE,JDE)
  442. DO I = ITS, MIN(ITE,IDE)
  443. PDYN(I,J)=MIJ(I,J)
  444. ENDDO
  445. ENDDO
  446. ! BEGIN OLD TRACKER CODE ----------------------------------------------------
  447. old_tracker_1: if(vortex_tracker == 1) then
  448. !
  449. ! DETERMINE THE LOCATION OF CENTER OF THE CIRCULATION DEFINED BY MIJ AND FIND THE CORRESPONDING MSLP
  450. !
  451. STMP0=MAXGBL_PDYN*100. ! define arbitrary maximum
  452. MINGBL_MIJ=MINVAL(MIJ(ITS:ITF,JTS:JTF))
  453. DO J = JTS, MIN(JTE,JDE)
  454. DO I = ITS, MIN(ITE,IDE)
  455. IF(MIJ(I,J) .EQ. MINGBL_MIJ)THEN
  456. XLOC=I
  457. YLOC=J
  458. STMP0=MSLP(I,J)
  459. ENDIF
  460. ENDDO
  461. ENDDO
  462. CALL WRF_DM_MINVAL(MINGBL_MIJ,XLOC,YLOC)
  463. CALL WRF_DM_MINVAL(STMP0,IDUM,JDUM)
  464. endif old_tracker_1
  465. ! END OLD TRACKER CODE ------------------------------------------------------
  466. ! BEGIN HRD TRACKER CODE ----------------------------------------------------
  467. hwrfx_tracker: if(vortex_tracker == 3) then
  468. ! USE CENTROID TO FIND THE CENTER Xuejin's doing
  469. NSUM1=0.0
  470. NSUM2=0.0
  471. NSUM3=0.0
  472. DO J = JTS, MIN(JTE,JDE)
  473. DO I = ITS, MIN(ITE,IDE)
  474. IF(I .GE. IM .AND. I .LE. IP .AND. J .GE. JM .AND. J .LE. JP )THEN
  475. ! IF(I .EQ. IM .AND. J .EQ. JM)THEN
  476. NSUM1 = NSUM1 + I*(105000.1 - PDYN(I,J))
  477. NSUM2 = NSUM2 + J*(105000.1 - PDYN(I,J))
  478. NSUM3 = NSUM3 + (105000.1 - PDYN(I,J))
  479. ! WRITE(0,*)'TEST',NSUM1,I,J,0.01*(105000.0 - PDYN(I,J)),PDYN(I,J)
  480. ENDIF
  481. ENDDO
  482. ENDDO
  483. NSUM1 = WRF_DM_SUM_REAL(NSUM1)
  484. NSUM2 = WRF_DM_SUM_REAL(NSUM2)
  485. NSUM3 = WRF_DM_SUM_REAL(NSUM3)
  486. NXLOC = NINT(NSUM1/NSUM3)
  487. NYLOC = NINT(NSUM2/NSUM3)
  488. WRITE(0,*)'NEW CALC',NSUM1,NSUM2,NSUM3
  489. WRITE(0,*)'XLOC,YLOC',NXLOC,XLOC,NYLOC,YLOC
  490. XLOC = NXLOC
  491. YLOC = NYLOC
  492. endif hwrfx_tracker
  493. ! END HRD TRACKER CODE ------------------------------------------------------
  494. ! BEGIN OLD TRACKER CODE ----------------------------------------------------
  495. ! DETERMINE THE MAXIMUM MSLP AT ABOUT 18 GRID POINTS AWAY FROM THE STORM CENTER
  496. old_tracker_2: if ( vortex_tracker == 1 ) then
  497. STMP1=0.0
  498. DO J = JTS, MIN(JTE,JDE)
  499. DO I = ITS, MIN(ITE,IDE)
  500. IF(I .EQ. XLOC+18)THEN
  501. XR=I
  502. YR=J
  503. STMP1=MSLP(I,J)
  504. ENDIF
  505. ENDDO
  506. ENDDO
  507. CALL WRF_DM_MAXVAL(STMP1,XR,YR)
  508. !
  509. ! DETERMINE IF THE ENTIRE NESTED DOMAIN IS OVER LAND (SM=0)
  510. !
  511. SMSUM = 0.0
  512. DO J = JTS, MIN(JTE,JDE)
  513. DO I = ITS, MIN(ITE,IDE)
  514. SMSUM = SMSUM + SM(I,J)
  515. ENDDO
  516. ENDDO
  517. SMOUT=WRF_DM_SUM_REAL(SMSUM)/(IDE*JDE)
  518. ! STOP GRID MOTION. AVOID MOVING TOO RAPID GRID MOTION, SAY SOMETHING LIKE EVERY
  519. ! OTHER TIME STEP OR SO
  520. PGR=STMP1-STMP0
  521. endif old_tracker_2
  522. ! END OLD TRACKER CODE ------------------------------------------------
  523. XDIFF=ABS(XLOC - IDE/2)
  524. YDIFF=ABS(YLOC - JDE/2)
  525. #ifdef HWRF
  526. !zhang's doing
  527. IF((.NOT.RESTART .AND. NTSD==0) .OR. MOVED)NTIME0=NTSD
  528. #else
  529. IF(NTSD==0 .OR. MOVED)NTIME0=NTSD
  530. #endif
  531. DTMOVE=NTSD-NTIME0 ! TIME INTERVAL SINCE THE PREVIOUS MOVE
  532. !
  533. ! DECIDE IF NEST MOTION SHOULD HAPPEN
  534. !
  535. if(vortex_tracker == 3) then
  536. ! Using new HRD tracker. Move if centroid moved.
  537. IF(XDIFF .GE. 1 .OR. YDIFF .GE. 2) THEN
  538. MVNEST=.TRUE.
  539. NTIME0=NTSD
  540. ELSE
  541. ! Centroid has not moved one parent gridpoint yet.
  542. MVNEST=.FALSE.
  543. ENDIF
  544. elseif(vortex_tracker==2) then
  545. ! Tracking child domain. Nest motion check happens in
  546. ! direction_of_move2, but we MUST set mvnest=true here:
  547. MVNEST=.TRUE.
  548. elseif(vortex_tracker==1) then
  549. ! Using old HWRF tracker. Decide if it wants to move.
  550. IF(DTMOVE .LE. 45 .OR. PGR .LE. 200.)THEN
  551. WRITE(0,*)'SUSPEND MOTION: SMALL DTMOVE OR WEAK PGF:','DTMOVE=',DTMOVE,'PGR=',PGR
  552. MVNEST=.FALSE. ! SET STATIC GRID
  553. ELSE IF(STMP0 .GE. STMP1)THEN
  554. WRITE(0,*)'SUSPEND MOTION: THERE IS NO VORTEX IN THE DOMAIN:','STMP0=',STMP0,'STMP1=',STMP1
  555. MVNEST=.FALSE.
  556. ELSE IF(XDIFF .GT. 24 .OR. YDIFF .GT. 24)THEN
  557. WRITE(0,*)'SUSPEND MOTION: LOST VORTEX ','DTMOVE=',DTMOVE,'XDIFF=',XDIFF,'YDIFF=',YDIFF
  558. MVNEST=.FALSE.
  559. ELSE IF(SMOUT .LE. 0.2 .AND. XDIFF .GT. 12 .AND. YDIFF .GT. 12)THEN
  560. WRITE(0,*)'SUSPEND MOTION: VORTEX LOST OVER LAND ','DTMOVE=',DTMOVE,'XDIFF=',XDIFF,'YDIFF=',YDIFF
  561. MVNEST=.FALSE.
  562. ELSE IF(SMOUT .LE. 0.2 .AND. PGR .LE. 400.)THEN
  563. WRITE(0,*)'SUSPEND MOTION: VORTEX WEAK OVER LAND ','SMOUT=',SMOUT,'PGR=',PGR
  564. MVNEST=.FALSE.
  565. ELSE IF(SMOUT .LE. 0.2 .AND. DTMOVE .GE. 1500)THEN
  566. WRITE(0,*)'SUSPEND MOTION: STOP MOTION OVER LAND','SMOUT=',SMOUT,'DTMOVE=',DTMOVE
  567. MVNEST=.FALSE.
  568. ELSE
  569. MVNEST=.TRUE.
  570. ENDIF
  571. else
  572. ! Not using any valid trackers, so set MVNEST to false.
  573. MVNEST=.false.
  574. endif
  575. RETURN
  576. END SUBROUTINE STATS_FOR_MOVE
  577. !----------------------------------------------------------------------------------
  578. SUBROUTINE MSLP_DIAG (MSLP,PINT,T,Q &
  579. ,FIS,PD,DETA1,DETA2,PDTOP &
  580. ,IDS,IDE,JDS,JDE,KDS,KDE &
  581. ,IMS,IME,JMS,JME,KMS,KME &
  582. ,ITS,ITE,JTS,JTE,KTS,KTE )
  583. !**********************************************************************
  584. !$$$ SUBPROGRAM DOCUMENTATION BLOCK
  585. ! . . .
  586. ! SUBPROGRAM: MSLP_DIAG
  587. ! PRGRMMR: gopal
  588. !
  589. ! ABSTRACT:
  590. ! THIS ROUTINE COMPUTES MSLP OVER THE PARENT DOMAIN FOR DIAGONOSTIC PURPOSE
  591. ! PROGRAM HISTORY LOG:
  592. ! 07-21-2005 : gopal
  593. !
  594. ! USAGE: CALL MSLP_DIAG FROM THE SOLVER
  595. !
  596. ! ATTRIBUTES:
  597. ! LANGUAGE: FORTRAN 90
  598. ! MACHINE : IBM SP/Linux cluster
  599. !$$$
  600. USE MODULE_MODEL_CONSTANTS
  601. USE MODULE_DM
  602. IMPLICIT NONE
  603. ! global variables
  604. INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
  605. ,IMS,IME,JMS,JME,KMS,KME &
  606. ,ITS,ITE,JTS,JTE,KTS,KTE
  607. REAL, INTENT(IN) :: PDTOP
  608. REAL, DIMENSION(KMS:KME), INTENT(IN) :: DETA1,DETA2
  609. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: MSLP
  610. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: FIS,PD
  611. REAL, DIMENSION(IMS:IME,JMS:JME,KMS:KME), INTENT(IN) :: PINT,T,Q
  612. ! local variables
  613. REAL, PARAMETER :: LAPSR=6.5E-3, GI=1./G,D608=0.608
  614. REAL, PARAMETER :: COEF3=287.05*GI*LAPSR, COEF2=-1./COEF3
  615. REAL, PARAMETER :: TRG=2.0*R_D*GI,LAPSI=1.0/LAPSR
  616. REAL :: RTOPP,APELP,DZ,SFCT,A
  617. REAL, DIMENSION(IMS:IME,JMS:JME,KMS:KME) :: Z
  618. INTEGER :: I,J,K
  619. !-----------------------------------------------------------------------------------------------------
  620. DO J = JTS, MIN(JTE,JDE)
  621. DO I = ITS, MIN(ITE,IDE)
  622. Z(I,J,1)=FIS(I,J)*GI
  623. ENDDO
  624. ENDDO
  625. DO K = KTS,KTE
  626. DO J = JTS, MIN(JTE,JDE)
  627. DO I = ITS, MIN(ITE,IDE)
  628. APELP = (PINT(I,J,K+1)+PINT(I,J,K))
  629. RTOPP = TRG*T(I,J,K)*(1.0+Q(I,J,K)*P608)/APELP
  630. DZ = RTOPP*(DETA1(K)*PDTOP+DETA2(K)*PD(I,J))
  631. Z(I,J,K+1) = Z(I,J,K) + DZ
  632. ENDDO
  633. ENDDO
  634. ENDDO
  635. MSLP=-9999.99
  636. DO J = JTS, MIN(JTE,JDE)
  637. DO I = ITS, MIN(ITE,IDE)
  638. SFCT = T(I,J,1)*(1.+D608*Q(I,J,1)) + LAPSR*(Z(I,J,1)+Z(I,J,2))*0.5
  639. A = LAPSR*Z(I,J,1)/SFCT
  640. MSLP(I,J) = PINT(I,J,1)*(1-A)**COEF2
  641. ENDDO
  642. ENDDO
  643. END SUBROUTINE MSLP_DIAG
  644. !------------------------------------------------------------------------------------------------------
  645. END MODULE module_NEST_UTIL