1c4762a1bSJed Brown static char help[] = "Tests interpolation and output of hybrid meshes\n\n"; 2c4762a1bSJed Brown 3c4762a1bSJed Brown #include <petscdmplex.h> 4c4762a1bSJed Brown #include <petscsf.h> 5c4762a1bSJed Brown 6c4762a1bSJed Brown /* Much can be learned using 7c4762a1bSJed Brown -rd_dm_view -rd2_dm_view -rd_section_view -rd_vec_view -rd2_section_view */ 8c4762a1bSJed Brown 9c4762a1bSJed Brown static PetscErrorCode redistribute_vec(DM dist_dm, PetscSF sf, Vec *v) 10c4762a1bSJed Brown { 11c4762a1bSJed Brown DM dm, dist_v_dm; 12c4762a1bSJed Brown PetscSection section, dist_section; 13c4762a1bSJed Brown Vec dist_v; 14c4762a1bSJed Brown PetscMPIInt rank, size, p; 15c4762a1bSJed Brown 16c4762a1bSJed Brown PetscFunctionBegin; 17*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecGetDM(*v, &dm)); 18*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetLocalSection(dm, §ion)); 19*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMViewFromOptions(dm, NULL, "-rd_dm_view")); 20*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMViewFromOptions(dist_dm, NULL, "-rd2_dm_view")); 21c4762a1bSJed Brown 22*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMClone(dm, &dist_v_dm)); 23*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecCreate(PetscObjectComm((PetscObject) *v), &dist_v)); 24*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecSetDM(dist_v, dist_v_dm)); 25*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSectionCreate(PetscObjectComm((PetscObject) *v), &dist_section)); 26*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMSetLocalSection(dist_v_dm, dist_section)); 27c4762a1bSJed Brown 28*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectViewFromOptions((PetscObject) section, NULL, "-rd_section_view")); 29*5f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_rank(PetscObjectComm((PetscObject) dm), &rank)); 30*5f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_size(PetscObjectComm((PetscObject) dm), &size)); 31c4762a1bSJed Brown for (p = 0; p < size; ++p) { 32c4762a1bSJed Brown if (p == rank) { 33*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectViewFromOptions((PetscObject) *v, NULL, "-rd_vec_view"));} 34*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscBarrier((PetscObject) dm)); 35*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD)); 36c4762a1bSJed Brown } 37*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMPlexDistributeField(dm, sf, section, *v, dist_section, dist_v)); 38c4762a1bSJed Brown for (p = 0; p < size; ++p) { 39c4762a1bSJed Brown if (p == rank) { 40*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectViewFromOptions((PetscObject) dist_section, NULL, "-rd2_section_view")); 41*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectViewFromOptions((PetscObject) dist_v, NULL, "-rd2_vec_view")); 42c4762a1bSJed Brown } 43*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscBarrier((PetscObject) dm)); 44*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD)); 45c4762a1bSJed Brown } 46c4762a1bSJed Brown 47*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSectionDestroy(&dist_section)); 48*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDestroy(&dist_v_dm)); 49c4762a1bSJed Brown 50*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(v)); 51c4762a1bSJed Brown *v = dist_v; 52c4762a1bSJed Brown PetscFunctionReturn(0); 53c4762a1bSJed Brown } 54c4762a1bSJed Brown 55c4762a1bSJed Brown static PetscErrorCode dm_view_geometry(DM dm, Vec cell_geom, Vec face_geom) 56c4762a1bSJed Brown { 57c4762a1bSJed Brown DM cell_dm, face_dm; 58c4762a1bSJed Brown PetscSection cell_section, face_section; 59c4762a1bSJed Brown const PetscScalar *cell_array, *face_array; 60c4762a1bSJed Brown const PetscInt *cells; 61c4762a1bSJed Brown PetscInt c, start_cell, end_cell; 62c4762a1bSJed Brown PetscInt f, start_face, end_face; 63c4762a1bSJed Brown PetscInt supportSize, offset; 64c4762a1bSJed Brown PetscMPIInt rank; 65c4762a1bSJed Brown 66c4762a1bSJed Brown PetscFunctionBegin; 67*5f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 68c4762a1bSJed Brown 69c4762a1bSJed Brown /* cells */ 70*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMPlexGetHeightStratum(dm, 0, &start_cell, &end_cell)); 71*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecGetDM(cell_geom, &cell_dm)); 72*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetLocalSection(cell_dm, &cell_section)); 73*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecGetArrayRead(cell_geom, &cell_array)); 74c4762a1bSJed Brown 75c4762a1bSJed Brown for (c = start_cell; c < end_cell; ++c) { 76c4762a1bSJed Brown const PetscFVCellGeom *geom; 77*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSectionGetOffset(cell_section, c, &offset)); 78c4762a1bSJed Brown geom = (PetscFVCellGeom*)&cell_array[offset]; 79*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSynchronizedPrintf(PETSC_COMM_WORLD, "rank %d c %D centroid %g,%g,%g vol %g\n", rank, c, (double)geom->centroid[0], (double)geom->centroid[1], (double)geom->centroid[2], (double)geom->volume)); 80c4762a1bSJed Brown } 81*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSynchronizedFlush(PETSC_COMM_WORLD, NULL)); 82*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecRestoreArrayRead(cell_geom, &cell_array)); 83c4762a1bSJed Brown 84c4762a1bSJed Brown /* faces */ 85*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMPlexGetHeightStratum(dm, 1, &start_face, &end_face)); 86*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecGetDM(face_geom, &face_dm)); 87*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetLocalSection(face_dm, &face_section)); 88*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecGetArrayRead(face_geom, &face_array)); 89c4762a1bSJed Brown for (f = start_face; f < end_face; ++f) { 90*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMPlexGetSupport(dm, f, &cells)); 91*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMPlexGetSupportSize(dm, f, &supportSize)); 92c4762a1bSJed Brown if (supportSize > 1) { 93*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSectionGetOffset(face_section, f, &offset)); 94*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSynchronizedPrintf(PETSC_COMM_WORLD, "rank %d f %D cells %D,%D normal %g,%g,%g centroid %g,%g,%g\n", rank, f, cells[0], cells[1], (double) PetscRealPart(face_array[offset+0]), (double) PetscRealPart(face_array[offset+1]), (double) PetscRealPart(face_array[offset+2]), (double) PetscRealPart(face_array[offset+3]), (double) PetscRealPart(face_array[offset+4]), (double) PetscRealPart(face_array[offset+5]))); 95c4762a1bSJed Brown } 96c4762a1bSJed Brown } 97*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSynchronizedFlush(PETSC_COMM_WORLD, NULL)); 98*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecRestoreArrayRead(cell_geom, &cell_array)); 99c4762a1bSJed Brown PetscFunctionReturn(0); 100c4762a1bSJed Brown } 101c4762a1bSJed Brown 102c4762a1bSJed Brown int main(int argc, char **argv) 103c4762a1bSJed Brown { 10430602db0SMatthew G. Knepley DM dm, redist_dm; 105c4762a1bSJed Brown PetscPartitioner part; 10630602db0SMatthew G. Knepley PetscSF redist_sf; 107c4762a1bSJed Brown Vec cell_geom, face_geom; 10830602db0SMatthew G. Knepley PetscInt overlap2 = 1; 109c4762a1bSJed Brown PetscErrorCode ierr; 110c4762a1bSJed Brown 111c4762a1bSJed Brown ierr = PetscInitialize(&argc, &argv, NULL, help); if (ierr) return ierr; 112*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMCreate(PETSC_COMM_WORLD, &dm)); 113*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMSetType(dm, DMPLEX)); 114*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMSetFromOptions(dm)); 115*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMViewFromOptions(dm, NULL, "-dm_view")); 116c4762a1bSJed Brown 117*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMPlexComputeGeometryFVM(dm, &cell_geom, &face_geom)); 118*5f80ce2aSJacob Faibussowitsch CHKERRQ(dm_view_geometry(dm, cell_geom, face_geom)); 119c4762a1bSJed Brown 120c4762a1bSJed Brown /* redistribute */ 121*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMPlexGetPartitioner(dm, &part)); 122*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPartitionerSetFromOptions(part)); 123*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL, NULL, "-overlap2", &overlap2, NULL)); 124*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMPlexDistribute(dm, overlap2, &redist_sf, &redist_dm)); 125c4762a1bSJed Brown if (redist_dm) { 126*5f80ce2aSJacob Faibussowitsch CHKERRQ(redistribute_vec(redist_dm, redist_sf, &cell_geom)); 127*5f80ce2aSJacob Faibussowitsch CHKERRQ(redistribute_vec(redist_dm, redist_sf, &face_geom)); 128*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectViewFromOptions((PetscObject) redist_sf, NULL, "-rd2_sf_view")); 129*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD, "redistributed:\n")); 130*5f80ce2aSJacob Faibussowitsch CHKERRQ(dm_view_geometry(redist_dm, cell_geom, face_geom)); 131c4762a1bSJed Brown } 132c4762a1bSJed Brown 133*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&cell_geom)); 134*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&face_geom)); 135*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSFDestroy(&redist_sf)); 136*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDestroy(&redist_dm)); 137*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDestroy(&dm)); 138c4762a1bSJed Brown ierr = PetscFinalize(); 139c4762a1bSJed Brown return ierr; 140c4762a1bSJed Brown } 141c4762a1bSJed Brown 142c4762a1bSJed Brown /*TEST 143c4762a1bSJed Brown 144c4762a1bSJed Brown test: 145c4762a1bSJed Brown suffix: 0 146c4762a1bSJed Brown nsize: 3 147e600fa54SMatthew G. Knepley args: -dm_plex_dim 3 -dm_plex_box_faces 8,1,1 -dm_plex_simplex 0 -dm_plex_adj_cone 1 -dm_plex_adj_closure 0 -petscpartitioner_type simple -dm_distribute_overlap 1 -overlap2 1 148c4762a1bSJed Brown 149c4762a1bSJed Brown TEST*/ 150