1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I "petscdmmoab.h" I*/
28cbae1a6SVijay Mahadevan #include <petscdmmoab.h>
38cbae1a6SVijay Mahadevan
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)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
114d86920dSPierre Jolivet PetscFunctionBegin;
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
25*57508eceSPierre Jolivet 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
321d27aa22SBarry Smith along with the complete mesh data structure in the native H5M or VTK format
331d27aa22SBarry 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
40dc9a610eSPierre Jolivet - 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 @*/
DMMoabOutput(DM dm,const char * filename,const char * usrwriteopts)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);
62*57508eceSPierre Jolivet 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