C -*- Mode: Fortran; -*-
C
C (C) 2003 by Argonne National Laboratory.
C See COPYRIGHT in top-level directory.
C
program main
implicit none
include 'mpif.h'
integer errs, toterrs, ierr
integer wrank, wsize
integer wgroup, info, req
integer fsize, frank
integer comm, group, type, op, errh, result
integer c2fcomm, c2fgroup, c2ftype, c2finfo, c2frequest,
$ c2ferrhandler, c2fop
character value*100
logical flag
errs = 0
call mpi_init( ierr )
C
C Test passing a Fortran MPI object to C
call mpi_comm_rank( MPI_COMM_WORLD, wrank, ierr )
errs = errs + c2fcomm( MPI_COMM_WORLD )
call mpi_comm_group( MPI_COMM_WORLD, wgroup, ierr )
errs = errs + c2fgroup( wgroup )
call mpi_group_free( wgroup, ierr )
call mpi_info_create( info, ierr )
call mpi_info_set( info, "host", "myname", ierr )
call mpi_info_set( info, "wdir", "/rdir/foo", ierr )
errs = errs + c2finfo( info )
call mpi_info_free( info, ierr )
errs = errs + c2ftype( MPI_INTEGER )
call mpi_irecv( 0, 0, MPI_INTEGER, MPI_ANY_SOURCE, MPI_ANY_TAG,
$ MPI_COMM_WORLD, req, ierr )
call mpi_cancel( req, ierr )
errs = errs + c2frequest( req )
call mpi_wait( req, MPI_STATUS_IGNORE, ierr )
errs = errs + c2ferrhandler( MPI_ERRORS_RETURN )
errs = errs + c2fop( MPI_SUM )
C
C Test using a C routine to provide the Fortran handle
call mpi_comm_size( MPI_COMM_WORLD, wsize, ierr )
call mpi_comm_rank( MPI_COMM_WORLD, wrank, ierr )
call f2ccomm( comm )
call mpi_comm_size( comm, fsize, ierr )
call mpi_comm_rank( comm, frank, ierr )
if (fsize.ne.wsize .or. frank.ne.wrank) then
errs = errs + 1
print *, "Comm(fortran) has wrong size or rank"
endif
call f2cgroup( group )
call mpi_group_size( group, fsize, ierr )
call mpi_group_rank( group, frank, ierr )
if (fsize.ne.wsize .or. frank.ne.wrank) then
errs = errs + 1
print *, "Group(fortran) has wrong size or rank"
endif
call mpi_group_free( group, ierr )
call f2ctype( type )
if (type .ne. MPI_INTEGER) then
errs = errs + 1
print *, "Datatype(fortran) is not MPI_INT"
endif
call f2cinfo( info )
call mpi_info_get( info, "host", 100, value, flag, ierr )
if (.not. flag) then
errs = errs + 1
print *, "Info test for host returned false"
else if (value .ne. "myname") then
errs = errs + 1
print *, "Info test for host returned ", value
endif
call mpi_info_get( info, "wdir", 100, value, flag, ierr )
if (.not. flag) then
errs = errs + 1
print *, "Info test for wdir returned false"
else if (value .ne. "/rdir/foo") then
errs = errs + 1
print *, "Info test for wdir returned ", value
endif
call mpi_info_free( info, ierr )
call f2cop( op )
if (op .ne. MPI_SUM) then
errs = errs + 1
print *, "Fortran MPI_SUM not MPI_SUM in C"
endif
call f2cerrhandler( errh )
if (errh .ne. MPI_ERRORS_RETURN) then
errs = errs + 1
print *,"Fortran MPI_ERRORS_RETURN not MPI_ERRORS_RETURN in C"
endif
C
C Summarize the errors
C
call mpi_allreduce( errs, toterrs, 1, MPI_INTEGER, MPI_SUM,
$ MPI_COMM_WORLD, ierr )
if (wrank .eq. 0) then
if (toterrs .eq. 0) then
print *, ' No Errors'
else
print *, ' Found ', toterrs, ' errors'
endif
endif
call mpi_finalize( ierr )
end