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

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

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


Revision 1.2 - (hide annotations) (download)
Wed Nov 27 00:34:05 2013 UTC (10 years, 5 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64y, checkpoint64x, checkpoint64z, checkpoint64s, checkpoint64r, checkpoint64u, checkpoint64t, checkpoint64w, checkpoint64v, 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, checkpoint65, HEAD
Changes since 1.1: +8 -11 lines
- activate (uncomment) definition and setting of "W2_tileIndex" list:
  (to store the local bi,bj indices of each tile)
- print also bi,bj in local report to log file

1 jmc 1.2 C $Header: /u/gcmpack/MITgcm/pkg/exch2/w2_map_procs.F,v 1.1 2012/09/04 00:44:30 jmc Exp $
2 jmc 1.1 C $Name: $
3    
4     #include "CPP_EEOPTIONS.h"
5    
6     CBOP
7     C !ROUTINE: W2_MAP_PROCS
8    
9     C !INTERFACE:
10     SUBROUTINE W2_MAP_PROCS( myThid )
11    
12     C !DESCRIPTION:
13     C *==========================================================*
14     C | SUBROUTINE W2_MAP_PROCS
15     C | o Setup Mapping of W2-topology tiles to processes
16     C *==========================================================*
17     C | Set which process "own" which tiles
18     C | and store the 2-way relation between, on one side,
19     C | tile Id from W2-topology and, on the other side,
20     C | process Id with local tile indices bi,bj.
21     C *==========================================================*
22    
23     C !USES:
24     IMPLICIT NONE
25    
26     #include "SIZE.h"
27     #include "EEPARAMS.h"
28     #include "W2_EXCH2_SIZE.h"
29     #include "W2_EXCH2_TOPOLOGY.h"
30     #include "W2_EXCH2_PARAMS.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     CEOP
37    
38     C !FUNCTIONS:
39    
40     C !LOCAL VARIABLES:
41     INTEGER thisProc
42     CHARACTER*(MAX_LEN_MBUF) msgBuf
43     CHARACTER commFlag
44     INTEGER myTileId
45     INTEGER I, J
46     INTEGER np, ii, jj, bi, bj
47     INTEGER iErr, tNx, tNy
48    
49     C-- Initialise common blocs W2_MAP_TILE2PROC & W2_EXCH2_COMMFLAG:
50     DO I = 1,W2_maxNbTiles
51     W2_tileProc(I) = 0
52 jmc 1.2 W2_tileIndex(I) = 0
53 jmc 1.1 c W2_tileRank(I) = 0
54     ENDDO
55     DO bj=1,nSy
56     DO bi=1,nSx
57     W2_myTileList(bi,bj) = 0
58     DO np=1,nPx*nPy
59     W2_procTileList(bi,bj,np) = 0
60     ENDDO
61     DO J=1,W2_maxNeighbours
62     W2_myCommFlag(J,bi,bj) = ' '
63     ENDDO
64     ENDDO
65     ENDDO
66    
67     C-- Decide which tiles this process handles - do this inline for now, but
68     C should go in subroutine.
69     C Set which rank processes "own" which tiles. This should probably
70     C be queried as part of some hand-shaking but for now we use the
71     C functional relationship that was used above.
72     C Fill also W2_procTileList for Single-CPU-IO.
73    
74     C Number of tiles I handle is nSx*nSy
75     thisProc = 1 + myProcId
76     J = 0
77     DO I=1,exch2_nTiles
78     IF ( exch2_myFace(I) .NE. 0 ) THEN
79     C-- old ordering (makes no difference if nSy*nPy=1 )
80     c np = 1 + J/(nSx*nSy)
81     c jj = MOD(J,nSx*nSy)
82     c bj = 1 + jj/nSx
83     c bi = 1 + MOD(jj,nSx)
84     C-- new ordering: for single sub-domain (nFacets=1) case, match default setting
85     jj = J/(nSx*nPx)
86     ii = MOD(J,nSx*nPx)
87     C-- natural way to order processors:
88     c np = 1 + ii/nSx + (jj/nSy)*nPx
89     C-- switch processor order to match MPI_CART set-up
90     np = 1 + jj/nSy + (ii/nSx)*nPy
91     bj = 1 + MOD(jj,nSy)
92     bi = 1 + MOD(ii,nSx)
93     C--
94     W2_tileProc(I) = np
95 jmc 1.2 W2_tileIndex(I)= bi + (bj-1)*nSx
96 jmc 1.1 W2_procTileList(bi,bj,np) = I
97     IF ( np.EQ.thisProc ) W2_myTileList(bi,bj) = I
98     J = J + 1
99     c W2_tileRank(I) = J
100     ENDIF
101     ENDDO
102     IF ( J .NE. nSx*nSy*nPx*nPy ) THEN
103     STOP
104     & 'ERROR W2_MAP_PROCS: number of active tiles not =nPx*nSx*nPy*nSy'
105     ENDIF
106    
107     C-- Check tile sizes
108     iErr = 0
109     DO bj=1,nSy
110     DO bi=1,nSx
111     myTileId = W2_myTileList(bi,bj)
112     tNx = exch2_tNx(myTileId)
113     tNy = exch2_tNy(myTileId)
114     IF ( tNx .NE. sNx ) THEN
115     WRITE(msgBuf,'(3(A,I5))')
116     & 'ERROR: S/R W2_MAP_PROCS Topology for tile', myTileId,
117     & 'tNx=', tNx, ' is not equal to subgrid size sNx=', sNx
118     CALL PRINT_MESSAGE(msgBuf,
119     & errorMessageUnit, SQUEEZE_RIGHT, 1 )
120     iErr = iErr+1
121     ENDIF
122     IF ( tNy .NE. sNy ) THEN
123     WRITE(msgBuf,'(3(A,I5))')
124     & 'ERROR: S/R W2_MAP_PROCS Topology for tile', myTileId,
125     & 'tNy=', tNy, ' is not equal to subgrid size sNy=', sNy
126     CALL PRINT_MESSAGE(msgBuf,
127     & errorMessageUnit, SQUEEZE_RIGHT, 1 )
128     iErr = iErr+1
129     ENDIF
130     ENDDO
131     ENDDO
132     IF ( iErr .NE. 0 ) THEN
133     STOP 'ABNORMAL END: W2_MAP_PROCS'
134     ENDIF
135    
136     C-- Print tiles connection for this process and set myCommonFlag :
137     WRITE(msgBuf,'(A)') '===== W2 TILE TOPOLOGY ====='
138     CALL PRINT_MESSAGE( msgBuf, W2_oUnit, SQUEEZE_BOTH, myThid )
139     DO bj=1,nSy
140     DO bi=1,nSx
141     myTileId = W2_myTileList(bi,bj)
142 jmc 1.2 WRITE(msgBuf,'(A,I5,A,2I4,2A,I3)')
143     & ' TILE: ', myTileId,' (bi,bj=', bi, bj, ' )',
144     & ', Nb of Neighbours =', exch2_nNeighbours(myTileId)
145 jmc 1.1 c WRITE(msgBuf,'(2(A,I5),A,I3)') ' TILE: ', myTileId,
146     c & ' , rank=', W2_tileRank(myTileId),
147     c & ' , Nb of Neighbours =', exch2_nNeighbours(myTileId)
148     CALL PRINT_MESSAGE( msgBuf, W2_oUnit, SQUEEZE_RIGHT, myThid )
149     DO J=1,exch2_nNeighbours(myTileId)
150     commFlag = 'M'
151 jmc 1.2 jj = exch2_neighbourId(J,myTileId)
152     IF ( W2_tileProc(jj).EQ.thisProc ) commFlag = 'P'
153 jmc 1.1 IF ( commFlag .EQ. 'M' ) THEN
154     WRITE(msgBuf,'(A,I3,A,I5,A,I3,2A,I5,A)')
155     & ' NEIGHBOUR',J,' = TILE', exch2_neighbourId(J,myTileId),
156     & ' (n=', exch2_opposingSend(J,myTileId), ') Comm = MSG',
157     & ' (PROC=',W2_tileProc(exch2_neighbourId(J,myTileId)),')'
158     CALL PRINT_MESSAGE( msgBuf, W2_oUnit, SQUEEZE_RIGHT, myThid )
159     ENDIF
160     IF ( commFlag .EQ. 'P' ) THEN
161     WRITE(msgBuf,'(A,I3,A,I5,A,I3,2A,I5,A)')
162     & ' NEIGHBOUR',J,' = TILE', exch2_neighbourId(J,myTileId),
163     & ' (n=', exch2_opposingSend(J,myTileId), ') Comm = PUT',
164     & ' (PROC=',W2_tileProc(exch2_neighbourId(J,myTileId)),')'
165     CALL PRINT_MESSAGE( msgBuf, W2_oUnit, SQUEEZE_RIGHT, myThid )
166     ENDIF
167     W2_myCommFlag(J,bi,bj) = commFlag
168     ENDDO
169     ENDDO
170     ENDDO
171    
172     RETURN
173     END

  ViewVC Help
Powered by ViewVC 1.1.22