My Project
Functions/Subroutines
advave_edge_gcy.f90 File Reference

Go to the source code of this file.

Functions/Subroutines

subroutine advave_edge_gcy (XFLUX, YFLUX)
 

Function/Subroutine Documentation

◆ advave_edge_gcy()

subroutine advave_edge_gcy ( real(sp), dimension(0:nt)  XFLUX,
real(sp), dimension(0:nt)  YFLUX 
)

Definition at line 47 of file advave_edge_gcy.f90.

47 !==============================================================================|
48 
49  USE all_vars
50  USE mod_utils
51  USE mod_spherical
52  USE mod_northpole
53  USE bcs
54  USE mod_obcs
55  USE mod_wd
56 
57 
58  IMPLICIT NONE
59  INTEGER :: I,J,K,IA,IB,J1,J2,K1,K2,K3,I1,I2
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
63  REAL(SP) :: VISCOF,VISCOF1,VISCOF2,TEMP
64  REAL(SP) :: XFLUX(0:NT),YFLUX(0:NT)
65  REAL(SP) :: FACT,FM1,ISWETTMP
66  REAL(SP) :: UAK1,UAK2,UAK3,VAK1,VAK2,VAK3
67 
68 
69  REAL(SP) :: UIJ1,VIJ1,UIJ2,VIJ2,FXX,FYY
70 
71  REAL(SP) :: BTPS
72  REAL(SP) :: U_TMP,V_TMP,UAC_TMP,VAC_TMP,WUSURF_TMP,WVSURF_TMP,WUBOT_TMP,WVBOT_TMP,UAF_TMP,VAF_TMP
73 
74  if(dbg_set(dbg_sbr)) write(ipt,*) "Start: advave_gcy.F"
75 
76 !------------------------------------------------------------------------------!
77 
78 
79  SELECT CASE(horizontal_mixing_type)
80  CASE ('closure')
81  fact = 1.0_sp
82  fm1 = 0.0_sp
83  CASE('constant')
84  fact = 0.0_sp
85  fm1 = 1.0_sp
86  CASE DEFAULT
87  CALL fatal_error("UNKNOW HORIZONTAL MIXING TYPE:",&
88  & trim(horizontal_mixing_type) )
89  END SELECT
90 
91 
92 !
93 !-------------------------INITIALIZE FLUXES------------------------------------!
94 !
95  xflux = 0.0_sp
96  yflux = 0.0_sp
97  pstx = 0.0_sp
98  psty = 0.0_sp
99 
100 !
101 !-------------------------ACCUMULATE FLUX OVER ELEMENT EDGES-------------------!
102 !
103 
104  DO i=1,ne
105  ia=iec(i,1)
106  ib=iec(i,2)
107  j1=ienode(i,1)
108  j2=ienode(i,2)
109 
110  dij=0.5_sp*(d(j1)+d(j2))
111  elij=0.5_sp*(el(j1)+el(j2))
112 
113 
114 
115 
116  IF(iswetce(ia)*iswetc(ia) == 1 .OR. iswetce(ib)*iswetc(ib) == 1)THEN
117 ! FLUX FROM LEFT
118  k1=nbe(ia,1)
119  k2=nbe(ia,2)
120  k3=nbe(ia,3)
121 
122  uak1 = ua(k1)
123  uak2 = ua(k2)
124  uak3 = ua(k3)
125  vak1 = va(k1)
126  vak2 = va(k2)
127  vak3 = va(k3)
128 
129  IF(k1 == 0) CALL ghostuv2(ia,1,uak1,vak1)
130  IF(k2 == 0) CALL ghostuv2(ia,2,uak2,vak2)
131  IF(k3 == 0) CALL ghostuv2(ia,3,uak3,vak3)
132 
133  cofa1=a1u(ia,1)*ua(ia)+a1u(ia,2)*uak1+a1u(ia,3)*uak2+a1u(ia,4)*uak3
134  cofa2=a2u(ia,1)*ua(ia)+a2u(ia,2)*uak1+a2u(ia,3)*uak2+a2u(ia,4)*uak3
135  cofa5=a1u(ia,1)*va(ia)+a1u(ia,2)*vak1+a1u(ia,3)*vak2+a1u(ia,4)*vak3
136  cofa6=a2u(ia,1)*va(ia)+a2u(ia,2)*vak1+a2u(ia,3)*vak2+a2u(ia,4)*vak3
137 
138  xij=xijc(i)-xc(ia)
139  yij=yijc(i)-yc(ia)
140  uij1=ua(ia)+cofa1*xij+cofa2*yij
141  vij1=va(ia)+cofa5*xij+cofa6*yij
142 
143 ! FLUX FROM RIGHT
144  k1=nbe(ib,1)
145  k2=nbe(ib,2)
146  k3=nbe(ib,3)
147 
148  uak1 = ua(k1)
149  uak2 = ua(k2)
150  uak3 = ua(k3)
151  vak1 = va(k1)
152  vak2 = va(k2)
153  vak3 = va(k3)
154 
155  IF(k1 == 0) CALL ghostuv2(ib,1,uak1,vak1)
156  IF(k2 == 0) CALL ghostuv2(ib,2,uak2,vak2)
157  IF(k3 == 0) CALL ghostuv2(ib,3,uak3,vak3)
158 
159  cofa3=a1u(ib,1)*ua(ib)+a1u(ib,2)*uak1+a1u(ib,3)*uak2+a1u(ib,4)*uak3
160  cofa4=a2u(ib,1)*ua(ib)+a2u(ib,2)*uak1+a2u(ib,3)*uak2+a2u(ib,4)*uak3
161  cofa7=a1u(ib,1)*va(ib)+a1u(ib,2)*vak1+a1u(ib,3)*vak2+a1u(ib,4)*vak3
162  cofa8=a2u(ib,1)*va(ib)+a2u(ib,2)*vak1+a2u(ib,3)*vak2+a2u(ib,4)*vak3
163 
164  xij=xijc(i)-xc(ib)
165  yij=yijc(i)-yc(ib)
166  uij2=ua(ib)+cofa3*xij+cofa4*yij
167  vij2=va(ib)+cofa7*xij+cofa8*yij
168 
169 ! NORMAL VELOCITY
170  uij=0.5_sp*(uij1+uij2)
171  vij=0.5_sp*(vij1+vij2)
172  un=-uij*dltyc(i) + vij*dltxc(i)
173 
174 !lwu
175 
176 ! VISCOSITY COEFFICIENT
177  viscof1=art(ia)*sqrt(cofa1**2+cofa6**2+0.5_sp*(cofa2+cofa5)**2)
178  viscof2=art(ib)*sqrt(cofa3**2+cofa8**2+0.5_sp*(cofa4+cofa7)**2)
179 ! VISCOF=HORCON*(FACT*0.5_SP*(VISCOF1+VISCOF2)/HPRNU + FM1)
180 ! VISCOF=HORCON*(FACT*0.5_SP*(VISCOF1+VISCOF2) + FM1)
181  ! David moved HPRNU and added HVC
182  viscof=(fact*0.5_sp*(viscof1*cc_hvc(ia)+viscof2*cc_hvc(ib)) + fm1*0.5_sp*(cc_hvc(ia)+cc_hvc(ib)))/hprnu
183 
184 ! SHEAR STRESSES
185  txxij=(cofa1+cofa3)*viscof
186  tyyij=(cofa6+cofa8)*viscof
187  txyij=0.5_sp*(cofa2+cofa4+cofa5+cofa7)*viscof
188  fxx=dij*(txxij*dltyc(i)-txyij*dltxc(i))
189  fyy=dij*(txyij*dltyc(i)-tyyij*dltxc(i))
190 
191 !lwu
192 
193 ! ADD CONVECTIVE AND VISCOUS FLUXES
194  xadv=dij*un*&
195  ((1.0_sp-sign(1.0_sp,un))*uij2+(1.0_sp+sign(1.0_sp,un))*uij1)*0.5_sp
196  yadv=dij*un* &
197  ((1.0_sp-sign(1.0_sp,un))*vij2+(1.0_sp+sign(1.0_sp,un))*vij1)*0.5_sp
198 
199 ! ACCUMULATE FLUX
200 ! XFLUX(IA)=XFLUX(IA)+XADV
201 ! YFLUX(IA)=YFLUX(IA)+YADV
202 ! XFLUX(IB)=XFLUX(IB)-XADV
203 ! YFLUX(IB)=YFLUX(IB)-YADV
204 
205  xflux(ia)=xflux(ia)+(xadv+fxx*epor(ia))*(1.0_sp-isbc(i))*iucp(ia)
206  yflux(ia)=yflux(ia)+(yadv+fyy*epor(ia))*(1.0_sp-isbc(i))*iucp(ia)
207  xflux(ib)=xflux(ib)-(xadv+fxx*epor(ib))*(1.0_sp-isbc(i))*iucp(ib)
208  yflux(ib)=yflux(ib)-(yadv+fyy*epor(ib))*(1.0_sp-isbc(i))*iucp(ib)
209 
210  END IF
211 
212 
213 ! ACCUMULATE BAROTROPIC FLUX
214 ! for spherical coordinator and domain across 360^o latitude
215  pstx(ia)=pstx(ia)-grav_e(ia)*d1(ia)*elij*dltyc(i)
216  psty(ia)=psty(ia)+grav_e(ia)*d1(ia)*elij*dltxc(i)
217  pstx(ib)=pstx(ib)+grav_e(ib)*d1(ib)*elij*dltyc(i)
218  psty(ib)=psty(ib)-grav_e(ib)*d1(ib)*elij*dltxc(i)
219 
220  END DO
221 
222 !# if !defined (SEMI_IMPLICIT)
223 
224  DO i = 1,n
225  iswettmp = iswetce(i)*iswetc(i)
226  xflux(i) = xflux(i)*iswettmp
227  yflux(i) = yflux(i)*iswettmp
228  END DO
229 
230 
231 
232 
233 !
234 !-------------------------SET BOUNDARY VALUES----------------------------------!
235 !
236 
237 ! MODIFY BOUNDARY FLUX
238  DO i=1,n
239  IF(isbce(i) == 2) THEN
240  xflux(i)=xflux(i)+fluxobn(i)*ua(i)*iucp(i)
241  yflux(i)=yflux(i)+fluxobn(i)*va(i)*iucp(i)
242  ENDIF
243  END DO
244 
245 ! ADJUST FLUX FOR RIVER INFLOW
246  IF(numqbc > 0) THEN
247  IF(river_inflow_location == 'node')THEN
248  DO k=1,numqbc
249  j=inodeq(k)
250  i1=nbve(j,1)
251  i2=nbve(j,ntve(j))
252  vlctyq(k)=qdis(k)/qarea(k)
253  xflux(i1)=xflux(i1)-0.5_sp*qdis(k)*vlctyq(k)*cos(angleq(k))
254  yflux(i1)=yflux(i1)-0.5_sp*qdis(k)*vlctyq(k)*sin(angleq(k))
255  xflux(i2)=xflux(i2)-0.5_sp*qdis(k)*vlctyq(k)*cos(angleq(k))
256  yflux(i2)=yflux(i2)-0.5_sp*qdis(k)*vlctyq(k)*sin(angleq(k))
257  END DO
258  ELSE IF(river_inflow_location == 'edge') THEN
259  DO k=1,numqbc
260  i1=icellq(k)
261  vlctyq(k)=qdis(k)/qarea(k)
262  temp=qdis(k)*vlctyq(k)
263  xflux(i1)=xflux(i1)-temp*cos(angleq(k))
264  yflux(i1)=yflux(i1)-temp*sin(angleq(k))
265  END DO
266  END IF
267  END IF
268 
269 
270 
271  RETURN
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
subroutine ghostuv2(I, JJ, UAKK, VAKK)
Definition: ghostuv.f90:44
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
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
Here is the call graph for this function: