Actual source code: ex23.c
1: /*$Id: ex23.c,v 1.20 2001/09/11 16:32:10 bsmith Exp $*/
3: static char help[] = "Scatters from a parallel vector to a sequential vector.\n\
4: Using a blocked send and a strided receive.\n\n";
6: /*
7: 0 1 2 3 | 4 5 6 7 || 8 9 10 11
9: Scatter first and third block to first processor and
10: second and third block to second processor
11: */
12: #include petscvec.h
13: #include petscsys.h
17: int main(int argc,char **argv)
18: {
19: int ierr,i;
20: int size,rank,blocks[2],nlocal;
21: PetscScalar value;
22: Vec x,y;
23: IS is1,is2;
24: VecScatter ctx = 0;
26: PetscInitialize(&argc,&argv,(char*)0,help);
27: MPI_Comm_size(PETSC_COMM_WORLD,&size);
28: MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
30: if (size != 2) SETERRQ(1,"Must run with 2 processors");
32: /* create two vectors */
33: if (!rank) nlocal = 8;
34: else nlocal = 4;
35: VecCreate(PETSC_COMM_WORLD,&x);
36: VecSetSizes(x,nlocal,12);
37: VecSetFromOptions(x);
38: VecCreateSeq(PETSC_COMM_SELF,8,&y);
40: /* create two index sets */
41: if (!rank) {
42: blocks[0] = 0; blocks[1] = 8;
43: } else {
44: blocks[0] = 4; blocks[1] = 8;
45: }
46: ISCreateBlock(PETSC_COMM_SELF,4,2,blocks,&is1);
47: ISCreateStride(PETSC_COMM_SELF,8,0,1,&is2);
49: for (i=0; i<12; i++) {
50: value = i;
51: VecSetValues(x,1,&i,&value,INSERT_VALUES);
52: }
53: VecAssemblyBegin(x);
54: VecAssemblyEnd(x);
56: VecScatterCreate(x,is1,y,is2,&ctx);
57: VecScatterBegin(x,y,INSERT_VALUES,SCATTER_FORWARD,ctx);
58: VecScatterEnd(x,y,INSERT_VALUES,SCATTER_FORWARD,ctx);
59: VecScatterDestroy(ctx);
60:
61: PetscSleep(2*rank);
62: VecView(y,PETSC_VIEWER_STDOUT_SELF);
64: VecDestroy(x);
65: VecDestroy(y);
66: ISDestroy(is1);
67: ISDestroy(is2);
69: PetscFinalize();
70: return 0;
71: }
72: