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

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

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


Revision 1.5 - (hide annotations) (download)
Sat Jul 9 21:53:35 2011 UTC (12 years, 10 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint63p, checkpoint63l, checkpoint63m, checkpoint63n, checkpoint63o, checkpoint63h, checkpoint63i, checkpoint63j, checkpoint63k, checkpoint63d, checkpoint63e, checkpoint63f, checkpoint63g, checkpoint63a, checkpoint63b, checkpoint63c, checkpoint63
Changes since 1.4: +3 -3 lines
rename + move: nTiles in W2_EXCH2_PARAMS.h --> exch2_nTiles in W2_EXCH2_TOPOLOGY.h

1 jmc 1.5 C $Header: /u/gcmpack/MITgcm/pkg/exch2/w2_set_map_tiles.F,v 1.4 2010/10/13 20:56:01 jahn Exp $
2 jmc 1.1 C $Name: $
3    
4     #include "CPP_EEOPTIONS.h"
5     #include "W2_OPTIONS.h"
6    
7 jmc 1.3 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 jmc 1.1 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 jmc 1.3 C Tile topology settings data structures
26 jmc 1.1 #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 jmc 1.3 C msgBuf :: Informational/error message buffer
44 jmc 1.1 CHARACTER*(MAX_LEN_MBUF) msgBuf
45 jahn 1.4 INTEGER tNx, tNy, fNx, fNy, nbPts, fBaseX, fBaseY
46 jmc 1.1 INTEGER nbTx, nbTy
47     INTEGER j, ii, k, tId, tx, ty
48 jmc 1.3 INTEGER divide, nnx(W2_maxNbFacets)
49 jmc 1.1 INTEGER errCnt, tCnt
50 jmc 1.2 LOGICAL tileIsActive, prtFlag
51 jmc 1.1 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 jmc 1.3 C-- Check that tile dims divide facet dims
63 jmc 1.1 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 jmc 1.5 IF ( tCnt.NE.exch2_nTiles ) THEN
96 jmc 1.1 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 jmc 1.5 & 'W2_SET_MAP_TILES: not match (SIZE.h+blankList)=',exch2_nTiles
101 jmc 1.1 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     DO j=1,nFacets
109     nnx(j) = facet_dims(2*j-1)/tNx
110     ENDDO
111 jmc 1.3 divide = FIND_GCD_N( nnx, nFacets)
112     W2_mapIO = divide*tNx
113 jmc 1.1 WRITE(msgBuf,'(A,2(I5,A))') ' W2_mapIO =', W2_mapIO,
114 jmc 1.3 & ' (=', divide, '*sNx)'
115 jmc 1.1 CALL PRINT_MESSAGE( msgBuf, W2_oUnit, SQUEEZE_RIGHT, myThid )
116     ENDIF
117    
118     C-- Global Map size:
119 jahn 1.4 C facets stacked in x direction
120     exch2_xStack_Nx = 0
121     exch2_xStack_Ny = 0
122     DO j=1,nFacets
123     exch2_xStack_Nx = exch2_xStack_Nx + facet_dims(2*j-1)
124     exch2_xStack_Ny = MAX( exch2_xStack_Ny, facet_dims(2*j) )
125     ENDDO
126     C facets stacked in y direction
127     exch2_yStack_Nx = 0
128     exch2_yStack_Ny = 0
129     DO j=1,nFacets
130     exch2_yStack_Nx = MAX( exch2_yStack_Nx, facet_dims(2*j-1) )
131     exch2_yStack_Ny = exch2_yStack_Ny + facet_dims(2*j)
132     ENDDO
133 jmc 1.1 IF ( W2_mapIO.EQ.-1 ) THEN
134 jahn 1.4 exch2_global_Nx = exch2_xStack_Nx
135     exch2_global_Ny = exch2_xStack_Ny
136 jmc 1.1 ELSEIF ( W2_mapIO.EQ.0 ) THEN
137     exch2_global_Nx = nbPts
138     exch2_global_Ny = 1
139     ELSE
140     exch2_global_Nx = W2_mapIO
141     exch2_global_Ny = nbPts/W2_mapIO
142     ENDIF
143     WRITE(msgBuf,'(A,2(A,I8))') ' Global Map (IO):',
144     & ' X-size=', exch2_global_Nx, ' , Y-size=', exch2_global_Ny
145     CALL PRINT_MESSAGE( msgBuf, W2_oUnit, SQUEEZE_RIGHT, myThid )
146    
147     C-- Set tiles mapping within facet (sub-domain) and within Global Map
148     WRITE(msgBuf,'(2A)') 'W2_SET_MAP_TILES:',
149     & ' tile offset within facet and global Map:'
150     CALL PRINT_MESSAGE( msgBuf, W2_oUnit, SQUEEZE_RIGHT, myThid )
151     tId = 0
152     nbPts = 0
153     fBaseX = 0
154 jahn 1.4 fBaseY = 0
155 jmc 1.1 DO j=1,nFacets
156     fNx = facet_dims(2*j-1)
157     fNy = facet_dims( 2*j )
158     nbTx = fNx/tNx
159     nbTy = fNy/tNy
160     WRITE(W2_oUnit,'(A,I3,2(A,I6),A,I5,2(A,I4),A)')
161     & '- facet', j, ' : X-size=', fNx, ' , Y-size=', fNy,
162     & ' ;', nbTx*nbTy, ' tiles (Tx,Ty=', nbTx,',',nbTy,')'
163     c CALL PRINT_MESSAGE( msgBuf, W2_oUnit, SQUEEZE_RIGHT, myThid )
164     DO ty=1,nbTy
165     DO tx=1,nbTx
166     tId = tId + 1
167     C-- Tags blank tile by removing facet # (exch2_myFace) but keeps its location
168     tileIsActive = .TRUE.
169     DO k=1,nBlankTiles
170     IF ( blankList(k).EQ.tId ) tileIsActive = .FALSE.
171     ENDDO
172     IF ( tileIsActive ) exch2_myFace(tId) = j
173     exch2_mydNx ( tId ) = fNx
174     exch2_mydNy ( tId ) = fNy
175     exch2_tNx ( tId ) = tNx
176     exch2_tNy ( tId ) = tNy
177     exch2_tBasex( tId ) = (tx-1)*tNx
178     exch2_tBasey( tId ) = (ty-1)*tNy
179 jahn 1.4 C-- Global IO Mappings
180     C these are for OBCS (vertical slices)
181     exch2_txXStackLo( tId ) = 1 + exch2_tBasex(tId) + fBaseX
182     exch2_tyXStackLo( tId ) = 1 + exch2_tBasey(tId)
183     exch2_txYStackLo( tId ) = 1 + exch2_tBasex(tId)
184     exch2_tyYStackLo( tId ) = 1 + exch2_tBasey(tId) + fBaseY
185     C and these for global files (3d files/horizontal 2d files)
186 jmc 1.1 IF ( W2_mapIO.EQ.-1 ) THEN
187     C- Old format
188     exch2_txGlobalo( tId ) = 1 + exch2_tBasex(tId) + fBaseX
189     exch2_tyGlobalo( tId ) = 1 + exch2_tBasey(tId)
190     ELSEIF ( W2_mapIO.EQ.0 ) THEN
191     C- Compact format = 1 long line
192     ii = nbPts + exch2_tBasex(tId) + exch2_tBasey(tId)*fNx
193     exch2_txGlobalo( tId ) = 1 + ii
194     exch2_tyGlobalo( tId ) = 1
195     ELSE
196     C Compact format: piled in the Y direction
197     ii = nbPts + exch2_tBasex(tId) + exch2_tBasey(tId)*fNx
198     exch2_txGlobalo( tId ) = 1 + MOD(ii,W2_mapIO)
199     exch2_tyGlobalo( tId ) = 1 + ii/W2_mapIO
200     ENDIF
201     IF ( prtFlag )
202     & WRITE(W2_oUnit,'(A,I5,3(A,I3),2A,2I5,2A,2I8)') ' tile',tId,
203     & ' on facet', exch2_myFace(tId),' (',tx,',',ty,'):',
204     & ' offset=', exch2_tBasex(tId), exch2_tBasey(tId),' ;',
205     & ' on Glob.Map=', exch2_txGlobalo(tId),exch2_tyGlobalo(tId)
206     ENDDO
207     ENDDO
208     fBaseX = fBaseX + fNx
209 jahn 1.4 fBaseY = fBaseY + fNy
210 jmc 1.1 nbPts = nbPts + fNx*fNy
211     ENDDO
212    
213     RETURN
214     END
215    
216     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
217     CBOP
218     C !ROUTINE: FIND_GCD_N
219    
220     C !INTERFACE:
221     INTEGER FUNCTION FIND_GCD_N( fldList, nFld )
222    
223     C !DESCRIPTION:
224     C *==========================================================*
225     C | FUNCTION FIND_GCD_N
226     C | o Find the Greatest Common Divisor of N integers
227     C *==========================================================*
228    
229     C !USES:
230     IMPLICIT NONE
231    
232     C !INPUT PARAMETERS:
233     C fldList :: list of integers to search for GCD
234     C nFLd :: length of the input integer list.
235     INTEGER nFLd
236     INTEGER fldList(nFld)
237    
238     C !LOCAL VARIABLES:
239 jmc 1.3 INTEGER mnFld, divide
240 jmc 1.1 INTEGER j, ii
241     LOGICAL flag
242     LOGICAL localDBg
243     CEOP
244     PARAMETER ( localDBg = .FALSE. )
245     c PARAMETER ( localDBg = .TRUE. )
246    
247     mnFld = fldList(1)
248     DO j=1,nFld
249     mnFld = MIN( mnFld, fldList(j) )
250     ENDDO
251     IF (localDBg) WRITE(0,'(A,I8)') 'FIND_GCD_N: mnFld=',mnFld
252    
253     IF (mnFld.GT.1 ) THEN
254 jmc 1.3 divide = 1
255 jmc 1.1 ii = 2
256     DO WHILE ( ii.LE.mnFld )
257     IF (localDBg) WRITE(0,'(A,I8)') ' GCD : try',ii
258     flag = .TRUE.
259     DO j=1,nFld
260     flag = flag.AND.(MOD(fldList(j),ii).EQ.0 )
261     ENDDO
262     IF ( flag ) THEN
263 jmc 1.3 divide = divide*ii
264 jmc 1.1 DO j=1,nFld
265     fldList(j) = fldList(j)/ii
266     ENDDO
267     IF (localDBg) WRITE(0,'(A,I8)')
268     & 'FIND_GCD_N: com.fact=',ii
269     mnFld = mnFld/ii
270     ELSE
271     ii = ii+2
272     IF (ii.EQ.4) ii=3
273     ENDIF
274     ENDDO
275 jmc 1.3 C- Put back the original Nb:
276 jmc 1.1 IF (localDBg) WRITE(0,'(10I8)') (fldList(j),j=1,nFld)
277     DO j=1,nFld
278 jmc 1.3 fldList(j) = fldList(j)*divide
279 jmc 1.1 ENDDO
280     ELSE
281 jmc 1.3 divide = MAX( 0, mnFld )
282 jmc 1.1 ENDIF
283    
284 jmc 1.3 FIND_GCD_N = divide
285 jmc 1.1
286     RETURN
287     END

  ViewVC Help
Powered by ViewVC 1.1.22