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

Contents of /MITgcm_contrib/dgoldberg/impl_drag/mom_u_bottomdrag.F

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


Revision 1.1 - (show 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 C $Header: /u/gcmpack/MITgcm/pkg/mom_common/mom_u_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_U_BOTTOMDRAG
11
12 C !INTERFACE: ==========================================================
13 SUBROUTINE MOM_U_BOTTOMDRAG(
14 I bi, bj, k,
15 I uFld, vFld, KE, kappaRU,
16 O uDragTerms,
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^u_{drag} = - \frac{1}{\Delta r_f} ( r_b + C_D |v| + \frac{2}{\Delta r_c} ) u
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 kappaRU :: 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 kappaRU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+1)
48 INTEGER myThid
49
50 C !OUTPUT PARAMETERS: ==================================================
51 C uDragTerms :: drag term
52 _RL uDragTerms(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, uSq
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_hFacW(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_hFacW(i,j,k,bi,bj)*recip_drF(k)
91 & * ( 1. _d 0 -_maskW(i,j,kDown,bi,bj) )
92 ENDDO
93 ENDDO
94 ENDIF
95
96 C-- Linear bottom drag:
97 DO j=1-OLy,sNy+OLy-1
98 DO i=1-OLx+1,sNx+OLx-1
99 uDragTerms(i,j) =
100 & - recDrF_bot(i,j)
101 & *( bottomDragLinear*dragFac
102 #ifdef ALLOW_BOTTOMDRAG_CONTROL
103 & + halfRL*( bottomDragFld(i-1,j,bi,bj)
104 & + bottomDragFld(i,j,bi,bj) )*dragFac
105 #endif
106 & )
107 #ifndef IMPLICIT_BOTTOMSIDEDRAG
108 & * uFld(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,sNy+OLy-1
117 DO i=1-OLx+1,sNx+OLx-1
118 uDragTerms(i,j) = uDragTerms(i,j)
119 & - recDrF_bot(i,j)
120 & *( kappaRU(i,j,kLowF)*recDrC*viscFac
121 & *_recip_hFacW(i,j,k,bi,bj)
122 & )
123 #ifndef IMPLICIT_BOTTOMSIDEDRAG
124 & * uFld(i,j)
125 #endif
126 ENDDO
127 ENDDO
128 ELSEIF ( no_slip_bottom ) THEN
129 C- ignores partial-cell reduction of the distance to the bottom
130 DO j=1-OLy,sNy+OLy-1
131 DO i=1-OLx+1,sNx+OLx-1
132 uDragTerms(i,j) = uDragTerms(i,j)
133 & - recDrF_bot(i,j)
134 & *( kappaRU(i,j,kLowF)*recDrC*viscFac
135 & )
136 #ifndef IMPLICIT_BOTTOMSIDEDRAG
137 & * uFld(i,j)
138 #endif
139 ENDDO
140 ENDDO
141 ENDIF
142
143 C-- Add quadratic bottom drag
144 IF ( selectBotDragQuadr.EQ.0 ) THEN
145 C- average grid-cell-center KE to get velocity norm @ U.pt
146 DO j=1-OLy,sNy+OLy-1
147 DO i=1-OLx+1,sNx+OLx-1
148 IF ( (KE(i,j)+KE(i-1,j)) .GT. 0. ) THEN
149 uDragTerms(i,j) = uDragTerms(i,j)
150 & - recDrF_bot(i,j)
151 & *bottomDragQuadratic*SQRT(KE(i,j)+KE(i-1,j))*dragFac
152 #ifndef IMPLICIT_BOTTOMSIDEDRAG
153 & * uFld(i,j)
154 #endif
155 ENDIF
156 ENDDO
157 ENDDO
158 ELSEIF ( selectBotDragQuadr.EQ.1 ) THEN
159 C- calculate locally velocity norm @ U.pt (local U & 4 V averaged)
160 DO j=1-OLy,sNy+OLy-1
161 DO i=1-OLx+1,sNx+OLx-1
162 uSq = uFld(i,j)*uFld(i,j)
163 & + ( (vFld(i-1, j )*vFld(i-1, j )*hFacS(i-1, j ,k,bi,bj)
164 & +vFld( i , j )*vFld( i , j )*hFacS( i , j ,k,bi,bj))
165 & + (vFld(i-1,j+1)*vFld(i-1,j+1)*hFacS(i-1,j+1,k,bi,bj)
166 & +vFld( i ,j+1)*vFld( i ,j+1)*hFacS( i ,j+1,k,bi,bj))
167 & )*recip_hFacW(i,j,k,bi,bj)*0.25 _d 0
168 IF ( uSq.GT.zeroRL ) THEN
169 uDragTerms(i,j) = uDragTerms(i,j)
170 & - recDrF_bot(i,j)
171 & *bottomDragQuadratic*SQRT(uSq)*dragFac
172 #ifndef IMPLICIT_BOTTOMSIDEDRAG
173 & * uFld(i,j)
174 #endif
175 ENDIF
176 ENDDO
177 ENDDO
178 ELSEIF ( selectBotDragQuadr.EQ.2 ) THEN
179 C- same as above but using wet-point method to average 4 V
180 DO j=1-OLy,sNy+OLy-1
181 DO i=1-OLx+1,sNx+OLx-1
182 uSq = ( hFacS(i-1, j ,k,bi,bj) + hFacS( i , j ,k,bi,bj) )
183 & + ( hFacS(i-1,j+1,k,bi,bj) + hFacS( i ,j+1,k,bi,bj) )
184 IF ( uSq.GT.zeroRL ) THEN
185 uSq = uFld(i,j)*uFld(i,j)
186 & +( (vFld(i-1, j )*vFld(i-1, j )*hFacS(i-1, j ,k,bi,bj)
187 & +vFld( i , j )*vFld( i , j )*hFacS( i , j ,k,bi,bj))
188 & + (vFld(i-1,j+1)*vFld(i-1,j+1)*hFacS(i-1,j+1,k,bi,bj)
189 & +vFld( i ,j+1)*vFld( i ,j+1)*hFacS( i ,j+1,k,bi,bj))
190 & )/uSq
191 ELSE
192 uSq = uFld(i,j)*uFld(i,j)
193 ENDIF
194 IF ( uSq.GT.zeroRL ) THEN
195 uDragTerms(i,j) = uDragTerms(i,j)
196 & - recDrF_bot(i,j)
197 & *bottomDragQuadratic*SQRT(uSq)*dragFac
198 #ifndef IMPLICIT_BOTTOMSIDEDRAG
199 & * uFld(i,j)
200 #endif
201 ENDIF
202 ENDDO
203 ENDDO
204 ELSEIF ( selectBotDragQuadr.NE.-1 ) THEN
205 STOP 'MOM_U_BOTTOMDRAG: invalid selectBotDragQuadr value'
206 ENDIF
207
208 #ifdef IMPLICIT_BOTTOMSIDEDRAG
209 DO j=1-OLy+1,sNy+OLy-1
210 DO i=1-OLx,sNx+OLx-1
211 uDragTerms(i,j) = uDragTerms(i,j)*uFld(i,j) /
212 & (1. - deltaTmom*uDragTerms(i,j))
213 ENDDO
214 ENDDO
215 #endif
216
217 #ifdef ALLOW_DIAGNOSTICS
218 IF (useDiagnostics) THEN
219 CALL DIAGNOSTICS_FILL(uDragTerms,'UBotDrag',k,1,2,bi,bj,myThid)
220 ENDIF
221 #endif /* ALLOW_DIAGNOSTICS */
222
223 RETURN
224 END

  ViewVC Help
Powered by ViewVC 1.1.22