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

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

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


Revision 1.12 - (show annotations) (download)
Fri Oct 7 00:27:53 2005 UTC (18 years, 6 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint58b_post, checkpoint57y_post, checkpoint59, checkpoint58, checkpoint58f_post, checkpoint58d_post, checkpoint58a_post, checkpoint57z_post, checkpoint58y_post, checkpoint58t_post, checkpoint58m_post, checkpoint57v_post, checkpoint58w_post, checkpoint57y_pre, checkpoint58o_post, checkpoint58p_post, checkpoint58q_post, checkpoint58e_post, checkpoint58r_post, checkpoint58n_post, checkpoint59e, checkpoint59d, checkpoint59a, checkpoint59c, checkpoint59b, checkpint57u_post, checkpoint58k_post, checkpoint58v_post, checkpoint58l_post, checkpoint58g_post, checkpoint58x_post, checkpoint58h_post, checkpoint58j_post, checkpoint57w_post, checkpoint58i_post, checkpoint57x_post, checkpoint58c_post, checkpoint58u_post, checkpoint58s_post
Changes since 1.11: +73 -148 lines
Compute over a wider range of index to reduce (by 2) the number of
 exch call needed; and comment out the last exch call (not needed).

1 C $Header: /u/gcmpack/MITgcm/pkg/shap_filt/shap_filt_uv_s2.F,v 1.11 2005/09/27 22:11:06 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 #ifdef ALLOW_EXCH2
32 #include "W2_EXCH2_TOPOLOGY.h"
33 #include "W2_EXCH2_PARAMS.h"
34 #endif /* ALLOW_EXCH2 */
35
36 C !INPUT/OUTPUT PARAMETERS:
37 C == Routine arguments
38 C uFld :: velocity field (U component) on which filter applies
39 C vFld :: velocity field (V component) on which filter applies
40 C tmpFldU :: working temporary array
41 C tmpFldV :: working temporary array
42 C kSize :: length of 3rd Dim : either =1 (2D field) or =Nr (3D field)
43 C myTime :: Current time in simulation
44 C myThid :: Thread number for this instance of SHAP_FILT_UV_S2
45 INTEGER kSize
46 _RL uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,kSize,nSx,nSy)
47 _RL vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,kSize,nSx,nSy)
48 _RL tmpFldU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,kSize,nSx,nSy)
49 _RL tmpFldV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,kSize,nSx,nSy)
50 _RL myTime
51 INTEGER myThid
52
53 #ifdef ALLOW_SHAP_FILT
54
55 C------
56 C Combine computational Filter of Div & Vorticity
57 C and Physical Filter of U,V field
58 C nShapUVPhys = 0 ==> use only computational Filter
59 C nShapUVPhys = 1 ==> compute Div & Vort. with Grid factors,
60 C Filter Div & Vort. Numerically (power nShapUV-1)
61 C and return filtered U.V in physical space
62 C nShapUVPhys = nShapUV ==> Filter in Physical space only (power nShapUV)
63 C------
64
65 C !LOCAL VARIABLES:
66 C == Local variables ==
67 INTEGER bi,bj,k,i,j,n
68 _RS hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
69 _RS r_hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
70 _RL hDiv(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
71 _RL vort3(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
72 CEOP
73
74 IF (nShapUV.GT.0 .AND. Shap_uvtau.GT.0.) THEN
75
76 DO bj=myByLo(myThid),myByHi(myThid)
77 DO bi=myBxLo(myThid),myBxHi(myThid)
78 DO k=1,kSize
79 DO j=1-Oly,sNy+Oly
80 DO i=1-Olx,sNx+Olx
81 tmpFldU(i,j,k,bi,bj)=uFld(i,j,k,bi,bj)
82 & *_maskW(i,j,k,bi,bj)
83 tmpFldV(i,j,k,bi,bj)=vFld(i,j,k,bi,bj)
84 & *_maskS(i,j,k,bi,bj)
85 ENDDO
86 ENDDO
87 ENDDO
88 ENDDO
89 ENDDO
90
91 c---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
92
93 C-- [d_xx+d_yy]^n tmpFld
94
95 DO n=1,nShapUV
96
97 IF ( MOD(n,2).EQ.1 .OR. Shap_alwaysExchUV ) THEN
98 IF (kSize.EQ.Nr) THEN
99 CALL EXCH_UV_XYZ_RL(tmpFldU,tmpFldV,.TRUE.,myThid)
100 ELSEIF (kSize.EQ.1) THEN
101 CALL EXCH_UV_XY_RL(tmpFldU,tmpFldV,.TRUE.,myThid)
102 ELSE
103 STOP 'S/R SHAP_FILT_UV_S2: kSize is wrong'
104 ENDIF
105 ENDIF
106
107 DO bj=myByLo(myThid),myByHi(myThid)
108 DO bi=myBxLo(myThid),myBxHi(myThid)
109 DO k=1,kSize
110
111 IF ( n.LE.nShapUVPhys .OR.
112 & n.GT.nShapUV-nShapUVPhys )
113 & CALL MOM_CALC_HFACZ(bi,bj,k,hFacZ,r_hFacZ,myThid)
114
115 C- [d_xx+d_yy] tmpFld
116 IF (n.LE.nShapUVPhys) THEN
117 CALL MOM_CALC_HDIV(bi,bj,k,2,
118 I tmpFldU(1-OLx,1-OLy,k,bi,bj),
119 I tmpFldV(1-OLx,1-OLy,k,bi,bj),
120 & hDiv,myThid)
121 #ifdef USE_SHAP_CALC_VORTICITY
122 CALL SHAP_FILT_RELVORT3(bi,bj,k,
123 I tmpFldU(1-OLx,1-OLy,k,bi,bj),
124 I tmpFldV(1-OLx,1-OLy,k,bi,bj),
125 & hFacZ,vort3,myThid)
126 #else
127 CALL MOM_CALC_RELVORT3(bi,bj,k,
128 I tmpFldU(1-OLx,1-OLy,k,bi,bj),
129 I tmpFldV(1-OLx,1-OLy,k,bi,bj),
130 & hFacZ,vort3,myThid)
131 #endif
132 ELSE
133 C- replace Physical calc Div & Vort by computational one :
134 DO j=2-Oly,sNy+Oly-1
135 DO i=2-Olx,sNx+Olx-1
136 hDiv(i,j)=(tmpFldU(i+1,j,k,bi,bj)-tmpFldU(i,j,k,bi,bj))
137 & +(tmpFldV(i,j+1,k,bi,bj)-tmpFldV(i,j,k,bi,bj))
138 ENDDO
139 ENDDO
140 CALL SHAP_FILT_COMPUTVORT(
141 I tmpFldU(1-OLx,1-OLy,k,bi,bj),
142 I tmpFldV(1-OLx,1-OLy,k,bi,bj),
143 O vort3,
144 I k,bi,bj,myThid)
145 ENDIF
146
147 c---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
148
149 IF (n.GT.nShapUV-nShapUVPhys) THEN
150 IF (Shap_uvLength.LT.0.) THEN
151 DO j=2-Oly,sNy+Oly-1
152 DO i=2-Olx,sNx+Olx-1
153 hDiv(i,j) = hDiv(i,j) * rA(i,j,bi,bj)
154 vort3(i,j)= vort3(i,j)*rAz(i,j,bi,bj)
155 ENDDO
156 ENDDO
157 ENDIF
158 CALL MOM_VI_DEL2UV(
159 I bi,bj,k,hDiv,vort3,hFacZ,
160 O tmpFldU(1-OLx,1-OLy,k,bi,bj),
161 O tmpFldV(1-OLx,1-OLy,k,bi,bj),
162 I myThid)
163 IF (Shap_uvLength.LT.0.) THEN
164 DO j=3-Oly,sNy+Oly-1
165 DO i=3-Olx,sNx+Olx-1
166 tmpFldU(i,j,k,bi,bj) = -0.125 _d 0*tmpFldU(i,j,k,bi,bj)
167 & *_maskW(i,j,k,bi,bj)
168 tmpFldV(i,j,k,bi,bj) = -0.125 _d 0*tmpFldV(i,j,k,bi,bj)
169 & *_maskS(i,j,k,bi,bj)
170 ENDDO
171 ENDDO
172 ELSEIF (Shap_uvLength.EQ.0.) THEN
173 DO j=3-Oly,sNy+Oly-1
174 DO i=3-Olx,sNx+Olx-1
175 tmpFldU(i,j,k,bi,bj) = -0.125 _d 0*tmpFldU(i,j,k,bi,bj)
176 & *rAw(i,j,bi,bj)*_maskW(i,j,k,bi,bj)
177 tmpFldV(i,j,k,bi,bj) = -0.125 _d 0*tmpFldV(i,j,k,bi,bj)
178 & *rAs(i,j,bi,bj)*_maskS(i,j,k,bi,bj)
179 ENDDO
180 ENDDO
181 ELSE
182 DO j=3-Oly,sNy+Oly-1
183 DO i=3-Olx,sNx+Olx-1
184 tmpFldU(i,j,k,bi,bj) = -0.125 _d 0*tmpFldU(i,j,k,bi,bj)
185 & *Shap_uvLength*Shap_uvLength*_maskW(i,j,k,bi,bj)
186 tmpFldV(i,j,k,bi,bj) = -0.125 _d 0*tmpFldV(i,j,k,bi,bj)
187 & *Shap_uvLength*Shap_uvLength*_maskS(i,j,k,bi,bj)
188 ENDDO
189 ENDDO
190 ENDIF
191 ELSE
192 C- replace derivatives in physical space of Div & Vort by computational ones:
193 #ifndef ALLOW_AUTODIFF_TAMC
194 IF ( .NOT.Shap_alwaysExchUV
195 & .AND. useCubedSphereExchange ) THEN
196 C to compute d/dx(hDiv), fill corners with appropriate values:
197 CALL FILL_CS_CORNER_TR_RL( .TRUE., hDiv, bi,bj, myThid )
198 ENDIF
199 #endif
200 DO j=3-Oly,sNy+Oly-2
201 DO i=3-Olx,sNx+Olx-1
202 tmpFldU(i,j,k,bi,bj) = -0.125 _d 0*
203 & ( (hDiv(i,j) - hDiv(i-1,j))
204 & -(vort3(i,j+1)-vort3(i,j))
205 & )*maskW(i,j,k,bi,bj)
206 ENDDO
207 ENDDO
208 #ifndef ALLOW_AUTODIFF_TAMC
209 IF ( .NOT.Shap_alwaysExchUV
210 & .AND. useCubedSphereExchange ) THEN
211 C to compute d/dy(hDiv), fill corners with appropriate values:
212 CALL FILL_CS_CORNER_TR_RL(.FALSE., hDiv, bi,bj, myThid )
213 ENDIF
214 #endif
215 DO j=3-Oly,sNy+Oly-1
216 DO i=3-Olx,sNx+Olx-2
217 tmpFldV(i,j,k,bi,bj) = -0.125 _d 0*
218 & ( (hDiv(i,j) - hDiv(i,j-1))
219 & +(vort3(i+1,j)-vort3(i,j))
220 & )*maskS(i,j,k,bi,bj)
221 ENDDO
222 ENDDO
223
224 ENDIF
225
226 C end loops k / bi / bj
227 ENDDO
228 ENDDO
229 ENDDO
230 C end loop n=1,nShapUV
231 ENDDO
232
233 c---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
234
235 C F <- [1 - (d_xx+d_yy)^n *deltaT/tau].F
236 DO bj=myByLo(myThid),myByHi(myThid)
237 DO bi=myBxLo(myThid),myBxHi(myThid)
238 DO k=1,kSize
239 DO j=1,sNy
240 DO i=1,sNx+1
241 uFld(i,j,k,bi,bj)=uFld(i,j,k,bi,bj)
242 & -tmpFldU(i,j,k,bi,bj)*deltaTmom/Shap_uvtau
243 tmpFldU(i,j,k,bi,bj)= -tmpFldU(i,j,k,bi,bj)/Shap_uvtau
244 ENDDO
245 ENDDO
246 DO j=1,sNy+1
247 DO i=1,sNx
248 vFld(i,j,k,bi,bj)=vFld(i,j,k,bi,bj)
249 & -tmpFldV(i,j,k,bi,bj)*deltaTmom/Shap_uvtau
250 tmpFldV(i,j,k,bi,bj)= -tmpFldV(i,j,k,bi,bj)/Shap_uvtau
251 ENDDO
252 ENDDO
253 ENDDO
254 ENDDO
255 ENDDO
256
257 c IF (kSize.EQ.Nr) THEN
258 c CALL EXCH_UV_XYZ_RL(uFld,vFld,.TRUE.,myThid)
259 c ELSEIF (kSize.EQ.1) THEN
260 c CALL EXCH_UV_XY_RL(uFld,vFld,.TRUE.,myThid)
261 c ELSE
262 c STOP 'S/R SHAP_FILT_UV_S2: kSize is wrong'
263 c ENDIF
264
265 ENDIF
266 #endif /* ALLOW_SHAP_FILT */
267
268 RETURN
269 END

  ViewVC Help
Powered by ViewVC 1.1.22