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

Annotation of /MITgcm_contrib/ksnow/press_release/code/shelfice_u_drag.F

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


Revision 1.1 - (hide annotations) (download)
Fri Dec 16 15:23:18 2016 UTC (9 years, 8 months ago) by ksnow
Branch: MAIN
Adding press_release core code files
C: ----------------------------------------------------------------------

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

  ViewVC Help
Powered by ViewVC 1.1.22