xref: /petsc/src/dm/impls/moab/dmmbio.cxx (revision 9566063d113dddea24716c546802770db7481bc0)
1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I  "petscdmmoab.h"   I*/
28cbae1a6SVijay Mahadevan #include <petscdmmoab.h>
38cbae1a6SVijay Mahadevan 
42e4e7c01SVijay Mahadevan 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)
58cbae1a6SVijay Mahadevan {
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 
12*9566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(PETSC_MAX_PATH_LEN, &wopts));
13*9566063dSJacob Faibussowitsch   PetscCall(PetscMemzero(&wopts_par, PETSC_MAX_PATH_LEN));
14*9566063dSJacob Faibussowitsch   PetscCall(PetscMemzero(&wopts_parid, PETSC_MAX_PATH_LEN));
15*9566063dSJacob 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) {
19*9566063dSJacob Faibussowitsch     PetscCall(PetscSNPrintf(wopts_par, PETSC_MAX_PATH_LEN, "PARALLEL=%s;", MoabWriteModes[mode]));
20f90c3b0eSVijay Mahadevan     if (fsetid >= 0) {
21*9566063dSJacob Faibussowitsch       PetscCall(PetscSNPrintf(wopts_parid, PETSC_MAX_PATH_LEN, "PARALLEL_COMM=%d;", fsetid));
22f90c3b0eSVijay Mahadevan     }
238cbae1a6SVijay Mahadevan   }
248cbae1a6SVijay Mahadevan 
25f90c3b0eSVijay Mahadevan   if (dbglevel) {
26*9566063dSJacob Faibussowitsch     PetscCall(PetscSNPrintf(wopts_dbg, PETSC_MAX_PATH_LEN, "CPUTIME;DEBUG_IO=%d;", dbglevel));
27f90c3b0eSVijay Mahadevan   }
288cbae1a6SVijay Mahadevan 
29*9566063dSJacob 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 : "")));
30f90c3b0eSVijay Mahadevan   *write_opts = wopts;
318cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
328cbae1a6SVijay Mahadevan }
338cbae1a6SVijay Mahadevan 
34a1427eb0SVijay Mahadevan /*@C
35a1427eb0SVijay Mahadevan   DMMoabOutput - Output the solution vectors that are stored in the DMMoab object as tags
3663aba298SVijay Mahadevan   along with the complete mesh data structure in the native H5M or VTK format. The H5M output file
37a1427eb0SVijay Mahadevan   can be visualized directly with Paraview (if compiled with appropriate plugin) or converted
3863aba298SVijay Mahadevan   with MOAB/tools/mbconvert to a VTK or Exodus file.
39a1427eb0SVijay Mahadevan 
40a1427eb0SVijay Mahadevan   This routine can also be used for check-pointing purposes to store a complete history of
41a1427eb0SVijay Mahadevan   the solution along with any other necessary data to restart computations.
42a1427eb0SVijay Mahadevan 
4363aba298SVijay Mahadevan   Collective
44a1427eb0SVijay Mahadevan 
45a1427eb0SVijay Mahadevan   Input Parameters:
46a1427eb0SVijay Mahadevan + dm     - the discretization manager object containing solution in MOAB tags.
47a1427eb0SVijay Mahadevan .  filename - the name of the output file: e.g., poisson.h5m
48a1427eb0SVijay Mahadevan -  usrwriteopts - the parallel write options needed for serializing a MOAB mesh database. Can be NULL.
4963aba298SVijay Mahadevan    Reference (Parallel Mesh Initialization: http://ftp.mcs.anl.gov/pub/fathom/moab-docs/contents.html#fivetwo)
50a1427eb0SVijay Mahadevan 
51a1427eb0SVijay Mahadevan   Level: intermediate
52a1427eb0SVijay Mahadevan 
53a1427eb0SVijay Mahadevan .seealso: DMMoabLoadFromFile(), DMMoabSetGlobalFieldVector()
54a1427eb0SVijay Mahadevan @*/
558cbae1a6SVijay Mahadevan PetscErrorCode DMMoabOutput(DM dm, const char* filename, const char* usrwriteopts)
568cbae1a6SVijay Mahadevan {
578cbae1a6SVijay Mahadevan   DM_Moab         *dmmoab;
588cbae1a6SVijay Mahadevan   const char      *writeopts;
5963aba298SVijay Mahadevan   PetscBool       isftype;
608cbae1a6SVijay Mahadevan   moab::ErrorCode merr;
618cbae1a6SVijay Mahadevan 
628cbae1a6SVijay Mahadevan   PetscFunctionBegin;
638cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
648cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
658cbae1a6SVijay Mahadevan 
66*9566063dSJacob Faibussowitsch   PetscCall(PetscStrendswith(filename, "h5m", &isftype));
6763aba298SVijay Mahadevan 
688cbae1a6SVijay Mahadevan   /* add mesh loading options specific to the DM */
6963aba298SVijay Mahadevan   if (isftype) {
709daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
71*9566063dSJacob 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));
729daf19fdSVijay Mahadevan #else
73*9566063dSJacob Faibussowitsch     PetscCall(DMMoab_GetWriteOptions_Private(0, 1, dmmoab->dim, dmmoab->write_mode,dmmoab->rw_dbglevel, dmmoab->extra_write_options, usrwriteopts, &writeopts));
749daf19fdSVijay Mahadevan #endif
75*9566063dSJacob Faibussowitsch     PetscCall(PetscInfo(dm, "Writing file %s with options: %s\n", filename, writeopts));
7663aba298SVijay Mahadevan   }
7763aba298SVijay Mahadevan   else {
7863aba298SVijay Mahadevan     writeopts = NULL;
7963aba298SVijay Mahadevan   }
808cbae1a6SVijay Mahadevan 
818cbae1a6SVijay Mahadevan   /* output file, using parallel write */
828cbae1a6SVijay Mahadevan   merr = dmmoab->mbiface->write_file(filename, NULL, writeopts, &dmmoab->fileset, 1); MBERRVM(dmmoab->mbiface, "Writing output of DMMoab failed.", merr);
83*9566063dSJacob Faibussowitsch   PetscCall(PetscFree(writeopts));
848cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
858cbae1a6SVijay Mahadevan }
86