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

Annotation 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 - (hide 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 dgoldberg 1.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