My Project
adv_t.f90
Go to the documentation of this file.
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 !/===========================================================================/
13 ! Copyright (c) 2007, The University of Massachusetts Dartmouth
14 ! Produced at the School of Marine Science & Technology
15 ! Marine Ecosystem Dynamics Modeling group
16 ! All rights reserved.
17 !
18 ! FVCOM has been developed by the joint UMASSD-WHOI research team. For
19 ! details of authorship and attribution of credit please see the FVCOM
20 ! technical manual or contact the MEDM group.
21 !
22 !
23 ! This file is part of FVCOM. For details, see http://fvcom.smast.umassd.edu
24 ! The full copyright notice is contained in the file COPYRIGHT located in the
25 ! root directory of the FVCOM code. This original header must be maintained
26 ! in all distributed versions.
27 !
28 ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
29 ! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
30 ! THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
31 ! PURPOSE ARE DISCLAIMED.
32 !
33 !/---------------------------------------------------------------------------/
34 ! CVS VERSION INFORMATION
35 ! $Id$
36 ! $Name$
37 ! $Revision$
38 !/===========================================================================/
39 
40 
41 !==============================================================================|
42 ! Calculate Advection and Horizontal Diffusion Terms for Temperature |
43 !==============================================================================|
44 
45 SUBROUTINE adv_t
46 
47  !------------------------------------------------------------------------------|
48 
49  USE all_vars
50  USE mod_utils
51  USE mod_par
52  USE bcs
53  USE mod_obcs
54  USE mod_wd
55  USE mod_spherical
56  USE mod_northpole
57 
58  IMPLICIT NONE
59  REAL(SP), DIMENSION(0:MT,KB) :: XFLUX,XFLUX_ADV,RF
60  REAL(SP), DIMENSION(0:MT) :: PUPX,PUPY,PVPX,PVPY
61  REAL(SP), DIMENSION(0:MT) :: PTPX,PTPY,PTPXD,PTPYD,VISCOFF
62  REAL(SP), DIMENSION(3*(NT),KBM1) :: DTIJ
63  REAL(SP), DIMENSION(3*(NT),KBM1) :: UVN
64  REAL(SP) :: UTMP,VTMP,SITAI,FFD,FF1 !,X11,Y11,X22,Y22,X33,Y33,TMP1,TMP2,XI,YI
65  REAL(SP) :: DXA,DYA,DXB,DYB,FIJ1,FIJ2,UN,TTIME,ZDEP
66  REAL(SP) :: TXX,TYY,FXX,FYY,VISCOF,EXFLUX,TEMP,STPOINT,STPOINT1,STPOINT2
67  REAL(SP) :: FACT,FM1
68  INTEGER :: I,I1,I2,IA,IB,J,J1,J2,K,JTMP,JJ,II
69  REAL(SP) :: T1MIN, T1MAX, T2MIN, T2MAX
70 
71 !!$# if defined (SPHERICAL)
72 !!$ REAL(DP) TY,TXPI,TYPI
73 !!$ REAL(DP) :: XTMP1,XTMP
74 !!$ REAL(DP) :: X1_DP,Y1_DP,X2_DP,Y2_DP,XII,YII
75 !!$ REAL(DP) :: X11_TMP,Y11_TMP,X33_TMP,Y33_TMP
76 !!$ REAL(DP) :: VX1_TMP,VY1_TMP,VX2_TMP,VY2_TMP
77 !!$ REAL(DP) :: TXPI_TMP,TYPI_TMP
78 !!$# endif
79 
80 
81 
82 
83  IF(dbg_set(dbg_sbr)) WRITE(ipt,*)"Start: adv_t"
84  !------------------------------------------------------------------------------!
85 
86  SELECT CASE(horizontal_mixing_type)
87  CASE ('closure')
88  fact = 1.0_sp
89  fm1 = 0.0_sp
90  CASE('constant')
91  fact = 0.0_sp
92  fm1 = 1.0_sp
93  CASE DEFAULT
94  CALL fatal_error("UNKNOW HORIZONTAL MIXING TYPE:",&
95  & trim(horizontal_mixing_type) )
96  END SELECT
97 
98  !
99  !--Initialize Fluxes-----------------------------------------------------------!
100  !
101  xflux = 0.0_sp
102  xflux_adv = 0.0_sp
103 
104  !
105  !--Loop Over Control Volume Sub-Edges And Calculate Normal Velocity------------!
106  !
107 !!# if !defined (1)
108  DO i=1,ncv
109  i1=ntrg(i)
110  ! DTIJ(I)=DT1(I1)
111  DO k=1,kbm1
112  dtij(i,k) = dt1(i1)*dz1(i1,k)
113  ! USE U,V
114  uvn(i,k) = v(i1,k)*dltxe(i) - u(i1,k)*dltye(i)
115  END DO
116  END DO
117 !!# else
118 !! DO I=1,NCV
119 !! I1=NTRG(I)
120 !! ! DTIJ(I)=DT1(I1)
121 !! DO K=1,KBM1
122 !! DTIJ(I,K) = DT1(I1)*DZ1(I1,K)
123 !! ! USE US,VS
124 !! UVN(I,K) = VS(I1,K)*DLTXE(I) - US(I1,K)*DLTYE(I)
125 !!# if defined (SEMI_IMPLICIT)
126 !! DTIJ1(I,K) = D1(I1)*DZ1(I1,K)
127 !! UVN1(I,K) = VF(I1,K)*DLTXE(I) - UF(I1,K)*DLTYE(I)
128 !!# endif
129 !! END DO
130 !! END DO
131 !!# endif
132 
133  !
134  !--Add the Shortwave Radiation Body Force--------------------------------------!
135  !
136  rf = 0.0_sp
137  IF(heating_on) THEN
138  SELECT CASE(heating_type)
139  CASE('body')
140 
141  ! REMOVED START TIME FOR BODY HEATING
142  ! TTIME=THOUR
143  ! if(ttime < thour_hs) then
144  ! RF=0.0_SP
145  ! else
146 
147  DO k=1,kbm1
148  DO i=1,m
149  ! IF(TTIME < THOUR_HS)THEN
150  ! RF(I,K)=0.0_SP
151  ! ELSE
152  ! REMOVED DEPTH CHECK FROM ECOM-SI, FVCOM DOES NOT NEED IT!
153  ! ZEDP = 0.0_SP
154  ! IF(DT(I) > 0.0_SP) THEN
155  zdep=0.5_sp*(z(i,k)+z(i,k+1))*dt(i)
156  ! END IF
157  rf(i,k)=-swrad(i)*((rheat/zeta1)*exp(zdep/zeta1) &
158  +((1-rheat)/zeta2)*exp(zdep/zeta2))*dt(i)
159  ! END IF
160  END DO
161  END DO
162  ! endif
163 
164  CASE('flux')
165  rf = 0.0_sp
166  CASE DEFAULT
167  CALL fatal_error('The surface heating type is set incorrectly:',&
168  & trim(heating_type))
169  END SELECT
170  END IF
171 
172 !--ADJUST VOLUME'S HEAT CONTENT FOR EVAPORATION AND PRECIPITATION ------------------!
173  IF (precipitation_on) THEN
174  rf(:,1)=rf(:,1)+rofvros*(qevap+qprec)*t1(:,1)
175  END IF
176 
177  !
178  !--Calculate the Advection and Horizontal Diffusion Terms----------------------!
179  !
180 
181  DO k=1,kbm1
182  ptpx = 0.0_sp
183  ptpy = 0.0_sp
184  ptpxd = 0.0_sp
185  ptpyd = 0.0_sp
186  DO i=1,m
187  DO j=1,ntsn(i)-1
188  i1=nbsn(i,j)
189  i2=nbsn(i,j+1)
190 
191 !J. Ge for tracer advection
192  IF(backward_advection==.false.)THEN
193  IF(iswetn(i1) == 0 .AND. iswetn(i2) == 1)THEN
194  ffd=0.5_sp*(t1(i,k)+t1(i2,k)-tmean1(i,k)-tmean1(i2,k))
195  ff1=0.5_sp*(t1(i,k)+t1(i2,k))
196  ELSE IF(iswetn(i1) == 1 .AND. iswetn(i2) == 0)THEN
197  ffd=0.5_sp*(t1(i1,k)+t1(i,k)-tmean1(i1,k)-tmean1(i,k))
198  ff1=0.5_sp*(t1(i1,k)+t1(i,k))
199  ELSE IF(iswetn(i1) == 0 .AND. iswetn(i2) == 0)THEN
200  ffd=0.5_sp*(t1(i,k)+t1(i,k)-tmean1(i,k)-tmean1(i,k))
201  ff1=0.5_sp*(t1(i,k)+t1(i,k))
202  ELSE
203  ffd=0.5_sp*(t1(i1,k)+t1(i2,k)-tmean1(i1,k)-tmean1(i2,k))
204  ff1=0.5_sp*(t1(i1,k)+t1(i2,k))
205  END IF
206  ELSE
207  IF(backward_step==1)THEN
208  IF(iswetn(i1) == 0 .AND. iswetn(i2) == 1)THEN
209  ffd=0.5_sp*((t0(i,k)+t1(i,k))*0.5+(t0(i2,k)+t1(i2,k))*0.5-tmean1(i,k)-tmean1(i2,k))
210  ff1=0.5_sp*((t0(i,k)+t1(i,k))*0.5+(t0(i2,k)+t1(i2,k))*0.5)
211  ELSE IF(iswetn(i1) == 1 .AND. iswetn(i2) == 0)THEN
212  ffd=0.5_sp*((t0(i1,k)+t1(i1,k))*0.5+(t0(i,k)+t1(i,k))*0.5-tmean1(i1,k)-tmean1(i,k))
213  ff1=0.5_sp*((t0(i1,k)+t1(i1,k))*0.5+(t0(i,k)+t1(i,k))*0.5)
214  ELSE IF(iswetn(i1) == 0 .AND. iswetn(i2) == 0)THEN
215  ffd=0.5_sp*((t0(i,k)+t1(i,k))*0.5+(t0(i,k)+t1(i,k))*0.5-tmean1(i,k)-tmean1(i,k))
216  ff1=0.5_sp*((t0(i,k)+t1(i,k))*0.5+(t0(i,k)+t1(i,k))*0.5)
217  ELSE
218  ffd=0.5_sp*((t0(i1,k)+t1(i1,k))*0.5+(t0(i2,k)+t1(i2,k))*0.5-tmean1(i1,k)-tmean1(i2,k))
219  ff1=0.5_sp*((t0(i1,k)+t1(i1,k))*0.5+(t0(i2,k)+t1(i2,k))*0.5)
220  END IF
221  ELSEIF(backward_step==2)THEN
222  IF(iswetn(i1) == 0 .AND. iswetn(i2) == 1)THEN
223  ffd=0.5_sp*((t2(i,k)+t0(i,k)+t1(i,k))/3.0_sp+(t2(i2,k)+t0(i2,k)+t1(i2,k))/3.0_sp-tmean1(i,k)-tmean1(i2,k))
224  ff1=0.5_sp*((t2(i,k)+t0(i,k)+t1(i,k))/3.0_sp+(t2(i2,k)+t0(i2,k)+t1(i2,k))/3.0_sp)
225  ELSE IF(iswetn(i1) == 1 .AND. iswetn(i2) == 0)THEN
226  ffd=0.5_sp*((t2(i1,k)+t0(i1,k)+t1(i1,k))/3.0_sp+(t2(i,k)+t0(i,k)+t1(i,k))/3.0_sp-tmean1(i1,k)-tmean1(i,k))
227  ff1=0.5_sp*((t2(i1,k)+t0(i1,k)+t1(i1,k))/3.0_sp+(t2(i,k)+t0(i,k)+t1(i,k))/3.0_sp)
228  ELSE IF(iswetn(i1) == 0 .AND. iswetn(i2) == 0)THEN
229  ffd=0.5_sp*((t2(i,k)+t0(i,k)+t1(i,k))/3.0_sp+(t2(i,k)+t0(i,k)+t1(i,k))/3.0_sp-tmean1(i,k)-tmean1(i,k))
230  ff1=0.5_sp*((t2(i,k)+t0(i,k)+t1(i,k))/3.0_sp+(t2(i,k)+t0(i,k)+t1(i,k))/3.0_sp)
231  ELSE
232  ffd=0.5_sp*((t2(i1,k)+t0(i1,k)+t1(i1,k))/3.0_sp+(t2(i2,k)+t0(i2,k)+t1(i2,k))/3.0_sp-tmean1(i1,k)-tmean1(i2,k))
233  ff1=0.5_sp*((t2(i1,k)+t0(i1,k)+t1(i1,k))/3.0_sp+(t2(i2,k)+t0(i2,k)+t1(i2,k))/3.0_sp)
234  END IF
235  ENDIF
236  ENDIF
237 !J. Ge for tracer advection
238 
239 !!$# if defined (SPHERICAL)
240 !!$ XTMP = VX(I2)*TPI-VX(I1)*TPI
241 !!$ XTMP1 = VX(I2)-VX(I1)
242 !!$ IF(XTMP1 > 180.0_SP)THEN
243 !!$ XTMP = -360.0_SP*TPI+XTMP
244 !!$ ELSE IF(XTMP1 < -180.0_SP)THEN
245 !!$ XTMP = 360.0_SP*TPI+XTMP
246 !!$ END IF
247 !!$ TXPI=XTMP*COS(DEG2RAD*VY(I))
248 !!$ TYPI=(VY(I1)-VY(I2))*tpi
249 !!$ ! ERROR HERE
250 !!$ !# if defined (NORTHPOLE)
251 !!$ IF(NODE_NORTHAREA(I) == 1)THEN
252 !!$ VX1_TMP = REARTH * COS(VY(I1)*DEG2RAD) * COS(VX(I1)*DEG2RAD) &
253 !!$ * 2._SP /(1._SP+SIN(VY(I1)*DEG2RAD))
254 !!$ VY1_TMP = REARTH * COS(VY(I1)*DEG2RAD) * SIN(VX(I1)*DEG2RAD) &
255 !!$ * 2._SP /(1._SP+SIN(VY(I1)*DEG2RAD))
256 !!$
257 !!$ VX2_TMP = REARTH * COS(VY(I2)*DEG2RAD) * COS(VX(I2)*DEG2RAD) &
258 !!$ * 2._SP /(1._SP+SIN(VY(I2)*DEG2RAD))
259 !!$ VY2_TMP = REARTH * COS(VY(I2)*DEG2RAD) * SIN(VX(I2)*DEG2RAD) &
260 !!$ * 2._SP /(1._SP+SIN(VY(I2)*DEG2RAD))
261 !!$
262 !!$ TXPI = (VX2_TMP-VX1_TMP)/(2._SP /(1._SP+SIN(VY(I)*DEG2RAD)))
263 !!$ TYPI = (VY1_TMP-VY2_TMP)/(2._SP /(1._SP+SIN(VY(I)*DEG2RAD)))
264 !!$ IF(I /= NODE_NORTHPOLE)THEN
265 !!$ TXPI_TMP = TYPI*COS(VX(I)*DEG2RAD)-TXPI*SIN(VX(I)*DEG2RAD)
266 !!$ TYPI_TMP = TXPI*COS(VX(I)*DEG2RAD)+TYPI*SIN(VX(I)*DEG2RAD)
267 !!$ TYPI_TMP = -TYPI_TMP
268 !!$
269 !!$ TXPI = TXPI_TMP
270 !!$ TYPI = TYPI_TMP
271 !!$ END IF
272 !!$ END IF
273 !!$ ! END ERROR
274 !!$
275 !!$ PTPX(I)=PTPX(I)+FF1*TYPI
276 !!$ PTPY(I)=PTPY(I)+FF1*TXPI
277 !!$ PTPXD(I)=PTPXD(I)+FFD*TYPI
278 !!$ PTPYD(I)=PTPYD(I)+FFD*TXPI
279 !!$# else
280 !!$ PTPX(I)=PTPX(I)+FF1*(VY(I1)-VY(I2))
281 !!$ PTPY(I)=PTPY(I)+FF1*(VX(I2)-VX(I1))
282 !!$ PTPXD(I)=PTPXD(I)+FFD*(VY(I1)-VY(I2))
283 !!$ PTPYD(I)=PTPYD(I)+FFD*(VX(I2)-VX(I1))
284 !!$# endif
285 
286 
287  ptpx(i)=ptpx(i)+ff1*dltytrie(i,j)
288  ptpy(i)=ptpy(i)+ff1*dltxtrie(i,j)
289  ptpxd(i)=ptpxd(i)+ffd*dltytrie(i,j)
290  ptpyd(i)=ptpyd(i)+ffd*dltxtrie(i,j)
291 
292  END DO
293 ! gather all neighboring control volumes connecting at dam node
294  ptpx(i)=ptpx(i)/art2(i)
295  ptpy(i)=ptpy(i)/art2(i)
296  ptpxd(i)=ptpxd(i)/art2(i)
297  ptpyd(i)=ptpyd(i)/art2(i)
298 
299  END DO
300 
301  IF(k == kbm1)THEN
302  DO i=1,m
303  pfpxb(i) = ptpx(i)
304  pfpyb(i) = ptpy(i)
305  END DO
306  END IF
307 
308  DO i=1,m
309 
310  viscoff(i) = viscofh(i,k)
311 
312  END DO
313  IF(k == kbm1) THEN
314  ah_bottom(1:m) = (fact*viscoff(1:m) + fm1) * nn_hvc(1:m)
315  END IF
316 
317 
318  DO i=1,ncv_i
319  ia=niec(i,1)
320  ib=niec(i,2)
321 
322 
323 !!$ XI=0.5_SP*(XIJE(I,1)+XIJE(I,2))
324 !!$ YI=0.5_SP*(YIJE(I,1)+YIJE(I,2))
325 !!$# if defined (SPHERICAL)
326 !!$ X1_DP=XIJE(I,1)
327 !!$ Y1_DP=YIJE(I,1)
328 !!$ X2_DP=XIJE(I,2)
329 !!$ Y2_DP=YIJE(I,2)
330 !!$ CALL ARCC(X2_DP,Y2_DP,X1_DP,Y1_DP,XII,YII)
331 !!$ XI=XII
332 !!$ XTMP = XI*TPI-VX(IA)*TPI
333 !!$ XTMP1 = XI-VX(IA)
334 !!$ IF(XTMP1 > 180.0_SP)THEN
335 !!$ XTMP = -360.0_SP*TPI+XTMP
336 !!$ ELSE IF(XTMP1 < -180.0_SP)THEN
337 !!$ XTMP = 360.0_SP*TPI+XTMP
338 !!$ END IF
339 !!$ DXA=XTMP*COS(DEG2RAD*VY(IA))
340 !!$ DYA=(YI-VY(IA))*TPI
341 !!$
342 !!$ XTMP = XI*TPI-VX(IB)*TPI
343 !!$ XTMP1 = XI-VX(IB)
344 !!$ IF(XTMP1 > 180.0_SP)THEN
345 !!$ XTMP = -360.0_SP*TPI+XTMP
346 !!$ ELSE IF(XTMP1 < -180.0_SP)THEN
347 !!$ XTMP = 360.0_SP*TPI+XTMP
348 !!$ END IF
349 !!$
350 !!$ DXB=XTMP*COS(DEG2RAD*VY(IB))
351 !!$ DYB=(YI-VY(IB))*TPI
352 !!$# else
353 !!$ DXA=XI-VX(IA)
354 !!$ DYA=YI-VY(IA)
355 !!$ DXB=XI-VX(IB)
356 !!$ DYB=YI-VY(IB)
357 !!$# endif
358 !!$ FIJ1=T1(IA,K)+DXA*PTPX(IA)+DYA*PTPY(IA)
359 !!$ FIJ2=T1(IB,K)+DXB*PTPX(IB)+DYB*PTPY(IB)
360 
361 !J. Ge for tracer advection
362  IF(backward_advection==.false.)THEN
363  fij1=t1(ia,k)+dltxncve(i,1)*ptpx(ia)+dltyncve(i,1)*ptpy(ia)
364  fij2=t1(ib,k)+dltxncve(i,2)*ptpx(ib)+dltyncve(i,2)*ptpy(ib)
365  ELSE
366  IF(backward_step==1)THEN
367  fij1=(t0(ia,k)+t1(ia,k))*0.5+dltxncve(i,1)*ptpx(ia)+dltyncve(i,1)*ptpy(ia)
368  fij2=(t0(ib,k)+t1(ib,k))*0.5+dltxncve(i,2)*ptpx(ib)+dltyncve(i,2)*ptpy(ib)
369  ELSEIF(backward_step==2)THEN
370  fij1=(t2(ia,k)+t0(ia,k)+t1(ia,k))/3.0_sp+dltxncve(i,1)*ptpx(ia)+dltyncve(i,1)*ptpy(ia)
371  fij2=(t2(ia,k)+t0(ib,k)+t1(ib,k))/3.0_sp+dltxncve(i,2)*ptpx(ib)+dltyncve(i,2)*ptpy(ib)
372  ENDIF
373  ENDIF
374 !J. Ge for tracer advection
375 
376  t1min=minval(t1(nbsn(ia,1:ntsn(ia)-1),k))
377  t1min=min(t1min, t1(ia,k))
378  t1max=maxval(t1(nbsn(ia,1:ntsn(ia)-1),k))
379  t1max=max(t1max, t1(ia,k))
380  t2min=minval(t1(nbsn(ib,1:ntsn(ib)-1),k))
381  t2min=min(t2min, t1(ib,k))
382  t2max=maxval(t1(nbsn(ib,1:ntsn(ib)-1),k))
383  t2max=max(t2max, t1(ib,k))
384  IF(fij1 < t1min) fij1=t1min
385  IF(fij1 > t1max) fij1=t1max
386  IF(fij2 < t2min) fij2=t2min
387  IF(fij2 > t2max) fij2=t2max
388 
389  un=uvn(i,k)
390 
391 ! VISCOF=HORCON*(FACT*(VISCOFF(IA)+VISCOFF(IB))*0.5_SP + FM1)
392  ! David moved HPRNU and added HVC
393  viscof=(fact*0.5_sp*(viscoff(ia)*nn_hvc(ia)+viscoff(ib)*nn_hvc(ib)) + fm1*0.5_sp*(nn_hvc(ia)+nn_hvc(ib)))
394 
395 
396  txx=0.5_sp*(ptpxd(ia)+ptpxd(ib))*viscof
397  tyy=0.5_sp*(ptpyd(ia)+ptpyd(ib))*viscof
398 
399  fxx=-dtij(i,k)*txx*dltye(i)
400  fyy= dtij(i,k)*tyy*dltxe(i)
401 
402  exflux=-un*dtij(i,k)* &
403  ((1.0_sp+sign(1.0_sp,un))*fij2+(1.0_sp-sign(1.0_sp,un))*fij1)*0.5_sp+fxx+fyy
404 
405  xflux(ia,k)=xflux(ia,k)+exflux
406  xflux(ib,k)=xflux(ib,k)-exflux
407 
408  xflux_adv(ia,k)=xflux_adv(ia,k)+(exflux-fxx-fyy)
409  xflux_adv(ib,k)=xflux_adv(ib,k)-(exflux-fxx-fyy)
410 
411 
412  END DO
413 
414 
415  END DO !! K LOOP
416 
417 
418  DO k=1,kbm1
419  IF(iobcn > 0) THEN
420  DO i=1,iobcn
421  i1=i_obc_n(i)
422  xflux_obc(i,k)=xflux_adv(i1,k)
423  END DO
424  END IF
425  END DO
426 
427 
428 
429  !--Set Boundary Conditions-For Fresh Water Flux--------------------------------!
430  !
431 
432 
433 
434 
435  !--------------------------------------------------------------------
436  ! The central difference scheme in vertical advection
437  !--------------------------------------------------------------------
438  DO i=1, m
439  IF(iswetn(i)*iswetnt(i) == 1) THEN
440 
441 
442  DO k=1, kbm1
443 
444 
445 
446 !J. Ge for tracer advection
447  IF(backward_advection==.false.)THEN
448  IF(k == 1) THEN
449  temp=-wts(i,k+1)*(t1(i,k)*dz(i,k+1)+t1(i,k+1)*dz(i,k))/ &
450  (dz(i,k)+dz(i,k+1))
451  ELSE IF(k == kbm1) THEN
452  temp= wts(i,k)*(t1(i,k)*dz(i,k-1)+t1(i,k-1)*dz(i,k))/(dz(i,k)+dz(i,k-1))
453  ELSE
454  temp= wts(i,k)*(t1(i,k)*dz(i,k-1)+t1(i,k-1)*dz(i,k))/(dz(i,k)+dz(i,k-1))-&
455  wts(i,k+1)*(t1(i,k)*dz(i,k+1)+t1(i,k+1)*dz(i,k))/(dz(i,k)+dz(i,k+1))
456  END IF
457  ELSE
458  IF(backward_step==1)THEN
459  IF(k == 1) THEN
460  temp=-wts(i,k+1)*((t0(i,k)+t1(i,k))*0.5*dz(i,k+1)+(t0(i,k+1)+t1(i,k+1))*0.5*dz(i,k))/ &
461  (dz(i,k)+dz(i,k+1))
462  ELSE IF(k == kbm1) THEN
463  temp= wts(i,k)*((t0(i,k)+t1(i,k))*0.5*dz(i,k-1)+(t0(i,k-1)+t1(i,k-1))*0.5*dz(i,k))/(dz(i,k)+dz(i,k-1))
464  ELSE
465  temp= wts(i,k)*((t0(i,k)+t1(i,k))*0.5*dz(i,k-1)+(t0(i,k-1)+t1(i,k-1))*0.5*dz(i,k))/(dz(i,k)+dz(i,k-1))-&
466  wts(i,k+1)*((t0(i,k)+t1(i,k))*0.5*dz(i,k+1)+(t0(i,k+1)+t1(i,k+1))*0.5*dz(i,k))/(dz(i,k)+dz(i,k+1))
467  END IF
468  ELSEIF(backward_step==2)THEN
469  IF(k == 1) THEN
470  temp=-wts(i,k+1)*((t2(i,k)+t0(i,k)+t1(i,k))/3.0_sp*dz(i,k+1)+(t2(i,k+1)+t0(i,k+1)+t1(i,k+1))/3.0_sp*dz(i,k))/ &
471  (dz(i,k)+dz(i,k+1))
472  ELSE IF(k == kbm1) THEN
473  temp= wts(i,k)*((t2(i,k)+t0(i,k)+t1(i,k))/3.0_sp*dz(i,k-1)+(t2(i,k-1)+t0(i,k-1)+t1(i,k-1))/3.0_sp*dz(i,k))/(dz(i,k)+dz(i,k-1))
474  ELSE
475  temp= wts(i,k)*((t2(i,k)+t0(i,k)+t1(i,k))/3.0_sp*dz(i,k-1)+(t2(i,k-1)+t0(i,k-1)+t1(i,k-1))/3.0_sp*dz(i,k))/(dz(i,k)+dz(i,k-1))-&
476  wts(i,k+1)*((t2(i,k)+t0(i,k)+t1(i,k))/3.0_sp*dz(i,k+1)+(t2(i,k+1)+t0(i,k+1)+t1(i,k+1))/3.0_sp*dz(i,k))/(dz(i,k)+dz(i,k+1))
477  END IF
478  ENDIF
479  ENDIF
480 !J. Ge for tracer advection
481 
482 
483  IF(isonb(i) == 2) THEN
484  ! XFLUX(I,K)=TEMP*ART1(I)/DZ(I,K)
485  xflux(i,k)=temp*art1(i)
486  ELSE
487  ! XFLUX(I,K)=XFLUX(I,K)+TEMP*ART1(I)/DZ(I,K)
488  xflux(i,k)=xflux(i,k)+temp*art1(i)
489 
490  END IF
491  ENDDO
492  END IF
493  END DO !!K LOOP
494  !
495  !--Set Boundary Conditions-For Fresh Water Flux--------------------------------!
496  !
497  IF(river_ts_setting == 'calculated') THEN
498  IF(river_inflow_location == 'node') THEN
499  IF(numqbc > 0) THEN
500  DO j=1,numqbc
501  jj=inodeq(j)
502  stpoint=tdis(j)
503  DO k=1,kbm1
504  ! STPOINT = T1(JJ,K)
505  ! XFLUX(JJ,K)= XFLUX(JJ,K)-QDIS(J)*VQDIST(J,K)*STPOINT/DZ(JJ,K)
506  xflux(jj,k)= xflux(jj,k)-qdis(j)*vqdist(j,k)*stpoint
507  END DO
508  END DO
509  END IF
510  ELSE IF(river_inflow_location == 'edge') THEN
511  IF(numqbc > 0) THEN
512  DO j=1,numqbc
513  j1=n_icellq(j,1)
514  j2=n_icellq(j,2)
515  stpoint=tdis(j) !!ASK LIU SHOULD THIS BE STPOINT1(J1)/STPOINT2(J2)
516  DO k=1,kbm1
517  !STPOINT1 = T1(J1,K)
518  !STPOINT2 = T1(J2,K)
519  ! XFLUX(J1,K)=XFLUX(J1,K)- &
520  ! QDIS(J)*RDISQ(J,1)*VQDIST(J,K)*STPOINT1/DZ1(J1,K)
521  ! XFLUX(J2,K)=XFLUX(J2,K)- &
522  ! QDIS(J)*RDISQ(J,2)*VQDIST(J,K)*STPOINT2/DZ1(J2,K)
523  xflux(j1,k)=xflux(j1,k)-qdis(j)*rdisq(j,1)*vqdist(j,k)*stpoint !1
524  xflux(j2,k)=xflux(j2,k)-qdis(j)*rdisq(j,2)*vqdist(j,k)*stpoint !2
525  END DO
526  END DO
527  END IF
528  END IF
529  END IF
530  !---------------------------------------------------------------------
531 
532 
533  ! APPLY GROUND WATER TEMPERATURE FORCING
534  IF(groundwater_on .and. groundwater_temp_on)THEN
535  DO i=1,m
536  xflux(i,kbm1)=xflux(i,kbm1)-bfwdis(i)*bfwtmp(i)
537  END DO
538  ELSEIF(groundwater_on) THEN
539  DO i=1,m
540  !J. Ge for tracer advection
541  IF(backward_advection==.false.)THEN
542  xflux(i,kbm1)=xflux(i,kbm1)-bfwdis(i)*t1(i,kbm1)
543  ELSE
544  IF(backward_step==1)THEN
545  xflux(i,kbm1)=xflux(i,kbm1)-bfwdis(i)*(t0(i,kbm1)+t1(i,kbm1))*0.5
546  ELSEIF(backward_step==2)THEN
547  xflux(i,kbm1)=xflux(i,kbm1)-bfwdis(i)*(t2(i,kbm1)+t0(i,kbm1)+t1(i,kbm1))/3.0_sp
548  ENDIF
549  ENDIF
550 !J. Ge for tracer advection
551  END DO
552  END IF
553 
554 
555  !
556  !--Update Temperature----------------------------------------------------------!
557  !
558 
559 
560  DO i=1,m
561  IF(iswetn(i)*iswetnt(i) == 1 )THEN
562  DO k=1,kbm1
563  xflux(i,k) = xflux(i,k) - rf(i,k)*art1(i) !/DZ(I,K)
564  ! TF1(I,K)=(T1(I,K)-XFLUX(I,K)/ART1(I)*(DTI/DT(I)))*(DT(I)/DTFA(I))
565 
566  tf1(i,k)=(t1(i,k)-xflux(i,k)/art1(i)*(dti/(dt(i)*dz(i,k))))*(dt(i)/dtfa(i))
567 
568  END DO
569  ELSE
570  DO k=1,kbm1
571  tf1(i,k)=t1(i,k)
572  END DO
573  END IF
574  END DO
575 
576 
577 
578  IF(dbg_set(dbg_sbr)) WRITE(ipt,*)"End: adv_t"
579 
580 END SUBROUTINE adv_t
581 !==============================================================================|
integer, dimension(:), allocatable, target ntsn
Definition: mod_main.f90:1023
real(sp), dimension(:), allocatable, target qprec
Definition: mod_main.f90:1239
real(sp), dimension(:,:), allocatable, target t2
Definition: mod_main.f90:1314
real(sp), dimension(:,:), allocatable, target viscofh
Definition: mod_main.f90:1359
real(sp), dimension(:), allocatable, target dtfa
Definition: mod_main.f90:1124
real(sp), dimension(:,:), allocatable, target v
Definition: mod_main.f90:1269
real(sp), dimension(:,:), allocatable, target vqdist
Definition: mod_main.f90:1217
logical function dbg_set(vrb)
Definition: mod_utils.f90:182
real(sp), dimension(:), allocatable, target pfpxb
Definition: mod_main.f90:1342
real(sp), dimension(:,:), allocatable, target dltxncve
Definition: mod_main.f90:1059
real(sp), dimension(:), allocatable, target art1
Definition: mod_main.f90:1010
real(sp), dimension(:), allocatable, target qdis
Definition: mod_main.f90:1220
real(sp), dimension(:,:), allocatable, target t1
Definition: mod_main.f90:1307
real(sp), dimension(:,:), allocatable xflux_obc
Definition: mod_obcs.f90:113
real(sp), dimension(:,:), allocatable, target dltytrie
Definition: mod_main.f90:1063
real(sp), dimension(:,:), allocatable, target dltyncve
Definition: mod_main.f90:1060
real(sp), dimension(:), allocatable, target pfpyb
Definition: mod_main.f90:1343
real(sp), dimension(:), allocatable, target art2
Definition: mod_main.f90:1011
integer, dimension(:), allocatable, target ntrg
Definition: mod_main.f90:1033
real(sp), dimension(:,:), allocatable, target tmean1
Definition: mod_main.f90:1318
real(sp), dimension(:,:), allocatable, target u
Definition: mod_main.f90:1268
integer, dimension(:,:), allocatable, target niec
Definition: mod_main.f90:1032
real(sp), dimension(:,:), allocatable, target rdisq
Definition: mod_main.f90:1227
real(sp), dimension(:), allocatable, target dltye
Definition: mod_main.f90:1051
real(sp), dimension(:), allocatable, target swrad
Definition: mod_main.f90:1177
integer iobcn
Definition: mod_main.f90:1777
real(sp), dimension(:,:), allocatable, target tf1
Definition: mod_main.f90:1310
real(sp), dimension(:), allocatable nn_hvc
Definition: mod_main.f90:1303
integer, dimension(:), allocatable i_obc_n
Definition: mod_main.f90:1779
real(sp), dimension(:), allocatable, target bfwdis
Definition: mod_main.f90:1196
real(sp), dimension(:), allocatable, target bfwtmp
Definition: mod_main.f90:1200
integer, dimension(:,:), allocatable, target n_icellq
Definition: mod_main.f90:1216
real(sp), dimension(:), allocatable, target qevap
Definition: mod_main.f90:1240
subroutine adv_t
Definition: adv_t.f90:46
real(sp), dimension(:,:), allocatable, target dz
Definition: mod_main.f90:1092
integer, dimension(:), allocatable iswetnt
Definition: mod_wd.f90:53
real(sp), dimension(:,:), allocatable, target dltxtrie
Definition: mod_main.f90:1064
real(sp), dimension(:), allocatable, target dt1
Definition: mod_main.f90:1117
real(sp), dimension(:,:), allocatable, target z
Definition: mod_main.f90:1090
subroutine fatal_error(ER1, ER2, ER3, ER4)
Definition: mod_utils.f90:230
real(sp), dimension(:,:), allocatable, target dz1
Definition: mod_main.f90:1096
real(sp), dimension(:,:), allocatable, target t0
Definition: mod_main.f90:1313
integer, dimension(:,:), allocatable, target nbsn
Definition: mod_main.f90:1030
real(sp), dimension(:,:), allocatable, target wts
Definition: mod_main.f90:1321
real(sp), dimension(:), allocatable, target ah_bottom
Definition: mod_main.f90:1345
real(sp), dimension(:), allocatable, target tdis
Definition: mod_main.f90:1224
real(sp), dimension(:), allocatable, target dltxe
Definition: mod_main.f90:1050
integer, parameter dbg_sbr
Definition: mod_utils.f90:69
integer, dimension(:), allocatable, target inodeq
Definition: mod_main.f90:1214
integer, dimension(:), allocatable, target isonb
Definition: mod_main.f90:1024
real(sp), dimension(:), allocatable, target dt
Definition: mod_main.f90:1133
integer, dimension(:), allocatable iswetn
Definition: mod_wd.f90:51