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

Contents of /MITgcm_contrib/ksnow/press_release/code/shelfice_u_drag.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/shelfice_u_drag.F,v 1.1 2016/12/16 15:23:18 ksnow Exp $
2 C $Name: $
3
4 #include "SHELFICE_OPTIONS.h"
5
6 CBOP
7 C !ROUTINE: SHELFICE_U_DRAG
8
9 C !INTERFACE: ==========================================================
10 SUBROUTINE SHELFICE_U_DRAG(
11 I bi, bj, k,
12 I uFld, vFld, KE, kappaRU,
13 O uDragTerms,
14 I myThid )
15
16 C !DESCRIPTION:
17 C Calculates the drag due to friction and the no-slip condition at the
18 C bottom of the shelf-ice (in analogy to bottom drag)
19 C \begin{equation*}
20 C G^u_{drag} = - ( r_b + C_D |v| + \frac{2}{\Delta r_c} ) u
21 C \end{equation*}
22
23 C !USES: ===============================================================
24 IMPLICIT NONE
25 #include "SIZE.h"
26 #include "EEPARAMS.h"
27 #include "PARAMS.h"
28 #include "GRID.h"
29 #include "SHELFICE.h"
30 #include "MOM_VISC.h"
31
32 C !INPUT PARAMETERS: ===================================================
33 C bi,bj :: tile indices
34 C k :: vertical level
35 C uFld :: zonal flow
36 C vFld :: meridional flow
37 C KE :: Kinetic energy
38 C kappaRU :: vertical viscosity
39 C myThid :: thread number
40 INTEGER bi,bj,k
41 _RL uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
42 _RL vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
43 _RL KE(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
44 _RL kappaRU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+1)
45 INTEGER myThid
46
47 C !OUTPUT PARAMETERS: ==================================================
48 C uDragTerms :: drag term
49 _RL uDragTerms(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
50 #ifdef IMPLICIT_BOTTOMSIDEDRAG
51 _RL uDragTermsIn(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
52 #endif
53
54 #ifdef ALLOW_SHELFICE
55 C !LOCAL VARIABLES : ====================================================
56 C i,j :: loop indices
57 C Kp1 :: =k+1 for k<Nr, =Nr for k>=Nr
58 INTEGER i,j,kUpC,kTop
59 _RL viscFac, uSq
60 _RL rdrckp1
61 CEOP
62
63 #ifdef IMPLICIT_BOTTOMSIDEDRAG
64 DO j=1-OLy,sNy+OLy
65 DO i=1-OLx,sNx+OLx
66 uDragTermsIn(i,j) = uDragTerms(i,j)
67 uDragTerms(i,j) = 0.
68 ENDDO
69 ENDDO
70 #endif
71
72 C- No-slip BCs impose a drag at top
73 IF ( usingZCoords ) THEN
74 kTop = 1
75 kUpC = k
76 ELSE
77 kTop = Nr
78 kUpC = k+1
79 ENDIF
80 rdrckp1=recip_drC(kUpC)
81 CML IF (k.EQ.kTop) rdrckp1=recip_drF(k)
82 viscFac=0.
83 IF (no_slip_shelfice) viscFac=2.
84
85 C-- Friction at the bottom of ice-shelf (no-slip BC)
86 IF ( no_slip_shelfice ) THEN
87 C- ignores partial-cell reduction of the distance to the surface
88 DO j=1-OLy,sNy+OLy-1
89 DO i=1-OLx+1,sNx+OLx-1
90 IF ( k.EQ.MAX( kTopC(i-1,j,bi,bj),kTopC(i,j,bi,bj) ) ) THEN
91 uDragTerms(i,j) =
92 & - _recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
93 & * kappaRU(i,j,kUpC)*rdrckp1*viscFac
94 #ifndef IMPLICIT_BOTTOMSIDEDRAG
95 & * uFld(i,j)
96 #endif
97 ELSE
98 uDragTerms(i,j) = 0. _d 0
99 ENDIF
100 ENDDO
101 ENDDO
102 ELSE
103 DO j=1-OLy,sNy+OLy
104 DO i=1-OLx,sNx+OLx
105 uDragTerms(i,j) = 0. _d 0
106 ENDDO
107 ENDDO
108 ENDIF
109 IF ( no_slip_shelfice .AND. bottomVisc_pCell ) THEN
110 C- friction accounts for true distance (including hFac) to the surface
111 DO j=1-OLy,sNy+OLy-1
112 DO i=1-OLx+1,sNx+OLx-1
113 uDragTerms(i,j) = uDragTerms(i,j)
114 & * _recip_hFacW(i,j,k,bi,bj)
115 ENDDO
116 ENDDO
117 ENDIF
118
119 C-- Add Linear drag:
120 IF ( SHELFICEDragLinear.NE.zeroRL ) THEN
121 DO j=1-OLy,sNy+OLy-1
122 DO i=1-OLx+1,sNx+OLx-1
123 IF ( k.EQ.MAX( kTopC(i-1,j,bi,bj),kTopC(i,j,bi,bj) ) ) THEN
124 uDragTerms(i,j) = uDragTerms(i,j)
125 & - _recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
126 & * SHELFICEDragLinear
127 #ifndef IMPLICIT_BOTTOMSIDEDRAG
128 & * uFld(i,j)
129 #endif
130
131 ENDIF
132 ENDDO
133 ENDDO
134 ENDIF
135
136 C-- Add quadratic drag
137 IF ( SHELFICEselectDragQuadr.EQ.0 ) THEN
138 C- average grid-cell-center KE to get velocity norm @ U.pt
139 DO j=1-OLy,sNy+OLy-1
140 DO i=1-OLx+1,sNx+OLx-1
141 uSq = 0. _d 0
142 IF ( k.EQ.MAX( kTopC(i-1,j,bi,bj),kTopC(i,j,bi,bj) ) ) THEN
143 uSq = KE(i,j)+KE(i-1,j)
144 ENDIF
145 IF ( uSq.GT.zeroRL ) THEN
146 uDragTerms(i,j) = uDragTerms(i,j)
147 & - _recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
148 & * SHELFICEDragQuadratic*SQRT(uSq)
149 #ifndef IMPLICIT_BOTTOMSIDEDRAG
150 & * uFld(i,j)
151 #endif
152
153 ENDIF
154 ENDDO
155 ENDDO
156 ELSEIF ( SHELFICEselectDragQuadr.EQ.1 ) THEN
157 C- calculate locally velocity norm @ U.pt (local U & 4 V averaged)
158 DO j=1-OLy,sNy+OLy-1
159 DO i=1-OLx+1,sNx+OLx-1
160 uSq = 0. _d 0
161 IF ( k.EQ.MAX( kTopC(i-1,j,bi,bj),kTopC(i,j,bi,bj) ) ) THEN
162 uSq = uFld(i,j)*uFld(i,j)
163 & + ( (vFld(i-1, j )*vFld(i-1, j )*hFacS(i-1, j ,k,bi,bj)
164 & +vFld( i , j )*vFld( i , j )*hFacS( i , j ,k,bi,bj))
165 & + (vFld(i-1,j+1)*vFld(i-1,j+1)*hFacS(i-1,j+1,k,bi,bj)
166 & +vFld( i ,j+1)*vFld( i ,j+1)*hFacS( i ,j+1,k,bi,bj))
167 & )*recip_hFacW(i,j,k,bi,bj)*0.25 _d 0
168 ENDIF
169 IF ( uSq.GT.zeroRL ) THEN
170 uDragTerms(i,j) = uDragTerms(i,j)
171 & - _recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
172 & * SHELFICEDragQuadratic*SQRT(uSq)
173 #ifndef IMPLICIT_BOTTOMSIDEDRAG
174 & * uFld(i,j)
175 #endif
176
177 ENDIF
178 ENDDO
179 ENDDO
180 ELSEIF ( SHELFICEselectDragQuadr.EQ.2 ) THEN
181 C- same as above but using wet-point method to average 4 V
182 DO j=1-OLy,sNy+OLy-1
183 DO i=1-OLx+1,sNx+OLx-1
184 uSq = 0. _d 0
185 IF ( k.EQ.MAX( kTopC(i-1,j,bi,bj),kTopC(i,j,bi,bj) ) ) THEN
186 uSq = ( hFacS(i-1, j ,k,bi,bj) + hFacS( i , j ,k,bi,bj) )
187 & + ( hFacS(i-1,j+1,k,bi,bj) + hFacS( i ,j+1,k,bi,bj) )
188 IF ( uSq.GT.zeroRL ) THEN
189 uSq = uFld(i,j)*uFld(i,j)
190 & +( (vFld(i-1, j )*vFld(i-1, j )*hFacS(i-1, j ,k,bi,bj)
191 & +vFld( i , j )*vFld( i , j )*hFacS( i , j ,k,bi,bj))
192 & + (vFld(i-1,j+1)*vFld(i-1,j+1)*hFacS(i-1,j+1,k,bi,bj)
193 & +vFld( i ,j+1)*vFld( i ,j+1)*hFacS( i ,j+1,k,bi,bj))
194 & )/uSq
195 ELSE
196 uSq = uFld(i,j)*uFld(i,j)
197 ENDIF
198 ENDIF
199 IF ( uSq.GT.zeroRL ) THEN
200 uDragTerms(i,j) = uDragTerms(i,j)
201 & - _recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
202 & * SHELFICEDragQuadratic*SQRT(uSq)
203 #ifndef IMPLICIT_BOTTOMSIDEDRAG
204 & * uFld(i,j)
205 #endif
206
207 ENDIF
208 ENDDO
209 ENDDO
210 ENDIF
211
212 #ifdef IMPLICIT_BOTTOMSIDEDRAG
213 DO j=1-OLy,sNy+OLy-1
214 DO i=1-OLx+1,sNx+OLx-1
215 ! IF (kSurfW(i,j,bi,bj).eq.kLowC(i,j,bi,bj).or.
216 ! & kSurfW(i,j,bi,bj).eq.kLowC(i-1,j,bi,bj)) THEN
217 IF (.TRUE.) THEN
218 uDragTermsCommon(i,j,k,bi,bj) =
219 & uDragTermsCommon(i,j,k,bi,bj) +
220 & uDragTerms(i,j)
221 uDragTerms(i,j) = uDragTermsIn(i,j)
222 ELSE
223 uDragTerms(i,j) = uDragTerms(i,j)*uFld(i,j) /
224 & (1. - deltaTmom*uDragTerms(i,j))
225 ENDIF
226 ENDDO
227 ENDDO
228 #endif
229
230 #ifdef ALLOW_DIAGNOSTICS
231 IF ( useDiagnostics .AND.
232 & ( no_slip_shelfice .OR. SHELFICEDragLinear.NE.zeroRL
233 & .OR. SHELFICEselectDragQuadr.GE.0 )
234 & ) THEN
235 CALL DIAGNOSTICS_FILL(uDragTerms,'SHIUDrag',k,1,2,bi,bj,myThid)
236 ENDIF
237 #endif /* ALLOW_DIAGNOSTICS */
238 #endif /* ALLOW_SHELFICE */
239
240 RETURN
241 END

  ViewVC Help
Powered by ViewVC 1.1.22