/[MITgcm]/MITgcm_contrib/dgoldberg/impl_drag/shelfice_u_drag.F
ViewVC logotype

Contents of /MITgcm_contrib/dgoldberg/impl_drag/shelfice_u_drag.F

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


Revision 1.1 - (show annotations) (download)
Mon Jul 18 09:21:00 2016 UTC (9 years ago) by dgoldberg
Branch: MAIN
CVS Tags: HEAD
implicit formulation for bottom drag

1 C $Header: /u/gcmpack/MITgcm/pkg/shelfice/shelfice_u_drag.F,v 1.12 2015/02/14 21:58:05 jmc 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
31 C !INPUT PARAMETERS: ===================================================
32 C bi,bj :: tile indices
33 C k :: vertical level
34 C uFld :: zonal flow
35 C vFld :: meridional flow
36 C KE :: Kinetic energy
37 C kappaRU :: vertical viscosity
38 C myThid :: thread number
39 INTEGER bi,bj,k
40 _RL uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
41 _RL vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
42 _RL KE(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
43 _RL kappaRU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+1)
44 INTEGER myThid
45
46 C !OUTPUT PARAMETERS: ==================================================
47 C uDragTerms :: drag term
48 _RL uDragTerms(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
49
50 #ifdef ALLOW_SHELFICE
51 C !LOCAL VARIABLES : ====================================================
52 C i,j :: loop indices
53 C Kp1 :: =k+1 for k<Nr, =Nr for k>=Nr
54 INTEGER i,j,kUpC,kTop
55 _RL viscFac, uSq
56 _RL rdrckp1
57 CEOP
58
59 C- No-slip BCs impose a drag at top
60 IF ( usingZCoords ) THEN
61 kTop = 1
62 kUpC = k
63 ELSE
64 kTop = Nr
65 kUpC = k+1
66 ENDIF
67 rdrckp1=recip_drC(kUpC)
68 CML IF (k.EQ.kTop) rdrckp1=recip_drF(k)
69 viscFac=0.
70 IF (no_slip_shelfice) viscFac=2.
71
72 C-- Friction at the bottom of ice-shelf (no-slip BC)
73 IF ( no_slip_shelfice ) THEN
74 C- ignores partial-cell reduction of the distance to the surface
75 DO j=1-OLy,sNy+OLy-1
76 DO i=1-OLx+1,sNx+OLx-1
77 IF ( k.EQ.MAX( kTopC(i-1,j,bi,bj),kTopC(i,j,bi,bj) ) ) THEN
78 uDragTerms(i,j) =
79 & - _recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
80 & * kappaRU(i,j,kUpC)*rdrckp1*viscFac
81 #ifndef IMPLICIT_BOTTOMSIDEDRAG
82 & * uFld(i,j)
83 #endif
84 ELSE
85 uDragTerms(i,j) = 0. _d 0
86 ENDIF
87 ENDDO
88 ENDDO
89 ELSE
90 DO j=1-OLy,sNy+OLy
91 DO i=1-OLx,sNx+OLx
92 uDragTerms(i,j) = 0. _d 0
93 ENDDO
94 ENDDO
95 ENDIF
96 IF ( no_slip_shelfice .AND. bottomVisc_pCell ) THEN
97 C- friction accounts for true distance (including hFac) to the surface
98 DO j=1-OLy,sNy+OLy-1
99 DO i=1-OLx+1,sNx+OLx-1
100 uDragTerms(i,j) = uDragTerms(i,j)
101 & * _recip_hFacW(i,j,k,bi,bj)
102 ENDDO
103 ENDDO
104 ENDIF
105
106 C-- Add Linear drag:
107 IF ( SHELFICEDragLinear.NE.zeroRL ) THEN
108 DO j=1-OLy,sNy+OLy-1
109 DO i=1-OLx+1,sNx+OLx-1
110 IF ( k.EQ.MAX( kTopC(i-1,j,bi,bj),kTopC(i,j,bi,bj) ) ) THEN
111 uDragTerms(i,j) = uDragTerms(i,j)
112 & - _recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
113 & * SHELFICEDragLinear
114 #ifndef IMPLICIT_BOTTOMSIDEDRAG
115 & * uFld(i,j)
116 #endif
117 ENDIF
118 ENDDO
119 ENDDO
120 ENDIF
121
122 C-- Add quadratic drag
123 IF ( SHELFICEselectDragQuadr.EQ.0 ) THEN
124 C- average grid-cell-center KE to get velocity norm @ U.pt
125 DO j=1-OLy,sNy+OLy-1
126 DO i=1-OLx+1,sNx+OLx-1
127 uSq = 0. _d 0
128 IF ( k.EQ.MAX( kTopC(i-1,j,bi,bj),kTopC(i,j,bi,bj) ) ) THEN
129 uSq = KE(i,j)+KE(i-1,j)
130 ENDIF
131 IF ( uSq.GT.zeroRL ) THEN
132 uDragTerms(i,j) = uDragTerms(i,j)
133 & - _recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
134 & * SHELFICEDragQuadratic*SQRT(uSq)
135 #ifndef IMPLICIT_BOTTOMSIDEDRAG
136 & * uFld(i,j)
137 #endif
138 ENDIF
139 ENDDO
140 ENDDO
141 ELSEIF ( SHELFICEselectDragQuadr.EQ.1 ) THEN
142 C- calculate locally velocity norm @ U.pt (local U & 4 V averaged)
143 DO j=1-OLy,sNy+OLy-1
144 DO i=1-OLx+1,sNx+OLx-1
145 uSq = 0. _d 0
146 IF ( k.EQ.MAX( kTopC(i-1,j,bi,bj),kTopC(i,j,bi,bj) ) ) THEN
147 uSq = uFld(i,j)*uFld(i,j)
148 & + ( (vFld(i-1, j )*vFld(i-1, j )*hFacS(i-1, j ,k,bi,bj)
149 & +vFld( i , j )*vFld( i , j )*hFacS( i , j ,k,bi,bj))
150 & + (vFld(i-1,j+1)*vFld(i-1,j+1)*hFacS(i-1,j+1,k,bi,bj)
151 & +vFld( i ,j+1)*vFld( i ,j+1)*hFacS( i ,j+1,k,bi,bj))
152 & )*recip_hFacW(i,j,k,bi,bj)*0.25 _d 0
153 ENDIF
154 IF ( uSq.GT.zeroRL ) THEN
155 uDragTerms(i,j) = uDragTerms(i,j)
156 & - _recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
157 & * SHELFICEDragQuadratic*SQRT(uSq)
158 #ifndef IMPLICIT_BOTTOMSIDEDRAG
159 & * uFld(i,j)
160 #endif
161 ENDIF
162 ENDDO
163 ENDDO
164 ELSEIF ( SHELFICEselectDragQuadr.EQ.2 ) THEN
165 C- same as above but using wet-point method to average 4 V
166 DO j=1-OLy,sNy+OLy-1
167 DO i=1-OLx+1,sNx+OLx-1
168 uSq = 0. _d 0
169 IF ( k.EQ.MAX( kTopC(i-1,j,bi,bj),kTopC(i,j,bi,bj) ) ) THEN
170 uSq = ( hFacS(i-1, j ,k,bi,bj) + hFacS( i , j ,k,bi,bj) )
171 & + ( hFacS(i-1,j+1,k,bi,bj) + hFacS( i ,j+1,k,bi,bj) )
172 IF ( uSq.GT.zeroRL ) THEN
173 uSq = uFld(i,j)*uFld(i,j)
174 & +( (vFld(i-1, j )*vFld(i-1, j )*hFacS(i-1, j ,k,bi,bj)
175 & +vFld( i , j )*vFld( i , j )*hFacS( i , j ,k,bi,bj))
176 & + (vFld(i-1,j+1)*vFld(i-1,j+1)*hFacS(i-1,j+1,k,bi,bj)
177 & +vFld( i ,j+1)*vFld( i ,j+1)*hFacS( i ,j+1,k,bi,bj))
178 & )/uSq
179 ELSE
180 uSq = uFld(i,j)*uFld(i,j)
181 ENDIF
182 ENDIF
183 IF ( uSq.GT.zeroRL ) THEN
184 uDragTerms(i,j) = uDragTerms(i,j)
185 & - _recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
186 & * SHELFICEDragQuadratic*SQRT(uSq)
187 #ifndef IMPLICIT_BOTTOMSIDEDRAG
188 & * uFld(i,j)
189 #endif
190 ENDIF
191 ENDDO
192 ENDDO
193 ENDIF
194
195 #ifdef IMPLICIT_BOTTOMSIDEDRAG
196 DO j=1-OLy+1,sNy+OLy-1
197 DO i=1-OLx,sNx+OLx-1
198 uDragTerms(i,j) = uDragTerms(i,j)*uFld(i,j) /
199 & (1. - deltaTmom*uDragTerms(i,j))
200 ENDDO
201 ENDDO
202 #endif
203
204 #ifdef ALLOW_DIAGNOSTICS
205 IF ( useDiagnostics .AND.
206 & ( no_slip_shelfice .OR. SHELFICEDragLinear.NE.zeroRL
207 & .OR. SHELFICEselectDragQuadr.GE.0 )
208 & ) THEN
209 CALL DIAGNOSTICS_FILL(uDragTerms,'SHIUDrag',k,1,2,bi,bj,myThid)
210 ENDIF
211 #endif /* ALLOW_DIAGNOSTICS */
212 #endif /* ALLOW_SHELFICE */
213
214 RETURN
215 END

  ViewVC Help
Powered by ViewVC 1.1.22