/[MITgcm]/MITgcm_contrib/ksnow/press_release/code/mom_u_bottomdrag.F
ViewVC logotype

Contents of /MITgcm_contrib/ksnow/press_release/code/mom_u_bottomdrag.F

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


Revision 1.2 - (show annotations) (download)
Thu Feb 2 17:29:49 2017 UTC (9 years, 7 months ago) by dgoldberg
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +1 -1 lines
FILE REMOVED
remove extraneous files

1 C $Header: /u/gcmpack/MITgcm_contrib/ksnow/press_release/code/mom_u_bottomdrag.F,v 1.1 2016/12/16 15:23:18 ksnow 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 #include "MOM_VISC.h"
32 #ifdef ALLOW_CTRL
33 # include "CTRL_FIELDS.h"
34 #endif
35
36 C !INPUT PARAMETERS: ===================================================
37 C bi,bj :: tile indices
38 C k :: vertical level
39 C uFld :: zonal flow
40 C vFld :: meridional flow
41 C KE :: Kinetic energy
42 C kappaRU :: vertical viscosity
43 C myThid :: thread number
44 INTEGER bi,bj,k
45 _RL uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
46 _RL vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
47 _RL KE(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
48 _RL kappaRU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+1)
49 INTEGER myThid
50
51 C !OUTPUT PARAMETERS: ==================================================
52 C uDragTerms :: drag term
53 _RL uDragTerms(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
54 #ifdef IMPLICIT_BOTTOMSIDEDRAG
55 _RL uDragTermsIn(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
56 #endif
57
58 C !LOCAL VARIABLES: ====================================================
59 C i,j :: loop indices
60 INTEGER i,j,kDown,kLowF,kBottom
61 _RL viscFac, dragFac, uSq
62 _RL recDrC
63 _RL recDrF_bot(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
64 CEOP
65
66 #ifdef IMPLICIT_BOTTOMSIDEDRAG
67 DO j=1-OLy,sNy+OLy
68 DO i=1-OLx,sNx+OLx
69 uDragTermsIn(i,j) = uDragTerms(i,j)
70 uDragTermsCommon(i,j,k,bi,bj) = 0. _d 0
71 uDragTerms(i,j) = 0.
72 ENDDO
73 ENDDO
74 #endif
75
76 C- No-slip BCs impose a drag at bottom
77 viscFac = 0.
78 IF (no_slip_bottom) viscFac = 2.
79 IF ( usingZCoords ) THEN
80 kBottom = Nr
81 kDown = MIN(k+1,Nr)
82 kLowF = k+1
83 c dragFac = mass2rUnit*rhoConst
84 c dragFac = wUnit2rVel(k+1)
85 dragFac = 1. _d 0
86 ELSE
87 kBottom = 1
88 kDown = MAX(k-1,1)
89 kLowF = k
90 dragFac = mass2rUnit*rhoConst
91 c dragFac = wUnit2rVel(k)
92 ENDIF
93 IF ( k.EQ.kBottom ) THEN
94 recDrC = recip_drF(k)
95 DO j=1-OLy,sNy+OLy
96 DO i=1-OLx,sNx+OLx
97 recDrF_bot(i,j) = _recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
98 ENDDO
99 ENDDO
100 ELSE
101 recDrC = recip_drC(kLowF)
102 DO j=1-OLy,sNy+OLy
103 DO i=1-OLx,sNx+OLx
104 recDrF_bot(i,j) = _recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
105 & * ( 1. _d 0 -_maskW(i,j,kDown,bi,bj) )
106 ENDDO
107 ENDDO
108 ENDIF
109
110 C-- Linear bottom drag:
111 DO j=1-OLy,sNy+OLy-1
112 DO i=1-OLx+1,sNx+OLx-1
113 uDragTerms(i,j) =
114 & - recDrF_bot(i,j)
115 & *( bottomDragLinear*dragFac
116 #ifdef ALLOW_BOTTOMDRAG_CONTROL
117 & + halfRL*( bottomDragFld(i-1,j,bi,bj)
118 & + bottomDragFld(i,j,bi,bj) )*dragFac
119 #endif
120 & )
121 #ifndef IMPLICIT_BOTTOMSIDEDRAG
122 & * uFld(i,j)
123 #endif
124 ENDDO
125 ENDDO
126
127 C-- Add friction at the bottom (no-slip BC)
128 IF ( no_slip_bottom .AND. bottomVisc_pCell ) THEN
129 C- bottom friction accounts for true distance (including hFac) 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 & *_recip_hFacW(i,j,k,bi,bj)
136 & )
137 #ifndef IMPLICIT_BOTTOMSIDEDRAG
138 & * uFld(i,j)
139 #endif
140 ENDDO
141 ENDDO
142 ELSEIF ( no_slip_bottom ) THEN
143 C- ignores partial-cell reduction of the distance to the bottom
144 DO j=1-OLy,sNy+OLy-1
145 DO i=1-OLx+1,sNx+OLx-1
146 uDragTerms(i,j) = uDragTerms(i,j)
147 & - recDrF_bot(i,j)
148 & *( kappaRU(i,j,kLowF)*recDrC*viscFac
149 & )
150 #ifndef IMPLICIT_BOTTOMSIDEDRAG
151 & * uFld(i,j)
152 #endif
153 ENDDO
154 ENDDO
155 ENDIF
156
157 C-- Add quadratic bottom drag
158 IF ( selectBotDragQuadr.EQ.0 ) THEN
159 C- average grid-cell-center KE to get velocity norm @ U.pt
160 DO j=1-OLy,sNy+OLy-1
161 DO i=1-OLx+1,sNx+OLx-1
162 IF ( (KE(i,j)+KE(i-1,j)) .GT. 0. ) THEN
163 uDragTerms(i,j) = uDragTerms(i,j)
164 & - recDrF_bot(i,j)
165 & *bottomDragQuadratic*SQRT(KE(i,j)+KE(i-1,j))*dragFac
166 #ifndef IMPLICIT_BOTTOMSIDEDRAG
167 & * uFld(i,j)
168 #endif
169 ENDIF
170 ENDDO
171 ENDDO
172 ELSEIF ( selectBotDragQuadr.EQ.1 ) THEN
173 C- calculate locally velocity norm @ U.pt (local U & 4 V averaged)
174 DO j=1-OLy,sNy+OLy-1
175 DO i=1-OLx+1,sNx+OLx-1
176 uSq = uFld(i,j)*uFld(i,j)
177 & + ( (vFld(i-1, j )*vFld(i-1, j )*hFacS(i-1, j ,k,bi,bj)
178 & +vFld( i , j )*vFld( i , j )*hFacS( i , j ,k,bi,bj))
179 & + (vFld(i-1,j+1)*vFld(i-1,j+1)*hFacS(i-1,j+1,k,bi,bj)
180 & +vFld( i ,j+1)*vFld( i ,j+1)*hFacS( i ,j+1,k,bi,bj))
181 & )*recip_hFacW(i,j,k,bi,bj)*0.25 _d 0
182 IF ( uSq.GT.zeroRL ) THEN
183 uDragTerms(i,j) = uDragTerms(i,j)
184 & - recDrF_bot(i,j)
185 & *bottomDragQuadratic*SQRT(uSq)*dragFac
186 #ifndef IMPLICIT_BOTTOMSIDEDRAG
187 & * uFld(i,j)
188 #endif
189 ENDIF
190 ENDDO
191 ENDDO
192 ELSEIF ( selectBotDragQuadr.EQ.2 ) THEN
193 C- same as above but using wet-point method to average 4 V
194 DO j=1-OLy,sNy+OLy-1
195 DO i=1-OLx+1,sNx+OLx-1
196 uSq = ( hFacS(i-1, j ,k,bi,bj) + hFacS( i , j ,k,bi,bj) )
197 & + ( hFacS(i-1,j+1,k,bi,bj) + hFacS( i ,j+1,k,bi,bj) )
198 IF ( uSq.GT.zeroRL ) THEN
199 uSq = uFld(i,j)*uFld(i,j)
200 & +( (vFld(i-1, j )*vFld(i-1, j )*hFacS(i-1, j ,k,bi,bj)
201 & +vFld( i , j )*vFld( i , j )*hFacS( i , j ,k,bi,bj))
202 & + (vFld(i-1,j+1)*vFld(i-1,j+1)*hFacS(i-1,j+1,k,bi,bj)
203 & +vFld( i ,j+1)*vFld( i ,j+1)*hFacS( i ,j+1,k,bi,bj))
204 & )/uSq
205 ELSE
206 uSq = uFld(i,j)*uFld(i,j)
207 ENDIF
208 IF ( uSq.GT.zeroRL ) THEN
209 uDragTerms(i,j) = uDragTerms(i,j)
210 & - recDrF_bot(i,j)
211 & *bottomDragQuadratic*SQRT(uSq)*dragFac
212 #ifndef IMPLICIT_BOTTOMSIDEDRAG
213 & * uFld(i,j)
214 #endif
215 ENDIF
216 ENDDO
217 ENDDO
218 ELSEIF ( selectBotDragQuadr.NE.-1 ) THEN
219 STOP 'MOM_U_BOTTOMDRAG: invalid selectBotDragQuadr value'
220 ENDIF
221
222 #ifdef IMPLICIT_BOTTOMSIDEDRAG
223 DO j=1-OLy,sNy+OLy-1
224 DO i=1-OLx+1,sNx+OLx-1
225 ! IF (kSurfW(i,j,bi,bj).eq.kLowC(i,j,bi,bj).or.
226 ! & kSurfW(i,j,bi,bj).eq.kLowC(i-1,j,bi,bj)) THEN
227 IF (.TRUE.) THEN
228 uDragTermsCommon(i,j,k,bi,bj) =
229 & uDragTermsCommon(i,j,k,bi,bj) +
230 & uDragTerms(i,j)
231 uDragTerms(i,j) = uDragTermsIn(i,j)
232 ELSE
233 uDragTerms(i,j) = uDragTerms(i,j)*uFld(i,j) /
234 & (1. - deltaTmom*uDragTerms(i,j))
235 ENDIF
236 ENDDO
237 ENDDO
238 #endif
239
240 #ifdef ALLOW_DIAGNOSTICS
241 IF (useDiagnostics) THEN
242 CALL DIAGNOSTICS_FILL(uDragTerms,'UBotDrag',k,1,2,bi,bj,myThid)
243 ENDIF
244 #endif /* ALLOW_DIAGNOSTICS */
245
246 RETURN
247 END

  ViewVC Help
Powered by ViewVC 1.1.22