Actual source code: ex9.c
2: static char help[] = "Demonstrates use of VecCreateGhost().\n\n";
4: /*T
5: Concepts: vectors^assembling vectors;
6: Concepts: vectors^ghost padding;
7: Processors: n
9: Description: Ghost padding is one way to handle local calculations that
10: involve values from other processors. VecCreateGhost() provides
11: a way to create vectors with extra room at the end of the vector
12: array to contain the needed ghost values from other processors,
13: vector computations are otherwise unaffected.
14: T*/
16: /*
17: Include "petscvec.h" so that we can use vectors. Note that this file
18: automatically includes:
19: petsc.h - base PETSc routines petscis.h - index sets
20: petscsys.h - system routines petscviewer.h - viewers
21: */
22: #include petscvec.h
26: int main(int argc,char **argv)
27: {
28: PetscMPIInt rank,size;
29: PetscInt nlocal = 6,nghost = 2,ifrom[2],i,rstart,rend;
31: PetscTruth flg;
32: PetscScalar value,*array,*tarray=0;
33: Vec lx,gx,gxs;
35: PetscInitialize(&argc,&argv,(char *)0,help);
36: MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
37: MPI_Comm_size(PETSC_COMM_WORLD,&size);
38: if (size != 2) SETERRQ(1,"Must run example with two processors\n");
40: /*
41: Construct a two dimensional graph connecting nlocal degrees of
42: freedom per processor. From this we will generate the global
43: indices of needed ghost values
45: For simplicity we generate the entire graph on each processor:
46: in real application the graph would stored in parallel, but this
47: example is only to demonstrate the management of ghost padding
48: with VecCreateGhost().
50: In this example we consider the vector as representing
51: degrees of freedom in a one dimensional grid with periodic
52: boundary conditions.
54: ----Processor 1--------- ----Processor 2 --------
55: 0 1 2 3 4 5 6 7 8 9 10 11
56: |----|
57: |-------------------------------------------------|
59: */
61: if (!rank) {
62: ifrom[0] = 11; ifrom[1] = 6;
63: } else {
64: ifrom[0] = 0; ifrom[1] = 5;
65: }
67: /*
68: Create the vector with two slots for ghost points. Note that both
69: the local vector (lx) and the global vector (gx) share the same
70: array for storing vector values.
71: */
72: PetscOptionsHasName(PETSC_NULL,"-allocate",&flg);
73: if (flg) {
74: PetscMalloc((nlocal+nghost)*sizeof(PetscScalar),&tarray);
75: VecCreateGhostWithArray(PETSC_COMM_WORLD,nlocal,PETSC_DECIDE,nghost,ifrom,tarray,&gxs);
76: } else {
77: VecCreateGhost(PETSC_COMM_WORLD,nlocal,PETSC_DECIDE,nghost,ifrom,&gxs);
78: }
80: /*
81: Test VecDuplicate()
82: */
83: VecDuplicate(gxs,&gx);
84: VecDestroy(gxs);
86: /*
87: Access the local representation
88: */
89: VecGhostGetLocalForm(gx,&lx);
91: /*
92: Set the values from 0 to 12 into the "global" vector
93: */
94: VecGetOwnershipRange(gx,&rstart,&rend);
95: for (i=rstart; i<rend; i++) {
96: value = (PetscScalar) i;
97: VecSetValues(gx,1,&i,&value,INSERT_VALUES);
98: }
99: VecAssemblyBegin(gx);
100: VecAssemblyEnd(gx);
102: VecGhostUpdateBegin(gx,INSERT_VALUES,SCATTER_FORWARD);
103: VecGhostUpdateEnd(gx,INSERT_VALUES,SCATTER_FORWARD);
105: /*
106: Print out each vector, including the ghost padding region.
107: */
108: VecGetArray(lx,&array);
109: for (i=0; i<nlocal+nghost; i++) {
110: PetscSynchronizedPrintf(PETSC_COMM_WORLD,"%D %G\n",i,PetscRealPart(array[i]));
111: }
112: VecRestoreArray(lx,&array);
113: PetscSynchronizedFlush(PETSC_COMM_WORLD);
115: VecGhostRestoreLocalForm(gx,&lx);
116: VecDestroy(gx);
117: if (flg) {PetscFree(tarray);}
118: PetscFinalize();
119: return 0;
120: }
121: