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 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