comms_allreduce_real Subroutine

private subroutine comms_allreduce_real(array, size, op)

Reduce real data to all nodes

Arguments

Type IntentOptional AttributesName
real(kind=dp), intent(inout) :: array
integer, intent(in) :: size
character(len=*), intent(in) :: op

Called by

proc~~comms_allreduce_real~~CalledByGraph proc~comms_allreduce_real comms_allreduce_real interface~comms_allreduce comms_allreduce interface~comms_allreduce->proc~comms_allreduce_real proc~dis_extract dis_extract proc~dis_extract->interface~comms_allreduce proc~wann_omega wann_omega proc~wann_omega->interface~comms_allreduce proc~wann_main wann_main proc~wann_main->proc~wann_omega proc~dis_main dis_main proc~dis_main->proc~dis_extract program~wannier wannier program~wannier->proc~wann_main program~wannier->proc~dis_main proc~wannier_run wannier_run proc~wannier_run->proc~wann_main proc~wannier_run->proc~dis_main

Contents

Source Code


Source Code

  subroutine comms_allreduce_real(array, size, op)
    !! Reduce real data to all nodes

    implicit none

    real(kind=dp), intent(inout) :: array
    integer, intent(in)    :: size
    character(len=*), intent(in) :: op

#ifdef MPI
    integer :: error, ierr

    real(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_real')
    end if

    select case (op)

    case ('SUM')
      call MPI_allreduce(array, array_red, size, MPI_double_precision, MPI_sum, mpi_comm_world, error)
    case ('PRD')
      call MPI_allreduce(array, array_red, size, MPI_double_precision, MPI_prod, mpi_comm_world, error)
    case ('MIN')
      call MPI_allreduce(array, array_red, size, MPI_double_precision, MPI_MIN, mpi_comm_world, error)
    case ('MAX')
      call MPI_allreduce(array, array_red, size, MPI_double_precision, MPI_max, mpi_comm_world, error)
    case default
      call io_error('Unknown operation in comms_allreduce_real')

    end select

    call dcopy(size, array_red, 1, array, 1)

    if (error .ne. MPI_success) then
      call io_error('Error in comms_allreduce_real')
    end if

    if (allocated(array_red)) deallocate (array_red)
#endif

    return

  end subroutine comms_allreduce_real