1 2 static char help[] = "Scatters from a parallel vector to a parallel vector.\n\n"; 3 4 #include <petscvec.h> 5 6 int main(int argc,char **argv) 7 { 8 PetscInt n = 5,N,i; 9 PetscMPIInt size,rank; 10 PetscScalar value,zero = 0.0; 11 Vec x,y; 12 IS is1,is2; 13 VecScatter ctx = 0; 14 15 PetscCall(PetscInitialize(&argc,&argv,(char*)0,help)); 16 PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size)); 17 PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank)); 18 19 /* create two vectors */ 20 N = size*n; 21 PetscCall(VecCreate(PETSC_COMM_WORLD,&y)); 22 PetscCall(VecSetSizes(y,n,PETSC_DECIDE)); 23 PetscCall(VecSetFromOptions(y)); 24 25 PetscCall(VecCreate(PETSC_COMM_WORLD,&x)); 26 PetscCall(VecSetSizes(x,n,PETSC_DECIDE)); 27 PetscCall(VecSetFromOptions(x)); 28 29 /* create two index sets */ 30 PetscCall(ISCreateStride(PETSC_COMM_WORLD,n,n*rank,1,&is1)); 31 PetscCall(ISCreateStride(PETSC_COMM_WORLD,n,(n*(rank+1))%N,1,&is2)); 32 33 /* fill local part of parallel vector x */ 34 value = (PetscScalar)(rank+1); 35 for (i=n*rank; i<n*(rank+1); i++) { 36 PetscCall(VecSetValues(x,1,&i,&value,INSERT_VALUES)); 37 } 38 PetscCall(VecAssemblyBegin(x)); 39 PetscCall(VecAssemblyEnd(x)); 40 41 PetscCall(VecSet(y,zero)); 42 43 PetscCall(VecScatterCreate(x,is1,y,is2,&ctx)); 44 PetscCall(VecScatterBegin(ctx,x,y,ADD_VALUES,SCATTER_FORWARD)); 45 PetscCall(VecScatterEnd(ctx,x,y,ADD_VALUES,SCATTER_FORWARD)); 46 PetscCall(VecScatterDestroy(&ctx)); 47 48 PetscCall(VecView(y,PETSC_VIEWER_STDOUT_WORLD)); 49 50 PetscCall(VecDestroy(&x)); 51 PetscCall(VecDestroy(&y)); 52 PetscCall(ISDestroy(&is1)); 53 PetscCall(ISDestroy(&is2)); 54 55 PetscCall(PetscFinalize()); 56 return 0; 57 } 58 59 /*TEST 60 61 testset: 62 nsize: 4 63 output_file: output/ex22_1.out 64 filter: grep -v " type:" 65 diff_args: -j 66 test: 67 suffix: standard 68 args: -vec_type standard 69 test: 70 requires: cuda 71 suffix: cuda 72 args: -vec_type cuda 73 test: 74 requires: viennacl 75 suffix: viennacl 76 args: -vec_type viennacl 77 test: 78 requires: !sycl kokkos_kernels 79 suffix: kokkos 80 args: -vec_type kokkos 81 test: 82 requires: hip 83 suffix: hip 84 args: -vec_type hip 85 86 TEST*/ 87