1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I "petscdmmoab.h" I*/ 28cbae1a6SVijay Mahadevan #include <petscdmmoab.h> 38cbae1a6SVijay Mahadevan 4d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMMoab_GetWriteOptions_Private(PetscInt fsetid, PetscInt numproc, PetscInt dim, MoabWriteMode mode, PetscInt dbglevel, const char *dm_opts, const char *extra_opts, const char **write_opts) 5d71ae5a4SJacob Faibussowitsch { 66acfe860SVijay Mahadevan char *wopts; 761eb6e27SVijay Mahadevan char wopts_par[PETSC_MAX_PATH_LEN]; 861eb6e27SVijay Mahadevan char wopts_parid[PETSC_MAX_PATH_LEN]; 961eb6e27SVijay Mahadevan char wopts_dbg[PETSC_MAX_PATH_LEN]; 108cbae1a6SVijay Mahadevan PetscFunctionBegin; 118cbae1a6SVijay Mahadevan 129566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(PETSC_MAX_PATH_LEN, &wopts)); 139566063dSJacob Faibussowitsch PetscCall(PetscMemzero(&wopts_par, PETSC_MAX_PATH_LEN)); 149566063dSJacob Faibussowitsch PetscCall(PetscMemzero(&wopts_parid, PETSC_MAX_PATH_LEN)); 159566063dSJacob Faibussowitsch PetscCall(PetscMemzero(&wopts_dbg, PETSC_MAX_PATH_LEN)); 1661eb6e27SVijay Mahadevan 178cbae1a6SVijay Mahadevan // do parallel read unless only one processor 188cbae1a6SVijay Mahadevan if (numproc > 1) { 199566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(wopts_par, PETSC_MAX_PATH_LEN, "PARALLEL=%s;", MoabWriteModes[mode])); 2048a46eb9SPierre Jolivet if (fsetid >= 0) PetscCall(PetscSNPrintf(wopts_parid, PETSC_MAX_PATH_LEN, "PARALLEL_COMM=%d;", fsetid)); 218cbae1a6SVijay Mahadevan } 228cbae1a6SVijay Mahadevan 2348a46eb9SPierre Jolivet if (dbglevel) PetscCall(PetscSNPrintf(wopts_dbg, PETSC_MAX_PATH_LEN, "CPUTIME;DEBUG_IO=%d;", dbglevel)); 248cbae1a6SVijay Mahadevan 259566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(wopts, PETSC_MAX_PATH_LEN, "%s%s%s%s%s", wopts_par, wopts_parid, wopts_dbg, (extra_opts ? extra_opts : ""), (dm_opts ? dm_opts : ""))); 26f90c3b0eSVijay Mahadevan *write_opts = wopts; 273ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 288cbae1a6SVijay Mahadevan } 298cbae1a6SVijay Mahadevan 30a1427eb0SVijay Mahadevan /*@C 31a1427eb0SVijay Mahadevan DMMoabOutput - Output the solution vectors that are stored in the DMMoab object as tags 3263aba298SVijay Mahadevan along with the complete mesh data structure in the native H5M or VTK format. The H5M output file 33a1427eb0SVijay Mahadevan can be visualized directly with Paraview (if compiled with appropriate plugin) or converted 3463aba298SVijay Mahadevan with MOAB/tools/mbconvert to a VTK or Exodus file. 35a1427eb0SVijay Mahadevan 36a1427eb0SVijay Mahadevan This routine can also be used for check-pointing purposes to store a complete history of 37a1427eb0SVijay Mahadevan the solution along with any other necessary data to restart computations. 38a1427eb0SVijay Mahadevan 3963aba298SVijay Mahadevan Collective 40a1427eb0SVijay Mahadevan 41a1427eb0SVijay Mahadevan Input Parameters: 42a1427eb0SVijay Mahadevan + dm - the discretization manager object containing solution in MOAB tags. 43a1427eb0SVijay Mahadevan . filename - the name of the output file: e.g., poisson.h5m 44a1427eb0SVijay Mahadevan - usrwriteopts - the parallel write options needed for serializing a MOAB mesh database. Can be NULL. 45*60225df5SJacob Faibussowitsch 4663aba298SVijay Mahadevan Reference (Parallel Mesh Initialization: http://ftp.mcs.anl.gov/pub/fathom/moab-docs/contents.html#fivetwo) 47a1427eb0SVijay Mahadevan 48a1427eb0SVijay Mahadevan Level: intermediate 49a1427eb0SVijay Mahadevan 50db781477SPatrick Sanan .seealso: `DMMoabLoadFromFile()`, `DMMoabSetGlobalFieldVector()` 51a1427eb0SVijay Mahadevan @*/ 52d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabOutput(DM dm, const char *filename, const char *usrwriteopts) 53d71ae5a4SJacob Faibussowitsch { 548cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 558cbae1a6SVijay Mahadevan const char *writeopts; 5663aba298SVijay Mahadevan PetscBool isftype; 578cbae1a6SVijay Mahadevan moab::ErrorCode merr; 588cbae1a6SVijay Mahadevan 598cbae1a6SVijay Mahadevan PetscFunctionBegin; 608cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 618cbae1a6SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 628cbae1a6SVijay Mahadevan 639566063dSJacob Faibussowitsch PetscCall(PetscStrendswith(filename, "h5m", &isftype)); 6463aba298SVijay Mahadevan 658cbae1a6SVijay Mahadevan /* add mesh loading options specific to the DM */ 6663aba298SVijay Mahadevan if (isftype) { 679daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 689566063dSJacob Faibussowitsch PetscCall(DMMoab_GetWriteOptions_Private(dmmoab->pcomm->get_id(), dmmoab->pcomm->size(), dmmoab->dim, dmmoab->write_mode, dmmoab->rw_dbglevel, dmmoab->extra_write_options, usrwriteopts, &writeopts)); 699daf19fdSVijay Mahadevan #else 709566063dSJacob Faibussowitsch PetscCall(DMMoab_GetWriteOptions_Private(0, 1, dmmoab->dim, dmmoab->write_mode, dmmoab->rw_dbglevel, dmmoab->extra_write_options, usrwriteopts, &writeopts)); 719daf19fdSVijay Mahadevan #endif 729566063dSJacob Faibussowitsch PetscCall(PetscInfo(dm, "Writing file %s with options: %s\n", filename, writeopts)); 731baa6e33SBarry Smith } else { 7463aba298SVijay Mahadevan writeopts = NULL; 7563aba298SVijay Mahadevan } 768cbae1a6SVijay Mahadevan 778cbae1a6SVijay Mahadevan /* output file, using parallel write */ 789371c9d4SSatish Balay merr = dmmoab->mbiface->write_file(filename, NULL, writeopts, &dmmoab->fileset, 1); 799371c9d4SSatish Balay MBERRVM(dmmoab->mbiface, "Writing output of DMMoab failed.", merr); 809566063dSJacob Faibussowitsch PetscCall(PetscFree(writeopts)); 813ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 828cbae1a6SVijay Mahadevan } 83