PageRenderTime 83ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/wrfv2_fire/dyn_nmm/module_ADVECTION.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 3808 lines | 2141 code | 56 blank | 1611 comment | 56 complexity | 695e7c3f14db61a354f2ed5b98fd1eae MD5 | raw file
Possible License(s): AGPL-1.0
  1. !----------------------------------------------------------------------
  2. !#define BIT_FOR_BIT
  3. !----------------------------------------------------------------------
  4. #include "nmm_loop_basemacros.h"
  5. #include "nmm_loop_macros.h"
  6. !----------------------------------------------------------------------
  7. !
  8. !NCEP_MESO:MODEL_LAYER: HORIZONTAL AND VERTICAL ADVECTION
  9. !
  10. !----------------------------------------------------------------------
  11. !
  12. MODULE MODULE_ADVECTION
  13. !
  14. !----------------------------------------------------------------------
  15. USE MODULE_MODEL_CONSTANTS
  16. USE MODULE_EXT_INTERNAL
  17. !----------------------------------------------------------------------
  18. #if defined(DM_PARALLEL) && !defined(STUBMPI)
  19. INCLUDE "mpif.h"
  20. #endif
  21. !----------------------------------------------------------------------
  22. !
  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
  26. !
  27. !----------------------------------------------------------------------
  28. !*** CRANK-NICHOLSON OFF-CENTER WEIGHTS FOR CURRENT AND FUTURE
  29. !*** TIME LEVELS.
  30. !-----------------------------------------------------------------------
  31. !
  32. REAL,PARAMETER :: WGT1=0.90
  33. REAL,PARAMETER :: WGT2=2.-WGT1
  34. !
  35. !*** FOR CRANK_NICHOLSON CHECK ONLY.
  36. !
  37. INTEGER :: ITEST=47,JTEST=70
  38. REAL :: ADTP,ADUP,ADVP,TTLO,TTUP,TULO,TUUP,TVLO,TVUP
  39. !
  40. !----------------------------------------------------------------------
  41. CONTAINS
  42. !
  43. !***********************************************************************
  44. SUBROUTINE ADVE(NTSD,DT,DETA1,DETA2,PDTOP &
  45. & ,CURV,F,FAD,F4D,EM_LOC,EMT_LOC,EN,ENT,DX,DY &
  46. & ,HBM2,VBM2 &
  47. & ,T,U,V,PDSLO,TOLD,UOLD,VOLD &
  48. & ,PETDT,UPSTRM &
  49. & ,FEW,FNS,FNE,FSE &
  50. & ,ADT,ADU,ADV &
  51. & ,N_IUP_H,N_IUP_V &
  52. & ,N_IUP_ADH,N_IUP_ADV &
  53. & ,IUP_H,IUP_V,IUP_ADH,IUP_ADV &
  54. & ,IHE,IHW,IVE,IVW &
  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
  60. ! . . .
  61. ! SUBPROGRAM: ADVE HORIZONTAL AND VERTICAL ADVECTION
  62. ! PRGRMMR: JANJIC ORG: W/NP22 DATE: 93-10-28
  63. !
  64. ! ABSTRACT:
  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.
  72. !
  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
  88. !
  89. ! USAGE: CALL ADVE FROM SUBROUTINE SOLVE_NMM
  90. ! INPUT ARGUMENT LIST:
  91. !
  92. ! OUTPUT ARGUMENT LIST:
  93. !
  94. ! OUTPUT FILES:
  95. ! NONE
  96. !
  97. ! SUBPROGRAMS CALLED:
  98. !
  99. ! UNIQUE: NONE
  100. !
  101. ! LIBRARY: NONE
  102. !
  103. ! ATTRIBUTES:
  104. ! LANGUAGE: FORTRAN 90
  105. ! MACHINE : IBM SP
  106. !$$$
  107. !***********************************************************************
  108. !-----------------------------------------------------------------------
  109. !
  110. IMPLICIT NONE
  111. !
  112. !-----------------------------------------------------------------------
  113. !
  114. INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
  115. & ,IMS,IME,JMS,JME,KMS,KME &
  116. & ,ITS,ITE,JTS,JTE,KTS,KTE
  117. !
  118. INTEGER, DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW &
  119. ,N_IUP_H,N_IUP_V &
  120. & ,N_IUP_ADH,N_IUP_ADV
  121. !
  122. INTEGER, DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: IUP_H,IUP_V &
  123. & ,IUP_ADH,IUP_ADV
  124. !
  125. INTEGER,INTENT(IN) :: NTSD
  126. !
  127. REAL,INTENT(IN) :: DT,DY,EN,ENT,F4D,PDTOP
  128. !
  129. REAL,DIMENSION(NMM_MAX_DIM),INTENT(IN) :: EM_LOC,EMT_LOC
  130. !
  131. REAL,DIMENSION(KMS:KME),INTENT(IN) :: DETA1,DETA2
  132. !
  133. REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: CURV,DX,F,FAD,HBM2 &
  134. & ,PDSLO,VBM2
  135. !
  136. REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: ADT,ADU,ADV
  137. !
  138. REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: PETDT
  139. !
  140. REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: T,TOLD &
  141. & ,U,UOLD &
  142. & ,V,VOLD
  143. !
  144. REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(OUT) :: FEW,FNE &
  145. & ,FNS,FSE
  146. !
  147. !-----------------------------------------------------------------------
  148. !*** LOCAL VARIABLES
  149. !-----------------------------------------------------------------------
  150. !
  151. LOGICAL :: UPSTRM
  152. !
  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
  158. !
  159. INTEGER :: MY_IS_GLB,MY_IE_GLB,MY_JS_GLB,MY_JE_GLB
  160. !
  161. INTEGER,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5) :: ISPA,ISQA
  162. !
  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
  170. !
  171. REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5) :: ARRAY0,ARRAY1 &
  172. & ,ARRAY2,ARRAY3 &
  173. & ,DPDE,RDPD,RDPDX,RDPDY &
  174. & ,TEW,TNE,TNS,TSE,TST &
  175. & ,UNE,UNED,UEW,UNS,USE &
  176. & ,USED,UST &
  177. & ,VEW,VNE,VNS,VSE &
  178. & ,VST
  179. !
  180. REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5,KTS:KTE) :: VAD_TEND_T &
  181. & ,VAD_TEND_U &
  182. & ,VAD_TEND_V
  183. !
  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
  187. !
  188. !-----------------------------------------------------------------------
  189. !***********************************************************************
  190. !
  191. ! DPDE ----- 3
  192. ! | J Increasing
  193. ! |
  194. ! | ^
  195. ! FNS ----- 2 |
  196. ! | |
  197. ! | |
  198. ! | |
  199. ! VNS ----- 1 |
  200. ! |
  201. ! |
  202. ! |
  203. ! ADV ----- 0 ------> Current J
  204. ! |
  205. ! |
  206. ! |
  207. ! VNS ----- -1
  208. ! |
  209. ! |
  210. ! |
  211. ! FNS ----- -2
  212. ! |
  213. ! |
  214. ! |
  215. ! DPDE ----- -3
  216. !
  217. !***********************************************************************
  218. !-----------------------------------------------------------------------
  219. DO J=JTS-5,JTE+5
  220. DO I=ITS-5,ITE+5
  221. ARRAY0(I,J)=0.0
  222. ARRAY1(I,J)=0.0
  223. ARRAY2(I,J)=0.0
  224. ARRAY3(I,J)=0.0
  225. DPDE(I,J)=0.0
  226. RDPD(I,J)=0.0
  227. RDPDX(I,J)=0.0
  228. RDPDY(I,J)=0.0
  229. TEW(I,J)=0.0
  230. TNE(I,J)=0.0
  231. TNS(I,J)=0.0
  232. TSE(I,J)=0.0
  233. TST(I,J)=0.0
  234. UNE(I,J)=0.0
  235. UNED(I,J)=0.0
  236. UEW(I,J)=0.0
  237. UNS(I,J)=0.0
  238. USE(I,J)=0.0
  239. USED(I,J)=0.0
  240. UST(I,J)=0.0
  241. VEW(I,J)=0.0
  242. VNE(I,J)=0.0
  243. VNS(I,J)=0.0
  244. VSE(I,J)=0.0
  245. VST(I,J)=0.0
  246. ENDDO
  247. ENDDO
  248. !-----------------------------------------------------------------------
  249. !
  250. DTQ=DT*0.25
  251. DTE=DT*(0.5*0.25)
  252. !
  253. !-----------------------------------------------------------------------
  254. !***
  255. !*** PRECOMPUTE DETA1 TIMES PDTOP.
  256. !***
  257. !-----------------------------------------------------------------------
  258. !
  259. DO K=KTS,KTE
  260. DETA1_PDTOP(K)=DETA1(K)*PDTOP
  261. ENDDO
  262. !
  263. !-----------------------------------------------------------------------
  264. !***
  265. !*** INITIALIZE SOME WORKING ARRAYS TO ZERO
  266. !***
  267. !
  268. !-----------------------------------------------------------------------
  269. !-----------------------------------------------------------------------
  270. !
  271. !*** COMPUTE VERTICAL ADVECTION TENDENCIES USING CRANK-NICHOLSON.
  272. !
  273. !-----------------------------------------------------------------------
  274. !-----------------------------------------------------------------------
  275. !
  276. !-----------------------------------------------------------------------
  277. !*** FIRST THE TEMPERATURE
  278. !-----------------------------------------------------------------------
  279. !$omp parallel do &
  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. !-----------------------------------------------------------------------
  286. !
  287. main_vertical: DO J=MYJS2,MYJE2
  288. !
  289. !-----------------------------------------------------------------------
  290. !
  291. iloop_for_t: DO I=MYIS1,MYIE1
  292. !
  293. !-----------------------------------------------------------------------
  294. !*** EXTRACT T FROM THE COLUMN
  295. !-----------------------------------------------------------------------
  296. !
  297. DO K=KTS,KTE
  298. T_K(K)=T(I,J,K)
  299. ENDDO
  300. !
  301. !-----------------------------------------------------------------------
  302. !
  303. PDOP=PDSLO(I,J)
  304. PVVLO=PETDT(I,J,KTE-1)*DTQ
  305. VVLO=PVVLO/(DETA1_PDTOP(KTE)+DETA2(KTE)*PDOP)
  306. CMT=-VVLO*WGT2+1.
  307. RCMT(KTE)=1./CMT
  308. CRT(KTE)=VVLO*WGT2
  309. RSTT(KTE)=-VVLO*WGT1*(T_K(KTE-1)-T_K(KTE))+T_K(KTE)
  310. !
  311. !-----------------------------------------------------------------------
  312. !
  313. DO K=KTE-1,KTS+1,-1
  314. RDP=1./(DETA1_PDTOP(K)+DETA2(K)*PDOP)
  315. PVVUP=PVVLO
  316. PVVLO=PETDT(I,J,K-1)*DTQ
  317. VVUP=PVVUP*RDP
  318. VVLO=PVVLO*RDP
  319. CFT=-VVUP*WGT2*RCMT(K+1)
  320. CMT=-CRT(K+1)*CFT+((VVUP-VVLO)*WGT2+1.)
  321. RCMT(K)=1./CMT
  322. CRT(K)=VVLO*WGT2
  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
  326. ENDDO
  327. !
  328. !-----------------------------------------------------------------------
  329. !
  330. PVVUP=PVVLO
  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.
  334. CRT(KTS)=0.
  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)
  339. !
  340. DO K=KTS+1,KTE
  341. TN(K)=(-CRT(K)*TN(K-1)+RSTT(K))*RCMT(K)
  342. VAD_TEND_T(I,J,K)=TN(K)-T_K(K)
  343. ENDDO
  344. !
  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
  351. !!
  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 &
  358. ! &, ' ADTP=',ADTP
  359. ! WRITE(0,*)' T=',T(I,J,KTE),' TN=',TN(KTE) &
  360. ! &, ' VAD_TEND_T=',VAD_TEND_T(I,J,KTE)
  361. ! WRITE(0,*)' '
  362. !!
  363. ! DO K=KTE-1,KTS+1,-1
  364. ! RDP=1./(DETA1_PDTOP(K)+DETA2(K)*PDOP)
  365. ! PVVUP=PVVLO
  366. ! PVVLO=PETDT(I,J,K-1)*DT*0.25
  367. ! VVUP=PVVUP*RDP
  368. ! VVLO=PVVLO*RDP
  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 &
  373. ! &, ' ADTP=',ADTP
  374. ! WRITE(0,*)' T=',T(I,J,K),' TN=',TN(K) &
  375. ! &, ' VAD_TEND_T=',VAD_TEND_T(I,J,K)
  376. ! WRITE(0,*)' '
  377. ! ENDDO
  378. !!
  379. ! PVVUP=PVVLO
  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 &
  384. ! &, ' ADTP=',ADTP
  385. ! WRITE(0,*)' T=',T(I,J,KTS),' TN=',TN(KTS) &
  386. ! &, ' VAD_TEND_T=',VAD_TEND_T(I,J,KTS)
  387. ! WRITE(0,*)' '
  388. ! ENDIF
  389. ! endif
  390. !
  391. !-----------------------------------------------------------------------
  392. !*** End of check.
  393. !-----------------------------------------------------------------------
  394. !
  395. ENDDO iloop_for_t
  396. !
  397. !-----------------------------------------------------------------------
  398. !
  399. !*** NOW VERTICAL ADVECTION OF WIND COMPONENTS
  400. !
  401. !-----------------------------------------------------------------------
  402. !
  403. iloop_for_uv: DO I=MYIS1,MYIE1
  404. !
  405. !-----------------------------------------------------------------------
  406. !*** EXTRACT U AND V FROM THE COLUMN
  407. !-----------------------------------------------------------------------
  408. !
  409. DO K=KTS,KTE
  410. U_K(K)=U(I,J,K)
  411. V_K(K)=V(I,J,K)
  412. ENDDO
  413. !
  414. !-----------------------------------------------------------------------
  415. !
  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)
  422. CMU=-VVLOU*WGT2+1.
  423. CMV=-VVLOV*WGT2+1.
  424. RCMU(KTE)=1./CMU
  425. RCMV(KTE)=1./CMV
  426. CRU(KTE)=VVLOU*WGT2
  427. CRV(KTE)=VVLOV*WGT2
  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)
  430. !
  431. !-----------------------------------------------------------------------
  432. !
  433. DO K=KTE-1,KTS+1,-1
  434. RDPU=1./(DETA1_PDTOP(K)+DETA2(K)*PDOPU)
  435. RDPV=1./(DETA1_PDTOP(K)+DETA2(K)*PDOPV)
  436. PVVUPU=PVVLOU
  437. PVVUPV=PVVLOV
  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
  440. VVUPU=PVVUPU*RDPU
  441. VVUPV=PVVUPV*RDPV
  442. VVLOU=PVVLOU*RDPU
  443. VVLOV=PVVLOV*RDPV
  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.
  448. RCMU(K)=1./CMU
  449. RCMV(K)=1./CMV
  450. CRU(K)=VVLOU*WGT2
  451. CRV(K)=VVLOV*WGT2
  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
  458. ENDDO
  459. !
  460. !-----------------------------------------------------------------------
  461. !
  462. RDPU=1./(DETA1_PDTOP(KTS)+DETA2(KTS)*PDOPU)
  463. RDPV=1./(DETA1_PDTOP(KTS)+DETA2(KTS)*PDOPV)
  464. PVVUPU=PVVLOU
  465. PVVUPV=PVVLOV
  466. VVUPU=PVVUPU*RDPU
  467. VVUPV=PVVUPV*RDPV
  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.
  472. CRU(KTS)=0.
  473. CRV(KTS)=0.
  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)
  482. !
  483. DO K=KTS+1,KTE
  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)
  488. ENDDO
  489. !
  490. !-----------------------------------------------------------------------
  491. !*** The following section is only for checking the implicit solution
  492. !*** using back-substitution. Remove this section otherwise.
  493. !-----------------------------------------------------------------------
  494. !
  495. ! if(ntsd<=10.or.ntsd>=6000)then
  496. ! IF(I==ITEST.AND.J==JTEST)THEN
  497. !!
  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)
  516. ! WRITE(0,*)' '
  517. !!
  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)
  521. ! PVVUPU=PVVLOU
  522. ! PVVUPV=PVVLOV
  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
  526. ! VVUPU=PVVUPU*RDPU
  527. ! VVUPV=PVVUPV*RDPV
  528. ! VVLOU=PVVLOU*RDPU
  529. ! VVLOV=PVVLOV*RDPV
  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)
  542. ! WRITE(0,*)' '
  543. ! ENDDO
  544. !!
  545. ! PVVUPU=PVVLOU
  546. ! PVVUPV=PVVLOV
  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)
  559. ! WRITE(0,*)' '
  560. ! ENDIF
  561. ! endif
  562. !
  563. !-----------------------------------------------------------------------
  564. !*** End of check.
  565. !-----------------------------------------------------------------------
  566. !
  567. ENDDO iloop_for_uv
  568. !
  569. !-----------------------------------------------------------------------
  570. !
  571. ENDDO main_vertical
  572. !
  573. !-----------------------------------------------------------------------
  574. !-----------------------------------------------------------------------
  575. !
  576. !*** COMPUTE HORIZONTAL ADVECTION TENDENCIES.
  577. !
  578. !-----------------------------------------------------------------------
  579. !-----------------------------------------------------------------------
  580. !$omp parallel do &
  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. !-----------------------------------------------------------------------
  589. !
  590. main_horizontal: DO K=KTS,KTE
  591. !
  592. !-----------------------------------------------------------------------
  593. !
  594. DO J=MYJS_P4,MYJE_P4
  595. DO I=MYIS_P4,MYIE_P4
  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
  601. ENDDO
  602. ENDDO
  603. !
  604. !-----------------------------------------------------------------------
  605. !*** MASS FLUXES AND MASS POINT ADVECTION COMPONENTS
  606. !*** THE NS AND EW FLUXES IN THE FOLLOWING LOOP ARE ON V POINTS
  607. !*** FOR T.
  608. !-----------------------------------------------------------------------
  609. !
  610. DO J=MYJS1_P3,MYJE1_P3
  611. DO I=MYIS_P3,MYIE_P3
  612. !
  613. ADPDX=DPDE(I+IVW(J),J)+DPDE(I+IVE(J),J)
  614. ADPDY=DPDE(I,J-1)+DPDE(I,J+1)
  615. RDPDX(I,J)=1./ADPDX
  616. RDPDY(I,J)=1./ADPDY
  617. !
  618. UDY=U(I,J,K)*DY
  619. VDX=V(I,J,K)*DX(I,J)
  620. !
  621. FEWP=UDY*ADPDX
  622. FNSP=VDX*ADPDY
  623. !
  624. FEW(I,J,K)=FEWP
  625. FNS(I,J,K)=FNSP
  626. !
  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))
  629. !
  630. UNED(I,J)=UDY+VDX
  631. USED(I,J)=UDY-VDX
  632. !
  633. ENDDO
  634. ENDDO
  635. !
  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. !-----------------------------------------------------------------------
  641. !
  642. DO J=MYJS1_P2,MYJE2_P2
  643. DO I=MYIS_P2,MYIE_P2
  644. FNEP=(UNED(I+IHE(J),J)+UNED(I ,J+1)) &
  645. & *(DPDE(I ,J)+DPDE(I+IHE(J),J+1))
  646. FNE(I,J,K)=FNEP
  647. TNE(I,J)=FNEP*(TST(I+IHE(J),J+1)-TST(I,J))
  648. ENDDO
  649. ENDDO
  650. !
  651. DO J=MYJS2_P2,MYJE1_P2
  652. DO I=MYIS_P2,MYIE_P2
  653. FSEP=(USED(I+IHE(J),J)+USED(I ,J-1)) &
  654. & *(DPDE(I ,J)+DPDE(I+IHE(J),J-1))
  655. FSE(I,J,K)=FSEP
  656. TSE(I,J)=FSEP*(TST(I+IHE(J),J-1)-TST(I,J))
  657. !
  658. ENDDO
  659. ENDDO
  660. !
  661. !-----------------------------------------------------------------------
  662. !*** HORIZONTAL T ADVECTION TENDENCY ADT IS ON H POINTS OF COURSE.
  663. !-----------------------------------------------------------------------
  664. !
  665. DO J=MYJS5,MYJE5
  666. DO I=MYIS2,MYIE2
  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)
  672. ENDDO
  673. ENDDO
  674. !
  675. !
  676. !-----------------------------------------------------------------------
  677. !*** CALCULATION OF MOMENTUM ADVECTION COMPONENTS.
  678. !-----------------------------------------------------------------------
  679. !
  680. DO J=MYJS4_P1,MYJE4_P1
  681. DO I=MYIS_P1,MYIE_P1
  682. !
  683. !-----------------------------------------------------------------------
  684. !*** THE NS AND EW FLUXES ARE ON H POINTS FOR U AND V.
  685. !-----------------------------------------------------------------------
  686. !
  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))
  695. !
  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. !-----------------------------------------------------------------------
  700. !
  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))
  709. !
  710. !-----------------------------------------------------------------------
  711. !
  712. ENDDO
  713. ENDDO
  714. !
  715. !-----------------------------------------------------------------------
  716. !*** COMPUTE THE ADVECTION TENDENCIES FOR U AND V.
  717. !*** THE AD ARRAYS ARE ON THE VELOCITY POINTS.
  718. !-----------------------------------------------------------------------
  719. !
  720. DO J=MYJS5,MYJE5
  721. DO I=MYIS2,MYIE2
  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)
  727. !
  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)
  733. ENDDO
  734. ENDDO
  735. !
  736. !-----------------------------------------------------------------------
  737. !
  738. !*** END OF JANJIC HORIZONTAL ADVECTION
  739. !
  740. !-----------------------------------------------------------------------
  741. !
  742. !*** UPSTREAM ADVECTION OF T
  743. !
  744. !-----------------------------------------------------------------------
  745. !
  746. upstream: IF(UPSTRM)THEN
  747. !
  748. !-----------------------------------------------------------------------
  749. !***
  750. !*** COMPUTE UPSTREAM COMPUTATIONS ON THIS TASK'S ROWS.
  751. !***
  752. !-----------------------------------------------------------------------
  753. !
  754. jloop_upstream: DO J=MYJS2,MYJE2
  755. !
  756. N_IUPH_J=N_IUP_H(J) ! See explanation in START_DOMAIN_NMM
  757. DO II=0,N_IUPH_J-1
  758. !
  759. I=IUP_H(IMS+II,J)
  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))
  764. PP=-TTA-TTB
  765. QP= TTA-TTB
  766. !
  767. IF(PP<0.)THEN
  768. ISPA(I,J)=-1
  769. ELSE
  770. ISPA(I,J)= 1
  771. ENDIF
  772. !
  773. IF(QP<0.)THEN
  774. ISQA(I,J)=-1
  775. ELSE
  776. ISQA(I,J)= 1
  777. ENDIF
  778. !
  779. PP=ABS(PP)
  780. QP=ABS(QP)
  781. ARRAY3_X=PP*QP
  782. ARRAY0(I,J)=ARRAY3_X-PP-QP
  783. ARRAY1(I,J)=PP-ARRAY3_X
  784. ARRAY2(I,J)=QP-ARRAY3_X
  785. ARRAY3(I,J)=ARRAY3_X
  786. ENDDO
  787. !
  788. !-----------------------------------------------------------------------
  789. !
  790. N_IUPADH_J=N_IUP_ADH(J)
  791. KNTI_ADH=1
  792. IUP_ADH_J=IUP_ADH(IMS,J)
  793. !
  794. iloop_T: DO II=0,N_IUPH_J-1
  795. !
  796. I=IUP_H(IMS+II,J)
  797. !
  798. ISP=ISPA(I,J)
  799. ISQ=ISQA(I,J)
  800. IFP=(ISP-1)/2
  801. IFQ=(-ISQ-1)/2
  802. IPQ=(ISP-ISQ)/2
  803. !
  804. !-----------------------------------------------------------------------
  805. !
  806. IF(I==IUP_ADH_J)THEN ! Upstream advection T tendencies
  807. !
  808. ISP=ISPA(I,J)
  809. ISQ=ISQA(I,J)
  810. IFP=(ISP-1)/2
  811. IFQ=(-ISQ-1)/2
  812. IPQ=(ISP-ISQ)/2
  813. !
  814. F0=ARRAY0(I,J)
  815. F1=ARRAY1(I,J)
  816. F2=ARRAY2(I,J)
  817. F3=ARRAY3(I,J)
  818. !
  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)
  823. !
  824. !-----------------------------------------------------------------------
  825. !
  826. IF(KNTI_ADH<N_IUPADH_J)THEN
  827. IUP_ADH_J=IUP_ADH(IMS+KNTI_ADH,J)
  828. KNTI_ADH=KNTI_ADH+1
  829. ENDIF
  830. !
  831. ENDIF ! End of upstream advection T tendency IF block
  832. !
  833. ENDDO iloop_T
  834. !
  835. !-----------------------------------------------------------------------
  836. !
  837. !*** UPSTREAM ADVECTION OF VELOCITY COMPONENTS
  838. !
  839. !-----------------------------------------------------------------------
  840. !
  841. N_IUPADV_J=N_IUP_ADV(J)
  842. !
  843. DO II=0,N_IUPADV_J-1
  844. I=IUP_ADV(IMS+II,J)
  845. !
  846. TTA=EM_LOC(J)*UST(I,J)
  847. TTB=EN *VST(I,J)
  848. PP=-TTA-TTB
  849. QP=TTA-TTB
  850. !
  851. IF(PP<0.)THEN
  852. ISP=-1
  853. ELSE
  854. ISP= 1
  855. ENDIF
  856. !
  857. IF(QP<0.)THEN
  858. ISQ=-1
  859. ELSE
  860. ISQ= 1
  861. ENDIF
  862. !
  863. IFP=(ISP-1)/2
  864. IFQ=(-ISQ-1)/2
  865. IPQ=(ISP-ISQ)/2
  866. PP=ABS(PP)
  867. QP=ABS(QP)
  868. F3=PP*QP
  869. F0=F3-PP-QP
  870. F1=PP-F3
  871. F2=QP-F3
  872. !
  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)
  877. !
  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)
  882. !
  883. ENDDO
  884. !
  885. ENDDO jloop_upstream
  886. !
  887. !-----------------------------------------------------------------------
  888. !
  889. ENDIF upstream
  890. !
  891. !-----------------------------------------------------------------------
  892. !
  893. !*** END OF HORIZONTAL ADVECTION
  894. !
  895. !-----------------------------------------------------------------------
  896. !
  897. !*** NOW SUM THE VERTICAL AND HORIZONTAL TENDENCIES,
  898. !*** CURVATURE AND CORIOLIS TERMS.
  899. !
  900. !-----------------------------------------------------------------------
  901. !
  902. DO J=MYJS2,MYJE2
  903. DO I=MYIS1,MYIE1
  904. HM=HBM2(I,J)
  905. VM=VBM2(I,J)
  906. ADT(I,J)=(VAD_TEND_T(I,J,K)+2.*ADT(I,J))*HM
  907. !
  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
  911. ENDDO
  912. ENDDO
  913. !
  914. !-----------------------------------------------------------------------
  915. !*** SAVE THE OLD VALUES FOR TIMESTEPPING
  916. !-----------------------------------------------------------------------
  917. !
  918. DO J=MYJS_P4,MYJE_P4
  919. DO I=MYIS_P4,MYIE_P4
  920. TOLD(I,J,K)=T(I,J,K)
  921. UOLD(I,J,K)=U(I,J,K)
  922. VOLD(I,J,K)=V(I,J,K)
  923. ENDDO
  924. ENDDO
  925. !
  926. !-----------------------------------------------------------------------
  927. !*** FINALLY UPDATE THE PROGNOSTIC VARIABLES
  928. !-----------------------------------------------------------------------
  929. !
  930. DO J=MYJS2,MYJE2
  931. DO I=MYIS1,MYIE1
  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)
  935. ENDDO
  936. ENDDO
  937. !
  938. !-----------------------------------------------------------------------
  939. !
  940. ENDDO main_horizontal
  941. !
  942. !-----------------------------------------------------------------------
  943. !
  944. END SUBROUTINE ADVE
  945. !
  946. !-----------------------------------------------------------------------
  947. !
  948. !***********************************************************************
  949. SUBROUTINE VAD2(NTSD,DT,IDTAD,DX,DY &
  950. & ,AETA1,AETA2,DETA1,DETA2,PDSL,PDTOP,HBM2 &
  951. & ,Q,Q2,CWM,PETDT &
  952. & ,N_IUP_H,N_IUP_V &
  953. & ,N_IUP_ADH,N_IUP_ADV &
  954. & ,IUP_H,IUP_V,IUP_ADH,IUP_ADV &
  955. & ,IHE,IHW,IVE,IVW &
  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
  961. ! . . .
  962. ! SUBPROGRAM: VAD2 VERTICAL ADVECTION OF H2O SUBSTANCE AND TKE
  963. ! PRGRMMR: JANJIC ORG: W/NP22 DATE: 96-07-19
  964. !
  965. ! ABSTRACT:
  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.
  969. !
  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
  979. !
  980. ! USAGE: CALL VAD2 FROM SUBROUTINE SOLVE_NMM
  981. ! INPUT ARGUMENT LIST:
  982. !
  983. ! OUTPUT ARGUMENT LIST
  984. !
  985. ! OUTPUT FILES:
  986. ! NONE
  987. ! SUBPROGRAMS CALLED:
  988. !
  989. ! UNIQUE: NONE
  990. !
  991. ! LIBRARY: NONE
  992. !
  993. ! ATTRIBUTES:
  994. ! LANGUAGE: FORTRAN 90
  995. ! MACHINE : IBM SP
  996. !$$$
  997. !***********************************************************************
  998. !----------------------------------------------------------------------
  999. !
  1000. IMPLICIT NONE
  1001. !
  1002. !----------------------------------------------------------------------
  1003. !
  1004. INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
  1005. & ,IMS,IME,JMS,JME,KMS,KME &
  1006. ,ITS,ITE,JTS,JTE,KTS,KTE
  1007. !
  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 &
  1012. & ,IUP_ADH,IUP_ADV
  1013. !
  1014. INTEGER,INTENT(IN) :: IDTAD,NTSD
  1015. !
  1016. REAL,INTENT(IN) :: DT,DY,PDTOP
  1017. !
  1018. REAL,DIMENSION(KMS:KME),INTENT(IN) :: AETA1,AETA2,DETA1,DETA2
  1019. !
  1020. REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: DX,HBM2,PDSL
  1021. !
  1022. REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: PETDT
  1023. !
  1024. REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: CWM,Q,Q2
  1025. !
  1026. !*** LOCAL VARIABLES
  1027. !----------------------------------------------------------------------
  1028. !
  1029. REAL,PARAMETER :: FF1=0.500
  1030. !
  1031. LOGICAL,SAVE :: TRADITIONAL=.TRUE.
  1032. !
  1033. INTEGER :: I,IRECV,J,JFP,JFQ,K,LAP,LLAP
  1034. !
  1035. INTEGER,DIMENSION(KTS:KTE) :: LA
  1036. !
  1037. REAL*8 :: ADDT,AFRP,D2PQE,D2PQQ,D2PQW,DEP,DETAP,DQP &
  1038. & ,DWP,E00,E4P,EP,EP0,HADDT,HBM2IJ &
  1039. & ,Q00,Q4P,QP,QP0 &
  1040. & ,rdpdn,rdpup,sfacek,sfacqk,sfacwk,RFC,RR &
  1041. & ,SUMNE,SUMNQ,SUMNW,SUMPE,SUMPQ,SUMPW &
  1042. & ,W00,W4P,WP,WP0
  1043. !
  1044. REAL,DIMENSION(KTS:KTE) :: AFR,DEL,DQL,DWL,E3,E4,PETDTK &
  1045. & ,RFACE,RFACQ,RFACW,Q3,Q4,W3,W4
  1046. !
  1047. !-----------------------------------------------------------------------
  1048. !***********************************************************************
  1049. !-----------------------------------------------------------------------
  1050. !
  1051. ADDT=REAL(IDTAD)*DT
  1052. !
  1053. !-----------------------------------------------------------------------
  1054. !$omp parallel do &
  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. !-----------------------------------------------------------------------
  1061. !
  1062. main_integration: DO J=MYJS2,MYJE2
  1063. !
  1064. !-----------------------------------------------------------------------
  1065. !
  1066. main_iloop: DO I=MYIS1_P1,MYIE1_P1
  1067. !
  1068. !-----------------------------------------------------------------------
  1069. !
  1070. E3(KTE)=Q2(I,J,KTE)*0.5
  1071. !
  1072. DO K=KTE-1,KTS,-1
  1073. E3(K)=MAX((Q2(I,J,K+1)+Q2(I,J,K))*0.5,EPSQ2)
  1074. ENDDO
  1075. !
  1076. DO K=KTS,KTE
  1077. Q3(K)=MAX(Q(I,J,K),EPSQ)
  1078. W3(K)=MAX(CWM(I,J,K),CLIMIT)
  1079. E4(K)=E3(K)
  1080. Q4(K)=Q3(K)
  1081. W4(K)=W3(K)
  1082. ENDDO
  1083. !
  1084. IF(TRADITIONAL)THEN
  1085. PETDTK(KTE)=PETDT(I,J,KTE-1)*0.5
  1086. !
  1087. DO K=KTE-1,KTS+1,-1
  1088. PETDTK(K)=(PETDT(I,J,K)+PETDT(I,J,K-1))*0.5
  1089. ENDDO
  1090. !
  1091. PETDTK(KTS)=PETDT(I,J,KTS)*0.5
  1092. !
  1093. ELSE
  1094. !
  1095. !-----------------------------------------------------------------------
  1096. !*** PERFORM HORIZONTAL AVERAGING OF VERTICAL VELOCITY
  1097. !-----------------------------------------------------------------------
  1098. !
  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
  1104. !
  1105. DO K=KTE-1,KTS+1,-1
  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. &
  1115. & )*0.0625
  1116. ENDDO
  1117. !
  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
  1123. ENDIF
  1124. !
  1125. !-----------------------------------------------------------------------
  1126. !
  1127. HADDT=-ADDT*HBM2(I,J)
  1128. !
  1129. DO K=KTE,KTS,-1
  1130. RR=PETDTK(K)*HADDT
  1131. !
  1132. IF(RR<0.)THEN
  1133. LAP=1
  1134. ELSE
  1135. LAP=-1
  1136. ENDIF
  1137. !
  1138. LA(K)=LAP
  1139. LLAP=K+LAP
  1140. !
  1141. if(llap.gt.kts-1.and.llap.lt.kte+1) then ! internal and outflow pts.
  1142. rr=abs(rr &
  1143. & /((aeta1(llap)-aeta1(k))*pdtop &
  1144. & +(aeta2(llap)-aeta2(k))*pdsl(i,j)))
  1145. if(rr.gt.0.999) rr=0.999
  1146. !
  1147. AFR(K)=(((FF4*RR+FF3)*RR+FF2)*RR+FF1)*RR
  1148. dql(k)=(q3(llap)-q3(k))*rr
  1149. dwl(k)=(w3(llap)-w3(k))*rr
  1150. del(k)=(e3(llap)-e3(k))*rr
  1151. elseif(llap.eq.kts-1) then
  1152. !
  1153. !chem rr=abs(rr &
  1154. !chem /((1.-aeta2(kts))*pdsl(i,j)))
  1155. !chem afr(kts)=0.
  1156. !chem dql(kts)=(epsq -q3(kts))*rr
  1157. !chem dwl(kts)=(climit-w3(kts))*rr
  1158. !chem del(kts)=(epsq2 -e3(kts))*rr
  1159. !
  1160. rr=0.
  1161. afr(kts)=0.
  1162. dql(kts)=0.
  1163. dwl(kts)=0.
  1164. del(kts)=0.
  1165. else
  1166. rr=abs(rr &
  1167. /(aeta1(kte)*pdtop))
  1168. afr(kte)=0.
  1169. dql(kte)=(epsq -q3(kte))*rr
  1170. dwl(kte)=(climit-w3(kte))*rr
  1171. del(kte)=(epsq2 -e3(kte))*rr
  1172. endif
  1173. ENDDO
  1174. !
  1175. !-----------------------------------------------------------------------
  1176. !
  1177. DO K=KTS,KTE
  1178. Q4(K)=Q3(K)+DQL(K)
  1179. W4(K)=W3(K)+DWL(K)
  1180. E4(K)=E3(K)+DEL(K)
  1181. ENDDO
  1182. !
  1183. !-----------------------------------------------------------------------
  1184. !*** ANTI-FILTERING STEP
  1185. !-----------------------------------------------------------------------
  1186. !
  1187. SUMPQ=0.
  1188. SUMNQ=0.
  1189. SUMPW=0.
  1190. SUMNW=0.
  1191. SUMPE=0.
  1192. SUMNE=0.
  1193. !
  1194. !*** ANTI-FILTERING LIMITERS
  1195. !
  1196. antifilter: DO K=KTE-1,KTS+1,-1
  1197. !
  1198. DETAP=DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J)
  1199. !
  1200. DQL(K)=0.
  1201. DWL(K)=0.
  1202. DEL(K)=0.
  1203. !
  1204. Q4P=Q4(K)
  1205. W4P=W4(K)
  1206. E4P=E4(K)
  1207. !
  1208. LAP=LA(K)
  1209. !
  1210. if(lap.ne.0)then
  1211. rdpdn=1./((aeta1(k+lap)-aeta1(k))*pdtop &
  1212. & +(aeta2(k+lap)-aeta2(k))*pdsl(i,j))
  1213. rdpup=1./((aeta1(k)-aeta1(k-lap))*pdtop &
  1214. & +(aeta2(k)-aeta2(k-lap))*pdsl(i,j))
  1215. !
  1216. afrp=afr(k)*detap
  1217. !
  1218. d2pqq=((q4(k+lap)-q4p)*rdpdn &
  1219. & -(q4p-q4(k-lap))*rdpup)*afrp
  1220. d2pqw=((w4(k+lap)-w4p)*rdpdn &
  1221. & -(w4p-w4(k-lap))*rdpup)*afrp
  1222. d2pqe=((e4(k+lap)-e4p)*rdpdn &
  1223. & -(e4p-e4(k-lap))*rdpup)*afrp
  1224. ELSE
  1225. D2PQQ=0.
  1226. D2PQW=0.
  1227. D2PQE=0.
  1228. ENDIF
  1229. !
  1230. QP=Q4P-D2PQQ
  1231. WP=W4P-D2PQW
  1232. EP=E4P-D2PQE
  1233. !
  1234. Q00=Q3(K)
  1235. QP0=Q3(K+LAP)
  1236. !
  1237. W00=W3(K)
  1238. WP0=W3(K+LAP)
  1239. !
  1240. E00=E3(K)
  1241. EP0=E3(K+LAP)
  1242. !
  1243. IF(LAP/=0)THEN
  1244. QP=MAX(QP,MIN(Q00,QP0))
  1245. QP=MIN(QP,MAX(Q00,QP0))
  1246. WP=MAX(WP,MIN(W00,WP0))
  1247. WP=MIN(WP,MAX(W00,WP0))
  1248. EP=MAX(EP,MIN(E00,EP0))
  1249. EP=MIN(EP,MAX(E00,EP0))
  1250. ENDIF
  1251. !
  1252. dqp=qp-q4p
  1253. dwp=wp-w4p
  1254. dep=ep-e4p
  1255. !
  1256. DQL(K)=DQP
  1257. DWL(K)=DWP
  1258. DEL(K)=DEP
  1259. !
  1260. DQP=DQP*DETAP
  1261. DWP=DWP*DETAP
  1262. DEP=DEP*DETAP
  1263. !
  1264. IF(DQP>0.)THEN
  1265. SUMPQ=SUMPQ+DQP
  1266. ELSE
  1267. SUMNQ=SUMNQ+DQP
  1268. ENDIF
  1269. !
  1270. IF(DWP>0.)THEN
  1271. SUMPW=SUMPW+DWP
  1272. ELSE
  1273. SUMNW=SUMNW+DWP
  1274. ENDIF
  1275. !
  1276. IF(DEP>0.)THEN
  1277. SUMPE=SUMPE+DEP
  1278. ELSE
  1279. SUMNE=SUMNE+DEP
  1280. ENDIF
  1281. !
  1282. ENDDO antifilter
  1283. !
  1284. !-----------------------------------------------------------------------
  1285. !
  1286. DQL(KTS)=0.
  1287. DWL(KTS)=0.
  1288. DEL(KTS)=0.
  1289. !
  1290. DQL(KTE)=0.
  1291. DWL(KTE)=0.
  1292. DEL(KTE)=0.
  1293. !
  1294. !-----------------------------------------------------------------------
  1295. !*** FIRST MOMENT CONSERVING FACTOR
  1296. !-----------------------------------------------------------------------
  1297. !
  1298. if(sumpq*(-sumnq).gt.1.e-9) then
  1299. sfacqk=-sumnq/sumpq
  1300. else
  1301. sfacqk=0.
  1302. endif
  1303. !
  1304. if(sumpw*(-sumnw).gt.1.e-9) then
  1305. sfacwk=-sumnw/sumpw
  1306. else
  1307. sfacwk=0.
  1308. endif
  1309. !
  1310. if(sumpe*(-sumne).gt.1.e-9) then
  1311. sfacek=-sumne/sumpe
  1312. else
  1313. sfacek=0.
  1314. endif
  1315. !
  1316. !-----------------------------------------------------------------------
  1317. !*** IMPOSE CONSERVATION ON ANTI-FILTERING
  1318. !-----------------------------------------------------------------------
  1319. !
  1320. DO K=KTE,KTS,-1
  1321. !
  1322. dqp=dql(k)
  1323. if(sfacqk.gt.0.) then
  1324. if(sfacqk.ge.1.) then
  1325. if(dqp.lt.0.) dqp=dqp/sfacqk
  1326. else
  1327. if(dqp.gt.0.) dqp=dqp*sfacqk
  1328. endif
  1329. else
  1330. dqp=0.
  1331. endif
  1332. q (i,j,k)=q4(k)+dqp
  1333. !
  1334. dwp=dwl(k)
  1335. if(sfacwk.gt.0.) then
  1336. if(sfacwk.ge.1.) then
  1337. if(dwp.lt.0.) dwp=dwp/sfacwk
  1338. else
  1339. if(dwp.gt.0.) dwp=dwp*sfacwk
  1340. endif
  1341. else
  1342. dwp=0.
  1343. endif
  1344. cwm(i,j,k)=w4(k)+dwp
  1345. !
  1346. dep=del(k)
  1347. if(sfacek.gt.0.) then
  1348. if(sfacek.ge.1.) then
  1349. if(dep.lt.0.) dep=dep/sfacek
  1350. else
  1351. if(dep.gt.0.) dep=dep*sfacek
  1352. endif
  1353. else
  1354. dep=0.
  1355. endif
  1356. e3 ( k)=e4(k)+dep
  1357. !
  1358. ENDDO
  1359. !-----------------------------------------------------------------------
  1360. HBM2IJ=HBM2(I,J)
  1361. Q2(I,J,KTE)=MAX(E3(KTE)+E3(KTE)-EPSQ2,EPSQ2)*HBM2IJ &
  1362. & +Q2(I,J,KTE)*(1.-HBM2IJ)
  1363. DO K=KTE-1,KTS+1,-1
  1364. Q2(I,J,K)=MAX(E3(K)+E3(K)-Q2(I,J,K+1),EPSQ2)*HBM2IJ &
  1365. & +Q2(I,J,K)*(1.-HBM2IJ)
  1366. ENDDO
  1367. !-----------------------------------------------------------------------
  1368. !
  1369. ENDDO main_iloop
  1370. !
  1371. !-----------------------------------------------------------------------
  1372. !
  1373. ENDDO main_integration
  1374. !
  1375. !-----------------------------------------------------------------------
  1376. !
  1377. END SUBROUTINE VAD2
  1378. !
  1379. !-----------------------------------------------------------------------
  1380. !
  1381. !-----------------------------------------------------------------------
  1382. !***********************************************************************
  1383. SUBROUTINE HAD2( &
  1384. #if defined(DM_PARALLEL)
  1385. & domdesc , &
  1386. #endif
  1387. & NTSD,DT,IDTAD,DX,DY &
  1388. & ,AETA1,AETA2,DETA1,DETA2,PDSL,PDTOP &
  1389. & ,HBM2,HBM3 &
  1390. & ,Q,Q2,CWM,U,V,Z,HYDRO &
  1391. & ,N_IUP_H,N_IUP_V &
  1392. & ,N_IUP_ADH,N_IUP_ADV &
  1393. & ,IUP_H,IUP_V,IUP_ADH,IUP_ADV &
  1394. & ,IHE,IHW,IVE,IVW &
  1395. & ,IDS,IDE,JDS,JDE,KDS,KDE &
  1396. & ,IMS,IME,JMS,JME,KMS,KME &
  1397. & ,ITS,ITE,JTS,JTE,KTS,KTE)
  1398. !***********************************************************************
  1399. !$$$ SUBPROGRAM DOCUMENTATION BLOCK
  1400. ! . . .
  1401. ! SUBPROGRAM: HAD2 HORIZONTAL ADVECTION OF H2O AND TKE
  1402. ! PRGRMMR: JANJIC ORG: W/NP22 DATE: 96-07-19
  1403. !
  1404. ! ABSTRACT:
  1405. ! HAD2 CALCULATES THE CONTRIBUTION OF THE HORIZONTAL ADVECTION
  1406. ! TO THE TENDENCIES OF WATER SUBSTANCE AND TKE AND THEN
  1407. ! UPDATES THOSE VARIABLES. AN ANTI-FILTERING TECHNIQUE IS USED.
  1408. !
  1409. ! PROGRAM HISTORY LOG:
  1410. ! 96-07-19 JANJIC - ORIGINATOR
  1411. ! 98-11-02 BLACK - MODIFIED FOR DISTRIBUTED MEMORY
  1412. ! 99-03-17 TUCCILLO - INCORPORATED MPI_ALLREDUCE FOR GLOBAL SUM
  1413. ! 02-02-06 BLACK - CONVERTED TO WRF FORMAT
  1414. ! 02-09-06 WOLFE - MORE CONVERSION TO GLOBAL INDEXING
  1415. ! 03-05-23 JANJIC - ADDED SLOPE FACTOR
  1416. ! 04-11-23 BLACK - THREADED
  1417. ! 05-12-14 BLACK - CONVERTED FROM IKJ TO IJK
  1418. ! 07-08-14 janjic - no conservation in advection step
  1419. !
  1420. ! USAGE: CALL HAD2 FROM SUBROUTINE SOLVE_NMM
  1421. ! INPUT ARGUMENT LIST:
  1422. !
  1423. ! OUTPUT ARGUMENT LIST
  1424. !
  1425. ! OUTPUT FILES:
  1426. ! NONE
  1427. ! SUBPROGRAMS CALLED:
  1428. !
  1429. ! UNIQUE: NONE
  1430. !
  1431. ! LIBRARY: NONE
  1432. !
  1433. ! ATTRIBUTES:
  1434. ! LANGUAGE: FORTRAN 90
  1435. ! MACHINE : IBM SP
  1436. !$$$
  1437. !***********************************************************************
  1438. !-----------------------------------------------------------------------
  1439. !
  1440. IMPLICIT NONE
  1441. !
  1442. !-----------------------------------------------------------------------
  1443. !
  1444. INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
  1445. & ,IMS,IME,JMS,JME,KMS,KME &
  1446. & ,ITS,ITE,JTS,JTE,KTS,KTE
  1447. !
  1448. INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW
  1449. INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: N_IUP_H,N_IUP_V &
  1450. & ,N_IUP_ADH,N_IUP_ADV
  1451. INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: IUP_H,IUP_V &
  1452. & ,IUP_ADH,IUP_ADV
  1453. !
  1454. !-----------------------------------------------------------------------
  1455. !
  1456. INTEGER,INTENT(IN) :: IDTAD,NTSD
  1457. !
  1458. REAL,INTENT(IN) :: DT,DY,PDTOP
  1459. !
  1460. REAL,DIMENSION(KMS:KME),INTENT(IN) :: AETA1,AETA2,DETA1,DETA2
  1461. !
  1462. REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: DX,HBM2,HBM3,PDSL
  1463. !
  1464. REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: U,V,Z
  1465. !
  1466. REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(INOUT) :: CWM,Q,Q2
  1467. !
  1468. LOGICAL,INTENT(IN) :: HYDRO
  1469. !
  1470. !-----------------------------------------------------------------------
  1471. !*** LOCAL VARIABLES
  1472. !-----------------------------------------------------------------------
  1473. !
  1474. REAL,PARAMETER :: FF1=0.530
  1475. !
  1476. #ifdef DM_PARALLEL
  1477. INTEGER :: DOMDESC
  1478. #endif
  1479. !
  1480. #if defined(BIT_FOR_BIT) && defined(DM_PARALLEL) && !defined(STUBMPI)
  1481. LOGICAL,EXTERNAL :: WRF_DM_ON_MONITOR
  1482. REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME,6) :: XSUMS_L
  1483. REAL,DIMENSION(IDS:IDE,JDS:JDE,KDS:KDE,6) :: XSUMS_G
  1484. #endif
  1485. !
  1486. LOGICAL :: BOT,TOP
  1487. !
  1488. INTEGER :: I,IRECV,J,JFP,JFQ,K,LAP,LLAP,MPI_COMM_COMP
  1489. INTEGER :: N
  1490. !
  1491. INTEGER,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5,KTS:KTE) :: IFPA,IFPF &
  1492. & ,IFQA,IFQF &
  1493. & ,JFPA,JFPF &
  1494. & ,JFQA,JFQF
  1495. !
  1496. REAL :: ADDT,AFRP,CRIT,D2PQE,D2PQQ,D2PQW,DEP,DESTIJ,DQP,DQSTIJ &
  1497. & ,DVOLP,DWP,DWSTIJ,DZA,DZB,E00,E0Q,E1X,E2IJ,E4P,ENH,EP,EP0 &
  1498. & ,ESTIJ,FPQ,HAFP,HAFQ,HBM2IJ,HM,PP,PPQ00,Q00,Q0Q &
  1499. & ,Q1IJ,Q4P,QP,QP0,QSTIJ,RDY,RFACE,RFACQ,RFACW,RFC &
  1500. & ,RFEIJ,RFQIJ,RFWIJ,RR,SLOPAC,SPP,SQP,SSA,SSB,SUMNE,SUMNQ &
  1501. & ,SUMNW,SUMPE,SUMPQ,SUMPW,TTA,TTB,W00,W0Q,W1IJ,W4P,WP,WP0 &
  1502. & ,WSTIJ
  1503. !
  1504. DOUBLE PRECISION,DIMENSION(6,KTS:KTE) :: GSUMS,XSUMS
  1505. !
  1506. REAL,DIMENSION(KTS:KTE) :: AFR,DEL,DQL,DWL,E3,E4 &
  1507. & ,Q3,Q4,W3,W4
  1508. !
  1509. REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5) :: DARE,EMH
  1510. !
  1511. REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5,KTS:KTE) :: AFP,AFQ,DEST &
  1512. & ,DQST,DVOL,DWST &
  1513. & ,E1,E2,Q1,W1
  1514. !-----------------------------------------------------------------------
  1515. integer :: nunit,ier
  1516. save nunit
  1517. !-----------------------------------------------------------------------
  1518. !***********************************************************************
  1519. !-----------------------------------------------------------------------
  1520. !
  1521. RDY=1./DY
  1522. SLOPAC=SLOPHT*SQRT(2.)*0.5*50.
  1523. CRIT=SLOPAC*REAL(IDTAD)*DT*RDY*1000.
  1524. !
  1525. ADDT=REAL(IDTAD)*DT
  1526. ENH=ADDT/(08.*DY)
  1527. !
  1528. !-----------------------------------------------------------------------
  1529. !$omp parallel do &
  1530. !$omp& private(i,j)
  1531. DO J=MYJS_P3,MYJE_P3
  1532. DO I=MYIS_P2,MYIE_P2
  1533. EMH (I,J)=ADDT/(08.*DX(I,J))
  1534. DARE(I,J)=HBM3(I,J)*DX(I,J)*DY
  1535. E1(I,J,KTE)=MAX(Q2(I,J,KTE)*0.5,EPSQ2)
  1536. E2(I,J,KTE)=E1(I,J,KTE)
  1537. ENDDO
  1538. ENDDO
  1539. !-----------------------------------------------------------------------
  1540. !$omp parallel do &
  1541. !$omp& private(dza,dzb,e1x,fpq,hm,i,j,jfp,jfq,k,pp,qp,ssa,ssb,spp,sqp &
  1542. !$omp& ,tta,ttb)
  1543. !-----------------------------------------------------------------------
  1544. !
  1545. vertical_1: DO K=KTS,KTE
  1546. !
  1547. !-----------------------------------------------------------------------
  1548. !
  1549. DO J=MYJS_P3,MYJE_P3
  1550. DO I=MYIS_P2,MYIE_P2
  1551. DVOL(I,J,K)=DARE(I,J)*(DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J))
  1552. Q (I,J,K)=MAX(Q (I,J,K),EPSQ)
  1553. CWM(I,J,K)=MAX(CWM(I,J,K),CLIMIT)
  1554. Q1 (I,J,K)=Q (I,J,K)
  1555. W1 (I,J,K)=CWM(I,J,K)
  1556. ENDDO
  1557. ENDDO
  1558. !
  1559. IF(K<KTE)THEN
  1560. DO J=MYJS_P3,MYJE_P3
  1561. DO I=MYIS_P2,MYIE_P2
  1562. E1X=(Q2(I,J,K+1)+Q2(I,J,K))*0.5
  1563. E1(I,J,K)=MAX(E1X,EPSQ2)
  1564. E2(I,J,K)=E1(I,J,K)
  1565. ENDDO
  1566. ENDDO
  1567. ENDIF
  1568. !
  1569. !-----------------------------------------------------------------------
  1570. !
  1571. DO J=MYJS2_P1,MYJE2_P1
  1572. DO I=MYIS1_P1,MYIE1_P1
  1573. !
  1574. HM=HBM2(I,J)
  1575. TTA=(U(I,J-1,K)+U(I+IHW(J),J,K)+U(I+IHE(J),J,K)+U(I,J+1,K)) &
  1576. & *EMH(I,J)*HM
  1577. TTB=(V(I,J-1,K)+V(I+IHW(J),J,K)+V(I+IHE(J),J,K)+V(I,J+1,K)) &
  1578. & *ENH*HBM2(I,J)
  1579. !
  1580. SPP=-TTA-TTB
  1581. SQP= TTA-TTB
  1582. !
  1583. IF(SPP<0.)THEN
  1584. JFP=-1
  1585. ELSE
  1586. JFP=1
  1587. ENDIF
  1588. IF(SQP<0.)THEN
  1589. JFQ=-1
  1590. ELSE
  1591. JFQ=1
  1592. ENDIF
  1593. !
  1594. IFPA(I,J,K)=IHE(J)+I+( JFP-1)/2
  1595. IFQA(I,J,K)=IHE(J)+I+(-JFQ-1)/2
  1596. !
  1597. JFPA(I,J,K)=J+JFP
  1598. JFQA(I,J,K)=J+JFQ
  1599. !
  1600. IFPF(I,J,K)=IHE(J)+I+(-JFP-1)/2
  1601. IFQF(I,J,K)=IHE(J)+I+( JFQ-1)/2
  1602. !
  1603. JFPF(I,J,K)=J-JFP
  1604. JFQF(I,J,K)=J-JFQ
  1605. ! if(i==111.and.j==438.and.k==1)then
  1606. ! endif
  1607. !
  1608. !-----------------------------------------------------------------------
  1609. IF(.NOT.HYDRO)THEN ! z currently not available for hydro=.true.
  1610. DZA=(Z(IFPA(I,J,K),JFPA(I,J,K),K)-Z(I,J,K))*RDY
  1611. DZB=(Z(IFQA(I,J,K),JFQA(I,J,K),K)-Z(I,J,K))*RDY
  1612. !
  1613. IF(ABS(DZA)>SLOPAC)THEN
  1614. SSA=DZA*SPP
  1615. IF(SSA>CRIT)THEN
  1616. SPP=0. !spp*.1
  1617. ENDIF
  1618. ENDIF
  1619. !
  1620. IF(ABS(DZB)>SLOPAC)THEN
  1621. SSB=DZB*SQP
  1622. IF(SSB>CRIT)THEN
  1623. SQP=0. !sqp*.1
  1624. ENDIF
  1625. ENDIF
  1626. !
  1627. ENDIF
  1628. !
  1629. !-----------------------------------------------------------------------
  1630. !
  1631. FPQ=SPP*SQP*0.25
  1632. PP=ABS(SPP)
  1633. QP=ABS(SQP)
  1634. !
  1635. AFP(I,J,K)=(((FF4*PP+FF3)*PP+FF2)*PP+FF1)*PP
  1636. AFQ(I,J,K)=(((FF4*QP+FF3)*QP+FF2)*QP+FF1)*QP
  1637. !
  1638. Q1(I,J,K)=(Q (IFPA(I,J,K),JFPA(I,J,K),K)-Q (I,J,K))*PP &
  1639. & +(Q (IFQA(I,J,K),JFQA(I,J,K),K)-Q (I,J,K))*QP &
  1640. & +(Q (I,J-2,K)+Q (I,J+2,K) &
  1641. & -Q (I-1,J,K)-Q (I+1,J,K))*FPQ &
  1642. & +Q(I,J,K)
  1643. !
  1644. W1(I,J,K)=(CWM(IFPA(I,J,K),JFPA(I,J,K),K)-CWM(I,J,K))*PP &
  1645. & +(CWM(IFQA(I,J,K),JFQA(I,J,K),K)-CWM(I,J,K))*QP &
  1646. & +(CWM(I,J-2,K)+CWM(I,J+2,K) &
  1647. & -CWM(I-1,J,K)-CWM(I+1,J,K))*FPQ &
  1648. & +CWM(I,J,K)
  1649. !
  1650. E2(I,J,K)=(E1 (IFPA(I,J,K),JFPA(I,J,K),K)-E1 (I,J,K))*PP &
  1651. & +(E1 (IFQA(I,J,K),JFQA(I,J,K),K)-E1 (I,J,K))*QP &
  1652. & +(E1 (I,J-2,K)+E1 (I,J+2,K) &
  1653. & -E1 (I-1,J,K)-E1 (I+1,J,K))*FPQ &
  1654. & +E1(I,J,K)
  1655. !
  1656. ENDDO
  1657. ENDDO
  1658. !
  1659. !-----------------------------------------------------------------------
  1660. !
  1661. ENDDO vertical_1
  1662. !
  1663. !-----------------------------------------------------------------------
  1664. !*** ANTI-FILTERING STEP
  1665. !-----------------------------------------------------------------------
  1666. !
  1667. DO K=KTS,KTE
  1668. XSUMS(1,K)=0.
  1669. XSUMS(2,K)=0.
  1670. XSUMS(3,K)=0.
  1671. XSUMS(4,K)=0.
  1672. XSUMS(5,K)=0.
  1673. XSUMS(6,K)=0.
  1674. ENDDO
  1675. !-----------------------------------------------------------------------
  1676. !
  1677. !*** ANTI-FILTERING LIMITERS
  1678. !
  1679. !-----------------------------------------------------------------------
  1680. #if defined(BIT_FOR_BIT) && defined(DM_PARALLEL) && !defined(STUBMPI)
  1681. DO N=1,6
  1682. !
  1683. !$omp parallel do &
  1684. !$omp& private(i,j,k)
  1685. DO K=KMS,KME
  1686. DO J=JMS,JME
  1687. DO I=IMS,IME
  1688. XSUMS_L(I,J,K,N)=0.
  1689. ENDDO
  1690. ENDDO
  1691. ENDDO
  1692. !
  1693. !$omp parallel do &
  1694. !$omp& private(i,j,k)
  1695. DO K=KDS,KDE
  1696. DO J=JDS,JDE
  1697. DO I=IDS,IDE
  1698. XSUMS_G(I,J,K,N)=0.
  1699. ENDDO
  1700. ENDDO
  1701. ENDDO
  1702. !
  1703. ENDDO
  1704. !
  1705. #endif
  1706. !-----------------------------------------------------------------------
  1707. !$omp parallel do &
  1708. !$omp& private(d2pqe,d2pqq,d2pqw,destij,dqstij,dvolp,dwstij &
  1709. !$omp& ,e00,e0q,e2ij,ep0,estij,hafp,hafq,i,j,k &
  1710. !$omp& ,q00,q0q,q1ij,qp0,qstij,w00,w0q,w1ij,wp0,wstij)
  1711. !-----------------------------------------------------------------------
  1712. !
  1713. vertical_2: DO K=KTS,KTE
  1714. !
  1715. !-----------------------------------------------------------------------
  1716. !
  1717. DO J=MYJS2,MYJE2
  1718. DO I=MYIS1,MYIE1
  1719. !
  1720. DVOLP=DVOL(I,J,K)
  1721. Q1IJ =Q1(I,J,K)
  1722. W1IJ =W1(I,J,K)
  1723. E2IJ =E2(I,J,K)
  1724. !
  1725. HAFP=AFP(I,J,K)
  1726. HAFQ=AFQ(I,J,K)
  1727. !
  1728. D2PQQ=(Q1(IFPA(I,J,K),JFPA(I,J,K),K)-Q1IJ &
  1729. & -Q1IJ+Q1(IFPF(I,J,K),JFPF(I,J,K),K)) &
  1730. & *HAFP &
  1731. & +(Q1(IFQA(I,J,K),JFQA(I,J,K),K)-Q1IJ &
  1732. & -Q1IJ+Q1(IFQF(I,J,K),JFQF(I,J,K),K)) &
  1733. & *HAFQ
  1734. !
  1735. D2PQW=(W1(IFPA(I,J,K),JFPA(I,J,K),K)-W1IJ &
  1736. & -W1IJ+W1(IFPF(I,J,K),JFPF(I,J,K),K)) &
  1737. & *HAFP &
  1738. & +(W1(IFQA(I,J,K),JFQA(I,J,K),K)-W1IJ &
  1739. & -W1IJ+W1(IFQF(I,J,K),JFQF(I,J,K),K)) &
  1740. & *HAFQ
  1741. !
  1742. D2PQE=(E2(IFPA(I,J,K),JFPA(I,J,K),K)-E2IJ &
  1743. & -E2IJ+E2(IFPF(I,J,K),JFPF(I,J,K),K)) &
  1744. & *HAFP &
  1745. & +(E2(IFQA(I,J,K),JFQA(I,J,K),K)-E2IJ &
  1746. & -E2IJ+E2(IFQF(I,J,K),JFQF(I,J,K),K)) &
  1747. & *HAFQ
  1748. !
  1749. QSTIJ=Q1IJ-D2PQQ
  1750. WSTIJ=W1IJ-D2PQW
  1751. ESTIJ=E2IJ-D2PQE
  1752. !
  1753. Q00=Q (I ,J ,K)
  1754. QP0=Q (IFPA(I,J,K),JFPA(I,J,K),K)
  1755. Q0Q=Q (IFQA(I,J,K),JFQA(I,J,K),K)
  1756. !
  1757. W00=CWM(I ,J ,K)
  1758. WP0=CWM(IFPA(I,J,K),JFPA(I,J,K),K)
  1759. W0Q=CWM(IFQA(I,J,K),JFQA(I,J,K),K)
  1760. !
  1761. E00=E1 (I ,J ,K)
  1762. EP0=E1 (IFPA(I,J,K),JFPA(I,J,K),K)
  1763. E0Q=E1 (IFQA(I,J,K),JFQA(I,J,K),K)
  1764. !
  1765. QSTIJ=MAX(QSTIJ,MIN(Q00,QP0,Q0Q))
  1766. QSTIJ=MIN(QSTIJ,MAX(Q00,QP0,Q0Q))
  1767. WSTIJ=MAX(WSTIJ,MIN(W00,WP0,W0Q))
  1768. WSTIJ=MIN(WSTIJ,MAX(W00,WP0,W0Q))
  1769. ESTIJ=MAX(ESTIJ,MIN(E00,EP0,E0Q))
  1770. ESTIJ=MIN(ESTIJ,MAX(E00,EP0,E0Q))
  1771. !
  1772. ! DQSTIJ=QSTIJ-Q(I,J,K)
  1773. ! DWSTIJ=WSTIJ-CWM(I,J,K)
  1774. ! DESTIJ=ESTIJ-E1(I,J,K)
  1775. !
  1776. dqstij=qstij-q1(i,j,k)
  1777. dwstij=wstij-w1(i,j,k)
  1778. destij=estij-e2(i,j,k)
  1779. !
  1780. DQST(I,J,K)=DQSTIJ
  1781. DWST(I,J,K)=DWSTIJ
  1782. DEST(I,J,K)=DESTIJ
  1783. !
  1784. DQSTIJ=DQSTIJ*DVOLP
  1785. DWSTIJ=DWSTIJ*DVOLP
  1786. DESTIJ=DESTIJ*DVOLP
  1787. !
  1788. !-----------------------------------------------------------------------
  1789. #if defined(BIT_FOR_BIT) && defined(DM_PARALLEL) && !defined(STUBMPI)
  1790. !-----------------------------------------------------------------------
  1791. DO N=1,6
  1792. XSUMS_L(I,J,K,N)=0.
  1793. ENDDO
  1794. !
  1795. IF(DQSTIJ>0.)THEN
  1796. XSUMS_L(I,J,K,1)=DQSTIJ
  1797. ELSE
  1798. XSUMS_L(I,J,K,2)=DQSTIJ
  1799. ENDIF
  1800. !
  1801. IF(DWSTIJ>0.)THEN
  1802. XSUMS_L(I,J,K,3)=DWSTIJ
  1803. ELSE
  1804. XSUMS_L(I,J,K,4)=DWSTIJ
  1805. ENDIF
  1806. !
  1807. IF(DESTIJ>0.)THEN
  1808. XSUMS_L(I,J,K,5)=DESTIJ
  1809. ELSE
  1810. XSUMS_L(I,J,K,6)=DESTIJ
  1811. ENDIF
  1812. !-----------------------------------------------------------------------
  1813. #else
  1814. !-----------------------------------------------------------------------
  1815. IF(DQSTIJ>0.)THEN
  1816. XSUMS(1,K)=XSUMS(1,K)+DQSTIJ
  1817. ELSE
  1818. XSUMS(2,K)=XSUMS(2,K)+DQSTIJ
  1819. ENDIF
  1820. !
  1821. IF(DWSTIJ>0.)THEN
  1822. XSUMS(3,K)=XSUMS(3,K)+DWSTIJ
  1823. ELSE
  1824. XSUMS(4,K)=XSUMS(4,K)+DWSTIJ
  1825. ENDIF
  1826. !
  1827. IF(DESTIJ>0.)THEN
  1828. XSUMS(5,K)=XSUMS(5,K)+DESTIJ
  1829. ELSE
  1830. XSUMS(6,K)=XSUMS(6,K)+DESTIJ
  1831. ENDIF
  1832. !-----------------------------------------------------------------------
  1833. #endif
  1834. !-----------------------------------------------------------------------
  1835. !
  1836. ENDDO
  1837. ENDDO
  1838. !
  1839. !-----------------------------------------------------------------------
  1840. !
  1841. ENDDO vertical_2
  1842. !
  1843. !-----------------------------------------------------------------------
  1844. #if defined(BIT_FOR_BIT) && defined(DM_PARALLEL) && !defined(STUBMPI)
  1845. !-----------------------------------------------------------------------
  1846. DO N=1,6
  1847. CALL WRF_PATCH_TO_GLOBAL_REAL(XSUMS_L(IMS,JMS,KMS,N) &
  1848. &, XSUMS_G(1,1,1,N),DOMDESC &
  1849. &, 'xyz','xyz' &
  1850. &, IDS,IDE,JDS,JDE,KDS,KDE &
  1851. &, IMS,IME,JMS,JME,KMS,KME &
  1852. &, ITS,ITE,JTS,JTE,KTS,KTE)
  1853. ENDDO
  1854. !
  1855. DO K=KTS,KTE
  1856. DO N=1,6
  1857. GSUMS(N,K)=0.
  1858. ENDDO
  1859. ENDDO
  1860. !
  1861. IF(WRF_DM_ON_MONITOR())THEN
  1862. DO N=1,6
  1863. !$omp parallel do &
  1864. !$omp& private(i,j,k)
  1865. DO K=KTS,KTE
  1866. DO J=JDS,JDE
  1867. DO I=IDS,IDE
  1868. GSUMS(N,K)=GSUMS(N,K)+XSUMS_G(I,J,K,N)
  1869. ENDDO
  1870. ENDDO
  1871. ENDDO
  1872. ENDDO
  1873. ENDIF
  1874. CALL WRF_DM_BCAST_BYTES(GSUMS,2*RWORDSIZE*6*(KTE-KTS+1) )
  1875. !-----------------------------------------------------------------------
  1876. #else
  1877. !-----------------------------------------------------------------------
  1878. !
  1879. !-----------------------------------------------------------------------
  1880. !*** GLOBAL REDUCTION
  1881. !-----------------------------------------------------------------------
  1882. !
  1883. # if defined(DM_PARALLEL) && !defined(STUBMPI)
  1884. CALL WRF_GET_DM_COMMUNICATOR(MPI_COMM_COMP)
  1885. CALL MPI_ALLREDUCE(XSUMS,GSUMS,6*(KTE-KTS+1) &
  1886. & ,MPI_DOUBLE_PRECISION,MPI_SUM &
  1887. & ,MPI_COMM_COMP,IRECV)
  1888. # else
  1889. DO K=KTS,KTE
  1890. DO N=1,6
  1891. GSUMS(N,K)=XSUMS(N,K)
  1892. ENDDO
  1893. ENDDO
  1894. # endif
  1895. !
  1896. !-----------------------------------------------------------------------
  1897. #endif
  1898. !-----------------------------------------------------------------------
  1899. !
  1900. !-----------------------------------------------------------------------
  1901. !*** END OF GLOBAL REDUCTION
  1902. !-----------------------------------------------------------------------
  1903. !
  1904. ! if(mype==0)then
  1905. !!! if(ntsd==0)then
  1906. !!! call int_get_fresh_handle(nunit)
  1907. !!! close(nunit)
  1908. ! nunit=56
  1909. !!! open(unit=nunit,file='gsums',form='unformatted',iostat=ier)
  1910. !!! endif
  1911. ! endif
  1912. !-----------------------------------------------------------------------
  1913. !$omp parallel do &
  1914. !$omp& private(destij,dqstij,dwstij,i,j,k,rface,rfacq,rfacw &
  1915. !$omp& ,rfeij,rfqij,rfwij,sumne,sumnq,sumnw,sumpe,sumpq,sumpw)
  1916. !-----------------------------------------------------------------------
  1917. !
  1918. vertical_3: DO K=KTS,KTE
  1919. !
  1920. !-----------------------------------------------------------------------
  1921. ! if(mype==0)then
  1922. ! write(nunit)(gsums(i,k),i=1,6)
  1923. ! endif
  1924. !!! read(nunit)(gsums(i,k),i=1,6)
  1925. !-----------------------------------------------------------------------
  1926. !
  1927. SUMPQ=GSUMS(1,K)
  1928. SUMNQ=GSUMS(2,K)
  1929. SUMPW=GSUMS(3,K)
  1930. SUMNW=GSUMS(4,K)
  1931. SUMPE=GSUMS(5,K)
  1932. SUMNE=GSUMS(6,K)
  1933. !
  1934. !-----------------------------------------------------------------------
  1935. !*** FIRST MOMENT CONSERVING FACTOR
  1936. !-----------------------------------------------------------------------
  1937. !
  1938. IF(SUMPQ>1.)THEN
  1939. RFACQ=-SUMNQ/SUMPQ
  1940. ELSE
  1941. RFACQ=1.
  1942. ENDIF
  1943. !
  1944. IF(SUMPW>1.)THEN
  1945. RFACW=-SUMNW/SUMPW
  1946. ELSE
  1947. RFACW=1.
  1948. ENDIF
  1949. !
  1950. IF(SUMPE>1.)THEN
  1951. RFACE=-SUMNE/SUMPE
  1952. ELSE
  1953. RFACE=1.
  1954. ENDIF
  1955. !
  1956. IF(RFACQ<CONSERVE_MIN.OR.RFACQ>CONSERVE_MAX)RFACQ=1.
  1957. IF(RFACW<CONSERVE_MIN.OR.RFACW>CONSERVE_MAX)RFACW=1.
  1958. IF(RFACE<CONSERVE_MIN.OR.RFACE>CONSERVE_MAX)RFACE=1.
  1959. !
  1960. !-----------------------------------------------------------------------
  1961. ! if(mype==0.and.ntsd==181)close(nunit)
  1962. !-----------------------------------------------------------------------
  1963. !
  1964. !-----------------------------------------------------------------------
  1965. !*** IMPOSE CONSERVATION ON ANTI-FILTERING
  1966. !-----------------------------------------------------------------------
  1967. !
  1968. if(rfacq<1.)then
  1969. do j=MYJS2,MYJE2
  1970. DO I=MYIS1,MYIE1
  1971. DQSTIJ=DQST(I,J,K)
  1972. RFQIJ=HBM2(I,J)*(RFACQ-1.)+1.
  1973. IF(DQSTIJ>=0.)DQSTIJ=DQSTIJ*RFQIJ
  1974. q(i,j,k)=q1(i,j,k)+dqstij
  1975. ENDDO
  1976. enddo
  1977. else
  1978. do j=MYJS2,MYJE2
  1979. DO I=MYIS1,MYIE1
  1980. DQSTIJ=DQST(I,J,K)
  1981. RFQIJ=HBM2(I,J)*(RFACQ-1.)+1.
  1982. IF(DQSTIJ<0.)DQSTIJ=DQSTIJ/RFQIJ
  1983. q(i,j,k)=q1(i,j,k)+dqstij
  1984. ENDDO
  1985. enddo
  1986. endif
  1987. !
  1988. !-----------------------------------------------------------------------
  1989. !
  1990. if(rfacw<1.)then
  1991. do j=MYJS2,MYJE2
  1992. DO I=MYIS1,MYIE1
  1993. DWSTIJ=DWST(I,J,K)
  1994. RFWIJ=HBM2(I,J)*(RFACW-1.)+1.
  1995. IF(DWSTIJ>=0.)DWSTIJ=DWSTIJ*RFWIJ
  1996. cwm(i,j,k)=w1(i,j,k)+dwstij
  1997. ENDDO
  1998. enddo
  1999. else
  2000. do j=MYJS2,MYJE2
  2001. DO I=MYIS1,MYIE1
  2002. DWSTIJ=DWST(I,J,K)
  2003. RFWIJ=HBM2(I,J)*(RFACW-1.)+1.
  2004. IF(DWSTIJ<0.)DWSTIJ=DWSTIJ/RFWIJ
  2005. cwm(i,j,k)=w1(i,j,k)+dwstij
  2006. ENDDO
  2007. enddo
  2008. endif
  2009. !-----------------------------------------------------------------------
  2010. !
  2011. if(rface<1.)then
  2012. do j=MYJS2,MYJE2
  2013. DO I=MYIS1,MYIE1
  2014. DESTIJ=DEST(I,J,K)
  2015. RFEIJ=HBM2(I,J)*(RFACE-1.)+1.
  2016. IF(DESTIJ>=0.)DESTIJ=DESTIJ*RFEIJ
  2017. e1(i,j,k)=e2(i,j,k)+destij
  2018. ENDDO
  2019. enddo
  2020. else
  2021. do j=MYJS2,MYJE2
  2022. DO I=MYIS1,MYIE1
  2023. DESTIJ=DEST(I,J,K)
  2024. RFEIJ=HBM2(I,J)*(RFACE-1.)+1.
  2025. IF(DESTIJ<0.)DESTIJ=DESTIJ/RFEIJ
  2026. e1(i,j,k)=e2(i,j,k)+destij
  2027. ENDDO
  2028. enddo
  2029. endif
  2030. !
  2031. !-----------------------------------------------------------------------
  2032. !
  2033. DO J=MYJS,MYJE
  2034. DO I=MYIS,MYIE
  2035. Q (I,J,K)=MAX(Q (I,J,K),EPSQ)
  2036. CWM(I,J,K)=MAX(CWM(I,J,K),CLIMIT)
  2037. ENDDO
  2038. ENDDO
  2039. !
  2040. !-----------------------------------------------------------------------
  2041. !
  2042. ENDDO vertical_3
  2043. !
  2044. !-----------------------------------------------------------------------
  2045. !
  2046. !$omp parallel do &
  2047. !$omp& private(i,j)
  2048. DO J=MYJS,MYJE
  2049. DO I=MYIS,MYIE
  2050. Q2(I,J,KTE)=MAX(E1(I,J,KTE)+E1(I,J,KTE)-EPSQ2,EPSQ2)
  2051. ENDDO
  2052. ENDDO
  2053. !
  2054. !-----------------------------------------------------------------------
  2055. !
  2056. DO K=KTE-1,KTS+1,-1
  2057. !$omp parallel do &
  2058. !$omp& private(i,j)
  2059. DO J=MYJS,MYJE
  2060. DO I=MYIS,MYIE
  2061. IF(K>KTS)THEN
  2062. Q2(I,J,K)=MAX(E1(I,J,K)+E1(I,J,K)-Q2(I,J,K+1),EPSQ2)
  2063. ELSE
  2064. Q2(I,J,K)=Q2(I,J,K+1)
  2065. ENDIF
  2066. ENDDO
  2067. ENDDO
  2068. ENDDO
  2069. !-----------------------------------------------------------------------
  2070. !
  2071. END SUBROUTINE HAD2
  2072. !
  2073. !-----------------------------------------------------------------------
  2074. !***********************************************************************
  2075. !-----------------------------------------------------------------------
  2076. ! New routines added by Georg Grell to handle advection more like ARW
  2077. ! core. Instead of VAD2/HAD2 that advect TKE, specific humidity, and
  2078. ! condensed water species all in one routine, we call VAD2/HAD2_SCAL
  2079. ! with multidimensioned arrays to advect each variable. For purposes
  2080. ! here, solve_nmm.F calls this routine once for TKE, then again for
  2081. ! all the species held in the moist array (qv, qc, qi, qr, qs, qg),
  2082. ! then call again for number concentrations held in scalar array (qni).
  2083. ! The dummy argument lstart is the starting index of the multidimensioned
  2084. ! array for starting the advection since the 1st index of moist and
  2085. ! scalar are actually empty placeholders (and the 2nd element is vapor,
  2086. ! then qc, etc.) When calling with single 3D array (like TKE), just
  2087. ! set NUM_SCAL=1 and lstart=1. The variable to advect is called SCAL
  2088. ! herein.
  2089. !***********************************************************************
  2090. SUBROUTINE VAD2_SCAL(NTSD,DT,IDTAD,DX,DY &
  2091. & ,AETA1,AETA2,DETA1,DETA2,PDSL,PDTOP &
  2092. & ,HBM2 &
  2093. & ,SCAL,PETDT &
  2094. & ,N_IUP_H,N_IUP_V &
  2095. & ,N_IUP_ADH,N_IUP_ADV &
  2096. & ,IUP_H,IUP_V,IUP_ADH,IUP_ADV &
  2097. & ,IHE,IHW,IVE,IVW &
  2098. & ,NUM_SCAL,LSTART &
  2099. & ,IDS,IDE,JDS,JDE,KDS,KDE &
  2100. & ,IMS,IME,JMS,JME,KMS,KME &
  2101. & ,ITS,ITE,JTS,JTE,KTS,KTE)
  2102. !***********************************************************************
  2103. !$$$ SUBPROGRAM DOCUMENTATION BLOCK
  2104. ! . . .
  2105. ! SUBPROGRAM: VAD2_SCAL VERTICAL ADVECTION OF SCALARS
  2106. !
  2107. ! PRGRMMR: JANJIC ORG: W/NP22 DATE: 96-07-19
  2108. ! GRELL,PECKHAM ORG: NOAA/FSL DATE: 05-02-03
  2109. !
  2110. ! ABSTRACT:
  2111. ! VAD2_SCAL CALCULATES THE CONTRIBUTION OF THE VERTICAL ADVECTION
  2112. ! TO THE TENDENCIES OF SCALAR SUBSTANCES AND THEN UPDATES
  2113. ! THOSE VARIABLES. AN ANTI-FILTERING TECHNIQUE IS USED.
  2114. !
  2115. ! PROGRAM HISTORY LOG:
  2116. ! 96-07-19 JANJIC - ORIGINATOR
  2117. ! 05-02-03 GRELL,PECKHAM - MODIFIED FOR SCALARS
  2118. !
  2119. ! USAGE: CALL VAD2_SCAL FROM SUBROUTINE SOLVE_NMM
  2120. ! INPUT ARGUMENT LIST:
  2121. !
  2122. ! OUTPUT ARGUMENT LIST
  2123. !
  2124. ! OUTPUT FILES:
  2125. ! NONE
  2126. ! SUBPROGRAMS CALLED:
  2127. !
  2128. ! UNIQUE: NONE
  2129. !
  2130. ! LIBRARY: NONE
  2131. !
  2132. ! ATTRIBUTES:
  2133. ! LANGUAGE: FORTRAN 90
  2134. ! MACHINE : IBM
  2135. !$$$
  2136. !***********************************************************************
  2137. !----------------------------------------------------------------------
  2138. !
  2139. IMPLICIT NONE
  2140. !
  2141. !----------------------------------------------------------------------
  2142. !
  2143. INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
  2144. & ,IMS,IME,JMS,JME,KMS,KME &
  2145. ,ITS,ITE,JTS,JTE,KTS,KTE
  2146. !
  2147. INTEGER,INTENT(IN) :: LSTART,NUM_SCAL
  2148. !
  2149. INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW
  2150. INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: N_IUP_H,N_IUP_V &
  2151. & ,N_IUP_ADH,N_IUP_ADV
  2152. INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: IUP_H,IUP_V &
  2153. & ,IUP_ADH,IUP_ADV
  2154. !
  2155. INTEGER,INTENT(IN) :: IDTAD,NTSD
  2156. !
  2157. REAL,INTENT(IN) :: DT,DY,PDTOP
  2158. !
  2159. REAL,DIMENSION(KMS:KME),INTENT(IN) :: AETA1,AETA2,DETA1,DETA2
  2160. !
  2161. REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: DX,HBM2,PDSL
  2162. !
  2163. REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: PETDT
  2164. !
  2165. REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME,1:NUM_SCAL) &
  2166. ,INTENT(INOUT) :: SCAL
  2167. !
  2168. !----------------------------------------------------------------------
  2169. !*** LOCAL VARIABLES
  2170. !----------------------------------------------------------------------
  2171. !
  2172. REAL,PARAMETER :: FF1=0.500
  2173. !
  2174. LOGICAL,SAVE :: TRADITIONAL=.TRUE.
  2175. !
  2176. INTEGER :: I,IRECV,J,JFP,JFQ,K,L,LAP,LLAP
  2177. !
  2178. INTEGER,DIMENSION(KTS:KTE) :: LA
  2179. !
  2180. REAL*8 :: ADDT,AFRP,D2PQQ,DETAP,DPDN,DPUP,DQP &
  2181. & ,HADDT,HBM2IJ &
  2182. & ,Q00,Q4P,QP,QP0 &
  2183. & ,RFACQK,RFC,RR &
  2184. & ,SUMNQ,SUMPQ
  2185. !
  2186. REAL :: SFACQK
  2187. !
  2188. REAL,DIMENSION(KTS:KTE) :: AFR,DEL,DQL,DWL,E3,E4,PETDTK &
  2189. & ,RFACE,RFACQ,RFACW,Q3,Q4,W3,W4
  2190. !
  2191. !-----------------------------------------------------------------------
  2192. !***********************************************************************
  2193. !-----------------------------------------------------------------------
  2194. !
  2195. ADDT=REAL(IDTAD)*DT
  2196. !
  2197. !-----------------------------------------------------------------------
  2198. !$omp parallel do &
  2199. !$omp& private(afr,afrp,d2pqq,detap,dpdn,dpup &
  2200. !$omp& ,dql,dqp,haddt,i,j,k &
  2201. !$omp& ,la,lap,llap,petdtk,q00,q3,q4,q4p,qp,qp0,rfacqk &
  2202. !$omp& ,rfc,rr,sfacqk,sumnq,sumpq)
  2203. !-----------------------------------------------------------------------
  2204. !
  2205. scalar_loop: DO L=LSTART,NUM_SCAL
  2206. !
  2207. main_integration: DO J=MYJS2,MYJE2
  2208. !
  2209. !-----------------------------------------------------------------------
  2210. !
  2211. main_iloop: DO I=MYIS1_P1,MYIE1_P1
  2212. !
  2213. !-----------------------------------------------------------------------
  2214. !
  2215. DO K=KTS,KTE
  2216. Q3(K)=SCAL(I,J,K,L)
  2217. Q4(K)=Q3(K)
  2218. ENDDO
  2219. !
  2220. IF(TRADITIONAL)THEN
  2221. PETDTK(KTE)=PETDT(I,J,KTE-1)*0.5
  2222. !
  2223. DO K=KTE-1,KTS+1,-1
  2224. PETDTK(K)=(PETDT(I,J,K)+PETDT(I,J,K-1))*0.5
  2225. ENDDO
  2226. !
  2227. PETDTK(KTS)=PETDT(I,J,KTS)*0.5
  2228. !
  2229. ELSE
  2230. !
  2231. !-----------------------------------------------------------------------
  2232. !*** PERFORM HORIZONTAL AVERAGING OF VERTICAL VELOCITY
  2233. !-----------------------------------------------------------------------
  2234. !
  2235. PETDTK(KTE)=(PETDT(I+IHW(J-1),J-1,KTE-1) &
  2236. & +PETDT(I+IHE(J-1),J-1,KTE-1) &
  2237. & +PETDT(I+IHW(J+1),J+1,KTE-1) &
  2238. & +PETDT(I+IHE(J+1),J+1,KTE-1) &
  2239. & +PETDT(I,J,KTE-1)*4. )*0.0625
  2240. !
  2241. DO K=KTE-1,KTS+1,-1
  2242. PETDTK(K)=(PETDT(I+IHW(J-1),J-1,K-1) &
  2243. +PETDT(I+IHE(J-1),J-1,K-1) &
  2244. & +PETDT(I+IHW(J+1),J+1,K-1) &
  2245. & +PETDT(I+IHE(J+1),J+1,K-1) &
  2246. & +PETDT(I+IHW(J-1),J-1,K ) &
  2247. & +PETDT(I+IHE(J-1),J-1,K ) &
  2248. & +PETDT(I+IHW(J+1),J+1,K ) &
  2249. & +PETDT(I+IHE(J+1),J+1,K ) &
  2250. & +(PETDT(I,J,K-1)+PETDT(I,J,K))*4. &
  2251. & )*0.0625
  2252. ENDDO
  2253. !
  2254. PETDTK(KTS)=(PETDT(I+IHW(J-1),J-1,KTS) &
  2255. & +PETDT(I+IHE(J-1),J-1,KTS) &
  2256. & +PETDT(I+IHW(J+1),J+1,KTS) &
  2257. & +PETDT(I+IHE(J+1),J+1,KTS) &
  2258. & +PETDT(I,J,KTS)*4. )*0.0625
  2259. ENDIF
  2260. !
  2261. !-----------------------------------------------------------------------
  2262. !
  2263. HADDT=-ADDT*HBM2(I,J)
  2264. !
  2265. DO K=KTE,KTS,-1
  2266. RR=PETDTK(K)*HADDT
  2267. !
  2268. IF(RR<0.)THEN
  2269. LAP=1
  2270. ELSE
  2271. LAP=-1
  2272. ENDIF
  2273. !
  2274. LA(K)=LAP
  2275. LLAP=K+LAP
  2276. !
  2277. IF(LLAP>KTS-1.AND.LLAP<KTE+1)THEN
  2278. RR=ABS(RR/((AETA1(LLAP)-AETA1(K))*PDTOP &
  2279. & +(AETA2(LLAP)-AETA2(K))*PDSL(I,J)))
  2280. IF(RR>0.9)RR=0.9
  2281. !
  2282. AFR(K)=(((FF4*RR+FF3)*RR+FF2)*RR+FF1)*RR
  2283. DQP=(Q3(LLAP)-Q3(K))*RR
  2284. DQL(K)=DQP
  2285. ELSE
  2286. RR=0.
  2287. AFR(K)=0.
  2288. DQL(K)=0.
  2289. ENDIF
  2290. ENDDO
  2291. !
  2292. !-----------------------------------------------------------------------
  2293. !
  2294. IF(LA(KTE-1)>0)THEN
  2295. RFC=(DETA1(KTE-1)*PDTOP+DETA2(KTE-1)*PDSL(I,J)) &
  2296. & /(DETA1(KTE )*PDTOP+DETA2(KTE )*PDSL(I,J))
  2297. DQL(KTE)=-DQL(KTE-1)*RFC
  2298. ENDIF
  2299. !
  2300. IF(LA(KTS+1)<0)THEN
  2301. RFC=(DETA1(KTS+1)*PDTOP+DETA2(KTS+1)*PDSL(I,J)) &
  2302. & /(DETA1(KTS )*PDTOP+DETA2(KTS )*PDSL(I,J))
  2303. DQL(KTS)=-DQL(KTS+1)*RFC
  2304. ENDIF
  2305. !
  2306. DO K=KTS,KTE
  2307. Q4(K)=Q3(K)+DQL(K)
  2308. ENDDO
  2309. !
  2310. !-----------------------------------------------------------------------
  2311. !*** ANTI-FILTERING STEP
  2312. !-----------------------------------------------------------------------
  2313. !
  2314. SUMPQ=0.
  2315. SUMNQ=0.
  2316. !
  2317. !*** ANTI-FILTERING LIMITERS
  2318. !
  2319. antifilter: DO K=KTE-1,KTS+1,-1
  2320. !
  2321. DETAP=DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J)
  2322. !
  2323. Q4P=Q4(K)
  2324. !
  2325. LAP=LA(K)
  2326. !
  2327. DPDN=(AETA1(K+LAP)-AETA1(K))*PDTOP &
  2328. & +(AETA2(K+LAP)-AETA2(K))*PDSL(I,J)
  2329. DPUP=(AETA1(K)-AETA1(K-LAP))*PDTOP &
  2330. & +(AETA2(K)-AETA2(K-LAP))*PDSL(I,J)
  2331. !
  2332. AFRP=2.*AFR(K)*DPDN*DPDN/(DPDN+DPUP)
  2333. D2PQQ=((Q4(K+LAP)-Q4P)/DPDN &
  2334. & -(Q4P-Q4(K-LAP))/DPUP)*AFRP
  2335. !
  2336. QP=Q4P-D2PQQ
  2337. !
  2338. Q00=Q3(K)
  2339. QP0=Q3(K+LAP)
  2340. !
  2341. QP=MAX(QP,MIN(Q00,QP0))
  2342. QP=MIN(QP,MAX(Q00,QP0))
  2343. !
  2344. DQP=QP-Q00
  2345. !
  2346. DQL(K)=DQP
  2347. !
  2348. ENDDO antifilter
  2349. !
  2350. !-----------------------------------------------------------------------
  2351. !
  2352. IF(LA(KTE-1)>0)THEN
  2353. RFC=(DETA1(KTE-1)*PDTOP+DETA2(KTE-1)*PDSL(I,J)) &
  2354. & /(DETA1(KTE )*PDTOP+DETA2(KTE )*PDSL(I,J))
  2355. DQL(KTE)=-DQL(KTE-1)*RFC+DQL(KTE)
  2356. ENDIF
  2357. !
  2358. IF(LA(KTS+1)<0)THEN
  2359. RFC=(DETA1(KTS+1)*PDTOP+DETA2(KTS+1)*PDSL(I,J)) &
  2360. & /(DETA1(KTS )*PDTOP+DETA2(KTS )*PDSL(I,J))
  2361. DQL(KTS)=-DQL(KTS+1)*RFC+DQL(KTS)
  2362. ENDIF
  2363. !
  2364. DO K=KTS,KTE
  2365. DETAP=DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J)
  2366. DQP=DQL(K)*DETAP
  2367. !
  2368. IF(DQP>0.)THEN
  2369. SUMPQ=SUMPQ+DQP
  2370. ELSE
  2371. SUMNQ=SUMNQ+DQP
  2372. ENDIF
  2373. ENDDO
  2374. !
  2375. !-----------------------------------------------------------------------
  2376. !*** FIRST MOMENT CONSERVING FACTOR
  2377. !-----------------------------------------------------------------------
  2378. !
  2379. IF(SUMPQ>1.E-9)THEN
  2380. SFACQK=-SUMNQ/SUMPQ
  2381. ELSE
  2382. SFACQK=1.
  2383. ENDIF
  2384. !
  2385. IF(SFACQK<CONSERVE_MIN.OR.SFACQK>CONSERVE_MAX)SFACQK=1.
  2386. !
  2387. RFACQK=1./SFACQK
  2388. !
  2389. !-----------------------------------------------------------------------
  2390. !*** IMPOSE CONSERVATION ON ANTI-FILTERING
  2391. !-----------------------------------------------------------------------
  2392. !
  2393. DO K=KTE,KTS,-1
  2394. DQP=DQL(K)
  2395. IF(SFACQK>=1.)THEN
  2396. IF(DQP<0.)DQP=DQP*RFACQK
  2397. ELSE
  2398. IF(DQP>0.)DQP=DQP*SFACQK
  2399. ENDIF
  2400. SCAL(I,J,K,L)=Q3(K)+DQP
  2401. ENDDO
  2402. !
  2403. !-----------------------------------------------------------------------
  2404. !
  2405. ENDDO main_iloop
  2406. !
  2407. !-----------------------------------------------------------------------
  2408. !
  2409. ENDDO main_integration
  2410. !
  2411. !-----------------------------------------------------------------------
  2412. !
  2413. ENDDO scalar_loop
  2414. !
  2415. !-----------------------------------------------------------------------
  2416. !
  2417. END SUBROUTINE VAD2_SCAL
  2418. !
  2419. !-----------------------------------------------------------------------
  2420. !
  2421. !***********************************************************************
  2422. SUBROUTINE HAD2_SCAL( &
  2423. #if defined(DM_PARALLEL)
  2424. & DOMDESC , &
  2425. #endif
  2426. & NTSD,DT,IDTAD,DX,DY &
  2427. & ,AETA1,AETA2,DETA1,DETA2,PDSL,PDTOP &
  2428. & ,HBM2,HBM3 &
  2429. & ,SCAL,U,V,Z,HYDRO &
  2430. & ,N_IUP_H,N_IUP_V &
  2431. & ,N_IUP_ADH,N_IUP_ADV &
  2432. & ,IUP_H,IUP_V,IUP_ADH,IUP_ADV &
  2433. & ,IHE,IHW,IVE,IVW &
  2434. & ,NUM_SCAL,LSTART &
  2435. & ,IDS,IDE,JDS,JDE,KDS,KDE &
  2436. & ,IMS,IME,JMS,JME,KMS,KME &
  2437. & ,ITS,ITE,JTS,JTE,KTS,KTE)
  2438. !***********************************************************************
  2439. !$$$ SUBPROGRAM DOCUMENTATION BLOCK
  2440. ! . . .
  2441. ! SUBPROGRAM: HAD2_SCAL HORIZONTAL ADVECTION OF SCALAR
  2442. ! PRGRMMR: JANJIC ORG: W/NP22 DATE: 96-07-19
  2443. ! GRELL,PECKHAM ORG: NOAA/FSL DATE: 05-02-03
  2444. !
  2445. ! ABSTRACT:
  2446. ! HAD2_SCAL CALCULATES THE CONTRIBUTION OF THE HORIZONTAL ADVECTION
  2447. ! TO THE TENDENCIES OF SCALAR SUBSTANCES AND THEN
  2448. ! UPDATES THOSE VARIABLES. AN ANTI-FILTERING TECHNIQUE IS USED.
  2449. !
  2450. ! PROGRAM HISTORY LOG:
  2451. ! 96-07-19 JANJIC - ORIGINATOR
  2452. ! 05-01-03 GRELL,PECKHAM - MODIFIED FOR SCALAR
  2453. !
  2454. ! USAGE: CALL HAD2_SCAL FROM SUBROUTINE SOLVE_NMM
  2455. ! INPUT ARGUMENT LIST:
  2456. !
  2457. ! OUTPUT ARGUMENT LIST
  2458. !
  2459. ! OUTPUT FILES:
  2460. ! NONE
  2461. ! SUBPROGRAMS CALLED:
  2462. !
  2463. ! UNIQUE: NONE
  2464. !
  2465. ! LIBRARY: NONE
  2466. !
  2467. ! ATTRIBUTES:
  2468. ! LANGUAGE: FORTRAN 90
  2469. ! MACHINE : IBM
  2470. !$$$
  2471. !***********************************************************************
  2472. !-----------------------------------------------------------------------
  2473. !
  2474. IMPLICIT NONE
  2475. !
  2476. !-----------------------------------------------------------------------
  2477. !
  2478. INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
  2479. & ,IMS,IME,JMS,JME,KMS,KME &
  2480. & ,ITS,ITE,JTS,JTE,KTS,KTE
  2481. !
  2482. INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW
  2483. INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: N_IUP_H,N_IUP_V &
  2484. & ,N_IUP_ADH,N_IUP_ADV
  2485. INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: IUP_H,IUP_V &
  2486. & ,IUP_ADH,IUP_ADV
  2487. !
  2488. !-----------------------------------------------------------------------
  2489. !
  2490. INTEGER,INTENT(IN) :: IDTAD,LSTART,NTSD,NUM_SCAL
  2491. !
  2492. REAL,INTENT(IN) :: DT,DY,PDTOP
  2493. !
  2494. REAL,DIMENSION(KMS:KME),INTENT(IN) :: AETA1,AETA2,DETA1,DETA2
  2495. !
  2496. REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: DX,HBM2,HBM3,PDSL
  2497. !
  2498. REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: U,V,Z
  2499. !
  2500. REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME,1:NUM_SCAL) &
  2501. ,INTENT(INOUT) :: SCAL
  2502. !
  2503. LOGICAL,INTENT(IN) :: HYDRO
  2504. !
  2505. !-----------------------------------------------------------------------
  2506. !*** LOCAL VARIABLES
  2507. !-----------------------------------------------------------------------
  2508. !
  2509. REAL,PARAMETER :: FF1=0.530
  2510. !
  2511. #ifdef DM_PARALLEL
  2512. INTEGER :: DOMDESC
  2513. #endif
  2514. !
  2515. #if defined(BIT_FOR_BIT) && defined(DM_PARALLEL) && !defined(STUBMPI)
  2516. LOGICAL,EXTERNAL :: WRF_DM_ON_MONITOR
  2517. REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME,2) :: XSUMS_L
  2518. REAL,DIMENSION(IDS:IDE,JDS:JDE,KDS:KDE,2) :: XSUMS_G
  2519. #endif
  2520. !
  2521. LOGICAL :: BOT,TOP
  2522. !
  2523. INTEGER :: I,IRECV,J,JFP,JFQ,K,L,LAP,LLAP,MPI_COMM_COMP
  2524. INTEGER :: N
  2525. !
  2526. INTEGER,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5,KTS:KTE) :: IFPA,IFPF &
  2527. & ,IFQA,IFQF &
  2528. & ,JFPA,JFPF &
  2529. & ,JFQA,JFQF
  2530. !
  2531. REAL :: ADDT,AFRP,CRIT,D2PQE,D2PQQ,D2PQW,DEP,DESTIJ,DQP,DQSTIJ &
  2532. & ,DVOLP,DWP,DWSTIJ,DZA,DZB,E00,E0Q,E1X,E2IJ,E4P,ENH,EP,EP0 &
  2533. & ,ESTIJ,FPQ,HAFP,HAFQ,HBM2IJ,HM,PP,PPQ00,Q00,Q0Q &
  2534. & ,Q1IJ,Q4P,QP,QP0,QSTIJ,RDY,RFACE,RFACQ,RFACW,RFC &
  2535. & ,RFEIJ,RFQIJ,RFWIJ,RR,SLOPAC,SPP,SQP,SSA,SSB,SUMNQ,SUMPQ &
  2536. & ,TTA,TTB,W00,W0Q,W1IJ,W4P,WP,WP0,WSTIJ
  2537. !
  2538. DOUBLE PRECISION,DIMENSION(2,KTS:KTE) :: GSUMS,XSUMS
  2539. !
  2540. REAL,DIMENSION(KTS:KTE) :: AFR,DEL,DQL,DWL,Q3,Q4
  2541. !
  2542. REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5) :: DARE,EMH
  2543. !
  2544. REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5,KTS:KTE) :: AFP,AFQ,DEST &
  2545. & ,DQST,DVOL,DWST &
  2546. & ,Q1
  2547. !
  2548. REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME) :: Q
  2549. !
  2550. !-----------------------------------------------------------------------
  2551. integer :: nunit,ier
  2552. save nunit
  2553. !-----------------------------------------------------------------------
  2554. !***********************************************************************
  2555. !-----------------------------------------------------------------------
  2556. !
  2557. RDY=1./DY
  2558. SLOPAC=SLOPHT*SQRT(2.)*0.5*50.
  2559. CRIT=SLOPAC*REAL(IDTAD)*DT*RDY*1000.
  2560. !
  2561. ADDT=REAL(IDTAD)*DT
  2562. ENH=ADDT/(08.*DY)
  2563. !
  2564. !-----------------------------------------------------------------------
  2565. !$omp parallel do &
  2566. !$omp& private(i,j)
  2567. DO J=MYJS_P3,MYJE_P3
  2568. DO I=MYIS_P2,MYIE_P2
  2569. EMH (I,J)=ADDT/(08.*DX(I,J))
  2570. DARE(I,J)=HBM3(I,J)*DX(I,J)*DY
  2571. ENDDO
  2572. ENDDO
  2573. !-----------------------------------------------------------------------
  2574. !
  2575. scalar_loop: DO L=LSTART,NUM_SCAL
  2576. !
  2577. !-----------------------------------------------------------------------
  2578. !$omp parallel do &
  2579. !$omp& private(dza,dzb,e1x,fpq,hm,i,j,jfp,jfq,k,pp,qp,ssa,ssb,spp,sqp &
  2580. !$omp& ,tta,ttb)
  2581. !-----------------------------------------------------------------------
  2582. !
  2583. vertical_1: DO K=KTS,KTE
  2584. !
  2585. !-----------------------------------------------------------------------
  2586. !
  2587. DO J=MYJS_P3,MYJE_P3
  2588. DO I=MYIS_P2,MYIE_P2
  2589. DVOL(I,J,K)=DARE(I,J)*(DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J))
  2590. Q (I,J,K)=SCAL(I,J,K,L)
  2591. Q1(I,J,K)=Q(I,J,K)
  2592. ENDDO
  2593. ENDDO
  2594. !
  2595. !-----------------------------------------------------------------------
  2596. !
  2597. DO J=MYJS2_P1,MYJE2_P1
  2598. DO I=MYIS1_P1,MYIE1_P1
  2599. !
  2600. HM=HBM2(I,J)
  2601. TTA=(U(I,J-1,K)+U(I+IHW(J),J,K)+U(I+IHE(J),J,K)+U(I,J+1,K)) &
  2602. & *EMH(I,J)*HM
  2603. TTB=(V(I,J-1,K)+V(I+IHW(J),J,K)+V(I+IHE(J),J,K)+V(I,J+1,K)) &
  2604. & *ENH*HBM2(I,J)
  2605. !
  2606. SPP=-TTA-TTB
  2607. SQP= TTA-TTB
  2608. !
  2609. IF(SPP<0.)THEN
  2610. JFP=-1
  2611. ELSE
  2612. JFP=1
  2613. ENDIF
  2614. IF(SQP<0.)THEN
  2615. JFQ=-1
  2616. ELSE
  2617. JFQ=1
  2618. ENDIF
  2619. !
  2620. IFPA(I,J,K)=IHE(J)+I+( JFP-1)/2
  2621. IFQA(I,J,K)=IHE(J)+I+(-JFQ-1)/2
  2622. !
  2623. JFPA(I,J,K)=J+JFP
  2624. JFQA(I,J,K)=J+JFQ
  2625. !
  2626. IFPF(I,J,K)=IHE(J)+I+(-JFP-1)/2
  2627. IFQF(I,J,K)=IHE(J)+I+( JFQ-1)/2
  2628. !
  2629. JFPF(I,J,K)=J-JFP
  2630. JFQF(I,J,K)=J-JFQ
  2631. !
  2632. !-----------------------------------------------------------------------
  2633. IF(.NOT.HYDRO)THEN ! z currently not available for hydro=.true.
  2634. DZA=(Z(IFPA(I,J,K),JFPA(I,J,K),K)-Z(I,J,K))*RDY
  2635. DZB=(Z(IFQA(I,J,K),JFQA(I,J,K),K)-Z(I,J,K))*RDY
  2636. !
  2637. IF(ABS(DZA)>SLOPAC)THEN
  2638. SSA=DZA*SPP
  2639. IF(SSA>CRIT)THEN
  2640. SPP=0. !spp*.1
  2641. ENDIF
  2642. ENDIF
  2643. !
  2644. IF(ABS(DZB)>SLOPAC)THEN
  2645. SSB=DZB*SQP
  2646. IF(SSB>CRIT)THEN
  2647. SQP=0. !sqp*.1
  2648. ENDIF
  2649. ENDIF
  2650. !
  2651. ENDIF
  2652. !
  2653. !-----------------------------------------------------------------------
  2654. !
  2655. FPQ=SPP*SQP*0.25
  2656. PP=ABS(SPP)
  2657. QP=ABS(SQP)
  2658. !
  2659. AFP(I,J,K)=(((FF4*PP+FF3)*PP+FF2)*PP+FF1)*PP
  2660. AFQ(I,J,K)=(((FF4*QP+FF3)*QP+FF2)*QP+FF1)*QP
  2661. !
  2662. Q1(I,J,K)=(Q (IFPA(I,J,K),JFPA(I,J,K),K)-Q (I,J,K))*PP &
  2663. & +(Q (IFQA(I,J,K),JFQA(I,J,K),K)-Q (I,J,K))*QP &
  2664. & +(Q (I,J-2,K)+Q (I,J+2,K) &
  2665. & -Q (I-1,J,K)-Q (I+1,J,K))*FPQ &
  2666. & +Q(I,J,K)
  2667. !
  2668. ENDDO
  2669. ENDDO
  2670. !
  2671. !-----------------------------------------------------------------------
  2672. !
  2673. ENDDO vertical_1
  2674. !
  2675. !-----------------------------------------------------------------------
  2676. !*** ANTI-FILTERING STEP
  2677. !-----------------------------------------------------------------------
  2678. !
  2679. DO K=KTS,KTE
  2680. XSUMS(1,K)=0.
  2681. XSUMS(2,K)=0.
  2682. ENDDO
  2683. !
  2684. !-----------------------------------------------------------------------
  2685. !
  2686. !*** ANTI-FILTERING LIMITERS
  2687. !
  2688. !-----------------------------------------------------------------------
  2689. #if defined(BIT_FOR_BIT) && defined(DM_PARALLEL) && !defined(STUBMPI)
  2690. DO N=1,2
  2691. !
  2692. !$omp parallel do &
  2693. !$omp& private(i,j,k)
  2694. DO K=KMS,KME
  2695. DO J=JMS,JME
  2696. DO I=IMS,IME
  2697. XSUMS_L(I,J,K,N)=0.
  2698. ENDDO
  2699. ENDDO
  2700. ENDDO
  2701. !
  2702. !$omp parallel do &
  2703. !$omp& private(i,j,k)
  2704. DO K=KDS,KDE
  2705. DO J=JDS,JDE
  2706. DO I=IDS,IDE
  2707. XSUMS_G(I,J,K,N)=0.
  2708. ENDDO
  2709. ENDDO
  2710. ENDDO
  2711. !
  2712. ENDDO
  2713. !
  2714. #endif
  2715. !-----------------------------------------------------------------------
  2716. !$omp parallel do &
  2717. !$omp& private(d2pqe,d2pqq,d2pqw,destij,dqstij,dvolp,dwstij &
  2718. !$omp& ,e00,e0q,ep0,estij,hafp,hafq,i,j,k &
  2719. !$omp& ,q00,q0q,q1ij,qp0,qstij,w00,w0q,wp0,wstij)
  2720. !-----------------------------------------------------------------------
  2721. !
  2722. vertical_2: DO K=KTS,KTE
  2723. !
  2724. !-----------------------------------------------------------------------
  2725. !
  2726. DO J=MYJS2,MYJE2
  2727. DO I=MYIS1,MYIE1
  2728. !
  2729. DVOLP=DVOL(I,J,K)
  2730. Q1IJ =Q1(I,J,K)
  2731. !
  2732. HAFP=AFP(I,J,K)
  2733. HAFQ=AFQ(I,J,K)
  2734. !
  2735. D2PQQ=(Q1(IFPA(I,J,K),JFPA(I,J,K),K)-Q1IJ &
  2736. & -Q1IJ+Q1(IFPF(I,J,K),JFPF(I,J,K),K)) &
  2737. & *HAFP &
  2738. & +(Q1(IFQA(I,J,K),JFQA(I,J,K),K)-Q1IJ &
  2739. & -Q1IJ+Q1(IFQF(I,J,K),JFQF(I,J,K),K)) &
  2740. & *HAFQ
  2741. !
  2742. QSTIJ=Q1IJ-D2PQQ
  2743. !
  2744. Q00=Q (I ,J ,K)
  2745. QP0=Q (IFPA(I,J,K),JFPA(I,J,K),K)
  2746. Q0Q=Q (IFQA(I,J,K),JFQA(I,J,K),K)
  2747. !
  2748. QSTIJ=MAX(QSTIJ,MIN(Q00,QP0,Q0Q))
  2749. QSTIJ=MIN(QSTIJ,MAX(Q00,QP0,Q0Q))
  2750. !
  2751. DQSTIJ=QSTIJ-Q(I,J,K)
  2752. !
  2753. DQST(I,J,K)=DQSTIJ
  2754. !
  2755. DQSTIJ=DQSTIJ*DVOLP
  2756. !
  2757. !-----------------------------------------------------------------------
  2758. #if defined(BIT_FOR_BIT) && defined(DM_PARALLEL) && !defined(STUBMPI)
  2759. !-----------------------------------------------------------------------
  2760. DO N=1,2
  2761. XSUMS_L(I,J,K,N)=0.
  2762. ENDDO
  2763. !
  2764. IF(DQSTIJ>0.)THEN
  2765. XSUMS_L(I,J,K,1)=DQSTIJ
  2766. ELSE
  2767. XSUMS_L(I,J,K,2)=DQSTIJ
  2768. ENDIF
  2769. !
  2770. !-----------------------------------------------------------------------
  2771. #else
  2772. !-----------------------------------------------------------------------
  2773. IF(DQSTIJ>0.)THEN
  2774. XSUMS(1,K)=XSUMS(1,K)+DQSTIJ
  2775. ELSE
  2776. XSUMS(2,K)=XSUMS(2,K)+DQSTIJ
  2777. ENDIF
  2778. !
  2779. !-----------------------------------------------------------------------
  2780. #endif
  2781. !-----------------------------------------------------------------------
  2782. !
  2783. ENDDO
  2784. ENDDO
  2785. !
  2786. !-----------------------------------------------------------------------
  2787. !
  2788. ENDDO vertical_2
  2789. !
  2790. !-----------------------------------------------------------------------
  2791. #if defined(BIT_FOR_BIT) && defined(DM_PARALLEL) && !defined(STUBMPI)
  2792. !-----------------------------------------------------------------------
  2793. DO N=1,2
  2794. CALL WRF_PATCH_TO_GLOBAL_REAL(XSUMS_L(IMS,JMS,KMS,N) &
  2795. &, XSUMS_G(1,1,1,N),DOMDESC &
  2796. &, 'xyz','xzy' &
  2797. &, IDS,IDE,KDS,KDE,JDS,JDE &
  2798. &, IMS,IME,KMS,KME,JMS,JME &
  2799. &, ITS,ITE,KTS,KTE,JTS,JTE)
  2800. ENDDO
  2801. !
  2802. DO K=KTS,KTE
  2803. DO N=1,2
  2804. GSUMS(N,K)=0.
  2805. ENDDO
  2806. ENDDO
  2807. !
  2808. IF(WRF_DM_ON_MONITOR())THEN
  2809. DO N=1,2
  2810. !$omp parallel do &
  2811. !$omp& private(i,j,k)
  2812. DO K=KDS,KDE
  2813. DO J=JDS,JDE
  2814. DO I=IDS,IDE
  2815. GSUMS(N,K)=GSUMS(N,K)+XSUMS_G(I,J,K,N)
  2816. ENDDO
  2817. ENDDO
  2818. ENDDO
  2819. ENDDO
  2820. ENDIF
  2821. CALL WRF_DM_BCAST_BYTES(GSUMS,2*RWORDSIZE*2*(KDE-KDS+1) )
  2822. !-----------------------------------------------------------------------
  2823. #else
  2824. !-----------------------------------------------------------------------
  2825. !
  2826. !-----------------------------------------------------------------------
  2827. !*** GLOBAL REDUCTION
  2828. !-----------------------------------------------------------------------
  2829. !
  2830. # if defined(DM_PARALLEL) && !defined(STUBMPI)
  2831. CALL WRF_GET_DM_COMMUNICATOR(MPI_COMM_COMP)
  2832. CALL MPI_ALLREDUCE(XSUMS,GSUMS,2*(KTE-KTS+1) &
  2833. & ,MPI_DOUBLE_PRECISION,MPI_SUM &
  2834. & ,MPI_COMM_COMP,IRECV)
  2835. # else
  2836. DO K=KTS,KTE
  2837. DO N=1,2
  2838. GSUMS(N,K)=XSUMS(N,K)
  2839. ENDDO
  2840. ENDDO
  2841. # endif
  2842. !
  2843. !-----------------------------------------------------------------------
  2844. #endif
  2845. !-----------------------------------------------------------------------
  2846. !
  2847. !-----------------------------------------------------------------------
  2848. !*** END OF GLOBAL REDUCTION
  2849. !-----------------------------------------------------------------------
  2850. !
  2851. ! if(mype==0)then
  2852. !!! if(ntsd==0)then
  2853. !!! call int_get_fresh_handle(nunit)
  2854. !!! close(nunit)
  2855. ! nunit=56
  2856. !!! open(unit=nunit,file='gsums',form='unformatted',iostat=ier)
  2857. !!! endif
  2858. ! endif
  2859. !-----------------------------------------------------------------------
  2860. !$omp parallel do &
  2861. !$omp& private(destij,dqstij,dwstij,i,j,k,rface,rfacq,rfacw &
  2862. !$omp& ,rfeij,rfqij,rfwij,sumnq,sumpq)
  2863. !-----------------------------------------------------------------------
  2864. !
  2865. vertical_3: DO K=KTS,KTE
  2866. !
  2867. !-----------------------------------------------------------------------
  2868. ! if(mype==0)then
  2869. ! write(nunit)(gsums(i,k),i=1,6)
  2870. ! endif
  2871. !!! read(nunit)(gsums(i,k),i=1,6)
  2872. !-----------------------------------------------------------------------
  2873. !
  2874. SUMPQ=GSUMS(1,K)
  2875. SUMNQ=GSUMS(2,K)
  2876. !
  2877. !-----------------------------------------------------------------------
  2878. !*** FIRST MOMENT CONSERVING FACTOR
  2879. !-----------------------------------------------------------------------
  2880. !
  2881. IF(SUMPQ>1.)THEN
  2882. RFACQ=-SUMNQ/SUMPQ
  2883. ELSE
  2884. RFACQ=1.
  2885. ENDIF
  2886. !
  2887. IF(RFACQ<CONSERVE_MIN.OR.RFACQ>CONSERVE_MAX)RFACQ=1.
  2888. !
  2889. !-----------------------------------------------------------------------
  2890. ! if(mype==0.and.ntsd==181)close(nunit)
  2891. !-----------------------------------------------------------------------
  2892. !
  2893. !-----------------------------------------------------------------------
  2894. !*** IMPOSE CONSERVATION ON ANTI-FILTERING
  2895. !-----------------------------------------------------------------------
  2896. !
  2897. DO J=MYJS2,MYJE2
  2898. IF(RFACQ<1.)THEN
  2899. DO I=MYIS1,MYIE1
  2900. DQSTIJ=DQST(I,J,K)
  2901. RFQIJ=HBM2(I,J)*(RFACQ-1.)+1.
  2902. IF(DQSTIJ>=0.)DQSTIJ=DQSTIJ*RFQIJ
  2903. Q(I,J,K)=Q(I,J,K)+DQSTIJ
  2904. ENDDO
  2905. ELSE
  2906. DO I=MYIS1,MYIE1
  2907. DQSTIJ=DQST(I,J,K)
  2908. RFQIJ=HBM2(I,J)*(RFACQ-1.)+1.
  2909. IF(DQSTIJ<0.)DQSTIJ=DQSTIJ/RFQIJ
  2910. Q(I,J,K)=Q(I,J,K)+DQSTIJ
  2911. ENDDO
  2912. ENDIF
  2913. ENDDO
  2914. !
  2915. !-----------------------------------------------------------------------
  2916. !
  2917. DO J=MYJS,MYJE
  2918. DO I=MYIS,MYIE
  2919. SCAL(I,J,K,L)=Q(I,J,K)
  2920. ENDDO
  2921. ENDDO
  2922. !
  2923. !-----------------------------------------------------------------------
  2924. !
  2925. ENDDO vertical_3
  2926. !
  2927. !-----------------------------------------------------------------------
  2928. !
  2929. ENDDO scalar_loop
  2930. !
  2931. !-----------------------------------------------------------------------
  2932. !
  2933. END SUBROUTINE HAD2_SCAL
  2934. !
  2935. !-----------------------------------------------------------------------
  2936. !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2937. subroutine adv2 &
  2938. (UPSTRM &
  2939. ,mype,kss,kse &
  2940. ,ids,ide,jds,jde,kds,kde &
  2941. ,ims,ime,jms,jme,kms,kme &
  2942. ,its,ite,jts,jte,kts,kte &
  2943. ,N_IUP_H &
  2944. ,N_IUP_ADH &
  2945. ,IUP_H,IUP_ADH &
  2946. ,ENT &
  2947. ,idtad &
  2948. ,dt,pdtop &
  2949. ,ihe,ihw,ive,ivw &
  2950. ,deta1,deta2 &
  2951. ,EMT_LOC &
  2952. ,fad,hbm2,pdsl,pdslo &
  2953. ,petdt &
  2954. ,UOLD,VOLD &
  2955. ,s,sp &
  2956. !---temporary arguments-------------------------------------------------
  2957. ,fne,fse,few,fns,s1,tcs)
  2958. !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2959. implicit none
  2960. !-----------------------------------------------------------------------
  2961. real,parameter:: &
  2962. cfc=1.533 & ! adams-bashforth positioning in time
  2963. ,bfc=1.-cfc & ! adams bashforth positioning in time
  2964. ,cflc=9.005 & !
  2965. ,epsq=1.e-20 & ! floor value for specific humidity
  2966. ,epsq2=0.2 & ! floor value for 2tke
  2967. ,epscm=2.e-6 & ! a floor value (not used)
  2968. ,w1=1.0 & ! crank-nicholson uncentering
  2969. !,w1=-1.00 & ! crank-nicholson uncentering
  2970. ,w2=2.-w1 ! crank-nicholson uncentering
  2971. logical,intent(in):: &
  2972. upstrm
  2973. integer,intent(in):: &
  2974. idtad & ! time step multiplier
  2975. ,kse & ! terminal species index
  2976. ,kss & ! initial species index
  2977. ,mype & !
  2978. ,ids,ide,jds,jde,kds,kde &
  2979. ,ims,ime,jms,jme,kms,kme &
  2980. ,its,ite,jts,jte,kts,kte
  2981. real,intent(in):: &
  2982. ent & !
  2983. ,dt & ! dynamics time step
  2984. ,pdtop !
  2985. real,dimension(kts:kte),intent(in):: &
  2986. deta1 & ! delta sigmas
  2987. ,deta2 ! delta pressures
  2988. integer,dimension(jms:jme),intent(in):: &
  2989. ihe,ihw,ive,ivw &
  2990. ,n_iup_adh,n_iup_h
  2991. integer,dimension(ims:ime,jms:jme),intent(in):: &
  2992. iup_h,iup_adh
  2993. real,dimension(2600),intent(in):: & !!!zj see nmm_max_dim in adve !!!zj
  2994. emt_loc
  2995. real,dimension(ims:ime,jms:jme),intent(in):: &
  2996. fad & !
  2997. ,hbm2 & !
  2998. ,pdsl & ! sigma range pressure difference
  2999. ,pdslo ! sigma range pressure difference
  3000. real,dimension(ims:ime,jms:jme,kms:kme),intent(in):: &
  3001. petdt & ! vertical mass flux
  3002. ,uold,vold
  3003. real,dimension(ims:ime,jms:jme,kms:kme,kss:kse),intent(inout):: &
  3004. s ! tracers
  3005. real,dimension(ims:ime,jms:jme,kms:kme,kss:kse),intent(inout):: &
  3006. sp ! s at previous time level
  3007. !---temporary arguments-------------------------------------------------
  3008. real,dimension(ims:ime,jms:jme,kms:kme),intent(in):: &
  3009. fne & ! mass flux, ne direction
  3010. ,fse & ! mass flux, se direction
  3011. ,few & ! mass flux, x direction
  3012. ,fns ! mass flux, y direction
  3013. real,dimension(ims:ime,jms:jme,kms:kme,kss:kse),intent(inout):: &
  3014. s1 & ! intermediate value of s
  3015. ,tcs ! timechange of s
  3016. !--local variables------------------------------------------------------
  3017. integer:: &
  3018. i & !
  3019. ,j & !
  3020. ,k & !
  3021. ,ks !
  3022. INTEGER :: IEND,IFP,IFQ,II,IPQ,ISP,ISQ,ISTART &
  3023. & ,IUP_ADH_J &
  3024. & ,J1,JA,JAK,JEND,JGLOBAL,JJ,JKNT,JP2,JSTART &
  3025. & ,KNTI_ADH,KSTART,KSTOP &
  3026. & ,N,N_IUPH_J,N_IUPADH_J,N_IUPADV_J
  3027. INTEGER :: MY_IS_GLB,MY_IE_GLB,MY_JS_GLB,MY_JE_GLB
  3028. real:: &
  3029. cf & ! temporary
  3030. ,cms & ! temporary
  3031. ,dtq & ! dt/4
  3032. ,fahp & ! temporary grid factor
  3033. ,sn & !
  3034. ,rdp & ! 1/deltap
  3035. ,vvlo & ! vertical velocity, lower interface
  3036. ,vvup & ! vertical velocity, upper interface
  3037. ,pvvup ! vertical mass flux, upper interface
  3038. REAL :: ARRAY3_X &
  3039. & ,F0,F1,F2,F3 &
  3040. & ,PP &
  3041. & ,QP &
  3042. & ,TEMPA,TEMPB,TTA,TTB
  3043. real,dimension(kts:kte):: &
  3044. deta1_pdtop !
  3045. INTEGER,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5) :: ISPA,ISQA
  3046. real,dimension(its-5:ite+5,jts-5:jte+5):: &
  3047. pdop & ! hydrostatic pressure difference at h points
  3048. ,pvvlo & ! vertical mass flux, lower interface
  3049. ,ss1 & ! extrapolated species between time levels
  3050. ,ssne & ! flux, ne direction
  3051. ,ssse & ! flux, nw direction
  3052. ,ssx & ! flux, x direction
  3053. ,ssy ! flux, y direction
  3054. REAL,DIMENSION(ITS-5:ITE+5,JTS-5:JTE+5) :: ARRAY0,ARRAY1 &
  3055. & ,ARRAY2,ARRAY3
  3056. real,dimension(its-5:ite+5,jts-5:jte+5,kts:kte):: &
  3057. crs & ! vertical advection temporary
  3058. ,rcms ! vertical advection temporary
  3059. real,dimension(its-5:ite+5,jts-5:jte+5,kts:kte,kss:kse):: &
  3060. rsts ! vertical advection temporary
  3061. !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3062. DO J=JTS-5,JTE+5
  3063. DO I=ITS-5,ITE+5
  3064. pdop (i,j)=0.
  3065. pvvlo(i,j)=0.
  3066. ss1 (i,j)=0.
  3067. ssne (i,j)=0.
  3068. ssse (i,j)=0.
  3069. enddo
  3070. enddo
  3071. !
  3072. DO K=KTS,KTE
  3073. DO J=JTS-5,JTE+5
  3074. DO I=ITS-5,ITE+5
  3075. crs (i,j,k)=0.
  3076. rcms(i,j,k)=0.
  3077. enddo
  3078. enddo
  3079. enddo
  3080. !
  3081. do ks=kss,kse
  3082. DO K=KTS,KTE
  3083. DO J=JTS-5,JTE+5
  3084. DO I=ITS-5,ITE+5
  3085. rsts(i,j,k,ks)=0.
  3086. s1 (i,j,k,ks)=0.
  3087. enddo
  3088. enddo
  3089. enddo
  3090. enddo
  3091. !
  3092. do ks=kss,kse
  3093. DO K=KMS,KME
  3094. DO J=JMS,JME
  3095. DO I=IMS,IME
  3096. s1 (i,j,k,ks)=0.
  3097. tcs(i,j,k,ks)=0.
  3098. enddo
  3099. enddo
  3100. enddo
  3101. enddo
  3102. !-----------------------------------------------------------------------
  3103. do k=kts,kte
  3104. deta1_pdtop(k)=deta1(k)*pdtop
  3105. enddo
  3106. !-----------------------------------------------------------------------
  3107. do ks=kss,kse ! loop by species
  3108. !-----------------------------------------------------------------------
  3109. DO K=KTS,KTE
  3110. DO J=MYJS_P4,MYJE_P4
  3111. DO I=MYIS_P4,MYIE_P4
  3112. s1(i,j,k,ks)=sqrt(s(i,j,k,ks))
  3113. enddo
  3114. enddo
  3115. enddo
  3116. !-----------------------------------------------------------------------
  3117. enddo ! end of the loop by species
  3118. !-----------------------------------------------------------------------
  3119. DO J=MYJS_P4,MYJE_P4
  3120. DO I=MYIS_P4,MYIE_P4
  3121. pdop(i,j)=(pdslo(i,j)+pdsl(i,j))*0.5
  3122. enddo
  3123. enddo
  3124. !---crank-nicholson vertical advection----------------------------------
  3125. dtq=dt*idtad*0.25
  3126. DO J=MYJS2,MYJE2
  3127. DO I=MYIS1,MYIE1
  3128. pvvlo(i,j)=petdt(i,j,kte-1)*dtq
  3129. vvlo=pvvlo(i,j)/(deta2(kte)*pdop(i,j)+deta1_pdtop(kte))
  3130. !
  3131. cms=-vvlo*w2+1.
  3132. rcms(i,j,kte)=1./cms
  3133. crs(i,j,kte)=vvlo*w2
  3134. !
  3135. do ks=kss,kse
  3136. rsts(i,j,kte,ks)=(-vvlo*w1) &
  3137. *(s1(i,j,kte-1,ks)-s1(i,j,kte,ks)) &
  3138. +s1(i,j,kte,ks)
  3139. enddo
  3140. enddo
  3141. enddo
  3142. DO K=KTE-1,KTS+1,-1
  3143. DO J=MYJS2,MYJE2
  3144. DO I=MYIS1,MYIE1
  3145. rdp=1./(deta2(k)*pdop(i,j)+deta1_pdtop(k))
  3146. pvvup=pvvlo(i,j)
  3147. pvvlo(i,j)=petdt(i,j,k-1)*dtq
  3148. !
  3149. vvup=pvvup*rdp
  3150. vvlo=pvvlo(i,j)*rdp
  3151. !
  3152. ! if(abs(vvlo).gt.cflc) then
  3153. ! if(vvlo.lt.0.) then
  3154. ! vvlo=-cflc
  3155. ! else
  3156. ! vvlo= cflc
  3157. ! endif
  3158. ! endif
  3159. !
  3160. cf=-vvup*w2*rcms(i,j,k+1)
  3161. cms=-crs(i,j,k+1)*cf+((vvup-vvlo)*w2+1.)
  3162. rcms(i,j,k)=1./cms
  3163. crs(i,j,k)=vvlo*w2
  3164. !
  3165. do ks=kss,kse
  3166. rsts(i,j,k,ks)=-rsts(i,j,k+1,ks)*cf+s1(i,j,k,ks) &
  3167. -(s1(i,j,k ,ks)-s1(i,j,k+1,ks))*vvup*w1 &
  3168. -(s1(i,j,k-1,ks)-s1(i,j,k ,ks))*vvlo*w1
  3169. enddo
  3170. enddo
  3171. enddo
  3172. enddo
  3173. DO J=MYJS2,MYJE2
  3174. DO I=MYIS1,MYIE1
  3175. pvvup=pvvlo(i,j)
  3176. vvup=pvvup/(deta2(kts)*pdop(i,j)+deta1_pdtop(kts))
  3177. !
  3178. cf=-vvup*w2*rcms(i,j,kts+1)
  3179. cms=-crs(i,j,kts+1)*cf+(vvup*w2+1.)
  3180. rcms(i,j,kts)=1./cms
  3181. crs(i,j,kts)=0.
  3182. !
  3183. do ks=kss,kse
  3184. rsts(i,j,kts,ks)=-rsts(i,j,kts+1,ks)*cf+s1(i,j,kts,ks) &
  3185. -(s1(i,j,kts,ks)-s1(i,j,kts+1,ks))*vvup*w1
  3186. !
  3187. tcs(i,j,kts,ks)=rsts(i,j,kts,ks)*rcms(i,j,kts)-s1(i,j,kts,ks)
  3188. enddo
  3189. enddo
  3190. enddo
  3191. do ks=kss,kse
  3192. DO K=KTS+1,KTE
  3193. DO J=MYJS2,MYJE2
  3194. DO I=MYIS1,MYIE1
  3195. tcs(i,j,k,ks)=(-crs(i,j,k)*(s1(i,j,k-1,ks)+tcs(i,j,k-1,ks)) &
  3196. +rsts(i,j,k,ks)) &
  3197. *rcms(i,j,k)-s1(i,j,k,ks)
  3198. enddo
  3199. enddo
  3200. enddo
  3201. enddo
  3202. !-----------------------------------------------------------------------
  3203. do ks=kss,kse ! loop by species
  3204. !-----------------------------------------------------------------------
  3205. DO K=KTS,KTE
  3206. DO J=MYJS_P5,MYJE_P5
  3207. DO I=MYIS_P5,MYIE_P5
  3208. ss1(i,j)=s1(i,j,k,ks)*cfc+sp(i,j,k,ks)*bfc
  3209. sp(i,j,k,ks)=s1(i,j,k,ks)
  3210. enddo
  3211. enddo
  3212. !---fluxes--------------------------------------------------------------
  3213. DO J=MYJS1_P2,MYJE1_P2
  3214. DO I=MYIS_P2,MYIE_P3
  3215. ssx(i,j)=(ss1(i+ive(j),j )-ss1(i+ivw(j),j ))*few(i,j,k) &
  3216. *hbm2(i,j)
  3217. ssy(i,j)=(ss1(i ,j+1)-ss1(i ,j-1))*fns(i,j,k) &
  3218. *hbm2(i,j)
  3219. enddo
  3220. enddo
  3221. DO J=MYJS1_P2,MYJE2_P2
  3222. DO I=MYIS_P2,MYIE_P2
  3223. ssne(i,j)=(ss1(i+ihe(j),j+1)-ss1(i,j))*fne(i,j,k)*hbm2(i,j)
  3224. enddo
  3225. enddo
  3226. DO J=MYJS2_P2,MYJE1_P2
  3227. DO I=MYIS_P2,MYIE_P2
  3228. ssse(i,j)=(ss1(i+ihe(j),j-1)-ss1(i,j))*fse(i,j,k)*hbm2(i,j)
  3229. enddo
  3230. enddo
  3231. !---advection of species------------------------------------------------
  3232. DO J=MYJS5,MYJE5
  3233. DO I=MYIS2,MYIE2
  3234. tcs(i,j,k,ks)=((ssx (i+ihw(j),j )+ssx (i+ihe(j),j ) &
  3235. +ssy (i ,j-1)+ssy (i ,j+1) &
  3236. +ssne(i+ihw(j),j-1)+ssne(i ,j ) &
  3237. +ssse(i ,j )+ssse(i+ihw(j),j+1)) &
  3238. *fad(i,j)*2.0*idtad & !! 2.0 compensates for fad
  3239. /(deta2(k)*pdop(i,j)+deta1_pdtop(k)) &
  3240. +tcs(i,j,k,ks))*hbm2(i,j)
  3241. enddo
  3242. enddo
  3243. !-----------------------------------------------------------------------
  3244. !
  3245. !*** upstream advection
  3246. !
  3247. !-----------------------------------------------------------------------
  3248. !
  3249. upstream: IF(UPSTRM)THEN
  3250. !
  3251. !-----------------------------------------------------------------------
  3252. !***
  3253. !*** COMPUTE UPSTREAM COMPUTATIONS ON THIS TASK'S ROWS.
  3254. !***
  3255. !-----------------------------------------------------------------------
  3256. !
  3257. jloop_upstream: DO J=MYJS2,MYJE2
  3258. !
  3259. N_IUPH_J=N_IUP_H(J) ! See explanation in START_DOMAIN_NMM
  3260. DO II=0,N_IUPH_J-1
  3261. !
  3262. I=IUP_H(IMS+II,J)
  3263. tta=emt_loc(j) &
  3264. *(uold(i ,j-1,k)+uold(i+ihw(j),j ,k) &
  3265. +uold(i+ihe(j),j ,k)+uold(i ,j+1,k))
  3266. ttb=ent &
  3267. *(vold(i ,j-1,k)+vold(i+ihw(j),j ,k) &
  3268. +vold(i+ihe(j),j ,k)+vold(i ,j+1,k))
  3269. PP=-TTA-TTB
  3270. QP= TTA-TTB
  3271. !
  3272. IF(PP<0.)THEN
  3273. ISPA(I,J)=-1
  3274. ELSE
  3275. ISPA(I,J)= 1
  3276. ENDIF
  3277. !
  3278. IF(QP<0.)THEN
  3279. ISQA(I,J)=-1
  3280. ELSE
  3281. ISQA(I,J)= 1
  3282. ENDIF
  3283. !
  3284. PP=ABS(PP)
  3285. QP=ABS(QP)
  3286. ARRAY3_X=PP*QP
  3287. ARRAY0(I,J)=ARRAY3_X-PP-QP
  3288. ARRAY1(I,J)=PP-ARRAY3_X
  3289. ARRAY2(I,J)=QP-ARRAY3_X
  3290. ARRAY3(I,J)=ARRAY3_X
  3291. ENDDO
  3292. !
  3293. !-----------------------------------------------------------------------
  3294. !
  3295. N_IUPADH_J=N_IUP_ADH(J)
  3296. KNTI_ADH=1
  3297. IUP_ADH_J=IUP_ADH(IMS,J)
  3298. !
  3299. iloop_T: DO II=0,N_IUPH_J-1
  3300. !
  3301. I=IUP_H(IMS+II,J)
  3302. !
  3303. ISP=ISPA(I,J)
  3304. ISQ=ISQA(I,J)
  3305. IFP=(ISP-1)/2
  3306. IFQ=(-ISQ-1)/2
  3307. IPQ=(ISP-ISQ)/2
  3308. !
  3309. !-----------------------------------------------------------------------
  3310. !
  3311. IF(I==IUP_ADH_J)THEN ! Upstream advection T tendencies
  3312. !
  3313. ISP=ISPA(I,J)
  3314. ISQ=ISQA(I,J)
  3315. IFP=(ISP-1)/2
  3316. IFQ=(-ISQ-1)/2
  3317. IPQ=(ISP-ISQ)/2
  3318. !
  3319. F0=ARRAY0(I,J)
  3320. F1=ARRAY1(I,J)
  3321. F2=ARRAY2(I,J)
  3322. F3=ARRAY3(I,J)
  3323. !
  3324. tcs(i,j,k,ks)=(f0*s1(i,j,k,ks) &
  3325. & +f1*s1(i+ihe(j)+ifp,j+isp,k,ks) &
  3326. & +f2*s1(i+ihe(j)+ifq,j+isq,k,ks) &
  3327. & +f3*s1(i+ipq,j+isp+isq,k,ks))*2.0 &
  3328. & *idtad &
  3329. & +tcs(i,j,k,ks)*hbm2(i,j)
  3330. !
  3331. !-----------------------------------------------------------------------
  3332. !
  3333. IF(KNTI_ADH<N_IUPADH_J)THEN
  3334. IUP_ADH_J=IUP_ADH(IMS+KNTI_ADH,J)
  3335. KNTI_ADH=KNTI_ADH+1
  3336. ENDIF
  3337. !
  3338. ENDIF ! End of upstream advection tendency IF block
  3339. !
  3340. ENDDO iloop_T
  3341. !
  3342. !-----------------------------------------------------------------------
  3343. enddo jloop_upstream
  3344. !-----------------------------------------------------------------------
  3345. endif upstream
  3346. !-----------------------------------------------------------------------
  3347. enddo ! kts,kte
  3348. !-----------------------------------------------------------------------
  3349. enddo ! end of the loop by the species
  3350. !-----------------------------------------------------------------------
  3351. endsubroutine adv2
  3352. !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3353. subroutine mono &
  3354. ( &
  3355. #if defined(DM_PARALLEL)
  3356. domdesc, &
  3357. #endif
  3358. mype,ntsd,hours,kss,kse &
  3359. ,ids,ide,jds,jde,kds,kde &
  3360. ,ims,ime,jms,jme,kms,kme &
  3361. ,its,ite,jts,jte,kts,kte &
  3362. ,idtad &
  3363. ,dy,pdtop &
  3364. ,sumdrrw &
  3365. ,ihe,ihw &
  3366. ,deta1,deta2 &
  3367. ,dx,hbm2,pd &
  3368. ,s &
  3369. !---temporary arguments-------------------------------------------------
  3370. ,s1,tcs)
  3371. !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3372. implicit none
  3373. !-----------------------------------------------------------------------
  3374. real,parameter:: &
  3375. epsq=1.e-20 & ! floor value for specific humidity
  3376. ,epsq2=0.02 ! floor value for 2tke
  3377. #ifdef DM_PARALLEL
  3378. INTEGER :: DOMDESC
  3379. #endif
  3380. integer,intent(in):: &
  3381. idtad & ! time step multiplier
  3382. ,kse & ! terminal species index
  3383. ,kss & ! initial species index
  3384. ,mype & !
  3385. ,ntsd & !
  3386. ,ids,ide,jds,jde,kds,kde &
  3387. ,ims,ime,jms,jme,kms,kme &
  3388. ,its,ite,jts,jte,kts,kte
  3389. real,intent(in):: &
  3390. dy & !
  3391. ,pdtop & !
  3392. ,hours !
  3393. real,intent(inout):: &
  3394. sumdrrw
  3395. integer,dimension(jms:jme),intent(in):: &
  3396. ihe,ihw
  3397. real,dimension(kts:kte),intent(in):: &
  3398. deta1 & ! delta sigmas
  3399. ,deta2 ! delta sigmas
  3400. real,dimension(ims:ime,jms:jme),intent(in):: &
  3401. dx & !
  3402. ,hbm2 & !
  3403. ,pd ! sigma range pressure difference
  3404. real,dimension(ims:ime,jms:jme,kms:kme,kss:kse),intent(in):: &
  3405. s ! s
  3406. !---temporary arguments-------------------------------------------------
  3407. real,dimension(ims:ime,jms:jme,kms:kme,kss:kse),intent(inout):: &
  3408. s1 & ! intermediate value of s
  3409. ,tcs ! timechange of s
  3410. !--local variables------------------------------------------------------
  3411. integer:: &
  3412. i & !
  3413. ,ierr & !
  3414. ,irecv & !
  3415. ,j & !
  3416. ,k & !
  3417. ,ks & !
  3418. ,lngth & !
  3419. ,mpi_comm_comp !
  3420. real:: &
  3421. dsks & !
  3422. ,dvolp & !
  3423. ,rfacs & !
  3424. ,s1p & !
  3425. ,sfacs & !
  3426. ,smax & ! local maximum
  3427. ,smin & ! local minimum
  3428. ,smaxh & ! horizontal local maximum
  3429. ,sminh & ! horizontal local minimum
  3430. ,smaxv & ! vertical local maximum
  3431. ,sminv & ! vertical local minimum
  3432. ,sn & !
  3433. ,sumns & !
  3434. ,sumps & !
  3435. ,steep
  3436. double precision:: &
  3437. xsmp,gsmp
  3438. double precision,dimension(2*kss-1:2*kse):: &
  3439. vgsms
  3440. real,dimension(kts:kte):: &
  3441. deta1_pdtop !
  3442. real,dimension(2*kss-1:2*kse,kts:kte):: &
  3443. gsms_single !
  3444. double precision,dimension(2*kss-1:2*kse,kts:kte):: &
  3445. gsms & ! sum of neg/pos changes all global fields
  3446. ,xsms ! sum of neg/pos changes all local fields
  3447. double precision,dimension(2*kss-1:2*kse):: &
  3448. vgsums !
  3449. real,dimension(its-5:ite+5,jts-5:jte+5,kts:kte):: &
  3450. dvol & ! grid box volume
  3451. ,rdvol ! 1./grid box volume
  3452. logical, save :: first=.true.
  3453. real, save :: sumrrw_first, summass_first
  3454. real :: summass
  3455. double precision, save :: gsmp_first
  3456. !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3457. ! steep=1.-0.040*idtad
  3458. steep=1.
  3459. DO K=KTS,KTE
  3460. deta1_pdtop(k)=deta1(k)*pdtop
  3461. enddo
  3462. !
  3463. DO K=KTS,KTE
  3464. DO J=MYJS2,MYJE2
  3465. DO I=MYIS1,MYIE1
  3466. dvolp=(deta2(k)*pd(i,j)+deta1_pdtop(k))*dx(i,j)*dy
  3467. rdvol(i,j,k)=hbm2(i,j)/dvolp
  3468. dvol (i,j,k)=hbm2(i,j)*dvolp
  3469. enddo
  3470. enddo
  3471. enddo
  3472. ! go to 109
  3473. !---monotonization------------------------------------------------------
  3474. do ks=kss,kse ! loop by species
  3475. !-----------------------------------------------------------------------
  3476. DO K=KTS,KTE
  3477. xsms(2*ks-1,k)=0.
  3478. xsms(2*ks ,k)=0.
  3479. gsms(2*ks-1,k)=0.
  3480. gsms(2*ks ,k)=0.
  3481. !
  3482. DO J=MYJS2,MYJE2
  3483. DO I=MYIS1,MYIE1
  3484. !
  3485. s1p=(s1(i,j,k,ks)+tcs(i,j,k,ks))**2
  3486. tcs(i,j,k,ks)=s1p-s(i,j,k,ks)
  3487. !
  3488. sminh=min(s(i ,j-2,k,ks) &
  3489. ,s(i+ihw(j),j-1,k,ks) &
  3490. ,s(i+ihe(j),j-1,k,ks) &
  3491. ,s(i-1 ,j ,k,ks) &
  3492. ,s(i ,j ,k,ks) &
  3493. ,s(i+1 ,j ,k,ks) &
  3494. ,s(i+ihw(j),j+1,k,ks) &
  3495. ,s(i+ihe(j),j+1,k,ks) &
  3496. ,s(i ,j+2,k,ks))
  3497. smaxh=max(s(i ,j-2,k,ks) &
  3498. ,s(i+ihw(j),j-1,k,ks) &
  3499. ,s(i+ihe(j),j-1,k,ks) &
  3500. ,s(i-1 ,j ,k,ks) &
  3501. ,s(i ,j ,k,ks) &
  3502. ,s(i+1 ,j ,k,ks) &
  3503. ,s(i+ihw(j),j+1,k,ks) &
  3504. ,s(i+ihe(j),j+1,k,ks) &
  3505. ,s(i ,j+2,k,ks))
  3506. !
  3507. if(k.gt.kts.and.k.lt.kte) then
  3508. sminv=min(s(i,j,k-1,ks),s(i,j,k ,ks),s(i,j,k+1,ks))
  3509. smaxv=max(s(i,j,k-1,ks),s(i,j,k ,ks),s(i,j,k+1,ks))
  3510. elseif(k.eq.kts) then
  3511. sminv=min(s(i,j,k ,ks),s(i,j,k+1,ks))
  3512. smaxv=max(s(i,j,k ,ks),s(i,j,k+1,ks))
  3513. elseif(k.eq.kte) then
  3514. sminv=min(s(i,j,k-1,ks),s(i,j,k ,ks))
  3515. smaxv=max(s(i,j,k-1,ks),s(i,j,k ,ks))
  3516. endif
  3517. !
  3518. smin=min(sminh,sminv)
  3519. smax=max(smaxh,smaxv)
  3520. !
  3521. sn=s1p
  3522. if(sn.gt.steep*smax) sn=smax
  3523. if(sn.lt. smin) sn=smin
  3524. !
  3525. dsks=(sn-s1p)*dvol(i,j,k)
  3526. s1(i,j,k,ks)=dsks
  3527. if(dsks.gt.0.) then
  3528. xsms(2*ks-1,k)=xsms(2*ks-1,k)+dsks
  3529. else
  3530. xsms(2*ks ,k)=xsms(2*ks ,k)+dsks
  3531. endif
  3532. !
  3533. enddo
  3534. enddo
  3535. enddo
  3536. !-----------------------------------------------------------------------
  3537. enddo ! end of the loop by species
  3538. !-----------------------------------------------------------------------
  3539. !-----------------------------------------------------------------------
  3540. !*** GLOBAL REDUCTION
  3541. !-----------------------------------------------------------------------
  3542. !
  3543. # if defined(DM_PARALLEL) && !defined(STUBMPI)
  3544. CALL WRF_GET_DM_COMMUNICATOR(MPI_COMM_COMP)
  3545. lngth=(2*kse-2*kss+2)*(KTE-KTS+1)
  3546. CALL MPI_ALLREDUCE(XSMS,GSMS,lngth &
  3547. & ,MPI_DOUBLE_PRECISION,MPI_SUM &
  3548. & ,MPI_COMM_COMP,IRECV)
  3549. # else
  3550. DO K=KTS,KTE
  3551. do ks=kss,kse
  3552. gsms(2*ks-1,k)=xsms(2*ks-1,k)
  3553. gsms(2*ks ,k)=xsms(2*ks ,k)
  3554. enddo
  3555. enddo
  3556. # endif
  3557. !
  3558. DO K=KTS,KTE
  3559. do ks=kss,kse
  3560. gsms_single(2*ks-1,k)=gsms(2*ks-1,k)
  3561. gsms_single(2*ks ,k)=gsms(2*ks ,k)
  3562. enddo
  3563. enddo
  3564. !
  3565. !-----------------------------------------------------------------------
  3566. !*** END OF GLOBAL REDUCTION
  3567. !-----------------------------------------------------------------------
  3568. !
  3569. !dusan!---forced conservation after monotonization----------------------------
  3570. !dusan do ks=kss,kse
  3571. !dusan DO K=KTS,KTE
  3572. !dusan sumps=gsms_single(2*ks-1,k)
  3573. !dusan sumns=gsms_single(2*ks ,k)
  3574. !dusan!
  3575. !dusan if(sumps*(-sumns).gt.1.) then
  3576. !dusan sfacs=-sumns/sumps
  3577. !dusan rfacs=1./sfacs
  3578. !dusan else
  3579. !dusan sfacs=0.
  3580. !dusan rfacs=0.
  3581. !dusan endif
  3582. !dusan!
  3583. !dusan DO J=MYJS2,MYJE2
  3584. !dusan DO I=MYIS1,MYIE1
  3585. !dusan dsks=s1(i,j,k,ks)*rdvol(i,j,k)
  3586. !dusan if(sfacs.gt.1.) then
  3587. !dusan if(dsks.lt.0.) dsks=dsks*rfacs
  3588. !dusan!zjtest if(dsks.lt.0.) dsks=dsks
  3589. !dusan else
  3590. !dusan if(dsks.ge.0.) dsks=dsks*sfacs
  3591. !dusan endif
  3592. !dusan tcs(i,j,k,ks)=tcs(i,j,k,ks)+dsks
  3593. !dusan enddo
  3594. !dusan enddo
  3595. !dusan enddo
  3596. !dusan!-----------------------------------------------------------------------
  3597. !dusan enddo ! end of the loop by species
  3598. !---forced conservation after monotonization----------------------------
  3599. do ks=kss,kse
  3600. vgsums(2*ks-1)=0.
  3601. vgsums(2*ks )=0.
  3602. DO K=KTS,KTE
  3603. vgsums(2*ks-1)=gsms(2*ks-1,k)+vgsums(2*ks-1)
  3604. vgsums(2*ks )=gsms(2*ks ,k)+vgsums(2*ks )
  3605. enddo
  3606. enddo
  3607. do ks=kss,kse
  3608. sumps=vgsums(2*ks-1)
  3609. sumns=vgsums(2*ks )
  3610. !
  3611. if(sumps*(-sumns).gt.1.) then
  3612. sfacs=-sumns/sumps
  3613. rfacs=1./sfacs
  3614. else
  3615. sfacs=0.
  3616. rfacs=0.
  3617. endif
  3618. !
  3619. DO K=KTS,KTE
  3620. DO J=MYJS2,MYJE2
  3621. DO I=MYIS1,MYIE1
  3622. dsks=s1(i,j,k,ks)*rdvol(i,j,k)
  3623. if(sfacs.lt.1.) then
  3624. if(dsks.gt.0.) dsks=dsks*sfacs
  3625. endif
  3626. tcs(i,j,k,ks)=tcs(i,j,k,ks)+dsks
  3627. enddo
  3628. enddo
  3629. enddo
  3630. !-----------------------------------------------------------------------
  3631. enddo ! end of the loop by species
  3632. 109 continue
  3633. !-----------------------------------------------------------------------
  3634. !zjwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
  3635. !-----------------------------------------------------------------------
  3636. do ks=kss,kse ! loop by species
  3637. DO K=KTS,KTE
  3638. xsms(2*ks-1,k)=0.
  3639. xsms(2*ks ,k)=0.
  3640. gsms(2*ks-1,k)=0.
  3641. gsms(2*ks ,k)=0.
  3642. !
  3643. DO J=MYJS2,MYJE2
  3644. DO I=MYIS1,MYIE1
  3645. xsms(2*ks-1,k)=xsms(2*ks-1,k)+s (i,j,k,ks)*dvol(i,j,k)
  3646. xsms(2*ks ,k)=xsms(2*ks ,k)+tcs(i,j,k,ks)*dvol(i,j,k)
  3647. enddo
  3648. enddo
  3649. enddo
  3650. enddo
  3651. !
  3652. xsmp=0.
  3653. DO J=MYJS2,MYJE2
  3654. DO I=MYIS1,MYIE1
  3655. xsmp=pd(i,j)*dx(i,j)*dy*hbm2(i,j)+xsmp
  3656. enddo
  3657. enddo
  3658. !
  3659. !-----------------------------------------------------------------------
  3660. !*** GLOBAL REDUCTION
  3661. !-----------------------------------------------------------------------
  3662. !
  3663. # if defined(DM_PARALLEL) && !defined(STUBMPI)
  3664. CALL WRF_GET_DM_COMMUNICATOR(MPI_COMM_COMP)
  3665. lngth=1
  3666. CALL MPI_ALLREDUCE(xsmp,gsmp,lngth &
  3667. & ,MPI_DOUBLE_PRECISION,MPI_SUM &
  3668. & ,MPI_COMM_COMP,IRECV)
  3669. # else
  3670. gsmp=xsmp
  3671. # endif
  3672. !
  3673. !-----------------------------------------------------------------------
  3674. !*** END OF GLOBAL REDUCTION
  3675. !-----------------------------------------------------------------------
  3676. !
  3677. !
  3678. !-----------------------------------------------------------------------
  3679. !*** GLOBAL REDUCTION
  3680. !-----------------------------------------------------------------------
  3681. !
  3682. # if defined(DM_PARALLEL) && !defined(STUBMPI)
  3683. CALL WRF_GET_DM_COMMUNICATOR(MPI_COMM_COMP)
  3684. lngth=(2*kse-2*kss+2)*(KTE-KTS+1)
  3685. CALL MPI_ALLREDUCE(XSMS,GSMS,lngth &
  3686. & ,MPI_DOUBLE_PRECISION,MPI_SUM &
  3687. & ,MPI_COMM_COMP,IRECV)
  3688. # else
  3689. DO K=KTS,KTE
  3690. do ks=kss,kse
  3691. gsms(2*ks-1,k)=xsms(2*ks-1,k)
  3692. gsms(2*ks ,k)=xsms(2*ks ,k)
  3693. enddo
  3694. enddo
  3695. # endif
  3696. !
  3697. DO K=KTS,KTE
  3698. do ks=kss,kse
  3699. gsms_single(2*ks-1,k)=gsms(2*ks-1,k)
  3700. gsms_single(2*ks ,k)=gsms(2*ks ,k)
  3701. enddo
  3702. enddo
  3703. !
  3704. !-----------------------------------------------------------------------
  3705. !*** END OF GLOBAL REDUCTION
  3706. !-----------------------------------------------------------------------
  3707. !
  3708. do ks=kss,kse
  3709. vgsms(2*ks-1)=0.
  3710. vgsms(2*ks )=0.
  3711. enddo
  3712. !
  3713. do ks=kss,kse
  3714. DO K=KTS,KTE
  3715. vgsms(2*ks-1)=gsms(2*ks-1,k)+vgsms(2*ks-1)
  3716. vgsms(2*ks )=gsms(2*ks ,k)+vgsms(2*ks )
  3717. enddo
  3718. enddo
  3719. !
  3720. sumdrrw=vgsms(6)+sumdrrw
  3721. !
  3722. summass=0.0
  3723. DO K=KTS,KTE
  3724. DO J=MYJS2,MYJE2
  3725. DO I=MYIS1,MYIE1
  3726. summass=summass+dvol(i,j,k)
  3727. ENDDO
  3728. ENDDO
  3729. ENDDO
  3730. !
  3731. if (first) then
  3732. sumrrw_first = vgsms(5)
  3733. gsmp_first = gsmp
  3734. summass_first = summass
  3735. first=.false.
  3736. end if
  3737. !
  3738. ! write(0,1000) ntsd,hours, & ! 4,5
  3739. ! (vgsms(ks),ks=2*kss-1,2*kse), & ! 6-13
  3740. ! gsmp,gsmp_first,gsmp/gsmp_first, & ! 14-16
  3741. ! sumdrrw, & ! 17
  3742. ! vgsms(5)/sumrrw_first,sumrrw_first, & ! 18-19
  3743. ! summass,summass_first,summass/summass_first ! 20-22
  3744. 1000 format('global vol sums ',i6,f8.3,30d13.5)
  3745. !zjmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
  3746. endsubroutine mono
  3747. !-----------------------------------------------------------------------
  3748. !-----------------------------------------------------------------------
  3749. !
  3750. END MODULE MODULE_ADVECTION
  3751. !
  3752. !-----------------------------------------------------------------------