2 !NCEP_MESO:MODEL_LAYER: BOUNDARY CONDITION UPDATES
4 !----------------------------------------------------------------------
6 MODULE module_NEST_UTIL
8 !----------------------------------------------------------------------
10 USE MODULE_STATE_DESCRIPTION
16 !----------------------------------------------------------------------
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 &
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 &
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
45 ! THIS IS JUST A FIX FOR USING NESTED BOUNDARIES IN THE HALO REGION
46 ! PROGRAM HISTORY LOG:
49 ! USAGE: CALL PATCH FROM SUBROUTINE SOLVE_RUNSTREAM FOR NESTED DOMAIN ONLY
52 ! LANGUAGE: FORTRAN 90
55 !**********************************************************************
56 !----------------------------------------------------------------------
60 !----------------------------------------------------------------------
63 INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
64 ,IMS,IME,JMS,JME,KMS,KME &
65 ,ITS,ITE,JTS,JTE,KTS,KTE
66 INTEGER,INTENT(IN) :: SPEC_BDY_WIDTH
69 REAL,DIMENSION(IMS:IME,1,SPEC_BDY_WIDTH) &
70 ,INTENT(INOUT) :: PD_BYS,PD_BYE &
73 REAL,DIMENSION(IMS:IME,KMS:KME,SPEC_BDY_WIDTH) &
74 ,INTENT(INOUT) :: CWM_BYS,CWM_BYE &
81 REAL,DIMENSION(IMS:IME,KMS:KME,SPEC_BDY_WIDTH) &
82 ,INTENT(INOUT) :: CWM_BTYS,CWM_BTYE &
91 REAL,DIMENSION(JMS:JME,1,SPEC_BDY_WIDTH) &
92 ,INTENT(INOUT) :: PD_BXS,PD_BXE &
95 REAL,DIMENSION(JMS:JME,KMS:KME,SPEC_BDY_WIDTH) &
96 ,INTENT(INOUT) :: CWM_BXS,CWM_BXE &
103 REAL,DIMENSION(JMS:JME,KMS:KME,SPEC_BDY_WIDTH) &
104 ,INTENT(INOUT) :: CWM_BTXS,CWM_BTXE &
113 REAL,DIMENSION(IMS:IME,JMS:JME) &
114 ,INTENT(IN) :: PDTMP_B,PDTMP_BT
116 REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME) &
117 ,INTENT(IN) :: CWMTMP_B,CWMTMP_BT &
126 !----------------------------------------------------------------------
130 LOGICAL :: E_BDY,W_BDY,N_BDY,S_BDY
131 INTEGER :: I,J,K,IBDY,II,JJ,IB,JB,IIM,JJM,BF
132 !----------------------------------------------------------------------
133 !**********************************************************************
134 !----------------------------------------------------------------------
141 !----------------------------------------------------------------------
142 !*** WEST AND EAST BOUNDARIES
143 !----------------------------------------------------------------------
145 !*** USE IBDY=1 FOR WEST; 2 FOR EAST.
147 ! WRITE(0,*)'WESTERN BC FOR PATCH',IDS,MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
152 !*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY.
154 IF(W_BDY.AND.IBDY.EQ.1)THEN
155 ! BF=P_XSB ! Which boundary (XSB=the boundary where X is at its start)
156 IB=1 ! Which cell in from boundary
157 II=1 ! Which cell in the domain
159 DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
160 IF(MOD(J,2).EQ.1)THEN ! J=3,5,7,9
161 PD_BXS(J,1,IB) =PDTMP_B(II,J)
162 PD_BTXS(J,1,IB) =PDTMP_BT(II,J)
167 DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
168 IF(MOD(J,2).EQ.1)THEN ! J=3,5,7,9
169 T_BXS(J,K,IB) = TTMP_B(II,J,K)
170 T_BTXS(J,K,IB) = TTMP_BT(II,J,K)
171 Q_BXS(J,K,IB) = QTMP_B(II,J,K)
172 Q_BTXS(J,K,IB) = QTMP_BT(II,J,K)
173 Q2_BXS(J,K,IB) = Q2TMP_B(II,J,K)
174 Q2_BTXS(J,K,IB) = Q2TMP_BT(II,J,K)
175 CWM_BXS(J,K,IB) = CWMTMP_B(II,J,K)
176 CWM_BTXS(J,K,IB) = CWMTMP_BT(II,J,K)
182 DO J=MAX(JTS-1,JDS+2-1),MIN(JTE+1,JDE-1)
183 IF(MOD(J,2).EQ.0)THEN ! J=2,4,6,8
184 U_BXS(J,K,IB) = UTMP_B(II,J,K)
185 U_BTXS(J,K,IB) = UTMP_BT(II,J,K)
186 V_BXS(J,K,IB) = VTMP_B(II,J,K)
187 V_BTXS(J,K,IB) = VTMP_BT(II,J,K)
192 ELSEIF (E_BDY.AND.IBDY.EQ.2) THEN
194 ! BF=P_XEB ! Which boundary (XEB=the boundary where X is at its end)
195 IB=1 ! Which cell in from boundary
196 II=IDE ! Which cell in the domain
198 DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
199 IF(MOD(J,2).EQ.1)THEN ! J=3,5,7,9
200 PD_BXE(J,1,IB) =PDTMP_B(II,J)
201 PD_BTXE(J,1,IB) =PDTMP_BT(II,J)
206 DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
207 IF(MOD(J,2).EQ.1)THEN ! J=3,5,7,9
208 T_BXE(J,K,IB) = TTMP_B(II,J,K)
209 T_BTXE(J,K,IB) = TTMP_BT(II,J,K)
210 Q_BXE(J,K,IB) = QTMP_B(II,J,K)
211 Q_BTXE(J,K,IB) = QTMP_BT(II,J,K)
212 Q2_BXE(J,K,IB) = Q2TMP_B(II,J,K)
213 Q2_BTXE(J,K,IB) = Q2TMP_BT(II,J,K)
214 CWM_BXE(J,K,IB) = CWMTMP_B(II,J,K)
215 CWM_BTXE(J,K,IB) = CWMTMP_BT(II,J,K)
221 DO J=MAX(JTS-1,JDS+2-1),MIN(JTE+1,JDE-1)
222 IF(MOD(J,2).EQ.0)THEN ! J=2,4,6,8
223 U_BXE(J,K,IB) = UTMP_B(II,J,K)
224 U_BTXE(J,K,IB) = UTMP_BT(II,J,K)
225 V_BXE(J,K,IB) = VTMP_B(II,J,K)
226 V_BTXE(J,K,IB) = VTMP_BT(II,J,K)
234 !----------------------------------------------------------------------
235 !*** SOUTH AND NORTH BOUNDARIES
236 !----------------------------------------------------------------------
238 !*** USE IBDY=1 FOR SOUTH; 2 FOR NORTH
242 !*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY.
244 IF(S_BDY.AND.IBDY.EQ.1) THEN
246 ! BF=P_YSB ! Which boundary (YSB=the boundary where Y is at its start)
247 JB=1 ! Which cell in from boundary
248 JJ=1 ! Which cell in the domain
250 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
251 PD_BYS(I,1,JB) = PDTMP_B(I,JJ)
252 PD_BTYS(I,1,JB)= PDTMP_BT(I,JJ)
257 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
258 T_BYS(I,K,JB) = TTMP_B(I,JJ,K)
259 T_BTYS(I,K,JB) = TTMP_BT(I,JJ,K)
260 Q_BYS(I,K,JB) = QTMP_B(I,JJ,K)
261 Q_BTYS(I,K,JB) = QTMP_BT(I,JJ,K)
262 Q2_BYS(I,K,JB) = Q2TMP_B(I,JJ,K)
263 Q2_BTYS(I,K,JB) = Q2TMP_BT(I,JJ,K)
264 CWM_BYS(I,K,JB) = CWMTMP_B(I,JJ,K)
265 CWM_BTYS(I,K,JB)= CWMTMP_BT(I,JJ,K)
270 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
271 U_BYS(I,K,JB) = UTMP_B(I,JJ,K)
272 U_BTYS(I,K,JB) = UTMP_BT(I,JJ,K)
273 V_BYS(I,K,JB) = VTMP_B(I,JJ,K)
274 V_BTYS(I,K,JB) = VTMP_BT(I,JJ,K)
278 ELSEIF (N_BDY.AND.IBDY.EQ.2) THEN
279 ! BF=P_YEB ! Which boundary (YEB=the boundary where Y is at its end)
280 JB=1 ! Which cell in from boundary
281 JJ=JDE ! Which cell in the domain
283 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
284 PD_BYE(I,1,JB) = PDTMP_B(I,JJ)
285 PD_BTYE(I,1,JB)= PDTMP_BT(I,JJ)
290 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
291 T_BYE(I,K,JB) = TTMP_B(I,JJ,K)
292 T_BTYE(I,K,JB) = TTMP_BT(I,JJ,K)
293 Q_BYE(I,K,JB) = QTMP_B(I,JJ,K)
294 Q_BTYE(I,K,JB) = QTMP_BT(I,JJ,K)
295 Q2_BYE(I,K,JB) = Q2TMP_B(I,JJ,K)
296 Q2_BTYE(I,K,JB) = Q2TMP_BT(I,JJ,K)
297 CWM_BYE(I,K,JB) = CWMTMP_B(I,JJ,K)
298 CWM_BTYE(I,K,JB)= CWMTMP_BT(I,JJ,K)
303 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
304 U_BYE(I,K,JB) = UTMP_B(I,JJ,K)
305 U_BTYE(I,K,JB) = UTMP_BT(I,JJ,K)
306 V_BYE(I,K,JB) = VTMP_B(I,JJ,K)
307 V_BTYE(I,K,JB) = VTMP_BT(I,JJ,K)
315 END SUBROUTINE NESTBC_PATCH
317 !----------------------------------------------------------------------
319 SUBROUTINE STATS_FOR_MOVE (XLOC,YLOC,PDYN,MSLP,SQWS &
321 ,FIS,PD,SM,PDTOP,PTOP &
324 ,RESTART,NTIME0 & ! zhang's doing
325 ,MOVED,MVNEST,NTSD,NPHS,CFREQ & ! CFREQ*DT*NPHS=540s
327 ,MOVED,MVNEST,NTSD,NPHS &
329 ,IDS,IDE,JDS,JDE,KDS,KDE &
330 ,IMS,IME,JMS,JME,KMS,KME &
331 ,ITS,ITE,JTS,JTE,KTS,KTE )
333 !**********************************************************************
334 !$$$ SUBPROGRAM DOCUMENTATION BLOCK
336 ! SUBPROGRAM: STATS_FOR_MOVE
340 ! THIS ROUTINE COMPUTES SOME STATS REQUIRED FOR AUTOMATIC GRID MOTION
341 ! PROGRAM HISTORY LOG:
344 ! USAGE: CALL STATS_FOR_MOVE FROM SUBROUTINE SOLVE_RUNSTREAM FOR NESTED DOMAIN ONLY
347 ! LANGUAGE: FORTRAN 90
350 !**********************************************************************
352 USE MODULE_MODEL_CONSTANTS
357 LOGICAL,EXTERNAL :: wrf_dm_on_monitor
358 LOGICAL,INTENT(INOUT) :: MVNEST ! NMM SWITCH FOR GRID MOTION
359 LOGICAL,INTENT(IN) :: MOVED
360 INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
361 ,IMS,IME,JMS,JME,KMS,KME &
362 ,ITS,ITE,JTS,JTE,KTS,KTE &
369 INTEGER, INTENT(OUT) :: XLOC,YLOC
371 INTEGER :: NXLOC,NYLOC
372 REAL :: NSUM1,NSUM2,NSUM3
374 REAL, DIMENSION(KMS:KME), INTENT(IN) :: DETA1,DETA2
375 REAL, INTENT(IN) :: PDTOP,PTOP
376 REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: FIS,PD,SM
377 REAL, DIMENSION(IMS:IME,JMS:JME,KMS:KME), INTENT(IN) :: PINT,T,Q,U,V
378 REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: PDYN,MSLP,SQWS
385 INTEGER,INTENT(INOUT) :: NTIME0
389 LOGICAL,INTENT(IN) :: RESTART
391 INTEGER,SAVE :: NTIME0
393 INTEGER :: IM,JM,IP,JP
394 INTEGER :: I,K,J,XR,YR,DTMOVE,IDUM,JDUM,ITF,JTF
395 REAL, PARAMETER :: LAPSR=6.5E-3, GI=1./G,D608=0.608
396 REAL, PARAMETER :: COEF3=287.05*GI*LAPSR, COEF2=-1./COEF3
397 REAL, PARAMETER :: TRG=2.0*R_D*GI,LAPSI=1.0/LAPSR
398 REAL :: DZ,RTOPP,APELP,A,TSFC,STMP0,STMP1
399 REAL :: SMSUM,SMOUT,XDIFF,YDIFF,PCUT,PGR
400 REAL :: MINGBL_PDYN,MAXGBL_PDYN,MAXGBL_SQWS
402 REAL, DIMENSION(IMS:IME,JMS:JME) :: MIJ
403 REAL, DIMENSION(IMS:IME,JMS:JME,KMS:KME) :: Z
410 !----------------------------------------------------------------------------------
412 ! KEEP NEST MOTION IN SINK WITH PHYSICS TIME STEPS
414 IF(MOD(NTSD+1,CFREQ*NPHS)/=0)THEN !FOR FULL COUPLING
415 IF(MOVED) NTIME0=NTSD !FOR UPDATING NTIM0
417 IF(MOD(NTSD+1,NPHS)/=0)THEN
423 ! DETERMINE THE HEIGHTS ON THE PARENT DOMAIN
425 DO J = JTS, MIN(JTE,JDE)
426 DO I = ITS, MIN(ITE,IDE)
432 DO J = JTS, MIN(JTE,JDE)
433 DO I = ITS, MIN(ITE,IDE)
434 APELP = (PINT(I,J,K+1)+PINT(I,J,K))
435 RTOPP = TRG*T(I,J,K)*(1.0+Q(I,J,K)*P608)/APELP
436 DZ = RTOPP*(DETA1(K)*PDTOP+DETA2(K)*PD(I,J))
437 Z(I,J,K+1) = Z(I,J,K) + DZ
442 ! DETERMINE THE MEAN SEA LEVEL PRESSURE, THE VERTICALLY AVERAGED WIND
443 ! SPEED AT ABOUT LEVELS 9 10 AND 11 AND THE DYNAMIC PRESSURES DEFINED
444 ! FROM BASIC BERNOULLI's THEOREM
446 DO J = JTS, MIN(JTE,JDE)
447 DO I = ITS, MIN(ITE,IDE)
448 TSFC = T(I,J,1)*(1.+D608*Q(I,J,1)) + LAPSR*(Z(I,J,1)+Z(I,J,2))*0.5
449 A = LAPSR*Z(I,J,1)/TSFC
450 MSLP(I,J) = PINT(I,J,1)*(1-A)**COEF2
451 SQWS(I,J) = (U(I,J,9)*U(I,J,9) + V(I,J,9)*V(I,J,9) &
452 + U(I,J,10)*U(I,J,10) + V(I,J,10)*V(I,J,10) &
453 + U(I,J,11)*U(I,J,11) + V(I,J,11)*V(I,J,11))/3.0
455 PDYN(I,J) = MSLP(I,J)
457 PDYN(I,J) = MSLP(I,J) + 1.1*SQWS(I,J)/2.0
462 ! FILTER OUT PDYN AND STORE THAT IN MIJ. THE MAXIMUM VALUE OF MIJ GIVES THE STORM CENTER
463 ! ALSO DO THAT WITHIN A SUB DOMAIN
465 MAXGBL_PDYN=MAXVAL(PDYN(ITS:ITF,JTS:JTF))
466 CALL WRF_DM_MAXVAL(MAXGBL_PDYN,IDUM,JDUM)
467 MINGBL_PDYN=MINVAL(PDYN(ITS:ITF,JTS:JTF))
468 CALL WRF_DM_MINVAL(MINGBL_PDYN,IDUM,JDUM)
469 PCUT = 0.5*(MAXGBL_PDYN + MINGBL_PDYN)
476 DO J = JTS, MIN(JTE,JDE)
477 DO I = ITS, MIN(ITE,IDE)
478 IF(I .GE. IM .AND. I .LE. IP .AND. J .GE. JM .AND. J .LE. JP &
479 .AND. PCUT .GT. PDYN(I,J))THEN
487 DO J = JTS, MIN(JTE,JDE)
488 DO I = ITS, MIN(ITE,IDE)
493 ! DETERMINE THE LOCATION OF CENTER OF THE CIRCULATION DEFINED BY MIJ AND FIND THE CORRESPONDING MSLP
495 STMP0=MAXGBL_PDYN*100. ! define arbitrary maximum
496 MINGBL_MIJ=MINVAL(MIJ(ITS:ITF,JTS:JTF))
497 DO J = JTS, MIN(JTE,JDE)
498 DO I = ITS, MIN(ITE,IDE)
499 IF(MIJ(I,J) .EQ. MINGBL_MIJ)THEN
507 CALL WRF_DM_MINVAL(MINGBL_MIJ,XLOC,YLOC)
508 CALL WRF_DM_MINVAL(STMP0,IDUM,JDUM)
510 ! USE CENTROID TO FIND THE CENTER Xuejin's doing
515 DO J = JTS, MIN(JTE,JDE)
516 DO I = ITS, MIN(ITE,IDE)
517 IF(I .GE. IM .AND. I .LE. IP .AND. J .GE. JM .AND. J .LE. JP )THEN
518 ! IF(I .EQ. IM .AND. J .EQ. JM)THEN
519 NSUM1 = NSUM1 + I*(105000.1 - PDYN(I,J))
520 NSUM2 = NSUM2 + J*(105000.1 - PDYN(I,J))
521 NSUM3 = NSUM3 + (105000.1 - PDYN(I,J))
522 ! NSUM1 = NSUM1 + I*(PCUT+0.1 - PDYN(I,J))
523 ! NSUM2 = NSUM2 + J*(PCUT+0.1 - PDYN(I,J))
524 ! NSUM3 = NSUM3 + (PCUT+0.1 - PDYN(I,J))
525 ! WRITE(0,*)'TEST',NSUM1,I,J,0.01*(105000.0 - PDYN(I,J)),PDYN(I,J)
529 NSUM1 = WRF_DM_SUM_REAL(NSUM1)
530 NSUM2 = WRF_DM_SUM_REAL(NSUM2)
531 NSUM3 = WRF_DM_SUM_REAL(NSUM3)
532 NXLOC = NINT(NSUM1/NSUM3)
533 NYLOC = NINT(NSUM2/NSUM3)
535 WRITE(0,*)'NEW CALC',NSUM1,NSUM2,NSUM3
536 WRITE(0,*)'XLOC,YLOC',NXLOC,XLOC,NYLOC,YLOC
543 ! DETERMINE THE MAXIMUM MSLP AT ABOUT 18 GRID POINTS AWAY FROM THE STORM CENTER
546 DO J = JTS, MIN(JTE,JDE)
547 DO I = ITS, MIN(ITE,IDE)
548 IF(I .EQ. XLOC+18)THEN
556 CALL WRF_DM_MAXVAL(STMP1,XR,YR)
559 ! DETERMINE IF THE ENTIRE NESTED DOMAIN IS OVER LAND (SM=0)
563 DO J = JTS, MIN(JTE,JDE)
564 DO I = ITS, MIN(ITE,IDE)
565 SMSUM = SMSUM + SM(I,J)
569 SMOUT=WRF_DM_SUM_REAL(SMSUM)/(IDE*JDE)
571 ! STOP GRID MOTION. AVOID MOVING TOO RAPID GRID MOTION, SAY SOMETHING LIKE EVERY
572 ! OTHER TIME STEP OR SO
575 XDIFF=ABS(XLOC - IDE/2)
576 YDIFF=ABS(YLOC - JDE/2)
579 IF((.NOT.RESTART .AND. NTSD==0) .OR. MOVED)NTIME0=NTSD
581 IF(NTSD==0 .OR. MOVED)NTIME0=NTSD
583 DTMOVE=NTSD-NTIME0 ! TIME INTERVAL SINCE THE PREVIOUS MOVE
586 IF(XDIFF .GE. 1 .OR. YDIFF .GE. 2) THEN
591 WRITE(0,*)'SUSPEND MOTION: DTMOVE=',DTMOVE,'LESS THAN 3 MINUTS'
592 WRITE(0,*)'SUSPEND MOTION: NTIME0=',NTIME0
595 IF(DTMOVE .LE. 45 .OR. PGR .LE. 200.)THEN
596 WRITE(0,*)'SUSPEND MOTION: SMALL DTMOVE OR WEAK PGF:','DTMOVE=',DTMOVE,'PGR=',PGR
597 MVNEST=.FALSE. ! SET STATIC GRID
598 ELSE IF(STMP0 .GE. STMP1)THEN
599 WRITE(0,*)'SUSPEND MOTION: THERE IS NO VORTEX IN THE DOMAIN:','STMP0=',STMP0,'STMP1=',STMP1
601 ELSE IF(XDIFF .GT. 24 .OR. YDIFF .GT. 24)THEN
602 WRITE(0,*)'SUSPEND MOTION: LOST VORTEX ','DTMOVE=',DTMOVE,'XDIFF=',XDIFF,'YDIFF=',YDIFF
604 ELSE IF(SMOUT .LE. 0.2 .AND. XDIFF .GT. 12 .AND. YDIFF .GT. 12)THEN
605 WRITE(0,*)'SUSPEND MOTION: VORTEX LOST OVER LAND ','DTMOVE=',DTMOVE,'XDIFF=',XDIFF,'YDIFF=',YDIFF
607 ELSE IF(SMOUT .LE. 0.2 .AND. PGR .LE. 400.)THEN
608 WRITE(0,*)'SUSPEND MOTION: VORTEX WEAK OVER LAND ','SMOUT=',SMOUT,'PGR=',PGR
610 ELSE IF(SMOUT .LE. 0.2 .AND. DTMOVE .GE. 1500)THEN
611 WRITE(0,*)'SUSPEND MOTION: STOP MOTION OVER LAND','SMOUT=',SMOUT,'DTMOVE=',DTMOVE
620 END SUBROUTINE STATS_FOR_MOVE
621 !----------------------------------------------------------------------------------
622 SUBROUTINE MSLP_DIAG (MSLP,PINT,T,Q &
623 ,FIS,PD,DETA1,DETA2,PDTOP &
624 ,IDS,IDE,JDS,JDE,KDS,KDE &
625 ,IMS,IME,JMS,JME,KMS,KME &
626 ,ITS,ITE,JTS,JTE,KTS,KTE )
629 !**********************************************************************
630 !$$$ SUBPROGRAM DOCUMENTATION BLOCK
632 ! SUBPROGRAM: MSLP_DIAG
636 ! THIS ROUTINE COMPUTES MSLP OVER THE PARENT DOMAIN FOR DIAGONOSTIC PURPOSE
637 ! PROGRAM HISTORY LOG:
640 ! USAGE: CALL MSLP_DIAG FROM THE SOLVER
643 ! LANGUAGE: FORTRAN 90
644 ! MACHINE : IBM SP/Linux cluster
647 USE MODULE_MODEL_CONSTANTS
654 INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
655 ,IMS,IME,JMS,JME,KMS,KME &
656 ,ITS,ITE,JTS,JTE,KTS,KTE
658 REAL, INTENT(IN) :: PDTOP
659 REAL, DIMENSION(KMS:KME), INTENT(IN) :: DETA1,DETA2
660 REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: MSLP
661 REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: FIS,PD
662 REAL, DIMENSION(IMS:IME,JMS:JME,KMS:KME), INTENT(IN) :: PINT,T,Q
666 REAL, PARAMETER :: LAPSR=6.5E-3, GI=1./G,D608=0.608
667 REAL, PARAMETER :: COEF3=287.05*GI*LAPSR, COEF2=-1./COEF3
668 REAL, PARAMETER :: TRG=2.0*R_D*GI,LAPSI=1.0/LAPSR
669 REAL :: RTOPP,APELP,DZ,SFCT,A
670 REAL, DIMENSION(IMS:IME,JMS:JME,KMS:KME) :: Z
672 !-----------------------------------------------------------------------------------------------------
675 DO J = JTS, MIN(JTE,JDE)
676 DO I = ITS, MIN(ITE,IDE)
682 DO J = JTS, MIN(JTE,JDE)
683 DO I = ITS, MIN(ITE,IDE)
684 APELP = (PINT(I,J,K+1)+PINT(I,J,K))
685 RTOPP = TRG*T(I,J,K)*(1.0+Q(I,J,K)*P608)/APELP
686 DZ = RTOPP*(DETA1(K)*PDTOP+DETA2(K)*PD(I,J))
687 Z(I,J,K+1) = Z(I,J,K) + DZ
693 DO J = JTS, MIN(JTE,JDE)
694 DO I = ITS, MIN(ITE,IDE)
695 SFCT = T(I,J,1)*(1.+D608*Q(I,J,1)) + LAPSR*(Z(I,J,1)+Z(I,J,2))*0.5
696 A = LAPSR*Z(I,J,1)/SFCT
697 MSLP(I,J) = PINT(I,J,1)*(1-A)**COEF2
702 END SUBROUTINE MSLP_DIAG
703 !------------------------------------------------------------------------------------------------------
705 END MODULE module_NEST_UTIL