My Project
adv_q.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 !==============================================================================|
42 ! Calculate the Turbulent Kinetic Energy and Mixing Length Based on |
43 ! The Mellor-Yamada Level 2.5 Turbulent Closure Model |
44 !==============================================================================|
45 
46  SUBROUTINE adv_q(Q,QF)
47 
48 !------------------------------------------------------------------------------|
49  USE mod_utils
50  USE all_vars
51  USE mod_par
52  USE mod_wd
53  USE mod_spherical
54  USE mod_northpole
55 
56 
57  IMPLICIT NONE
58  REAL(SP), DIMENSION(0:MT,KB) :: Q,QF,XFLUX
59  REAL(SP), DIMENSION(0:MT) :: PUPX,PUPY,PVPX,PVPY
60  REAL(SP), DIMENSION(0:MT) :: PQPX,PQPY,PQPXD,PQPYD,VISCOFF
61  REAL(SP), DIMENSION(3*(NT),KBM1) :: DTIJ
62  REAL(SP), DIMENSION(3*(NT),KBM1) :: UVN
63  REAL(SP) :: UTMP,VTMP,SITAI,FFD,FF1 !,X11,Y11,X22,Y22,X33,Y33,TMP1,TMP2,XI,YI
64  REAL(SP) :: DXA,DYA,DXB,DYB,FIJ1,FIJ2,UN
65  REAL(SP) :: TXX,TYY,FXX,FYY,VISCOF,EXFLUX,TEMP,STPOINT
66  REAL(SP) :: FACT,FM1
67  INTEGER :: I,I1,I2,IA,IB,J,J1,J2,K,JTMP,JJ,II
68  REAL(SP) :: Q1MIN, Q1MAX, Q2MIN, Q2MAX
69 
70 !!$# if defined (SPHERICAL)
71 !!$ REAL(DP) :: TY,TXPI,TYPI
72 !!$ REAL(DP) :: XTMP1,XTMP
73 !!$ REAL(DP) :: X1_DP,Y1_DP,X2_DP,Y2_DP,XII,YII
74 !!$ REAL(DP) :: X11_TMP,Y11_TMP,X33_TMP,Y33_TMP
75 !!$ REAL(DP) :: VX1_TMP,VY1_TMP,VX2_TMP,VY2_TMP
76 !!$ REAL(DP) :: TXPI_TMP,TYPI_TMP
77 !!$# endif
78 
79  REAL(SP) :: QMEAN1
80  REAL(SP), DIMENSION(0:NT,KB) :: UQ,VQ
81 
82  REAL(SP), ALLOCATABLE :: UQ1(:,:),VQ1(:,:)
83 
84 
85  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "Start: adv_q"
86 
87 !------------------------------------------------------------------------------!
88 
89  qmean1 = 1.e-8
90 
91  ALLOCATE(uq1(0,0))
92  ALLOCATE(vq1(0,0))
93 
94  SELECT CASE(horizontal_mixing_type)
95  CASE ('closure')
96  fact = 1.0_sp
97  fm1 = 0.0_sp
98  CASE('constant')
99  fact = 0.0_sp
100  fm1 = 1.0_sp
101  CASE DEFAULT
102  CALL fatal_error("UNKNOW HORIZONTAL MIXING TYPE:",&
103  & trim(horizontal_mixing_type) )
104  END SELECT
105 
106 !
107 !--Initialize Fluxes-----------------------------------------------------------!
108 !
109  qf = 0.0_sp
110  xflux = 0.0_sp
111 
112  uq = 0.0_sp
113  vq = 0.0_sp
114  uvn = 0.0_sp
115 
116 
117  DO k=2,kbm1
118  DO i=1,nt
119  uq(i,k) = (u(i,k)*dz1(i,k-1)+u(i,k-1)*dz1(i,k))/(dz1(i,k)+dz1(i,k-1))
120  vq(i,k) = (v(i,k)*dz1(i,k-1)+v(i,k-1)*dz1(i,k))/(dz1(i,k)+dz1(i,k-1))
121  END DO
122  END DO
123 
124 !
125 !--Loop Over Control Volume Sub-Edges And Calculate Normal Velocity------------!
126 !
127  DO i=1,ncv
128  i1=ntrg(i)
129 ! DTIJ(I)=DT1(I1)
130  DO k=2,kbm1
131  dtij(i,k)=dt1(i1)*dzz1(i1,k-1)
132  uvn(i,k) = vq(i1,k)*dltxe(i) - uq(i1,k)*dltye(i)
133 
134 
135  END DO
136  END DO
137 
138 !
139 !--Calculate the Advection and Horizontal Diffusion Terms----------------------!
140 !
141 
142  DO k=2,kbm1
143  pqpx = 0.0_sp
144  pqpy = 0.0_sp
145  pqpxd = 0.0_sp
146  pqpyd = 0.0_sp
147  DO i=1,m
148  DO j=1,ntsn(i)-1
149  i1=nbsn(i,j)
150  i2=nbsn(i,j+1)
151 
152 ! FFD=0.5_SP*(Q(I1,K)+Q(I2,K)-QMEAN1(I1,K)-QMEAN1(I2,K))
153  ffd=0.5_sp*(q(i1,k)+q(i2,k)-qmean1-qmean1)
154  ff1=0.5_sp*(q(i1,k)+q(i2,k))
155 
156 
157 !!$# if defined (SPHERICAL)
158 !!$ XTMP = VX(I2)*TPI-VX(I1)*TPI
159 !!$ XTMP1 = VX(I2)-VX(I1)
160 !!$ IF(XTMP1 > 180.0_SP)THEN
161 !!$ XTMP = -360.0_SP*TPI+XTMP
162 !!$ ELSE IF(XTMP1 < -180.0_SP)THEN
163 !!$ XTMP = 360.0_SP*TPI+XTMP
164 !!$ END IF
165 !!$ TXPI=XTMP*COS(DEG2RAD*VY(I))
166 !!$ TYPI=(VY(I1)-VY(I2))*TPI
167 !!$
168 !!$ ! ERROR HERE
169 !!$ IF(NODE_NORTHAREA(I) == 1)THEN
170 !!$ VX1_TMP = REARTH * COS(VY(I1)*DEG2RAD) * COS(VX(I1)*DEG2RAD) &
171 !!$ * 2._SP /(1._SP+sin(VY(I1)*DEG2RAD))
172 !!$ VY1_TMP = REARTH * COS(VY(I1)*DEG2RAD) * SIN(VX(I1)*DEG2RAD) &
173 !!$ * 2._SP /(1._SP+sin(VY(I1)*DEG2RAD))
174 !!$
175 !!$ VX2_TMP = REARTH * COS(VY(I2)*DEG2RAD) * COS(VX(I2)*DEG2RAD) &
176 !!$ * 2._SP /(1._SP+sin(VY(I2)*DEG2RAD))
177 !!$ VY2_TMP = REARTH * COS(VY(I2)*DEG2RAD) * SIN(VX(I2)*DEG2RAD) &
178 !!$ * 2._SP /(1._SP+sin(VY(I2)*DEG2RAD))
179 !!$
180 !!$ TXPI = (VX2_TMP-VX1_TMP)/(2._SP /(1._SP+sin(VY(I)*DEG2RAD)))
181 !!$ TYPI = (VY1_TMP-VY2_TMP)/(2._SP /(1._SP+sin(VY(I)*DEG2RAD)))
182 !!$ IF(I /= NODE_NORTHPOLE)THEN
183 !!$ TXPI_TMP = TYPI*COS(VX(I)*DEG2RAD)-TXPI*SIN(VX(I)*DEG2RAD)
184 !!$ TYPI_TMP = TXPI*COS(VX(I)*DEG2RAD)+TYPI*SIN(VX(I)*DEG2RAD)
185 !!$ TYPI_TMP = -TYPI_TMP
186 !!$
187 !!$ TXPI = TXPI_TMP
188 !!$ TYPI = TYPI_TMP
189 !!$ END IF
190 !!$ END IF
191 !!$ ! END ERROR
192 !!$
193 !!$
194 !!$ PQPX(I)=PQPX(I)+FF1*TYPI
195 !!$ PQPY(I)=PQPY(I)+FF1*TXPI
196 !!$ PQPXD(I)=PQPXD(I)+FFD*TYPI
197 !!$ PQPYD(I)=PQPYD(I)+FFD*TXPI
198 !!$# else
199 !!$ PQPX(I)=PQPX(I)+FF1*(VY(I1)-VY(I2))
200 !!$ PQPY(I)=PQPY(I)+FF1*(VX(I2)-VX(I1))
201 !!$ PQPXD(I)=PQPXD(I)+FFD*(VY(I1)-VY(I2))
202 !!$ PQPYD(I)=PQPYD(I)+FFD*(VX(I2)-VX(I1))
203 !!$# endif
204 
205  pqpx(i)=pqpx(i)+ff1*dltytrie(i,j)
206  pqpy(i)=pqpy(i)+ff1*dltxtrie(i,j)
207  pqpxd(i)=pqpxd(i)+ffd*dltytrie(i,j)
208  pqpyd(i)=pqpyd(i)+ffd*dltxtrie(i,j)
209 
210 
211  END DO
212  pqpx(i)=pqpx(i)/art2(i)
213  pqpy(i)=pqpy(i)/art2(i)
214  pqpxd(i)=pqpxd(i)/art2(i)
215  pqpyd(i)=pqpyd(i)/art2(i)
216  END DO
217 
218 
219 
220  DO i=1,m
221  viscoff(i) = (viscofh(i,k)*dz(i,k-1)+viscofh(i,k-1)*dz(i,k))/ &
222  (dz(i,k)+dz(i,k-1))
223  END DO
224 
225  DO i=1,ncv_i
226  ia=niec(i,1)
227  ib=niec(i,2)
228 !!$ XI=0.5_SP*(XIJE(I,1)+XIJE(I,2))
229 !!$ YI=0.5_SP*(YIJE(I,1)+YIJE(I,2))
230 !!$# if defined (SPHERICAL)
231 !!$ X1_DP=XIJE(I,1)
232 !!$ Y1_DP=YIJE(I,1)
233 !!$ X2_DP=XIJE(I,2)
234 !!$ Y2_DP=YIJE(I,2)
235 !!$ CALL ARCC(X2_DP,Y2_DP,X1_DP,Y1_DP,XII,YII)
236 !!$ XI=XII
237 !!$ XTMP = XI*TPI-VX(IA)*TPI
238 !!$ XTMP1 = XI-VX(IA)
239 !!$ IF(XTMP1 > 180.0_SP)THEN
240 !!$ XTMP = -360.0_SP*TPI+XTMP
241 !!$ ELSE IF(XTMP1 < -180.0_SP)THEN
242 !!$ XTMP = 360.0_SP*TPI+XTMP
243 !!$ END IF
244 !!$
245 !!$ DXA=XTMP*COS(DEG2RAD*VY(IA))
246 !!$ DYA=(YI-VY(IA))*TPI
247 !!$ XTMP = XI*TPI-VX(IB)*TPI
248 !!$ XTMP1 = XI-VX(IB)
249 !!$ IF(XTMP1 > 180.0_SP)THEN
250 !!$ XTMP = -360.0_SP*TPI+XTMP
251 !!$ ELSE IF(XTMP1 < -180.0_SP)THEN
252 !!$ XTMP = 360.0_SP*TPI+XTMP
253 !!$ END IF
254 !!$
255 !!$ DXB=XTMP*COS(DEG2RAD*VY(IB))
256 !!$ DYB=(YI-VY(IB))*TPI
257 !!$# else
258 !!$ DXA=XI-VX(IA)
259 !!$ DYA=YI-VY(IA)
260 !!$ DXB=XI-VX(IB)
261 !!$ DYB=YI-VY(IB)
262 !!$# endif
263 !!$
264 !!$ FIJ1=Q(IA,K)+DXA*PQPX(IA)+DYA*PQPY(IA)
265 !!$ FIJ2=Q(IB,K)+DXB*PQPX(IB)+DYB*PQPY(IB)
266 
267  fij1=q(ia,k)+dltxncve(i,1)*pqpx(ia)+dltyncve(i,1)*pqpy(ia)
268  fij2=q(ib,k)+dltxncve(i,2)*pqpx(ib)+dltyncve(i,2)*pqpy(ib)
269 
270 
271  q1min=minval(q(nbsn(ia,1:ntsn(ia)-1),k))
272  q1min=min(q1min, q(ia,k))
273  q1max=maxval(q(nbsn(ia,1:ntsn(ia)-1),k))
274  q1max=max(q1max, q(ia,k))
275  q2min=minval(q(nbsn(ib,1:ntsn(ib)-1),k))
276  q2min=min(q2min, q(ib,k))
277  q2max=maxval(q(nbsn(ib,1:ntsn(ib)-1),k))
278  q2max=max(q2max, q(ib,k))
279  IF(fij1 < q1min) fij1=q1min
280  IF(fij1 > q1max) fij1=q1max
281  IF(fij2 < q2min) fij2=q2min
282  IF(fij2 > q2max) fij2=q2max
283 
284  un=uvn(i,k)
285 
286 ! VISCOF=HORCON*(FACT*0.5_SP*(VISCOFF(IA)+VISCOFF(IB))/HPRNU + FM1)
287 ! VISCOF=HORCON*(FACT*0.5_SP*(VISCOFF(IA)+VISCOFF(IB)) + FM1)
288 
289  ! David moved HPRNU and added HVC
290  viscof=(fact*0.5_sp*(viscoff(ia)*nn_hvc(ia)+viscoff(ib)*nn_hvc(ib)) + fm1*0.5_sp*(nn_hvc(ia)+nn_hvc(ib)))/hprnu
291 
292  txx=0.5_sp*(pqpxd(ia)+pqpxd(ib))*viscof
293  tyy=0.5_sp*(pqpyd(ia)+pqpyd(ib))*viscof
294 
295  fxx=-dtij(i,k)*txx*dltye(i)
296  fyy= dtij(i,k)*tyy*dltxe(i)
297 
298 
299  exflux=-un*dtij(i,k)* &
300  ((1.0_sp+sign(1.0_sp,un))*fij2+(1.0_sp-sign(1.0_sp,un))*fij1)*0.5_sp+fxx+fyy
301 
302  xflux(ia,k)=xflux(ia,k)+exflux
303  xflux(ib,k)=xflux(ib,k)-exflux
304 
305  END DO
306 
307 
308  END DO !!SIGMA LOOP
309 
310 !
311 !-Accumulate Fluxes at Boundary Nodes
312 !
313 
314 
315 !--------------------------------------------------------------------
316 ! The central difference scheme in vertical advection
317 !--------------------------------------------------------------------
318  DO k=2,kbm1
319  DO i=1,m
320  IF(iswetn(i)*iswetnt(i) == 1) THEN
321  temp=wts(i,k-1)*q(i,k-1)-wts(i,k+1)*q(i,k+1)
322  xflux(i,k)=xflux(i,k)+temp*art1(i)*dzz(i,k-1)/(dz(i,k-1)+dz(i,k))
323  END IF
324  END DO
325  END DO !! SIGMA LOOP
326 
327 !
328 !--Update Q or QL-------------------------------------------------------------!
329 !
330 
331  DO i=1,m
332  IF(iswetn(i)*iswetnt(i) == 1 )THEN
333  DO k=2,kbm1
334  qf(i,k)=(q(i,k)-xflux(i,k)/art1(i)*(dti/(dt(i)*dzz(i,k-1))))*(dt(i)/d(i))
335  END DO
336  ELSE
337  DO k=2,kbm1
338  qf(i,k)=q(i,k)
339  END DO
340  END IF
341  END DO
342 
343  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "End: adv_q"
344 
345  END SUBROUTINE adv_q
346 !==============================================================================|
integer, dimension(:), allocatable, target ntsn
Definition: mod_main.f90:1023
real(sp), dimension(:), allocatable, target d
Definition: mod_main.f90:1132
real(sp), dimension(:,:), allocatable, target viscofh
Definition: mod_main.f90:1359
subroutine adv_q(Q, QF)
Definition: adv_q.f90:47
real(sp), dimension(:,:), allocatable, target v
Definition: mod_main.f90:1269
logical function dbg_set(vrb)
Definition: mod_utils.f90:182
real(sp), dimension(:,:), allocatable, target dltxncve
Definition: mod_main.f90:1059
real(sp), dimension(:), allocatable, target art1
Definition: mod_main.f90:1010
real(sp), dimension(:,:), allocatable, target dzz1
Definition: mod_main.f90:1097
real(sp), dimension(:,:), allocatable, target dltytrie
Definition: mod_main.f90:1063
real(sp), dimension(:,:), allocatable, target dltyncve
Definition: mod_main.f90:1060
real(sp), dimension(:), allocatable, target art2
Definition: mod_main.f90:1011
integer, dimension(:), allocatable, target ntrg
Definition: mod_main.f90:1033
real(sp), dimension(:,:), allocatable, target u
Definition: mod_main.f90:1268
integer, dimension(:,:), allocatable, target niec
Definition: mod_main.f90:1032
real(sp), dimension(:), allocatable, target dltye
Definition: mod_main.f90:1051
real(sp), dimension(:), allocatable nn_hvc
Definition: mod_main.f90:1303
real(sp), dimension(:,:), allocatable, target dzz
Definition: mod_main.f90:1093
real(sp), dimension(:,:), allocatable, target dz
Definition: mod_main.f90:1092
integer, dimension(:), allocatable iswetnt
Definition: mod_wd.f90:53
real(sp), dimension(:,:), allocatable, target dltxtrie
Definition: mod_main.f90:1064
real(sp), dimension(:), allocatable, target dt1
Definition: mod_main.f90:1117
subroutine fatal_error(ER1, ER2, ER3, ER4)
Definition: mod_utils.f90:230
real(sp), dimension(:,:), allocatable, target dz1
Definition: mod_main.f90:1096
integer, dimension(:,:), allocatable, target nbsn
Definition: mod_main.f90:1030
real(sp), dimension(:,:), allocatable, target wts
Definition: mod_main.f90:1321
real(sp), dimension(:), allocatable, target dltxe
Definition: mod_main.f90:1050
integer, parameter dbg_sbr
Definition: mod_utils.f90:69
real(sp), dimension(:), allocatable, target dt
Definition: mod_main.f90:1133
integer, dimension(:), allocatable iswetn
Definition: mod_wd.f90:51