⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 miscfilef90.f90

📁 fortran并行计算包
💻 F90
字号:
! This file created from test/mpi/f77/io/miscfilef.f with f77tof90! -*- Mode: Fortran; -*-!!  (C) 2004 by Argonne National Laboratory.!      See COPYRIGHT in top-level directory.!      program main      use mpi! iooffset.h provides a variable "offset" that is of type MPI_Offset! (in Fortran 90, kind=MPI_OFFSET_KIND)      integer (kind=MPI_OFFSET_KIND) offset! iodisp.h declares disp as an MPI_Offset integer      integer (kind=MPI_OFFSET_KIND) disp      integer rank, size      integer fh, i, group, worldgroup, result      integer ierr, errs, toterrs      integer BUFSIZE      parameter (BUFSIZE=1024)      integer buf(BUFSIZE)      character*(50) filename      character*(MPI_MAX_DATAREP_STRING) datarep      integer amode      logical atomicity      integer newtype, etype, filetype      integer integer_size, type_size!            errs = 0      call mpi_init( ierr )      call mpi_comm_rank( MPI_COMM_WORLD, rank, ierr )      call mpi_comm_size( MPI_COMM_WORLD, size, ierr )!! Create a file that we'll then query properties      filename = "testfile.txt"      call mpi_file_open( MPI_COMM_WORLD, filename, MPI_MODE_CREATE + &      &     MPI_MODE_RDWR, MPI_INFO_NULL, fh, ierr )       if (ierr .ne. MPI_SUCCESS) then         print *, "Unable to create file ", filename         call mpi_abort( MPI_COMM_WORLD, 1, ierr )      endif!! Fill in some data      do i=1, BUFSIZE         buf(i) = i      enddo      call mpi_file_write( fh, buf, BUFSIZE, MPI_INTEGER, &      &     MPI_STATUS_IGNORE, ierr )       call MPI_File_sync( fh, ierr )!! Now, query properties of the file and the file handle      call MPI_File_get_amode(fh, amode, ierr )      if (amode .ne. MPI_MODE_CREATE + MPI_MODE_RDWR) then         errs = errs + 1         print *, " Amode was different than expected"      endif!      call MPI_File_get_atomicity( fh, atomicity, ierr )      if (atomicity) then         errs = errs + 1         print *, " Atomicity was true but should be false"      endif!      call MPI_File_set_atomicity( fh, .true., ierr )      call MPI_File_get_atomicity( fh, atomicity, ierr )      if (.not. atomicity) then         errs = errs + 1         print *, " Atomicity was set to true but ", &      &        "get_atomicity returned false"       endif      call MPI_File_set_atomicity( fh, .false., ierr )!! FIXME: original code use 10,10,20, and the following code ! assumed the original! ! Create a vector type of 10 elements, each of 20 elements, with a stride of! 30 elements      call mpi_type_vector( 10, 20, 30, MPI_INTEGER, newtype, ierr )      call mpi_type_commit( newtype, ierr )!! All processes are getting the same view, with a 1000 byte offset      offset = 1000      call mpi_file_set_view( fh, offset, MPI_INTEGER, newtype, "native" &      &     , MPI_INFO_NULL, ierr )        call mpi_file_get_view( fh, offset, etype, filetype, datarep, ierr &      &     )       if (offset .ne. 1000) then         print *, " displacement was ", offset, ", expected 1000"         errs = errs + 1      endif      if (datarep .ne. "native") then         print *, " data representation form was ", datarep, &      &        ", expected native"          errs = errs + 1      endif! Find the byte offset, given an offset of 20 etypes relative to the! current view (the same as the blockcount of the filetype, which! places it at the beginning of the next block, hence a stride! distance away).       offset = 20      call mpi_file_get_byte_offset( fh, offset, disp, ierr )      call mpi_type_size( MPI_INTEGER, integer_size, ierr )      if (disp .ne. 1000 + 30 * integer_size) then         errs = errs + 1         print *, " (offset20)Byte offset = ", disp, ", should be ", 1000+20 &      &        *integer_size       endif!!     We should also compare file and etypes.  We just look at the !     sizes and extents for now      call mpi_type_size( etype, type_size, ierr )      if (type_size .ne. integer_size) then         print *, " Etype has size ", type_size, ", but should be ", &      &        integer_size          errs = errs + 1      endif      call mpi_type_size( filetype, type_size, ierr )      if (type_size .ne. 10*20*integer_size) then         print *, " filetype has size ", type_size, ", but should be ", &      &        10*20*integer_size          errs = errs + 1      endif!! Only free derived type      call mpi_type_free( filetype, ierr )      call mpi_file_get_group( fh, group, ierr )      call mpi_comm_group( MPI_COMM_WORLD, worldgroup, ierr )      call mpi_group_compare( group, worldgroup, result, ierr )            if (result .ne. MPI_IDENT) then         print *, " Group of file does not match group of comm_world"         errs = errs + 1      endif      call mpi_group_free( group, ierr )      call mpi_group_free( worldgroup, ierr )      offset = 1000+25*integer_size      call mpi_file_set_size(fh, offset, ierr )      call mpi_barrier(MPI_COMM_WORLD, ierr )      call mpi_file_sync(fh, ierr )      call mpi_file_get_size( fh, offset, ierr )      if (offset .ne. 1000+25*integer_size) then         errs = errs + 1         print *, " File size is ", offset, ", should be ", 1000 + 25 &      &        * integer_size       endif!! File size is 1000+25ints.  Seek to end.  Note that the file size! places the end of the file into the gap in the view, so seeking! to the end, which is relative to the view, needs to give the end! of the first block of 20 ints)      offset = 0      call mpi_file_seek( fh, offset, MPI_SEEK_END, ierr )      call mpi_file_get_position( fh, disp, ierr )      if (disp .ne. 20) then         errs = errs + 1         print *, "File pointer position = ", disp, ", should be 20"      endif      call mpi_file_get_byte_offset(fh, disp, offset, ierr )      if (offset .ne. 1000+30*integer_size) then         errs = errs + 1         print *, " (seek)Byte offset = ", offset, ", should be ", 1000 &      &        +30*integer_size        endif      call mpi_barrier(MPI_COMM_WORLD, ierr )      offset = -20      call mpi_file_seek(fh, offset, MPI_SEEK_CUR, ierr )      call mpi_file_get_position(fh, disp, ierr )      call mpi_file_get_byte_offset(fh, disp, offset, ierr )      if (offset .ne. 1000) then         errs = errs + 1         print *, " File pointer position in bytes = ", offset, &      &        ", should be 1000"      endif            offset = 8192      call mpi_file_preallocate(fh, offset, ierr )      offset = 0      call mpi_file_get_size( fh, offset, ierr )      if (offset .lt. 8192) then         errs = errs + 1         print *, " Size after preallocate is ", offset, &      &        ", should be at least 8192"       endif      call mpi_file_close( fh, ierr )      call mpi_barrier(MPI_COMM_WORLD, ierr )            if (rank .eq. 0) then         call MPI_File_delete(filename, MPI_INFO_NULL, ierr )      endif!! Get error summary      call MPI_Allreduce( errs, toterrs, 1, MPI_INTEGER, MPI_SUM, &      &     MPI_COMM_WORLD, ierr )      if (rank .eq. 0) then         if( toterrs .gt. 0) then            print *, "Found ", toterrs, " errors"         else             print *, " No Errors"         endif      endif      call mpi_type_free( newtype, ierr )      call mpi_finalize( ierr )      end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -