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

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

  ViewVC Help
Powered by ViewVC 1.1.22