Actual source code: ex9.c
2: static char help[]= "Scatters from a parallel vector to a sequential vector.\n\n";
4: #include <petscvec.h>
6: int main(int argc,char **argv)
7: {
8: PetscInt n = 5,i,idx2[3] = {0,2,3},idx1[3] = {0,1,2};
9: PetscMPIInt size,rank;
10: PetscScalar value;
11: Vec x,y;
12: IS is1,is2;
13: VecScatter ctx = 0;
15: PetscInitialize(&argc,&argv,(char*)0,help);
16: MPI_Comm_size(PETSC_COMM_WORLD,&size);
17: MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
19: /* create two vectors */
20: VecCreate(PETSC_COMM_WORLD,&x);
21: VecSetSizes(x,PETSC_DECIDE,size*n);
22: VecSetFromOptions(x);
23: VecCreateSeq(PETSC_COMM_SELF,n,&y);
25: /* create two index sets */
26: ISCreateGeneral(PETSC_COMM_SELF,3,idx1,PETSC_COPY_VALUES,&is1);
27: ISCreateGeneral(PETSC_COMM_SELF,3,idx2,PETSC_COPY_VALUES,&is2);
29: /* fill local part of parallel vector */
30: for (i=n*rank; i<n*(rank+1); i++) {
31: value = (PetscScalar) i;
32: VecSetValues(x,1,&i,&value,INSERT_VALUES);
33: }
34: VecAssemblyBegin(x);
35: VecAssemblyEnd(x);
37: VecView(x,PETSC_VIEWER_STDOUT_WORLD);
39: VecSet(y,-1.0);
41: VecScatterCreate(x,is1,y,is2,&ctx);
42: VecScatterBegin(ctx,x,y,INSERT_VALUES,SCATTER_FORWARD);
43: VecScatterEnd(ctx,x,y,INSERT_VALUES,SCATTER_FORWARD);
44: VecScatterDestroy(&ctx);
46: if (rank == 0) {
47: PetscPrintf(PETSC_COMM_SELF,"scattered vector\n");
48: VecView(y,PETSC_VIEWER_STDOUT_SELF);
49: }
50: ISDestroy(&is1);
51: ISDestroy(&is2);
52: VecDestroy(&x);
53: VecDestroy(&y);
55: PetscFinalize();
56: return 0;
57: }
59: /*TEST
61: test:
62: nsize: 2
64: TEST*/