1c4762a1bSJed Brown static char help[] = "Tests for point location\n\n"; 2c4762a1bSJed Brown 3c4762a1bSJed Brown #include <petscsf.h> 4c4762a1bSJed Brown #include <petscdmplex.h> 5c4762a1bSJed Brown 630602db0SMatthew G. Knepley static PetscErrorCode CreateMesh(MPI_Comm comm, DM *dm) 7c4762a1bSJed Brown { 8c4762a1bSJed Brown PetscFunctionBeginUser; 95f80ce2aSJacob Faibussowitsch CHKERRQ(DMCreate(comm, dm)); 105f80ce2aSJacob Faibussowitsch CHKERRQ(DMSetType(*dm, DMPLEX)); 115f80ce2aSJacob Faibussowitsch CHKERRQ(DMSetFromOptions(*dm)); 125f80ce2aSJacob Faibussowitsch CHKERRQ(DMViewFromOptions(*dm, NULL, "-dm_view")); 13c4762a1bSJed Brown PetscFunctionReturn(0); 14c4762a1bSJed Brown } 15c4762a1bSJed Brown 1630602db0SMatthew G. Knepley static PetscErrorCode TestLocation(DM dm) 17c4762a1bSJed Brown { 183285882aSMatthew G. Knepley Vec points; 193285882aSMatthew G. Knepley PetscSF cellSF = NULL; 203285882aSMatthew G. Knepley const PetscSFNode *cells; 213285882aSMatthew G. Knepley PetscScalar *a; 223285882aSMatthew G. Knepley PetscInt cdim, n; 23c4762a1bSJed Brown PetscInt cStart, cEnd, c; 24c4762a1bSJed Brown 25c4762a1bSJed Brown PetscFunctionBeginUser; 265f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetCoordinateDim(dm, &cdim)); 275f80ce2aSJacob Faibussowitsch CHKERRQ(DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd)); 28c4762a1bSJed Brown /* Locate all centroids */ 295f80ce2aSJacob Faibussowitsch CHKERRQ(VecCreateSeq(PETSC_COMM_SELF, (cEnd - cStart)*cdim, &points)); 305f80ce2aSJacob Faibussowitsch CHKERRQ(VecSetBlockSize(points, cdim)); 315f80ce2aSJacob Faibussowitsch CHKERRQ(VecGetArray(points, &a)); 32c4762a1bSJed Brown for (c = cStart; c < cEnd; ++c) { 33c4762a1bSJed Brown PetscReal centroid[3]; 343285882aSMatthew G. Knepley PetscInt off = (c - cStart)*cdim, d; 35c4762a1bSJed Brown 365f80ce2aSJacob Faibussowitsch CHKERRQ(DMPlexComputeCellGeometryFVM(dm, c, NULL, centroid, NULL)); 373285882aSMatthew G. Knepley for (d = 0; d < cdim; ++d) a[off+d] = centroid[d]; 38c4762a1bSJed Brown } 395f80ce2aSJacob Faibussowitsch CHKERRQ(VecRestoreArray(points, &a)); 405f80ce2aSJacob Faibussowitsch CHKERRQ(DMLocatePoints(dm, points, DM_POINTLOCATION_NONE, &cellSF)); 415f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&points)); 425f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSFGetGraph(cellSF, NULL, &n, NULL, &cells)); 433285882aSMatthew G. Knepley if (n != (cEnd - cStart)) { 443285882aSMatthew G. Knepley for (c = 0; c < n; ++c) { 455f80ce2aSJacob Faibussowitsch if (cells[c].index != c+cStart) CHKERRQ(PetscPrintf(PETSC_COMM_SELF, "Could not locate centroid of cell %D, error %D\n", c+cStart, cells[c].index)); 463285882aSMatthew G. Knepley } 4798921bdaSJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF, PETSC_ERR_PLIB, "Located %D points instead of %D", n, cEnd - cStart); 483285882aSMatthew G. Knepley } 493285882aSMatthew G. Knepley for (c = cStart; c < cEnd; ++c) { 502c71b3e2SJacob Faibussowitsch PetscCheckFalse(cells[c - cStart].index != c,PETSC_COMM_SELF, PETSC_ERR_PLIB, "Could not locate centroid of cell %D, instead found %D", c, cells[c - cStart].index); 513285882aSMatthew G. Knepley } 525f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSFDestroy(&cellSF)); 53c4762a1bSJed Brown PetscFunctionReturn(0); 54c4762a1bSJed Brown } 55c4762a1bSJed Brown 56c4762a1bSJed Brown int main(int argc, char **argv) 57c4762a1bSJed Brown { 58c4762a1bSJed Brown DM dm; 59c4762a1bSJed Brown 60*b122ec5aSJacob Faibussowitsch CHKERRQ(PetscInitialize(&argc, &argv, NULL, help)); 615f80ce2aSJacob Faibussowitsch CHKERRQ(CreateMesh(PETSC_COMM_WORLD, &dm)); 625f80ce2aSJacob Faibussowitsch CHKERRQ(TestLocation(dm)); 635f80ce2aSJacob Faibussowitsch CHKERRQ(DMDestroy(&dm)); 64*b122ec5aSJacob Faibussowitsch CHKERRQ(PetscFinalize()); 65*b122ec5aSJacob Faibussowitsch return 0; 66c4762a1bSJed Brown } 67c4762a1bSJed Brown 68c4762a1bSJed Brown /*TEST 69c4762a1bSJed Brown 70b26b5bf9SMatthew G. Knepley testset: 71b26b5bf9SMatthew G. Knepley args: -dm_plex_dim 1 -dm_plex_box_faces 10 72b26b5bf9SMatthew G. Knepley 73c4762a1bSJed Brown test: 741af33867SMatthew G. Knepley suffix: seg 75b26b5bf9SMatthew G. Knepley 76b26b5bf9SMatthew G. Knepley test: 77b26b5bf9SMatthew G. Knepley suffix: seg_hash 78b26b5bf9SMatthew G. Knepley args: -dm_refine 2 -dm_plex_hash_location 791af33867SMatthew G. Knepley 803285882aSMatthew G. Knepley testset: 813285882aSMatthew G. Knepley args: -dm_plex_box_faces 5,5 823285882aSMatthew G. Knepley 831af33867SMatthew G. Knepley test: 841af33867SMatthew G. Knepley suffix: tri 85c4762a1bSJed Brown requires: triangle 863285882aSMatthew G. Knepley 873285882aSMatthew G. Knepley test: 883285882aSMatthew G. Knepley suffix: tri_hash 893285882aSMatthew G. Knepley requires: triangle 903285882aSMatthew G. Knepley args: -dm_refine 2 -dm_plex_hash_location 911af33867SMatthew G. Knepley 921af33867SMatthew G. Knepley test: 931af33867SMatthew G. Knepley suffix: quad 943285882aSMatthew G. Knepley args: -dm_plex_simplex 0 953285882aSMatthew G. Knepley 963285882aSMatthew G. Knepley test: 973285882aSMatthew G. Knepley suffix: quad_hash 983285882aSMatthew G. Knepley args: -dm_plex_simplex 0 -dm_refine 2 -dm_plex_hash_location 993285882aSMatthew G. Knepley 1003285882aSMatthew G. Knepley testset: 1013285882aSMatthew G. Knepley args: -dm_plex_dim 3 -dm_plex_box_faces 3,3,3 1021af33867SMatthew G. Knepley 1031af33867SMatthew G. Knepley test: 1041af33867SMatthew G. Knepley suffix: tet 1051af33867SMatthew G. Knepley requires: ctetgen 1063285882aSMatthew G. Knepley 1073285882aSMatthew G. Knepley test: 1083285882aSMatthew G. Knepley suffix: tet_hash 1093285882aSMatthew G. Knepley requires: ctetgen 1103285882aSMatthew G. Knepley args: -dm_refine 1 -dm_plex_hash_location 1111af33867SMatthew G. Knepley 1121af33867SMatthew G. Knepley test: 1131af33867SMatthew G. Knepley suffix: hex 1143285882aSMatthew G. Knepley args: -dm_plex_simplex 0 1153285882aSMatthew G. Knepley 1163285882aSMatthew G. Knepley test: 1173285882aSMatthew G. Knepley suffix: hex_hash 1183285882aSMatthew G. Knepley args: -dm_plex_simplex 0 -dm_refine 1 -dm_plex_hash_location 119c4762a1bSJed Brown 120c4762a1bSJed Brown TEST*/ 121