1 !-----------------------------------------------------------------------
3 !NCEP_MESO:MODEL_LAYER: BOUNDARY CONDITION UPDATES
5 !-----------------------------------------------------------------------
7 #include "nmm_loop_basemacros.h"
8 #include "nmm_loop_macros.h"
10 !-----------------------------------------------------------------------
12 MODULE MODULE_BNDRY_COND
14 !-----------------------------------------------------------------------
15 USE MODULE_STATE_DESCRIPTION
16 USE MODULE_MODEL_CONSTANTS
17 !-----------------------------------------------------------------------
18 REAL :: D06666=0.06666666
19 !-----------------------------------------------------------------------
23 !***********************************************************************
24 SUBROUTINE BOCOH(GRIDID,NTSD,DT0,NEST,NBC,NBOCO,LAST_TIME,TSPH &
25 & ,LB,ETA1,ETA2,PDTOP,PT,RES &
26 & ,PD_BXS, PD_BXE, PD_BYS, PD_BYE &
27 & ,T_BXS, T_BXE, T_BYS, T_BYE &
28 & ,Q_BXS, Q_BXE, Q_BYS, Q_BYE &
29 & ,U_BXS, U_BXE, U_BYS, U_BYE &
30 & ,V_BXS, V_BXE, V_BYS, V_BYE &
31 & ,Q2_BXS, Q2_BXE, Q2_BYS, Q2_BYE &
32 & ,CWM_BXS, CWM_BXE, CWM_BYS, CWM_BYE &
33 & ,PD_BTXS, PD_BTXE, PD_BTYS, PD_BTYE &
34 & ,T_BTXS, T_BTXE, T_BTYS, T_BTYE &
35 & ,Q_BTXS, Q_BTXE, Q_BTYS, Q_BTYE &
36 & ,U_BTXS, U_BTXE, U_BTYS, U_BTYE &
37 & ,V_BTXS, V_BTXE, V_BTYS, V_BTYE &
38 & ,Q2_BTXS, Q2_BTXE, Q2_BTYS, Q2_BTYE &
39 & ,CWM_BTXS, CWM_BTXE, CWM_BTYS, CWM_BTYE &
40 & ,PD,T,Q,Q2,CWM,PINT &
41 & ,MOIST,N_MOIST,SCALAR,N_SCALAR &
43 & ,CHEM,NUMG,CONFIG_FLAGS &
47 & ,IDS,IDE,JDS,JDE,KDS,KDE &
48 & ,IMS,IME,JMS,JME,KMS,KME &
49 & ,ITS,ITE,JTS,JTE,KTS,KTE)
50 !***********************************************************************
51 !$$$ SUBPROGRAM DOCUMENTATION BLOCK
53 ! SUBPROGRAM: BOCOH UPDATE MASS POINTS ON BOUNDARY
54 ! PRGRMMR: JANJIC ORG: W/NP22 DATE: 94-03-08
57 ! TEMPERATURE, SPECIFIC HUMIDITY, AND SURFACE PRESSURE
58 ! ARE UPDATED ON THE DOMAIN BOUNDARY BY APPLYING THE
59 ! PRE-COMPUTED TENDENCIES AT EACH TIME STEP.
61 ! PROGRAM HISTORY LOG:
62 ! 87-??-?? MESINGER - ORIGINATOR
63 ! 95-03-25 BLACK - CONVERSION FROM 1-D TO 2-D in HORIZONTAL
64 ! 96-12-13 BLACK - FINAL MODIFICATION FOR NESTED RUNS
65 ! 98-10-30 BLACK - MODIFIED FOR DISTRIBUTED MEMORY
66 ! 00-01-06 BLACK - MODIFIED FOR JANJIC NONHYDROSTATIC CODE
67 ! 00-09-14 BLACK - MODIFIED FOR DIRECT ACCESS READ
68 ! 01-03-12 BLACK - CONVERTED TO WRF STRUCTURE
69 ! 02-08-29 MICHALAKES - CHANGED II=I-MY_IS_GLB+1 TO II=I
70 ! ADDED CONDITIONAL COMPILATION AROUND MPI
71 ! CONVERT INDEXING FROM LOCAL TO GLOBAL
72 ! 02-09-06 WOLFE - MORE CONVERSION TO GLOBAL INDEXING
73 ! 04-11-18 BLACK - THREADED
74 ! 05-12-19 BLACK - CONVERTED FROM IKJ TO IJK
75 ! 06-06-02 GOPAL - MODIFICATIONS FOR NESTING
76 ! 07-11-14 PYLE - UPDATED FOR NEW WRF BOUNDARY FILE STRUCTURE
78 ! USAGE: CALL BOCOH FROM SUBROUTINE SOLVE_NMM
79 ! INPUT ARGUMENT LIST:
81 ! NOTE THAT IDE AND JDE INSIDE ROUTINE SHOULD BE PASSED IN
82 ! AS WHAT WRF CONSIDERS THE UNSTAGGERED GRID DIMENSIONS; THAT
83 ! IS, 1 LESS THAN THE IDE AND JDE SET BY WRF FRAMEWORK, JM
85 ! OUTPUT ARGUMENT LIST:
97 ! LANGUAGE: FORTRAN 90
100 !***********************************************************************
101 !-----------------------------------------------------------------------
103 USE MODULE_INPUT_CHEM_DATA
105 !-----------------------------------------------------------------------
109 !-----------------------------------------------------------------------
110 LOGICAL,INTENT(IN) :: NEST
112 INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
113 & ,IMS,IME,JMS,JME,KMS,KME &
114 & ,ITS,ITE,JTS,JTE,KTS,KTE
115 INTEGER,INTENT(IN) :: SPEC_BDY_WIDTH
116 INTEGER,INTENT(IN) :: N_MOIST, N_SCALAR
118 INTEGER,INTENT(IN) :: NUMG
121 INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW
123 INTEGER,INTENT(IN) :: GRIDID
124 INTEGER,INTENT(IN) :: LB,NBC,NTSD
125 LOGICAL,INTENT(IN) :: LAST_TIME
126 INTEGER,INTENT(INOUT) :: NBOCO
128 REAL,INTENT(IN) :: DT0,PDTOP,PT,TSPH
130 REAL,DIMENSION(KMS:KME),INTENT(IN) :: ETA1,ETA2
132 REAL,DIMENSION(IMS:IME,1,SPEC_BDY_WIDTH) &
133 & ,INTENT(INOUT) :: PD_BYS, PD_BYE &
136 REAL,DIMENSION(IMS:IME,KMS:KME,SPEC_BDY_WIDTH) &
137 & ,INTENT(INOUT) :: T_BYS, T_BYE &
142 & ,CWM_BYS, CWM_BYE &
147 & ,Q2_BTYS, Q2_BTYE &
148 & ,CWM_BTYS, CWM_BTYE
150 REAL,DIMENSION(JMS:JME,1,SPEC_BDY_WIDTH) &
151 & ,INTENT(INOUT) :: PD_BXS, PD_BXE &
154 REAL,DIMENSION(JMS:JME,KMS:KME,SPEC_BDY_WIDTH) &
155 & ,INTENT(INOUT) :: T_BXS, T_BXE &
160 & ,CWM_BXS, CWM_BXE &
165 & ,Q2_BTXS, Q2_BTXE &
166 & ,CWM_BTXS, CWM_BTXE
169 REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: RES
170 REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: PD
172 REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: CWM &
176 REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME,NUM_MOIST) &
177 & ,INTENT(INOUT) :: MOIST
178 REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME,NUM_SCALAR) &
179 & ,INTENT(INOUT) :: SCALAR
182 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME,NUM_CHEM) &
183 & ,INTENT(INOUT) :: CHEM
184 TYPE(GRID_CONFIG_REC_TYPE),INTENT(IN) :: CONFIG_FLAGS
187 !-----------------------------------------------------------------------
191 INTEGER :: I,IB,IBDY,II,IIM,IM,IRTN,ISIZ1,ISIZ2 &
192 & ,J,JB,JJ,JJM,JM,K,KK,N,NN,NREC,NUMGAS,NV,REC
193 INTEGER :: MY_IS_GLB,MY_JS_GLB,MY_IE_GLB,MY_JE_GLB
194 INTEGER :: I_M,ILPAD1,IRPAD1,JBPAD1,JTPAD1
196 REAL :: BCHR,CONVFAC,CWK,DT,PLYR,RRI
198 LOGICAL :: E_BDY,W_BDY,N_BDY,S_BDY
200 CHARACTER(LEN=255) :: message
201 !-----------------------------------------------------------------------
202 !***********************************************************************
203 !-----------------------------------------------------------------------
206 !*** DETERMINE THE INDEX OF THE LAST GAS SPECIES
209 ! NUMGAS = GET_LAST_GAS(CONFIG_FLAGS%CHEM_OPT)
242 !-----------------------------------------------------------------------
243 !*** SOUTH AND NORTH BOUNDARIES
244 !-----------------------------------------------------------------------
246 !*** USE IBDY=1 FOR SOUTH; 2 FOR NORTH
250 !*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY.
252 IF(S_BDY.AND.IBDY==1) THEN
253 JB=1 ! Which cell in from boundary
254 JJ=1 ! Which cell in the domain
256 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
257 PD_BYS(I,1,JB)=PD_BYS(I,1,JB)+PD_BTYS(I,1,JB)*DT
258 PD(I,JJ)=PD_BYS(I,1,JB)
264 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
265 T_BYS(I,K,JB)=T_BYS(I,K,JB)+T_BTYS(I,K,JB)*DT
266 Q_BYS(I,K,JB)=Q_BYS(I,K,JB)+Q_BTYS(I,K,JB)*DT
267 Q2_BYS(I,K,JB)=Q2_BYS(I,K,JB)+Q2_BTYS(I,K,JB)*DT
268 CWM_BYS(I,K,JB)=CWM_BYS(I,K,JB)+CWM_BTYS(I,K,JB)*DT
270 T(I,JJ,K)=T_BYS(I,K,JB)
271 Q(I,JJ,K)=Q_BYS(I,K,JB)
272 Q2(I,JJ,K)=Q2_BYS(I,K,JB)
273 CWM(I,JJ,K)=CWM_BYS(I,K,JB)
274 PINT(I,JJ,K)=ETA1(K)*PDTOP &
275 & +ETA2(K)*PD(I,JJ)*RES(I,JJ)+PT
279 ELSEIF(N_BDY.AND.IBDY==2) THEN
280 JB=1 ! Which cell in from boundary
281 JJ=JJM ! Which cell in the domain
284 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
285 PD_BYE(I,1,JB)=PD_BYE(I,1,JB)+PD_BTYE(I,1,JB)*DT
286 PD(I,JJ)=PD_BYE(I,1,JB)
292 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
293 T_BYE(I,K,JB)=T_BYE(I,K,JB)+T_BTYE(I,K,JB)*DT
294 Q_BYE(I,K,JB)=Q_BYE(I,K,JB)+Q_BTYE(I,K,JB)*DT
295 Q2_BYE(I,K,JB)=Q2_BYE(I,K,JB)+Q2_BTYE(I,K,JB)*DT
296 CWM_BYE(I,K,JB)=CWM_BYE(I,K,JB)+CWM_BTYE(I,K,JB)*DT
298 T(I,JJ,K)=T_BYE(I,K,JB)
299 Q(I,JJ,K)=Q_BYE(I,K,JB)
300 Q2(I,JJ,K)=Q2_BYE(I,K,JB)
301 CWM(I,JJ,K)=CWM_BYE(I,K,JB)
302 PINT(I,JJ,K)=ETA1(K)*PDTOP &
303 & +ETA2(K)*PD(I,JJ)*RES(I,JJ)+PT
307 ! ENDIF ! for N/S boundaries
315 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
316 MOIST(I,JJ,K,I_M)=Q(I,JJ,K)/(1.-Q(I,JJ,K))
323 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
333 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
334 SCALAR(I,JJ,K,I_M)=0.
340 !$omp& private(i,k,nv)
343 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
344 CALL BDY_CHEM_VALUE (CHEM(I,K,JJ,NV),Z(I,JJ,K),NV,NUMG)
349 !$omp& private(i,k,nv)
350 DO NV=NUMG+1,NUM_CHEM
353 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
354 PLYR=(PINT(I,JJ,K)+PINT(I,JJ,KK))*0.5
355 RRI=R_D*T(I,JJ,K)*(1.+.608*Q(I,JJ,K))/PLYR
356 CONVFAC=PLYR/RGASUNIV/T(I,JJ,K)
357 CALL BDY_CHEM_VALUE_SORGAM (CHEM(I,K,JJ,NV),Z(I,JJ,K),NV, &
358 CONFIG_FLAGS,RRI,CONVFAC,G)
366 !-----------------------------------------------------------------------
367 !*** WEST AND EAST BOUNDARIES
368 !-----------------------------------------------------------------------
370 !*** USE IBDY=1 FOR WEST; 2 FOR EAST.
374 !*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY.
376 IF(W_BDY.AND.IBDY==1) THEN
377 IB=1 ! Which cell in from boundary
378 II=1 ! Which cell in the domain
380 DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
382 PD_BXS(J,1,IB)=PD_BXS(J,1,IB)+PD_BTXS(J,1,IB)*DT
383 PD(II,J)=PD_BXS(J,1,IB)
390 DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
393 T_BXS(J,K,IB)=T_BXS(J,K,IB)+T_BTXS(J,K,IB)*DT
394 Q_BXS(J,K,IB)=Q_BXS(J,K,IB)+Q_BTXS(J,K,IB)*DT
395 Q2_BXS(J,K,IB)=Q2_BXS(J,K,IB)+Q2_BTXS(J,K,IB)*DT
396 CWM_BXS(J,K,IB)=CWM_BXS(J,K,IB)+CWM_BTXS(J,K,IB)*DT
398 T(II,J,K)=T_BXS(J,K,IB)
399 Q(II,J,K)=Q_BXS(J,K,IB)
400 Q2(II,J,K)=Q2_BXS(J,K,IB)
401 CWM(II,J,K)=CWM_BXS(J,K,IB)
402 PINT(II,J,K)=ETA1(K)*PDTOP &
403 & +ETA2(K)*PD(II,J)*RES(II,J)+PT
409 ELSEIF(E_BDY.AND.IBDY==2) THEN
410 IB=1 ! Which cell in from boundary
411 II=IIM ! Which cell in the domain
413 DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
415 PD_BXE(J,1,IB)=PD_BXE(J,1,IB)+PD_BTXE(J,1,IB)*DT
416 PD(II,J)=PD_BXE(J,1,IB)
423 DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
426 T_BXE(J,K,IB)=T_BXE(J,K,IB)+T_BTXE(J,K,IB)*DT
427 Q_BXE(J,K,IB)=Q_BXE(J,K,IB)+Q_BTXE(J,K,IB)*DT
428 Q2_BXE(J,K,IB)=Q2_BXE(J,K,IB)+Q2_BTXE(J,K,IB)*DT
429 CWM_BXE(J,K,IB)=CWM_BXE(J,K,IB)+CWM_BTXE(J,K,IB)*DT
431 T(II,J,K)=T_BXE(J,K,IB)
432 Q(II,J,K)=Q_BXE(J,K,IB)
433 Q2(II,J,K)=Q2_BXE(J,K,IB)
434 CWM(II,J,K)=CWM_BXE(J,K,IB)
435 PINT(II,J,K)=ETA1(K)*PDTOP &
436 & +ETA2(K)*PD(II,J)*RES(II,J)+PT
442 ! ENDIF ! for W/E boundaries
449 DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
451 MOIST(II,J,K,I_M)=Q(II,J,K)/(1.-Q(II,J,K))
460 DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
474 DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
476 SCALAR(II,J,K,I_M)=0.
484 !$omp& private(nv,j,k)
487 DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
490 CALL BDY_CHEM_VALUE (CHEM(II,K,J,NV),Z(II,J,K),NV,NUMG)
494 DO NV=NUMG+1,NUM_CHEM
495 PLYR=(PINT(II,J,K)+PINT(II,J,KK))*0.5
496 RRI=R_D*T(II,J,K)*(1.+P608*Q(II,J,K))/PLYR
497 CONVFAC=PLYR/RGASUNIV/T(II,J,K)
498 CALL BDY_CHEM_VALUE_SORGAM (CHEM(II,K,J,NV),Z(II,J,K),NV, &
499 & CONFIG_FLAGS,RRI,CONVFAC,G)
509 !-----------------------------------------------------------------------
510 !*** SPACE INTERPOLATION OF PD THEN REMAINING MASS VARIABLES
511 !*** AT INNER BOUNDARY
512 !-----------------------------------------------------------------------
514 !*** ONE ROW NORTH OF SOUTHERN BOUNDARY
519 PD(I,2)=0.25*(PD(I,1)+PD(I+1,1)+PD(I,3)+PD(I+1,3))
523 IF(I<=IDE-1.AND.ABS(CWK-PD(I,2))>=300.)THEN
524 WRITE(message,*)'PSEUDO HYDROSTATIC IMBALANCE AT THE SOUTHERN BOUNDARY AT',I,2,'GRID #',GRIDID
525 CALL wrf_message(trim(message))
526 WRITE(message,*)' ',CWK/100.
527 CALL wrf_message(trim(message))
528 WRITE(message,*)PD(I,3)/100.,' ',PD(I+1,3)/100.
529 CALL wrf_message(trim(message))
530 WRITE(message,*)' ',PD(I,2)/100.
531 CALL wrf_message(trim(message))
532 WRITE(message,*)PD(I,1)/100.,' ',PD(I+1,1)/100.
533 CALL wrf_message(trim(message))
534 CALL wrf_message(' ')
540 !*** ONE ROW SOUTH OF NORTHERN BOUNDARY
546 write(message,*)'I, PD is:', PD(I,JJM), PD(I,JJM-2),PD(I+1,JJM-2),PD(I+1,JJM)
547 call wrf_message(trim(message))
548 PD(I,JJM-1)=0.25*(PD(I,JJM-2)+PD(I+1,JJM-2) &
549 & +PD(I,JJM)+PD(I+1,JJM))
553 IF(I<=IDE-1.AND.ABS(CWK-PD(I,JJM-1))>=300.)THEN
554 WRITE(message,*)'PSEUDO HYDROSTATIC IMBALANCE AT THE NORTHERN BOUNDARY AT',I,JJM-1,'GRID #',GRIDID
555 CALL wrf_message(trim(message))
556 WRITE(message,*)' ',CWK/100.
557 CALL wrf_message(trim(message))
558 WRITE(message,*)PD(I,JJM)/100.,' ',PD(I+1,JJM)/100.
559 CALL wrf_message(trim(message))
560 WRITE(message,*)' ',PD(I,JJM-1)/100.
561 CALL wrf_message(trim(message))
562 WRITE(message,*)PD(I,JJM-2)/100.,' ',PD(I+1,JJM-2)/100.
563 CALL wrf_message(trim(message))
564 CALL wrf_message(' ')
570 !*** ONE ROW EAST OF WESTERN BOUNDARY
575 IF(W_BDY.AND.J>=MY_JS_GLB-JBPAD1 &
576 & .AND.J<=MY_JE_GLB+JTPAD1)THEN
579 PD(1,JJ)=0.25*(PD(1,JJ-1)+PD(2,JJ-1)+PD(1,JJ+1)+PD(2,JJ+1))
583 IF(ABS(CWK-PD(1,JJ))>300.)THEN
584 WRITE(message,*)'PSEUDO HYDROSTATIC IMBALANCE AT THE WESTERN BOUNDARY AT',1,JJ,'GRID #',GRIDID
585 CALL wrf_message(trim(message))
586 WRITE(message,*)' ',CWK/100.
587 CALL wrf_message(trim(message))
588 WRITE(message,*)PD(1,JJ+1)/100.,' ',PD(2,JJ+1)/100.
589 CALL wrf_message(trim(message))
590 WRITE(message,*)' ',PD(1,JJ)/100.
591 CALL wrf_message(trim(message))
592 WRITE(message,*)PD(1,JJ-1)/100.,' ',PD(2,JJ-1)/100.
593 CALL wrf_message(trim(message))
594 CALL wrf_message(' ')
602 !*** ONE ROW WEST OF EASTERN BOUNDARY
607 IF(E_BDY.AND.J>=MY_JS_GLB-JBPAD1 &
608 & .AND.J<=MY_JE_GLB+JTPAD1)THEN
611 PD(IIM-1,JJ)=0.25*(PD(IIM-1,JJ-1)+PD(IIM,JJ-1) &
612 & +PD(IIM-1,JJ+1)+PD(IIM,JJ+1))
616 IF(ABS(CWK-PD(IIM-1,JJ))>300.)THEN
617 WRITE(message,*)'PSEUDO HYDROSTATIC IMBALANCE AT THE EASTERN BOUNDARY AT',IIM-1,JJ,'GRID #',GRIDID
618 CALL wrf_message(trim(message))
619 WRITE(message,*)' ',CWK/100.
620 CALL wrf_message(trim(message))
621 WRITE(message,*)PD(IIM-1,JJ+1)/100.,' ',PD(IIM,JJ+1)/100.
622 CALL wrf_message(trim(message))
623 WRITE(message,*)' ',PD(IIM-1,JJ)/100.
624 CALL wrf_message(trim(message))
625 WRITE(message,*)PD(IIM-1,JJ-1)/100.,' ',PD(IIM,JJ-1)/100.
626 CALL wrf_message(trim(message))
627 CALL wrf_message(' ')
635 !-----------------------------------------------------------------------
638 !$omp& private(i,j,jj,k)
641 !-----------------------------------------------------------------------
643 !*** ONE ROW NORTH OF SOUTHERN BOUNDARY
647 T(I,2,K)=(T(I,1,K)+T(I+1,1,K)+T(I,3,K)+T(I+1,3,K))*0.25
648 Q(I,2,K)=(Q(I,1,K)+Q(I+1,1,K)+Q(I,3,K)+Q(I+1,3,K))*0.25
649 Q2(I,2,K)=(Q2(I,1,K)+Q2(I+1,1,K)+Q2(I,3,K)+Q2(I+1,3,K))*0.25
650 CWM(I,2,K)=(CWM(I,1,K)+CWM(I+1,1,K)+CWM(I,3,K)+CWM(I+1,3,K)) &
652 PINT(I,2,K)=ETA1(K)*PDTOP+ETA2(K)*PD(I,2)*RES(I,2)+PT
658 MOIST(I,2,K,I_M)=Q(I,2,K)/(1.-Q(I,2,K))
662 MOIST(I,2,K,I_M)=(MOIST(I,1,K,I_M) &
663 & +MOIST(I+1,1,K,I_M) &
664 & +MOIST(I,3,K,I_M) &
665 & +MOIST(I+1,3,K,I_M))*0.25
672 SCALAR(I,2,K,I_M)=(SCALAR(I,1,K,I_M) &
673 & +SCALAR(I+1,1,K,I_M) &
674 & +SCALAR(I,3,K,I_M) &
675 & +SCALAR(I+1,3,K,I_M))*0.25
681 !*** ONE ROW SOUTH OF NORTHERN BOUNDARY
685 T(I,JJM-1,K)=(T(I,JJM-2,K)+T(I+1,JJM-2,K) &
686 & +T(I,JJM,K)+T(I+1,JJM,K)) &
688 Q(I,JJM-1,K)=(Q(I,JJM-2,K)+Q(I+1,JJM-2,K) &
689 & +Q(I,JJM,K)+Q(I+1,JJM,K)) &
691 Q2(I,JJM-1,K)=(Q2(I,JJM-2,K)+Q2(I+1,JJM-2,K) &
692 & +Q2(I,JJM,K)+Q2(I+1,JJM,K)) &
694 CWM(I,JJM-1,K)=(CWM(I,JJM-2,K)+CWM(I+1,JJM-2,K) &
695 & +CWM(I,JJM,K)+CWM(I+1,JJM,K)) &
697 PINT(I,JJM-1,K)=ETA1(K)*PDTOP &
698 & +ETA2(K)*PD(I,JJM-1)*RES(I,JJM-1)+PT
704 MOIST(I,JJM-1,K,I_M)=Q(I,JJM-1,K)/(1.-Q(I,JJM-1,K))
708 MOIST(I,JJM-1,K,I_M)=(MOIST(I,JJM-2,K,I_M) &
709 & +MOIST(I+1,JJM-2,K,I_M) &
710 & +MOIST(I,JJM,K,I_M) &
711 & +MOIST(I+1,JJM,K,I_M))*0.25
719 SCALAR(I,JJM-1,K,I_M)=(SCALAR(I,JJM-2,K,I_M) &
720 & +SCALAR(I+1,JJM-2,K,I_M) &
721 & +SCALAR(I,JJM,K,I_M) &
722 & +SCALAR(I+1,JJM,K,I_M))*0.25
728 !*** ONE ROW EAST OF WESTERN BOUNDARY
733 IF(W_BDY.AND.J>=MY_JS_GLB-JBPAD1 &
734 & .AND.J<=MY_JE_GLB+JTPAD1)THEN
736 T(1,JJ,K)=(T(1,JJ-1,K)+T(2,JJ-1,K) &
737 & +T(1,JJ+1,K)+T(2,JJ+1,K)) &
739 Q(1,JJ,K)=(Q(1,JJ-1,K)+Q(2,JJ-1,K) &
740 & +Q(1,JJ+1,K)+Q(2,JJ+1,K)) &
742 Q2(1,JJ,K)=(Q2(1,JJ-1,K)+Q2(2,JJ-1,K) &
743 & +Q2(1,JJ+1,K)+Q2(2,JJ+1,K)) &
745 CWM(1,JJ,K)=(CWM(1,JJ-1,K)+CWM(2,JJ-1,K) &
746 & +CWM(1,JJ+1,K)+CWM(2,JJ+1,K)) &
748 PINT(1,JJ,K)=ETA1(K)*PDTOP &
749 & +ETA2(K)*PD(1,JJ)*RES(1,JJ)+PT
753 MOIST(1,JJ,K,I_M)=Q(1,JJ,K)/(1.-Q(1,JJ,K))
755 MOIST(1,JJ,K,I_M)=(MOIST(1,JJ-1,K,I_M) &
756 & +MOIST(2,JJ-1,K,I_M) &
757 & +MOIST(1,JJ+1,K,I_M) &
758 & +MOIST(2,JJ+1,K,I_M))*0.25
763 SCALAR(1,JJ,K,I_M)=(SCALAR(1,JJ-1,K,I_M) &
764 & +SCALAR(2,JJ-1,K,I_M) &
765 & +SCALAR(1,JJ+1,K,I_M) &
766 & +SCALAR(2,JJ+1,K,I_M))*0.25
775 !*** ONE ROW WEST OF EASTERN BOUNDARY
780 IF(E_BDY.AND.J>=MY_JS_GLB-JBPAD1 &
781 & .AND.J<=MY_JE_GLB+JTPAD1)THEN
783 T(IIM-1,JJ,K)=(T(IIM-1,JJ-1,K)+T(IIM,JJ-1,K) &
784 & +T(IIM-1,JJ+1,K)+T(IIM,JJ+1,K)) &
786 Q(IIM-1,JJ,K)=(Q(IIM-1,JJ-1,K)+Q(IIM,JJ-1,K) &
787 & +Q(IIM-1,JJ+1,K)+Q(IIM,JJ+1,K)) &
789 Q2(IIM-1,JJ,K)=(Q2(IIM-1,JJ-1,K)+Q2(IIM,JJ-1,K) &
790 & +Q2(IIM-1,JJ+1,K)+Q2(IIM,JJ+1,K)) &
792 CWM(IIM-1,JJ,K)=(CWM(IIM-1,JJ-1,K)+CWM(IIM,JJ-1,K) &
793 & +CWM(IIM-1,JJ+1,K)+CWM(IIM,JJ+1,K)) &
795 PINT(IIM-1,JJ,K)=ETA1(K)*PDTOP &
796 & +ETA2(K)*PD(IIM-1,JJ)*RES(IIM-1,JJ)+PT
800 MOIST(IIM-1,JJ,K,I_M)=Q(IIM-1,JJ,K)/(1.-Q(IIM-1,JJ,K))
802 MOIST(IIM-1,JJ,K,I_M)=(MOIST(IIM-1,JJ-1,K,I_M) &
803 & +MOIST(IIM,JJ-1,K,I_M) &
804 & +MOIST(IIM-1,JJ+1,K,I_M) &
805 & +MOIST(IIM,JJ+1,K,I_M))*0.25
810 SCALAR(IIM-1,JJ,K,I_M)=(SCALAR(IIM-1,JJ-1,K,I_M) &
811 & +SCALAR(IIM,JJ-1,K,I_M) &
812 & +SCALAR(IIM-1,JJ+1,K,I_M) &
813 & +SCALAR(IIM,JJ+1,K,I_M))*0.25
820 !-----------------------------------------------------------------------
824 !-----------------------------------------------------------------------
826 !-----------------------------------------------------------------------
827 !***********************************************************************
828 !-----------------------------------------------------------------------
829 SUBROUTINE BOCOV(GRIDID,NTSD,DT,LB &
830 & ,U_BXS,U_BXE,U_BYS,U_BYE &
831 & ,V_BXS,V_BXE,V_BYS,V_BYE &
832 & ,U_BTXS,U_BTXE,U_BTYS,U_BTYE &
833 & ,V_BTXS,V_BTXE,V_BTYS,V_BTYE &
837 & ,IDS,IDE,JDS,JDE,KDS,KDE &
838 & ,IMS,IME,JMS,JME,KMS,KME &
839 & ,ITS,ITE,JTS,JTE,KTS,KTE)
840 !***********************************************************************
841 !$$$ SUBPROGRAM DOCUMENTATION BLOCK
843 ! SUBPROGRAM: BOCOV UPDATE WIND POINTS ON BOUNDARY
844 ! PRGRMMR: JANJIC ORG: W/NP22 DATE: 94-03-08
847 ! U AND V COMPONENTS OF THE WIND ARE UPDATED ON THE
848 ! DOMAIN BOUNDARY BY APPLYING THE PRE-COMPUTED
849 ! TENDENCIES AT EACH TIME STEP. AN EXTRAPOLATION FROM
850 ! INSIDE THE DOMAIN IS USED FOR THE COMPONENT TANGENTIAL
851 ! TO THE BOUNDARY IF THE NORMAL COMPONENT IS OUTWARD.
853 ! PROGRAM HISTORY LOG:
854 ! 87-??-?? MESINGER - ORIGINATOR
855 ! 95-03-25 BLACK - CONVERSION FROM 1-D TO 2-D IN HORIZONTAL
856 ! 98-10-30 BLACK - MODIFIED FOR DISTRIBUTED MEMORY
857 ! 01-03-13 BLACK - CONVERTED TO WRF STRUCTURE
858 ! 02-09-06 WOLFE - MORE CONVERSION TO GLOBAL INDEXING
859 ! 04-11-23 BLACK - THREADED
860 ! 05-12-19 BLACK - CONVERTED FROM IKJ TO IJK
861 ! 06-06-02 GOPAL - MODIFICATIONS FOR NESTING
863 ! USAGE: CALL BOCOH FROM SUBROUTINE SOLVE_NMM
864 ! INPUT ARGUMENT LIST:
866 ! NOTE THAT IDE AND JDE INSIDE ROUTINE SHOULD BE PASSED IN
867 ! AS WHAT WRF CONSIDERS THE UNSTAGGERED GRID DIMENSIONS; THAT
868 ! IS, 1 LESS THAN THE IDE AND JDE SET BY WRF FRAMEWORK, JM
870 ! OUTPUT ARGUMENT LIST:
875 ! SUBPROGRAMS CALLED:
882 ! LANGUAGE: FORTRAN 90
885 !***********************************************************************
886 !-----------------------------------------------------------------------
890 !-----------------------------------------------------------------------
891 INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
892 & ,IMS,IME,JMS,JME,KMS,KME &
893 & ,ITS,ITE,JTS,JTE,KTS,KTE
894 INTEGER,INTENT(IN) :: SPEC_BDY_WIDTH
896 INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW
898 INTEGER,INTENT(IN) :: GRIDID
899 INTEGER,INTENT(IN) :: LB,NTSD
901 REAL,INTENT(IN) :: DT
903 REAL,DIMENSION(IMS:IME,KMS:KME,SPEC_BDY_WIDTH),INTENT(INOUT) :: &
904 & U_BYS,U_BYE,V_BYS,V_BYE &
908 REAL,DIMENSION(JMS:JME,KMS:KME,SPEC_BDY_WIDTH),INTENT(INOUT) :: &
909 & U_BXS,U_BXE,V_BXS,V_BXE &
913 REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: U,V
914 !-----------------------------------------------------------------------
918 INTEGER :: I,II,IIM,IM,J,JJ,JJM,JM,K,N
919 INTEGER :: MY_IS_GLB, MY_JS_GLB,MY_IE_GLB,MY_JE_GLB
920 INTEGER :: IBDY,JB,IB
921 INTEGER :: ILPAD1,IRPAD1,JBPAD1,JTPAD1
922 LOGICAL :: E_BDY,W_BDY,N_BDY,S_BDY
923 !-----------------------------------------------------------------------
924 !***********************************************************************
925 !-----------------------------------------------------------------------
927 !-----------------------------------------------------------------------
928 !*** TIME INTERPOLATION OF U AND V AT THE OUTER BOUNDARY
929 !-----------------------------------------------------------------------
955 !-----------------------------------------------------------------------
956 !*** SOUTH AND NORTH BOUNDARIES
957 !*** USE IBDY=1 FOR SOUTH; 2 FOR NORTH.
958 !-----------------------------------------------------------------------
962 !*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY.
964 IF(S_BDY.AND.IBDY==1) THEN
966 JB=1 ! Which cell in from Boundary
967 JJ=1 ! Which cell in the Domain
972 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
973 U_BYS(I,K,JB)=U_BYS(I,K,JB)+U_BTYS(I,K,JB)*DT
974 V_BYS(I,K,JB)=V_BYS(I,K,JB)+V_BTYS(I,K,JB)*DT
975 U(I,JJ,K)=U_BYS(I,K,JB)
976 V(I,JJ,K)=V_BYS(I,K,JB)
981 ELSEIF(N_BDY.AND.IBDY==2) THEN
982 JB=1 ! Which cell in from Boundary
983 JJ=JJM ! Which cell in the Domain
988 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
989 U_BYE(I,K,JB)=U_BYE(I,K,JB)+U_BTYE(I,K,JB)*DT
990 V_BYE(I,K,JB)=V_BYE(I,K,JB)+V_BTYE(I,K,JB)*DT
991 U(I,JJ,K)=U_BYE(I,K,JB)
992 V(I,JJ,K)=V_BYE(I,K,JB)
1001 !-----------------------------------------------------------------------
1002 !*** WEST AND EAST BOUNDARIES
1003 !*** USE IBDY=1 FOR WEST; 2 FOR EAST.
1004 !-----------------------------------------------------------------------
1008 !*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY.
1010 IF(W_BDY.AND.IBDY==1) THEN
1011 IB=1 ! Which cell in from boundary
1012 II=1 ! Which cell in the domain
1017 DO J=MAX(JTS-1,JDS+2-1),MIN(JTE+1,JDE-1)
1019 U_BXS(J,K,IB)=U_BXS(J,K,IB)+U_BTXS(J,K,IB)*DT
1020 V_BXS(J,K,IB)=V_BXS(J,K,IB)+V_BTXS(J,K,IB)*DT
1021 U(II,J,K)=U_BXS(J,K,IB)
1022 V(II,J,K)=V_BXS(J,K,IB)
1027 ELSEIF (E_BDY.AND.IBDY==2) THEN
1028 IB=1 ! Which cell in from boundary
1029 II=IIM ! Which cell in the domain
1034 DO J=MAX(JTS-1,JDS+2-1),MIN(JTE+1,JDE-1)
1036 U_BXE(J,K,IB)=U_BXE(J,K,IB)+U_BTXE(J,K,IB)*DT
1037 V_BXE(J,K,IB)=V_BXE(J,K,IB)+V_BTXE(J,K,IB)*DT
1038 U(II,J,K)=U_BXE(J,K,IB)
1039 V(II,J,K)=V_BXE(J,K,IB)
1052 !-----------------------------------------------------------------------
1053 !*** EXTRAPOLATION OF TANGENTIAL VELOCITY AT OUTFLOW POINTS
1054 !*** BASED ON SOME DISCUSSIONS WITH ZAVISA, AND MY EXPERIMENTS
1055 !*** ON GRAVITY PULSE FOR NESTED DOMAIN.
1056 !-----------------------------------------------------------------------
1058 IF(GRIDID/=1)GO TO 201
1060 !-----------------------------------------------------------------------
1063 !$omp& private(i,j,jj,k)
1066 !-----------------------------------------------------------------------
1068 !*** SOUTHERN BOUNDARY
1071 DO I=MYIS1_P1,MYIE2_P1
1072 IF(V(I,1,K)<0.)U(I,1,K)=2.*U(I,3,K)-U(I,5,K)
1076 !*** NORTHERN BOUNDARY
1079 DO I=MYIS1_P1,MYIE2_P1
1081 & U(I,JJM,K)=2.*U(I,JJM-2,K)-U(I,JJM-4,K)
1085 !*** WESTERN BOUNDARY
1090 IF(W_BDY.AND.J>=MY_JS_GLB-JBPAD1 &
1091 & .AND.J<=MY_JE_GLB+JTPAD1)THEN
1094 & V(1,JJ,K)=2.*V(2,JJ,K)-V(3,JJ,K)
1100 !*** EASTERN BOUNDARY
1105 IF(E_BDY.AND.J>=MY_JS_GLB-JBPAD1 &
1106 & .AND.J<=MY_JE_GLB+JTPAD1)THEN
1108 IF(U(IIM,JJ,K)>0.) &
1109 & V(IIM,JJ,K)=2.*V(IIM-1,JJ,K)-V(IIM-2,JJ,K)
1114 !-----------------------------------------------------------------------
1120 !-----------------------------------------------------------------------
1122 !-----------------------------------------------------------------------
1123 !*** SPACE INTERPOLATION OF U AND V AT THE INNER BOUNDARY
1124 !-----------------------------------------------------------------------
1126 !-----------------------------------------------------------------------
1129 !$omp& private(i,j,jj,k)
1132 !-----------------------------------------------------------------------
1134 !*** SOUTHWEST CORNER
1136 IF(S_BDY.AND.W_BDY)THEN
1137 U(2,2,K)=D06666*(4.*(U(1,1,K)+U(2,1,K)+U(2,3,K)) &
1138 & + U(1,2,K)+U(1,4,K)+U(2,4,K))
1139 V(2,2,K)=D06666*(4.*(V(1,1,K)+V(2,1,K)+V(2,3,K)) &
1140 & +V(1,2,K)+V(1,4,K)+V(2,4,K))
1143 !*** SOUTHEAST CORNER
1145 IF(S_BDY.AND.E_BDY)THEN
1146 U(IIM-1,2,K)=D06666*(4.*(U(IIM-2,1,K)+U(IIM-1,1,K) &
1148 & +U(IIM,2,K)+U(IIM,4,K)+U(IIM-1,4,K))
1149 V(IIM-1,2,K)=D06666*(4.*(V(IIM-2,1,K)+V(IIM-1,1,K) &
1151 & +V(IIM,2,K)+V(IIM,4,K)+V(IIM-1,4,K))
1154 !*** NORTHWEST CORNER
1156 IF(N_BDY.AND.W_BDY)THEN
1157 U(2,JJM-1,K)=D06666*(4.*(U(1,JJM,K)+U(2,JJM,K)+U(2,JJM-2,K)) &
1158 & +U(1,JJM-1,K)+U(1,JJM-3,K) &
1160 V(2,JJM-1,K)=D06666*(4.*(V(1,JJM,K)+V(2,JJM,K)+V(2,JJM-2,K)) &
1161 & +V(1,JJM-1,K)+V(1,JJM-3,K) &
1165 !*** NORTHEAST CORNER
1167 IF(N_BDY.AND.E_BDY)THEN
1169 & D06666*(4.*(U(IIM-2,JJM,K)+U(IIM-1,JJM,K)+U(IIM-2,JJM-2,K)) &
1170 & +U(IIM,JJM-1,K)+U(IIM,JJM-3,K)+U(IIM-1,JJM-3,K))
1172 & D06666*(4.*(V(IIM-2,JJM,K)+V(IIM-1,JJM,K)+V(IIM-2,JJM-2,K)) &
1173 & +V(IIM,JJM-1,K)+V(IIM,JJM-3,K)+V(IIM-1,JJM-3,K))
1176 !-----------------------------------------------------------------------
1177 !*** SPACE INTERPOLATION OF U AND V AT THE INNER BOUNDARY
1178 !-----------------------------------------------------------------------
1180 !*** ONE ROW NORTH OF SOUTHERN BOUNDARY
1184 U(I,2,K)=(U(I-1,1,K)+U(I,1,K)+U(I-1,3,K)+U(I,3,K))*0.25
1185 V(I,2,K)=(V(I-1,1,K)+V(I,1,K)+V(I-1,3,K)+V(I,3,K))*0.25
1189 !*** ONE ROW SOUTH OF NORTHERN BOUNDARY
1193 U(I,JJM-1,K)=(U(I-1,JJM-2,K)+U(I,JJM-2,K) &
1194 & +U(I-1,JJM,K)+U(I,JJM,K))*0.25
1195 V(I,JJM-1,K)=(V(I-1,JJM-2,K)+V(I,JJM-2,K) &
1196 & +V(I-1,JJM,K)+V(I,JJM,K))*0.25
1200 !*** ONE ROW EAST OF WESTERN BOUNDARY
1204 IF(W_BDY.AND.J>=MY_JS_GLB-JBPAD1 &
1205 & .AND.J<=MY_JE_GLB+JTPAD1)THEN
1207 U(1,JJ,K)=(U(1,JJ-1,K)+U(2,JJ-1,K) &
1208 & +U(1,JJ+1,K)+U(2,JJ+1,K))*0.25
1209 V(1,JJ,K)=(V(1,JJ-1,K)+V(2,JJ-1,K) &
1210 & +V(1,JJ+1,K)+V(2,JJ+1,K))*0.25
1217 !*** ONE ROW WEST OF EASTERN BOUNDARY
1221 IF(E_BDY.AND.J>=MY_JS_GLB-JBPAD1 &
1222 & .AND.J<=MY_JE_GLB+JTPAD1)THEN
1224 U(IIM-1,JJ,K)=0.25*(U(IIM-1,JJ-1,K)+U(IIM,JJ-1,K) &
1225 & +U(IIM-1,JJ+1,K)+U(IIM,JJ+1,K))
1226 V(IIM-1,JJ,K)=0.25*(V(IIM-1,JJ-1,K)+V(IIM,JJ-1,K) &
1227 & +V(IIM-1,JJ+1,K)+V(IIM,JJ+1,K))
1231 !-----------------------------------------------------------------------
1235 !-----------------------------------------------------------------------
1237 END SUBROUTINE BOCOV
1239 !-----------------------------------------------------------------------
1241 END MODULE MODULE_BNDRY_COND
1243 !-----------------------------------------------------------------------