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

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