1*1f02d56fSJunchao Zhang static const char help[] = "Test PetscSFFetchAndOp \n\n";
2*1f02d56fSJunchao Zhang
3*1f02d56fSJunchao Zhang #include <petscvec.h>
4*1f02d56fSJunchao Zhang #include <petscsf.h>
5*1f02d56fSJunchao Zhang
main(int argc,char * argv[])6*1f02d56fSJunchao Zhang int main(int argc, char *argv[])
7*1f02d56fSJunchao Zhang {
8*1f02d56fSJunchao Zhang PetscInt n, N = 12;
9*1f02d56fSJunchao Zhang PetscInt *indices;
10*1f02d56fSJunchao Zhang IS ix, iy;
11*1f02d56fSJunchao Zhang VecScatter vscat;
12*1f02d56fSJunchao Zhang Vec x, y, z;
13*1f02d56fSJunchao Zhang PetscInt rstart, rend;
14*1f02d56fSJunchao Zhang const PetscScalar *xarray;
15*1f02d56fSJunchao Zhang PetscScalar *yarray, *zarray;
16*1f02d56fSJunchao Zhang PetscMemType xmtype, ymtype, zmtype;
17*1f02d56fSJunchao Zhang
18*1f02d56fSJunchao Zhang PetscFunctionBeginUser;
19*1f02d56fSJunchao Zhang PetscCall(PetscInitialize(&argc, &argv, NULL, help));
20*1f02d56fSJunchao Zhang
21*1f02d56fSJunchao Zhang PetscCall(VecCreateFromOptions(PETSC_COMM_WORLD, NULL, 1, PETSC_DECIDE, N, &x));
22*1f02d56fSJunchao Zhang PetscCall(VecDuplicate(x, &y));
23*1f02d56fSJunchao Zhang PetscCall(VecDuplicate(x, &z));
24*1f02d56fSJunchao Zhang PetscCall(VecGetLocalSize(x, &n));
25*1f02d56fSJunchao Zhang
26*1f02d56fSJunchao Zhang PetscCall(VecGetOwnershipRange(x, &rstart, &rend));
27*1f02d56fSJunchao Zhang PetscCall(ISCreateStride(PETSC_COMM_WORLD, n, rstart, 1, &ix));
28*1f02d56fSJunchao Zhang PetscCall(PetscMalloc1(n, &indices));
29*1f02d56fSJunchao Zhang for (PetscInt i = rstart; i < rend; i++) indices[i - rstart] = i / 4;
30*1f02d56fSJunchao Zhang PetscCall(ISCreateGeneral(PETSC_COMM_WORLD, n, indices, PETSC_OWN_POINTER, &iy));
31*1f02d56fSJunchao Zhang
32*1f02d56fSJunchao Zhang // connect y[0] to x[0..3], y[1] to x[4..7], etc
33*1f02d56fSJunchao Zhang PetscCall(VecScatterCreate(y, iy, x, ix, &vscat)); // y has roots, x has leaves
34*1f02d56fSJunchao Zhang
35*1f02d56fSJunchao Zhang PetscCall(VecSet(x, 1.0));
36*1f02d56fSJunchao Zhang PetscCall(VecSet(y, 2.0));
37*1f02d56fSJunchao Zhang
38*1f02d56fSJunchao Zhang PetscCall(VecGetArrayReadAndMemType(x, &xarray, &xmtype));
39*1f02d56fSJunchao Zhang PetscCall(VecGetArrayAndMemType(y, &yarray, &ymtype));
40*1f02d56fSJunchao Zhang PetscCall(VecGetArrayWriteAndMemType(z, &zarray, &zmtype));
41*1f02d56fSJunchao Zhang
42*1f02d56fSJunchao Zhang PetscCall(PetscSFFetchAndOpWithMemTypeBegin(vscat, MPIU_SCALAR, ymtype, yarray, xmtype, xarray, zmtype, zarray, MPI_SUM));
43*1f02d56fSJunchao Zhang PetscCall(PetscSFFetchAndOpEnd(vscat, MPIU_SCALAR, yarray, xarray, zarray, MPI_SUM));
44*1f02d56fSJunchao Zhang
45*1f02d56fSJunchao Zhang PetscCall(VecRestoreArrayReadAndMemType(x, &xarray));
46*1f02d56fSJunchao Zhang PetscCall(VecRestoreArrayAndMemType(y, &yarray));
47*1f02d56fSJunchao Zhang PetscCall(VecRestoreArrayWriteAndMemType(z, &zarray));
48*1f02d56fSJunchao Zhang
49*1f02d56fSJunchao Zhang PetscCall(VecView(y, PETSC_VIEWER_STDOUT_WORLD));
50*1f02d56fSJunchao Zhang PetscCall(VecView(z, PETSC_VIEWER_STDOUT_WORLD));
51*1f02d56fSJunchao Zhang PetscCall(ISDestroy(&ix));
52*1f02d56fSJunchao Zhang PetscCall(ISDestroy(&iy));
53*1f02d56fSJunchao Zhang PetscCall(VecDestroy(&x));
54*1f02d56fSJunchao Zhang PetscCall(VecDestroy(&y));
55*1f02d56fSJunchao Zhang PetscCall(VecDestroy(&z));
56*1f02d56fSJunchao Zhang PetscCall(VecScatterDestroy(&vscat));
57*1f02d56fSJunchao Zhang PetscCall(PetscFinalize());
58*1f02d56fSJunchao Zhang }
59*1f02d56fSJunchao Zhang
60*1f02d56fSJunchao Zhang /*TEST
61*1f02d56fSJunchao Zhang testset:
62*1f02d56fSJunchao Zhang nsize: {{1 4}}
63*1f02d56fSJunchao Zhang # since FetchAndOp on complex would need to be atomic in this test
64*1f02d56fSJunchao Zhang requires: !complex
65*1f02d56fSJunchao Zhang output_file: output/ex22.out
66*1f02d56fSJunchao Zhang filter: grep -v "type" | grep -v "Process" |grep -v "Vec Object"
67*1f02d56fSJunchao Zhang
68*1f02d56fSJunchao Zhang test:
69*1f02d56fSJunchao Zhang suffix: cuda
70*1f02d56fSJunchao Zhang requires: cuda
71*1f02d56fSJunchao Zhang args: -vec_type cuda
72*1f02d56fSJunchao Zhang
73*1f02d56fSJunchao Zhang test:
74*1f02d56fSJunchao Zhang suffix: hip
75*1f02d56fSJunchao Zhang requires: hip
76*1f02d56fSJunchao Zhang args: -vec_type hip
77*1f02d56fSJunchao Zhang
78*1f02d56fSJunchao Zhang test:
79*1f02d56fSJunchao Zhang suffix: kok
80*1f02d56fSJunchao Zhang requires: kokkos_kernels
81*1f02d56fSJunchao Zhang args: -vec_type kokkos
82*1f02d56fSJunchao Zhang
83*1f02d56fSJunchao Zhang TEST*/
84