PageRenderTime 57ms CodeModel.GetById 18ms 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

Large files files are truncated, but you can click here to view the full file

  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. !------------------------------------------

Large files files are truncated, but you can click here to view the full file