Blame test/mpi/f90/coll/redscatf90.f90

Packit 0848f5
! This file created from test/mpi/f77/coll/redscatf.f with f77tof90
Packit 0848f5
! -*- Mode: Fortran; -*- 
Packit 0848f5
!
Packit 0848f5
!  (C) 2011 by Argonne National Laboratory.
Packit 0848f5
!      See COPYRIGHT in top-level directory.
Packit 0848f5
!
Packit 0848f5
      subroutine uop( cin, cout, count, datatype )
Packit 0848f5
      use mpi
Packit 0848f5
      integer cin(*), cout(*)
Packit 0848f5
      integer count, datatype
Packit 0848f5
      integer i
Packit 0848f5
      
Packit 0848f5
      if (datatype .ne. MPI_INTEGER) then
Packit 0848f5
         write(6,*) 'Invalid datatype ',datatype,' passed to user_op()'
Packit 0848f5
         return
Packit 0848f5
      endif
Packit 0848f5
Packit 0848f5
      do i=1, count
Packit 0848f5
         cout(i) = cin(i) + cout(i)
Packit 0848f5
      enddo
Packit 0848f5
      end
Packit 0848f5
!
Packit 0848f5
! Test of reduce scatter.
Packit 0848f5
!
Packit 0848f5
! Each processor contributes its rank + the index to the reduction, 
Packit 0848f5
! then receives the ith sum
Packit 0848f5
!
Packit 0848f5
! Can be called with any number of processors.
Packit 0848f5
!
Packit 0848f5
Packit 0848f5
      program main
Packit 0848f5
      use mpi
Packit 0848f5
      integer errs, ierr, toterr
Packit 0848f5
      integer maxsize
Packit 0848f5
      parameter (maxsize=1024)
Packit 0848f5
      integer sendbuf(maxsize), recvbuf, recvcounts(maxsize)
Packit 0848f5
      integer size, rank, i, sumval
Packit 0848f5
      integer comm, sumop
Packit 0848f5
      external uop
Packit 0848f5
Packit 0848f5
      errs = 0
Packit 0848f5
Packit 0848f5
      call mtest_init( ierr )
Packit 0848f5
Packit 0848f5
      comm = MPI_COMM_WORLD
Packit 0848f5
Packit 0848f5
      call mpi_comm_size( comm, size, ierr )
Packit 0848f5
      call mpi_comm_rank( comm, rank, ierr )
Packit 0848f5
Packit 0848f5
      if (size .gt. maxsize) then
Packit 0848f5
      endif
Packit 0848f5
      do i=1, size
Packit 0848f5
         sendbuf(i) = rank + i - 1
Packit 0848f5
         recvcounts(i) = 1
Packit 0848f5
      enddo
Packit 0848f5
Packit 0848f5
      call mpi_reduce_scatter( sendbuf, recvbuf, recvcounts,  &
Packit 0848f5
      &     MPI_INTEGER, MPI_SUM, comm, ierr )
Packit 0848f5
Packit 0848f5
      sumval = size * rank + ((size - 1) * size)/2
Packit 0848f5
! recvbuf should be size * (rank + i) 
Packit 0848f5
      if (recvbuf .ne. sumval) then
Packit 0848f5
         errs = errs + 1
Packit 0848f5
         print *, "Did not get expected value for reduce scatter"
Packit 0848f5
         print *, rank, " Got ", recvbuf, " expected ", sumval
Packit 0848f5
      endif
Packit 0848f5
Packit 0848f5
      call mpi_op_create( uop, .true., sumop, ierr )
Packit 0848f5
      call mpi_reduce_scatter( sendbuf, recvbuf, recvcounts,  &
Packit 0848f5
      &     MPI_INTEGER, sumop, comm, ierr )
Packit 0848f5
Packit 0848f5
      sumval = size * rank + ((size - 1) * size)/2
Packit 0848f5
! recvbuf should be size * (rank + i) 
Packit 0848f5
      if (recvbuf .ne. sumval) then
Packit 0848f5
         errs = errs + 1
Packit 0848f5
         print *, "sumop: Did not get expected value for reduce scatter"
Packit 0848f5
         print *, rank, " Got ", recvbuf, " expected ", sumval
Packit 0848f5
      endif
Packit 0848f5
      call mpi_op_free( sumop, ierr )
Packit 0848f5
Packit 0848f5
      call mtest_finalize( errs )
Packit 0848f5
      call mpi_finalize( ierr )
Packit 0848f5
Packit 0848f5
      end