/[MITgcm]/MITgcm/pkg/mom_common/mom_v_botdrag_impl.F
ViewVC logotype

Contents of /MITgcm/pkg/mom_common/mom_v_botdrag_impl.F

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


Revision 1.1 - (show annotations) (download)
Mon Nov 28 23:09:12 2016 UTC (7 years, 5 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, HEAD
implement fully Implicit bottom friction coupled with implicit surface
 pressure (hydrostatic only)

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_BOTDRAG_IMPL
11
12 C !INTERFACE: ==========================================================
13 SUBROUTINE MOM_V_BOTDRAG_IMPL(
14 I uFld, vFld, kappaRV,
15 O cDrag,
16 I bi, bj, myIter, myThid )
17
18 C !DESCRIPTION:
19 C Add contribution from drag due to friction and the no-slip condition at bottom
20 C to matrix main diagonal for implicit momentum solver
21 C \begin{equation*}
22 C C_{drag} = \frac{\Delta t}{\Delta r_f} (r_b + Cd |v| + \nu \frac{2}{\Delta r_c})
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 uFld :: zonal flow
37 C vFld :: meridional flow
38 C kappaRV :: vertical viscosity
39 C bi,bj :: tile indices
40 C myIter :: current iteration number
41 C myThid :: thread number
42 _RL uFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
43 _RL vFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
44 _RL kappaRV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+1)
45 INTEGER bi, bj
46 INTEGER myIter, myThid
47
48 C !OUTPUT PARAMETERS: ==================================================
49 C cDrag :: drag contribution to matrix main diagnonal
50 _RL cDrag(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
51
52 C !LOCAL VARIABLES: ====================================================
53 C i,j,k :: loop indices
54 C KE :: Kinetic energy
55 INTEGER i,j,k
56 INTEGER kDown,kLowF,kBottom
57 _RL viscFac, dragFac, vSq
58 _RL recDrC
59 _RL recDrF_bot(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
60 _RL KE(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
61 CEOP
62
63 C- No-slip BCs impose a drag at bottom
64 viscFac = 0.
65 IF (no_slip_bottom) viscFac = 2.
66
67 DO k=1,Nr
68
69 IF ( usingZCoords ) THEN
70 kBottom = Nr
71 kDown = MIN(k+1,Nr)
72 kLowF = k+1
73 c dragFac = mass2rUnit*rhoConst
74 c dragFac = wUnit2rVel(k+1)
75 dragFac = 1. _d 0
76 ELSE
77 kBottom = 1
78 kDown = MAX(k-1,1)
79 kLowF = k
80 dragFac = mass2rUnit*rhoConst
81 c dragFac = wUnit2rVel(k)
82 ENDIF
83 IF ( k.EQ.kBottom ) THEN
84 recDrC = recip_drF(k)
85 DO j=1-OLy,sNy+OLy
86 DO i=1-OLx,sNx+OLx
87 recDrF_bot(i,j) = _recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
88 ENDDO
89 ENDDO
90 ELSE
91 recDrC = recip_drC(kLowF)
92 DO j=1-OLy,sNy+OLy
93 DO i=1-OLx,sNx+OLx
94 recDrF_bot(i,j) = _recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
95 & * ( 1. _d 0 -_maskS(i,j,kDown,bi,bj) )
96 ENDDO
97 ENDDO
98 ENDIF
99
100 C-- Linear bottom drag:
101 DO j=1-OLy+1,sNy+OLy-1
102 DO i=1-OLx,sNx+OLx-1
103 cDrag(i,j,k) = cDrag(i,j,k)
104 & + recDrF_bot(i,j)
105 & *( bottomDragLinear*dragFac
106 #ifdef ALLOW_BOTTOMDRAG_CONTROL
107 & + halfRL*( bottomDragFld(i,j-1,bi,bj)
108 & + bottomDragFld(i,j,bi,bj) )*dragFac
109 #endif
110 & )*deltaTMom
111 ENDDO
112 ENDDO
113
114 C-- Add friction at the bottom (no-slip BC)
115 IF ( no_slip_bottom .AND. bottomVisc_pCell ) THEN
116 C- bottom friction accounts for true distance (including hFac) to the bottom
117 DO j=1-OLy+1,sNy+OLy-1
118 DO i=1-OLx,sNx+OLx-1
119 cDrag(i,j,k) = cDrag(i,j,k)
120 & + recDrF_bot(i,j)
121 & *( kappaRV(i,j,kLowF)*recDrC*viscFac
122 & *_recip_hFacS(i,j,k,bi,bj)
123 & )*deltaTMom
124 ENDDO
125 ENDDO
126 ELSEIF ( no_slip_bottom ) THEN
127 C- ignore partial-cell reduction of the distance to the bottom
128 DO j=1-OLy+1,sNy+OLy-1
129 DO i=1-OLx,sNx+OLx-1
130 cDrag(i,j,k) = cDrag(i,j,k)
131 & + recDrF_bot(i,j)
132 & *( kappaRV(i,j,kLowF)*recDrC*viscFac
133 & )*deltaTMom
134 ENDDO
135 ENDDO
136 ENDIF
137
138 C-- Add quadratic bottom drag
139 IF ( selectBotDragQuadr.EQ.0 ) THEN
140 DO j=1-OLy,sNy+OLy-1
141 DO i=1-OLx,sNx+OLx-1
142 KE(i,j) = 0.25*(
143 & ( uFld( i , j ,k)*uFld( i , j ,k)*_hFacW(i,j,k,bi,bj)
144 & +uFld(i+1, j ,k)*uFld(i+1, j ,k)*_hFacW(i+1,j,k,bi,bj) )
145 & + ( vFld( i , j ,k)*vFld( i , j ,k)*_hFacS(i,j,k,bi,bj)
146 & +vFld( i ,j+1,k)*vFld( i ,j+1,k)*_hFacS(i,j+1,k,bi,bj) )
147 & )*_recip_hFacC(i,j,k,bi,bj)
148 ENDDO
149 ENDDO
150 C- average grid-cell-center KE to get velocity norm @ V.pt
151 DO j=1-OLy+1,sNy+OLy-1
152 DO i=1-OLx,sNx+OLx-1
153 IF ( (KE(i,j)+KE(i,j-1)) .GT. 0. ) THEN
154 cDrag(i,j,k) = cDrag(i,j,k)
155 & + recDrF_bot(i,j)
156 & *bottomDragQuadratic*SQRT(KE(i,j)+KE(i,j-1))*dragFac
157 & *deltaTMom
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,k)*vFld(i,j,k)
166 & + ( (uFld( i ,j-1,k)*uFld( i ,j-1,k)*hFacW( i ,j-1,k,bi,bj)
167 & +uFld( i , j ,k)*uFld( i , j ,k)*hFacW( i , j ,k,bi,bj))
168 & + (uFld(i+1,j-1,k)*uFld(i+1,j-1,k)*hFacW(i+1,j-1,k,bi,bj)
169 & +uFld(i+1, j ,k)*uFld(i+1, j ,k)*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 cDrag(i,j,k) = cDrag(i,j,k)
173 & + recDrF_bot(i,j)
174 & *bottomDragQuadratic*SQRT(vSq)*dragFac
175 & *deltaTMom
176 ENDIF
177 ENDDO
178 ENDDO
179 ELSEIF ( selectBotDragQuadr.EQ.2 ) THEN
180 C- same as above but using wet-point method to average 4 U
181 DO j=1-OLy+1,sNy+OLy-1
182 DO i=1-OLx,sNx+OLx-1
183 vSq = ( hFacW( i ,j-1,k,bi,bj) + hFacW( i , j ,k,bi,bj) )
184 & + ( hFacW(i+1,j-1,k,bi,bj) + hFacW(i+1, j ,k,bi,bj) )
185 IF ( vSq.GT.zeroRL ) THEN
186 vSq = vFld(i,j,k)*vFld(i,j,k)
187 & +( (uFld( i ,j-1,k)*uFld( i ,j-1,k)*hFacW( i ,j-1,k,bi,bj)
188 & +uFld( i , j ,k)*uFld( i , j ,k)*hFacW( i , j ,k,bi,bj))
189 & + (uFld(i+1,j-1,k)*uFld(i+1,j-1,k)*hFacW(i+1,j-1,k,bi,bj)
190 & +uFld(i+1, j ,k)*uFld(i+1, j ,k)*hFacW(i+1, j ,k,bi,bj))
191 & )/vSq
192 ELSE
193 vSq = vFld(i,j,k)*vFld(i,j,k)
194 ENDIF
195 IF ( vSq.GT.zeroRL ) THEN
196 cDrag(i,j,k) = cDrag(i,j,k)
197 & + recDrF_bot(i,j)
198 & *bottomDragQuadratic*SQRT(vSq)*dragFac
199 & *deltaTMom
200 ENDIF
201 ENDDO
202 ENDDO
203 ELSEIF ( selectBotDragQuadr.NE.-1 ) THEN
204 STOP 'MOM_V_BOTDRAG_IMPL: invalid selectBotDragQuadr value'
205 ENDIF
206
207 c#ifdef ALLOW_DIAGNOSTICS
208 c IF (useDiagnostics) THEN
209 c CALL DIAGNOSTICS_FILL(vDragTerms,'VBotDrag',k,1,2,bi,bj,myThid)
210 c ENDIF
211 c#endif /* ALLOW_DIAGNOSTICS */
212
213 C- end k loop
214 ENDDO
215
216 RETURN
217 END

  ViewVC Help
Powered by ViewVC 1.1.22