static char help[] = "Demonstrates VecStrideSubSetScatter() and VecStrideSubSetGather().\n\n"; /*T Concepts: vectors^sub-vectors; Processors: n Allows one to easily pull out some components of a multi-component vector and put them in another vector. Note that these are special cases of VecScatter T*/ /* Include "petscvec.h" so that we can use vectors. Note that this file automatically includes: petscsys.h - base PETSc routines petscis.h - index sets petscviewer.h - viewers */ #include int main(int argc,char **argv) { Vec v,s; PetscInt i,start,end,n = 8; PetscErrorCode ierr; PetscScalar value; const PetscInt vidx[] = {1,2},sidx[] = {1,0}; PetscInt miidx[2]; PetscReal mvidx[2]; ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; ierr = PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL);CHKERRQ(ierr); /* Create multi-component vector with 4 components */ ierr = VecCreate(PETSC_COMM_WORLD,&v);CHKERRQ(ierr); ierr = VecSetSizes(v,PETSC_DECIDE,n);CHKERRQ(ierr); ierr = VecSetBlockSize(v,4);CHKERRQ(ierr); ierr = VecSetFromOptions(v);CHKERRQ(ierr); /* Create double-component vectors */ ierr = VecCreate(PETSC_COMM_WORLD,&s);CHKERRQ(ierr); ierr = VecSetSizes(s,PETSC_DECIDE,n/2);CHKERRQ(ierr); ierr = VecSetBlockSize(s,2);CHKERRQ(ierr); ierr = VecSetFromOptions(s);CHKERRQ(ierr); /* Set the vector values */ ierr = VecGetOwnershipRange(v,&start,&end);CHKERRQ(ierr); for (i=start; i