Octopus
mpi.F90
Go to the documentation of this file.
1!! Copyright (C) 2005-2006 Heiko Appel, Florian Lorenzen
2!!
3!! This program is free software; you can redistribute it and/or modify
4!! it under the terms of the GNU General Public License as published by
5!! the Free Software Foundation; either version 2, or (at your option)
6!! any later version.
7!!
8!! This program is distributed in the hope that it will be useful,
9!! but WITHOUT ANY WARRANTY; without even the implied warranty of
10!! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11!! GNU General Public License for more details.
12!!
13!! You should have received a copy of the GNU General Public License
14!! along with this program; if not, write to the Free Software
15!! Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
16!! 02110-1301, USA.
17!!
18
19#include "global.h"
20
21module mpi_oct_m
22#ifdef HAVE_MPI
23 use mpi_f08
24#else
26#endif
27 use blacs_oct_m
28 use loct_oct_m
30 use iso_c_binding
31 use, intrinsic :: iso_fortran_env
32#ifdef HAVE_OPENMP
33 use omp_lib
34#endif
35
36
37 implicit none
38
39 ! I do not make this module private on purpose, so that the symbols defined either in
40 ! module mpi, or in mpif.h are exported
41
43 type(MPI_Comm), parameter, public :: MPI_COMM_UNDEFINED = mpi_comm(-1)
44
46 integer, parameter, private :: ROOT_PROCESS = 0
47
49 type mpi_grp_t
50 ! Components are public by default
51 type(MPI_Comm) :: comm = mpi_comm_undefined
52 integer :: size = 0
53 integer :: rank = 0
54 contains
55 ! Wrapper functions for common MPI calls
56 ! We do not check the error code in any of those wrappers because the behavior of
57 ! an application is undefined after an MPI error according to the standard. The
58 ! default is to let the application crash in such a case with an error message
59 ! from the MPI runtime.
60 procedure :: barrier => mpi_grp_barrier
61 procedure :: dmpi_grp_scatterv, zmpi_grp_scatterv, impi_grp_scatterv, lmpi_grp_scatterv
62 generic :: scatterv => dmpi_grp_scatterv, zmpi_grp_scatterv, impi_grp_scatterv, lmpi_grp_scatterv
63 procedure :: dmpi_grp_scatterv_i8, zmpi_grp_scatterv_i8, impi_grp_scatterv_i8, lmpi_grp_scatterv_i8
64 generic :: scatterv => dmpi_grp_scatterv_i8, zmpi_grp_scatterv_i8, impi_grp_scatterv_i8, lmpi_grp_scatterv_i8
65 procedure :: dmpi_grp_gatherv, zmpi_grp_gatherv, impi_grp_gatherv, lmpi_grp_gatherv
66 generic :: gatherv => dmpi_grp_gatherv, zmpi_grp_gatherv, impi_grp_gatherv, lmpi_grp_gatherv
67 procedure :: dmpi_grp_gather_0, zmpi_grp_gather_0, impi_grp_gather_0, lmpi_grp_gather_0
68 generic :: gather => dmpi_grp_gather_0, zmpi_grp_gather_0, impi_grp_gather_0, lmpi_grp_gather_0
69 procedure :: dmpi_grp_gatherv_i8, zmpi_grp_gatherv_i8, impi_grp_gatherv_i8, lmpi_grp_gatherv_i8
70 generic :: gatherv => dmpi_grp_gatherv_i8, zmpi_grp_gatherv_i8, impi_grp_gatherv_i8, lmpi_grp_gatherv_i8
71 procedure :: dmpi_grp_alltoallv, zmpi_grp_alltoallv, impi_grp_alltoallv, lmpi_grp_alltoallv
72 generic :: alltoallv => dmpi_grp_alltoallv, zmpi_grp_alltoallv, impi_grp_alltoallv, lmpi_grp_alltoallv
73 procedure :: dmpi_grp_alltoallv_2, zmpi_grp_alltoallv_2, impi_grp_alltoallv_2, lmpi_grp_alltoallv_2
74 generic :: alltoallv => dmpi_grp_alltoallv_2, zmpi_grp_alltoallv_2, impi_grp_alltoallv_2, lmpi_grp_alltoallv_2
75 procedure :: dmpi_grp_alltoallv_3, zmpi_grp_alltoallv_3, impi_grp_alltoallv_3, lmpi_grp_alltoallv_3
76 generic :: alltoallv => dmpi_grp_alltoallv_3, zmpi_grp_alltoallv_3, impi_grp_alltoallv_3, lmpi_grp_alltoallv_3
77 procedure :: dmpi_grp_alltoallv_i8, zmpi_grp_alltoallv_i8, impi_grp_alltoallv_i8, lmpi_grp_alltoallv_i8
78 generic :: alltoallv => dmpi_grp_alltoallv_i8, zmpi_grp_alltoallv_i8, impi_grp_alltoallv_i8, lmpi_grp_alltoallv_i8
79 procedure :: dmpi_grp_alltoall, zmpi_grp_alltoall, impi_grp_alltoall, lmpi_grp_alltoall
80 generic :: alltoall => dmpi_grp_alltoall, zmpi_grp_alltoall, impi_grp_alltoall, lmpi_grp_alltoall
81 procedure :: dmpi_grp_allgatherv, zmpi_grp_allgatherv, impi_grp_allgatherv, lmpi_grp_allgatherv
82 generic :: allgatherv => dmpi_grp_allgatherv, zmpi_grp_allgatherv, impi_grp_allgatherv, lmpi_grp_allgatherv
83 procedure :: dmpi_grp_allgatherv_2, zmpi_grp_allgatherv_2, impi_grp_allgatherv_2, lmpi_grp_allgatherv_2
84 generic :: allgatherv => dmpi_grp_allgatherv_2, zmpi_grp_allgatherv_2, impi_grp_allgatherv_2, lmpi_grp_allgatherv_2
85 procedure :: dmpi_grp_allgatherv_3, zmpi_grp_allgatherv_3, impi_grp_allgatherv_3, lmpi_grp_allgatherv_3
86 generic :: allgatherv => dmpi_grp_allgatherv_3, zmpi_grp_allgatherv_3, impi_grp_allgatherv_3, lmpi_grp_allgatherv_3
87 procedure :: dmpi_grp_allgatherv_3_1, zmpi_grp_allgatherv_3_1, impi_grp_allgatherv_3_1, lmpi_grp_allgatherv_3_1
88 generic :: allgatherv => dmpi_grp_allgatherv_3_1, zmpi_grp_allgatherv_3_1, impi_grp_allgatherv_3_1, lmpi_grp_allgatherv_3_1
89 procedure :: dmpi_grp_allgatherv_i8, zmpi_grp_allgatherv_i8, impi_grp_allgatherv_i8, lmpi_grp_allgatherv_i8
90 generic :: allgatherv => dmpi_grp_allgatherv_i8, zmpi_grp_allgatherv_i8, impi_grp_allgatherv_i8, lmpi_grp_allgatherv_i8
91 procedure :: dmpi_grp_bcast, zmpi_grp_bcast, impi_grp_bcast, lmpi_grp_bcast
92 generic :: bcast => dmpi_grp_bcast, zmpi_grp_bcast, impi_grp_bcast, lmpi_grp_bcast
93 procedure :: dmpi_grp_bcast_0, zmpi_grp_bcast_0, impi_grp_bcast_0, lmpi_grp_bcast_0
94 generic :: bcast => dmpi_grp_bcast_0, zmpi_grp_bcast_0, impi_grp_bcast_0, lmpi_grp_bcast_0
95 procedure :: dmpi_grp_bcast_2, zmpi_grp_bcast_2, impi_grp_bcast_2, lmpi_grp_bcast_2
96 generic :: bcast => dmpi_grp_bcast_2, zmpi_grp_bcast_2, impi_grp_bcast_2, lmpi_grp_bcast_2
97 procedure :: dmpi_grp_bcast_3, zmpi_grp_bcast_3, impi_grp_bcast_3, lmpi_grp_bcast_3
98 generic :: bcast => dmpi_grp_bcast_3, zmpi_grp_bcast_3, impi_grp_bcast_3, lmpi_grp_bcast_3
99 procedure :: chmpi_grp_bcast_0, lompi_grp_bcast_0
100 generic :: bcast => chmpi_grp_bcast_0, lompi_grp_bcast_0
101 procedure :: dmpi_grp_bcast_0_l, zmpi_grp_bcast_0_l, impi_grp_bcast_0_l, lmpi_grp_bcast_0_l
102 generic :: bcast => dmpi_grp_bcast_0_l, zmpi_grp_bcast_0_l, impi_grp_bcast_0_l, lmpi_grp_bcast_0_l
103 procedure :: dmpi_grp_allreduce, zmpi_grp_allreduce, impi_grp_allreduce, lmpi_grp_allreduce
104 generic :: allreduce => dmpi_grp_allreduce, zmpi_grp_allreduce, impi_grp_allreduce, lmpi_grp_allreduce
105 procedure :: dmpi_grp_allreduce_2, zmpi_grp_allreduce_2, impi_grp_allreduce_2, lmpi_grp_allreduce_2
106 generic :: allreduce => dmpi_grp_allreduce_2, zmpi_grp_allreduce_2, impi_grp_allreduce_2, lmpi_grp_allreduce_2
107 procedure :: dmpi_grp_allreduce_3, zmpi_grp_allreduce_3, impi_grp_allreduce_3, lmpi_grp_allreduce_3
108 generic :: allreduce => dmpi_grp_allreduce_3, zmpi_grp_allreduce_3, impi_grp_allreduce_3, lmpi_grp_allreduce_3
109 procedure :: dmpi_grp_allreduce_0, zmpi_grp_allreduce_0, impi_grp_allreduce_0, lmpi_grp_allreduce_0
110 generic :: allreduce => dmpi_grp_allreduce_0, zmpi_grp_allreduce_0, impi_grp_allreduce_0, lmpi_grp_allreduce_0
111 procedure :: lompi_grp_allreduce_0
112 generic :: allreduce => lompi_grp_allreduce_0
113 procedure :: dmpi_grp_allreduce_inplace_0, zmpi_grp_allreduce_inplace_0
114 procedure :: impi_grp_allreduce_inplace_0, lmpi_grp_allreduce_inplace_0
115 procedure :: lompi_grp_allreduce_inplace_0
116 generic :: allreduce_inplace => dmpi_grp_allreduce_inplace_0, zmpi_grp_allreduce_inplace_0
117 generic :: allreduce_inplace => impi_grp_allreduce_inplace_0, lmpi_grp_allreduce_inplace_0
118 generic :: allreduce_inplace => lompi_grp_allreduce_inplace_0
119 procedure :: dmpi_grp_allreduce_inplace_1, zmpi_grp_allreduce_inplace_1, &
120 impi_grp_allreduce_inplace_1, lmpi_grp_allreduce_inplace_1
121 generic :: allreduce_inplace => dmpi_grp_allreduce_inplace_1, zmpi_grp_allreduce_inplace_1, &
122 impi_grp_allreduce_inplace_1, lmpi_grp_allreduce_inplace_1
123 procedure :: dmpi_grp_allreduce_inplace_2, zmpi_grp_allreduce_inplace_2, &
124 impi_grp_allreduce_inplace_2, lmpi_grp_allreduce_inplace_2
125 generic :: allreduce_inplace => dmpi_grp_allreduce_inplace_2, zmpi_grp_allreduce_inplace_2, &
126 impi_grp_allreduce_inplace_2, lmpi_grp_allreduce_inplace_2
127 procedure :: dmpi_grp_allgather, zmpi_grp_allgather, impi_grp_allgather, lmpi_grp_allgather
128 generic :: allgather => dmpi_grp_allgather, zmpi_grp_allgather, impi_grp_allgather, lmpi_grp_allgather
129 procedure :: dmpi_grp_allgather_0, zmpi_grp_allgather_0, impi_grp_allgather_0, lmpi_grp_allgather_0
130 generic :: allgather => dmpi_grp_allgather_0, zmpi_grp_allgather_0, impi_grp_allgather_0, lmpi_grp_allgather_0
131 procedure :: dmpi_grp_recv, zmpi_grp_recv, impi_grp_recv, lmpi_grp_recv
132 generic :: recv => dmpi_grp_recv, zmpi_grp_recv, impi_grp_recv, lmpi_grp_recv
133 procedure :: dmpi_grp_recv_0, zmpi_grp_recv_0, impi_grp_recv_0, lmpi_grp_recv_0
134 generic :: recv => dmpi_grp_recv_0, zmpi_grp_recv_0, impi_grp_recv_0, lmpi_grp_recv_0
135 procedure :: dmpi_grp_recv_2, zmpi_grp_recv_2, impi_grp_recv_2, lmpi_grp_recv_2
136 generic :: recv => dmpi_grp_recv_2, zmpi_grp_recv_2, impi_grp_recv_2, lmpi_grp_recv_2
139 procedure :: lompi_grp_recv_0
140 generic :: recv => lompi_grp_recv_0
143 procedure :: dmpi_grp_send_0, zmpi_grp_send_0, impi_grp_send_0, lmpi_grp_send_0
144 generic :: send => dmpi_grp_send_0, zmpi_grp_send_0, impi_grp_send_0, lmpi_grp_send_0
149 procedure :: lompi_grp_send_0
150 generic :: send => lompi_grp_send_0
172 generic :: wait => mpi_grp_wait, mpi_grp_waitall
173 procedure :: abort => mpi_grp_abort
174 procedure :: is_root => mpi_grp_is_root
175 end type mpi_grp_t
177 type(mpi_grp_t), public :: mpi_world
179 private :: not_in_openmp
182contains
189 subroutine mpi_init_comm(comm)
190 type(mpi_comm), intent(out) :: comm
191#if defined(HAVE_MPI)
192#if defined(HAVE_OPENMP)
193 integer :: provided
195 call mpi_init_thread(mpi_thread_funneled, provided)
196#else
197 call mpi_init()
198#endif
199 comm = mpi_comm_world
200#else
201 comm = mpi_comm_undefined
202#endif
204 end subroutine mpi_init_comm
208 subroutine blacs_init()
209#if defined(HAVE_MPI)
210#ifdef HAVE_SCALAPACK
211 integer :: iam, nprocs
212 integer :: blacs_default_system_context
213
214 ! Determine my process number and the number of processes in machine
215 call blacs_pinfo(iam, nprocs)
217 ! If machine needs additional set up, do it now
218 if (nprocs < 1) then
219 call blacs_setup(iam, mpi_world%size)
220 end if
222 ! blacs_gridinit() or blacs_gridmap() must be called, else
223 ! blacs_exit() triggers an error with openmpi:
224 ! *** An error occurred in MPI_Type_free
225 ! *** MPI_ERR_TYPE: invalid datatype
226 call blacs_get(0, 0, blacs_default_system_context)
227 call blacs_gridinit(blacs_default_system_context, 'R', mpi_world%size, 1)
228 call blacs_gridexit(blacs_default_system_context)
229#endif
230#endif
231 end subroutine blacs_init
235 subroutine mpi_mod_end()
237#ifdef HAVE_SCALAPACK
238 if (mpi_world%comm /= mpi_comm_undefined) call blacs_exit(1)
239#endif
241#if defined(HAVE_MPI)
242 ! end MPI, if we started it
243 if (mpi_world%comm /= mpi_comm_undefined) call mpi_finalize()
244#endif
246 end subroutine mpi_mod_end
253 subroutine mpi_grp_init(grp, comm)
254 type(mpi_grp_t), intent(out) :: grp
255 type(mpi_comm), intent(in) :: comm
257 grp%comm = comm
258#if defined(HAVE_MPI)
259 if (grp%comm == mpi_comm_null) grp%comm = mpi_comm_undefined
260#endif
262 if (grp%comm == mpi_comm_undefined) then
263 grp%rank = 0
264 grp%size = 1
265#if defined(HAVE_MPI)
266 else
267 call mpi_comm_rank(grp%comm, grp%rank)
268
269 call mpi_comm_size(grp%comm, grp%size)
270#endif
271 end if
272
273 end subroutine mpi_grp_init
274
275
276 logical &
277#ifndef have_openmp
278 pure &
279#endif
280 function not_in_openmp()
281
282#ifdef HAVE_OPENMP
283 not_in_openmp = .not. omp_in_parallel()
284#else
286#endif
287
288 end function not_in_openmp
289
290 ! ---------------------------------------------------------
291 subroutine mpi_grp_copy(mpi_grp_out, mpi_grp_in)
292 type(mpi_grp_t), intent(out) :: mpi_grp_out
293 type(mpi_grp_t), intent(in) :: mpi_grp_in
294
295 mpi_grp_out%comm = mpi_grp_in%comm
296 mpi_grp_out%size = mpi_grp_in%size
297 mpi_grp_out%rank = mpi_grp_in%rank
298 end subroutine mpi_grp_copy
299
300 ! ---------------------------------------------------------
301 subroutine mpi_grp_duplicate(mpi_grp_out, mpi_grp_in)
302 type(mpi_grp_t), intent(out) :: mpi_grp_out
303 type(mpi_grp_t), intent(in) :: mpi_grp_in
304
305#if defined(HAVE_MPI)
306 call mpi_comm_dup(mpi_grp_in%comm, mpi_grp_out%comm)
307 call mpi_comm_rank(mpi_grp_out%comm, mpi_grp_out%rank)
308 call mpi_comm_size(mpi_grp_out%comm, mpi_grp_out%size)
309#else
310 call mpi_grp_copy(mpi_grp_out, mpi_grp_in)
311#endif
312 end subroutine mpi_grp_duplicate
313
315 logical function mpi_grp_is_root(grp)
316 class(mpi_grp_t), intent(in) :: grp
317
318 mpi_grp_is_root = (grp%rank == root_process)
319 end function mpi_grp_is_root
320
321 ! ---------------------------------------------------------
322 subroutine mpi_grp_barrier(mpi_grp)
323 class(mpi_grp_t), intent(in) :: mpi_grp
324
325 if (mpi_grp%comm == mpi_comm_undefined) return
326#if defined(HAVE_MPI)
327 assert(not_in_openmp())
328
329 call mpi_debug_in(mpi_grp%comm, c_mpi_barrier)
330 call mpi_barrier(mpi_grp%comm)
331 call mpi_debug_out(mpi_grp%comm, c_mpi_barrier)
332#endif
333 end subroutine mpi_grp_barrier
334
335 ! ---------------------------------------------------------
336 subroutine chmpi_grp_bcast_0(mpi_grp, buf, cnt, sendtype, root)
337 class(mpi_grp_t), intent(in) :: mpi_grp
338 character(len=*), intent(inout) :: buf
339 integer, intent(in) :: cnt
340 type(mpi_datatype), intent(in) :: sendtype
341 integer, intent(in) :: root
342
343#if defined(HAVE_MPI)
344 assert(not_in_openmp())
346 call mpi_debug_in(mpi_grp%comm, c_mpi_bcast)
347 if (mpi_grp%comm /= mpi_comm_undefined) then
348 call mpi_bcast(buf, cnt, sendtype, root, mpi_grp%comm)
349 end if
350 call mpi_debug_out(mpi_grp%comm, c_mpi_bcast)
351#endif
352 end subroutine chmpi_grp_bcast_0
353
354 ! ---------------------------------------------------------
355 subroutine lompi_grp_bcast_0(mpi_grp, buf, cnt, sendtype, root)
356 class(mpi_grp_t), intent(in) :: mpi_grp
357 logical, intent(inout) :: buf
358 integer, intent(in) :: cnt
359 type(mpi_datatype), intent(in) :: sendtype
360 integer, intent(in) :: root
361
362#if defined(HAVE_MPI)
363 assert(not_in_openmp())
364
365 call mpi_debug_in(mpi_grp%comm, c_mpi_bcast)
366 if (mpi_grp%comm /= mpi_comm_undefined) then
367 call mpi_bcast(buf, cnt, sendtype, root, mpi_grp%comm)
368 end if
369 call mpi_debug_out(mpi_grp%comm, c_mpi_bcast)
370#endif
371 end subroutine lompi_grp_bcast_0
372
373 ! ---------------------------------------------------------
374 ! copy routine for serial case
375 subroutine lompi_grp_copy_0(sendbuf, recvbuf, count)
376 use iso_c_binding
377 logical, target, intent(in) :: sendbuf
378 logical, target, intent(out) :: recvbuf
379 integer, intent(in) :: count
380 integer :: ii
381 logical, pointer :: send(:), recv(:)
382
383 call c_f_pointer(c_loc(sendbuf), send, [count])
384 call c_f_pointer(c_loc(recvbuf), recv, [count])
385 do ii = 1, count
386 recv(ii) = send(ii)
387 end do
388 end subroutine lompi_grp_copy_0
389
390 ! ---------------------------------------------------------
391 subroutine lompi_grp_allreduce_0(mpi_grp, sendbuf, recvbuf, count, datatype, op)
392 class(mpi_grp_t), intent(in) :: mpi_grp
393 logical, intent(in) :: sendbuf
394 logical, intent(out) :: recvbuf
395 integer, intent(in) :: count
396 type(mpi_datatype), intent(in):: datatype
397 type(mpi_op), intent(in) :: op
398
399#if defined(HAVE_MPI)
401
402 call mpi_debug_in(mpi_grp%comm, c_mpi_allreduce)
403 if (mpi_grp%comm /= mpi_comm_undefined) then
404 call mpi_allreduce(sendbuf, recvbuf, count, datatype, op, &
405 mpi_grp%comm)
406 else
407 call lompi_grp_copy_0(sendbuf, recvbuf, count)
408 end if
409 call mpi_debug_out(mpi_grp%comm, c_mpi_allreduce)
410#else
411 call lompi_grp_copy_0(sendbuf, recvbuf, count)
412#endif
413 end subroutine lompi_grp_allreduce_0
414
415 ! ---------------------------------------------------------
416 subroutine lompi_grp_allreduce_inplace_0(mpi_grp, recvbuf, count, datatype, op)
417 class(mpi_grp_t), intent(in) :: mpi_grp
418 logical, intent(inout) :: recvbuf
419 integer, intent(in) :: count
420 type(mpi_datatype), intent(in) :: datatype
421 type(mpi_op), intent(in) :: op
422
423#if defined(HAVE_MPI)
424 assert(not_in_openmp())
425
426 call mpi_debug_in(mpi_grp%comm, c_mpi_allreduce)
427 if (mpi_grp%comm /= mpi_comm_undefined) then
428 call mpi_allreduce(mpi_in_place, recvbuf, count, datatype, op, &
429 mpi_grp%comm)
430 end if
431 call mpi_debug_out(mpi_grp%comm, c_mpi_allreduce)
432#endif
433 end subroutine lompi_grp_allreduce_inplace_0
434
435 ! ---------------------------------------------------------
436 subroutine lompi_grp_recv_0(mpi_grp, recvbuf, recvcount, recvtype, source, tag)
437 class(mpi_grp_t), intent(in) :: mpi_grp
438 logical, intent(out) :: recvbuf
439 integer, intent(in) :: recvcount
440 type(mpi_datatype),intent(in) :: recvtype
441 integer, intent(in) :: source
442 integer, optional, intent(in) :: tag
443
444 integer :: tag_
445
446 tag_ = 0
447 if (present(tag)) tag_ = tag
448 if (mpi_grp%comm == mpi_comm_undefined) return
449#if defined(HAVE_MPI)
451
452 call mpi_debug_in(mpi_grp%comm, c_mpi_recv)
453 call mpi_recv(recvbuf, recvcount, recvtype, source, tag_, mpi_grp%comm, mpi_status_ignore)
454 call mpi_debug_out(mpi_grp%comm, c_mpi_recv)
455#endif
456 end subroutine lompi_grp_recv_0
457
458 ! ---------------------------------------------------------
459 subroutine lompi_grp_send_0(mpi_grp, sendbuf, sendcount, sendtype, dest, tag)
460 class(mpi_grp_t), intent(in) :: mpi_grp
461 logical, intent(out) :: sendbuf
462 integer, intent(in) :: sendcount
463 type(mpi_datatype),intent(in) :: sendtype
464 integer, intent(in) :: dest
465 integer, optional, intent(in) :: tag
466
467 integer :: tag_
468
469 tag_ = 0
470 if (present(tag)) tag_ = tag
471 if (mpi_grp%comm == mpi_comm_undefined) return
472#if defined(HAVE_MPI)
474
475 call mpi_debug_in(mpi_grp%comm, c_mpi_send)
476 call mpi_send(sendbuf, sendcount, sendtype, dest, tag_, mpi_grp%comm)
477 call mpi_debug_out(mpi_grp%comm, c_mpi_send)
478#endif
479 end subroutine lompi_grp_send_0
480
481 ! ---------------------------------------------------------
482 subroutine mpi_grp_wait(mpi_grp, request)
483 class(mpi_grp_t), intent(in) :: mpi_grp
484 type(mpi_request), intent(inout) :: request
485
486 if (mpi_grp%comm == mpi_comm_undefined) return
487#if defined(HAVE_MPI)
488 assert(not_in_openmp())
489
490 call mpi_debug_in(mpi_grp%comm, c_mpi_wait)
491 call mpi_wait(request, mpi_status_ignore)
492 call mpi_debug_out(mpi_grp%comm, c_mpi_wait)
493#endif
494 end subroutine mpi_grp_wait
495
496 ! ---------------------------------------------------------
497 subroutine mpi_grp_waitall(mpi_grp, count, requests)
498 class(mpi_grp_t), intent(in) :: mpi_grp
499 integer, intent(in) :: count
500 type(mpi_request), intent(inout) :: requests(:)
501
502 if (mpi_grp%comm == mpi_comm_undefined) return
503#if defined(HAVE_MPI)
504 assert(not_in_openmp())
505
506 call mpi_debug_in(mpi_grp%comm, c_mpi_waitall)
507 call mpi_waitall(count, requests, mpi_statuses_ignore)
508 call mpi_debug_out(mpi_grp%comm, c_mpi_waitall)
509#endif
510 end subroutine mpi_grp_waitall
512 ! ---------------------------------------------------------
513 subroutine mpi_grp_abort(mpi_grp)
514 class(mpi_grp_t), intent(in) :: mpi_grp
515
516 if (mpi_grp%comm /= mpi_comm_undefined) then
517#if defined(HAVE_MPI)
518 assert(not_in_openmp())
519
520 ! Abort with an arbitrary error code
521 call mpi_abort(mpi_grp%comm, 999)
522#endif
523 end if
524
525 end subroutine mpi_grp_abort
526
527 ! ---------------------------------------------------------
529 real(real64) function mpi_get_Wtime() result(now)
530#if defined(HAVE_MPI)
531 now = mpi_wtime()
532#else
533 now = loct_clock()
534#endif
535 end function mpi_get_wtime
536
537#include "undef.F90"
538#include "real.F90"
539#include "mpi_inc.F90"
540
541#include "undef.F90"
542#include "complex.F90"
543#include "mpi_inc.F90"
544
545#include "undef.F90"
546#include "integer.F90"
547#include "mpi_inc.F90"
548
549#include "undef.F90"
550#include "integer8.F90"
551#include "mpi_inc.F90"
552
553end module mpi_oct_m
554
555
556!! Local Variables:
557!! mode: f90
558!! coding: utf-8
559!! End:
This module contains interfaces for BLACS routines Interfaces are from http:
Definition: blacs.F90:27
integer, parameter, public c_mpi_allreduce
Definition: mpi_debug.F90:137
integer, parameter, public c_mpi_recv
Definition: mpi_debug.F90:137
subroutine, public mpi_debug_in(comm, index)
Definition: mpi_debug.F90:229
integer, parameter, public c_mpi_send
Definition: mpi_debug.F90:137
integer, parameter, public c_mpi_waitall
Definition: mpi_debug.F90:137
integer, parameter, public c_mpi_bcast
Definition: mpi_debug.F90:137
integer, parameter, public c_mpi_barrier
Definition: mpi_debug.F90:137
integer, parameter, public c_mpi_wait
Definition: mpi_debug.F90:137
subroutine, public mpi_debug_out(comm, index)
Definition: mpi_debug.F90:253
subroutine mpi_grp_abort(mpi_grp)
Definition: mpi.F90:528
subroutine impi_grp_irecv(mpi_grp, recvbuf, recvcount, recvtype, source, request, tag)
Definition: mpi.F90:3213
subroutine zmpi_grp_isend_0(mpi_grp, sendbuf, sendcount, sendtype, source, request, tag)
Definition: mpi.F90:2332
subroutine mpi_grp_duplicate(mpi_grp_out, mpi_grp_in)
Definition: mpi.F90:356
subroutine impi_grp_irecv_0(mpi_grp, recvbuf, recvcount, recvtype, source, request, tag)
Definition: mpi.F90:3189
subroutine lmpi_grp_send(mpi_grp, sendbuf, sendcount, sendtype, dest, tag)
Definition: mpi.F90:4073
subroutine lmpi_grp_isend(mpi_grp, sendbuf, sendcount, sendtype, source, request, tag)
Definition: mpi.F90:4311
subroutine lompi_grp_copy_0(sendbuf, recvbuf, count)
Definition: mpi.F90:412
subroutine zmpi_grp_irecv_0_int64(mpi_grp, recvbuf, recvcount, recvtype, source, request, tag)
Definition: mpi.F90:2187
subroutine zmpi_grp_recv_3(mpi_grp, recvbuf, recvcount, recvtype, source, tag)
Definition: mpi.F90:2072
subroutine blacs_init()
Initialize BLACS to enable use of SCALAPACK.
Definition: mpi.F90:293
subroutine impi_grp_send_3(mpi_grp, sendbuf, sendcount, sendtype, dest, tag)
Definition: mpi.F90:3141
real(real64) function, public mpi_get_wtime()
. Returns an elapsed time on the calling processor.
Definition: mpi.F90:544
subroutine dmpi_grp_irecv_3(mpi_grp, recvbuf, recvcount, recvtype, source, request, tag)
Definition: mpi.F90:1307
subroutine zmpi_grp_isend(mpi_grp, sendbuf, sendcount, sendtype, source, request, tag)
Definition: mpi.F90:2356
subroutine dmpi_grp_isend_3(mpi_grp, sendbuf, sendcount, sendtype, source, request, tag)
Definition: mpi.F90:1427
subroutine zmpi_grp_irecv_3(mpi_grp, recvbuf, recvcount, recvtype, source, request, tag)
Definition: mpi.F90:2284
subroutine lompi_grp_bcast_0(mpi_grp, buf, cnt, sendtype, root)
Definition: mpi.F90:401
logical function mpi_grp_is_root(grp)
Is the current MPI process of grpcomm, root.
Definition: mpi.F90:370
subroutine impi_grp_irecv_2(mpi_grp, recvbuf, recvcount, recvtype, source, request, tag)
Definition: mpi.F90:3237
subroutine zmpi_grp_irecv(mpi_grp, recvbuf, recvcount, recvtype, source, request, tag)
Definition: mpi.F90:2236
subroutine mpi_grp_copy(mpi_grp_out, mpi_grp_in)
Definition: mpi.F90:346
subroutine zmpi_grp_isend_3(mpi_grp, sendbuf, sendcount, sendtype, source, request, tag)
Definition: mpi.F90:2404
subroutine impi_grp_isend_2(mpi_grp, sendbuf, sendcount, sendtype, source, request, tag)
Definition: mpi.F90:3357
subroutine lmpi_grp_recv_3(mpi_grp, recvbuf, recvcount, recvtype, source, tag)
Definition: mpi.F90:4027
subroutine impi_grp_isend(mpi_grp, sendbuf, sendcount, sendtype, source, request, tag)
Definition: mpi.F90:3333
subroutine lompi_grp_allreduce_inplace_0(mpi_grp, recvbuf, count, datatype, op)
Definition: mpi.F90:441
subroutine impi_grp_isend_0_int64(mpi_grp, sendbuf, sendcount, sendtype, source, request, tag)
Definition: mpi.F90:3284
subroutine zmpi_grp_irecv_2(mpi_grp, recvbuf, recvcount, recvtype, source, request, tag)
Definition: mpi.F90:2260
subroutine dmpi_grp_isend_0(mpi_grp, sendbuf, sendcount, sendtype, source, request, tag)
Definition: mpi.F90:1355
subroutine dmpi_grp_irecv(mpi_grp, recvbuf, recvcount, recvtype, source, request, tag)
Definition: mpi.F90:1259
subroutine lmpi_grp_irecv_0_int64(mpi_grp, recvbuf, recvcount, recvtype, source, request, tag)
Definition: mpi.F90:4142
subroutine dmpi_grp_send_2(mpi_grp, sendbuf, sendcount, sendtype, dest, tag)
Definition: mpi.F90:1164
subroutine impi_grp_irecv_0_int64(mpi_grp, recvbuf, recvcount, recvtype, source, request, tag)
Definition: mpi.F90:3164
subroutine lompi_grp_recv_0(mpi_grp, recvbuf, recvcount, recvtype, source, tag)
Definition: mpi.F90:451
subroutine mpi_grp_wait(mpi_grp, request)
Definition: mpi.F90:497
subroutine lmpi_grp_irecv(mpi_grp, recvbuf, recvcount, recvtype, source, request, tag)
Definition: mpi.F90:4191
type(mpi_grp_t), public mpi_world
Definition: mpi.F90:270
subroutine impi_grp_isend_0(mpi_grp, sendbuf, sendcount, sendtype, source, request, tag)
Definition: mpi.F90:3309
subroutine mpi_mod_end()
Finalize MPI, and optionally BLACS.
Definition: mpi.F90:299
subroutine dmpi_grp_send(mpi_grp, sendbuf, sendcount, sendtype, dest, tag)
Definition: mpi.F90:1141
logical pure function, private not_in_openmp()
Definition: mpi.F90:335
subroutine dmpi_grp_recv_3(mpi_grp, recvbuf, recvcount, recvtype, source, tag)
Definition: mpi.F90:1095
subroutine zmpi_grp_send(mpi_grp, sendbuf, sendcount, sendtype, dest, tag)
Definition: mpi.F90:2118
subroutine lmpi_grp_isend_2(mpi_grp, sendbuf, sendcount, sendtype, source, request, tag)
Definition: mpi.F90:4335
subroutine mpi_grp_init(grp, comm)
Initialize MPI group instance.
Definition: mpi.F90:308
subroutine zmpi_grp_send_2(mpi_grp, sendbuf, sendcount, sendtype, dest, tag)
Definition: mpi.F90:2141
subroutine dmpi_grp_irecv_0(mpi_grp, recvbuf, recvcount, recvtype, source, request, tag)
Definition: mpi.F90:1235
subroutine impi_grp_irecv_3(mpi_grp, recvbuf, recvcount, recvtype, source, request, tag)
Definition: mpi.F90:3261
subroutine impi_grp_isend_3(mpi_grp, sendbuf, sendcount, sendtype, source, request, tag)
Definition: mpi.F90:3381
subroutine dmpi_grp_isend(mpi_grp, sendbuf, sendcount, sendtype, source, request, tag)
Definition: mpi.F90:1379
subroutine dmpi_grp_isend_2(mpi_grp, sendbuf, sendcount, sendtype, source, request, tag)
Definition: mpi.F90:1403
subroutine zmpi_grp_isend_0_int64(mpi_grp, sendbuf, sendcount, sendtype, source, request, tag)
Definition: mpi.F90:2307
subroutine lmpi_grp_irecv_3(mpi_grp, recvbuf, recvcount, recvtype, source, request, tag)
Definition: mpi.F90:4239
subroutine mpi_grp_barrier(mpi_grp)
Definition: mpi.F90:377
subroutine impi_grp_recv_3(mpi_grp, recvbuf, recvcount, recvtype, source, tag)
Definition: mpi.F90:3049
subroutine zmpi_grp_irecv_0(mpi_grp, recvbuf, recvcount, recvtype, source, request, tag)
Definition: mpi.F90:2212
subroutine lmpi_grp_send_2(mpi_grp, sendbuf, sendcount, sendtype, dest, tag)
Definition: mpi.F90:4096
subroutine mpi_init_comm(comm)
Wrapper for MPI_COMM_WORLD initialisation.
Definition: mpi.F90:283
subroutine impi_grp_send_2(mpi_grp, sendbuf, sendcount, sendtype, dest, tag)
Definition: mpi.F90:3118
subroutine dmpi_grp_irecv_2(mpi_grp, recvbuf, recvcount, recvtype, source, request, tag)
Definition: mpi.F90:1283
subroutine lmpi_grp_isend_0_int64(mpi_grp, sendbuf, sendcount, sendtype, source, request, tag)
Definition: mpi.F90:4262
subroutine dmpi_grp_irecv_0_int64(mpi_grp, recvbuf, recvcount, recvtype, source, request, tag)
Definition: mpi.F90:1210
subroutine lmpi_grp_isend_0(mpi_grp, sendbuf, sendcount, sendtype, source, request, tag)
Definition: mpi.F90:4287
subroutine dmpi_grp_isend_0_int64(mpi_grp, sendbuf, sendcount, sendtype, source, request, tag)
Definition: mpi.F90:1330
subroutine dmpi_grp_send_3(mpi_grp, sendbuf, sendcount, sendtype, dest, tag)
Definition: mpi.F90:1187
subroutine zmpi_grp_isend_2(mpi_grp, sendbuf, sendcount, sendtype, source, request, tag)
Definition: mpi.F90:2380
subroutine lmpi_grp_send_3(mpi_grp, sendbuf, sendcount, sendtype, dest, tag)
Definition: mpi.F90:4119
subroutine zmpi_grp_send_3(mpi_grp, sendbuf, sendcount, sendtype, dest, tag)
Definition: mpi.F90:2164
subroutine mpi_grp_waitall(mpi_grp, count, requests)
Definition: mpi.F90:512
subroutine lompi_grp_allreduce_0(mpi_grp, sendbuf, recvbuf, count, datatype, op)
Definition: mpi.F90:428
subroutine lmpi_grp_irecv_0(mpi_grp, recvbuf, recvcount, recvtype, source, request, tag)
Definition: mpi.F90:4167
subroutine impi_grp_send(mpi_grp, sendbuf, sendcount, sendtype, dest, tag)
Definition: mpi.F90:3095
subroutine lompi_grp_send_0(mpi_grp, sendbuf, sendcount, sendtype, dest, tag)
Definition: mpi.F90:474
subroutine lmpi_grp_isend_3(mpi_grp, sendbuf, sendcount, sendtype, source, request, tag)
Definition: mpi.F90:4359
subroutine chmpi_grp_bcast_0(mpi_grp, buf, cnt, sendtype, root)
Definition: mpi.F90:391
subroutine lmpi_grp_irecv_2(mpi_grp, recvbuf, recvcount, recvtype, source, request, tag)
Definition: mpi.F90:4215
type(mpi_comm), parameter mpi_comm_null
type(mpi_op), parameter mpi_in_place
This is defined even when running serial.
Definition: mpi.F90:142
int true(void)