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*/