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

Contents of /MITgcm_contrib/dgoldberg/impl_drag/shelfice_v_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_v_drag.F,v 1.11 2015/02/14 21:58:05 jmc 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
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 kappaRV :: 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 kappaRV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+1)
44 INTEGER myThid
45
46 C !OUTPUT PARAMETERS: ==================================================
47 C vDragTerms :: drag term
48 _RL vDragTerms(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, vSq
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+1,sNy+OLy-1
76 DO i=1-OLx,sNx+OLx-1
77 IF ( k.EQ.MAX( kTopC(i,j-1,bi,bj),kTopC(i,j,bi,bj) ) ) THEN
78 vDragTerms(i,j) =
79 & - _recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
80 & * kappaRV(i,j,kUpC)*rdrckp1*viscFac
81 #ifndef IMPLICIT_BOTTOMSIDEDRAG
82 & * vFld(i,j)
83 #endif
84 ELSE
85 vDragTerms(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 vDragTerms(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+1,sNy+OLy-1
99 DO i=1-OLx,sNx+OLx-1
100 vDragTerms(i,j) = vDragTerms(i,j)
101 & * _recip_hFacS(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+1,sNy+OLy-1
109 DO i=1-OLx,sNx+OLx-1
110 IF ( k.EQ.MAX( kTopC(i,j-1,bi,bj),kTopC(i,j,bi,bj) ) ) THEN
111 vDragTerms(i,j) = vDragTerms(i,j)
112 & - _recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
113 & * SHELFICEDragLinear
114 #ifndef IMPLICIT_BOTTOMSIDEDRAG
115 & * vFld(i,j)
116 #endif
117
118 ENDIF
119 ENDDO
120 ENDDO
121 ENDIF
122
123 C-- Add quadratic drag
124 IF ( SHELFICEselectDragQuadr.EQ.0 ) THEN
125 C- average grid-cell-center KE to get velocity norm @ U.pt
126 DO j=1-OLy+1,sNy+OLy-1
127 DO i=1-OLx,sNx+OLx-1
128 vSq = 0. _d 0
129 IF ( k.EQ.MAX( kTopC(i,j-1,bi,bj),kTopC(i,j,bi,bj) ) ) THEN
130 vSq = KE(i,j)+KE(i,j-1)
131 ENDIF
132 IF ( vSq.GT.zeroRL ) THEN
133 vDragTerms(i,j) = vDragTerms(i,j)
134 & - _recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
135 & * SHELFICEDragQuadratic*SQRT(vSq)
136 #ifndef IMPLICIT_BOTTOMSIDEDRAG
137 & * vFld(i,j)
138 #endif
139
140 ENDIF
141 ENDDO
142 ENDDO
143 ELSEIF ( SHELFICEselectDragQuadr.EQ.1 ) THEN
144 C- calculate locally velocity norm @ U.pt (local U & 4 V averaged)
145 DO j=1-OLy+1,sNy+OLy-1
146 DO i=1-OLx,sNx+OLx-1
147 vSq = 0. _d 0
148 IF ( k.EQ.MAX( kTopC(i,j-1,bi,bj),kTopC(i,j,bi,bj) ) ) THEN
149 vSq = vFld(i,j)*vFld(i,j)
150 & + ( (uFld( i ,j-1)*uFld( i ,j-1)*hFacW( i ,j-1,k,bi,bj)
151 & +uFld( i , j )*uFld( i , j )*hFacW( i , j ,k,bi,bj))
152 & + (uFld(i+1,j-1)*uFld(i+1,j-1)*hFacW(i+1,j-1,k,bi,bj)
153 & +uFld(i+1, j )*uFld(i+1, j )*hFacW(i+1, j ,k,bi,bj))
154 & )*recip_hFacS(i,j,k,bi,bj)*0.25 _d 0
155 ENDIF
156 IF ( vSq.GT.zeroRL ) THEN
157 vDragTerms(i,j) = vDragTerms(i,j)
158 & - _recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
159 & * SHELFICEDragQuadratic*SQRT(vSq)
160 #ifndef IMPLICIT_BOTTOMSIDEDRAG
161 & * vFld(i,j)
162 #endif
163
164 ENDIF
165 ENDDO
166 ENDDO
167 ELSEIF ( SHELFICEselectDragQuadr.EQ.2 ) THEN
168 C- same as above but using wet-point method to average 4 V
169 DO j=1-OLy+1,sNy+OLy-1
170 DO i=1-OLx,sNx+OLx-1
171 vSq = 0. _d 0
172 IF ( k.EQ.MAX( kTopC(i,j-1,bi,bj),kTopC(i,j,bi,bj) ) ) THEN
173 vSq = ( hFacW( i ,j-1,k,bi,bj) + hFacW( i , j ,k,bi,bj) )
174 & + ( hFacW(i+1,j-1,k,bi,bj) + hFacW(i+1, j ,k,bi,bj) )
175 IF ( vSq.GT.zeroRL ) THEN
176 vSq = vFld(i,j)*vFld(i,j)
177 & +( (uFld( i ,j-1)*uFld( i ,j-1)*hFacW( i ,j-1,k,bi,bj)
178 & +uFld( i , j )*uFld( i , j )*hFacW( i , j ,k,bi,bj))
179 & + (uFld(i+1,j-1)*uFld(i+1,j-1)*hFacW(i+1,j-1,k,bi,bj)
180 & +uFld(i+1, j )*uFld(i+1, j )*hFacW(i+1, j ,k,bi,bj))
181 & )/vSq
182 ELSE
183 vSq = vFld(i,j)*vFld(i,j)
184 ENDIF
185 ENDIF
186 IF ( vSq.GT.zeroRL ) THEN
187 vDragTerms(i,j) = vDragTerms(i,j)
188 & - _recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
189 & * SHELFICEDragQuadratic*SQRT(vSq)
190 #ifndef IMPLICIT_BOTTOMSIDEDRAG
191 & * vFld(i,j)
192 #endif
193
194 ENDIF
195 ENDDO
196 ENDDO
197 ENDIF
198
199 #ifdef IMPLICIT_BOTTOMSIDEDRAG
200 DO j=1-OLy+1,sNy+OLy-1
201 DO i=1-OLx,sNx+OLx-1
202 vDragTerms(i,j) = vDragTerms(i,j)*vFld(i,j) /
203 & (1. - deltaTmom*vDragTerms(i,j))
204 ENDDO
205 ENDDO
206 #endif
207
208 #ifdef ALLOW_DIAGNOSTICS
209 IF ( useDiagnostics .AND.
210 & ( no_slip_shelfice .OR. SHELFICEDragLinear.NE.zeroRL
211 & .OR. SHELFICEselectDragQuadr.GE.0 )
212 & ) THEN
213 CALL DIAGNOSTICS_FILL(vDragTerms,'SHIVDrag',k,1,2,bi,bj,myThid)
214 ENDIF
215 #endif /* ALLOW_DIAGNOSTICS */
216 #endif /* ALLOW_SHELFICE */
217
218 RETURN
219 END

  ViewVC Help
Powered by ViewVC 1.1.22