/[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.14 - (show annotations) (download)
Fri Dec 10 20:15:10 2004 UTC (19 years, 5 months ago) by heimbach
Branch: MAIN
CVS Tags: checkpoint57a_post
Changes since 1.13: +8 -2 lines
This set of changes restores TAMC(!) compatibility.

1 C $Header: /u/gcmpack/MITgcm/pkg/mom_vecinv/mom_vi_hdissip.F,v 1.13 2004/11/02 23:57:29 dimitri 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 parameter 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 INTEGER klev
51
52 useVariableViscosity=
53 & (viscAhGrid*deltaTmom.NE.0.)
54 & .OR.(viscA4Grid*deltaTmom.NE.0.)
55 & .OR.(viscC2leith.NE.0.)
56 & .OR.(viscC4leith.NE.0.)
57
58 IF (deltaTmom.NE.0.) THEN
59 vg2=viscAhGrid/deltaTmom
60 vg4=viscA4Grid/deltaTmom
61 vg4Min=viscA4GridMin/deltaTmom
62 vg4Max=viscA4GridMax/deltaTmom
63 ELSE
64 vg2=0.
65 vg4=0.
66 vg4Min=0.
67 vg4Max=0.
68 ENDIF
69
70 C - Viscosity
71 IF (useVariableViscosity) THEN
72 DO j=2-Oly,sNy+Oly-1
73 DO i=2-Olx,sNx+Olx-1
74 C This is the vector magnitude of the vorticity gradient
75 c grdVrt=sqrt(0.25*(
76 c & ((vort3(i+1,j)-vort3(i,j))*recip_DXG(i,j,bi,bj))**2
77 c & +((vort3(i,j+1)-vort3(i,j))*recip_DYG(i,j,bi,bj))**2
78 c & +((vort3(i+1,j+1)-vort3(i,j+1))*recip_DXG(i,j+1,bi,bj))**2
79 c & +((vort3(i+1,j+1)-vort3(i+1,j))*recip_DYG(i+1,j,bi,bj))**2 ))
80 C but this approximation will work on cube (and differs by as much as 4X)
81 grdVrt=abs((vort3(i+1,j)-vort3(i,j))*recip_DXG(i,j,bi,bj))
82 grdVrt=max(grdVrt,
83 & abs((vort3(i,j+1)-vort3(i,j))*recip_DYG(i,j,bi,bj)))
84 grdVrt=max(grdVrt,
85 & abs((vort3(i+1,j+1)-vort3(i,j+1))*recip_DXG(i,j+1,bi,bj)))
86 grdVrt=max(grdVrt,
87 & abs((vort3(i+1,j+1)-vort3(i+1,j))*recip_DYG(i+1,j,bi,bj)))
88 Alth=viscC2leith*grdVrt*(rA(i,j,bi,bj)**1.5)
89 Alin=viscAhD+vg2*rA ( i , j ,bi,bj)
90 viscAh_D(i,j)=min(viscAhMax,Alin+Alth)
91 Alth=viscC4leith*grdVrt*0.125*(rA(i,j,bi,bj)**2.5)
92 Alin=viscA4D+vg4*(rA ( i , j ,bi,bj)**2)
93 viscA4_D(i,j)=min(viscA4Max,Alin+Alth)
94 IF (vg4Max.GT.0.) THEN
95 AlinMax=vg4Max*(rA ( i , j ,bi,bj)**2)
96 viscA4_D(i,j)=min(AlinMax,viscA4_D(i,j))
97 ENDIF
98 AlinMin=vg4Min*(rA ( i , j ,bi,bj)**2)
99 viscA4_D(i,j)=max(AlinMin,viscA4_D(i,j))
100
101 C This is the vector magnitude of the vorticity gradient
102 c grdVrt=sqrt(0.25*(
103 c & ((vort3(i+1,j)-vort3(i,j))*recip_DXG(i,j,bi,bj))**2
104 c & +((vort3(i,j+1)-vort3(i,j))*recip_DYG(i,j,bi,bj))**2
105 c & +((vort3(i-1,j)-vort3(i,j))*recip_DXG(i-1,j,bi,bj))**2
106 c & +((vort3(i,j-1)-vort3(i,j))*recip_DYG(i,j-1,bi,bj))**2 ))
107 C but this approximation will work on cube (and differs by as much as 4X)
108 grdVrt=abs((vort3(i+1,j)-vort3(i,j))*recip_DXG(i,j,bi,bj))
109 grdVrt=max(grdVrt,
110 & abs((vort3(i,j+1)-vort3(i,j))*recip_DYG(i,j,bi,bj)))
111 grdVrt=max(grdVrt,
112 & abs((vort3(i-1,j)-vort3(i,j))*recip_DXG(i-1,j,bi,bj)))
113 grdVrt=max(grdVrt,
114 & abs((vort3(i,j-1)-vort3(i,j))*recip_DYG(i,j-1,bi,bj)))
115 Alth=viscC2leith*grdVrt*(rAz(i,j,bi,bj)**1.5)
116 Alin=viscAhZ+vg2*rAz( i , j ,bi,bj)
117 viscAh_Z(i,j)=min(viscAhMax,Alin+Alth)
118
119 Alth=viscC4leith*grdVrt*0.125*(rAz(i,j,bi,bj)**2.5)
120 Alin=viscA4Z+vg4*(rAz( i , j ,bi,bj)**2)
121 viscA4_Z(i,j)=min(viscA4Max,Alin+Alth)
122 IF (vg4Max.GT.0.) THEN
123 AlinMax=vg4Max*(rAz( i , j ,bi,bj)**2)
124 viscA4_Z(i,j)=min(AlinMax,viscA4_Z(i,j))
125 ENDIF
126 AlinMin=vg4Min*(rAz( i , j ,bi,bj)**2)
127 viscA4_Z(i,j)=max(AlinMin,viscA4_Z(i,j))
128 ENDDO
129 ENDDO
130 ELSE
131 DO j=1-Oly,sNy+Oly
132 DO i=1-Olx,sNx+Olx
133 viscAh_D(i,j)=viscAhD
134 viscAh_Z(i,j)=viscAhZ
135 viscA4_D(i,j)=viscA4D
136 viscA4_Z(i,j)=viscA4Z
137 ENDDO
138 ENDDO
139 ENDIF
140
141 C - Laplacian terms
142 IF ( viscC2leith.NE.0. .OR. viscAhGrid.NE.0.
143 & .OR. viscAhD.NE.0. .OR. viscAhZ.NE.0. ) THEN
144 DO j=2-Oly,sNy+Oly-1
145 DO i=2-Olx,sNx+Olx-1
146
147 Dim=hDiv( i ,j-1)
148 Dij=hDiv( i , j )
149 Dmj=hDiv(i-1, j )
150 Zip=hFacZ( i ,j+1)*vort3( i ,j+1)
151 Zij=hFacZ( i , j )*vort3( i , j )
152 Zpj=hFacZ(i+1, j )*vort3(i+1, j )
153
154 C This bit scales the harmonic dissipation operator to be proportional
155 C to the grid-cell area over the time-step. viscAh is then non-dimensional
156 C and should be less than 1/8, for example viscAh=0.01
157 IF (useVariableViscosity) THEN
158 Dij=Dij*viscAh_D(i,j)
159 Dim=Dim*viscAh_D(i,j-1)
160 Dmj=Dmj*viscAh_D(i-1,j)
161 Zij=Zij*viscAh_Z(i,j)
162 Zip=Zip*viscAh_Z(i,j+1)
163 Zpj=Zpj*viscAh_Z(i+1,j)
164 uD2 = (
165 & cosFacU(j,bi,bj)*( Dij-Dmj )*recip_DXC(i,j,bi,bj)
166 & -recip_hFacW(i,j,k,bi,bj)*( Zip-Zij )*recip_DYG(i,j,bi,bj) )
167 vD2 = (
168 & recip_hFacS(i,j,k,bi,bj)*( Zpj-Zij )*recip_DXG(i,j,bi,bj)
169 & *cosFacV(j,bi,bj)
170 & +( Dij-Dim )*recip_DYC(i,j,bi,bj) )
171 ELSE
172 uD2 = viscAhD*
173 & cosFacU(j,bi,bj)*( Dij-Dmj )*recip_DXC(i,j,bi,bj)
174 & - viscAhZ*recip_hFacW(i,j,k,bi,bj)*
175 & ( Zip-Zij )*recip_DYG(i,j,bi,bj)
176 vD2 = viscAhZ*recip_hFacS(i,j,k,bi,bj)*
177 & cosFacV(j,bi,bj)*( Zpj-Zij )*recip_DXG(i,j,bi,bj)
178 & + viscAhD* ( Dij-Dim )*recip_DYC(i,j,bi,bj)
179 ENDIF
180
181 uDissip(i,j) = uD2
182 vDissip(i,j) = vD2
183
184 ENDDO
185 ENDDO
186 ELSE
187 DO j=2-Oly,sNy+Oly-1
188 DO i=2-Olx,sNx+Olx-1
189 uDissip(i,j) = 0.
190 vDissip(i,j) = 0.
191 ENDDO
192 ENDDO
193 ENDIF
194
195 C - Bi-harmonic terms
196 IF ( viscC4leith.NE.0. .OR. viscA4Grid.NE.0.
197 & .OR. viscA4D.NE.0. .OR. viscA4Z.NE.0. ) THEN
198 DO j=2-Oly,sNy+Oly-1
199 DO i=2-Olx,sNx+Olx-1
200
201 #ifdef MOM_VI_ORIGINAL_VISCA4
202 Dim=dyF( i ,j-1,bi,bj)*dStar( i ,j-1)
203 Dij=dyF( i , j ,bi,bj)*dStar( i , j )
204 Dmj=dyF(i-1, j ,bi,bj)*dStar(i-1, j )
205
206 Zip=dxV( i ,j+1,bi,bj)*hFacZ( i ,j+1)*zStar( i ,j+1)
207 Zij=dxV( i , j ,bi,bj)*hFacZ( i , j )*zStar( i , j )
208 Zpj=dxV(i+1, j ,bi,bj)*hFacZ(i+1, j )*zStar(i+1, j )
209 #else
210 Dim=dStar( i ,j-1)
211 Dij=dStar( i , j )
212 Dmj=dStar(i-1, j )
213
214 Zip=hFacZ( i ,j+1)*zStar( i ,j+1)
215 Zij=hFacZ( i , j )*zStar( i , j )
216 Zpj=hFacZ(i+1, j )*zStar(i+1, j )
217 #endif
218
219 C This bit scales the harmonic dissipation operator to be proportional
220 C to the grid-cell area over the time-step. viscAh is then non-dimensional
221 C and should be less than 1/8, for example viscAh=0.01
222 IF (useVariableViscosity) THEN
223 Dij=Dij*viscA4_D(i,j)
224 Dim=Dim*viscA4_D(i,j-1)
225 Dmj=Dmj*viscA4_D(i-1,j)
226 Zij=Zij*viscA4_Z(i,j)
227 Zip=Zip*viscA4_Z(i,j+1)
228 Zpj=Zpj*viscA4_Z(i+1,j)
229
230 #ifdef MOM_VI_ORIGINAL_VISCA4
231 uD4 = recip_rAw(i,j,bi,bj)*(
232 & ( (Dij-Dmj)*cosFacU(j,bi,bj) )
233 & -recip_hFacW(i,j,k,bi,bj)*( Zip-Zij ) )
234 vD4 = recip_rAs(i,j,bi,bj)*(
235 & recip_hFacS(i,j,k,bi,bj)*( (Zpj-Zij)*cosFacV(j,bi,bj) )
236 & + ( Dij-Dim ) )
237 ELSE
238 uD4 = recip_rAw(i,j,bi,bj)*(
239 & viscA4*( (Dij-Dmj)*cosFacU(j,bi,bj) )
240 & -recip_hFacW(i,j,k,bi,bj)*viscA4*( Zip-Zij ) )
241 vD4 = recip_rAs(i,j,bi,bj)*(
242 & recip_hFacS(i,j,k,bi,bj)*viscA4*( (Zpj-Zij)*cosFacV(j,bi,bj) )
243 & + viscA4*( Dij-Dim ) )
244 #else /* MOM_VI_ORIGINAL_VISCA4 */
245 uD4 = (
246 & cosFacU(j,bi,bj)*( Dij-Dmj )*recip_DXC(i,j,bi,bj)
247 & -recip_hFacW(i,j,k,bi,bj)*( Zip-Zij )*recip_DYG(i,j,bi,bj) )
248 vD4 = (
249 & recip_hFacS(i,j,k,bi,bj)*( Zpj-Zij )*recip_DXG(i,j,bi,bj)
250 & *cosFacV(j,bi,bj)
251 & +( Dij-Dim )*recip_DYC(i,j,bi,bj) )
252 ELSE
253 uD4 = viscA4D*
254 & cosFacU(j,bi,bj)*( Dij-Dmj )*recip_DXC(i,j,bi,bj)
255 & - viscA4Z*recip_hFacW(i,j,k,bi,bj)*
256 & ( Zip-Zij )*recip_DYG(i,j,bi,bj)
257 vD4 = viscA4Z*recip_hFacS(i,j,k,bi,bj)*
258 & cosFacV(j,bi,bj)*( Zpj-Zij )*recip_DXG(i,j,bi,bj)
259 & + viscA4D* ( Dij-Dim )*recip_DYC(i,j,bi,bj)
260 #endif /* MOM_VI_ORIGINAL_VISCA4 */
261 ENDIF
262
263 uDissip(i,j) = uDissip(i,j) - uD4
264 vDissip(i,j) = vDissip(i,j) - vD4
265
266 ENDDO
267 ENDDO
268 ENDIF
269
270 #ifdef ALLOW_DIAGNOSTICS
271 if (useDiagnostics) then
272 klev = -1 * k
273 call fill_diagnostics(myThid,'VISCAH ',klev,1,3,bi,bj,viscAh_D)
274 call fill_diagnostics(myThid,'VISCA4 ',klev,1,3,bi,bj,viscA4_D)
275 endif
276 #endif
277
278 RETURN
279 END

  ViewVC Help
Powered by ViewVC 1.1.22