/[MITgcm]/MITgcm/verification/aim.5l_cs/code/shap_filt_uv_s2.F
ViewVC logotype

Contents of /MITgcm/verification/aim.5l_cs/code/shap_filt_uv_s2.F

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


Revision 1.3 - (show annotations) (download)
Sun Aug 3 03:40:27 2003 UTC (20 years, 8 months ago) by jmc
Branch: MAIN
CVS Tags: HEAD
Changes since 1.2: +1 -1 lines
FILE REMOVED
use the standard version of these S/R

1 C $Header: /u/gcmpack/MITgcm/verification/aim.5l_cs/code/shap_filt_uv_s2.F,v 1.2 2002/03/04 01:39:50 jmc Exp $
2 C $Name: $
3
4 #include "SHAP_FILT_OPTIONS.h"
5
6 CBOP
7 C !ROUTINE: SHAP_FILT_UV_S2
8 C !INTERFACE:
9 SUBROUTINE SHAP_FILT_UV_S2(
10 U uFld, vFld, tmpFldU, tmpFldV,
11 I kSize, myTime, myThid )
12 C !DESCRIPTION: \bv
13 C *==========================================================*
14 C | S/R SHAP_FILT_UV_S2
15 C | o Applies Shapiro filter to velocity field (u & v).
16 C | o use filtering function "S2" = [1 - (d_xx+d_yy)^n]
17 C | o Options for computational filter (no grid spacing)
18 C | or physical space filter (with grid spacing) or both.
19 C *==========================================================*
20 C \ev
21
22 C !USES:
23 IMPLICIT NONE
24
25 C == Global variables ===
26 #include "SIZE.h"
27 #include "EEPARAMS.h"
28 #include "PARAMS.h"
29 #include "GRID.h"
30 #include "SHAP_FILT.h"
31
32 C !INPUT/OUTPUT PARAMETERS:
33 C == Routine arguments
34 C uFld :: velocity field (U component) on which filter applies
35 C vFld :: velocity field (V component) on which filter applies
36 C tmpFldU :: working temporary array
37 C tmpFldV :: working temporary array
38 C kSize :: length of 3rd Dim : either =1 (2D field) or =Nr (3D field)
39 C myTime :: Current time in simulation
40 C myThid :: Thread number for this instance of SHAP_FILT_UV_S2
41 INTEGER kSize
42 _RL uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,kSize,nSx,nSy)
43 _RL vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,kSize,nSx,nSy)
44 _RL tmpFldU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,kSize,nSx,nSy)
45 _RL tmpFldV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,kSize,nSx,nSy)
46 _RL myTime
47 INTEGER myThid
48
49 #ifdef ALLOW_SHAP_FILT
50
51 C------
52 C Combine computational Filter of Div & Vorticity
53 C and Physical Filter of U,V field
54 C nShapUVPhys = 0 ==> use only computational Filter
55 C nShapUVPhys = 1 ==> compute Div & Vort. with Grid factors,
56 C Filter Div & Vort. Numerically (power nShapUV-1)
57 C and return filtered U.V in physical space
58 C nShapUVPhys = nShapUV ==> Filter in Physical space only (power nShapUV)
59 C------
60
61 C !LOCAL VARIABLES:
62 C == Local variables ==
63 INTEGER bi,bj,k,i,j,N
64 _RS hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
65 _RS r_hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
66 _RL hDiv(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
67 _RL vort3(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
68 _RS maskZ
69 CEOP
70
71 IF (nShapUV.GT.0 .AND. Shap_uvtau.GT.0.) THEN
72
73 DO bj=myByLo(myThid),myByHi(myThid)
74 DO bi=myBxLo(myThid),myBxHi(myThid)
75 DO K=1,kSize
76 DO J=1-Oly,sNy+Oly
77 DO I=1-Olx,sNx+Olx
78 tmpFldU(i,j,k,bi,bj)=uFld(i,j,k,bi,bj)
79 & *_maskW(i,j,k,bi,bj)
80 tmpFldV(i,j,k,bi,bj)=vFld(i,j,k,bi,bj)
81 & *_maskS(i,j,k,bi,bj)
82 ENDDO
83 ENDDO
84 ENDDO
85 ENDDO
86 ENDDO
87
88 c---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
89
90 C [d_xx+d_yy]^n tmpFld
91
92 DO N=1,nShapUV
93
94 IF (kSize.EQ.Nr) THEN
95 CALL EXCH_UV_XYZ_RL(tmpFldU,tmpFldV,.TRUE.,myThid)
96 ELSE
97 CALL EXCH_UV_XY_RL(tmpFldU,tmpFldV,.TRUE.,myThid)
98 ENDIF
99
100 DO bj=myByLo(myThid),myByHi(myThid)
101 DO bi=myBxLo(myThid),myBxHi(myThid)
102 DO K=1,kSize
103
104 C [d_xx+d_yy] tmpFld
105 IF (N.LE.nShapUVPhys) THEN
106 CALL MOM_CALC_HFACZ(bi,bj,k,hFacZ,r_hFacZ,myThid)
107 CALL MOM_VI_CALC_HDIV(bi,bj,k,
108 I tmpFldU(1-OLx,1-OLy,k,bi,bj),
109 I tmpFldV(1-OLx,1-OLy,k,bi,bj),
110 & hDiv,myThid)
111 c CALL MOM_VI_CALC_RELVORT3(bi,bj,k,
112 CALL SHAP_FILT_RELVORT3(bi,bj,k,
113 I tmpFldU(1-OLx,1-OLy,k,bi,bj),
114 I tmpFldV(1-OLx,1-OLy,k,bi,bj),
115 & hFacZ,vort3,myThid)
116 ELSE
117 C- replace Physical calc Div & Vort by computational one :
118 DO J=0,sNy+1
119 DO I=0,sNx+1
120 hDiv(i,j)=tmpFldU(i+1,j,k,bi,bj)-tmpFldU(i,j,k,bi,bj)
121 & +tmpFldV(i,j+1,k,bi,bj)-tmpFldV(i,j,k,bi,bj)
122 ENDDO
123 ENDDO
124 DO J=1,sNy+1
125 DO I=1,sNx+1
126 vort3(i,j)=(tmpFldV(i,j,k,bi,bj)-tmpFldV(i-1,j,k,bi,bj)
127 & -tmpFldU(i,j,k,bi,bj)+tmpFldU(i,j-1,k,bi,bj)
128 & )
129 maskZ = (maskW(i,j,k,bi,bj)+maskW(i,j-1,k,bi,bj))
130 & *(maskS(i,j,k,bi,bj)+maskS(i-1,j,k,bi,bj))
131 IF (maskZ.LT.1.) vort3(i,j)=0.
132 ENDDO
133 ENDDO
134
135 C Special stuff for Cubed Sphere
136 IF (useCubedSphereExchange) THEN
137 c---
138 I=1
139 J=1
140 maskZ = maskW(i,j,k,bi,bj)+maskW(i,j-1,k,bi,bj)
141 & +maskS(i,j,k,bi,bj)
142 IF (maskZ.GE.2.) THEN
143 vort3(I,J)=
144 & tmpFldV(I,J,k,bi,bj)
145 & -tmpFldU(I,J,k,bi,bj)
146 & +tmpFldU(I,J-1,k,bi,bj)
147 vort3(I,J)=vort3(I,J)*4.d0/3.d0
148 ELSE
149 vort3(I,J)=0.
150 ENDIF
151 c---
152 I=sNx+1
153 J=1
154 maskZ = maskW(i,j,k,bi,bj)+maskW(i,j-1,k,bi,bj)
155 & +maskS(i-1,j,k,bi,bj)
156 IF (maskZ.GE.2.) THEN
157 vort3(I,J)=
158 & -tmpFldV(I-1,J,k,bi,bj)
159 & -tmpFldU(I,J,k,bi,bj)
160 & +tmpFldU(I,J-1,k,bi,bj)
161 vort3(I,J)=vort3(I,J)*4.d0/3.d0
162 ELSE
163 vort3(I,J)=0.
164 ENDIF
165 c---
166 I=1
167 J=sNy+1
168 maskZ = maskW(i,j,k,bi,bj)+maskW(i,j-1,k,bi,bj)
169 & +maskS(i,j,k,bi,bj)
170 IF (maskZ.GE.2.) THEN
171 vort3(I,J)=
172 & tmpFldV(I,J,k,bi,bj)
173 & -tmpFldU(I,J,k,bi,bj)
174 & +tmpFldU(I,J-1,k,bi,bj)
175 vort3(I,J)=vort3(I,J)*4.d0/3.d0
176 ELSE
177 vort3(I,J)=0.
178 ENDIF
179 c---
180 I=sNx+1
181 J=sNy+1
182 maskZ = maskW(i,j,k,bi,bj)+maskW(i,j-1,k,bi,bj)
183 & +maskS(i-1,j,k,bi,bj)
184 IF (maskZ.GE.2.) THEN
185 vort3(I,J)=
186 & -tmpFldV(I-1,J,k,bi,bj)
187 & -tmpFldU(I,J,k,bi,bj)
188 & +tmpFldU(I,J-1,k,bi,bj)
189 vort3(I,J)=vort3(I,J)*4.d0/3.d0
190 ELSE
191 vort3(I,J)=0.
192 ENDIF
193 c---
194 ENDIF
195 ENDIF
196
197 c---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
198
199 IF (N.GT.nShapUV-nShapUVPhys) THEN
200 CALL MOM_CALC_HFACZ(bi,bj,k,hFacZ,r_hFacZ,myThid)
201 CALL MOM_VI_DEL2UV(
202 I bi,bj,k,hDiv,vort3,hFacZ,
203 O tmpFldU(1-OLx,1-OLy,k,bi,bj),
204 O tmpFldV(1-OLx,1-OLy,k,bi,bj),
205 I myThid)
206 IF (Shap_uvLength.EQ.0.) THEN
207 DO J=1,sNy+1
208 DO I=1,sNx+1
209 tmpFldU(i,j,k,bi,bj) = -0.125*tmpFldU(i,j,k,bi,bj)
210 & *rAw(i,j,bi,bj)*_maskW(i,j,k,bi,bj)
211 tmpFldV(i,j,k,bi,bj) = -0.125*tmpFldV(i,j,k,bi,bj)
212 & *rAs(i,j,bi,bj)*_maskS(i,j,k,bi,bj)
213 ENDDO
214 ENDDO
215 ELSE
216 DO J=1,sNy+1
217 DO I=1,sNx+1
218 tmpFldU(i,j,k,bi,bj) = -0.125*tmpFldU(i,j,k,bi,bj)
219 & *Shap_uvLength*Shap_uvLength*_maskW(i,j,k,bi,bj)
220 tmpFldV(i,j,k,bi,bj) = -0.125*tmpFldV(i,j,k,bi,bj)
221 & *Shap_uvLength*Shap_uvLength*_maskS(i,j,k,bi,bj)
222 ENDDO
223 ENDDO
224 ENDIF
225 ELSE
226 DO J=1,sNy
227 DO I=1,sNx+1
228 tmpFldU(i,j,k,bi,bj) = -0.125*
229 & ( hDiv(i,j)-hDiv(i-1,j)
230 & -vort3(i,j+1)+vort3(i,j)
231 & )*maskW(i,j,k,bi,bj)
232 ENDDO
233 ENDDO
234 DO J=1,sNy+1
235 DO I=1,sNx
236 tmpFldV(i,j,k,bi,bj) = -0.125*
237 & ( vort3(i+1,j)-vort3(i,j)
238 & +hDiv(i,j)-hDiv(i,j-1)
239 & )*maskS(i,j,k,bi,bj)
240 ENDDO
241 ENDDO
242
243 ENDIF
244
245 ENDDO
246 ENDDO
247 ENDDO
248 C end loop N=1,nShapUV
249 ENDDO
250
251 c---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
252
253 C F <- [1 - (d_xx+d_yy)^n *deltaT/tau].F
254 DO bj=myByLo(myThid),myByHi(myThid)
255 DO bi=myBxLo(myThid),myBxHi(myThid)
256 DO K=1,kSize
257 DO J=1,sNy+1
258 DO I=1,sNx
259 uFld(i,j,k,bi,bj)=uFld(i,j,k,bi,bj)
260 & -tmpFldU(i,j,k,bi,bj)*deltaTmom/Shap_uvtau
261 ENDDO
262 ENDDO
263 DO J=1,sNy+1
264 DO I=1,sNx
265 vFld(i,j,k,bi,bj)=vFld(i,j,k,bi,bj)
266 & -tmpFldV(i,j,k,bi,bj)*deltaTmom/Shap_uvtau
267 ENDDO
268 ENDDO
269 ENDDO
270 ENDDO
271 ENDDO
272
273 IF (kSize.EQ.Nr) THEN
274 CALL EXCH_UV_XYZ_RL(uFld,vFld,.TRUE.,myThid)
275 ELSEIF (kSize.EQ.1) THEN
276 CALL EXCH_UV_XY_RL(uFld,vFld,.TRUE.,myThid)
277 ELSE
278 STOP 'S/R SHAP_FILT_UV_S2: kSize is wrong'
279 ENDIF
280
281 ENDIF
282 #endif /* ALLOW_SHAP_FILT */
283
284 RETURN
285 END

  ViewVC Help
Powered by ViewVC 1.1.22