1 #include <petsc/private/dmmbimpl.h> /*I "petscdmmoab.h" I*/ 2 #include <petscdmmoab.h> 3 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 @*/ 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