/[MITgcm]/MITgcm/pkg/mom_vecinv/mom_vecinv.F
ViewVC logotype

Contents of /MITgcm/pkg/mom_vecinv/mom_vecinv.F

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


Revision 1.56 - (show annotations) (download)
Tue Feb 7 11:46:17 2006 UTC (18 years, 4 months ago) by mlosch
Branch: MAIN
CVS Tags: checkpoint58b_post, checkpoint58a_post, checkpoint58c_post
Changes since 1.55: +23 -1 lines
o add hooks for friction at water-shelfice interface

1 C $Header: /u/gcmpack/MITgcm/pkg/mom_vecinv/mom_vecinv.F,v 1.55 2005/12/08 15:44:34 heimbach Exp $
2 C $Name: $
3
4 #include "MOM_VECINV_OPTIONS.h"
5
6 SUBROUTINE MOM_VECINV(
7 I bi,bj,iMin,iMax,jMin,jMax,k,kUp,kDown,
8 I KappaRU, KappaRV,
9 U fVerU, fVerV,
10 O guDiss, gvDiss,
11 I myTime, myIter, myThid)
12 C /==========================================================\
13 C | S/R MOM_VECINV |
14 C | o Form the right hand-side of the momentum equation. |
15 C |==========================================================|
16 C | Terms are evaluated one layer at a time working from |
17 C | the bottom to the top. The vertically integrated |
18 C | barotropic flow tendency term is evluated by summing the |
19 C | tendencies. |
20 C | Notes: |
21 C | We have not sorted out an entirely satisfactory formula |
22 C | for the diffusion equation bc with lopping. The present |
23 C | form produces a diffusive flux that does not scale with |
24 C | open-area. Need to do something to solidfy this and to |
25 C | deal "properly" with thin walls. |
26 C \==========================================================/
27 IMPLICIT NONE
28
29 C == Global variables ==
30 #include "SIZE.h"
31 #include "DYNVARS.h"
32 #include "EEPARAMS.h"
33 #include "PARAMS.h"
34 #ifdef ALLOW_MNC
35 #include "MNC_PARAMS.h"
36 #endif
37 #include "GRID.h"
38 #ifdef ALLOW_TIMEAVE
39 #include "TIMEAVE_STATV.h"
40 #endif
41
42 C == Routine arguments ==
43 C fVerU :: Flux of momentum in the vertical direction, out of the upper
44 C fVerV :: face of a cell K ( flux into the cell above ).
45 C guDiss :: dissipation tendency (all explicit terms), u component
46 C gvDiss :: dissipation tendency (all explicit terms), v component
47 C bi, bj, iMin, iMax, jMin, jMax - Range of points for which calculation
48 C results will be set.
49 C kUp, kDown - Index for upper and lower layers.
50 C myThid :: my Thread Id number
51 _RL KappaRU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
52 _RL KappaRV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
53 _RL fVerU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
54 _RL fVerV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
55 _RL guDiss(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
56 _RL gvDiss(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
57 INTEGER kUp,kDown
58 _RL myTime
59 INTEGER myIter
60 INTEGER myThid
61 INTEGER bi,bj,iMin,iMax,jMin,jMax
62
63 #ifdef ALLOW_MOM_VECINV
64
65 C == Functions ==
66 LOGICAL DIFFERENT_MULTIPLE
67 EXTERNAL DIFFERENT_MULTIPLE
68
69 C == Local variables ==
70 _RL vF (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
71 _RL vrF(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
72 _RL uCf(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
73 _RL vCf(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
74 c _RL mT (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
75 _RS hFacZ (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
76 _RS r_hFacZ (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
77 _RL uFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
78 _RL vFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
79 _RL del2u (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
80 _RL del2v (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
81 _RL dStar (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
82 _RL zStar (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
83 _RL tension (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
84 _RL strain (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
85 _RL KE (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
86 _RL omega3 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
87 _RL vort3 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
88 _RL hDiv (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
89 _RL viscAh_Z(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
90 _RL viscAh_D(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
91 _RL viscA4_Z(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
92 _RL viscA4_D(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
93 C i,j,k :: Loop counters
94 INTEGER i,j,k
95 C xxxFac - On-off tracer parameters used for switching terms off.
96 _RL ArDudrFac
97 c _RL mtFacU
98 _RL ArDvdrFac
99 c _RL mtFacV
100 _RL sideMaskFac
101 LOGICAL bottomDragTerms
102 LOGICAL writeDiag
103 LOGICAL harmonic,biharmonic,useVariableViscosity
104
105 #ifdef ALLOW_MNC
106 INTEGER offsets(9)
107 CHARACTER*(1) pf
108 #endif
109
110 #ifdef ALLOW_AUTODIFF_TAMC
111 C-- only the kDown part of fverU/V is set in this subroutine
112 C-- the kUp is still required
113 C-- In the case of mom_fluxform Kup is set as well
114 C-- (at least in part)
115 fVerU(1,1,kUp) = fVerU(1,1,kUp)
116 fVerV(1,1,kUp) = fVerV(1,1,kUp)
117 #endif
118
119 writeDiag = DIFFERENT_MULTIPLE(diagFreq, myTime, deltaTClock)
120
121 #ifdef ALLOW_MNC
122 IF (useMNC .AND. snapshot_mnc .AND. writeDiag) THEN
123 IF ( writeBinaryPrec .EQ. precFloat64 ) THEN
124 pf(1:1) = 'D'
125 ELSE
126 pf(1:1) = 'R'
127 ENDIF
128 IF ((bi .EQ. 1).AND.(bj .EQ. 1).AND.(k .EQ. 1)) THEN
129 CALL MNC_CW_SET_UDIM('mom_vi', -1, myThid)
130 CALL MNC_CW_RL_W_S('D','mom_vi',0,0,'T',myTime,myThid)
131 CALL MNC_CW_SET_UDIM('mom_vi', 0, myThid)
132 CALL MNC_CW_I_W_S('I','mom_vi',0,0,'iter',myIter,myThid)
133 ENDIF
134 DO i = 1,9
135 offsets(i) = 0
136 ENDDO
137 offsets(3) = k
138 C write(*,*) 'offsets = ',(offsets(i),i=1,9)
139 ENDIF
140 #endif /* ALLOW_MNC */
141
142 C Initialise intermediate terms
143 DO J=1-OLy,sNy+OLy
144 DO I=1-OLx,sNx+OLx
145 vF(i,j) = 0.
146 vrF(i,j) = 0.
147 uCf(i,j) = 0.
148 vCf(i,j) = 0.
149 c mT(i,j) = 0.
150 del2u(i,j) = 0.
151 del2v(i,j) = 0.
152 dStar(i,j) = 0.
153 zStar(i,j) = 0.
154 guDiss(i,j)= 0.
155 gvDiss(i,j)= 0.
156 vort3(i,j) = 0.
157 omega3(i,j)= 0.
158 KE(i,j) = 0.
159 viscAh_Z(i,j) = 0.
160 viscAh_D(i,j) = 0.
161 viscA4_Z(i,j) = 0.
162 viscA4_D(i,j) = 0.
163
164 #ifdef ALLOW_AUTODIFF_TAMC
165 strain(i,j) = 0. _d 0
166 tension(i,j) = 0. _d 0
167 hFacZ(i,j) = 0. _d 0
168 #endif
169 ENDDO
170 ENDDO
171
172 C-- Term by term tracer parmeters
173 C o U momentum equation
174 ArDudrFac = vfFacMom*1.
175 c mTFacU = mtFacMom*1.
176 C o V momentum equation
177 ArDvdrFac = vfFacMom*1.
178 c mTFacV = mtFacMom*1.
179
180 C note: using standard stencil (no mask) results in under-estimating
181 C vorticity at a no-slip boundary by a factor of 2 = sideDragFactor
182 IF ( no_slip_sides ) THEN
183 sideMaskFac = sideDragFactor
184 ELSE
185 sideMaskFac = 0. _d 0
186 ENDIF
187
188 IF ( no_slip_bottom
189 & .OR. bottomDragQuadratic.NE.0.
190 & .OR. bottomDragLinear.NE.0.) THEN
191 bottomDragTerms=.TRUE.
192 ELSE
193 bottomDragTerms=.FALSE.
194 ENDIF
195
196 C-- Calculate open water fraction at vorticity points
197 CALL MOM_CALC_HFACZ(bi,bj,k,hFacZ,r_hFacZ,myThid)
198
199 C Make local copies of horizontal flow field
200 DO j=1-OLy,sNy+OLy
201 DO i=1-OLx,sNx+OLx
202 uFld(i,j) = uVel(i,j,k,bi,bj)
203 vFld(i,j) = vVel(i,j,k,bi,bj)
204 ENDDO
205 ENDDO
206
207 C note (jmc) : Dissipation and Vort3 advection do not necesary
208 C use the same maskZ (and hFacZ) => needs 2 call(s)
209 c CALL MOM_VI_HFACZ_DISS(bi,bj,k,hFacZ,r_hFacZ,myThid)
210
211 CALL MOM_CALC_KE(bi,bj,k,selectKEscheme,uFld,vFld,KE,myThid)
212
213 CALL MOM_CALC_RELVORT3(bi,bj,k,uFld,vFld,hFacZ,vort3,myThid)
214
215 IF (momViscosity) THEN
216 C-- For viscous term, compute horizontal divergence, tension & strain
217 C and mask relative vorticity (free-slip case):
218
219 CALL MOM_CALC_HDIV(bi,bj,k,2,uFld,vFld,hDiv,myThid)
220
221 CALL MOM_CALC_TENSION(bi,bj,k,uFld,vFld,tension,myThid)
222
223 CALL MOM_CALC_STRAIN(bi,bj,k,uFld,vFld,hFacZ,strain,myThid)
224
225 C- account for no-slip / free-slip BC:
226 DO j=1-Oly,sNy+Oly
227 DO i=1-Olx,sNx+Olx
228 IF ( hFacZ(i,j).EQ.0. ) THEN
229 vort3(i,j) = sideMaskFac*vort3(i,j)
230 strain(i,j) = sideMaskFac*strain(i,j)
231 ENDIF
232 ENDDO
233 ENDDO
234
235 C-- Calculate Viscosities
236 CALL MOM_CALC_VISC(
237 I bi,bj,k,
238 O viscAh_Z,viscAh_D,viscA4_Z,viscA4_D,
239 O harmonic,biharmonic,useVariableViscosity,
240 I hDiv,vort3,tension,strain,KE,hfacZ,
241 I myThid)
242
243 C Calculate del^2 u and del^2 v for bi-harmonic term
244 IF (biharmonic) THEN
245 CALL MOM_VI_DEL2UV(bi,bj,k,hDiv,vort3,hFacZ,
246 O del2u,del2v,
247 & myThid)
248 CALL MOM_CALC_HDIV(bi,bj,k,2,del2u,del2v,dStar,myThid)
249 CALL MOM_CALC_RELVORT3(bi,bj,k,
250 & del2u,del2v,hFacZ,zStar,myThid)
251 ENDIF
252
253 C- Strain diagnostics:
254 IF ( writeDiag ) THEN
255 IF (snapshot_mdsio) THEN
256 CALL WRITE_LOCAL_RL('Ds','I10',1,strain,bi,bj,k,myIter,myThid)
257 ENDIF
258 #ifdef ALLOW_MNC
259 IF (useMNC .AND. snapshot_mnc) THEN
260 CALL MNC_CW_RL_W_OFFSET(pf,'mom_vi',bi,bj,'Ds',strain,
261 & offsets, myThid)
262 ENDIF
263 #endif /* ALLOW_MNC */
264 ENDIF
265 #ifdef ALLOW_DIAGNOSTICS
266 IF ( useDiagnostics ) THEN
267 CALL DIAGNOSTICS_FILL(strain, 'Strain ',k,1,2,bi,bj,myThid)
268 ENDIF
269 #endif /* ALLOW_DIAGNOSTICS */
270
271 C--- Calculate dissipation terms for U and V equations
272
273 C in terms of tension and strain
274 IF (useStrainTensionVisc) THEN
275 C mask strain as if free-slip since side-drag is computed separately
276 DO j=1-Oly,sNy+Oly
277 DO i=1-Olx,sNx+Olx
278 IF ( hFacZ(i,j).EQ.0. ) strain(i,j) = 0. _d 0
279 ENDDO
280 ENDDO
281 CALL MOM_HDISSIP(bi,bj,k,hDiv,vort3,tension,strain,KE,
282 I hFacZ,
283 I viscAh_Z,viscAh_D,viscA4_Z,viscA4_D,
284 I harmonic,biharmonic,useVariableViscosity,
285 O guDiss,gvDiss,
286 I myThid)
287 ELSE
288 C in terms of vorticity and divergence
289 CALL MOM_VI_HDISSIP(bi,bj,k,hDiv,vort3,tension,strain,KE,
290 I hFacZ,dStar,zStar,
291 I viscAh_Z,viscAh_D,viscA4_Z,viscA4_D,
292 I harmonic,biharmonic,useVariableViscosity,
293 O guDiss,gvDiss,
294 & myThid)
295 ENDIF
296 C-- if (momViscosity) end of block.
297 ENDIF
298
299 C- Return to standard hfacZ (min-4) and mask vort3 accordingly:
300 c CALL MOM_VI_MASK_VORT3(bi,bj,k,hFacZ,r_hFacZ,vort3,myThid)
301
302 C--- Other dissipation terms in Zonal momentum equation
303
304 C-- Vertical flux (fVer is at upper face of "u" cell)
305
306 C Eddy component of vertical flux (interior component only) -> vrF
307 IF (momViscosity.AND..NOT.implicitViscosity) THEN
308 CALL MOM_U_RVISCFLUX(bi,bj,k+1,uVel,KappaRU,vrF,myThid)
309
310 C Combine fluxes
311 DO j=jMin,jMax
312 DO i=iMin,iMax
313 fVerU(i,j,kDown) = ArDudrFac*vrF(i,j)
314 ENDDO
315 ENDDO
316
317 C-- Tendency is minus divergence of the fluxes
318 DO j=2-Oly,sNy+Oly-1
319 DO i=2-Olx,sNx+Olx-1
320 guDiss(i,j) = guDiss(i,j)
321 & -_recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
322 & *recip_rAw(i,j,bi,bj)
323 & *(
324 & fVerU(i,j,kDown) - fVerU(i,j,kUp)
325 & )*rkSign
326 ENDDO
327 ENDDO
328 ENDIF
329
330 C-- No-slip and drag BCs appear as body forces in cell abutting topography
331 IF (momViscosity.AND.no_slip_sides) THEN
332 C- No-slip BCs impose a drag at walls...
333 CALL MOM_U_SIDEDRAG(
334 I bi,bj,k,
335 I uFld, del2u, hFacZ,
336 I viscAh_Z,viscA4_Z,
337 I harmonic,biharmonic,useVariableViscosity,
338 O vF,
339 I myThid)
340 DO j=jMin,jMax
341 DO i=iMin,iMax
342 guDiss(i,j) = guDiss(i,j)+vF(i,j)
343 ENDDO
344 ENDDO
345 ENDIF
346 C- No-slip BCs impose a drag at bottom
347 IF (momViscosity.AND.bottomDragTerms) THEN
348 CALL MOM_U_BOTTOMDRAG(bi,bj,k,uFld,KE,KappaRU,vF,myThid)
349 DO j=jMin,jMax
350 DO i=iMin,iMax
351 guDiss(i,j) = guDiss(i,j)+vF(i,j)
352 ENDDO
353 ENDDO
354 ENDIF
355 #ifdef ALLOW_SHELFICE
356 IF (useShelfIce.AND.momViscosity.AND.bottomDragTerms) THEN
357 CALL SHELFICE_U_DRAG(bi,bj,k,uFld,KE,KappaRU,vF,myThid)
358 DO j=jMin,jMax
359 DO i=iMin,iMax
360 guDiss(i,j) = guDiss(i,j) + vF(i,j)
361 ENDDO
362 ENDDO
363 ENDIF
364 #endif /* ALLOW_SHELFICE */
365
366
367 C--- Other dissipation terms in Meridional momentum equation
368
369 C-- Vertical flux (fVer is at upper face of "v" cell)
370
371 C Eddy component of vertical flux (interior component only) -> vrF
372 IF (momViscosity.AND..NOT.implicitViscosity) THEN
373 CALL MOM_V_RVISCFLUX(bi,bj,k+1,vVel,KappaRV,vrF,myThid)
374
375 C Combine fluxes -> fVerV
376 DO j=jMin,jMax
377 DO i=iMin,iMax
378 fVerV(i,j,kDown) = ArDvdrFac*vrF(i,j)
379 ENDDO
380 ENDDO
381
382 C-- Tendency is minus divergence of the fluxes
383 DO j=jMin,jMax
384 DO i=iMin,iMax
385 gvDiss(i,j) = gvDiss(i,j)
386 & -_recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
387 & *recip_rAs(i,j,bi,bj)
388 & *(
389 & fVerV(i,j,kDown) - fVerV(i,j,kUp)
390 & )*rkSign
391 ENDDO
392 ENDDO
393 ENDIF
394
395 C-- No-slip and drag BCs appear as body forces in cell abutting topography
396 IF (momViscosity.AND.no_slip_sides) THEN
397 C- No-slip BCs impose a drag at walls...
398 CALL MOM_V_SIDEDRAG(
399 I bi,bj,k,
400 I vFld, del2v, hFacZ,
401 I viscAh_Z,viscA4_Z,
402 I harmonic,biharmonic,useVariableViscosity,
403 O vF,
404 I myThid)
405 DO j=jMin,jMax
406 DO i=iMin,iMax
407 gvDiss(i,j) = gvDiss(i,j)+vF(i,j)
408 ENDDO
409 ENDDO
410 ENDIF
411 C- No-slip BCs impose a drag at bottom
412 IF (momViscosity.AND.bottomDragTerms) THEN
413 CALL MOM_V_BOTTOMDRAG(bi,bj,k,vFld,KE,KappaRV,vF,myThid)
414 DO j=jMin,jMax
415 DO i=iMin,iMax
416 gvDiss(i,j) = gvDiss(i,j)+vF(i,j)
417 ENDDO
418 ENDDO
419 ENDIF
420 #ifdef ALLOW_SHELFICE
421 IF (useShelfIce.AND.momViscosity.AND.bottomDragTerms) THEN
422 CALL SHELFICE_V_DRAG(bi,bj,k,vFld,KE,KappaRU,vF,myThid)
423 DO j=jMin,jMax
424 DO i=iMin,iMax
425 gvDiss(i,j) = gvDiss(i,j) + vF(i,j)
426 ENDDO
427 ENDDO
428 ENDIF
429 #endif /* ALLOW_SHELFICE */
430
431
432 C- Vorticity diagnostics:
433 IF ( writeDiag ) THEN
434 IF (snapshot_mdsio) THEN
435 CALL WRITE_LOCAL_RL('Z3','I10',1,vort3, bi,bj,k,myIter,myThid)
436 ENDIF
437 #ifdef ALLOW_MNC
438 IF (useMNC .AND. snapshot_mnc) THEN
439 CALL MNC_CW_RL_W_OFFSET(pf,'mom_vi',bi,bj,'Z3',vort3,
440 & offsets, myThid)
441 ENDIF
442 #endif /* ALLOW_MNC */
443 ENDIF
444 #ifdef ALLOW_DIAGNOSTICS
445 IF ( useDiagnostics ) THEN
446 CALL DIAGNOSTICS_FILL(vort3, 'momVort3',k,1,2,bi,bj,myThid)
447 ENDIF
448 #endif /* ALLOW_DIAGNOSTICS */
449
450 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
451
452 C--- Prepare for Advection & Coriolis terms:
453 C- Mask relative vorticity and calculate absolute vorticity
454 DO j=1-Oly,sNy+Oly
455 DO i=1-Olx,sNx+Olx
456 IF ( hFacZ(i,j).EQ.0. ) vort3(i,j) = 0.
457 ENDDO
458 ENDDO
459 IF (useAbsVorticity)
460 & CALL MOM_CALC_ABSVORT3(bi,bj,k,vort3,omega3,myThid)
461
462 C-- Horizontal Coriolis terms
463 c IF (useCoriolis .AND. .NOT.useCDscheme
464 c & .AND. .NOT. useAbsVorticity) THEN
465 C- jmc: change it to keep the Coriolis terms when useAbsVorticity=T & momAdvection=F
466 IF ( useCoriolis .AND.
467 & .NOT.( useCDscheme .OR. useAbsVorticity.AND.momAdvection )
468 & ) THEN
469 IF (useAbsVorticity) THEN
470 CALL MOM_VI_U_CORIOLIS(bi,bj,K,vFld,omega3,hFacZ,r_hFacZ,
471 & uCf,myThid)
472 CALL MOM_VI_V_CORIOLIS(bi,bj,K,uFld,omega3,hFacZ,r_hFacZ,
473 & vCf,myThid)
474 ELSE
475 CALL MOM_VI_CORIOLIS(bi,bj,k,uFld,vFld,hFacZ,r_hFacZ,
476 & uCf,vCf,myThid)
477 ENDIF
478 DO j=jMin,jMax
479 DO i=iMin,iMax
480 gU(i,j,k,bi,bj) = uCf(i,j)
481 gV(i,j,k,bi,bj) = vCf(i,j)
482 ENDDO
483 ENDDO
484
485 IF ( writeDiag ) THEN
486 IF (snapshot_mdsio) THEN
487 CALL WRITE_LOCAL_RL('fV','I10',1,uCf,bi,bj,k,myIter,myThid)
488 CALL WRITE_LOCAL_RL('fU','I10',1,vCf,bi,bj,k,myIter,myThid)
489 ENDIF
490 #ifdef ALLOW_MNC
491 IF (useMNC .AND. snapshot_mnc) THEN
492 CALL MNC_CW_RL_W_OFFSET(pf,'mom_vi',bi,bj, 'fV', uCf,
493 & offsets, myThid)
494 CALL MNC_CW_RL_W_OFFSET(pf,'mom_vi',bi,bj, 'fU', vCf,
495 & offsets, myThid)
496 ENDIF
497 #endif /* ALLOW_MNC */
498 ENDIF
499 #ifdef ALLOW_DIAGNOSTICS
500 IF ( useDiagnostics ) THEN
501 CALL DIAGNOSTICS_FILL(uCf,'Um_Cori ',k,1,2,bi,bj,myThid)
502 CALL DIAGNOSTICS_FILL(vCf,'Vm_Cori ',k,1,2,bi,bj,myThid)
503 ENDIF
504 #endif /* ALLOW_DIAGNOSTICS */
505
506 ELSE
507 DO j=jMin,jMax
508 DO i=iMin,iMax
509 gU(i,j,k,bi,bj) = 0. _d 0
510 gV(i,j,k,bi,bj) = 0. _d 0
511 ENDDO
512 ENDDO
513 ENDIF
514
515 IF (momAdvection) THEN
516 C-- Horizontal advection of relative (or absolute) vorticity
517 IF (highOrderVorticity.AND.useAbsVorticity) THEN
518 CALL MOM_VI_U_CORIOLIS_C4(bi,bj,k,vFld,omega3,r_hFacZ,
519 & uCf,myThid)
520 ELSEIF (highOrderVorticity) THEN
521 CALL MOM_VI_U_CORIOLIS_C4(bi,bj,k,vFld,vort3, r_hFacZ,
522 & uCf,myThid)
523 ELSEIF (useAbsVorticity) THEN
524 CALL MOM_VI_U_CORIOLIS(bi,bj,K,vFld,omega3,hFacZ,r_hFacZ,
525 & uCf,myThid)
526 ELSE
527 CALL MOM_VI_U_CORIOLIS(bi,bj,k,vFld,vort3, hFacZ,r_hFacZ,
528 & uCf,myThid)
529 ENDIF
530 DO j=jMin,jMax
531 DO i=iMin,iMax
532 gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)+uCf(i,j)
533 ENDDO
534 ENDDO
535 IF (highOrderVorticity.AND.useAbsVorticity) THEN
536 CALL MOM_VI_V_CORIOLIS_C4(bi,bj,K,uFld,omega3,r_hFacZ,
537 & vCf,myThid)
538 ELSEIF (highOrderVorticity) THEN
539 CALL MOM_VI_V_CORIOLIS_C4(bi,bj,K,uFld,vort3, r_hFacZ,
540 & vCf,myThid)
541 ELSEIF (useAbsVorticity) THEN
542 CALL MOM_VI_V_CORIOLIS(bi,bj,K,uFld,omega3,hFacZ,r_hFacZ,
543 & vCf,myThid)
544 ELSE
545 CALL MOM_VI_V_CORIOLIS(bi,bj,k,uFld,vort3, hFacZ,r_hFacZ,
546 & vCf,myThid)
547 ENDIF
548 DO j=jMin,jMax
549 DO i=iMin,iMax
550 gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)+vCf(i,j)
551 ENDDO
552 ENDDO
553
554 IF ( writeDiag ) THEN
555 IF (snapshot_mdsio) THEN
556 CALL WRITE_LOCAL_RL('zV','I10',1,uCf,bi,bj,k,myIter,myThid)
557 CALL WRITE_LOCAL_RL('zU','I10',1,vCf,bi,bj,k,myIter,myThid)
558 ENDIF
559 #ifdef ALLOW_MNC
560 IF (useMNC .AND. snapshot_mnc) THEN
561 CALL MNC_CW_RL_W_OFFSET(pf,'mom_vi',bi,bj, 'zV', uCf,
562 & offsets, myThid)
563 CALL MNC_CW_RL_W_OFFSET(pf,'mom_vi',bi,bj, 'zU', vCf,
564 & offsets, myThid)
565 ENDIF
566 #endif /* ALLOW_MNC */
567 ENDIF
568
569 #ifdef ALLOW_TIMEAVE
570 IF (taveFreq.GT.0.) THEN
571 CALL TIMEAVE_CUMUL_1K1T(uZetatave,vCf,deltaTClock,
572 & Nr, k, bi, bj, myThid)
573 CALL TIMEAVE_CUMUL_1K1T(vZetatave,uCf,deltaTClock,
574 & Nr, k, bi, bj, myThid)
575 ENDIF
576 #endif /* ALLOW_TIMEAVE */
577 #ifdef ALLOW_DIAGNOSTICS
578 IF ( useDiagnostics ) THEN
579 CALL DIAGNOSTICS_FILL(uCf,'Um_AdvZ3',k,1,2,bi,bj,myThid)
580 CALL DIAGNOSTICS_FILL(vCf,'Vm_AdvZ3',k,1,2,bi,bj,myThid)
581 ENDIF
582 #endif /* ALLOW_DIAGNOSTICS */
583
584 C-- Vertical shear terms (-w*du/dr & -w*dv/dr)
585 IF ( .NOT. momImplVertAdv ) THEN
586 CALL MOM_VI_U_VERTSHEAR(bi,bj,K,uVel,wVel,uCf,myThid)
587 DO j=jMin,jMax
588 DO i=iMin,iMax
589 gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)+uCf(i,j)
590 ENDDO
591 ENDDO
592 CALL MOM_VI_V_VERTSHEAR(bi,bj,K,vVel,wVel,vCf,myThid)
593 DO j=jMin,jMax
594 DO i=iMin,iMax
595 gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)+vCf(i,j)
596 ENDDO
597 ENDDO
598 #ifdef ALLOW_DIAGNOSTICS
599 IF ( useDiagnostics ) THEN
600 CALL DIAGNOSTICS_FILL(uCf,'Um_AdvRe',k,1,2,bi,bj,myThid)
601 CALL DIAGNOSTICS_FILL(vCf,'Vm_AdvRe',k,1,2,bi,bj,myThid)
602 ENDIF
603 #endif /* ALLOW_DIAGNOSTICS */
604 ENDIF
605
606 C-- Bernoulli term
607 CALL MOM_VI_U_GRAD_KE(bi,bj,K,KE,uCf,myThid)
608 DO j=jMin,jMax
609 DO i=iMin,iMax
610 gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)+uCf(i,j)
611 ENDDO
612 ENDDO
613 CALL MOM_VI_V_GRAD_KE(bi,bj,K,KE,vCf,myThid)
614 DO j=jMin,jMax
615 DO i=iMin,iMax
616 gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)+vCf(i,j)
617 ENDDO
618 ENDDO
619 IF ( writeDiag ) THEN
620 IF (snapshot_mdsio) THEN
621 CALL WRITE_LOCAL_RL('KEx','I10',1,uCf,bi,bj,k,myIter,myThid)
622 CALL WRITE_LOCAL_RL('KEy','I10',1,vCf,bi,bj,k,myIter,myThid)
623 ENDIF
624 #ifdef ALLOW_MNC
625 IF (useMNC .AND. snapshot_mnc) THEN
626 CALL MNC_CW_RL_W_OFFSET(pf,'mom_vi',bi,bj, 'KEx', uCf,
627 & offsets, myThid)
628 CALL MNC_CW_RL_W_OFFSET(pf,'mom_vi',bi,bj, 'KEy', vCf,
629 & offsets, myThid)
630 ENDIF
631 #endif /* ALLOW_MNC */
632 ENDIF
633
634 C-- end if momAdvection
635 ENDIF
636
637 C-- Metric terms for curvilinear grid systems
638 c IF (usingSphericalPolarMTerms) THEN
639 C o Spherical polar grid metric terms
640 c CALL MOM_U_METRIC_NH(bi,bj,k,uFld,wVel,mT,myThid)
641 c DO j=jMin,jMax
642 c DO i=iMin,iMax
643 c gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)+mTFacU*mT(i,j)
644 c ENDDO
645 c ENDDO
646 c CALL MOM_V_METRIC_NH(bi,bj,k,vFld,wVel,mT,myThid)
647 c DO j=jMin,jMax
648 c DO i=iMin,iMax
649 c gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)+mTFacV*mT(i,j)
650 c ENDDO
651 c ENDDO
652 c ENDIF
653
654 C-- Set du/dt & dv/dt on boundaries to zero
655 DO j=jMin,jMax
656 DO i=iMin,iMax
657 gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)*_maskW(i,j,k,bi,bj)
658 gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)*_maskS(i,j,k,bi,bj)
659 ENDDO
660 ENDDO
661
662 #ifdef ALLOW_DEBUG
663 IF ( debugLevel .GE. debLevB
664 & .AND. k.EQ.4 .AND. myIter.EQ.nIter0
665 & .AND. nPx.EQ.1 .AND. nPy.EQ.1
666 & .AND. useCubedSphereExchange ) THEN
667 CALL DEBUG_CS_CORNER_UV( ' uDiss,vDiss from MOM_VECINV',
668 & guDiss,gvDiss, k, standardMessageUnit,bi,bj,myThid )
669 ENDIF
670 #endif /* ALLOW_DEBUG */
671
672 IF ( writeDiag ) THEN
673 IF (snapshot_mdsio) THEN
674 CALL WRITE_LOCAL_RL('W3','I10',1,omega3, bi,bj,k,myIter,myThid)
675 CALL WRITE_LOCAL_RL('KE','I10',1,KE, bi,bj,k,myIter,myThid)
676 CALL WRITE_LOCAL_RL('D', 'I10',1,hDiv, bi,bj,k,myIter,myThid)
677 CALL WRITE_LOCAL_RL('Dt','I10',1,tension,bi,bj,k,myIter,myThid)
678 CALL WRITE_LOCAL_RL('Du','I10',1,guDiss, bi,bj,k,myIter,myThid)
679 CALL WRITE_LOCAL_RL('Dv','I10',1,gvDiss, bi,bj,k,myIter,myThid)
680 ENDIF
681 #ifdef ALLOW_MNC
682 IF (useMNC .AND. snapshot_mnc) THEN
683 CALL MNC_CW_RL_W_OFFSET(pf,'mom_vi',bi,bj,'W3',omega3,
684 & offsets, myThid)
685 CALL MNC_CW_RL_W_OFFSET(pf,'mom_vi',bi,bj,'KE',KE,
686 & offsets, myThid)
687 CALL MNC_CW_RL_W_OFFSET(pf,'mom_vi',bi,bj,'D', hDiv,
688 & offsets, myThid)
689 CALL MNC_CW_RL_W_OFFSET(pf,'mom_vi',bi,bj,'Dt',tension,
690 & offsets, myThid)
691 CALL MNC_CW_RL_W_OFFSET(pf,'mom_vi',bi,bj,'Du',guDiss,
692 & offsets, myThid)
693 CALL MNC_CW_RL_W_OFFSET(pf,'mom_vi',bi,bj,'Dv',gvDiss,
694 & offsets, myThid)
695 ENDIF
696 #endif /* ALLOW_MNC */
697 ENDIF
698
699 #ifdef ALLOW_DIAGNOSTICS
700 IF ( useDiagnostics ) THEN
701 CALL DIAGNOSTICS_FILL(KE, 'momKE ',k,1,2,bi,bj,myThid)
702 IF (momViscosity) THEN
703 CALL DIAGNOSTICS_FILL(hDiv, 'momHDiv ',k,1,2,bi,bj,myThid)
704 CALL DIAGNOSTICS_FILL(tension,'Tension ',k,1,2,bi,bj,myThid)
705 CALL DIAGNOSTICS_FILL(guDiss, 'Um_Diss ',k,1,2,bi,bj,myThid)
706 CALL DIAGNOSTICS_FILL(gvDiss, 'Vm_Diss ',k,1,2,bi,bj,myThid)
707 ENDIF
708 CALL DIAGNOSTICS_FILL(gU(1-Olx,1-Oly,k,bi,bj),
709 & 'Um_Advec',k,1,2,bi,bj,myThid)
710 CALL DIAGNOSTICS_FILL(gV(1-Olx,1-Oly,k,bi,bj),
711 & 'Vm_Advec',k,1,2,bi,bj,myThid)
712 ENDIF
713 #endif /* ALLOW_DIAGNOSTICS */
714
715 #endif /* ALLOW_MOM_VECINV */
716
717 RETURN
718 END

  ViewVC Help
Powered by ViewVC 1.1.22