Date: 2022-03-04T17:37:29+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,mySize
      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:   call PetscInitialize(PETSC_NULL_CHARACTER,ierr)
     25:   if (ierr /= 0) then
     26:    print*,'PetscInitialize failed'
     27:    stop
     28:   endif

     30:   call MPI_Comm_rank(PETSC_COMM_WORLD,rank,ierr)

     32:   call MPI_Comm_size(PETSC_COMM_WORLD,mySize,ierr);CHKERRA(ierr)  !gives number of processes in the group of comm (integer)
     33:   call PetscOptionsGetInt(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,"-m",m,flg,ierr);CHKERRA(ierr) !gives the integer value for a particular option in the database.

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

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

     56:   call PetscPrintf(PETSC_COMM_WORLD,"writing vector in binary to vector.dat ...\n",ierr);CHKERRA(ierr)
     57:   call PetscViewerBinaryOpen(PETSC_COMM_WORLD,"vector.dat",FILE_MODE_WRITE,viewer,ierr);CHKERRA(ierr)
     58:   call VecView(u,viewer,ierr);CHKERRA(ierr)
     59:   call PetscViewerDestroy(viewer,ierr);CHKERRA(ierr)
     60:   call VecDestroy(u,ierr);CHKERRA(ierr)
     61:   call PetscOptionsSetValue(PETSC_NULL_OPTIONS,"-viewer_binary_mpiio",PETSC_NULL_CHARACTER,ierr);CHKERRA(ierr)

     63: #if defined(PETSC_USE_LOG)
     64:   call PetscLogEventEnd(VECTOR_GENERATE,ierr);CHKERRA(ierr)
     65: #endif

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

     69:   ! Read new vector in binary format
     70: #if defined(PETSC_USE_LOG)
     71:   call PetscLogEventRegister("Read Vector",classid,VECTOR_READ,ierr);CHKERRA(ierr)
     72:   call PetscLogEventBegin(VECTOR_READ,ierr);CHKERRA(ierr)
     73: #endif
     74:   call PetscPrintf(PETSC_COMM_WORLD,"reading vector in binary from vector.dat ...\n",ierr);CHKERRA(ierr)
     75:   call PetscViewerBinaryOpen(PETSC_COMM_WORLD,"vector.dat",FILE_MODE_READ,viewer,ierr);CHKERRA(ierr)
     76:   call VecCreate(PETSC_COMM_WORLD,u,ierr);CHKERRA(ierr)
     77:   call VecLoad(u,viewer,ierr);CHKERRA(ierr)
     78:   call PetscViewerDestroy(viewer,ierr);CHKERRA(ierr)

     80: #if defined(PETSC_USE_LOG)
     81:   call PetscLogEventEnd(VECTOR_READ,ierr);CHKERRA(ierr)
     82: #endif
     83:   call VecView(u,PETSC_VIEWER_STDOUT_WORLD,ierr);CHKERRA(ierr)

     85:   ! Free data structures
     86:   call VecDestroy(u,ierr);CHKERRA(ierr)
     87:   call PetscFinalize(ierr);CHKERRA(ierr)

     89: end program

     91: !/*TEST
     92: !
     93: !     test:
     94: !       nsize: 1
     95: !       requires: mpiio
     96: !       output_file: output/ex5_1.out
     97: !
     98: !     test:
     99: !       suffix: 2
    100: !       nsize: 2
    101: !       requires: mpiio
    102: !       output_file: output/ex5_2.out
    103: !
    104: !TEST*/