51 logical,
parameter ::
debug = .true.
59 Subroutine adv_scal(f,f0,f2,fn,d_fdis,fdis,d_fflux,fflux_obc,deltat,source)
72 real(sp),
intent(in ),
dimension(0:mt,kb) :: f
74 real(sp),
intent(in ),
dimension(0:mt,kb) :: f0,f2
76 real(sp),
intent(out),
dimension(0:mt,kb) :: fn
77 integer ,
intent(in ) :: d_fdis
78 real(sp),
intent(in ),
dimension(d_fdis) :: fdis
79 integer ,
intent(in ) :: d_fflux
80 real(sp),
intent(out),
dimension(d_fflux,kbm1) :: fflux_obc
81 real(sp),
intent(in ) :: deltat
82 logical ,
intent(in ) :: source
85 real(sp),
dimension(0:mt,kb) :: xflux,xflux_adv
86 real(sp),
dimension(m) :: pupx,pupy,pvpx,pvpy
87 real(sp),
dimension(m) :: pfpx,pfpy,pfpxd,pfpyd,viscoff
88 real(sp),
dimension(3*nt,kb) :: dtij
89 real(sp),
dimension(3*nt,kbm1) :: uvn
90 real(sp),
dimension(kb) :: vflux
91 real(sp) :: utmp,vtmp,sitai,ffd,ff1,x11,y11,x22,y22,x33,y33
92 real(sp) :: tmp1,tmp2,xi,yi
93 real(sp) :: dxa,dya,dxb,dyb,fij1,fij2,un
94 real(sp) :: txx,tyy,fxx,fyy,viscof,exflux,temp,fpoint
95 real(sp) :: fact,fm1,fmean
96 integer :: i,i1,i2,ia,ib,j,j1,j2,k,jtmp,jj
98 real(sp),
dimension(kb) :: ftmp
119 if(horizontal_mixing_type ==
'closure')
then 138 dtij(i,k)=
dt1(i1)*
dz1(i1,k)
183 IF(backward_advection/=.true.)
THEN 185 ffd=0.5_sp*(f(i,k)+f(i2,k))
186 ff1=0.5_sp*(f(i,k)+f(i2,k))
188 ffd=0.5_sp*(f(i1,k)+f(i,k))
189 ff1=0.5_sp*(f(i1,k)+f(i,k))
191 ffd=0.5_sp*(f(i,k)+f(i,k))
192 ff1=0.5_sp*(f(i,k)+f(i,k))
194 ffd=0.5_sp*(f(i1,k)+f(i2,k))
195 ff1=0.5_sp*(f(i1,k)+f(i2,k))
198 IF(backward_step==1)
THEN 200 ffd=0.5_sp*((f0(i,k)+f(i,k))*0.5+(f0(i2,k)+f(i2,k))*0.5)
201 ff1=0.5_sp*((f0(i,k)+f(i,k))*0.5+(f0(i2,k)+f(i2,k))*0.5)
203 ffd=0.5_sp*((f0(i1,k)+f(i1,k))*0.5+(f0(i,k)+f(i,k))*0.5)
204 ff1=0.5_sp*((f0(i1,k)+f(i1,k))*0.5+(f0(i,k)+f(i,k))*0.5)
206 ffd=0.5_sp*((f0(i,k)+f(i,k))*0.5+(f0(i,k)+f(i,k))*0.5)
207 ff1=0.5_sp*((f0(i,k)+f(i,k))*0.5+(f0(i,k)+f(i,k))*0.5)
209 ffd=0.5_sp*((f0(i1,k)+f(i1,k))*0.5+(f0(i2,k)+f(i2,k))*0.5)
210 ff1=0.5_sp*((f0(i1,k)+f(i1,k))*0.5+(f0(i2,k)+f(i2,k))*0.5)
212 ELSEIF(backward_step==2)
THEN 214 ffd=0.5_sp*((f2(i,k)+f0(i,k)+f(i,k))/3.0_sp+(f2(i2,k)+f0(i2,k)+f(i2,k))/3.0_sp)
215 ff1=0.5_sp*((f2(i,k)+f0(i,k)+f(i,k))/3.0_sp+(f2(i2,k)+f0(i2,k)+f(i2,k))/3.0_sp)
217 ffd=0.5_sp*((f2(i1,k)+f0(i1,k)+f(i1,k))/3.0_sp+(f2(i,k)+f0(i,k)+f(i,k))/3.0_sp)
218 ff1=0.5_sp*((f2(i1,k)+f0(i1,k)+f(i1,k))/3.0_sp+(f2(i,k)+f0(i,k)+f(i,k))/3.0_sp)
220 ffd=0.5_sp*((f2(i,k)+f0(i,k)+f(i,k))/3.0_sp+(f2(i,k)+f0(i,k)+f(i,k))/3.0_sp)
221 ff1=0.5_sp*((f2(i,k)+f0(i,k)+f(i,k))/3.0_sp+(f2(i,k)+f0(i,k)+f(i,k))/3.0_sp)
223 ffd=0.5_sp*((f2(i1,k)+f0(i1,k)+f(i1,k))/3.0_sp+(f2(i2,k)+f0(i2,k)+f(i2,k))/3.0_sp)
224 ff1=0.5_sp*((f2(i1,k)+f0(i1,k)+f(i1,k))/3.0_sp+(f2(i2,k)+f0(i2,k)+f(i2,k))/3.0_sp)
231 pfpx(i) = pfpx(i) +ff1*(
vy(i1)-
vy(i2))
232 pfpy(i) = pfpy(i) +ff1*(
vx(i2)-
vx(i1))
233 pfpxd(i)= pfpxd(i)+ffd*(
vy(i1)-
vy(i2))
234 pfpyd(i)= pfpyd(i)+ffd*(
vx(i2)-
vx(i1))
239 pfpx(i) =pfpx(i )/
art2(i)
240 pfpy(i) =pfpy(i )/
art2(i)
241 pfpxd(i) =pfpxd(i)/
art2(i)
242 pfpyd(i) =pfpyd(i)/
art2(i)
261 j1=jtmp+1-(jtmp+1)/4*3
262 j2=jtmp+2-(jtmp+2)/4*3
263 x11=0.5_sp*(
vx(i)+
vx(
nv(i1,j1)))
264 y11=0.5_sp*(
vy(i)+
vy(
nv(i1,j1)))
267 x33=0.5_sp*(
vx(i)+
vx(
nv(i1,j2)))
268 y33=0.5_sp*(
vy(i)+
vy(
nv(i1,j2)))
270 pupx(i)=pupx(i)+
u(i1,k)*(y11-y33)
271 pupy(i)=pupy(i)+
u(i1,k)*(x33-x11)
272 pvpx(i)=pvpx(i)+
v(i1,k)*(y11-y33)
273 pvpy(i)=pvpy(i)+
v(i1,k)*(x33-x11)
275 if(
isonb(i) /= 0)
then 276 pupx(i)=pupx(i)+
u(i1,k)*(
vy(i)-y11)
277 pupy(i)=pupy(i)+
u(i1,k)*(x11-
vx(i))
278 pvpx(i)=pvpx(i)+
v(i1,k)*(
vy(i)-y11)
279 pvpy(i)=pvpy(i)+
v(i1,k)*(x11-
vx(i))
285 j1=jtmp+1-(jtmp+1)/4*3
286 j2=jtmp+2-(jtmp+2)/4*3
287 x11=0.5_sp*(
vx(i)+
vx(
nv(i1,j1)))
288 y11=0.5_sp*(
vy(i)+
vy(
nv(i1,j1)))
291 x33=0.5_sp*(
vx(i)+
vx(
nv(i1,j2)))
292 y33=0.5_sp*(
vy(i)+
vy(
nv(i1,j2)))
294 pupx(i)=pupx(i)+
u(i1,k)*(y11-y33)
295 pupy(i)=pupy(i)+
u(i1,k)*(x33-x11)
296 pvpx(i)=pvpx(i)+
v(i1,k)*(y11-y33)
297 pvpy(i)=pvpy(i)+
v(i1,k)*(x33-x11)
302 j1=jtmp+1-(jtmp+1)/4*3
303 j2=jtmp+2-(jtmp+2)/4*3
304 x11=0.5_sp*(
vx(i)+
vx(
nv(i1,j1)))
305 y11=0.5_sp*(
vy(i)+
vy(
nv(i1,j1)))
308 x33=0.5_sp*(
vx(i)+
vx(
nv(i1,j2)))
309 y33=0.5_sp*(
vy(i)+
vy(
nv(i1,j2)))
311 pupx(i)=pupx(i)+
u(i1,k)*(y11-y33)
312 pupy(i)=pupy(i)+
u(i1,k)*(x33-x11)
313 pvpx(i)=pvpx(i)+
v(i1,k)*(y11-y33)
314 pvpy(i)=pvpy(i)+
v(i1,k)*(x33-x11)
316 if(
isonb(i) /= 0)
then 317 pupx(i)=pupx(i)+
u(i1,k)*(y11-
vy(i))
318 pupy(i)=pupy(i)+
u(i1,k)*(
vx(i)-x11)
319 pvpx(i)=pvpx(i)+
v(i1,k)*(y11-
vy(i))
320 pvpy(i)=pvpy(i)+
v(i1,k)*(
vx(i)-x11)
322 pupx(i)=pupx(i)/
art1(i)
323 pupy(i)=pupy(i)/
art1(i)
324 pvpx(i)=pvpx(i)/
art1(i)
325 pvpy(i)=pvpy(i)/
art1(i)
326 tmp1=pupx(i)**2+pvpy(i)**2
327 tmp2=0.5_sp*(pupy(i)+pvpx(i))**2
328 viscoff(i)=sqrt(tmp1+tmp2)*
art1(i)
348 IF(backward_advection/=.true.)
THEN 349 fij1=f(ia,k)+dxa*pfpx(ia)+dya*pfpy(ia)
350 fij2=f(ib,k)+dxb*pfpx(ib)+dyb*pfpy(ib)
352 IF(backward_step==1)
THEN 353 fij1=(f0(ia,k)+f(ia,k))*0.5+dxa*pfpx(ia)+dya*pfpy(ia)
354 fij2=(f0(ib,k)+f(ib,k))*0.5+dxb*pfpx(ib)+dyb*pfpy(ib)
355 ELSEIF(backward_step==2)
THEN 356 fij1=(f2(ia,k)+f0(ia,k)+f(ia,k))/3.0_sp+dxa*pfpx(ia)+dya*pfpy(ia)
357 fij2=(f2(ib,k)+f0(ib,k)+f(ib,k))/3.0_sp+dxb*pfpx(ib)+dyb*pfpy(ib)
366 txx=0.5_sp*(pfpxd(ia)+pfpxd(ib))*viscof
367 tyy=0.5_sp*(pfpyd(ia)+pfpyd(ib))*viscof
369 fxx=-dtij(i,k)*txx*
dltye(i)
370 fyy= dtij(i,k)*tyy*
dltxe(i)
373 exflux=-un*dtij(i,k)* &
374 ((1.0_sp+sign(1.0_sp,un))*fij2+(1.0_sp-sign(1.0_sp,un))*fij1)*0.5_sp+fxx+fyy
383 ds = 0.5_sp*(
dz(ia,k) +
dz(ib,k) )
386 call limit_hor_flux_scal(f(ia,k),f(ib,k),ia,ib,da,db,
ntrg(i),deltat,exflux)
391 xflux(ia,k)=xflux(ia,k)+exflux
392 xflux(ib,k)=xflux(ib,k)-exflux
394 xflux_adv(ia,k)=xflux_adv(ia,k)+(exflux-fxx-fyy)
395 xflux_adv(ib,k)=xflux_adv(ib,k)-(exflux-fxx-fyy)
412 fflux_obc(i,k)=xflux_adv(i1,k)
426 IF(backward_advection/=.true.)
THEN 431 IF(backward_step==1)
THEN 433 ELSEIF(backward_step==2)
THEN 443 if(
isonb(i) == 2)
then 444 xflux(i,k)= vflux(k)*
art1(i)
448 xflux(i,k)=xflux(i,k)+ vflux(k)*
art1(i)
459 if(river_ts_setting ==
'calculated')
then 460 if(river_inflow_location ==
'node')
then 465 xflux(jj,k)=xflux(jj,k) -
qdis(j)*
vqdist(j,k)*fpoint
468 else if(river_inflow_location ==
'edge')
then 469 write(*,*)
'scalar advection not setup for "edge" point source' 476 if(river_ts_setting ==
'calculated')
then 477 if(river_inflow_location ==
'node')
then 483 IF(backward_advection/=.true.)
THEN 486 IF(backward_step==1)
THEN 487 fpoint = (f0(jj,k)+f(jj,k))*0.5
488 ELSEIF(backward_step==2)
THEN 489 fpoint = (f2(jj,k)+f0(jj,k)+f(jj,k))/3.0_sp
493 xflux(jj,k)=xflux(jj,k) -
qdis(j)*
vqdist(j,k)*fpoint
496 else if(river_inflow_location ==
'edge')
then 497 write(*,*)
'scalar advection not setup for "edge" point source' 511 fn(i,k)=(f(i,k)-xflux(i,k)/
art1(i)*(deltat/(
dt(i)*
dz(i,k))))*(
dt(i)/
dtfa(i))
533 Real(sp),
intent(inout) :: f(0:mt,kb)
534 Real(sp),
intent(in ) :: deltat
537 real(sp) :: dsqrd,dfdz,visb
538 real(sp) :: fsol(0:kb)
553 cu(1)= - deltat*(
kh(i,2)+umol)/(
dzz(i,1)*
dz(i,1)*dsqrd)
558 au(k) = - deltat*(
kh(i,k )+umol)/(
dzz(i,k-1)*
dz(i,k)*dsqrd)
559 cu(k) = - deltat*(
kh(i,k+1)+umol)/(
dzz(i,k )*
dz(i,k)*dsqrd)
560 bu(k) = 1.0 -
cu(k) -
au(k)
564 au(kbm1) = - deltat*(
kh(i,kbm1)+umol)/(
dzz(i,kbm1-1)*
dz(i,kbm1)*dsqrd)
566 bu(kbm1) = 1.0 -
au(kbm1)
587 f(i,1:kbm1) = fsol(1:kbm1)
607 real(sp),
intent(in ),
dimension(0:mt,kb) :: f
608 real(sp),
intent(out),
dimension(0:mt,kb) :: fn
609 real(sp),
intent(in ),
dimension(numqbc ) :: fdis
611 integer :: i,j,k,j1,j11,j22
618 if(river_ts_setting ==
'specified')
then 620 if(river_inflow_location ==
'node')
then 627 else if(river_inflow_location ==
'edge')
then 649 Subroutine bcond_scal_obc(f,fn,fflux_obc,f_obc,deltat,alpha_nudge)
656 real(sp),
intent(in ),
dimension(0:mt,kb) :: f
657 real(sp),
intent(inout),
dimension(0:mt,kb) :: fn
658 real(sp),
intent(in ),
dimension(iobcn+1,kbm1) :: fflux_obc
659 real(sp),
intent(in ),
dimension(iobcn ) :: f_obc
660 real(sp),
intent(in ) :: deltat
661 real(sp),
intent(in ) :: alpha_nudge
663 real(sp) :: f2d,f2d_next,f2d_obc,xflux2d,tmp
664 integer :: i,j,k,j1,j11,j22
678 f2d=f2d+f(j,k)*
dz(j,k)
679 f2d_next=f2d_next+fn(j1,k)*
dz(j1,k)
680 xflux2d=xflux2d+fflux_obc(i,k)*
dz(j,k)
685 f2d_obc=(f2d*
dt(j)-tmp*deltat/
art1(j))/
d(j)
691 fn(j,k) = f(j,k)-alpha_nudge*(f(j,k)-f_obc(i))
709 real(sp),
intent(inout),
dimension(0:mt,kb) :: fn
710 real(sp),
intent(in),
dimension(0:mt,kb) :: f
721 IF(i ==
i_obc_n(j)) cycle nodes
728 IF(river_inflow_location ==
'node')
THEN 729 IF(i ==
inodeq(j)) cycle nodes
731 IF(river_inflow_location ==
'edge')
THEN 738 IF(
bfwdis(i) .GT. 0.0_sp .and. groundwater_salt_on) cycle nodes
741 IF(precipitation_on) k1 = 2
744 smax = maxval(f(
nbsn(i,1:
ntsn(i)),k))
745 smin = minval(f(
nbsn(i,1:
ntsn(i)),k))
748 smax = max(smax,(f(i,k)*
dz(i,k+1)+f(i,k+1)*
dz(i,k))/ &
750 smin = min(smin,(f(i,k)*
dz(i,k+1)+f(i,k+1)*
dz(i,k))/ &
752 ELSE IF(k == kbm1)
THEN 753 smax = max(smax,(f(i,k)*
dz(i,k-1)+f(i,k-1)*
dz(i,k))/ &
755 smin = min(smin,(f(i,k)*
dz(i,k-1)+f(i,k-1)*
dz(i,k))/ &
758 smax = max(smax,(f(i,k)*
dz(i,k-1)+f(i,k-1)*
dz(i,k))/ &
759 (
dz(i,k)+
dz(i,k-1)), &
760 (f(i,k)*
dz(i,k+1)+f(i,k+1)*
dz(i,k))/ &
762 smin = min(smin,(f(i,k)*
dz(i,k-1)+f(i,k-1)*
dz(i,k))/ &
763 (
dz(i,k)+
dz(i,k-1)), &
764 (f(i,k)*
dz(i,k+1)+f(i,k+1)*
dz(i,k))/ &
768 IF(smin-fn(i,k) > 0.0_sp)fn(i,k) = smin
769 IF(fn(i,k)-smax > 0.0_sp)fn(i,k) = smax
774 WHERE(fn < 0.0_sp)fn=0.0_sp
793 integer ,
intent(in ) :: n
794 real(sp),
intent(in ) :: c(n)
795 real(sp),
intent(in ) :: w(n+1)
796 real(sp),
intent(in ) :: zk(n)
797 real(sp),
intent(out) :: flux(n+1)
798 real(sp) :: conv(n+1),diss(n+1)
799 real(sp) :: cin(0:n+1)
800 real(sp) :: sl_h(0:n+1)
801 real(sp) :: dis4,sl_u,sl_f
821 conv(i) = w(i)*(cin(i)+cin(i-1))*0.5_sp
822 sl_u = 2.0_sp*(cin(i)-cin(i+1))/(sl_h(i)+sl_h(i+1))
823 sl_f = 2.0_sp*(cin(i-2)-cin(i-1))/(sl_h(i-2)+sl_h(i-1))
824 diss(i) = dis4*(cin(i-1)-cin(i)-0.5_sp*
limled2(sl_u,sl_f,2.0_sp)*(sl_h(i-1)+sl_h(i)))
833 flux(i) = conv(i)-conv(i+1)+diss(i+1)-diss(i)
852 r = abs( (a-b)/(abs(a)+abs(b)+eps) )**q
883 real(sp),
intent(in ) :: fka
884 real(sp),
intent(in ) :: fkb
885 integer ,
intent(in ) :: ele_num
886 integer ,
intent(in ) :: ia,ib
887 real(sp),
intent(in ) :: delt
888 real(sp),
intent(in ) :: Da
889 real(sp),
intent(in ) :: Db
890 real(sp),
intent(inout) :: exflux
894 real(sp) :: x_ce,xa,xb,y_ce,ya,yb
899 real(sp) :: amount_source
904 x_ce =
xc(ele_num) ; y_ce =
yc(ele_num)
905 xa =
vx(ia) ; ya =
vy(ia)
906 xb =
vx(ib) ; yb =
vy(ib)
914 a_cv = 0.5* abs( 0.5*( (xb-xa)*(y_ce-ya) - (x_ce-xa)*(yb-ya) ) )
918 if (exflux >= 0.0)
then 935 amount_source = f_source * a_cv
936 flux_max = amount_source*d_source/delt
943 if (exflux >= 0.0)
then 944 exflux = min(flux_max,exflux)
946 exflux = max(-flux_max,exflux)
integer, dimension(:), allocatable, target ntsn
real(sp), dimension(:), allocatable, target d
real(sp), dimension(:,:), allocatable, target yije
subroutine tridiagonal_scal(N, fi, lt, value)
real(sp), dimension(:), allocatable, target dtfa
real(sp), dimension(:), allocatable bu
real(sp), dimension(:), allocatable cu
real(sp), dimension(:,:), allocatable, target v
real(sp), dimension(:,:), allocatable, target vqdist
subroutine fct_sed(f, fn)
logical function dbg_set(vrb)
real(sp), dimension(:), allocatable, target pfpxb
real(sp), dimension(:), allocatable, target art1
real(sp), dimension(:), allocatable, target qdis
real(sp), dimension(:), allocatable, target yc
subroutine init_tridiagonal_scal(N)
real(sp), dimension(:,:), allocatable, target xije
real(sp), dimension(:), allocatable, target pfpyb
subroutine bcond_scal_obc(f, fn, fflux_obc, f_obc, deltat, alpha_nudge)
real(sp), dimension(:), allocatable, target art2
integer, dimension(:), allocatable, target ntrg
real(sp), dimension(:,:), allocatable, target u
integer, dimension(:,:), allocatable, target niec
integer, dimension(:,:), allocatable, target nbvt
integer, dimension(:), allocatable next_obc
real(sp), dimension(:), allocatable du
subroutine limit_hor_flux_scal(fka, fkb, ia, ib, Da, Db, ele_num, delt, exflux)
real(sp), dimension(:), allocatable, target vx
real(sp), dimension(:), allocatable, target dltye
real(sp), dimension(:), allocatable uard_obcn
real(sp), dimension(:), allocatable nn_hvc
real(sp), dimension(:), allocatable, target vy
integer, dimension(:), allocatable, target ntve
real(sp) function lim(a, b)
subroutine bcond_scal_ptsource(f, fn, fdis)
integer, dimension(:), allocatable i_obc_n
subroutine vdif_scal(f, deltat)
real(sp), dimension(:), allocatable, target bfwdis
integer, dimension(:,:), allocatable, target nv
integer, dimension(:,:), allocatable, target n_icellq
real(sp), dimension(:,:), allocatable, target dzz
real(sp), dimension(:,:), allocatable, target dz
real(sp), dimension(:), allocatable au
integer, dimension(:), allocatable iswetnt
real(sp), dimension(:,:), allocatable, target kh
integer, dimension(:,:), allocatable, target nbve
real(sp), dimension(:), allocatable, target dt1
real(sp), dimension(:), allocatable, target xc
real(sp), dimension(:,:), allocatable, target dz1
real(sp) function limled2(a, b, alpha)
integer, dimension(:,:), allocatable, target nbsn
real(sp), dimension(:,:), allocatable, target wts
real(sp), dimension(:), allocatable, target dltxe
integer, parameter dbg_sbr
integer, dimension(:), allocatable, target inodeq
subroutine calc_vflux(n, c, w, zk, flux)
integer, dimension(:), allocatable, target isonb
real(sp), dimension(:), allocatable, target dt
subroutine adv_scal(f, f0, f2, fn, d_fdis, fdis, d_fflux, fflux_obc, deltat, source)
integer, dimension(:), allocatable iswetn