1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I "petscdmmoab.h" I*/ 28cbae1a6SVijay Mahadevan #include <petscdmmoab.h> 38cbae1a6SVijay Mahadevan 4d71ae5a4SJacob Faibussowitsch 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) 5d71ae5a4SJacob Faibussowitsch { 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])); 2048a46eb9SPierre Jolivet if (fsetid >= 0) PetscCall(PetscSNPrintf(wopts_parid, PETSC_MAX_PATH_LEN, "PARALLEL_COMM=%d;", fsetid)); 218cbae1a6SVijay Mahadevan } 228cbae1a6SVijay Mahadevan 2348a46eb9SPierre Jolivet if (dbglevel) PetscCall(PetscSNPrintf(wopts_dbg, PETSC_MAX_PATH_LEN, "CPUTIME;DEBUG_IO=%d;", dbglevel)); 248cbae1a6SVijay Mahadevan 259566063dSJacob 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 : ""))); 26f90c3b0eSVijay Mahadevan *write_opts = wopts; 273ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 288cbae1a6SVijay Mahadevan } 298cbae1a6SVijay Mahadevan 30a1427eb0SVijay Mahadevan /*@C 31a1427eb0SVijay Mahadevan DMMoabOutput - Output the solution vectors that are stored in the DMMoab object as tags 32*a4e35b19SJacob Faibussowitsch along with the complete mesh data structure in the native H5M or VTK format. 33a1427eb0SVijay Mahadevan 3463aba298SVijay Mahadevan Collective 35a1427eb0SVijay Mahadevan 36a1427eb0SVijay Mahadevan Input Parameters: 37a1427eb0SVijay Mahadevan + dm - the discretization manager object containing solution in MOAB tags. 38a1427eb0SVijay Mahadevan . filename - the name of the output file: e.g., poisson.h5m 39a1427eb0SVijay Mahadevan - usrwriteopts - the parallel write options needed for serializing a MOAB mesh database. Can be NULL. 4060225df5SJacob Faibussowitsch 41a1427eb0SVijay Mahadevan Level: intermediate 42a1427eb0SVijay Mahadevan 43*a4e35b19SJacob Faibussowitsch Notes: 44*a4e35b19SJacob Faibussowitsch The H5M output file can be visualized directly with Paraview (if compiled with appropriate 45*a4e35b19SJacob Faibussowitsch plugin) or converted with MOAB/tools/mbconvert to a VTK or Exodus file. 46*a4e35b19SJacob Faibussowitsch 47*a4e35b19SJacob Faibussowitsch This routine can also be used for check-pointing purposes to store a complete history of the 48*a4e35b19SJacob Faibussowitsch solution along with any other necessary data to restart computations. 49*a4e35b19SJacob Faibussowitsch 50*a4e35b19SJacob Faibussowitsch References: 51*a4e35b19SJacob Faibussowitsch . * - Parallel Mesh Initialization: http://ftp.mcs.anl.gov/pub/fathom/moab-docs/contents.html#fivetwo 52*a4e35b19SJacob Faibussowitsch 53db781477SPatrick Sanan .seealso: `DMMoabLoadFromFile()`, `DMMoabSetGlobalFieldVector()` 54a1427eb0SVijay Mahadevan @*/ 55d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabOutput(DM dm, const char *filename, const char *usrwriteopts) 56d71ae5a4SJacob Faibussowitsch { 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)); 761baa6e33SBarry Smith } else { 7763aba298SVijay Mahadevan writeopts = NULL; 7863aba298SVijay Mahadevan } 798cbae1a6SVijay Mahadevan 808cbae1a6SVijay Mahadevan /* output file, using parallel write */ 819371c9d4SSatish Balay merr = dmmoab->mbiface->write_file(filename, NULL, writeopts, &dmmoab->fileset, 1); 829371c9d4SSatish Balay MBERRVM(dmmoab->mbiface, "Writing output of DMMoab failed.", merr); 839566063dSJacob Faibussowitsch PetscCall(PetscFree(writeopts)); 843ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 858cbae1a6SVijay Mahadevan } 86