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

Contents of /MITgcm_contrib/ksnow/press_release/code/mom_v_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_v_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_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 #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 vFlda :: meridional flow
41 C KE :: Kinetic energy
42 C kappaRV :: 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 kappaRV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+1)
49 INTEGER myThid
50
51 C !OUTPUT PARAMETERS: ==================================================
52 C vDragTerms :: drag term
53 _RL vDragTerms(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
54 #ifdef IMPLICIT_BOTTOMSIDEDRAG
55 _RL vDragTermsIn(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, vSq
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 vDragTermsIn(i,j) = vDragTerms(i,j)
70 vDragTermsCommon(i,j,k,bi,bj) = 0. _d 0
71 vDragTerms(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_hFacS(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_hFacS(i,j,k,bi,bj)*recip_drF(k)
105 & * ( 1. _d 0 -_maskS(i,j,kDown,bi,bj) )
106 ENDDO
107 ENDDO
108 ENDIF
109
110 C-- Linear bottom drag:
111 DO j=1-OLy+1,sNy+OLy-1
112 DO i=1-OLx,sNx+OLx-1
113 vDragTerms(i,j) =
114 & - recDrF_bot(i,j)
115 & *( bottomDragLinear*dragFac
116 #ifdef ALLOW_BOTTOMDRAG_CONTROL
117 & + halfRL*( bottomDragFld(i,j-1,bi,bj)
118 & + bottomDragFld(i,j,bi,bj) )*dragFac
119 #endif
120 & )
121 #ifndef IMPLICIT_BOTTOMSIDEDRAG
122 & * vFld(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+1,sNy+OLy-1
131 DO i=1-OLx,sNx+OLx-1
132 vDragTerms(i,j) = vDragTerms(i,j)
133 & - recDrF_bot(i,j)
134 & *( kappaRV(i,j,kLowF)*recDrC*viscFac
135 & *_recip_hFacS(i,j,k,bi,bj)
136 & )
137 #ifndef IMPLICIT_BOTTOMSIDEDRAG
138 & * vFld(i,j)
139 #endif
140
141 ENDDO
142 ENDDO
143 ELSEIF ( no_slip_bottom ) THEN
144 C- ignore partial-cell reduction of the distance to the bottom
145 DO j=1-OLy+1,sNy+OLy-1
146 DO i=1-OLx,sNx+OLx-1
147 vDragTerms(i,j) = vDragTerms(i,j)
148 & - recDrF_bot(i,j)
149 & *( kappaRV(i,j,kLowF)*recDrC*viscFac
150 & )
151 #ifndef IMPLICIT_BOTTOMSIDEDRAG
152 & * vFld(i,j)
153 #endif
154 ENDDO
155 ENDDO
156 ENDIF
157
158 C-- Add quadratic bottom drag
159 IF ( selectBotDragQuadr.EQ.0 ) THEN
160 C- average grid-cell-center KE to get velocity norm @ V.pt
161 DO j=1-OLy+1,sNy+OLy-1
162 DO i=1-OLx,sNx+OLx-1
163 IF ( (KE(i,j)+KE(i,j-1)) .GT. 0. ) THEN
164 vDragTerms(i,j) = vDragTerms(i,j)
165 & - recDrF_bot(i,j)
166 & *bottomDragQuadratic*SQRT(KE(i,j)+KE(i,j-1))*dragFac
167 #ifndef IMPLICIT_BOTTOMSIDEDRAG
168 & * vFld(i,j)
169 #endif
170 ENDIF
171 ENDDO
172 ENDDO
173 ELSEIF ( selectBotDragQuadr.EQ.1 ) THEN
174 C- calculate locally velocity norm @ V.pt (local V & 4 U averaged)
175 DO j=1-OLy+1,sNy+OLy-1
176 DO i=1-OLx,sNx+OLx-1
177 vSq = vFld(i,j)*vFld(i,j)
178 & + ( (uFld( i ,j-1)*uFld( i ,j-1)*hFacW( i ,j-1,k,bi,bj)
179 & +uFld( i , j )*uFld( i , j )*hFacW( i , j ,k,bi,bj))
180 & + (uFld(i+1,j-1)*uFld(i+1,j-1)*hFacW(i+1,j-1,k,bi,bj)
181 & +uFld(i+1, j )*uFld(i+1, j )*hFacW(i+1, j ,k,bi,bj))
182 & )*recip_hFacS(i,j,k,bi,bj)*0.25 _d 0
183 IF ( vSq.GT.zeroRL ) THEN
184 vDragTerms(i,j) = vDragTerms(i,j)
185 & - recDrF_bot(i,j)
186 & *bottomDragQuadratic*SQRT(vSq)*dragFac
187 #ifndef IMPLICIT_BOTTOMSIDEDRAG
188 & * vFld(i,j)
189 #endif
190
191 ENDIF
192 ENDDO
193 ENDDO
194 ELSEIF ( selectBotDragQuadr.EQ.2 ) THEN
195 C- same as above but using wet-point method to average 4 U
196 DO j=1-OLy+1,sNy+OLy-1
197 DO i=1-OLx,sNx+OLx-1
198 vSq = ( hFacW( i ,j-1,k,bi,bj) + hFacW( i , j ,k,bi,bj) )
199 & + ( hFacW(i+1,j-1,k,bi,bj) + hFacW(i+1, j ,k,bi,bj) )
200 IF ( vSq.GT.zeroRL ) THEN
201 vSq = vFld(i,j)*vFld(i,j)
202 & +( (uFld( i ,j-1)*uFld( i ,j-1)*hFacW( i ,j-1,k,bi,bj)
203 & +uFld( i , j )*uFld( i , j )*hFacW( i , j ,k,bi,bj))
204 & + (uFld(i+1,j-1)*uFld(i+1,j-1)*hFacW(i+1,j-1,k,bi,bj)
205 & +uFld(i+1, j )*uFld(i+1, j )*hFacW(i+1, j ,k,bi,bj))
206 & )/vSq
207 ELSE
208 vSq = vFld(i,j)*vFld(i,j)
209 ENDIF
210 IF ( vSq.GT.zeroRL ) THEN
211 vDragTerms(i,j) = vDragTerms(i,j)
212 & - recDrF_bot(i,j)
213 & *bottomDragQuadratic*SQRT(vSq)*dragFac
214 #ifndef IMPLICIT_BOTTOMSIDEDRAG
215 & * vFld(i,j)
216 #endif
217 ENDIF
218 ENDDO
219 ENDDO
220 ELSEIF ( selectBotDragQuadr.NE.-1 ) THEN
221 STOP 'MOM_V_BOTTOMDRAG: invalid selectBotDragQuadr value'
222 ENDIF
223
224 #ifdef IMPLICIT_BOTTOMSIDEDRAG
225 DO j=1-OLy+1,sNy+OLy-1
226 DO i=1-OLx,sNx+OLx-1
227 ! IF (kSurfW(i,j,bi,bj).eq.kLowC(i,j,bi,bj).or.
228 ! & kSurfW(i,j,bi,bj).eq.kLowC(i-1,j,bi,bj)) THEN
229 IF (.TRUE.) THEN
230 vDragTermsCommon(i,j,k,bi,bj) =
231 & vDragTermsCommon(i,j,k,bi,bj) +
232 & vDragTerms(i,j)
233 vDragTerms(i,j) = vDragTermsIn(i,j)
234 IF(i.eq.12.and.j.eq.87.and.k.eq.71)then
235 print *, "GOT HERE DRAG", vdragterms(i,j),
236 & hfacs(i,j,k,bi,bj)
237 ENDIF
238 ELSE
239 vDragTerms(i,j) = vDragTerms(i,j)*vFld(i,j) /
240 & (1. - deltaTmom*vDragTerms(i,j))
241 ENDIF
242 ENDDO
243 ENDDO
244 #endif
245
246 #ifdef ALLOW_DIAGNOSTICS
247 IF (useDiagnostics) THEN
248 CALL DIAGNOSTICS_FILL(vDragTerms,'VBotDrag',k,1,2,bi,bj,myThid)
249 ENDIF
250 #endif /* ALLOW_DIAGNOSTICS */
251
252 RETURN
253 END

  ViewVC Help
Powered by ViewVC 1.1.22