/[MITgcm]/MITgcm/pkg/mom_vecinv/mom_vi_hdissip.F
ViewVC logotype

Contents of /MITgcm/pkg/mom_vecinv/mom_vi_hdissip.F

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


Revision 1.16 - (show annotations) (download)
Mon Dec 20 19:08:21 2004 UTC (19 years, 6 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint57b_post, checkpoint57d_post, checkpoint57c_post, checkpoint57c_pre, checkpoint57e_post, eckpoint57e_pre
Changes since 1.15: +3 -5 lines
change options in diagnostics_fill arguments.

1 C $Header: /u/gcmpack/MITgcm/pkg/mom_vecinv/mom_vi_hdissip.F,v 1.15 2004/12/14 04:51:18 jmc Exp $
2 C $Name: $
3
4 #include "MOM_VECINV_OPTIONS.h"
5
6 SUBROUTINE MOM_VI_HDISSIP(
7 I bi,bj,k,
8 I hDiv,vort3,hFacZ,dStar,zStar,
9 O uDissip,vDissip,
10 I myThid)
11
12 cph(
13 cph The following line was commented in the argument list
14 cph TAMC cannot digest commented lines within continuing lines
15 c I viscAh_Z,viscAh_D,viscA4_Z,viscA4_D,
16 cph)
17
18 IMPLICIT NONE
19 C
20 C Calculate horizontal dissipation terms
21 C [del^2 - del^4] (u,v)
22 C
23
24 C == Global variables ==
25 #include "SIZE.h"
26 #include "GRID.h"
27 #include "EEPARAMS.h"
28 #include "PARAMS.h"
29
30 C == Routine arguments ==
31 INTEGER bi,bj,k
32 _RL hDiv(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
33 _RL vort3(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
34 _RS hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
35 _RL dStar(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
36 _RL zStar(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
37 _RL viscAh_Z(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
38 _RL viscAh_D(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
39 _RL viscA4_Z(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
40 _RL viscA4_D(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
41 _RL uDissip(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
42 _RL vDissip(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
43 INTEGER myThid
44
45 C == Local variables ==
46 INTEGER I,J
47 _RL Zip,Zij,Zpj,Dim,Dij,Dmj,uD2,vD2,uD4,vD4
48 _RL Alin,AlinMin,AlinMax,Alth,grdVrt,vg2,vg4,vg4Min,vg4Max
49 LOGICAL useVariableViscosity
50
51 useVariableViscosity=
52 & (viscAhGrid*deltaTmom.NE.0.)
53 & .OR.(viscA4Grid*deltaTmom.NE.0.)
54 & .OR.(viscC2leith.NE.0.)
55 & .OR.(viscC4leith.NE.0.)
56
57 IF (deltaTmom.NE.0.) THEN
58 vg2=viscAhGrid/deltaTmom
59 vg4=viscA4Grid/deltaTmom
60 vg4Min=viscA4GridMin/deltaTmom
61 vg4Max=viscA4GridMax/deltaTmom
62 ELSE
63 vg2=0.
64 vg4=0.
65 vg4Min=0.
66 vg4Max=0.
67 ENDIF
68
69 C - Viscosity
70 IF (useVariableViscosity) THEN
71 DO j=2-Oly,sNy+Oly-1
72 DO i=2-Olx,sNx+Olx-1
73 C This is the vector magnitude of the vorticity gradient
74 c grdVrt=sqrt(0.25*(
75 c & ((vort3(i+1,j)-vort3(i,j))*recip_DXG(i,j,bi,bj))**2
76 c & +((vort3(i,j+1)-vort3(i,j))*recip_DYG(i,j,bi,bj))**2
77 c & +((vort3(i+1,j+1)-vort3(i,j+1))*recip_DXG(i,j+1,bi,bj))**2
78 c & +((vort3(i+1,j+1)-vort3(i+1,j))*recip_DYG(i+1,j,bi,bj))**2 ))
79 C but this approximation will work on cube (and differs by as much as 4X)
80 grdVrt=abs((vort3(i+1,j)-vort3(i,j))*recip_DXG(i,j,bi,bj))
81 grdVrt=max(grdVrt,
82 & abs((vort3(i,j+1)-vort3(i,j))*recip_DYG(i,j,bi,bj)))
83 grdVrt=max(grdVrt,
84 & abs((vort3(i+1,j+1)-vort3(i,j+1))*recip_DXG(i,j+1,bi,bj)))
85 grdVrt=max(grdVrt,
86 & abs((vort3(i+1,j+1)-vort3(i+1,j))*recip_DYG(i+1,j,bi,bj)))
87 Alth=viscC2leith*grdVrt*(rA(i,j,bi,bj)**1.5)
88 Alin=viscAhD+vg2*rA ( i , j ,bi,bj)
89 viscAh_D(i,j)=min(viscAhMax,Alin+Alth)
90 Alth=viscC4leith*grdVrt*0.125*(rA(i,j,bi,bj)**2.5)
91 Alin=viscA4D+vg4*(rA ( i , j ,bi,bj)**2)
92 viscA4_D(i,j)=min(viscA4Max,Alin+Alth)
93 IF (vg4Max.GT.0.) THEN
94 AlinMax=vg4Max*(rA ( i , j ,bi,bj)**2)
95 viscA4_D(i,j)=min(AlinMax,viscA4_D(i,j))
96 ENDIF
97 AlinMin=vg4Min*(rA ( i , j ,bi,bj)**2)
98 viscA4_D(i,j)=max(AlinMin,viscA4_D(i,j))
99
100 C This is the vector magnitude of the vorticity gradient
101 c grdVrt=sqrt(0.25*(
102 c & ((vort3(i+1,j)-vort3(i,j))*recip_DXG(i,j,bi,bj))**2
103 c & +((vort3(i,j+1)-vort3(i,j))*recip_DYG(i,j,bi,bj))**2
104 c & +((vort3(i-1,j)-vort3(i,j))*recip_DXG(i-1,j,bi,bj))**2
105 c & +((vort3(i,j-1)-vort3(i,j))*recip_DYG(i,j-1,bi,bj))**2 ))
106 C but this approximation will work on cube (and differs by as much as 4X)
107 grdVrt=abs((vort3(i+1,j)-vort3(i,j))*recip_DXG(i,j,bi,bj))
108 grdVrt=max(grdVrt,
109 & abs((vort3(i,j+1)-vort3(i,j))*recip_DYG(i,j,bi,bj)))
110 grdVrt=max(grdVrt,
111 & abs((vort3(i-1,j)-vort3(i,j))*recip_DXG(i-1,j,bi,bj)))
112 grdVrt=max(grdVrt,
113 & abs((vort3(i,j-1)-vort3(i,j))*recip_DYG(i,j-1,bi,bj)))
114 Alth=viscC2leith*grdVrt*(rAz(i,j,bi,bj)**1.5)
115 Alin=viscAhZ+vg2*rAz( i , j ,bi,bj)
116 viscAh_Z(i,j)=min(viscAhMax,Alin+Alth)
117
118 Alth=viscC4leith*grdVrt*0.125*(rAz(i,j,bi,bj)**2.5)
119 Alin=viscA4Z+vg4*(rAz( i , j ,bi,bj)**2)
120 viscA4_Z(i,j)=min(viscA4Max,Alin+Alth)
121 IF (vg4Max.GT.0.) THEN
122 AlinMax=vg4Max*(rAz( i , j ,bi,bj)**2)
123 viscA4_Z(i,j)=min(AlinMax,viscA4_Z(i,j))
124 ENDIF
125 AlinMin=vg4Min*(rAz( i , j ,bi,bj)**2)
126 viscA4_Z(i,j)=max(AlinMin,viscA4_Z(i,j))
127 ENDDO
128 ENDDO
129 ELSE
130 DO j=1-Oly,sNy+Oly
131 DO i=1-Olx,sNx+Olx
132 viscAh_D(i,j)=viscAhD
133 viscAh_Z(i,j)=viscAhZ
134 viscA4_D(i,j)=viscA4D
135 viscA4_Z(i,j)=viscA4Z
136 ENDDO
137 ENDDO
138 ENDIF
139
140 C - Laplacian terms
141 IF ( viscC2leith.NE.0. .OR. viscAhGrid.NE.0.
142 & .OR. viscAhD.NE.0. .OR. viscAhZ.NE.0. ) THEN
143 DO j=2-Oly,sNy+Oly-1
144 DO i=2-Olx,sNx+Olx-1
145
146 Dim=hDiv( i ,j-1)
147 Dij=hDiv( i , j )
148 Dmj=hDiv(i-1, j )
149 Zip=hFacZ( i ,j+1)*vort3( i ,j+1)
150 Zij=hFacZ( i , j )*vort3( i , j )
151 Zpj=hFacZ(i+1, j )*vort3(i+1, j )
152
153 C This bit scales the harmonic dissipation operator to be proportional
154 C to the grid-cell area over the time-step. viscAh is then non-dimensional
155 C and should be less than 1/8, for example viscAh=0.01
156 IF (useVariableViscosity) THEN
157 Dij=Dij*viscAh_D(i,j)
158 Dim=Dim*viscAh_D(i,j-1)
159 Dmj=Dmj*viscAh_D(i-1,j)
160 Zij=Zij*viscAh_Z(i,j)
161 Zip=Zip*viscAh_Z(i,j+1)
162 Zpj=Zpj*viscAh_Z(i+1,j)
163 uD2 = (
164 & cosFacU(j,bi,bj)*( Dij-Dmj )*recip_DXC(i,j,bi,bj)
165 & -recip_hFacW(i,j,k,bi,bj)*( Zip-Zij )*recip_DYG(i,j,bi,bj) )
166 vD2 = (
167 & recip_hFacS(i,j,k,bi,bj)*( Zpj-Zij )*recip_DXG(i,j,bi,bj)
168 & *cosFacV(j,bi,bj)
169 & +( Dij-Dim )*recip_DYC(i,j,bi,bj) )
170 ELSE
171 uD2 = viscAhD*
172 & cosFacU(j,bi,bj)*( Dij-Dmj )*recip_DXC(i,j,bi,bj)
173 & - viscAhZ*recip_hFacW(i,j,k,bi,bj)*
174 & ( Zip-Zij )*recip_DYG(i,j,bi,bj)
175 vD2 = viscAhZ*recip_hFacS(i,j,k,bi,bj)*
176 & cosFacV(j,bi,bj)*( Zpj-Zij )*recip_DXG(i,j,bi,bj)
177 & + viscAhD* ( Dij-Dim )*recip_DYC(i,j,bi,bj)
178 ENDIF
179
180 uDissip(i,j) = uD2
181 vDissip(i,j) = vD2
182
183 ENDDO
184 ENDDO
185 ELSE
186 DO j=2-Oly,sNy+Oly-1
187 DO i=2-Olx,sNx+Olx-1
188 uDissip(i,j) = 0.
189 vDissip(i,j) = 0.
190 ENDDO
191 ENDDO
192 ENDIF
193
194 C - Bi-harmonic terms
195 IF ( viscC4leith.NE.0. .OR. viscA4Grid.NE.0.
196 & .OR. viscA4D.NE.0. .OR. viscA4Z.NE.0. ) THEN
197 DO j=2-Oly,sNy+Oly-1
198 DO i=2-Olx,sNx+Olx-1
199
200 #ifdef MOM_VI_ORIGINAL_VISCA4
201 Dim=dyF( i ,j-1,bi,bj)*dStar( i ,j-1)
202 Dij=dyF( i , j ,bi,bj)*dStar( i , j )
203 Dmj=dyF(i-1, j ,bi,bj)*dStar(i-1, j )
204
205 Zip=dxV( i ,j+1,bi,bj)*hFacZ( i ,j+1)*zStar( i ,j+1)
206 Zij=dxV( i , j ,bi,bj)*hFacZ( i , j )*zStar( i , j )
207 Zpj=dxV(i+1, j ,bi,bj)*hFacZ(i+1, j )*zStar(i+1, j )
208 #else
209 Dim=dStar( i ,j-1)
210 Dij=dStar( i , j )
211 Dmj=dStar(i-1, j )
212
213 Zip=hFacZ( i ,j+1)*zStar( i ,j+1)
214 Zij=hFacZ( i , j )*zStar( i , j )
215 Zpj=hFacZ(i+1, j )*zStar(i+1, j )
216 #endif
217
218 C This bit scales the harmonic dissipation operator to be proportional
219 C to the grid-cell area over the time-step. viscAh is then non-dimensional
220 C and should be less than 1/8, for example viscAh=0.01
221 IF (useVariableViscosity) THEN
222 Dij=Dij*viscA4_D(i,j)
223 Dim=Dim*viscA4_D(i,j-1)
224 Dmj=Dmj*viscA4_D(i-1,j)
225 Zij=Zij*viscA4_Z(i,j)
226 Zip=Zip*viscA4_Z(i,j+1)
227 Zpj=Zpj*viscA4_Z(i+1,j)
228
229 #ifdef MOM_VI_ORIGINAL_VISCA4
230 uD4 = recip_rAw(i,j,bi,bj)*(
231 & ( (Dij-Dmj)*cosFacU(j,bi,bj) )
232 & -recip_hFacW(i,j,k,bi,bj)*( Zip-Zij ) )
233 vD4 = recip_rAs(i,j,bi,bj)*(
234 & recip_hFacS(i,j,k,bi,bj)*( (Zpj-Zij)*cosFacV(j,bi,bj) )
235 & + ( Dij-Dim ) )
236 ELSE
237 uD4 = recip_rAw(i,j,bi,bj)*(
238 & viscA4*( (Dij-Dmj)*cosFacU(j,bi,bj) )
239 & -recip_hFacW(i,j,k,bi,bj)*viscA4*( Zip-Zij ) )
240 vD4 = recip_rAs(i,j,bi,bj)*(
241 & recip_hFacS(i,j,k,bi,bj)*viscA4*( (Zpj-Zij)*cosFacV(j,bi,bj) )
242 & + viscA4*( Dij-Dim ) )
243 #else /* MOM_VI_ORIGINAL_VISCA4 */
244 uD4 = (
245 & cosFacU(j,bi,bj)*( Dij-Dmj )*recip_DXC(i,j,bi,bj)
246 & -recip_hFacW(i,j,k,bi,bj)*( Zip-Zij )*recip_DYG(i,j,bi,bj) )
247 vD4 = (
248 & recip_hFacS(i,j,k,bi,bj)*( Zpj-Zij )*recip_DXG(i,j,bi,bj)
249 & *cosFacV(j,bi,bj)
250 & +( Dij-Dim )*recip_DYC(i,j,bi,bj) )
251 ELSE
252 uD4 = viscA4D*
253 & cosFacU(j,bi,bj)*( Dij-Dmj )*recip_DXC(i,j,bi,bj)
254 & - viscA4Z*recip_hFacW(i,j,k,bi,bj)*
255 & ( Zip-Zij )*recip_DYG(i,j,bi,bj)
256 vD4 = viscA4Z*recip_hFacS(i,j,k,bi,bj)*
257 & cosFacV(j,bi,bj)*( Zpj-Zij )*recip_DXG(i,j,bi,bj)
258 & + viscA4D* ( Dij-Dim )*recip_DYC(i,j,bi,bj)
259 #endif /* MOM_VI_ORIGINAL_VISCA4 */
260 ENDIF
261
262 uDissip(i,j) = uDissip(i,j) - uD4
263 vDissip(i,j) = vDissip(i,j) - vD4
264
265 ENDDO
266 ENDDO
267 ENDIF
268
269 #ifdef ALLOW_DIAGNOSTICS
270 IF (useDiagnostics) THEN
271 CALL DIAGNOSTICS_FILL(viscAh_D,'VISCAH ',k,1,2,bi,bj,myThid)
272 CALL DIAGNOSTICS_FILL(viscA4_D,'VISCA4 ',k,1,2,bi,bj,myThid)
273 ENDIF
274 #endif
275
276 RETURN
277 END

  ViewVC Help
Powered by ViewVC 1.1.22