Blame test/mpi/f90/coll/reducelocalf90.f90

Packit Service c5cf8c
! This file created from f77/coll/reducelocalf.f with f77tof90
Packit Service c5cf8c
! -*- Mode: Fortran; -*- 
Packit Service c5cf8c
!
Packit Service c5cf8c
!  (C) 2009 by Argonne National Laboratory.
Packit Service c5cf8c
!      See COPYRIGHT in top-level directory.
Packit Service c5cf8c
!
Packit Service c5cf8c
!
Packit Service c5cf8c
! Test Fortran MPI_Reduce_local with MPI_OP_SUM and with user-defined operation.
Packit Service c5cf8c
!
Packit Service c5cf8c
      subroutine user_op( invec, outvec, count, datatype )
Packit Service c5cf8c
      use mpi
Packit Service c5cf8c
      integer invec(*), outvec(*)
Packit Service c5cf8c
      integer count, datatype
Packit Service c5cf8c
      integer ii
Packit Service c5cf8c
Packit Service c5cf8c
      if (datatype .ne. MPI_INTEGER) then
Packit Service c5cf8c
         write(6,*) 'Invalid datatype passed to user_op()'
Packit Service c5cf8c
         return
Packit Service c5cf8c
      endif
Packit Service c5cf8c
      
Packit Service c5cf8c
      do ii=1, count
Packit Service c5cf8c
         outvec(ii) = invec(ii) * 2 + outvec(ii)
Packit Service c5cf8c
      enddo
Packit Service c5cf8c
Packit Service c5cf8c
      end
Packit Service c5cf8c
Packit Service c5cf8c
      program main
Packit Service c5cf8c
      use mpi
Packit Service c5cf8c
      integer max_buf_size
Packit Service c5cf8c
      parameter (max_buf_size=65000)
Packit Service c5cf8c
      integer vin(max_buf_size), vout(max_buf_size)
Packit Service c5cf8c
      external user_op
Packit Service c5cf8c
      integer ierr, errs
Packit Service c5cf8c
      integer count, myop
Packit Service c5cf8c
      integer ii
Packit Service c5cf8c
      
Packit Service c5cf8c
      errs = 0
Packit Service c5cf8c
Packit Service c5cf8c
      call mtest_init(ierr)
Packit Service c5cf8c
Packit Service c5cf8c
      count = 0
Packit Service c5cf8c
      do while (count .le. max_buf_size )
Packit Service c5cf8c
         do ii = 1,count
Packit Service c5cf8c
            vin(ii) = ii
Packit Service c5cf8c
            vout(ii) = ii
Packit Service c5cf8c
         enddo 
Packit Service c5cf8c
         call mpi_reduce_local( vin, vout, count, &
Packit Service c5cf8c
      &                          MPI_INTEGER, MPI_SUM, ierr )
Packit Service c5cf8c
!        Check if the result is correct
Packit Service c5cf8c
         do ii = 1,count
Packit Service c5cf8c
            if ( vin(ii) .ne. ii ) then
Packit Service c5cf8c
               errs = errs + 1
Packit Service c5cf8c
            endif
Packit Service c5cf8c
            if ( vout(ii) .ne. 2*ii ) then
Packit Service c5cf8c
               errs = errs + 1
Packit Service c5cf8c
            endif
Packit Service c5cf8c
         enddo 
Packit Service c5cf8c
         if ( count .gt. 0 ) then
Packit Service c5cf8c
            count = count + count
Packit Service c5cf8c
         else
Packit Service c5cf8c
            count = 1
Packit Service c5cf8c
         endif
Packit Service c5cf8c
      enddo
Packit Service c5cf8c
Packit Service c5cf8c
      call mpi_op_create( user_op, .false., myop, ierr )
Packit Service c5cf8c
Packit Service c5cf8c
      count = 0
Packit Service c5cf8c
      do while (count .le. max_buf_size) 
Packit Service c5cf8c
         do ii = 1, count
Packit Service c5cf8c
            vin(ii) = ii
Packit Service c5cf8c
            vout(ii) = ii
Packit Service c5cf8c
         enddo
Packit Service c5cf8c
         call mpi_reduce_local( vin, vout, count, &
Packit Service c5cf8c
      &                          MPI_INTEGER, myop, ierr )
Packit Service c5cf8c
!        Check if the result is correct
Packit Service c5cf8c
         do ii = 1, count
Packit Service c5cf8c
            if ( vin(ii) .ne. ii ) then
Packit Service c5cf8c
               errs = errs + 1
Packit Service c5cf8c
            endif
Packit Service c5cf8c
            if ( vout(ii) .ne. 3*ii ) then
Packit Service c5cf8c
               errs = errs + 1
Packit Service c5cf8c
            endif
Packit Service c5cf8c
         enddo
Packit Service c5cf8c
         if ( count .gt. 0 ) then
Packit Service c5cf8c
            count = count + count
Packit Service c5cf8c
         else
Packit Service c5cf8c
            count = 1
Packit Service c5cf8c
         endif
Packit Service c5cf8c
      enddo
Packit Service c5cf8c
Packit Service c5cf8c
      call mpi_op_free( myop, ierr )
Packit Service c5cf8c
Packit Service c5cf8c
      call mtest_finalize(errs)
Packit Service c5cf8c
Packit Service c5cf8c
      end