|
Packit Service |
c5cf8c |
! -*- Mode: Fortran; -*-
|
|
Packit Service |
c5cf8c |
!
|
|
Packit Service |
c5cf8c |
! (C) 2014 by Argonne National Laboratory.
|
|
Packit Service |
c5cf8c |
! See COPYRIGHT in top-level directory.
|
|
Packit Service |
c5cf8c |
!
|
|
Packit Service |
c5cf8c |
subroutine MTest_Init( ierr )
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
use mpi_f08
|
|
Packit Service |
c5cf8c |
integer ierr
|
|
Packit Service |
c5cf8c |
logical flag
|
|
Packit Service |
c5cf8c |
logical dbgflag
|
|
Packit Service |
c5cf8c |
integer wrank
|
|
Packit Service |
c5cf8c |
common /mtest/ dbgflag, wrank
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
call MPI_Initialized( flag, ierr )
|
|
Packit Service |
c5cf8c |
if (.not. flag) then
|
|
Packit Service |
c5cf8c |
call MPI_Init( ierr )
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dbgflag = .false.
|
|
Packit Service |
c5cf8c |
call MPI_Comm_rank( MPI_COMM_WORLD, wrank, ierr )
|
|
Packit Service |
c5cf8c |
end
|
|
Packit Service |
c5cf8c |
!
|
|
Packit Service |
c5cf8c |
subroutine MTest_Finalize( errs )
|
|
Packit Service |
c5cf8c |
use mpi
|
|
Packit Service |
c5cf8c |
integer errs
|
|
Packit Service |
c5cf8c |
integer rank, toterrs, ierr
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
call MPI_Comm_rank( MPI_COMM_WORLD, rank, ierr )
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
call MPI_Allreduce( errs, toterrs, 1, MPI_INTEGER, MPI_SUM, &
|
|
Packit Service |
c5cf8c |
& MPI_COMM_WORLD, ierr )
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
if (rank .eq. 0) then
|
|
Packit Service |
c5cf8c |
if (toterrs .gt. 0) then
|
|
Packit Service |
c5cf8c |
print *, " Found ", toterrs, " errors"
|
|
Packit Service |
c5cf8c |
else
|
|
Packit Service |
c5cf8c |
print *, " No Errors"
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
call MPI_Finalize( ierr )
|
|
Packit Service |
c5cf8c |
end
|
|
Packit Service |
c5cf8c |
!
|
|
Packit Service |
c5cf8c |
! A simple get intracomm for now
|
|
Packit Service |
c5cf8c |
logical function MTestGetIntracomm( comm, min_size, qsmaller )
|
|
Packit Service |
c5cf8c |
use mpi_f08
|
|
Packit Service |
c5cf8c |
integer ierr
|
|
Packit Service |
c5cf8c |
integer min_size, size, rank
|
|
Packit Service |
c5cf8c |
TYPE(MPI_Comm) comm
|
|
Packit Service |
c5cf8c |
logical qsmaller
|
|
Packit Service |
c5cf8c |
integer myindex
|
|
Packit Service |
c5cf8c |
save myindex
|
|
Packit Service |
c5cf8c |
data myindex /0/
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
comm = MPI_COMM_NULL
|
|
Packit Service |
c5cf8c |
if (myindex .eq. 0) then
|
|
Packit Service |
c5cf8c |
comm = MPI_COMM_WORLD
|
|
Packit Service |
c5cf8c |
else if (myindex .eq. 1) then
|
|
Packit Service |
c5cf8c |
call mpi_comm_dup( MPI_COMM_WORLD, comm, ierr )
|
|
Packit Service |
c5cf8c |
else if (myindex .eq. 2) then
|
|
Packit Service |
c5cf8c |
call mpi_comm_size( MPI_COMM_WORLD, size, ierr )
|
|
Packit Service |
c5cf8c |
call mpi_comm_rank( MPI_COMM_WORLD, rank, ierr )
|
|
Packit Service |
c5cf8c |
call mpi_comm_split( MPI_COMM_WORLD, 0, size - rank, comm, &
|
|
Packit Service |
c5cf8c |
& ierr )
|
|
Packit Service |
c5cf8c |
else
|
|
Packit Service |
c5cf8c |
if (min_size .eq. 1 .and. myindex .eq. 3) then
|
|
Packit Service |
c5cf8c |
comm = MPI_COMM_SELF
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
myindex = mod( myindex, 4 ) + 1
|
|
Packit Service |
c5cf8c |
MTestGetIntracomm = comm /= MPI_COMM_NULL
|
|
Packit Service |
c5cf8c |
end
|
|
Packit Service |
c5cf8c |
!
|
|
Packit Service |
c5cf8c |
subroutine MTestFreeComm( comm )
|
|
Packit Service |
c5cf8c |
use mpi_f08
|
|
Packit Service |
c5cf8c |
integer ierr
|
|
Packit Service |
c5cf8c |
TYPE(MPI_Comm) comm
|
|
Packit Service |
c5cf8c |
if (comm .ne. MPI_COMM_WORLD .and. &
|
|
Packit Service |
c5cf8c |
& comm .ne. MPI_COMM_SELF .and. &
|
|
Packit Service |
c5cf8c |
& comm .ne. MPI_COMM_NULL) then
|
|
Packit Service |
c5cf8c |
call mpi_comm_free( comm, ierr )
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
end
|
|
Packit Service |
c5cf8c |
!
|
|
Packit Service |
c5cf8c |
subroutine MTestPrintError( errcode )
|
|
Packit Service |
c5cf8c |
use mpi_f08
|
|
Packit Service |
c5cf8c |
integer errcode
|
|
Packit Service |
c5cf8c |
integer errclass, slen, ierr
|
|
Packit Service |
c5cf8c |
character*(MPI_MAX_ERROR_STRING) string
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
call MPI_Error_class( errcode, errclass, ierr )
|
|
Packit Service |
c5cf8c |
call MPI_Error_string( errcode, string, slen, ierr )
|
|
Packit Service |
c5cf8c |
print *, "Error class ", errclass, "(", string(1:slen), ")"
|
|
Packit Service |
c5cf8c |
end
|
|
Packit Service |
c5cf8c |
!
|
|
Packit Service |
c5cf8c |
subroutine MTestPrintErrorMsg( msg, errcode )
|
|
Packit Service |
c5cf8c |
use mpi_f08
|
|
Packit Service |
c5cf8c |
character*(*) msg
|
|
Packit Service |
c5cf8c |
integer errcode
|
|
Packit Service |
c5cf8c |
integer errclass, slen, ierr
|
|
Packit Service |
c5cf8c |
character*(MPI_MAX_ERROR_STRING) string
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
call MPI_Error_class( errcode, errclass, ierr )
|
|
Packit Service |
c5cf8c |
call MPI_Error_string( errcode, string, slen, ierr )
|
|
Packit Service |
c5cf8c |
print *, msg, ": Error class ", errclass, " &
|
|
Packit Service |
c5cf8c |
& (", string(1:slen), ")"
|
|
Packit Service |
c5cf8c |
end
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
subroutine MTestSpawnPossible( can_spawn, errs )
|
|
Packit Service |
c5cf8c |
use mpi
|
|
Packit Service |
c5cf8c |
integer can_spawn
|
|
Packit Service |
c5cf8c |
integer errs
|
|
Packit Service |
c5cf8c |
integer(kind=MPI_ADDRESS_KIND) val
|
|
Packit Service |
c5cf8c |
integer ierror
|
|
Packit Service |
c5cf8c |
logical flag
|
|
Packit Service |
c5cf8c |
integer comm_size
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
call mpi_comm_get_attr( MPI_COMM_WORLD, MPI_UNIVERSE_SIZE, val, &
|
|
Packit Service |
c5cf8c |
& flag, ierror )
|
|
Packit Service |
c5cf8c |
if ( ierror .ne. MPI_SUCCESS ) then
|
|
Packit Service |
c5cf8c |
! MPI_UNIVERSE_SIZE keyval missing from MPI_COMM_WORLD attributes
|
|
Packit Service |
c5cf8c |
can_spawn = -1
|
|
Packit Service |
c5cf8c |
errs = errs + 1
|
|
Packit Service |
c5cf8c |
else
|
|
Packit Service |
c5cf8c |
if ( flag ) then
|
|
Packit Service |
c5cf8c |
comm_size = -1
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
call mpi_comm_size( MPI_COMM_WORLD, comm_size, ierror )
|
|
Packit Service |
c5cf8c |
if ( ierror .ne. MPI_SUCCESS ) then
|
|
Packit Service |
c5cf8c |
! MPI_COMM_SIZE failed for MPI_COMM_WORLD
|
|
Packit Service |
c5cf8c |
can_spawn = -1
|
|
Packit Service |
c5cf8c |
errs = errs + 1
|
|
Packit Service |
c5cf8c |
return
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
if ( val .le. comm_size ) then
|
|
Packit Service |
c5cf8c |
! no additional processes can be spawned
|
|
Packit Service |
c5cf8c |
can_spawn = 0
|
|
Packit Service |
c5cf8c |
else
|
|
Packit Service |
c5cf8c |
can_spawn = 1
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
else
|
|
Packit Service |
c5cf8c |
! No attribute associated with key MPI_UNIVERSE_SIZE of MPI_COMM_WORLD
|
|
Packit Service |
c5cf8c |
can_spawn = -1
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
end
|