xref: /petsc/src/vec/vec/tests/ex45.c (revision 6a98f8dc3f2c9149905a87dc2e9d0fedaf64e09a)
1 
2 static char help[] = "Demonstrates VecStrideSubSetScatter() and VecStrideSubSetGather().\n\n";
3 
4 /*T
5    Concepts: vectors^sub-vectors;
6    Processors: n
7 
8    Allows one to easily pull out some components of a multi-component vector and put them in another vector.
9 
10    Note that these are special cases of VecScatter
11 T*/
12 
13 /*
14   Include "petscvec.h" so that we can use vectors.  Note that this file
15   automatically includes:
16      petscsys.h       - base PETSc routines   petscis.h     - index sets
17      petscviewer.h - viewers
18 */
19 
20 #include <petscvec.h>
21 
22 int main(int argc,char **argv)
23 {
24   Vec            v,s;
25   PetscInt       i,start,end,n = 8;
26   PetscErrorCode ierr;
27   PetscScalar    value;
28   const PetscInt vidx[] = {1,2},sidx[] = {1,0};
29 
30   ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr;
31   ierr = PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL);CHKERRQ(ierr);
32 
33   /*
34       Create multi-component vector with 4 components
35   */
36   ierr = VecCreate(PETSC_COMM_WORLD,&v);CHKERRQ(ierr);
37   ierr = VecSetSizes(v,PETSC_DECIDE,n);CHKERRQ(ierr);
38   ierr = VecSetBlockSize(v,4);CHKERRQ(ierr);
39   ierr = VecSetFromOptions(v);CHKERRQ(ierr);
40 
41   /*
42       Create double-component vectors
43   */
44   ierr = VecCreate(PETSC_COMM_WORLD,&s);CHKERRQ(ierr);
45   ierr = VecSetSizes(s,PETSC_DECIDE,n/2);CHKERRQ(ierr);
46   ierr = VecSetBlockSize(s,2);CHKERRQ(ierr);
47   ierr = VecSetFromOptions(s);CHKERRQ(ierr);
48 
49   /*
50      Set the vector values
51   */
52   ierr = VecGetOwnershipRange(v,&start,&end);CHKERRQ(ierr);
53   for (i=start; i<end; i++) {
54     value = i;
55     ierr  = VecSetValues(v,1,&i,&value,INSERT_VALUES);CHKERRQ(ierr);
56   }
57 
58   /*
59      Get the components from the large multi-component vector to the small multi-component vector,
60      scale the smaller vector and then move values back to the large vector
61   */
62   ierr = VecStrideSubSetGather(v,PETSC_DETERMINE,vidx,NULL,s,INSERT_VALUES);CHKERRQ(ierr);
63   ierr = VecView(s,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
64   ierr = VecScale(s,100.0);CHKERRQ(ierr);
65 
66   ierr = VecStrideSubSetScatter(s,PETSC_DETERMINE,NULL,vidx,v,ADD_VALUES);CHKERRQ(ierr);
67   ierr = VecView(v,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
68 
69   /*
70      Get the components from the large multi-component vector to the small multi-component vector,
71      scale the smaller vector and then move values back to the large vector
72   */
73   ierr = VecStrideSubSetGather(v,2,vidx,sidx,s,INSERT_VALUES);CHKERRQ(ierr);
74   ierr = VecView(s,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
75   ierr = VecScale(s,100.0);CHKERRQ(ierr);
76 
77   ierr = VecStrideSubSetScatter(s,2,sidx,vidx,v,ADD_VALUES);CHKERRQ(ierr);
78   ierr = VecView(v,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
79 
80   /*
81      Free work space.  All PETSc objects should be destroyed when they
82      are no longer needed.
83   */
84   ierr = VecDestroy(&v);CHKERRQ(ierr);
85   ierr = VecDestroy(&s);CHKERRQ(ierr);
86   ierr = PetscFinalize();
87   return ierr;
88 }
89 
90 
91 
92 /*TEST
93 
94    test:
95       nsize: 2
96 
97 TEST*/
98