!----------------------------------------------------------------------- ! !NCEP_MESO:MODEL_LAYER: BOUNDARY CONDITION UPDATES ! !----------------------------------------------------------------------- ! #include "nmm_loop_basemacros.h" #include "nmm_loop_macros.h" ! !----------------------------------------------------------------------- ! MODULE MODULE_BNDRY_COND 1 ! !----------------------------------------------------------------------- USE MODULE_STATE_DESCRIPTION USE MODULE_MODEL_CONSTANTS !----------------------------------------------------------------------- REAL :: D06666=0.06666666 !----------------------------------------------------------------------- ! CONTAINS ! !*********************************************************************** SUBROUTINE MASS_BOUNDARY(GRIDID,NTSD,DT0,NEST,NBC,NBOCO,LAST_TIME,TSPH & 1,24 & ,LB,ETA1,ETA2,PDTOP,PT,RES & & ,PD_BXS, PD_BXE, PD_BYS, PD_BYE & & ,T_BXS, T_BXE, T_BYS, T_BYE & & ,Q_BXS, Q_BXE, Q_BYS, Q_BYE & & ,U_BXS, U_BXE, U_BYS, U_BYE & & ,V_BXS, V_BXE, V_BYS, V_BYE & & ,Q2_BXS, Q2_BXE, Q2_BYS, Q2_BYE & & ,PD_BTXS, PD_BTXE, PD_BTYS, PD_BTYE & & ,T_BTXS, T_BTXE, T_BTYS, T_BTYE & & ,Q_BTXS, Q_BTXE, Q_BTYS, Q_BTYE & & ,U_BTXS, U_BTXE, U_BTYS, U_BTYE & & ,V_BTXS, V_BTXE, V_BTYS, V_BTYE & & ,Q2_BTXS, Q2_BTXE, Q2_BTYS, Q2_BTYE & & ,PD,T,Q,Q2,PINT & #ifdef WRF_CHEM & ,CHEM,NUMG,CONFIG_FLAGS & #endif & ,SPEC_BDY_WIDTH,Z & & ,IHE,IHW,IVE,IVW & & ,IDS,IDE,JDS,JDE,KDS,KDE & & ,IMS,IME,JMS,JME,KMS,KME & & ,ITS,ITE,JTS,JTE,KTS,KTE) !*********************************************************************** !$$$ SUBPROGRAM DOCUMENTATION BLOCK ! . . . ! SUBPROGRAM: BOCOH UPDATE MASS POINTS ON BOUNDARY ! PRGRMMR: JANJIC ORG: W/NP22 DATE: 94-03-08 ! ! ABSTRACT: ! TEMPERATURE, SPECIFIC HUMIDITY, AND SURFACE PRESSURE ! ARE UPDATED ON THE DOMAIN BOUNDARY BY APPLYING THE ! PRE-COMPUTED TENDENCIES AT EACH TIME STEP. ! ! PROGRAM HISTORY LOG: ! 87-??-?? MESINGER - ORIGINATOR ! 95-03-25 BLACK - CONVERSION FROM 1-D TO 2-D in HORIZONTAL ! 96-12-13 BLACK - FINAL MODIFICATION FOR NESTED RUNS ! 98-10-30 BLACK - MODIFIED FOR DISTRIBUTED MEMORY ! 00-01-06 BLACK - MODIFIED FOR JANJIC NONHYDROSTATIC CODE ! 00-09-14 BLACK - MODIFIED FOR DIRECT ACCESS READ ! 01-03-12 BLACK - CONVERTED TO WRF STRUCTURE ! 02-08-29 MICHALAKES - CHANGED II=I-MY_IS_GLB+1 TO II=I ! ADDED CONDITIONAL COMPILATION AROUND MPI ! CONVERT INDEXING FROM LOCAL TO GLOBAL ! 02-09-06 WOLFE - MORE CONVERSION TO GLOBAL INDEXING ! 04-11-18 BLACK - THREADED ! 05-12-19 BLACK - CONVERTED FROM IKJ TO IJK ! 06-06-02 GOPAL - MODIFICATIONS FOR NESTING ! 07-11-14 PYLE - UPDATED FOR NEW WRF BOUNDARY FILE STRUCTURE ! ! USAGE: CALL BOCOH FROM SUBROUTINE SOLVE_NMM ! INPUT ARGUMENT LIST: ! ! NOTE THAT IDE AND JDE INSIDE ROUTINE SHOULD BE PASSED IN ! AS WHAT WRF CONSIDERS THE UNSTAGGERED GRID DIMENSIONS; THAT ! IS, 1 LESS THAN THE IDE AND JDE SET BY WRF FRAMEWORK, JM ! ! OUTPUT ARGUMENT LIST: ! ! OUTPUT FILES: ! NONE ! ! SUBPROGRAMS CALLED: ! ! UNIQUE: NONE ! ! LIBRARY: NONE ! ! ATTRIBUTES: ! LANGUAGE: FORTRAN 90 ! MACHINE : IBM !$$$ !*********************************************************************** !----------------------------------------------------------------------- #ifdef WRF_CHEM USE MODULE_INPUT_CHEM_DATA #endif !----------------------------------------------------------------------- ! IMPLICIT NONE ! !----------------------------------------------------------------------- LOGICAL,INTENT(IN) :: NEST ! INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & & ,IMS,IME,JMS,JME,KMS,KME & & ,ITS,ITE,JTS,JTE,KTS,KTE INTEGER,INTENT(IN) :: SPEC_BDY_WIDTH #ifdef WRF_CHEM INTEGER,INTENT(IN) :: NUMG #endif ! INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW ! INTEGER,INTENT(IN) :: GRIDID INTEGER,INTENT(IN) :: LB,NBC,NTSD LOGICAL,INTENT(IN) :: LAST_TIME INTEGER,INTENT(INOUT) :: NBOCO ! REAL,INTENT(IN) :: DT0,PDTOP,PT,TSPH ! REAL,DIMENSION(KMS:KME),INTENT(IN) :: ETA1,ETA2 ! REAL,DIMENSION(IMS:IME,1,SPEC_BDY_WIDTH) & & ,INTENT(INOUT) :: PD_BYS, PD_BYE & & ,PD_BTYS,PD_BTYE ! REAL,DIMENSION(IMS:IME,KMS:KME,SPEC_BDY_WIDTH) & & ,INTENT(INOUT) :: T_BYS, T_BYE & & ,U_BYS, U_BYE & & ,V_BYS, V_BYE & & ,Q_BYS, Q_BYE & & ,Q2_BYS, Q2_BYE & & ,T_BTYS, T_BTYE & & ,U_BTYS, U_BTYE & & ,V_BTYS, V_BTYE & & ,Q_BTYS, Q_BTYE & & ,Q2_BTYS, Q2_BTYE REAL,DIMENSION(JMS:JME,1,SPEC_BDY_WIDTH) & & ,INTENT(INOUT) :: PD_BXS, PD_BXE & & ,PD_BTXS,PD_BTXE REAL,DIMENSION(JMS:JME,KMS:KME,SPEC_BDY_WIDTH) & & ,INTENT(INOUT) :: T_BXS, T_BXE & & ,U_BXS, U_BXE & & ,V_BXS, V_BXE & & ,Q_BXS, Q_BXE & & ,Q2_BXS, Q2_BXE & & ,T_BTXS, T_BTXE & & ,U_BTXS, U_BTXE & & ,V_BTXS, V_BTXE & & ,Q_BTXS, Q_BTXE & & ,Q2_BTXS, Q2_BTXE ! REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: RES REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: PD ! REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: & & PINT,Q & & ,Q2,T,Z ! #ifdef WRF_CHEM REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME,NUM_CHEM) & & ,INTENT(INOUT) :: CHEM TYPE(GRID_CONFIG_REC_TYPE),INTENT(IN) :: CONFIG_FLAGS #endif ! !----------------------------------------------------------------------- ! !*** LOCAL VARIABLES ! INTEGER :: I,IB,IBDY,II,IIM,IM,IRTN,ISIZ1,ISIZ2 & & ,J,JB,JJ,JJM,JM,K,KK,N,NN,NREC,NUMGAS,NV,REC INTEGER :: MY_IS_GLB,MY_JS_GLB,MY_IE_GLB,MY_JE_GLB INTEGER :: I_M,ILPAD1,IRPAD1,JBPAD1,JTPAD1 ! REAL :: BCHR,CONVFAC,CWK,DT,PLYR,RRI ! LOGICAL :: E_BDY,W_BDY,N_BDY,S_BDY ! CHARACTER(LEN=255) :: message !----------------------------------------------------------------------- !*********************************************************************** !----------------------------------------------------------------------- ! #ifdef WRF_CHEM !*** DETERMINE THE INDEX OF THE LAST GAS SPECIES NUMGAS=P_HO2 NUMGAS=NUMG ! NUMGAS = GET_LAST_GAS(CONFIG_FLAGS%CHEM_OPT) ! #endif IM=IDE-IDS+1 JM=JDE-JDS+1 IIM=IM JJM=JM ! ISIZ1=2*LB ISIZ2=2*LB*(KME-KMS) ! W_BDY=(ITS==IDS) E_BDY=(ITE==IDE) S_BDY=(JTS==JDS) N_BDY=(JTE==JDE) ! ILPAD1=1 IF(W_BDY)ILPAD1=0 IRPAD1=1 IF(E_BDY)IRPAD1=0 JBPAD1=1 IF(S_BDY)JBPAD1=0 JTPAD1=1 IF(N_BDY)JTPAD1=0 ! MY_IS_GLB=ITS MY_IE_GLB=ITE MY_JS_GLB=JTS MY_JE_GLB=JTE ! DT=DT0 ! !----------------------------------------------------------------------- !*** SOUTH AND NORTH BOUNDARIES !----------------------------------------------------------------------- ! !*** USE IBDY=1 FOR SOUTH; 2 FOR NORTH ! DO IBDY=1,2 ! !*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY. ! IF(S_BDY.AND.IBDY==1) THEN JB=1 ! Which cell in from boundary JJ=1 ! Which cell in the domain DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE) PD_BYS(I,1,JB)=PD_BYS(I,1,JB)+PD_BTYS(I,1,JB)*DT PD(I,JJ)=PD_BYS(I,1,JB) ENDDO !$omp parallel do & !$omp& private(i,k) DO K=KTS,KTE DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE) T_BYS(I,K,JB)=T_BYS(I,K,JB)+T_BTYS(I,K,JB)*DT Q_BYS(I,K,JB)=Q_BYS(I,K,JB)+Q_BTYS(I,K,JB)*DT Q2_BYS(I,K,JB)=Q2_BYS(I,K,JB)+Q2_BTYS(I,K,JB)*DT ! T(I,JJ,K)=T_BYS(I,K,JB) Q(I,JJ,K)=Q_BYS(I,K,JB) Q2(I,JJ,K)=Q2_BYS(I,K,JB) PINT(I,JJ,K)=ETA1(K)*PDTOP & & +ETA2(K)*PD(I,JJ)*RES(I,JJ)+PT ENDDO ENDDO ELSEIF(N_BDY.AND.IBDY==2) THEN JB=1 ! Which cell in from boundary JJ=JJM ! Which cell in the domain ! DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE) PD_BYE(I,1,JB)=PD_BYE(I,1,JB)+PD_BTYE(I,1,JB)*DT PD(I,JJ)=PD_BYE(I,1,JB) ENDDO ! !$omp parallel do & !$omp& private(i,k) DO K=KTS,KTE DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE) T_BYE(I,K,JB)=T_BYE(I,K,JB)+T_BTYE(I,K,JB)*DT Q_BYE(I,K,JB)=Q_BYE(I,K,JB)+Q_BTYE(I,K,JB)*DT Q2_BYE(I,K,JB)=Q2_BYE(I,K,JB)+Q2_BTYE(I,K,JB)*DT ! T(I,JJ,K)=T_BYE(I,K,JB) Q(I,JJ,K)=Q_BYE(I,K,JB) Q2(I,JJ,K)=Q2_BYE(I,K,JB) PINT(I,JJ,K)=ETA1(K)*PDTOP & & +ETA2(K)*PD(I,JJ)*RES(I,JJ)+PT ENDDO ENDDO ! ENDIF ! for N/S boundaries ! #ifdef WRF_CHEM !$omp parallel do & !$omp& private(i,k,nv) DO NV=2,NUMG DO K=KTS,KTE DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE) CALL BDY_CHEM_VALUE (CHEM(I,K,JJ,NV),Z(I,JJ,K),NV,NUMG) ENDDO ENDDO ENDDO !$omp parallel do & !$omp& private(i,k,nv) DO NV=NUMG+1,NUM_CHEM DO K=KTS,KTE KK=MIN(K+1,KTE) DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE) PLYR=(PINT(I,JJ,K)+PINT(I,JJ,KK))*0.5 RRI=R_D*T(I,JJ,K)*(1.+.608*Q(I,JJ,K))/PLYR CONVFAC=PLYR/RGASUNIV/T(I,JJ,K) CALL BDY_CHEM_VALUE_SORGAM (CHEM(I,K,JJ,NV),Z(I,JJ,K),NV, & CONFIG_FLAGS,RRI,CONVFAC,G) ENDDO ENDDO ENDDO #endif ENDIF ENDDO ! !----------------------------------------------------------------------- !*** WEST AND EAST BOUNDARIES !----------------------------------------------------------------------- ! !*** USE IBDY=1 FOR WEST; 2 FOR EAST. ! DO IBDY=1,2 ! !*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY. ! IF(W_BDY.AND.IBDY==1) THEN IB=1 ! Which cell in from boundary II=1 ! Which cell in the domain ! DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2) IF(MOD(J,2)==1)THEN PD_BXS(J,1,IB)=PD_BXS(J,1,IB)+PD_BTXS(J,1,IB)*DT PD(II,J)=PD_BXS(J,1,IB) ENDIF ENDDO ! !$omp parallel do & !$omp& private(j,k) DO K=KTS,KTE DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2) ! IF(MOD(J,2)==1)THEN T_BXS(J,K,IB)=T_BXS(J,K,IB)+T_BTXS(J,K,IB)*DT Q_BXS(J,K,IB)=Q_BXS(J,K,IB)+Q_BTXS(J,K,IB)*DT Q2_BXS(J,K,IB)=Q2_BXS(J,K,IB)+Q2_BTXS(J,K,IB)*DT ! T(II,J,K)=T_BXS(J,K,IB) Q(II,J,K)=Q_BXS(J,K,IB) Q2(II,J,K)=Q2_BXS(J,K,IB) PINT(II,J,K)=ETA1(K)*PDTOP & & +ETA2(K)*PD(II,J)*RES(II,J)+PT ENDIF ! ENDDO ENDDO ELSEIF(E_BDY.AND.IBDY==2) THEN IB=1 ! Which cell in from boundary II=IIM ! Which cell in the domain DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2) IF(MOD(J,2)==1)THEN PD_BXE(J,1,IB)=PD_BXE(J,1,IB)+PD_BTXE(J,1,IB)*DT PD(II,J)=PD_BXE(J,1,IB) ENDIF ENDDO ! !$omp parallel do & !$omp& private(j,k) DO K=KTS,KTE DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2) ! IF(MOD(J,2)==1)THEN T_BXE(J,K,IB)=T_BXE(J,K,IB)+T_BTXE(J,K,IB)*DT Q_BXE(J,K,IB)=Q_BXE(J,K,IB)+Q_BTXE(J,K,IB)*DT Q2_BXE(J,K,IB)=Q2_BXE(J,K,IB)+Q2_BTXE(J,K,IB)*DT ! T(II,J,K)=T_BXE(J,K,IB) Q(II,J,K)=Q_BXE(J,K,IB) Q2(II,J,K)=Q2_BXE(J,K,IB) PINT(II,J,K)=ETA1(K)*PDTOP & & +ETA2(K)*PD(II,J)*RES(II,J)+PT ENDIF ! ENDDO ENDDO ! ! ENDIF ! for W/E boundaries ! ! #ifdef WRF_CHEM !$omp parallel do & !$omp& private(nv,j,k) DO K=KTS,KTE KK=MIN(K+1,KTE) DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2) IF(MOD(J,2)==1)THEN DO NV=2,NUMG CALL BDY_CHEM_VALUE (CHEM(II,K,J,NV),Z(II,J,K),NV,NUMG) ENDDO !$omp parallel do & !$omp& private(nv) DO NV=NUMG+1,NUM_CHEM PLYR=(PINT(II,J,K)+PINT(II,J,KK))*0.5 RRI=R_D*T(II,J,K)*(1.+P608*Q(II,J,K))/PLYR CONVFAC=PLYR/RGASUNIV/T(II,J,K) CALL BDY_CHEM_VALUE_SORGAM (CHEM(II,K,J,NV),Z(II,J,K),NV, & & CONFIG_FLAGS,RRI,CONVFAC,G) ENDDO ENDIF ENDDO ENDDO #endif ENDIF ENDDO ! !----------------------------------------------------------------------- !*** SPACE INTERPOLATION OF PD THEN REMAINING MASS VARIABLES !*** AT INNER BOUNDARY !----------------------------------------------------------------------- ! !*** ONE ROW NORTH OF SOUTHERN BOUNDARY ! IF(S_BDY)THEN DO I=MYIS,MYIE1 CWK=PD(I,2) PD(I,2)=0.25*(PD(I,1)+PD(I+1,1)+PD(I,3)+PD(I+1,3)) ! !*** NESTING TEST ! IF(I<=IDE-1.AND.ABS(CWK-PD(I,2))>=300.)THEN WRITE(message,*)'PSEUDO HYDROSTATIC IMBALANCE AT THE SOUTHERN BOUNDARY AT',I,2,'GRID #',GRIDID CALL wrf_message(trim(message)) WRITE(message,*)' ',CWK/100. CALL wrf_message(trim(message)) WRITE(message,*)PD(I,3)/100.,' ',PD(I+1,3)/100. CALL wrf_message(trim(message)) WRITE(message,*)' ',PD(I,2)/100. CALL wrf_message(trim(message)) WRITE(message,*)PD(I,1)/100.,' ',PD(I+1,1)/100. CALL wrf_message(trim(message)) CALL wrf_message(' ') ENDIF ENDDO ENDIF ! !*** ONE ROW SOUTH OF NORTHERN BOUNDARY ! IF(N_BDY)THEN DO I=MYIS,MYIE1 CWK=PD(I,JJM-1) !! write(message,*)'I, PD is:', PD(I,JJM), PD(I,JJM-2),PD(I+1,JJM-2),PD(I+1,JJM) !! call wrf_message(trim(message)) PD(I,JJM-1)=0.25*(PD(I,JJM-2)+PD(I+1,JJM-2) & & +PD(I,JJM)+PD(I+1,JJM)) ! !*** NESTING TEST ! IF(I<=IDE-1.AND.ABS(CWK-PD(I,JJM-1))>=300.)THEN WRITE(message,*)'PSEUDO HYDROSTATIC IMBALANCE AT THE NORTHERN BOUNDARY AT',I,JJM-1,'GRID #',GRIDID CALL wrf_message(trim(message)) WRITE(message,*)' ',CWK/100. CALL wrf_message(trim(message)) WRITE(message,*)PD(I,JJM)/100.,' ',PD(I+1,JJM)/100. CALL wrf_message(trim(message)) WRITE(message,*)' ',PD(I,JJM-1)/100. CALL wrf_message(trim(message)) WRITE(message,*)PD(I,JJM-2)/100.,' ',PD(I+1,JJM-2)/100. CALL wrf_message(trim(message)) CALL wrf_message(' ') ENDIF ENDDO ENDIF ! !*** ONE ROW EAST OF WESTERN BOUNDARY ! IF(W_BDY)THEN DO J=4,JM-3,2 ! IF(W_BDY.AND.J>=MY_JS_GLB-JBPAD1 & & .AND.J<=MY_JE_GLB+JTPAD1)THEN CWK=PD(1,J) JJ=J PD(1,JJ)=0.25*(PD(1,JJ-1)+PD(2,JJ-1)+PD(1,JJ+1)+PD(2,JJ+1)) ! !*** NESTING TEST ! IF(ABS(CWK-PD(1,JJ))>300.)THEN WRITE(message,*)'PSEUDO HYDROSTATIC IMBALANCE AT THE WESTERN BOUNDARY AT',1,JJ,'GRID #',GRIDID CALL wrf_message(trim(message)) WRITE(message,*)' ',CWK/100. CALL wrf_message(trim(message)) WRITE(message,*)PD(1,JJ+1)/100.,' ',PD(2,JJ+1)/100. CALL wrf_message(trim(message)) WRITE(message,*)' ',PD(1,JJ)/100. CALL wrf_message(trim(message)) WRITE(message,*)PD(1,JJ-1)/100.,' ',PD(2,JJ-1)/100. CALL wrf_message(trim(message)) CALL wrf_message(' ') ENDIF ENDIF ! ENDDO ENDIF ! !*** ONE ROW WEST OF EASTERN BOUNDARY ! IF(E_BDY)THEN DO J=4,JM-3,2 ! IF(E_BDY.AND.J>=MY_JS_GLB-JBPAD1 & & .AND.J<=MY_JE_GLB+JTPAD1)THEN CWK=PD(IIM-1,J) JJ=J PD(IIM-1,JJ)=0.25*(PD(IIM-1,JJ-1)+PD(IIM,JJ-1) & & +PD(IIM-1,JJ+1)+PD(IIM,JJ+1)) ! !*** NESTING TEST ! IF(ABS(CWK-PD(IIM-1,JJ))>300.)THEN WRITE(message,*)'PSEUDO HYDROSTATIC IMBALANCE AT THE EASTERN BOUNDARY AT',IIM-1,JJ,'GRID #',GRIDID CALL wrf_message(trim(message)) WRITE(message,*)' ',CWK/100. CALL wrf_message(trim(message)) WRITE(message,*)PD(IIM-1,JJ+1)/100.,' ',PD(IIM,JJ+1)/100. CALL wrf_message(trim(message)) WRITE(message,*)' ',PD(IIM-1,JJ)/100. CALL wrf_message(trim(message)) WRITE(message,*)PD(IIM-1,JJ-1)/100.,' ',PD(IIM,JJ-1)/100. CALL wrf_message(trim(message)) CALL wrf_message(' ') ENDIF ENDIF ! ENDDO ENDIF ! !----------------------------------------------------------------------- ! !$omp parallel do & !$omp& private(i,j,jj,k) DO 200 K=KTS,KTE ! !----------------------------------------------------------------------- ! !*** ONE ROW NORTH OF SOUTHERN BOUNDARY ! IF(S_BDY)THEN DO I=MYIS,MYIE1 T(I,2,K)=(T(I,1,K)+T(I+1,1,K)+T(I,3,K)+T(I+1,3,K))*0.25 Q(I,2,K)=(Q(I,1,K)+Q(I+1,1,K)+Q(I,3,K)+Q(I+1,3,K))*0.25 Q2(I,2,K)=(Q2(I,1,K)+Q2(I+1,1,K)+Q2(I,3,K)+Q2(I+1,3,K))*0.25 PINT(I,2,K)=ETA1(K)*PDTOP+ETA2(K)*PD(I,2)*RES(I,2)+PT ENDDO ! ENDIF ! !*** ONE ROW SOUTH OF NORTHERN BOUNDARY ! IF(N_BDY)THEN DO I=MYIS,MYIE1 T(I,JJM-1,K)=(T(I,JJM-2,K)+T(I+1,JJM-2,K) & & +T(I,JJM,K)+T(I+1,JJM,K)) & & *0.25 Q(I,JJM-1,K)=(Q(I,JJM-2,K)+Q(I+1,JJM-2,K) & & +Q(I,JJM,K)+Q(I+1,JJM,K)) & & *0.25 Q2(I,JJM-1,K)=(Q2(I,JJM-2,K)+Q2(I+1,JJM-2,K) & & +Q2(I,JJM,K)+Q2(I+1,JJM,K)) & & *0.25 PINT(I,JJM-1,K)=ETA1(K)*PDTOP & & +ETA2(K)*PD(I,JJM-1)*RES(I,JJM-1)+PT ENDDO ! ENDIF ! !*** ONE ROW EAST OF WESTERN BOUNDARY ! IF(W_BDY)THEN DO J=4,JM-3,2 ! IF(W_BDY.AND.J>=MY_JS_GLB-JBPAD1 & & .AND.J<=MY_JE_GLB+JTPAD1)THEN JJ=J T(1,JJ,K)=(T(1,JJ-1,K)+T(2,JJ-1,K) & & +T(1,JJ+1,K)+T(2,JJ+1,K)) & & *0.25 Q(1,JJ,K)=(Q(1,JJ-1,K)+Q(2,JJ-1,K) & & +Q(1,JJ+1,K)+Q(2,JJ+1,K)) & & *0.25 Q2(1,JJ,K)=(Q2(1,JJ-1,K)+Q2(2,JJ-1,K) & & +Q2(1,JJ+1,K)+Q2(2,JJ+1,K)) & & *0.25 PINT(1,JJ,K)=ETA1(K)*PDTOP & & +ETA2(K)*PD(1,JJ)*RES(1,JJ)+PT ! ENDIF ! ENDDO ! ENDIF ! !*** ONE ROW WEST OF EASTERN BOUNDARY ! IF(E_BDY)THEN DO J=4,JM-3,2 ! IF(E_BDY.AND.J>=MY_JS_GLB-JBPAD1 & & .AND.J<=MY_JE_GLB+JTPAD1)THEN JJ=J T(IIM-1,JJ,K)=(T(IIM-1,JJ-1,K)+T(IIM,JJ-1,K) & & +T(IIM-1,JJ+1,K)+T(IIM,JJ+1,K)) & & *0.25 Q(IIM-1,JJ,K)=(Q(IIM-1,JJ-1,K)+Q(IIM,JJ-1,K) & & +Q(IIM-1,JJ+1,K)+Q(IIM,JJ+1,K)) & & *0.25 Q2(IIM-1,JJ,K)=(Q2(IIM-1,JJ-1,K)+Q2(IIM,JJ-1,K) & & +Q2(IIM-1,JJ+1,K)+Q2(IIM,JJ+1,K)) & & *0.25 PINT(IIM-1,JJ,K)=ETA1(K)*PDTOP & & +ETA2(K)*PD(IIM-1,JJ)*RES(IIM-1,JJ)+PT ! ENDIF ! ENDDO ENDIF !----------------------------------------------------------------------- ! 200 CONTINUE ! !----------------------------------------------------------------------- END SUBROUTINE MASS_BOUNDARY SUBROUTINE MP_BULK_BOUNDARY(GRIDID,NTSD,DT0 & 1 & ,LB,ETA1,ETA2,PDTOP,PT & & ,CWM_BXS, CWM_BXE, CWM_BYS, CWM_BYE & & ,CWM_BTXS, CWM_BTXE, CWM_BTYS, CWM_BTYE & & ,Q,CWM & & ,MOIST,N_MOIST,SCALAR,N_SCALAR & & ,SPEC_BDY_WIDTH & & ,IDS,IDE,JDS,JDE,KDS,KDE & & ,IMS,IME,JMS,JME,KMS,KME & & ,ITS,ITE,JTS,JTE,KTS,KTE) !*********************************************************************** !$$$ SUBPROGRAM DOCUMENTATION BLOCK ! . . . ! SUBPROGRAM: BOCOH UPDATE MASS POINTS ON BOUNDARY ! PRGRMMR: JANJIC ORG: W/NP22 DATE: 94-03-08 ! ! ABSTRACT: ! TEMPERATURE, SPECIFIC HUMIDITY, AND SURFACE PRESSURE ! ARE UPDATED ON THE DOMAIN BOUNDARY BY APPLYING THE ! PRE-COMPUTED TENDENCIES AT EACH TIME STEP. ! ! PROGRAM HISTORY LOG: ! 87-??-?? MESINGER - ORIGINATOR ! 95-03-25 BLACK - CONVERSION FROM 1-D TO 2-D in HORIZONTAL ! 96-12-13 BLACK - FINAL MODIFICATION FOR NESTED RUNS ! 98-10-30 BLACK - MODIFIED FOR DISTRIBUTED MEMORY ! 00-01-06 BLACK - MODIFIED FOR JANJIC NONHYDROSTATIC CODE ! 00-09-14 BLACK - MODIFIED FOR DIRECT ACCESS READ ! 01-03-12 BLACK - CONVERTED TO WRF STRUCTURE ! 02-08-29 MICHALAKES - CHANGED II=I-MY_IS_GLB+1 TO II=I ! ADDED CONDITIONAL COMPILATION AROUND MPI ! CONVERT INDEXING FROM LOCAL TO GLOBAL ! 02-09-06 WOLFE - MORE CONVERSION TO GLOBAL INDEXING ! 04-11-18 BLACK - THREADED ! 05-12-19 BLACK - CONVERTED FROM IKJ TO IJK ! 06-06-02 GOPAL - MODIFICATIONS FOR NESTING ! 07-11-14 PYLE - UPDATED FOR NEW WRF BOUNDARY FILE STRUCTURE ! ! USAGE: CALL BOCOH FROM SUBROUTINE SOLVE_NMM ! INPUT ARGUMENT LIST: ! ! NOTE THAT IDE AND JDE INSIDE ROUTINE SHOULD BE PASSED IN ! AS WHAT WRF CONSIDERS THE UNSTAGGERED GRID DIMENSIONS; THAT ! IS, 1 LESS THAN THE IDE AND JDE SET BY WRF FRAMEWORK, JM ! ! OUTPUT ARGUMENT LIST: ! ! OUTPUT FILES: ! NONE ! ! SUBPROGRAMS CALLED: ! ! UNIQUE: NONE ! ! LIBRARY: NONE ! ! ATTRIBUTES: ! LANGUAGE: FORTRAN 90 ! MACHINE : IBM !$$$ !*********************************************************************** !----------------------------------------------------------------------- #ifdef WRF_CHEM USE MODULE_INPUT_CHEM_DATA #endif !----------------------------------------------------------------------- ! IMPLICIT NONE ! !----------------------------------------------------------------------- INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & & ,IMS,IME,JMS,JME,KMS,KME & & ,ITS,ITE,JTS,JTE,KTS,KTE INTEGER,INTENT(IN) :: SPEC_BDY_WIDTH INTEGER,INTENT(IN) :: N_MOIST, N_SCALAR #ifdef WRF_CHEM INTEGER,INTENT(IN) :: NUMG #endif ! INTEGER,INTENT(IN) :: GRIDID INTEGER,INTENT(IN) :: LB,NTSD ! REAL,INTENT(IN) :: DT0,PDTOP,PT ! REAL,DIMENSION(KMS:KME),INTENT(IN) :: ETA1,ETA2 ! REAL,DIMENSION(IMS:IME,KMS:KME,SPEC_BDY_WIDTH) & & ,INTENT(INOUT) :: CWM_BYS, CWM_BYE & & ,CWM_BTYS, CWM_BTYE REAL,DIMENSION(JMS:JME,KMS:KME,SPEC_BDY_WIDTH) & & ,INTENT(INOUT) :: CWM_BXS, CWM_BXE & & ,CWM_BTXS, CWM_BTXE ! REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: CWM,Q ! REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME,NUM_MOIST) & & ,INTENT(INOUT) :: MOIST REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME,NUM_SCALAR) & & ,INTENT(INOUT) :: SCALAR ! !----------------------------------------------------------------------- ! !*** LOCAL VARIABLES ! INTEGER :: I,IB,IBDY,II,IIM,IM,IRTN,ISIZ1,ISIZ2 & & ,J,JB,JJ,JJM,JM,K,KK,N,NN,NREC,NUMGAS,NV,REC INTEGER :: MY_IS_GLB,MY_JS_GLB,MY_IE_GLB,MY_JE_GLB INTEGER :: I_M,ILPAD1,IRPAD1,JBPAD1,JTPAD1 INTEGER :: I1,I2,J1,J2,J1B,J2B ! REAL :: BCHR,CONVFAC,CWK,DT,PLYR,RRI ! LOGICAL :: E_BDY,W_BDY,N_BDY,S_BDY,ACTIVATE ! CHARACTER(LEN=255) :: message !----------------------------------------------------------------------- !*********************************************************************** !----------------------------------------------------------------------- ! #ifdef WRF_CHEM !*** DETERMINE THE INDEX OF THE LAST GAS SPECIES NUMGAS=P_HO2 NUMGAS=NUMG ! NUMGAS = GET_LAST_GAS(CONFIG_FLAGS%CHEM_OPT) ! #endif IM=IDE-IDS+1 JM=JDE-JDS+1 IIM=IM JJM=JM ! ISIZ1=2*LB ISIZ2=2*LB*(KME-KMS) ! W_BDY=(ITS==IDS) E_BDY=(ITE==IDE) S_BDY=(JTS==JDS) N_BDY=(JTE==JDE) ! ILPAD1=1 IF(W_BDY)ILPAD1=0 IRPAD1=1 IF(E_BDY)IRPAD1=0 JBPAD1=1 IF(S_BDY)JBPAD1=0 JTPAD1=1 IF(N_BDY)JTPAD1=0 ! MY_IS_GLB=ITS MY_IE_GLB=ITE MY_JS_GLB=JTS MY_JE_GLB=JTE ! DT=DT0 ! I loop ends for N/S bdy copying: I1=MAX(ITS-1,IDS) I2=MIN(ITE+1,IDE) ! J loop ends for E/W bdy copying: J1=MAX(JTS-1,JDS+3-1) IF(MOD(J1,2)/=1) J1=J1+1 J2=MIN(JTE+1,JDE-2) IF(MOD(J2,2)/=1) J2=J2-1 ! J loop ends for E/W bdy 4-point averaging: J1B=MAX(4,MY_JS_GLB-JBPAD1) IF(MOD(J1B,2)/=0) J1B=J1B+1 J2B=MIN(JM-3,MY_JE_GLB+JTPAD1) IF(MOD(J2B,2)/=0) J2B=J2B-1 ! !----------------------------------------------------------------------- !*** SOUTH AND NORTH BOUNDARIES !----------------------------------------------------------------------- ! !*** USE IBDY=1 FOR SOUTH; 2 FOR NORTH ! ns_do: DO IBDY=1,2 ! !*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY. ! activate=.false. if_ns: IF(S_BDY.AND.IBDY==1) THEN JB=1 ! Which cell in from boundary JJ=1 ! Which cell in the domain activate=.true. !$omp parallel do & !$omp& private(i,k) DO K=KTS,KTE DO I=I1,I2 CWM_BYS(I,K,JB)=CWM_BYS(I,K,JB)+CWM_BTYS(I,K,JB)*DT CWM(I,JJ,K)=CWM_BYS(I,K,JB) ENDDO ENDDO ELSEIF(N_BDY.AND.IBDY==2) THEN JB=1 ! Which cell in from boundary JJ=JJM ! Which cell in the domain activate=.true. !$omp parallel do & !$omp& private(i,k) DO K=KTS,KTE DO I=I1,I2 CWM_BYE(I,K,JB)=CWM_BYE(I,K,JB)+CWM_BTYE(I,K,JB)*DT CWM(I,JJ,K)=CWM_BYE(I,K,JB) ENDDO ENDDO ENDIF if_ns ! for N/S boundaries ns_moist: IF(activate) then DO I_M=1,N_MOIST IF(I_M==P_QV)THEN !$omp parallel do & !$omp& private(i,k) DO K=KTS,KTE DO I=I1,I2 MOIST(I,JJ,K,I_M)=Q(I,JJ,K)/(1.-Q(I,JJ,K)) ENDDO ENDDO ELSE !$omp parallel do & !$omp& private(i,k) DO K=KTS,KTE DO I=I1,I2 MOIST(I,JJ,K,I_M)=0. ENDDO ENDDO ENDIF ENDDO DO I_M=2,N_SCALAR !$omp parallel do & !$omp& private(i,k) DO K=KTS,KTE DO I=I1,I2 SCALAR(I,JJ,K,I_M)=0. ENDDO ENDDO ENDDO ENDIF ns_moist ENDDO ns_do ! !----------------------------------------------------------------------- !*** WEST AND EAST BOUNDARIES !----------------------------------------------------------------------- ! !*** USE IBDY=1 FOR WEST; 2 FOR EAST. ! ew_do: DO IBDY=1,2 ! !*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY. ! activate=.false. if_ew: IF(W_BDY.AND.IBDY==1) THEN IB=1 ! Which cell in from boundary II=1 ! Which cell in the domain activate=.true. !$omp parallel do & !$omp& private(j,k) DO K=KTS,KTE DO J=J1,J2,2 ! IF(MOD(J,2)==1)THEN CWM_BXS(J,K,IB)=CWM_BXS(J,K,IB)+CWM_BTXS(J,K,IB)*DT CWM(II,J,K)=CWM_BXS(J,K,IB) ENDIF ! ENDDO ENDDO ELSEIF(E_BDY.AND.IBDY==2) THEN IB=1 ! Which cell in from boundary II=IIM ! Which cell in the domain activate=.true. !$omp parallel do & !$omp& private(j,k) DO K=KTS,KTE DO J=J1,J2,2 ! IF(MOD(J,2)==1)THEN CWM_BXE(J,K,IB)=CWM_BXE(J,K,IB)+CWM_BTXE(J,K,IB)*DT CWM(II,J,K)=CWM_BXE(J,K,IB) ENDIF ! ENDDO ENDDO ! ENDIF if_ew ! for W/E boundaries ew_moist: if(activate) then DO I_M=1,N_MOIST IF(I_M==P_QV)THEN !$omp parallel do & !$omp& private(j,k) DO K=KTS,KTE DO J=J1,J2,2 IF(MOD(J,2)==1)THEN MOIST(II,J,K,I_M)=Q(II,J,K)/(1.-Q(II,J,K)) ENDIF ENDDO ENDDO ! ELSE !$omp parallel do & !$omp& private(j,k) DO K=KTS,KTE DO J=J1,J2,2 IF(MOD(J,2)==1)THEN MOIST(II,J,K,I_M)=0. ENDIF ENDDO ENDDO ! ENDIF ENDDO ! DO I_M=2,N_SCALAR !$omp parallel do & !$omp& private(j,k) DO K=KTS,KTE DO J=J1,J2,2 IF(MOD(J,2)==1)THEN SCALAR(II,J,K,I_M)=0. ENDIF ENDDO ENDDO ENDDO ENDIF ew_moist ENDDO ew_do ! !----------------------------------------------------------------------- !*** SPACE INTERPOLATION OF PD THEN REMAINING MASS VARIABLES !*** AT INNER BOUNDARY !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- ! !$omp parallel do & !$omp& private(i,j,jj,k) DO 200 K=KTS,KTE ! !----------------------------------------------------------------------- ! !*** ONE ROW NORTH OF SOUTHERN BOUNDARY ! IF(S_BDY)THEN DO I=MYIS,MYIE1 CWM(I,2,K)=(CWM(I,1,K)+CWM(I+1,1,K)+CWM(I,3,K)+CWM(I+1,3,K)) & & *0.25 ENDDO ! DO I_M=1,N_MOIST IF(I_M==P_QV)THEN DO I=MYIS,MYIE1 MOIST(I,2,K,I_M)=Q(I,2,K)/(1.-Q(I,2,K)) ENDDO ELSE DO I=MYIS,MYIE1 MOIST(I,2,K,I_M)=(MOIST(I,1,K,I_M) & & +MOIST(I+1,1,K,I_M) & & +MOIST(I,3,K,I_M) & & +MOIST(I+1,3,K,I_M))*0.25 ENDDO ENDIF ENDDO ! DO I_M=2,N_SCALAR DO I=MYIS,MYIE1 SCALAR(I,2,K,I_M)=(SCALAR(I,1,K,I_M) & & +SCALAR(I+1,1,K,I_M) & & +SCALAR(I,3,K,I_M) & & +SCALAR(I+1,3,K,I_M))*0.25 ENDDO ENDDO ! ENDIF ! !*** ONE ROW SOUTH OF NORTHERN BOUNDARY ! IF(N_BDY)THEN DO I=MYIS,MYIE1 CWM(I,JJM-1,K)=(CWM(I,JJM-2,K)+CWM(I+1,JJM-2,K) & & +CWM(I,JJM,K)+CWM(I+1,JJM,K)) & & *0.25 ENDDO ! DO I_M=1,N_MOIST IF(I_M==P_QV)THEN DO I=MYIS,MYIE1 MOIST(I,JJM-1,K,I_M)=Q(I,JJM-1,K)/(1.-Q(I,JJM-1,K)) ENDDO ELSE DO I=MYIS,MYIE1 MOIST(I,JJM-1,K,I_M)=(MOIST(I,JJM-2,K,I_M) & & +MOIST(I+1,JJM-2,K,I_M) & & +MOIST(I,JJM,K,I_M) & & +MOIST(I+1,JJM,K,I_M))*0.25 ENDDO ENDIF ENDDO ! DO I_M=2,N_SCALAR DO I=MYIS,MYIE1 SCALAR(I,JJM-1,K,I_M)=(SCALAR(I,JJM-2,K,I_M) & & +SCALAR(I+1,JJM-2,K,I_M) & & +SCALAR(I,JJM,K,I_M) & & +SCALAR(I+1,JJM,K,I_M))*0.25 ENDDO ENDDO ! ENDIF ! !*** ONE ROW EAST OF WESTERN BOUNDARY ! IF(W_BDY)THEN DO J=J1B,J2B,2 JJ=J CWM(1,JJ,K)=(CWM(1,JJ-1,K)+CWM(2,JJ-1,K) & & +CWM(1,JJ+1,K)+CWM(2,JJ+1,K)) & & *0.25 ! DO I_M=1,N_MOIST IF(I_M==P_QV)THEN MOIST(1,JJ,K,I_M)=Q(1,JJ,K)/(1.-Q(1,JJ,K)) ELSE MOIST(1,JJ,K,I_M)=(MOIST(1,JJ-1,K,I_M) & & +MOIST(2,JJ-1,K,I_M) & & +MOIST(1,JJ+1,K,I_M) & & +MOIST(2,JJ+1,K,I_M))*0.25 ENDIF ENDDO ! DO I_M=2,N_SCALAR SCALAR(1,JJ,K,I_M)=(SCALAR(1,JJ-1,K,I_M) & & +SCALAR(2,JJ-1,K,I_M) & & +SCALAR(1,JJ+1,K,I_M) & & +SCALAR(2,JJ+1,K,I_M))*0.25 ENDDO ! ENDDO ! ENDIF ! !*** ONE ROW WEST OF EASTERN BOUNDARY ! IF(E_BDY)THEN DO J=J1B,J2B,2 JJ=J CWM(IIM-1,JJ,K)=(CWM(IIM-1,JJ-1,K)+CWM(IIM,JJ-1,K) & & +CWM(IIM-1,JJ+1,K)+CWM(IIM,JJ+1,K)) & & *0.25 ! DO I_M=1,N_MOIST IF(I_M==P_QV)THEN MOIST(IIM-1,JJ,K,I_M)=Q(IIM-1,JJ,K)/(1.-Q(IIM-1,JJ,K)) ELSE MOIST(IIM-1,JJ,K,I_M)=(MOIST(IIM-1,JJ-1,K,I_M) & & +MOIST(IIM,JJ-1,K,I_M) & & +MOIST(IIM-1,JJ+1,K,I_M) & & +MOIST(IIM,JJ+1,K,I_M))*0.25 ENDIF ENDDO ! DO I_M=2,N_SCALAR SCALAR(IIM-1,JJ,K,I_M)=(SCALAR(IIM-1,JJ-1,K,I_M) & & +SCALAR(IIM,JJ-1,K,I_M) & & +SCALAR(IIM-1,JJ+1,K,I_M) & & +SCALAR(IIM,JJ+1,K,I_M))*0.25 ENDDO ! ENDDO ENDIF !----------------------------------------------------------------------- ! 200 CONTINUE ! !----------------------------------------------------------------------- END SUBROUTINE MP_BULK_BOUNDARY !----------------------------------------------------------------------- !*********************************************************************** !----------------------------------------------------------------------- SUBROUTINE BOCOV(GRIDID,NTSD,DT,LB & 1 & ,U_BXS,U_BXE,U_BYS,U_BYE & & ,V_BXS,V_BXE,V_BYS,V_BYE & & ,U_BTXS,U_BTXE,U_BTYS,U_BTYE & & ,V_BTXS,V_BTXE,V_BTYS,V_BTYE & & ,U,V & & ,SPEC_BDY_WIDTH & & ,IHE,IHW,IVE,IVW & & ,IDS,IDE,JDS,JDE,KDS,KDE & & ,IMS,IME,JMS,JME,KMS,KME & & ,ITS,ITE,JTS,JTE,KTS,KTE) !*********************************************************************** !$$$ SUBPROGRAM DOCUMENTATION BLOCK ! . . . ! SUBPROGRAM: BOCOV UPDATE WIND POINTS ON BOUNDARY ! PRGRMMR: JANJIC ORG: W/NP22 DATE: 94-03-08 ! ! ABSTRACT: ! U AND V COMPONENTS OF THE WIND ARE UPDATED ON THE ! DOMAIN BOUNDARY BY APPLYING THE PRE-COMPUTED ! TENDENCIES AT EACH TIME STEP. AN EXTRAPOLATION FROM ! INSIDE THE DOMAIN IS USED FOR THE COMPONENT TANGENTIAL ! TO THE BOUNDARY IF THE NORMAL COMPONENT IS OUTWARD. ! ! PROGRAM HISTORY LOG: ! 87-??-?? MESINGER - ORIGINATOR ! 95-03-25 BLACK - CONVERSION FROM 1-D TO 2-D IN HORIZONTAL ! 98-10-30 BLACK - MODIFIED FOR DISTRIBUTED MEMORY ! 01-03-13 BLACK - CONVERTED TO WRF STRUCTURE ! 02-09-06 WOLFE - MORE CONVERSION TO GLOBAL INDEXING ! 04-11-23 BLACK - THREADED ! 05-12-19 BLACK - CONVERTED FROM IKJ TO IJK ! 06-06-02 GOPAL - MODIFICATIONS FOR NESTING ! ! USAGE: CALL BOCOH FROM SUBROUTINE SOLVE_NMM ! INPUT ARGUMENT LIST: ! ! NOTE THAT IDE AND JDE INSIDE ROUTINE SHOULD BE PASSED IN ! AS WHAT WRF CONSIDERS THE UNSTAGGERED GRID DIMENSIONS; THAT ! IS, 1 LESS THAN THE IDE AND JDE SET BY WRF FRAMEWORK, JM ! ! OUTPUT ARGUMENT LIST: ! ! OUTPUT FILES: ! NONE ! ! SUBPROGRAMS CALLED: ! ! UNIQUE: NONE ! ! LIBRARY: NONE ! ! ATTRIBUTES: ! LANGUAGE: FORTRAN 90 ! MACHINE : IBM !$$$ !*********************************************************************** !----------------------------------------------------------------------- ! IMPLICIT NONE ! !----------------------------------------------------------------------- INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & & ,IMS,IME,JMS,JME,KMS,KME & & ,ITS,ITE,JTS,JTE,KTS,KTE INTEGER,INTENT(IN) :: SPEC_BDY_WIDTH ! INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW ! INTEGER,INTENT(IN) :: GRIDID INTEGER,INTENT(IN) :: LB,NTSD ! REAL,INTENT(IN) :: DT ! REAL,DIMENSION(IMS:IME,KMS:KME,SPEC_BDY_WIDTH),INTENT(INOUT) :: & & U_BYS,U_BYE,V_BYS,V_BYE & & ,U_BTYS,U_BTYE & & ,V_BTYS,V_BTYE REAL,DIMENSION(JMS:JME,KMS:KME,SPEC_BDY_WIDTH),INTENT(INOUT) :: & & U_BXS,U_BXE,V_BXS,V_BXE & & ,U_BTXS,U_BTXE & & ,V_BTXS,V_BTXE ! REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: U,V !----------------------------------------------------------------------- ! !*** LOCAL VARIABLES ! INTEGER :: I,II,IIM,IM,J,JJ,JJM,JM,K,N INTEGER :: MY_IS_GLB, MY_JS_GLB,MY_IE_GLB,MY_JE_GLB INTEGER :: IBDY,JB,IB INTEGER :: ILPAD1,IRPAD1,JBPAD1,JTPAD1 LOGICAL :: E_BDY,W_BDY,N_BDY,S_BDY !----------------------------------------------------------------------- !*********************************************************************** !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- !*** TIME INTERPOLATION OF U AND V AT THE OUTER BOUNDARY !----------------------------------------------------------------------- ! IM=IDE-IDS+1 JM=JDE-JDS+1 IIM=IM JJM=JM ! W_BDY=(ITS==IDS) E_BDY=(ITE==IDE) S_BDY=(JTS==JDS) N_BDY=(JTE==JDE) ! ILPAD1=1 IF(ITS==IDS)ILPAD1=0 IRPAD1=1 IF(ITE==IDE)ILPAD1=0 JBPAD1=1 IF(JTS==JDS)JBPAD1=0 JTPAD1=1 IF(JTE==JDE)JTPAD1=0 ! MY_IS_GLB=ITS MY_IE_GLB=ITE MY_JS_GLB=JTS MY_JE_GLB=JTE ! !----------------------------------------------------------------------- !*** SOUTH AND NORTH BOUNDARIES !*** USE IBDY=1 FOR SOUTH; 2 FOR NORTH. !----------------------------------------------------------------------- ! DO IBDY=1,2 ! !*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY. ! IF(S_BDY.AND.IBDY==1) THEN ! JB=1 ! Which cell in from Boundary JJ=1 ! Which cell in the Domain ! !$omp parallel do & !$omp& private(i,k) DO K=KTS,KTE DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE) U_BYS(I,K,JB)=U_BYS(I,K,JB)+U_BTYS(I,K,JB)*DT V_BYS(I,K,JB)=V_BYS(I,K,JB)+V_BTYS(I,K,JB)*DT U(I,JJ,K)=U_BYS(I,K,JB) V(I,JJ,K)=V_BYS(I,K,JB) ENDDO ENDDO ! ELSEIF(N_BDY.AND.IBDY==2) THEN JB=1 ! Which cell in from Boundary JJ=JJM ! Which cell in the Domain !$omp parallel do & !$omp& private(i,k) DO K=KTS,KTE DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE) U_BYE(I,K,JB)=U_BYE(I,K,JB)+U_BTYE(I,K,JB)*DT V_BYE(I,K,JB)=V_BYE(I,K,JB)+V_BTYE(I,K,JB)*DT U(I,JJ,K)=U_BYE(I,K,JB) V(I,JJ,K)=V_BYE(I,K,JB) ENDDO ENDDO ENDIF ENDDO ! !----------------------------------------------------------------------- !*** WEST AND EAST BOUNDARIES !*** USE IBDY=1 FOR WEST; 2 FOR EAST. !----------------------------------------------------------------------- ! DO IBDY=1,2 ! !*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY. ! IF(W_BDY.AND.IBDY==1) THEN IB=1 ! Which cell in from boundary II=1 ! Which cell in the domain ! !$omp parallel do & !$omp& private(j,k) DO K=KTS,KTE DO J=MAX(JTS-1,JDS+2-1),MIN(JTE+1,JDE-1) IF(MOD(J,2)==0)THEN U_BXS(J,K,IB)=U_BXS(J,K,IB)+U_BTXS(J,K,IB)*DT V_BXS(J,K,IB)=V_BXS(J,K,IB)+V_BTXS(J,K,IB)*DT U(II,J,K)=U_BXS(J,K,IB) V(II,J,K)=V_BXS(J,K,IB) ENDIF ENDDO ENDDO ELSEIF (E_BDY.AND.IBDY==2) THEN IB=1 ! Which cell in from boundary II=IIM ! Which cell in the domain !$omp parallel do & !$omp& private(j,k) DO K=KTS,KTE DO J=MAX(JTS-1,JDS+2-1),MIN(JTE+1,JDE-1) IF(MOD(J,2)==0)THEN U_BXE(J,K,IB)=U_BXE(J,K,IB)+U_BTXE(J,K,IB)*DT V_BXE(J,K,IB)=V_BXE(J,K,IB)+V_BTXE(J,K,IB)*DT U(II,J,K)=U_BXE(J,K,IB) V(II,J,K)=V_BXE(J,K,IB) ENDIF ENDDO ENDDO ! ENDIF ENDDO ! !----------------------------------------------------------------------- !*** EXTRAPOLATION OF TANGENTIAL VELOCITY AT OUTFLOW POINTS !*** BASED ON SOME DISCUSSIONS WITH ZAVISA, AND MY EXPERIMENTS !*** ON GRAVITY PULSE FOR NESTED DOMAIN. !----------------------------------------------------------------------- ! IF(GRIDID/=1)GO TO 201 ! !----------------------------------------------------------------------- ! !$omp parallel do & !$omp& private(i,j,jj,k) DO 200 K=KTS,KTE ! !----------------------------------------------------------------------- ! !*** SOUTHERN BOUNDARY ! IF(S_BDY)THEN DO I=MYIS1_P1,MYIE2_P1 IF(V(I,1,K)<0.)U(I,1,K)=2.*U(I,3,K)-U(I,5,K) ENDDO ENDIF ! !*** NORTHERN BOUNDARY ! IF(N_BDY)THEN DO I=MYIS1_P1,MYIE2_P1 IF(V(I,JJM,K)>0.) & & U(I,JJM,K)=2.*U(I,JJM-2,K)-U(I,JJM-4,K) ENDDO ENDIF ! !*** WESTERN BOUNDARY ! DO J=4,JM-3,2 IF(W_BDY)THEN ! IF(W_BDY.AND.J>=MY_JS_GLB-JBPAD1 & & .AND.J<=MY_JE_GLB+JTPAD1)THEN JJ=J IF(U(1,JJ,K)<0.) & & V(1,JJ,K)=2.*V(2,JJ,K)-V(3,JJ,K) ENDIF ! ENDIF ENDDO ! !*** EASTERN BOUNDARY ! DO J=4,JM-3,2 IF(E_BDY)THEN ! IF(E_BDY.AND.J>=MY_JS_GLB-JBPAD1 & & .AND.J<=MY_JE_GLB+JTPAD1)THEN JJ=J IF(U(IIM,JJ,K)>0.) & & V(IIM,JJ,K)=2.*V(IIM-1,JJ,K)-V(IIM-2,JJ,K) ENDIF ! ENDIF ENDDO !----------------------------------------------------------------------- ! 200 CONTINUE 201 CONTINUE ! !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- !*** SPACE INTERPOLATION OF U AND V AT THE INNER BOUNDARY !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- ! !$omp parallel do & !$omp& private(i,j,jj,k) DO 300 K=KTS,KTE ! !----------------------------------------------------------------------- ! !*** SOUTHWEST CORNER ! IF(S_BDY.AND.W_BDY)THEN U(2,2,K)=D06666*(4.*(U(1,1,K)+U(2,1,K)+U(2,3,K)) & & + U(1,2,K)+U(1,4,K)+U(2,4,K)) V(2,2,K)=D06666*(4.*(V(1,1,K)+V(2,1,K)+V(2,3,K)) & & +V(1,2,K)+V(1,4,K)+V(2,4,K)) ENDIF ! !*** SOUTHEAST CORNER ! IF(S_BDY.AND.E_BDY)THEN U(IIM-1,2,K)=D06666*(4.*(U(IIM-2,1,K)+U(IIM-1,1,K) & & +U(IIM-2,3,K)) & & +U(IIM,2,K)+U(IIM,4,K)+U(IIM-1,4,K)) V(IIM-1,2,K)=D06666*(4.*(V(IIM-2,1,K)+V(IIM-1,1,K) & & +V(IIM-2,3,K)) & & +V(IIM,2,K)+V(IIM,4,K)+V(IIM-1,4,K)) ENDIF ! !*** NORTHWEST CORNER ! IF(N_BDY.AND.W_BDY)THEN U(2,JJM-1,K)=D06666*(4.*(U(1,JJM,K)+U(2,JJM,K)+U(2,JJM-2,K)) & & +U(1,JJM-1,K)+U(1,JJM-3,K) & & +U(2,JJM-3,K)) V(2,JJM-1,K)=D06666*(4.*(V(1,JJM,K)+V(2,JJM,K)+V(2,JJM-2,K)) & & +V(1,JJM-1,K)+V(1,JJM-3,K) & & +V(2,JJM-3,K)) ENDIF ! !*** NORTHEAST CORNER ! IF(N_BDY.AND.E_BDY)THEN U(IIM-1,JJM-1,K)= & & D06666*(4.*(U(IIM-2,JJM,K)+U(IIM-1,JJM,K)+U(IIM-2,JJM-2,K)) & & +U(IIM,JJM-1,K)+U(IIM,JJM-3,K)+U(IIM-1,JJM-3,K)) V(IIM-1,JJM-1,K)= & & D06666*(4.*(V(IIM-2,JJM,K)+V(IIM-1,JJM,K)+V(IIM-2,JJM-2,K)) & & +V(IIM,JJM-1,K)+V(IIM,JJM-3,K)+V(IIM-1,JJM-3,K)) ENDIF ! !----------------------------------------------------------------------- !*** SPACE INTERPOLATION OF U AND V AT THE INNER BOUNDARY !----------------------------------------------------------------------- ! !*** ONE ROW NORTH OF SOUTHERN BOUNDARY ! IF(S_BDY)THEN DO I=MYIS2,MYIE2 U(I,2,K)=(U(I-1,1,K)+U(I,1,K)+U(I-1,3,K)+U(I,3,K))*0.25 V(I,2,K)=(V(I-1,1,K)+V(I,1,K)+V(I-1,3,K)+V(I,3,K))*0.25 ENDDO ENDIF ! !*** ONE ROW SOUTH OF NORTHERN BOUNDARY ! IF(N_BDY)THEN DO I=MYIS2,MYIE2 U(I,JJM-1,K)=(U(I-1,JJM-2,K)+U(I,JJM-2,K) & & +U(I-1,JJM,K)+U(I,JJM,K))*0.25 V(I,JJM-1,K)=(V(I-1,JJM-2,K)+V(I,JJM-2,K) & & +V(I-1,JJM,K)+V(I,JJM,K))*0.25 ENDDO ENDIF ! !*** ONE ROW EAST OF WESTERN BOUNDARY ! DO J=3,JM-2,2 IF(W_BDY)THEN IF(W_BDY.AND.J>=MY_JS_GLB-JBPAD1 & & .AND.J<=MY_JE_GLB+JTPAD1)THEN JJ=J U(1,JJ,K)=(U(1,JJ-1,K)+U(2,JJ-1,K) & & +U(1,JJ+1,K)+U(2,JJ+1,K))*0.25 V(1,JJ,K)=(V(1,JJ-1,K)+V(2,JJ-1,K) & & +V(1,JJ+1,K)+V(2,JJ+1,K))*0.25 ENDIF ENDIF ENDDO ! !*** ONE ROW WEST OF EASTERN BOUNDARY ! IF(E_BDY)THEN DO J=3,JM-2,2 IF(E_BDY.AND.J>=MY_JS_GLB-JBPAD1 & & .AND.J<=MY_JE_GLB+JTPAD1)THEN JJ=J U(IIM-1,JJ,K)=0.25*(U(IIM-1,JJ-1,K)+U(IIM,JJ-1,K) & & +U(IIM-1,JJ+1,K)+U(IIM,JJ+1,K)) V(IIM-1,JJ,K)=0.25*(V(IIM-1,JJ-1,K)+V(IIM,JJ-1,K) & & +V(IIM-1,JJ+1,K)+V(IIM,JJ+1,K)) ENDIF ENDDO ENDIF !----------------------------------------------------------------------- ! 300 CONTINUE ! !----------------------------------------------------------------------- ! END SUBROUTINE BOCOV ! !----------------------------------------------------------------------- ! ! ------------------------------------------------------------ ! Non-bulk boundary/tendancy function (mass points) ! ------------------------------------------------------------ SUBROUTINE MP_SPECIES_BDY(gridid, spec_bdy_width, dt, & 1 CWM,Q, & MOIST,N_MOIST, & MOIST_bxs,MOIST_bxe,MOIST_bys,MOIST_bye, & MOIST_btxs,MOIST_btxe,MOIST_btys,MOIST_btye, & SCALAR,N_SCALAR, & SCALAR_bxs,SCALAR_bxe,SCALAR_bys,SCALAR_bye, & SCALAR_btxs,SCALAR_btxe,SCALAR_btys,SCALAR_btye,& ids,ide,jds,jde,kds,kde, & ims,ime,jms,jme,kms,kme, & its,ite,jts,jte,kts,kte) implicit none integer, intent(in) :: N_MOIST,N_SCALAR, & ids,ide,jds,jde,kds,kde, & ims,ime,jms,jme,kms,kme, & its,ite,jts,jte,kts,kte integer, intent(in) :: spec_bdy_width,gridid real, intent(in) :: dt real, intent(inout),dimension(ims:ime,jms:jme,kms:kme) :: & CWM,Q real,dimension(ims:ime,kms:kme,spec_bdy_width,n_moist), & intent(inout) :: MOIST_bys,MOIST_bye,MOIST_btys,MOIST_btye real,dimension(jms:jme,kms:kme,spec_bdy_width,n_moist), & intent(inout) :: MOIST_bxs,MOIST_bxe,MOIST_btxs,MOIST_btxe real,dimension(ims:ime,kms:kme,spec_bdy_width,n_scalar), & intent(inout) :: SCALAR_bys,SCALAR_bye,SCALAR_btys,SCALAR_btye real,dimension(jms:jme,kms:kme,spec_bdy_width,n_scalar), & intent(inout) :: SCALAR_bxs,SCALAR_bxe,SCALAR_btxs,SCALAR_btxe real,intent(inout) :: MOIST(ims:ime,jms:jme,kms:kme,N_MOIST) real,intent(inout) :: SCALAR(ims:ime,jms:jme,kms:kme,N_SCALAR) ! ------------------------------------------------------------ ! LOCAL VARIABLES ! ------------------------------------------------------------ INTEGER :: I,IB,IBDY,II,IIM,IM,IRTN,ISIZ1,ISIZ2 & & ,J,JB,JJ,JJM,JM,K,KK,N,NN,NREC,NUMGAS,NV,REC INTEGER :: MY_IS_GLB,MY_JS_GLB,MY_IE_GLB,MY_JE_GLB INTEGER :: I_M,ILPAD1,IRPAD1,JBPAD1,JTPAD1 REAL :: BCHR,CONVFAC,CWK,PLYR,RRI LOGICAL :: E_BDY,W_BDY,N_BDY,S_BDY INTEGER :: i1,i2,j1,j2,j1b,j2b ! ------------------------------------------------------------ IM=IDE-IDS+1 JM=JDE-JDS+1 IIM=IM JJM=JM ! W_BDY=(ITS==IDS) E_BDY=(ITE==IDE) S_BDY=(JTS==JDS) N_BDY=(JTE==JDE) ! ILPAD1=1 IF(W_BDY)ILPAD1=0 IRPAD1=1 IF(E_BDY)IRPAD1=0 JBPAD1=1 IF(S_BDY)JBPAD1=0 JTPAD1=1 IF(N_BDY)JTPAD1=0 ! MY_IS_GLB=ITS MY_IE_GLB=ITE MY_JS_GLB=JTS MY_JE_GLB=JTE ! I loop ends for N/S bdy copying: i1=MAX(ITS-1,IDS) i2=MIN(ITE+1,IDE) ! J loop ends for E/W bdy copying: j1=MAX(JTS-1,JDS+3-1) if(mod(j1,2)/=1) j1=j1+1 j2=MIN(JTE+1,JDE-2) if(mod(j2,2)/=1) j2=j2-1 ! J loop ends for E/W bdy 4-point averaging: J1B=MAX(4,MY_JS_GLB-JBPAD1) IF(MOD(J1B,2)/=0) J1B=J1B+1 J2B=MIN(JM-3,MY_JE_GLB+JTPAD1) IF(MOD(J2B,2)/=0) J2B=J2B-1 ! !----------------------------------------------------------------------- !*** SOUTH AND NORTH BOUNDARIES !----------------------------------------------------------------------- ! !*** USE IBDY=1 FOR SOUTH; 2 FOR NORTH ! n_s_bdy: DO IBDY=1,2 ! !*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY. ! if_n_s_bdy: IF(S_BDY.AND.IBDY==1) THEN JB=1 ! Which cell in from boundary JJ=1 ! Which cell in the domain !$omp parallel do & !$omp& private(i,k) DO K=KTS,KTE DO I=i1,i2 cwm(i,jj,k)=0. END DO END DO !$omp parallel do & !$omp& private(i,k,im) sbdy_type: DO IM=1,N_MOIST if(IM==P_QV) cycle sbdy_type DO K=KTS,KTE DO I=i1,i2 MOIST_BYS(I,K,JB,IM)=MOIST_BYS(I,K,JB,IM)+MOIST_BTYS(I,K,JB,IM)*DT MOIST(I,JJ,K,IM)=MOIST_BYS(I,K,JB,IM) CWM(I,JJ,K)=CWM(I,JJ,K) + MOIST(I,JJ,K,IM) ENDDO ENDDO ENDDO sbdy_type !$omp parallel do & !$omp& private(i,k,im) sbdy_Stype: DO IM=2,N_SCALAR DO K=KTS,KTE DO I=i1,i2 SCALAR_BYS(I,K,JB,IM)=SCALAR_BYS(I,K,JB,IM)+SCALAR_BTYS(I,K,JB,IM)*DT SCALAR(I,JJ,K,IM)=SCALAR_BYS(I,K,JB,IM) ENDDO ENDDO ENDDO sbdy_Stype ELSEIF(N_BDY.AND.IBDY==2) THEN JB=1 ! Which cell in from boundary JJ=JJM ! Which cell in the domain !$omp parallel do & !$omp& private(i,k) DO K=KTS,KTE DO I=i1,i2 CWM(i,jj,k)=0. END DO END DO !$omp parallel do & !$omp& private(i,k) nbdy_type: DO IM=1,N_MOIST if(IM==P_QV) cycle nbdy_type DO K=KTS,KTE DO I=i1,i2 MOIST_BYE(I,K,JB,IM)=MOIST_BYE(I,K,JB,IM)+MOIST_BTYE(I,K,JB,IM)*DT MOIST(I,JJ,K,IM)=MOIST_BYE(I,K,JB,IM) CWM(I,JJ,K)=CWM(I,JJ,K) + MOIST(I,JJ,K,IM) ENDDO ENDDO ENDDO nbdy_type !$omp parallel do & !$omp& private(i,k) nbdy_Stype: DO IM=1,N_SCALAR DO K=KTS,KTE DO I=i1,i2 SCALAR_BYE(I,K,JB,IM)=SCALAR_BYE(I,K,JB,IM)+SCALAR_BTYE(I,K,JB,IM)*DT SCALAR(I,JJ,K,IM)=SCALAR_BYE(I,K,JB,IM) ENDDO ENDDO ENDDO nbdy_Stype ENDIF if_n_s_bdy ENDDO n_s_bdy ! !----------------------------------------------------------------------- !*** WEST AND EAST BOUNDARIES !----------------------------------------------------------------------- ! !*** USE IBDY=1 FOR WEST; 2 FOR EAST. ! east_west_bt: DO IBDY=1,2 ! !*** MAKE SURE THE PROCESSOR HAS THIS BOUNDARY. ! if_e_w_bt: IF(W_BDY.AND.IBDY==1) THEN IB=1 ! Which cell in from boundary II=1 ! Which cell in the domain !$omp parallel do & !$omp& private(j,k) DO K=KTS,KTE DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2) cwm(ii,j,k)=0. ENDDO ENDDO !$omp parallel do & !$omp& private(j,k,im) w_bdy_type: DO IM=1,N_MOIST if(IM==P_QV) cycle w_bdy_type DO K=KTS,KTE DO J=j1,j2,2 MOIST_BXS(J,K,IB,IM)=MOIST_BXS(J,K,IB,IM)+MOIST_BTXS(J,K,IB,IM)*DT MOIST(II,J,K,IM)=MOIST_BXS(J,K,IB,IM) CWM(II,J,K)=CWM(II,J,K)+MOIST(II,J,K,IM) ENDDO ENDDO ENDDO w_bdy_type !$omp parallel do & !$omp& private(j,k,im) w_bdy_Stype: DO IM=2,N_SCALAR DO K=KTS,KTE DO J=j1,j2,2 SCALAR_BXS(J,K,IB,IM)=SCALAR_BXS(J,K,IB,IM)+SCALAR_BTXS(J,K,IB,IM)*DT SCALAR(II,J,K,IM)=SCALAR_BXS(J,K,IB,IM) ENDDO ENDDO ENDDO w_bdy_Stype ELSEIF(E_BDY.AND.IBDY==2) THEN IB=1 ! Which cell in from boundary II=IIM ! Which cell in the domain !$omp parallel do & !$omp& private(j,k) DO K=KTS,KTE DO J=j1,j2 CWM(II,J,K)=0. ENDDO ENDDO !$omp parallel do & !$omp& private(j,k,im) e_bdy_type: DO IM=1,N_MOIST if(IM==P_QV) cycle e_bdy_type DO K=KTS,KTE DO J=j1,j2 MOIST_BXE(J,K,IB,IM)=MOIST_BXE(J,K,IB,IM)+MOIST_BTXE(J,K,IB,IM)*DT MOIST(II,J,K,IM)=MOIST_BXE(J,K,IB,IM) CWM(II,J,K)=CWM(II,J,K)+MOIST(II,J,K,IM) ENDDO ENDDO ENDDO e_bdy_type !$omp parallel do & !$omp& private(j,k,im) e_bdy_Stype: DO IM=2,N_SCALAR DO K=KTS,KTE DO J=j1,j2 SCALAR_BXE(J,K,IB,IM)=SCALAR_BXE(J,K,IB,IM)+SCALAR_BTXE(J,K,IB,IM)*DT SCALAR(II,J,K,IM)=SCALAR_BXE(J,K,IB,IM) ENDDO ENDDO ENDDO e_bdy_Stype ENDIF if_e_w_bt ENDDO east_west_bt !----------------------------------------------------------------------- !*** SPACE INTERPOLATION OF MICROPHYSICS VARIABLES !*** AT INNER BOUNDARY !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- ! !*** ONE ROW NORTH OF SOUTHERN BOUNDARY ! s_bdy_avg: IF(S_BDY)THEN DO K=KTS,KTE DO I=MYIS,MYIE1 CWM(I,2,K)=(CWM(I,1,K)+CWM(I+1,1,K)+CWM(I,3,K)+CWM(I+1,3,K)) & & *0.25 ENDDO ENDDO ! DO I_M=1,N_MOIST IF(I_M==P_QV)THEN DO K=KTS,KTE DO I=MYIS,MYIE1 MOIST(I,2,K,I_M)=Q(I,2,K)/(1.-Q(I,2,K)) ENDDO ENDDO ELSE DO K=KTS,KTE DO I=MYIS,MYIE1 MOIST(I,2,K,I_M)=(MOIST(I,1,K,I_M) & & +MOIST(I+1,1,K,I_M) & & +MOIST(I,3,K,I_M) & & +MOIST(I+1,3,K,I_M))*0.25 ENDDO ENDDO ENDIF ENDDO ! DO I_M=2,N_SCALAR DO K=KTS,KTE DO I=MYIS,MYIE1 SCALAR(I,2,K,I_M)=(SCALAR(I,1,K,I_M) & & +SCALAR(I+1,1,K,I_M) & & +SCALAR(I,3,K,I_M) & & +SCALAR(I+1,3,K,I_M))*0.25 ENDDO ENDDO ENDDO ! ENDIF s_bdy_avg ! !*** ONE ROW SOUTH OF NORTHERN BOUNDARY ! n_bdy_avg: IF(N_BDY)THEN DO K=KTS,KTE DO I=MYIS,MYIE1 CWM(I,JJM-1,K)=(CWM(I,JJM-2,K)+CWM(I+1,JJM-2,K) & & +CWM(I,JJM,K)+CWM(I+1,JJM,K)) & & *0.25 ENDDO ENDDO ! DO I_M=1,N_MOIST IF(I_M==P_QV)THEN DO K=KTS,KTE DO I=MYIS,MYIE1 MOIST(I,JJM-1,K,I_M)=Q(I,JJM-1,K)/(1.-Q(I,JJM-1,K)) ENDDO ENDDO ELSE DO K=KTS,KTE DO I=MYIS,MYIE1 MOIST(I,JJM-1,K,I_M)=(MOIST(I,JJM-2,K,I_M) & & +MOIST(I+1,JJM-2,K,I_M) & & +MOIST(I,JJM,K,I_M) & & +MOIST(I+1,JJM,K,I_M))*0.25 ENDDO ENDDO ENDIF ENDDO ! DO I_M=2,N_SCALAR DO K=KTS,KTE DO I=MYIS,MYIE1 SCALAR(I,JJM-1,K,I_M)=(SCALAR(I,JJM-2,K,I_M) & & +SCALAR(I+1,JJM-2,K,I_M) & & +SCALAR(I,JJM,K,I_M) & & +SCALAR(I+1,JJM,K,I_M))*0.25 ENDDO ENDDO ENDDO ! ENDIF n_bdy_avg ! !*** ONE ROW EAST OF WESTERN BOUNDARY ! w_bdy_avg:IF(W_BDY)THEN DO K=KTS,KTE DO J=J1B,J2B CWM(1,J,K)=(CWM(1,J-1,K)+CWM(2,J-1,K) & +CWM(1,J+1,K)+CWM(2,J+1,K)) & *0.25 ENDDO ENDDO DO I_M=1,N_MOIST IF(I_M==P_QV)THEN DO K=KTS,KTE DO J=J1B,J2B MOIST(1,J,K,I_M)=Q(1,J,K)/(1.-Q(1,J,K)) ENDDO ENDDO ELSE DO K=KTS,KTE DO J=J1B,J2B MOIST(1,J,K,I_M)=(MOIST(1,J-1,K,I_M) & +MOIST(2,J-1,K,I_M) & +MOIST(1,J+1,K,I_M) & +MOIST(2,J+1,K,I_M))*0.25 ENDDO ENDDO ENDIF ENDDO DO I_M=2,N_SCALAR DO K=KTS,KTE DO J=J1B,J2B SCALAR(1,J,K,I_M)=(SCALAR(1,J-1,K,I_M) & & +SCALAR(2,J-1,K,I_M) & & +SCALAR(1,J+1,K,I_M) & & +SCALAR(2,J+1,K,I_M))*0.25 ENDDO ENDDO ENDDO ENDIF w_bdy_avg ! !*** ONE ROW WEST OF EASTERN BOUNDARY ! e_bdy_avg:IF(E_BDY)THEN DO K=KTS,KTE DO J=J1B,J2B CWM(IIM-1,J,K)=(CWM(IIM-1,J-1,K)+CWM(IIM,J-1,K) & +CWM(IIM-1,J+1,K)+CWM(IIM,J+1,K)) & *0.25 ENDDO ENDDO DO I_M=1,N_MOIST IF(I_M==P_QV)THEN DO K=KTS,KTE DO J=J1B,J2B MOIST(IIM-1,J,K,I_M)=Q(IIM-1,J,K)/(1.-Q(IIM-1,J,K)) ENDDO ENDDO ELSE DO K=KTS,KTE DO J=J1B,J2B MOIST(IIM-1,J,K,I_M)=(MOIST(IIM-1,J-1,K,I_M) & +MOIST(IIM,J-1,K,I_M) & +MOIST(IIM-1,J+1,K,I_M) & +MOIST(IIM,J+1,K,I_M))*0.25 ENDDO ENDDO ENDIF ENDDO DO I_M=2,N_SCALAR DO K=KTS,KTE DO J=J1B,J2B SCALAR(IIM-1,J,K,I_M)=(SCALAR(IIM-1,J-1,K,I_M) & +SCALAR(IIM,J-1,K,I_M) & +SCALAR(IIM-1,J+1,K,I_M) & +SCALAR(IIM,J+1,K,I_M))*0.25 ENDDO ENDDO ENDDO ENDIF e_bdy_avg END SUBROUTINE MP_SPECIES_BDY ! !----------------------------------------------------------------------- ! END MODULE MODULE_BNDRY_COND ! !-----------------------------------------------------------------------