static char help[] = "Demonstrates VecStrideSubSetScatter() and VecStrideSubSetGather().\n\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 */ /* 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; PetscScalar value; const PetscInt vidx[] = {1,2},sidx[] = {1,0}; PetscInt miidx[2]; PetscReal mvidx[2]; PetscCall(PetscInitialize(&argc,&argv,(char*)0,help)); PetscCall(PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL)); /* Create multi-component vector with 4 components */ PetscCall(VecCreate(PETSC_COMM_WORLD,&v)); PetscCall(VecSetSizes(v,PETSC_DECIDE,n)); PetscCall(VecSetBlockSize(v,4)); PetscCall(VecSetFromOptions(v)); /* Create double-component vectors */ PetscCall(VecCreate(PETSC_COMM_WORLD,&s)); PetscCall(VecSetSizes(s,PETSC_DECIDE,n/2)); PetscCall(VecSetBlockSize(s,2)); PetscCall(VecSetFromOptions(s)); /* Set the vector values */ PetscCall(VecGetOwnershipRange(v,&start,&end)); for (i=start; i