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

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

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


Revision 1.11 - (hide annotations) (download)
Mon Dec 15 02:02:38 2003 UTC (20 years, 5 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint52l_pre, hrcube4, hrcube5, checkpoint52j_pre, checkpoint52l_post, checkpoint52k_post, checkpoint52f_post, checkpoint52i_pre, hrcube_1, hrcube_2, hrcube_3, checkpoint52e_pre, checkpoint52e_post, checkpoint52f_pre, checkpoint52d_post, checkpoint52i_post, checkpoint52h_pre, checkpoint52j_post
Changes since 1.10: +4 -4 lines
allow multi-components set-up with a coupler interface and using MPI.

1 jmc 1.11 C $Header: /u/gcmpack/MITgcm/eesupp/src/global_sum.F,v 1.10 2001/09/21 03:54:35 cnh Exp $
2 adcroft 1.9 C $Name: $
3 cnh 1.1
4     C-- File global_sum.F: Routines that perform global sum on an array
5     C of thread values.
6     C Contents
7     C o global_sum_r4
8     C o global_sum_r8
9     #include "CPP_EEOPTIONS.h"
10    
11 cnh 1.10 CBOP
12     C !ROUTINE: GLOBAL_SUM_R4
13    
14     C !INTERFACE:
15 cnh 1.1 SUBROUTINE GLOBAL_SUM_R4(
16 adcroft 1.6 U sumPhi,
17 cnh 1.1 I myThid )
18 adcroft 1.6 IMPLICIT NONE
19 cnh 1.10 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 cnh 1.1
35 cnh 1.10 C !USES:
36 cnh 1.1 C == Global data ==
37     #include "SIZE.h"
38     #include "EEPARAMS.h"
39     #include "EESUPPORT.h"
40 adcroft 1.9 #include "GLOBAL_SUM.h"
41 cnh 1.1
42 cnh 1.10 C !INPUT/OUTPUT PARAMETERS:
43 cnh 1.1 C == Routine arguments ==
44     C sumPhi - Result of sum.
45     C myThid - My thread id.
46     Real*4 sumPhi
47     INTEGER myThid
48    
49 cnh 1.10 C !LOCAL VARIABLES:
50 cnh 1.1 C == Local variables ==
51     C I - Loop counters
52     C mpiRC - MPI return code
53     INTEGER I
54     Real*4 tmp
55     #ifdef ALLOW_USE_MPI
56     INTEGER mpiRC
57     #endif /* ALLOW_USE_MPI */
58 cnh 1.10 CEOP
59 cnh 1.1
60 adcroft 1.6 C-- write local sum into array
61 adcroft 1.9 CALL BAR2( myThid )
62     phiGSRS(1,myThid) = sumPhi
63 adcroft 1.6
64 cnh 1.4 C-- Can not start until everyone is ready
65 adcroft 1.9 CALL BAR2( myThid )
66 cnh 1.1
67     C-- Sum within the process first
68     _BEGIN_MASTER( myThid )
69     tmp = 0.
70     DO I=1,nThreads
71 adcroft 1.9 tmp = tmp + phiGSRS(1,I)
72 cnh 1.1 ENDDO
73     sumPhi = tmp
74     #ifdef ALLOW_USE_MPI
75     #ifndef ALWAYS_USE_MPI
76     IF ( usingMPI ) THEN
77     #endif
78     CALL MPI_Allreduce(tmp,sumPhi,1,MPI_REAL,MPI_SUM,
79 jmc 1.11 & MPI_COMM_MODEL,mpiRC)
80 cnh 1.1 #ifndef ALWAYS_USE_MPI
81     ENDIF
82     #endif
83     #endif /* ALLOW_USE_MPI */
84 adcroft 1.6 C-- Write solution to place where all threads can see it
85 adcroft 1.9 phiGSRS(1,1) = sumPhi
86 adcroft 1.6
87 cnh 1.1 _END_MASTER( myThid )
88     C--
89 adcroft 1.9 CALL BAR2( myThid )
90 adcroft 1.6
91     C-- set result for every process
92 adcroft 1.9 sumPhi = phiGSRS(1,1)
93     CALL BAR2( myThid )
94 adcroft 1.6
95 cnh 1.1 RETURN
96     END
97    
98    
99 cnh 1.10 CBOP
100     C !ROUTINE: GLOBAL_SUM_R8
101    
102     C !INTERFACE:
103 cnh 1.1 SUBROUTINE GLOBAL_SUM_R8(
104 adcroft 1.6 U sumPhi,
105 cnh 1.1 I myThid )
106 cnh 1.10 IMPLICIT NONE
107     C !DESCRIPTION:
108     C *==========================================================*
109     C | SUBROUTINE GLOBAL_SUM_R8
110     C | o Handle sum for real*8 data.
111     C *==========================================================*
112     C | Perform sum an array of one value per thread and then
113     C | sum result of all the processes.
114     C | Notes
115     C | =====
116     C | Within a process only one thread does the sum, each
117     C | thread is assumed to have already summed its local data.
118     C | The same thread also does the inter-process sum for
119     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 cnh 1.1
123 cnh 1.10 C !USES:
124 cnh 1.1 C === Global data ===
125     #include "SIZE.h"
126     #include "EEPARAMS.h"
127     #include "EESUPPORT.h"
128 adcroft 1.9 #include "GLOBAL_SUM.h"
129 cnh 1.1
130 cnh 1.10 C !INPUT/OUTPUT PARAMETERS:
131 cnh 1.1 C === Routine arguments ===
132     C sumPhi - Result of sum.
133     C myThid - My thread id.
134     Real*8 sumPhi
135     INTEGER myThid
136    
137 cnh 1.10 C !LOCAL VARIABLES:
138 cnh 1.1 C === Local variables ===
139     C I - Loop counters
140     C mpiRC - MPI return code
141     INTEGER I
142     Real*8 tmp
143     #ifdef ALLOW_USE_MPI
144     INTEGER mpiRC
145     #endif /* ALLOW_USE_MPI */
146 cnh 1.10 CEOP
147 cnh 1.1
148 adcroft 1.9 CALL BAR2( myThid )
149 adcroft 1.6 C-- write local sum into array
150 adcroft 1.9 phiGSRL(1,myThid) = sumPhi
151 adcroft 1.6
152 cnh 1.4 C-- Can not start until everyone is ready
153 adcroft 1.9 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 cnh 1.1
160     C-- Sum within the process first
161     _BEGIN_MASTER( myThid )
162     tmp = 0. _d 0
163     DO I=1,nThreads
164 adcroft 1.9 tmp = tmp + phiGSRL(1,I)
165 cnh 1.1 ENDDO
166     sumPhi = tmp
167     #ifdef ALLOW_USE_MPI
168     #ifndef ALWAYS_USE_MPI
169     IF ( usingMPI ) THEN
170     #endif
171     CALL MPI_Allreduce(tmp,sumPhi,1,MPI_DOUBLE_PRECISION,MPI_SUM,
172 jmc 1.11 & MPI_COMM_MODEL,mpiRC)
173 heimbach 1.7 #ifndef ALWAYS_USE_MPI
174     ENDIF
175     #endif
176     #endif /* ALLOW_USE_MPI */
177     C-- Write solution to place where all threads can see it
178 adcroft 1.9 phiGSRL(1,1) = sumPhi
179 heimbach 1.7 _END_MASTER( myThid )
180    
181     C-- Do not leave until we are sure that the sum is done
182 adcroft 1.9 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 heimbach 1.7
189     C-- set result for every process
190 adcroft 1.9 sumPhi = phiGSRL(1,1)
191     CALL BAR2( myThid )
192 heimbach 1.7
193     RETURN
194     END
195 cnh 1.10
196     CBOP
197     C !ROUTINE: GLOBAL_SUM_INT
198     C !INTERFACE:
199 heimbach 1.7 SUBROUTINE GLOBAL_SUM_INT(
200     U sumPhi,
201     I myThid )
202     IMPLICIT NONE
203 cnh 1.10 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 heimbach 1.7
219 cnh 1.10 C !USES:
220 heimbach 1.7 C === Global data ===
221     #include "SIZE.h"
222     #include "EEPARAMS.h"
223     #include "EESUPPORT.h"
224 adcroft 1.9 #include "GLOBAL_SUM.h"
225 heimbach 1.7
226 cnh 1.10 C !INPUT/OUTPUT PARAMETERS:
227 heimbach 1.7 C === Routine arguments ===
228     C sumPhi - Result of sum.
229     C myThid - My thread id.
230     INTEGER sumPhi
231     INTEGER myThid
232    
233 cnh 1.10 C !LOCAL VARIABLES:
234 heimbach 1.7 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 cnh 1.10 CEOP
243 heimbach 1.7
244 adcroft 1.9 _BARRIER
245 heimbach 1.7 C-- write local sum into array
246 adcroft 1.9 phiGSI(1,myThid) = sumPhi
247 heimbach 1.7
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 adcroft 1.9 tmp = tmp + phiGSI(1,I)
256 heimbach 1.7 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 jmc 1.11 & MPI_COMM_MODEL,mpiRC)
264 cnh 1.1 #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 adcroft 1.9 phiGSI(1,1) = sumPhi
270 cnh 1.1 _END_MASTER( myThid )
271    
272 cnh 1.4 C-- Do not leave until we are sure that the sum is done
273 cnh 1.1 _BARRIER
274 adcroft 1.6
275     C-- set result for every process
276 adcroft 1.9 sumPhi = phiGSI(1,1)
277     _BARRIER
278 adcroft 1.6
279 cnh 1.1 RETURN
280     END

  ViewVC Help
Powered by ViewVC 1.1.22