/[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.2 - (show annotations) (download)
Thu Jun 18 22:37:58 2009 UTC (14 years, 11 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62, checkpoint62c, checkpoint62b, checkpoint62a, checkpoint62e, checkpoint62d, checkpoint61v, checkpoint61w, checkpoint61t, checkpoint61u, checkpoint61r, checkpoint61s, checkpoint61q, checkpoint61z, checkpoint61x, checkpoint61y
Changes since 1.1: +2 -2 lines
remove unused variables

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

  ViewVC Help
Powered by ViewVC 1.1.22