/[MITgcm]/MITgcm_contrib/dgoldberg/impl_drag/mom_v_bottomdrag.F
ViewVC logotype

Annotation of /MITgcm_contrib/dgoldberg/impl_drag/mom_v_bottomdrag.F

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


Revision 1.1 - (hide annotations) (download)
Mon Jul 18 09:21:00 2016 UTC (9 years ago) by dgoldberg
Branch: MAIN
CVS Tags: HEAD
implicit formulation for bottom drag

1 dgoldberg 1.1 C $Header: /u/gcmpack/MITgcm/pkg/mom_common/mom_v_bottomdrag.F,v 1.17 2015/01/04 16:16:32 jmc Exp $
2     C $Name: $
3    
4     #include "MOM_COMMON_OPTIONS.h"
5     #ifdef ALLOW_CTRL
6     # include "CTRL_OPTIONS.h"
7     #endif
8    
9     CBOP
10     C !ROUTINE: MOM_V_BOTTOMDRAG
11    
12     C !INTERFACE: ==========================================================
13     SUBROUTINE MOM_V_BOTTOMDRAG(
14     I bi, bj, k,
15     I uFld, vFld, KE, kappaRV,
16     O vDragTerms,
17     I myThid )
18    
19     C !DESCRIPTION:
20     C Calculates the drag due to friction and the no-slip condition at bottom:
21     C \begin{equation*}
22     C G^v_{drag} = - \frac{1}{\Delta r_f} ( r_b + C_D |v| + \frac{2}{\Delta r_c} ) v
23     C \end{equation*}
24    
25     C !USES: ===============================================================
26     IMPLICIT NONE
27     #include "SIZE.h"
28     #include "EEPARAMS.h"
29     #include "PARAMS.h"
30     #include "GRID.h"
31     #ifdef ALLOW_CTRL
32     # include "CTRL_FIELDS.h"
33     #endif
34    
35     C !INPUT PARAMETERS: ===================================================
36     C bi,bj :: tile indices
37     C k :: vertical level
38     C uFld :: zonal flow
39     C vFld :: meridional flow
40     C KE :: Kinetic energy
41     C kappaRV :: vertical viscosity
42     C myThid :: thread number
43     INTEGER bi,bj,k
44     _RL uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
45     _RL vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
46     _RL KE(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
47     _RL kappaRV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+1)
48     INTEGER myThid
49    
50     C !OUTPUT PARAMETERS: ==================================================
51     C vDragTerms :: drag term
52     _RL vDragTerms(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
53    
54     C !LOCAL VARIABLES: ====================================================
55     C i,j :: loop indices
56     INTEGER i,j,kDown,kLowF,kBottom
57     _RL viscFac, dragFac, vSq
58     _RL recDrC
59     _RL recDrF_bot(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
60     CEOP
61    
62     C- No-slip BCs impose a drag at bottom
63     viscFac = 0.
64     IF (no_slip_bottom) viscFac = 2.
65     IF ( usingZCoords ) THEN
66     kBottom = Nr
67     kDown = MIN(k+1,Nr)
68     kLowF = k+1
69     c dragFac = mass2rUnit*rhoConst
70     c dragFac = wUnit2rVel(k+1)
71     dragFac = 1. _d 0
72     ELSE
73     kBottom = 1
74     kDown = MAX(k-1,1)
75     kLowF = k
76     dragFac = mass2rUnit*rhoConst
77     c dragFac = wUnit2rVel(k)
78     ENDIF
79     IF ( k.EQ.kBottom ) THEN
80     recDrC = recip_drF(k)
81     DO j=1-OLy,sNy+OLy
82     DO i=1-OLx,sNx+OLx
83     recDrF_bot(i,j) = _recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
84     ENDDO
85     ENDDO
86     ELSE
87     recDrC = recip_drC(kLowF)
88     DO j=1-OLy,sNy+OLy
89     DO i=1-OLx,sNx+OLx
90     recDrF_bot(i,j) = _recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
91     & * ( 1. _d 0 -_maskS(i,j,kDown,bi,bj) )
92     ENDDO
93     ENDDO
94     ENDIF
95    
96     C-- Linear bottom drag:
97     DO j=1-OLy+1,sNy+OLy-1
98     DO i=1-OLx,sNx+OLx-1
99     vDragTerms(i,j) =
100     & - recDrF_bot(i,j)
101     & *( bottomDragLinear*dragFac
102     #ifdef ALLOW_BOTTOMDRAG_CONTROL
103     & + halfRL*( bottomDragFld(i,j-1,bi,bj)
104     & + bottomDragFld(i,j,bi,bj) )*dragFac
105     #endif
106     & )
107     #ifndef IMPLICIT_BOTTOMSIDEDRAG
108     & * vFld(i,j)
109     #endif
110     ENDDO
111     ENDDO
112    
113     C-- Add friction at the bottom (no-slip BC)
114     IF ( no_slip_bottom .AND. bottomVisc_pCell ) THEN
115     C- bottom friction accounts for true distance (including hFac) to the bottom
116     DO j=1-OLy+1,sNy+OLy-1
117     DO i=1-OLx,sNx+OLx-1
118     vDragTerms(i,j) = vDragTerms(i,j)
119     & - recDrF_bot(i,j)
120     & *( kappaRV(i,j,kLowF)*recDrC*viscFac
121     & *_recip_hFacS(i,j,k,bi,bj)
122     & )
123     #ifndef IMPLICIT_BOTTOMSIDEDRAG
124     & * vFld(i,j)
125     #endif
126    
127     ENDDO
128     ENDDO
129     ELSEIF ( no_slip_bottom ) THEN
130     C- ignore partial-cell reduction of the distance to the bottom
131     DO j=1-OLy+1,sNy+OLy-1
132     DO i=1-OLx,sNx+OLx-1
133     vDragTerms(i,j) = vDragTerms(i,j)
134     & - recDrF_bot(i,j)
135     & *( kappaRV(i,j,kLowF)*recDrC*viscFac
136     & )
137     #ifndef IMPLICIT_BOTTOMSIDEDRAG
138     & * vFld(i,j)
139     #endif
140    
141     ENDDO
142     ENDDO
143     ENDIF
144    
145     C-- Add quadratic bottom drag
146     IF ( selectBotDragQuadr.EQ.0 ) THEN
147     C- average grid-cell-center KE to get velocity norm @ V.pt
148     DO j=1-OLy+1,sNy+OLy-1
149     DO i=1-OLx,sNx+OLx-1
150     IF ( (KE(i,j)+KE(i,j-1)) .GT. 0. ) THEN
151     vDragTerms(i,j) = vDragTerms(i,j)
152     & - recDrF_bot(i,j)
153     & *bottomDragQuadratic*SQRT(KE(i,j)+KE(i,j-1))*dragFac
154     #ifndef IMPLICIT_BOTTOMSIDEDRAG
155     & * vFld(i,j)
156     #endif
157    
158     ENDIF
159     ENDDO
160     ENDDO
161     ELSEIF ( selectBotDragQuadr.EQ.1 ) THEN
162     C- calculate locally velocity norm @ V.pt (local V & 4 U averaged)
163     DO j=1-OLy+1,sNy+OLy-1
164     DO i=1-OLx,sNx+OLx-1
165     vSq = vFld(i,j)*vFld(i,j)
166     & + ( (uFld( i ,j-1)*uFld( i ,j-1)*hFacW( i ,j-1,k,bi,bj)
167     & +uFld( i , j )*uFld( i , j )*hFacW( i , j ,k,bi,bj))
168     & + (uFld(i+1,j-1)*uFld(i+1,j-1)*hFacW(i+1,j-1,k,bi,bj)
169     & +uFld(i+1, j )*uFld(i+1, j )*hFacW(i+1, j ,k,bi,bj))
170     & )*recip_hFacS(i,j,k,bi,bj)*0.25 _d 0
171     IF ( vSq.GT.zeroRL ) THEN
172     vDragTerms(i,j) = vDragTerms(i,j)
173     & - recDrF_bot(i,j)
174     & *bottomDragQuadratic*SQRT(vSq)*dragFac
175     #ifndef IMPLICIT_BOTTOMSIDEDRAG
176     & * vFld(i,j)
177     #endif
178    
179     ENDIF
180     ENDDO
181     ENDDO
182     ELSEIF ( selectBotDragQuadr.EQ.2 ) THEN
183     C- same as above but using wet-point method to average 4 U
184     DO j=1-OLy+1,sNy+OLy-1
185     DO i=1-OLx,sNx+OLx-1
186     vSq = ( hFacW( i ,j-1,k,bi,bj) + hFacW( i , j ,k,bi,bj) )
187     & + ( hFacW(i+1,j-1,k,bi,bj) + hFacW(i+1, j ,k,bi,bj) )
188     IF ( vSq.GT.zeroRL ) THEN
189     vSq = vFld(i,j)*vFld(i,j)
190     & +( (uFld( i ,j-1)*uFld( i ,j-1)*hFacW( i ,j-1,k,bi,bj)
191     & +uFld( i , j )*uFld( i , j )*hFacW( i , j ,k,bi,bj))
192     & + (uFld(i+1,j-1)*uFld(i+1,j-1)*hFacW(i+1,j-1,k,bi,bj)
193     & +uFld(i+1, j )*uFld(i+1, j )*hFacW(i+1, j ,k,bi,bj))
194     & )/vSq
195     ELSE
196     vSq = vFld(i,j)*vFld(i,j)
197     ENDIF
198     IF ( vSq.GT.zeroRL ) THEN
199     vDragTerms(i,j) = vDragTerms(i,j)
200     & - recDrF_bot(i,j)
201     & *bottomDragQuadratic*SQRT(vSq)*dragFac
202     #ifndef IMPLICIT_BOTTOMSIDEDRAG
203     & * vFld(i,j)
204     #endif
205    
206     ENDIF
207     ENDDO
208     ENDDO
209     ELSEIF ( selectBotDragQuadr.NE.-1 ) THEN
210     STOP 'MOM_V_BOTTOMDRAG: invalid selectBotDragQuadr value'
211     ENDIF
212    
213     #ifdef IMPLICIT_BOTTOMSIDEDRAG
214     DO j=1-OLy+1,sNy+OLy-1
215     DO i=1-OLx,sNx+OLx-1
216     vDragTerms(i,j) = vDragTerms(i,j)*vFld(i,j) /
217     & (1. - deltaTmom*vDragTerms(i,j))
218     ENDDO
219     ENDDO
220     #endif
221    
222    
223     #ifdef ALLOW_DIAGNOSTICS
224     IF (useDiagnostics) THEN
225     CALL DIAGNOSTICS_FILL(vDragTerms,'VBotDrag',k,1,2,bi,bj,myThid)
226     ENDIF
227     #endif /* ALLOW_DIAGNOSTICS */
228    
229     RETURN
230     END

  ViewVC Help
Powered by ViewVC 1.1.22