/[MITgcm]/MITgcm/pkg/shelfice/shelfice_v_drag.F
ViewVC logotype

Annotation of /MITgcm/pkg/shelfice/shelfice_v_drag.F

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


Revision 1.11 - (hide annotations) (download)
Sat Feb 14 21:58:05 2015 UTC (9 years, 3 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, checkpoint65z, checkpoint65x, checkpoint65y, checkpoint65r, checkpoint65s, checkpoint65p, checkpoint65q, checkpoint65v, checkpoint65w, checkpoint65t, checkpoint65u, checkpoint65j, checkpoint65k, checkpoint65n, checkpoint65o, checkpoint65l, checkpoint65m, HEAD
Changes since 1.10: +120 -24 lines
- implement alternative discretisation of quadratic drag (selectBotDragQuadr)
  and true distance in no-slip BC (bottomVisc_pCell) similar to bottom-drag.
- fix sign of friction tendency (no-slip BC) and fix u,v drag for thin
  ice-shelf case (i.e., within surface level).

1 jmc 1.11 C $Header: /u/gcmpack/MITgcm/pkg/shelfice/shelfice_v_drag.F,v 1.10 2015/01/04 00:01:12 jmc Exp $
2 mlosch 1.1 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 jmc 1.10 I bi, bj, k,
12     I uFld, vFld, KE, kappaRV,
13 mlosch 1.1 O vDragTerms,
14 jmc 1.10 I myThid )
15 mlosch 1.1
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 jmc 1.10 C uFld :: zonal flow
35 mlosch 1.1 C vFld :: meridional flow
36     C KE :: Kinetic energy
37 jmc 1.10 C kappaRV :: vertical viscosity
38 mlosch 1.1 C myThid :: thread number
39     INTEGER bi,bj,k
40 jmc 1.10 _RL uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
41 mlosch 1.1 _RL vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
42     _RL KE(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
43 jmc 1.10 _RL kappaRV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+1)
44 mlosch 1.1 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 jmc 1.7 #ifdef ALLOW_SHELFICE
51 mlosch 1.2 C !LOCAL VARIABLES : ====================================================
52 mlosch 1.1 C i,j :: loop indices
53     C Kp1 :: =k+1 for k<Nr, =Nr for k>=Nr
54 jmc 1.11 INTEGER i,j,kUpC,kTop
55     _RL viscFac, vSq
56     _RL rdrckp1
57 mlosch 1.1 CEOP
58    
59 mlosch 1.3 C- No-slip BCs impose a drag at top
60 mlosch 1.1 IF ( usingZCoords ) THEN
61     kTop = 1
62 mlosch 1.4 kUpC = k
63 mlosch 1.1 ELSE
64     kTop = Nr
65 jmc 1.10 kUpC = k+1
66 jmc 1.7 ENDIF
67 mlosch 1.1 rdrckp1=recip_drC(kUpC)
68 mlosch 1.4 CML IF (k.EQ.kTop) rdrckp1=recip_drF(k)
69 mlosch 1.1 viscFac=0.
70 jmc 1.10 IF (no_slip_shelfice) viscFac=2.
71 jmc 1.11
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     & * vFld(i,j)
82     ELSE
83     vDragTerms(i,j) = 0. _d 0
84     ENDIF
85     ENDDO
86     ENDDO
87     ELSE
88     DO j=1-OLy,sNy+OLy
89     DO i=1-OLx,sNx+OLx
90     vDragTerms(i,j) = 0. _d 0
91     ENDDO
92     ENDDO
93     ENDIF
94     IF ( no_slip_shelfice .AND. bottomVisc_pCell ) THEN
95     C- friction accounts for true distance (including hFac) to the surface
96     DO j=1-OLy+1,sNy+OLy-1
97     DO i=1-OLx,sNx+OLx-1
98     vDragTerms(i,j) = vDragTerms(i,j)
99     & * _recip_hFacS(i,j,k,bi,bj)
100     ENDDO
101     ENDDO
102     ENDIF
103    
104     C-- Add Linear drag:
105     IF ( SHELFICEDragLinear.NE.zeroRL ) THEN
106     DO j=1-OLy+1,sNy+OLy-1
107     DO i=1-OLx,sNx+OLx-1
108     IF ( k.EQ.MAX( kTopC(i,j-1,bi,bj),kTopC(i,j,bi,bj) ) ) THEN
109     vDragTerms(i,j) = vDragTerms(i,j)
110     & - _recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
111     & * SHELFICEDragLinear
112     & * vFld(i,j)
113     ENDIF
114     ENDDO
115     ENDDO
116     ENDIF
117    
118     C-- Add quadratic drag
119     IF ( SHELFICEselectDragQuadr.EQ.0 ) THEN
120     C- average grid-cell-center KE to get velocity norm @ U.pt
121     DO j=1-OLy+1,sNy+OLy-1
122     DO i=1-OLx,sNx+OLx-1
123     vSq = 0. _d 0
124     IF ( k.EQ.MAX( kTopC(i,j-1,bi,bj),kTopC(i,j,bi,bj) ) ) THEN
125     vSq = KE(i,j)+KE(i,j-1)
126     ENDIF
127     IF ( vSq.GT.zeroRL ) THEN
128     vDragTerms(i,j) = vDragTerms(i,j)
129     & - _recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
130     & * SHELFICEDragQuadratic*SQRT(vSq)
131     & * vFld(i,j)
132     ENDIF
133     ENDDO
134 mlosch 1.1 ENDDO
135 jmc 1.11 ELSEIF ( SHELFICEselectDragQuadr.EQ.1 ) THEN
136     C- calculate locally velocity norm @ U.pt (local U & 4 V averaged)
137     DO j=1-OLy+1,sNy+OLy-1
138     DO i=1-OLx,sNx+OLx-1
139     vSq = 0. _d 0
140     IF ( k.EQ.MAX( kTopC(i,j-1,bi,bj),kTopC(i,j,bi,bj) ) ) THEN
141     vSq = vFld(i,j)*vFld(i,j)
142     & + ( (uFld( i ,j-1)*uFld( i ,j-1)*hFacW( i ,j-1,k,bi,bj)
143     & +uFld( i , j )*uFld( i , j )*hFacW( i , j ,k,bi,bj))
144     & + (uFld(i+1,j-1)*uFld(i+1,j-1)*hFacW(i+1,j-1,k,bi,bj)
145     & +uFld(i+1, j )*uFld(i+1, j )*hFacW(i+1, j ,k,bi,bj))
146     & )*recip_hFacS(i,j,k,bi,bj)*0.25 _d 0
147     ENDIF
148     IF ( vSq.GT.zeroRL ) THEN
149     vDragTerms(i,j) = vDragTerms(i,j)
150     & - _recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
151     & * SHELFICEDragQuadratic*SQRT(vSq)
152     & * vFld(i,j)
153     ENDIF
154     ENDDO
155     ENDDO
156     ELSEIF ( SHELFICEselectDragQuadr.EQ.2 ) THEN
157     C- same as above but using wet-point method to average 4 V
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 = ( hFacW( i ,j-1,k,bi,bj) + hFacW( i , j ,k,bi,bj) )
163     & + ( hFacW(i+1,j-1,k,bi,bj) + hFacW(i+1, j ,k,bi,bj) )
164     IF ( vSq.GT.zeroRL ) THEN
165     vSq = vFld(i,j)*vFld(i,j)
166     & +( (uFld( i ,j-1)*uFld( i ,j-1)*hFacW( i ,j-1,k,bi,bj)
167     & +uFld( i , j )*uFld( i , j )*hFacW( i , j ,k,bi,bj))
168     & + (uFld(i+1,j-1)*uFld(i+1,j-1)*hFacW(i+1,j-1,k,bi,bj)
169     & +uFld(i+1, j )*uFld(i+1, j )*hFacW(i+1, j ,k,bi,bj))
170     & )/vSq
171     ELSE
172     vSq = vFld(i,j)*vFld(i,j)
173     ENDIF
174     ENDIF
175     IF ( vSq.GT.zeroRL ) THEN
176     vDragTerms(i,j) = vDragTerms(i,j)
177     & - _recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
178     & * SHELFICEDragQuadratic*SQRT(vSq)
179     & * vFld(i,j)
180     ENDIF
181     ENDDO
182     ENDDO
183     ENDIF
184 mlosch 1.1
185 mlosch 1.6 #ifdef ALLOW_DIAGNOSTICS
186 jmc 1.11 IF ( useDiagnostics .AND.
187     & ( no_slip_shelfice .OR. SHELFICEDragLinear.NE.zeroRL
188     & .OR. SHELFICEselectDragQuadr.GE.0 )
189     & ) THEN
190 mlosch 1.9 CALL DIAGNOSTICS_FILL(vDragTerms,'SHIVDrag',k,1,2,bi,bj,myThid)
191 mlosch 1.6 ENDIF
192     #endif /* ALLOW_DIAGNOSTICS */
193 mlosch 1.3 #endif /* ALLOW_SHELFICE */
194 mlosch 1.1
195     RETURN
196     END

  ViewVC Help
Powered by ViewVC 1.1.22