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