/[MITgcm]/MITgcm/pkg/shap_filt/shap_filt_relvort3.F
ViewVC logotype

Contents of /MITgcm/pkg/shap_filt/shap_filt_relvort3.F

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


Revision 1.8 - (show annotations) (download)
Fri Apr 4 19:38:23 2014 UTC (10 years ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64y, checkpoint64x, checkpoint64z, checkpoint64w, checkpoint64v, checkpoint65, 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, checkpoint65h, checkpoint65i, checkpoint65n, checkpoint65o, checkpoint65l, checkpoint65m, checkpoint65b, checkpoint65c, checkpoint65a, checkpoint65f, checkpoint65g, checkpoint65d, checkpoint65e, HEAD
Changes since 1.7: +6 -6 lines
Replace ALLOW_AUTODIFF_TAMC by ALLOW_AUTODIFF (except for tape/storage
  which are specific to TAF/TAMC).

1 C $Header: /u/gcmpack/MITgcm/pkg/shap_filt/shap_filt_relvort3.F,v 1.7 2009/06/28 01:08:26 jmc Exp $
2 C $Name: $
3
4 #include "SHAP_FILT_OPTIONS.h"
5 #undef CALC_CS_CORNER_EXTENDED
6
7 SUBROUTINE SHAP_FILT_RELVORT3(
8 I bi,bj,k,
9 I uFld, vFld, hFacZ,
10 O vort3,
11 I myThid)
12 IMPLICIT NONE
13 C *==========================================================*
14 C | S/R SHAP_FILT_RELVORT3
15 C *==========================================================*
16 C | copied from S/R MOM_CALC_RELVORT3, except:
17 C | a) do not apply any masking
18 C | b) use more uniform rAz at CS-grid corners
19 C *==========================================================*
20
21 C == Global variables ==
22 #include "SIZE.h"
23 #include "EEPARAMS.h"
24 #include "PARAMS.h"
25 #include "GRID.h"
26 #ifdef ALLOW_EXCH2
27 #include "W2_EXCH2_SIZE.h"
28 #include "W2_EXCH2_TOPOLOGY.h"
29 #endif /* ALLOW_EXCH2 */
30 C == Routine arguments ==
31 C myThid - Instance number for this innvocation of CALC_MOM_RHS
32 INTEGER bi,bj,k
33 _RL uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
34 _RL vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
35 _RS hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
36 _RL vort3(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
37 INTEGER myThid
38
39 C == Local variables ==
40 INTEGER i,j
41 LOGICAL northWestCorner, northEastCorner,
42 & southWestCorner, southEastCorner
43 INTEGER myFace
44 #ifdef ALLOW_EXCH2
45 INTEGER myTile
46 #endif /* ALLOW_EXCH2 */
47 _RL AZcorner
48
49 #ifdef ALLOW_AUTODIFF
50 DO J=1-OLy,sNy+OLy
51 DO I=1-OLx,sNx+OLx
52 vort3(I,J) = 0. _d 0
53 ENDDO
54 ENDDO
55 #endif
56
57 DO J=2-OLy,sNy+OLy
58 DO I=2-OLx,sNx+OLx
59
60 C Horizontal curl of flow field - ignoring lopping factors
61 vort3(I,J)=
62 & recip_rAz(I,J,bi,bj)*(
63 & ( vFld(I,J)*dyC(I,J,bi,bj)
64 & -vFld(I-1,J)*dyC(I-1,J,bi,bj) )
65 & -( uFld(I,J)*dxC(I,J,bi,bj)
66 & -uFld(I,J-1)*dxC(I,J-1,bi,bj) )
67 & )
68
69 C Horizontal curl of flow field - including lopping factors
70 c IF (hFacZ(i,j).NE.0.) THEN
71 c vort3(I,J)=
72 c & recip_rAz(I,J,bi,bj)*(
73 c & vFld(I,J)*dyc(I,J,bi,bj)*_hFacW(i,j,k,bi,bj)
74 c & -vFld(I-1,J)*dyc(I-1,J,bi,bj)*_hFacW(i-1,j,k,bi,bj)
75 c & -uFld(I,J)*dxc(I,J,bi,bj)*_hFacS(i,j,k,bi,bj)
76 c & +uFld(I,J-1)*dxc(I,J-1,bi,bj)*_hFacS(i,j-1,k,bi,bj)
77 c & )
78 c & /hFacZ(i,j)
79 c ELSE
80 c vort3(I,J)=0.
81 c ENDIF
82
83 ENDDO
84 ENDDO
85
86 C RETURN
87
88 C Special stuff for Cubed Sphere
89 IF (useCubedSphereExchange) THEN
90 AZcorner = 0.75 _d 0
91 #ifdef ALLOW_EXCH2
92 myTile = W2_myTileList(bi,bj)
93 myFace = exch2_myFace(myTile)
94 southWestCorner = exch2_isWedge(myTile).EQ.1
95 & .AND. exch2_isSedge(myTile).EQ.1
96 southEastCorner = exch2_isEedge(myTile).EQ.1
97 & .AND. exch2_isSedge(myTile).EQ.1
98 northEastCorner = exch2_isEedge(myTile).EQ.1
99 & .AND. exch2_isNedge(myTile).EQ.1
100 northWestCorner = exch2_isWedge(myTile).EQ.1
101 & .AND. exch2_isNedge(myTile).EQ.1
102 #else
103 myFace = bi
104 southWestCorner = .TRUE.
105 southEastCorner = .TRUE.
106 northWestCorner = .TRUE.
107 northEastCorner = .TRUE.
108 #endif /* ALLOW_EXCH2 */
109
110 IF ( southWestCorner ) THEN
111 C U(0,1) D(0,1) U(1,1) TILE
112 C | |
113 C V(-1,1) --- Z(0,1) --- V(0,1) --- Z(1,1) --- V(1,1) ---
114 C | |
115 C U(0,0) D(0,0) U(1,0) D(1,0)
116 C | |
117 C --- V(0,0) --- Z(1,0) --- V(1,0) ---
118 C |
119 C U(1,-1)
120 I=1
121 J=1
122 C- to get the same truncation, independent from the face Nb,
123 C do (1+2)+3, and always in the same order (exch3 convention order):
124 vort3(I,J)=
125 & +recip_rA(I,J,bi,bj)/AZcorner*(
126 & ( vFld(I,J)*dyC(I,J,bi,bj)
127 & -uFld(I,J)*dxC(I,J,bi,bj) )
128 & + uFld(I,J-1)*dxC(I,J-1,bi,bj)
129 & )
130 C- the quick way, but do not get the same truncation on the 3 faces:
131 c vort3(I,J)=
132 c & +recip_rA(I,J,bi,bj)/AZcorner*(
133 c & vFld(I,J)*dyC(I,J,bi,bj)
134 c & -uFld(I,J)*dxC(I,J,bi,bj)
135 c & +uFld(I,J-1)*dxC(I,J-1,bi,bj)
136 c & )
137 c IF (hFacZ(i,j).EQ.0. _d 0) vort3(i,j) = 0. _d 0
138 #ifdef CALC_CS_CORNER_EXTENDED
139 vort3(I-1,J)=
140 & recip_rAz(I-1,J,bi,bj)*(
141 & vFld(I-1,J)*dyC(I-1,J,bi,bj)
142 & -vFld(I-2,J)*dyC(I-2,J,bi,bj)
143 & -uFld(I-1,J)*dxC(I-1,J,bi,bj)
144 & +vFld(I+0,J-1)*dyC(I+0,J-1,bi,bj)
145 & )
146 c & *maskS(i-1,j,k,bi,bj)*maskS(i-2,j,k,bi,bj)
147 c & *maskW(i-1,j,k,bi,bj)*maskS(i,j-1,k,bi,bj)
148 vort3(I,J-1)=vort3(I-1,J)
149 #endif
150 ENDIF
151
152 IF ( southEastCorner ) THEN
153 C TILE U(N+1,1) D(N+1,1) U(N+2,1)
154 C | |
155 C V(N,1) --- Z(N+1,1) --- V(N+1,1) --- Z(N+2,1) --- V(N+3,1) ---
156 C | |
157 C D(N,0) U(N+1,0) D(N+1,0) U(N+2,0)
158 C | |
159 C V(N,0) --- Z(N+1,0) --- V(N+1,0) ---
160 C | |
161 C U(N+1,-1)
162 I=sNx+1
163 J=1
164 C- to get the same truncation, independent from the face Nb,
165 C (exch3 convention order):
166 IF ( myFace.EQ.2 ) THEN
167 vort3(I,J)=
168 & +recip_rA(I-1,J,bi,bj)/AZcorner*(
169 & (-uFld(I,J)*dxC(I,J,bi,bj)
170 & -vFld(I-1,J)*dyC(I-1,J,bi,bj) )
171 & + uFld(I,J-1)*dxC(I,J-1,bi,bj)
172 & )
173 ELSEIF ( myFace.EQ.4 ) THEN
174 vort3(I,J)=
175 & +recip_rA(I-1,J,bi,bj)/AZcorner*(
176 & (-vFld(I-1,J)*dyC(I-1,J,bi,bj)
177 & +uFld(I,J-1)*dxC(I,J-1,bi,bj) )
178 & - uFld(I,J)*dxC(I,J,bi,bj)
179 & )
180 ELSE
181 vort3(I,J)=
182 & +recip_rA(I-1,J,bi,bj)/AZcorner*(
183 & (+uFld(I,J-1)*dxC(I,J-1,bi,bj)
184 & -uFld(I,J)*dxC(I,J,bi,bj) )
185 & - vFld(I-1,J)*dyC(I-1,J,bi,bj)
186 & )
187 ENDIF
188 C- the quick way, but do not get the same truncation on the 3 faces:
189 c vort3(I,J)=
190 c & +recip_rA(I-1,J,bi,bj)/AZcorner*(
191 c & -vFld(I-1,J)*dyC(I-1,J,bi,bj)
192 c & -uFld(I,J)*dxC(I,J,bi,bj)
193 c & +uFld(I,J-1)*dxC(I,J-1,bi,bj)
194 c & )
195 c IF (hFacZ(i,j).EQ.0. _d 0) vort3(i,j) = 0. _d 0
196 #ifdef CALC_CS_CORNER_EXTENDED
197 vort3(I+1,J)=
198 & recip_rAz(I+1,J,bi,bj)*(
199 & vFld(I+1,J)*dyC(I+1,J,bi,bj)
200 & -vFld(I-0,J)*dyC(I-0,J,bi,bj)
201 & -uFld(I+1,J)*dxC(I+1,J,bi,bj)
202 & -vFld(I-1,J-1)*dyC(I-1,J-1,bi,bj)
203 & )
204 c & *maskS(i+1,j,k,bi,bj)*maskS(i-0,j,k,bi,bj)
205 c & *maskW(i+1,j,k,bi,bj)*maskS(i-1,j-1,k,bi,bj)
206 vort3(I,J-1)=vort3(I+1,J)
207 #endif
208 ENDIF
209
210 IF ( northWestCorner ) THEN
211 C U(1,N+2)
212 C |
213 C --- V(0,N+1) --- Z(1,N+2) --- V(1,N+2) ---
214 C | |
215 C U(0,N+1) D(0,N+1) U(1,N+1) D(1,N+1)
216 C | |
217 C V(-1,N+1) --- Z(0,N+1) --- V(0,N+1) --- Z(1,N+1) --- V(1,N+1) ---
218 C | |
219 C U(0,N) D(0,N) U(1,N) TILE
220 I=1
221 J=sNy+1
222 C- to get the same truncation, independent from the face Nb,
223 C (exch3 convention order):
224 IF ( myFace.EQ.1 ) THEN
225 vort3(I,J)=
226 & +recip_rA(I,J-1,bi,bj)/AZcorner*(
227 & (+uFld(I,J-1)*dxC(I,J-1,bi,bj)
228 & +vFld(I,J)*dyC(I,J,bi,bj) )
229 & -uFld(I,J)*dxC(I,J,bi,bj)
230 & )
231 ELSEIF ( myFace.EQ.3 ) THEN
232 vort3(I,J)=
233 & +recip_rA(I,J-1,bi,bj)/AZcorner*(
234 & (-uFld(I,J)*dxC(I,J,bi,bj)
235 & +uFld(I,J-1)*dxC(I,J-1,bi,bj) )
236 & + vFld(I,J)*dyC(I,J,bi,bj)
237 & )
238 ELSE
239 vort3(I,J)=
240 & +recip_rA(I,J-1,bi,bj)/AZcorner*(
241 & (+vFld(I,J)*dyC(I,J,bi,bj)
242 & -uFld(I,J)*dxC(I,J,bi,bj) )
243 & + uFld(I,J-1)*dxC(I,J-1,bi,bj)
244 & )
245 ENDIF
246 C- the quick way, but do not get the same truncation on the 3 faces:
247 c vort3(I,J)=
248 c & +recip_rA(I,J-1,bi,bj)/AZcorner*(
249 c & vFld(I,J)*dyC(I,J,bi,bj)
250 c & -uFld(I,J)*dxC(I,J,bi,bj)
251 c & +uFld(I,J-1)*dxC(I,J-1,bi,bj)
252 c & )
253 c IF (hFacZ(i,j).EQ.0. _d 0) vort3(i,j) = 0. _d 0
254 #ifdef CALC_CS_CORNER_EXTENDED
255 vort3(I-1,J)=
256 & recip_rAz(I-1,J,bi,bj)*(
257 & vFld(I-1,J)*dyC(I-1,J,bi,bj)
258 & -vFld(I-2,J)*dyC(I-2,J,bi,bj)
259 & +vFld(I-0,J+1)*dyC(I-0,J+1,bi,bj)
260 & +uFld(I-1,J-1)*dxC(I-1,J-1,bi,bj)
261 & )
262 c & *maskS(i-1,j,k,bi,bj)*maskS(i-2,j,k,bi,bj)
263 c & *maskS(i,j+1,k,bi,bj)*maskW(i-1,j-1,k,bi,bj)
264 vort3(I,J+1)=vort3(I-1,J)
265 #endif
266 ENDIF
267
268 IF ( northEastCorner ) THEN
269 C U(N+1,N+2)
270 C | |
271 C V(N,N+2) --- Z(N+1,N+2) --- V(N+1,N+2) ---
272 C | |
273 C D(N,N+1) U(N+1,N+1) D(N+1,N+1) U(N+2,N+1)
274 C | |
275 C V(N,N+1) --- Z(N+1,N+1) --- V(N+1,N+1) --- Z(N+2,N+1) --- V(N+3,N+1) ---
276 C | |
277 C TILE U(N+1,N) D(N+1,N) U(N+2,N)
278 I=sNx+1
279 J=sNy+1
280 C- to get the same truncation, independent from the face Nb:
281 C (exch3 convention order):
282 IF ( MOD(myFace,2).EQ.1 ) THEN
283 vort3(I,J)=
284 & +recip_rA(I-1,J-1,bi,bj)/AZcorner*(
285 & (-uFld(I,J)*dxC(I,J,bi,bj)
286 & -vFld(I-1,J)*dyC(I-1,J,bi,bj) )
287 & + uFld(I,J-1)*dxC(I,J-1,bi,bj)
288 & )
289 ELSE
290 vort3(I,J)=
291 & +recip_rA(I-1,J-1,bi,bj)/AZcorner*(
292 & (+uFld(I,J-1)*dxC(I,J-1,bi,bj)
293 & -uFld(I,J)*dxC(I,J,bi,bj) )
294 & - vFld(I-1,J)*dyC(I-1,J,bi,bj)
295 & )
296 ENDIF
297 C- the quick way, but do not get the same truncation on the 3 faces:
298 c vort3(I,J)=
299 c & +recip_rA(I-1,J-1,bi,bj)/AZcorner*(
300 c & -vFld(I-1,J)*dyC(I-1,J,bi,bj)
301 c & -uFld(I,J)*dxC(I,J,bi,bj)
302 c & +uFld(I,J-1)*dxC(I,J-1,bi,bj)
303 c & )
304 c IF (hFacZ(i,j).EQ.0. _d 0) vort3(i,j) = 0. _d 0
305 #ifdef CALC_CS_CORNER_EXTENDED
306 vort3(I+1,J)=
307 & recip_rAz(I+1,J,bi,bj)*(
308 & vFld(I+1,J)*dyC(I+1,J,bi,bj)
309 & -vFld(I-0,J)*dyC(I-0,J,bi,bj)
310 & -vFld(I-1,J+1)*dyC(I-1,J+1,bi,bj)
311 & +uFld(I+1,J-1)*dxC(I+1,J-1,bi,bj)
312 & )
313 c & *maskS(i+1,j,k,bi,bj)*maskS(i-0,j,k,bi,bj)
314 c & *maskS(i-1,j+1,k,bi,bj)*maskW(i+1,j-1,k,bi,bj)
315 vort3(I,J+1)=vort3(I+1,J)
316 #endif
317 ENDIF
318 ENDIF
319
320 RETURN
321 END

  ViewVC Help
Powered by ViewVC 1.1.22