Actual source code: ex16f.F90
1: program main
2: #include <petsc/finclude/petscvec.h>
3: use petscvec
4: implicit none
6: Vec :: v,s,r
7: Vec,pointer,dimension(:) :: vecs
8: PetscInt :: i,start
9: PetscInt :: endd
10: PetscInt,parameter :: n = 20, four = 4, two = 2, one = 1
11: PetscErrorCode ierr
12: PetscScalar :: myValue
13: PetscBool :: flg
15: PetscCallA(PetscInitialize(ierr))
17: PetscCallA(PetscOptionsGetInt(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,'-n',n,flg,ierr))
19: !Create multi-component vector with 2 components
20: PetscCallA(VecCreate(PETSC_COMM_WORLD,v,ierr))
21: PetscCallA(VecSetSizes(v,PETSC_DECIDE,n,ierr))
22: PetscCallA(VecSetBlockSize(v,four,ierr))
23: PetscCallA(VecSetFromOptions(v,ierr))
25: ! Create double-component vectors
27: PetscCallA(VecCreate(PETSC_COMM_WORLD,s,ierr))
28: PetscCallA(VecSetSizes(s,PETSC_DECIDE,n/two,ierr))
29: PetscCallA(VecSetBlockSize(s,two,ierr))
30: PetscCallA(VecSetFromOptions(s,ierr))
31: PetscCallA(VecDuplicate(s,r,ierr))
32: allocate(vecs(0:2))
34: vecs(0) = s
35: vecs(1) = r
37: !Set the vector values
39: PetscCallA(VecGetOwnershipRange(v,start,endd,ierr))
40: do i=start,endd-1
41: myValue = real(i)
42: PetscCallA(VecSetValues(v,one,[i],[myValue],INSERT_VALUES,ierr))
43: end do
44: PetscCallA(VecAssemblyBegin(v,ierr));
45: PetscCallA(VecAssemblyEnd(v,ierr));
47: ! Get the components from the multi-component vector to the other vectors
49: PetscCallA(VecStrideGatherAll(v,vecs,INSERT_VALUES,ierr))
51: PetscCallA(VecView(s,PETSC_VIEWER_STDOUT_WORLD,ierr))
52: PetscCallA(VecView(r,PETSC_VIEWER_STDOUT_WORLD,ierr))
54: PetscCallA(VecStrideScatterAll(vecs,v,ADD_VALUES,ierr))
56: PetscCallA(VecView(v,PETSC_VIEWER_STDOUT_WORLD,ierr))
58: !Free work space.All PETSc objects should be destroyed when they are no longer needed.
60: deallocate(vecs)
61: PetscCallA(VecDestroy(v,ierr))
62: PetscCallA(VecDestroy(s,ierr))
63: PetscCallA(VecDestroy(r,ierr))
64: PetscCallA(PetscFinalize(ierr))
66: end program
68: !/*TEST
69: !
70: ! test:
71: ! nsize: 2
72: ! output_file: output/ex16_1.out
73: !
74: !TEST*/