Blame test/mpi/f77/coll/exscanf.f

Packit 0848f5
C -*- Mode: Fortran; -*- 
Packit 0848f5
C
Packit 0848f5
C  (C) 2003 by Argonne National Laboratory.
Packit 0848f5
C      See COPYRIGHT in top-level directory.
Packit 0848f5
C
Packit 0848f5
      subroutine uop( cin, cout, count, datatype )
Packit 0848f5
      implicit none
Packit 0848f5
      include 'mpif.h'
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 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
C
Packit 0848f5
      program main
Packit 0848f5
      implicit none
Packit 0848f5
      include 'mpif.h'
Packit 0848f5
      integer inbuf(2), outbuf(2)
Packit 0848f5
      integer ans, rank, size, comm
Packit 0848f5
      integer errs, ierr
Packit 0848f5
      integer sumop
Packit 0848f5
      external uop
Packit 0848f5
Packit 0848f5
      errs = 0
Packit 0848f5
      
Packit 0848f5
      call mtest_init( ierr )
Packit 0848f5
C
Packit 0848f5
C A simple test of exscan
Packit 0848f5
      comm = MPI_COMM_WORLD
Packit 0848f5
Packit 0848f5
      call mpi_comm_rank( comm, rank, ierr )
Packit 0848f5
      call mpi_comm_size( comm, size, ierr )
Packit 0848f5
Packit 0848f5
      inbuf(1) = rank
Packit 0848f5
      inbuf(2) = -rank
Packit 0848f5
      call mpi_exscan( inbuf, outbuf, 2, MPI_INTEGER, MPI_SUM, comm, 
Packit 0848f5
     &                 ierr )
Packit 0848f5
C this process has the sum of i from 0 to rank-1, which is
Packit 0848f5
C (rank)(rank-1)/2 and -i
Packit 0848f5
      ans = (rank * (rank - 1))/2
Packit 0848f5
      if (rank .gt. 0) then
Packit 0848f5
         if (outbuf(1) .ne. ans) then
Packit 0848f5
            errs = errs + 1
Packit 0848f5
            print *, rank, ' Expected ', ans, ' got ', outbuf(1)
Packit 0848f5
         endif
Packit 0848f5
         if (outbuf(2) .ne. -ans) then
Packit 0848f5
            errs = errs + 1
Packit 0848f5
            print *, rank, ' Expected ', -ans, ' got ', outbuf(1)
Packit 0848f5
         endif
Packit 0848f5
      endif
Packit 0848f5
C
Packit 0848f5
C Try a user-defined operation 
Packit 0848f5
C
Packit 0848f5
      call mpi_op_create( uop, .true., sumop, ierr )
Packit 0848f5
      inbuf(1) = rank
Packit 0848f5
      inbuf(2) = -rank
Packit 0848f5
      call mpi_exscan( inbuf, outbuf, 2, MPI_INTEGER, sumop, comm, 
Packit 0848f5
     &                 ierr )
Packit 0848f5
C this process has the sum of i from 0 to rank-1, which is
Packit 0848f5
C (rank)(rank-1)/2 and -i
Packit 0848f5
      ans = (rank * (rank - 1))/2
Packit 0848f5
      if (rank .gt. 0) then
Packit 0848f5
         if (outbuf(1) .ne. ans) then
Packit 0848f5
            errs = errs + 1
Packit 0848f5
            print *, rank, ' sumop: Expected ', ans, ' got ', outbuf(1)
Packit 0848f5
         endif
Packit 0848f5
         if (outbuf(2) .ne. -ans) then
Packit 0848f5
            errs = errs + 1
Packit 0848f5
            print *, rank, ' sumop: Expected ', -ans, ' got ', outbuf(1)
Packit 0848f5
         endif
Packit 0848f5
      endif
Packit 0848f5
      call mpi_op_free( sumop, ierr )
Packit 0848f5
      
Packit 0848f5
C
Packit 0848f5
C Try a user-defined operation (and don't claim it is commutative)
Packit 0848f5
C
Packit 0848f5
      call mpi_op_create( uop, .false., sumop, ierr )
Packit 0848f5
      inbuf(1) = rank
Packit 0848f5
      inbuf(2) = -rank
Packit 0848f5
      call mpi_exscan( inbuf, outbuf, 2, MPI_INTEGER, sumop, comm, 
Packit 0848f5
     &                 ierr )
Packit 0848f5
C this process has the sum of i from 0 to rank-1, which is
Packit 0848f5
C (rank)(rank-1)/2 and -i
Packit 0848f5
      ans = (rank * (rank - 1))/2
Packit 0848f5
      if (rank .gt. 0) then
Packit 0848f5
         if (outbuf(1) .ne. ans) then
Packit 0848f5
            errs = errs + 1
Packit 0848f5
            print *, rank, ' sumop2: Expected ', ans, ' got ', outbuf(1)
Packit 0848f5
         endif
Packit 0848f5
         if (outbuf(2) .ne. -ans) then
Packit 0848f5
            errs = errs + 1
Packit 0848f5
            print *, rank, ' sumop2: Expected ', -ans, ' got ',outbuf(1)
Packit 0848f5
         endif
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
      end