module_NEST_UTIL.F

References to this file elsewhere.
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_B,T_B,Q_B,U_B,V_B,Q2_B,CWM_B                             &
21                              ,PD_BT,T_BT,Q_BT,U_BT,V_BT,Q2_BT,CWM_BT                      & 
22                              ,PDTMP_B,TTMP_B,QTMP_B,UTMP_B,VTMP_B,Q2TMP_B,CWMTMP_B        &
23                              ,PDTMP_BT,TTMP_BT,QTMP_BT,UTMP_BT,VTMP_BT,Q2TMP_BT,CWMTMP_BT &
24                              ,IJDS,IJDE,SPEC_BDY_WIDTH                                    &  ! min/max(id,jd)
25                              ,IDS,IDE,JDS,JDE,KDS,KDE                                     &
26                              ,IMS,IME,JMS,JME,KMS,KME                                     &
27                              ,ITS,ITE,JTS,JTE,KTS,KTE                                     )
28 !**********************************************************************
29 !$$$  SUBPROGRAM DOCUMENTATION BLOCK
30 !                .      .    .     
31 ! SUBPROGRAM:    PATCH       
32 !   PRGRMMR: gopal 
33 !     
34 ! ABSTRACT:
35 !         THIS IS JUST A FIX FOR USING NESTED BOUNDARIES IN THE HALLO REGION     
36 ! PROGRAM HISTORY LOG:
37 !   09-23-2004  : gopal 
38 !     
39 ! USAGE: CALL PATCH FROM SUBROUTINE SOLVE_RUNSTREAM FOR NESTED DOMAIN ONLY
40 !  
41 ! ATTRIBUTES:
42 !   LANGUAGE: FORTRAN 90
43 !   MACHINE : IBM SP
44 !$$$  
45 !**********************************************************************
46 !----------------------------------------------------------------------
47 !
48       IMPLICIT NONE
49 !
50 !----------------------------------------------------------------------
51 !
52 
53       INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE                    &
54                            ,IMS,IME,JMS,JME,KMS,KME                    &
55                            ,ITS,ITE,JTS,JTE,KTS,KTE
56       INTEGER,INTENT(IN) :: IJDS,IJDE,SPEC_BDY_WIDTH
57 !
58 !
59       REAL,DIMENSION(IJDS:IJDE,1,SPEC_BDY_WIDTH,4)                     &
60                                            ,INTENT(INOUT) :: PD_B,PD_BT
61 !
62       REAL,DIMENSION(IJDS:IJDE,KMS:KME,SPEC_BDY_WIDTH,4)                &
63                                       ,INTENT(INOUT) :: CWM_B,Q_B,Q2_B, &
64                                                         T_B,U_B,V_B 
65       REAL,DIMENSION(IJDS:IJDE,KMS:KME,SPEC_BDY_WIDTH,4)                &
66                                    ,INTENT(INOUT) :: CWM_BT,Q_BT,Q2_BT, &
67                                                      T_BT,U_BT,V_BT 
68 
69       REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: PDTMP_B,PDTMP_BT
70 
71       REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),                          &
72                                   INTENT(IN) :: TTMP_B,QTMP_B,UTMP_B,   &
73                                                 VTMP_B,Q2TMP_B,CWMTMP_B
74 
75       REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),                           &
76                                   INTENT(IN) :: TTMP_BT,QTMP_BT,UTMP_BT, &
77                                                 VTMP_BT,Q2TMP_BT,CWMTMP_BT
78 !
79 !----------------------------------------------------------------------
80 !
81 !***  LOCAL VARIABLES
82 !
83       LOGICAL :: E_BDY,W_BDY,N_BDY,S_BDY
84       INTEGER :: I,J,K,IBDY,II,JJ,IB,JB,IIM,JJM,BF
85 !----------------------------------------------------------------------
86 !**********************************************************************
87 !----------------------------------------------------------------------
88 !
89       W_BDY=(ITS==IDS)
90       E_BDY=(ITE==IDE)
91       S_BDY=(JTS==JDS)
92       N_BDY=(JTE==JDE)
93 
94 !----------------------------------------------------------------------
95 !***  WEST AND EAST BOUNDARIES
96 !----------------------------------------------------------------------
97 !
98 !***  USE IBDY=1 FOR WEST; 2 FOR EAST.
99 
100 !      WRITE(0,*)'WESTERN BC FOR PATCH',IDS,MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
101 !
102 
103       DO IBDY=1,2
104 !
105 !***  MAKE SURE THE PROCESSOR HAS THIS BOUNDARY.
106 !
107         IF((W_BDY.AND.IBDY.EQ.1).OR.(E_BDY.AND.IBDY.EQ.2))THEN
108           IF(IBDY.EQ.1)THEN
109             BF=P_XSB     ! Which boundary (XSB=the boundary where X is at its start)
110             IB=1         ! Which cell in from boundary
111             II=1         ! Which cell in the domain
112           ELSE
113             BF=P_XEB     ! Which boundary (XEB=the boundary where X is at its end)
114             IB=1         ! Which cell in from boundary
115             II=IDE       ! Which cell in the domain
116           ENDIF
117 
118           DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
119              IF(MOD(J,2).EQ.1)THEN                 ! J=3,5,7,9
120                 PD_B(J,1,IB,BF)  =PDTMP_B(II,J)
121                 PD_BT(J,1,IB,BF) =PDTMP_BT(II,J)
122              ENDIF
123           ENDDO
124 
125 !
126           DO K=KTS,KTE
127             DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)  
128               IF(MOD(J,2).EQ.1)THEN                  ! J=3,5,7,9
129                 T_B(J,K,IB,BF)    = TTMP_B(II,K,J)
130                 T_BT(J,K,IB,BF)   = TTMP_BT(II,K,J)
131                 Q_B(J,K,IB,BF)    = QTMP_B(II,K,J)
132                 Q_BT(J,K,IB,BF)   = QTMP_BT(II,K,J)
133                 Q2_B(J,K,IB,BF)   = Q2TMP_B(II,K,J)
134                 Q2_BT(J,K,IB,BF)  = Q2TMP_BT(II,K,J)
135                 CWM_B(J,K,IB,BF)  = CWMTMP_B(II,K,J)
136                 CWM_BT(J,K,IB,BF) = CWMTMP_BT(II,K,J)
137               ENDIF
138             ENDDO
139           ENDDO
140 
141           DO K=KTS,KTE
142             DO J=MAX(JTS-1,JDS+2-1),MIN(JTE+1,JDE-1)   
143               IF(MOD(J,2).EQ.0)THEN                  ! J=2,4,6,8  
144                 U_B(J,K,IB,BF)    = UTMP_B(II,K,J)
145                 U_BT(J,K,IB,BF)   = UTMP_BT(II,K,J)
146                 V_B(J,K,IB,BF)    = VTMP_B(II,K,J)
147                 V_BT(J,K,IB,BF)   = VTMP_BT(II,K,J)
148               ENDIF
149             ENDDO
150           ENDDO
151 
152         ENDIF
153       ENDDO
154 !
155 !----------------------------------------------------------------------
156 !***  SOUTH AND NORTH BOUNDARIES
157 !----------------------------------------------------------------------
158 !
159 !***  USE IBDY=1 FOR SOUTH; 2 FOR NORTH
160 !
161       DO IBDY=1,2
162 !
163 !***  MAKE SURE THE PROCESSOR HAS THIS BOUNDARY.
164 !
165         IF((S_BDY.AND.IBDY.EQ.1).OR.(N_BDY.AND.IBDY.EQ.2))THEN
166 !
167           IF(IBDY.EQ.1)THEN
168             BF=P_YSB     ! Which boundary (YSB=the boundary where Y is at its start)
169             JB=1         ! Which cell in from boundary
170             JJ=1         ! Which cell in the domain
171           ELSE
172             BF=P_YEB      ! Which boundary (YEB=the boundary where Y is at its end)
173             JB=1          ! Which cell in from boundary
174             JJ=JDE        ! Which cell in the domain
175           ENDIF
176 !
177           DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
178             PD_B(I,1,JB,BF) = PDTMP_B(I,JJ)
179             PD_BT(I,1,JB,BF)= PDTMP_BT(I,JJ)
180           ENDDO
181 
182 !
183           DO K=KTS,KTE
184             DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
185               T_B(I,K,JB,BF)   = TTMP_B(I,K,JJ)
186               T_BT(I,K,JB,BF)  = TTMP_BT(I,K,JJ)
187               Q_B(I,K,JB,BF)   = QTMP_B(I,K,JJ)
188               Q_BT(I,K,JB,BF)  = QTMP_BT(I,K,JJ)
189               Q2_B(I,K,JB,BF)  = Q2TMP_B(I,K,JJ)
190               Q2_BT(I,K,JB,BF) = Q2TMP_BT(I,K,JJ) 
191               CWM_B(I,K,JB,BF) = CWMTMP_B(I,K,JJ)
192               CWM_BT(I,K,JB,BF)= CWMTMP_BT(I,K,JJ)
193             ENDDO
194           ENDDO
195 
196           DO K=KTS,KTE
197            DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
198               U_B(I,K,JB,BF)   = UTMP_B(I,K,JJ)
199               U_BT(I,K,JB,BF)  = UTMP_BT(I,K,JJ)
200               V_B(I,K,JB,BF)   = VTMP_B(I,K,JJ)
201               V_BT(I,K,JB,BF)  = VTMP_BT(I,K,JJ)
202            ENDDO
203           ENDDO
204 
205         ENDIF
206       ENDDO
207 END  SUBROUTINE NESTBC_PATCH 
208 
209 !----------------------------------------------------------------------
210 !
211 SUBROUTINE STATS_FOR_MOVE (XLOC,YLOC,PDYN,MSLP,SQWS              &
212                           ,PINT,T,Q,U,V                          &
213                           ,FIS,PD,SM,PDTOP,PTOP                  &
214                           ,DETA1,DETA2                           &
215                           ,MOVED,MVNEST,NTSD,NPHS                &
216                           ,IDS,IDE,JDS,JDE,KDS,KDE               &
217                           ,IMS,IME,JMS,JME,KMS,KME               &
218                           ,ITS,ITE,JTS,JTE,KTS,KTE               )
219 
220 !**********************************************************************
221 !$$$  SUBPROGRAM DOCUMENTATION BLOCK
222 !                .      .    .
223 ! SUBPROGRAM:  STATS_FOR_MOVE  
224 !   PRGRMMR: gopal
225 !
226 ! ABSTRACT:
227 !         THIS ROUTINE COMPUTES SOME STATS REQUIRED FOR AUTOMATIC GRID MOTION 
228 ! PROGRAM HISTORY LOG:
229 !   05-18-2005  : gopal
230 !
231 ! USAGE: CALL STATS_FOR_MOVE FROM SUBROUTINE SOLVE_RUNSTREAM FOR NESTED DOMAIN ONLY
232 !
233 ! ATTRIBUTES:
234 !   LANGUAGE: FORTRAN 90
235 !   MACHINE : IBM SP
236 !$$$
237 !**********************************************************************
238 
239       USE MODULE_MODEL_CONSTANTS
240       USE MODULE_DM 
241 
242       IMPLICIT NONE
243 !
244       LOGICAL,EXTERNAL                                      :: wrf_dm_on_monitor
245       LOGICAL,INTENT(INOUT)                                 :: MVNEST  ! NMM SWITCH FOR GRID MOTION
246       LOGICAL,INTENT(IN)                                    :: MOVED   
247       INTEGER,INTENT(IN)                                    :: IDS,IDE,JDS,JDE,KDS,KDE   &
248                                                               ,IMS,IME,JMS,JME,KMS,KME   &
249                                                               ,ITS,ITE,JTS,JTE,KTS,KTE   &
250                                                               ,NTSD,NPHS
251 !
252       INTEGER, INTENT(OUT)                                  :: XLOC,YLOC
253       REAL, DIMENSION(KMS:KME),                 INTENT(IN)  :: DETA1,DETA2 
254       REAL,                                     INTENT(IN)  :: PDTOP,PTOP
255       REAL, DIMENSION(IMS:IME,JMS:JME),         INTENT(IN)  :: FIS,PD,SM
256       REAL, DIMENSION(IMS:IME,KMS:KME,JMS:JME), INTENT(IN)  :: PINT,T,Q,U,V
257       REAL, DIMENSION(IMS:IME,JMS:JME),         INTENT(OUT) :: PDYN,MSLP,SQWS
258 !
259 !     LOCAL
260 
261       INTEGER,SAVE                                          :: NTIME0
262       INTEGER                                               :: IM,JM,IP,JP
263       INTEGER                                               :: I,K,J,XR,YR,DTMOVE,IDUM,JDUM,ITF,JTF
264       REAL, PARAMETER                                       :: LAPSR=6.5E-3, GI=1./G,D608=0.608
265       REAL, PARAMETER                                       :: COEF3=287.05*GI*LAPSR, COEF2=-1./COEF3
266       REAL, PARAMETER                                       :: TRG=2.0*R_D*GI,LAPSI=1.0/LAPSR
267       REAL                                                  :: DZ,RTOPP,APELP,A,TSFC,STMP0,STMP1
268       REAL                                                  :: SMSUM,SMOUT,XDIFF,YDIFF,PCUT,PGR
269       REAL                                                  :: MINGBL_PDYN,MAXGBL_PDYN,MAXGBL_SQWS
270       REAL                                                  :: MINGBL_MIJ
271       REAL, DIMENSION(IMS:IME,JMS:JME)                      :: MIJ
272       REAL, DIMENSION(IMS:IME,KMS:KME,JMS:JME)              :: Z
273 
274 !    EXEC 
275 
276      ITF=MIN(ITE,IDE-1)
277      JTF=MIN(JTE,JDE-1)     
278 
279 !----------------------------------------------------------------------------------
280 
281 !     KEEP NEST MOTION IN SINK WITH PHYSICS TIME STEPS
282 
283       IF(MOD(NTSD+1,NPHS)/=0)THEN
284         MVNEST=.FALSE.
285         RETURN
286       ENDIF
287 
288       WRITE(0,*)'PHYSICS IN SINK',NTSD,NPHS
289 
290 !     DETERMINE THE HEIGHTS ON THE PARENT DOMAIN
291 
292       DO J = JTS, MIN(JTE,JDE)
293        DO I = ITS, MIN(ITE,IDE)
294          Z(I,1,J)=FIS(I,J)*GI
295        ENDDO
296       ENDDO
297 !
298       DO J = JTS, MIN(JTE,JDE)
299        DO K = KTS,KTE
300         DO I = ITS, MIN(ITE,IDE)
301           APELP      = (PINT(I,K+1,J)+PINT(I,K,J))
302           RTOPP      = TRG*T(I,K,J)*(1.0+Q(I,K,J)*P608)/APELP
303           DZ         = RTOPP*(DETA1(K)*PDTOP+DETA2(K)*PD(I,J)) 
304           Z(I,K+1,J) = Z(I,K,J) + DZ
305         ENDDO
306        ENDDO
307       ENDDO
308 
309 !     DETERMINE THE MEAN SEA LEVEL PRESSURE, THE VERTICALLY AVERAGED WIND
310 !     SPEED AT ABOUT LEVELS 9 10 AND 11 AND THE DYNAMIC PRESSURES DEFINED
311 !     FROM BASIC BERNOULLI's THEOREM
312 
313       DO J = JTS, MIN(JTE,JDE)
314         DO I = ITS, MIN(ITE,IDE)
315             TSFC      = T(I,1,J)*(1.+D608*Q(I,1,J)) + LAPSR*(Z(I,1,J)+Z(I,2,J))*0.5
316             A         = LAPSR*Z(I,1,J)/TSFC
317             MSLP(I,J) = PINT(I,1,J)*(1-A)**COEF2
318             SQWS(I,J) =  (U(I,9,J)*U(I,9,J) + V(I,9,J)*V(I,9,J)           &
319                       +   U(I,10,J)*U(I,10,J) + V(I,10,J)*V(I,10,J)       &
320                       +   U(I,11,J)*U(I,11,J) + V(I,11,J)*V(I,11,J))/3.0
321             PDYN(I,J) =   MSLP(I,J)  + 1.1*SQWS(I,J)/2.0
322         ENDDO
323       ENDDO
324 
325 !     FILTER OUT PDYN AND STORE THAT IN MIJ. THE MAXIMUM VALUE OF MIJ GIVES THE STORM CENTER
326 !     ALSO DO THAT WITHIN A SUB DOMAIN
327 
328       MAXGBL_PDYN=MAXVAL(PDYN(ITS:ITF,JTS:JTF))       
329       CALL WRF_DM_MAXVAL(MAXGBL_PDYN,IDUM,JDUM)    
330       MINGBL_PDYN=MINVAL(PDYN(ITS:ITF,JTS:JTF))
331       CALL WRF_DM_MINVAL(MINGBL_PDYN,IDUM,JDUM)            
332       PCUT = 0.5*(MAXGBL_PDYN + MINGBL_PDYN)
333 !
334       IM=IDE/2 - IDE/6 
335       IP=IDE/2 + IDE/6
336       JM=JDE/2 - JDE/4
337       JP=JDE/2 + JDE/4
338 !
339       DO J = JTS, MIN(JTE,JDE)
340         DO I = ITS, MIN(ITE,IDE)
341           IF(I .GE. IM .AND. I .LE. IP .AND. J .GE. JM .AND. J .LE. JP  &
342                        .AND. PCUT .GT. PDYN(I,J))THEN
343              MIJ(I,J) = PDYN(I,J)   
344           ELSE
345              MIJ(I,J) = 105000. 
346           ENDIF
347         ENDDO
348       ENDDO
349 
350       DO J = JTS, MIN(JTE,JDE)
351         DO I = ITS, MIN(ITE,IDE)
352           PDYN(I,J)=MIJ(I,J) 
353         ENDDO
354       ENDDO
355 
356 !     DETERMINE THE LOCATION OF CENTER OF THE CIRCULATION DEFINED BY MIJ AND FIND THE CORRESPONDING MSLP 
357 
358       MINGBL_MIJ=MINVAL(MIJ(ITS:ITF,JTS:JTF))
359       DO J = JTS, MIN(JTE,JDE)
360         DO I = ITS, MIN(ITE,IDE)
361            IF(MIJ(I,J) .EQ. MINGBL_MIJ)THEN
362              XLOC=I
363              YLOC=J
364              STMP0=MSLP(I,J)
365            ENDIF
366         ENDDO
367       ENDDO
368 
369       CALL WRF_DM_MINVAL(MINGBL_MIJ,XLOC,YLOC)
370       CALL WRF_DM_MINVAL(STMP0,IDUM,JDUM)
371 
372 !     DETERMINE THE MAXIMUM MSLP AT ABOUT 18 GRID POINTS AWAY FROM THE STORM CENTER 
373 
374       DO J = JTS, MIN(JTE,JDE)
375         DO I = ITS, MIN(ITE,IDE)
376            IF(I .EQ. XLOC+18)THEN
377              XR=I
378              YR=J
379              STMP1=MSLP(I,J)
380            ENDIF
381         ENDDO
382       ENDDO
383 
384       CALL WRF_DM_MAXVAL(STMP1,XR,YR)
385 
386 !
387 !     DETERMINE IF THE ENTIRE NESTED DOMAIN IS OVER LAND (SM=0)
388 !
389 
390       SMSUM = 0.0
391       DO J = JTS, MIN(JTE,JDE)
392        DO I = ITS, MIN(ITE,IDE)
393          SMSUM = SMSUM + SM(I,J)
394        ENDDO
395       ENDDO
396 
397       SMOUT=WRF_DM_SUM_REAL(SMSUM)/(IDE*JDE)
398 
399 !     STOP GRID MOTION. AVOID MOVING TOO RAPID GRID MOTION, SAY SOMETHING LIKE EVERY
400 !     OTHER TIME STEP OR SO  
401 
402       PGR=STMP1-STMP0
403       XDIFF=ABS(XLOC - IDE/2)
404       YDIFF=ABS(YLOC - JDE/2)
405       IF(NTSD==0 .OR. MOVED)NTIME0=NTSD 
406       DTMOVE=NTSD-NTIME0                    ! TIME INTERVAL SINCE THE PREVIOUS MOVE
407 !
408       IF(DTMOVE .LE. 45 .OR. PGR .LE. 200.)THEN       
409         WRITE(0,*)'SUSPEND MOTION: SMALL DTMOVE OR WEAK PGF:','DTMOVE=',DTMOVE,'PGR=',PGR 
410         MVNEST=.FALSE.                               ! SET STATIC GRID
411       ELSE IF(STMP0 .GE. STMP1)THEN
412         WRITE(0,*)'SUSPEND MOTION: THERE IS NO VORTEX IN THE DOMAIN:','STMP0=',STMP0,'STMP1=',STMP1
413         MVNEST=.FALSE.
414       ELSE IF(XDIFF .GT. 24 .OR. YDIFF .GT. 24)THEN
415         WRITE(0,*)'SUSPEND MOTION: LOST VORTEX ','DTMOVE=',DTMOVE,'XDIFF=',XDIFF,'YDIFF=',YDIFF
416         MVNEST=.FALSE.
417       ELSE IF(SMOUT .LE. 0.2 .AND. XDIFF .GT. 12 .AND. YDIFF .GT. 12)THEN  
418         WRITE(0,*)'SUSPEND MOTION: VORTEX LOST OVER LAND ','DTMOVE=',DTMOVE,'XDIFF=',XDIFF,'YDIFF=',YDIFF
419         MVNEST=.FALSE. 
420       ELSE IF(SMOUT .LE. 0.2 .AND. PGR .LE. 400.)THEN
421         WRITE(0,*)'SUSPEND MOTION: VORTEX WEAK OVER LAND ','SMOUT=',SMOUT,'PGR=',PGR
422         MVNEST=.FALSE.
423       ELSE IF(SMOUT .LE. 0.2 .AND. DTMOVE .GE. 1500)THEN
424         WRITE(0,*)'SUSPEND MOTION: STOP MOTION  OVER LAND','SMOUT=',SMOUT,'DTMOVE=',DTMOVE
425         MVNEST=.FALSE.
426       ELSE
427         MVNEST=.TRUE.
428       ENDIF
429 
430       RETURN
431 
432 END SUBROUTINE STATS_FOR_MOVE
433 !----------------------------------------------------------------------------------
434 
435 END  MODULE module_NEST_UTIL
436