Blame src/mpi/romio/test/fmisc.f.in

Packit Service c5cf8c
! -*- Mode: Fortran; -*- 
Packit Service c5cf8c
!  
Packit Service c5cf8c
!  (C) 2001 by Argonne National Laboratory.
Packit Service c5cf8c
!      See COPYRIGHT in top-level directory.
Packit Service c5cf8c
!
Packit Service c5cf8c
      program main
Packit Service c5cf8c
      implicit none
Packit Service c5cf8c
Packit Service c5cf8c
      include 'mpif.h'
Packit Service c5cf8c
      @F77MPIOINC@
Packit Service c5cf8c
Packit Service c5cf8c
!     Fortran equivalent of misc.c
Packit Service c5cf8c
!     tests various miscellaneous functions.
Packit Service c5cf8c
Packit Service c5cf8c
      integer buf(1024), amode, fh, status(MPI_STATUS_SIZE)
Packit Service c5cf8c
      logical flag
Packit Service c5cf8c
      integer ierr, newtype, i, group
Packit Service c5cf8c
      integer etype, filetype, mynod, argc, iargc
Packit Service c5cf8c
      integer errs, toterrs
Packit Service c5cf8c
      logical verbose
Packit Service c5cf8c
      character*7 datarep
Packit Service c5cf8c
      character*1024 str    ! used to store the filename
Packit Service c5cf8c
      @FORTRAN_MPI_OFFSET@ disp, offset, filesize
Packit Service c5cf8c
      @FTESTDEFINE@
Packit Service c5cf8c
Packit Service c5cf8c
      errs = 0
Packit Service c5cf8c
      verbose = .false.
Packit Service c5cf8c
      call MPI_INIT(ierr)
Packit Service c5cf8c
      call MPI_COMM_RANK(MPI_COMM_WORLD, mynod, ierr)
Packit Service c5cf8c
Packit Service c5cf8c
!     process 0 takes the file name as a command-line argument and 
Packit Service c5cf8c
!     broadcasts it to other processes
Packit Service c5cf8c
Packit Service c5cf8c
      if (mynod .eq. 0) then
Packit Service c5cf8c
         argc = @F77IARGC@
Packit Service c5cf8c
         i = 0
Packit Service c5cf8c
         @F77GETARG@
Packit Service c5cf8c
         do while ((i .lt. argc) .and. (str .ne. '-fname'))
Packit Service c5cf8c
            i = i + 1
Packit Service c5cf8c
            @F77GETARG@
Packit Service c5cf8c
         end do
Packit Service c5cf8c
         if (i .ge. argc) then
Packit Service c5cf8c
            print *
Packit Service c5cf8c
            print *, '*#  Usage: fmisc -fname filename'
Packit Service c5cf8c
            print *
Packit Service c5cf8c
            call MPI_ABORT(MPI_COMM_WORLD, 1, ierr)
Packit Service c5cf8c
         end if
Packit Service c5cf8c
Packit Service c5cf8c
         i = i + 1
Packit Service c5cf8c
         @F77GETARG@
Packit Service c5cf8c
         call MPI_BCAST(str, 1024, MPI_CHARACTER, 0,                    &
Packit Service c5cf8c
     &        MPI_COMM_WORLD, ierr)
Packit Service c5cf8c
      else 
Packit Service c5cf8c
         call MPI_BCAST(str, 1024, MPI_CHARACTER, 0,                    &
Packit Service c5cf8c
     &        MPI_COMM_WORLD, ierr)
Packit Service c5cf8c
      end if
Packit Service c5cf8c
Packit Service c5cf8c
Packit Service c5cf8c
      call MPI_FILE_OPEN(MPI_COMM_WORLD, str,                           &
Packit Service c5cf8c
     &     MPI_MODE_CREATE + MPI_MODE_RDWR, MPI_INFO_NULL, fh, ierr)
Packit Service c5cf8c
Packit Service c5cf8c
      call MPI_FILE_WRITE(fh, buf, 1024, MPI_INTEGER, status, ierr)
Packit Service c5cf8c
Packit Service c5cf8c
      call MPI_FILE_SYNC(fh, ierr)
Packit Service c5cf8c
Packit Service c5cf8c
      call MPI_FILE_GET_AMODE(fh, amode, ierr)
Packit Service c5cf8c
      if (mynod .eq. 0 .and. verbose) then
Packit Service c5cf8c
         print *, ' testing MPI_FILE_GET_AMODE'
Packit Service c5cf8c
      end if
Packit Service c5cf8c
      if (amode .ne. (MPI_MODE_CREATE + MPI_MODE_RDWR)) then
Packit Service c5cf8c
         errs = errs + 1
Packit Service c5cf8c
         print *, 'amode is ', amode, ', should be ', MPI_MODE_CREATE   &
Packit Service c5cf8c
     &           + MPI_MODE_RDWR
Packit Service c5cf8c
      end if
Packit Service c5cf8c
Packit Service c5cf8c
      call MPI_FILE_GET_ATOMICITY(fh, flag, ierr)
Packit Service c5cf8c
      if (flag) then
Packit Service c5cf8c
         errs = errs + 1
Packit Service c5cf8c
         print *, 'atomicity is ', flag, ', should be .FALSE.'
Packit Service c5cf8c
      end if
Packit Service c5cf8c
      if (mynod .eq. 0 .and. verbose) then
Packit Service c5cf8c
         print *, ' setting atomic mode'
Packit Service c5cf8c
      end if
Packit Service c5cf8c
      call MPI_FILE_SET_ATOMICITY(fh, .TRUE., ierr)
Packit Service c5cf8c
      call MPI_FILE_GET_ATOMICITY(fh, flag, ierr)
Packit Service c5cf8c
      if (.not. flag) then
Packit Service c5cf8c
         errs = errs + 1
Packit Service c5cf8c
         print *, 'atomicity is ', flag, ', should be .TRUE.'
Packit Service c5cf8c
      end if
Packit Service c5cf8c
      call MPI_FILE_SET_ATOMICITY(fh, .FALSE., ierr)
Packit Service c5cf8c
      if (mynod .eq. 0 .and. verbose) then
Packit Service c5cf8c
         print *, ' reverting back to nonatomic mode'
Packit Service c5cf8c
      end if
Packit Service c5cf8c
Packit Service c5cf8c
      call MPI_TYPE_VECTOR(10, 10, 20, MPI_INTEGER, newtype, ierr)
Packit Service c5cf8c
      call MPI_TYPE_COMMIT(newtype, ierr)
Packit Service c5cf8c
Packit Service c5cf8c
      disp = 1000
Packit Service c5cf8c
      call MPI_FILE_SET_VIEW(fh, disp, MPI_INTEGER, newtype, 'native',  & 
Packit Service c5cf8c
     &     MPI_INFO_NULL, ierr)
Packit Service c5cf8c
      if (mynod .eq. 0 .and. verbose) then
Packit Service c5cf8c
         print *, ' testing MPI_FILE_GET_VIEW'
Packit Service c5cf8c
      end if
Packit Service c5cf8c
Packit Service c5cf8c
      disp = 0
Packit Service c5cf8c
      call MPI_FILE_GET_VIEW(fh, disp, etype, filetype, datarep, ierr)
Packit Service c5cf8c
      if ((disp .ne. 1000) .or. (datarep .ne. 'native')) then
Packit Service c5cf8c
         errs = errs + 1
Packit Service c5cf8c
         print *, 'disp = ', disp, ', datarep = ', datarep,             &
Packit Service c5cf8c
     &     ', should be 1000, native'
Packit Service c5cf8c
      end if
Packit Service c5cf8c
Packit Service c5cf8c
      if (mynod .eq. 0 .and. verbose) then
Packit Service c5cf8c
         print *, ' testing MPI_FILE_GET_BYTE_OFFSET'
Packit Service c5cf8c
      end if
Packit Service c5cf8c
      offset = 10
Packit Service c5cf8c
      call MPI_FILE_GET_BYTE_OFFSET(fh, offset, disp, ierr)
Packit Service c5cf8c
      if (disp .ne. 1080) then 
Packit Service c5cf8c
         errs = errs + 1
Packit Service c5cf8c
         print *, 'byte offset = ', disp, ', should be 1080'
Packit Service c5cf8c
      end if
Packit Service c5cf8c
Packit Service c5cf8c
      call MPI_FILE_GET_GROUP(fh, group, ierr)
Packit Service c5cf8c
Packit Service c5cf8c
      if (mynod .eq. 0 .and. verbose) then
Packit Service c5cf8c
         print *, ' setting file size to 1060 bytes'
Packit Service c5cf8c
      end if
Packit Service c5cf8c
      filesize = 1060
Packit Service c5cf8c
      call MPI_FILE_SET_SIZE(fh, filesize, ierr)
Packit Service c5cf8c
      call MPI_BARRIER(MPI_COMM_WORLD, ierr)
Packit Service c5cf8c
      call MPI_FILE_SYNC(fh, ierr)
Packit Service c5cf8c
      filesize = 0
Packit Service c5cf8c
      call MPI_FILE_GET_SIZE(fh, filesize, ierr)
Packit Service c5cf8c
      if (filesize .ne. 1060) then
Packit Service c5cf8c
         errs = errs + 1
Packit Service c5cf8c
         print *, 'file size = ', filesize, ', should be 1060'
Packit Service c5cf8c
      end if
Packit Service c5cf8c
 
Packit Service c5cf8c
      if (mynod .eq. 0 .and. verbose) then
Packit Service c5cf8c
         print *, ' seeking to eof and testing MPI_FILE_GET_POSITION'
Packit Service c5cf8c
      end if
Packit Service c5cf8c
      offset = 0
Packit Service c5cf8c
      call MPI_FILE_SEEK(fh, offset, MPI_SEEK_END, ierr)
Packit Service c5cf8c
      call MPI_FILE_GET_POSITION(fh, offset, ierr)
Packit Service c5cf8c
      if (offset .ne. 10) then 
Packit Service c5cf8c
         errs = errs + 1
Packit Service c5cf8c
         print *, 'file pointer posn = ', offset, ', should be 10'
Packit Service c5cf8c
      end if
Packit Service c5cf8c
Packit Service c5cf8c
      if (mynod .eq. 0 .and. verbose) then
Packit Service c5cf8c
         print *, ' testing MPI_FILE_GET_BYTE_OFFSET'
Packit Service c5cf8c
      end if
Packit Service c5cf8c
      call MPI_FILE_GET_BYTE_OFFSET(fh, offset, disp, ierr)
Packit Service c5cf8c
      if (disp .ne. 1080) then
Packit Service c5cf8c
         errs = errs + 1
Packit Service c5cf8c
         print *, 'byte offset = ', disp, ', should be 1080'
Packit Service c5cf8c
      end if
Packit Service c5cf8c
      call MPI_BARRIER(MPI_COMM_WORLD, ierr)
Packit Service c5cf8c
Packit Service c5cf8c
      if (mynod .eq. 0 .and. verbose) then
Packit Service c5cf8c
         print *, ' testing MPI_FILE_SEEK with MPI_SEEK_CUR'
Packit Service c5cf8c
      end if
Packit Service c5cf8c
      offset = -10
Packit Service c5cf8c
      call MPI_FILE_SEEK(fh, offset, MPI_SEEK_CUR, ierr)
Packit Service c5cf8c
      call MPI_FILE_GET_POSITION(fh, offset, ierr)
Packit Service c5cf8c
      call MPI_FILE_GET_BYTE_OFFSET(fh, offset, disp, ierr)
Packit Service c5cf8c
      if (disp .ne. 1000) then 
Packit Service c5cf8c
         errs = errs + 1
Packit Service c5cf8c
         print *, 'file pointer posn in bytes = ', disp,                &
Packit Service c5cf8c
     &     ', should be 1000'
Packit Service c5cf8c
      end if
Packit Service c5cf8c
Packit Service c5cf8c
      if (mynod .eq. 0 .and. verbose) then
Packit Service c5cf8c
         print *, ' preallocating disk space up to 8192 bytes'
Packit Service c5cf8c
      end if
Packit Service c5cf8c
      filesize = 8192
Packit Service c5cf8c
      call MPI_FILE_PREALLOCATE(fh, filesize, ierr)
Packit Service c5cf8c
Packit Service c5cf8c
      if (mynod .eq. 0 .and. verbose) then
Packit Service c5cf8c
         print *, ' closing the file and deleting it'
Packit Service c5cf8c
      end if
Packit Service c5cf8c
      call MPI_FILE_CLOSE(fh, ierr)
Packit Service c5cf8c
Packit Service c5cf8c
      call MPI_BARRIER(MPI_COMM_WORLD, ierr)
Packit Service c5cf8c
      if (mynod .eq. 0) then
Packit Service c5cf8c
         call MPI_FILE_DELETE(str, MPI_INFO_NULL, ierr)
Packit Service c5cf8c
      end if
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
      if (mynod .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_TYPE_FREE(newtype, ierr)    
Packit Service c5cf8c
      call MPI_TYPE_FREE(filetype, ierr)    
Packit Service c5cf8c
      call MPI_GROUP_FREE(group, ierr)
Packit Service c5cf8c
      call MPI_FINALIZE(ierr)
Packit Service c5cf8c
Packit Service c5cf8c
      end