Line data Source code
1 : !{\src2tex{textfont=tt}}
2 : !!****f* ABINIT/xmpi_exch_int1d
3 : !! NAME
4 : !! xmpi_exch_int1d
5 : !!
6 : !! FUNCTION
7 : !! This module contains functions that calls MPI routine,
8 : !! if we compile the code using the MPI CPP flags.
9 : !! xmpi_exch is the generic function.
10 : !!
11 : !! COPYRIGHT
12 : !! Copyright (C) 2001-2026 ABINIT group (MB,MT)
13 : !! This file is distributed under the terms of the
14 : !! GNU General Public License, see ~ABINIT/COPYING
15 : !! or http://www.gnu.org/copyleft/gpl.txt .
16 : !!
17 : !! NOTE
18 : !! The tag conforms to the MPI request that the tag is lower than 32768,
19 : !! by using a modulo call.
20 : !!
21 : !! SOURCE
22 :
23 : !--------------------------------------------------------------------
24 :
25 0 : subroutine xmpi_exch_int1d(vsend,n1,sender,vrecv,recever,comm,mtag,ier)
26 :
27 : !Arguments----------------
28 : integer,intent(in) :: mtag,n1
29 : integer, DEV_CONTARRD intent(in) :: vsend(:)
30 : integer, DEV_CONTARRD intent(inout) :: vrecv(:)
31 : integer,intent(in) :: sender,recever,comm
32 : integer,intent(out) :: ier
33 :
34 : !Local variables--------------
35 : #if defined HAVE_MPI
36 : integer :: statux(MPI_STATUS_SIZE)
37 : integer :: tag,me
38 : #endif
39 :
40 : ! *************************************************************************
41 :
42 0 : ier=0
43 : #if defined HAVE_MPI
44 0 : if (sender==recever.or.comm==MPI_COMM_NULL.or.n1==0) return
45 0 : call MPI_COMM_RANK(comm,me,ier)
46 0 : tag = MOD(mtag,xmpi_tag_ub)
47 :
48 0 : if (recever==me) then
49 0 : call MPI_RECV(vrecv,n1,MPI_INTEGER,sender,tag,comm,statux,ier)
50 : end if
51 0 : if (sender==me) then
52 0 : call MPI_SEND(vsend,n1,MPI_INTEGER,recever,tag,comm,ier)
53 : end if
54 : #endif
55 :
56 : end subroutine xmpi_exch_int1d
57 : !!***
58 :
59 : !--------------------------------------------------------------------
60 :
61 : !!****f* ABINIT/xmpi_exch_int2d
62 : !! NAME
63 : !! xmpi_exch_int2d
64 : !!
65 : !! FUNCTION
66 : !! Sends and receives data.
67 : !! Target: two-dimensional integer arrays.
68 : !!
69 : !! INPUTS
70 : !! mtag= message tag
71 : !! nt= vector length
72 : !! vsend= send buffer
73 : !! sender= node sending the data
74 : !! recever= node receiving the data
75 : !! comm= MPI communicator
76 : !!
77 : !! OUTPUT
78 : !! ier= exit status, a non-zero value meaning there is an error
79 : !!
80 : !! SIDE EFFECTS
81 : !! vrecv= receive buffer
82 : !!
83 : !! SOURCE
84 :
85 140 : subroutine xmpi_exch_int2d(vsend,nt,sender,vrecv,recever,comm,mtag,ier)
86 :
87 : !Arguments----------------
88 : integer,intent(in) :: mtag,nt
89 : integer, DEV_CONTARRD intent(in) :: vsend(:,:)
90 : integer, DEV_CONTARRD intent(inout) :: vrecv(:,:)
91 : integer,intent(in) :: sender,recever,comm
92 : integer,intent(out) :: ier
93 :
94 : !Local variables--------------
95 : #if defined HAVE_MPI
96 : integer :: statux(MPI_STATUS_SIZE)
97 : integer :: tag,me
98 : #endif
99 :
100 : ! *************************************************************************
101 :
102 140 : ier=0
103 : #if defined HAVE_MPI
104 140 : if (sender==recever.or.comm==MPI_COMM_NULL.or.nt==0) return
105 140 : call MPI_COMM_RANK(comm,me,ier)
106 140 : tag = MOD(mtag, xmpi_tag_ub)
107 :
108 140 : if (recever==me) then
109 70 : call MPI_RECV(vrecv,nt,MPI_INTEGER,sender,tag,comm,statux,ier)
110 : end if
111 140 : if (sender==me) then
112 70 : call MPI_SEND(vsend,nt,MPI_INTEGER,recever,tag,comm,ier)
113 : end if
114 : #endif
115 :
116 : end subroutine xmpi_exch_int2d
117 : !!***
118 :
119 : !--------------------------------------------------------------------
120 :
121 : !!****f* ABINIT/xmpi_exch_dp1d
122 : !! NAME
123 : !! xmpi_exch_dp1d
124 : !!
125 : !! FUNCTION
126 : !! Sends and receives data.
127 : !! Target: double precision one-dimensional arrays.
128 : !!
129 : !! INPUTS
130 : !! mtag= message tag
131 : !! nt= vector length
132 : !! vsend= send buffer
133 : !! sender= node sending the data
134 : !! recever= node receiving the data
135 : !! comm= MPI communicator
136 : !!
137 : !! OUTPUT
138 : !! ier= exit status, a non-zero value meaning there is an error
139 : !!
140 : !! SIDE EFFECTS
141 : !! vrecv= receive buffer
142 : !!
143 : !! SOURCE
144 :
145 0 : subroutine xmpi_exch_dp1d(vsend,nt,sender,vrecv,recever,comm,mtag,ier)
146 :
147 : !Arguments----------------
148 : integer,intent(in) :: mtag,nt
149 : real(dp), DEV_CONTARRD intent(in) :: vsend(:)
150 : real(dp), DEV_CONTARRD intent(inout) :: vrecv(:)
151 : integer,intent(in) :: sender,recever,comm
152 : integer,intent(out) :: ier
153 :
154 : !Local variables--------------
155 : #if defined HAVE_MPI
156 : integer :: statux(MPI_STATUS_SIZE)
157 : integer :: me,my_dt,my_op,tag
158 : integer(kind=int64) :: ntot
159 : #endif
160 :
161 : ! *************************************************************************
162 :
163 0 : ier=0
164 : #if defined HAVE_MPI
165 0 : if (sender==recever.or.comm==MPI_COMM_NULL.or.nt==0) return
166 0 : call MPI_COMM_RANK(comm,me,ier)
167 0 : tag = MOD(mtag, xmpi_tag_ub)
168 :
169 : !The dimension can be greater than a 32bit integer
170 : !We use a INT64 to store it. If it is too large, we switch to an
171 : !alternate routine because MPI<4 doesnt handle 64 bit counts.
172 0 : ntot=int(nt,kind=int64)
173 :
174 0 : if (recever==me) then
175 : if (ntot<=xmpi_maxint32_64) then
176 0 : call MPI_RECV(vrecv,nt,MPI_DOUBLE_PRECISION,sender,tag,comm,statux,ier)
177 : else
178 : call xmpi_largetype_create(ntot,MPI_DOUBLE_PRECISION,my_dt,my_op,MPI_OP_NULL)
179 : call MPI_RECV(vrecv,1,my_dt,sender,tag,comm,statux,ier)
180 : call xmpi_largetype_free(my_dt,my_op)
181 : end if
182 : end if
183 0 : if (sender==me) then
184 : if (ntot<=xmpi_maxint32_64) then
185 0 : call MPI_SEND(vsend,nt,MPI_DOUBLE_PRECISION,recever,tag,comm,ier)
186 : else
187 : call xmpi_largetype_create(ntot,MPI_DOUBLE_PRECISION,my_dt,my_op,MPI_OP_NULL)
188 : call MPI_SEND(vsend,1,my_dt,recever,tag,comm,ier)
189 : call xmpi_largetype_free(my_dt,my_op)
190 : end if
191 : end if
192 : #endif
193 :
194 : end subroutine xmpi_exch_dp1d
195 : !!***
196 :
197 : !--------------------------------------------------------------------
198 :
199 : !!****f* ABINIT/xmpi_exch_dp2d
200 : !! NAME
201 : !! xmpi_exch_dp2d
202 : !!
203 : !! FUNCTION
204 : !! Sends and receives data.
205 : !! Target: double precision two-dimensional arrays.
206 : !!
207 : !! INPUTS
208 : !! mtag= message tag
209 : !! nt= vector length
210 : !! vsend= send buffer
211 : !! sender= node sending the data
212 : !! recever= node receiving the data
213 : !! comm= MPI communicator
214 : !!
215 : !! OUTPUT
216 : !! ier= exit status, a non-zero value meaning there is an error
217 : !!
218 : !! SIDE EFFECTS
219 : !! vrecv= receive buffer
220 : !!
221 : !! SOURCE
222 :
223 148 : subroutine xmpi_exch_dp2d(vsend,nt,sender,vrecv,recever,comm,mtag,ier)
224 :
225 : !Arguments----------------
226 : integer,intent(in) :: mtag,nt
227 : real(dp), DEV_CONTARRD intent(in) :: vsend(:,:)
228 : real(dp), DEV_CONTARRD intent(inout) :: vrecv(:,:)
229 : integer,intent(in) :: sender,recever,comm
230 : integer,intent(out) :: ier
231 :
232 : !Local variables--------------
233 : #if defined HAVE_MPI
234 : integer :: statux(MPI_STATUS_SIZE)
235 : integer :: me,my_dt,my_op,tag
236 : integer(kind=int64) :: ntot
237 : #endif
238 :
239 : ! *************************************************************************
240 :
241 148 : ier=0
242 : #if defined HAVE_MPI
243 148 : if (sender==recever.or.comm==MPI_COMM_NULL.or.nt==0) return
244 148 : call MPI_COMM_RANK(comm,me,ier)
245 148 : tag = MOD(mtag, xmpi_tag_ub)
246 :
247 : !The dimension can be greater than a 32bit integer
248 : !We use a INT64 to store it. If it is too large, we switch to an
249 : !alternate routine because MPI<4 doesnt handle 64 bit counts.
250 148 : ntot=int(nt,kind=int64)
251 :
252 148 : if (recever==me) then
253 : if (ntot<=xmpi_maxint32_64) then
254 74 : call MPI_RECV(vrecv,nt,MPI_DOUBLE_PRECISION,sender,tag,comm,statux,ier)
255 : else
256 : call xmpi_largetype_create(ntot,MPI_DOUBLE_PRECISION,my_dt,my_op,MPI_OP_NULL)
257 : call MPI_RECV(vrecv,1,my_dt,sender,tag,comm,statux,ier)
258 : call xmpi_largetype_free(my_dt,my_op)
259 : end if
260 : end if
261 148 : if (sender==me) then
262 : if (ntot<=xmpi_maxint32_64) then
263 74 : call MPI_SEND(vsend,nt,MPI_DOUBLE_PRECISION,recever,tag,comm,ier)
264 : else
265 : call xmpi_largetype_create(ntot,MPI_DOUBLE_PRECISION,my_dt,my_op,MPI_OP_NULL)
266 : call MPI_SEND(vsend,1,my_dt,recever,tag,comm,ier)
267 : call xmpi_largetype_free(my_dt,my_op)
268 : end if
269 : end if
270 : #endif
271 :
272 : end subroutine xmpi_exch_dp2d
273 : !!***
274 :
275 : !--------------------------------------------------------------------
276 :
277 : !!****f* ABINIT/xmpi_exch_dp3d
278 : !! NAME
279 : !! xmpi_exch_dp3d
280 : !!
281 : !! FUNCTION
282 : !! Sends and receives data.
283 : !! Target: double precision three-dimensional arrays.
284 : !!
285 : !! INPUTS
286 : !! mtag= message tag
287 : !! nt= vector length
288 : !! vsend= send buffer
289 : !! sender= node sending the data
290 : !! recever= node receiving the data
291 : !! comm= MPI communicator
292 : !!
293 : !! OUTPUT
294 : !! ier= exit status, a non-zero value meaning there is an error
295 : !!
296 : !! SIDE EFFECTS
297 : !! vrecv= receive buffer
298 : !!
299 : !! SOURCE
300 :
301 380 : subroutine xmpi_exch_dp3d(vsend,nt,sender,vrecv,recever,comm,mtag,ier)
302 :
303 : !Arguments----------------
304 : integer,intent(in) :: mtag,nt
305 : real(dp), DEV_CONTARRD intent(in) :: vsend(:,:,:)
306 : real(dp), DEV_CONTARRD intent(inout) :: vrecv(:,:,:)
307 : integer,intent(in) :: sender,recever,comm
308 : integer,intent(out) :: ier
309 :
310 : !Local variables--------------
311 : #if defined HAVE_MPI
312 : integer :: statux(MPI_STATUS_SIZE)
313 : integer :: me,my_dt,my_op,tag
314 : integer(kind=int64) :: ntot
315 : #endif
316 :
317 : ! *************************************************************************
318 :
319 380 : ier=0
320 : #if defined HAVE_MPI
321 380 : if (sender==recever.or.comm==MPI_COMM_NULL.or.nt==0) return
322 320 : call MPI_COMM_RANK(comm,me,ier)
323 320 : tag = MOD(mtag, xmpi_tag_ub)
324 :
325 : !The dimension can be greater than a 32bit integer
326 : !We use a INT64 to store it. If it is too large, we switch to an
327 : !alternate routine because MPI<4 doesnt handle 64 bit counts.
328 320 : ntot=int(nt,kind=int64)
329 :
330 320 : if (recever==me) then
331 : if (ntot<=xmpi_maxint32_64) then
332 160 : call MPI_RECV(vrecv,nt,MPI_DOUBLE_PRECISION,sender,tag,comm,statux,ier)
333 : else
334 : call xmpi_largetype_create(ntot,MPI_DOUBLE_PRECISION,my_dt,my_op,MPI_OP_NULL)
335 : call MPI_RECV(vrecv,1,my_dt,sender,tag,comm,statux,ier)
336 : call xmpi_largetype_free(my_dt,my_op)
337 : end if
338 : end if
339 320 : if (sender==me) then
340 : if (ntot<=xmpi_maxint32_64) then
341 160 : call MPI_SEND(vsend,nt,MPI_DOUBLE_PRECISION,recever,tag,comm,ier)
342 : else
343 : call xmpi_largetype_create(ntot,MPI_DOUBLE_PRECISION,my_dt,my_op,MPI_OP_NULL)
344 : call MPI_SEND(vsend,1,my_dt,recever,tag,comm,ier)
345 : call xmpi_largetype_free(my_dt,my_op)
346 : end if
347 : end if
348 : #endif
349 :
350 : end subroutine xmpi_exch_dp3d
351 : !!***
352 :
353 : !--------------------------------------------------------------------
354 :
355 : !!****f* ABINIT/xmpi_exch_dp4d_tag
356 : !! NAME
357 : !! xmpi_exch_dp4d_tag
358 : !!
359 : !! FUNCTION
360 : !! Sends and receives data.
361 : !! Target: double precision four-dimensional arrays.
362 : !!
363 : !! INPUTS
364 : !! mtag= message tag
365 : !! nt= vector length
366 : !! vsend= send buffer
367 : !! sender= node sending the data
368 : !! recever= node receiving the data
369 : !! comm= MPI communicator
370 : !!
371 : !! OUTPUT
372 : !! ier= exit status, a non-zero value meaning there is an error
373 : !!
374 : !! SIDE EFFECTS
375 : !! vrecv= receive buffer
376 : !!
377 : !! SOURCE
378 :
379 0 : subroutine xmpi_exch_dp4d(vsend,nt,sender,vrecv,recever,comm,mtag,ier)
380 :
381 : !Arguments----------------
382 : integer,intent(in) :: mtag,nt
383 : real(dp), DEV_CONTARRD intent(in) :: vsend(:,:,:,:)
384 : real(dp), DEV_CONTARRD intent(inout) :: vrecv(:,:,:,:)
385 : integer,intent(in) :: sender,recever,comm
386 : integer,intent(out) :: ier
387 :
388 : !Local variables--------------
389 : #if defined HAVE_MPI
390 : integer :: statux(MPI_STATUS_SIZE)
391 : integer :: me,my_dt,my_op,tag
392 : integer(kind=int64) :: ntot
393 : #endif
394 :
395 : ! *************************************************************************
396 :
397 0 : ier=0
398 : #if defined HAVE_MPI
399 0 : if (sender==recever.or.comm==MPI_COMM_NULL.or.nt==0) return
400 0 : call MPI_COMM_RANK(comm,me,ier)
401 0 : tag = MOD(mtag, xmpi_tag_ub)
402 :
403 : !The dimension can be greater than a 32bit integer
404 : !We use a INT64 to store it. If it is too large, we switch to an
405 : !alternate routine because MPI<4 doesnt handle 64 bit counts.
406 0 : ntot=int(nt,kind=int64)
407 :
408 0 : if (recever==me) then
409 : if (ntot<=xmpi_maxint32_64) then
410 0 : call MPI_RECV(vrecv,nt,MPI_DOUBLE_PRECISION,sender,tag,comm,statux,ier)
411 : else
412 : call xmpi_largetype_create(ntot,MPI_DOUBLE_PRECISION,my_dt,my_op,MPI_OP_NULL)
413 : call MPI_RECV(vrecv,1,my_dt,sender,tag,comm,statux,ier)
414 : call xmpi_largetype_free(my_dt,my_op)
415 : end if
416 : end if
417 0 : if (sender==me) then
418 : if (ntot<=xmpi_maxint32_64) then
419 0 : call MPI_SEND(vsend,nt,MPI_DOUBLE_PRECISION,recever,tag,comm,ier)
420 : else
421 : call xmpi_largetype_create(ntot,MPI_DOUBLE_PRECISION,my_dt,my_op,MPI_OP_NULL)
422 : call MPI_SEND(vsend,1,my_dt,recever,tag,comm,ier)
423 : call xmpi_largetype_free(my_dt,my_op)
424 : end if
425 : end if
426 : #endif
427 :
428 : end subroutine xmpi_exch_dp4d
429 : !!***
430 :
431 : !--------------------------------------------------------------------
432 :
433 : !!****f* ABINIT/xmpi_exch_dp5d_tag
434 : !! NAME
435 : !! xmpi_exch_dp5d_tag
436 : !!
437 : !! FUNCTION
438 : !! Sends and receives data.
439 : !! Target: double precision five-dimensional arrays.
440 : !!
441 : !! INPUTS
442 : !! mtag= message tag
443 : !! nt= vector length
444 : !! vsend= send buffer
445 : !! sender= node sending the data
446 : !! recever= node receiving the data
447 : !! comm= MPI communicator
448 : !!
449 : !! OUTPUT
450 : !! ier= exit status, a non-zero value meaning there is an error
451 : !!
452 : !! SIDE EFFECTS
453 : !! vrecv= receive buffer
454 : !!
455 : !! SOURCE
456 :
457 0 : subroutine xmpi_exch_dp5d(vsend,nt,sender,vrecv,recever,comm,mtag,ier)
458 :
459 : !Arguments----------------
460 : integer,intent(in) :: mtag,nt
461 : real(dp), DEV_CONTARRD intent(in) :: vsend(:,:,:,:,:)
462 : real(dp), DEV_CONTARRD intent(inout) :: vrecv(:,:,:,:,:)
463 : integer,intent(in) :: sender,recever,comm
464 : integer,intent(out) :: ier
465 :
466 : !Local variables--------------
467 : #if defined HAVE_MPI
468 : integer :: statux(MPI_STATUS_SIZE)
469 : integer :: me,my_dt,my_op,tag
470 : integer(kind=int64) :: ntot
471 : #endif
472 :
473 : ! *************************************************************************
474 :
475 0 : ier=0
476 : #if defined HAVE_MPI
477 0 : if (sender==recever.or.comm==MPI_COMM_NULL.or.nt==0) return
478 0 : call MPI_COMM_RANK(comm,me,ier)
479 0 : tag = MOD(mtag,xmpi_tag_ub)
480 :
481 : !The dimension can be greater than a 32bit integer
482 : !We use a INT64 to store it. If it is too large, we switch to an
483 : !alternate routine because MPI<4 doesnt handle 64 bit counts.
484 0 : ntot=int(nt,kind=int64)
485 :
486 0 : if (recever==me) then
487 : if (ntot<=xmpi_maxint32_64) then
488 0 : call MPI_RECV(vrecv,nt,MPI_DOUBLE_PRECISION,sender,tag,comm,statux,ier)
489 : else
490 : call xmpi_largetype_create(ntot,MPI_DOUBLE_PRECISION,my_dt,my_op,MPI_OP_NULL)
491 : call MPI_RECV(vrecv,1,my_dt,sender,tag,comm,statux,ier)
492 : call xmpi_largetype_free(my_dt,my_op)
493 : end if
494 : end if
495 0 : if (sender==me) then
496 : if (ntot<=xmpi_maxint32_64) then
497 0 : call MPI_SEND(vsend,nt,MPI_DOUBLE_PRECISION,recever,tag,comm,ier)
498 : else
499 : call xmpi_largetype_create(ntot,MPI_DOUBLE_PRECISION,my_dt,my_op,MPI_OP_NULL)
500 : call MPI_SEND(vsend,1,my_dt,recever,tag,comm,ier)
501 : call xmpi_largetype_free(my_dt,my_op)
502 : end if
503 : end if
504 : #endif
505 :
506 : end subroutine xmpi_exch_dp5d
507 : !!***
508 :
509 : !--------------------------------------------------------------------
510 :
511 : !!****f* ABINIT/xmpi_exch_spc1d
512 : !! NAME
513 : !! xmpi_exch_spc1d
514 : !!
515 : !! FUNCTION
516 : !! Sends and receives data.
517 : !! Target: one-dimensional single precision complex arrays.
518 : !!
519 : !! SOURCE
520 :
521 0 : subroutine xmpi_exch_spc1d(vsend,n1,sender,vrecv,recever,comm,mtag,ier)
522 :
523 : !Arguments----------------
524 : integer,intent(in) :: mtag,n1
525 : complex(sp), DEV_CONTARRD intent(in) :: vsend(:)
526 : complex(sp), DEV_CONTARRD intent(inout) :: vrecv(:)
527 : integer,intent(in) :: sender,recever,comm
528 : integer,intent(out) :: ier
529 :
530 : !Local variables--------------
531 : #if defined HAVE_MPI
532 : integer :: statux(MPI_STATUS_SIZE)
533 : integer :: tag,me
534 : #endif
535 :
536 : ! *************************************************************************
537 :
538 0 : ier=0
539 : #if defined HAVE_MPI
540 0 : if (sender==recever.or.comm==MPI_COMM_NULL.or.(n1==0)) return
541 0 : call MPI_COMM_RANK(comm,me,ier)
542 0 : tag = MOD(mtag, xmpi_tag_ub)
543 :
544 0 : if (recever==me) then
545 0 : call MPI_RECV(vrecv,n1,MPI_COMPLEX,sender, tag,comm,statux,ier)
546 : end if
547 0 : if (sender==me) then
548 0 : call MPI_SEND(vsend,n1,MPI_COMPLEX,recever,tag,comm,ier)
549 : end if
550 : #endif
551 :
552 : end subroutine xmpi_exch_spc1d
553 : !!***
554 :
555 : !--------------------------------------------------------------------
556 :
557 : !!****f* ABINIT/xmpi_exch_dpc1d
558 : !! NAME
559 : !! xmpi_exch_dpc1d
560 : !!
561 : !! FUNCTION
562 : !! Sends and receives data.
563 : !! Target: one-dimensional double precision complex arrays.
564 : !!
565 : !! SOURCE
566 :
567 8 : subroutine xmpi_exch_dpc1d(vsend,n1,sender,vrecv,recever,comm,mtag,ier)
568 :
569 : !Arguments----------------
570 : integer,intent(in) :: mtag,n1
571 : complex(dp), DEV_CONTARRD intent(in) :: vsend(:)
572 : complex(dp), DEV_CONTARRD intent(inout) :: vrecv(:)
573 : integer,intent(in) :: sender,recever,comm
574 : integer,intent(out) :: ier
575 :
576 : !Local variables--------------
577 : #if defined HAVE_MPI
578 : integer :: statux(MPI_STATUS_SIZE)
579 : integer :: tag,me
580 : #endif
581 :
582 : ! *************************************************************************
583 :
584 8 : ier=0
585 : #if defined HAVE_MPI
586 8 : if (sender==recever.or.comm==MPI_COMM_NULL.or.n1==0) return
587 8 : call MPI_COMM_RANK(comm,me,ier)
588 8 : tag = MOD(mtag, xmpi_tag_ub)
589 :
590 8 : if (recever==me) then
591 4 : call MPI_RECV(vrecv,n1,MPI_DOUBLE_COMPLEX,sender, tag,comm,statux,ier)
592 : end if
593 8 : if (sender==me) then
594 4 : call MPI_SEND(vsend,n1,MPI_DOUBLE_COMPLEX,recever,tag,comm,ier)
595 : end if
596 : #endif
597 :
598 : end subroutine xmpi_exch_dpc1d
599 : !!***
600 :
601 : !--------------------------------------------------------------------
602 :
603 : !!****f* ABINIT/xmpi_exch_dpc2d
604 : !! NAME
605 : !! xmpi_exch_dpc2d
606 : !!
607 : !! FUNCTION
608 : !! Sends and receives data.
609 : !! Target: two-dimensional double precision complex arrays.
610 : !!
611 : !! SOURCE
612 :
613 0 : subroutine xmpi_exch_dpc2d(vsend,nt,sender,vrecv,recever,comm,mtag,ier)
614 :
615 : !Arguments----------------
616 : integer,intent(in) :: mtag,nt
617 : complex(dp), DEV_CONTARRD intent(in) :: vsend(:,:)
618 : complex(dp), DEV_CONTARRD intent(inout) :: vrecv(:,:)
619 : integer,intent(in) :: sender,recever,comm
620 : integer,intent(out) :: ier
621 :
622 : !Local variables--------------
623 : #if defined HAVE_MPI
624 : integer :: statux(MPI_STATUS_SIZE)
625 : integer :: tag,me
626 : #endif
627 : ! *************************************************************************
628 :
629 0 : ier=0
630 : #if defined HAVE_MPI
631 0 : if (sender==recever.or.comm==MPI_COMM_NULL.or.(nt==0)) return
632 0 : call MPI_COMM_RANK(comm,me,ier)
633 0 : tag = MOD(mtag, xmpi_tag_ub)
634 :
635 0 : if (recever==me) then
636 0 : call MPI_RECV(vrecv,nt,MPI_DOUBLE_COMPLEX,sender, tag,comm,statux,ier)
637 : end if
638 0 : if (sender==me) then
639 0 : call MPI_SEND(vsend,nt,MPI_DOUBLE_COMPLEX,recever,tag,comm,ier)
640 : end if
641 : #endif
642 :
643 : end subroutine xmpi_exch_dpc2d
644 : !!***
|