xref: /petsc/src/dm/impls/moab/dmmbio.cxx (revision 48a46eb9bd028bec07ec0f396b1a3abb43f14558)
1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I  "petscdmmoab.h"   I*/
28cbae1a6SVijay Mahadevan #include <petscdmmoab.h>
38cbae1a6SVijay Mahadevan 
49371c9d4SSatish Balay 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) {
56acfe860SVijay Mahadevan   char *wopts;
661eb6e27SVijay Mahadevan   char  wopts_par[PETSC_MAX_PATH_LEN];
761eb6e27SVijay Mahadevan   char  wopts_parid[PETSC_MAX_PATH_LEN];
861eb6e27SVijay Mahadevan   char  wopts_dbg[PETSC_MAX_PATH_LEN];
98cbae1a6SVijay Mahadevan   PetscFunctionBegin;
108cbae1a6SVijay Mahadevan 
119566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(PETSC_MAX_PATH_LEN, &wopts));
129566063dSJacob Faibussowitsch   PetscCall(PetscMemzero(&wopts_par, PETSC_MAX_PATH_LEN));
139566063dSJacob Faibussowitsch   PetscCall(PetscMemzero(&wopts_parid, PETSC_MAX_PATH_LEN));
149566063dSJacob Faibussowitsch   PetscCall(PetscMemzero(&wopts_dbg, PETSC_MAX_PATH_LEN));
1561eb6e27SVijay Mahadevan 
168cbae1a6SVijay Mahadevan   // do parallel read unless only one processor
178cbae1a6SVijay Mahadevan   if (numproc > 1) {
189566063dSJacob Faibussowitsch     PetscCall(PetscSNPrintf(wopts_par, PETSC_MAX_PATH_LEN, "PARALLEL=%s;", MoabWriteModes[mode]));
19*48a46eb9SPierre Jolivet     if (fsetid >= 0) PetscCall(PetscSNPrintf(wopts_parid, PETSC_MAX_PATH_LEN, "PARALLEL_COMM=%d;", fsetid));
208cbae1a6SVijay Mahadevan   }
218cbae1a6SVijay Mahadevan 
22*48a46eb9SPierre Jolivet   if (dbglevel) PetscCall(PetscSNPrintf(wopts_dbg, PETSC_MAX_PATH_LEN, "CPUTIME;DEBUG_IO=%d;", dbglevel));
238cbae1a6SVijay Mahadevan 
249566063dSJacob 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 : "")));
25f90c3b0eSVijay Mahadevan   *write_opts = wopts;
268cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
278cbae1a6SVijay Mahadevan }
288cbae1a6SVijay Mahadevan 
29a1427eb0SVijay Mahadevan /*@C
30a1427eb0SVijay Mahadevan   DMMoabOutput - Output the solution vectors that are stored in the DMMoab object as tags
3163aba298SVijay Mahadevan   along with the complete mesh data structure in the native H5M or VTK format. The H5M output file
32a1427eb0SVijay Mahadevan   can be visualized directly with Paraview (if compiled with appropriate plugin) or converted
3363aba298SVijay Mahadevan   with MOAB/tools/mbconvert to a VTK or Exodus file.
34a1427eb0SVijay Mahadevan 
35a1427eb0SVijay Mahadevan   This routine can also be used for check-pointing purposes to store a complete history of
36a1427eb0SVijay Mahadevan   the solution along with any other necessary data to restart computations.
37a1427eb0SVijay Mahadevan 
3863aba298SVijay Mahadevan   Collective
39a1427eb0SVijay Mahadevan 
40a1427eb0SVijay Mahadevan   Input Parameters:
41a1427eb0SVijay Mahadevan + dm     - the discretization manager object containing solution in MOAB tags.
42a1427eb0SVijay Mahadevan .  filename - the name of the output file: e.g., poisson.h5m
43a1427eb0SVijay Mahadevan -  usrwriteopts - the parallel write options needed for serializing a MOAB mesh database. Can be NULL.
4463aba298SVijay Mahadevan    Reference (Parallel Mesh Initialization: http://ftp.mcs.anl.gov/pub/fathom/moab-docs/contents.html#fivetwo)
45a1427eb0SVijay Mahadevan 
46a1427eb0SVijay Mahadevan   Level: intermediate
47a1427eb0SVijay Mahadevan 
48db781477SPatrick Sanan .seealso: `DMMoabLoadFromFile()`, `DMMoabSetGlobalFieldVector()`
49a1427eb0SVijay Mahadevan @*/
509371c9d4SSatish Balay PetscErrorCode DMMoabOutput(DM dm, const char *filename, const char *usrwriteopts) {
518cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
528cbae1a6SVijay Mahadevan   const char     *writeopts;
5363aba298SVijay Mahadevan   PetscBool       isftype;
548cbae1a6SVijay Mahadevan   moab::ErrorCode merr;
558cbae1a6SVijay Mahadevan 
568cbae1a6SVijay Mahadevan   PetscFunctionBegin;
578cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
588cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
598cbae1a6SVijay Mahadevan 
609566063dSJacob Faibussowitsch   PetscCall(PetscStrendswith(filename, "h5m", &isftype));
6163aba298SVijay Mahadevan 
628cbae1a6SVijay Mahadevan   /* add mesh loading options specific to the DM */
6363aba298SVijay Mahadevan   if (isftype) {
649daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
659566063dSJacob 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));
669daf19fdSVijay Mahadevan #else
679566063dSJacob Faibussowitsch     PetscCall(DMMoab_GetWriteOptions_Private(0, 1, dmmoab->dim, dmmoab->write_mode, dmmoab->rw_dbglevel, dmmoab->extra_write_options, usrwriteopts, &writeopts));
689daf19fdSVijay Mahadevan #endif
699566063dSJacob Faibussowitsch     PetscCall(PetscInfo(dm, "Writing file %s with options: %s\n", filename, writeopts));
701baa6e33SBarry Smith   } else {
7163aba298SVijay Mahadevan     writeopts = NULL;
7263aba298SVijay Mahadevan   }
738cbae1a6SVijay Mahadevan 
748cbae1a6SVijay Mahadevan   /* output file, using parallel write */
759371c9d4SSatish Balay   merr = dmmoab->mbiface->write_file(filename, NULL, writeopts, &dmmoab->fileset, 1);
769371c9d4SSatish Balay   MBERRVM(dmmoab->mbiface, "Writing output of DMMoab failed.", merr);
779566063dSJacob Faibussowitsch   PetscCall(PetscFree(writeopts));
788cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
798cbae1a6SVijay Mahadevan }
80