Actual source code: ex6f.F90

  1: program main
  2: #include <petsc/finclude/petscvec.h>
  3:   use petscvec

  5:   implicit none

  7:   PetscErrorCode ierr
  8:   PetscMPIInt ::   size
  9:   integer4     ::      fd
 10:   PetscInt    ::   i, sz
 11:   PetscInt, parameter   ::   m = 10
 12:   PetscInt, parameter   ::   one = 1
 13:   PetscInt, allocatable, dimension(:) :: t
 14:   PetscScalar, pointer, dimension(:) :: avec
 15:   PetscScalar, pointer, dimension(:) :: array
 16:   Vec vec
 17:   PetscViewer view_out, view_in
 18:   character(len=256) :: outstring
 19:   PetscBool :: flg

 21:   PetscCallA(PetscInitialize(ierr))

 23:   PetscCallMPIA(MPI_Comm_size(PETSC_COMM_WORLD, size, ierr))
 24:   PetscCheckA(size == 1, PETSC_COMM_SELF, PETSC_ERR_WRONG_MPI_SIZE, 'This is a uniprocessor example only!')

 26:   PetscCallA(PetscOptionsGetInt(PETSC_NULL_OPTIONS, PETSC_NULL_CHARACTER, '-m', m, flg, ierr))

 28:   ! ----------------------------------------------------------------------
 29:   !          PART 1: Write some data to a file in binary format
 30:   ! ----------------------------------------------------------------------

 32:   ! Allocate array and set values

 34:   allocate (array(0:m - 1))
 35:   do i = 0, m - 1
 36:     array(i) = real(i)*10.0
 37:   end do

 39:   allocate (t(1))
 40:   t(1) = m
 41:   ! Open viewer for binary output
 42:   PetscCallA(PetscViewerBinaryOpen(PETSC_COMM_SELF, 'input.dat', FILE_MODE_WRITE, view_out, ierr))
 43:   PetscCallA(PetscViewerBinaryGetDescriptor(view_out, fd, ierr))

 45:   ! Write binary output
 46:   PetscCallA(PetscBinaryWrite(fd, t, one, PETSC_INT, ierr))
 47:   PetscCallA(PetscBinaryWrite(fd, array, m, PETSC_SCALAR, ierr))

 49:   ! Destroy the output viewer and work array
 50:   PetscCallA(PetscViewerDestroy(view_out, ierr))
 51:   deallocate (array)

 53:   ! ----------------------------------------------------------------------
 54:   !          PART 2: Read data from file and form a vector
 55:   ! ----------------------------------------------------------------------

 57:   ! Open input binary viewer
 58:   PetscCallA(PetscViewerBinaryOpen(PETSC_COMM_SELF, 'input.dat', FILE_MODE_READ, view_in, ierr))
 59:   PetscCallA(PetscViewerBinaryGetDescriptor(view_in, fd, ierr))

 61:   ! Create vector and get pointer to data space
 62:   PetscCallA(VecCreate(PETSC_COMM_SELF, vec, ierr))
 63:   PetscCallA(VecSetSizes(vec, PETSC_DECIDE, m, ierr))

 65:   PetscCallA(VecSetFromOptions(vec, ierr))

 67:   PetscCallA(VecGetArray(vec, avec, ierr))

 69:   ! Read data into vector
 70:   PetscCallA(PetscBinaryRead(fd, t, one, PETSC_NULL_INTEGER, PETSC_INT, ierr))
 71:   sz = t(1)

 73:   PetscCheckA(sz >= 0, PETSC_COMM_SELF, PETSC_ERR_USER, 'Error: Must have array length > 0')

 75:   write (outstring, '(a,i2.2,a)') 'reading data in binary from input.dat, sz =', sz, ' ...\n'
 76:   PetscCallA(PetscPrintf(PETSC_COMM_SELF, trim(outstring), ierr))

 78:   PetscCallA(PetscBinaryRead(fd, avec, sz, PETSC_NULL_INTEGER, PETSC_SCALAR, ierr))

 80:   ! View vector
 81:   PetscCallA(VecRestoreArray(vec, avec, ierr))
 82:   PetscCallA(VecView(vec, PETSC_VIEWER_STDOUT_SELF, ierr))

 84:   ! Free data structures
 85:   deallocate (t)
 86:   PetscCallA(VecDestroy(vec, ierr))
 87:   PetscCallA(PetscViewerDestroy(view_in, ierr))
 88:   PetscCallA(PetscFinalize(ierr))

 90: end program

 92: !/*TEST
 93: !
 94: !     test:
 95: !        output_file: output/ex6_1.out
 96: !
 97: !TEST*/