/[MITgcm]/MITgcm/eesupp/src/global_sum.F
ViewVC logotype

Diff of /MITgcm/eesupp/src/global_sum.F

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

revision 1.1 by cnh, Wed Apr 22 19:15:30 1998 UTC revision 1.10 by cnh, Fri Sep 21 03:54:35 2001 UTC
# Line 1  Line 1 
1  C $Id$  C $Header$
2    C $Name$
3    
4  C--   File global_sum.F: Routines that perform global sum on an array  C--   File global_sum.F: Routines that perform global sum on an array
5  C                        of thread values.  C                        of thread values.
# Line 7  C      o global_sum_r4 Line 8  C      o global_sum_r4
8  C      o global_sum_r8  C      o global_sum_r8
9  #include "CPP_EEOPTIONS.h"  #include "CPP_EEOPTIONS.h"
10    
11  CStartOfInterface  CBOP
12    C     !ROUTINE: GLOBAL_SUM_R4
13    
14    C     !INTERFACE:
15        SUBROUTINE GLOBAL_SUM_R4(        SUBROUTINE GLOBAL_SUM_R4(
16       I                       phi,       U                       sumPhi,
      O                       sumPhi,  
17       I                       myThid )       I                       myThid )
18  C     /==========================================================\        IMPLICIT NONE
19  C     | SUBROUTINE GLOBAL_SUM_R4                                 |  C     !DESCRIPTION:
20  C     | o Handle sum for real*4 data.                            |  C     *==========================================================*
21  C     |==========================================================|  C     | SUBROUTINE GLOBAL_SUM_R4                                  
22  C     | Perform sum an array of one value per thread and then    |  C     | o Handle sum for real*4 data.                            
23  C     | sum result of all the processes.                         |  C     *==========================================================*
24  C     | Notes                                                    |  C     | Perform sum an array of one value per thread and then    
25  C     | =====                                                    |  C     | sum result of all the processes.                          
26  C     | Within a process only one thread does the sum, each      |  C     | Notes                                                    
27  C     | thread is assumed to have already summed its local data. |  C     | =====                                                    
28  C     | The same thread also does the inter-process sum for      |  C     | Within a process only one thread does the sum, each      
29  C     | example with MPI and then writes the result into a shared|  C     | thread is assumed to have already summed its local data.  
30  C     | location. All threads wait until the sum is avaiailable. |  C     | The same thread also does the inter-process sum for      
31  C     \==========================================================/  C     | example with MPI and then writes the result into a shared
32    C     | location. All threads wait until the sum is avaiailable.  
33    C     *==========================================================*
34    
35    C     !USES:
36  C     == Global data ==  C     == Global data ==
37  #include "SIZE.h"  #include "SIZE.h"
38  #include "EEPARAMS.h"  #include "EEPARAMS.h"
39  #include "EESUPPORT.h"  #include "EESUPPORT.h"
40    #include "GLOBAL_SUM.h"
41    
42    C     !INPUT/OUTPUT PARAMETERS:
43  C     == Routine arguments ==  C     == Routine arguments ==
 C     phi    - Array to be summed.  
44  C     sumPhi - Result of sum.  C     sumPhi - Result of sum.
45  C     myThid - My thread id.  C     myThid - My thread id.
       Real*4 phi(lShare4,MAX_NO_THREADS)  
46        Real*4 sumPhi        Real*4 sumPhi
47        INTEGER myThid        INTEGER myThid
 CEndOfInterface  
48    
49    C     !LOCAL VARIABLES:
50  C     == Local variables ==  C     == Local variables ==
51  C     I      - Loop counters  C     I      - Loop counters
52  C     mpiRC  - MPI return code  C     mpiRC  - MPI return code
# Line 49  C     mpiRC  - MPI return code Line 55  C     mpiRC  - MPI return code
55  #ifdef   ALLOW_USE_MPI  #ifdef   ALLOW_USE_MPI
56        INTEGER mpiRC        INTEGER mpiRC
57  #endif /* ALLOW_USE_MPI */  #endif /* ALLOW_USE_MPI */
58    CEOP
59    
60  C--   Can't start until everyone is ready  C--   write local sum into array
61        _BARRIER        CALL BAR2( myThid )
62          phiGSRS(1,myThid) = sumPhi
63    
64    C--   Can not start until everyone is ready
65          CALL BAR2( myThid )
66    
67  C--   Sum within the process first  C--   Sum within the process first
68        _BEGIN_MASTER( myThid )        _BEGIN_MASTER( myThid )
69         tmp = 0.         tmp = 0.
70         DO I=1,nThreads         DO I=1,nThreads
71          tmp = tmp + phi(1,I)          tmp = tmp + phiGSRS(1,I)
72         ENDDO         ENDDO
73         sumPhi = tmp         sumPhi = tmp
74  #ifdef  ALLOW_USE_MPI  #ifdef  ALLOW_USE_MPI
# Line 70  C--   Sum within the process first Line 81  C--   Sum within the process first
81         ENDIF         ENDIF
82  #endif  #endif
83  #endif /*  ALLOW_USE_MPI */  #endif /*  ALLOW_USE_MPI */
84         phi(1,1) = sumPhi  C--     Write solution to place where all threads can see it
85           phiGSRS(1,1) = sumPhi
86    
87        _END_MASTER( myThid )        _END_MASTER( myThid )
88  C--  C--
89        _BARRIER        CALL BAR2( myThid )
90  C  
91    C--   set result for every process
92          sumPhi = phiGSRS(1,1)
93          CALL BAR2( myThid )
94    
95        RETURN        RETURN
96        END        END
97                
98    
99  CStartOfInterface  CBOP
100    C     !ROUTINE: GLOBAL_SUM_R8
101    
102    C     !INTERFACE:
103        SUBROUTINE GLOBAL_SUM_R8(        SUBROUTINE GLOBAL_SUM_R8(
104       I                       phi,       U                       sumPhi,
      O                       sumPhi,  
105       I                       myThid )       I                       myThid )
106  C     /==========================================================\        IMPLICIT NONE
107  C     | SUBROUTINE GLOBAL_SUM_R8                                 |  C     !DESCRIPTION:
108  C     | o Handle sum for real*8 data.                            |  C     *==========================================================*
109  C     |==========================================================|  C     | SUBROUTINE GLOBAL_SUM_R8                                  
110  C     | Perform sum an array of one value per thread and then    |  C     | o Handle sum for real*8 data.                            
111  C     | sum result of all the processes.                         |  C     *==========================================================*
112  C     | Notes                                                    |  C     | Perform sum an array of one value per thread and then    
113  C     | =====                                                    |  C     | sum result of all the processes.                          
114  C     | Within a process only one thread does the sum, each      |  C     | Notes                                                    
115  C     | thread is assumed to have already summed its local data. |  C     | =====                                                    
116  C     | The same thread also does the inter-process sum for      |  C     | Within a process only one thread does the sum, each      
117  C     | example with MPI and then writes the result into a shared|  C     | thread is assumed to have already summed its local data.  
118  C     | location. All threads wait until the sum is avaiailable. |  C     | The same thread also does the inter-process sum for      
119  C     \==========================================================/  C     | example with MPI and then writes the result into a shared
120    C     | location. All threads wait until the sum is avaiailable.  
121    C     *==========================================================*
122    
123    C     !USES:
124  C     === Global data ===  C     === Global data ===
125  #include "SIZE.h"  #include "SIZE.h"
126  #include "EEPARAMS.h"  #include "EEPARAMS.h"
127  #include "EESUPPORT.h"  #include "EESUPPORT.h"
128    #include "GLOBAL_SUM.h"
129    
130    C     !INPUT/OUTPUT PARAMETERS:
131  C     === Routine arguments ===  C     === Routine arguments ===
 C     phi    - Array to be summed.  
132  C     sumPhi - Result of sum.  C     sumPhi - Result of sum.
133  C     myThid - My thread id.  C     myThid - My thread id.
       Real*8 phi(lShare8,MAX_NO_THREADS)  
134        Real*8 sumPhi        Real*8 sumPhi
135        INTEGER myThid        INTEGER myThid
 CEndOfInterface  
136    
137    C     !LOCAL VARIABLES:
138  C     === Local variables ===  C     === Local variables ===
139  C     I      - Loop counters  C     I      - Loop counters
140  C     mpiRC  - MPI return code  C     mpiRC  - MPI return code
# Line 121  C     mpiRC  - MPI return code Line 143  C     mpiRC  - MPI return code
143  #ifdef   ALLOW_USE_MPI  #ifdef   ALLOW_USE_MPI
144        INTEGER mpiRC        INTEGER mpiRC
145  #endif   /* ALLOW_USE_MPI */  #endif   /* ALLOW_USE_MPI */
146    CEOP
147    
148  C--   Can't start until everyone is ready        CALL BAR2( myThid )
149        _BARRIER  C--   write local sum into array
150          phiGSRL(1,myThid) = sumPhi
151    
152    C--   Can not start until everyone is ready
153    C     CALL FOOL_THE_COMPILER( phiGSRL )
154    C     CALL MS
155          CALL BAR2( myThid )
156    C     _BARRIER
157    C     _BARRIER
158    C     CALL FOOL_THE_COMPILER( phiGSRL )
159    
160  C--   Sum within the process first  C--   Sum within the process first
161        _BEGIN_MASTER( myThid )        _BEGIN_MASTER( myThid )
162         tmp = 0. _d 0         tmp = 0. _d 0
163         DO I=1,nThreads         DO I=1,nThreads
164          tmp = tmp + phi(1,I)          tmp = tmp + phiGSRL(1,I)
165         ENDDO         ENDDO
166         sumPhi = tmp         sumPhi = tmp
167  #ifdef  ALLOW_USE_MPI  #ifdef  ALLOW_USE_MPI
# Line 143  C--   Sum within the process first Line 175  C--   Sum within the process first
175  #endif  #endif
176  #endif /*  ALLOW_USE_MPI */  #endif /*  ALLOW_USE_MPI */
177  C--     Write solution to place where all threads can see it  C--     Write solution to place where all threads can see it
178          phi(1,1) = sumPhi          phiGSRL(1,1) = sumPhi
179        _END_MASTER( myThid )        _END_MASTER( myThid )
180    
181  C--   Don't leave until we are sure that the sum is done  C--   Do not leave until we are sure that the sum is done
182        _BARRIER  C     CALL FOOL_THE_COMPILER( phiGSRL )
183  C  C     CALL MS
184    C     _BARRIER
185    C     _BARRIER
186          CALL BAR2( myThid )
187    C     CALL FOOL_THE_COMPILER( phiGSRL )
188    
189    C--   set result for every process
190          sumPhi = phiGSRL(1,1)
191          CALL BAR2( myThid )
192    
193        RETURN        RETURN
194        END        END
195    
196  C $Id$  CBOP
197    C     !ROUTINE: GLOBAL_SUM_INT
198    C     !INTERFACE:
199          SUBROUTINE GLOBAL_SUM_INT(
200         U                       sumPhi,
201         I                       myThid )
202          IMPLICIT NONE
203    C     !DESCRIPTION:
204    C     *==========================================================*
205    C     | SUBROUTINE GLOBAL_SUM_INT                                
206    C     | o Handle sum for integer data.                            
207    C     *==========================================================*
208    C     | Perform sum an array of one value per thread and then    
209    C     | sum result of all the processes.                          
210    C     | Notes                                                    
211    C     | =====                                                    
212    C     | Within a process only one thread does the sum, each      
213    C     | thread is assumed to have already summed its local data.  
214    C     | The same thread also does the inter-process sum for      
215    C     | example with MPI and then writes the result into a shared
216    C     | location. All threads wait until the sum is avaiailable.  
217    C     *==========================================================*
218    
219    C     !USES:
220    C     === Global data ===
221    #include "SIZE.h"
222    #include "EEPARAMS.h"
223    #include "EESUPPORT.h"
224    #include "GLOBAL_SUM.h"
225    
226    C     !INPUT/OUTPUT PARAMETERS:
227    C     === Routine arguments ===
228    C     sumPhi - Result of sum.
229    C     myThid - My thread id.
230          INTEGER sumPhi
231          INTEGER myThid
232    
233    C     !LOCAL VARIABLES:
234    C     === Local variables ===
235    C     I      - Loop counters
236    C     mpiRC  - MPI return code
237          INTEGER I
238          INTEGER  tmp
239    #ifdef   ALLOW_USE_MPI
240          INTEGER mpiRC
241    #endif   /* ALLOW_USE_MPI */
242    CEOP
243    
244          _BARRIER
245    C--   write local sum into array
246          phiGSI(1,myThid) = sumPhi
247    
248    C--   Can not start until everyone is ready
249          _BARRIER
250    
251    C--   Sum within the process first
252          _BEGIN_MASTER( myThid )
253           tmp = 0. _d 0
254           DO I=1,nThreads
255            tmp = tmp + phiGSI(1,I)
256           ENDDO
257           sumPhi = tmp
258    #ifdef  ALLOW_USE_MPI
259    #ifndef ALWAYS_USE_MPI
260           IF ( usingMPI ) THEN
261    #endif
262            CALL MPI_Allreduce(tmp,sumPhi,1,MPI_INTEGER,MPI_SUM,
263         &                   MPI_COMM_WORLD,mpiRC)
264    #ifndef ALWAYS_USE_MPI
265           ENDIF
266    #endif
267    #endif /*  ALLOW_USE_MPI */
268    C--     Write solution to place where all threads can see it
269            phiGSI(1,1) = sumPhi
270          _END_MASTER( myThid )
271    
272    C--   Do not leave until we are sure that the sum is done
273          _BARRIER
274    
275    C--   set result for every process
276          sumPhi = phiGSI(1,1)
277          _BARRIER
278    
279          RETURN
280          END

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.10

  ViewVC Help
Powered by ViewVC 1.1.22