Reduce complex data to all nodes
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
complex(kind=dp), | intent(inout) | :: | array | |||
integer, | intent(in) | :: | size | |||
character(len=*), | intent(in) | :: | op |
Nodes of different colours represent the following:
Solid arrows point from a procedure to one which it calls. Dashed arrows point from an interface to procedures which implement that interface. This could include the module procedures in a generic interface or the implementation in a submodule of an interface in a parent module.
subroutine comms_allreduce_cmplx(array,size,op)
!! Reduce complex data to all nodes
implicit none
complex(kind=dp), intent(inout) :: array
integer, intent(in) :: size
character(len=*), intent(in) :: op
#ifdef MPI
integer :: error,ierr
complex(kind=dp), allocatable :: array_red(:)
allocate(array_red(size),stat=ierr)
if (ierr/=0) then
call io_error('failure to allocate array_red in comms_allreduce_cmplx')
end if
select case(op)
case ('SUM')
call MPI_allreduce(array,array_red,size,MPI_double_complex,MPI_sum,mpi_comm_world,error)
case ('PRD')
call MPI_allreduce(array,array_red,size,MPI_double_complex,MPI_prod,mpi_comm_world,error)
case default
call io_error('Unknown operation in comms_allreduce_cmplx')
end select
call zcopy(size,array_red,1,array,1)
if(error.ne.MPI_success) then
call io_error('Error in comms_allreduce_cmplx')
end if
if (allocated(array_red)) deallocate(array_red)
#endif
return
end subroutine comms_allreduce_cmplx