26 |
CEOI |
CEOI |
27 |
|
|
28 |
#include "MOM_FLUXFORM_OPTIONS.h" |
#include "MOM_FLUXFORM_OPTIONS.h" |
29 |
|
#ifdef ALLOW_AUTODIFF |
30 |
|
# include "AUTODIFF_OPTIONS.h" |
31 |
|
#endif |
32 |
#ifdef ALLOW_MOM_COMMON |
#ifdef ALLOW_MOM_COMMON |
33 |
# include "MOM_COMMON_OPTIONS.h" |
# include "MOM_COMMON_OPTIONS.h" |
34 |
#endif |
#endif |
39 |
C !INTERFACE: ========================================================== |
C !INTERFACE: ========================================================== |
40 |
SUBROUTINE MOM_FLUXFORM( |
SUBROUTINE MOM_FLUXFORM( |
41 |
I bi,bj,k,iMin,iMax,jMin,jMax, |
I bi,bj,k,iMin,iMax,jMin,jMax, |
42 |
I KappaRU, KappaRV, |
I kappaRU, kappaRV, |
43 |
U fVerUkm, fVerVkm, |
U fVerUkm, fVerVkm, |
44 |
O fVerUkp, fVerVkp, |
O fVerUkp, fVerVkp, |
45 |
O guDiss, gvDiss, |
O guDiss, gvDiss, |
62 |
#ifdef ALLOW_MOM_COMMON |
#ifdef ALLOW_MOM_COMMON |
63 |
# include "MOM_VISC.h" |
# include "MOM_VISC.h" |
64 |
#endif |
#endif |
65 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF |
66 |
# include "tamc.h" |
# include "tamc.h" |
67 |
# include "tamc_keys.h" |
# include "tamc_keys.h" |
68 |
# include "MOM_FLUXFORM.h" |
# include "MOM_FLUXFORM.h" |
72 |
C bi,bj :: current tile indices |
C bi,bj :: current tile indices |
73 |
C k :: current vertical level |
C k :: current vertical level |
74 |
C iMin,iMax,jMin,jMax :: loop ranges |
C iMin,iMax,jMin,jMax :: loop ranges |
75 |
C KappaRU :: vertical viscosity |
C kappaRU :: vertical viscosity |
76 |
C KappaRV :: vertical viscosity |
C kappaRV :: vertical viscosity |
77 |
C fVerUkm :: vertical advective flux of U, interface above (k-1/2) |
C fVerUkm :: vertical advective flux of U, interface above (k-1/2) |
78 |
C fVerVkm :: vertical advective flux of V, interface above (k-1/2) |
C fVerVkm :: vertical advective flux of V, interface above (k-1/2) |
79 |
C fVerUkp :: vertical advective flux of U, interface below (k+1/2) |
C fVerUkp :: vertical advective flux of U, interface below (k+1/2) |
85 |
C myThid :: my Thread Id number |
C myThid :: my Thread Id number |
86 |
INTEGER bi,bj,k |
INTEGER bi,bj,k |
87 |
INTEGER iMin,iMax,jMin,jMax |
INTEGER iMin,iMax,jMin,jMax |
88 |
_RL KappaRU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
_RL kappaRU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+1) |
89 |
_RL KappaRV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
_RL kappaRV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+1) |
90 |
_RL fVerUkm(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
_RL fVerUkm(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
91 |
_RL fVerVkm(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
_RL fVerVkm(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
92 |
_RL fVerUkp(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
_RL fVerUkp(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
131 |
C mtFacMom - Metric term |
C mtFacMom - Metric term |
132 |
C uDudxFac, AhDudxFac, etc ... individual term parameters for switching terms off |
C uDudxFac, AhDudxFac, etc ... individual term parameters for switching terms off |
133 |
_RS hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
_RS hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
134 |
|
_RS h0FacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
135 |
_RS r_hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
_RS r_hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
136 |
_RS xA(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
_RS xA(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
137 |
_RS yA(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
_RS yA(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
253 |
ENDIF |
ENDIF |
254 |
|
|
255 |
IF ( no_slip_bottom |
IF ( no_slip_bottom |
256 |
& .OR. bottomDragQuadratic.NE.0. |
& .OR. selectBotDragQuadr.GE.0 |
257 |
& .OR. bottomDragLinear.NE.0.) THEN |
& .OR. bottomDragLinear.NE.0.) THEN |
258 |
bottomDragTerms=.TRUE. |
bottomDragTerms=.TRUE. |
259 |
ELSE |
ELSE |
261 |
ENDIF |
ENDIF |
262 |
|
|
263 |
C-- Calculate open water fraction at vorticity points |
C-- Calculate open water fraction at vorticity points |
264 |
CALL MOM_CALC_HFACZ(bi,bj,k,hFacZ,r_hFacZ,myThid) |
CALL MOM_CALC_HFACZ( bi,bj,k,hFacZ,r_hFacZ,myThid ) |
265 |
|
|
266 |
C---- Calculate common quantities used in both U and V equations |
C---- Calculate common quantities used in both U and V equations |
267 |
C Calculate tracer cell face open areas |
C Calculate tracer cell face open areas |
271 |
& *drF(k)*_hFacW(i,j,k,bi,bj) |
& *drF(k)*_hFacW(i,j,k,bi,bj) |
272 |
yA(i,j) = _dxG(i,j,bi,bj)*deepFacC(k) |
yA(i,j) = _dxG(i,j,bi,bj)*deepFacC(k) |
273 |
& *drF(k)*_hFacS(i,j,k,bi,bj) |
& *drF(k)*_hFacS(i,j,k,bi,bj) |
274 |
|
h0FacZ(i,j) = hFacZ(i,j) |
275 |
ENDDO |
ENDDO |
276 |
ENDDO |
ENDDO |
277 |
|
#ifdef NONLIN_FRSURF |
278 |
|
IF ( momViscosity .AND. no_slip_sides |
279 |
|
& .AND. nonlinFreeSurf.GT.0 ) THEN |
280 |
|
DO j=2-OLy,sNy+OLy |
281 |
|
DO i=2-OLx,sNx+OLx |
282 |
|
h0FacZ(i,j) = MIN( |
283 |
|
& MIN( h0FacW(i,j,k,bi,bj), h0FacW(i,j-1,k,bi,bj) ), |
284 |
|
& MIN( h0FacS(i,j,k,bi,bj), h0FacS(i-1,j,k,bi,bj) ) ) |
285 |
|
ENDDO |
286 |
|
ENDDO |
287 |
|
ENDIF |
288 |
|
#endif /* NONLIN_FRSURF */ |
289 |
|
|
290 |
C Make local copies of horizontal flow field |
C Make local copies of horizontal flow field |
291 |
DO j=1-OLy,sNy+OLy |
DO j=1-OLy,sNy+OLy |
304 |
ENDDO |
ENDDO |
305 |
ENDDO |
ENDDO |
306 |
|
|
307 |
CALL MOM_CALC_KE(bi,bj,k,2,uFld,vFld,KE,myThid) |
CALL MOM_CALC_KE( bi,bj,k,2,uFld,vFld,KE,myThid ) |
308 |
IF ( momViscosity) THEN |
IF ( useVariableVisc ) THEN |
309 |
CALL MOM_CALC_HDIV(bi,bj,k,2,uFld,vFld,hDiv,myThid) |
CALL MOM_CALC_HDIV( bi,bj,k,2,uFld,vFld,hDiv,myThid ) |
310 |
CALL MOM_CALC_RELVORT3(bi,bj,k,uFld,vFld,hFacZ,vort3,myThid) |
CALL MOM_CALC_RELVORT3( bi,bj,k,uFld,vFld,hFacZ,vort3,myThid ) |
311 |
CALL MOM_CALC_TENSION(bi,bj,k,uFld,vFld,tension,myThid) |
CALL MOM_CALC_TENSION( bi,bj,k,uFld,vFld,tension,myThid ) |
312 |
CALL MOM_CALC_STRAIN(bi,bj,k,uFld,vFld,hFacZ,strain,myThid) |
CALL MOM_CALC_STRAIN( bi,bj,k,uFld,vFld,hFacZ,strain,myThid ) |
313 |
DO j=1-OLy,sNy+OLy |
DO j=1-OLy,sNy+OLy |
314 |
DO i=1-OLx,sNx+OLx |
DO i=1-OLx,sNx+OLx |
315 |
IF ( hFacZ(i,j).EQ.0. ) THEN |
IF ( hFacZ(i,j).EQ.0. ) THEN |
355 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
356 |
CALL MOM_CALC_RTRANS( k, bi, bj, |
CALL MOM_CALC_RTRANS( k, bi, bj, |
357 |
O rTransU, rTransV, |
O rTransU, rTransV, |
358 |
I myTime, myIter, myThid) |
I myTime, myIter, myThid ) |
359 |
|
|
360 |
C- Free surface correction term (flux at k=1) |
C- Free surface correction term (flux at k=1) |
361 |
CALL MOM_U_ADV_WU( bi,bj,k,uVel,wVel,rTransU, |
CALL MOM_U_ADV_WU( bi,bj,k,uVel,wVel,rTransU, |
371 |
IF (momAdvection) THEN |
IF (momAdvection) THEN |
372 |
CALL MOM_CALC_RTRANS( k+1, bi, bj, |
CALL MOM_CALC_RTRANS( k+1, bi, bj, |
373 |
O rTransU, rTransV, |
O rTransU, rTransV, |
374 |
I myTime, myIter, myThid) |
I myTime, myIter, myThid ) |
375 |
ENDIF |
ENDIF |
376 |
|
|
377 |
#ifdef MOM_BOUNDARY_CONSERVE |
#ifdef MOM_BOUNDARY_CONSERVE |
419 |
#else /* MOM_BOUNDARY_CONSERVE */ |
#else /* MOM_BOUNDARY_CONSERVE */ |
420 |
C-- Zonal flux (fZon is at east face of "u" cell) |
C-- Zonal flux (fZon is at east face of "u" cell) |
421 |
C Mean flow component of zonal flux -> fZon |
C Mean flow component of zonal flux -> fZon |
422 |
CALL MOM_U_ADV_UU(bi,bj,k,uTrans,uFld,fZon,myThid) |
CALL MOM_U_ADV_UU( bi,bj,k,uTrans,uFld,fZon,myThid ) |
423 |
|
|
424 |
C-- Meridional flux (fMer is at south face of "u" cell) |
C-- Meridional flux (fMer is at south face of "u" cell) |
425 |
C Mean flow component of meridional flux -> fMer |
C Mean flow component of meridional flux -> fMer |
426 |
CALL MOM_U_ADV_VU(bi,bj,k,vTrans,uFld,fMer,myThid) |
CALL MOM_U_ADV_VU( bi,bj,k,vTrans,uFld,fMer,myThid ) |
427 |
|
|
428 |
C-- Vertical flux (fVer is at upper face of "u" cell) |
C-- Vertical flux (fVer is at upper face of "u" cell) |
429 |
C Mean flow component of vertical flux (at k+1) -> fVer |
C Mean flow component of vertical flux (at k+1) -> fVer |
465 |
DO j=jMin,jMax |
DO j=jMin,jMax |
466 |
DO i=iMin,iMax |
DO i=iMin,iMax |
467 |
gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj) |
gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj) |
468 |
& - (rStarExpW(i,j,bi,bj) - 1. _d 0)/deltaTfreesurf |
& - (rStarExpW(i,j,bi,bj) - 1. _d 0)/deltaTFreeSurf |
469 |
& *uVel(i,j,k,bi,bj) |
& *uVel(i,j,k,bi,bj) |
470 |
ENDDO |
ENDDO |
471 |
ENDDO |
ENDDO |
511 |
|
|
512 |
C Bi-harmonic term del^2 U -> v4F |
C Bi-harmonic term del^2 U -> v4F |
513 |
IF ( useBiharmonicVisc ) |
IF ( useBiharmonicVisc ) |
514 |
& CALL MOM_U_DEL2U(bi,bj,k,uFld,hFacZ,v4f,myThid) |
& CALL MOM_U_DEL2U( bi, bj, k, uFld, hFacZ, h0FacZ, |
515 |
|
O v4f, myThid ) |
516 |
|
|
517 |
C Laplacian and bi-harmonic terms, Zonal Fluxes -> fZon |
C Laplacian and bi-harmonic terms, Zonal Fluxes -> fZon |
518 |
CALL MOM_U_XVISCFLUX(bi,bj,k,uFld,v4F,fZon, |
CALL MOM_U_XVISCFLUX( bi,bj,k,uFld,v4F,fZon, |
519 |
I viscAh_D,viscA4_D,myThid) |
I viscAh_D,viscA4_D,myThid ) |
520 |
|
|
521 |
C Laplacian and bi-harmonic termis, Merid Fluxes -> fMer |
C Laplacian and bi-harmonic termis, Merid Fluxes -> fMer |
522 |
CALL MOM_U_YVISCFLUX(bi,bj,k,uFld,v4F,hFacZ,fMer, |
CALL MOM_U_YVISCFLUX( bi,bj,k,uFld,v4F,hFacZ,fMer, |
523 |
I viscAh_Z,viscA4_Z,myThid) |
I viscAh_Z,viscA4_Z,myThid ) |
524 |
|
|
525 |
C Eddy component of vertical flux (interior component only) -> fVrUp & fVrDw |
C Eddy component of vertical flux (interior component only) -> fVrUp & fVrDw |
526 |
IF (.NOT.implicitViscosity) THEN |
IF (.NOT.implicitViscosity) THEN |
527 |
CALL MOM_U_RVISCFLUX(bi,bj, k, uVel,KappaRU,fVrUp,myThid) |
CALL MOM_U_RVISCFLUX( bi,bj, k, uVel,kappaRU,fVrUp,myThid ) |
528 |
CALL MOM_U_RVISCFLUX(bi,bj,k+1,uVel,KappaRU,fVrDw,myThid) |
CALL MOM_U_RVISCFLUX( bi,bj,k+1,uVel,kappaRU,fVrDw,myThid ) |
529 |
ENDIF |
ENDIF |
530 |
|
|
531 |
C-- Tendency is minus divergence of the fluxes |
C-- Tendency is minus divergence of the fluxes |
561 |
IF (no_slip_sides) THEN |
IF (no_slip_sides) THEN |
562 |
C- No-slip BCs impose a drag at walls... |
C- No-slip BCs impose a drag at walls... |
563 |
CALL MOM_U_SIDEDRAG( bi, bj, k, |
CALL MOM_U_SIDEDRAG( bi, bj, k, |
564 |
I uFld, v4f, hFacZ, |
I uFld, v4f, h0FacZ, |
565 |
I viscAh_Z, viscA4_Z, |
I viscAh_Z, viscA4_Z, |
566 |
I useHarmonicVisc, useBiharmonicVisc, useVariableVisc, |
I useHarmonicVisc, useBiharmonicVisc, useVariableVisc, |
567 |
O vF, |
O vF, |
574 |
ENDIF |
ENDIF |
575 |
C- No-slip BCs impose a drag at bottom |
C- No-slip BCs impose a drag at bottom |
576 |
IF (bottomDragTerms) THEN |
IF (bottomDragTerms) THEN |
577 |
CALL MOM_U_BOTTOMDRAG(bi,bj,k,uFld,KE,KappaRU,vF,myThid) |
CALL MOM_U_BOTTOMDRAG( bi, bj, k, |
578 |
|
I uFld, vFld, KE, kappaRU, |
579 |
|
O vF, |
580 |
|
I myThid ) |
581 |
DO j=jMin,jMax |
DO j=jMin,jMax |
582 |
DO i=iMin,iMax |
DO i=iMin,iMax |
583 |
gUdiss(i,j) = gUdiss(i,j) + vF(i,j) |
gUdiss(i,j) = gUdiss(i,j) + vF(i,j) |
587 |
|
|
588 |
#ifdef ALLOW_SHELFICE |
#ifdef ALLOW_SHELFICE |
589 |
IF (useShelfIce) THEN |
IF (useShelfIce) THEN |
590 |
CALL SHELFICE_U_DRAG(bi,bj,k,uFld,KE,KappaRU,vF,myThid) |
CALL SHELFICE_U_DRAG( bi, bj, k, |
591 |
|
I uFld, vFld, KE, kappaRU, |
592 |
|
O vF, |
593 |
|
I myThid ) |
594 |
DO j=jMin,jMax |
DO j=jMin,jMax |
595 |
DO i=iMin,iMax |
DO i=iMin,iMax |
596 |
gUdiss(i,j) = gUdiss(i,j) + vF(i,j) |
gUdiss(i,j) = gUdiss(i,j) + vF(i,j) |
611 |
C-- Metric terms for curvilinear grid systems |
C-- Metric terms for curvilinear grid systems |
612 |
IF (useNHMTerms) THEN |
IF (useNHMTerms) THEN |
613 |
C o Non-Hydrostatic (spherical) metric terms |
C o Non-Hydrostatic (spherical) metric terms |
614 |
CALL MOM_U_METRIC_NH(bi,bj,k,uFld,wVel,mT,myThid) |
CALL MOM_U_METRIC_NH( bi,bj,k,uFld,wVel,mT,myThid ) |
615 |
DO j=jMin,jMax |
DO j=jMin,jMax |
616 |
DO i=iMin,iMax |
DO i=iMin,iMax |
617 |
gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)+mtNHFacU*mT(i,j) |
gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)+mtNHFacU*mT(i,j) |
620 |
ENDIF |
ENDIF |
621 |
IF ( usingSphericalPolarGrid .AND. metricTerms ) THEN |
IF ( usingSphericalPolarGrid .AND. metricTerms ) THEN |
622 |
C o Spherical polar grid metric terms |
C o Spherical polar grid metric terms |
623 |
CALL MOM_U_METRIC_SPHERE(bi,bj,k,uFld,vFld,mT,myThid) |
CALL MOM_U_METRIC_SPHERE( bi,bj,k,uFld,vFld,mT,myThid ) |
624 |
DO j=jMin,jMax |
DO j=jMin,jMax |
625 |
DO i=iMin,iMax |
DO i=iMin,iMax |
626 |
gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)+mtFacU*mT(i,j) |
gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)+mtFacU*mT(i,j) |
629 |
ENDIF |
ENDIF |
630 |
IF ( usingCylindricalGrid .AND. metricTerms ) THEN |
IF ( usingCylindricalGrid .AND. metricTerms ) THEN |
631 |
C o Cylindrical grid metric terms |
C o Cylindrical grid metric terms |
632 |
CALL MOM_U_METRIC_CYLINDER(bi,bj,k,uFld,vFld,mT,myThid) |
CALL MOM_U_METRIC_CYLINDER( bi,bj,k,uFld,vFld,mT,myThid ) |
633 |
DO j=jMin,jMax |
DO j=jMin,jMax |
634 |
DO i=iMin,iMax |
DO i=iMin,iMax |
635 |
gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)+mtFacU*mT(i,j) |
gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)+mtFacU*mT(i,j) |
698 |
DO j=jMin,jMax |
DO j=jMin,jMax |
699 |
DO i=iMin,iMax |
DO i=iMin,iMax |
700 |
gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj) |
gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj) |
701 |
& - (rStarExpS(i,j,bi,bj) - 1. _d 0)/deltaTfreesurf |
& - (rStarExpS(i,j,bi,bj) - 1. _d 0)/deltaTFreeSurf |
702 |
& *vVel(i,j,k,bi,bj) |
& *vVel(i,j,k,bi,bj) |
703 |
ENDDO |
ENDDO |
704 |
ENDDO |
ENDDO |
743 |
C--- Calculate eddy fluxes (dissipation) between cells for meridional flow. |
C--- Calculate eddy fluxes (dissipation) between cells for meridional flow. |
744 |
C Bi-harmonic term del^2 V -> v4F |
C Bi-harmonic term del^2 V -> v4F |
745 |
IF ( useBiharmonicVisc ) |
IF ( useBiharmonicVisc ) |
746 |
& CALL MOM_V_DEL2V(bi,bj,k,vFld,hFacZ,v4f,myThid) |
& CALL MOM_V_DEL2V( bi, bj, k, vFld, hFacZ, h0FacZ, |
747 |
|
O v4f, myThid ) |
748 |
|
|
749 |
C Laplacian and bi-harmonic terms, Zonal Fluxes -> fZon |
C Laplacian and bi-harmonic terms, Zonal Fluxes -> fZon |
750 |
CALL MOM_V_XVISCFLUX(bi,bj,k,vFld,v4f,hFacZ,fZon, |
CALL MOM_V_XVISCFLUX( bi,bj,k,vFld,v4f,hFacZ,fZon, |
751 |
I viscAh_Z,viscA4_Z,myThid) |
I viscAh_Z,viscA4_Z,myThid ) |
752 |
|
|
753 |
C Laplacian and bi-harmonic termis, Merid Fluxes -> fMer |
C Laplacian and bi-harmonic termis, Merid Fluxes -> fMer |
754 |
CALL MOM_V_YVISCFLUX(bi,bj,k,vFld,v4f,fMer, |
CALL MOM_V_YVISCFLUX( bi,bj,k,vFld,v4f,fMer, |
755 |
I viscAh_D,viscA4_D,myThid) |
I viscAh_D,viscA4_D,myThid ) |
756 |
|
|
757 |
C Eddy component of vertical flux (interior component only) -> fVrUp & fVrDw |
C Eddy component of vertical flux (interior component only) -> fVrUp & fVrDw |
758 |
IF (.NOT.implicitViscosity) THEN |
IF (.NOT.implicitViscosity) THEN |
759 |
CALL MOM_V_RVISCFLUX(bi,bj, k, vVel,KappaRV,fVrUp,myThid) |
CALL MOM_V_RVISCFLUX( bi,bj, k, vVel,KappaRV,fVrUp,myThid ) |
760 |
CALL MOM_V_RVISCFLUX(bi,bj,k+1,vVel,KappaRV,fVrDw,myThid) |
CALL MOM_V_RVISCFLUX( bi,bj,k+1,vVel,KappaRV,fVrDw,myThid ) |
761 |
ENDIF |
ENDIF |
762 |
|
|
763 |
C-- Tendency is minus divergence of the fluxes + coriolis + pressure term |
C-- Tendency is minus divergence of the fluxes + coriolis + pressure term |
793 |
IF (no_slip_sides) THEN |
IF (no_slip_sides) THEN |
794 |
C- No-slip BCs impose a drag at walls... |
C- No-slip BCs impose a drag at walls... |
795 |
CALL MOM_V_SIDEDRAG( bi, bj, k, |
CALL MOM_V_SIDEDRAG( bi, bj, k, |
796 |
I vFld, v4f, hFacZ, |
I vFld, v4f, h0FacZ, |
797 |
I viscAh_Z,viscA4_Z, |
I viscAh_Z, viscA4_Z, |
798 |
I useHarmonicVisc, useBiharmonicVisc, useVariableVisc, |
I useHarmonicVisc, useBiharmonicVisc, useVariableVisc, |
799 |
O vF, |
O vF, |
800 |
I myThid ) |
I myThid ) |
806 |
ENDIF |
ENDIF |
807 |
C- No-slip BCs impose a drag at bottom |
C- No-slip BCs impose a drag at bottom |
808 |
IF (bottomDragTerms) THEN |
IF (bottomDragTerms) THEN |
809 |
CALL MOM_V_BOTTOMDRAG(bi,bj,k,vFld,KE,KappaRV,vF,myThid) |
CALL MOM_V_BOTTOMDRAG( bi, bj, k, |
810 |
|
I uFld, vFld, KE, kappaRV, |
811 |
|
O vF, |
812 |
|
I myThid ) |
813 |
DO j=jMin,jMax |
DO j=jMin,jMax |
814 |
DO i=iMin,iMax |
DO i=iMin,iMax |
815 |
gvDiss(i,j) = gvDiss(i,j) + vF(i,j) |
gvDiss(i,j) = gvDiss(i,j) + vF(i,j) |
819 |
|
|
820 |
#ifdef ALLOW_SHELFICE |
#ifdef ALLOW_SHELFICE |
821 |
IF (useShelfIce) THEN |
IF (useShelfIce) THEN |
822 |
CALL SHELFICE_V_DRAG(bi,bj,k,vFld,KE,KappaRV,vF,myThid) |
CALL SHELFICE_V_DRAG( bi, bj, k, |
823 |
|
I uFld, vFld, KE, kappaRV, |
824 |
|
O vF, |
825 |
|
I myThid ) |
826 |
DO j=jMin,jMax |
DO j=jMin,jMax |
827 |
DO i=iMin,iMax |
DO i=iMin,iMax |
828 |
gvDiss(i,j) = gvDiss(i,j) + vF(i,j) |
gvDiss(i,j) = gvDiss(i,j) + vF(i,j) |
843 |
C-- Metric terms for curvilinear grid systems |
C-- Metric terms for curvilinear grid systems |
844 |
IF (useNHMTerms) THEN |
IF (useNHMTerms) THEN |
845 |
C o Non-Hydrostatic (spherical) metric terms |
C o Non-Hydrostatic (spherical) metric terms |
846 |
CALL MOM_V_METRIC_NH(bi,bj,k,vFld,wVel,mT,myThid) |
CALL MOM_V_METRIC_NH( bi,bj,k,vFld,wVel,mT,myThid ) |
847 |
DO j=jMin,jMax |
DO j=jMin,jMax |
848 |
DO i=iMin,iMax |
DO i=iMin,iMax |
849 |
gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)+mtNHFacV*mT(i,j) |
gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)+mtNHFacV*mT(i,j) |
852 |
ENDIF |
ENDIF |
853 |
IF ( usingSphericalPolarGrid .AND. metricTerms ) THEN |
IF ( usingSphericalPolarGrid .AND. metricTerms ) THEN |
854 |
C o Spherical polar grid metric terms |
C o Spherical polar grid metric terms |
855 |
CALL MOM_V_METRIC_SPHERE(bi,bj,k,uFld,mT,myThid) |
CALL MOM_V_METRIC_SPHERE( bi,bj,k,uFld,mT,myThid ) |
856 |
DO j=jMin,jMax |
DO j=jMin,jMax |
857 |
DO i=iMin,iMax |
DO i=iMin,iMax |
858 |
gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)+mtFacV*mT(i,j) |
gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)+mtFacV*mT(i,j) |
861 |
ENDIF |
ENDIF |
862 |
IF ( usingCylindricalGrid .AND. metricTerms ) THEN |
IF ( usingCylindricalGrid .AND. metricTerms ) THEN |
863 |
C o Cylindrical grid metric terms |
C o Cylindrical grid metric terms |
864 |
CALL MOM_V_METRIC_CYLINDER(bi,bj,k,uFld,vFld,mT,myThid) |
CALL MOM_V_METRIC_CYLINDER( bi,bj,k,uFld,vFld,mT,myThid ) |
865 |
DO j=jMin,jMax |
DO j=jMin,jMax |
866 |
DO i=iMin,iMax |
DO i=iMin,iMax |
867 |
gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)+mtFacV*mT(i,j) |
gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)+mtFacV*mT(i,j) |
873 |
|
|
874 |
C-- Coriolis term (call to CD_CODE_SCHEME has been moved to timestep.F) |
C-- Coriolis term (call to CD_CODE_SCHEME has been moved to timestep.F) |
875 |
IF (.NOT.useCDscheme) THEN |
IF (.NOT.useCDscheme) THEN |
876 |
CALL MOM_U_CORIOLIS(bi,bj,k,vFld,cf,myThid) |
CALL MOM_U_CORIOLIS( bi,bj,k,vFld,cf,myThid ) |
877 |
DO j=jMin,jMax |
DO j=jMin,jMax |
878 |
DO i=iMin,iMax |
DO i=iMin,iMax |
879 |
gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)+fuFac*cf(i,j) |
gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)+fuFac*cf(i,j) |
883 |
IF ( useDiagnostics ) |
IF ( useDiagnostics ) |
884 |
& CALL DIAGNOSTICS_FILL(cf,'Um_Cori ',k,1,2,bi,bj,myThid) |
& CALL DIAGNOSTICS_FILL(cf,'Um_Cori ',k,1,2,bi,bj,myThid) |
885 |
#endif |
#endif |
886 |
CALL MOM_V_CORIOLIS(bi,bj,k,uFld,cf,myThid) |
CALL MOM_V_CORIOLIS( bi,bj,k,uFld,cf,myThid ) |
887 |
DO j=jMin,jMax |
DO j=jMin,jMax |
888 |
DO i=iMin,iMax |
DO i=iMin,iMax |
889 |
gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)+fvFac*cf(i,j) |
gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)+fvFac*cf(i,j) |
897 |
|
|
898 |
C-- 3.D Coriolis term (horizontal momentum, Eastward component: -fprime*w) |
C-- 3.D Coriolis term (horizontal momentum, Eastward component: -fprime*w) |
899 |
IF ( use3dCoriolis ) THEN |
IF ( use3dCoriolis ) THEN |
900 |
CALL MOM_U_CORIOLIS_NH(bi,bj,k,wVel,cf,myThid) |
CALL MOM_U_CORIOLIS_NH( bi,bj,k,wVel,cf,myThid ) |
901 |
DO j=jMin,jMax |
DO j=jMin,jMax |
902 |
DO i=iMin,iMax |
DO i=iMin,iMax |
903 |
gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)+fuFac*cf(i,j) |
gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)+fuFac*cf(i,j) |
905 |
ENDDO |
ENDDO |
906 |
IF ( usingCurvilinearGrid ) THEN |
IF ( usingCurvilinearGrid ) THEN |
907 |
C- presently, non zero angleSinC array only supported with Curvilinear-Grid |
C- presently, non zero angleSinC array only supported with Curvilinear-Grid |
908 |
CALL MOM_V_CORIOLIS_NH(bi,bj,k,wVel,cf,myThid) |
CALL MOM_V_CORIOLIS_NH( bi,bj,k,wVel,cf,myThid ) |
909 |
DO j=jMin,jMax |
DO j=jMin,jMax |
910 |
DO i=iMin,iMax |
DO i=iMin,iMax |
911 |
gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)+fvFac*cf(i,j) |
gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)+fvFac*cf(i,j) |
931 |
& 'Um_Advec',k,1,2,bi,bj,myThid) |
& 'Um_Advec',k,1,2,bi,bj,myThid) |
932 |
CALL DIAGNOSTICS_FILL(gV(1-OLx,1-OLy,k,bi,bj), |
CALL DIAGNOSTICS_FILL(gV(1-OLx,1-OLy,k,bi,bj), |
933 |
& 'Vm_Advec',k,1,2,bi,bj,myThid) |
& 'Vm_Advec',k,1,2,bi,bj,myThid) |
|
IF (momViscosity) THEN |
|
|
CALL DIAGNOSTICS_FILL(guDiss,'Um_Diss ',k,1,2,bi,bj,myThid) |
|
|
CALL DIAGNOSTICS_FILL(gvDiss,'Vm_Diss ',k,1,2,bi,bj,myThid) |
|
|
ENDIF |
|
934 |
ENDIF |
ENDIF |
935 |
#endif /* ALLOW_DIAGNOSTICS */ |
#endif /* ALLOW_DIAGNOSTICS */ |
936 |
|
|