Blame test/mpi/f90/topo/dgraph_unwgtf90.f90

Packit Service c5cf8c
! This file created from f77/topo/dgraph_unwgtf.f with f77tof90
Packit Service c5cf8c
! -*- Mode: Fortran; -*- 
Packit Service c5cf8c
!
Packit Service c5cf8c
!  (C) 2011 by Argonne National Laboratory.
Packit Service c5cf8c
!      See COPYRIGHT in top-level directory.
Packit Service c5cf8c
!
Packit Service c5cf8c
!     This program is Fortran version of dgraph_unwgt.c
Packit Service c5cf8c
!     Specify a distributed graph of a bidirectional ring of the MPI_COMM_WORLD,
Packit Service c5cf8c
!     i.e. everyone only talks to left and right neighbors.
Packit Service c5cf8c
Packit Service c5cf8c
      logical function validate_dgraph(dgraph_comm)
Packit Service c5cf8c
      use mpi
Packit Service c5cf8c
Packit Service c5cf8c
      integer     dgraph_comm
Packit Service c5cf8c
      integer     comm_topo
Packit Service c5cf8c
      integer     src_sz, dest_sz
Packit Service c5cf8c
      integer     ierr;
Packit Service c5cf8c
      logical     wgt_flag;
Packit Service c5cf8c
      integer     srcs(2), dests(2)
Packit Service c5cf8c
Packit Service c5cf8c
      integer     world_rank, world_size;
Packit Service c5cf8c
      integer     idx, nbr_sep
Packit Service c5cf8c
Packit Service c5cf8c
      comm_topo = MPI_UNDEFINED
Packit Service c5cf8c
      call MPI_Topo_test(dgraph_comm, comm_topo, ierr);
Packit Service c5cf8c
      if (comm_topo .ne. MPI_DIST_GRAPH) then
Packit Service c5cf8c
          validate_dgraph = .false.
Packit Service c5cf8c
          write(6,*) "dgraph_comm is NOT of type MPI_DIST_GRAPH."
Packit Service c5cf8c
          return
Packit Service c5cf8c
      endif
Packit Service c5cf8c
Packit Service c5cf8c
      call MPI_Dist_graph_neighbors_count(dgraph_comm, &
Packit Service c5cf8c
      &                                    src_sz, dest_sz, wgt_flag, &
Packit Service c5cf8c
      &                                    ierr)
Packit Service c5cf8c
      if (ierr .ne. MPI_SUCCESS) then
Packit Service c5cf8c
          validate_dgraph = .false.
Packit Service c5cf8c
          write(6,*) "MPI_Dist_graph_neighbors_count() fails!"
Packit Service c5cf8c
          return
Packit Service c5cf8c
      endif
Packit Service c5cf8c
      if (wgt_flag) then
Packit Service c5cf8c
          validate_dgraph = .false.
Packit Service c5cf8c
          write(6,*) "dgraph_comm is NOT created with MPI_UNWEIGHTED."
Packit Service c5cf8c
          return
Packit Service c5cf8c
      endif
Packit Service c5cf8c
Packit Service c5cf8c
      if (src_sz .ne. 2 .or. dest_sz .ne. 2) then
Packit Service c5cf8c
          validate_dgraph = .false.
Packit Service c5cf8c
          write(6,*) "source or destination edge array is not size 2." 
Packit Service c5cf8c
          write(6,"('src_sz = ',I3,', dest_sz = ',I3)") src_sz, dest_sz
Packit Service c5cf8c
          return
Packit Service c5cf8c
      endif
Packit Service c5cf8c
Packit Service c5cf8c
      call MPI_Dist_graph_neighbors(dgraph_comm, &
Packit Service c5cf8c
      &                              src_sz, srcs, MPI_UNWEIGHTED, &
Packit Service c5cf8c
      &                              dest_sz, dests, MPI_UNWEIGHTED, &
Packit Service c5cf8c
      &                              ierr)
Packit Service c5cf8c
      if (ierr .ne. MPI_SUCCESS) then
Packit Service c5cf8c
          validate_dgraph = .false.
Packit Service c5cf8c
          write(6,*) "MPI_Dist_graph_neighbors() fails!"
Packit Service c5cf8c
          return
Packit Service c5cf8c
      endif
Packit Service c5cf8c
Packit Service c5cf8c
!     Check if the neighbors returned from MPI are really
Packit Service c5cf8c
!     the nearest neighbors that within a ring.
Packit Service c5cf8c
      call MPI_Comm_rank(MPI_COMM_WORLD, world_rank, ierr)
Packit Service c5cf8c
      call MPI_Comm_size(MPI_COMM_WORLD, world_size, ierr)
Packit Service c5cf8c
 
Packit Service c5cf8c
      do idx = 1, src_sz
Packit Service c5cf8c
          nbr_sep = iabs(srcs(idx) - world_rank)
Packit Service c5cf8c
          if (nbr_sep .ne. 1 .and. nbr_sep .ne. (world_size-1)) then
Packit Service c5cf8c
              validate_dgraph = .false.
Packit Service c5cf8c
              write(6,"('srcs[',I3,']=',I3, &
Packit Service c5cf8c
      &                  ' is NOT a neighbor of my rank',I3)") &
Packit Service c5cf8c
      &              idx, srcs(idx), world_rank
Packit Service c5cf8c
              return
Packit Service c5cf8c
          endif
Packit Service c5cf8c
      enddo
Packit Service c5cf8c
      do idx = 1, dest_sz
Packit Service c5cf8c
          nbr_sep = iabs(dests(idx) - world_rank)
Packit Service c5cf8c
          if (nbr_sep .ne. 1 .and. nbr_sep .ne. (world_size-1)) then
Packit Service c5cf8c
              validate_dgraph = .false.
Packit Service c5cf8c
              write(6,"('dests[',I3,']=',I3, &
Packit Service c5cf8c
      &                  ' is NOT a neighbor of my rank',I3)") &
Packit Service c5cf8c
      &              idx, dests(idx), world_rank
Packit Service c5cf8c
              return
Packit Service c5cf8c
          endif
Packit Service c5cf8c
      enddo
Packit Service c5cf8c
Packit Service c5cf8c
      validate_dgraph = .true.
Packit Service c5cf8c
      return
Packit Service c5cf8c
      end
Packit Service c5cf8c
Packit Service c5cf8c
      integer function ring_rank(world_size, in_rank)
Packit Service c5cf8c
      integer world_size, in_rank
Packit Service c5cf8c
      if (in_rank .ge. 0 .and. in_rank .lt. world_size) then
Packit Service c5cf8c
          ring_rank = in_rank
Packit Service c5cf8c
          return
Packit Service c5cf8c
      endif
Packit Service c5cf8c
      if (in_rank .lt. 0 ) then
Packit Service c5cf8c
          ring_rank = in_rank + world_size
Packit Service c5cf8c
          return
Packit Service c5cf8c
      endif
Packit Service c5cf8c
      if (in_rank .ge. world_size) then
Packit Service c5cf8c
          ring_rank = in_rank - world_size
Packit Service c5cf8c
          return
Packit Service c5cf8c
      endif
Packit Service c5cf8c
      ring_rank = -99999
Packit Service c5cf8c
      return
Packit Service c5cf8c
      end
Packit Service c5cf8c
Packit Service c5cf8c
Packit Service c5cf8c
Packit Service c5cf8c
      program dgraph_unwgt
Packit Service c5cf8c
      use mpi
Packit Service c5cf8c
Packit Service c5cf8c
      integer    ring_rank
Packit Service c5cf8c
      external   ring_rank
Packit Service c5cf8c
      logical    validate_dgraph
Packit Service c5cf8c
      external   validate_dgraph
Packit Service c5cf8c
      integer    errs, ierr
Packit Service c5cf8c
Packit Service c5cf8c
      integer    dgraph_comm
Packit Service c5cf8c
      integer    world_size, world_rank
Packit Service c5cf8c
      integer    src_sz, dest_sz
Packit Service c5cf8c
      integer    degs(1)
Packit Service c5cf8c
      integer    srcs(2), dests(2)
Packit Service c5cf8c
Packit Service c5cf8c
      errs = 0
Packit Service c5cf8c
      call MTEST_Init(ierr) 
Packit Service c5cf8c
      call MPI_Comm_rank(MPI_COMM_WORLD, world_rank, ierr)
Packit Service c5cf8c
      call MPI_Comm_size(MPI_COMM_WORLD, world_size, ierr)
Packit Service c5cf8c
Packit Service c5cf8c
      srcs(1) = world_rank
Packit Service c5cf8c
      degs(1) = 2;
Packit Service c5cf8c
      dests(1) = ring_rank(world_size, world_rank-1)
Packit Service c5cf8c
      dests(2) = ring_rank(world_size, world_rank+1)
Packit Service c5cf8c
      call MPI_Dist_graph_create(MPI_COMM_WORLD, 1, srcs, degs, dests, &
Packit Service c5cf8c
      &                           MPI_UNWEIGHTED, MPI_INFO_NULL, &
Packit Service c5cf8c
      &                          .true., dgraph_comm, ierr)
Packit Service c5cf8c
      if (ierr .ne. MPI_SUCCESS) then
Packit Service c5cf8c
          write(6,*) "MPI_Dist_graph_create() fails!"
Packit Service c5cf8c
          call MPI_Abort(MPI_COMM_WORLD, 1, ierr)
Packit Service c5cf8c
          stop
Packit Service c5cf8c
      endif
Packit Service c5cf8c
      if (.not. validate_dgraph(dgraph_comm)) then
Packit Service c5cf8c
          write(6,*) "MPI_Dist_graph_create() does not create" &
Packit Service c5cf8c
      &               //"a bidirectional ring graph!"
Packit Service c5cf8c
          call MPI_Abort(MPI_COMM_WORLD, 1, ierr)
Packit Service c5cf8c
          stop
Packit Service c5cf8c
      endif
Packit Service c5cf8c
      call MPI_Comm_free(dgraph_comm, ierr)
Packit Service c5cf8c
Packit Service c5cf8c
! now create one with MPI_WEIGHTS_EMPTY
Packit Service c5cf8c
! NOTE that MPI_WEIGHTS_EMPTY was added in MPI-3 and does not 
Packit Service c5cf8c
! appear before then.  Incluing this test means that this test cannot
Packit Service c5cf8c
! be compiled if the MPI version is less than 3 (see the testlist file)
Packit Service c5cf8c
Packit Service c5cf8c
      degs(1) = 0;
Packit Service c5cf8c
      call MPI_Dist_graph_create(MPI_COMM_WORLD, 1, srcs, degs, dests, &
Packit Service c5cf8c
      &                           MPI_WEIGHTS_EMPTY, MPI_INFO_NULL, &
Packit Service c5cf8c
      &                          .true., dgraph_comm, ierr)
Packit Service c5cf8c
      if (ierr .ne. MPI_SUCCESS) then
Packit Service c5cf8c
          write(6,*) "MPI_Dist_graph_create() fails!"
Packit Service c5cf8c
          call MPI_Abort(MPI_COMM_WORLD, 1, ierr)
Packit Service c5cf8c
          stop
Packit Service c5cf8c
      endif
Packit Service c5cf8c
      call MPI_Comm_free(dgraph_comm, ierr)
Packit Service c5cf8c
Packit Service c5cf8c
      src_sz   = 2
Packit Service c5cf8c
      srcs(1)  = ring_rank(world_size, world_rank-1)
Packit Service c5cf8c
      srcs(2)  = ring_rank(world_size, world_rank+1)
Packit Service c5cf8c
      dest_sz  = 2
Packit Service c5cf8c
      dests(1) = ring_rank(world_size, world_rank-1)
Packit Service c5cf8c
      dests(2) = ring_rank(world_size, world_rank+1)
Packit Service c5cf8c
      call MPI_Dist_graph_create_adjacent(MPI_COMM_WORLD, &
Packit Service c5cf8c
      &                                    src_sz, srcs, &
Packit Service c5cf8c
      &                                    MPI_UNWEIGHTED, &
Packit Service c5cf8c
      &                                    dest_sz, dests, &
Packit Service c5cf8c
      &                                    MPI_UNWEIGHTED, &
Packit Service c5cf8c
      &                                    MPI_INFO_NULL, .true., &
Packit Service c5cf8c
      &                                    dgraph_comm, ierr)
Packit Service c5cf8c
      if (ierr .ne. MPI_SUCCESS) then
Packit Service c5cf8c
          write(6,*) "MPI_Dist_graph_create_adjacent() fails!"
Packit Service c5cf8c
          call MPI_Abort(MPI_COMM_WORLD, 1, ierr)
Packit Service c5cf8c
          stop
Packit Service c5cf8c
      endif
Packit Service c5cf8c
      if (.not. validate_dgraph(dgraph_comm)) then
Packit Service c5cf8c
          write(6,*) "MPI_Dist_graph_create_adjacent() does not create" &
Packit Service c5cf8c
      &               //"a bidirectional ring graph!"
Packit Service c5cf8c
          call MPI_Abort(MPI_COMM_WORLD, 1, ierr)
Packit Service c5cf8c
          stop
Packit Service c5cf8c
      endif
Packit Service c5cf8c
      call MPI_Comm_free(dgraph_comm, ierr)
Packit Service c5cf8c
Packit Service c5cf8c
! now create one with MPI_WEIGHTS_EMPTY
Packit Service c5cf8c
      src_sz   = 0
Packit Service c5cf8c
      dest_sz  = 0
Packit Service c5cf8c
      call MPI_Dist_graph_create_adjacent(MPI_COMM_WORLD, &
Packit Service c5cf8c
      &                                    src_sz, srcs, &
Packit Service c5cf8c
      &                                    MPI_WEIGHTS_EMPTY, &
Packit Service c5cf8c
      &                                    dest_sz, dests, &
Packit Service c5cf8c
      &                                    MPI_WEIGHTS_EMPTY, &
Packit Service c5cf8c
      &                                    MPI_INFO_NULL, .true., &
Packit Service c5cf8c
      &                                    dgraph_comm, ierr)
Packit Service c5cf8c
      if (ierr .ne. MPI_SUCCESS) then
Packit Service c5cf8c
          write(6,*) "MPI_Dist_graph_create_adjacent() fails!"
Packit Service c5cf8c
          call MPI_Abort(MPI_COMM_WORLD, 1, ierr)
Packit Service c5cf8c
          stop
Packit Service c5cf8c
      endif
Packit Service c5cf8c
      call MPI_Comm_free(dgraph_comm, ierr)
Packit Service c5cf8c
Packit Service c5cf8c
      call MTEST_Finalize(errs)
Packit Service c5cf8c
      end