!-----------------------------------------------------------------------
!
!NCEP_MESO:MODEL_LAYER: HORIZONTAL DIFFUSION
!
!-----------------------------------------------------------------------
!
#include "nmm_loop_basemacros.h"
#include "nmm_loop_macros.h"
!
!-----------------------------------------------------------------------
!
MODULE MODULE_DIFFUSION_NMM 2
!
!-----------------------------------------------------------------------
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 & 1
& ,HBM2,DETA1,SIGMA &
#ifdef HWRF
& ,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
#ifdef HWRF
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
!
!-----------------------------------------------------------------------
!***********************************************************************
!-----------------------------------------------------------------------
!
#ifdef HWRF
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<SLOPHC.OR.CILINE.OR.WATSLOP)THEN
SNE(I,J)=1.
ELSE
SNE(I,J)=0.
ENDIF
ENDDO
ENDDO
!
DO J=MYJS1_P1,MYJE_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<SLOPHC.OR.CILINE.OR.WATSLOP)THEN
SSE(I,J)=1.
ELSE
SSE(I,J)=0.
ENDIF
ENDDO
ENDDO
ENDIF
!
ENDIF
!-----------------------------------------------------------------------
!*** DEFORMATIONS
!-----------------------------------------------------------------------
!
DO J=MYJS_P1,MYJE_P1
DO I=MYIS_P1,MYIE_P1
!
DEFTK=U(I+IHE(J),J,K)-U(I+IHW(J),J,K) &
& -V(I,J+1,K)+V(I,J-1,K)
DEFSK=U(I,J+1,K)-U(I,J-1,K) &
& +V(I+IHE(J),J,K)-V(I+IHW(J),J,K)
DEF1=(W(I+IHW(J),J-1,K)-W(I,J,K))*0.5
DEF2=(W(I+IHE(J),J-1,K)-W(I,J,K))*0.5
DEF3=(W(I+IHW(J),J+1,K)-W(I,J,K))*0.5
DEF4=(W(I+IHE(J),J+1,K)-W(I,J,K))*0.5
Q2L=Q2(I,J,K)
IF(Q2L<=EPSQ2)Q2L=0.
IF ( CONFIG_FLAGS%BL_PBL_PHYSICS == MYJPBLSCHEME) then
DEF_IJ=DEFTK*DEFTK+DEFSK*DEFSK+DEF1*DEF1+DEF2*DEF2 &
& +DEF3*DEF3+DEF4*DEF4+SCQ2*Q2L
else
DEF_IJ=DEFTK*DEFTK+DEFSK*DEFSK+DEF1*DEF1+DEF2*DEF2 &
& +DEF3*DEF3+DEF4*DEF4
ENDIF
DEF_IJ=SQRT(DEF_IJ+DEF_IJ)*HBM2(I,J)
DEF_IJ=MAX(DEF_IJ,DEFC)
DEF_IJ=MIN(DEF_IJ,DEFM)
DEF_IJ=DEF_IJ*0.1
DEF(I,J)=DEF_IJ
DEF3D(I,J,K)=DEF_IJ
ENDDO
ENDDO
!
!-----------------------------------------------------------------------
!*** DIAGONAL CONTRIBUTIONS
!-----------------------------------------------------------------------
!
DO J=MYJS_P1,MYJE1_P1
DO I=MYIS_P1,MYIE1_P1
HKNE_IJ=(DEF(I,J)+DEF(I+IHE(J),J+1))*SNE(I,J)
TNE (I,J)=(T (I+IHE(J),J+1,K)-T (I,J,K))*HKNE_IJ
QNE (I,J)=(Q (I+IHE(J),J+1,K)-Q (I,J,K))*HKNE_IJ
Q2NE(I,J)=(Q2(I+IHE(J),J+1,K)-Q2(I,J,K))*HKNE_IJ
HKNE(I,J)=HKNE_IJ
!
VKNE_IJ=DEF(I+IVE(J),J)+DEF(I,J+1)
UNE(I,J)=(U(I+IVE(J),J+1,K)-U(I,J,K))*VKNE_IJ
VNE(I,J)=(V(I+IVE(J),J+1,K)-V(I,J,K))*VKNE_IJ
VKNE(I,J)=VKNE_IJ
ENDDO
ENDDO
!
DO J=MYJS1_P1,MYJE_P1
DO I=MYIS_P1,MYIE1_P1
HKSE_IJ=(DEF(I+IHE(J),J-1)+DEF(I,J))*SSE(I,J)
TSE (I,J)=(T (I+IHE(J),J-1,K)-T (I,J,K))*HKSE_IJ
QSE (I,J)=(Q (I+IHE(J),J-1,K)-Q (I,J,K))*HKSE_IJ
Q2SE(I,J)=(Q2(I+IHE(J),J-1,K)-Q2(I,J,K))*HKSE_IJ
HKSE(I,J)=HKSE_IJ
!
VKSE_IJ=DEF(I,J-1)+DEF(I+IVE(J),J)
USE(I,J)=(U(I+IVE(J),J-1,K)-U(I,J,K))*VKSE_IJ
VSE(I,J)=(V(I+IVE(J),J-1,K)-V(I,J,K))*VKSE_IJ
VKSE(I,J)=VKSE_IJ
ENDDO
ENDDO
!-----------------------------------------------------------------------
!
DO J=MYJS1,MYJE1
DO I=MYIS1,MYIE
TDIF (I,J)=(TNE (I,J)-TNE (I+IHW(J),J-1) &
& +TSE (I,J)-TSE (I+IHW(J),J+1))*HDAC(I,J)
QDIF (I,J)=(QNE (I,J)-QNE (I+IHW(J),J-1) &
& +QSE (I,J)-QSE (I+IHW(J),J+1))*HDAC(I,J)*FCDIF
Q2DIF(I,J)=(Q2NE(I,J)-Q2NE(I+IHW(J),J-1) &
& +Q2SE(I,J)-Q2SE(I+IHW(J),J+1))*HDAC(I,J)
!
UDIF(I,J)=(UNE(I,J)-UNE(I+IVW(J),J-1) &
& +USE(I,J)-USE(I+IVW(J),J+1))*HDACV(I,J)
VDIF(I,J)=(VNE(I,J)-VNE(I+IVW(J),J-1) &
& +VSE(I,J)-VSE(I+IVW(J),J+1))*HDACV(I,J)
ENDDO
ENDDO
!
!-----------------------------------------------------------------------
!*** 2ND ORDER DIFFUSION
!-----------------------------------------------------------------------
!
IF(SECOND)THEN
DO J=MYJS2,MYJE2
DO I=MYIS1,MYIE1
T (I,J,K)=T (I,J,K)+TDIF (I,J)
Q (I,J,K)=Q (I,J,K)+QDIF (I,J)
!
#ifdef HWRF
U(I,J,K)=U(I,J,K)+UDIF(I,J)*h_diff
V(I,J,K)=V(I,J,K)+VDIF(I,J)*h_diff
#else
U(I,J,K)=U(I,J,K)+UDIF(I,J)
V(I,J,K)=V(I,J,K)+VDIF(I,J)
#endif
ENDDO
ENDDO
!
!-----------------------------------------------------------------------
IF(K>=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
#ifdef HWRF
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
!
!-----------------------------------------------------------------------