1 !----------------------------------------------------------------------
3 !----------------------------------------------------------------------
4 #include "nmm_loop_basemacros.h"
5 #include "nmm_loop_macros.h"
6 !----------------------------------------------------------------------
8 !NCEP_MESO:MODEL_LAYER: HORIZONTAL AND VERTICAL ADVECTION
10 !----------------------------------------------------------------------
12 MODULE MODULE_ADVECTION
14 !----------------------------------------------------------------------
15 USE MODULE_MODEL_CONSTANTS
16 USE MODULE_EXT_INTERNAL
17 !----------------------------------------------------------------------
18 #if defined(DM_PARALLEL) && !defined(STUBMPI)
21 !----------------------------------------------------------------------
23 REAL,PARAMETER :: FF2=-0.64813,FF3=0.24520,FF4=-0.12189
24 REAL,PARAMETER :: FFC=1.533,FBC=1.-FFC
25 REAL :: CONSERVE_MIN=0.9,CONSERVE_MAX=1.1
27 !----------------------------------------------------------------------
28 !*** CRANK-NICHOLSON OFF-CENTER WEIGHTS FOR CURRENT AND FUTURE
30 !-----------------------------------------------------------------------
32 REAL,PARAMETER :: WGT1=0.90
33 REAL,PARAMETER :: WGT2=2.-WGT1
35 !*** FOR CRANK_NICHOLSON CHECK ONLY.
37 INTEGER :: ITEST=47,JTEST=70
38 REAL :: ADTP,ADUP,ADVP,TTLO,TTUP,TULO,TUUP,TVLO,TVUP
40 !----------------------------------------------------------------------
43 !***********************************************************************
44 SUBROUTINE ADVE(NTSD,DT,DETA1,DETA2,PDTOP &
45 & ,CURV,F,FAD,F4D,EM_LOC,EMT_LOC,EN,ENT,DX,DY &
47 & ,T,U,V,PDSLO,TOLD,UOLD,VOLD &
52 & ,N_IUP_ADH,N_IUP_ADV &
53 & ,IUP_H,IUP_V,IUP_ADH,IUP_ADV &
55 & ,IDS,IDE,JDS,JDE,KDS,KDE &
56 & ,IMS,IME,JMS,JME,KMS,KME &
57 & ,ITS,ITE,JTS,JTE,KTS,KTE)
58 !***********************************************************************
59 !$$$ SUBPROGRAM DOCUMENTATION BLOCK
61 ! SUBPROGRAM: ADVE HORIZONTAL AND VERTICAL ADVECTION
62 ! PRGRMMR: JANJIC ORG: W/NP22 DATE: 93-10-28
65 ! ADVE CALCULATES THE CONTRIBUTION OF THE HORIZONTAL AND VERTICAL
66 ! ADVECTION TO THE TENDENCIES OF TEMPERATURE AND WIND AND THEN
67 ! UPDATES THOSE VARIABLES.
68 ! THE JANJIC ADVECTION SCHEME FOR THE ARAKAWA E GRID IS USED
69 ! FOR ALL VARIABLES INSIDE THE FIFTH ROW. AN UPSTREAM SCHEME
70 ! IS USED ON ALL VARIABLES IN THE THIRD, FOURTH, AND FIFTH
71 ! OUTERMOST ROWS. THE ADAMS-BASHFORTH TIME SCHEME IS USED.
73 ! PROGRAM HISTORY LOG:
74 ! 87-06-?? JANJIC - ORIGINATOR
75 ! 95-03-25 BLACK - CONVERSION FROM 1-D TO 2-D IN HORIZONTAL
76 ! 96-03-28 BLACK - ADDED EXTERNAL EDGE
77 ! 98-10-30 BLACK - MODIFIED FOR DISTRIBUTED MEMORY
78 ! 99-07- JANJIC - CONVERTED TO ADAMS-BASHFORTH SCHEME
79 ! COMBINING HORIZONTAL AND VERTICAL ADVECTION
80 ! 02-02-04 BLACK - ADDED VERTICAL CFL CHECK
81 ! 02-02-05 BLACK - CONVERTED TO WRF FORMAT
82 ! 02-08-29 MICHALAKES - CONDITIONAL COMPILATION OF MPI
83 ! CONVERT TO GLOBAL INDEXING
84 ! 02-09-06 WOLFE - MORE CONVERSION TO GLOBAL INDEXING
85 ! 04-05-29 JANJIC,BLACK - CRANK-NICHOLSON VERTICAL ADVECTION
86 ! 04-11-23 BLACK - THREADED
87 ! 05-12-14 BLACK - CONVERTED FROM IKJ TO IJK
89 ! USAGE: CALL ADVE FROM SUBROUTINE SOLVE_NMM
90 ! INPUT ARGUMENT LIST:
92 ! OUTPUT ARGUMENT LIST:
104 ! LANGUAGE: FORTRAN 90
107 !***********************************************************************
108 !-----------------------------------------------------------------------
112 !-----------------------------------------------------------------------
114 INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
115 & ,IMS,IME,JMS,JME,KMS,KME &
116 & ,ITS,ITE,JTS,JTE,KTS,KTE
118 INTEGER, DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW &
120 & ,N_IUP_ADH,N_IUP_ADV
122 INTEGER, DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: IUP_H,IUP_V &
125 INTEGER,INTENT(IN) :: NTSD
127 REAL,INTENT(IN) :: DT,DY,EN,ENT,F4D,PDTOP
129 REAL,DIMENSION(NMM_MAX_DIM),INTENT(IN) :: EM_LOC,EMT_LOC
131 REAL,DIMENSION(KMS:KME),INTENT(IN) :: DETA1,DETA2
133 REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: CURV,DX,F,FAD,HBM2 &
136 REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: ADT,ADU,ADV
138 REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: PETDT
140 REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: T,TOLD &
144 REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(OUT) :: FEW,FNE &
147 !-----------------------------------------------------------------------
149 !-----------------------------------------------------------------------
153 INTEGER :: I,IEND,IFP,IFQ,II,IPQ,ISP,ISQ,ISTART &
154 & ,IUP_ADH_J,IVH,IVL &
155 & ,J,J1,JA,JAK,JEND,JGLOBAL,JJ,JKNT,JP2,JSTART &
156 & ,K,KNTI_ADH,KSTART,KSTOP &
157 & ,N,N_IUPH_J,N_IUPADH_J,N_IUPADV_J
159 INTEGER :: MY_IS_GLB,MY_IE_GLB,MY_JS_GLB,MY_JE_GLB
161 INTEGER,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5) :: ISPA,ISQA
163 REAL :: ADPDX,ADPDY,ARRAY3_X,CFL,CFT,CFU,CFV,CMT,CMU,CMV &
164 & ,DTE,DTQ,F0,F1,F2,F3,FEWP,FNEP,FNSP,FPP,FSEP,HM &
165 & ,PDOP,PDOPU,PDOPV,PP &
166 & ,PVVLO,PVVLOU,PVVLOV,PVVUP,PVVUPU,PVVUPV &
167 & ,QP,RDP,RDPU,RDPV &
168 & ,TEMPA,TEMPB,TTA,TTB,UDY &
169 & ,VDX,VM,VVLO,VVLOU,VVLOV,VVUP,VVUPU,VVUPV
171 REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5) :: ARRAY0,ARRAY1 &
173 & ,DPDE,RDPD,RDPDX,RDPDY &
174 & ,TEW,TNE,TNS,TSE,TST &
175 & ,UNE,UNED,UEW,UNS,USE &
180 REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5,KTS:KTE) :: VAD_TEND_T &
184 REAL,DIMENSION(KTS:KTE) :: CRT,CRU,CRV,DETA1_PDTOP &
185 & ,RCMT,RCMU,RCMV,RSTT,RSTU,RSTV &
186 & ,T_K,TN,U_K,UN,V_K,VN
188 !-----------------------------------------------------------------------
189 !***********************************************************************
203 ! ADV ----- 0 ------> Current J
217 !***********************************************************************
218 !-----------------------------------------------------------------------
248 !-----------------------------------------------------------------------
253 !-----------------------------------------------------------------------
255 !*** PRECOMPUTE DETA1 TIMES PDTOP.
257 !-----------------------------------------------------------------------
260 DETA1_PDTOP(K)=DETA1(K)*PDTOP
263 !-----------------------------------------------------------------------
265 !*** INITIALIZE SOME WORKING ARRAYS TO ZERO
268 !-----------------------------------------------------------------------
269 !-----------------------------------------------------------------------
271 !*** COMPUTE VERTICAL ADVECTION TENDENCIES USING CRANK-NICHOLSON.
273 !-----------------------------------------------------------------------
274 !-----------------------------------------------------------------------
276 !-----------------------------------------------------------------------
277 !*** FIRST THE TEMPERATURE
278 !-----------------------------------------------------------------------
280 !$omp& private(cft,cfu,cfv,cmt,cmu,cmv,crt,cru,crv,i,k &
281 !$omp& ,pdop,pdopu,pdopv,pvvlo,pvvlou,pvvlov,pvvup,pvvupu,pvvupv &
282 !$omp& ,rcmt,rcmu,rcmv,rdp,rdpu,rdpv,rstt,rstu,rstv,t_k,tn &
283 !$omp& ,u_k,un,v_k,vn,vvlo,vvlou,vvlov,vvup,vvupu,vvupv)
284 !!$omp& private(adtp,adup,advp,ttlo,ttup,tulo,tuup,tvlo,tvup)
285 !-----------------------------------------------------------------------
287 main_vertical: DO J=MYJS2,MYJE2
289 !-----------------------------------------------------------------------
291 iloop_for_t: DO I=MYIS1,MYIE1
293 !-----------------------------------------------------------------------
294 !*** EXTRACT T FROM THE COLUMN
295 !-----------------------------------------------------------------------
301 !-----------------------------------------------------------------------
304 PVVLO=PETDT(I,J,KTE-1)*DTQ
305 VVLO=PVVLO/(DETA1_PDTOP(KTE)+DETA2(KTE)*PDOP)
309 RSTT(KTE)=-VVLO*WGT1*(T_K(KTE-1)-T_K(KTE))+T_K(KTE)
311 !-----------------------------------------------------------------------
314 RDP=1./(DETA1_PDTOP(K)+DETA2(K)*PDOP)
316 PVVLO=PETDT(I,J,K-1)*DTQ
319 CFT=-VVUP*WGT2*RCMT(K+1)
320 CMT=-CRT(K+1)*CFT+((VVUP-VVLO)*WGT2+1.)
323 RSTT(K)=-RSTT(K+1)*CFT+T_K(K) &
324 & -(T_K(K)-T_K(K+1))*VVUP*WGT1 &
325 & -(T_K(K-1)-T_K(K))*VVLO*WGT1
328 !-----------------------------------------------------------------------
331 VVUP=PVVUP/(DETA1_PDTOP(KTS)+DETA2(KTS)*PDOP)
332 CFT=-VVUP*WGT2*RCMT(KTS+1)
333 CMT=-CRT(KTS+1)*CFT+VVUP*WGT2+1.
335 RSTT(KTS)=-(T_K(KTS)-T_K(KTS+1))*VVUP*WGT1 &
336 & -RSTT(KTS+1)*CFT+T_K(KTS)
337 TN(KTS)=RSTT(KTS)/CMT
338 VAD_TEND_T(I,J,KTS)=TN(KTS)-T_K(KTS)
341 TN(K)=(-CRT(K)*TN(K-1)+RSTT(K))*RCMT(K)
342 VAD_TEND_T(I,J,K)=TN(K)-T_K(K)
345 !-----------------------------------------------------------------------
346 !*** The following section is only for checking the implicit solution
347 !*** using back-substitution. Remove this section otherwise.
348 !-----------------------------------------------------------------------
349 ! if(ntsd<=10.or.ntsd>=6000)then
350 ! IF(I==ITEST.AND.J==JTEST)THEN
352 ! PVVLO=PETDT(I,J,KTE-1)*DT*0.25
353 ! VVLO=PVVLO/(DETA1_PDTOP(KTE)+DETA2(KTE)*PDOP)
354 ! TTLO=VVLO*(T(I,J,KTE-1)-T(I,J,KTE) &
355 ! & +TN(KTE-1)-TN(KTE))
356 ! ADTP=TTLO+TN(KTE)-T(I,J,KTE)
357 ! WRITE(0,*)' NTSD=',NTSD,' I=',ITEST,' J=',JTEST,' K=',KTE &
359 ! WRITE(0,*)' T=',T(I,J,KTE),' TN=',TN(KTE) &
360 ! &, ' VAD_TEND_T=',VAD_TEND_T(I,J,KTE)
363 ! DO K=KTE-1,KTS+1,-1
364 ! RDP=1./(DETA1_PDTOP(K)+DETA2(K)*PDOP)
366 ! PVVLO=PETDT(I,J,K-1)*DT*0.25
369 ! TTUP=VVUP*(T(I,J,K)-T(I,J,K+1)+TN(K)-TN(K+1))
370 ! TTLO=VVLO*(T(I,J,K-1)-T(I,J,K)+TN(K-1)-TN(K))
371 ! ADTP=TTLO+TTUP+TN(K)-T(I,J,K)
372 ! WRITE(0,*)' NTSD=',NTSD,' I=',I,' J=',J,' K=',K &
374 ! WRITE(0,*)' T=',T(I,J,K),' TN=',TN(K) &
375 ! &, ' VAD_TEND_T=',VAD_TEND_T(I,J,K)
380 ! VVUP=PVVUP/(DETA1_PDTOP(KTS)+DETA2(KTS)*PDOP)
381 ! TTUP=VVUP*(T(I,J,KTS)-T(I,J,KTS+1)+TN(KTS)-TN(KTS+1))
382 ! ADTP=TTUP+TN(KTS)-T(I,J,KTS)
383 ! WRITE(0,*)' NTSD=',NTSD,' I=',I,' J=',J,' K=',KTS &
385 ! WRITE(0,*)' T=',T(I,J,KTS),' TN=',TN(KTS) &
386 ! &, ' VAD_TEND_T=',VAD_TEND_T(I,J,KTS)
391 !-----------------------------------------------------------------------
393 !-----------------------------------------------------------------------
397 !-----------------------------------------------------------------------
399 !*** NOW VERTICAL ADVECTION OF WIND COMPONENTS
401 !-----------------------------------------------------------------------
403 iloop_for_uv: DO I=MYIS1,MYIE1
405 !-----------------------------------------------------------------------
406 !*** EXTRACT U AND V FROM THE COLUMN
407 !-----------------------------------------------------------------------
414 !-----------------------------------------------------------------------
416 PDOPU=(PDSLO(I+IVW(J),J)+PDSLO(I+IVE(J),J))*0.5
417 PDOPV=(PDSLO(I,J-1)+PDSLO(I,J+1))*0.5
418 PVVLOU=(PETDT(I+IVW(J),J,KTE-1)+PETDT(I+IVE(J),J,KTE-1))*DTE
419 PVVLOV=(PETDT(I,J-1,KTE-1)+PETDT(I,J+1,KTE-1))*DTE
420 VVLOU=PVVLOU/(DETA1_PDTOP(KTE)+DETA2(KTE)*PDOPU)
421 VVLOV=PVVLOV/(DETA1_PDTOP(KTE)+DETA2(KTE)*PDOPV)
428 RSTU(KTE)=-VVLOU*WGT1*(U_K(KTE-1)-U_K(KTE))+U_K(KTE)
429 RSTV(KTE)=-VVLOV*WGT1*(V_K(KTE-1)-V_K(KTE))+V_K(KTE)
431 !-----------------------------------------------------------------------
434 RDPU=1./(DETA1_PDTOP(K)+DETA2(K)*PDOPU)
435 RDPV=1./(DETA1_PDTOP(K)+DETA2(K)*PDOPV)
438 PVVLOU=(PETDT(I+IVW(J),J,K-1)+PETDT(I+IVE(J),J,K-1))*DTE
439 PVVLOV=(PETDT(I,J-1,K-1)+PETDT(I,J+1,K-1))*DTE
444 CFU=-VVUPU*WGT2*RCMU(K+1)
445 CFV=-VVUPV*WGT2*RCMV(K+1)
446 CMU=-CRU(K+1)*CFU+(VVUPU-VVLOU)*WGT2+1.
447 CMV=-CRV(K+1)*CFV+(VVUPV-VVLOV)*WGT2+1.
452 RSTU(K)=-RSTU(K+1)*CFU+U_K(K) &
453 & -(U_K(K)-U_K(K+1))*VVUPU*WGT1 &
454 & -(U_K(K-1)-U_K(K))*VVLOU*WGT1
455 RSTV(K)=-RSTV(K+1)*CFV+V_K(K) &
456 & -(V_K(K)-V_K(K+1))*VVUPV*WGT1 &
457 & -(V_K(K-1)-V_K(K))*VVLOV*WGT1
460 !-----------------------------------------------------------------------
462 RDPU=1./(DETA1_PDTOP(KTS)+DETA2(KTS)*PDOPU)
463 RDPV=1./(DETA1_PDTOP(KTS)+DETA2(KTS)*PDOPV)
468 CFU=-VVUPU*WGT2*RCMU(KTS+1)
469 CFV=-VVUPV*WGT2*RCMV(KTS+1)
470 CMU=-CRU(KTS+1)*CFU+VVUPU*WGT2+1.
471 CMV=-CRV(KTS+1)*CFV+VVUPV*WGT2+1.
474 RSTU(KTS)=-(U_K(KTS)-U_K(KTS+1))*VVUPU*WGT1 &
475 & -RSTU(KTS+1)*CFU+U_K(KTS)
476 RSTV(KTS)=-(V_K(KTS)-V_K(KTS+1))*VVUPV*WGT1 &
477 & -RSTV(KTS+1)*CFV+V_K(KTS)
478 UN(KTS)=RSTU(KTS)/CMU
479 VN(KTS)=RSTV(KTS)/CMV
480 VAD_TEND_U(I,J,KTS)=UN(KTS)-U_K(KTS)
481 VAD_TEND_V(I,J,KTS)=VN(KTS)-V_K(KTS)
484 UN(K)=(-CRU(K)*UN(K-1)+RSTU(K))*RCMU(K)
485 VN(K)=(-CRV(K)*VN(K-1)+RSTV(K))*RCMV(K)
486 VAD_TEND_U(I,J,K)=UN(K)-U_K(K)
487 VAD_TEND_V(I,J,K)=VN(K)-V_K(K)
490 !-----------------------------------------------------------------------
491 !*** The following section is only for checking the implicit solution
492 !*** using back-substitution. Remove this section otherwise.
493 !-----------------------------------------------------------------------
495 ! if(ntsd<=10.or.ntsd>=6000)then
496 ! IF(I==ITEST.AND.J==JTEST)THEN
498 ! PDOPU=(PDSLO(I+IVW(J),J)+PDSLO(I+IVE(J),J))*0.5
499 ! PDOPV=(PDSLO(I,J-1)+PDSLO(I,J+1))*0.5
500 ! PVVLOU=(PETDT(I+IVW(J),J,KTE-1) &
501 ! & +PETDT(I+IVE(J),J,KTE-1))*DTE
502 ! PVVLOV=(PETDT(I,J-1,KTE-1) &
503 ! & +PETDT(I,J+1,KTE-1))*DTE
504 ! VVLOU=PVVLOU/(DETA1_PDTOP(KTE)+DETA2(KTE)*PDOPU)
505 ! VVLOV=PVVLOV/(DETA1_PDTOP(KTE)+DETA2(KTE)*PDOPV)
506 ! TULO=VVLOU*(U(I,J,KTE-1)-U(I,J,KTE)+UN(KTE-1)-UN(KTE))
507 ! TVLO=VVLOV*(V(I,J,KTE-1)-V(I,J,KTE)+VN(KTE-1)-VN(KTE))
508 ! ADUP=TULO+UN(KTE)-U(I,J,KTE)
509 ! ADVP=TVLO+VN(KTE)-V(I,J,KTE)
510 ! WRITE(0,*)' NTSD=',NTSD,' I=',I,' J=',J,' K=',KTE &
511 ! &, ' ADUP=',ADUP,' ADVP=',ADVP
512 ! WRITE(0,*)' U=',U(I,J,KTE),' UN=',UN(KTE) &
513 ! &, ' VAD_TEND_U=',VAD_TEND_U(I,KTE) &
514 ! &, ' V=',V(I,J,KTE),' VN=',VN(KTE) &
515 ! &, ' VAD_TEND_V=',VAD_TEND_V(I,KTE)
518 ! DO K=KTE-1,KTS+1,-1
519 ! RDPU=1./(DETA1_PDTOP(K)+DETA2(K)*PDOPU)
520 ! RDPV=1./(DETA1_PDTOP(K)+DETA2(K)*PDOPV)
523 ! PVVLOU=(PETDT(I+IVW(J),J,K-1) &
524 ! & +PETDT(I+IVE(J),J,K-1))*DTE
525 ! PVVLOV=(PETDT(I,J-1,K-1)+PETDT(I,J+1,K-1))*DTE
530 ! TUUP=VVUPU*(U(I,J,K)-U(I,J,K+1)+UN(K)-UN(K+1))
531 ! TVUP=VVUPV*(V(I,J,K)-V(I,J,K+1)+VN(K)-VN(K+1))
532 ! TULO=VVLOU*(U(I,J,K-1)-U(I,J,K)+UN(K-1)-UN(K))
533 ! TVLO=VVLOV*(V(I,J,K-1)-V(I,J,K)+VN(K-1)-VN(K))
534 ! ADUP=TUUP+TULO+UN(K)-U(I,J,K)
535 ! ADVP=TVUP+TVLO+VN(K)-V(I,J,K)
536 ! WRITE(0,*)' NTSD=',NTSD,' I=',ITEST,' J=',JTEST,' K=',K &
537 ! &, ' ADUP=',ADUP,' ADVP=',ADVP
538 ! WRITE(0,*)' U=',U(I,J,K),' UN=',UN(K) &
539 ! &, ' VAD_TEND_U=',VAD_TEND_U(I,K) &
540 ! &, ' V=',V(I,J,K),' VN=',VN(K) &
541 ! &, ' VAD_TEND_V=',VAD_TEND_V(I,K)
547 ! VVUPU=PVVUPU/(DETA1_PDTOP(KTS)+DETA2(KTS)*PDOPU)
548 ! VVUPV=PVVUPV/(DETA1_PDTOP(KTS)+DETA2(KTS)*PDOPV)
549 ! TUUP=VVUPU*(U(I,J,KTS)-U(I,J,KTS+1)+UN(KTS)-UN(KTS+1))
550 ! TVUP=VVUPV*(V(I,J,KTS)-V(I,J,KTS+1)+VN(KTS)-VN(KTS+1))
551 ! ADUP=TUUP+UN(KTS)-U(I,J,KTS)
552 ! ADVP=TVUP+VN(KTS)-V(I,J,KTS)
553 ! WRITE(0,*)' NTSD=',NTSD,' I=',ITEST,' J=',JTEST,' K=',KTS &
554 ! &, ' ADUP=',ADUP,' ADVP=',ADVP
555 ! WRITE(0,*)' U=',U(I,J,KTS),' UN=',UN(KTS) &
556 ! &, ' VAD_TEND_U=',VAD_TEND_U(I,KTS) &
557 ! &, ' V=',V(I,J,KTS),' VN=',VN(KTS) &
558 ! &, ' VAD_TEND_V=',VAD_TEND_V(I,KTS)
563 !-----------------------------------------------------------------------
565 !-----------------------------------------------------------------------
569 !-----------------------------------------------------------------------
573 !-----------------------------------------------------------------------
574 !-----------------------------------------------------------------------
576 !*** COMPUTE HORIZONTAL ADVECTION TENDENCIES.
578 !-----------------------------------------------------------------------
579 !-----------------------------------------------------------------------
581 !$omp& private(adpdx,adpdy,adt,adu,adv,array0,array1,array2,array3 &
582 !$omp& ,array3_x,dpde,f0,f1,f2,f3,fewp,fnep,fnsp,fpp,fsep,hm &
583 !$omp& ,i,ifp,ifq,ii,ipq,isp,ispa,isq,isqa,iup_adh_j,j,k &
584 !$omp& ,knti_adh,n_iupadh_j,n_iupadv_j,n_iuph_j,pp,qp &
585 !$omp& ,rdpd,rdpdx,rdpdy,tew,tne,tns,tse,tst,tta,ttb &
586 !$omp& ,uew,udy,une,uned,uns,use,used,ust &
587 !$omp& ,vdx,vew,vm,vne,vns,vse,vst)
588 !-----------------------------------------------------------------------
590 main_horizontal: DO K=KTS,KTE
592 !-----------------------------------------------------------------------
596 DPDE(I,J)=DETA1_PDTOP(K)+DETA2(K)*PDSLO(I,J)
597 RDPD(I,J)=1./DPDE(I,J)
598 TST(I,J)=T(I,J,K)*FFC+TOLD(I,J,K)*FBC
599 UST(I,J)=U(I,J,K)*FFC+UOLD(I,J,K)*FBC
600 VST(I,J)=V(I,J,K)*FFC+VOLD(I,J,K)*FBC
604 !-----------------------------------------------------------------------
605 !*** MASS FLUXES AND MASS POINT ADVECTION COMPONENTS
606 !*** THE NS AND EW FLUXES IN THE FOLLOWING LOOP ARE ON V POINTS
608 !-----------------------------------------------------------------------
610 DO J=MYJS1_P3,MYJE1_P3
613 ADPDX=DPDE(I+IVW(J),J)+DPDE(I+IVE(J),J)
614 ADPDY=DPDE(I,J-1)+DPDE(I,J+1)
627 TEW(I,J)=FEWP*(TST(I+IVE(J),J)-TST(I+IVW(J),J))
628 TNS(I,J)=FNSP*(TST(I,J+1)-TST(I,J-1))
636 !-----------------------------------------------------------------------
637 !*** DIAGONAL FLUXES AND DIAGONALLY AVERAGED WIND
638 !*** THE NE AND SE FLUXES ARE ASSOCIATED WITH H POINTS
639 !*** (ACTUALLY JUST TO THE NE AND SE OF EACH H POINT).
640 !-----------------------------------------------------------------------
642 DO J=MYJS1_P2,MYJE2_P2
644 FNEP=(UNED(I+IHE(J),J)+UNED(I ,J+1)) &
645 & *(DPDE(I ,J)+DPDE(I+IHE(J),J+1))
647 TNE(I,J)=FNEP*(TST(I+IHE(J),J+1)-TST(I,J))
651 DO J=MYJS2_P2,MYJE1_P2
653 FSEP=(USED(I+IHE(J),J)+USED(I ,J-1)) &
654 & *(DPDE(I ,J)+DPDE(I+IHE(J),J-1))
656 TSE(I,J)=FSEP*(TST(I+IHE(J),J-1)-TST(I,J))
661 !-----------------------------------------------------------------------
662 !*** HORIZONTAL T ADVECTION TENDENCY ADT IS ON H POINTS OF COURSE.
663 !-----------------------------------------------------------------------
667 ADT(I,J)=(TEW(I+IHW(J),J)+TEW(I+IHE(J),J) &
668 & +TNS(I,J-1)+TNS(I,J+1) &
669 & +TNE(I+IHW(J),J-1)+TNE(I,J) &
670 & +TSE(I,J)+TSE(I+IHW(J),J+1)) &
671 & *RDPD(I,J)*FAD(I,J)
676 !-----------------------------------------------------------------------
677 !*** CALCULATION OF MOMENTUM ADVECTION COMPONENTS.
678 !-----------------------------------------------------------------------
680 DO J=MYJS4_P1,MYJE4_P1
683 !-----------------------------------------------------------------------
684 !*** THE NS AND EW FLUXES ARE ON H POINTS FOR U AND V.
685 !-----------------------------------------------------------------------
687 UEW(I,J)=(FEW(I+IHW(J),J,K)+FEW(I+IHE(J),J,K)) &
688 & *(UST(I+IHE(J),J)-UST(I+IHW(J),J))
689 UNS(I,J)=(FNS(I+IHW(J),J,K)+FNS(I+IHE(J),J,K)) &
690 & *(UST(I,J+1)-UST(I,J-1))
691 VEW(I,J)=(FEW(I,J-1,K)+FEW(I,J+1,K)) &
692 & *(VST(I+IHE(J),J)-VST(I+IHW(J),J))
693 VNS(I,J)=(FNS(I,J-1,K)+FNS(I,J+1,K)) &
694 & *(VST(I,J+1)-VST(I,J-1))
696 !-----------------------------------------------------------------------
697 !*** THE FOLLOWING NE AND SE FLUXES ARE TIED TO V POINTS AND ARE
698 !*** LOCATED JUST TO THE NE AND SE OF THE GIVEN I,J.
699 !-----------------------------------------------------------------------
701 UNE(I,J)=(FNE(I+IVW(J),J,K)+FNE(I+IVE(J),J,K)) &
702 & *(UST(I+IVE(J),J+1)-UST(I,J))
703 USE(I,J)=(FSE(I+IVW(J),J,K)+FSE(I+IVE(J),J,K)) &
704 & *(UST(I+IVE(J),J-1)-UST(I,J))
705 VNE(I,J)=(FNE(I,J-1,K)+FNE(I,J+1,K)) &
706 & *(VST(I+IVE(J),J+1)-VST(I,J))
707 VSE(I,J)=(FSE(I,J-1,K)+FSE(I,J+1,K)) &
708 & *(VST(I+IVE(J),J-1)-VST(I,J))
710 !-----------------------------------------------------------------------
715 !-----------------------------------------------------------------------
716 !*** COMPUTE THE ADVECTION TENDENCIES FOR U AND V.
717 !*** THE AD ARRAYS ARE ON THE VELOCITY POINTS.
718 !-----------------------------------------------------------------------
722 ADU(I,J)=(UEW(I+IVW(J),J)+UEW(I+IVE(J),J) &
723 & +UNS(I,J-1)+UNS(I,J+1) &
724 & +UNE(I+IVW(J),J-1)+UNE(I,J) &
725 & +USE(I,J)+USE(I+IVW(J),J+1)) &
726 & *RDPDX(I,J)*FAD(I+IVW(J),J)
728 ADV(I,J)=(VEW(I+IVW(J),J)+VEW(I+IVE(J),J) &
729 & +VNS(I,J-1)+VNS(I,J+1) &
730 & +VNE(I+IVW(J),J-1)+VNE(I,J) &
731 & +VSE(I,J)+VSE(I+IVW(J),J+1)) &
732 & *RDPDY(I,J)*FAD(I+IVW(J),J)
736 !-----------------------------------------------------------------------
738 !*** END OF JANJIC HORIZONTAL ADVECTION
740 !-----------------------------------------------------------------------
742 !*** UPSTREAM ADVECTION OF T
744 !-----------------------------------------------------------------------
746 upstream: IF(UPSTRM)THEN
748 !-----------------------------------------------------------------------
750 !*** COMPUTE UPSTREAM COMPUTATIONS ON THIS TASK'S ROWS.
752 !-----------------------------------------------------------------------
754 jloop_upstream: DO J=MYJS2,MYJE2
756 N_IUPH_J=N_IUP_H(J) ! See explanation in START_DOMAIN_NMM
760 TTA=EMT_LOC(J)*(UST(I,J-1)+UST(I+IHW(J),J) &
761 & +UST(I+IHE(J),J)+UST(I,J+1))
762 TTB=ENT *(VST(I,J-1)+VST(I+IHW(J),J) &
763 & +VST(I+IHE(J),J)+VST(I,J+1))
782 ARRAY0(I,J)=ARRAY3_X-PP-QP
783 ARRAY1(I,J)=PP-ARRAY3_X
784 ARRAY2(I,J)=QP-ARRAY3_X
788 !-----------------------------------------------------------------------
790 N_IUPADH_J=N_IUP_ADH(J)
792 IUP_ADH_J=IUP_ADH(IMS,J)
794 iloop_T: DO II=0,N_IUPH_J-1
804 !-----------------------------------------------------------------------
806 IF(I==IUP_ADH_J)THEN ! Upstream advection T tendencies
819 ADT(I,J)=F0*T(I,J,K) &
820 & +F1*T(I+IHE(J)+IFP,J+ISP,K) &
821 & +F2*T(I+IHE(J)+IFQ,J+ISQ,K) &
822 +F3*T(I+IPQ,J+ISP+ISQ,K)
824 !-----------------------------------------------------------------------
826 IF(KNTI_ADH<N_IUPADH_J)THEN
827 IUP_ADH_J=IUP_ADH(IMS+KNTI_ADH,J)
831 ENDIF ! End of upstream advection T tendency IF block
835 !-----------------------------------------------------------------------
837 !*** UPSTREAM ADVECTION OF VELOCITY COMPONENTS
839 !-----------------------------------------------------------------------
841 N_IUPADV_J=N_IUP_ADV(J)
846 TTA=EM_LOC(J)*UST(I,J)
873 ADU(I,J)=F0*U(I,J,K) &
874 & +F1*U(I+IVE(J)+IFP,J+ISP,K) &
875 & +F2*U(I+IVE(J)+IFQ,J+ISQ,K) &
876 & +F3*U(I+IPQ,J+ISP+ISQ,K)
878 ADV(I,J)=F0*V(I,J,K) &
879 & +F1*V(I+IVE(J)+IFP,J+ISP,K) &
880 & +F2*V(I+IVE(J)+IFQ,J+ISQ,K) &
881 & +F3*V(I+IPQ,J+ISP+ISQ,K)
887 !-----------------------------------------------------------------------
891 !-----------------------------------------------------------------------
893 !*** END OF HORIZONTAL ADVECTION
895 !-----------------------------------------------------------------------
897 !*** NOW SUM THE VERTICAL AND HORIZONTAL TENDENCIES,
898 !*** CURVATURE AND CORIOLIS TERMS.
900 !-----------------------------------------------------------------------
906 ADT(I,J)=(VAD_TEND_T(I,J,K)+2.*ADT(I,J))*HM
908 FPP=CURV(I,J)*2.*UST(I,J)+F(I,J)*2.
909 ADU(I,J)=(VAD_TEND_U(I,J,K)+2.*ADU(I,J)+VST(I,J)*FPP)*VM
910 ADV(I,J)=(VAD_TEND_V(I,J,K)+2.*ADV(I,J)-UST(I,J)*FPP)*VM
914 !-----------------------------------------------------------------------
915 !*** SAVE THE OLD VALUES FOR TIMESTEPPING
916 !-----------------------------------------------------------------------
926 !-----------------------------------------------------------------------
927 !*** FINALLY UPDATE THE PROGNOSTIC VARIABLES
928 !-----------------------------------------------------------------------
932 T(I,J,K)=ADT(I,J)+T(I,J,K)
933 U(I,J,K)=ADU(I,J)+U(I,J,K)
934 V(I,J,K)=ADV(I,J)+V(I,J,K)
938 !-----------------------------------------------------------------------
940 ENDDO main_horizontal
942 !-----------------------------------------------------------------------
946 !-----------------------------------------------------------------------
948 !***********************************************************************
949 SUBROUTINE VAD2(NTSD,DT,IDTAD,DX,DY &
950 & ,AETA1,AETA2,DETA1,DETA2,PDSL,PDTOP,HBM2 &
953 & ,N_IUP_ADH,N_IUP_ADV &
954 & ,IUP_H,IUP_V,IUP_ADH,IUP_ADV &
956 & ,IDS,IDE,JDS,JDE,KDS,KDE &
957 & ,IMS,IME,JMS,JME,KMS,KME &
958 & ,ITS,ITE,JTS,JTE,KTS,KTE)
959 !***********************************************************************
960 !$$$ SUBPROGRAM DOCUMENTATION BLOCK
962 ! SUBPROGRAM: VAD2 VERTICAL ADVECTION OF H2O SUBSTANCE AND TKE
963 ! PRGRMMR: JANJIC ORG: W/NP22 DATE: 96-07-19
966 ! VAD2 CALCULATES THE CONTRIBUTION OF THE VERTICAL ADVECTION
967 ! TO THE TENDENCIES OF WATER SUBSTANCE AND TKE AND THEN UPDATES
968 ! THOSE VARIABLES. AN ANTI-FILTERING TECHNIQUE IS USED.
970 ! PROGRAM HISTORY LOG:
971 ! 96-07-19 JANJIC - ORIGINATOR
972 ! 98-11-02 BLACK - MODIFIED FOR DISTRIBUTED MEMORY
973 ! 99-03-17 TUCCILLO - INCORPORATED MPI_ALLREDUCE FOR GLOBAL SUM
974 ! 02-02-06 BLACK - CONVERTED TO WRF FORMAT
975 ! 02-09-06 WOLFE - MORE CONVERSION TO GLOBAL INDEXING
976 ! 04-11-23 BLACK - THREADED
977 ! 05-12-14 BLACK - CONVERTED FROM IKJ TO IJK
978 ! 07-08-14 janjic - bc & no conservation in the advection step
980 ! USAGE: CALL VAD2 FROM SUBROUTINE SOLVE_NMM
981 ! INPUT ARGUMENT LIST:
983 ! OUTPUT ARGUMENT LIST
987 ! SUBPROGRAMS CALLED:
994 ! LANGUAGE: FORTRAN 90
997 !***********************************************************************
998 !----------------------------------------------------------------------
1002 !----------------------------------------------------------------------
1004 INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
1005 & ,IMS,IME,JMS,JME,KMS,KME &
1006 ,ITS,ITE,JTS,JTE,KTS,KTE
1008 INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW
1009 INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: N_IUP_H,N_IUP_V &
1010 & ,N_IUP_ADH,N_IUP_ADV
1011 INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: IUP_H,IUP_V &
1014 INTEGER,INTENT(IN) :: IDTAD,NTSD
1016 REAL,INTENT(IN) :: DT,DY,PDTOP
1018 REAL,DIMENSION(KMS:KME),INTENT(IN) :: AETA1,AETA2,DETA1,DETA2
1020 REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: DX,HBM2,PDSL
1022 REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: PETDT
1024 REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: CWM,Q,Q2
1026 !*** LOCAL VARIABLES
1027 !----------------------------------------------------------------------
1029 REAL,PARAMETER :: FF1=0.500
1031 LOGICAL,SAVE :: TRADITIONAL=.TRUE.
1033 INTEGER :: I,IRECV,J,JFP,JFQ,K,LAP,LLAP
1035 INTEGER,DIMENSION(KTS:KTE) :: LA
1037 REAL*8 :: ADDT,AFRP,D2PQE,D2PQQ,D2PQW,DEP,DETAP,DQP &
1038 & ,DWP,E00,E4P,EP,EP0,HADDT,HBM2IJ &
1040 & ,rdpdn,rdpup,sfacek,sfacqk,sfacwk,RFC,RR &
1041 & ,SUMNE,SUMNQ,SUMNW,SUMPE,SUMPQ,SUMPW &
1044 REAL,DIMENSION(KTS:KTE) :: AFR,DEL,DQL,DWL,E3,E4,PETDTK &
1045 & ,RFACE,RFACQ,RFACW,Q3,Q4,W3,W4
1047 !-----------------------------------------------------------------------
1048 !***********************************************************************
1049 !-----------------------------------------------------------------------
1053 !-----------------------------------------------------------------------
1055 !$omp& private(afr,afrp,bot,d2pqe,d2pqq,d2pqw,del,dep,detap,dpdn,dpup &
1056 !$omp& ,dql,dqp,dwl,dwp,e00,e3,e4,e4p,ep,ep0,haddt,i,j,k &
1057 !$omp& ,la,lap,llap,petdtk,q00,q3,q4,q4p,qp,qp0,rfacek,rfacqk &
1058 !$omp& ,rfacwk,rfc,rr,sumne,sumnq,sumnw,sumpe,sumpq,sumpw,top &
1059 !$omp& ,w00,w3,w4,w4p,wp,wp0)
1060 !-----------------------------------------------------------------------
1062 main_integration: DO J=MYJS2,MYJE2
1064 !-----------------------------------------------------------------------
1066 main_iloop: DO I=MYIS1_P1,MYIE1_P1
1068 !-----------------------------------------------------------------------
1070 E3(KTE)=Q2(I,J,KTE)*0.5
1073 E3(K)=MAX((Q2(I,J,K+1)+Q2(I,J,K))*0.5,EPSQ2)
1077 Q3(K)=MAX(Q(I,J,K),EPSQ)
1078 W3(K)=MAX(CWM(I,J,K),CLIMIT)
1085 PETDTK(KTE)=PETDT(I,J,KTE-1)*0.5
1088 PETDTK(K)=(PETDT(I,J,K)+PETDT(I,J,K-1))*0.5
1091 PETDTK(KTS)=PETDT(I,J,KTS)*0.5
1095 !-----------------------------------------------------------------------
1096 !*** PERFORM HORIZONTAL AVERAGING OF VERTICAL VELOCITY
1097 !-----------------------------------------------------------------------
1099 PETDTK(KTE)=(PETDT(I+IHW(J-1),J-1,KTE-1) &
1100 & +PETDT(I+IHE(J-1),J-1,KTE-1) &
1101 & +PETDT(I+IHW(J+1),J+1,KTE-1) &
1102 & +PETDT(I+IHE(J+1),J+1,KTE-1) &
1103 & +PETDT(I,J,KTE-1)*4. )*0.0625
1106 PETDTK(K)=(PETDT(I+IHW(J-1),J-1,K-1) &
1107 +PETDT(I+IHE(J-1),J-1,K-1) &
1108 & +PETDT(I+IHW(J+1),J+1,K-1) &
1109 & +PETDT(I+IHE(J+1),J+1,K-1) &
1110 & +PETDT(I+IHW(J-1),J-1,K ) &
1111 & +PETDT(I+IHE(J-1),J-1,K ) &
1112 & +PETDT(I+IHW(J+1),J+1,K ) &
1113 & +PETDT(I+IHE(J+1),J+1,K ) &
1114 & +(PETDT(I,J,K-1)+PETDT(I,J,K))*4. &
1118 PETDTK(KTS)=(PETDT(I+IHW(J-1),J-1,KTS) &
1119 & +PETDT(I+IHE(J-1),J-1,KTS) &
1120 & +PETDT(I+IHW(J+1),J+1,KTS) &
1121 & +PETDT(I+IHE(J+1),J+1,KTS) &
1122 & +PETDT(I,J,KTS)*4. )*0.0625
1126 !-----------------------------------------------------------------------
1128 HADDT=-ADDT*HBM2(I,J)
1142 if(llap.gt.kts-1.and.llap.lt.kte+1) then ! internal and outflow pts.
1144 & /((aeta1(llap)-aeta1(k))*pdtop &
1145 & +(aeta2(llap)-aeta2(k))*pdsl(i,j)))
1146 if(rr.gt.0.999) rr=0.999
1148 AFR(K)=(((FF4*RR+FF3)*RR+FF2)*RR+FF1)*RR
1149 dql(k)=(q3(llap)-q3(k))*rr
1150 dwl(k)=(w3(llap)-w3(k))*rr
1151 del(k)=(e3(llap)-e3(k))*rr
1152 elseif(llap.eq.kts-1) then
1155 !chem /((1.-aeta2(kts))*pdsl(i,j)))
1157 !chem dql(kts)=(epsq -q3(kts))*rr
1158 !chem dwl(kts)=(climit-w3(kts))*rr
1159 !chem del(kts)=(epsq2 -e3(kts))*rr
1168 /(aeta1(kte)*pdtop))
1170 dql(kte)=(epsq -q3(kte))*rr
1171 dwl(kte)=(climit-w3(kte))*rr
1172 del(kte)=(epsq2 -e3(kte))*rr
1176 !-----------------------------------------------------------------------
1184 !-----------------------------------------------------------------------
1185 !*** ANTI-FILTERING STEP
1186 !-----------------------------------------------------------------------
1195 !*** ANTI-FILTERING LIMITERS
1197 antifilter: DO K=KTE-1,KTS+1,-1
1199 DETAP=DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J)
1212 rdpdn=1./((aeta1(k+lap)-aeta1(k))*pdtop &
1213 & +(aeta2(k+lap)-aeta2(k))*pdsl(i,j))
1214 rdpup=1./((aeta1(k)-aeta1(k-lap))*pdtop &
1215 & +(aeta2(k)-aeta2(k-lap))*pdsl(i,j))
1219 d2pqq=((q4(k+lap)-q4p)*rdpdn &
1220 & -(q4p-q4(k-lap))*rdpup)*afrp
1221 d2pqw=((w4(k+lap)-w4p)*rdpdn &
1222 & -(w4p-w4(k-lap))*rdpup)*afrp
1223 d2pqe=((e4(k+lap)-e4p)*rdpdn &
1224 & -(e4p-e4(k-lap))*rdpup)*afrp
1245 QP=MAX(QP,MIN(Q00,QP0))
1246 QP=MIN(QP,MAX(Q00,QP0))
1247 WP=MAX(WP,MIN(W00,WP0))
1248 WP=MIN(WP,MAX(W00,WP0))
1249 EP=MAX(EP,MIN(E00,EP0))
1250 EP=MIN(EP,MAX(E00,EP0))
1285 !-----------------------------------------------------------------------
1295 !-----------------------------------------------------------------------
1296 !*** FIRST MOMENT CONSERVING FACTOR
1297 !-----------------------------------------------------------------------
1299 if(sumpq*(-sumnq).gt.1.e-9) then
1305 if(sumpw*(-sumnw).gt.1.e-9) then
1311 if(sumpe*(-sumne).gt.1.e-9) then
1317 !-----------------------------------------------------------------------
1318 !*** IMPOSE CONSERVATION ON ANTI-FILTERING
1319 !-----------------------------------------------------------------------
1324 if(sfacqk.gt.0.) then
1325 if(sfacqk.ge.1.) then
1326 if(dqp.lt.0.) dqp=dqp/sfacqk
1328 if(dqp.gt.0.) dqp=dqp*sfacqk
1336 if(sfacwk.gt.0.) then
1337 if(sfacwk.ge.1.) then
1338 if(dwp.lt.0.) dwp=dwp/sfacwk
1340 if(dwp.gt.0.) dwp=dwp*sfacwk
1345 cwm(i,j,k)=w4(k)+dwp
1348 if(sfacek.gt.0.) then
1349 if(sfacek.ge.1.) then
1350 if(dep.lt.0.) dep=dep/sfacek
1352 if(dep.gt.0.) dep=dep*sfacek
1360 !-----------------------------------------------------------------------
1362 Q2(I,J,KTE)=MAX(E3(KTE)+E3(KTE)-EPSQ2,EPSQ2)*HBM2IJ &
1363 & +Q2(I,J,KTE)*(1.-HBM2IJ)
1365 Q2(I,J,K)=MAX(E3(K)+E3(K)-Q2(I,J,K+1),EPSQ2)*HBM2IJ &
1366 & +Q2(I,J,K)*(1.-HBM2IJ)
1368 !-----------------------------------------------------------------------
1372 !-----------------------------------------------------------------------
1374 ENDDO main_integration
1376 !-----------------------------------------------------------------------
1381 !-----------------------------------------------------------------------
1383 !-----------------------------------------------------------------------
1384 !***********************************************************************
1386 #if defined(DM_PARALLEL)
1389 & NTSD,DT,IDTAD,DX,DY &
1390 & ,AETA1,AETA2,DETA1,DETA2,PDSL,PDTOP &
1392 & ,Q,Q2,CWM,U,V,Z,HYDRO &
1393 & ,N_IUP_H,N_IUP_V &
1394 & ,N_IUP_ADH,N_IUP_ADV &
1395 & ,IUP_H,IUP_V,IUP_ADH,IUP_ADV &
1396 & ,IHE,IHW,IVE,IVW &
1397 & ,IDS,IDE,JDS,JDE,KDS,KDE &
1398 & ,IMS,IME,JMS,JME,KMS,KME &
1399 & ,ITS,ITE,JTS,JTE,KTS,KTE)
1400 !***********************************************************************
1401 !$$$ SUBPROGRAM DOCUMENTATION BLOCK
1403 ! SUBPROGRAM: HAD2 HORIZONTAL ADVECTION OF H2O AND TKE
1404 ! PRGRMMR: JANJIC ORG: W/NP22 DATE: 96-07-19
1407 ! HAD2 CALCULATES THE CONTRIBUTION OF THE HORIZONTAL ADVECTION
1408 ! TO THE TENDENCIES OF WATER SUBSTANCE AND TKE AND THEN
1409 ! UPDATES THOSE VARIABLES. AN ANTI-FILTERING TECHNIQUE IS USED.
1411 ! PROGRAM HISTORY LOG:
1412 ! 96-07-19 JANJIC - ORIGINATOR
1413 ! 98-11-02 BLACK - MODIFIED FOR DISTRIBUTED MEMORY
1414 ! 99-03-17 TUCCILLO - INCORPORATED MPI_ALLREDUCE FOR GLOBAL SUM
1415 ! 02-02-06 BLACK - CONVERTED TO WRF FORMAT
1416 ! 02-09-06 WOLFE - MORE CONVERSION TO GLOBAL INDEXING
1417 ! 03-05-23 JANJIC - ADDED SLOPE FACTOR
1418 ! 04-11-23 BLACK - THREADED
1419 ! 05-12-14 BLACK - CONVERTED FROM IKJ TO IJK
1420 ! 07-08-14 janjic - no conservation in advection step
1422 ! USAGE: CALL HAD2 FROM SUBROUTINE SOLVE_NMM
1423 ! INPUT ARGUMENT LIST:
1425 ! OUTPUT ARGUMENT LIST
1429 ! SUBPROGRAMS CALLED:
1436 ! LANGUAGE: FORTRAN 90
1439 !***********************************************************************
1440 !-----------------------------------------------------------------------
1444 !-----------------------------------------------------------------------
1446 INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
1447 & ,IMS,IME,JMS,JME,KMS,KME &
1448 & ,ITS,ITE,JTS,JTE,KTS,KTE
1450 INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW
1451 INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: N_IUP_H,N_IUP_V &
1452 & ,N_IUP_ADH,N_IUP_ADV
1453 INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: IUP_H,IUP_V &
1456 !-----------------------------------------------------------------------
1458 INTEGER,INTENT(IN) :: IDTAD,NTSD
1460 REAL,INTENT(IN) :: DT,DY,PDTOP
1462 REAL,DIMENSION(KMS:KME),INTENT(IN) :: AETA1,AETA2,DETA1,DETA2
1464 REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: DX,HBM2,HBM3,PDSL
1466 REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: U,V,Z
1468 REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: CWM,Q,Q2
1470 LOGICAL,INTENT(IN) :: HYDRO
1472 !-----------------------------------------------------------------------
1473 !*** LOCAL VARIABLES
1474 !-----------------------------------------------------------------------
1476 REAL,PARAMETER :: FF1=0.530
1482 #if defined(BIT_FOR_BIT) && defined(DM_PARALLEL) && !defined(STUBMPI)
1483 LOGICAL,EXTERNAL :: WRF_DM_ON_MONITOR
1484 REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME,6) :: XSUMS_L
1485 REAL,DIMENSION(IDS:IDE,JDS:JDE,KDS:KDE,6) :: XSUMS_G
1490 INTEGER :: I,IRECV,J,JFP,JFQ,K,LAP,LLAP,MPI_COMM_COMP
1493 INTEGER,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5,KTS:KTE) :: IFPA,IFPF &
1498 REAL :: ADDT,AFRP,CRIT,D2PQE,D2PQQ,D2PQW,DEP,DESTIJ,DQP,DQSTIJ &
1499 & ,DVOLP,DWP,DWSTIJ,DZA,DZB,E00,E0Q,E1X,E2IJ,E4P,ENH,EP,EP0 &
1500 & ,ESTIJ,FPQ,HAFP,HAFQ,HBM2IJ,HM,PP,PPQ00,Q00,Q0Q &
1501 & ,Q1IJ,Q4P,QP,QP0,QSTIJ,RDY,RFACE,RFACQ,RFACW,RFC &
1502 & ,RFEIJ,RFQIJ,RFWIJ,RR,SLOPAC,SPP,SQP,SSA,SSB,SUMNE,SUMNQ &
1503 & ,SUMNW,SUMPE,SUMPQ,SUMPW,TTA,TTB,W00,W0Q,W1IJ,W4P,WP,WP0 &
1506 DOUBLE PRECISION,DIMENSION(6,KTS:KTE) :: GSUMS,XSUMS
1508 REAL,DIMENSION(KTS:KTE) :: AFR,DEL,DQL,DWL,E3,E4 &
1511 REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5) :: DARE,EMH
1513 REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5,KTS:KTE) :: AFP,AFQ,DEST &
1516 !-----------------------------------------------------------------------
1517 integer :: nunit,ier
1519 !-----------------------------------------------------------------------
1520 !***********************************************************************
1521 !-----------------------------------------------------------------------
1524 SLOPAC=SLOPHT*SQRT(2.)*0.5*50.
1525 CRIT=SLOPAC*REAL(IDTAD)*DT*RDY*1000.
1530 !-----------------------------------------------------------------------
1533 DO J=MYJS_P3,MYJE_P3
1534 DO I=MYIS_P2,MYIE_P2
1535 EMH (I,J)=ADDT/(08.*DX(I,J))
1536 DARE(I,J)=HBM3(I,J)*DX(I,J)*DY
1537 E1(I,J,KTE)=MAX(Q2(I,J,KTE)*0.5,EPSQ2)
1538 E2(I,J,KTE)=E1(I,J,KTE)
1541 !-----------------------------------------------------------------------
1543 !$omp& private(dza,dzb,e1x,fpq,hm,i,j,jfp,jfq,k,pp,qp,ssa,ssb,spp,sqp &
1545 !-----------------------------------------------------------------------
1547 vertical_1: DO K=KTS,KTE
1549 !-----------------------------------------------------------------------
1551 DO J=MYJS_P3,MYJE_P3
1552 DO I=MYIS_P2,MYIE_P2
1553 DVOL(I,J,K)=DARE(I,J)*(DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J))
1554 Q (I,J,K)=MAX(Q (I,J,K),EPSQ)
1555 CWM(I,J,K)=MAX(CWM(I,J,K),CLIMIT)
1556 Q1 (I,J,K)=Q (I,J,K)
1557 W1 (I,J,K)=CWM(I,J,K)
1562 DO J=MYJS_P3,MYJE_P3
1563 DO I=MYIS_P2,MYIE_P2
1564 E1X=(Q2(I,J,K+1)+Q2(I,J,K))*0.5
1565 E1(I,J,K)=MAX(E1X,EPSQ2)
1571 !-----------------------------------------------------------------------
1573 DO J=MYJS2_P1,MYJE2_P1
1574 DO I=MYIS1_P1,MYIE1_P1
1577 TTA=(U(I,J-1,K)+U(I+IHW(J),J,K)+U(I+IHE(J),J,K)+U(I,J+1,K)) &
1579 TTB=(V(I,J-1,K)+V(I+IHW(J),J,K)+V(I+IHE(J),J,K)+V(I,J+1,K)) &
1596 IFPA(I,J,K)=IHE(J)+I+( JFP-1)/2
1597 IFQA(I,J,K)=IHE(J)+I+(-JFQ-1)/2
1602 IFPF(I,J,K)=IHE(J)+I+(-JFP-1)/2
1603 IFQF(I,J,K)=IHE(J)+I+( JFQ-1)/2
1607 ! if(i==111.and.j==438.and.k==1)then
1610 !-----------------------------------------------------------------------
1611 IF(.NOT.HYDRO)THEN ! z currently not available for hydro=.true.
1612 DZA=(Z(IFPA(I,J,K),JFPA(I,J,K),K)-Z(I,J,K))*RDY
1613 DZB=(Z(IFQA(I,J,K),JFQA(I,J,K),K)-Z(I,J,K))*RDY
1615 IF(ABS(DZA)>SLOPAC)THEN
1622 IF(ABS(DZB)>SLOPAC)THEN
1631 !-----------------------------------------------------------------------
1637 AFP(I,J,K)=(((FF4*PP+FF3)*PP+FF2)*PP+FF1)*PP
1638 AFQ(I,J,K)=(((FF4*QP+FF3)*QP+FF2)*QP+FF1)*QP
1640 Q1(I,J,K)=(Q (IFPA(I,J,K),JFPA(I,J,K),K)-Q (I,J,K))*PP &
1641 & +(Q (IFQA(I,J,K),JFQA(I,J,K),K)-Q (I,J,K))*QP &
1642 & +(Q (I,J-2,K)+Q (I,J+2,K) &
1643 & -Q (I-1,J,K)-Q (I+1,J,K))*FPQ &
1646 W1(I,J,K)=(CWM(IFPA(I,J,K),JFPA(I,J,K),K)-CWM(I,J,K))*PP &
1647 & +(CWM(IFQA(I,J,K),JFQA(I,J,K),K)-CWM(I,J,K))*QP &
1648 & +(CWM(I,J-2,K)+CWM(I,J+2,K) &
1649 & -CWM(I-1,J,K)-CWM(I+1,J,K))*FPQ &
1652 E2(I,J,K)=(E1 (IFPA(I,J,K),JFPA(I,J,K),K)-E1 (I,J,K))*PP &
1653 & +(E1 (IFQA(I,J,K),JFQA(I,J,K),K)-E1 (I,J,K))*QP &
1654 & +(E1 (I,J-2,K)+E1 (I,J+2,K) &
1655 & -E1 (I-1,J,K)-E1 (I+1,J,K))*FPQ &
1661 !-----------------------------------------------------------------------
1665 !-----------------------------------------------------------------------
1666 !*** ANTI-FILTERING STEP
1667 !-----------------------------------------------------------------------
1677 !-----------------------------------------------------------------------
1679 !*** ANTI-FILTERING LIMITERS
1681 !-----------------------------------------------------------------------
1682 #if defined(BIT_FOR_BIT) && defined(DM_PARALLEL) && !defined(STUBMPI)
1686 !$omp& private(i,j,k)
1696 !$omp& private(i,j,k)
1708 !-----------------------------------------------------------------------
1710 !$omp& private(d2pqe,d2pqq,d2pqw,destij,dqstij,dvolp,dwstij &
1711 !$omp& ,e00,e0q,e2ij,ep0,estij,hafp,hafq,i,j,k &
1712 !$omp& ,q00,q0q,q1ij,qp0,qstij,w00,w0q,w1ij,wp0,wstij)
1713 !-----------------------------------------------------------------------
1715 vertical_2: DO K=KTS,KTE
1717 !-----------------------------------------------------------------------
1730 D2PQQ=(Q1(IFPA(I,J,K),JFPA(I,J,K),K)-Q1IJ &
1731 & -Q1IJ+Q1(IFPF(I,J,K),JFPF(I,J,K),K)) &
1733 & +(Q1(IFQA(I,J,K),JFQA(I,J,K),K)-Q1IJ &
1734 & -Q1IJ+Q1(IFQF(I,J,K),JFQF(I,J,K),K)) &
1737 D2PQW=(W1(IFPA(I,J,K),JFPA(I,J,K),K)-W1IJ &
1738 & -W1IJ+W1(IFPF(I,J,K),JFPF(I,J,K),K)) &
1740 & +(W1(IFQA(I,J,K),JFQA(I,J,K),K)-W1IJ &
1741 & -W1IJ+W1(IFQF(I,J,K),JFQF(I,J,K),K)) &
1744 D2PQE=(E2(IFPA(I,J,K),JFPA(I,J,K),K)-E2IJ &
1745 & -E2IJ+E2(IFPF(I,J,K),JFPF(I,J,K),K)) &
1747 & +(E2(IFQA(I,J,K),JFQA(I,J,K),K)-E2IJ &
1748 & -E2IJ+E2(IFQF(I,J,K),JFQF(I,J,K),K)) &
1756 QP0=Q (IFPA(I,J,K),JFPA(I,J,K),K)
1757 Q0Q=Q (IFQA(I,J,K),JFQA(I,J,K),K)
1760 WP0=CWM(IFPA(I,J,K),JFPA(I,J,K),K)
1761 W0Q=CWM(IFQA(I,J,K),JFQA(I,J,K),K)
1764 EP0=E1 (IFPA(I,J,K),JFPA(I,J,K),K)
1765 E0Q=E1 (IFQA(I,J,K),JFQA(I,J,K),K)
1767 QSTIJ=MAX(QSTIJ,MIN(Q00,QP0,Q0Q))
1768 QSTIJ=MIN(QSTIJ,MAX(Q00,QP0,Q0Q))
1769 WSTIJ=MAX(WSTIJ,MIN(W00,WP0,W0Q))
1770 WSTIJ=MIN(WSTIJ,MAX(W00,WP0,W0Q))
1771 ESTIJ=MAX(ESTIJ,MIN(E00,EP0,E0Q))
1772 ESTIJ=MIN(ESTIJ,MAX(E00,EP0,E0Q))
1774 ! DQSTIJ=QSTIJ-Q(I,J,K)
1775 ! DWSTIJ=WSTIJ-CWM(I,J,K)
1776 ! DESTIJ=ESTIJ-E1(I,J,K)
1778 dqstij=qstij-q1(i,j,k)
1779 dwstij=wstij-w1(i,j,k)
1780 destij=estij-e2(i,j,k)
1790 !-----------------------------------------------------------------------
1791 #if defined(BIT_FOR_BIT) && defined(DM_PARALLEL) && !defined(STUBMPI)
1792 !-----------------------------------------------------------------------
1798 XSUMS_L(I,J,K,1)=DQSTIJ
1800 XSUMS_L(I,J,K,2)=DQSTIJ
1804 XSUMS_L(I,J,K,3)=DWSTIJ
1806 XSUMS_L(I,J,K,4)=DWSTIJ
1810 XSUMS_L(I,J,K,5)=DESTIJ
1812 XSUMS_L(I,J,K,6)=DESTIJ
1814 !-----------------------------------------------------------------------
1816 !-----------------------------------------------------------------------
1818 XSUMS(1,K)=XSUMS(1,K)+DQSTIJ
1820 XSUMS(2,K)=XSUMS(2,K)+DQSTIJ
1824 XSUMS(3,K)=XSUMS(3,K)+DWSTIJ
1826 XSUMS(4,K)=XSUMS(4,K)+DWSTIJ
1830 XSUMS(5,K)=XSUMS(5,K)+DESTIJ
1832 XSUMS(6,K)=XSUMS(6,K)+DESTIJ
1834 !-----------------------------------------------------------------------
1836 !-----------------------------------------------------------------------
1841 !-----------------------------------------------------------------------
1845 !-----------------------------------------------------------------------
1846 #if defined(BIT_FOR_BIT) && defined(DM_PARALLEL) && !defined(STUBMPI)
1847 !-----------------------------------------------------------------------
1849 CALL WRF_PATCH_TO_GLOBAL_REAL(XSUMS_L(IMS,JMS,KMS,N) &
1850 &, XSUMS_G(1,1,1,N),DOMDESC &
1852 &, IDS,IDE,JDS,JDE,KDS,KDE &
1853 &, IMS,IME,JMS,JME,KMS,KME &
1854 &, ITS,ITE,JTS,JTE,KTS,KTE)
1863 IF(WRF_DM_ON_MONITOR())THEN
1866 !$omp& private(i,j,k)
1870 GSUMS(N,K)=GSUMS(N,K)+XSUMS_G(I,J,K,N)
1877 CALL WRF_DM_BCAST_BYTES(GSUMS,2*RWORDSIZE*6*(KTE-KTS+1) )
1879 !-----------------------------------------------------------------------
1881 !-----------------------------------------------------------------------
1883 !-----------------------------------------------------------------------
1884 !*** GLOBAL REDUCTION
1885 !-----------------------------------------------------------------------
1887 # if defined(DM_PARALLEL) && !defined(STUBMPI)
1888 CALL WRF_GET_DM_COMMUNICATOR(MPI_COMM_COMP)
1889 CALL MPI_ALLREDUCE(XSUMS,GSUMS,6*(KTE-KTS+1) &
1890 & ,MPI_DOUBLE_PRECISION,MPI_SUM &
1891 & ,MPI_COMM_COMP,IRECV)
1895 GSUMS(N,K)=XSUMS(N,K)
1900 !-----------------------------------------------------------------------
1902 !-----------------------------------------------------------------------
1904 !-----------------------------------------------------------------------
1905 !*** END OF GLOBAL REDUCTION
1906 !-----------------------------------------------------------------------
1910 !!! call int_get_fresh_handle(nunit)
1913 !!! open(unit=nunit,file='gsums',form='unformatted',iostat=ier)
1916 !-----------------------------------------------------------------------
1918 !$omp& private(destij,dqstij,dwstij,i,j,k,rface,rfacq,rfacw &
1919 !$omp& ,rfeij,rfqij,rfwij,sumne,sumnq,sumnw,sumpe,sumpq,sumpw)
1920 !-----------------------------------------------------------------------
1922 vertical_3: DO K=KTS,KTE
1924 !-----------------------------------------------------------------------
1926 ! write(nunit)(gsums(i,k),i=1,6)
1928 !!! read(nunit)(gsums(i,k),i=1,6)
1929 !-----------------------------------------------------------------------
1938 !-----------------------------------------------------------------------
1939 !*** FIRST MOMENT CONSERVING FACTOR
1940 !-----------------------------------------------------------------------
1960 IF(RFACQ<CONSERVE_MIN.OR.RFACQ>CONSERVE_MAX)RFACQ=1.
1961 IF(RFACW<CONSERVE_MIN.OR.RFACW>CONSERVE_MAX)RFACW=1.
1962 IF(RFACE<CONSERVE_MIN.OR.RFACE>CONSERVE_MAX)RFACE=1.
1964 !-----------------------------------------------------------------------
1965 ! if(mype==0.and.ntsd==181)close(nunit)
1966 !-----------------------------------------------------------------------
1968 !-----------------------------------------------------------------------
1969 !*** IMPOSE CONSERVATION ON ANTI-FILTERING
1970 !-----------------------------------------------------------------------
1976 RFQIJ=HBM2(I,J)*(RFACQ-1.)+1.
1977 IF(DQSTIJ>=0.)DQSTIJ=DQSTIJ*RFQIJ
1978 q(i,j,k)=q1(i,j,k)+dqstij
1985 RFQIJ=HBM2(I,J)*(RFACQ-1.)+1.
1986 IF(DQSTIJ<0.)DQSTIJ=DQSTIJ/RFQIJ
1987 q(i,j,k)=q1(i,j,k)+dqstij
1992 !-----------------------------------------------------------------------
1998 RFWIJ=HBM2(I,J)*(RFACW-1.)+1.
1999 IF(DWSTIJ>=0.)DWSTIJ=DWSTIJ*RFWIJ
2000 cwm(i,j,k)=w1(i,j,k)+dwstij
2007 RFWIJ=HBM2(I,J)*(RFACW-1.)+1.
2008 IF(DWSTIJ<0.)DWSTIJ=DWSTIJ/RFWIJ
2009 cwm(i,j,k)=w1(i,j,k)+dwstij
2014 !-----------------------------------------------------------------------
2020 RFEIJ=HBM2(I,J)*(RFACE-1.)+1.
2021 IF(DESTIJ>=0.)DESTIJ=DESTIJ*RFEIJ
2022 e1(i,j,k)=e2(i,j,k)+destij
2029 RFEIJ=HBM2(I,J)*(RFACE-1.)+1.
2030 IF(DESTIJ<0.)DESTIJ=DESTIJ/RFEIJ
2031 e1(i,j,k)=e2(i,j,k)+destij
2036 !-----------------------------------------------------------------------
2040 Q (I,J,K)=MAX(Q (I,J,K),EPSQ)
2041 CWM(I,J,K)=MAX(CWM(I,J,K),CLIMIT)
2045 !-----------------------------------------------------------------------
2049 !-----------------------------------------------------------------------
2055 Q2(I,J,KTE)=MAX(E1(I,J,KTE)+E1(I,J,KTE)-EPSQ2,EPSQ2)
2059 !-----------------------------------------------------------------------
2067 Q2(I,J,K)=MAX(E1(I,J,K)+E1(I,J,K)-Q2(I,J,K+1),EPSQ2)
2069 Q2(I,J,K)=Q2(I,J,K+1)
2074 !-----------------------------------------------------------------------
2078 !-----------------------------------------------------------------------
2079 !***********************************************************************
2080 !-----------------------------------------------------------------------
2081 ! New routines added by Georg Grell to handle advection more like ARW
2082 ! core. Instead of VAD2/HAD2 that advect TKE, specific humidity, and
2083 ! condensed water species all in one routine, we call VAD2/HAD2_SCAL
2084 ! with multidimensioned arrays to advect each variable. For purposes
2085 ! here, solve_nmm.F calls this routine once for TKE, then again for
2086 ! all the species held in the moist array (qv, qc, qi, qr, qs, qg),
2087 ! then call again for number concentrations held in scalar array (qni).
2088 ! The dummy argument lstart is the starting index of the multidimensioned
2089 ! array for starting the advection since the 1st index of moist and
2090 ! scalar are actually empty placeholders (and the 2nd element is vapor,
2091 ! then qc, etc.) When calling with single 3D array (like TKE), just
2092 ! set NUM_SCAL=1 and lstart=1. The variable to advect is called SCAL
2094 !***********************************************************************
2095 SUBROUTINE VAD2_SCAL(NTSD,DT,IDTAD,DX,DY &
2096 & ,AETA1,AETA2,DETA1,DETA2,PDSL,PDTOP &
2099 & ,N_IUP_H,N_IUP_V &
2100 & ,N_IUP_ADH,N_IUP_ADV &
2101 & ,IUP_H,IUP_V,IUP_ADH,IUP_ADV &
2102 & ,IHE,IHW,IVE,IVW &
2103 & ,NUM_SCAL,LSTART &
2104 & ,IDS,IDE,JDS,JDE,KDS,KDE &
2105 & ,IMS,IME,JMS,JME,KMS,KME &
2106 & ,ITS,ITE,JTS,JTE,KTS,KTE)
2107 !***********************************************************************
2108 !$$$ SUBPROGRAM DOCUMENTATION BLOCK
2110 ! SUBPROGRAM: VAD2_SCAL VERTICAL ADVECTION OF SCALARS
2112 ! PRGRMMR: JANJIC ORG: W/NP22 DATE: 96-07-19
2113 ! GRELL,PECKHAM ORG: NOAA/FSL DATE: 05-02-03
2116 ! VAD2_SCAL CALCULATES THE CONTRIBUTION OF THE VERTICAL ADVECTION
2117 ! TO THE TENDENCIES OF SCALAR SUBSTANCES AND THEN UPDATES
2118 ! THOSE VARIABLES. AN ANTI-FILTERING TECHNIQUE IS USED.
2120 ! PROGRAM HISTORY LOG:
2121 ! 96-07-19 JANJIC - ORIGINATOR
2122 ! 05-02-03 GRELL,PECKHAM - MODIFIED FOR SCALARS
2124 ! USAGE: CALL VAD2_SCAL FROM SUBROUTINE SOLVE_NMM
2125 ! INPUT ARGUMENT LIST:
2127 ! OUTPUT ARGUMENT LIST
2131 ! SUBPROGRAMS CALLED:
2138 ! LANGUAGE: FORTRAN 90
2141 !***********************************************************************
2142 !----------------------------------------------------------------------
2146 !----------------------------------------------------------------------
2148 INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
2149 & ,IMS,IME,JMS,JME,KMS,KME &
2150 ,ITS,ITE,JTS,JTE,KTS,KTE
2152 INTEGER,INTENT(IN) :: LSTART,NUM_SCAL
2154 INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW
2155 INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: N_IUP_H,N_IUP_V &
2156 & ,N_IUP_ADH,N_IUP_ADV
2157 INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: IUP_H,IUP_V &
2160 INTEGER,INTENT(IN) :: IDTAD,NTSD
2162 REAL,INTENT(IN) :: DT,DY,PDTOP
2164 REAL,DIMENSION(KMS:KME),INTENT(IN) :: AETA1,AETA2,DETA1,DETA2
2166 REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: DX,HBM2,PDSL
2168 REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: PETDT
2170 REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME,1:NUM_SCAL) &
2171 ,INTENT(INOUT) :: SCAL
2173 !----------------------------------------------------------------------
2174 !*** LOCAL VARIABLES
2175 !----------------------------------------------------------------------
2177 REAL,PARAMETER :: FF1=0.500
2179 LOGICAL,SAVE :: TRADITIONAL=.TRUE.
2181 INTEGER :: I,IRECV,J,JFP,JFQ,K,L,LAP,LLAP
2183 INTEGER,DIMENSION(KTS:KTE) :: LA
2185 REAL*8 :: ADDT,AFRP,D2PQQ,DETAP,DPDN,DPUP,DQP &
2193 REAL,DIMENSION(KTS:KTE) :: AFR,DEL,DQL,DWL,E3,E4,PETDTK &
2194 & ,RFACE,RFACQ,RFACW,Q3,Q4,W3,W4
2196 !-----------------------------------------------------------------------
2197 !***********************************************************************
2198 !-----------------------------------------------------------------------
2202 !-----------------------------------------------------------------------
2204 !$omp& private(afr,afrp,d2pqq,detap,dpdn,dpup &
2205 !$omp& ,dql,dqp,haddt,i,j,k &
2206 !$omp& ,la,lap,llap,petdtk,q00,q3,q4,q4p,qp,qp0,rfacqk &
2207 !$omp& ,rfc,rr,sfacqk,sumnq,sumpq)
2208 !-----------------------------------------------------------------------
2210 scalar_loop: DO L=LSTART,NUM_SCAL
2212 main_integration: DO J=MYJS2,MYJE2
2214 !-----------------------------------------------------------------------
2216 main_iloop: DO I=MYIS1_P1,MYIE1_P1
2218 !-----------------------------------------------------------------------
2226 PETDTK(KTE)=PETDT(I,J,KTE-1)*0.5
2229 PETDTK(K)=(PETDT(I,J,K)+PETDT(I,J,K-1))*0.5
2232 PETDTK(KTS)=PETDT(I,J,KTS)*0.5
2236 !-----------------------------------------------------------------------
2237 !*** PERFORM HORIZONTAL AVERAGING OF VERTICAL VELOCITY
2238 !-----------------------------------------------------------------------
2240 PETDTK(KTE)=(PETDT(I+IHW(J-1),J-1,KTE-1) &
2241 & +PETDT(I+IHE(J-1),J-1,KTE-1) &
2242 & +PETDT(I+IHW(J+1),J+1,KTE-1) &
2243 & +PETDT(I+IHE(J+1),J+1,KTE-1) &
2244 & +PETDT(I,J,KTE-1)*4. )*0.0625
2247 PETDTK(K)=(PETDT(I+IHW(J-1),J-1,K-1) &
2248 +PETDT(I+IHE(J-1),J-1,K-1) &
2249 & +PETDT(I+IHW(J+1),J+1,K-1) &
2250 & +PETDT(I+IHE(J+1),J+1,K-1) &
2251 & +PETDT(I+IHW(J-1),J-1,K ) &
2252 & +PETDT(I+IHE(J-1),J-1,K ) &
2253 & +PETDT(I+IHW(J+1),J+1,K ) &
2254 & +PETDT(I+IHE(J+1),J+1,K ) &
2255 & +(PETDT(I,J,K-1)+PETDT(I,J,K))*4. &
2259 PETDTK(KTS)=(PETDT(I+IHW(J-1),J-1,KTS) &
2260 & +PETDT(I+IHE(J-1),J-1,KTS) &
2261 & +PETDT(I+IHW(J+1),J+1,KTS) &
2262 & +PETDT(I+IHE(J+1),J+1,KTS) &
2263 & +PETDT(I,J,KTS)*4. )*0.0625
2267 !-----------------------------------------------------------------------
2269 HADDT=-ADDT*HBM2(I,J)
2283 IF(LLAP>KTS-1.AND.LLAP<KTE+1)THEN
2284 RR=ABS(RR/((AETA1(LLAP)-AETA1(K))*PDTOP &
2285 & +(AETA2(LLAP)-AETA2(K))*PDSL(I,J)))
2288 AFR(K)=(((FF4*RR+FF3)*RR+FF2)*RR+FF1)*RR
2289 DQP=(Q3(LLAP)-Q3(K))*RR
2298 !-----------------------------------------------------------------------
2301 RFC=(DETA1(KTE-1)*PDTOP+DETA2(KTE-1)*PDSL(I,J)) &
2302 & /(DETA1(KTE )*PDTOP+DETA2(KTE )*PDSL(I,J))
2303 DQL(KTE)=-DQL(KTE-1)*RFC
2307 RFC=(DETA1(KTS+1)*PDTOP+DETA2(KTS+1)*PDSL(I,J)) &
2308 & /(DETA1(KTS )*PDTOP+DETA2(KTS )*PDSL(I,J))
2309 DQL(KTS)=-DQL(KTS+1)*RFC
2316 !-----------------------------------------------------------------------
2317 !*** ANTI-FILTERING STEP
2318 !-----------------------------------------------------------------------
2323 !*** ANTI-FILTERING LIMITERS
2325 antifilter: DO K=KTE-1,KTS+1,-1
2327 DETAP=DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J)
2333 DPDN=(AETA1(K+LAP)-AETA1(K))*PDTOP &
2334 & +(AETA2(K+LAP)-AETA2(K))*PDSL(I,J)
2335 DPUP=(AETA1(K)-AETA1(K-LAP))*PDTOP &
2336 & +(AETA2(K)-AETA2(K-LAP))*PDSL(I,J)
2338 AFRP=2.*AFR(K)*DPDN*DPDN/(DPDN+DPUP)
2339 D2PQQ=((Q4(K+LAP)-Q4P)/DPDN &
2340 & -(Q4P-Q4(K-LAP))/DPUP)*AFRP
2347 QP=MAX(QP,MIN(Q00,QP0))
2348 QP=MIN(QP,MAX(Q00,QP0))
2356 !-----------------------------------------------------------------------
2359 RFC=(DETA1(KTE-1)*PDTOP+DETA2(KTE-1)*PDSL(I,J)) &
2360 & /(DETA1(KTE )*PDTOP+DETA2(KTE )*PDSL(I,J))
2361 DQL(KTE)=-DQL(KTE-1)*RFC+DQL(KTE)
2365 RFC=(DETA1(KTS+1)*PDTOP+DETA2(KTS+1)*PDSL(I,J)) &
2366 & /(DETA1(KTS )*PDTOP+DETA2(KTS )*PDSL(I,J))
2367 DQL(KTS)=-DQL(KTS+1)*RFC+DQL(KTS)
2371 DETAP=DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J)
2381 !-----------------------------------------------------------------------
2382 !*** FIRST MOMENT CONSERVING FACTOR
2383 !-----------------------------------------------------------------------
2391 IF(SFACQK<CONSERVE_MIN.OR.SFACQK>CONSERVE_MAX)SFACQK=1.
2395 !-----------------------------------------------------------------------
2396 !*** IMPOSE CONSERVATION ON ANTI-FILTERING
2397 !-----------------------------------------------------------------------
2402 IF(DQP<0.)DQP=DQP*RFACQK
2404 IF(DQP>0.)DQP=DQP*SFACQK
2406 SCAL(I,J,K,L)=Q3(K)+DQP
2409 !-----------------------------------------------------------------------
2413 !-----------------------------------------------------------------------
2415 ENDDO main_integration
2417 !-----------------------------------------------------------------------
2421 !-----------------------------------------------------------------------
2423 END SUBROUTINE VAD2_SCAL
2425 !-----------------------------------------------------------------------
2427 !***********************************************************************
2428 SUBROUTINE HAD2_SCAL( &
2429 #if defined(DM_PARALLEL)
2432 & NTSD,DT,IDTAD,DX,DY &
2433 & ,AETA1,AETA2,DETA1,DETA2,PDSL,PDTOP &
2435 & ,SCAL,U,V,Z,HYDRO &
2436 & ,N_IUP_H,N_IUP_V &
2437 & ,N_IUP_ADH,N_IUP_ADV &
2438 & ,IUP_H,IUP_V,IUP_ADH,IUP_ADV &
2439 & ,IHE,IHW,IVE,IVW &
2440 & ,NUM_SCAL,LSTART &
2441 & ,IDS,IDE,JDS,JDE,KDS,KDE &
2442 & ,IMS,IME,JMS,JME,KMS,KME &
2443 & ,ITS,ITE,JTS,JTE,KTS,KTE)
2444 !***********************************************************************
2445 !$$$ SUBPROGRAM DOCUMENTATION BLOCK
2447 ! SUBPROGRAM: HAD2_SCAL HORIZONTAL ADVECTION OF SCALAR
2448 ! PRGRMMR: JANJIC ORG: W/NP22 DATE: 96-07-19
2449 ! GRELL,PECKHAM ORG: NOAA/FSL DATE: 05-02-03
2452 ! HAD2_SCAL CALCULATES THE CONTRIBUTION OF THE HORIZONTAL ADVECTION
2453 ! TO THE TENDENCIES OF SCALAR SUBSTANCES AND THEN
2454 ! UPDATES THOSE VARIABLES. AN ANTI-FILTERING TECHNIQUE IS USED.
2456 ! PROGRAM HISTORY LOG:
2457 ! 96-07-19 JANJIC - ORIGINATOR
2458 ! 05-01-03 GRELL,PECKHAM - MODIFIED FOR SCALAR
2460 ! USAGE: CALL HAD2_SCAL FROM SUBROUTINE SOLVE_NMM
2461 ! INPUT ARGUMENT LIST:
2463 ! OUTPUT ARGUMENT LIST
2467 ! SUBPROGRAMS CALLED:
2474 ! LANGUAGE: FORTRAN 90
2477 !***********************************************************************
2478 !-----------------------------------------------------------------------
2482 !-----------------------------------------------------------------------
2484 INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
2485 & ,IMS,IME,JMS,JME,KMS,KME &
2486 & ,ITS,ITE,JTS,JTE,KTS,KTE
2488 INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW
2489 INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: N_IUP_H,N_IUP_V &
2490 & ,N_IUP_ADH,N_IUP_ADV
2491 INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: IUP_H,IUP_V &
2494 !-----------------------------------------------------------------------
2496 INTEGER,INTENT(IN) :: IDTAD,LSTART,NTSD,NUM_SCAL
2498 REAL,INTENT(IN) :: DT,DY,PDTOP
2500 REAL,DIMENSION(KMS:KME),INTENT(IN) :: AETA1,AETA2,DETA1,DETA2
2502 REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: DX,HBM2,HBM3,PDSL
2504 REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: U,V,Z
2506 REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME,1:NUM_SCAL) &
2507 ,INTENT(INOUT) :: SCAL
2509 LOGICAL,INTENT(IN) :: HYDRO
2511 !-----------------------------------------------------------------------
2512 !*** LOCAL VARIABLES
2513 !-----------------------------------------------------------------------
2515 REAL,PARAMETER :: FF1=0.530
2521 #if defined(BIT_FOR_BIT) && defined(DM_PARALLEL) && !defined(STUBMPI)
2522 LOGICAL,EXTERNAL :: WRF_DM_ON_MONITOR
2523 REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME,2) :: XSUMS_L
2524 REAL,DIMENSION(IDS:IDE,JDS:JDE,KDS:KDE,2) :: XSUMS_G
2529 INTEGER :: I,IRECV,J,JFP,JFQ,K,L,LAP,LLAP,MPI_COMM_COMP
2532 INTEGER,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5,KTS:KTE) :: IFPA,IFPF &
2537 REAL :: ADDT,AFRP,CRIT,D2PQE,D2PQQ,D2PQW,DEP,DESTIJ,DQP,DQSTIJ &
2538 & ,DVOLP,DWP,DWSTIJ,DZA,DZB,E00,E0Q,E1X,E2IJ,E4P,ENH,EP,EP0 &
2539 & ,ESTIJ,FPQ,HAFP,HAFQ,HBM2IJ,HM,PP,PPQ00,Q00,Q0Q &
2540 & ,Q1IJ,Q4P,QP,QP0,QSTIJ,RDY,RFACE,RFACQ,RFACW,RFC &
2541 & ,RFEIJ,RFQIJ,RFWIJ,RR,SLOPAC,SPP,SQP,SSA,SSB,SUMNQ,SUMPQ &
2542 & ,TTA,TTB,W00,W0Q,W1IJ,W4P,WP,WP0,WSTIJ
2544 DOUBLE PRECISION,DIMENSION(2,KTS:KTE) :: GSUMS,XSUMS
2546 REAL,DIMENSION(KTS:KTE) :: AFR,DEL,DQL,DWL,Q3,Q4
2548 REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5) :: DARE,EMH
2550 REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5,KTS:KTE) :: AFP,AFQ,DEST &
2554 REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME) :: Q
2556 !-----------------------------------------------------------------------
2557 integer :: nunit,ier
2559 !-----------------------------------------------------------------------
2560 !***********************************************************************
2561 !-----------------------------------------------------------------------
2564 SLOPAC=SLOPHT*SQRT(2.)*0.5*50.
2565 CRIT=SLOPAC*REAL(IDTAD)*DT*RDY*1000.
2570 !-----------------------------------------------------------------------
2573 DO J=MYJS_P3,MYJE_P3
2574 DO I=MYIS_P2,MYIE_P2
2575 EMH (I,J)=ADDT/(08.*DX(I,J))
2576 DARE(I,J)=HBM3(I,J)*DX(I,J)*DY
2579 !-----------------------------------------------------------------------
2581 scalar_loop: DO L=LSTART,NUM_SCAL
2583 !-----------------------------------------------------------------------
2585 !$omp& private(dza,dzb,e1x,fpq,hm,i,j,jfp,jfq,k,pp,qp,ssa,ssb,spp,sqp &
2587 !-----------------------------------------------------------------------
2589 vertical_1: DO K=KTS,KTE
2591 !-----------------------------------------------------------------------
2593 DO J=MYJS_P3,MYJE_P3
2594 DO I=MYIS_P2,MYIE_P2
2595 DVOL(I,J,K)=DARE(I,J)*(DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J))
2596 Q (I,J,K)=SCAL(I,J,K,L)
2601 !-----------------------------------------------------------------------
2603 DO J=MYJS2_P1,MYJE2_P1
2604 DO I=MYIS1_P1,MYIE1_P1
2607 TTA=(U(I,J-1,K)+U(I+IHW(J),J,K)+U(I+IHE(J),J,K)+U(I,J+1,K)) &
2609 TTB=(V(I,J-1,K)+V(I+IHW(J),J,K)+V(I+IHE(J),J,K)+V(I,J+1,K)) &
2626 IFPA(I,J,K)=IHE(J)+I+( JFP-1)/2
2627 IFQA(I,J,K)=IHE(J)+I+(-JFQ-1)/2
2632 IFPF(I,J,K)=IHE(J)+I+(-JFP-1)/2
2633 IFQF(I,J,K)=IHE(J)+I+( JFQ-1)/2
2638 !-----------------------------------------------------------------------
2639 IF(.NOT.HYDRO)THEN ! z currently not available for hydro=.true.
2640 DZA=(Z(IFPA(I,J,K),JFPA(I,J,K),K)-Z(I,J,K))*RDY
2641 DZB=(Z(IFQA(I,J,K),JFQA(I,J,K),K)-Z(I,J,K))*RDY
2643 IF(ABS(DZA)>SLOPAC)THEN
2650 IF(ABS(DZB)>SLOPAC)THEN
2659 !-----------------------------------------------------------------------
2665 AFP(I,J,K)=(((FF4*PP+FF3)*PP+FF2)*PP+FF1)*PP
2666 AFQ(I,J,K)=(((FF4*QP+FF3)*QP+FF2)*QP+FF1)*QP
2668 Q1(I,J,K)=(Q (IFPA(I,J,K),JFPA(I,J,K),K)-Q (I,J,K))*PP &
2669 & +(Q (IFQA(I,J,K),JFQA(I,J,K),K)-Q (I,J,K))*QP &
2670 & +(Q (I,J-2,K)+Q (I,J+2,K) &
2671 & -Q (I-1,J,K)-Q (I+1,J,K))*FPQ &
2677 !-----------------------------------------------------------------------
2681 !-----------------------------------------------------------------------
2682 !*** ANTI-FILTERING STEP
2683 !-----------------------------------------------------------------------
2690 !-----------------------------------------------------------------------
2692 !*** ANTI-FILTERING LIMITERS
2694 !-----------------------------------------------------------------------
2695 #if defined(BIT_FOR_BIT) && defined(DM_PARALLEL) && !defined(STUBMPI)
2699 !$omp& private(i,j,k)
2709 !$omp& private(i,j,k)
2721 !-----------------------------------------------------------------------
2723 !$omp& private(d2pqe,d2pqq,d2pqw,destij,dqstij,dvolp,dwstij &
2724 !$omp& ,e00,e0q,ep0,estij,hafp,hafq,i,j,k &
2725 !$omp& ,q00,q0q,q1ij,qp0,qstij,w00,w0q,wp0,wstij)
2726 !-----------------------------------------------------------------------
2728 vertical_2: DO K=KTS,KTE
2730 !-----------------------------------------------------------------------
2741 D2PQQ=(Q1(IFPA(I,J,K),JFPA(I,J,K),K)-Q1IJ &
2742 & -Q1IJ+Q1(IFPF(I,J,K),JFPF(I,J,K),K)) &
2744 & +(Q1(IFQA(I,J,K),JFQA(I,J,K),K)-Q1IJ &
2745 & -Q1IJ+Q1(IFQF(I,J,K),JFQF(I,J,K),K)) &
2751 QP0=Q (IFPA(I,J,K),JFPA(I,J,K),K)
2752 Q0Q=Q (IFQA(I,J,K),JFQA(I,J,K),K)
2754 QSTIJ=MAX(QSTIJ,MIN(Q00,QP0,Q0Q))
2755 QSTIJ=MIN(QSTIJ,MAX(Q00,QP0,Q0Q))
2757 DQSTIJ=QSTIJ-Q(I,J,K)
2763 !-----------------------------------------------------------------------
2764 #if defined(BIT_FOR_BIT) && defined(DM_PARALLEL) && !defined(STUBMPI)
2765 !-----------------------------------------------------------------------
2771 XSUMS_L(I,J,K,1)=DQSTIJ
2773 XSUMS_L(I,J,K,2)=DQSTIJ
2776 !-----------------------------------------------------------------------
2778 !-----------------------------------------------------------------------
2780 XSUMS(1,K)=XSUMS(1,K)+DQSTIJ
2782 XSUMS(2,K)=XSUMS(2,K)+DQSTIJ
2785 !-----------------------------------------------------------------------
2787 !-----------------------------------------------------------------------
2792 !-----------------------------------------------------------------------
2796 !-----------------------------------------------------------------------
2797 #if defined(BIT_FOR_BIT) && defined(DM_PARALLEL) && !defined(STUBMPI)
2798 !-----------------------------------------------------------------------
2800 CALL WRF_PATCH_TO_GLOBAL_REAL(XSUMS_L(IMS,JMS,KMS,N) &
2801 &, XSUMS_G(1,1,1,N),DOMDESC &
2803 &, IDS,IDE,KDS,KDE,JDS,JDE &
2804 &, IMS,IME,KMS,KME,JMS,JME &
2805 &, ITS,ITE,KTS,KTE,JTS,JTE)
2814 IF(WRF_DM_ON_MONITOR())THEN
2817 !$omp& private(i,j,k)
2821 GSUMS(N,K)=GSUMS(N,K)+XSUMS_G(I,J,K,N)
2828 CALL WRF_DM_BCAST_BYTES(GSUMS,2*RWORDSIZE*2*(KDE-KDS+1) )
2830 !-----------------------------------------------------------------------
2832 !-----------------------------------------------------------------------
2834 !-----------------------------------------------------------------------
2835 !*** GLOBAL REDUCTION
2836 !-----------------------------------------------------------------------
2838 # if defined(DM_PARALLEL) && !defined(STUBMPI)
2839 CALL WRF_GET_DM_COMMUNICATOR(MPI_COMM_COMP)
2840 CALL MPI_ALLREDUCE(XSUMS,GSUMS,2*(KTE-KTS+1) &
2841 & ,MPI_DOUBLE_PRECISION,MPI_SUM &
2842 & ,MPI_COMM_COMP,IRECV)
2846 GSUMS(N,K)=XSUMS(N,K)
2851 !-----------------------------------------------------------------------
2853 !-----------------------------------------------------------------------
2855 !-----------------------------------------------------------------------
2856 !*** END OF GLOBAL REDUCTION
2857 !-----------------------------------------------------------------------
2861 !!! call int_get_fresh_handle(nunit)
2864 !!! open(unit=nunit,file='gsums',form='unformatted',iostat=ier)
2867 !-----------------------------------------------------------------------
2869 !$omp& private(destij,dqstij,dwstij,i,j,k,rface,rfacq,rfacw &
2870 !$omp& ,rfeij,rfqij,rfwij,sumnq,sumpq)
2871 !-----------------------------------------------------------------------
2873 vertical_3: DO K=KTS,KTE
2875 !-----------------------------------------------------------------------
2877 ! write(nunit)(gsums(i,k),i=1,6)
2879 !!! read(nunit)(gsums(i,k),i=1,6)
2880 !-----------------------------------------------------------------------
2885 !-----------------------------------------------------------------------
2886 !*** FIRST MOMENT CONSERVING FACTOR
2887 !-----------------------------------------------------------------------
2895 IF(RFACQ<CONSERVE_MIN.OR.RFACQ>CONSERVE_MAX)RFACQ=1.
2897 !-----------------------------------------------------------------------
2898 ! if(mype==0.and.ntsd==181)close(nunit)
2899 !-----------------------------------------------------------------------
2901 !-----------------------------------------------------------------------
2902 !*** IMPOSE CONSERVATION ON ANTI-FILTERING
2903 !-----------------------------------------------------------------------
2909 RFQIJ=HBM2(I,J)*(RFACQ-1.)+1.
2910 IF(DQSTIJ>=0.)DQSTIJ=DQSTIJ*RFQIJ
2911 Q(I,J,K)=Q(I,J,K)+DQSTIJ
2916 RFQIJ=HBM2(I,J)*(RFACQ-1.)+1.
2917 IF(DQSTIJ<0.)DQSTIJ=DQSTIJ/RFQIJ
2918 Q(I,J,K)=Q(I,J,K)+DQSTIJ
2923 !-----------------------------------------------------------------------
2927 SCAL(I,J,K,L)=Q(I,J,K)
2931 !-----------------------------------------------------------------------
2935 !-----------------------------------------------------------------------
2939 !-----------------------------------------------------------------------
2941 END SUBROUTINE HAD2_SCAL
2943 !-----------------------------------------------------------------------
2944 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2948 ,ids,ide,jds,jde,kds,kde &
2949 ,ims,ime,jms,jme,kms,kme &
2950 ,its,ite,jts,jte,kts,kte &
2960 ,fad,hbm2,pdsl,pdslo &
2964 !---temporary arguments-------------------------------------------------
2965 ,fne,fse,few,fns,s1,tcs)
2966 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2968 !-----------------------------------------------------------------------
2970 cfc=1.533 & ! adams-bashforth positioning in time
2971 ,bfc=1.-cfc & ! adams bashforth positioning in time
2973 ,epsq=1.e-20 & ! floor value for specific humidity
2974 ,epsq2=0.2 & ! floor value for 2tke
2975 ,epscm=2.e-6 & ! a floor value (not used)
2976 ,w1=1.0 & ! crank-nicholson uncentering
2977 !,w1=-1.00 & ! crank-nicholson uncentering
2978 ,w2=2.-w1 ! crank-nicholson uncentering
2980 logical,intent(in):: &
2983 integer,intent(in):: &
2984 idtad & ! time step multiplier
2985 ,kse & ! terminal species index
2986 ,kss & ! initial species index
2988 ,ids,ide,jds,jde,kds,kde &
2989 ,ims,ime,jms,jme,kms,kme &
2990 ,its,ite,jts,jte,kts,kte
2994 ,dt & ! dynamics time step
2997 real,dimension(kts:kte),intent(in):: &
2998 deta1 & ! delta sigmas
2999 ,deta2 ! delta pressures
3001 integer,dimension(jms:jme),intent(in):: &
3005 integer,dimension(ims:ime,jms:jme),intent(in):: &
3008 real,dimension(2600),intent(in):: & !!!zj see nmm_max_dim in adve !!!zj
3011 real,dimension(ims:ime,jms:jme),intent(in):: &
3014 ,pdsl & ! sigma range pressure difference
3015 ,pdslo ! sigma range pressure difference
3017 real,dimension(ims:ime,jms:jme,kms:kme),intent(in):: &
3018 petdt & ! vertical mass flux
3021 real,dimension(ims:ime,jms:jme,kms:kme,kss:kse),intent(inout):: &
3024 real,dimension(ims:ime,jms:jme,kms:kme,kss:kse),intent(inout):: &
3025 sp ! s at previous time level
3027 !---temporary arguments-------------------------------------------------
3028 real,dimension(ims:ime,jms:jme,kms:kme),intent(in):: &
3029 fne & ! mass flux, ne direction
3030 ,fse & ! mass flux, se direction
3031 ,few & ! mass flux, x direction
3032 ,fns ! mass flux, y direction
3034 real,dimension(ims:ime,jms:jme,kms:kme,kss:kse),intent(inout):: &
3035 s1 & ! intermediate value of s
3036 ,tcs ! timechange of s
3038 !--local variables------------------------------------------------------
3045 INTEGER :: IEND,IFP,IFQ,II,IPQ,ISP,ISQ,ISTART &
3047 & ,J1,JA,JAK,JEND,JGLOBAL,JJ,JKNT,JP2,JSTART &
3048 & ,KNTI_ADH,KSTART,KSTOP &
3049 & ,N,N_IUPH_J,N_IUPADH_J,N_IUPADV_J
3051 INTEGER :: MY_IS_GLB,MY_IE_GLB,MY_JS_GLB,MY_JE_GLB
3057 ,fahp & ! temporary grid factor
3060 ,vvlo & ! vertical velocity, lower interface
3061 ,vvup & ! vertical velocity, upper interface
3062 ,pvvup ! vertical mass flux, upper interface
3068 & ,TEMPA,TEMPB,TTA,TTB
3070 real,dimension(kts:kte):: &
3073 INTEGER,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5) :: ISPA,ISQA
3075 real,dimension(its-5:ite+5,jts-5:jte+5):: &
3076 pdop & ! hydrostatic pressure difference at h points
3077 ,pvvlo & ! vertical mass flux, lower interface
3078 ,ss1 & ! extrapolated species between time levels
3079 ,ssne & ! flux, ne direction
3080 ,ssse & ! flux, nw direction
3081 ,ssx & ! flux, x direction
3082 ,ssy ! flux, y direction
3084 REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5) :: ARRAY0,ARRAY1 &
3087 real,dimension(its-5:ite+5,jts-5:jte+5,kts:kte):: &
3088 crs & ! vertical advection temporary
3089 ,rcms ! vertical advection temporary
3091 real,dimension(its-5:ite+5,jts-5:jte+5,kts:kte,kss:kse):: &
3092 rsts ! vertical advection temporary
3093 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3134 !-----------------------------------------------------------------------
3136 deta1_pdtop(k)=deta1(k)*pdtop
3138 !-----------------------------------------------------------------------
3139 do ks=kss,kse ! loop by species
3140 !-----------------------------------------------------------------------
3142 DO J=MYJS_P4,MYJE_P4
3143 DO I=MYIS_P4,MYIE_P4
3144 s1(i,j,k,ks)=sqrt(s(i,j,k,ks))
3148 !-----------------------------------------------------------------------
3149 enddo ! end of the loop by species
3150 !-----------------------------------------------------------------------
3151 DO J=MYJS_P4,MYJE_P4
3152 DO I=MYIS_P4,MYIE_P4
3153 pdop(i,j)=(pdslo(i,j)+pdsl(i,j))*0.5
3156 !---crank-nicholson vertical advection----------------------------------
3161 pvvlo(i,j)=petdt(i,j,kte-1)*dtq
3162 vvlo=pvvlo(i,j)/(deta2(kte)*pdop(i,j)+deta1_pdtop(kte))
3165 rcms(i,j,kte)=1./cms
3166 crs(i,j,kte)=vvlo*w2
3169 rsts(i,j,kte,ks)=(-vvlo*w1) &
3170 *(s1(i,j,kte-1,ks)-s1(i,j,kte,ks)) &
3178 rdp=1./(deta2(k)*pdop(i,j)+deta1_pdtop(k))
3180 pvvlo(i,j)=petdt(i,j,k-1)*dtq
3185 ! if(abs(vvlo).gt.cflc) then
3186 ! if(vvlo.lt.0.) then
3193 cf=-vvup*w2*rcms(i,j,k+1)
3194 cms=-crs(i,j,k+1)*cf+((vvup-vvlo)*w2+1.)
3199 rsts(i,j,k,ks)=-rsts(i,j,k+1,ks)*cf+s1(i,j,k,ks) &
3200 -(s1(i,j,k ,ks)-s1(i,j,k+1,ks))*vvup*w1 &
3201 -(s1(i,j,k-1,ks)-s1(i,j,k ,ks))*vvlo*w1
3209 vvup=pvvup/(deta2(kts)*pdop(i,j)+deta1_pdtop(kts))
3211 cf=-vvup*w2*rcms(i,j,kts+1)
3212 cms=-crs(i,j,kts+1)*cf+(vvup*w2+1.)
3213 rcms(i,j,kts)=1./cms
3217 rsts(i,j,kts,ks)=-rsts(i,j,kts+1,ks)*cf+s1(i,j,kts,ks) &
3218 -(s1(i,j,kts,ks)-s1(i,j,kts+1,ks))*vvup*w1
3220 tcs(i,j,kts,ks)=rsts(i,j,kts,ks)*rcms(i,j,kts)-s1(i,j,kts,ks)
3228 tcs(i,j,k,ks)=(-crs(i,j,k)*(s1(i,j,k-1,ks)+tcs(i,j,k-1,ks)) &
3230 *rcms(i,j,k)-s1(i,j,k,ks)
3235 !-----------------------------------------------------------------------
3236 do ks=kss,kse ! loop by species
3237 !-----------------------------------------------------------------------
3239 DO J=MYJS_P5,MYJE_P5
3240 DO I=MYIS_P5,MYIE_P5
3241 ss1(i,j)=s1(i,j,k,ks)*cfc+sp(i,j,k,ks)*bfc
3242 sp(i,j,k,ks)=s1(i,j,k,ks)
3245 !---fluxes--------------------------------------------------------------
3246 DO J=MYJS1_P2,MYJE1_P2
3247 DO I=MYIS_P2,MYIE_P3
3248 ssx(i,j)=(ss1(i+ive(j),j )-ss1(i+ivw(j),j ))*few(i,j,k) &
3250 ssy(i,j)=(ss1(i ,j+1)-ss1(i ,j-1))*fns(i,j,k) &
3254 DO J=MYJS1_P2,MYJE2_P2
3255 DO I=MYIS_P2,MYIE_P2
3256 ssne(i,j)=(ss1(i+ihe(j),j+1)-ss1(i,j))*fne(i,j,k)*hbm2(i,j)
3259 DO J=MYJS2_P2,MYJE1_P2
3260 DO I=MYIS_P2,MYIE_P2
3261 ssse(i,j)=(ss1(i+ihe(j),j-1)-ss1(i,j))*fse(i,j,k)*hbm2(i,j)
3264 !---advection of species------------------------------------------------
3267 tcs(i,j,k,ks)=((ssx (i+ihw(j),j )+ssx (i+ihe(j),j ) &
3268 +ssy (i ,j-1)+ssy (i ,j+1) &
3269 +ssne(i+ihw(j),j-1)+ssne(i ,j ) &
3270 +ssse(i ,j )+ssse(i+ihw(j),j+1)) &
3271 *fad(i,j)*2.0*idtad & !! 2.0 compensates for fad
3272 /(deta2(k)*pdop(i,j)+deta1_pdtop(k)) &
3273 +tcs(i,j,k,ks))*hbm2(i,j)
3276 !-----------------------------------------------------------------------
3278 !*** upstream advection
3280 !-----------------------------------------------------------------------
3282 upstream: IF(UPSTRM)THEN
3284 !-----------------------------------------------------------------------
3286 !*** COMPUTE UPSTREAM COMPUTATIONS ON THIS TASK'S ROWS.
3288 !-----------------------------------------------------------------------
3290 jloop_upstream: DO J=MYJS2,MYJE2
3292 N_IUPH_J=N_IUP_H(J) ! See explanation in START_DOMAIN_NMM
3297 *(uold(i ,j-1,k)+uold(i+ihw(j),j ,k) &
3298 +uold(i+ihe(j),j ,k)+uold(i ,j+1,k))
3300 *(vold(i ,j-1,k)+vold(i+ihw(j),j ,k) &
3301 +vold(i+ihe(j),j ,k)+vold(i ,j+1,k))
3320 ARRAY0(I,J)=ARRAY3_X-PP-QP
3321 ARRAY1(I,J)=PP-ARRAY3_X
3322 ARRAY2(I,J)=QP-ARRAY3_X
3323 ARRAY3(I,J)=ARRAY3_X
3326 !-----------------------------------------------------------------------
3328 N_IUPADH_J=N_IUP_ADH(J)
3330 IUP_ADH_J=IUP_ADH(IMS,J)
3332 iloop_T: DO II=0,N_IUPH_J-1
3342 !-----------------------------------------------------------------------
3344 IF(I==IUP_ADH_J)THEN ! Upstream advection T tendencies
3357 tcs(i,j,k,ks)=(f0*s1(i,j,k,ks) &
3358 & +f1*s1(i+ihe(j)+ifp,j+isp,k,ks) &
3359 & +f2*s1(i+ihe(j)+ifq,j+isq,k,ks) &
3360 & +f3*s1(i+ipq,j+isp+isq,k,ks))*2.0 &
3362 & +tcs(i,j,k,ks)*hbm2(i,j)
3364 !-----------------------------------------------------------------------
3366 IF(KNTI_ADH<N_IUPADH_J)THEN
3367 IUP_ADH_J=IUP_ADH(IMS+KNTI_ADH,J)
3371 ENDIF ! End of upstream advection tendency IF block
3375 !-----------------------------------------------------------------------
3376 enddo jloop_upstream
3377 !-----------------------------------------------------------------------
3379 !-----------------------------------------------------------------------
3381 !-----------------------------------------------------------------------
3382 enddo ! end of the loop by the species
3383 !-----------------------------------------------------------------------
3385 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3388 #if defined(DM_PARALLEL)
3391 mype,ntsd,hours,kss,kse &
3392 ,ids,ide,jds,jde,kds,kde &
3393 ,ims,ime,jms,jme,kms,kme &
3394 ,its,ite,jts,jte,kts,kte &
3402 !---temporary arguments-------------------------------------------------
3404 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3406 !-----------------------------------------------------------------------
3408 epsq=1.e-20 & ! floor value for specific humidity
3409 ,epsq2=0.02 ! floor value for 2tke
3415 integer,intent(in):: &
3416 idtad & ! time step multiplier
3417 ,kse & ! terminal species index
3418 ,kss & ! initial species index
3421 ,ids,ide,jds,jde,kds,kde &
3422 ,ims,ime,jms,jme,kms,kme &
3423 ,its,ite,jts,jte,kts,kte
3430 real,intent(inout):: &
3433 integer,dimension(jms:jme),intent(in):: &
3436 real,dimension(kts:kte),intent(in):: &
3437 deta1 & ! delta sigmas
3438 ,deta2 ! delta sigmas
3440 real,dimension(ims:ime,jms:jme),intent(in):: &
3443 ,pd ! sigma range pressure difference
3445 real,dimension(ims:ime,jms:jme,kms:kme,kss:kse),intent(in):: &
3447 !---temporary arguments-------------------------------------------------
3448 real,dimension(ims:ime,jms:jme,kms:kme,kss:kse),intent(inout):: &
3449 s1 & ! intermediate value of s
3450 ,tcs ! timechange of s
3451 !--local variables------------------------------------------------------
3468 ,smax & ! local maximum
3469 ,smin & ! local minimum
3470 ,smaxh & ! horizontal local maximum
3471 ,sminh & ! horizontal local minimum
3472 ,smaxv & ! vertical local maximum
3473 ,sminv & ! vertical local minimum
3479 double precision:: &
3482 double precision,dimension(2*kss-1:2*kse):: &
3485 real,dimension(kts:kte):: &
3488 real,dimension(2*kss-1:2*kse,kts:kte):: &
3491 double precision,dimension(2*kss-1:2*kse,kts:kte):: &
3492 gsms & ! sum of neg/pos changes all global fields
3493 ,xsms ! sum of neg/pos changes all local fields
3495 double precision,dimension(2*kss-1:2*kse):: &
3498 real,dimension(its-5:ite+5,jts-5:jte+5,kts:kte):: &
3499 dvol & ! grid box volume
3500 ,rdvol ! 1./grid box volume
3502 logical, save :: first=.true.
3503 real, save :: sumrrw_first, summass_first
3505 double precision, save :: gsmp_first
3506 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3508 ! steep=1.-0.040*idtad
3512 deta1_pdtop(k)=deta1(k)*pdtop
3518 dvolp=(deta2(k)*pd(i,j)+deta1_pdtop(k))*dx(i,j)*dy
3519 rdvol(i,j,k)=hbm2(i,j)/dvolp
3520 dvol (i,j,k)=hbm2(i,j)*dvolp
3526 !---monotonization------------------------------------------------------
3527 do ks=kss,kse ! loop by species
3528 !-----------------------------------------------------------------------
3538 s1p=(s1(i,j,k,ks)+tcs(i,j,k,ks))**2
3539 tcs(i,j,k,ks)=s1p-s(i,j,k,ks)
3541 sminh=min(s(i ,j-2,k,ks) &
3542 ,s(i+ihw(j),j-1,k,ks) &
3543 ,s(i+ihe(j),j-1,k,ks) &
3547 ,s(i+ihw(j),j+1,k,ks) &
3548 ,s(i+ihe(j),j+1,k,ks) &
3550 smaxh=max(s(i ,j-2,k,ks) &
3551 ,s(i+ihw(j),j-1,k,ks) &
3552 ,s(i+ihe(j),j-1,k,ks) &
3556 ,s(i+ihw(j),j+1,k,ks) &
3557 ,s(i+ihe(j),j+1,k,ks) &
3560 if(k.gt.kts.and.k.lt.kte) then
3561 sminv=min(s(i,j,k-1,ks),s(i,j,k ,ks),s(i,j,k+1,ks))
3562 smaxv=max(s(i,j,k-1,ks),s(i,j,k ,ks),s(i,j,k+1,ks))
3563 elseif(k.eq.kts) then
3564 sminv=min(s(i,j,k ,ks),s(i,j,k+1,ks))
3565 smaxv=max(s(i,j,k ,ks),s(i,j,k+1,ks))
3566 elseif(k.eq.kte) then
3567 sminv=min(s(i,j,k-1,ks),s(i,j,k ,ks))
3568 smaxv=max(s(i,j,k-1,ks),s(i,j,k ,ks))
3571 smin=min(sminh,sminv)
3572 smax=max(smaxh,smaxv)
3575 if(sn.gt.steep*smax) sn=smax
3576 if(sn.lt. smin) sn=smin
3578 dsks=(sn-s1p)*dvol(i,j,k)
3581 xsms(2*ks-1,k)=xsms(2*ks-1,k)+dsks
3583 xsms(2*ks ,k)=xsms(2*ks ,k)+dsks
3589 !-----------------------------------------------------------------------
3590 enddo ! end of the loop by species
3591 !-----------------------------------------------------------------------
3592 !-----------------------------------------------------------------------
3593 !*** GLOBAL REDUCTION
3594 !-----------------------------------------------------------------------
3597 CALL WRF_GET_DM_COMMUNICATOR(MPI_COMM_COMP)
3598 lngth=(2*kse-2*kss+2)*(KTE-KTS+1)
3599 CALL MPI_ALLREDUCE(XSMS,GSMS,lngth &
3600 & ,MPI_DOUBLE_PRECISION,MPI_SUM &
3601 & ,MPI_COMM_COMP,IRECV)
3605 gsms(2*ks-1,k)=xsms(2*ks-1,k)
3606 gsms(2*ks ,k)=xsms(2*ks ,k)
3613 gsms_single(2*ks-1,k)=gsms(2*ks-1,k)
3614 gsms_single(2*ks ,k)=gsms(2*ks ,k)
3618 !-----------------------------------------------------------------------
3619 !*** END OF GLOBAL REDUCTION
3620 !-----------------------------------------------------------------------
3622 !dusan!---forced conservation after monotonization----------------------------
3623 !dusan do ks=kss,kse
3625 !dusan sumps=gsms_single(2*ks-1,k)
3626 !dusan sumns=gsms_single(2*ks ,k)
3628 !dusan if(sumps*(-sumns).gt.1.) then
3629 !dusan sfacs=-sumns/sumps
3630 !dusan rfacs=1./sfacs
3636 !dusan DO J=MYJS2,MYJE2
3637 !dusan DO I=MYIS1,MYIE1
3638 !dusan dsks=s1(i,j,k,ks)*rdvol(i,j,k)
3639 !dusan if(sfacs.gt.1.) then
3640 !dusan if(dsks.lt.0.) dsks=dsks*rfacs
3641 !dusan!zjtest if(dsks.lt.0.) dsks=dsks
3643 !dusan if(dsks.ge.0.) dsks=dsks*sfacs
3645 !dusan tcs(i,j,k,ks)=tcs(i,j,k,ks)+dsks
3649 !dusan!-----------------------------------------------------------------------
3650 !dusan enddo ! end of the loop by species
3652 !---forced conservation after monotonization----------------------------
3657 vgsums(2*ks-1)=gsms(2*ks-1,k)+vgsums(2*ks-1)
3658 vgsums(2*ks )=gsms(2*ks ,k)+vgsums(2*ks )
3663 sumps=vgsums(2*ks-1)
3666 if(sumps*(-sumns).gt.1.) then
3677 dsks=s1(i,j,k,ks)*rdvol(i,j,k)
3678 if(sfacs.lt.1.) then
3679 if(dsks.gt.0.) dsks=dsks*sfacs
3681 tcs(i,j,k,ks)=tcs(i,j,k,ks)+dsks
3685 !-----------------------------------------------------------------------
3686 enddo ! end of the loop by species
3688 !-----------------------------------------------------------------------
3689 !zjwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
3690 !-----------------------------------------------------------------------
3691 do ks=kss,kse ! loop by species
3700 xsms(2*ks-1,k)=xsms(2*ks-1,k)+s (i,j,k,ks)*dvol(i,j,k)
3701 xsms(2*ks ,k)=xsms(2*ks ,k)+tcs(i,j,k,ks)*dvol(i,j,k)
3710 xsmp=pd(i,j)*dx(i,j)*dy*hbm2(i,j)+xsmp
3714 !-----------------------------------------------------------------------
3715 !*** GLOBAL REDUCTION
3716 !-----------------------------------------------------------------------
3719 CALL WRF_GET_DM_COMMUNICATOR(MPI_COMM_COMP)
3721 CALL MPI_ALLREDUCE(xsmp,gsmp,lngth &
3722 & ,MPI_DOUBLE_PRECISION,MPI_SUM &
3723 & ,MPI_COMM_COMP,IRECV)
3728 !-----------------------------------------------------------------------
3729 !*** END OF GLOBAL REDUCTION
3730 !-----------------------------------------------------------------------
3733 !-----------------------------------------------------------------------
3734 !*** GLOBAL REDUCTION
3735 !-----------------------------------------------------------------------
3738 CALL WRF_GET_DM_COMMUNICATOR(MPI_COMM_COMP)
3739 lngth=(2*kse-2*kss+2)*(KTE-KTS+1)
3740 CALL MPI_ALLREDUCE(XSMS,GSMS,lngth &
3741 & ,MPI_DOUBLE_PRECISION,MPI_SUM &
3742 & ,MPI_COMM_COMP,IRECV)
3746 gsms(2*ks-1,k)=xsms(2*ks-1,k)
3747 gsms(2*ks ,k)=xsms(2*ks ,k)
3754 gsms_single(2*ks-1,k)=gsms(2*ks-1,k)
3755 gsms_single(2*ks ,k)=gsms(2*ks ,k)
3759 !-----------------------------------------------------------------------
3760 !*** END OF GLOBAL REDUCTION
3761 !-----------------------------------------------------------------------
3771 vgsms(2*ks-1)=gsms(2*ks-1,k)+vgsms(2*ks-1)
3772 vgsms(2*ks )=gsms(2*ks ,k)+vgsms(2*ks )
3776 sumdrrw=vgsms(6)+sumdrrw
3782 summass=summass+dvol(i,j,k)
3788 sumrrw_first = vgsms(5)
3790 summass_first = summass
3794 ! write(0,1000) ntsd,hours, & ! 4,5
3795 ! (vgsms(ks),ks=2*kss-1,2*kse), & ! 6-13
3796 ! gsmp,gsmp_first,gsmp/gsmp_first, & ! 14-16
3798 ! vgsms(5)/sumrrw_first,sumrrw_first, & ! 18-19
3799 ! summass,summass_first,summass/summass_first ! 20-22
3800 1000 format('global vol sums ',i6,f8.3,30d13.5)
3801 !zjmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
3803 !-----------------------------------------------------------------------
3804 !-----------------------------------------------------------------------
3806 END MODULE MODULE_ADVECTION
3808 !-----------------------------------------------------------------------