1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I "petscdmmoab.h" I*/ 28cbae1a6SVijay Mahadevan #include <petscdmmoab.h> 38cbae1a6SVijay Mahadevan 42e4e7c01SVijay Mahadevan 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) 58cbae1a6SVijay Mahadevan { 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 PetscFunctionBegin; 118cbae1a6SVijay Mahadevan 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])); 20f90c3b0eSVijay Mahadevan if (fsetid >= 0) { 219566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(wopts_parid, PETSC_MAX_PATH_LEN, "PARALLEL_COMM=%d;", fsetid)); 22f90c3b0eSVijay Mahadevan } 238cbae1a6SVijay Mahadevan } 248cbae1a6SVijay Mahadevan 25f90c3b0eSVijay Mahadevan if (dbglevel) { 269566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(wopts_dbg, PETSC_MAX_PATH_LEN, "CPUTIME;DEBUG_IO=%d;", dbglevel)); 27f90c3b0eSVijay Mahadevan } 288cbae1a6SVijay Mahadevan 299566063dSJacob 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 : ""))); 30f90c3b0eSVijay Mahadevan *write_opts = wopts; 318cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 328cbae1a6SVijay Mahadevan } 338cbae1a6SVijay Mahadevan 34a1427eb0SVijay Mahadevan /*@C 35a1427eb0SVijay Mahadevan DMMoabOutput - Output the solution vectors that are stored in the DMMoab object as tags 3663aba298SVijay Mahadevan along with the complete mesh data structure in the native H5M or VTK format. The H5M output file 37a1427eb0SVijay Mahadevan can be visualized directly with Paraview (if compiled with appropriate plugin) or converted 3863aba298SVijay Mahadevan with MOAB/tools/mbconvert to a VTK or Exodus file. 39a1427eb0SVijay Mahadevan 40a1427eb0SVijay Mahadevan This routine can also be used for check-pointing purposes to store a complete history of 41a1427eb0SVijay Mahadevan the solution along with any other necessary data to restart computations. 42a1427eb0SVijay Mahadevan 4363aba298SVijay Mahadevan Collective 44a1427eb0SVijay Mahadevan 45a1427eb0SVijay Mahadevan Input Parameters: 46a1427eb0SVijay Mahadevan + dm - the discretization manager object containing solution in MOAB tags. 47a1427eb0SVijay Mahadevan . filename - the name of the output file: e.g., poisson.h5m 48a1427eb0SVijay Mahadevan - usrwriteopts - the parallel write options needed for serializing a MOAB mesh database. Can be NULL. 4963aba298SVijay Mahadevan Reference (Parallel Mesh Initialization: http://ftp.mcs.anl.gov/pub/fathom/moab-docs/contents.html#fivetwo) 50a1427eb0SVijay Mahadevan 51a1427eb0SVijay Mahadevan Level: intermediate 52a1427eb0SVijay Mahadevan 53db781477SPatrick Sanan .seealso: `DMMoabLoadFromFile()`, `DMMoabSetGlobalFieldVector()` 54a1427eb0SVijay Mahadevan @*/ 558cbae1a6SVijay Mahadevan PetscErrorCode DMMoabOutput(DM dm, const char* filename, const char* usrwriteopts) 568cbae1a6SVijay Mahadevan { 578cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 588cbae1a6SVijay Mahadevan const char *writeopts; 5963aba298SVijay Mahadevan PetscBool isftype; 608cbae1a6SVijay Mahadevan moab::ErrorCode merr; 618cbae1a6SVijay Mahadevan 628cbae1a6SVijay Mahadevan PetscFunctionBegin; 638cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 648cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 658cbae1a6SVijay Mahadevan 669566063dSJacob Faibussowitsch PetscCall(PetscStrendswith(filename, "h5m", &isftype)); 6763aba298SVijay Mahadevan 688cbae1a6SVijay Mahadevan /* add mesh loading options specific to the DM */ 6963aba298SVijay Mahadevan if (isftype) { 709daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 719566063dSJacob 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)); 729daf19fdSVijay Mahadevan #else 739566063dSJacob Faibussowitsch PetscCall(DMMoab_GetWriteOptions_Private(0, 1, dmmoab->dim, dmmoab->write_mode,dmmoab->rw_dbglevel, dmmoab->extra_write_options, usrwriteopts, &writeopts)); 749daf19fdSVijay Mahadevan #endif 759566063dSJacob Faibussowitsch PetscCall(PetscInfo(dm, "Writing file %s with options: %s\n", filename, writeopts)); 76*1baa6e33SBarry Smith } else { 7763aba298SVijay Mahadevan writeopts = NULL; 7863aba298SVijay Mahadevan } 798cbae1a6SVijay Mahadevan 808cbae1a6SVijay Mahadevan /* output file, using parallel write */ 818cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->write_file(filename, NULL, writeopts, &dmmoab->fileset, 1); MBERRVM(dmmoab->mbiface, "Writing output of DMMoab failed.", merr); 829566063dSJacob Faibussowitsch PetscCall(PetscFree(writeopts)); 838cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 848cbae1a6SVijay Mahadevan } 85