#include int main(int argc,char **args) { Vec A,B,C; PetscInt sizeA = 10, m = 8; PetscInitialize(&argc,&args,NULL,NULL); VecCreate(MPI_COMM_WORLD,&C); VecSetSizes(C,PETSC_DECIDE,sizeA+m); VecSetFromOptions(C); VecCreate(MPI_COMM_WORLD,&A); VecSetSizes(A,PETSC_DECIDE,sizeA); VecSetFromOptions(A); VecCreate(MPI_COMM_WORLD,&B); VecSetSizes(B,PETSC_DECIDE,m); VecSetFromOptions(B); PetscInt start,end; IS is_fromA,is_toC1,is_fromB,is_toC2; VecScatter scatter1,scatter2; VecGetOwnershipRange(A,&start,&end); ISCreateStride(MPI_COMM_WORLD,(end-start),start,1,&is_fromA); ISCreateStride(MPI_COMM_WORLD,(end-start),start,1,&is_toC1);// this is redundant VecScatterCreate(A,is_fromA,C,is_toC1,&scatter1); VecGetSize(A,&sizeA); VecGetOwnershipRange(B,&start,&end); ISCreateStride(MPI_COMM_WORLD,(end-start),start,1,&is_fromB); ISCreateStride(MPI_COMM_WORLD,(end-start),(start+sizeA),1,&is_toC2); //shifts the index location VecScatterCreate(B,is_fromB,C,is_toC2,&scatter2); VecSetRandom(A,NULL); VecView(A,0); VecScatterBegin(scatter1,A,C,INSERT_VALUES,SCATTER_FORWARD); VecScatterEnd(scatter1,A,C,INSERT_VALUES,SCATTER_FORWARD); VecView(C,0); VecScatterBegin(scatter1,C,A,INSERT_VALUES,SCATTER_REVERSE); VecScatterEnd(scatter1,C,A,INSERT_VALUES,SCATTER_REVERSE); VecView(A,0); PetscFinalize(); return(0); }