1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I "petscdmmoab.h" I*/ 28cbae1a6SVijay Mahadevan #include <petscdmmoab.h> 38cbae1a6SVijay Mahadevan 49371c9d4SSatish Balay 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) { 56acfe860SVijay Mahadevan char *wopts; 661eb6e27SVijay Mahadevan char wopts_par[PETSC_MAX_PATH_LEN]; 761eb6e27SVijay Mahadevan char wopts_parid[PETSC_MAX_PATH_LEN]; 861eb6e27SVijay Mahadevan char wopts_dbg[PETSC_MAX_PATH_LEN]; 98cbae1a6SVijay Mahadevan PetscFunctionBegin; 108cbae1a6SVijay Mahadevan 119566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(PETSC_MAX_PATH_LEN, &wopts)); 129566063dSJacob Faibussowitsch PetscCall(PetscMemzero(&wopts_par, PETSC_MAX_PATH_LEN)); 139566063dSJacob Faibussowitsch PetscCall(PetscMemzero(&wopts_parid, PETSC_MAX_PATH_LEN)); 149566063dSJacob Faibussowitsch PetscCall(PetscMemzero(&wopts_dbg, PETSC_MAX_PATH_LEN)); 1561eb6e27SVijay Mahadevan 168cbae1a6SVijay Mahadevan // do parallel read unless only one processor 178cbae1a6SVijay Mahadevan if (numproc > 1) { 189566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(wopts_par, PETSC_MAX_PATH_LEN, "PARALLEL=%s;", MoabWriteModes[mode])); 19*48a46eb9SPierre Jolivet if (fsetid >= 0) PetscCall(PetscSNPrintf(wopts_parid, PETSC_MAX_PATH_LEN, "PARALLEL_COMM=%d;", fsetid)); 208cbae1a6SVijay Mahadevan } 218cbae1a6SVijay Mahadevan 22*48a46eb9SPierre Jolivet if (dbglevel) PetscCall(PetscSNPrintf(wopts_dbg, PETSC_MAX_PATH_LEN, "CPUTIME;DEBUG_IO=%d;", dbglevel)); 238cbae1a6SVijay Mahadevan 249566063dSJacob 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 : ""))); 25f90c3b0eSVijay Mahadevan *write_opts = wopts; 268cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 278cbae1a6SVijay Mahadevan } 288cbae1a6SVijay Mahadevan 29a1427eb0SVijay Mahadevan /*@C 30a1427eb0SVijay Mahadevan DMMoabOutput - Output the solution vectors that are stored in the DMMoab object as tags 3163aba298SVijay Mahadevan along with the complete mesh data structure in the native H5M or VTK format. The H5M output file 32a1427eb0SVijay Mahadevan can be visualized directly with Paraview (if compiled with appropriate plugin) or converted 3363aba298SVijay Mahadevan with MOAB/tools/mbconvert to a VTK or Exodus file. 34a1427eb0SVijay Mahadevan 35a1427eb0SVijay Mahadevan This routine can also be used for check-pointing purposes to store a complete history of 36a1427eb0SVijay Mahadevan the solution along with any other necessary data to restart computations. 37a1427eb0SVijay Mahadevan 3863aba298SVijay Mahadevan Collective 39a1427eb0SVijay Mahadevan 40a1427eb0SVijay Mahadevan Input Parameters: 41a1427eb0SVijay Mahadevan + dm - the discretization manager object containing solution in MOAB tags. 42a1427eb0SVijay Mahadevan . filename - the name of the output file: e.g., poisson.h5m 43a1427eb0SVijay Mahadevan - usrwriteopts - the parallel write options needed for serializing a MOAB mesh database. Can be NULL. 4463aba298SVijay Mahadevan Reference (Parallel Mesh Initialization: http://ftp.mcs.anl.gov/pub/fathom/moab-docs/contents.html#fivetwo) 45a1427eb0SVijay Mahadevan 46a1427eb0SVijay Mahadevan Level: intermediate 47a1427eb0SVijay Mahadevan 48db781477SPatrick Sanan .seealso: `DMMoabLoadFromFile()`, `DMMoabSetGlobalFieldVector()` 49a1427eb0SVijay Mahadevan @*/ 509371c9d4SSatish Balay PetscErrorCode DMMoabOutput(DM dm, const char *filename, const char *usrwriteopts) { 518cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 528cbae1a6SVijay Mahadevan const char *writeopts; 5363aba298SVijay Mahadevan PetscBool isftype; 548cbae1a6SVijay Mahadevan moab::ErrorCode merr; 558cbae1a6SVijay Mahadevan 568cbae1a6SVijay Mahadevan PetscFunctionBegin; 578cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 588cbae1a6SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 598cbae1a6SVijay Mahadevan 609566063dSJacob Faibussowitsch PetscCall(PetscStrendswith(filename, "h5m", &isftype)); 6163aba298SVijay Mahadevan 628cbae1a6SVijay Mahadevan /* add mesh loading options specific to the DM */ 6363aba298SVijay Mahadevan if (isftype) { 649daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 659566063dSJacob 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)); 669daf19fdSVijay Mahadevan #else 679566063dSJacob Faibussowitsch PetscCall(DMMoab_GetWriteOptions_Private(0, 1, dmmoab->dim, dmmoab->write_mode, dmmoab->rw_dbglevel, dmmoab->extra_write_options, usrwriteopts, &writeopts)); 689daf19fdSVijay Mahadevan #endif 699566063dSJacob Faibussowitsch PetscCall(PetscInfo(dm, "Writing file %s with options: %s\n", filename, writeopts)); 701baa6e33SBarry Smith } else { 7163aba298SVijay Mahadevan writeopts = NULL; 7263aba298SVijay Mahadevan } 738cbae1a6SVijay Mahadevan 748cbae1a6SVijay Mahadevan /* output file, using parallel write */ 759371c9d4SSatish Balay merr = dmmoab->mbiface->write_file(filename, NULL, writeopts, &dmmoab->fileset, 1); 769371c9d4SSatish Balay MBERRVM(dmmoab->mbiface, "Writing output of DMMoab failed.", merr); 779566063dSJacob Faibussowitsch PetscCall(PetscFree(writeopts)); 788cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 798cbae1a6SVijay Mahadevan } 80