!----------------------------------------------------------------------- ! !NCEP_MESO:MODEL_LAYER: HORIZONTAL DIFFUSION ! !----------------------------------------------------------------------- ! #include "nmm_loop_basemacros.h" #include "nmm_loop_macros.h" ! !----------------------------------------------------------------------- ! MODULE MODULE_DIFFUSION_NMM ! !----------------------------------------------------------------------- USE MODULE_MODEL_CONSTANTS USE MODULE_CONFIGURE, ONLY : GRID_CONFIG_REC_TYPE USE MODULE_STATE_DESCRIPTION !----------------------------------------------------------------------- ! LOGICAL :: SECOND=.TRUE. INTEGER :: KSMUD=1 ! !----------------------------------------------------------------------- ! CONTAINS ! !*********************************************************************** SUBROUTINE HDIFF(NTSD,DT,FIS,DY,HDAC,HDACV & & ,HBM2,DETA1,SIGMA & #if ( HWRF == 1 ) & ,T,Q,U,V,Q2,Z,W,SM,SICE,h_diff & #else & ,T,Q,U,V,Q2,Z,W,SM,SICE & #endif & ,DEF3D & & ,IHE,IHW,IVE,IVW & & ,CONFIG_FLAGS & & ,IDS,IDE,JDS,JDE,KDS,KDE & & ,IMS,IME,JMS,JME,KMS,KME & & ,ITS,ITE,JTS,JTE,KTS,KTE) !*********************************************************************** !$$$ SUBPROGRAM DOCUMENTATION BLOCK ! . . . ! SUBPROGRAM: HDIFF HORIZONTAL DIFFUSION ! PRGRMMR: JANJIC ORG: W/NP22 DATE: 93-11-17 ! ! ABSTRACT: ! HDIFF CALCULATES THE CONTRIBUTION OF THE HORIZONTAL DIFFUSION ! TO THE TENDENCIES OF TEMPERATURE, SPECIFIC HUMIDITY, WIND ! COMPONENTS, AND TURBULENT KINETIC ENERGY AND THEN UPDATES THOSE ! VARIABLES. A SECOND-ORDER NONLINEAR SCHEME SIMILAR TO ! SMAGORINSKY'S IS USED WHERE THE DIFFUSION COEFFICIENT IS ! A FUNCTION OF THE DEFORMATION FIELD AND OF THE TURBULENT ! KINETIC ENERGY. ! ! PROGRAM HISTORY LOG: ! 87-06-?? JANJIC - ORIGINATOR ! 95-03-25 BLACK - CONVERSION FROM 1-D TO 2-D IN HORIZONTAL ! 96-03-28 BLACK - ADDED EXTERNAL EDGE ! 98-10-30 BLACK - MODIFIED FOR DISTRIBUTED MEMORY ! 02-02-07 BLACK - CONVERTED TO WRF STRUCTURE ! 02-08-29 MICHALAKES - ! 02-09-06 WOLFE - ! 03-05-27 JANJIC - ADDED SLOPE ADJUSTMENT ! 04-11-18 BLACK - THREADED ! 05-12-12 BLACK - CONVERTED FROM IKJ TO IJK ! 06-08-15 JANJIC - ENHANCEMENT AT SLOPING SEA COAST ! ! USAGE: CALL HDIFF FROM SUBROUTINE SOLVE_RUNSTREAM ! ! INPUT ARGUMENT LIST: ! ! OUTPUT ARGUMENT LIST: ! ! OUTPUT FILES: ! NONE ! ! SUBPROGRAMS CALLED: ! ! UNIQUE: NONE ! ! LIBRARY: NONE ! ! ATTRIBUTES: ! LANGUAGE: FORTRAN 90 ! MACHINE : IBM SP !$$$ !*********************************************************************** !----------------------------------------------------------------------- ! IMPLICIT NONE ! !----------------------------------------------------------------------- ! !*** STRUCTURE THAT CONTAINS RUN-TIME CONFIGURATION (NAMELIST) DATA FOR DOMAIN ! TYPE(GRID_CONFIG_REC_TYPE),INTENT(IN) :: CONFIG_FLAGS ! INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & & ,IMS,IME,JMS,JME,KMS,KME & & ,ITS,ITE,JTS,JTE,KTS,KTE ! INTEGER,INTENT(IN) :: NTSD ! REAL,INTENT(IN) :: DT,DY #if ( HWRF == 1 ) REAL,INTENT(IN) :: H_DIFF #endif ! REAL,DIMENSION(KMS:KME),INTENT(IN) :: DETA1 ! REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: FIS,HBM2 & & ,HDAC,HDACV & & ,SM,SICE ! REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(OUT) :: DEF3D ! REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: W,Z ! REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: T,Q,Q2 & & ,U,V ! INTEGER, DIMENSION(JMS:JME), INTENT(IN) :: IHE,IHW,IVE,IVW ! !----------------------------------------------------------------------- ! INTEGER,INTENT(IN) :: SIGMA ! !----------------------------------------------------------------------- !*** LOCAL VARIABLES !----------------------------------------------------------------------- ! INTEGER :: I,J,K,KS ! REAL :: DEF_IJ,DEFSK,DEFTK,HKNE_IJ,HKSE_IJ,Q2L,RDY,SLOP,SLOPHC & & ,UTK,VKNE_IJ,VKSE_IJ,VTK,DEF1,DEF2,DEF3,DEF4 ! REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5) :: DEF,HKNE,HKSE & & ,Q2DIF,Q2NE,Q2SE & & ,QDIF,QNE,QSE,SNE,SSE & & ,TDIF,TNE,TSE & & ,UDIF,UNE,USE & & ,VDIF,VKNE,VKSE,VNE,VSE ! LOGICAL :: CILINE,WATSLOP ! !----------------------------------------------------------------------- !*********************************************************************** !----------------------------------------------------------------------- ! #if ( HWRF == 1 ) SLOPHC=SLOPHT*SQRT(2.)*0.5*9. #else SLOPHC=config_flags%slophc #endif RDY=1./DY ! DO J=JTS-5,JTE+5 DO I=ITS-5,ITE+5 DEF(I,J)=0. TNE(I,J)=0. QNE(I,J)=0. Q2NE(I,J)=0. HKNE(I,J)=0. UNE(I,J)=0. VNE(I,J)=0. VKNE(I,J)=0. TSE(I,J)=0. QSE(I,J)=0. Q2SE(I,J)=0. HKSE(I,J)=0. USE(I,J)=0. VSE(I,J)=0. VKSE(I,J)=0. ENDDO ENDDO ! !----------------------------------------------------------------------- !*** !*** DIFFUSING Q2 AT GROUND LEVEL DOES NOT MATTER !*** BECAUSE USTAR2 IS RECALCULATED. !*** !----------------------------------------------------------------------- !*** ITERATION LOOP !----------------------------------------------------------------------- ! DO 600 KS=1,KSMUD ! !----------------------------------------------------------------------- !----------------------------------------------------------------------- !*** MAIN INTEGRATION LOOP !----------------------------------------------------------------------- !----------------------------------------------------------------------- !$omp parallel do & !$omp& private(def1,def2,def3,def4,def_ij,defsk,deftk,hkne_ij,hkse_ij & !$omp& ,i,j,k,q2dif,q2ne,q2se,qdif,qne,qse,slop,sne,sse & !$omp& ,tdif,tne,tse,udif,une,use,vdif,vkne,vkne_ij & !$omp& ,vkse,vkse_ij,vne,vse) !----------------------------------------------------------------------- ! main_integration : DO K=KTS,KTE DO J=JMS,JME DO I=IMS,IME DEF3D(I,J,K)=0. ENDDO ENDDO ! !----------------------------------------------------------------------- !*** SLOPE SWITCHES FOR MOISTURE !----------------------------------------------------------------------- ! IF(SIGMA==1)THEN ! !----------------------------------------------------------------------- !*** PRESSURE DOMAIN !----------------------------------------------------------------------- ! IF(DETA1(K)>0.)THEN DO J=MYJS_P1,MYJE1_P2 DO I=MYIS_P1,MYIE1_P1 SNE(I,J)=1. ENDDO ENDDO ! DO J=MYJS1_P1,MYJE_P2 DO I=MYIS_P1,MYIE1_P1 SSE(I,J)=1. ENDDO ENDDO ! !----------------------------------------------------------------------- !*** SIGMA DOMAIN !----------------------------------------------------------------------- ! ELSE DO J=MYJS_P1,MYJE1_P1 DO I=MYIS_P1,MYIE1_P1 SLOP=ABS((Z(I+IHE(J),J+1,K)-Z(I,J,K))*RDY) ! CILINE=((SM(I+IHE(J),J+1)/=SM(I,J)).OR. & (SICE(I+IHE(J),J+1)/=SICE(I,J))) ! WATSLOP=(SM(I+IHE(J),J+1)==1.0.AND. & SM(I,J)==1.0.AND.SLOP/=0.) ! IF(SLOP=KTS+1)THEN DO J=MYJS2,MYJE2 DO I=MYIS1,MYIE1 Q2(I,J,K)=Q2(I,J,K)+Q2DIF(I,J) ENDDO ENDDO ENDIF ! !----------------------------------------------------------------------- !*** 4TH ORDER DIAGONAL CONTRIBUTIONS !----------------------------------------------------------------------- ! ELSE ! DO J=MYJS,MYJE1 DO I=MYIS,MYIE1 HKNE_IJ=HKNE(I,J) TNE (I,J)=(TDIF (I+IHE(J),J+1)-TDIF (I,J))*HKNE_IJ QNE (I,J)=(QDIF (I+IHE(J),J+1)-QDIF (I,J))*HKNE_IJ Q2NE(I,J)=(Q2DIF(I+IHE(J),J+1)-Q2DIF(I,J))*HKNE_IJ ENDDO ENDDO ! DO J=MYJS1,MYJE DO I=MYIS,MYIE1 HKSE_IJ=HKSE(I,J) TSE (I,J)=(TDIF (I+IHE(J),J-1)-TDIF (I,J))*HKSE_IJ QSE (I,J)=(QDIF (I+IHE(J),J-1)-QDIF (I,J))*HKSE_IJ Q2SE(I,J)=(Q2DIF(I+IHE(J),J-1)-Q2DIF(I,J))*HKSE_IJ ENDDO ENDDO ! DO J=MYJS2,MYJE2 DO I=MYIS1,MYIE1 T(I,J,K)=T(I,J,K)-(TNE(I,J)-TNE(I+IHW(J),J-1) & & +TSE(I,J)-TSE(I+IHW(J),J+1))*HDAC(I,J) Q(I,J,K)=Q(I,J,K)-(QNE(I,J)-QNE(I+IHW(J),J-1) & & +QSE(I,J)-QSE(I+IHW(J),J+1))*HDAC(I,J) & & *FCDIF ENDDO ENDDO ! IF(K>=KTS+1)THEN DO J=MYJS2,MYJE2 DO I=MYIS1,MYIE1 Q2(I,J,K)=Q2(I,J,K)-(Q2NE(I,J)-Q2NE(I+IHW(J),J-1) & & +Q2SE(I,J)-Q2SE(I+IHW(J),J+1)) & & *HDAC(I,J) ENDDO ENDDO ENDIF ! !----------------------------------------------------------------------- ! DO J=MYJS,MYJE1 DO I=MYIS,MYIE1 UNE(I,J)=(UDIF(I+IVE(J),J+1)-UDIF(I,J))*VKNE(I,J) VNE(I,J)=(VDIF(I+IVE(J),J+1)-VDIF(I,J))*VKNE(I,J) ENDDO ENDDO ! DO J=MYJS1,MYJE DO I=MYIS,MYIE1 USE(I,J)=(UDIF(I+IVE(J),J-1)-UDIF(I,J))*VKSE(I,J) VSE(I,J)=(VDIF(I+IVE(J),J-1)-VDIF(I,J))*VKSE(I,J) ENDDO ENDDO ! DO J=MYJS2,MYJE2 DO I=MYIS1,MYIE1 #if ( HWRF == 1 ) U(I,J,K)=U(I,J,K)-(UNE(I,J)-UNE(I+IVW(J),J-1) & & +USE(I,J)-USE(I+IVW(J),J+1))*HDACV(I,J)*h_diff V(I,J,K)=V(I,J,K)-(VNE(I,J)-VNE(I+IVW(J),J-1) & & +VSE(I,J)-VSE(I+IVW(J),J+1))*HDACV(I,J)*h_diff #else U(I,J,K)=U(I,J,K)-(UNE(I,J)-UNE(I+IVW(J),J-1) & & +USE(I,J)-USE(I+IVW(J),J+1))*HDACV(I,J) V(I,J,K)=V(I,J,K)-(VNE(I,J)-VNE(I+IVW(J),J-1) & & +VSE(I,J)-VSE(I+IVW(J),J+1))*HDACV(I,J) #endif ENDDO ENDDO ! !----------------------------------------------------------------------- ENDIF ! End 4th order diffusion !----------------------------------------------------------------------- ! ENDDO main_integration ! !----------------------------------------------------------------------- ! 600 CONTINUE ! !----------------------------------------------------------------------- ! END SUBROUTINE HDIFF ! !----------------------------------------------------------------------- ! END MODULE MODULE_DIFFUSION_NMM ! !-----------------------------------------------------------------------