/[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.8 by cnh, Sun Feb 4 14:38:43 2001 UTC revision 1.10 by cnh, Fri Sep 21 03:54:35 2001 UTC
# Line 8  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       U                       sumPhi,       U                       sumPhi,
17       I                       myThid )       I                       myThid )
 C     /==========================================================\  
 C     | SUBROUTINE GLOBAL_SUM_R4                                 |  
 C     | o Handle sum for real*4 data.                            |  
 C     |==========================================================|  
 C     | Perform sum an array of one value per thread and then    |  
 C     | sum result of all the processes.                         |  
 C     | Notes                                                    |  
 C     | =====                                                    |  
 C     | Within a process only one thread does the sum, each      |  
 C     | thread is assumed to have already summed its local data. |  
 C     | The same thread also does the inter-process sum for      |  
 C     | example with MPI and then writes the result into a shared|  
 C     | location. All threads wait until the sum is avaiailable. |  
 C     \==========================================================/  
18        IMPLICIT NONE        IMPLICIT NONE
19    C     !DESCRIPTION:
20    C     *==========================================================*
21    C     | SUBROUTINE GLOBAL_SUM_R4                                  
22    C     | o Handle sum for real*4 data.                            
23    C     *==========================================================*
24    C     | Perform sum an array of one value per thread and then    
25    C     | sum result of all the processes.                          
26    C     | Notes                                                    
27    C     | =====                                                    
28    C     | Within a process only one thread does the sum, each      
29    C     | thread is assumed to have already summed its local data.  
30    C     | The same thread also does the inter-process sum for      
31    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 ==
44  C     sumPhi - Result of sum.  C     sumPhi - Result of sum.
45  C     myThid - My thread id.  C     myThid - My thread id.
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 ==
 C     phi    - Array to be summed.  
51  C     I      - Loop counters  C     I      - Loop counters
52  C     mpiRC  - MPI return code  C     mpiRC  - MPI return code
       Real*4 phi(lShare4,MAX_NO_THREADS)  
53        INTEGER I        INTEGER I
54        Real*4  tmp        Real*4  tmp
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--   write local sum into array  C--   write local sum into array
61        phi(1,myThid) = sumPhi        CALL BAR2( myThid )
62          phiGSRS(1,myThid) = sumPhi
63    
64  C--   Can not start until everyone is ready  C--   Can not start until everyone is ready
65        _BARRIER        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 75  C--   Sum within the process first Line 82  C--   Sum within the process first
82  #endif  #endif
83  #endif /*  ALLOW_USE_MPI */  #endif /*  ALLOW_USE_MPI */
84  C--     Write solution to place where all threads can see it  C--     Write solution to place where all threads can see it
85         phi(1,1) = sumPhi         phiGSRS(1,1) = sumPhi
86    
87        _END_MASTER( myThid )        _END_MASTER( myThid )
88  C--  C--
89        _BARRIER        CALL BAR2( myThid )
90    
91  C--   set result for every process  C--   set result for every process
92        sumPhi = phi(1,1)        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       U                       sumPhi,       U                       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        IMPLICIT NONE  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 ===
132  C     sumPhi - Result of sum.  C     sumPhi - Result of sum.
133  C     myThid - My thread id.  C     myThid - My thread id.
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 ===
 C     phi    - Array to be summed.  
139  C     I      - Loop counters  C     I      - Loop counters
140  C     mpiRC  - MPI return code  C     mpiRC  - MPI return code
       Real*8 phi(lShare8,MAX_NO_THREADS)  
141        INTEGER I        INTEGER I
142        Real*8  tmp        Real*8  tmp
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          CALL BAR2( myThid )
149  C--   write local sum into array  C--   write local sum into array
150        phi(1,myThid) = sumPhi        phiGSRL(1,myThid) = sumPhi
151    
152  C--   Can not start until everyone is ready  C--   Can not start until everyone is ready
153        _BARRIER  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 155  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--   Do not 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     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  C--   set result for every process
190        sumPhi = phi(1,1)        sumPhi = phiGSRL(1,1)
191          CALL BAR2( myThid )
192    
193        RETURN        RETURN
194        END        END
195  CStartOfInterface  
196    CBOP
197    C     !ROUTINE: GLOBAL_SUM_INT
198    C     !INTERFACE:
199        SUBROUTINE GLOBAL_SUM_INT(        SUBROUTINE GLOBAL_SUM_INT(
200       U                       sumPhi,       U                       sumPhi,
201       I                       myThid )       I                       myThid )
 C     /==========================================================\  
 C     | SUBROUTINE GLOBAL_SUM_INT                                |  
 C     | o Handle sum for integer data.                           |  
 C     |==========================================================|  
 C     | Perform sum an array of one value per thread and then    |  
 C     | sum result of all the processes.                         |  
 C     | Notes                                                    |  
 C     | =====                                                    |  
 C     | Within a process only one thread does the sum, each      |  
 C     | thread is assumed to have already summed its local data. |  
 C     | The same thread also does the inter-process sum for      |  
 C     | example with MPI and then writes the result into a shared|  
 C     | location. All threads wait until the sum is avaiailable. |  
 C     \==========================================================/  
202        IMPLICIT NONE        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 ===  C     === Global data ===
221  #include "SIZE.h"  #include "SIZE.h"
222  #include "EEPARAMS.h"  #include "EEPARAMS.h"
223  #include "EESUPPORT.h"  #include "EESUPPORT.h"
224    #include "GLOBAL_SUM.h"
225    
226    C     !INPUT/OUTPUT PARAMETERS:
227  C     === Routine arguments ===  C     === Routine arguments ===
228  C     sumPhi - Result of sum.  C     sumPhi - Result of sum.
229  C     myThid - My thread id.  C     myThid - My thread id.
230        INTEGER sumPhi        INTEGER sumPhi
231        INTEGER myThid        INTEGER myThid
 CEndOfInterface  
232    
233    C     !LOCAL VARIABLES:
234  C     === Local variables ===  C     === Local variables ===
 C     phi    - Array to be summed.  
235  C     I      - Loop counters  C     I      - Loop counters
236  C     mpiRC  - MPI return code  C     mpiRC  - MPI return code
       INTEGER phi(lShare8,MAX_NO_THREADS)  
237        INTEGER I        INTEGER I
238        INTEGER  tmp        INTEGER  tmp
239  #ifdef   ALLOW_USE_MPI  #ifdef   ALLOW_USE_MPI
240        INTEGER mpiRC        INTEGER mpiRC
241  #endif   /* ALLOW_USE_MPI */  #endif   /* ALLOW_USE_MPI */
242    CEOP
243    
244          _BARRIER
245  C--   write local sum into array  C--   write local sum into array
246        phi(1,myThid) = sumPhi        phiGSI(1,myThid) = sumPhi
247    
248  C--   Can not start until everyone is ready  C--   Can not start until everyone is ready
249        _BARRIER        _BARRIER
# Line 219  C--   Sum within the process first Line 252  C--   Sum within the process first
252        _BEGIN_MASTER( myThid )        _BEGIN_MASTER( myThid )
253         tmp = 0. _d 0         tmp = 0. _d 0
254         DO I=1,nThreads         DO I=1,nThreads
255          tmp = tmp + phi(1,I)          tmp = tmp + phiGSI(1,I)
256         ENDDO         ENDDO
257         sumPhi = tmp         sumPhi = tmp
258  #ifdef  ALLOW_USE_MPI  #ifdef  ALLOW_USE_MPI
# Line 233  C--   Sum within the process first Line 266  C--   Sum within the process first
266  #endif  #endif
267  #endif /*  ALLOW_USE_MPI */  #endif /*  ALLOW_USE_MPI */
268  C--     Write solution to place where all threads can see it  C--     Write solution to place where all threads can see it
269          phi(1,1) = sumPhi          phiGSI(1,1) = sumPhi
270        _END_MASTER( myThid )        _END_MASTER( myThid )
271    
272  C--   Do not leave until we are sure that the sum is done  C--   Do not leave until we are sure that the sum is done
273        _BARRIER        _BARRIER
274    
275  C--   set result for every process  C--   set result for every process
276        sumPhi = phi(1,1)        sumPhi = phiGSI(1,1)
277          _BARRIER
278    
279        RETURN        RETURN
280        END        END

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

  ViewVC Help
Powered by ViewVC 1.1.22