Date: 2026-05-01T06:12:15+00:00

Actual source code: ex6f.F90

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

      5:   implicit none

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

     20:   PetscCallA(PetscInitialize(ierr))

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

     25:   m = 10
     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:   array = [(real(i)*10.0, i=1, m)]
     36:   allocate (t(1), source=m)
     37:   ! Open viewer for binary output
     38:   PetscCallA(PetscViewerBinaryOpen(PETSC_COMM_SELF, 'input.dat', FILE_MODE_WRITE, view_out, ierr))
     39:   PetscCallA(PetscViewerBinaryGetDescriptor(view_out, fd, ierr))

     41:   ! Write binary output
     42:   PetscCallA(PetscBinaryWrite(fd, t, 1_PETSC_INT_KIND, PETSC_INT, ierr))
     43:   PetscCallA(PetscBinaryWrite(fd, array, m, PETSC_SCALAR, ierr))

     45:   ! Destroy the output viewer and work array
     46:   PetscCallA(PetscViewerDestroy(view_out, ierr))
     47:   deallocate (array)

     49:   ! ----------------------------------------------------------------------
     50:   !          PART 2: Read data from file and form a vector
     51:   ! ----------------------------------------------------------------------

     53:   ! Open input binary viewer
     54:   PetscCallA(PetscViewerBinaryOpen(PETSC_COMM_SELF, 'input.dat', FILE_MODE_READ, view_in, ierr))
     55:   PetscCallA(PetscViewerBinaryGetDescriptor(view_in, fd, ierr))

     57:   ! Create vector and get pointer to data space
     58:   PetscCallA(VecCreate(PETSC_COMM_SELF, vec, ierr))
     59:   PetscCallA(VecSetSizes(vec, PETSC_DECIDE, m, ierr))

     61:   PetscCallA(VecSetFromOptions(vec, ierr))

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

     65:   ! Read data into vector
     66:   PetscCallA(PetscBinaryRead(fd, t, 1_PETSC_INT_KIND, PETSC_NULL_INTEGER, PETSC_INT, ierr))
     67:   sz = t(1)

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

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

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

     76:   ! View vector
     77:   PetscCallA(VecRestoreArray(vec, avec, ierr))
     78:   PetscCallA(VecView(vec, PETSC_VIEWER_STDOUT_SELF, ierr))

     80:   ! Free data structures
     81:   deallocate (t)
     82:   PetscCallA(VecDestroy(vec, ierr))
     83:   PetscCallA(PetscViewerDestroy(view_in, ierr))
     84:   PetscCallA(PetscFinalize(ierr))

     86: end program

     88: !/*TEST
     89: !
     90: !     test:
     91: !        output_file: output/ex6_1.out
     92: !
     93: !TEST*/