Actual source code: ex16f.F90
1: #include <petsc/finclude/petscvec.h>
2: program main
3: use petscvec
4: implicit none
6: Vec :: v, s, r
7: Vec, pointer, dimension(:) :: vecs
8: PetscInt :: i, start, endd, n
9: PetscErrorCode ierr
10: PetscScalar :: myValue
11: PetscBool :: flg
13: PetscCallA(PetscInitialize(ierr))
15: n = 20
16: PetscCallA(PetscOptionsGetInt(PETSC_NULL_OPTIONS, PETSC_NULL_CHARACTER, '-n', n, flg, ierr))
18: !Create multi-component vector with 2 components
19: PetscCallA(VecCreate(PETSC_COMM_WORLD, v, ierr))
20: PetscCallA(VecSetSizes(v, PETSC_DECIDE, n, ierr))
21: PetscCallA(VecSetBlockSize(v, 4_PETSC_INT_KIND, ierr))
22: PetscCallA(VecSetFromOptions(v, ierr))
24: ! Create double-component vectors
26: PetscCallA(VecCreate(PETSC_COMM_WORLD, s, ierr))
27: PetscCallA(VecSetSizes(s, PETSC_DECIDE, n/2_PETSC_INT_KIND, ierr))
28: PetscCallA(VecSetBlockSize(s, 2_PETSC_INT_KIND, ierr))
29: PetscCallA(VecSetFromOptions(s, ierr))
30: PetscCallA(VecDuplicate(s, r, ierr))
31: allocate (vecs(0:2))
33: vecs(0) = s
34: vecs(1) = r
36: !Set the vector values
38: PetscCallA(VecGetOwnershipRange(v, start, endd, ierr))
39: do i = start, endd - 1
40: myValue = real(i)
41: PetscCallA(VecSetValues(v, 1_PETSC_INT_KIND, [i], [myValue], INSERT_VALUES, ierr))
42: end do
43: PetscCallA(VecAssemblyBegin(v, ierr))
44: PetscCallA(VecAssemblyEnd(v, ierr))
46: ! Get the components from the multi-component vector to the other vectors
48: PetscCallA(VecStrideGatherAll(v, vecs, INSERT_VALUES, ierr))
50: PetscCallA(VecView(s, PETSC_VIEWER_STDOUT_WORLD, ierr))
51: PetscCallA(VecView(r, PETSC_VIEWER_STDOUT_WORLD, ierr))
53: PetscCallA(VecStrideScatterAll(vecs, v, ADD_VALUES, ierr))
55: PetscCallA(VecView(v, PETSC_VIEWER_STDOUT_WORLD, ierr))
57: !Free work space.All PETSc objects should be destroyed when they are no longer needed.
59: deallocate (vecs)
60: PetscCallA(VecDestroy(v, ierr))
61: PetscCallA(VecDestroy(s, ierr))
62: PetscCallA(VecDestroy(r, ierr))
63: PetscCallA(PetscFinalize(ierr))
65: end program
67: !/*TEST
68: !
69: ! test:
70: ! nsize: 2
71: ! output_file: output/ex16_1.out
72: !
73: !TEST*/