xref: /petsc/src/dm/impls/moab/dmmbio.cxx (revision d0e6bf2ad94dcc89b258ce16c7987200a4714786)
1 #include <petsc/private/dmmbimpl.h> /*I  "petscdmmoab.h"   I*/
2 #include <petscdmmoab.h>
3 
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)4 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)
5 {
6   char *wopts;
7   char  wopts_par[PETSC_MAX_PATH_LEN];
8   char  wopts_parid[PETSC_MAX_PATH_LEN];
9   char  wopts_dbg[PETSC_MAX_PATH_LEN];
10 
11   PetscFunctionBegin;
12   PetscCall(PetscMalloc1(PETSC_MAX_PATH_LEN, &wopts));
13   PetscCall(PetscMemzero(&wopts_par, PETSC_MAX_PATH_LEN));
14   PetscCall(PetscMemzero(&wopts_parid, PETSC_MAX_PATH_LEN));
15   PetscCall(PetscMemzero(&wopts_dbg, PETSC_MAX_PATH_LEN));
16 
17   // do parallel read unless only one processor
18   if (numproc > 1) {
19     PetscCall(PetscSNPrintf(wopts_par, PETSC_MAX_PATH_LEN, "PARALLEL=%s;", MoabWriteModes[mode]));
20     if (fsetid >= 0) PetscCall(PetscSNPrintf(wopts_parid, PETSC_MAX_PATH_LEN, "PARALLEL_COMM=%d;", fsetid));
21   }
22 
23   if (dbglevel) PetscCall(PetscSNPrintf(wopts_dbg, PETSC_MAX_PATH_LEN, "CPUTIME;DEBUG_IO=%d;", dbglevel));
24 
25   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 : ""));
26   *write_opts = wopts;
27   PetscFunctionReturn(PETSC_SUCCESS);
28 }
29 
30 /*@C
31   DMMoabOutput - Output the solution vectors that are stored in the DMMoab object as tags
32   along with the complete mesh data structure in the native H5M or VTK format
33   <http://ftp.mcs.anl.gov/pub/fathom/moab-docs/contents.html#fivetwo>.
34 
35   Collective
36 
37   Input Parameters:
38 + dm           - the discretization manager object containing solution in MOAB tags.
39 . filename     - the name of the output file: e.g., poisson.h5m
40 - usrwriteopts - the parallel write options needed for serializing a MOAB mesh database. Can be `NULL`.
41 
42   Level: intermediate
43 
44   Notes:
45   The H5M output file can be visualized directly with Paraview (if compiled with appropriate
46   plugin) or converted with MOAB/tools/mbconvert to a VTK or Exodus file.
47 
48   This routine can also be used for check-pointing purposes to store a complete history of the
49   solution along with any other necessary data to restart computations.
50 
51 .seealso: `DMMoabLoadFromFile()`, `DMMoabSetGlobalFieldVector()`
52 @*/
DMMoabOutput(DM dm,const char * filename,const char * usrwriteopts)53 PetscErrorCode DMMoabOutput(DM dm, const char *filename, const char *usrwriteopts)
54 {
55   DM_Moab        *dmmoab;
56   const char     *writeopts;
57   PetscBool       isftype;
58   moab::ErrorCode merr;
59 
60   PetscFunctionBegin;
61   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
62   dmmoab = (DM_Moab *)dm->data;
63 
64   PetscCall(PetscStrendswith(filename, "h5m", &isftype));
65 
66   /* add mesh loading options specific to the DM */
67   if (isftype) {
68 #ifdef MOAB_HAVE_MPI
69     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));
70 #else
71     PetscCall(DMMoab_GetWriteOptions_Private(0, 1, dmmoab->dim, dmmoab->write_mode, dmmoab->rw_dbglevel, dmmoab->extra_write_options, usrwriteopts, &writeopts));
72 #endif
73     PetscCall(PetscInfo(dm, "Writing file %s with options: %s\n", filename, writeopts));
74   } else {
75     writeopts = NULL;
76   }
77 
78   /* output file, using parallel write */
79   merr = dmmoab->mbiface->write_file(filename, NULL, writeopts, &dmmoab->fileset, 1);
80   MBERRVM(dmmoab->mbiface, "Writing output of DMMoab failed.", merr);
81   PetscCall(PetscFree(writeopts));
82   PetscFunctionReturn(PETSC_SUCCESS);
83 }
84