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

Contents of /MITgcm_contrib/ksnow/press_release/code/shelfice_v_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_v_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_V_DRAG
8
9 C !INTERFACE: ==========================================================
10 SUBROUTINE SHELFICE_V_DRAG(
11 I bi, bj, k,
12 I uFld, vFld, KE, kappaRV,
13 O vDragTerms,
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^v_{drag} = - ( r_b + C_D |v| + \frac{2}{\Delta r_c} ) v
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 kappaRV :: 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 kappaRV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+1)
45 INTEGER myThid
46
47 C !OUTPUT PARAMETERS: ==================================================
48 C vDragTerms :: drag term
49 _RL vDragTerms(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
50 #ifdef IMPLICIT_BOTTOMSIDEDRAG
51 _RL vDragTermsIn(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, vSq
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 vDragTermsIn(i,j) = vDragTerms(i,j)
67 vDragTerms(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+1,sNy+OLy-1
89 DO i=1-OLx,sNx+OLx-1
90 IF ( k.EQ.MAX( kTopC(i,j-1,bi,bj),kTopC(i,j,bi,bj) ) ) THEN
91 vDragTerms(i,j) =
92 & - _recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
93 & * kappaRV(i,j,kUpC)*rdrckp1*viscFac
94 #ifndef IMPLICIT_BOTTOMSIDEDRAG
95 & * vFld(i,j)
96 #endif
97 ELSE
98 vDragTerms(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 vDragTerms(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+1,sNy+OLy-1
112 DO i=1-OLx,sNx+OLx-1
113 vDragTerms(i,j) = vDragTerms(i,j)
114 & * _recip_hFacS(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+1,sNy+OLy-1
122 DO i=1-OLx,sNx+OLx-1
123 IF ( k.EQ.MAX( kTopC(i,j-1,bi,bj),kTopC(i,j,bi,bj) ) ) THEN
124 vDragTerms(i,j) = vDragTerms(i,j)
125 & - _recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
126 & * SHELFICEDragLinear
127 #ifndef IMPLICIT_BOTTOMSIDEDRAG
128 & * vFld(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+1,sNy+OLy-1
140 DO i=1-OLx,sNx+OLx-1
141 vSq = 0. _d 0
142 IF ( k.EQ.MAX( kTopC(i,j-1,bi,bj),kTopC(i,j,bi,bj) ) ) THEN
143 vSq = KE(i,j)+KE(i,j-1)
144 ENDIF
145 IF ( vSq.GT.zeroRL ) THEN
146 vDragTerms(i,j) = vDragTerms(i,j)
147 & - _recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
148 & * SHELFICEDragQuadratic*SQRT(vSq)
149 #ifndef IMPLICIT_BOTTOMSIDEDRAG
150 & * vFld(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+1,sNy+OLy-1
159 DO i=1-OLx,sNx+OLx-1
160 vSq = 0. _d 0
161 IF ( k.EQ.MAX( kTopC(i,j-1,bi,bj),kTopC(i,j,bi,bj) ) ) THEN
162 vSq = vFld(i,j)*vFld(i,j)
163 & + ( (uFld( i ,j-1)*uFld( i ,j-1)*hFacW( i ,j-1,k,bi,bj)
164 & +uFld( i , j )*uFld( i , j )*hFacW( i , j ,k,bi,bj))
165 & + (uFld(i+1,j-1)*uFld(i+1,j-1)*hFacW(i+1,j-1,k,bi,bj)
166 & +uFld(i+1, j )*uFld(i+1, j )*hFacW(i+1, j ,k,bi,bj))
167 & )*recip_hFacS(i,j,k,bi,bj)*0.25 _d 0
168 ENDIF
169 IF ( vSq.GT.zeroRL ) THEN
170 vDragTerms(i,j) = vDragTerms(i,j)
171 & - _recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
172 & * SHELFICEDragQuadratic*SQRT(vSq)
173 #ifndef IMPLICIT_BOTTOMSIDEDRAG
174 & * vFld(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+1,sNy+OLy-1
183 DO i=1-OLx,sNx+OLx-1
184 vSq = 0. _d 0
185 IF ( k.EQ.MAX( kTopC(i,j-1,bi,bj),kTopC(i,j,bi,bj) ) ) THEN
186 vSq = ( hFacW( i ,j-1,k,bi,bj) + hFacW( i , j ,k,bi,bj) )
187 & + ( hFacW(i+1,j-1,k,bi,bj) + hFacW(i+1, j ,k,bi,bj) )
188 IF ( vSq.GT.zeroRL ) THEN
189 vSq = vFld(i,j)*vFld(i,j)
190 & +( (uFld( i ,j-1)*uFld( i ,j-1)*hFacW( i ,j-1,k,bi,bj)
191 & +uFld( i , j )*uFld( i , j )*hFacW( i , j ,k,bi,bj))
192 & + (uFld(i+1,j-1)*uFld(i+1,j-1)*hFacW(i+1,j-1,k,bi,bj)
193 & +uFld(i+1, j )*uFld(i+1, j )*hFacW(i+1, j ,k,bi,bj))
194 & )/vSq
195 ELSE
196 vSq = vFld(i,j)*vFld(i,j)
197 ENDIF
198 ENDIF
199 IF ( vSq.GT.zeroRL ) THEN
200 vDragTerms(i,j) = vDragTerms(i,j)
201 & - _recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
202 & * SHELFICEDragQuadratic*SQRT(vSq)
203 #ifndef IMPLICIT_BOTTOMSIDEDRAG
204 & * vFld(i,j)
205 #endif
206 ENDIF
207 ENDDO
208 ENDDO
209 ENDIF
210
211 #ifdef IMPLICIT_BOTTOMSIDEDRAG
212 DO j=1-OLy+1,sNy+OLy-1
213 DO i=1-OLx,sNx+OLx-1
214 ! IF (kSurfW(i,j,bi,bj).eq.kLowC(i,j,bi,bj).or.
215 ! & kSurfW(i,j,bi,bj).eq.kLowC(i-1,j,bi,bj)) THEN
216 IF (.TRUE.) THEN
217 vDragTermsCommon(i,j,k,bi,bj) =
218 & vDragTermsCommon(i,j,k,bi,bj) +
219 & vDragTerms(i,j)
220 vDragTerms(i,j) = vDragTermsIn(i,j)
221 ELSE
222 vDragTerms(i,j) = vDragTerms(i,j)*vFld(i,j) /
223 & (1. - deltaTmom*vDragTerms(i,j))
224 ENDIF
225 ENDDO
226 ENDDO
227 #endif
228
229 #ifdef ALLOW_DIAGNOSTICS
230 IF ( useDiagnostics .AND.
231 & ( no_slip_shelfice .OR. SHELFICEDragLinear.NE.zeroRL
232 & .OR. SHELFICEselectDragQuadr.GE.0 )
233 & ) THEN
234 CALL DIAGNOSTICS_FILL(vDragTerms,'SHIVDrag',k,1,2,bi,bj,myThid)
235 ENDIF
236 #endif /* ALLOW_DIAGNOSTICS */
237 #endif /* ALLOW_SHELFICE */
238
239 RETURN
240 END

  ViewVC Help
Powered by ViewVC 1.1.22