/[MITgcm]/MITgcm/pkg/mom_common/mom_calc_visc.F
ViewVC logotype

Contents of /MITgcm/pkg/mom_common/mom_calc_visc.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.44 - (show annotations) (download)
Tue May 3 19:32:35 2011 UTC (13 years, 1 month ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64i, checkpoint64h, checkpoint64k, checkpoint64j, checkpoint64a, checkpoint64c, checkpoint64b, checkpoint64e, checkpoint64d, checkpoint64g, checkpoint64f, checkpoint63p, checkpoint63q, checkpoint63r, checkpoint63s, checkpoint63l, checkpoint63m, checkpoint63n, checkpoint63o, checkpoint63h, checkpoint63i, checkpoint63j, checkpoint63k, checkpoint63d, checkpoint63e, checkpoint63f, checkpoint63g, checkpoint63a, checkpoint63b, checkpoint63c, checkpoint64, checkpoint63, checkpoint62z, checkpoint62y, checkpoint62x
Changes since 1.43: +18 -12 lines
OBC in momentum: multiply gradient of vorticity (Leith) by maskInW,S

1 C $Header: /u/gcmpack/MITgcm/pkg/mom_common/mom_calc_visc.F,v 1.43 2010/02/17 00:21:35 gforget Exp $
2 C $Name: $
3
4 #include "MOM_COMMON_OPTIONS.h"
5
6
7 SUBROUTINE MOM_CALC_VISC(
8 I bi,bj,k,
9 O viscAh_Z,viscAh_D,viscA4_Z,viscA4_D,
10 O harmonic,biharmonic,useVariableViscosity,
11 I hDiv,vort3,tension,strain,KE,hFacZ,
12 I myThid)
13
14 IMPLICIT NONE
15 C
16 C Calculate horizontal viscosities (L is typical grid width)
17 C harmonic viscosity=
18 C viscAh (or viscAhD on div pts and viscAhZ on zeta pts)
19 C +0.25*L**2*viscAhGrid/deltaT
20 C +sqrt((viscC2leith/pi)**6*grad(Vort3)**2
21 C +(viscC2leithD/pi)**6*grad(hDiv)**2)*L**3
22 C +(viscC2smag/pi)**2*L**2*sqrt(Tension**2+Strain**2)
23 C
24 C biharmonic viscosity=
25 C viscA4 (or viscA4D on div pts and viscA4Z on zeta pts)
26 C +0.25*0.125*L**4*viscA4Grid/deltaT (approx)
27 C +0.125*L**5*sqrt((viscC4leith/pi)**6*grad(Vort3)**2
28 C +(viscC4leithD/pi)**6*grad(hDiv)**2)
29 C +0.125*L**4*(viscC4smag/pi)**2*sqrt(Tension**2+Strain**2)
30 C
31 C Note that often 0.125*L**2 is the scale between harmonic and
32 C biharmonic (see Griffies and Hallberg (2000))
33 C This allows the same value of the coefficient to be used
34 C for roughly similar results with biharmonic and harmonic
35 C
36 C LIMITERS -- limit min and max values of viscosities
37 C viscAhReMax is min value for grid point harmonic Reynolds num
38 C harmonic viscosity>sqrt(2*KE)*L/viscAhReMax
39 C
40 C viscA4ReMax is min value for grid point biharmonic Reynolds num
41 C biharmonic viscosity>sqrt(2*KE)*L**3/8/viscA4ReMax
42 C
43 C viscAhgridmax is CFL stability limiter for harmonic viscosity
44 C harmonic viscosity<0.25*viscAhgridmax*L**2/deltaT
45 C
46 C viscA4gridmax is CFL stability limiter for biharmonic viscosity
47 C biharmonic viscosity<viscA4gridmax*L**4/32/deltaT (approx)
48 C
49 C viscAhgridmin and viscA4gridmin are lower limits for viscosity:
50 C harmonic viscosity>0.25*viscAhgridmin*L**2/deltaT
51 C biharmonic viscosity>viscA4gridmin*L**4/32/deltaT (approx)
52
53
54 C
55 C RECOMMENDED VALUES
56 C viscC2Leith=1-3
57 C viscC2LeithD=1-3
58 C viscC4Leith=1-3
59 C viscC4LeithD=1.5-3
60 C viscC2smag=2.2-4 (Griffies and Hallberg,2000)
61 C 0.2-0.9 (Smagorinsky,1993)
62 C viscC4smag=2.2-4 (Griffies and Hallberg,2000)
63 C viscAhReMax>=1, (<2 suppresses a computational mode)
64 C viscA4ReMax>=1, (<2 suppresses a computational mode)
65 C viscAhgridmax=1
66 C viscA4gridmax=1
67 C viscAhgrid<1
68 C viscA4grid<1
69 C viscAhgridmin<<1
70 C viscA4gridmin<<1
71
72 C == Global variables ==
73 #include "SIZE.h"
74 #include "GRID.h"
75 #include "EEPARAMS.h"
76 #include "PARAMS.h"
77 #ifdef ALLOW_NONHYDROSTATIC
78 #include "NH_VARS.h"
79 #endif
80 #ifdef ALLOW_AUTODIFF_TAMC
81 #include "tamc.h"
82 #include "tamc_keys.h"
83 #endif /* ALLOW_AUTODIFF_TAMC */
84 #include "MOM_VISC.h"
85 #if defined (ALLOW_3D_VISCAH) || defined (ALLOW_3D_VISCA4)
86 #include "DYNVARS.h"
87 #endif
88
89 C == Routine arguments ==
90 INTEGER bi,bj,k
91 _RL viscAh_Z(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
92 _RL viscAh_D(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
93 _RL viscA4_Z(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
94 _RL viscA4_D(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
95 _RL hDiv(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
96 _RL vort3(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
97 _RL tension(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
98 _RL strain(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
99 _RL KE(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
100 _RS hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
101 INTEGER myThid
102 LOGICAL harmonic,biharmonic,useVariableViscosity
103
104 C == Local variables ==
105 INTEGER i,j
106 #ifdef ALLOW_NONHYDROSTATIC
107 INTEGER kp1
108 #endif
109 #ifdef ALLOW_AUTODIFF_TAMC
110 INTEGER lockey_1, lockey_2
111 #endif
112 _RL smag2fac, smag4fac
113 _RL leith2fac, leith4fac
114 _RL leithD2fac, leithD4fac
115 _RL viscAhRe_max, viscA4Re_max
116 _RL Alin,grdVrt,grdDiv, keZpt
117 _RL L2,L3,L5,L2rdt,L4rdt
118 _RL Uscl,U4scl
119 _RL divDx(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
120 _RL divDy(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
121 _RL vrtDx(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
122 _RL vrtDy(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
123 _RL viscAh_ZMax(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
124 _RL viscAh_DMax(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
125 _RL viscA4_ZMax(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
126 _RL viscA4_DMax(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
127 _RL viscAh_ZMin(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
128 _RL viscAh_DMin(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
129 _RL viscA4_ZMin(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
130 _RL viscA4_DMin(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
131 _RL viscAh_ZLth(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
132 _RL viscAh_DLth(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
133 _RL viscA4_ZLth(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
134 _RL viscA4_DLth(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
135 _RL viscAh_ZLthD(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
136 _RL viscAh_DLthD(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
137 _RL viscA4_ZLthD(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
138 _RL viscA4_DLthD(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
139 _RL viscAh_ZSmg(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
140 _RL viscAh_DSmg(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
141 _RL viscA4_ZSmg(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
142 _RL viscA4_DSmg(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
143 LOGICAL calcLeith, calcSmag
144
145 #ifdef ALLOW_AUTODIFF_TAMC
146 act1 = bi - myBxLo(myThid)
147 max1 = myBxHi(myThid) - myBxLo(myThid) + 1
148 act2 = bj - myByLo(myThid)
149 max2 = myByHi(myThid) - myByLo(myThid) + 1
150 act3 = myThid - 1
151 max3 = nTx*nTy
152 act4 = ikey_dynamics - 1
153 ikey = (act1 + 1) + act2*max1
154 & + act3*max1*max2
155 & + act4*max1*max2*max3
156 lockey_1 = (ikey-1)*Nr + k
157 #endif /* ALLOW_AUTODIFF_TAMC */
158
159 C-- Set flags which are used in this S/R and elsewhere :
160 useVariableViscosity=
161 & (viscAhGrid.NE.0.)
162 & .OR.(viscA4Grid.NE.0.)
163 & .OR.(viscC2leith.NE.0.)
164 & .OR.(viscC2leithD.NE.0.)
165 & .OR.(viscC4leith.NE.0.)
166 & .OR.(viscC4leithD.NE.0.)
167 & .OR.(viscC2smag.NE.0.)
168 & .OR.(viscC4smag.NE.0.)
169 #ifdef ALLOW_3D_VISCAH
170 & .OR.( viscAhDfile .NE. ' ' )
171 & .OR.( viscAhZfile .NE. ' ' )
172 #endif
173 #ifdef ALLOW_3D_VISCA4
174 & .OR.( viscA4Dfile .NE. ' ' )
175 & .OR.( viscA4Zfile .NE. ' ' )
176 #endif
177
178 harmonic=
179 & (viscAh.NE.0.)
180 & .OR.(viscAhD.NE.0.)
181 & .OR.(viscAhZ.NE.0.)
182 & .OR.(viscAhGrid.NE.0.)
183 & .OR.(viscC2leith.NE.0.)
184 & .OR.(viscC2leithD.NE.0.)
185 & .OR.(viscC2smag.NE.0.)
186 #ifdef ALLOW_3D_VISCAH
187 & .OR.( viscAhDfile .NE. ' ' )
188 & .OR.( viscAhZfile .NE. ' ' )
189 #endif
190
191 biharmonic=
192 & (viscA4.NE.0.)
193 & .OR.(viscA4D.NE.0.)
194 & .OR.(viscA4Z.NE.0.)
195 & .OR.(viscA4Grid.NE.0.)
196 & .OR.(viscC4leith.NE.0.)
197 & .OR.(viscC4leithD.NE.0.)
198 & .OR.(viscC4smag.NE.0.)
199 #ifdef ALLOW_3D_VISCA4
200 & .OR.( viscA4Dfile .NE. ' ' )
201 & .OR.( viscA4Zfile .NE. ' ' )
202 #endif
203
204 IF (useVariableViscosity) THEN
205 C---- variable viscosity :
206
207 IF ((harmonic).AND.(viscAhReMax.NE.0.)) THEN
208 viscAhRe_max=SQRT(2. _d 0)/viscAhReMax
209 ELSE
210 viscAhRe_max=0. _d 0
211 ENDIF
212
213 IF ((biharmonic).AND.(viscA4ReMax.NE.0.)) THEN
214 viscA4Re_max=0.125 _d 0*SQRT(2. _d 0)/viscA4ReMax
215 ELSE
216 viscA4Re_max=0. _d 0
217 ENDIF
218
219 calcLeith=
220 & (viscC2leith.NE.0.)
221 & .OR.(viscC2leithD.NE.0.)
222 & .OR.(viscC4leith.NE.0.)
223 & .OR.(viscC4leithD.NE.0.)
224
225 calcSmag=
226 & (viscC2smag.NE.0.)
227 & .OR.(viscC4smag.NE.0.)
228
229 IF (calcSmag) THEN
230 smag2fac=(viscC2smag/pi)**2
231 smag4fac=0.125 _d 0*(viscC4smag/pi)**2
232 ELSE
233 smag2fac=0. _d 0
234 smag4fac=0. _d 0
235 ENDIF
236
237 IF (calcLeith) THEN
238 IF (useFullLeith) THEN
239 leith2fac =(viscC2leith /pi)**6
240 leithD2fac=(viscC2leithD/pi)**6
241 leith4fac =0.015625 _d 0*(viscC4leith /pi)**6
242 leithD4fac=0.015625 _d 0*(viscC4leithD/pi)**6
243 ELSE
244 leith2fac =(viscC2leith /pi)**3
245 leithD2fac=(viscC2leithD/pi)**3
246 leith4fac =0.125 _d 0*(viscC4leith /pi)**3
247 leithD4fac=0.125 _d 0*(viscC4leithD/pi)**3
248 ENDIF
249 ELSE
250 leith2fac=0. _d 0
251 leith4fac=0. _d 0
252 leithD2fac=0. _d 0
253 leithD4fac=0. _d 0
254 ENDIF
255
256 #ifdef ALLOW_AUTODIFF_TAMC
257 cphtest IF ( calcLeith .OR. calcSmag ) THEN
258 cphtest STOP 'calcLeith or calcSmag not implemented for ADJOINT'
259 cphtest ENDIF
260 #endif
261 DO j=1-Oly,sNy+Oly
262 DO i=1-Olx,sNx+Olx
263 viscAh_D(i,j)=viscAhD
264 viscAh_Z(i,j)=viscAhZ
265 viscA4_D(i,j)=viscA4D
266 viscA4_Z(i,j)=viscA4Z
267 c
268 visca4_zsmg(i,j) = 0. _d 0
269 viscah_zsmg(i,j) = 0. _d 0
270 c
271 viscAh_Dlth(i,j) = 0. _d 0
272 viscA4_Dlth(i,j) = 0. _d 0
273 viscAh_DlthD(i,j)= 0. _d 0
274 viscA4_DlthD(i,j)= 0. _d 0
275 c
276 viscAh_DSmg(i,j) = 0. _d 0
277 viscA4_DSmg(i,j) = 0. _d 0
278 c
279 viscAh_ZLth(i,j) = 0. _d 0
280 viscA4_ZLth(i,j) = 0. _d 0
281 viscAh_ZLthD(i,j)= 0. _d 0
282 viscA4_ZLthD(i,j)= 0. _d 0
283 ENDDO
284 ENDDO
285
286 C- Initialise to zero gradient of vorticity & divergence:
287 DO j=1-Oly,sNy+Oly
288 DO i=1-Olx,sNx+Olx
289 divDx(i,j) = 0.
290 divDy(i,j) = 0.
291 vrtDx(i,j) = 0.
292 vrtDy(i,j) = 0.
293 ENDDO
294 ENDDO
295
296 IF (calcLeith) THEN
297 C horizontal gradient of horizontal divergence:
298
299 C- gradient in x direction:
300 cph-exch2#ifndef ALLOW_AUTODIFF_TAMC
301 IF (useCubedSphereExchange) THEN
302 C to compute d/dx(hDiv), fill corners with appropriate values:
303 CALL FILL_CS_CORNER_TR_RL( 1, .FALSE.,
304 & hDiv, bi,bj, myThid )
305 ENDIF
306 cph-exch2#endif
307 DO j=2-Oly,sNy+Oly-1
308 DO i=2-Olx,sNx+Olx-1
309 divDx(i,j) = (hDiv(i,j)-hDiv(i-1,j))*recip_dxC(i,j,bi,bj)
310 ENDDO
311 ENDDO
312
313 C- gradient in y direction:
314 cph-exch2#ifndef ALLOW_AUTODIFF_TAMC
315 IF (useCubedSphereExchange) THEN
316 C to compute d/dy(hDiv), fill corners with appropriate values:
317 CALL FILL_CS_CORNER_TR_RL( 2, .FALSE.,
318 & hDiv, bi,bj, myThid )
319 ENDIF
320 cph-exch2#endif
321 DO j=2-Oly,sNy+Oly-1
322 DO i=2-Olx,sNx+Olx-1
323 divDy(i,j) = (hDiv(i,j)-hDiv(i,j-1))*recip_dyC(i,j,bi,bj)
324 ENDDO
325 ENDDO
326
327 C horizontal gradient of vertical vorticity:
328 C- gradient in x direction:
329 DO j=2-Oly,sNy+Oly
330 DO i=2-Olx,sNx+Olx-1
331 vrtDx(i,j) = (vort3(i+1,j)-vort3(i,j))
332 & *recip_dxG(i,j,bi,bj)
333 & *maskS(i,j,k,bi,bj)
334 #ifdef ALLOW_OBCS
335 & *maskInS(i,j,bi,bj)
336 #endif
337 ENDDO
338 ENDDO
339 C- gradient in y direction:
340 DO j=2-Oly,sNy+Oly-1
341 DO i=2-Olx,sNx+Olx
342 vrtDy(i,j) = (vort3(i,j+1)-vort3(i,j))
343 & *recip_dyG(i,j,bi,bj)
344 & *maskW(i,j,k,bi,bj)
345 #ifdef ALLOW_OBCS
346 & *maskInW(i,j,bi,bj)
347 #endif
348 ENDDO
349 ENDDO
350
351 ENDIF
352
353 DO j=2-Oly,sNy+Oly-1
354 DO i=2-Olx,sNx+Olx-1
355 CCCCCCCCCCCCCCC Divergence Point CalculationsCCCCCCCCCCCCCCCCCCCC
356
357 #ifdef ALLOW_AUTODIFF_TAMC
358 # ifndef AUTODIFF_DISABLE_LEITH
359 lockey_2 = i+olx + (sNx+2*olx)*(j+oly-1)
360 & + (sNx+2*olx)*(sNy+2*oly)*(lockey_1-1)
361 CADJ STORE viscA4_ZSmg(i,j)
362 CADJ & = comlev1_mom_ijk_loop , key=lockey_2, byte=isbyte
363 CADJ STORE viscAh_ZSmg(i,j)
364 CADJ & = comlev1_mom_ijk_loop , key=lockey_2, byte=isbyte
365 # endif
366 #endif /* ALLOW_AUTODIFF_TAMC */
367
368 C These are (powers of) length scales
369 L2 = L2_D(i,j,bi,bj)
370 L2rdt = 0.25 _d 0*recip_dt*L2
371 L3 = L3_D(i,j,bi,bj)
372 L4rdt = L4rdt_D(i,j,bi,bj)
373 L5 = (L2*L3)
374
375 #ifndef AUTODIFF_DISABLE_REYNOLDS_SCALE
376 C Velocity Reynolds Scale
377 IF ( viscAhRe_max.GT.0. .AND. KE(i,j).GT.0. ) THEN
378 Uscl=SQRT(KE(i,j)*L2)*viscAhRe_max
379 ELSE
380 Uscl=0.
381 ENDIF
382 IF ( viscA4Re_max.GT.0. .AND. KE(i,j).GT.0. ) THEN
383 U4scl=SQRT(KE(i,j))*L3*viscA4Re_max
384 ELSE
385 U4scl=0.
386 ENDIF
387 #endif /* ndef AUTODIFF_DISABLE_REYNOLDS_SCALE */
388
389 cph-leith#ifndef ALLOW_AUTODIFF_TAMC
390 #ifndef AUTODIFF_DISABLE_LEITH
391 IF (useFullLeith.AND.calcLeith) THEN
392 C This is the vector magnitude of the vorticity gradient squared
393 grdVrt=0.25 _d 0*( (vrtDx(i,j+1)*vrtDx(i,j+1)
394 & + vrtDx(i,j)*vrtDx(i,j) )
395 & + (vrtDy(i+1,j)*vrtDy(i+1,j)
396 & + vrtDy(i,j)*vrtDy(i,j) ) )
397
398 C This is the vector magnitude of grad (div.v) squared
399 C Using it in Leith serves to damp instabilities in w.
400 grdDiv=0.25 _d 0*( (divDx(i+1,j)*divDx(i+1,j)
401 & + divDx(i,j)*divDx(i,j) )
402 & + (divDy(i,j+1)*divDy(i,j+1)
403 & + divDy(i,j)*divDy(i,j) ) )
404
405 viscAh_DLth(i,j)=
406 & SQRT(leith2fac*grdVrt+leithD2fac*grdDiv)*L3
407 viscA4_DLth(i,j)=
408 & SQRT(leith4fac*grdVrt+leithD4fac*grdDiv)*L5
409 viscAh_DLthd(i,j)=
410 & SQRT(leithD2fac*grdDiv)*L3
411 viscA4_DLthd(i,j)=
412 & SQRT(leithD4fac*grdDiv)*L5
413 ELSEIF (calcLeith) THEN
414 C but this approximation will work on cube
415 c (and differs by as much as 4X)
416 grdVrt=MAX( ABS(vrtDx(i,j+1)), ABS(vrtDx(i,j)) )
417 grdVrt=MAX( grdVrt, ABS(vrtDy(i+1,j)) )
418 grdVrt=MAX( grdVrt, ABS(vrtDy(i,j)) )
419
420 c This approximation is good to the same order as above...
421 grdDiv=MAX( ABS(divDx(i+1,j)), ABS(divDx(i,j)) )
422 grdDiv=MAX( grdDiv, ABS(divDy(i,j+1)) )
423 grdDiv=MAX( grdDiv, ABS(divDy(i,j)) )
424
425 viscAh_Dlth(i,j)=(leith2fac*grdVrt+(leithD2fac*grdDiv))*L3
426 viscA4_Dlth(i,j)=(leith4fac*grdVrt+(leithD4fac*grdDiv))*L5
427 viscAh_DlthD(i,j)=((leithD2fac*grdDiv))*L3
428 viscA4_DlthD(i,j)=((leithD4fac*grdDiv))*L5
429 ELSE
430 viscAh_Dlth(i,j)=0. _d 0
431 viscA4_Dlth(i,j)=0. _d 0
432 viscAh_DlthD(i,j)=0. _d 0
433 viscA4_DlthD(i,j)=0. _d 0
434 ENDIF
435
436 IF (calcSmag) THEN
437 viscAh_DSmg(i,j)=L2
438 & *SQRT(tension(i,j)**2
439 & +0.25 _d 0*(strain(i+1, j )**2+strain( i ,j+1)**2
440 & +strain(i , j )**2+strain(i+1,j+1)**2))
441 viscA4_DSmg(i,j)=smag4fac*L2*viscAh_DSmg(i,j)
442 viscAh_DSmg(i,j)=smag2fac*viscAh_DSmg(i,j)
443 ELSE
444 viscAh_DSmg(i,j)=0. _d 0
445 viscA4_DSmg(i,j)=0. _d 0
446 ENDIF
447 #endif /* AUTODIFF_DISABLE_LEITH */
448
449 C Harmonic on Div.u points
450 Alin=viscAhD+viscAhGrid*L2rdt
451 & +viscAh_DLth(i,j)+viscAh_DSmg(i,j)
452 #ifdef ALLOW_3D_VISCAH
453 & +viscAhDfld(i,j,k,bi,bj)
454 #endif
455 viscAh_DMin(i,j)=MAX(viscAhGridMin*L2rdt,Uscl)
456 viscAh_D(i,j)=MAX(viscAh_DMin(i,j),Alin)
457 viscAh_DMax(i,j)=MIN(viscAhGridMax*L2rdt,viscAhMax)
458 viscAh_D(i,j)=MIN(viscAh_DMax(i,j),viscAh_D(i,j))
459
460 C BiHarmonic on Div.u points
461 Alin=viscA4D+viscA4Grid*L4rdt
462 & +viscA4_DLth(i,j)+viscA4_DSmg(i,j)
463 #ifdef ALLOW_3D_VISCA4
464 & +viscA4Dfld(i,j,k,bi,bj)
465 #endif
466 viscA4_DMin(i,j)=MAX(viscA4GridMin*L4rdt,U4scl)
467 viscA4_D(i,j)=MAX(viscA4_DMin(i,j),Alin)
468 viscA4_DMax(i,j)=MIN(viscA4GridMax*L4rdt,viscA4Max)
469 viscA4_D(i,j)=MIN(viscA4_DMax(i,j),viscA4_D(i,j))
470
471 #ifdef ALLOW_NONHYDROSTATIC
472 C-- Pass Viscosities to calc_gw, if constant, not necessary
473
474 kp1 = MIN(k+1,Nr)
475
476 IF ( k.EQ.1 ) THEN
477 C Prepare for next level (next call)
478 viscAh_W(i,j,kp1,bi,bj)=0.5*viscAh_D(i,j)
479 viscA4_W(i,j,kp1,bi,bj)=0.5*viscA4_D(i,j)
480
481 C These values dont get used
482 viscAh_W(i,j,k,bi,bj)=viscAh_D(i,j)
483 viscA4_W(i,j,k,bi,bj)=viscA4_D(i,j)
484
485 ELSEIF ( k.EQ.Nr ) THEN
486 viscAh_W(i,j,k,bi,bj)=viscAh_W(i,j,k,bi,bj)+0.5*viscAh_D(i,j)
487 viscA4_W(i,j,k,bi,bj)=viscA4_W(i,j,k,bi,bj)+0.5*viscA4_D(i,j)
488
489 ELSE
490 C Prepare for next level (next call)
491 viscAh_W(i,j,kp1,bi,bj)=0.5*viscAh_D(i,j)
492 viscA4_W(i,j,kp1,bi,bj)=0.5*viscA4_D(i,j)
493
494 C Note that previous call of this function has already added half.
495 viscAh_W(i,j,k,bi,bj)=viscAh_W(i,j,k,bi,bj)+0.5*viscAh_D(i,j)
496 viscA4_W(i,j,k,bi,bj)=viscA4_W(i,j,k,bi,bj)+0.5*viscA4_D(i,j)
497
498 ENDIF
499 #endif /* ALLOW_NONHYDROSTATIC */
500
501 CCCCCCCCCCCCC Vorticity Point CalculationsCCCCCCCCCCCCCCCCCC
502 C These are (powers of) length scales
503 L2 = L2_Z(i,j,bi,bj)
504 L2rdt = 0.25 _d 0*recip_dt*L2
505 L3 = L3_Z(i,j,bi,bj)
506 L4rdt = L4rdt_Z(i,j,bi,bj)
507 L5 = (L2*L3)
508
509 #ifndef AUTODIFF_DISABLE_REYNOLDS_SCALE
510 C Velocity Reynolds Scale (Pb here at CS-grid corners !)
511 IF ( viscAhRe_max.GT.0. .OR. viscA4Re_max.GT.0. ) THEN
512 keZpt=0.25 _d 0*( (KE(i,j)+KE(i-1,j-1))
513 & +(KE(i-1,j)+KE(i,j-1)) )
514 IF ( keZpt.GT.0. ) THEN
515 Uscl = SQRT(keZpt*L2)*viscAhRe_max
516 U4scl= SQRT(keZpt)*L3*viscA4Re_max
517 ELSE
518 Uscl =0.
519 U4scl=0.
520 ENDIF
521 ELSE
522 Uscl =0.
523 U4scl=0.
524 ENDIF
525 #endif /* ndef AUTODIFF_DISABLE_REYNOLDS_SCALE */
526
527 #ifndef AUTODIFF_DISABLE_LEITH
528 C This is the vector magnitude of the vorticity gradient squared
529 IF (useFullLeith.AND.calcLeith) THEN
530 grdVrt=0.25 _d 0*( (vrtDx(i-1,j)*vrtDx(i-1,j)
531 & + vrtDx(i,j)*vrtDx(i,j) )
532 & + (vrtDy(i,j-1)*vrtDy(i,j-1)
533 & + vrtDy(i,j)*vrtDy(i,j) ) )
534
535 C This is the vector magnitude of grad(div.v) squared
536 grdDiv=0.25 _d 0*( (divDx(i,j-1)*divDx(i,j-1)
537 & + divDx(i,j)*divDx(i,j) )
538 & + (divDy(i-1,j)*divDy(i-1,j)
539 & + divDy(i,j)*divDy(i,j) ) )
540
541 viscAh_ZLth(i,j)=
542 & SQRT(leith2fac*grdVrt+leithD2fac*grdDiv)*L3
543 viscA4_ZLth(i,j)=
544 & SQRT(leith4fac*grdVrt+leithD4fac*grdDiv)*L5
545 viscAh_ZLthD(i,j)=
546 & SQRT(leithD2fac*grdDiv)*L3
547 viscA4_ZLthD(i,j)=
548 & SQRT(leithD4fac*grdDiv)*L5
549
550 ELSEIF (calcLeith) THEN
551 C but this approximation will work on cube (and differs by 4X)
552 grdVrt=MAX( ABS(vrtDx(i-1,j)), ABS(vrtDx(i,j)) )
553 grdVrt=MAX( grdVrt, ABS(vrtDy(i,j-1)) )
554 grdVrt=MAX( grdVrt, ABS(vrtDy(i,j)) )
555
556 grdDiv=MAX( ABS(divDx(i,j)), ABS(divDx(i,j-1)) )
557 grdDiv=MAX( grdDiv, ABS(divDy(i,j)) )
558 grdDiv=MAX( grdDiv, ABS(divDy(i-1,j)) )
559
560 viscAh_ZLth(i,j)=(leith2fac*grdVrt+(leithD2fac*grdDiv))*L3
561 viscA4_ZLth(i,j)=(leith4fac*grdVrt+(leithD4fac*grdDiv))*L5
562 viscAh_ZLthD(i,j)=(leithD2fac*grdDiv)*L3
563 viscA4_ZLthD(i,j)=(leithD4fac*grdDiv)*L5
564 ELSE
565 viscAh_ZLth(i,j)=0. _d 0
566 viscA4_ZLth(i,j)=0. _d 0
567 viscAh_ZLthD(i,j)=0. _d 0
568 viscA4_ZLthD(i,j)=0. _d 0
569 ENDIF
570
571 IF (calcSmag) THEN
572 viscAh_ZSmg(i,j)=L2
573 & *SQRT(strain(i,j)**2
574 & +0.25 _d 0*(tension( i , j )**2+tension( i ,j-1)**2
575 & +tension(i-1, j )**2+tension(i-1,j-1)**2))
576 viscA4_ZSmg(i,j)=smag4fac*L2*viscAh_ZSmg(i,j)
577 viscAh_ZSmg(i,j)=smag2fac*viscAh_ZSmg(i,j)
578 ENDIF
579 #endif /* AUTODIFF_DISABLE_LEITH */
580
581 C Harmonic on Zeta points
582 Alin=viscAhZ+viscAhGrid*L2rdt
583 & +viscAh_ZLth(i,j)+viscAh_ZSmg(i,j)
584 #ifdef ALLOW_3D_VISCAH
585 & +viscAhZfld(i,j,k,bi,bj)
586 #endif
587 viscAh_ZMin(i,j)=MAX(viscAhGridMin*L2rdt,Uscl)
588 viscAh_Z(i,j)=MAX(viscAh_ZMin(i,j),Alin)
589 viscAh_ZMax(i,j)=MIN(viscAhGridMax*L2rdt,viscAhMax)
590 viscAh_Z(i,j)=MIN(viscAh_ZMax(i,j),viscAh_Z(i,j))
591
592 C BiHarmonic on Zeta points
593 Alin=viscA4Z+viscA4Grid*L4rdt
594 & +viscA4_ZLth(i,j)+viscA4_ZSmg(i,j)
595 #ifdef ALLOW_3D_VISCA4
596 & +viscA4Zfld(i,j,k,bi,bj)
597 #endif
598 viscA4_ZMin(i,j)=MAX(viscA4GridMin*L4rdt,U4scl)
599 viscA4_Z(i,j)=MAX(viscA4_ZMin(i,j),Alin)
600 viscA4_ZMax(i,j)=MIN(viscA4GridMax*L4rdt,viscA4Max)
601 viscA4_Z(i,j)=MIN(viscA4_ZMax(i,j),viscA4_Z(i,j))
602 ENDDO
603 ENDDO
604
605 ELSE
606 C---- use constant viscosity (useVariableViscosity=F):
607
608 DO j=1-Oly,sNy+Oly
609 DO i=1-Olx,sNx+Olx
610 viscAh_D(i,j)=viscAhD
611 viscAh_Z(i,j)=viscAhZ
612 viscA4_D(i,j)=viscA4D
613 viscA4_Z(i,j)=viscA4Z
614 ENDDO
615 ENDDO
616
617 C---- variable/constant viscosity : end if/else block
618 ENDIF
619
620 #ifdef ALLOW_DIAGNOSTICS
621 IF (useDiagnostics) THEN
622 CALL DIAGNOSTICS_FILL(viscAh_D,'VISCAHD ',k,1,2,bi,bj,myThid)
623 CALL DIAGNOSTICS_FILL(viscA4_D,'VISCA4D ',k,1,2,bi,bj,myThid)
624 CALL DIAGNOSTICS_FILL(viscAh_Z,'VISCAHZ ',k,1,2,bi,bj,myThid)
625 CALL DIAGNOSTICS_FILL(viscA4_Z,'VISCA4Z ',k,1,2,bi,bj,myThid)
626
627 CALL DIAGNOSTICS_FILL(viscAh_DMax,'VAHDMAX ',k,1,2,bi,bj,myThid)
628 CALL DIAGNOSTICS_FILL(viscA4_DMax,'VA4DMAX ',k,1,2,bi,bj,myThid)
629 CALL DIAGNOSTICS_FILL(viscAh_ZMax,'VAHZMAX ',k,1,2,bi,bj,myThid)
630 CALL DIAGNOSTICS_FILL(viscA4_ZMax,'VA4ZMAX ',k,1,2,bi,bj,myThid)
631
632 CALL DIAGNOSTICS_FILL(viscAh_DMin,'VAHDMIN ',k,1,2,bi,bj,myThid)
633 CALL DIAGNOSTICS_FILL(viscA4_DMin,'VA4DMIN ',k,1,2,bi,bj,myThid)
634 CALL DIAGNOSTICS_FILL(viscAh_ZMin,'VAHZMIN ',k,1,2,bi,bj,myThid)
635 CALL DIAGNOSTICS_FILL(viscA4_ZMin,'VA4ZMIN ',k,1,2,bi,bj,myThid)
636
637 CALL DIAGNOSTICS_FILL(viscAh_DLth,'VAHDLTH ',k,1,2,bi,bj,myThid)
638 CALL DIAGNOSTICS_FILL(viscA4_DLth,'VA4DLTH ',k,1,2,bi,bj,myThid)
639 CALL DIAGNOSTICS_FILL(viscAh_ZLth,'VAHZLTH ',k,1,2,bi,bj,myThid)
640 CALL DIAGNOSTICS_FILL(viscA4_ZLth,'VA4ZLTH ',k,1,2,bi,bj,myThid)
641
642 CALL DIAGNOSTICS_FILL(viscAh_DLthD,'VAHDLTHD'
643 & ,k,1,2,bi,bj,myThid)
644 CALL DIAGNOSTICS_FILL(viscA4_DLthD,'VA4DLTHD'
645 & ,k,1,2,bi,bj,myThid)
646 CALL DIAGNOSTICS_FILL(viscAh_ZLthD,'VAHZLTHD'
647 & ,k,1,2,bi,bj,myThid)
648 CALL DIAGNOSTICS_FILL(viscA4_ZLthD,'VA4ZLTHD'
649 & ,k,1,2,bi,bj,myThid)
650
651 CALL DIAGNOSTICS_FILL(viscAh_DSmg,'VAHDSMAG',k,1,2,bi,bj,myThid)
652 CALL DIAGNOSTICS_FILL(viscA4_DSmg,'VA4DSMAG',k,1,2,bi,bj,myThid)
653 CALL DIAGNOSTICS_FILL(viscAh_ZSmg,'VAHZSMAG',k,1,2,bi,bj,myThid)
654 CALL DIAGNOSTICS_FILL(viscA4_ZSmg,'VA4ZSMAG',k,1,2,bi,bj,myThid)
655 ENDIF
656 #endif
657
658 RETURN
659 END
660

  ViewVC Help
Powered by ViewVC 1.1.22