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

Annotation 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 - (hide 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 dgoldberg 1.2 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 ksnow 1.1 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