/[MITgcm]/MITgcm/eesupp/src/exch_rx_recv_get_x.template
ViewVC logotype

Diff of /MITgcm/eesupp/src/exch_rx_recv_get_x.template

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

revision 1.2 by cnh, Fri Sep 21 03:55:50 2001 UTC revision 1.9 by utke, Tue Mar 18 21:34:01 2008 UTC
# Line 81  C                                   tile Line 81  C                                   tile
81  #endif  #endif
82  CEOP  CEOP
83    
84           INTEGER myBxLoSave(MAX_NO_THREADS)
85           INTEGER myBxHiSave(MAX_NO_THREADS)
86           INTEGER myByLoSave(MAX_NO_THREADS)
87           INTEGER myByHiSave(MAX_NO_THREADS)
88           LOGICAL doingSingleThreadedComms
89    
90           doingSingleThreadedComms = .FALSE.
91    #ifdef ALLOW_USE_MPI
92    #ifndef ALWAYS_USE_MPI
93          IF ( usingMPI ) THEN
94    #endif
95    C      Set default behavior to have MPI comms done by a single thread.
96    C      Most MPI implementations don't support concurrent comms from
97    C      several threads.
98           IF ( nThreads .GT. 1 ) THEN
99            _BARRIER
100            _BEGIN_MASTER( myThid )
101             DO I=1,nThreads
102              myBxLoSave(I) = myBxLo(I)
103              myBxHiSave(I) = myBxHi(I)
104              myByLoSave(I) = myByLo(I)
105              myByHiSave(I) = myByHi(I)
106             ENDDO
107    C        Comment out loop below and myB[xy][Lo|Hi](1) settings below
108    C        if you want to get multi-threaded MPI comms.
109             DO I=1,nThreads
110              myBxLo(I) = 0
111              myBxHi(I) = -1
112              myByLo(I) = 0
113              myByHi(I) = -1
114             ENDDO
115             myBxLo(1) = 1
116             myBxHi(1) = nSx
117             myByLo(1) = 1
118             myByHi(1) = nSy
119             doingSingleThreadedComms = .TRUE.
120            _END_MASTER( myThid )
121            _BARRIER
122          ENDIF
123    #ifndef ALWAYS_USE_MPI
124          ENDIF
125    #endif
126    #endif
127    
128  C--   Under a "put" scenario we  C--   Under a "put" scenario we
129  C--     i. set completetion signal for buffer we put into.  C--     i. set completetion signal for buffer we put into.
# Line 109  C--   iii. Set data read flag + memory s Line 152  C--   iii. Set data read flag + memory s
152  #endif  #endif
153           theProc = tilePidW(bi,bj)           theProc = tilePidW(bi,bj)
154           theTag  = _tileTagRecvW(bi,bj)           theTag  = _tileTagRecvW(bi,bj)
155           theType = MPI_DOUBLE_PRECISION           theType = _MPI_TYPE_RX
156           theSize = sNy*exchWidthX*myNz           theSize = sNy*exchWidthX*myNz
157    # ifndef ALLOW_AUTODIFF_OPENAD
158           CALL MPI_Recv( westRecvBuf_RX(1,eBl,bi,bj), theSize, theType,           CALL MPI_Recv( westRecvBuf_RX(1,eBl,bi,bj), theSize, theType,
159       &                  theProc, theTag, MPI_COMM_MODEL,       &                  theProc, theTag, MPI_COMM_MODEL,
160       &                  mpiStatus, mpiRc )       &                  mpiStatus, mpiRc )
161    # else
162             CALL ampi_recv_RX(
163         & westRecvBuf_RX(1,eBl,bi,bj) ,
164         & theSize ,
165         & theType ,
166         & theProc ,
167         & theTag ,
168         & MPI_COMM_MODEL ,
169         & mpiStatus ,
170         & mpiRc )
171    # endif /* ALLOW_AUTODIFF_OPENAD */
172  #ifndef ALWAYS_USE_MPI  #ifndef ALWAYS_USE_MPI
173          ENDIF                          ENDIF                
174  #endif  #endif
# Line 126  C--   iii. Set data read flag + memory s Line 181  C--   iii. Set data read flag + memory s
181  #endif  #endif
182           theProc = tilePidE(bi,bj)           theProc = tilePidE(bi,bj)
183           theTag  = _tileTagRecvE(bi,bj)           theTag  = _tileTagRecvE(bi,bj)
184           theType = MPI_DOUBLE_PRECISION           theType = _MPI_TYPE_RX
185           theSize = sNy*exchWidthX*myNz           theSize = sNy*exchWidthX*myNz
186    # ifndef ALLOW_AUTODIFF_OPENAD
187           CALL MPI_Recv( eastRecvBuf_RX(1,eBl,bi,bj), theSize, theType,           CALL MPI_Recv( eastRecvBuf_RX(1,eBl,bi,bj), theSize, theType,
188       &                  theProc, theTag, MPI_COMM_MODEL,       &                  theProc, theTag, MPI_COMM_MODEL,
189       &                  mpiStatus, mpiRc )       &                  mpiStatus, mpiRc )
190    # else
191             CALL ampi_recv_RX(
192         & eastRecvBuf_RX(1,eBl,bi,bj) ,
193         & theSize ,
194         & theType ,
195         & theProc ,
196         & theTag ,
197         & MPI_COMM_MODEL ,
198         & mpiStatus ,
199         & mpiRc )
200    # endif /* ALLOW_AUTODIFF_OPENAD */
201  #ifndef ALWAYS_USE_MPI  #ifndef ALWAYS_USE_MPI
202          ENDIF                          ENDIF                
203  #endif  #endif
# Line 152  C        i.e. we only lock waiting for d Line 219  C        i.e. we only lock waiting for d
219           ebL = exchangeBufLevel(1,bi,bj)           ebL = exchangeBufLevel(1,bi,bj)
220           westCommMode = _tileCommModeW(bi,bj)           westCommMode = _tileCommModeW(bi,bj)
221           eastCommMode = _tileCommModeE(bi,bj)           eastCommMode = _tileCommModeE(bi,bj)
222    # ifndef ALLOW_AUTODIFF_OPENAD
223     10    CONTINUE     10    CONTINUE
224            CALL FOOL_THE_COMPILER            CALL FOOL_THE_COMPILER( spinCount )
225            spinCount = spinCount+1            spinCount = spinCount+1
226  C         IF ( myThid .EQ. 1 .AND. spinCount .GT. _EXCH_SPIN_LIMIT ) THEN  C         IF ( myThid .EQ. 1 .AND. spinCount .GT. _EXCH_SPIN_LIMIT ) THEN
227  C          WRITE(*,*) ' eBl = ', ebl  C          WRITE(*,*) ' eBl = ', ebl
228  C          STOP ' S/R EXCH_RECV_GET_X: spinCount .GT. _EXCH_SPIN_LIMIT'  C          STOP ' S/R EXCH_RECV_GET_X: spinCount .GT. _EXCH_SPIN_LIMIT'
229  C         ENDIF  C         ENDIF
230            IF ( westRecvAck(eBl,bi,bj) .EQ. 0. ) GOTO 10            IF ( westRecvAck(eBl,bi,bj) .EQ. 0 ) GOTO 10
231            IF ( eastRecvAck(eBl,bi,bj) .EQ. 0. ) GOTO 10            IF ( eastRecvAck(eBl,bi,bj) .EQ. 0 ) GOTO 10
232    # else
233             do while ((westRecvAck(eBl,bi,bj) .EQ. 0.
234         &             .or.
235         &              eastRecvAck(eBl,bi,bj) .EQ. 0. ))
236              CALL FOOL_THE_COMPILER( spinCount )
237              spinCount = spinCount+1
238             end do
239    # endif /* ALLOW_AUTODIFF_OPENAD */
240  C        Clear outstanding requests  C        Clear outstanding requests
241           westRecvAck(eBl,bi,bj) = 0.           westRecvAck(eBl,bi,bj) = 0
242           eastRecvAck(eBl,bi,bj) = 0.           eastRecvAck(eBl,bi,bj) = 0
243    
244           IF ( exchNReqsX(1,bi,bj) .GT. 0 ) THEN           IF ( exchNReqsX(1,bi,bj) .GT. 0 ) THEN
245  #ifdef ALLOW_USE_MPI  #ifdef ALLOW_USE_MPI
246  #ifndef ALWAYS_USE_MPI  #ifndef ALWAYS_USE_MPI
247           IF ( usingMPI ) THEN           IF ( usingMPI ) THEN
248  #endif  #endif
249    # ifndef ALLOW_AUTODIFF_OPENAD
250            CALL MPI_Waitall( exchNReqsX(1,bi,bj), exchReqIdX(1,1,bi,bj),            CALL MPI_Waitall( exchNReqsX(1,bi,bj), exchReqIdX(1,1,bi,bj),
251       &                      mpiStatus, mpiRC )       &                      mpiStatus, mpiRC )
252    # else
253              CALL ampi_waitall(
254         & exchNReqsX(1,bi,bj),
255         & exchReqIdX(1,1,bi,bj),
256         & mpiStatus,
257         & mpiRC )
258    # endif /* ALLOW_AUTODIFF_OPENAD */
259  #ifndef ALWAYS_USE_MPI  #ifndef ALWAYS_USE_MPI
260          ENDIF                          ENDIF                
261  #endif  #endif
# Line 318  C--   Read from the buffers Line 402  C--   Read from the buffers
402         ENDDO         ENDDO
403        ENDDO        ENDDO
404    
405          _BARRIER
406          IF ( doingSingleThreadedComms ) THEN
407    C      Restore saved settings that were stored to allow
408    C      single thred comms.
409           _BEGIN_MASTER(myThid)
410            DO I=1,nThreads
411             myBxLo(I) = myBxLoSave(I)
412             myBxHi(I) = myBxHiSave(I)
413             myByLo(I) = myByLoSave(I)
414             myByHi(I) = myByHiSave(I)
415            ENDDO
416           _END_MASTER(myThid)
417          ENDIF                
418          _BARRIER
419    
420        RETURN        RETURN
421        END        END

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.9

  ViewVC Help
Powered by ViewVC 1.1.22