/[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.18 - (show annotations) (download)
Fri Apr 4 19:38:23 2014 UTC (10 years ago) by jmc
Branch: MAIN
CVS Tags: checkpoint65z, checkpoint65x, checkpoint65y, checkpoint65r, checkpoint65s, checkpoint65p, checkpoint65q, checkpoint65v, checkpoint65w, checkpoint65t, checkpoint65u, checkpoint65j, checkpoint65k, checkpoint65h, checkpoint65i, checkpoint65n, checkpoint65l, checkpoint65m, checkpoint65b, checkpoint65c, checkpoint65a, checkpoint65f, checkpoint65g, checkpoint65d, checkpoint65e, checkpoint65, checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, checkpoint65o, checkpoint64y, checkpoint64x, checkpoint64z, checkpoint64w, checkpoint64v, HEAD
Changes since 1.17: +25 -25 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_uv_s2.F,v 1.17 2009/06/28 01:08:26 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 c#ifdef ALLOW_EXCH2
32 c#include "W2_EXCH2_SIZE.h"
33 c#include "W2_EXCH2_TOPOLOGY.h"
34 c#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 IF (useCubedSphereExchange) THEN
77 C- need to initialise hDiv for MOM_VI_DEL2UV(call FILL_CS_CORNER_TR_RL)
78 DO j=1-OLy,sNy+OLy
79 DO i=1-OLx,sNx+OLx
80 hDiv(i,j) = 0. _d 0
81 ENDDO
82 ENDDO
83 ENDIF
84
85 DO bj=myByLo(myThid),myByHi(myThid)
86 DO bi=myBxLo(myThid),myBxHi(myThid)
87 DO k=1,kSize
88 DO j=1-OLy,sNy+OLy
89 DO i=1-OLx,sNx+OLx
90 tmpFldU(i,j,k,bi,bj)=uFld(i,j,k,bi,bj)
91 & *_maskW(i,j,k,bi,bj)
92 tmpFldV(i,j,k,bi,bj)=vFld(i,j,k,bi,bj)
93 & *_maskS(i,j,k,bi,bj)
94 ENDDO
95 ENDDO
96 ENDDO
97 ENDDO
98 ENDDO
99
100 c---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
101
102 C-- [d_xx+d_yy]^n tmpFld
103
104 DO n=1,nShapUV
105
106 IF ( MOD(n,2).EQ.1 .OR. Shap_alwaysExchUV ) THEN
107 CALL EXCH_UV_3D_RL( tmpFldU,tmpFldV, .TRUE., kSize, myThid )
108 ENDIF
109
110 DO bj=myByLo(myThid),myByHi(myThid)
111 DO bi=myBxLo(myThid),myBxHi(myThid)
112 DO k=1,kSize
113
114 IF ( n.LE.nShapUVPhys .OR.
115 & n.GT.nShapUV-nShapUVPhys )
116 & CALL MOM_CALC_HFACZ(bi,bj,k,hFacZ,r_hFacZ,myThid)
117
118 C- [d_xx+d_yy] tmpFld
119 IF (n.LE.nShapUVPhys) THEN
120 CALL MOM_CALC_HDIV(bi,bj,k,2,
121 I tmpFldU(1-OLx,1-OLy,k,bi,bj),
122 I tmpFldV(1-OLx,1-OLy,k,bi,bj),
123 & hDiv,myThid)
124 #ifdef USE_SHAP_CALC_VORTICITY
125 CALL SHAP_FILT_RELVORT3(bi,bj,k,
126 I tmpFldU(1-OLx,1-OLy,k,bi,bj),
127 I tmpFldV(1-OLx,1-OLy,k,bi,bj),
128 & hFacZ,vort3,myThid)
129 #else
130 CALL MOM_CALC_RELVORT3(bi,bj,k,
131 I tmpFldU(1-OLx,1-OLy,k,bi,bj),
132 I tmpFldV(1-OLx,1-OLy,k,bi,bj),
133 & hFacZ,vort3,myThid)
134 #endif
135 ELSE
136 C- replace Physical calc Div & Vort by computational one :
137 DO j=1-OLy,sNy+OLy-1
138 DO i=1-OLx,sNx+OLx-1
139 hDiv(i,j)=(tmpFldU(i+1,j,k,bi,bj)-tmpFldU(i,j,k,bi,bj))
140 & +(tmpFldV(i,j+1,k,bi,bj)-tmpFldV(i,j,k,bi,bj))
141 ENDDO
142 ENDDO
143 CALL SHAP_FILT_COMPUTVORT(
144 I tmpFldU(1-OLx,1-OLy,k,bi,bj),
145 I tmpFldV(1-OLx,1-OLy,k,bi,bj),
146 O vort3,
147 I k,bi,bj,myThid)
148 ENDIF
149
150 c---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
151
152 IF (n.GT.nShapUV-nShapUVPhys) THEN
153 IF (Shap_uvLength.LT.0.) THEN
154 DO j=1-OLy,sNy+OLy-1
155 DO i=1-OLx,sNx+OLx-1
156 hDiv(i,j) = hDiv(i,j) * rA(i,j,bi,bj)
157 ENDDO
158 ENDDO
159 DO j=2-OLy,sNy+OLy
160 DO i=2-OLx,sNx+OLx
161 vort3(i,j)= vort3(i,j)*rAz(i,j,bi,bj)
162 ENDDO
163 ENDDO
164 ENDIF
165 CALL MOM_VI_DEL2UV(
166 I bi,bj,k,hDiv,vort3,hFacZ,
167 O tmpFldU(1-OLx,1-OLy,k,bi,bj),
168 O tmpFldV(1-OLx,1-OLy,k,bi,bj),
169 I myThid)
170 IF (Shap_uvLength.LT.0.) THEN
171 DO j=2-OLy,sNy+OLy-1
172 DO i=2-OLx,sNx+OLx-1
173 tmpFldU(i,j,k,bi,bj) = -0.125 _d 0*tmpFldU(i,j,k,bi,bj)
174 & *_maskW(i,j,k,bi,bj)
175 tmpFldV(i,j,k,bi,bj) = -0.125 _d 0*tmpFldV(i,j,k,bi,bj)
176 & *_maskS(i,j,k,bi,bj)
177 ENDDO
178 ENDDO
179 ELSEIF (Shap_uvLength.EQ.0.) THEN
180 DO j=2-OLy,sNy+OLy-1
181 DO i=2-OLx,sNx+OLx-1
182 tmpFldU(i,j,k,bi,bj) = -0.125 _d 0*tmpFldU(i,j,k,bi,bj)
183 & *rAw(i,j,bi,bj)*_maskW(i,j,k,bi,bj)
184 tmpFldV(i,j,k,bi,bj) = -0.125 _d 0*tmpFldV(i,j,k,bi,bj)
185 & *rAs(i,j,bi,bj)*_maskS(i,j,k,bi,bj)
186 ENDDO
187 ENDDO
188 ELSE
189 DO j=2-OLy,sNy+OLy-1
190 DO i=2-OLx,sNx+OLx-1
191 tmpFldU(i,j,k,bi,bj) = -0.125 _d 0*tmpFldU(i,j,k,bi,bj)
192 & *Shap_uvLength*Shap_uvLength*_maskW(i,j,k,bi,bj)
193 tmpFldV(i,j,k,bi,bj) = -0.125 _d 0*tmpFldV(i,j,k,bi,bj)
194 & *Shap_uvLength*Shap_uvLength*_maskS(i,j,k,bi,bj)
195 ENDDO
196 ENDDO
197 ENDIF
198 ELSE
199 C- replace derivatives in physical space of Div & Vort by computational ones:
200 #ifndef ALLOW_AUTODIFF
201 IF ( .NOT.Shap_alwaysExchUV
202 & .AND. useCubedSphereExchange ) THEN
203 C to compute d/dx(hDiv), fill corners with appropriate values:
204 CALL FILL_CS_CORNER_TR_RL( 1, .FALSE.,
205 & hDiv, bi,bj, myThid )
206 ENDIF
207 #endif
208 DO j=2-OLy,sNy+OLy-1
209 DO i=2-OLx,sNx+OLx-1
210 tmpFldU(i,j,k,bi,bj) = -0.125 _d 0*
211 & ( (hDiv(i,j) - hDiv(i-1,j))
212 & -(vort3(i,j+1)-vort3(i,j))
213 & )*maskW(i,j,k,bi,bj)
214 ENDDO
215 ENDDO
216 #ifndef ALLOW_AUTODIFF
217 IF ( .NOT.Shap_alwaysExchUV
218 & .AND. useCubedSphereExchange ) THEN
219 C to compute d/dy(hDiv), fill corners with appropriate values:
220 CALL FILL_CS_CORNER_TR_RL( 2, .FALSE.,
221 & hDiv, bi,bj, myThid )
222 ENDIF
223 #endif
224 DO j=2-OLy,sNy+OLy-1
225 DO i=2-OLx,sNx+OLx-1
226 tmpFldV(i,j,k,bi,bj) = -0.125 _d 0*
227 & ( (hDiv(i,j) - hDiv(i,j-1))
228 & +(vort3(i+1,j)-vort3(i,j))
229 & )*maskS(i,j,k,bi,bj)
230 ENDDO
231 ENDDO
232
233 ENDIF
234
235 C end loops k / bi / bj
236 ENDDO
237 ENDDO
238 ENDDO
239 C end loop n=1,nShapUV
240 ENDDO
241
242 c---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
243
244 C F <- [1 - (d_xx+d_yy)^n *deltaT/tau].F
245 DO bj=myByLo(myThid),myByHi(myThid)
246 DO bi=myBxLo(myThid),myBxHi(myThid)
247 DO k=1,kSize
248 DO j=1,sNy
249 DO i=1,sNx+1
250 uFld(i,j,k,bi,bj)=uFld(i,j,k,bi,bj)
251 & -tmpFldU(i,j,k,bi,bj)*deltaTMom/Shap_uvtau
252 tmpFldU(i,j,k,bi,bj)= -tmpFldU(i,j,k,bi,bj)/Shap_uvtau
253 ENDDO
254 ENDDO
255 DO j=1,sNy+1
256 DO i=1,sNx
257 vFld(i,j,k,bi,bj)=vFld(i,j,k,bi,bj)
258 & -tmpFldV(i,j,k,bi,bj)*deltaTMom/Shap_uvtau
259 tmpFldV(i,j,k,bi,bj)= -tmpFldV(i,j,k,bi,bj)/Shap_uvtau
260 ENDDO
261 ENDDO
262 ENDDO
263 ENDDO
264 ENDDO
265
266 IF ( ( OLx.LE.2 .OR. OLy.LE.2 ) .AND.
267 & MOD(nShapUV,2).EQ.0 .AND. .NOT.Shap_alwaysExchUV )
268 & CALL EXCH_UV_3D_RL( uFld, vFld, .TRUE., kSize, myThid )
269
270 ENDIF
271 #endif /* ALLOW_SHAP_FILT */
272
273 RETURN
274 END

  ViewVC Help
Powered by ViewVC 1.1.22