/[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.3 - (hide annotations) (download)
Fri Apr 23 20:21:06 2010 UTC (14 years, 1 month ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62g, checkpoint62f, checkpoint62k, checkpoint62j, checkpoint62i, checkpoint62h, checkpoint62l
Changes since 1.2: +20 -16 lines
fix propagating typo (& others) in variable description

1 jmc 1.3 C $Header: /u/gcmpack/MITgcm/pkg/exch2/w2_set_map_tiles.F,v 1.2 2009/06/18 22:37:58 jmc 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     INTEGER tNx, tNy, fNx, fNy, nbPts, fBaseX
46     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     IF ( tCnt.NE.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)=', 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     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     IF ( W2_mapIO.EQ.-1 ) THEN
120     exch2_global_Nx = 0
121     exch2_global_Ny = 0
122     DO j=1,nFacets
123     exch2_global_Nx = exch2_global_Nx + facet_dims(2*j-1)
124     exch2_global_Ny = MAX( exch2_global_Ny, facet_dims(2*j) )
125     ENDDO
126     ELSEIF ( W2_mapIO.EQ.0 ) THEN
127     exch2_global_Nx = nbPts
128     exch2_global_Ny = 1
129     ELSE
130     exch2_global_Nx = W2_mapIO
131     exch2_global_Ny = nbPts/W2_mapIO
132     ENDIF
133     WRITE(msgBuf,'(A,2(A,I8))') ' Global Map (IO):',
134     & ' X-size=', exch2_global_Nx, ' , Y-size=', exch2_global_Ny
135     CALL PRINT_MESSAGE( msgBuf, W2_oUnit, SQUEEZE_RIGHT, myThid )
136    
137     C-- Set tiles mapping within facet (sub-domain) and within Global Map
138     WRITE(msgBuf,'(2A)') 'W2_SET_MAP_TILES:',
139     & ' tile offset within facet and global Map:'
140     CALL PRINT_MESSAGE( msgBuf, W2_oUnit, SQUEEZE_RIGHT, myThid )
141     tId = 0
142     nbPts = 0
143     fBaseX = 0
144     DO j=1,nFacets
145     fNx = facet_dims(2*j-1)
146     fNy = facet_dims( 2*j )
147     nbTx = fNx/tNx
148     nbTy = fNy/tNy
149     WRITE(W2_oUnit,'(A,I3,2(A,I6),A,I5,2(A,I4),A)')
150     & '- facet', j, ' : X-size=', fNx, ' , Y-size=', fNy,
151     & ' ;', nbTx*nbTy, ' tiles (Tx,Ty=', nbTx,',',nbTy,')'
152     c CALL PRINT_MESSAGE( msgBuf, W2_oUnit, SQUEEZE_RIGHT, myThid )
153     DO ty=1,nbTy
154     DO tx=1,nbTx
155     tId = tId + 1
156     C-- Tags blank tile by removing facet # (exch2_myFace) but keeps its location
157     tileIsActive = .TRUE.
158     DO k=1,nBlankTiles
159     IF ( blankList(k).EQ.tId ) tileIsActive = .FALSE.
160     ENDDO
161     IF ( tileIsActive ) exch2_myFace(tId) = j
162     exch2_mydNx ( tId ) = fNx
163     exch2_mydNy ( tId ) = fNy
164     exch2_tNx ( tId ) = tNx
165     exch2_tNy ( tId ) = tNy
166     exch2_tBasex( tId ) = (tx-1)*tNx
167     exch2_tBasey( tId ) = (ty-1)*tNy
168     C-- Global IO Mapping
169     IF ( W2_mapIO.EQ.-1 ) THEN
170     C- Old format
171     exch2_txGlobalo( tId ) = 1 + exch2_tBasex(tId) + fBaseX
172     exch2_tyGlobalo( tId ) = 1 + exch2_tBasey(tId)
173     ELSEIF ( W2_mapIO.EQ.0 ) THEN
174     C- Compact format = 1 long line
175     ii = nbPts + exch2_tBasex(tId) + exch2_tBasey(tId)*fNx
176     exch2_txGlobalo( tId ) = 1 + ii
177     exch2_tyGlobalo( tId ) = 1
178     ELSE
179     C Compact format: piled in the Y direction
180     ii = nbPts + exch2_tBasex(tId) + exch2_tBasey(tId)*fNx
181     exch2_txGlobalo( tId ) = 1 + MOD(ii,W2_mapIO)
182     exch2_tyGlobalo( tId ) = 1 + ii/W2_mapIO
183     ENDIF
184     IF ( prtFlag )
185     & WRITE(W2_oUnit,'(A,I5,3(A,I3),2A,2I5,2A,2I8)') ' tile',tId,
186     & ' on facet', exch2_myFace(tId),' (',tx,',',ty,'):',
187     & ' offset=', exch2_tBasex(tId), exch2_tBasey(tId),' ;',
188     & ' on Glob.Map=', exch2_txGlobalo(tId),exch2_tyGlobalo(tId)
189     ENDDO
190     ENDDO
191     fBaseX = fBaseX + fNx
192     nbPts = nbPts + fNx*fNy
193     ENDDO
194    
195     RETURN
196     END
197    
198     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
199     CBOP
200     C !ROUTINE: FIND_GCD_N
201    
202     C !INTERFACE:
203     INTEGER FUNCTION FIND_GCD_N( fldList, nFld )
204    
205     C !DESCRIPTION:
206     C *==========================================================*
207     C | FUNCTION FIND_GCD_N
208     C | o Find the Greatest Common Divisor of N integers
209     C *==========================================================*
210    
211     C !USES:
212     IMPLICIT NONE
213    
214     C !INPUT PARAMETERS:
215     C fldList :: list of integers to search for GCD
216     C nFLd :: length of the input integer list.
217     INTEGER nFLd
218     INTEGER fldList(nFld)
219    
220     C !LOCAL VARIABLES:
221 jmc 1.3 INTEGER mnFld, divide
222 jmc 1.1 INTEGER j, ii
223     LOGICAL flag
224     LOGICAL localDBg
225     CEOP
226     PARAMETER ( localDBg = .FALSE. )
227     c PARAMETER ( localDBg = .TRUE. )
228    
229     mnFld = fldList(1)
230     DO j=1,nFld
231     mnFld = MIN( mnFld, fldList(j) )
232     ENDDO
233     IF (localDBg) WRITE(0,'(A,I8)') 'FIND_GCD_N: mnFld=',mnFld
234    
235     IF (mnFld.GT.1 ) THEN
236 jmc 1.3 divide = 1
237 jmc 1.1 ii = 2
238     DO WHILE ( ii.LE.mnFld )
239     IF (localDBg) WRITE(0,'(A,I8)') ' GCD : try',ii
240     flag = .TRUE.
241     DO j=1,nFld
242     flag = flag.AND.(MOD(fldList(j),ii).EQ.0 )
243     ENDDO
244     IF ( flag ) THEN
245 jmc 1.3 divide = divide*ii
246 jmc 1.1 DO j=1,nFld
247     fldList(j) = fldList(j)/ii
248     ENDDO
249     IF (localDBg) WRITE(0,'(A,I8)')
250     & 'FIND_GCD_N: com.fact=',ii
251     mnFld = mnFld/ii
252     ELSE
253     ii = ii+2
254     IF (ii.EQ.4) ii=3
255     ENDIF
256     ENDDO
257 jmc 1.3 C- Put back the original Nb:
258 jmc 1.1 IF (localDBg) WRITE(0,'(10I8)') (fldList(j),j=1,nFld)
259     DO j=1,nFld
260 jmc 1.3 fldList(j) = fldList(j)*divide
261 jmc 1.1 ENDDO
262     ELSE
263 jmc 1.3 divide = MAX( 0, mnFld )
264 jmc 1.1 ENDIF
265    
266 jmc 1.3 FIND_GCD_N = divide
267 jmc 1.1
268     RETURN
269     END

  ViewVC Help
Powered by ViewVC 1.1.22