xref: /petsc/src/vec/is/sf/tests/ex8.c (revision 0db4d2e0165a0ea245cec0549c2de0bb7b39e2c0)
1 static char help[]= "Test VecScatterCreateToZero, VecScatterCreateToAll\n\n";
2 
3 #include <petscvec.h>
4 int main(int argc,char **argv)
5 {
6   PetscErrorCode     ierr;
7   PetscInt           i,N=10,low,high;
8   PetscMPIInt        size,rank;
9   Vec                x,y;
10   VecScatter         vscat;
11 
12   ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr;
13   ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr);
14   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr);
15 
16   ierr = VecCreate(PETSC_COMM_WORLD,&x);CHKERRQ(ierr);
17   ierr = VecSetFromOptions(x);CHKERRQ(ierr);
18   ierr = VecSetSizes(x,PETSC_DECIDE,N);CHKERRQ(ierr);
19   ierr = VecGetOwnershipRange(x,&low,&high);CHKERRQ(ierr);
20   ierr = PetscObjectSetName((PetscObject)x,"x");CHKERRQ(ierr);
21 
22   /*-------------------------------------*/
23   /*       VecScatterCreateToZero        */
24   /*-------------------------------------*/
25 
26   /* MPI vec x = [0, 1, 2, .., N-1] */
27   for (i=low; i<high; i++) {ierr = VecSetValue(x,i,(PetscScalar)i,INSERT_VALUES);CHKERRQ(ierr);}
28   ierr = VecAssemblyBegin(x);CHKERRQ(ierr);
29   ierr = VecAssemblyEnd(x);CHKERRQ(ierr);
30 
31   ierr = PetscPrintf(PETSC_COMM_WORLD,"\nTesting VecScatterCreateToZero\n");CHKERRQ(ierr);
32   ierr = VecScatterCreateToZero(x,&vscat,&y);CHKERRQ(ierr);
33   ierr = PetscObjectSetName((PetscObject)y,"y");CHKERRQ(ierr);
34 
35   /* Test PetscSFBcastAndOp with op = MPI_REPLACE, which does y = x on rank 0 */
36   ierr = VecScatterBegin(vscat,x,y,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
37   ierr = VecScatterEnd(vscat,x,y,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
38   if (!rank) {ierr = VecView(y,PETSC_VIEWER_STDOUT_SELF);CHKERRQ(ierr);}
39 
40   /* Test PetscSFBcastAndOp with op = MPI_SUM, which does y += x */
41   ierr = VecScatterBegin(vscat,x,y,ADD_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
42   ierr = VecScatterEnd(vscat,x,y,ADD_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
43   if (!rank) {ierr = VecView(y,PETSC_VIEWER_STDOUT_SELF);CHKERRQ(ierr);}
44 
45   /* Test PetscSFReduce with op = MPI_REPLACE, which does x = y */
46   ierr = VecScatterBegin(vscat,y,x,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr);
47   ierr = VecScatterEnd(vscat,y,x,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr);
48   ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
49 
50   /* Test PetscSFReduce with op = MPI_SUM, which does x += y on x's local part on rank 0*/
51   ierr = VecScatterBegin(vscat,y,x,ADD_VALUES,SCATTER_REVERSE_LOCAL);CHKERRQ(ierr);
52   ierr = VecScatterEnd(vscat,y,x,ADD_VALUES,SCATTER_REVERSE_LOCAL);CHKERRQ(ierr);
53   ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
54 
55   ierr = VecDestroy(&y);CHKERRQ(ierr);
56   ierr = VecScatterDestroy(&vscat);CHKERRQ(ierr);
57 
58   /*-------------------------------------*/
59   /*       VecScatterCreateToAll         */
60   /*-------------------------------------*/
61   for (i=low; i<high; i++) {ierr = VecSetValue(x,i,(PetscScalar)i,INSERT_VALUES);CHKERRQ(ierr);}
62   ierr = VecAssemblyBegin(x);CHKERRQ(ierr);
63   ierr = VecAssemblyEnd(x);CHKERRQ(ierr);
64 
65   ierr = PetscPrintf(PETSC_COMM_WORLD,"\nTesting VecScatterCreateToAll\n");CHKERRQ(ierr);
66 
67   ierr = VecScatterCreateToAll(x,&vscat,&y);CHKERRQ(ierr);
68   ierr = PetscObjectSetName((PetscObject)y,"y");CHKERRQ(ierr);
69 
70   /* Test PetscSFBcastAndOp with op = MPI_REPLACE, which does y = x on all ranks */
71   ierr = VecScatterBegin(vscat,x,y,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
72   ierr = VecScatterEnd(vscat,x,y,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
73   if (!rank) {ierr = VecView(y,PETSC_VIEWER_STDOUT_SELF);CHKERRQ(ierr);}
74 
75   /* Test PetscSFBcastAndOp with op = MPI_SUM, which does y += x */
76   ierr = VecScatterBegin(vscat,x,y,ADD_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
77   ierr = VecScatterEnd(vscat,x,y,ADD_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
78   if (!rank) {ierr = VecView(y,PETSC_VIEWER_STDOUT_SELF);CHKERRQ(ierr);}
79 
80   /* Test PetscSFReduce with op = MPI_REPLACE, which does x = y */
81   ierr = VecScatterBegin(vscat,y,x,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr);
82   ierr = VecScatterEnd(vscat,y,x,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr);
83   ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
84 
85   /* Test PetscSFReduce with op = MPI_SUM, which does x += size*y */
86   ierr = VecScatterBegin(vscat,y,x,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr);
87   ierr = VecScatterEnd(vscat,y,x,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr);
88   ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
89   ierr = VecDestroy(&x);CHKERRQ(ierr);
90   ierr = VecDestroy(&y);CHKERRQ(ierr);
91   ierr = VecScatterDestroy(&vscat);CHKERRQ(ierr);
92 
93   ierr = PetscFinalize();
94   return ierr;
95 }
96 
97 /*TEST
98 
99    testset:
100       # N=10 is divisible by nsize, to trigger Allgather/Gather in SF
101       nsize: 2
102       filter: grep -v "type"
103       output_file: output/ex8_1.out
104 
105       test:
106         suffix: 1_standard
107 
108       test:
109         suffix: 1_cuda
110         args: -vec_type cuda -vecscatter_packongpu true
111         requires: cuda
112 
113       test:
114         suffix: 1_cuda_aware_mpi
115         args: -vec_type cuda -vecscatter_packongpu false
116         requires: cuda define(PETSC_HAVE_MPI_GPU_AWARE)
117 
118    testset:
119       # N=10 is not divisible by nsize, to trigger Allgatherv/Gatherv in SF
120       suffix: 2
121       nsize: 3
122       filter: grep -v "type"
123       output_file: output/ex8_2.out
124 
125       test:
126         suffix: 2_standard
127 
128       test:
129         suffix: 2_cuda
130         args: -vec_type cuda -vecscatter_packongpu true
131         requires: cuda
132 
133       test:
134         suffix: 2_cuda_aware_mpi
135         args: -vec_type cuda -vecscatter_packongpu false
136         requires: cuda define(PETSC_HAVE_MPI_GPU_AWARE)
137 
138 TEST*/
139 
140