Blame test/mpi/f90/rma/aintf90.f90

Packit 0848f5
! This file created from test/mpi/f77/rma/aintf.f with f77tof90
Packit 0848f5
! -*- Mode: Fortran; -*-
Packit 0848f5
!
Packit 0848f5
!
Packit 0848f5
!  (C) 2014 by Argonne National Laboratory.
Packit 0848f5
!      See COPYRIGHT in top-level directory.
Packit 0848f5
!
Packit 0848f5
Packit 0848f5
! This program tests MPI_Aint_add/diff in MPI-3.1.
Packit 0848f5
! The two functions are often used in RMA code.
Packit 0848f5
! See https://svn.mpi-forum.org/trac/mpi-forum-web/ticket/349
Packit 0848f5
Packit 0848f5
      program main
Packit 0848f5
      use mpi
Packit 0848f5
      integer :: rank, nproc
Packit 0848f5
      integer :: ierr, errs
Packit 0848f5
      integer :: array(0:1023)
Packit 0848f5
      integer :: val, target_rank;
Packit 0848f5
      integer(kind=MPI_ADDRESS_KIND) :: bases(0:1), disp, offset
Packit 0848f5
      integer(kind=MPI_ADDRESS_KIND) :: winsize
Packit 0848f5
      integer :: win
Packit 0848f5
      integer :: intsize
Packit 0848f5
Packit 0848f5
Packit 0848f5
Packit 0848f5
Packit 0848f5
      errs = 0
Packit 0848f5
      call mtest_init(ierr);
Packit 0848f5
      call MPI_Comm_rank(MPI_COMM_WORLD, rank, ierr)
Packit 0848f5
      call MPI_Comm_size(MPI_COMM_WORLD, nproc, ierr)
Packit 0848f5
Packit 0848f5
      if (rank == 0 .and. nproc /= 2) then
Packit 0848f5
        print *, 'Must run with 2 ranks'
Packit 0848f5
        call MPI_Abort(MPI_COMM_WORLD, 1, ierr)
Packit 0848f5
      endif
Packit 0848f5
Packit 0848f5
! Get the base address in the middle of the array
Packit 0848f5
      if (rank == 0) then
Packit 0848f5
        target_rank = 1
Packit 0848f5
        array(0) = 1234
Packit 0848f5
        call MPI_Get_address(array(512), bases(0), ierr)
Packit 0848f5
      else if (rank == 1) then
Packit 0848f5
        target_rank = 0
Packit 0848f5
        array(1023) = 1234
Packit 0848f5
        call MPI_Get_address(array(512), bases(1), ierr)
Packit 0848f5
      endif
Packit 0848f5
Packit 0848f5
! Exchange bases
Packit 0848f5
      call MPI_Type_size(MPI_INTEGER, intsize, ierr);
Packit 0848f5
Packit 0848f5
      call MPI_Allgather(MPI_IN_PLACE, 0, MPI_DATATYPE_NULL, bases, &
Packit 0848f5
      &                   1, MPI_AINT, MPI_COMM_WORLD, ierr)
Packit 0848f5
Packit 0848f5
      call MPI_Win_create_dynamic(MPI_INFO_NULL, &
Packit 0848f5
      &                            MPI_COMM_WORLD, win, ierr)
Packit 0848f5
Packit 0848f5
      winsize = intsize*1024
Packit 0848f5
      call MPI_Win_attach(win, array, winsize, ierr)
Packit 0848f5
Packit 0848f5
! Do MPI_Aint addressing arithmetic
Packit 0848f5
      if (rank == 0) then
Packit 0848f5
        disp = intsize*511
Packit 0848f5
        offset = MPI_Aint_add(bases(1), disp)
Packit 0848f5
      else if (rank == 1) then
Packit 0848f5
        disp = intsize*512
Packit 0848f5
        offset = MPI_Aint_diff(bases(0), disp)
Packit 0848f5
      endif
Packit 0848f5
Packit 0848f5
! Get value and verify it
Packit 0848f5
      call MPI_Win_fence(MPI_MODE_NOPRECEDE, win, ierr)
Packit 0848f5
      call MPI_Get(val, 1, MPI_INTEGER, target_rank, &
Packit 0848f5
      &             offset, 1, MPI_INTEGER, win, ierr)
Packit 0848f5
      call MPI_Win_fence(MPI_MODE_NOSUCCEED, win, ierr)
Packit 0848f5
Packit 0848f5
      if (val /= 1234) then
Packit 0848f5
        errs = errs + 1
Packit 0848f5
        print *, rank, ' -- Got', val, 'expected 1234'
Packit 0848f5
      endif
Packit 0848f5
Packit 0848f5
      call MPI_Win_detach(win, array, ierr)
Packit 0848f5
      call MPI_Win_free(win, ierr)
Packit 0848f5
Packit 0848f5
      call MTest_Finalize(errs)
Packit 0848f5
      call MPI_Finalize(ierr);
Packit 0848f5
      end