Date: 2025-03-28T21:11:23+00:00

Actual source code: ex5f.F90

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

      6:   PetscErrorCode ::ierr
      7:   PetscMPIInt ::   rank,size
      8:   PetscInt :: i
      9:   PetscInt, parameter :: one = 1
     10:   PetscInt :: m = 10
     11:   PetscInt :: low,high,ldim,iglobal
     12:   PetscScalar :: v
     13:   Vec ::         u
     14:   PetscViewer :: viewer
     15: #if defined(PETSC_USE_LOG)
     16:   PetscClassId classid
     17: #endif

     19:   PetscBool :: flg
     20: #if defined(PETSC_USE_LOG)
     21:   PetscLogEvent  VECTOR_GENERATE,VECTOR_READ
     22: #endif

     24:   PetscCallA(PetscInitialize(ierr))

     26:   PetscCallMPIA(MPI_Comm_rank(PETSC_COMM_WORLD,rank,ierr))

     28:   PetscCallMPIA(MPI_Comm_size(PETSC_COMM_WORLD,size,ierr))  !gives number of processes in the group of comm (integer)
     29:   PetscCallA(PetscOptionsGetInt(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,'-m',m,flg,ierr)) !gives the integer value for a particular option in the database.

     31:   ! PART 1:  Generate vector, then write it in binary format */

     33: #if defined(PETSC_USE_LOG)
     34:   PetscCallA(PetscLogEventRegister('Generate Vector',classid,VECTOR_GENERATE,ierr))
     35:   PetscCallA(PetscLogEventBegin(VECTOR_GENERATE,ierr))
     36: #endif
     37:   ! Create vector
     38:   PetscCallA(VecCreate(PETSC_COMM_WORLD,u,ierr))
     39:   PetscCallA(VecSetSizes(u,PETSC_DECIDE,m,ierr))
     40:   PetscCallA(VecSetFromOptions(u,ierr))
     41:   PetscCallA(VecGetOwnershipRange(u,low,high,ierr))
     42:   PetscCallA(VecGetLocalSize(u,ldim,ierr))
     43:   do i=0,ldim-1
     44:    iglobal = i + low
     45:    v       = real(i + 100*rank)
     46:    PetscCallA(VecSetValues(u,one,[iglobal],[v],INSERT_VALUES,ierr))
     47:   end do
     48:   PetscCallA(VecAssemblyBegin(u,ierr))
     49:   PetscCallA(VecAssemblyEnd(u,ierr))
     50:   PetscCallA(VecView(u,PETSC_VIEWER_STDOUT_WORLD,ierr))

     52:   PetscCallA(PetscPrintf(PETSC_COMM_WORLD,'writing vector in binary to vector.dat ...\n',ierr))
     53:   PetscCallA(PetscViewerBinaryOpen(PETSC_COMM_WORLD,'vector.dat',FILE_MODE_WRITE,viewer,ierr))
     54:   PetscCallA(VecView(u,viewer,ierr))
     55:   PetscCallA(PetscViewerDestroy(viewer,ierr))
     56:   PetscCallA(VecDestroy(u,ierr))
     57:   PetscCallA(PetscOptionsSetValue(PETSC_NULL_OPTIONS,'-viewer_binary_mpiio',PETSC_NULL_CHARACTER,ierr))

     59: #if defined(PETSC_USE_LOG)
     60:   PetscCallA(PetscLogEventEnd(VECTOR_GENERATE,ierr))
     61: #endif

     63:   ! PART 2:  Read in vector in binary format

     65:   ! Read new vector in binary format
     66: #if defined(PETSC_USE_LOG)
     67:   PetscCallA(PetscLogEventRegister('Read Vector',classid,VECTOR_READ,ierr))
     68:   PetscCallA(PetscLogEventBegin(VECTOR_READ,ierr))
     69: #endif
     70:   PetscCallA(PetscPrintf(PETSC_COMM_WORLD,'reading vector in binary from vector.dat ...\n',ierr))
     71:   PetscCallA(PetscViewerBinaryOpen(PETSC_COMM_WORLD,'vector.dat',FILE_MODE_READ,viewer,ierr))
     72:   PetscCallA(VecCreate(PETSC_COMM_WORLD,u,ierr))
     73:   PetscCallA(VecLoad(u,viewer,ierr))
     74:   PetscCallA(PetscViewerDestroy(viewer,ierr))

     76: #if defined(PETSC_USE_LOG)
     77:   PetscCallA(PetscLogEventEnd(VECTOR_READ,ierr))
     78: #endif
     79:   PetscCallA(VecView(u,PETSC_VIEWER_STDOUT_WORLD,ierr))

     81:   ! Free data structures
     82:   PetscCallA(VecDestroy(u,ierr))
     83:   PetscCallA(PetscFinalize(ierr))

     85: end program

     87: !/*TEST
     88: !
     89: !     test:
     90: !       nsize: 1
     91: !       requires: mpiio
     92: !       output_file: output/ex5_1.out
     93: !
     94: !     test:
     95: !       suffix: 2
     96: !       nsize: 2
     97: !       requires: mpiio
     98: !       output_file: output/ex5_2.out
     99: !
    100: !TEST*/