Actual source code: ex16.c
2: static char help[] = "Demonstrates VecStrideScatter() and VecStrideGather() with subvectors that are also strided.\n\n";
4: /*
5: Include "petscvec.h" so that we can use vectors. Note that this file
6: automatically includes:
7: petscsys.h - base PETSc routines petscis.h - index sets
8: petscviewer.h - viewers
9: */
11: #include <petscvec.h>
13: int main(int argc,char **argv)
14: {
15: Vec v,s,r,vecs[2]; /* vectors */
16: PetscInt i,start,end,n = 20;
17: PetscScalar value;
19: PetscInitialize(&argc,&argv,(char*)0,help);
20: PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL);
22: /*
23: Create multi-component vector with 2 components
24: */
25: VecCreate(PETSC_COMM_WORLD,&v);
26: VecSetSizes(v,PETSC_DECIDE,n);
27: VecSetBlockSize(v,4);
28: VecSetFromOptions(v);
30: /*
31: Create double-component vectors
32: */
33: VecCreate(PETSC_COMM_WORLD,&s);
34: VecSetSizes(s,PETSC_DECIDE,n/2);
35: VecSetBlockSize(s,2);
36: VecSetFromOptions(s);
37: VecDuplicate(s,&r);
39: vecs[0] = s;
40: vecs[1] = r;
41: /*
42: Set the vector values
43: */
44: VecGetOwnershipRange(v,&start,&end);
45: for (i=start; i<end; i++) {
46: value = i;
47: VecSetValues(v,1,&i,&value,INSERT_VALUES);
48: }
50: /*
51: Get the components from the multi-component vector to the other vectors
52: */
53: VecStrideGatherAll(v,vecs,INSERT_VALUES);
55: VecView(s,PETSC_VIEWER_STDOUT_WORLD);
56: VecView(r,PETSC_VIEWER_STDOUT_WORLD);
58: VecStrideScatterAll(vecs,v,ADD_VALUES);
60: VecView(v,PETSC_VIEWER_STDOUT_WORLD);
62: /*
63: Free work space. All PETSc objects should be destroyed when they
64: are no longer needed.
65: */
66: VecDestroy(&v);
67: VecDestroy(&s);
68: VecDestroy(&r);
69: PetscFinalize();
70: return 0;
71: }
73: /*TEST
75: test:
76: nsize: 2
78: TEST*/