32
33
34
35 USE spmd_comm_world_mod, ONLY : spmd_comm_world
36#include "implicit_f.inc"
37
38
39
40#include "spmd.inc"
41
42
43
44 CHARACTER(len=4), INTENT(in) :: MY_OPERATION
45 INTEGER, INTENT(in) :: MY_SIZE,MY_RANK
46 REAL(kind=8), dimension(my_size), INTENT(in) :: VALUE
47 REAL(kind=8), dimension(my_size), INTENT(out) :: res
48
49#ifdef MPI
50
51
52
53 INTEGER :: error
54 INTEGER :: MPI_OPERATION
55
56
57 IF(my_operation(1:3)=="SUM") THEN
58 mpi_operation=mpi_sum
59 ELSEIF(my_operation(1:4)=="PROD") THEN
60 mpi_operation=mpi_prod
61 ELSEIF(my_operation(1:3)=="MAX") THEN
62 mpi_operation=mpi_max
63 ELSEIF(my_operation(1:3)=="MIN") THEN
64 mpi_operation=mpi_min
65 ENDIF
66
67
68
69 CALL mpi_reduce(
VALUE,res,my_size,mpi_double_precision,mpi_operation,my_rank,spmd_comm_world,error)
70
71#else
72 res = 0
73#endif
74 RETURN
subroutine mpi_reduce(sendbuf, recvbuf, cnt, datatype, op, root, comm, ierr)