My Project
advection_edge_gcn.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  SUBROUTINE advection_edge_gcn(XFLUX,YFLUX)
42 !==============================================================================|
43 ! Calculate the Advection and Diffusion Terms of 3D Velocity Field |
44 ! These Terms will be vertically integrated to form the Mean Terms in |
45 ! the Gx and Gy Terms of the External Mode Equation |
46 !==============================================================================|
47 
48  USE all_vars
49  USE mod_utils
50  USE bcs
51  USE mod_spherical
52  USE mod_northpole
53  USE mod_wd
54 
55 
56 
57  IMPLICIT NONE
58  REAL(SP), INTENT(OUT), DIMENSION(0:NT,KB) :: XFLUX,YFLUX
59  REAL(SP) :: DIJ
60  REAL(SP) :: COFA1,COFA2,COFA3,COFA4,COFA5,COFA6,COFA7,COFA8
61  REAL(SP) :: XADV,YADV,TXXIJ,TYYIJ,TXYIJ,UN_TMP
62  REAL(SP) :: VISCOF,VISCOF1,VISCOF2,TEMP,TPA,TPB
63  REAL(SP) :: XIJA,YIJA,XIJB,YIJB,UIJ,VIJ
64  REAL(SP) :: FACT,FM1
65  INTEGER :: I,IA,IB,J1,J2,K1,K2,K3,K4,K5,K6,K,II,J,I1,I2
66  REAL(SP) :: ISWETTMP
67 
68 !# if defined (THIN_DAM)
69  REAL(SP) :: A1UIA1,A1UIA2,A1UIA3,A1UIA4,A2UIA1,A2UIA2,A2UIA3,A2UIA4
70  REAL(SP) :: A1UIB1,A1UIB2,A1UIB3,A1UIB4,A2UIB1,A2UIB2,A2UIB3,A2UIB4
71  INTEGER :: J11,J12,J21,J22,E1,E2,ISBCE1,ISBC_TMP,IB_TMP
72  LOGICAL :: ISMATCH
73 !# endif
74 
75  REAL(SP) :: UIJ1,VIJ1,UIJ2,VIJ2,FXX,FYY
76 !------------------------------------------------------------------------------|
77 
78  if(dbg_set(dbg_sbr)) write(ipt,*) "Start: advection_edge_gcn.F"
79 
80  SELECT CASE(horizontal_mixing_type)
81  CASE ('closure')
82  fact = 1.0_sp
83  fm1 = 0.0_sp
84  CASE('constant')
85  fact = 0.0_sp
86  fm1 = 1.0_sp
87  CASE DEFAULT
88  CALL fatal_error("UNKNOW HORIZONTAL MIXING TYPE:",&
89  & trim(horizontal_mixing_type) )
90  END SELECT
91 
92 
93 !
94 !--Initialize Variables--------------------------------------------------------|
95 !
96  xflux = 0.0_sp
97  yflux = 0.0_sp
98 
99 !
100 !--Loop Over Edges and Accumulate Fluxes-For Each Element----------------------|
101 !
102 
103  DO i=1,ne
104  ia=iec(i,1)
105  ib=iec(i,2)
106 
107  IF(iswetct(ia)*iswetc(ia) == 1 .OR. iswetct(ib)*iswetc(ib) == 1)THEN
108  j1=ienode(i,1)
109  j2=ienode(i,2)
110 
111  k1=nbe(ia,1)
112  k2=nbe(ia,2)
113  k3=nbe(ia,3)
114  k4=nbe(ib,1)
115  k5=nbe(ib,2)
116  k6=nbe(ib,3)
117 !# if defined (SPHERICAL)
118 ! XIJA=DLTXNE(I,1)
119 ! YIJA=DLTYNE(I,1)
120 ! XIJB=DLTXNE(I,2)
121 ! YIJB=DLTYNE(I,2)
122 !# if defined (THIN_DAM)
123 ! IF(IB==0.AND.E_DAM_MATCH(IA)/=0)XIJB=DLTXNE_DAM_MATCH(I)
124 ! IF(IB==0.AND.E_DAM_MATCH(IA)/=0)YIJB=DLTYNE_DAM_MATCH(I)
125 !# endif
126 !# else
127 ! XIJA=XIJC(I)-XC(IA)
128 ! YIJA=YIJC(I)-YC(IA)
129 ! XIJB=XIJC(I)-XC(IB)
130 ! YIJB=YIJC(I)-YC(IB)
131 !# if defined (THIN_DAM)
132 ! IF(IB==0.AND.E_DAM_MATCH(IA)/=0)XIJB=XIJC(I)-XC(E_DAM_MATCH(IA))
133 ! IF(IB==0.AND.E_DAM_MATCH(IA)/=0)YIJB=YIJC(I)-YC(E_DAM_MATCH(IA))
134 !# endif
135 !# endif
136 
137  DO k=1,kbm1
138 
139  xija=xijc(i)-xc(ia)
140  yija=yijc(i)-yc(ia)
141  xijb=xijc(i)-xc(ib)
142  yijb=yijc(i)-yc(ib)
143 
144  ib_tmp = ib
145  dij= 0.5_sp*(dt(j1)*dz(j1,k)+dt(j2)*dz(j2,k))
146 !--------------Used for Dam Model by Jadon----------------------
147  a1uia1 = a1u(ia,1)
148  a1uia2 = a1u(ia,2)
149  a1uia3 = a1u(ia,3)
150  a1uia4 = a1u(ia,4)
151  a2uia1 = a2u(ia,1)
152  a2uia2 = a2u(ia,2)
153  a2uia3 = a2u(ia,3)
154  a2uia4 = a2u(ia,4)
155 
156  a1uib1 = a1u(ib_tmp,1)
157  a1uib2 = a1u(ib_tmp,2)
158  a1uib3 = a1u(ib_tmp,3)
159  a1uib4 = a1u(ib_tmp,4)
160  a2uib1 = a2u(ib_tmp,1)
161  a2uib2 = a2u(ib_tmp,2)
162  a2uib3 = a2u(ib_tmp,3)
163  a2uib4 = a2u(ib_tmp,4)
164 !---------------------------------------------------------------
165  !!FORM THE LEFT FLUX
166  cofa1=a1uia1*u(ia,k)+a1uia2*u(k1,k)+a1uia3*u(k2,k)+a1uia4*u(k3,k)
167  cofa2=a2uia1*u(ia,k)+a2uia2*u(k1,k)+a2uia3*u(k2,k)+a2uia4*u(k3,k)
168  cofa5=a1uia1*v(ia,k)+a1uia2*v(k1,k)+a1uia3*v(k2,k)+a1uia4*v(k3,k)
169  cofa6=a2uia1*v(ia,k)+a2uia2*v(k1,k)+a2uia3*v(k2,k)+a2uia4*v(k3,k)
170 ! COFA1=A1U(IA,1)*U(IA,K)+A1U(IA,2)*U(K1,K)+A1U(IA,3)*U(K2,K)+A1U(IA,4)*U(K3,K)
171 ! COFA2=A2U(IA,1)*U(IA,K)+A2U(IA,2)*U(K1,K)+A2U(IA,3)*U(K2,K)+A2U(IA,4)*U(K3,K)
172 ! COFA5=A1U(IA,1)*V(IA,K)+A1U(IA,2)*V(K1,K)+A1U(IA,3)*V(K2,K)+A1U(IA,4)*V(K3,K)
173 ! COFA6=A2U(IA,1)*V(IA,K)+A2U(IA,2)*V(K1,K)+A2U(IA,3)*V(K2,K)+A2U(IA,4)*V(K3,K)
174  uij1=u(ia,k)+cofa1*xija+cofa2*yija
175  vij1=v(ia,k)+cofa5*xija+cofa6*yija
176 
177  !!FORM THE RIGHT FLUX
178  cofa3=a1uib1*u(ib_tmp,k)+a1uib2*u(k4,k)+a1uib3*u(k5,k)+a1uib4*u(k6,k)
179  cofa4=a2uib1*u(ib_tmp,k)+a2uib2*u(k4,k)+a2uib3*u(k5,k)+a2uib4*u(k6,k)
180  cofa7=a1uib1*v(ib_tmp,k)+a1uib2*v(k4,k)+a1uib3*v(k5,k)+a1uib4*v(k6,k)
181  cofa8=a2uib1*v(ib_tmp,k)+a2uib2*v(k4,k)+a2uib3*v(k5,k)+a2uib4*v(k6,k)
182 ! COFA3=A1U(IB,1)*U(IB,K)+A1U(IB,2)*U(K4,K)+A1U(IB,3)*U(K5,K)+A1U(IB,4)*U(K6,K)
183 ! COFA4=A2U(IB,1)*U(IB,K)+A2U(IB,2)*U(K4,K)+A2U(IB,3)*U(K5,K)+A2U(IB,4)*U(K6,K)
184 ! COFA7=A1U(IB,1)*V(IB,K)+A1U(IB,2)*V(K4,K)+A1U(IB,3)*V(K5,K)+A1U(IB,4)*V(K6,K)
185 ! COFA8=A2U(IB,1)*V(IB,K)+A2U(IB,2)*V(K4,K)+A2U(IB,3)*V(K5,K)+A2U(IB,4)*V(K6,K)
186  uij2=u(ib_tmp,k)+cofa3*xijb+cofa4*yijb
187  vij2=v(ib_tmp,k)+cofa7*xijb+cofa8*yijb
188 
189  !!COMPUTE THE NORMAL VELOCITY ACROSS THE EDGE
190  uij=0.5_sp*(uij1+uij2)
191  vij=0.5_sp*(vij1+vij2)
192  un_tmp=vij*dltxc(i) - uij*dltyc(i)
193 
194  viscof1=art(ia)*sqrt(cofa1**2+cofa6**2+0.5_sp*(cofa2+cofa5)**2)
195  viscof2=art(ib_tmp)*sqrt(cofa3**2+cofa8**2+0.5_sp*(cofa4+cofa7)**2)
196 
197 ! VISCOF = HORCON*(FACT*0.5_SP*(VISCOF1+VISCOF2)/HPRNU + FM1)
198 ! VISCOF = HORCON*(FACT*0.5_SP*(VISCOF1+VISCOF2) + FM1)
199  ! David moved HPRNU and added HVC
200  viscof=(fact*0.5_sp*(viscof1*cc_hvc(ia)+viscof2*cc_hvc(ib_tmp)) + fm1*0.5_sp*(cc_hvc(ia)+cc_hvc(ib_tmp)))/hprnu
201 
202  txxij=(cofa1+cofa3)*viscof
203  tyyij=(cofa6+cofa8)*viscof
204  txyij=0.5_sp*(cofa2+cofa4+cofa5+cofa7)*viscof
205  fxx=dij*(txxij*dltyc(i)-txyij*dltxc(i))
206  fyy=dij*(txyij*dltyc(i)-tyyij*dltxc(i))
207 
208  !!UPWIND THE ADVECTIVE FLUX
209  xadv=dij*un_tmp*((1.0_sp-sign(1.0_sp,un_tmp))*uij2+(1.0_sp+sign(1.0_sp,un_tmp))*uij1)*0.5_sp
210  yadv=dij*un_tmp*((1.0_sp-sign(1.0_sp,un_tmp))*vij2+(1.0_sp+sign(1.0_sp,un_tmp))*vij1)*0.5_sp
211 
212 
213  !!COMPUTE BOUNDARY FLUX AUGMENTERS
214 
215  isbc_tmp = isbc(i)
216  tpa = float(1-isbc_tmp)*epor(ia)
217  tpb = float(1-isbc_tmp)*epor(ib_tmp)
218  !!ACCUMULATE THE FLUX
219 ! XFLUX(IA,K)=XFLUX(IA,K)+XADV*TPA+FXX*TPA
220 ! YFLUX(IA,K)=YFLUX(IA,K)+YADV*TPA+FYY*TPA
221 ! XFLUX(IB,K)=XFLUX(IB,K)-XADV*TPB-FXX*TPB
222 ! YFLUX(IB,K)=YFLUX(IB,K)-YADV*TPB-FYY*TPB
223 
224  xflux(ia,k)=xflux(ia,k)+xadv*tpa+(fxx+3.0_sp*fxx*float(isbc_tmp))*epor(ia)
225  yflux(ia,k)=yflux(ia,k)+yadv*tpa+(fyy+3.0_sp*fyy*float(isbc_tmp))*epor(ia)
226  xflux(ib,k)=xflux(ib,k)-xadv*tpb-(fxx+3.0_sp*fxx*float(isbc_tmp))*epor(ib)
227  yflux(ib,k)=yflux(ib,k)-yadv*tpb-(fyy+3.0_sp*fyy*float(isbc_tmp))*epor(ib)
228 
229 ! XFLUX(IA,K)=XFLUX(IA,K)+XADV*TPA+(FXX+3.0_SP*FXX*FLOAT(ISBC(I)))*EPOR(IA)
230 ! YFLUX(IA,K)=YFLUX(IA,K)+YADV*TPA+(FYY+3.0_SP*FYY*FLOAT(ISBC(I)))*EPOR(IA)
231 ! XFLUX(IB,K)=XFLUX(IB,K)-XADV*TPB-(FXX+3.0_SP*FXX*FLOAT(ISBC(I)))*EPOR(IB)
232 ! YFLUX(IB,K)=YFLUX(IB,K)-YADV*TPB-(FYY+3.0_SP*FYY*FLOAT(ISBC(I)))*EPOR(IB)
233 
234  END DO
235 
236  END IF
237  END DO
238 
239 
240 
241  DO i=1,n
242  iswettmp = iswetct(i)*iswetc(i)
243  DO k=1,kbm1
244  xflux(i,k) = xflux(i,k)*iswettmp
245  yflux(i,k) = yflux(i,k)*iswettmp
246  END DO
247  END DO
248 
249 
250 !
251 !--Boundary Conditions on Flux-------------------------------------------------|
252 !
253  DO i=1,n
254  IF(isbce(i) == 2)THEN
255  DO k=1,kbm1
256  xflux(i,k)=0.0_sp
257  yflux(i,k)=0.0_sp
258  END DO
259  END IF
260  END DO
261 
262 !
263 !--Adjust Flux for Fresh Water Inflow------------------------------------------|
264 !
265 
266  IF(numqbc > 0) THEN
267  IF(river_inflow_location == 'node') THEN
268  DO ii=1,numqbc
269  j=inodeq(ii)
270  i1=nbve(j,1)
271  i2=nbve(j,ntve(j))
272  DO k=1,kbm1
273  vlctyq(ii)=qdis(ii)/qarea(ii)
274 ! TEMP=0.5_SP*QDIS(II)*VQDIST(II,K)*VLCTYQ(II)
275  temp=0.5_sp*qdis(ii)*vqdist(ii,k)*vqdist(ii,k)*vlctyq(ii)/dz(j,k)
276 ! XFLUX(I1,K)=XFLUX(I1,K)-TEMP/DZ(J,K)*COS(ANGLEQ(II))
277 ! XFLUX(I2,K)=XFLUX(I2,K)-TEMP/DZ(J,K)*COS(ANGLEQ(II))
278 ! YFLUX(I1,K)=YFLUX(I1,K)-TEMP/DZ(J,K)*SIN(ANGLEQ(II))
279 ! YFLUX(I2,K)=YFLUX(I2,K)-TEMP/DZ(J,K)*SIN(ANGLEQ(II))
280  xflux(i1,k)=xflux(i1,k)-temp*cos(angleq(ii))
281  xflux(i2,k)=xflux(i2,k)-temp*cos(angleq(ii))
282  yflux(i1,k)=yflux(i1,k)-temp*sin(angleq(ii))
283  yflux(i2,k)=yflux(i2,k)-temp*sin(angleq(ii))
284  END DO
285  END DO
286  ELSE IF(river_inflow_location == 'edge') THEN
287  DO ii=1,numqbc
288  i1=icellq(ii)
289  DO k=1,kbm1
290  vlctyq(ii)=qdis(ii)/qarea(ii)
291 ! TEMP=QDIS(II)*VQDIST(II,K)*VLCTYQ(II)
292  temp=qdis(ii)*vqdist(ii,k)*vqdist(ii,k)*vlctyq(ii)/dz1(i1,k)
293 ! XFLUX(I1,K)=XFLUX(I1,K)-TEMP/DZ1(I1,K)*COS(ANGLEQ(II))
294 ! YFLUX(I1,K)=YFLUX(I1,K)-TEMP/DZ1(I1,K)*SIN(ANGLEQ(II))
295  xflux(i1,k)=xflux(i1,k)-temp*cos(angleq(ii))
296  yflux(i1,k)=yflux(i1,k)-temp*sin(angleq(ii))
297  END DO
298  END DO
299  END IF
300  END IF
301 
302 !
303 !--Adjust Flux for Open Boundary Inflow/Outflow------------------------------------------|
304 !
305 
306  if(dbg_set(dbg_sbr)) write(ipt,*) "End: advection_edge_gcn.F"
307 
308  RETURN
309  END SUBROUTINE advection_edge_gcn
310 !==============================================================================|
integer, dimension(:,:), allocatable, target ienode
Definition: mod_main.f90:1029
real(sp), dimension(:), allocatable, target epor
Definition: mod_main.f90:1056
real(sp), dimension(:), allocatable, target art
Definition: mod_main.f90:1009
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 qdis
Definition: mod_main.f90:1220
real(sp), dimension(:), allocatable, target yc
Definition: mod_main.f90:1004
real(sp), dimension(:), allocatable cc_hvc
Definition: mod_main.f90:1302
real(sp), dimension(:), allocatable, target dltxc
Definition: mod_main.f90:1040
real(sp), dimension(:,:), allocatable, target a1u
Definition: mod_main.f90:1331
integer, dimension(:), allocatable iswetct
Definition: mod_wd.f90:54
real(sp), dimension(:,:), allocatable, target u
Definition: mod_main.f90:1268
integer, dimension(:), allocatable, target isbc
Definition: mod_main.f90:1026
real(sp), dimension(:), allocatable, target angleq
Definition: mod_main.f90:1228
integer, dimension(:,:), allocatable, target iec
Definition: mod_main.f90:1028
integer, dimension(:), allocatable, target ntve
Definition: mod_main.f90:1022
integer, dimension(:,:), allocatable, target nbe
Definition: mod_main.f90:1020
real(sp), dimension(:), allocatable, target xijc
Definition: mod_main.f90:1044
real(sp), dimension(:), allocatable, target qarea
Definition: mod_main.f90:1226
real(sp), dimension(:), allocatable, target dltyc
Definition: mod_main.f90:1041
real(sp), dimension(:,:), allocatable, target dz
Definition: mod_main.f90:1092
integer, dimension(:), allocatable, target icellq
Definition: mod_main.f90:1215
real(sp), dimension(:), allocatable, target yijc
Definition: mod_main.f90:1045
real(sp), dimension(:,:), allocatable, target a2u
Definition: mod_main.f90:1332
integer, dimension(:), allocatable iswetc
Definition: mod_wd.f90:52
integer, dimension(:,:), allocatable, target nbve
Definition: mod_main.f90:1034
subroutine fatal_error(ER1, ER2, ER3, ER4)
Definition: mod_utils.f90:230
real(sp), dimension(:), allocatable, target xc
Definition: mod_main.f90:1003
real(sp), dimension(:,:), allocatable, target dz1
Definition: mod_main.f90:1096
integer, dimension(:), allocatable, target isbce
Definition: mod_main.f90:1027
real(sp), dimension(:), allocatable, target vlctyq
Definition: mod_main.f90:1229
integer, parameter dbg_sbr
Definition: mod_utils.f90:69
integer, dimension(:), allocatable, target inodeq
Definition: mod_main.f90:1214
real(sp), dimension(:), allocatable, target dt
Definition: mod_main.f90:1133
subroutine advection_edge_gcn(XFLUX, YFLUX)