/[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.11 - (show annotations) (download)
Tue Sep 21 12:57:50 2004 UTC (19 years, 9 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint55i_post, checkpoint55c_post, checkpoint55g_post, checkpoint55d_post, checkpoint55d_pre, checkpoint55h_post, checkpoint55b_post, checkpoint55f_post, checkpoint55e_post
Changes since 1.10: +34 -4 lines
use a more standard discretization for biharmonic viscosity ;
 (original version still available with #define MOM_VI_ORIGINAL_VISCA4 )

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

  ViewVC Help
Powered by ViewVC 1.1.22