! This file created from f77/topo/cartcrf.f with f77tof90
! -*- Mode: Fortran; -*-
!
! (C) 2004 by Argonne National Laboratory.
! See COPYRIGHT in top-level directory.
!
! Test various combinations of periodic and non-periodic Cartesian
! communicators
!
program main
use mpi
integer errs, ierr
integer ndims, nperiods, i, size
integer comm, source, dest, newcomm
integer maxdims
parameter (maxdims=7)
logical periods(maxdims), outperiods(maxdims)
integer dims(maxdims), outdims(maxdims)
integer outcoords(maxdims)
errs = 0
call mtest_init( ierr )
!
! For upto 6 dimensions, test with periodicity in 0 through all
! dimensions. The test is computed by both:
! get info about the created communicator
! apply cart shift
! Note that a dimension can have size one, so that these tests
! can work with small numbers (even 1) of processes
!
comm = MPI_COMM_WORLD
call mpi_comm_size( comm, size, ierr )
do ndims = 1, 6
do nperiods = 0, ndims
do i=1,ndims
periods(i) = .false.
dims(i) = 0
enddo
do i=1,nperiods
periods(i) = .true.
enddo
call mpi_dims_create( size, ndims, dims, ierr )
call mpi_cart_create( comm, ndims, dims, periods, .false., &
& newcomm, ierr )
if (newcomm .ne. MPI_COMM_NULL) then
call mpi_cart_get( newcomm, maxdims, outdims, outperiods, &
& outcoords, ierr )
! print *, 'Coords = '
do i=1, ndims
! print *, i, '(', outcoords(i), ')'
if (periods(i) .neqv. outperiods(i)) then
errs = errs + 1
print *, ' Wrong value for periods ', i
print *, ' ndims = ', ndims
endif
enddo
do i=1, ndims
call mpi_cart_shift( newcomm, i-1, 1, source, dest, &
& ierr )
if (outcoords(i) .eq. outdims(i)-1) then
if (periods(i)) then
if (dest .eq. MPI_PROC_NULL) then
errs = errs + 1
print *, 'Expected rank, got proc_null'
endif
else
if (dest .ne. MPI_PROC_NULL) then
errs = errs + 1
print *, 'Expected procnull, got ', dest
endif
endif
endif
call mpi_cart_shift( newcomm, i-1, -1, source, dest, &
& ierr )
if (outcoords(i) .eq. 0) then
if (periods(i)) then
if (dest .eq. MPI_PROC_NULL) then
errs = errs + 1
print *, 'Expected rank, got proc_null'
endif
else
if (dest .ne. MPI_PROC_NULL) then
errs = errs + 1
print *, 'Expected procnull, got ', dest
endif
endif
endif
enddo
call mpi_comm_free( newcomm, ierr )
endif
enddo
enddo
call mtest_finalize( errs )
end