xref: /petsc/src/dm/impls/moab/dmmbio.cxx (revision 3ba1676111f5c958fe6c2729b46ca4d523958bb3)
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;
27*3ba16761SJacob 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.
4563aba298SVijay Mahadevan    Reference (Parallel Mesh Initialization: http://ftp.mcs.anl.gov/pub/fathom/moab-docs/contents.html#fivetwo)
46a1427eb0SVijay Mahadevan 
47a1427eb0SVijay Mahadevan   Level: intermediate
48a1427eb0SVijay Mahadevan 
49db781477SPatrick Sanan .seealso: `DMMoabLoadFromFile()`, `DMMoabSetGlobalFieldVector()`
50a1427eb0SVijay Mahadevan @*/
51d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabOutput(DM dm, const char *filename, const char *usrwriteopts)
52d71ae5a4SJacob Faibussowitsch {
538cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
548cbae1a6SVijay Mahadevan   const char     *writeopts;
5563aba298SVijay Mahadevan   PetscBool       isftype;
568cbae1a6SVijay Mahadevan   moab::ErrorCode merr;
578cbae1a6SVijay Mahadevan 
588cbae1a6SVijay Mahadevan   PetscFunctionBegin;
598cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
608cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
618cbae1a6SVijay Mahadevan 
629566063dSJacob Faibussowitsch   PetscCall(PetscStrendswith(filename, "h5m", &isftype));
6363aba298SVijay Mahadevan 
648cbae1a6SVijay Mahadevan   /* add mesh loading options specific to the DM */
6563aba298SVijay Mahadevan   if (isftype) {
669daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
679566063dSJacob 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));
689daf19fdSVijay Mahadevan #else
699566063dSJacob Faibussowitsch     PetscCall(DMMoab_GetWriteOptions_Private(0, 1, dmmoab->dim, dmmoab->write_mode, dmmoab->rw_dbglevel, dmmoab->extra_write_options, usrwriteopts, &writeopts));
709daf19fdSVijay Mahadevan #endif
719566063dSJacob Faibussowitsch     PetscCall(PetscInfo(dm, "Writing file %s with options: %s\n", filename, writeopts));
721baa6e33SBarry Smith   } else {
7363aba298SVijay Mahadevan     writeopts = NULL;
7463aba298SVijay Mahadevan   }
758cbae1a6SVijay Mahadevan 
768cbae1a6SVijay Mahadevan   /* output file, using parallel write */
779371c9d4SSatish Balay   merr = dmmoab->mbiface->write_file(filename, NULL, writeopts, &dmmoab->fileset, 1);
789371c9d4SSatish Balay   MBERRVM(dmmoab->mbiface, "Writing output of DMMoab failed.", merr);
799566063dSJacob Faibussowitsch   PetscCall(PetscFree(writeopts));
80*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
818cbae1a6SVijay Mahadevan }
82