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

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

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


Revision 1.17 - (show annotations) (download)
Sun Jan 4 16:16:32 2015 UTC (9 years, 8 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, checkpoint65z, checkpoint65x, checkpoint65y, checkpoint65r, checkpoint65s, checkpoint65p, checkpoint65q, checkpoint65v, checkpoint65w, checkpoint65t, checkpoint65u, checkpoint65j, checkpoint65k, checkpoint65i, checkpoint65n, checkpoint65o, checkpoint65l, checkpoint65m, HEAD
Changes since 1.16: +3 -4 lines
average bottomDragFld (ALLOW_BOTTOMDRAG_CONTROL) from grid-cell center
 to correct location (U & V point) in S/R MOM_U/V_BOTTOMDRAG;

1 C $Header: /u/gcmpack/MITgcm/pkg/mom_common/mom_v_bottomdrag.F,v 1.16 2015/01/04 00:00:36 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 & )*vFld(i,j)
107 ENDDO
108 ENDDO
109
110 C-- Add friction at the bottom (no-slip BC)
111 IF ( no_slip_bottom .AND. bottomVisc_pCell ) THEN
112 C- bottom friction accounts for true distance (including hFac) to the bottom
113 DO j=1-OLy+1,sNy+OLy-1
114 DO i=1-OLx,sNx+OLx-1
115 vDragTerms(i,j) = vDragTerms(i,j)
116 & - recDrF_bot(i,j)
117 & *( kappaRV(i,j,kLowF)*recDrC*viscFac
118 & *_recip_hFacS(i,j,k,bi,bj)
119 & )*vFld(i,j)
120 ENDDO
121 ENDDO
122 ELSEIF ( no_slip_bottom ) THEN
123 C- ignore partial-cell reduction of the distance to the bottom
124 DO j=1-OLy+1,sNy+OLy-1
125 DO i=1-OLx,sNx+OLx-1
126 vDragTerms(i,j) = vDragTerms(i,j)
127 & - recDrF_bot(i,j)
128 & *( kappaRV(i,j,kLowF)*recDrC*viscFac
129 & )*vFld(i,j)
130 ENDDO
131 ENDDO
132 ENDIF
133
134 C-- Add quadratic bottom drag
135 IF ( selectBotDragQuadr.EQ.0 ) THEN
136 C- average grid-cell-center KE to get velocity norm @ V.pt
137 DO j=1-OLy+1,sNy+OLy-1
138 DO i=1-OLx,sNx+OLx-1
139 IF ( (KE(i,j)+KE(i,j-1)) .GT. 0. ) THEN
140 vDragTerms(i,j) = vDragTerms(i,j)
141 & - recDrF_bot(i,j)
142 & *bottomDragQuadratic*SQRT(KE(i,j)+KE(i,j-1))*dragFac
143 & *vFld(i,j)
144 ENDIF
145 ENDDO
146 ENDDO
147 ELSEIF ( selectBotDragQuadr.EQ.1 ) THEN
148 C- calculate locally velocity norm @ V.pt (local V & 4 U averaged)
149 DO j=1-OLy+1,sNy+OLy-1
150 DO i=1-OLx,sNx+OLx-1
151 vSq = vFld(i,j)*vFld(i,j)
152 & + ( (uFld( i ,j-1)*uFld( i ,j-1)*hFacW( i ,j-1,k,bi,bj)
153 & +uFld( i , j )*uFld( i , j )*hFacW( i , j ,k,bi,bj))
154 & + (uFld(i+1,j-1)*uFld(i+1,j-1)*hFacW(i+1,j-1,k,bi,bj)
155 & +uFld(i+1, j )*uFld(i+1, j )*hFacW(i+1, j ,k,bi,bj))
156 & )*recip_hFacS(i,j,k,bi,bj)*0.25 _d 0
157 IF ( vSq.GT.zeroRL ) THEN
158 vDragTerms(i,j) = vDragTerms(i,j)
159 & - recDrF_bot(i,j)
160 & *bottomDragQuadratic*SQRT(vSq)*dragFac
161 & *vFld(i,j)
162 ENDIF
163 ENDDO
164 ENDDO
165 ELSEIF ( selectBotDragQuadr.EQ.2 ) THEN
166 C- same as above but using wet-point method to average 4 U
167 DO j=1-OLy+1,sNy+OLy-1
168 DO i=1-OLx,sNx+OLx-1
169 vSq = ( hFacW( i ,j-1,k,bi,bj) + hFacW( i , j ,k,bi,bj) )
170 & + ( hFacW(i+1,j-1,k,bi,bj) + hFacW(i+1, j ,k,bi,bj) )
171 IF ( vSq.GT.zeroRL ) THEN
172 vSq = vFld(i,j)*vFld(i,j)
173 & +( (uFld( i ,j-1)*uFld( i ,j-1)*hFacW( i ,j-1,k,bi,bj)
174 & +uFld( i , j )*uFld( i , j )*hFacW( i , j ,k,bi,bj))
175 & + (uFld(i+1,j-1)*uFld(i+1,j-1)*hFacW(i+1,j-1,k,bi,bj)
176 & +uFld(i+1, j )*uFld(i+1, j )*hFacW(i+1, j ,k,bi,bj))
177 & )/vSq
178 ELSE
179 vSq = vFld(i,j)*vFld(i,j)
180 ENDIF
181 IF ( vSq.GT.zeroRL ) THEN
182 vDragTerms(i,j) = vDragTerms(i,j)
183 & - recDrF_bot(i,j)
184 & *bottomDragQuadratic*SQRT(vSq)*dragFac
185 & *vFld(i,j)
186 ENDIF
187 ENDDO
188 ENDDO
189 ELSEIF ( selectBotDragQuadr.NE.-1 ) THEN
190 STOP 'MOM_V_BOTTOMDRAG: invalid selectBotDragQuadr value'
191 ENDIF
192
193 #ifdef ALLOW_DIAGNOSTICS
194 IF (useDiagnostics) THEN
195 CALL DIAGNOSTICS_FILL(vDragTerms,'VBotDrag',k,1,2,bi,bj,myThid)
196 ENDIF
197 #endif /* ALLOW_DIAGNOSTICS */
198
199 RETURN
200 END

  ViewVC Help
Powered by ViewVC 1.1.22