static char help[] = "Load and save the mesh and fields to HDF5 and ExodusII\n\n"; #include #include #undef __FUNCT__ #define __FUNCT__ "main" int main(int argc, char **argv) { DM dm,distdm,dmnew; PetscErrorCode ierr; PetscViewer DMPlexHDF5View; PetscBool flg; PetscInt numproc; PetscSF pointSF; ierr = PetscInitialize(&argc, &argv, NULL, help); CHKERRQ(ierr); ierr = MPI_Comm_size(PETSC_COMM_WORLD,&numproc); if (numproc < 2) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_MIN_VALUE, "This example is supposed to be ran in parallel");CHKERRQ(ierr); ierr = DMPlexCreateFromFile(PETSC_COMM_WORLD, "Rect-tri3.exo", PETSC_FALSE, &dm); CHKERRQ(ierr); ierr = DMPlexDistribute(dm, 0, &pointSF, &distdm); CHKERRQ(ierr); ierr = DMSetFromOptions(dm); CHKERRQ(ierr); ierr = DMViewFromOptions(dm, NULL, "-dm_view"); CHKERRQ(ierr); ierr = DMDestroy(&dm); CHKERRQ(ierr); ierr = PetscViewerHDF5Open(PetscObjectComm((PetscObject) distdm),"distDM.h5", FILE_MODE_WRITE, &DMPlexHDF5View); CHKERRQ(ierr); ierr = DMView(distdm, DMPlexHDF5View); PetscViewerDestroy(&DMPlexHDF5View); ierr = DMCreate(PetscObjectComm((PetscObject) distdm),&dmnew); CHKERRQ(ierr); ierr = DMSetType(dmnew, DMPLEX); CHKERRQ(ierr); ierr = PetscViewerHDF5Open(PETSC_COMM_SELF,"distDM.h5", FILE_MODE_READ, &DMPlexHDF5View); CHKERRQ(ierr); ierr = DMLoad(dmnew,DMPlexHDF5View); CHKERRQ(ierr); PetscViewerDestroy(&DMPlexHDF5View); DMPlexEqual(dmnew, dm, &flg); if (flg) PetscPrintf(PETSC_COMM_WORLD,"\n DMs equal\n"); else PetscPrintf(PETSC_COMM_WORLD,"\n DMs are not equal\n\n"); ierr = DMDestroy(&distdm); CHKERRQ(ierr); ierr = DMDestroy(&dmnew); CHKERRQ(ierr); ierr = PetscFinalize(); return 0; }