1 static char help[] = "Tests save/load plex with distribution in HDF5.\n\n"; 2 3 #include <petscdmplex.h> 4 #include <petscsf.h> 5 #include <petsclayouthdf5.h> 6 7 typedef struct { 8 char fname[PETSC_MAX_PATH_LEN]; /* Output mesh filename */ 9 } AppCtx; 10 11 PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options) 12 { 13 PetscBool flg; 14 15 PetscFunctionBegin; 16 options->fname[0] = '\0'; 17 PetscOptionsBegin(comm, "", "DMPlex View/Load Test Options", "DMPLEX"); 18 PetscCall(PetscOptionsString("-fname", "The output mesh file", "ex51.c", options->fname, options->fname, sizeof(options->fname), &flg)); 19 PetscOptionsEnd(); 20 PetscFunctionReturn(PETSC_SUCCESS); 21 } 22 23 int main(int argc, char **argv) 24 { 25 const char exampleDMPlexName[] = "exampleDMPlex"; 26 const char exampleDistributionName[] = "exampleDistribution"; 27 PetscViewerFormat format = PETSC_VIEWER_HDF5_PETSC; 28 AppCtx user; 29 30 PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 31 PetscCall(ProcessOptions(PETSC_COMM_WORLD, &user)); 32 /* Save */ 33 { 34 DM dm; 35 PetscViewer viewer; 36 37 PetscCall(PetscViewerHDF5Open(PETSC_COMM_WORLD, user.fname, FILE_MODE_WRITE, &viewer)); 38 /* Save exampleDMPlex */ 39 { 40 DM pdm; 41 PetscPartitioner part; 42 const PetscInt faces[2] = {6, 1}; 43 PetscSF sf; 44 PetscInt overlap = 1; 45 46 PetscCall(DMPlexCreateBoxMesh(PETSC_COMM_WORLD, 2, PETSC_FALSE, faces, NULL, NULL, NULL, PETSC_TRUE, 0, PETSC_TRUE, &dm)); 47 PetscCall(DMPlexGetPartitioner(dm, &part)); 48 PetscCall(PetscPartitionerSetFromOptions(part)); 49 PetscCall(DMPlexDistribute(dm, overlap, &sf, &pdm)); 50 if (pdm) { 51 PetscCall(DMDestroy(&dm)); 52 dm = pdm; 53 } 54 PetscCall(PetscSFDestroy(&sf)); 55 PetscCall(PetscObjectSetName((PetscObject)dm, exampleDMPlexName)); 56 PetscCall(DMPlexDistributionSetName(dm, exampleDistributionName)); 57 PetscCall(PetscViewerPushFormat(viewer, format)); 58 PetscCall(DMPlexTopologyView(dm, viewer)); 59 PetscCall(DMPlexLabelsView(dm, viewer)); 60 PetscCall(PetscViewerPopFormat(viewer)); 61 } 62 /* Save coordinates */ 63 PetscCall(PetscViewerPushFormat(viewer, format)); 64 PetscCall(DMPlexCoordinatesView(dm, viewer)); 65 PetscCall(PetscViewerPopFormat(viewer)); 66 PetscCall(PetscObjectSetName((PetscObject)dm, "Save: DM")); 67 PetscCall(DMViewFromOptions(dm, NULL, "-dm_view")); 68 PetscCall(DMDestroy(&dm)); 69 PetscCall(PetscViewerDestroy(&viewer)); 70 } 71 /* Load */ 72 { 73 DM dm; 74 PetscSF sfXC; 75 PetscViewer viewer; 76 77 PetscCall(PetscViewerHDF5Open(PETSC_COMM_WORLD, user.fname, FILE_MODE_READ, &viewer)); 78 /* Load exampleDMPlex */ 79 PetscCall(DMCreate(PETSC_COMM_WORLD, &dm)); 80 PetscCall(DMSetType(dm, DMPLEX)); 81 PetscCall(PetscObjectSetName((PetscObject)dm, exampleDMPlexName)); 82 PetscCall(DMPlexDistributionSetName(dm, exampleDistributionName)); 83 /* sfXC: X -> C */ 84 /* X: set of globalPointNumbers, [0, N) */ 85 /* C: loaded in-memory plex */ 86 PetscCall(PetscViewerPushFormat(viewer, format)); 87 PetscCall(DMPlexTopologyLoad(dm, viewer, &sfXC)); 88 PetscCall(PetscViewerPopFormat(viewer)); 89 /* Do not distribute (Already distributed just like the saved plex) */ 90 /* Load labels */ 91 PetscCall(DMPlexLabelsLoad(dm, viewer, sfXC)); 92 /* Load coordinates */ 93 PetscCall(PetscViewerPushFormat(viewer, format)); 94 PetscCall(DMPlexCoordinatesLoad(dm, viewer, sfXC)); 95 PetscCall(PetscViewerPopFormat(viewer)); 96 PetscCall(DMSetFromOptions(dm)); 97 /* Print the exact same plex as the saved one */ 98 PetscCall(PetscObjectSetName((PetscObject)dm, "Load: DM")); 99 PetscCall(DMViewFromOptions(dm, NULL, "-dm_view")); 100 PetscCall(PetscSFDestroy(&sfXC)); 101 PetscCall(DMDestroy(&dm)); 102 PetscCall(PetscViewerDestroy(&viewer)); 103 } 104 /* Finalize */ 105 PetscCall(PetscFinalize()); 106 return 0; 107 } 108 109 /*TEST 110 111 build: 112 requires: hdf5 113 requires: !complex 114 test: 115 suffix: 0 116 requires: parmetis 117 nsize: {{1 2 4}separate output} 118 args: -fname ex51_dump.h5 -dm_view ascii::ascii_info_detail 119 args: -petscpartitioner_type parmetis 120 args: -dm_plex_view_hdf5_storage_version 2.1.0 121 122 TEST*/ 123