Branch data Line data Source code
1 : : !{\src2tex{textfont=tt}}
2 : : !!****f* ABINIT/xmpi_land_log0d
3 : : !! NAME
4 : : !! xmpi_land_log0d
5 : : !!
6 : : !! FUNCTION
7 : : !! Logical AND accross the nodes.
8 : : !! Combines value from all processes and distribute the result back to all processes.
9 : : !! Target: logical scalar
10 : : !!
11 : : !! SOURCE
12 : :
13 : 13 : subroutine xmpi_land_log0d(xval, comm)
14 : :
15 : : !Arguments ------------------------------------
16 : : logical,intent(inout) :: xval
17 : : integer,intent(in) :: comm
18 : :
19 : : !Local variables-------------------------------
20 : : integer :: ierr
21 : : #if defined HAVE_MPI
22 : : logical :: out_val(1)
23 : : #endif
24 : :
25 : : ! *************************************************************************
26 : :
27 : 13 : ierr=0
28 : : #if defined HAVE_MPI
29 [ + - ]: 13 : if (comm /= MPI_COMM_SELF .and. comm /= MPI_COMM_NULL) then
30 [ + + ]: 26 : call MPI_ALLREDUCE([xval], out_val, 1, MPI_LOGICAL, MPI_LAND, comm, ierr)
31 : 13 : xval = out_val(1)
32 : : end if
33 : : #endif
34 : :
35 : 13 : end subroutine xmpi_land_log0d
36 : : !!***
37 : :
38 : : !----------------------------------------------------------------------
39 : :
40 : : !!****f* ABINIT/xmpi_land_log1d
41 : : !! NAME
42 : : !! xmpi_land_log1d
43 : : !!
44 : : !! FUNCTION
45 : : !! Combines values from all processes and distribute
46 : : !! the result back to all processes.
47 : : !! Target: one-dimensional logical arrays.
48 : : !!
49 : : !! INPUTS
50 : : !! comm= MPI communicator
51 : : !!
52 : : !! SIDE EFFECTS
53 : : !! xval= buffer array
54 : : !!
55 : : !! SOURCE
56 : :
57 [ # # ]: 0 : subroutine xmpi_land_log1d(xval,comm)
58 : :
59 : : !Arguments ------------------------------------
60 : : integer,intent(in) :: comm
61 : : logical, DEV_CONTARRD intent(inout) :: xval(:)
62 : :
63 : : !Local variables-------------------------------
64 : : #if defined HAVE_MPI
65 : : integer :: ierr,n1
66 : 0 : logical,allocatable :: xsum(:)
67 : : #endif
68 : :
69 : : ! *************************************************************************
70 : :
71 : : #if defined HAVE_MPI
72 [ # # ]: 0 : if (comm /= MPI_COMM_SELF .and. comm /= MPI_COMM_NULL) then
73 : : ! Accumulate xval on all proc. in comm
74 : 0 : n1 = size(xval)
75 [ # # # # : 0 : ABI_STAT_MALLOC(xsum,(n1), ierr)
# # # # #
# # # ]
76 [ # # ]: 0 : if (ierr/= 0) call xmpi_abort(msg='error allocating xsum in xmpi_land_log1d')
77 [ # # ]: 0 : call MPI_ALLREDUCE(xval,xsum,n1,MPI_LOGICAL,MPI_LAND,comm,ierr)
78 [ # # ]: 0 : xval (:) = xsum(:)
79 [ # # ]: 0 : ABI_FREE(xsum)
80 : : end if
81 : : #endif
82 : :
83 : 0 : end subroutine xmpi_land_log1d
84 : : !!***
85 : :
86 : : !----------------------------------------------------------------------
87 : :
88 : : !!****f* ABINIT/xmpi_lor_log1d
89 : : !! NAME
90 : : !! xmpi_lor_log1d
91 : : !!
92 : : !! FUNCTION
93 : : !! Combines values from all processes and distribute
94 : : !! the result back to all processes.
95 : : !! Target: one-dimensional logical arrays.
96 : : !!
97 : : !! INPUTS
98 : : !! comm= MPI communicator
99 : : !!
100 : : !! SIDE EFFECTS
101 : : !! xval= buffer array
102 : : !!
103 : : !! SOURCE
104 : :
105 [ - + ]: 173 : subroutine xmpi_lor_log1d(xval,comm)
106 : :
107 : : !Arguments ------------------------------------
108 : : integer,intent(in) :: comm
109 : : logical, DEV_CONTARRD intent(inout) :: xval(:)
110 : :
111 : : !Local variables-------------------------------
112 : : #if defined HAVE_MPI
113 : : integer :: ierr,n1
114 : 173 : logical,allocatable :: xsum(:)
115 : : #endif
116 : :
117 : : ! *************************************************************************
118 : :
119 : : #if defined HAVE_MPI
120 [ + - ]: 173 : if (comm /= MPI_COMM_SELF .and. comm /= MPI_COMM_NULL) then
121 : : ! Accumulate xval on all proc. in comm
122 : 173 : n1 = size(xval)
123 [ - + + - : 519 : ABI_STAT_MALLOC(xsum,(n1), ierr)
+ - + - +
- - + ]
124 [ - + ]: 173 : if (ierr/= 0) call xmpi_abort(msg='error allocating xsum in xmpi_lor_log1d')
125 [ - + ]: 173 : call MPI_ALLREDUCE(xval,xsum,n1,MPI_LOGICAL,MPI_LOR,comm,ierr)
126 [ + + ]: 35726 : xval (:) = xsum(:)
127 [ - + ]: 173 : ABI_FREE(xsum)
128 : : end if
129 : : #endif
130 : :
131 : 173 : end subroutine xmpi_lor_log1d
132 : : !!***
133 : :
134 : : !----------------------------------------------------------------------
135 : :
136 : : !!****f* ABINIT/xmpi_lor_log2d
137 : : !! NAME
138 : : !! xmpi_lor_log2d
139 : : !!
140 : : !! FUNCTION
141 : : !! Combines values from all processes and distribute
142 : : !! the result back to all processes.
143 : : !! Target: two-dimensional logical arrays.
144 : : !!
145 : : !! INPUTS
146 : : !! comm= MPI communicator
147 : : !!
148 : : !! SIDE EFFECTS
149 : : !! xval= buffer array
150 : : !!
151 : : !! SOURCE
152 : :
153 [ # # ]: 0 : subroutine xmpi_lor_log2d(xval,comm)
154 : :
155 : : !Arguments ------------------------------------
156 : : integer,intent(in) :: comm
157 : : logical, DEV_CONTARRD intent(inout) :: xval(:,:)
158 : :
159 : : !Local variables-------------------------------
160 : : #if defined HAVE_MPI
161 : : integer :: my_dt,my_op,n1,n2,ierr
162 : : integer(kind=int64) :: ntot
163 : 0 : logical,allocatable :: xsum(:,:)
164 : : #endif
165 : :
166 : : ! *************************************************************************
167 : :
168 : : #if defined HAVE_MPI
169 [ # # ]: 0 : if (comm /= MPI_COMM_SELF .and. comm /= MPI_COMM_NULL) then
170 : : ! Accumulate xval on all proc. in comm
171 : 0 : n1 = size(xval,1)
172 : 0 : n2 = size(xval,2)
173 : :
174 [ # # # # : 0 : ABI_STAT_MALLOC(xsum,(n1,n2), ierr)
# # # # #
# # # # #
# # ]
175 [ # # ]: 0 : if (ierr/= 0) call xmpi_abort(msg='error allocating xsum in xmpi_lor_log2d')
176 : :
177 : : !This product of dimensions can be greater than a 32bit integer
178 : : !We use a INT64 to store it. If it is too large, we switch to an
179 : : !alternate routine because MPI<4 doesnt handle 64 bit counts.
180 : 0 : ntot=int(n1,kind=int64)*n2
181 : :
182 [ # # ]: 0 : if (ntot<=xmpi_maxint32_64) then
183 [ # # ]: 0 : call MPI_ALLREDUCE(xval,xsum,n1*n2,MPI_LOGICAL,MPI_LOR,comm,ierr)
184 : : else
185 : 0 : call xmpi_largetype_create(ntot,MPI_LOGICAL,my_dt,my_op,MPI_LOR)
186 [ # # ]: 0 : call MPI_ALLREDUCE(xval,xsum,1,my_dt,my_op,comm,ierr)
187 : 0 : call xmpi_largetype_free(my_dt,my_op)
188 : : end if
189 : :
190 [ # # # # ]: 0 : xval (:,:) = xsum(:,:)
191 [ # # ]: 0 : ABI_FREE(xsum)
192 : : end if
193 : : #endif
194 : :
195 : 0 : end subroutine xmpi_lor_log2d
196 : : !!***
197 : :
198 : : !----------------------------------------------------------------------
199 : :
200 : : !!****f* ABINIT/xmpi_lor_log3d
201 : : !! NAME
202 : : !! xmpi_lor_log3d
203 : : !!
204 : : !! FUNCTION
205 : : !! Combines values from all processes and distribute
206 : : !! the result back to all processes.
207 : : !! Target: three-dimensional logical arrays.
208 : : !!
209 : : !! INPUTS
210 : : !! comm= MPI communicator
211 : : !!
212 : : !! SIDE EFFECTS
213 : : !! xval= buffer array
214 : : !!
215 : : !! SOURCE
216 : :
217 [ - + ]: 19 : subroutine xmpi_lor_log3d(xval,comm)
218 : :
219 : : !Arguments ------------------------------------
220 : : integer,intent(in) :: comm
221 : : logical, DEV_CONTARRD intent(inout) :: xval(:,:,:)
222 : :
223 : : !Local variables-------------------------------
224 : : #if defined HAVE_MPI
225 : : integer :: my_dt,my_op,n1,n2,n3,ierr
226 : : integer(kind=int64) :: ntot
227 : 19 : logical,allocatable :: xsum(:,:,:)
228 : : #endif
229 : :
230 : : ! *************************************************************************
231 : :
232 : : #if defined HAVE_MPI
233 [ + - ]: 19 : if (comm /= MPI_COMM_SELF .and. comm /= MPI_COMM_NULL) then
234 : : ! Accumulate xval on all proc. in comm
235 : 19 : n1 = size(xval,1)
236 : 19 : n2 = size(xval,2)
237 : 19 : n3 = size(xval,3)
238 : :
239 : : ! #if defined HAVE_MPI2_INPLACE
240 : : ! call MPI_ALLREDUCE(MPI_IN_PLACE,xval,n1*n2*n3,MPI_LOGICAL,MPI_LOR,comm,ierr)
241 : : ! #else
242 [ - + + - : 95 : ABI_STAT_MALLOC(xsum,(n1,n2,n3), ierr)
- + + - -
+ + - + -
+ - + - -
+ ]
243 [ - + ]: 19 : if (ierr/= 0) call xmpi_abort(msg='error allocating xsum in xmpi_lor_log3d')
244 : :
245 : : !This product of dimensions can be greater than a 32bit integer
246 : : !We use a INT64 to store it. If it is too large, we switch to an
247 : : !alternate routine because MPI<4 doesnt handle 64 bit counts.
248 : 19 : ntot=int(n1,kind=int64)*n2*n3
249 : :
250 [ + - ]: 19 : if (ntot<=xmpi_maxint32_64) then
251 [ - + ]: 19 : call MPI_ALLREDUCE(xval,xsum,n1*n2*n3,MPI_LOGICAL,MPI_LOR,comm,ierr)
252 : : else
253 : 0 : call xmpi_largetype_create(ntot,MPI_LOGICAL,my_dt,my_op,MPI_LOR)
254 [ # # ]: 0 : call MPI_ALLREDUCE(xval,xsum,1,my_dt,my_op,comm,ierr)
255 : 0 : call xmpi_largetype_free(my_dt,my_op)
256 : : end if
257 : :
258 [ + + + + : 7399 : xval (:,:,:) = xsum(:,:,:)
+ + ]
259 [ - + ]: 19 : ABI_FREE(xsum)
260 : : ! #endif
261 : : end if
262 : : #endif
263 : :
264 : 19 : end subroutine xmpi_lor_log3d
265 : : !!***
|