1 !-----------------------------------------------------------------------
3 !NCEP_MESO:MODEL_LAYER: HORIZONTAL DIFFUSION
5 !-----------------------------------------------------------------------
7 #include "nmm_loop_basemacros.h"
8 #include "nmm_loop_macros.h"
10 !-----------------------------------------------------------------------
12 MODULE MODULE_DIFFUSION_NMM
14 !-----------------------------------------------------------------------
15 USE MODULE_MODEL_CONSTANTS
16 USE MODULE_CONFIGURE, ONLY : GRID_CONFIG_REC_TYPE
17 USE MODULE_STATE_DESCRIPTION
18 !-----------------------------------------------------------------------
20 LOGICAL :: SECOND=.TRUE.
23 !-----------------------------------------------------------------------
27 !***********************************************************************
28 SUBROUTINE HDIFF(NTSD,DT,FIS,DY,HDAC,HDACV &
31 & ,T,Q,U,V,Q2,Z,W,SM,SICE,h_diff &
33 & ,T,Q,U,V,Q2,Z,W,SM,SICE &
37 & ,IDS,IDE,JDS,JDE,KDS,KDE &
38 & ,IMS,IME,JMS,JME,KMS,KME &
39 & ,ITS,ITE,JTS,JTE,KTS,KTE)
40 !***********************************************************************
41 !$$$ SUBPROGRAM DOCUMENTATION BLOCK
43 ! SUBPROGRAM: HDIFF HORIZONTAL DIFFUSION
44 ! PRGRMMR: JANJIC ORG: W/NP22 DATE: 93-11-17
47 ! HDIFF CALCULATES THE CONTRIBUTION OF THE HORIZONTAL DIFFUSION
48 ! TO THE TENDENCIES OF TEMPERATURE, SPECIFIC HUMIDITY, WIND
49 ! COMPONENTS, AND TURBULENT KINETIC ENERGY AND THEN UPDATES THOSE
50 ! VARIABLES. A SECOND-ORDER NONLINEAR SCHEME SIMILAR TO
51 ! SMAGORINSKY'S IS USED WHERE THE DIFFUSION COEFFICIENT IS
52 ! A FUNCTION OF THE DEFORMATION FIELD AND OF THE TURBULENT
55 ! PROGRAM HISTORY LOG:
56 ! 87-06-?? JANJIC - ORIGINATOR
57 ! 95-03-25 BLACK - CONVERSION FROM 1-D TO 2-D IN HORIZONTAL
58 ! 96-03-28 BLACK - ADDED EXTERNAL EDGE
59 ! 98-10-30 BLACK - MODIFIED FOR DISTRIBUTED MEMORY
60 ! 02-02-07 BLACK - CONVERTED TO WRF STRUCTURE
61 ! 02-08-29 MICHALAKES -
63 ! 03-05-27 JANJIC - ADDED SLOPE ADJUSTMENT
64 ! 04-11-18 BLACK - THREADED
65 ! 05-12-12 BLACK - CONVERTED FROM IKJ TO IJK
66 ! 06-08-15 JANJIC - ENHANCEMENT AT SLOPING SEA COAST
68 ! USAGE: CALL HDIFF FROM SUBROUTINE SOLVE_RUNSTREAM
70 ! INPUT ARGUMENT LIST:
72 ! OUTPUT ARGUMENT LIST:
84 ! LANGUAGE: FORTRAN 90
87 !***********************************************************************
88 !-----------------------------------------------------------------------
92 !-----------------------------------------------------------------------
94 !*** STRUCTURE THAT CONTAINS RUN-TIME CONFIGURATION (NAMELIST) DATA FOR DOMAIN
96 TYPE(GRID_CONFIG_REC_TYPE),INTENT(IN) :: CONFIG_FLAGS
98 INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
99 & ,IMS,IME,JMS,JME,KMS,KME &
100 & ,ITS,ITE,JTS,JTE,KTS,KTE
102 INTEGER,INTENT(IN) :: NTSD
104 REAL,INTENT(IN) :: DT,DY
106 REAL,INTENT(IN) :: H_DIFF
109 REAL,DIMENSION(KMS:KME),INTENT(IN) :: DETA1
111 REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: FIS,HBM2 &
115 REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: W,Z
117 REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: T,Q,Q2 &
120 INTEGER, DIMENSION(JMS:JME), INTENT(IN) :: IHE,IHW,IVE,IVW
122 !-----------------------------------------------------------------------
124 INTEGER,INTENT(IN) :: SIGMA
126 !-----------------------------------------------------------------------
128 !-----------------------------------------------------------------------
132 REAL :: DEF_IJ,DEFSK,DEFTK,HKNE_IJ,HKSE_IJ,Q2L,RDY,SLOP,SLOPHC &
133 & ,UTK,VKNE_IJ,VKSE_IJ,VTK,DEF1,DEF2,DEF3,DEF4
135 REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5) :: DEF,HKNE,HKSE &
137 & ,QDIF,QNE,QSE,SNE,SSE &
140 & ,VDIF,VKNE,VKSE,VNE,VSE
142 LOGICAL :: CILINE,WATSLOP
144 !-----------------------------------------------------------------------
145 !***********************************************************************
146 !-----------------------------------------------------------------------
148 SLOPHC=SLOPHT*SQRT(2.)*0.5*9.
171 !-----------------------------------------------------------------------
173 !*** DIFFUSING Q2 AT GROUND LEVEL DOES NOT MATTER
174 !*** BECAUSE USTAR2 IS RECALCULATED.
176 !-----------------------------------------------------------------------
178 !-----------------------------------------------------------------------
182 !-----------------------------------------------------------------------
183 !-----------------------------------------------------------------------
184 !*** MAIN INTEGRATION LOOP
185 !-----------------------------------------------------------------------
186 !-----------------------------------------------------------------------
188 !$omp& private(def1,def2,def3,def4,def_ij,defsk,deftk,hkne_ij,hkse_ij &
189 !$omp& ,i,j,k,q2dif,q2ne,q2se,qdif,qne,qse,slop,sne,sse &
190 !$omp& ,tdif,tne,tse,udif,une,use,vdif,vkne,vkne_ij &
191 !$omp& ,vkse,vkse_ij,vne,vse)
192 !-----------------------------------------------------------------------
194 main_integration : DO K=KTS,KTE
196 !-----------------------------------------------------------------------
197 !*** SLOPE SWITCHES FOR MOISTURE
198 !-----------------------------------------------------------------------
202 !-----------------------------------------------------------------------
204 !-----------------------------------------------------------------------
207 DO J=MYJS_P1,MYJE1_P2
208 DO I=MYIS_P1,MYIE1_P1
213 DO J=MYJS1_P1,MYJE_P2
214 DO I=MYIS_P1,MYIE1_P1
219 !-----------------------------------------------------------------------
221 !-----------------------------------------------------------------------
224 DO J=MYJS_P1,MYJE1_P1
225 DO I=MYIS_P1,MYIE1_P1
226 SLOP=ABS((Z(I+IHE(J),J+1,K)-Z(I,J,K))*RDY)
228 CILINE=((SM(I+IHE(J),J+1)/=SM(I,J)).OR. &
229 (SICE(I+IHE(J),J+1)/=SICE(I,J)))
231 WATSLOP=(SM(I+IHE(J),J+1)==1.0.AND. &
232 SM(I,J)==1.0.AND.SLOP/=0.)
234 IF(SLOP<SLOPHC.OR.CILINE.OR.WATSLOP)THEN
242 DO J=MYJS1_P1,MYJE_P1
243 DO I=MYIS_P1,MYIE1_P1
244 SLOP=ABS((Z(I+IHE(J),J-1,K)-Z(I,J,K))*RDY)
246 CILINE=((SM(I+IHE(J),J-1)/=SM(I,J)).OR. &
247 (SICE(I+IHE(J),J-1)/=SICE(I,J)))
249 WATSLOP=(SM(I+IHE(J),J-1)==1.0.AND. &
250 SM(I,J)==1.0.AND.SLOP/=0.)
252 IF(SLOP<SLOPHC.OR.CILINE.OR.WATSLOP)THEN
262 !-----------------------------------------------------------------------
264 !-----------------------------------------------------------------------
269 DEFTK=U(I+IHE(J),J,K)-U(I+IHW(J),J,K) &
270 & -V(I,J+1,K)+V(I,J-1,K)
271 DEFSK=U(I,J+1,K)-U(I,J-1,K) &
272 & +V(I+IHE(J),J,K)-V(I+IHW(J),J,K)
273 DEF1=(W(I+IHW(J),J-1,K)-W(I,J,K))*0.5
274 DEF2=(W(I+IHE(J),J-1,K)-W(I,J,K))*0.5
275 DEF3=(W(I+IHW(J),J+1,K)-W(I,J,K))*0.5
276 DEF4=(W(I+IHE(J),J+1,K)-W(I,J,K))*0.5
279 IF ( CONFIG_FLAGS%BL_PBL_PHYSICS == MYJPBLSCHEME) then
280 DEF_IJ=DEFTK*DEFTK+DEFSK*DEFSK+DEF1*DEF1+DEF2*DEF2 &
281 & +DEF3*DEF3+DEF4*DEF4+SCQ2*Q2L
283 DEF_IJ=DEFTK*DEFTK+DEFSK*DEFSK+DEF1*DEF1+DEF2*DEF2 &
284 & +DEF3*DEF3+DEF4*DEF4
287 DEF_IJ=SQRT(DEF_IJ+DEF_IJ)*HBM2(I,J)
288 DEF_IJ=MAX(DEF_IJ,DEFC)
289 DEF_IJ=MIN(DEF_IJ,DEFM)
295 !-----------------------------------------------------------------------
296 !*** DIAGONAL CONTRIBUTIONS
297 !-----------------------------------------------------------------------
299 DO J=MYJS_P1,MYJE1_P1
300 DO I=MYIS_P1,MYIE1_P1
301 HKNE_IJ=(DEF(I,J)+DEF(I+IHE(J),J+1))*SNE(I,J)
302 TNE (I,J)=(T (I+IHE(J),J+1,K)-T (I,J,K))*HKNE_IJ
303 QNE (I,J)=(Q (I+IHE(J),J+1,K)-Q (I,J,K))*HKNE_IJ
304 Q2NE(I,J)=(Q2(I+IHE(J),J+1,K)-Q2(I,J,K))*HKNE_IJ
307 VKNE_IJ=DEF(I+IVE(J),J)+DEF(I,J+1)
308 UNE(I,J)=(U(I+IVE(J),J+1,K)-U(I,J,K))*VKNE_IJ
309 VNE(I,J)=(V(I+IVE(J),J+1,K)-V(I,J,K))*VKNE_IJ
314 DO J=MYJS1_P1,MYJE_P1
315 DO I=MYIS_P1,MYIE1_P1
316 HKSE_IJ=(DEF(I+IHE(J),J-1)+DEF(I,J))*SSE(I,J)
317 TSE (I,J)=(T (I+IHE(J),J-1,K)-T (I,J,K))*HKSE_IJ
318 QSE (I,J)=(Q (I+IHE(J),J-1,K)-Q (I,J,K))*HKSE_IJ
319 Q2SE(I,J)=(Q2(I+IHE(J),J-1,K)-Q2(I,J,K))*HKSE_IJ
322 VKSE_IJ=DEF(I,J-1)+DEF(I+IVE(J),J)
323 USE(I,J)=(U(I+IVE(J),J-1,K)-U(I,J,K))*VKSE_IJ
324 VSE(I,J)=(V(I+IVE(J),J-1,K)-V(I,J,K))*VKSE_IJ
328 !-----------------------------------------------------------------------
332 TDIF (I,J)=(TNE (I,J)-TNE (I+IHW(J),J-1) &
333 & +TSE (I,J)-TSE (I+IHW(J),J+1))*HDAC(I,J)
334 QDIF (I,J)=(QNE (I,J)-QNE (I+IHW(J),J-1) &
335 & +QSE (I,J)-QSE (I+IHW(J),J+1))*HDAC(I,J)*FCDIF
336 Q2DIF(I,J)=(Q2NE(I,J)-Q2NE(I+IHW(J),J-1) &
337 & +Q2SE(I,J)-Q2SE(I+IHW(J),J+1))*HDAC(I,J)
339 UDIF(I,J)=(UNE(I,J)-UNE(I+IVW(J),J-1) &
340 & +USE(I,J)-USE(I+IVW(J),J+1))*HDACV(I,J)
341 VDIF(I,J)=(VNE(I,J)-VNE(I+IVW(J),J-1) &
342 & +VSE(I,J)-VSE(I+IVW(J),J+1))*HDACV(I,J)
346 !-----------------------------------------------------------------------
347 !*** 2ND ORDER DIFFUSION
348 !-----------------------------------------------------------------------
353 T (I,J,K)=T (I,J,K)+TDIF (I,J)
354 Q (I,J,K)=Q (I,J,K)+QDIF (I,J)
357 U(I,J,K)=U(I,J,K)+UDIF(I,J)*h_diff
358 V(I,J,K)=V(I,J,K)+VDIF(I,J)*h_diff
360 U(I,J,K)=U(I,J,K)+UDIF(I,J)
361 V(I,J,K)=V(I,J,K)+VDIF(I,J)
366 !-----------------------------------------------------------------------
370 Q2(I,J,K)=Q2(I,J,K)+Q2DIF(I,J)
375 !-----------------------------------------------------------------------
376 !*** 4TH ORDER DIAGONAL CONTRIBUTIONS
377 !-----------------------------------------------------------------------
384 TNE (I,J)=(TDIF (I+IHE(J),J+1)-TDIF (I,J))*HKNE_IJ
385 QNE (I,J)=(QDIF (I+IHE(J),J+1)-QDIF (I,J))*HKNE_IJ
386 Q2NE(I,J)=(Q2DIF(I+IHE(J),J+1)-Q2DIF(I,J))*HKNE_IJ
393 TSE (I,J)=(TDIF (I+IHE(J),J-1)-TDIF (I,J))*HKSE_IJ
394 QSE (I,J)=(QDIF (I+IHE(J),J-1)-QDIF (I,J))*HKSE_IJ
395 Q2SE(I,J)=(Q2DIF(I+IHE(J),J-1)-Q2DIF(I,J))*HKSE_IJ
401 T(I,J,K)=T(I,J,K)-(TNE(I,J)-TNE(I+IHW(J),J-1) &
402 & +TSE(I,J)-TSE(I+IHW(J),J+1))*HDAC(I,J)
403 Q(I,J,K)=Q(I,J,K)-(QNE(I,J)-QNE(I+IHW(J),J-1) &
404 & +QSE(I,J)-QSE(I+IHW(J),J+1))*HDAC(I,J) &
413 Q2(I,J,K)=Q2(I,J,K)-(Q2NE(I,J)-Q2NE(I+IHW(J),J-1) &
414 & +Q2SE(I,J)-Q2SE(I+IHW(J),J+1)) &
420 !-----------------------------------------------------------------------
424 UNE(I,J)=(UDIF(I+IVE(J),J+1)-UDIF(I,J))*VKNE(I,J)
425 VNE(I,J)=(VDIF(I+IVE(J),J+1)-VDIF(I,J))*VKNE(I,J)
431 USE(I,J)=(UDIF(I+IVE(J),J-1)-UDIF(I,J))*VKSE(I,J)
432 VSE(I,J)=(VDIF(I+IVE(J),J-1)-VDIF(I,J))*VKSE(I,J)
439 U(I,J,K)=U(I,J,K)-(UNE(I,J)-UNE(I+IVW(J),J-1) &
440 & +USE(I,J)-USE(I+IVW(J),J+1))*HDACV(I,J)*h_diff
441 V(I,J,K)=V(I,J,K)-(VNE(I,J)-VNE(I+IVW(J),J-1) &
442 & +VSE(I,J)-VSE(I+IVW(J),J+1))*HDACV(I,J)*h_diff
444 U(I,J,K)=U(I,J,K)-(UNE(I,J)-UNE(I+IVW(J),J-1) &
445 & +USE(I,J)-USE(I+IVW(J),J+1))*HDACV(I,J)
446 V(I,J,K)=V(I,J,K)-(VNE(I,J)-VNE(I+IVW(J),J-1) &
447 & +VSE(I,J)-VSE(I+IVW(J),J+1))*HDACV(I,J)
452 !-----------------------------------------------------------------------
453 ENDIF ! End 4th order diffusion
454 !-----------------------------------------------------------------------
456 ENDDO main_integration
458 !-----------------------------------------------------------------------
462 !-----------------------------------------------------------------------
466 !-----------------------------------------------------------------------
468 END MODULE MODULE_DIFFUSION_NMM
470 !-----------------------------------------------------------------------