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

Annotation 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 - (hide annotations) (download)
Thu Feb 2 17:29:49 2017 UTC (8 years, 10 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_v_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_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