flow_gather_owned_scalar_root Subroutine

public subroutine flow_gather_owned_scalar_root(flow, field, root_field)

Gathers owned scalar cell values to rank 0 only.

Arguments

Type IntentOptional Attributes Name
type(flow_mpi_t), intent(inout) :: flow
real(kind=rk), intent(in) :: field(:)
real(kind=rk), intent(inout) :: root_field(:)

Source Code

   subroutine flow_gather_owned_scalar_root(flow, field, root_field)
      use mod_profiling, only : profiler_start, profiler_stop
      type(flow_mpi_t), intent(inout) :: flow
      real(rk), intent(in) :: field(:)
      real(rk), intent(inout) :: root_field(:)
      integer :: ierr, r, first

      flow%gather_sendbuf = field(flow%first_cell:flow%last_cell)

      call profiler_start('MPI_Communication')
      call MPI_Gatherv(flow%gather_sendbuf, flow%nlocal, MPI_DOUBLE_PRECISION, &
                       flow%gather_recvbuf, flow%gather_counts, flow%gather_displs, &
                       MPI_DOUBLE_PRECISION, 0, flow%comm, ierr)
      call check_mpi(ierr, 'MPI_Gatherv owned scalar root')
      call profiler_stop('MPI_Communication')

      if (flow%rank == 0) then
         root_field = zero
         do r = 1, flow%nprocs
            first = flow%gather_firsts(r)
            root_field(first:first + flow%gather_counts(r) - 1) = &
               flow%gather_recvbuf(flow%gather_displs(r) + 1: &
                                   flow%gather_displs(r) + flow%gather_counts(r))
         end do
      end if
   end subroutine flow_gather_owned_scalar_root