Actual source code: ex20.c

  1: static char help[] = "Test PetscSFSetGraphFromCoordinates()\n\n";

  3: #include <petscsf.h>

  5: int main(int argc, char **argv)
  6: {
  7:   PetscSF     sf;
  8:   MPI_Comm    comm;
  9:   PetscMPIInt rank, size;
 10:   PetscInt    height = 2, width = 3, nroots = height, nleaves, dim = 2;
 11:   PetscReal  *rootcoords, *leafcoords;
 12:   PetscViewer viewer;

 14:   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
 15:   comm = PETSC_COMM_WORLD;
 16:   PetscCallMPI(MPI_Comm_rank(comm, &rank));
 17:   PetscCallMPI(MPI_Comm_size(comm, &size));

 19:   nleaves = (width - (rank == 0) - (rank == size - 1)) * height;
 20:   PetscCall(PetscMalloc2(nroots * dim, &rootcoords, nleaves * dim, &leafcoords));
 21:   for (PetscInt i = 0; i < height; i++) {
 22:     rootcoords[i * dim + 0] = 0.1 * rank;
 23:     rootcoords[i * dim + 1] = 1. * i;
 24:     for (PetscInt j = 0, l = 0; j < width; j++) {
 25:       if (rank + j - 1 < 0 || rank + j - 1 >= size) continue;
 26:       leafcoords[(i * nleaves / height + l) * dim + 0] = 0.1 * (rank + j - 1);
 27:       leafcoords[(i * nleaves / height + l) * dim + 1] = 1. * i;
 28:       l++;
 29:     }
 30:   }
 31:   viewer = PETSC_VIEWER_STDOUT_WORLD;
 32:   PetscCall(PetscPrintf(comm, "Roots by rank\n"));
 33:   PetscCall(PetscRealView(nroots * dim, rootcoords, viewer));
 34:   PetscCall(PetscPrintf(comm, "Leaves by rank\n"));
 35:   PetscCall(PetscRealView(nleaves * dim, leafcoords, viewer));

 37:   PetscCall(PetscSFCreate(comm, &sf));
 38:   PetscCall(PetscSFSetGraphFromCoordinates(sf, nroots, nleaves, dim, 1e-10, rootcoords, leafcoords));

 40:   PetscCall(PetscSFViewFromOptions(sf, NULL, "-sf_view"));
 41:   PetscCall(PetscFree2(rootcoords, leafcoords));
 42:   PetscCall(PetscSFDestroy(&sf));
 43:   PetscCall(PetscFinalize());
 44:   return 0;
 45: }

 47: /*TEST
 48:   test:
 49:     suffix: 1
 50:     nsize: 3
 51:     args: -sf_view
 52: TEST*/