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
199 !-----------------------------------------------------------------------
200 !***********************************************************************
201 !-----------------------------------------------------------------------
204 !*** DETERMINE THE INDEX OF THE LAST GAS SPECIES
207 ! NUMGAS = GET_LAST_GAS(CONFIG_FLAGS%CHEM_OPT)
239 !-----------------------------------------------------------------------
240 !*** SOUTH AND NORTH BOUNDARIES
241 !-----------------------------------------------------------------------
243 !*** USE IBDY=1 FOR SOUTH; 2 FOR NORTH
247 !*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY.
249 IF(S_BDY.AND.IBDY==1) THEN
250 JB=1 ! Which cell in from boundary
251 JJ=1 ! Which cell in the domain
253 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
254 PD_BYS(I,1,JB)=PD_BYS(I,1,JB)+PD_BTYS(I,1,JB)*DT
255 PD(I,JJ)=PD_BYS(I,1,JB)
261 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
262 T_BYS(I,K,JB)=T_BYS(I,K,JB)+T_BTYS(I,K,JB)*DT
263 Q_BYS(I,K,JB)=Q_BYS(I,K,JB)+Q_BTYS(I,K,JB)*DT
264 Q2_BYS(I,K,JB)=Q2_BYS(I,K,JB)+Q2_BTYS(I,K,JB)*DT
265 CWM_BYS(I,K,JB)=CWM_BYS(I,K,JB)+CWM_BTYS(I,K,JB)*DT
267 T(I,JJ,K)=T_BYS(I,K,JB)
268 Q(I,JJ,K)=Q_BYS(I,K,JB)
269 Q2(I,JJ,K)=Q2_BYS(I,K,JB)
270 CWM(I,JJ,K)=CWM_BYS(I,K,JB)
271 PINT(I,JJ,K)=ETA1(K)*PDTOP &
272 & +ETA2(K)*PD(I,JJ)*RES(I,JJ)+PT
276 ELSEIF(N_BDY.AND.IBDY==2) THEN
277 JB=1 ! Which cell in from boundary
278 JJ=JJM ! Which cell in the domain
281 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
282 PD_BYE(I,1,JB)=PD_BYE(I,1,JB)+PD_BTYE(I,1,JB)*DT
283 PD(I,JJ)=PD_BYE(I,1,JB)
289 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
290 T_BYE(I,K,JB)=T_BYE(I,K,JB)+T_BTYE(I,K,JB)*DT
291 Q_BYE(I,K,JB)=Q_BYE(I,K,JB)+Q_BTYE(I,K,JB)*DT
292 Q2_BYE(I,K,JB)=Q2_BYE(I,K,JB)+Q2_BTYE(I,K,JB)*DT
293 CWM_BYE(I,K,JB)=CWM_BYE(I,K,JB)+CWM_BTYE(I,K,JB)*DT
295 T(I,JJ,K)=T_BYE(I,K,JB)
296 Q(I,JJ,K)=Q_BYE(I,K,JB)
297 Q2(I,JJ,K)=Q2_BYE(I,K,JB)
298 CWM(I,JJ,K)=CWM_BYE(I,K,JB)
299 PINT(I,JJ,K)=ETA1(K)*PDTOP &
300 & +ETA2(K)*PD(I,JJ)*RES(I,JJ)+PT
304 ! ENDIF ! for N/S boundaries
312 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
313 MOIST(I,JJ,K,I_M)=Q(I,JJ,K)/(1.-Q(I,JJ,K))
320 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
330 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
331 SCALAR(I,JJ,K,I_M)=0.
337 !$omp& private(i,k,nv)
340 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
341 CALL BDY_CHEM_VALUE (CHEM(I,K,JJ,NV),Z(I,JJ,K),NV,NUMG)
346 !$omp& private(i,k,nv)
347 DO NV=NUMG+1,NUM_CHEM
350 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
351 PLYR=(PINT(I,JJ,K)+PINT(I,JJ,KK))*0.5
352 RRI=R_D*T(I,JJ,K)*(1.+.608*Q(I,JJ,K))/PLYR
353 CONVFAC=PLYR/RGASUNIV/T(I,JJ,K)
354 CALL BDY_CHEM_VALUE_SORGAM (CHEM(I,K,JJ,NV),Z(I,JJ,K),NV, &
355 CONFIG_FLAGS,RRI,CONVFAC,G)
363 !-----------------------------------------------------------------------
364 !*** WEST AND EAST BOUNDARIES
365 !-----------------------------------------------------------------------
367 !*** USE IBDY=1 FOR WEST; 2 FOR EAST.
371 !*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY.
373 IF(W_BDY.AND.IBDY==1) THEN
374 IB=1 ! Which cell in from boundary
375 II=1 ! Which cell in the domain
377 DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
379 PD_BXS(J,1,IB)=PD_BXS(J,1,IB)+PD_BTXS(J,1,IB)*DT
380 PD(II,J)=PD_BXS(J,1,IB)
387 DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
390 T_BXS(J,K,IB)=T_BXS(J,K,IB)+T_BTXS(J,K,IB)*DT
391 Q_BXS(J,K,IB)=Q_BXS(J,K,IB)+Q_BTXS(J,K,IB)*DT
392 Q2_BXS(J,K,IB)=Q2_BXS(J,K,IB)+Q2_BTXS(J,K,IB)*DT
393 CWM_BXS(J,K,IB)=CWM_BXS(J,K,IB)+CWM_BTXS(J,K,IB)*DT
395 T(II,J,K)=T_BXS(J,K,IB)
396 Q(II,J,K)=Q_BXS(J,K,IB)
397 Q2(II,J,K)=Q2_BXS(J,K,IB)
398 CWM(II,J,K)=CWM_BXS(J,K,IB)
399 PINT(II,J,K)=ETA1(K)*PDTOP &
400 & +ETA2(K)*PD(II,J)*RES(II,J)+PT
406 ELSEIF(E_BDY.AND.IBDY==2) THEN
407 IB=1 ! Which cell in from boundary
408 II=IIM ! Which cell in the domain
410 DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
412 PD_BXE(J,1,IB)=PD_BXE(J,1,IB)+PD_BTXE(J,1,IB)*DT
413 PD(II,J)=PD_BXE(J,1,IB)
420 DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
423 T_BXE(J,K,IB)=T_BXE(J,K,IB)+T_BTXE(J,K,IB)*DT
424 Q_BXE(J,K,IB)=Q_BXE(J,K,IB)+Q_BTXE(J,K,IB)*DT
425 Q2_BXE(J,K,IB)=Q2_BXE(J,K,IB)+Q2_BTXE(J,K,IB)*DT
426 CWM_BXE(J,K,IB)=CWM_BXE(J,K,IB)+CWM_BTXE(J,K,IB)*DT
428 T(II,J,K)=T_BXE(J,K,IB)
429 Q(II,J,K)=Q_BXE(J,K,IB)
430 Q2(II,J,K)=Q2_BXE(J,K,IB)
431 CWM(II,J,K)=CWM_BXE(J,K,IB)
432 PINT(II,J,K)=ETA1(K)*PDTOP &
433 & +ETA2(K)*PD(II,J)*RES(II,J)+PT
439 ! ENDIF ! for W/E boundaries
446 DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
448 MOIST(II,J,K,I_M)=Q(II,J,K)/(1.-Q(II,J,K))
457 DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
471 DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
473 SCALAR(II,J,K,I_M)=0.
481 !$omp& private(nv,j,k)
484 DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
487 CALL BDY_CHEM_VALUE (CHEM(II,K,J,NV),Z(II,J,K),NV,NUMG)
491 DO NV=NUMG+1,NUM_CHEM
492 PLYR=(PINT(II,J,K)+PINT(II,J,KK))*0.5
493 RRI=R_D*T(II,J,K)*(1.+P608*Q(II,J,K))/PLYR
494 CONVFAC=PLYR/RGASUNIV/T(II,J,K)
495 CALL BDY_CHEM_VALUE_SORGAM (CHEM(II,K,J,NV),Z(II,J,K),NV, &
496 & CONFIG_FLAGS,RRI,CONVFAC,G)
506 !-----------------------------------------------------------------------
507 !*** SPACE INTERPOLATION OF PD THEN REMAINING MASS VARIABLES
508 !*** AT INNER BOUNDARY
509 !-----------------------------------------------------------------------
511 !*** ONE ROW NORTH OF SOUTHERN BOUNDARY
515 PD(I,2)=0.25*(PD(I,1)+PD(I+1,1)+PD(I,3)+PD(I+1,3))
519 !*** ONE ROW SOUTH OF NORTHERN BOUNDARY
524 PD(I,JJM-1)=0.25*(PD(I,JJM-2)+PD(I+1,JJM-2) &
525 & +PD(I,JJM)+PD(I+1,JJM))
529 IF(I<=IDE-1.AND.ABS(CWK-PD(I,JJM-1))>=300.)THEN
530 WRITE(0,*)'PSEUDO HYDROSTATIC IMBALANCE AT THE NORTHERN BOUNDARY AT',I,JJM-1,'GRID #',GRIDID
531 WRITE(0,*)' ',CWK/100.
532 WRITE(0,*)PD(I,JJM)/100.,' ',PD(I+1,JJM)/100.
533 WRITE(0,*)' ',PD(I,JJM-1)/100.
534 WRITE(0,*)PD(I,JJM-2)/100.,' ',PD(I+1,JJM-2)/100.
541 !*** ONE ROW EAST OF WESTERN BOUNDARY
546 IF(W_BDY.AND.J>=MY_JS_GLB-JBPAD1 &
547 & .AND.J<=MY_JE_GLB+JTPAD1)THEN
550 PD(1,JJ)=0.25*(PD(1,JJ-1)+PD(2,JJ-1)+PD(1,JJ+1)+PD(2,JJ+1))
554 IF(ABS(CWK-PD(1,JJ))>300.)THEN
555 WRITE(0,*)'PSEUDO HYDROSTATIC IMBALANCE AT THE WESTERN BOUNDARY AT',J,1,'GRID #',GRIDID
556 WRITE(0,*)' ',CWK/100.
557 WRITE(0,*)PD(1,JJ+1)/100.,' ',PD(2,JJ+1)/100.
558 WRITE(0,*)' ',PD(1,JJ)/100.
559 WRITE(0,*)PD(1,JJ-1)/100,' ',PD(2,JJ-1)/100.
568 !*** ONE ROW WEST OF EASTERN BOUNDARY
573 IF(E_BDY.AND.J>=MY_JS_GLB-JBPAD1 &
574 & .AND.J<=MY_JE_GLB+JTPAD1)THEN
576 PD(IIM-1,JJ)=0.25*(PD(IIM-1,JJ-1)+PD(IIM,JJ-1) &
577 & +PD(IIM-1,JJ+1)+PD(IIM,JJ+1))
583 !-----------------------------------------------------------------------
586 !$omp& private(i,j,jj,k)
589 !-----------------------------------------------------------------------
591 !*** ONE ROW NORTH OF SOUTHERN BOUNDARY
595 T(I,2,K)=(T(I,1,K)+T(I+1,1,K)+T(I,3,K)+T(I+1,3,K))*0.25
596 Q(I,2,K)=(Q(I,1,K)+Q(I+1,1,K)+Q(I,3,K)+Q(I+1,3,K))*0.25
597 Q2(I,2,K)=(Q2(I,1,K)+Q2(I+1,1,K)+Q2(I,3,K)+Q2(I+1,3,K))*0.25
598 CWM(I,2,K)=(CWM(I,1,K)+CWM(I+1,1,K)+CWM(I,3,K)+CWM(I+1,3,K)) &
600 PINT(I,2,K)=ETA1(K)*PDTOP+ETA2(K)*PD(I,2)*RES(I,2)+PT
606 MOIST(I,2,K,I_M)=Q(I,2,K)/(1.-Q(I,2,K))
610 MOIST(I,2,K,I_M)=(MOIST(I,1,K,I_M) &
611 & +MOIST(I+1,1,K,I_M) &
612 & +MOIST(I,3,K,I_M) &
613 & +MOIST(I+1,3,K,I_M))*0.25
620 SCALAR(I,2,K,I_M)=(SCALAR(I,1,K,I_M) &
621 & +SCALAR(I+1,1,K,I_M) &
622 & +SCALAR(I,3,K,I_M) &
623 & +SCALAR(I+1,3,K,I_M))*0.25
629 !*** ONE ROW SOUTH OF NORTHERN BOUNDARY
633 T(I,JJM-1,K)=(T(I,JJM-2,K)+T(I+1,JJM-2,K) &
634 & +T(I,JJM,K)+T(I+1,JJM,K)) &
636 Q(I,JJM-1,K)=(Q(I,JJM-2,K)+Q(I+1,JJM-2,K) &
637 & +Q(I,JJM,K)+Q(I+1,JJM,K)) &
639 Q2(I,JJM-1,K)=(Q2(I,JJM-2,K)+Q2(I+1,JJM-2,K) &
640 & +Q2(I,JJM,K)+Q2(I+1,JJM,K)) &
642 CWM(I,JJM-1,K)=(CWM(I,JJM-2,K)+CWM(I+1,JJM-2,K) &
643 & +CWM(I,JJM,K)+CWM(I+1,JJM,K)) &
645 PINT(I,JJM-1,K)=ETA1(K)*PDTOP &
646 & +ETA2(K)*PD(I,JJM-1)*RES(I,JJM-1)+PT
652 MOIST(I,JJM-1,K,I_M)=Q(I,JJM-1,K)/(1.-Q(I,JJM-1,K))
656 MOIST(I,JJM-1,K,I_M)=(MOIST(I,JJM-2,K,I_M) &
657 & +MOIST(I+1,JJM-2,K,I_M) &
658 & +MOIST(I,JJM,K,I_M) &
659 & +MOIST(I+1,JJM,K,I_M))*0.25
667 SCALAR(I,JJM-1,K,I_M)=(SCALAR(I,JJM-2,K,I_M) &
668 & +SCALAR(I+1,JJM-2,K,I_M) &
669 & +SCALAR(I,JJM,K,I_M) &
670 & +SCALAR(I+1,JJM,K,I_M))*0.25
676 !*** ONE ROW EAST OF WESTERN BOUNDARY
681 IF(W_BDY.AND.J>=MY_JS_GLB-JBPAD1 &
682 & .AND.J<=MY_JE_GLB+JTPAD1)THEN
684 T(1,JJ,K)=(T(1,JJ-1,K)+T(2,JJ-1,K) &
685 & +T(1,JJ+1,K)+T(2,JJ+1,K)) &
687 Q(1,JJ,K)=(Q(1,JJ-1,K)+Q(2,JJ-1,K) &
688 & +Q(1,JJ+1,K)+Q(2,JJ+1,K)) &
690 Q2(1,JJ,K)=(Q2(1,JJ-1,K)+Q2(2,JJ-1,K) &
691 & +Q2(1,JJ+1,K)+Q2(2,JJ+1,K)) &
693 CWM(1,JJ,K)=(CWM(1,JJ-1,K)+CWM(2,JJ-1,K) &
694 & +CWM(1,JJ+1,K)+CWM(2,JJ+1,K)) &
696 PINT(1,JJ,K)=ETA1(K)*PDTOP &
697 & +ETA2(K)*PD(1,JJ)*RES(1,JJ)+PT
701 MOIST(1,JJ,K,I_M)=Q(1,JJ,K)/(1.-Q(1,JJ,K))
703 MOIST(1,JJ,K,I_M)=(MOIST(1,JJ-1,K,I_M) &
704 & +MOIST(2,JJ-1,K,I_M) &
705 & +MOIST(1,JJ+1,K,I_M) &
706 & +MOIST(2,JJ+1,K,I_M))*0.25
711 SCALAR(1,JJ,K,I_M)=(SCALAR(1,JJ-1,K,I_M) &
712 & +SCALAR(2,JJ-1,K,I_M) &
713 & +SCALAR(1,JJ+1,K,I_M) &
714 & +SCALAR(2,JJ+1,K,I_M))*0.25
723 !*** ONE ROW WEST OF EASTERN BOUNDARY
728 IF(E_BDY.AND.J>=MY_JS_GLB-JBPAD1 &
729 & .AND.J<=MY_JE_GLB+JTPAD1)THEN
731 T(IIM-1,JJ,K)=(T(IIM-1,JJ-1,K)+T(IIM,JJ-1,K) &
732 & +T(IIM-1,JJ+1,K)+T(IIM,JJ+1,K)) &
734 Q(IIM-1,JJ,K)=(Q(IIM-1,JJ-1,K)+Q(IIM,JJ-1,K) &
735 & +Q(IIM-1,JJ+1,K)+Q(IIM,JJ+1,K)) &
737 Q2(IIM-1,JJ,K)=(Q2(IIM-1,JJ-1,K)+Q2(IIM,JJ-1,K) &
738 & +Q2(IIM-1,JJ+1,K)+Q2(IIM,JJ+1,K)) &
740 CWM(IIM-1,JJ,K)=(CWM(IIM-1,JJ-1,K)+CWM(IIM,JJ-1,K) &
741 & +CWM(IIM-1,JJ+1,K)+CWM(IIM,JJ+1,K)) &
743 PINT(IIM-1,JJ,K)=ETA1(K)*PDTOP &
744 & +ETA2(K)*PD(IIM-1,JJ)*RES(IIM-1,JJ)+PT
748 MOIST(IIM-1,JJ,K,I_M)=Q(IIM-1,JJ,K)/(1.-Q(IIM-1,JJ,K))
750 MOIST(IIM-1,JJ,K,I_M)=(MOIST(IIM-1,JJ-1,K,I_M) &
751 & +MOIST(IIM,JJ-1,K,I_M) &
752 & +MOIST(IIM-1,JJ+1,K,I_M) &
753 & +MOIST(IIM,JJ+1,K,I_M))*0.25
758 SCALAR(IIM-1,JJ,K,I_M)=(SCALAR(IIM-1,JJ-1,K,I_M) &
759 & +SCALAR(IIM,JJ-1,K,I_M) &
760 & +SCALAR(IIM-1,JJ+1,K,I_M) &
761 & +SCALAR(IIM,JJ+1,K,I_M))*0.25
768 !-----------------------------------------------------------------------
772 !-----------------------------------------------------------------------
774 !-----------------------------------------------------------------------
775 !***********************************************************************
776 !-----------------------------------------------------------------------
777 SUBROUTINE BOCOV(GRIDID,NTSD,DT,LB &
778 & ,U_BXS,U_BXE,U_BYS,U_BYE &
779 & ,V_BXS,V_BXE,V_BYS,V_BYE &
780 & ,U_BTXS,U_BTXE,U_BTYS,U_BTYE &
781 & ,V_BTXS,V_BTXE,V_BTYS,V_BTYE &
785 & ,IDS,IDE,JDS,JDE,KDS,KDE &
786 & ,IMS,IME,JMS,JME,KMS,KME &
787 & ,ITS,ITE,JTS,JTE,KTS,KTE)
788 !***********************************************************************
789 !$$$ SUBPROGRAM DOCUMENTATION BLOCK
791 ! SUBPROGRAM: BOCOV UPDATE WIND POINTS ON BOUNDARY
792 ! PRGRMMR: JANJIC ORG: W/NP22 DATE: 94-03-08
795 ! U AND V COMPONENTS OF THE WIND ARE UPDATED ON THE
796 ! DOMAIN BOUNDARY BY APPLYING THE PRE-COMPUTED
797 ! TENDENCIES AT EACH TIME STEP. AN EXTRAPOLATION FROM
798 ! INSIDE THE DOMAIN IS USED FOR THE COMPONENT TANGENTIAL
799 ! TO THE BOUNDARY IF THE NORMAL COMPONENT IS OUTWARD.
801 ! PROGRAM HISTORY LOG:
802 ! 87-??-?? MESINGER - ORIGINATOR
803 ! 95-03-25 BLACK - CONVERSION FROM 1-D TO 2-D IN HORIZONTAL
804 ! 98-10-30 BLACK - MODIFIED FOR DISTRIBUTED MEMORY
805 ! 01-03-13 BLACK - CONVERTED TO WRF STRUCTURE
806 ! 02-09-06 WOLFE - MORE CONVERSION TO GLOBAL INDEXING
807 ! 04-11-23 BLACK - THREADED
808 ! 05-12-19 BLACK - CONVERTED FROM IKJ TO IJK
809 ! 06-06-02 GOPAL - MODIFICATIONS FOR NESTING
811 ! USAGE: CALL BOCOH FROM SUBROUTINE SOLVE_NMM
812 ! INPUT ARGUMENT LIST:
814 ! NOTE THAT IDE AND JDE INSIDE ROUTINE SHOULD BE PASSED IN
815 ! AS WHAT WRF CONSIDERS THE UNSTAGGERED GRID DIMENSIONS; THAT
816 ! IS, 1 LESS THAN THE IDE AND JDE SET BY WRF FRAMEWORK, JM
818 ! OUTPUT ARGUMENT LIST:
823 ! SUBPROGRAMS CALLED:
830 ! LANGUAGE: FORTRAN 90
833 !***********************************************************************
834 !-----------------------------------------------------------------------
838 !-----------------------------------------------------------------------
839 INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
840 & ,IMS,IME,JMS,JME,KMS,KME &
841 & ,ITS,ITE,JTS,JTE,KTS,KTE
842 INTEGER,INTENT(IN) :: SPEC_BDY_WIDTH
844 INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW
846 INTEGER,INTENT(IN) :: GRIDID
847 INTEGER,INTENT(IN) :: LB,NTSD
849 REAL,INTENT(IN) :: DT
851 REAL,DIMENSION(IMS:IME,KMS:KME,SPEC_BDY_WIDTH),INTENT(INOUT) :: &
852 & U_BYS,U_BYE,V_BYS,V_BYE &
856 REAL,DIMENSION(JMS:JME,KMS:KME,SPEC_BDY_WIDTH),INTENT(INOUT) :: &
857 & U_BXS,U_BXE,V_BXS,V_BXE &
861 REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: U,V
862 !-----------------------------------------------------------------------
866 INTEGER :: I,II,IIM,IM,J,JJ,JJM,JM,K,N
867 INTEGER :: MY_IS_GLB, MY_JS_GLB,MY_IE_GLB,MY_JE_GLB
868 INTEGER :: IBDY,JB,IB
869 INTEGER :: ILPAD1,IRPAD1,JBPAD1,JTPAD1
870 LOGICAL :: E_BDY,W_BDY,N_BDY,S_BDY
871 !-----------------------------------------------------------------------
872 !***********************************************************************
873 !-----------------------------------------------------------------------
875 !-----------------------------------------------------------------------
876 !*** TIME INTERPOLATION OF U AND V AT THE OUTER BOUNDARY
877 !-----------------------------------------------------------------------
903 !-----------------------------------------------------------------------
904 !*** SOUTH AND NORTH BOUNDARIES
905 !*** USE IBDY=1 FOR SOUTH; 2 FOR NORTH.
906 !-----------------------------------------------------------------------
910 !*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY.
912 IF(S_BDY.AND.IBDY==1) THEN
914 JB=1 ! Which cell in from Boundary
915 JJ=1 ! Which cell in the Domain
920 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
921 U_BYS(I,K,JB)=U_BYS(I,K,JB)+U_BTYS(I,K,JB)*DT
922 V_BYS(I,K,JB)=V_BYS(I,K,JB)+V_BTYS(I,K,JB)*DT
923 U(I,JJ,K)=U_BYS(I,K,JB)
924 V(I,JJ,K)=V_BYS(I,K,JB)
929 ELSEIF(N_BDY.AND.IBDY==2) THEN
930 JB=1 ! Which cell in from Boundary
931 JJ=JJM ! Which cell in the Domain
936 DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
937 U_BYE(I,K,JB)=U_BYE(I,K,JB)+U_BTYE(I,K,JB)*DT
938 V_BYE(I,K,JB)=V_BYE(I,K,JB)+V_BTYE(I,K,JB)*DT
939 U(I,JJ,K)=U_BYE(I,K,JB)
940 V(I,JJ,K)=V_BYE(I,K,JB)
949 !-----------------------------------------------------------------------
950 !*** WEST AND EAST BOUNDARIES
951 !*** USE IBDY=1 FOR WEST; 2 FOR EAST.
952 !-----------------------------------------------------------------------
956 !*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY.
958 IF(W_BDY.AND.IBDY==1) THEN
959 IB=1 ! Which cell in from boundary
960 II=1 ! Which cell in the domain
965 DO J=MAX(JTS-1,JDS+2-1),MIN(JTE+1,JDE-1)
967 U_BXS(J,K,IB)=U_BXS(J,K,IB)+U_BTXS(J,K,IB)*DT
968 V_BXS(J,K,IB)=V_BXS(J,K,IB)+V_BTXS(J,K,IB)*DT
969 U(II,J,K)=U_BXS(J,K,IB)
970 V(II,J,K)=V_BXS(J,K,IB)
975 ELSEIF (E_BDY.AND.IBDY==2) THEN
976 IB=1 ! Which cell in from boundary
977 II=IIM ! Which cell in the domain
982 DO J=MAX(JTS-1,JDS+2-1),MIN(JTE+1,JDE-1)
984 U_BXE(J,K,IB)=U_BXE(J,K,IB)+U_BTXE(J,K,IB)*DT
985 V_BXE(J,K,IB)=V_BXE(J,K,IB)+V_BTXE(J,K,IB)*DT
986 U(II,J,K)=U_BXE(J,K,IB)
987 V(II,J,K)=V_BXE(J,K,IB)
1000 !-----------------------------------------------------------------------
1001 !*** EXTRAPOLATION OF TANGENTIAL VELOCITY AT OUTFLOW POINTS
1002 !*** BASED ON SOME DISCUSSIONS WITH ZAVISA, AND MY EXPERIMENTS
1003 !*** ON GRAVITY PULSE FOR NESTED DOMAIN.
1004 !-----------------------------------------------------------------------
1006 IF(GRIDID/=1)GO TO 201
1008 !-----------------------------------------------------------------------
1011 !$omp& private(i,j,jj,k)
1014 !-----------------------------------------------------------------------
1016 !*** SOUTHERN BOUNDARY
1019 DO I=MYIS1_P1,MYIE2_P1
1020 IF(V(I,1,K)<0.)U(I,1,K)=2.*U(I,3,K)-U(I,5,K)
1024 !*** NORTHERN BOUNDARY
1027 DO I=MYIS1_P1,MYIE2_P1
1029 & U(I,JJM,K)=2.*U(I,JJM-2,K)-U(I,JJM-4,K)
1033 !*** WESTERN BOUNDARY
1038 IF(W_BDY.AND.J>=MY_JS_GLB-JBPAD1 &
1039 & .AND.J<=MY_JE_GLB+JTPAD1)THEN
1042 & V(1,JJ,K)=2.*V(2,JJ,K)-V(3,JJ,K)
1048 !*** EASTERN BOUNDARY
1053 IF(E_BDY.AND.J>=MY_JS_GLB-JBPAD1 &
1054 & .AND.J<=MY_JE_GLB+JTPAD1)THEN
1056 IF(U(IIM,JJ,K)>0.) &
1057 & V(IIM,JJ,K)=2.*V(IIM-1,JJ,K)-V(IIM-2,JJ,K)
1062 !-----------------------------------------------------------------------
1068 !-----------------------------------------------------------------------
1070 !-----------------------------------------------------------------------
1071 !*** SPACE INTERPOLATION OF U AND V AT THE INNER BOUNDARY
1072 !-----------------------------------------------------------------------
1074 !-----------------------------------------------------------------------
1077 !$omp& private(i,j,jj,k)
1080 !-----------------------------------------------------------------------
1082 !*** SOUTHWEST CORNER
1084 IF(S_BDY.AND.W_BDY)THEN
1085 U(2,2,K)=D06666*(4.*(U(1,1,K)+U(2,1,K)+U(2,3,K)) &
1086 & + U(1,2,K)+U(1,4,K)+U(2,4,K))
1087 V(2,2,K)=D06666*(4.*(V(1,1,K)+V(2,1,K)+V(2,3,K)) &
1088 & +V(1,2,K)+V(1,4,K)+V(2,4,K))
1091 !*** SOUTHEAST CORNER
1093 IF(S_BDY.AND.E_BDY)THEN
1094 U(IIM-1,2,K)=D06666*(4.*(U(IIM-2,1,K)+U(IIM-1,1,K) &
1096 & +U(IIM,2,K)+U(IIM,4,K)+U(IIM-1,4,K))
1097 V(IIM-1,2,K)=D06666*(4.*(V(IIM-2,1,K)+V(IIM-1,1,K) &
1099 & +V(IIM,2,K)+V(IIM,4,K)+V(IIM-1,4,K))
1102 !*** NORTHWEST CORNER
1104 IF(N_BDY.AND.W_BDY)THEN
1105 U(2,JJM-1,K)=D06666*(4.*(U(1,JJM,K)+U(2,JJM,K)+U(2,JJM-2,K)) &
1106 & +U(1,JJM-1,K)+U(1,JJM-3,K) &
1108 V(2,JJM-1,K)=D06666*(4.*(V(1,JJM,K)+V(2,JJM,K)+V(2,JJM-2,K)) &
1109 & +V(1,JJM-1,K)+V(1,JJM-3,K) &
1113 !*** NORTHEAST CORNER
1115 IF(N_BDY.AND.E_BDY)THEN
1117 & D06666*(4.*(U(IIM-2,JJM,K)+U(IIM-1,JJM,K)+U(IIM-2,JJM-2,K)) &
1118 & +U(IIM,JJM-1,K)+U(IIM,JJM-3,K)+U(IIM-1,JJM-3,K))
1120 & D06666*(4.*(V(IIM-2,JJM,K)+V(IIM-1,JJM,K)+V(IIM-2,JJM-2,K)) &
1121 & +V(IIM,JJM-1,K)+V(IIM,JJM-3,K)+V(IIM-1,JJM-3,K))
1124 !-----------------------------------------------------------------------
1125 !*** SPACE INTERPOLATION OF U AND V AT THE INNER BOUNDARY
1126 !-----------------------------------------------------------------------
1128 !*** ONE ROW NORTH OF SOUTHERN BOUNDARY
1132 U(I,2,K)=(U(I-1,1,K)+U(I,1,K)+U(I-1,3,K)+U(I,3,K))*0.25
1133 V(I,2,K)=(V(I-1,1,K)+V(I,1,K)+V(I-1,3,K)+V(I,3,K))*0.25
1137 !*** ONE ROW SOUTH OF NORTHERN BOUNDARY
1141 U(I,JJM-1,K)=(U(I-1,JJM-2,K)+U(I,JJM-2,K) &
1142 & +U(I-1,JJM,K)+U(I,JJM,K))*0.25
1143 V(I,JJM-1,K)=(V(I-1,JJM-2,K)+V(I,JJM-2,K) &
1144 & +V(I-1,JJM,K)+V(I,JJM,K))*0.25
1148 !*** ONE ROW EAST OF WESTERN BOUNDARY
1152 IF(W_BDY.AND.J>=MY_JS_GLB-JBPAD1 &
1153 & .AND.J<=MY_JE_GLB+JTPAD1)THEN
1155 U(1,JJ,K)=(U(1,JJ-1,K)+U(2,JJ-1,K) &
1156 & +U(1,JJ+1,K)+U(2,JJ+1,K))*0.25
1157 V(1,JJ,K)=(V(1,JJ-1,K)+V(2,JJ-1,K) &
1158 & +V(1,JJ+1,K)+V(2,JJ+1,K))*0.25
1165 !*** ONE ROW WEST OF EASTERN BOUNDARY
1169 IF(E_BDY.AND.J>=MY_JS_GLB-JBPAD1 &
1170 & .AND.J<=MY_JE_GLB+JTPAD1)THEN
1172 U(IIM-1,JJ,K)=0.25*(U(IIM-1,JJ-1,K)+U(IIM,JJ-1,K) &
1173 & +U(IIM-1,JJ+1,K)+U(IIM,JJ+1,K))
1174 V(IIM-1,JJ,K)=0.25*(V(IIM-1,JJ-1,K)+V(IIM,JJ-1,K) &
1175 & +V(IIM-1,JJ+1,K)+V(IIM,JJ+1,K))
1179 !-----------------------------------------------------------------------
1183 !-----------------------------------------------------------------------
1185 END SUBROUTINE BOCOV
1187 !-----------------------------------------------------------------------
1189 END MODULE MODULE_BNDRY_COND
1191 !-----------------------------------------------------------------------