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 32*1d27aa22SBarry Smith along with the complete mesh data structure in the native H5M or VTK format 33*1d27aa22SBarry Smith <http://ftp.mcs.anl.gov/pub/fathom/moab-docs/contents.html#fivetwo>. 34a1427eb0SVijay Mahadevan 3563aba298SVijay Mahadevan Collective 36a1427eb0SVijay Mahadevan 37a1427eb0SVijay Mahadevan Input Parameters: 38a1427eb0SVijay Mahadevan + dm - the discretization manager object containing solution in MOAB tags. 39a1427eb0SVijay Mahadevan . filename - the name of the output file: e.g., poisson.h5m 40a1427eb0SVijay Mahadevan - usrwriteopts - the parallel write options needed for serializing a MOAB mesh database. Can be NULL. 4160225df5SJacob Faibussowitsch 42a1427eb0SVijay Mahadevan Level: intermediate 43a1427eb0SVijay Mahadevan 44a4e35b19SJacob Faibussowitsch Notes: 45a4e35b19SJacob Faibussowitsch The H5M output file can be visualized directly with Paraview (if compiled with appropriate 46a4e35b19SJacob Faibussowitsch plugin) or converted with MOAB/tools/mbconvert to a VTK or Exodus file. 47a4e35b19SJacob Faibussowitsch 48a4e35b19SJacob Faibussowitsch This routine can also be used for check-pointing purposes to store a complete history of the 49a4e35b19SJacob Faibussowitsch solution along with any other necessary data to restart computations. 50a4e35b19SJacob Faibussowitsch 51db781477SPatrick Sanan .seealso: `DMMoabLoadFromFile()`, `DMMoabSetGlobalFieldVector()` 52a1427eb0SVijay Mahadevan @*/ 53d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabOutput(DM dm, const char *filename, const char *usrwriteopts) 54d71ae5a4SJacob Faibussowitsch { 558cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 568cbae1a6SVijay Mahadevan const char *writeopts; 5763aba298SVijay Mahadevan PetscBool isftype; 588cbae1a6SVijay Mahadevan moab::ErrorCode merr; 598cbae1a6SVijay Mahadevan 608cbae1a6SVijay Mahadevan PetscFunctionBegin; 618cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 628cbae1a6SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 638cbae1a6SVijay Mahadevan 649566063dSJacob Faibussowitsch PetscCall(PetscStrendswith(filename, "h5m", &isftype)); 6563aba298SVijay Mahadevan 668cbae1a6SVijay Mahadevan /* add mesh loading options specific to the DM */ 6763aba298SVijay Mahadevan if (isftype) { 689daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 699566063dSJacob 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)); 709daf19fdSVijay Mahadevan #else 719566063dSJacob Faibussowitsch PetscCall(DMMoab_GetWriteOptions_Private(0, 1, dmmoab->dim, dmmoab->write_mode, dmmoab->rw_dbglevel, dmmoab->extra_write_options, usrwriteopts, &writeopts)); 729daf19fdSVijay Mahadevan #endif 739566063dSJacob Faibussowitsch PetscCall(PetscInfo(dm, "Writing file %s with options: %s\n", filename, writeopts)); 741baa6e33SBarry Smith } else { 7563aba298SVijay Mahadevan writeopts = NULL; 7663aba298SVijay Mahadevan } 778cbae1a6SVijay Mahadevan 788cbae1a6SVijay Mahadevan /* output file, using parallel write */ 799371c9d4SSatish Balay merr = dmmoab->mbiface->write_file(filename, NULL, writeopts, &dmmoab->fileset, 1); 809371c9d4SSatish Balay MBERRVM(dmmoab->mbiface, "Writing output of DMMoab failed.", merr); 819566063dSJacob Faibussowitsch PetscCall(PetscFree(writeopts)); 823ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 838cbae1a6SVijay Mahadevan } 84