/[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.1 - (hide annotations) (download)
Tue May 12 19:40:32 2009 UTC (15 years ago) by jmc
Branch: MAIN
CVS Tags: checkpoint61o, checkpoint61p
new code to set-up W2-Exch2 topology (replace matlab-topology-generator)
 read parameter file "data.exch2" if it exist ; otherwise try default
 regular cube without blank-tile.

1 jmc 1.1 C $Header: /u/gcmpack/MITgcm/pkg/exch2/w2_e2setup.F,v 1.3 2008/07/29 20:25:23 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, flag, 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