xref: /phasta/phSolver/common/mpitools.f (revision 16223cb9c3f88b34f2cb94151b5cf5ffc1aac5e2)
1c
2c--------------
3c     drvAllreduce
4c--------------
5c
6      subroutine drvAllreduce ( eachproc, result, m )
7c
8      include "common.h"
9      include "mpif.h"
10c
11      dimension eachproc(m), result(m)
12c
13      if (numpe > 1) then
14         if(impistat.eq.1) then
15           iAllR = iAllR+1
16         elseif(impistat.eq.2) then
17           iAllRScal = iAllRScal+1
18         endif
19         if(impistat2.eq.1) call MPI_BARRIER (MPI_COMM_WORLD, ierr)
20         if(impistat.gt.0) rmpitmr = TMRC()
21         call MPI_ALLREDUCE ( eachproc, result, m,
22     &        MPI_DOUBLE_PRECISION, MPI_SUM, MPI_COMM_WORLD, ierr )
23         if(impistat.eq.1) then
24           rAllR = rAllR+TMRC()-rmpitmr
25         elseif(impistat.eq.2) then
26           rAllRScal = rAllRScal+TMRC()-rmpitmr
27         endif
28      else
29         result = eachproc
30      endif
31c
32      return
33      end
34c
35c------------------
36c     drvAllreducesclr
37c------------------
38c
39      subroutine drvAllreducesclr ( eachproc, result )
40c
41      include "common.h"
42      include "mpif.h"
43c
44      if (numpe > 1) then
45         if(impistat.eq.1) then
46           iAllR = iAllR+1
47         elseif(impistat.eq.2) then
48           iAllRScal = iAllRScal+1
49         endif
50         if(impistat2.eq.1) call MPI_BARRIER (MPI_COMM_WORLD, ierr)
51         if(impistat.gt.0) rmpitmr = TMRC()
52         call MPI_ALLREDUCE ( eachproc, result, 1,
53     &        MPI_DOUBLE_PRECISION, MPI_SUM, MPI_COMM_WORLD, ierr )
54         if(impistat.eq.1) then
55           rAllR = rAllR+TMRC()-rmpitmr
56         elseif(impistat.eq.2) then
57           rAllRScal = rAllRScal+TMRC()-rmpitmr
58         endif
59      else
60         result = eachproc
61      endif
62c
63      return
64      end
65
66c------------------------------------------------------------------------
67c
68c   sum real*8 array over all processors
69c
70c------------------------------------------------------------------------
71      subroutine sumgat (u, n, summed)
72
73      include "common.h"
74      include "mpif.h"
75      include "auxmpi.h"
76
77      dimension u(nshg,n), ilwork(nlwork)
78!SCATTER      dimension sumvec(numpe), irecvcount(numpe)
79
80      summed = sum(u)
81
82      if (numpe > 1) then
83         irecvcount = 1
84         sumvec = summed
85         if(impistat.eq.1) then
86           iAllR = iAllR+1
87         elseif(impistat.eq.2) then
88            iAllRScal = iAllRScal+1
89         endif
90         if(impistat2.eq.1) call MPI_BARRIER (MPI_COMM_WORLD, ierr)
91         if(impistat.gt.0) rmpitmr = TMRC()
92         call MPI_ALLREDUCE (sumvec, summed, irecvcount,
93     &        MPI_DOUBLE_PRECISION, MPI_SUM, MPI_COMM_WORLD, ierr)
94         if(impistat.eq.1) then
95           rAllR = rAllR+TMRC()-rmpitmr
96         elseif(impistat.eq.2) then
97           rAllRScal = rAllRScal+TMRC()-rmpitmr
98         endif
99c         call MPI_REDUCE_SCATTER (sumvec, summed, irecvcount,
100c     &        MPI_DOUBLE_PRECISION, MPI_SUM, MPI_COMM_WORLD, ierr)
101
102      endif
103
104      return
105      end
106
107c------------------------------------------------------------------------
108c
109c   sum real*8 array of length nnp over all processors
110c
111c------------------------------------------------------------------------
112      subroutine sumgatN (u, n, summed, nnp)
113
114      include "common.h"
115      include "mpif.h"
116      include "auxmpi.h"
117
118      dimension u(nnp,n), ilwork(nlwork)
119!      dimension sumvec(numpe), irecvcount(numpe)
120
121c protect against underflow
122c     summed = sum(u)
123      summed = sum(u) + 1.e-20
124
125      if (numpe > 1) then
126         irecvcount = 1
127         sumvec = summed
128
129         if(impistat.eq.1) then
130           iAllR = iAllR+1
131         elseif(impistat.eq.2) then
132            iAllRScal = iAllRScal+1
133         endif
134         if(impistat2.eq.1) call MPI_BARRIER (MPI_COMM_WORLD, ierr)
135         if(impistat.gt.0) rmpitmr = TMRC()
136         call MPI_ALLREDUCE (sumvec, summed, irecvcount,
137     &        MPI_DOUBLE_PRECISION, MPI_SUM, MPI_COMM_WORLD, ierr)
138         if(impistat.eq.1) then
139           rAllR = rAllR+TMRC()-rmpitmr
140         elseif(impistat.eq.2) then
141           rAllRScal = rAllRScal+TMRC()-rmpitmr
142         endif
143c         call MPI_REDUCE_SCATTER (sumvec, summed, irecvcount,
144c     &        MPI_DOUBLE_PRECISION, MPI_SUM, MPI_COMM_WORLD, ierr)
145
146      endif
147
148      return
149      end
150
151c------------------------------------------------------------------------
152c
153c   sum integer array over all processors
154c
155c------------------------------------------------------------------------
156      subroutine sumgatInt (u, n, summed )
157
158      include "common.h"
159      include "mpif.h"
160      include "auxmpi.h"
161
162      integer u(n), summed, sumvec
163!SCATTER      integer sumvec(numpe), irecvcount(numpe)
164
165c$$$      ttim(62) = ttim(62) - tmr()
166
167      summed = sum(u)
168
169      if (numpe > 1) then
170         irecvcount = 1
171         sumvec = summed
172         if(impistat.eq.1) then
173           iAllR = iAllR+1
174         elseif(impistat.eq.2) then
175           iAllRScal = iAllRScal+1
176         endif
177         if(impistat2.eq.1) call MPI_BARRIER (MPI_COMM_WORLD, ierr)
178         if(impistat.gt.0) rmpitmr = TMRC()
179         call MPI_ALLREDUCE (sumvec, summed, irecvcount,
180     &        MPI_INTEGER, MPI_SUM, MPI_COMM_WORLD, ierr)
181         if(impistat.eq.1) then
182           rAllR = rAllR+TMRC()-rmpitmr
183         elseif(impistat.eq.2) then
184           rAllRScal = rAllRScal+TMRC()-rmpitmr
185         endif
186c         call MPI_REDUCE_SCATTER (sumvec, summed, irecvcount,
187c     &        MPI_INTEGER, MPI_SUM, MPI_COMM_WORLD, ierr)
188
189      endif
190c$$$      ttim(62) = ttim(62) + tmr()
191
192      return
193      end
194
195