/[MITgcm]/MITgcm/pkg/exch2/w2_set_map_tiles.F
ViewVC logotype

Contents of /MITgcm/pkg/exch2/w2_set_map_tiles.F

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


Revision 1.6 - (show annotations) (download)
Mon Jul 16 20:25:10 2012 UTC (11 years, 9 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64y, checkpoint64x, checkpoint64z, checkpoint64q, checkpoint64p, checkpoint64s, checkpoint64r, checkpoint64u, checkpoint64t, checkpoint64w, checkpoint64v, checkpoint64i, checkpoint64h, checkpoint64k, checkpoint64j, checkpoint64m, checkpoint64l, checkpoint64o, checkpoint64n, checkpoint64a, checkpoint64c, checkpoint64b, checkpoint64e, checkpoint64d, checkpoint64g, checkpoint64f, checkpoint63q, checkpoint63r, checkpoint63s, checkpoint64, 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.5: +9 -3 lines
with empty facet: fix compact-format (W2_mapIO=1) definition (was previously
  reset to 0 = 1 long line in X)

1 C $Header: /u/gcmpack/MITgcm/pkg/exch2/w2_set_map_tiles.F,v 1.5 2011/07/09 21:53:35 jmc Exp $
2 C $Name: $
3
4 #include "CPP_EEOPTIONS.h"
5 #include "W2_OPTIONS.h"
6
7 C-- File w2_set_map_tiles.F:
8 C-- Contents
9 C-- o W2_SET_MAP_TILES :: Set tiles and IO mapping
10 C-- o FIND_GCD_N :: Returns the Greatest Common Divisor
11
12 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
13 CBOP 0
14 C !ROUTINE: W2_SET_MAP_TILES
15
16 C !INTERFACE:
17 SUBROUTINE W2_SET_MAP_TILES( myThid )
18
19 C !DESCRIPTION:
20 C Set-up tiles mapping and IO global mapping
21
22 C !USES:
23 IMPLICIT NONE
24
25 C Tile topology settings data structures
26 #include "SIZE.h"
27 #include "EEPARAMS.h"
28 #include "W2_EXCH2_SIZE.h"
29 #include "W2_EXCH2_PARAMS.h"
30 #include "W2_EXCH2_TOPOLOGY.h"
31
32 C !INPUT PARAMETERS:
33 C myThid :: my Thread Id number
34 C (Note: not relevant since threading has not yet started)
35 INTEGER myThid
36
37 C !FUNCTIONS:
38 INTEGER FIND_GCD_N
39 EXTERNAL FIND_GCD_N
40
41 C !LOCAL VARIABLES:
42 C === Local variables ===
43 C msgBuf :: Informational/error message buffer
44 CHARACTER*(MAX_LEN_MBUF) msgBuf
45 INTEGER tNx, tNy, fNx, fNy, nbPts, fBaseX, fBaseY
46 INTEGER nbTx, nbTy
47 INTEGER j, ii, k, tId, tx, ty
48 INTEGER divide, nnx(W2_maxNbFacets)
49 INTEGER errCnt, tCnt
50 LOGICAL tileIsActive, prtFlag
51 CEOP
52
53 C Set-up tiles mapping and IO global mapping
54 WRITE(msgBuf,'(2A)') 'W2_SET_MAP_TILES:',
55 & ' tile mapping within facet and global Map:'
56 CALL PRINT_MESSAGE( msgBuf, W2_oUnit, SQUEEZE_RIGHT, myThid )
57 prtFlag = ABS(W2_printMsg).GE.2
58 & .OR. ( W2_printMsg .NE.0 .AND. myProcId.EQ.0 )
59
60 tNx = sNx
61 tNy = sNy
62 C-- Check that tile dims divide facet dims
63 errCnt = 0
64 tCnt = 0
65 nbPts = 0
66 DO j=1,nFacets
67 fNx = facet_dims(2*j-1)
68 fNy = facet_dims( 2*j )
69 nbTx = fNx/tNx
70 nbTy = fNy/tNy
71 IF ( nbTx*tNx .NE. fNx ) THEN
72 WRITE(msgBuf,'(A,I3,2(A,I7))') 'Facet',j,
73 & ' : X-size=', fNx, ' not multiple of sNx=', tNx
74 CALL PRINT_ERROR( msgBuf, myThid )
75 errCnt = errCnt + 1
76 ENDIF
77 IF ( nbTy*tNy .NE. fNy ) THEN
78 WRITE(msgBuf,'(A,I3,2(A,I7))') 'Facet',j,
79 & ' : Y-size=', fNy, ' not multiple of sNy=', tNy
80 CALL PRINT_ERROR( msgBuf, myThid )
81 errCnt = errCnt + 1
82 ENDIF
83 facet_owns(1,j) = tCnt+1
84 tCnt = tCnt + nbTx*nbTy
85 facet_owns(2,j) = tCnt
86 nbPts = nbPts + fNx*fNy
87 ENDDO
88 IF ( errCnt.GT.0 ) THEN
89 WRITE(msgBuf,'(A,I3,A)')
90 & ' W2_SET_MAP_TILES: found', errCnt, ' Fatal errors'
91 CALL PRINT_ERROR( msgBuf, myThid )
92 STOP 'ABNORMAL END: S/R W2_SET_MAP_TILES'
93 ENDIF
94 C-- Check that domain size and (SIZE.h + blankList) match:
95 IF ( tCnt.NE.exch2_nTiles ) THEN
96 WRITE(msgBuf,'(A,I6,A)')
97 & 'W2_SET_MAP_TILES: Domain Total # of tiles =', tCnt, ' does'
98 CALL PRINT_ERROR( msgBuf, myThid )
99 WRITE(msgBuf,'(A,I6)')
100 & 'W2_SET_MAP_TILES: not match (SIZE.h+blankList)=',exch2_nTiles
101 CALL PRINT_ERROR( msgBuf, myThid )
102 STOP 'ABNORMAL END: S/R W2_SET_MAP_TILES'
103 ENDIF
104
105 IF ( W2_mapIO.EQ.1 ) THEN
106 C-- Compact IO map (mostly in Y dir): search for Greatest Common Divisor
107 C of all x-size (faster to apply GCD to Nb of Tiles in X):
108 k = 0
109 nnx(1) = 0
110 DO j=1,nFacets
111 C skip empty facet
112 IF ( facet_dims(2*j-1).GT.0 ) THEN
113 k = k + 1
114 nnx(k) = facet_dims(2*j-1)/tNx
115 ENDIF
116 ENDDO
117 divide = FIND_GCD_N( nnx, k )
118 W2_mapIO = divide*tNx
119 WRITE(msgBuf,'(A,2(I5,A))') ' W2_mapIO =', W2_mapIO,
120 & ' (=', divide, '*sNx)'
121 CALL PRINT_MESSAGE( msgBuf, W2_oUnit, SQUEEZE_RIGHT, myThid )
122 ENDIF
123
124 C-- Global Map size:
125 C facets stacked in x direction
126 exch2_xStack_Nx = 0
127 exch2_xStack_Ny = 0
128 DO j=1,nFacets
129 exch2_xStack_Nx = exch2_xStack_Nx + facet_dims(2*j-1)
130 exch2_xStack_Ny = MAX( exch2_xStack_Ny, facet_dims(2*j) )
131 ENDDO
132 C facets stacked in y direction
133 exch2_yStack_Nx = 0
134 exch2_yStack_Ny = 0
135 DO j=1,nFacets
136 exch2_yStack_Nx = MAX( exch2_yStack_Nx, facet_dims(2*j-1) )
137 exch2_yStack_Ny = exch2_yStack_Ny + facet_dims(2*j)
138 ENDDO
139 IF ( W2_mapIO.EQ.-1 ) THEN
140 exch2_global_Nx = exch2_xStack_Nx
141 exch2_global_Ny = exch2_xStack_Ny
142 ELSEIF ( W2_mapIO.EQ.0 ) THEN
143 exch2_global_Nx = nbPts
144 exch2_global_Ny = 1
145 ELSE
146 exch2_global_Nx = W2_mapIO
147 exch2_global_Ny = nbPts/W2_mapIO
148 ENDIF
149 WRITE(msgBuf,'(A,2(A,I8))') ' Global Map (IO):',
150 & ' X-size=', exch2_global_Nx, ' , Y-size=', exch2_global_Ny
151 CALL PRINT_MESSAGE( msgBuf, W2_oUnit, SQUEEZE_RIGHT, myThid )
152
153 C-- Set tiles mapping within facet (sub-domain) and within Global Map
154 WRITE(msgBuf,'(2A)') 'W2_SET_MAP_TILES:',
155 & ' tile offset within facet and global Map:'
156 CALL PRINT_MESSAGE( msgBuf, W2_oUnit, SQUEEZE_RIGHT, myThid )
157 tId = 0
158 nbPts = 0
159 fBaseX = 0
160 fBaseY = 0
161 DO j=1,nFacets
162 fNx = facet_dims(2*j-1)
163 fNy = facet_dims( 2*j )
164 nbTx = fNx/tNx
165 nbTy = fNy/tNy
166 WRITE(W2_oUnit,'(A,I3,2(A,I6),A,I5,2(A,I4),A)')
167 & '- facet', j, ' : X-size=', fNx, ' , Y-size=', fNy,
168 & ' ;', nbTx*nbTy, ' tiles (Tx,Ty=', nbTx,',',nbTy,')'
169 c CALL PRINT_MESSAGE( msgBuf, W2_oUnit, SQUEEZE_RIGHT, myThid )
170 DO ty=1,nbTy
171 DO tx=1,nbTx
172 tId = tId + 1
173 C-- Tags blank tile by removing facet # (exch2_myFace) but keeps its location
174 tileIsActive = .TRUE.
175 DO k=1,nBlankTiles
176 IF ( blankList(k).EQ.tId ) tileIsActive = .FALSE.
177 ENDDO
178 IF ( tileIsActive ) exch2_myFace(tId) = j
179 exch2_mydNx ( tId ) = fNx
180 exch2_mydNy ( tId ) = fNy
181 exch2_tNx ( tId ) = tNx
182 exch2_tNy ( tId ) = tNy
183 exch2_tBasex( tId ) = (tx-1)*tNx
184 exch2_tBasey( tId ) = (ty-1)*tNy
185 C-- Global IO Mappings
186 C these are for OBCS (vertical slices)
187 exch2_txXStackLo( tId ) = 1 + exch2_tBasex(tId) + fBaseX
188 exch2_tyXStackLo( tId ) = 1 + exch2_tBasey(tId)
189 exch2_txYStackLo( tId ) = 1 + exch2_tBasex(tId)
190 exch2_tyYStackLo( tId ) = 1 + exch2_tBasey(tId) + fBaseY
191 C and these for global files (3d files/horizontal 2d files)
192 IF ( W2_mapIO.EQ.-1 ) THEN
193 C- Old format
194 exch2_txGlobalo( tId ) = 1 + exch2_tBasex(tId) + fBaseX
195 exch2_tyGlobalo( tId ) = 1 + exch2_tBasey(tId)
196 ELSEIF ( W2_mapIO.EQ.0 ) THEN
197 C- Compact format = 1 long line
198 ii = nbPts + exch2_tBasex(tId) + exch2_tBasey(tId)*fNx
199 exch2_txGlobalo( tId ) = 1 + ii
200 exch2_tyGlobalo( tId ) = 1
201 ELSE
202 C Compact format: piled in the Y direction
203 ii = nbPts + exch2_tBasex(tId) + exch2_tBasey(tId)*fNx
204 exch2_txGlobalo( tId ) = 1 + MOD(ii,W2_mapIO)
205 exch2_tyGlobalo( tId ) = 1 + ii/W2_mapIO
206 ENDIF
207 IF ( prtFlag )
208 & WRITE(W2_oUnit,'(A,I5,3(A,I3),2A,2I5,2A,2I8)') ' tile',tId,
209 & ' on facet', exch2_myFace(tId),' (',tx,',',ty,'):',
210 & ' offset=', exch2_tBasex(tId), exch2_tBasey(tId),' ;',
211 & ' on Glob.Map=', exch2_txGlobalo(tId),exch2_tyGlobalo(tId)
212 ENDDO
213 ENDDO
214 fBaseX = fBaseX + fNx
215 fBaseY = fBaseY + fNy
216 nbPts = nbPts + fNx*fNy
217 ENDDO
218
219 RETURN
220 END
221
222 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
223 CBOP
224 C !ROUTINE: FIND_GCD_N
225
226 C !INTERFACE:
227 INTEGER FUNCTION FIND_GCD_N( fldList, nFld )
228
229 C !DESCRIPTION:
230 C *==========================================================*
231 C | FUNCTION FIND_GCD_N
232 C | o Find the Greatest Common Divisor of N integers
233 C *==========================================================*
234
235 C !USES:
236 IMPLICIT NONE
237
238 C !INPUT PARAMETERS:
239 C fldList :: list of integers to search for GCD
240 C nFLd :: length of the input integer list.
241 INTEGER nFLd
242 INTEGER fldList(nFld)
243
244 C !LOCAL VARIABLES:
245 INTEGER mnFld, divide
246 INTEGER j, ii
247 LOGICAL flag
248 LOGICAL localDBg
249 CEOP
250 PARAMETER ( localDBg = .FALSE. )
251 c PARAMETER ( localDBg = .TRUE. )
252
253 mnFld = fldList(1)
254 DO j=1,nFld
255 mnFld = MIN( mnFld, fldList(j) )
256 ENDDO
257 IF (localDBg) WRITE(0,'(A,I8)') 'FIND_GCD_N: mnFld=',mnFld
258
259 IF (mnFld.GT.1 ) THEN
260 divide = 1
261 ii = 2
262 DO WHILE ( ii.LE.mnFld )
263 IF (localDBg) WRITE(0,'(A,I8)') ' GCD : try',ii
264 flag = .TRUE.
265 DO j=1,nFld
266 flag = flag.AND.(MOD(fldList(j),ii).EQ.0 )
267 ENDDO
268 IF ( flag ) THEN
269 divide = divide*ii
270 DO j=1,nFld
271 fldList(j) = fldList(j)/ii
272 ENDDO
273 IF (localDBg) WRITE(0,'(A,I8)')
274 & 'FIND_GCD_N: com.fact=',ii
275 mnFld = mnFld/ii
276 ELSE
277 ii = ii+2
278 IF (ii.EQ.4) ii=3
279 ENDIF
280 ENDDO
281 C- Put back the original Nb:
282 IF (localDBg) WRITE(0,'(10I8)') (fldList(j),j=1,nFld)
283 DO j=1,nFld
284 fldList(j) = fldList(j)*divide
285 ENDDO
286 ELSE
287 divide = MAX( 0, mnFld )
288 ENDIF
289
290 FIND_GCD_N = divide
291
292 RETURN
293 END

  ViewVC Help
Powered by ViewVC 1.1.22