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