/[MITgcm]/MITgcm/pkg/exch2/exch2_z_3d_rx.template
ViewVC logotype

Contents of /MITgcm/pkg/exch2/exch2_z_3d_rx.template

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


Revision 1.4 - (show annotations) (download)
Sun Jun 28 00:57:51 2009 UTC (14 years, 10 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62, checkpoint62c, checkpoint62b, checkpoint62a, checkpoint62e, checkpoint62d, checkpoint61v, checkpoint61w, checkpoint61t, checkpoint61u, checkpoint61s, checkpoint61z, checkpoint61x, checkpoint61y
Changes since 1.3: +6 -19 lines
-always call exch2_*_cube, not exch-1 anymore, if useCubedSphereExchange=F
-add bj in exch2 arrays and S/R.

1 C $Header: /u/gcmpack/MITgcm/pkg/exch2/exch2_z_3d_rx.template,v 1.3 2009/05/12 19:44:59 jmc Exp $
2 C $Name: $
3
4 #include "CPP_EEOPTIONS.h"
5 #include "W2_OPTIONS.h"
6
7 CBOP
8 C !ROUTINE: EXCH_Z_3D_RX
9
10 C !INTERFACE:
11 SUBROUTINE EXCH2_Z_3D_RX(
12 U phi,
13 I myNz, myThid )
14 IMPLICIT NONE
15 C !DESCRIPTION:
16 C *==========================================================*
17 C | SUBROUTINE EXCH_Z_3D_RX
18 C | o Handle exchanges for _RX three-dim zeta-point array.
19 C *==========================================================*
20
21 C !USES:
22 C === Global data ===
23 #include "SIZE.h"
24 #include "EEPARAMS.h"
25 #include "W2_EXCH2_SIZE.h"
26 #include "W2_EXCH2_TOPOLOGY.h"
27 #ifdef W2_FILL_NULL_REGIONS
28 #include "W2_EXCH2_PARAMS.h"
29 #endif
30
31 C !INPUT/OUTPUT PARAMETERS:
32 C === Routine arguments ===
33 C phi :: Array with overlap regions are to be exchanged
34 C myNz :: 3rd dimension of input array phi
35 C myThid :: My Thread Id. number
36 INTEGER myNz
37 _RX phi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,myNz,nSx,nSy)
38 INTEGER myThid
39
40 C !LOCAL VARIABLES:
41 C == Local variables ==
42 C OL[wens] :: Overlap extents in west, east, north, south.
43 C exchWidth[XY] :: Extent of regions that will be exchanged.
44 C mFace :: face number
45 C local_maxDim :: upper limit of 3rd dimension value
46 C phiNW,phiSE :: temporary array to hold corner value (CS grid)
47 C msgBuf :: Informational/error meesage buffer
48 INTEGER OLw, OLe, OLn, OLs, exchWidthX, exchWidthY
49 INTEGER bi, bj, myTile, i, j, k
50 INTEGER mFace
51 INTEGER local_maxDim
52 PARAMETER( local_maxDim = 8*Nr )
53 _RX phiNW(local_maxDim,nSx,nSy)
54 _RX phiSE(local_maxDim,nSx,nSy)
55 CHARACTER*(MAX_LEN_MBUF) msgBuf
56 CEOP
57
58
59 OLw = OLx
60 OLe = OLx
61 OLn = OLy
62 OLs = OLy
63 exchWidthX = OLx
64 exchWidthY = OLy
65
66 IF (useCubedSphereExchange) THEN
67 IF ( myNz.GT.local_maxDim ) THEN
68 WRITE(msgBuf,'(2A,2(I4,A))') 'EXCH_Z_3D_RX :',
69 & ' 3rd dimension=', myNz,
70 & ' exceeds local_maxDim (=', local_maxDim, ' )'
71 CALL PRINT_ERROR( msgBuf , myThid )
72 WRITE(msgBuf,'(2A)') 'EXCH_Z_3D_RX :',
73 & ' Increase "local_maxDim" and recompile'
74 CALL PRINT_ERROR( msgBuf , myThid )
75 STOP 'ABNORMAL END: S/R EXCH_Z_3D_RX'
76 ENDIF
77
78 C- save 2 corners value (in case we find 1 "missing corner")
79 DO bj=myByLo(myThid),myByHi(myThid)
80 DO bi=myBxLo(myThid),myBxHi(myThid)
81 DO k=1,myNz
82 phiNW(k,bi,bj) = phi(1,sNy+1,k,bi,bj)
83 phiSE(k,bi,bj) = phi(sNx+1,1,k,bi,bj)
84 ENDDO
85 ENDDO
86 ENDDO
87 ENDIF
88
89 CALL EXCH2_RX1_CUBE( phi, 'T ',
90 I OLw, OLe, OLs, OLn, myNz,
91 I exchWidthX, exchWidthY,
92 I FORWARD_SIMULATION, EXCH_UPDATE_CORNERS, myThid )
93 CALL EXCH2_RX1_CUBE( phi, 'T ',
94 I OLw, OLe, OLs, OLn, myNz,
95 I exchWidthX, exchWidthY,
96 I FORWARD_SIMULATION, EXCH_UPDATE_CORNERS, myThid )
97
98 IF (useCubedSphereExchange) THEN
99
100 DO bj=myByLo(myThid),myByHi(myThid)
101 DO bi=myBxLo(myThid),myBxHi(myThid)
102 myTile = W2_myTileList(bi,bj)
103 mFace = exch2_myFace(myTile)
104
105 C--- Face 2,4,6:
106 IF ( MOD(mFace,2).EQ.0 ) THEN
107
108 C-- East edge : shift j <- j-1
109 IF ( exch2_isEedge(myTile) .EQ. 1 ) THEN
110 DO k=1,myNz
111 DO j=sNy+OLy,2-Oly,-1
112 DO i=sNx+1,sNx+OLx
113 phi(i,j,k,bi,bj)=phi(i,j-1,k,bi,bj)
114 ENDDO
115 ENDDO
116 ENDDO
117 C- North-East corner
118 IF ( exch2_isNedge(myTile) .EQ. 1 ) THEN
119 DO k=1,myNz
120 DO j=sNy+2,sNy+OLy
121 i=sNx-sNy+j
122 phi(sNx+1,j,k,bi,bj)=phi(i,sNy+1,k,bi,bj)
123 ENDDO
124 #ifdef W2_FILL_NULL_REGIONS
125 DO j=sNy+2,sNy+OLy
126 DO i=sNx+2,sNx+OLx
127 phi(i,j,k,bi,bj)=e2FillValue_RX
128 ENDDO
129 ENDDO
130 #endif
131 ENDDO
132 ENDIF
133 ENDIF
134 C-- South edge : shift i <- i-1
135 IF ( exch2_isSedge(myTile) .EQ. 1 ) THEN
136 DO k=1,myNz
137 DO j=1-OLy,0
138 DO i=sNx+OLx,2-Olx,-1
139 phi(i,j,k,bi,bj)=phi(i-1,j,k,bi,bj)
140 ENDDO
141 ENDDO
142 ENDDO
143 C- South-East corner
144 IF ( exch2_isEedge(myTile) .EQ. 1 ) THEN
145 DO k=1,myNz
146 phi(sNx+1,1,k,bi,bj)=phiSE(k,bi,bj)
147 DO i=sNx+2,sNx+OLx
148 j=sNx+2-i
149 phi(i,1,k,bi,bj)=phi(sNx+1,j,k,bi,bj)
150 ENDDO
151 #ifdef W2_FILL_NULL_REGIONS
152 DO j=1-OLy,0
153 DO i=sNx+2,sNx+OLx
154 phi(i,j,k,bi,bj)=e2FillValue_RX
155 ENDDO
156 ENDDO
157 #endif
158 ENDDO
159 ENDIF
160 C- South-West corner
161 IF ( exch2_isWedge(myTile) .EQ. 1 ) THEN
162 DO k=1,myNz
163 DO j=1-OLy,0
164 phi(1,j,k,bi,bj)=phi(j,1,k,bi,bj)
165 #ifdef W2_FILL_NULL_REGIONS
166 DO i=1-OLx,0
167 phi(i,j,k,bi,bj)=e2FillValue_RX
168 ENDDO
169 #endif
170 ENDDO
171 ENDDO
172 ENDIF
173 ENDIF
174 C-- North-west corner
175 IF ( exch2_isWedge(myTile) .EQ. 1 .AND.
176 & exch2_isNedge(myTile) .EQ. 1 ) THEN
177 DO k=1,myNz
178 DO i=2-OLx,0
179 j=sNy+2-i
180 phi(i,sNy+1,k,bi,bj)=phi(1,j,k,bi,bj)
181 ENDDO
182 #ifdef W2_FILL_NULL_REGIONS
183 DO j=sNy+2,sNy+OLy
184 DO i=1-OLx,0
185 phi(i,j,k,bi,bj)=e2FillValue_RX
186 ENDDO
187 ENDDO
188 phi(1-Olx,sNy+1,k,bi,bj)=e2FillValue_RX
189 #endif
190 ENDDO
191 ENDIF
192
193 ELSE
194 C--- Face 1,3,5:
195
196 C-- North edge : shift i <- i-1
197 IF ( exch2_isNedge(myTile) .EQ. 1 ) THEN
198 DO k=1,myNz
199 DO j=sNy+1,sNy+Oly
200 DO i=sNx+OLx,2-Olx,-1
201 phi(i,j,k,bi,bj)=phi(i-1,j,k,bi,bj)
202 ENDDO
203 ENDDO
204 ENDDO
205 C- North-East corner
206 IF ( exch2_isEedge(myTile) .EQ. 1 ) THEN
207 DO k=1,myNz
208 DO i=sNx+2,sNx+OLx
209 j=sNy-sNx+i
210 phi(i,sNy+1,k,bi,bj)=phi(sNx+1,j,k,bi,bj)
211 ENDDO
212 #ifdef W2_FILL_NULL_REGIONS
213 DO j=sNy+2,sNy+OLy
214 DO i=sNx+2,sNx+OLx
215 phi(i,j,k,bi,bj)=e2FillValue_RX
216 ENDDO
217 ENDDO
218 #endif
219 ENDDO
220 ENDIF
221 ENDIF
222 C-- West edge : shift j <- j-1
223 IF ( exch2_isWedge(myTile) .EQ. 1 ) THEN
224 DO k=1,myNz
225 DO j=sNy+OLy,2-Oly,-1
226 DO i=1-Olx,0
227 phi(i,j,k,bi,bj)=phi(i,j-1,k,bi,bj)
228 ENDDO
229 ENDDO
230 ENDDO
231 C- North-west corner
232 IF ( exch2_isNedge(myTile) .EQ. 1 ) THEN
233 DO k=1,myNz
234 phi(1,sNy+1,k,bi,bj)=phiNW(k,bi,bj)
235 DO j=sNy+2,sNy+OLy
236 i=sNy+2-j
237 phi(1,j,k,bi,bj)=phi(i,sNy+1,k,bi,bj)
238 ENDDO
239 #ifdef W2_FILL_NULL_REGIONS
240 DO j=sNy+2,sNy+OLy
241 DO i=1-OLx,0
242 phi(i,j,k,bi,bj)=e2FillValue_RX
243 ENDDO
244 ENDDO
245 #endif
246 ENDDO
247 ENDIF
248 C- South-West corner
249 IF ( exch2_isSedge(myTile) .EQ. 1 ) THEN
250 DO k=1,myNz
251 DO i=1-OLx,0
252 phi(i,1,k,bi,bj)=phi(1,i,k,bi,bj)
253 ENDDO
254 #ifdef W2_FILL_NULL_REGIONS
255 DO j=1-OLy,0
256 DO i=1-OLx,0
257 phi(i,j,k,bi,bj)=e2FillValue_RX
258 ENDDO
259 ENDDO
260 #endif
261 ENDDO
262 ENDIF
263 ENDIF
264 C- South-East corner
265 IF ( exch2_isEedge(myTile) .EQ. 1 .AND.
266 & exch2_isSedge(myTile) .EQ. 1 ) THEN
267 DO k=1,myNz
268 DO j=2-OLy,0
269 i=sNx+2-j
270 phi(sNx+1,j,k,bi,bj)=phi(i,1,k,bi,bj)
271 ENDDO
272 #ifdef W2_FILL_NULL_REGIONS
273 DO j=1-OLy,0
274 DO i=sNx+2,sNx+OLx
275 phi(i,j,k,bi,bj)=e2FillValue_RX
276 ENDDO
277 ENDDO
278 phi(sNx+1,1-Oly,k,bi,bj)=e2FillValue_RX
279 #endif
280 ENDDO
281 ENDIF
282
283 C--- end odd / even face number
284 ENDIF
285
286 ENDDO
287 ENDDO
288
289 C--- using or not using CubedSphereExchange: end
290 ENDIF
291
292 RETURN
293 END
294
295 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
296
297 CEH3 ;;; Local Variables: ***
298 CEH3 ;;; mode:fortran ***
299 CEH3 ;;; End: ***

  ViewVC Help
Powered by ViewVC 1.1.22