My Project
Functions/Subroutines
vertvl_edge.f90 File Reference

Go to the source code of this file.

Functions/Subroutines

subroutine vertvl_edge
 

Function/Subroutine Documentation

◆ vertvl_edge()

subroutine vertvl_edge ( )

Definition at line 49 of file vertvl_edge.f90.

49 
50 !------------------------------------------------------------------------------|
51  USE all_vars
52  USE bcs
53  USE mod_wd
54  USE mod_northpole
55 
56 
57 
58 
59  IMPLICIT NONE
60  REAL(SP) :: XFLUX(MT,KBM1),WBOTTOM(MT)
61  REAL(SP) :: DIJ,UIJ,VIJ,UN,EXFLUX,TMP1,DIJ1,UIJ1,VIJ1
62  INTEGER :: I,K,IA,IB,I1,I2,I3,I4,J,JJ,J1,J2
63 !------------------------------------------------------------------------------|
64  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "Start: Vertvl_edge.F"
65 !----------------------INITIALIZE FLUX-----------------------------------------!
66 
67  xflux = 0.0_sp
68 
69 !----------------------ACCUMULATE FLUX-----------------------------------------!
70 
71 !!# if !defined (1)
72  DO i=1,ncv
73  i1=ntrg(i)
74  ia=niec(i,1)
75  ib=niec(i,2)
76 
77  DO k=1,kbm1
78  dij=dt1(i1)*dz1(i1,k)
79  uij=u(i1,k)
80  vij=v(i1,k)
81  exflux=dij*(-uij*dltye(i)+vij*dltxe(i))
82 
83 
84  xflux(ia,k)=xflux(ia,k)-exflux
85  xflux(ib,k)=xflux(ib,k)+exflux
86 
87 
88  END DO
89  END DO
90 !!# else
91 !! DO I=1,NCV
92 !! I1=NTRG(I)
93 !! IA=NIEC(I,1)
94 !! IB=NIEC(I,2)
95 
96 !! DO K=1,KBM1
97 !!# if !defined (SEMI_IMPLICIT)
98 !! DIJ=DT1(I1)*DZ1(I1,K)
99 !! UIJ=US(I1,K)
100 !! VIJ=VS(I1,K)
101 !! EXFLUX=DIJ*(-UIJ*DLTYE(I)+VIJ*DLTXE(I))
102 !!# else
103 !! DIJ=DT1(I1)*DZ1(I1,K)
104 !! DIJ1=D1(I1)*DZ1(I1,K)
105 !! UIJ=US(I1,K)
106 !! VIJ=VS(I1,K)
107 !! UIJ1=UF(I1,K)
108 !! VIJ1=VF(I1,K)
109 !! EXFLUX=( (1.0_SP-IFCETA)*DIJ*(-UIJ*DLTYE(I)+VIJ*DLTXE(I))+IFCETA*DIJ1*(-UIJ1*DLTYE(I)+VIJ1*DLTXE(I)) )*ISWETCT(I1)*ISWETC(I1)
110 !!# endif
111 !! XFLUX(IA,K)=XFLUX(IA,K)-EXFLUX
112 !! XFLUX(IB,K)=XFLUX(IB,K)+EXFLUX
113 !! END DO
114 !! END DO
115 !!# endif
116 
117 
118 !-----------------------NULLIFY BOUNDARY FLUX----------------------------------!
119 ! For "tide + meanflow"/"meanflow only" case, this part should be commented out;
120 ! For "tide only" case, this part may be kept.
121 ! However, the effect of this term is small from my experience.
122 
123  DO i=1,m
124  DO k=1,kbm1
125  IF(isonb(i) == 2) xflux(i,k)=0.0_sp
126  ENDDO
127  ENDDO
128 ! can be changed to (no IF statements)
129 ! DO I=1,IOBCN
130 ! DO K=1,KBM1
131 ! XFLUX(I_OBC_N(I),K)=0.0_SP
132 ! ENDDO
133 ! ENDDO
134 
135 
136 
137 !-----------------------FRESH WATER INFLOW-------------------------------------!
138 
139  IF(numqbc >= 1) THEN
140  IF(river_inflow_location == 'node') THEN
141  DO j=1,numqbc
142  jj=inodeq(j)
143  DO k=1,kbm1
144  xflux(jj,k)=xflux(jj,k)-qdis(j)*vqdist(j,k) !/DZ(JJ,K)
145  END DO
146  END DO
147  ELSE IF(river_inflow_location == 'edge') THEN
148  DO j=1,numqbc
149  j1=n_icellq(j,1)
150  j2=n_icellq(j,2)
151  DO k=1,kbm1
152  xflux(j1,k)=xflux(j1,k)-qdis(j)*rdisq(j,1)*vqdist(j,k) !/DZ1(J1,K)
153  xflux(j2,k)=xflux(j2,k)-qdis(j)*rdisq(j,2)*vqdist(j,k) !/DZ1(J2,K)
154  END DO
155  END DO
156  END IF
157  END IF
158 
159 
160 !---IF NO FRESH WATER INFLOW, OMEGA IS ZERO AT FREE SURFACE AND BOTTOM---------!
161 
162  !CLEAR OLD VALUES
163  wbottom = 0.0_sp
164  wts = 0.0_sp
165 
166 
167 ! QXU changed sign of evap/precip
168  wts(:,1) = -(qevap+qprec)*rofvros
169 
170 
171  ! SET BOTTOM VELOCITY
172  wbottom(1:m)= bfwdis(1:m)/art1(1:m)
173 
174 !--------------------------CALCULATE OMEGA-------------------------------------!
175 
176  DO i=1,m
177  IF(iswetnt(i)*iswetn(i) == 1)THEN
178  DO k=1,kbm1
179 ! WTS(I,K+1)=WTS(I,K)+DZ(I,K)*(XFLUX(I,K)/ART1(I)+(EL(I)-ET(I))/DTI)
180  wts(i,k+1)=wts(i,k)+xflux(i,k)/art1(i)+dz(i,k)*(d(i)-dt(i))/dti
181  END DO
182  ELSE
183  DO k=1,kbm1
184  wts(i,k+1)=0.0_sp
185  END DO
186  END IF
187  END DO
188 
189 
190 !-------------------------ADJUSTMENT FOR DAM MODULE----------------------------
191 
192 !# if defined (THIN_DAM)
193 ! DO I=1,NODE_DAM1_N
194 ! I1 = I_NODE_DAM1_N(I,1)
195 ! I2 = I_NODE_DAM1_N(I,2)
196 ! if(i1==nlid(2944).or.i2==nlid(2944))print*,'orginal 2944:'&
197 ! &,kdam(nlid(2944)),wts(nlid(2944),3)
198 ! if(i1==nlid(4851).or.i2==nlid(4851))print*,'orginal 4851:'&
199 ! &,kdam(nlid(4851)),wts(nlid(4851),3)
200 !
201 !# if defined (1)
202 ! IF(ISWETNT(I1)*ISWETN(I1) == 1)THEN
203 !# endif
204 ! DO K=1,KDAM(I1)
205 ! WTS(I1,K+1)=WTS(I1,K)+(XFLUX(I1,K)+XFLUX(I2,K))/ &
206 ! (ART1(I1)+ART1(I2))+DZ(I1,K)*(D(I1)-DT(I1))/DTI
207 ! END DO
208 ! DO K=KDAM(I1)+1,KBM1
209 ! WTS(I1,K+1)=WTS(I1,K)+XFLUX(I1,K)/ART1(I1)+DZ(I1,K)*(D(I1)-DT(I1))/DTI
210 ! END DO
211 !# if defined (1)
212 ! ELSE
213 ! DO K=1,KBM1
214 ! WTS(I1,K+1)=0.0_SP
215 ! END DO
216 ! END IF
217 !# endif
218 !
219 !# if defined (1)
220 ! IF(ISWETNT(I2)*ISWETN(I2) == 1)THEN
221 !# endif
222 ! DO K=1,KDAM(I2)
223 ! WTS(I2,K+1)=WTS(I2,K)+(XFLUX(I1,K)+XFLUX(I2,K))/ &
224 ! (ART1(I1)+ART1(I2))+DZ(I2,K)*(D(I2)-DT(I2))/DTI
225 ! END DO
226 ! DO K=KDAM(I2)+1,KBM1
227 ! WTS(I2,K+1)=WTS(I2,K)+XFLUX(I2,K)/ART1(I2)+DZ(I2,K)*(D(I2)-DT(I2))/DTI
228 ! END DO
229 !# if defined (1)
230 ! ELSE
231 ! DO K=1,KBM1
232 ! WTS(I2,K+1)=0.0_SP
233 ! END DO
234 ! END IF
235 !# endif
236 ! if(i1==nlid(2944).or.i2==nlid(2944))print*,'adjusted 2944:'&
237 ! &,kdam(nlid(2944)),wts(nlid(2944),3)
238 ! if(i1==nlid(4851).or.i2==nlid(4851))print*,'adjusted 4851:'&
239 ! &,kdam(nlid(4851)),wts(nlid(4851),3)
240 ! END DO
241 
242 
243 ! DO I=1,NODE_DAM2_N
244 ! I1 = I_NODE_DAM2_N(I,1)
245 ! I2 = I_NODE_DAM2_N(I,2)
246 ! I3 = I_NODE_DAM2_N(I,3)
247 !# if defined (1)
248 ! IF(ISWETNT(I1)*ISWETN(I1) == 1)THEN
249 !# endif
250 ! DO K=1,KDAM(I1)
251 ! WTS(I1,K+1)=WTS(I1,K)+(XFLUX(I1,K)+XFLUX(I2,K)+XFLUX(I3,K))/ &
252 ! (ART1(I1)+ART1(I2)+ART1(I3))+DZ(I1,K)*(D(I1)-DT(I1))/DTI
253 ! END DO
254 ! DO K=KDAM(I1)+1,KBM1
255 ! WTS(I1,K+1)=WTS(I1,K)+XFLUX(I1,K)/ART1(I1)+DZ(I1,K)*(D(I1)-DT(I1))/DTI
256 ! END DO
257 !# if defined (1)
258 ! ELSE
259 ! DO K=1,KBM1
260 ! WTS(I1,K+1)=0.0_SP
261 ! END DO
262 ! END IF
263 !# endif
264 !
265 !# if defined (1)
266 ! IF(ISWETNT(I2)*ISWETN(I2) == 1)THEN
267 !# endif
268 ! DO K=1,KDAM(I2)
269 ! WTS(I2,K+1)=WTS(I2,K)+(XFLUX(I1,K)+XFLUX(I2,K)+XFLUX(I3,K))/ &
270 ! (ART1(I1)+ART1(I2)+ART1(I3))+DZ(I2,K)*(D(I2)-DT(I2))/DTI
271 ! END DO
272 ! DO K=KDAM(I2)+1,KBM1
273 ! WTS(I2,K+1)=WTS(I2,K)+XFLUX(I2,K)/ART1(I2)+DZ(I2,K)*(D(I2)-DT(I2))/DTI
274 ! END DO
275 !# if defined (1)
276 ! ELSE
277 ! DO K=1,KBM1
278 ! WTS(I2,K+1)=0.0_SP
279 ! END DO
280 ! END IF
281 !# endif
282 !
283 !# if defined (1)
284 ! IF(ISWETNT(I3)*ISWETN(I3) == 1)THEN
285 !# endif
286 ! DO K=1,KDAM(I3)
287 ! WTS(I3,K+1)=WTS(I3,K)+(XFLUX(I1,K)+XFLUX(I2,K)+XFLUX(I3,K))/ &
288 ! (ART1(I1)+ART1(I2)+ART1(I3))+DZ(I3,K)*(D(I3)-DT(I3))/DTI
289 ! END DO
290 ! DO K=KDAM(I3)+1,KBM1
291 ! WTS(I3,K+1)=WTS(I3,K)+XFLUX(I3,K)/ART1(I3)+DZ(I3,K)*(D(I3)-DT(I3))/DTI
292 ! END DO
293 !# if defined (1)
294 ! ELSE
295 ! DO K=1,KBM1
296 ! WTS(I3,K+1)=0.0_SP
297 ! END DO
298 ! END IF
299 !# endif
300 ! END DO
301 !
302 ! DO I=1,NODE_DAM3_N
303 ! I1 = I_NODE_DAM3_N(I,1)
304 ! I2 = I_NODE_DAM3_N(I,2)
305 ! I3 = I_NODE_DAM3_N(I,3)
306 ! I4 = I_NODE_DAM3_N(I,4)
307 !# if defined (1)
308 ! IF(ISWETNT(I1)*ISWETN(I1) == 1)THEN
309 !# endif
310 ! DO K=1,KDAM(I1)
311 ! WTS(I1,K+1)=WTS(I1,K)+(XFLUX(I1,K)+XFLUX(I2,K)+XFLUX(I3,K)+XFLUX(I4,K))/ &
312 ! (ART1(I1)+ART1(I2)+ART1(I3)+ART1(I4))+ &
313 ! DZ(I1,K)*(D(I1)-DT(I1))/DTI
314 ! END DO
315 ! DO K=KDAM(I1)+1,KBM1
316 ! WTS(I1,K+1)=WTS(I1,K)+XFLUX(I1,K)/ART1(I1)+DZ(I1,K)*(D(I1)-DT(I1))/DTI
317 ! END DO
318 !# if defined (1)
319 ! ELSE
320 ! DO K=1,KBM1
321 ! WTS(I1,K+1)=0.0_SP
322 ! END DO
323 ! END IF
324 !# endif
325 !
326 !# if defined (1)
327 ! IF(ISWETNT(I2)*ISWETN(I2) == 1)THEN
328 !# endif
329 ! DO K=1,KDAM(I2)
330 ! WTS(I2,K+1)=WTS(I2,K)+(XFLUX(I1,K)+XFLUX(I2,K)+XFLUX(I3,K)+XFLUX(I4,K))/ &
331 ! (ART1(I1)+ART1(I2)+ART1(I3)+ART1(I4))+ &
332 ! DZ(I2,K)*(D(I2)-DT(I2))/DTI
333 ! END DO
334 ! DO K=KDAM(I2)+1,KBM1
335 ! WTS(I2,K+1)=WTS(I2,K)+XFLUX(I2,K)/ART1(I2)+DZ(I2,K)*(D(I2)-DT(I2))/DTI
336 ! END DO
337 !# if defined (1)
338 ! ELSE
339 ! DO K=1,KBM1
340 ! WTS(I2,K+1)=0.0_SP
341 ! END DO
342 ! END IF
343 !# endif
344 !
345 !# if defined (1)
346 ! IF(ISWETNT(I3)*ISWETN(I3) == 1)THEN
347 !# endif
348 ! DO K=1,KDAM(I3)
349 ! WTS(I3,K+1)=WTS(I3,K)+(XFLUX(I1,K)+XFLUX(I2,K)+XFLUX(I3,K)+XFLUX(I4,K))/ &
350 ! (ART1(I1)+ART1(I2)+ART1(I3)+ART1(I4))+ &
351 ! DZ(I3,K)*(D(I3)-DT(I3))/DTI
352 ! END DO
353 ! DO K=KDAM(I3)+1,KBM1
354 ! WTS(I3,K+1)=WTS(I3,K)+XFLUX(I3,K)/ART1(I3)+DZ(I3,K)*(D(I3)-DT(I3))/DTI
355 ! END DO
356 !# if defined (1)
357 ! ELSE
358 ! DO K=1,KBM1
359 ! WTS(I3,K+1)=0.0_SP
360 ! END DO
361 ! END IF
362 !# endif
363 !
364 !# if defined (1)
365 ! IF(ISWETNT(I4)*ISWETN(I4) == 1)THEN
366 !# endif
367 ! DO K=1,KDAM(I4)
368 ! WTS(I4,K+1)=WTS(I4,K)+(XFLUX(I1,K)+XFLUX(I2,K)+XFLUX(I3,K)+XFLUX(I4,K))/ &
369 ! (ART1(I1)+ART1(I2)+ART1(I3)+ART1(I4))+ &
370 ! DZ(I4,K)*(D(I4)-DT(I4))/DTI
371 ! END DO
372 ! DO K=KDAM(I4)+1,KBM1
373 ! WTS(I4,K+1)=WTS(I4,K)+XFLUX(I4,K)/ART1(I4)+DZ(I4,K)*(D(I4)-DT(I4))/DTI
374 ! END DO
375 !# if defined (1)
376 ! ELSE
377 ! DO K=1,KBM1
378 ! WTS(I4,K+1)=0.0_SP
379 ! END DO
380 ! END IF
381 !# endif
382 ! END DO
383 !
384 !# endif
385 
386 !--------------------------ADJUST OMEGA----------------------------------------!
387 ! IMPROVES MASS CONSERVATION
388 
389  DO i=1,m
390  IF(abs(wts(i,kb)-wbottom(i)) > 1.0e-7_sp)THEN
391  IF(isonb(i) /= 2)THEN
392  tmp1=elf(i)*float(kbm1)-(wts(i,kb)-wbottom(i))*dti/dz(i,1)
393  tmp1=tmp1/float(kbm1)
394 
395 
396  dtfa(i)=tmp1+h(i)
397 
398  DO k=2,kb
399  wts(i,k)=wts(i,k)-float(k-1)/float(kbm1)*(wts(i,kb)-wbottom(i))
400  END DO
401  END IF
402  END IF
403  END DO
404 
405 !
406 !----TRANSFER OMEGA TO FACE CENTER---------------------------------------------!
407 !
408 
409  DO i=1,n
410  DO k=1,kb
411  w(i,k) = one_third*(wts(nv(i,1),k)+wts(nv(i,2),k)+wts(nv(i,3),k))
412  END DO
413  END DO
414 
415  DO i=1,n
416  DO k=1,kb
417  w(i,k) = float(iswetc(i))*w(i,k)
418  END DO
419  END DO
420 
421  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "End: Vertvl_edge.F"
422 
423  RETURN
real(sp), dimension(:), allocatable, target d
Definition: mod_main.f90:1132
real(sp), dimension(:), allocatable, target qprec
Definition: mod_main.f90:1239
real(sp), dimension(:), allocatable, target h
Definition: mod_main.f90:1131
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
integer ncv
Definition: mod_main.f90:74
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 w
Definition: mod_main.f90:1279
real(sp) dti
Definition: mod_main.f90:844
integer m
Definition: mod_main.f90:56
integer, dimension(:), allocatable, target ntrg
Definition: mod_main.f90:1033
real(sp), dimension(:,:), allocatable, target u
Definition: mod_main.f90:1268
real(dp), parameter rofvros
Definition: mod_main.f90:887
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
integer kb
Definition: mod_main.f90:64
integer n
Definition: mod_main.f90:55
real(sp), dimension(:), allocatable, target elf
Definition: mod_main.f90:1140
real(sp), dimension(:), allocatable, target bfwdis
Definition: mod_main.f90:1196
integer, dimension(:,:), allocatable, target nv
Definition: mod_main.f90:1018
integer, dimension(:,:), allocatable, target n_icellq
Definition: mod_main.f90:1216
real(sp), dimension(:), allocatable, target qevap
Definition: mod_main.f90:1240
real(sp), dimension(:,:), allocatable, target dz
Definition: mod_main.f90:1092
integer, dimension(:), allocatable iswetnt
Definition: mod_wd.f90:53
integer, dimension(:), allocatable iswetc
Definition: mod_wd.f90:52
real(sp), dimension(:), allocatable, target dt1
Definition: mod_main.f90:1117
integer numqbc
Definition: mod_main.f90:57
real(sp), dimension(:,:), allocatable, target dz1
Definition: mod_main.f90:1096
real(dp), parameter one_third
Definition: mod_main.f90:883
real(sp), dimension(:,:), allocatable, target wts
Definition: mod_main.f90:1321
integer ipt
Definition: mod_main.f90:922
real(sp), dimension(:), allocatable, target dltxe
Definition: mod_main.f90:1050
integer, parameter dbg_sbr
Definition: mod_utils.f90:69
character(len=80) river_inflow_location
Definition: mod_main.f90:540
integer kbm1
Definition: mod_main.f90:65
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
Here is the caller graph for this function: