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

Annotation 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 - (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_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