Blame test/mpi/f08/util/mtestf08.f90

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