xref: /petsc/src/dm/impls/moab/dmmbio.cxx (revision a4e35b1925eceef64945ea472b84f2bf06a67b5e)
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*a4e35b19SJacob Faibussowitsch   along with the complete mesh data structure in the native H5M or VTK format.
33a1427eb0SVijay Mahadevan 
3463aba298SVijay Mahadevan   Collective
35a1427eb0SVijay Mahadevan 
36a1427eb0SVijay Mahadevan   Input Parameters:
37a1427eb0SVijay Mahadevan + dm           - the discretization manager object containing solution in MOAB tags.
38a1427eb0SVijay Mahadevan . filename     - the name of the output file: e.g., poisson.h5m
39a1427eb0SVijay Mahadevan - usrwriteopts - the parallel write options needed for serializing a MOAB mesh database. Can be NULL.
4060225df5SJacob Faibussowitsch 
41a1427eb0SVijay Mahadevan   Level: intermediate
42a1427eb0SVijay Mahadevan 
43*a4e35b19SJacob Faibussowitsch   Notes:
44*a4e35b19SJacob Faibussowitsch   The H5M output file can be visualized directly with Paraview (if compiled with appropriate
45*a4e35b19SJacob Faibussowitsch   plugin) or converted with MOAB/tools/mbconvert to a VTK or Exodus file.
46*a4e35b19SJacob Faibussowitsch 
47*a4e35b19SJacob Faibussowitsch   This routine can also be used for check-pointing purposes to store a complete history of the
48*a4e35b19SJacob Faibussowitsch   solution along with any other necessary data to restart computations.
49*a4e35b19SJacob Faibussowitsch 
50*a4e35b19SJacob Faibussowitsch   References:
51*a4e35b19SJacob Faibussowitsch . * - Parallel Mesh Initialization: http://ftp.mcs.anl.gov/pub/fathom/moab-docs/contents.html#fivetwo
52*a4e35b19SJacob Faibussowitsch 
53db781477SPatrick Sanan .seealso: `DMMoabLoadFromFile()`, `DMMoabSetGlobalFieldVector()`
54a1427eb0SVijay Mahadevan @*/
55d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabOutput(DM dm, const char *filename, const char *usrwriteopts)
56d71ae5a4SJacob Faibussowitsch {
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 
669566063dSJacob 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
719566063dSJacob 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
739566063dSJacob Faibussowitsch     PetscCall(DMMoab_GetWriteOptions_Private(0, 1, dmmoab->dim, dmmoab->write_mode, dmmoab->rw_dbglevel, dmmoab->extra_write_options, usrwriteopts, &writeopts));
749daf19fdSVijay Mahadevan #endif
759566063dSJacob Faibussowitsch     PetscCall(PetscInfo(dm, "Writing file %s with options: %s\n", filename, writeopts));
761baa6e33SBarry Smith   } else {
7763aba298SVijay Mahadevan     writeopts = NULL;
7863aba298SVijay Mahadevan   }
798cbae1a6SVijay Mahadevan 
808cbae1a6SVijay Mahadevan   /* output file, using parallel write */
819371c9d4SSatish Balay   merr = dmmoab->mbiface->write_file(filename, NULL, writeopts, &dmmoab->fileset, 1);
829371c9d4SSatish Balay   MBERRVM(dmmoab->mbiface, "Writing output of DMMoab failed.", merr);
839566063dSJacob Faibussowitsch   PetscCall(PetscFree(writeopts));
843ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
858cbae1a6SVijay Mahadevan }
86