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
redistribute_vec(DM dist_dm,PetscSF sf,Vec * v)9d71ae5a4SJacob Faibussowitsch static PetscErrorCode redistribute_vec(DM dist_dm, PetscSF sf, Vec *v)
10d71ae5a4SJacob Faibussowitsch {
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;
179566063dSJacob Faibussowitsch PetscCall(VecGetDM(*v, &dm));
189566063dSJacob Faibussowitsch PetscCall(DMGetLocalSection(dm, §ion));
199566063dSJacob Faibussowitsch PetscCall(DMViewFromOptions(dm, NULL, "-rd_dm_view"));
209566063dSJacob Faibussowitsch PetscCall(DMViewFromOptions(dist_dm, NULL, "-rd2_dm_view"));
21c4762a1bSJed Brown
229566063dSJacob Faibussowitsch PetscCall(DMClone(dm, &dist_v_dm));
239566063dSJacob Faibussowitsch PetscCall(VecCreate(PetscObjectComm((PetscObject)*v), &dist_v));
249566063dSJacob Faibussowitsch PetscCall(VecSetDM(dist_v, dist_v_dm));
259566063dSJacob Faibussowitsch PetscCall(PetscSectionCreate(PetscObjectComm((PetscObject)*v), &dist_section));
269566063dSJacob Faibussowitsch PetscCall(DMSetLocalSection(dist_v_dm, dist_section));
27c4762a1bSJed Brown
289566063dSJacob Faibussowitsch PetscCall(PetscObjectViewFromOptions((PetscObject)section, NULL, "-rd_section_view"));
299566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)dm), &rank));
309566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)dm), &size));
31c4762a1bSJed Brown for (p = 0; p < size; ++p) {
3248a46eb9SPierre Jolivet if (p == rank) PetscCall(PetscObjectViewFromOptions((PetscObject)*v, NULL, "-rd_vec_view"));
339566063dSJacob Faibussowitsch PetscCall(PetscBarrier((PetscObject)dm));
349566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD));
35c4762a1bSJed Brown }
369566063dSJacob Faibussowitsch PetscCall(DMPlexDistributeField(dm, sf, section, *v, dist_section, dist_v));
37c4762a1bSJed Brown for (p = 0; p < size; ++p) {
38c4762a1bSJed Brown if (p == rank) {
399566063dSJacob Faibussowitsch PetscCall(PetscObjectViewFromOptions((PetscObject)dist_section, NULL, "-rd2_section_view"));
409566063dSJacob Faibussowitsch PetscCall(PetscObjectViewFromOptions((PetscObject)dist_v, NULL, "-rd2_vec_view"));
41c4762a1bSJed Brown }
429566063dSJacob Faibussowitsch PetscCall(PetscBarrier((PetscObject)dm));
439566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD));
44c4762a1bSJed Brown }
45c4762a1bSJed Brown
469566063dSJacob Faibussowitsch PetscCall(PetscSectionDestroy(&dist_section));
479566063dSJacob Faibussowitsch PetscCall(DMDestroy(&dist_v_dm));
48c4762a1bSJed Brown
499566063dSJacob Faibussowitsch PetscCall(VecDestroy(v));
50c4762a1bSJed Brown *v = dist_v;
51*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
52c4762a1bSJed Brown }
53c4762a1bSJed Brown
dm_view_geometry(DM dm,Vec cell_geom,Vec face_geom)54d71ae5a4SJacob Faibussowitsch static PetscErrorCode dm_view_geometry(DM dm, Vec cell_geom, Vec face_geom)
55d71ae5a4SJacob Faibussowitsch {
56c4762a1bSJed Brown DM cell_dm, face_dm;
57c4762a1bSJed Brown PetscSection cell_section, face_section;
58c4762a1bSJed Brown const PetscScalar *cell_array, *face_array;
59c4762a1bSJed Brown const PetscInt *cells;
60c4762a1bSJed Brown PetscInt c, start_cell, end_cell;
61c4762a1bSJed Brown PetscInt f, start_face, end_face;
62c4762a1bSJed Brown PetscInt supportSize, offset;
63c4762a1bSJed Brown PetscMPIInt rank;
64c4762a1bSJed Brown
65c4762a1bSJed Brown PetscFunctionBegin;
669566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
67c4762a1bSJed Brown
68c4762a1bSJed Brown /* cells */
699566063dSJacob Faibussowitsch PetscCall(DMPlexGetHeightStratum(dm, 0, &start_cell, &end_cell));
709566063dSJacob Faibussowitsch PetscCall(VecGetDM(cell_geom, &cell_dm));
719566063dSJacob Faibussowitsch PetscCall(DMGetLocalSection(cell_dm, &cell_section));
729566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(cell_geom, &cell_array));
73c4762a1bSJed Brown
74c4762a1bSJed Brown for (c = start_cell; c < end_cell; ++c) {
75c4762a1bSJed Brown const PetscFVCellGeom *geom;
769566063dSJacob Faibussowitsch PetscCall(PetscSectionGetOffset(cell_section, c, &offset));
77c4762a1bSJed Brown geom = (PetscFVCellGeom *)&cell_array[offset];
7863a3b9bcSJacob Faibussowitsch PetscCall(PetscSynchronizedPrintf(PETSC_COMM_WORLD, "rank %d c %" PetscInt_FMT " centroid %g,%g,%g vol %g\n", rank, c, (double)geom->centroid[0], (double)geom->centroid[1], (double)geom->centroid[2], (double)geom->volume));
79c4762a1bSJed Brown }
809566063dSJacob Faibussowitsch PetscCall(PetscSynchronizedFlush(PETSC_COMM_WORLD, NULL));
819566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(cell_geom, &cell_array));
82c4762a1bSJed Brown
83c4762a1bSJed Brown /* faces */
849566063dSJacob Faibussowitsch PetscCall(DMPlexGetHeightStratum(dm, 1, &start_face, &end_face));
859566063dSJacob Faibussowitsch PetscCall(VecGetDM(face_geom, &face_dm));
869566063dSJacob Faibussowitsch PetscCall(DMGetLocalSection(face_dm, &face_section));
879566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(face_geom, &face_array));
88c4762a1bSJed Brown for (f = start_face; f < end_face; ++f) {
899566063dSJacob Faibussowitsch PetscCall(DMPlexGetSupport(dm, f, &cells));
909566063dSJacob Faibussowitsch PetscCall(DMPlexGetSupportSize(dm, f, &supportSize));
91c4762a1bSJed Brown if (supportSize > 1) {
929566063dSJacob Faibussowitsch PetscCall(PetscSectionGetOffset(face_section, f, &offset));
9363a3b9bcSJacob Faibussowitsch PetscCall(PetscSynchronizedPrintf(PETSC_COMM_WORLD, "rank %d f %" PetscInt_FMT " cells %" PetscInt_FMT ",%" PetscInt_FMT " 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])));
94c4762a1bSJed Brown }
95c4762a1bSJed Brown }
969566063dSJacob Faibussowitsch PetscCall(PetscSynchronizedFlush(PETSC_COMM_WORLD, NULL));
979566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(cell_geom, &cell_array));
98*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
99c4762a1bSJed Brown }
100c4762a1bSJed Brown
main(int argc,char ** argv)101d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
102d71ae5a4SJacob Faibussowitsch {
10330602db0SMatthew G. Knepley DM dm, redist_dm;
104c4762a1bSJed Brown PetscPartitioner part;
10530602db0SMatthew G. Knepley PetscSF redist_sf;
106c4762a1bSJed Brown Vec cell_geom, face_geom;
10730602db0SMatthew G. Knepley PetscInt overlap2 = 1;
108c4762a1bSJed Brown
109327415f7SBarry Smith PetscFunctionBeginUser;
1109566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, NULL, help));
1119566063dSJacob Faibussowitsch PetscCall(DMCreate(PETSC_COMM_WORLD, &dm));
1129566063dSJacob Faibussowitsch PetscCall(DMSetType(dm, DMPLEX));
1139566063dSJacob Faibussowitsch PetscCall(DMSetFromOptions(dm));
1149566063dSJacob Faibussowitsch PetscCall(DMViewFromOptions(dm, NULL, "-dm_view"));
115c4762a1bSJed Brown
1169566063dSJacob Faibussowitsch PetscCall(DMPlexComputeGeometryFVM(dm, &cell_geom, &face_geom));
1179566063dSJacob Faibussowitsch PetscCall(dm_view_geometry(dm, cell_geom, face_geom));
118c4762a1bSJed Brown
119c4762a1bSJed Brown /* redistribute */
1209566063dSJacob Faibussowitsch PetscCall(DMPlexGetPartitioner(dm, &part));
1219566063dSJacob Faibussowitsch PetscCall(PetscPartitionerSetFromOptions(part));
1229566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-overlap2", &overlap2, NULL));
1239566063dSJacob Faibussowitsch PetscCall(DMPlexDistribute(dm, overlap2, &redist_sf, &redist_dm));
124c4762a1bSJed Brown if (redist_dm) {
1259566063dSJacob Faibussowitsch PetscCall(redistribute_vec(redist_dm, redist_sf, &cell_geom));
1269566063dSJacob Faibussowitsch PetscCall(redistribute_vec(redist_dm, redist_sf, &face_geom));
1279566063dSJacob Faibussowitsch PetscCall(PetscObjectViewFromOptions((PetscObject)redist_sf, NULL, "-rd2_sf_view"));
1289566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "redistributed:\n"));
1299566063dSJacob Faibussowitsch PetscCall(dm_view_geometry(redist_dm, cell_geom, face_geom));
130c4762a1bSJed Brown }
131c4762a1bSJed Brown
1329566063dSJacob Faibussowitsch PetscCall(VecDestroy(&cell_geom));
1339566063dSJacob Faibussowitsch PetscCall(VecDestroy(&face_geom));
1349566063dSJacob Faibussowitsch PetscCall(PetscSFDestroy(&redist_sf));
1359566063dSJacob Faibussowitsch PetscCall(DMDestroy(&redist_dm));
1369566063dSJacob Faibussowitsch PetscCall(DMDestroy(&dm));
1379566063dSJacob Faibussowitsch PetscCall(PetscFinalize());
138b122ec5aSJacob Faibussowitsch return 0;
139c4762a1bSJed Brown }
140c4762a1bSJed Brown
141c4762a1bSJed Brown /*TEST
142c4762a1bSJed Brown
143c4762a1bSJed Brown test:
144c4762a1bSJed Brown suffix: 0
145c4762a1bSJed Brown nsize: 3
146e600fa54SMatthew 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
147c4762a1bSJed Brown
148c4762a1bSJed Brown TEST*/
149