My Project
advave_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 ! CALCULATE CONVECTION AND DIFFUSION FLUXES FOR EXTERNAL MODE !
42 !==============================================================================|
43  SUBROUTINE advave_edge_gcn(XFLUX,YFLUX)
44 !==============================================================================|
45 
46  USE all_vars
47  USE mod_utils
48  USE mod_spherical
49  USE mod_northpole
50  USE bcs
51  USE mod_obcs
52  USE mod_wd
53 
54 
55 
56 
57 
58  IMPLICIT NONE
59  INTEGER :: I,J,K,IA,IB,J1,J2,K1,K2,K3,I1,I2,II
60  REAL(SP) :: DIJ,ELIJ,XIJ,YIJ,UIJ,VIJ
61  REAL(SP) :: COFA1,COFA2,COFA3,COFA4,COFA5,COFA6,COFA7,COFA8
62  REAL(SP) :: XADV,YADV,TXXIJ,TYYIJ,TXYIJ,UN_TMP
63  REAL(SP) :: VISCOF,VISCOF1,VISCOF2,TEMP
64  REAL(SP) :: XFLUX(0:NT),YFLUX(0:NT)
65  REAL(SP) :: FACT,FM1,ISWETTMP
66  INTEGER :: STAT_MF
67  REAL(SP) :: TPA,TPB
68 
69 
70  REAL(SP) :: UIJ1,VIJ1,UIJ2,VIJ2,FXX,FYY
71 
72 !# if defined (THIN_DAM)
73  REAL(SP) :: A1UIA1,A1UIA2,A1UIA3,A1UIA4,A2UIA1,A2UIA2,A2UIA3,A2UIA4
74  REAL(SP) :: A1UIB1,A1UIB2,A1UIB3,A1UIB4,A2UIB1,A2UIB2,A2UIB3,A2UIB4
75  INTEGER :: J11,J12,J21,J22,E1,E2,ISBCE1,ISBC_TMP,IB_TMP
76  LOGICAL :: ISMATCH
77 !# endif
78 
79  REAL(SP) :: BTPS
80  REAL(SP) :: U_TMP,V_TMP,UAC_TMP,VAC_TMP,WUSURF_TMP,WVSURF_TMP,WUBOT_TMP,WVBOT_TMP,UAF_TMP,VAF_TMP
81 
82  if(dbg_set(dbg_sbr)) write(ipt,*) "Start: advave_edge_gcn.F"
83 
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  yflux = 0.0_sp
103  pstx = 0.0_sp
104  psty = 0.0_sp
105 
106 
107 !
108 !-------------------------ACCUMULATE FLUX OVER ELEMENT EDGES-------------------!
109 !
110 
111  DO i=1,ne
112  ia=iec(i,1)
113  ib=iec(i,2)
114 
115  j1=ienode(i,1)
116  j2=ienode(i,2)
117 
118  dij=0.5_sp*(d(j1)+d(j2))
119  elij=0.5_sp*(el(j1)+el(j2))
120 
121 
122 
123 
124  IF(iswetce(ia)*iswetc(ia) == 1 .OR. iswetce(ib)*iswetc(ib) == 1)THEN
125 ! FLUX FROM LEFT
126  k1=nbe(ia,1)
127  k2=nbe(ia,2)
128  k3=nbe(ia,3)
129 
130  a1uia1 = a1u(ia,1)
131  a1uia2 = a1u(ia,2)
132  a1uia3 = a1u(ia,3)
133  a1uia4 = a1u(ia,4)
134  a2uia1 = a2u(ia,1)
135  a2uia2 = a2u(ia,2)
136  a2uia3 = a2u(ia,3)
137  a2uia4 = a2u(ia,4)
138 !---------------------------------------------------------------
139  cofa1=a1uia1*ua(ia)+a1uia2*ua(k1)+a1uia3*ua(k2)+a1uia4*ua(k3)
140  cofa2=a2uia1*ua(ia)+a2uia2*ua(k1)+a2uia3*ua(k2)+a2uia4*ua(k3)
141  cofa5=a1uia1*va(ia)+a1uia2*va(k1)+a1uia3*va(k2)+a1uia4*va(k3)
142  cofa6=a2uia1*va(ia)+a2uia2*va(k1)+a2uia3*va(k2)+a2uia4*va(k3)
143 
144 ! COFA1=A1U(IA,1)*UA(IA)+A1U(IA,2)*UA(K1)+A1U(IA,3)*UA(K2)+A1U(IA,4)*UA(K3)
145 ! COFA2=A2U(IA,1)*UA(IA)+A2U(IA,2)*UA(K1)+A2U(IA,3)*UA(K2)+A2U(IA,4)*UA(K3)
146 ! COFA5=A1U(IA,1)*VA(IA)+A1U(IA,2)*VA(K1)+A1U(IA,3)*VA(K2)+A1U(IA,4)*VA(K3)
147 ! COFA6=A2U(IA,1)*VA(IA)+A2U(IA,2)*VA(K1)+A2U(IA,3)*VA(K2)+A2U(IA,4)*VA(K3)
148 
149  xij=xijc(i)-xc(ia)
150  yij=yijc(i)-yc(ia)
151  uij1=ua(ia)+cofa1*xij+cofa2*yij
152  vij1=va(ia)+cofa5*xij+cofa6*yij
153 
154 ! FLUX FROM RIGHT
155  k1=nbe(ib,1)
156  k2=nbe(ib,2)
157  k3=nbe(ib,3)
158  ib_tmp = ib
159 
160  a1uib1 = a1u(ib_tmp,1)
161  a1uib2 = a1u(ib_tmp,2)
162  a1uib3 = a1u(ib_tmp,3)
163  a1uib4 = a1u(ib_tmp,4)
164  a2uib1 = a2u(ib_tmp,1)
165  a2uib2 = a2u(ib_tmp,2)
166  a2uib3 = a2u(ib_tmp,3)
167  a2uib4 = a2u(ib_tmp,4)
168 
169  cofa3=a1uib1*ua(ib_tmp)+a1uib2*ua(k1)+a1uib3*ua(k2)+a1uib4*ua(k3)
170  cofa4=a2uib1*ua(ib_tmp)+a2uib2*ua(k1)+a2uib3*ua(k2)+a2uib4*ua(k3)
171  cofa7=a1uib1*va(ib_tmp)+a1uib2*va(k1)+a1uib3*va(k2)+a1uib4*va(k3)
172  cofa8=a2uib1*va(ib_tmp)+a2uib2*va(k1)+a2uib3*va(k2)+a2uib4*va(k3)
173 
174 ! COFA3=A1U(IB,1)*UA(IB)+A1U(IB,2)*UA(K1)+A1U(IB,3)*UA(K2)+A1U(IB,4)*UA(K3)
175 ! COFA4=A2U(IB,1)*UA(IB)+A2U(IB,2)*UA(K1)+A2U(IB,3)*UA(K2)+A2U(IB,4)*UA(K3)
176 ! COFA7=A1U(IB,1)*VA(IB)+A1U(IB,2)*VA(K1)+A1U(IB,3)*VA(K2)+A1U(IB,4)*VA(K3)
177 ! COFA8=A2U(IB,1)*VA(IB)+A2U(IB,2)*VA(K1)+A2U(IB,3)*VA(K2)+A2U(IB,4)*VA(K3)
178 
179  xij=xijc(i)-xc(ib_tmp)
180  yij=yijc(i)-yc(ib_tmp)
181  uij2=ua(ib_tmp)+cofa3*xij+cofa4*yij
182  vij2=va(ib_tmp)+cofa7*xij+cofa8*yij
183 
184 ! NORMAL VELOCITY
185  uij=0.5_sp*(uij1+uij2)
186  vij=0.5_sp*(vij1+vij2)
187  un_tmp=-uij*dltyc(i) + vij*dltxc(i)
188 
189 ! VISCOSITY COEFFICIENT
190  viscof1=art(ia)*sqrt(cofa1**2+cofa6**2+0.5_sp*(cofa2+cofa5)**2)
191  viscof2=art(ib_tmp)*sqrt(cofa3**2+cofa8**2+0.5_sp*(cofa4+cofa7)**2)
192 ! VISCOF=HORCON*(FACT*0.5_SP*(VISCOF1+VISCOF2)/HPRNU + FM1)
193 ! VISCOF=HORCON*(FACT*0.5_SP*(VISCOF1+VISCOF2) + FM1)
194  ! David moved HPRNU and added HVC
195  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
196 
197 ! SHEAR STRESSES
198  txxij=(cofa1+cofa3)*viscof
199  tyyij=(cofa6+cofa8)*viscof
200  txyij=0.5_sp*(cofa2+cofa4+cofa5+cofa7)*viscof
201  fxx=dij*(txxij*dltyc(i)-txyij*dltxc(i))
202  fyy=dij*(txyij*dltyc(i)-tyyij*dltxc(i))
203 
204 ! ADD CONVECTIVE AND VISCOUS FLUXES
205  xadv=dij*un_tmp*&
206  ((1.0_sp-sign(1.0_sp,un_tmp))*uij2+(1.0_sp+sign(1.0_sp,un_tmp))*uij1)*0.5_sp
207  yadv=dij*un_tmp* &
208  ((1.0_sp-sign(1.0_sp,un_tmp))*vij2+(1.0_sp+sign(1.0_sp,un_tmp))*vij1)*0.5_sp
209 
210 ! ACCUMULATE FLUX
211  isbc_tmp = isbc(i)
212  xflux(ia)=xflux(ia)+(xadv+fxx*epor(ia))*(1.0_sp-isbc_tmp)*iucp(ia)
213  yflux(ia)=yflux(ia)+(yadv+fyy*epor(ia))*(1.0_sp-isbc_tmp)*iucp(ia)
214  xflux(ib)=xflux(ib)-(xadv+fxx*epor(ib))*(1.0_sp-isbc_tmp)*iucp(ib)
215  yflux(ib)=yflux(ib)-(yadv+fyy*epor(ib))*(1.0_sp-isbc_tmp)*iucp(ib)
216 
217  END IF
218 
219 
220 
221 ! ACCUMULATE BAROTROPIC FLUX
222 !for spherical coordinator and domain across 360^o latitude
223  pstx(ia)=pstx(ia)-grav_e(ia)*d1(ia)*elij*dltyc(i)
224  psty(ia)=psty(ia)+grav_e(ia)*d1(ia)*elij*dltxc(i)
225  pstx(ib)=pstx(ib)+grav_e(ib)*d1(ib)*elij*dltyc(i)
226  psty(ib)=psty(ib)-grav_e(ib)*d1(ib)*elij*dltxc(i)
227 
228  END DO
229 
230 !# if !defined (SEMI_IMPLICIT)
231 
232  DO i = 1,n
233  iswettmp = iswetce(i)*iswetc(i)
234  xflux(i) = xflux(i)*iswettmp
235  yflux(i) = yflux(i)*iswettmp
236  END DO
237 
238 
239 !
240 !-------------------------SET BOUNDARY VALUES----------------------------------!
241 !
242 
243 ! MODIFY BOUNDARY FLUX
244  DO i=1,n
245  IF(isbce(i) == 2) THEN
246  xflux(i)=(xflux(i)+fluxobn(i)*ua(i))*iucp(i)
247  yflux(i)=(yflux(i)+fluxobn(i)*va(i))*iucp(i)
248  ENDIF
249  END DO
250 
251 
252 ! ADJUST FLUX FOR RIVER INFLOW
253  IF(numqbc > 0) THEN
254  IF(river_inflow_location == 'node')THEN
255  DO k=1,numqbc
256  j=inodeq(k)
257  i1=nbve(j,1)
258  i2=nbve(j,ntve(j))
259  vlctyq(k)=qdis(k)/qarea(k)
260  xflux(i1)=xflux(i1)-0.5_sp*qdis(k)*vlctyq(k)*cos(angleq(k))
261  yflux(i1)=yflux(i1)-0.5_sp*qdis(k)*vlctyq(k)*sin(angleq(k))
262  xflux(i2)=xflux(i2)-0.5_sp*qdis(k)*vlctyq(k)*cos(angleq(k))
263  yflux(i2)=yflux(i2)-0.5_sp*qdis(k)*vlctyq(k)*sin(angleq(k))
264  END DO
265  ELSE IF(river_inflow_location == 'edge') THEN
266  DO k=1,numqbc
267  i1=icellq(k)
268  vlctyq(k)=qdis(k)/qarea(k)
269  temp=qdis(k)*vlctyq(k)
270  xflux(i1)=xflux(i1)-temp*cos(angleq(k))
271  yflux(i1)=yflux(i1)-temp*sin(angleq(k))
272  END DO
273  END IF
274  END IF
275 
276 ! ADJUST FLUX FOR OPEN BOUNDARY MEAN FLOW
277 
278 
279 
280  if(dbg_set(dbg_sbr)) write(ipt,*) "End: advave_edge_gcn.F"
281 
282  END SUBROUTINE advave_edge_gcn
283 !==============================================================================|
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 va
Definition: mod_main.f90:1104
real(sp), dimension(:), allocatable, target d
Definition: mod_main.f90:1132
real(sp), dimension(:), allocatable, target d1
Definition: mod_main.f90:1116
integer, dimension(:), allocatable iswetce
Definition: mod_wd.f90:55
real(sp), dimension(:), allocatable, target psty
Definition: mod_main.f90:1255
real(sp), dimension(:), allocatable, target art
Definition: mod_main.f90:1009
real(sp), dimension(:), allocatable, target el
Definition: mod_main.f90:1134
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 iucp
Definition: mod_obcs.f90:110
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, 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
real(sp), dimension(:), allocatable, target pstx
Definition: mod_main.f90:1254
real(sp), dimension(:), allocatable, target grav_e
Definition: mod_main.f90:1013
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 ua
Definition: mod_main.f90:1103
real(sp), dimension(:), allocatable fluxobn
Definition: mod_obcs.f90:109
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
integer, dimension(:), allocatable, target isbce
Definition: mod_main.f90:1027
subroutine advave_edge_gcn(XFLUX, YFLUX)
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