xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 834855d6effb0d027771461c8e947ee1ce5a1e17)
1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I  "petscdmmoab.h"   I*/
21d72bce8STim Tautges 
31d72bce8STim Tautges #include <petscdmmoab.h>
488face26SJed Brown #include <MBTagConventions.hpp>
59daf19fdSVijay Mahadevan #include <moab/NestedRefine.hpp>
61cec0304SVijay Mahadevan #include <moab/Skinner.hpp>
7032b8ab6SVijay Mahadevan 
8c6ef30f9SVijay Mahadevan /*MC
91d27aa22SBarry Smith   DMMOAB = "moab" - A `DM` object that encapsulates an unstructured mesh described by the MOAB mesh database {cite}`moabwebsite`.
10c6ef30f9SVijay Mahadevan                     Direct access to the MOAB Interface and other mesh manipulation related objects are available
11c6ef30f9SVijay Mahadevan                     through public API. Ability to create global and local representation of Vecs containing all
12c6ef30f9SVijay Mahadevan                     unknowns in the interior and shared boundary via a transparent tag-data wrapper is provided
13c6ef30f9SVijay Mahadevan                     along with utility functions to traverse the mesh and assemble a discrete system via
14c6ef30f9SVijay Mahadevan                     field-based/blocked Vec(Get/Set) methods. Input from and output to different formats are
15c6ef30f9SVijay Mahadevan                     available.
16c6ef30f9SVijay Mahadevan 
17c6ef30f9SVijay Mahadevan   Level: intermediate
18c6ef30f9SVijay Mahadevan 
190b207066SBarry Smith .seealso: `DMMOAB`, `DMType`, `DMMoabCreate()`, `DMCreate()`, `DMSetType()`, `DMMoabCreateMoab()`
20c6ef30f9SVijay Mahadevan M*/
21c6ef30f9SVijay Mahadevan 
22304006b3SVijay Mahadevan /* External function declarations here */
23304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInterpolation_Moab(DM dmCoarse, DM dmFine, Mat *interpolation, Vec *scaling);
24304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateDefaultConstraints_Moab(DM dm);
25304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm, Mat *J);
26304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateCoordinateDM_Moab(DM dm, DM *cdm);
27304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefine_Moab(DM dm, MPI_Comm comm, DM *dmRefined);
28304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsen_Moab(DM dm, MPI_Comm comm, DM *dmCoarsened);
29304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefineHierarchy_Moab(DM dm, PetscInt nlevels, DM dmRefined[]);
30304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsenHierarchy_Moab(DM dm, PetscInt nlevels, DM dmCoarsened[]);
31304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm);
32304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateGlobalVector_Moab(DM, Vec *);
33304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateLocalVector_Moab(DM, Vec *);
34304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm, Mat *J);
35304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalBegin_Moab(DM, Vec, InsertMode, Vec);
36304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalEnd_Moab(DM, Vec, InsertMode, Vec);
37304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalBegin_Moab(DM, Vec, InsertMode, Vec);
38304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalEnd_Moab(DM, Vec, InsertMode, Vec);
39304006b3SVijay Mahadevan 
40304006b3SVijay Mahadevan /* Un-implemented routines */
41304006b3SVijay Mahadevan /*
421bb6d2a8SBarry Smith PETSC_EXTERN PetscErrorCode DMCreatelocalsection_Moab(DM dm);
43304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInjection_Moab(DM dmCoarse, DM dmFine, Mat *mat);
44304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLoad_Moab(DM dm, PetscViewer viewer);
45304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGetDimPoints_Moab(DM dm, PetscInt dim, PetscInt *pStart, PetscInt *pEnd);
46304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateSubDM_Moab(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm);
47304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocatePoints_Moab(DM dm, Vec v, IS *cellIS);
48304006b3SVijay Mahadevan */
49c6ef30f9SVijay Mahadevan 
50cab5ea25SPierre Jolivet /*@C
510b207066SBarry Smith   DMMoabCreate - Creates a `DMMOAB` object, which encapsulates a moab instance
521d72bce8STim Tautges 
53d083f849SBarry Smith   Collective
541d72bce8STim Tautges 
551d72bce8STim Tautges   Input Parameter:
560b207066SBarry Smith . comm - The communicator for the `DMMOAB` object
571d72bce8STim Tautges 
581d72bce8STim Tautges   Output Parameter:
590b207066SBarry Smith . dmb - The `DMMOAB` object
601d72bce8STim Tautges 
611d72bce8STim Tautges   Level: beginner
621d72bce8STim Tautges 
630b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabCreateMoab()`
641d72bce8STim Tautges @*/
DMMoabCreate(MPI_Comm comm,DM * dmb)65d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
66d71ae5a4SJacob Faibussowitsch {
671d72bce8STim Tautges   PetscFunctionBegin;
684f572ea9SToby Isaac   PetscAssertPointer(dmb, 2);
699566063dSJacob Faibussowitsch   PetscCall(DMCreate(comm, dmb));
709566063dSJacob Faibussowitsch   PetscCall(DMSetType(*dmb, DMMOAB));
713ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
721d72bce8STim Tautges }
731d72bce8STim Tautges 
74cab5ea25SPierre Jolivet /*@C
750b207066SBarry Smith   DMMoabCreateMoab - Creates a `DMMOAB` object, optionally from an instance and other data
761d72bce8STim Tautges 
77d083f849SBarry Smith   Collective
781d72bce8STim Tautges 
79d8d19677SJose E. Roman   Input Parameters:
800b207066SBarry Smith + comm     - The communicator for the `DMMOAB` object
810b207066SBarry Smith . mbiface  - (ptr to) the `DMMOAB` Instance; if passed in `NULL`, MOAB instance is created inside PETSc, and destroyed
820b207066SBarry Smith          along with the `DMMOAB`
831d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
840b207066SBarry Smith - range    - If non-`NULL`, contains range of entities to which DOFs will be assigned
851d72bce8STim Tautges 
861d72bce8STim Tautges   Output Parameter:
870b207066SBarry Smith . dmb - The `DMMOAB` object
881d72bce8STim Tautges 
89032b8ab6SVijay Mahadevan   Level: intermediate
901d72bce8STim Tautges 
910b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabCreate()`
921d72bce8STim Tautges @*/
DMMoabCreateMoab(MPI_Comm comm,moab::Interface * mbiface,moab::Tag * ltog_tag,moab::Range * range,DM * dmb)93d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
94d71ae5a4SJacob Faibussowitsch {
95032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
9685d305f5SVijay Mahadevan   DM              dmmb;
97853cdec3SJed Brown   DM_Moab        *dmmoab;
981d72bce8STim Tautges 
991d72bce8STim Tautges   PetscFunctionBegin;
1004f572ea9SToby Isaac   PetscAssertPointer(dmb, 6);
10185d305f5SVijay Mahadevan 
1029566063dSJacob Faibussowitsch   PetscCall(DMMoabCreate(comm, &dmmb));
10357508eceSPierre Jolivet   dmmoab = (DM_Moab *)dmmb->data;
104a4d2169cSTim Tautges 
105a4d2169cSTim Tautges   if (!mbiface) {
10672ff976dSVijay Mahadevan     dmmoab->mbiface          = new moab::Core();
1077d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
1089371c9d4SSatish Balay   } else {
1091cec0304SVijay Mahadevan     dmmoab->mbiface          = mbiface;
1107d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
1111cec0304SVijay Mahadevan   }
1121cec0304SVijay Mahadevan 
113b5410836SVijay Mahadevan   /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */
114b5410836SVijay Mahadevan   dmmoab->fileset     = 0;
115b117cd09SVijay Mahadevan   dmmoab->hlevel      = 0;
11649d66b22SVijay Mahadevan   dmmoab->nghostrings = 0;
1177d89fc02STim Tautges 
1189daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1199daf19fdSVijay Mahadevan   moab::EntityHandle partnset;
120032b8ab6SVijay Mahadevan 
121db66d124SVijay Mahadevan   /* Create root sets for each mesh.  Then pass these
122db66d124SVijay Mahadevan       to the load_file functions to be populated. */
1239371c9d4SSatish Balay   merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);
1249371c9d4SSatish Balay   MBERR("Creating partition set failed", merr);
125032b8ab6SVijay Mahadevan 
126db66d124SVijay Mahadevan   /* Create the parallel communicator object with the partition handle associated with MOAB */
12772ff976dSVijay Mahadevan   dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
1289daf19fdSVijay Mahadevan #endif
129032b8ab6SVijay Mahadevan 
1304973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
1314973de03SVijay Mahadevan   dmmoab->bs        = 1;
132addae81cSVijay Mahadevan   dmmoab->numFields = 1;
1339566063dSJacob Faibussowitsch   PetscCall(PetscMalloc(dmmoab->numFields * sizeof(char *), &dmmoab->fieldNames));
1349566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy("DEFAULT", (char **)&dmmoab->fieldNames[0]));
1352e4e7c01SVijay Mahadevan   dmmoab->rw_dbglevel            = 0;
1362e4e7c01SVijay Mahadevan   dmmoab->partition_by_rank      = PETSC_FALSE;
1372e4e7c01SVijay Mahadevan   dmmoab->extra_read_options[0]  = '\0';
1382e4e7c01SVijay Mahadevan   dmmoab->extra_write_options[0] = '\0';
1392e4e7c01SVijay Mahadevan   dmmoab->read_mode              = READ_PART;
1402e4e7c01SVijay Mahadevan   dmmoab->write_mode             = WRITE_PART;
1414973de03SVijay Mahadevan 
1424973de03SVijay Mahadevan   /* set global ID tag handle */
1431a845d2aSVijay Mahadevan   if (ltog_tag && *ltog_tag) {
1449566063dSJacob Faibussowitsch     PetscCall(DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag));
1459371c9d4SSatish Balay   } else {
1469371c9d4SSatish Balay     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);
1479371c9d4SSatish Balay     MBERRNM(merr);
1481a845d2aSVijay Mahadevan     if (ltog_tag) *ltog_tag = dmmoab->ltog_tag;
149a4d2169cSTim Tautges   }
150a4d2169cSTim Tautges 
1519371c9d4SSatish Balay   merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag);
1529371c9d4SSatish Balay   MBERRNM(merr);
153340f3b9aSVijay Mahadevan 
1544973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
15548a46eb9SPierre Jolivet   if (range) PetscCall(DMMoabSetLocalVertices(dmmb, range));
15685d305f5SVijay Mahadevan   *dmb = dmmb;
1573ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1581d72bce8STim Tautges }
1591d72bce8STim Tautges 
1609daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1611d72bce8STim Tautges 
162cab5ea25SPierre Jolivet /*@C
1630b207066SBarry Smith   DMMoabGetParallelComm - Get the ParallelComm used with this `DMMOAB`
164aa768e4cSTim Tautges 
165d083f849SBarry Smith   Collective
166aa768e4cSTim Tautges 
167aa768e4cSTim Tautges   Input Parameter:
1680b207066SBarry Smith . dm    - The `DMMOAB` object being set
169aa768e4cSTim Tautges 
170aa768e4cSTim Tautges   Output Parameter:
1710b207066SBarry Smith . pcomm - The ParallelComm for the `DMMOAB`
172aa768e4cSTim Tautges 
173aa768e4cSTim Tautges   Level: beginner
174aa768e4cSTim Tautges 
1750b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabSetInterface()`
176aa768e4cSTim Tautges @*/
DMMoabGetParallelComm(DM dm,moab::ParallelComm ** pcomm)177d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetParallelComm(DM dm, moab::ParallelComm **pcomm)
178d71ae5a4SJacob Faibussowitsch {
1791d72bce8STim Tautges   PetscFunctionBegin;
1801d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
18157508eceSPierre Jolivet   *pcomm = ((DM_Moab *)dm->data)->pcomm;
1823ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1831d72bce8STim Tautges }
1841d72bce8STim Tautges 
1859daf19fdSVijay Mahadevan #endif /* MOAB_HAVE_MPI */
1869daf19fdSVijay Mahadevan 
187cab5ea25SPierre Jolivet /*@C
1880b207066SBarry Smith   DMMoabSetInterface - Set the MOAB instance used with this `DMMOAB`
189aa768e4cSTim Tautges 
190d083f849SBarry Smith   Collective
191aa768e4cSTim Tautges 
192d8d19677SJose E. Roman   Input Parameters:
1930b207066SBarry Smith + dm      - The `DMMOAB` object being set
1940b207066SBarry Smith - mbiface - The MOAB instance being set on this `DMMOAB`
195aa768e4cSTim Tautges 
196aa768e4cSTim Tautges   Level: beginner
197aa768e4cSTim Tautges 
1980b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetInterface()`
199aa768e4cSTim Tautges @*/
DMMoabSetInterface(DM dm,moab::Interface * mbiface)200d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetInterface(DM dm, moab::Interface *mbiface)
201d71ae5a4SJacob Faibussowitsch {
20257508eceSPierre Jolivet   DM_Moab *dmmoab = (DM_Moab *)dm->data;
203032b8ab6SVijay Mahadevan 
2041d72bce8STim Tautges   PetscFunctionBegin;
2051d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2064f572ea9SToby Isaac   PetscAssertPointer(mbiface, 2);
2079daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
208032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
2099daf19fdSVijay Mahadevan #endif
210032b8ab6SVijay Mahadevan   dmmoab->mbiface          = mbiface;
211032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
2123ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2131d72bce8STim Tautges }
2141d72bce8STim Tautges 
215cab5ea25SPierre Jolivet /*@C
2160b207066SBarry Smith   DMMoabGetInterface - Get the MOAB instance used with this `DMMOAB`
217aa768e4cSTim Tautges 
218d083f849SBarry Smith   Collective
219aa768e4cSTim Tautges 
220aa768e4cSTim Tautges   Input Parameter:
2210b207066SBarry Smith . dm - The `DMMOAB` object being set
222aa768e4cSTim Tautges 
223aa768e4cSTim Tautges   Output Parameter:
2240b207066SBarry Smith . mbiface - The MOAB instance set on this `DMMOAB`
225aa768e4cSTim Tautges 
226aa768e4cSTim Tautges   Level: beginner
227aa768e4cSTim Tautges 
2280b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabSetInterface()`
229aa768e4cSTim Tautges @*/
DMMoabGetInterface(DM dm,moab::Interface ** mbiface)230d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetInterface(DM dm, moab::Interface **mbiface)
231d71ae5a4SJacob Faibussowitsch {
232cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
233cabb514dSBarry Smith 
2341d72bce8STim Tautges   PetscFunctionBegin;
2351d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2369371c9d4SSatish Balay   PetscCall(PetscCitationsRegister("@techreport{tautges_moab:_2004,\n  type = {{SAND2004-1592}},\n  title = {{MOAB:} A Mesh-Oriented Database},  institution = {Sandia National Laboratories},\n  author = {Tautges, T. J. and Meyers, R. and Merkley, "
2379371c9d4SSatish Balay                                    "K. and Stimpson, C. and Ernst, C.},\n  year = {2004},  note = {Report}\n}\n",
2389371c9d4SSatish Balay                                    &cite));
239a4d2169cSTim Tautges   *mbiface = ((DM_Moab *)dm->data)->mbiface;
2403ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2411d72bce8STim Tautges }
2421d72bce8STim Tautges 
243cab5ea25SPierre Jolivet /*@C
2440b207066SBarry Smith   DMMoabSetLocalVertices - Set the entities having DOFs on this `DMMOAB`
245aa768e4cSTim Tautges 
246d083f849SBarry Smith   Collective
247aa768e4cSTim Tautges 
248d8d19677SJose E. Roman   Input Parameters:
2490b207066SBarry Smith + dm    - The `DMMOAB` object being set
2500b207066SBarry Smith - range - The entities treated by this `DMMOAB`
251aa768e4cSTim Tautges 
252aa768e4cSTim Tautges   Level: beginner
253aa768e4cSTim Tautges 
2540b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetAllVertices()`
255aa768e4cSTim Tautges @*/
DMMoabSetLocalVertices(DM dm,moab::Range * range)256d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetLocalVertices(DM dm, moab::Range *range)
257d71ae5a4SJacob Faibussowitsch {
258fd3326ddSVijay Mahadevan   moab::Range tmpvtxs;
25957508eceSPierre Jolivet   DM_Moab    *dmmoab = (DM_Moab *)dm->data;
260032b8ab6SVijay Mahadevan 
2611d72bce8STim Tautges   PetscFunctionBegin;
2621d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
263032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
264032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
265fd3326ddSVijay Mahadevan 
266032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
267fd3326ddSVijay Mahadevan 
2689daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
2699daf19fdSVijay Mahadevan   moab::ErrorCode merr;
270fd3326ddSVijay Mahadevan   /* filter based on parallel status */
2719371c9d4SSatish Balay   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned);
2729371c9d4SSatish Balay   MBERRNM(merr);
273fd3326ddSVijay Mahadevan 
274fd3326ddSVijay Mahadevan   /* filter all the non-owned and shared entities out of the list */
275fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
2769371c9d4SSatish Balay   merr    = dmmoab->pcomm->filter_pstatus(tmpvtxs, PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost);
2779371c9d4SSatish Balay   MBERRNM(merr);
278fd3326ddSVijay Mahadevan   tmpvtxs         = moab::subtract(tmpvtxs, *dmmoab->vghost);
279fd3326ddSVijay Mahadevan   *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs);
2809daf19fdSVijay Mahadevan #else
2819daf19fdSVijay Mahadevan   *dmmoab->vowned = *dmmoab->vlocal;
2829daf19fdSVijay Mahadevan #endif
283fd3326ddSVijay Mahadevan 
284fd3326ddSVijay Mahadevan   /* compute and cache the sizes of local and ghosted entities */
285032b8ab6SVijay Mahadevan   dmmoab->nloc   = dmmoab->vowned->size();
286032b8ab6SVijay Mahadevan   dmmoab->nghost = dmmoab->vghost->size();
2879daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
288462c564dSBarry Smith   PetscCallMPI(MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm));
2899daf19fdSVijay Mahadevan #else
2909daf19fdSVijay Mahadevan   dmmoab->n = dmmoab->nloc;
2919daf19fdSVijay Mahadevan #endif
2923ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2931d72bce8STim Tautges }
2941d72bce8STim Tautges 
295cab5ea25SPierre Jolivet /*@C
2960b207066SBarry Smith   DMMoabGetAllVertices - Get the entities having DOFs on this `DMMOAB`
2978d8d51c8SVijay Mahadevan 
298d083f849SBarry Smith   Collective
2998d8d51c8SVijay Mahadevan 
3008d8d51c8SVijay Mahadevan   Input Parameter:
3010b207066SBarry Smith . dm - The `DMMOAB` object being set
3028d8d51c8SVijay Mahadevan 
3038d8d51c8SVijay Mahadevan   Output Parameter:
3040b207066SBarry Smith . local - The local vertex entities in this `DMMOAB` = (owned+ghosted)
3058d8d51c8SVijay Mahadevan 
3068d8d51c8SVijay Mahadevan   Level: beginner
3078d8d51c8SVijay Mahadevan 
3080b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetLocalVertices()`
3098d8d51c8SVijay Mahadevan @*/
DMMoabGetAllVertices(DM dm,moab::Range * local)310d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetAllVertices(DM dm, moab::Range *local)
311d71ae5a4SJacob Faibussowitsch {
3128d8d51c8SVijay Mahadevan   PetscFunctionBegin;
3138d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
3148d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab *)dm->data)->vlocal;
3153ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3168d8d51c8SVijay Mahadevan }
3178d8d51c8SVijay Mahadevan 
318cab5ea25SPierre Jolivet /*@C
3190b207066SBarry Smith   DMMoabGetLocalVertices - Get the entities having DOFs on this `DMMOAB`
320aa768e4cSTim Tautges 
321d083f849SBarry Smith   Collective
322aa768e4cSTim Tautges 
323aa768e4cSTim Tautges   Input Parameter:
3240b207066SBarry Smith . dm - The `DMMOAB` object being set
325aa768e4cSTim Tautges 
326a2b725a8SWilliam Gropp   Output Parameters:
3270b207066SBarry Smith + owned - The owned vertex entities in this `DMMOAB`
328a2b725a8SWilliam Gropp - ghost - The ghosted entities (non-owned) stored locally in this partition
329aa768e4cSTim Tautges 
330aa768e4cSTim Tautges   Level: beginner
331aa768e4cSTim Tautges 
3320b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetAllVertices()`
333aa768e4cSTim Tautges @*/
DMMoabGetLocalVertices(DM dm,const moab::Range ** owned,const moab::Range ** ghost)334d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetLocalVertices(DM dm, const moab::Range **owned, const moab::Range **ghost)
335d71ae5a4SJacob Faibussowitsch {
3361d72bce8STim Tautges   PetscFunctionBegin;
3371d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
338351b8a77SVijay Mahadevan   if (owned) *owned = ((DM_Moab *)dm->data)->vowned;
339351b8a77SVijay Mahadevan   if (ghost) *ghost = ((DM_Moab *)dm->data)->vghost;
3403ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3411d72bce8STim Tautges }
3421d72bce8STim Tautges 
343cab5ea25SPierre Jolivet /*@C
3445eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
3455eb88e9dSVijay Mahadevan 
346d083f849SBarry Smith   Collective
3475eb88e9dSVijay Mahadevan 
3485eb88e9dSVijay Mahadevan   Input Parameter:
3490b207066SBarry Smith . dm - The `DMMOAB` object being set
3505eb88e9dSVijay Mahadevan 
3515eb88e9dSVijay Mahadevan   Output Parameter:
3525eb88e9dSVijay Mahadevan . range - The entities owned locally
3535eb88e9dSVijay Mahadevan 
3545eb88e9dSVijay Mahadevan   Level: beginner
3555eb88e9dSVijay Mahadevan 
3560b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabSetLocalElements()`
3575eb88e9dSVijay Mahadevan @*/
DMMoabGetLocalElements(DM dm,const moab::Range ** range)358d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetLocalElements(DM dm, const moab::Range **range)
359d71ae5a4SJacob Faibussowitsch {
3605eb88e9dSVijay Mahadevan   PetscFunctionBegin;
3615eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
362351b8a77SVijay Mahadevan   if (range) *range = ((DM_Moab *)dm->data)->elocal;
3633ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3641cec0304SVijay Mahadevan }
3651cec0304SVijay Mahadevan 
366cab5ea25SPierre Jolivet /*@C
3670b207066SBarry Smith   DMMoabSetLocalElements - Set the entities having DOFs on this `DMMOAB`
3681cec0304SVijay Mahadevan 
369d083f849SBarry Smith   Collective
3701cec0304SVijay Mahadevan 
371a2b725a8SWilliam Gropp   Input Parameters:
3720b207066SBarry Smith + dm    - The `DMMOAB` object being set
3730b207066SBarry Smith - range - The entities treated by this `DMMOAB`
3741cec0304SVijay Mahadevan 
3751cec0304SVijay Mahadevan   Level: beginner
3761cec0304SVijay Mahadevan 
3770b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetLocalElements()`
3781cec0304SVijay Mahadevan @*/
DMMoabSetLocalElements(DM dm,moab::Range * range)379d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetLocalElements(DM dm, moab::Range *range)
380d71ae5a4SJacob Faibussowitsch {
38157508eceSPierre Jolivet   DM_Moab *dmmoab = (DM_Moab *)dm->data;
3821cec0304SVijay Mahadevan 
3831cec0304SVijay Mahadevan   PetscFunctionBegin;
3841cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
3851cec0304SVijay Mahadevan   dmmoab->elocal->clear();
3861cec0304SVijay Mahadevan   dmmoab->eghost->clear();
3871cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
3889daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
3899daf19fdSVijay Mahadevan   moab::ErrorCode merr;
3909371c9d4SSatish Balay   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT);
3919371c9d4SSatish Balay   MBERRNM(merr);
3921cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
3939daf19fdSVijay Mahadevan #endif
3941cec0304SVijay Mahadevan   dmmoab->neleloc   = dmmoab->elocal->size();
39541dd5348SVijay Mahadevan   dmmoab->neleghost = dmmoab->eghost->size();
3969daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
397462c564dSBarry Smith   PetscCallMPI(MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm));
3983ba16761SJacob Faibussowitsch   PetscCall(PetscInfo(dm, "Created %" PetscInt_FMT " local and %" PetscInt_FMT " global elements.\n", dmmoab->neleloc, dmmoab->nele));
3999daf19fdSVijay Mahadevan #else
4009daf19fdSVijay Mahadevan   dmmoab->nele = dmmoab->neleloc;
4019daf19fdSVijay Mahadevan #endif
4023ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4035eb88e9dSVijay Mahadevan }
4045eb88e9dSVijay Mahadevan 
405cab5ea25SPierre Jolivet /*@C
406aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
407aa768e4cSTim Tautges 
408d083f849SBarry Smith   Collective
409aa768e4cSTim Tautges 
410a2b725a8SWilliam Gropp   Input Parameters:
4110b207066SBarry Smith + dm      - The `DMMOAB` object being set
4120b207066SBarry Smith - ltogtag - The `DMMOAB` tag used for local to global ids
413aa768e4cSTim Tautges 
414aa768e4cSTim Tautges   Level: beginner
415aa768e4cSTim Tautges 
4160b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetLocalToGlobalTag()`
417aa768e4cSTim Tautges @*/
DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)418d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm, moab::Tag ltogtag)
419d71ae5a4SJacob Faibussowitsch {
4201d72bce8STim Tautges   PetscFunctionBegin;
4211d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4221d72bce8STim Tautges   ((DM_Moab *)dm->data)->ltog_tag = ltogtag;
4233ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4241d72bce8STim Tautges }
4251d72bce8STim Tautges 
426cab5ea25SPierre Jolivet /*@C
427aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
428aa768e4cSTim Tautges 
429d083f849SBarry Smith   Collective
430aa768e4cSTim Tautges 
431aa768e4cSTim Tautges   Input Parameter:
4320b207066SBarry Smith . dm - The `DMMOAB` object being set
433aa768e4cSTim Tautges 
434aa768e4cSTim Tautges   Output Parameter:
43560225df5SJacob Faibussowitsch . ltog_tag - The MOAB tag used for local to global ids
436aa768e4cSTim Tautges 
437aa768e4cSTim Tautges   Level: beginner
438aa768e4cSTim Tautges 
4390b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabSetLocalToGlobalTag()`
440aa768e4cSTim Tautges @*/
DMMoabGetLocalToGlobalTag(DM dm,moab::Tag * ltog_tag)441d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm, moab::Tag *ltog_tag)
442d71ae5a4SJacob Faibussowitsch {
4431d72bce8STim Tautges   PetscFunctionBegin;
4441d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4451d72bce8STim Tautges   *ltog_tag = ((DM_Moab *)dm->data)->ltog_tag;
4463ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4471d72bce8STim Tautges }
4481d72bce8STim Tautges 
449cab5ea25SPierre Jolivet /*@C
4500b207066SBarry Smith   DMMoabSetBlockSize - Set the block size used with this `DMMOAB`
451aa768e4cSTim Tautges 
452d083f849SBarry Smith   Collective
453aa768e4cSTim Tautges 
454d8d19677SJose E. Roman   Input Parameters:
4550b207066SBarry Smith + dm - The `DMMOAB` object being set
4560b207066SBarry Smith - bs - The block size used with this `DMMOAB`
457aa768e4cSTim Tautges 
458aa768e4cSTim Tautges   Level: beginner
459aa768e4cSTim Tautges 
4600b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetBlockSize()`
461aa768e4cSTim Tautges @*/
DMMoabSetBlockSize(DM dm,PetscInt bs)462d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetBlockSize(DM dm, PetscInt bs)
463d71ae5a4SJacob Faibussowitsch {
4641d72bce8STim Tautges   PetscFunctionBegin;
4651d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4661d72bce8STim Tautges   ((DM_Moab *)dm->data)->bs = bs;
4673ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4681d72bce8STim Tautges }
4691d72bce8STim Tautges 
470cab5ea25SPierre Jolivet /*@C
4710b207066SBarry Smith   DMMoabGetBlockSize - Get the block size used with this `DMMOAB`
472aa768e4cSTim Tautges 
473d083f849SBarry Smith   Collective
474aa768e4cSTim Tautges 
475aa768e4cSTim Tautges   Input Parameter:
4760b207066SBarry Smith . dm - The `DMMOAB` object being set
477aa768e4cSTim Tautges 
478aa768e4cSTim Tautges   Output Parameter:
4790b207066SBarry Smith . bs - The block size used with this `DMMOAB`
480aa768e4cSTim Tautges 
481aa768e4cSTim Tautges   Level: beginner
482aa768e4cSTim Tautges 
4830b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabSetBlockSize()`
484aa768e4cSTim Tautges @*/
DMMoabGetBlockSize(DM dm,PetscInt * bs)485d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetBlockSize(DM dm, PetscInt *bs)
486d71ae5a4SJacob Faibussowitsch {
4871d72bce8STim Tautges   PetscFunctionBegin;
4881d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4891d72bce8STim Tautges   *bs = ((DM_Moab *)dm->data)->bs;
4903ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4911d72bce8STim Tautges }
4921d72bce8STim Tautges 
493cab5ea25SPierre Jolivet /*@C
4940b207066SBarry Smith   DMMoabGetSize - Get the global vertex size used with this `DMMOAB`
495212ad6d1SVijay Mahadevan 
4960b207066SBarry Smith   Collective
497212ad6d1SVijay Mahadevan 
498212ad6d1SVijay Mahadevan   Input Parameter:
4990b207066SBarry Smith . dm - The `DMMOAB` object being set
500212ad6d1SVijay Mahadevan 
501d8d19677SJose E. Roman   Output Parameters:
5020b207066SBarry Smith + neg - The number of global elements in the `DMMOAB` instance
5030b207066SBarry Smith - nvg - The number of global vertices in the `DMMOAB` instance
504212ad6d1SVijay Mahadevan 
505212ad6d1SVijay Mahadevan   Level: beginner
506212ad6d1SVijay Mahadevan 
5070b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetLocalSize()`
508212ad6d1SVijay Mahadevan @*/
DMMoabGetSize(DM dm,PetscInt * neg,PetscInt * nvg)509d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetSize(DM dm, PetscInt *neg, PetscInt *nvg)
510d71ae5a4SJacob Faibussowitsch {
511212ad6d1SVijay Mahadevan   PetscFunctionBegin;
512212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
51341dd5348SVijay Mahadevan   if (neg) *neg = ((DM_Moab *)dm->data)->nele;
51441dd5348SVijay Mahadevan   if (nvg) *nvg = ((DM_Moab *)dm->data)->n;
5153ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
516212ad6d1SVijay Mahadevan }
517212ad6d1SVijay Mahadevan 
518cab5ea25SPierre Jolivet /*@C
5190b207066SBarry Smith   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this `DMMOAB`
520212ad6d1SVijay Mahadevan 
5210b207066SBarry Smith   Collective
522212ad6d1SVijay Mahadevan 
523212ad6d1SVijay Mahadevan   Input Parameter:
5240b207066SBarry Smith . dm - The `DMMOAB` object being set
525212ad6d1SVijay Mahadevan 
526d8d19677SJose E. Roman   Output Parameters:
527b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor
52800cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor
52900cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor
530a2b725a8SWilliam Gropp - nvg - The number of ghosted vertices in this processor
531212ad6d1SVijay Mahadevan 
532212ad6d1SVijay Mahadevan   Level: beginner
533212ad6d1SVijay Mahadevan 
5340b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetSize()`
535212ad6d1SVijay Mahadevan @*/
DMMoabGetLocalSize(DM dm,PetscInt * nel,PetscInt * neg,PetscInt * nvl,PetscInt * nvg)536d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetLocalSize(DM dm, PetscInt *nel, PetscInt *neg, PetscInt *nvl, PetscInt *nvg)
537d71ae5a4SJacob Faibussowitsch {
538212ad6d1SVijay Mahadevan   PetscFunctionBegin;
539212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
54041dd5348SVijay Mahadevan   if (nel) *nel = ((DM_Moab *)dm->data)->neleloc;
54141dd5348SVijay Mahadevan   if (neg) *neg = ((DM_Moab *)dm->data)->neleghost;
54241dd5348SVijay Mahadevan   if (nvl) *nvl = ((DM_Moab *)dm->data)->nloc;
54341dd5348SVijay Mahadevan   if (nvg) *nvg = ((DM_Moab *)dm->data)->nghost;
5443ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
545212ad6d1SVijay Mahadevan }
546212ad6d1SVijay Mahadevan 
547cab5ea25SPierre Jolivet /*@C
54800cc10feSVijay Mahadevan   DMMoabGetOffset - Get the local offset for the global vector
54900cc10feSVijay Mahadevan 
550d083f849SBarry Smith   Collective
55100cc10feSVijay Mahadevan 
55200cc10feSVijay Mahadevan   Input Parameter:
5530b207066SBarry Smith . dm - The `DMMOAB` object being set
55400cc10feSVijay Mahadevan 
55500cc10feSVijay Mahadevan   Output Parameter:
55600cc10feSVijay Mahadevan . offset - The local offset for the global vector
55700cc10feSVijay Mahadevan 
55800cc10feSVijay Mahadevan   Level: beginner
55900cc10feSVijay Mahadevan 
5600b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetDimension()`
56100cc10feSVijay Mahadevan @*/
DMMoabGetOffset(DM dm,PetscInt * offset)562d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetOffset(DM dm, PetscInt *offset)
563d71ae5a4SJacob Faibussowitsch {
56400cc10feSVijay Mahadevan   PetscFunctionBegin;
56500cc10feSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
56600cc10feSVijay Mahadevan   *offset = ((DM_Moab *)dm->data)->vstart;
5673ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
56800cc10feSVijay Mahadevan }
56900cc10feSVijay Mahadevan 
570cab5ea25SPierre Jolivet /*@C
5710b207066SBarry Smith   DMMoabGetDimension - Get the dimension of the `DM` Mesh
5724920ab11SVijay Mahadevan 
573d083f849SBarry Smith   Collective
5744920ab11SVijay Mahadevan 
5754920ab11SVijay Mahadevan   Input Parameter:
5760b207066SBarry Smith . dm - The `DMMOAB` object
5774920ab11SVijay Mahadevan 
5784920ab11SVijay Mahadevan   Output Parameter:
5790b207066SBarry Smith . dim - The dimension of `DM`
5804920ab11SVijay Mahadevan 
5814920ab11SVijay Mahadevan   Level: beginner
5824920ab11SVijay Mahadevan 
5830b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetOffset()`
5844920ab11SVijay Mahadevan @*/
DMMoabGetDimension(DM dm,PetscInt * dim)585d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetDimension(DM dm, PetscInt *dim)
586d71ae5a4SJacob Faibussowitsch {
5874920ab11SVijay Mahadevan   PetscFunctionBegin;
5884920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
5894920ab11SVijay Mahadevan   *dim = ((DM_Moab *)dm->data)->dim;
5903ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5914920ab11SVijay Mahadevan }
5924920ab11SVijay Mahadevan 
593cab5ea25SPierre Jolivet /*@C
594755f3dfbSVijay Mahadevan   DMMoabGetHierarchyLevel - Get the current level of the mesh hierarchy
595755f3dfbSVijay Mahadevan   generated through uniform refinement.
596755f3dfbSVijay Mahadevan 
5970b207066SBarry Smith   Collective
598755f3dfbSVijay Mahadevan 
599755f3dfbSVijay Mahadevan   Input Parameter:
6000b207066SBarry Smith . dm - The `DMMOAB` object being set
601755f3dfbSVijay Mahadevan 
602755f3dfbSVijay Mahadevan   Output Parameter:
60360225df5SJacob Faibussowitsch . nlevel - The current mesh hierarchy level
604755f3dfbSVijay Mahadevan 
605755f3dfbSVijay Mahadevan   Level: beginner
606755f3dfbSVijay Mahadevan 
6070b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetMaterialBlock()`
608755f3dfbSVijay Mahadevan @*/
DMMoabGetHierarchyLevel(DM dm,PetscInt * nlevel)609d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetHierarchyLevel(DM dm, PetscInt *nlevel)
610d71ae5a4SJacob Faibussowitsch {
611755f3dfbSVijay Mahadevan   PetscFunctionBegin;
612755f3dfbSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
613755f3dfbSVijay Mahadevan   if (nlevel) *nlevel = ((DM_Moab *)dm->data)->hlevel;
6143ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
615755f3dfbSVijay Mahadevan }
616755f3dfbSVijay Mahadevan 
617cab5ea25SPierre Jolivet /*@C
618340f3b9aSVijay Mahadevan   DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh
619340f3b9aSVijay Mahadevan 
620d083f849SBarry Smith   Collective
621340f3b9aSVijay Mahadevan 
622d8d19677SJose E. Roman   Input Parameters:
6230b207066SBarry Smith + dm      - The `DMMOAB` object
624a2b725a8SWilliam Gropp - ehandle - The element entity handle
625340f3b9aSVijay Mahadevan 
626340f3b9aSVijay Mahadevan   Output Parameter:
627340f3b9aSVijay Mahadevan . mat - The material ID for the current entity
628340f3b9aSVijay Mahadevan 
629340f3b9aSVijay Mahadevan   Level: beginner
630340f3b9aSVijay Mahadevan 
6310b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetHierarchyLevel()`
632340f3b9aSVijay Mahadevan @*/
DMMoabGetMaterialBlock(DM dm,const moab::EntityHandle ehandle,PetscInt * mat)633d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetMaterialBlock(DM dm, const moab::EntityHandle ehandle, PetscInt *mat)
634d71ae5a4SJacob Faibussowitsch {
635340f3b9aSVijay Mahadevan   DM_Moab *dmmoab;
636340f3b9aSVijay Mahadevan 
637340f3b9aSVijay Mahadevan   PetscFunctionBegin;
638340f3b9aSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
639340f3b9aSVijay Mahadevan   if (*mat) {
64057508eceSPierre Jolivet     dmmoab = (DM_Moab *)dm->data;
641a044f6b6SVijay Mahadevan     *mat   = dmmoab->materials[dmmoab->elocal->index(ehandle)];
642340f3b9aSVijay Mahadevan   }
6433ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
644340f3b9aSVijay Mahadevan }
645340f3b9aSVijay Mahadevan 
646cab5ea25SPierre Jolivet /*@C
64785d305f5SVijay Mahadevan   DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities
64885d305f5SVijay Mahadevan 
649d083f849SBarry Smith   Collective
65085d305f5SVijay Mahadevan 
651d8d19677SJose E. Roman   Input Parameters:
6520b207066SBarry Smith + dm    - The `DMMOAB` object
65385d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
654a2b725a8SWilliam Gropp - conn  - The vertex entity handles
65585d305f5SVijay Mahadevan 
65685d305f5SVijay Mahadevan   Output Parameter:
65785d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities
65885d305f5SVijay Mahadevan 
65985d305f5SVijay Mahadevan   Level: beginner
66085d305f5SVijay Mahadevan 
6610b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetVertexConnectivity()`
66285d305f5SVijay Mahadevan @*/
DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle * conn,PetscReal * vpos)663d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetVertexCoordinates(DM dm, PetscInt nconn, const moab::EntityHandle *conn, PetscReal *vpos)
664d71ae5a4SJacob Faibussowitsch {
6657023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
6667023aa44SVijay Mahadevan   moab::ErrorCode merr;
6677023aa44SVijay Mahadevan 
6687023aa44SVijay Mahadevan   PetscFunctionBegin;
6697023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
6704f572ea9SToby Isaac   PetscAssertPointer(conn, 3);
6714f572ea9SToby Isaac   PetscAssertPointer(vpos, 4);
67257508eceSPierre Jolivet   dmmoab = (DM_Moab *)dm->data;
6737023aa44SVijay Mahadevan 
6747023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
6759c368985SVijay Mahadevan   if (dmmoab->hlevel) {
6769371c9d4SSatish Balay     merr = dmmoab->hierarchy->get_coordinates(const_cast<moab::EntityHandle *>(conn), nconn, dmmoab->hlevel, vpos);
6779371c9d4SSatish Balay     MBERRNM(merr);
6789371c9d4SSatish Balay   } else {
6799371c9d4SSatish Balay     merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);
6809371c9d4SSatish Balay     MBERRNM(merr);
6819c368985SVijay Mahadevan   }
6823ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6837023aa44SVijay Mahadevan }
6847023aa44SVijay Mahadevan 
685cab5ea25SPierre Jolivet /*@C
68685d305f5SVijay Mahadevan   DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity
68785d305f5SVijay Mahadevan 
688d083f849SBarry Smith   Collective
68985d305f5SVijay Mahadevan 
690d8d19677SJose E. Roman   Input Parameters:
6910b207066SBarry Smith + dm      - The `DMMOAB` object
692a2b725a8SWilliam Gropp - vhandle - Vertex entity handle
69385d305f5SVijay Mahadevan 
694d8d19677SJose E. Roman   Output Parameters:
695a2b725a8SWilliam Gropp + nconn - Number of entities whose coordinates are needed
696a2b725a8SWilliam Gropp - conn  - The vertex entity handles
69785d305f5SVijay Mahadevan 
69885d305f5SVijay Mahadevan   Level: beginner
69985d305f5SVijay Mahadevan 
7000b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetVertexCoordinates()`, `DMMoabRestoreVertexConnectivity()`
70185d305f5SVijay Mahadevan @*/
DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle vhandle,PetscInt * nconn,moab::EntityHandle ** conn)702d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetVertexConnectivity(DM dm, moab::EntityHandle vhandle, PetscInt *nconn, moab::EntityHandle **conn)
703d71ae5a4SJacob Faibussowitsch {
7048d8d51c8SVijay Mahadevan   DM_Moab                        *dmmoab;
7058d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities, connect;
7068d8d51c8SVijay Mahadevan   moab::ErrorCode                 merr;
7078d8d51c8SVijay Mahadevan 
7088d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7098d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
7104f572ea9SToby Isaac   PetscAssertPointer(conn, 4);
71157508eceSPierre Jolivet   dmmoab = (DM_Moab *)dm->data;
7128d8d51c8SVijay Mahadevan 
7138d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
7149371c9d4SSatish Balay   merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION);
7159371c9d4SSatish Balay   MBERRNM(merr);
7169371c9d4SSatish Balay   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0], adj_entities.size(), connect);
7179371c9d4SSatish Balay   MBERRNM(merr);
7188d8d51c8SVijay Mahadevan 
7198d8d51c8SVijay Mahadevan   if (conn) {
7209566063dSJacob Faibussowitsch     PetscCall(PetscMalloc(sizeof(moab::EntityHandle) * connect.size(), conn));
7219566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(*conn, &connect[0], connect.size()));
7228d8d51c8SVijay Mahadevan   }
7238d8d51c8SVijay Mahadevan   if (nconn) *nconn = connect.size();
7243ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7258d8d51c8SVijay Mahadevan }
7268d8d51c8SVijay Mahadevan 
727cab5ea25SPierre Jolivet /*@C
72885d305f5SVijay Mahadevan   DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity
72985d305f5SVijay Mahadevan 
730d083f849SBarry Smith   Collective
73185d305f5SVijay Mahadevan 
732d8d19677SJose E. Roman   Input Parameters:
7330b207066SBarry Smith + dm      - The `DMMOAB` object
73460225df5SJacob Faibussowitsch . ehandle - Vertex entity handle
73585d305f5SVijay Mahadevan . nconn   - Number of entities whose coordinates are needed
736a2b725a8SWilliam Gropp - conn    - The vertex entity handles
73785d305f5SVijay Mahadevan 
73885d305f5SVijay Mahadevan   Level: beginner
73985d305f5SVijay Mahadevan 
7400b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetVertexCoordinates()`, `DMMoabGetVertexConnectivity()`
74185d305f5SVijay Mahadevan @*/
DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt * nconn,moab::EntityHandle ** conn)742d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt *nconn, moab::EntityHandle **conn)
743d71ae5a4SJacob Faibussowitsch {
7448d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7458d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
7464f572ea9SToby Isaac   PetscAssertPointer(conn, 4);
7478d8d51c8SVijay Mahadevan 
74848a46eb9SPierre Jolivet   if (conn) PetscCall(PetscFree(*conn));
7498d8d51c8SVijay Mahadevan   if (nconn) *nconn = 0;
7503ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7518d8d51c8SVijay Mahadevan }
7528d8d51c8SVijay Mahadevan 
753cab5ea25SPierre Jolivet /*@C
75485d305f5SVijay Mahadevan   DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity
75585d305f5SVijay Mahadevan 
756d083f849SBarry Smith   Collective
75785d305f5SVijay Mahadevan 
758d8d19677SJose E. Roman   Input Parameters:
7590b207066SBarry Smith + dm      - The `DMMOAB` object
760a2b725a8SWilliam Gropp - ehandle - Vertex entity handle
76185d305f5SVijay Mahadevan 
762d8d19677SJose E. Roman   Output Parameters:
763a2b725a8SWilliam Gropp + nconn - Number of entities whose coordinates are needed
764a2b725a8SWilliam Gropp - conn  - The vertex entity handles
76585d305f5SVijay Mahadevan 
76685d305f5SVijay Mahadevan   Level: beginner
76785d305f5SVijay Mahadevan 
7680b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetVertexCoordinates()`, `DMMoabGetVertexConnectivity()`, `DMMoabRestoreVertexConnectivity()`
76985d305f5SVijay Mahadevan @*/
DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt * nconn,const moab::EntityHandle ** conn)770d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetElementConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt *nconn, const moab::EntityHandle **conn)
771d71ae5a4SJacob Faibussowitsch {
7727023aa44SVijay Mahadevan   DM_Moab                        *dmmoab;
7737023aa44SVijay Mahadevan   const moab::EntityHandle       *connect;
7749c368985SVijay Mahadevan   std::vector<moab::EntityHandle> vconn;
7757023aa44SVijay Mahadevan   moab::ErrorCode                 merr;
7767023aa44SVijay Mahadevan   PetscInt                        nnodes;
7777023aa44SVijay Mahadevan 
7787023aa44SVijay Mahadevan   PetscFunctionBegin;
7797023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
7804f572ea9SToby Isaac   PetscAssertPointer(conn, 4);
78157508eceSPierre Jolivet   dmmoab = (DM_Moab *)dm->data;
7827023aa44SVijay Mahadevan 
7837023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
7849371c9d4SSatish Balay   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);
7859371c9d4SSatish Balay   MBERRNM(merr);
7867023aa44SVijay Mahadevan   if (conn) *conn = connect;
7877023aa44SVijay Mahadevan   if (nconn) *nconn = nnodes;
7883ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7897023aa44SVijay Mahadevan }
7907023aa44SVijay Mahadevan 
791cab5ea25SPierre Jolivet /*@C
79285d305f5SVijay Mahadevan   DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element)
79385d305f5SVijay Mahadevan 
794d083f849SBarry Smith   Collective
79585d305f5SVijay Mahadevan 
796d8d19677SJose E. Roman   Input Parameters:
7970b207066SBarry Smith + dm  - The `DMMOAB` object
798a2b725a8SWilliam Gropp - ent - Entity handle
79985d305f5SVijay Mahadevan 
80085d305f5SVijay Mahadevan   Output Parameter:
8010b207066SBarry Smith . ent_on_boundary - `PETSC_TRUE` if entity on boundary; `PETSC_FALSE` otherwise
80285d305f5SVijay Mahadevan 
80385d305f5SVijay Mahadevan   Level: beginner
80485d305f5SVijay Mahadevan 
8050b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabCheckBoundaryVertices()`
80685d305f5SVijay Mahadevan @*/
DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool * ent_on_boundary)807d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabIsEntityOnBoundary(DM dm, const moab::EntityHandle ent, PetscBool *ent_on_boundary)
808d71ae5a4SJacob Faibussowitsch {
80969263071SVijay Mahadevan   moab::EntityType etype;
81069263071SVijay Mahadevan   DM_Moab         *dmmoab;
81169263071SVijay Mahadevan   PetscInt         edim;
81269263071SVijay Mahadevan 
81369263071SVijay Mahadevan   PetscFunctionBegin;
81469263071SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
8154f572ea9SToby Isaac   PetscAssertPointer(ent_on_boundary, 3);
81657508eceSPierre Jolivet   dmmoab = (DM_Moab *)dm->data;
81769263071SVijay Mahadevan 
81869263071SVijay Mahadevan   /* get the entity type and handle accordingly */
81969263071SVijay Mahadevan   etype = dmmoab->mbiface->type_from_handle(ent);
8201dca8a05SBarry Smith   PetscCheck(etype < moab::MBPOLYHEDRON, PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Entity type on the boundary skin is invalid. EntityType = %" PetscInt_FMT, etype);
82169263071SVijay Mahadevan 
82269263071SVijay Mahadevan   /* get the entity dimension */
82369263071SVijay Mahadevan   edim = dmmoab->mbiface->dimension_from_handle(ent);
82469263071SVijay Mahadevan 
82569263071SVijay Mahadevan   *ent_on_boundary = PETSC_FALSE;
82669263071SVijay Mahadevan   if (etype == moab::MBVERTEX && edim == 0) {
82749d66b22SVijay Mahadevan     *ent_on_boundary = ((dmmoab->bndyvtx->index(ent) >= 0) ? PETSC_TRUE : PETSC_FALSE);
8289371c9d4SSatish Balay   } else {
82969263071SVijay Mahadevan     if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */
8306d9eb265SVijay Mahadevan       if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE;
8319371c9d4SSatish Balay     } else { /* next check the lower-dimensional faces */
8326d9eb265SVijay Mahadevan       if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE;
83369263071SVijay Mahadevan     }
83469263071SVijay Mahadevan   }
8353ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
83669263071SVijay Mahadevan }
83769263071SVijay Mahadevan 
838cab5ea25SPierre Jolivet /*@C
8394597dd3dSJose E. Roman   DMMoabCheckBoundaryVertices - Check whether a given entity is on the boundary (vertex, edge, face, element)
84085d305f5SVijay Mahadevan 
84197bb3fdcSJose E. Roman   Input Parameters:
8420b207066SBarry Smith + dm    - The `DMMOAB` object
84385d305f5SVijay Mahadevan . nconn - Number of handles
844a2b725a8SWilliam Gropp - cnt   - Array of entity handles
84585d305f5SVijay Mahadevan 
84685d305f5SVijay Mahadevan   Output Parameter:
8470b207066SBarry Smith . isbdvtx - Array of boundary markers - `PETSC_TRUE` if entity on boundary; `PETSC_FALSE` otherwise
84885d305f5SVijay Mahadevan 
84985d305f5SVijay Mahadevan   Level: beginner
85085d305f5SVijay Mahadevan 
8510b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabIsEntityOnBoundary()`
85285d305f5SVijay Mahadevan @*/
DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle * cnt,PetscBool * isbdvtx)853d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCheckBoundaryVertices(DM dm, PetscInt nconn, const moab::EntityHandle *cnt, PetscBool *isbdvtx)
854d71ae5a4SJacob Faibussowitsch {
8557023aa44SVijay Mahadevan   DM_Moab *dmmoab;
8567023aa44SVijay Mahadevan   PetscInt i;
8577023aa44SVijay Mahadevan 
8587023aa44SVijay Mahadevan   PetscFunctionBegin;
8597023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
8604f572ea9SToby Isaac   PetscAssertPointer(cnt, 3);
8614f572ea9SToby Isaac   PetscAssertPointer(isbdvtx, 4);
86257508eceSPierre Jolivet   dmmoab = (DM_Moab *)dm->data;
8637023aa44SVijay Mahadevan 
864ad540459SPierre Jolivet   for (i = 0; i < nconn; ++i) isbdvtx[i] = (dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE : PETSC_FALSE);
8653ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8667023aa44SVijay Mahadevan }
8677023aa44SVijay Mahadevan 
868cab5ea25SPierre Jolivet /*@C
86985d305f5SVijay Mahadevan   DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary
87085d305f5SVijay Mahadevan 
87185d305f5SVijay Mahadevan   Input Parameter:
8720b207066SBarry Smith . dm - The `DMMOAB` object
87385d305f5SVijay Mahadevan 
874d8d19677SJose E. Roman   Output Parameters:
875a2b725a8SWilliam Gropp + bdvtx   - Boundary vertices
87685d305f5SVijay Mahadevan . bdelems - Boundary elements
877a2b725a8SWilliam Gropp - bdfaces - Boundary faces
87885d305f5SVijay Mahadevan 
87985d305f5SVijay Mahadevan   Level: beginner
88085d305f5SVijay Mahadevan 
8810b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabCheckBoundaryVertices()`, `DMMoabIsEntityOnBoundary()`
88285d305f5SVijay Mahadevan @*/
DMMoabGetBoundaryMarkers(DM dm,const moab::Range ** bdvtx,const moab::Range ** bdelems,const moab::Range ** bdfaces)883d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetBoundaryMarkers(DM dm, const moab::Range **bdvtx, const moab::Range **bdelems, const moab::Range **bdfaces)
884d71ae5a4SJacob Faibussowitsch {
8851cec0304SVijay Mahadevan   DM_Moab *dmmoab;
8861cec0304SVijay Mahadevan 
8871cec0304SVijay Mahadevan   PetscFunctionBegin;
8881cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
88957508eceSPierre Jolivet   dmmoab = (DM_Moab *)dm->data;
8901cec0304SVijay Mahadevan 
8916d9eb265SVijay Mahadevan   if (bdvtx) *bdvtx = dmmoab->bndyvtx;
8926d9eb265SVijay Mahadevan   if (bdfaces) *bdfaces = dmmoab->bndyfaces;
8936d9eb265SVijay Mahadevan   if (bdelems) *bdfaces = dmmoab->bndyelems;
8943ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8951cec0304SVijay Mahadevan }
8961cec0304SVijay Mahadevan 
DMDestroy_Moab(DM dm)897d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm)
898d71ae5a4SJacob Faibussowitsch {
89985d305f5SVijay Mahadevan   PetscInt        i;
900e882eb38SVijay Mahadevan   moab::ErrorCode merr;
901f6829af0SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab *)dm->data;
902f6829af0SVijay Mahadevan 
903f6829af0SVijay Mahadevan   PetscFunctionBegin;
904f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
905304006b3SVijay Mahadevan 
906304006b3SVijay Mahadevan   dmmoab->refct--;
907304006b3SVijay Mahadevan   if (!dmmoab->refct) {
908f6829af0SVijay Mahadevan     delete dmmoab->vlocal;
909f6829af0SVijay Mahadevan     delete dmmoab->vowned;
910f6829af0SVijay Mahadevan     delete dmmoab->vghost;
911f6829af0SVijay Mahadevan     delete dmmoab->elocal;
912f6829af0SVijay Mahadevan     delete dmmoab->eghost;
913f6829af0SVijay Mahadevan     delete dmmoab->bndyvtx;
914f6829af0SVijay Mahadevan     delete dmmoab->bndyfaces;
915f6829af0SVijay Mahadevan     delete dmmoab->bndyelems;
916f6829af0SVijay Mahadevan 
9179566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->gsindices));
9189566063dSJacob Faibussowitsch     PetscCall(PetscFree2(dmmoab->gidmap, dmmoab->lidmap));
9199566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->dfill));
9209566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->ofill));
9219566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->materials));
92285d305f5SVijay Mahadevan     if (dmmoab->fieldNames) {
92348a46eb9SPierre Jolivet       for (i = 0; i < dmmoab->numFields; i++) PetscCall(PetscFree(dmmoab->fieldNames[i]));
9249566063dSJacob Faibussowitsch       PetscCall(PetscFree(dmmoab->fieldNames));
92585d305f5SVijay Mahadevan     }
926b117cd09SVijay Mahadevan 
927b117cd09SVijay Mahadevan     if (dmmoab->nhlevels) {
9289566063dSJacob Faibussowitsch       PetscCall(PetscFree(dmmoab->hsets));
929e882eb38SVijay Mahadevan       dmmoab->nhlevels = 0;
930e882eb38SVijay Mahadevan       if (!dmmoab->hlevel && dmmoab->icreatedinstance) delete dmmoab->hierarchy;
931e882eb38SVijay Mahadevan       dmmoab->hierarchy = NULL;
932b117cd09SVijay Mahadevan     }
933e882eb38SVijay Mahadevan 
934e882eb38SVijay Mahadevan     if (dmmoab->icreatedinstance) {
9359c368985SVijay Mahadevan       delete dmmoab->pcomm;
9369371c9d4SSatish Balay       merr = dmmoab->mbiface->delete_mesh();
9379371c9d4SSatish Balay       MBERRNM(merr);
938e882eb38SVijay Mahadevan       delete dmmoab->mbiface;
939e882eb38SVijay Mahadevan     }
940e882eb38SVijay Mahadevan     dmmoab->mbiface = NULL;
9419daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
942e882eb38SVijay Mahadevan     dmmoab->pcomm = NULL;
9439daf19fdSVijay Mahadevan #endif
9449566063dSJacob Faibussowitsch     PetscCall(VecScatterDestroy(&dmmoab->ltog_sendrecv));
9459566063dSJacob Faibussowitsch     PetscCall(ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map));
9469566063dSJacob Faibussowitsch     PetscCall(PetscFree(dm->data));
947304006b3SVijay Mahadevan   }
9483ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
949f6829af0SVijay Mahadevan }
950f6829af0SVijay Mahadevan 
DMSetFromOptions_Moab(DM dm,PetscOptionItems PetscOptionsObject)951ce78bad3SBarry Smith PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(DM dm, PetscOptionItems PetscOptionsObject)
952d71ae5a4SJacob Faibussowitsch {
9532e4e7c01SVijay Mahadevan   DM_Moab *dmmoab = (DM_Moab *)dm->data;
9542e4e7c01SVijay Mahadevan 
9552e4e7c01SVijay Mahadevan   PetscFunctionBegin;
956d0609cedSBarry Smith   PetscOptionsHeadBegin(PetscOptionsObject, "DMMoab Options");
9579566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBoundedInt("-dm_moab_rw_dbg", "The verbosity level for reading and writing MOAB meshes", "DMView", dmmoab->rw_dbglevel, &dmmoab->rw_dbglevel, NULL, 0));
9589566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-dm_moab_partiton_by_rank", "Use partition by rank when reading MOAB meshes from file", "DMView", dmmoab->partition_by_rank, &dmmoab->partition_by_rank, NULL));
9592e4e7c01SVijay Mahadevan   /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */
9609566063dSJacob Faibussowitsch   PetscCall(PetscOptionsString("-dm_moab_read_opts", "Extra options to enable MOAB reader to load DM from file", "DMView", dmmoab->extra_read_options, dmmoab->extra_read_options, sizeof(dmmoab->extra_read_options), NULL));
9619566063dSJacob Faibussowitsch   PetscCall(PetscOptionsString("-dm_moab_write_opts", "Extra options to enable MOAB writer to serialize DM to file", "DMView", dmmoab->extra_write_options, dmmoab->extra_write_options, sizeof(dmmoab->extra_write_options), NULL));
9629566063dSJacob Faibussowitsch   PetscCall(PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum *)&dmmoab->read_mode, NULL));
9639566063dSJacob Faibussowitsch   PetscCall(PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum *)&dmmoab->write_mode, NULL));
964d0609cedSBarry Smith   PetscOptionsHeadEnd();
9653ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9662e4e7c01SVijay Mahadevan }
9672e4e7c01SVijay Mahadevan 
DMSetUp_Moab(DM dm)968d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm)
969d71ae5a4SJacob Faibussowitsch {
970f6829af0SVijay Mahadevan   moab::ErrorCode       merr;
971f6829af0SVijay Mahadevan   Vec                   local, global;
972f6829af0SVijay Mahadevan   IS                    from, to;
973f6829af0SVijay Mahadevan   moab::Range::iterator iter;
974304006b3SVijay Mahadevan   PetscInt              i, j, f, bs, vent, totsize, *lgmap;
975f6829af0SVijay Mahadevan   DM_Moab              *dmmoab = (DM_Moab *)dm->data;
976f6829af0SVijay Mahadevan   moab::Range           adjs;
977f6829af0SVijay Mahadevan 
978f6829af0SVijay Mahadevan   PetscFunctionBegin;
979f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
980f6829af0SVijay Mahadevan   /* Get the local and shared vertices and cache it */
98108401ef6SPierre Jolivet   PetscCheck(dmmoab->mbiface != NULL, PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface before calling SetUp.");
9829daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
98308401ef6SPierre Jolivet   PetscCheck(dmmoab->pcomm != NULL, PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB ParallelComm object before calling SetUp.");
9849daf19fdSVijay Mahadevan #endif
985f6829af0SVijay Mahadevan 
986f6829af0SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
9879371c9d4SSatish Balay   if (dmmoab->vlocal->empty()) {
98849d66b22SVijay Mahadevan     //merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
9899371c9d4SSatish Balay     merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, 0, *dmmoab->vlocal, false);
9909371c9d4SSatish Balay     MBERRNM(merr);
991f6829af0SVijay Mahadevan 
9929daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
993f6829af0SVijay Mahadevan     /* filter based on parallel status */
9949371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned);
9959371c9d4SSatish Balay     MBERRNM(merr);
996f6829af0SVijay Mahadevan 
997f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
9989c368985SVijay Mahadevan     // *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
999f6829af0SVijay Mahadevan     adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
10009371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(adjs, PSTATUS_GHOST | PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost);
10019371c9d4SSatish Balay     MBERRNM(merr);
1002f6829af0SVijay Mahadevan     adjs            = moab::subtract(adjs, *dmmoab->vghost);
1003f6829af0SVijay Mahadevan     *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs);
10049daf19fdSVijay Mahadevan #else
10059daf19fdSVijay Mahadevan     *dmmoab->vowned = *dmmoab->vlocal;
10069daf19fdSVijay Mahadevan #endif
1007f6829af0SVijay Mahadevan 
1008f6829af0SVijay Mahadevan     /* compute and cache the sizes of local and ghosted entities */
1009f6829af0SVijay Mahadevan     dmmoab->nloc   = dmmoab->vowned->size();
1010f6829af0SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
101149d66b22SVijay Mahadevan 
10129daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1013462c564dSBarry Smith     PetscCallMPI(MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm));
10143ba16761SJacob Faibussowitsch     PetscCall(PetscInfo(NULL, "Filset ID: %lu, Vertices: local - %zu, owned - %" PetscInt_FMT ", ghosted - %" PetscInt_FMT ".\n", dmmoab->fileset, dmmoab->vlocal->size(), dmmoab->nloc, dmmoab->nghost));
10159daf19fdSVijay Mahadevan #else
10169daf19fdSVijay Mahadevan     dmmoab->n = dmmoab->nloc;
10179daf19fdSVijay Mahadevan #endif
1018f6829af0SVijay Mahadevan   }
1019f6829af0SVijay Mahadevan 
1020f6829af0SVijay Mahadevan   {
1021f6829af0SVijay Mahadevan     /* get the information about the local elements in the mesh */
1022f6829af0SVijay Mahadevan     dmmoab->eghost->clear();
1023f6829af0SVijay Mahadevan 
1024f6829af0SVijay Mahadevan     /* first decipher the leading dimension */
1025f6829af0SVijay Mahadevan     for (i = 3; i > 0; i--) {
1026f6829af0SVijay Mahadevan       dmmoab->elocal->clear();
10279371c9d4SSatish Balay       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, false);
10289371c9d4SSatish Balay       MBERRNM(merr);
1029f6829af0SVijay Mahadevan 
1030f6829af0SVijay Mahadevan       /* store the current mesh dimension */
1031f6829af0SVijay Mahadevan       if (dmmoab->elocal->size()) {
1032f6829af0SVijay Mahadevan         dmmoab->dim = i;
1033f6829af0SVijay Mahadevan         break;
1034f6829af0SVijay Mahadevan       }
1035f6829af0SVijay Mahadevan     }
1036f6829af0SVijay Mahadevan 
10379566063dSJacob Faibussowitsch     PetscCall(DMSetDimension(dm, dmmoab->dim));
1038b117cd09SVijay Mahadevan 
10399daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1040f6829af0SVijay Mahadevan     /* filter the ghosted and owned element list */
1041f6829af0SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
10429371c9d4SSatish Balay     merr            = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT);
10439371c9d4SSatish Balay     MBERRNM(merr);
1044f6829af0SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
10459daf19fdSVijay Mahadevan #endif
1046f6829af0SVijay Mahadevan 
1047f6829af0SVijay Mahadevan     dmmoab->neleloc   = dmmoab->elocal->size();
1048f6829af0SVijay Mahadevan     dmmoab->neleghost = dmmoab->eghost->size();
104949d66b22SVijay Mahadevan 
10509daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1051462c564dSBarry Smith     PetscCallMPI(MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm));
10523ba16761SJacob Faibussowitsch     PetscCall(PetscInfo(NULL, "%d-dim elements: owned - %" PetscInt_FMT ", ghosted - %" PetscInt_FMT ".\n", dmmoab->dim, dmmoab->neleloc, dmmoab->neleghost));
10539daf19fdSVijay Mahadevan #else
10549daf19fdSVijay Mahadevan     dmmoab->nele = dmmoab->neleloc;
10559daf19fdSVijay Mahadevan #endif
1056f6829af0SVijay Mahadevan   }
1057f6829af0SVijay Mahadevan 
1058f6829af0SVijay Mahadevan   bs = dmmoab->bs;
1059f6829af0SVijay Mahadevan   if (!dmmoab->ltog_tag) {
1060f6829af0SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
1061f6829af0SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
1062f6829af0SVijay Mahadevan        assemble the individual pieces of the mesh */
10639371c9d4SSatish Balay     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);
10649371c9d4SSatish Balay     MBERRNM(merr);
1065f6829af0SVijay Mahadevan   }
1066f6829af0SVijay Mahadevan 
1067f6829af0SVijay Mahadevan   totsize = dmmoab->vlocal->size();
10681dca8a05SBarry Smith   PetscCheck(totsize == dmmoab->nloc + dmmoab->nghost, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Mismatch between local and owned+ghost vertices. %" PetscInt_FMT " != %" PetscInt_FMT ".", totsize, dmmoab->nloc + dmmoab->nghost);
10699566063dSJacob Faibussowitsch   PetscCall(PetscCalloc1(totsize, &dmmoab->gsindices));
1070f6829af0SVijay Mahadevan   {
1071f6829af0SVijay Mahadevan     /* first get the local indices */
10729371c9d4SSatish Balay     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vowned, &dmmoab->gsindices[0]);
10739371c9d4SSatish Balay     MBERRNM(merr);
10743f1c6e43SVijay Mahadevan     if (dmmoab->nghost) { /* next get the ghosted indices */
10759371c9d4SSatish Balay       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vghost, &dmmoab->gsindices[dmmoab->nloc]);
10769371c9d4SSatish Balay       MBERRNM(merr);
1077f6829af0SVijay Mahadevan     }
1078f6829af0SVijay Mahadevan 
1079f6829af0SVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
1080304006b3SVijay Mahadevan     dmmoab->lminmax[0] = dmmoab->lminmax[1] = dmmoab->gsindices[0];
1081f6829af0SVijay Mahadevan     for (i = 0; i < totsize; ++i) {
1082304006b3SVijay Mahadevan       if (dmmoab->lminmax[0] > dmmoab->gsindices[i]) dmmoab->lminmax[0] = dmmoab->gsindices[i];
1083304006b3SVijay Mahadevan       if (dmmoab->lminmax[1] < dmmoab->gsindices[i]) dmmoab->lminmax[1] = dmmoab->gsindices[i];
1084f6829af0SVijay Mahadevan     }
1085f6829af0SVijay Mahadevan 
1086462c564dSBarry Smith     PetscCallMPI(MPIU_Allreduce(&dmmoab->lminmax[0], &dmmoab->gminmax[0], 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm));
1087462c564dSBarry Smith     PetscCallMPI(MPIU_Allreduce(&dmmoab->lminmax[1], &dmmoab->gminmax[1], 1, MPI_INT, MPI_MAX, ((PetscObject)dm)->comm));
1088f6829af0SVijay Mahadevan 
1089f6829af0SVijay Mahadevan     /* set the GID map */
1090*ac530a7eSPierre Jolivet     for (i = 0; i < totsize; ++i) dmmoab->gsindices[i] -= dmmoab->gminmax[0]; /* zero based index needed for IS */
1091304006b3SVijay Mahadevan     dmmoab->lminmax[0] -= dmmoab->gminmax[0];
1092304006b3SVijay Mahadevan     dmmoab->lminmax[1] -= dmmoab->gminmax[0];
1093f6829af0SVijay Mahadevan 
10943ba16761SJacob Faibussowitsch     PetscCall(PetscInfo(NULL, "GLOBAL_ID: Local [min, max] - [%" PetscInt_FMT ", %" PetscInt_FMT "], Global [min, max] - [%" PetscInt_FMT ", %" PetscInt_FMT "]\n", dmmoab->lminmax[0], dmmoab->lminmax[1], dmmoab->gminmax[0], dmmoab->gminmax[1]));
1095f6829af0SVijay Mahadevan   }
10969371c9d4SSatish Balay   PetscCheck(dmmoab->bs == dmmoab->numFields || dmmoab->bs == 1, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Mismatch between block size and number of component fields. %" PetscInt_FMT " != 1 OR %" PetscInt_FMT " != %" PetscInt_FMT ".", dmmoab->bs, dmmoab->bs,
10979371c9d4SSatish Balay              dmmoab->numFields);
1098f6829af0SVijay Mahadevan 
1099f6829af0SVijay Mahadevan   {
11009c368985SVijay Mahadevan     dmmoab->seqstart = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->front());
11019c368985SVijay Mahadevan     dmmoab->seqend   = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->back());
11023ba16761SJacob Faibussowitsch     PetscCall(PetscInfo(NULL, "SEQUENCE: Local [min, max] - [%" PetscInt_FMT ", %" PetscInt_FMT "]\n", dmmoab->seqstart, dmmoab->seqend));
11033f1c6e43SVijay Mahadevan 
11049566063dSJacob Faibussowitsch     PetscCall(PetscMalloc2(dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->gidmap, dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->lidmap));
11059566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(totsize * dmmoab->numFields, &lgmap));
1106f6829af0SVijay Mahadevan 
1107f6829af0SVijay Mahadevan     i = j = 0;
1108f6829af0SVijay Mahadevan     /* set the owned vertex data first */
1109f6829af0SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++, i++) {
1110e92d1c7cSVijay Mahadevan       vent                 = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart;
1111f6829af0SVijay Mahadevan       dmmoab->gidmap[vent] = dmmoab->gsindices[i];
1112f6829af0SVijay Mahadevan       dmmoab->lidmap[vent] = i;
1113ad540459SPierre Jolivet       for (f = 0; f < dmmoab->numFields; f++, j++) lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]);
1114f6829af0SVijay Mahadevan     }
1115f6829af0SVijay Mahadevan     /* next arrange all the ghosted data information */
1116f6829af0SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++, i++) {
1117e92d1c7cSVijay Mahadevan       vent                 = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart;
1118f6829af0SVijay Mahadevan       dmmoab->gidmap[vent] = dmmoab->gsindices[i];
1119f6829af0SVijay Mahadevan       dmmoab->lidmap[vent] = i;
1120ad540459SPierre Jolivet       for (f = 0; f < dmmoab->numFields; f++, j++) lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]);
1121f6829af0SVijay Mahadevan     }
1122f6829af0SVijay Mahadevan 
1123f6829af0SVijay Mahadevan     /* We need to create the Global to Local Vector Scatter Contexts
1124f6829af0SVijay Mahadevan        1) First create a local and global vector
1125f6829af0SVijay Mahadevan        2) Create a local and global IS
1126f6829af0SVijay Mahadevan        3) Create VecScatter and LtoGMapping objects
1127f6829af0SVijay Mahadevan        4) Cleanup the IS and Vec objects
1128f6829af0SVijay Mahadevan     */
11299566063dSJacob Faibussowitsch     PetscCall(DMCreateGlobalVector(dm, &global));
11309566063dSJacob Faibussowitsch     PetscCall(DMCreateLocalVector(dm, &local));
1131f6829af0SVijay Mahadevan 
11329566063dSJacob Faibussowitsch     PetscCall(VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend));
1133f6829af0SVijay Mahadevan 
1134f6829af0SVijay Mahadevan     /* global to local must retrieve ghost points */
11359566063dSJacob Faibussowitsch     PetscCall(ISCreateStride(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, dmmoab->vstart, 1, &from));
11369566063dSJacob Faibussowitsch     PetscCall(ISSetBlockSize(from, bs));
1137f6829af0SVijay Mahadevan 
11389566063dSJacob Faibussowitsch     PetscCall(ISCreateGeneral(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, &lgmap[0], PETSC_COPY_VALUES, &to));
11399566063dSJacob Faibussowitsch     PetscCall(ISSetBlockSize(to, bs));
1140f6829af0SVijay Mahadevan 
1141f6829af0SVijay Mahadevan     if (!dmmoab->ltog_map) {
1142f6829af0SVijay Mahadevan       /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */
11439566063dSJacob Faibussowitsch       PetscCall(ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm, dmmoab->bs, totsize * dmmoab->numFields, lgmap, PETSC_COPY_VALUES, &dmmoab->ltog_map));
1144f6829af0SVijay Mahadevan     }
1145f6829af0SVijay Mahadevan 
1146f6829af0SVijay Mahadevan     /* now create the scatter object from local to global vector */
11479566063dSJacob Faibussowitsch     PetscCall(VecScatterCreate(local, from, global, to, &dmmoab->ltog_sendrecv));
1148f6829af0SVijay Mahadevan 
1149f6829af0SVijay Mahadevan     /* clean up IS, Vec */
11509566063dSJacob Faibussowitsch     PetscCall(PetscFree(lgmap));
11519566063dSJacob Faibussowitsch     PetscCall(ISDestroy(&from));
11529566063dSJacob Faibussowitsch     PetscCall(ISDestroy(&to));
11539566063dSJacob Faibussowitsch     PetscCall(VecDestroy(&local));
11549566063dSJacob Faibussowitsch     PetscCall(VecDestroy(&global));
1155f6829af0SVijay Mahadevan   }
1156f6829af0SVijay Mahadevan 
115749d66b22SVijay Mahadevan   dmmoab->bndyvtx   = new moab::Range();
115849d66b22SVijay Mahadevan   dmmoab->bndyfaces = new moab::Range();
115949d66b22SVijay Mahadevan   dmmoab->bndyelems = new moab::Range();
1160f6829af0SVijay Mahadevan   /* skin the boundary and store nodes */
11619c368985SVijay Mahadevan   if (!dmmoab->hlevel) {
1162f6829af0SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
1163f6829af0SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
1164f6829af0SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
1165f6829af0SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
1166f6829af0SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
1167f6829af0SVijay Mahadevan 
1168f6829af0SVijay Mahadevan     /* get the entities on the skin - only the faces */
11699371c9d4SSatish Balay     merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, *dmmoab->bndyfaces, NULL, true, true, false);
11709371c9d4SSatish Balay     MBERRNM(merr); // 'false' param indicates we want faces back, not vertices
1171f6829af0SVijay Mahadevan 
11729daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1173f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
11749371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT);
11759371c9d4SSatish Balay     MBERRNM(merr);
11769371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_INTERFACE, PSTATUS_NOT);
11779371c9d4SSatish Balay     MBERRNM(merr);
11789daf19fdSVijay Mahadevan #endif
1179f6829af0SVijay Mahadevan 
1180f6829af0SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
11819371c9d4SSatish Balay     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);
11829371c9d4SSatish Balay     MBERRNM(merr);
11839371c9d4SSatish Balay     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyvtx, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);
11849371c9d4SSatish Balay     MBERRNM(merr);
11859371c9d4SSatish Balay   } else {
11869c368985SVijay Mahadevan     /* Let us query the hierarchy manager and get the results directly for this level */
11879c368985SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->elocal->begin(); iter != dmmoab->elocal->end(); iter++) {
11889c368985SVijay Mahadevan       moab::EntityHandle elemHandle = *iter;
11899c368985SVijay Mahadevan       if (dmmoab->hierarchy->is_entity_on_boundary(elemHandle)) {
11909c368985SVijay Mahadevan         dmmoab->bndyelems->insert(elemHandle);
11919c368985SVijay Mahadevan         /* For this boundary element, query the vertices and add them to the list */
11929c368985SVijay Mahadevan         std::vector<moab::EntityHandle> connect;
11939371c9d4SSatish Balay         merr = dmmoab->hierarchy->get_connectivity(elemHandle, dmmoab->hlevel, connect);
11949371c9d4SSatish Balay         MBERRNM(merr);
11959c368985SVijay Mahadevan         for (unsigned iv = 0; iv < connect.size(); ++iv)
11969371c9d4SSatish Balay           if (dmmoab->hierarchy->is_entity_on_boundary(connect[iv])) dmmoab->bndyvtx->insert(connect[iv]);
11979c368985SVijay Mahadevan         /* Next, let us query the boundary faces and add them also to the list */
11989c368985SVijay Mahadevan         std::vector<moab::EntityHandle> faces;
11999371c9d4SSatish Balay         merr = dmmoab->hierarchy->get_adjacencies(elemHandle, dmmoab->dim - 1, faces);
12009371c9d4SSatish Balay         MBERRNM(merr);
12019c368985SVijay Mahadevan         for (unsigned ifa = 0; ifa < faces.size(); ++ifa)
12029371c9d4SSatish Balay           if (dmmoab->hierarchy->is_entity_on_boundary(faces[ifa])) dmmoab->bndyfaces->insert(faces[ifa]);
12039c368985SVijay Mahadevan       }
12049c368985SVijay Mahadevan     }
12059c368985SVijay Mahadevan #ifdef MOAB_HAVE_MPI
12069c368985SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
12079371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyvtx, PSTATUS_NOT_OWNED, PSTATUS_NOT);
12089371c9d4SSatish Balay     MBERRNM(merr);
12099371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT);
12109371c9d4SSatish Balay     MBERRNM(merr);
12119371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyelems, PSTATUS_NOT_OWNED, PSTATUS_NOT);
12129371c9d4SSatish Balay     MBERRNM(merr);
12139c368985SVijay Mahadevan #endif
12149c368985SVijay Mahadevan   }
12153ba16761SJacob Faibussowitsch   PetscCall(PetscInfo(NULL, "Found %zu boundary vertices, %zu boundary faces and %zu boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyfaces->size(), dmmoab->bndyelems->size()));
1216a044f6b6SVijay Mahadevan 
1217a044f6b6SVijay Mahadevan   /* Get the material sets and populate the data for all locally owned elements */
1218a044f6b6SVijay Mahadevan   {
12199566063dSJacob Faibussowitsch     PetscCall(PetscCalloc1(dmmoab->elocal->size(), &dmmoab->materials));
1220a044f6b6SVijay Mahadevan     /* Get the count of entities of particular type from dmmoab->elocal
1221a044f6b6SVijay Mahadevan        -- Then, for each non-zero type, loop through and query the fileset to get the material tag data */
1222a044f6b6SVijay Mahadevan     moab::Range msets;
12239371c9d4SSatish Balay     merr = dmmoab->mbiface->get_entities_by_type_and_tag(dmmoab->fileset, moab::MBENTITYSET, &dmmoab->material_tag, NULL, 1, msets, moab::Interface::UNION);
12243ba16761SJacob Faibussowitsch     MBERRNM(merr);
12259d3446b2SPierre Jolivet     if (msets.size() == 0) PetscCall(PetscInfo(NULL, "No material sets found in the fileset.\n"));
1226a044f6b6SVijay Mahadevan 
1227a044f6b6SVijay Mahadevan     for (unsigned i = 0; i < msets.size(); ++i) {
1228a044f6b6SVijay Mahadevan       moab::Range msetelems;
12299371c9d4SSatish Balay       merr = dmmoab->mbiface->get_entities_by_dimension(msets[i], dmmoab->dim, msetelems, true);
12303ba16761SJacob Faibussowitsch       MBERRNM(merr);
1231aedf4482SVijay Mahadevan #ifdef MOAB_HAVE_MPI
1232aedf4482SVijay Mahadevan       /* filter all the non-owned and shared entities out of the list */
12339371c9d4SSatish Balay       merr = dmmoab->pcomm->filter_pstatus(msetelems, PSTATUS_NOT_OWNED, PSTATUS_NOT);
12349371c9d4SSatish Balay       MBERRNM(merr);
1235aedf4482SVijay Mahadevan #endif
1236a044f6b6SVijay Mahadevan 
1237a044f6b6SVijay Mahadevan       int                partID;
1238a044f6b6SVijay Mahadevan       moab::EntityHandle mset = msets[i];
12399371c9d4SSatish Balay       merr                    = dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &mset, 1, &partID);
12403ba16761SJacob Faibussowitsch       MBERRNM(merr);
1241a044f6b6SVijay Mahadevan 
12429371c9d4SSatish Balay       for (unsigned j = 0; j < msetelems.size(); ++j) dmmoab->materials[dmmoab->elocal->index(msetelems[j])] = partID;
1243a044f6b6SVijay Mahadevan     }
1244a044f6b6SVijay Mahadevan   }
12453ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1246f6829af0SVijay Mahadevan }
1247f6829af0SVijay Mahadevan 
1248cab5ea25SPierre Jolivet /*@C
1249304006b3SVijay Mahadevan   DMMoabCreateVertices - Creates and adds several vertices to the primary set represented by the DM.
1250304006b3SVijay Mahadevan 
1251d083f849SBarry Smith   Collective
1252304006b3SVijay Mahadevan 
1253304006b3SVijay Mahadevan   Input Parameters:
1254a4e35b19SJacob Faibussowitsch + dm     - The `DM` object
125560225df5SJacob Faibussowitsch . coords - The connectivity of the element
1256a2b725a8SWilliam Gropp - nverts - The number of vertices that form the element
1257304006b3SVijay Mahadevan 
1258304006b3SVijay Mahadevan   Output Parameter:
12590b207066SBarry Smith . overts - The list of vertices that were created (can be `NULL`)
1260304006b3SVijay Mahadevan 
1261304006b3SVijay Mahadevan   Level: beginner
1262304006b3SVijay Mahadevan 
12630b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabCreateSubmesh()`, `DMMoabCreateElement()`
1264304006b3SVijay Mahadevan @*/
DMMoabCreateVertices(DM dm,const PetscReal * coords,PetscInt nverts,moab::Range * overts)1265d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreateVertices(DM dm, const PetscReal *coords, PetscInt nverts, moab::Range *overts)
1266d71ae5a4SJacob Faibussowitsch {
1267304006b3SVijay Mahadevan   moab::ErrorCode merr;
1268304006b3SVijay Mahadevan   DM_Moab        *dmmoab;
1269304006b3SVijay Mahadevan   moab::Range     verts;
1270304006b3SVijay Mahadevan 
1271304006b3SVijay Mahadevan   PetscFunctionBegin;
1272304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
12734f572ea9SToby Isaac   PetscAssertPointer(coords, 2);
1274304006b3SVijay Mahadevan 
1275304006b3SVijay Mahadevan   dmmoab = (DM_Moab *)dm->data;
1276304006b3SVijay Mahadevan 
1277304006b3SVijay Mahadevan   /* Insert new points */
12789371c9d4SSatish Balay   merr = dmmoab->mbiface->create_vertices(&coords[0], nverts, verts);
12799371c9d4SSatish Balay   MBERRNM(merr);
12809371c9d4SSatish Balay   merr = dmmoab->mbiface->add_entities(dmmoab->fileset, verts);
12819371c9d4SSatish Balay   MBERRNM(merr);
1282304006b3SVijay Mahadevan 
1283304006b3SVijay Mahadevan   if (overts) *overts = verts;
12843ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1285304006b3SVijay Mahadevan }
1286304006b3SVijay Mahadevan 
1287cab5ea25SPierre Jolivet /*@C
1288304006b3SVijay Mahadevan   DMMoabCreateElement - Adds an element of specified type to the primary set represented by the DM.
1289304006b3SVijay Mahadevan 
1290d083f849SBarry Smith   Collective
1291304006b3SVijay Mahadevan 
1292304006b3SVijay Mahadevan   Input Parameters:
1293304006b3SVijay Mahadevan + dm     - The DM object
1294304006b3SVijay Mahadevan . type   - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra)
1295304006b3SVijay Mahadevan . conn   - The connectivity of the element
1296a2b725a8SWilliam Gropp - nverts - The number of vertices that form the element
1297304006b3SVijay Mahadevan 
1298304006b3SVijay Mahadevan   Output Parameter:
12990b207066SBarry Smith . oelem - The handle to the element created and added to the `DM` object
1300304006b3SVijay Mahadevan 
1301304006b3SVijay Mahadevan   Level: beginner
1302304006b3SVijay Mahadevan 
13030b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabCreateSubmesh()`, `DMMoabCreateVertices()`
1304304006b3SVijay Mahadevan @*/
DMMoabCreateElement(DM dm,const moab::EntityType type,const moab::EntityHandle * conn,PetscInt nverts,moab::EntityHandle * oelem)1305d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreateElement(DM dm, const moab::EntityType type, const moab::EntityHandle *conn, PetscInt nverts, moab::EntityHandle *oelem)
1306d71ae5a4SJacob Faibussowitsch {
1307304006b3SVijay Mahadevan   moab::ErrorCode    merr;
1308304006b3SVijay Mahadevan   DM_Moab           *dmmoab;
1309304006b3SVijay Mahadevan   moab::EntityHandle elem;
1310304006b3SVijay Mahadevan 
1311304006b3SVijay Mahadevan   PetscFunctionBegin;
1312304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
13134f572ea9SToby Isaac   PetscAssertPointer(conn, 3);
1314304006b3SVijay Mahadevan 
1315304006b3SVijay Mahadevan   dmmoab = (DM_Moab *)dm->data;
1316304006b3SVijay Mahadevan 
1317304006b3SVijay Mahadevan   /* Insert new element */
13189371c9d4SSatish Balay   merr = dmmoab->mbiface->create_element(type, conn, nverts, elem);
13199371c9d4SSatish Balay   MBERRNM(merr);
13209371c9d4SSatish Balay   merr = dmmoab->mbiface->add_entities(dmmoab->fileset, &elem, 1);
13219371c9d4SSatish Balay   MBERRNM(merr);
1322304006b3SVijay Mahadevan 
1323304006b3SVijay Mahadevan   if (oelem) *oelem = elem;
13243ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1325304006b3SVijay Mahadevan }
1326304006b3SVijay Mahadevan 
1327cab5ea25SPierre Jolivet /*@C
13280b207066SBarry Smith   DMMoabCreateSubmesh - Creates a sub-`DM` object with a set that contains all vertices/elements of the parent
1329304006b3SVijay Mahadevan   in addition to providing support for dynamic mesh modifications. This is useful for AMR calculations to
1330304006b3SVijay Mahadevan   create a DM object on a refined level.
1331304006b3SVijay Mahadevan 
1332d083f849SBarry Smith   Collective
1333304006b3SVijay Mahadevan 
1334304006b3SVijay Mahadevan   Input Parameters:
13350b207066SBarry Smith . dm - The `DM` object
1336304006b3SVijay Mahadevan 
1337304006b3SVijay Mahadevan   Output Parameter:
13380b207066SBarry Smith . newdm - The sub `DM` object with updated set information
1339304006b3SVijay Mahadevan 
1340304006b3SVijay Mahadevan   Level: advanced
1341304006b3SVijay Mahadevan 
13420b207066SBarry Smith .seealso: `DMMOAB`, `DMCreate()`, `DMMoabCreateVertices()`, `DMMoabCreateElement()`
1343304006b3SVijay Mahadevan @*/
DMMoabCreateSubmesh(DM dm,DM * newdm)1344d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreateSubmesh(DM dm, DM *newdm)
1345d71ae5a4SJacob Faibussowitsch {
1346304006b3SVijay Mahadevan   DM_Moab        *dmmoab;
1347304006b3SVijay Mahadevan   DM_Moab        *ndmmoab;
1348304006b3SVijay Mahadevan   moab::ErrorCode merr;
1349304006b3SVijay Mahadevan 
1350304006b3SVijay Mahadevan   PetscFunctionBegin;
1351304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1352304006b3SVijay Mahadevan 
1353304006b3SVijay Mahadevan   dmmoab = (DM_Moab *)dm->data;
1354304006b3SVijay Mahadevan 
13550b207066SBarry Smith   /* Create the basic DMMOAB object and keep the default parameters created by DM impls */
1356f3fa974cSJacob Faibussowitsch   PetscCall(DMMoabCreateMoab(((PetscObject)dm)->comm, dmmoab->mbiface, &dmmoab->ltog_tag, NULL, newdm));
1357304006b3SVijay Mahadevan 
1358304006b3SVijay Mahadevan   /* get all the necessary handles from the private DM object */
1359304006b3SVijay Mahadevan   ndmmoab = (DM_Moab *)(*newdm)->data;
1360304006b3SVijay Mahadevan 
1361304006b3SVijay Mahadevan   /* set the sub-mesh's parent DM reference */
1362304006b3SVijay Mahadevan   ndmmoab->parent = &dm;
1363304006b3SVijay Mahadevan 
1364304006b3SVijay Mahadevan   /* create a file set to associate all entities in current mesh */
13659371c9d4SSatish Balay   merr = ndmmoab->mbiface->create_meshset(moab::MESHSET_SET, ndmmoab->fileset);
13669371c9d4SSatish Balay   MBERR("Creating file set failed", merr);
1367304006b3SVijay Mahadevan 
1368304006b3SVijay Mahadevan   /* create a meshset and then add old fileset as child */
13699371c9d4SSatish Balay   merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->vlocal);
13709371c9d4SSatish Balay   MBERR("Adding child vertices to parent failed", merr);
13719371c9d4SSatish Balay   merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->elocal);
13729371c9d4SSatish Balay   MBERR("Adding child elements to parent failed", merr);
1373304006b3SVijay Mahadevan 
1374304006b3SVijay Mahadevan   /* preserve the field association between the parent and sub-mesh objects */
13759566063dSJacob Faibussowitsch   PetscCall(DMMoabSetFieldNames(*newdm, dmmoab->numFields, dmmoab->fieldNames));
13763ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1377304006b3SVijay Mahadevan }
1378304006b3SVijay Mahadevan 
DMMoabView_Ascii(DM dm,PetscViewer viewer)1379d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMMoabView_Ascii(DM dm, PetscViewer viewer)
1380d71ae5a4SJacob Faibussowitsch {
138157508eceSPierre Jolivet   DM_Moab    *dmmoab = (DM_Moab *)dm->data;
1382304006b3SVijay Mahadevan   const char *name;
1383304006b3SVijay Mahadevan   MPI_Comm    comm;
1384304006b3SVijay Mahadevan   PetscMPIInt size;
1385304006b3SVijay Mahadevan 
1386304006b3SVijay Mahadevan   PetscFunctionBegin;
13879566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)dm, &comm));
13889566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm, &size));
13899566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetName((PetscObject)dm, &name));
13909566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushTab(viewer));
139163a3b9bcSJacob Faibussowitsch   if (name) PetscCall(PetscViewerASCIIPrintf(viewer, "%s in %" PetscInt_FMT " dimensions:\n", name, dmmoab->dim));
139263a3b9bcSJacob Faibussowitsch   else PetscCall(PetscViewerASCIIPrintf(viewer, "Mesh in %" PetscInt_FMT " dimensions:\n", dmmoab->dim));
1393304006b3SVijay Mahadevan   /* print details about the global mesh */
1394304006b3SVijay Mahadevan   {
13959566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushTab(viewer));
139663a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Sizes: cells=%" PetscInt_FMT ", vertices=%" PetscInt_FMT ", blocks=%" PetscInt_FMT "\n", dmmoab->nele, dmmoab->n, dmmoab->bs));
1397304006b3SVijay Mahadevan     /* print boundary data */
139863a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Boundary trace:\n"));
1399304006b3SVijay Mahadevan     {
14009566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(viewer));
140163a3b9bcSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(viewer, "cells=%zu, faces=%zu, vertices=%zu\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size()));
14029566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(viewer));
1403304006b3SVijay Mahadevan     }
1404304006b3SVijay Mahadevan     /* print field data */
140563a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Fields: %" PetscInt_FMT " components\n", dmmoab->numFields));
1406304006b3SVijay Mahadevan     {
14079566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(viewer));
140848a46eb9SPierre Jolivet       for (int i = 0; i < dmmoab->numFields; ++i) PetscCall(PetscViewerASCIIPrintf(viewer, "[%" PetscInt_FMT "] - %s\n", i, dmmoab->fieldNames[i]));
14099566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(viewer));
1410304006b3SVijay Mahadevan     }
14119566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopTab(viewer));
1412304006b3SVijay Mahadevan   }
14139566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopTab(viewer));
14149566063dSJacob Faibussowitsch   PetscCall(PetscViewerFlush(viewer));
14153ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1416304006b3SVijay Mahadevan }
1417304006b3SVijay Mahadevan 
DMMoabView_VTK(DM dm,PetscViewer v)1418d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMMoabView_VTK(DM dm, PetscViewer v)
1419d71ae5a4SJacob Faibussowitsch {
14203ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1421304006b3SVijay Mahadevan }
1422304006b3SVijay Mahadevan 
DMMoabView_HDF5(DM dm,PetscViewer v)1423d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMMoabView_HDF5(DM dm, PetscViewer v)
1424d71ae5a4SJacob Faibussowitsch {
14253ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1426304006b3SVijay Mahadevan }
1427304006b3SVijay Mahadevan 
DMView_Moab(DM dm,PetscViewer viewer)1428d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMView_Moab(DM dm, PetscViewer viewer)
1429d71ae5a4SJacob Faibussowitsch {
14309f196a02SMartin Diehl   PetscBool isascii, ishdf5, isvtk;
1431304006b3SVijay Mahadevan 
1432304006b3SVijay Mahadevan   PetscFunctionBegin;
1433304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1434304006b3SVijay Mahadevan   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
14359f196a02SMartin Diehl   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
14369566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERVTK, &isvtk));
14379566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERHDF5, &ishdf5));
14389f196a02SMartin Diehl   if (isascii) {
14399566063dSJacob Faibussowitsch     PetscCall(DMMoabView_Ascii(dm, viewer));
1440304006b3SVijay Mahadevan   } else if (ishdf5) {
1441304006b3SVijay Mahadevan #if defined(PETSC_HAVE_HDF5) && defined(MOAB_HAVE_HDF5)
14429566063dSJacob Faibussowitsch     PetscCall(PetscViewerPushFormat(viewer, PETSC_VIEWER_HDF5_VIZ));
14439566063dSJacob Faibussowitsch     PetscCall(DMMoabView_HDF5(dm, viewer));
14449566063dSJacob Faibussowitsch     PetscCall(PetscViewerPopFormat(viewer));
1445304006b3SVijay Mahadevan #else
1446304006b3SVijay Mahadevan     SETERRQ(PetscObjectComm((PetscObject)dm), PETSC_ERR_SUP, "HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5");
1447304006b3SVijay Mahadevan #endif
14483a7d0413SPierre Jolivet   } else if (isvtk) PetscCall(DMMoabView_VTK(dm, viewer));
14493ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1450304006b3SVijay Mahadevan }
1451304006b3SVijay Mahadevan 
DMInitialize_Moab(DM dm)1452d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMInitialize_Moab(DM dm)
1453d71ae5a4SJacob Faibussowitsch {
1454304006b3SVijay Mahadevan   PetscFunctionBegin;
1455304006b3SVijay Mahadevan   dm->ops->view                     = DMView_Moab;
1456304006b3SVijay Mahadevan   dm->ops->load                     = NULL /* DMLoad_Moab */;
1457304006b3SVijay Mahadevan   dm->ops->setfromoptions           = DMSetFromOptions_Moab;
1458304006b3SVijay Mahadevan   dm->ops->clone                    = DMClone_Moab;
1459304006b3SVijay Mahadevan   dm->ops->setup                    = DMSetUp_Moab;
14601bb6d2a8SBarry Smith   dm->ops->createlocalsection       = NULL;
1461adc21957SMatthew G. Knepley   dm->ops->createsectionpermutation = NULL;
1462304006b3SVijay Mahadevan   dm->ops->createdefaultconstraints = NULL;
1463304006b3SVijay Mahadevan   dm->ops->createglobalvector       = DMCreateGlobalVector_Moab;
1464304006b3SVijay Mahadevan   dm->ops->createlocalvector        = DMCreateLocalVector_Moab;
1465304006b3SVijay Mahadevan   dm->ops->getlocaltoglobalmapping  = NULL;
1466304006b3SVijay Mahadevan   dm->ops->createfieldis            = NULL;
1467304006b3SVijay Mahadevan   dm->ops->createcoordinatedm       = NULL /* DMCreateCoordinateDM_Moab */;
146899acd26cSksagiyam   dm->ops->createcellcoordinatedm   = NULL;
1469304006b3SVijay Mahadevan   dm->ops->getcoloring              = NULL;
1470304006b3SVijay Mahadevan   dm->ops->creatematrix             = DMCreateMatrix_Moab;
1471304006b3SVijay Mahadevan   dm->ops->createinterpolation      = DMCreateInterpolation_Moab;
14725a84ad33SLisandro Dalcin   dm->ops->createinjection          = NULL /* DMCreateInjection_Moab */;
1473304006b3SVijay Mahadevan   dm->ops->refine                   = DMRefine_Moab;
1474304006b3SVijay Mahadevan   dm->ops->coarsen                  = DMCoarsen_Moab;
1475304006b3SVijay Mahadevan   dm->ops->refinehierarchy          = DMRefineHierarchy_Moab;
1476304006b3SVijay Mahadevan   dm->ops->coarsenhierarchy         = DMCoarsenHierarchy_Moab;
1477304006b3SVijay Mahadevan   dm->ops->globaltolocalbegin       = DMGlobalToLocalBegin_Moab;
1478304006b3SVijay Mahadevan   dm->ops->globaltolocalend         = DMGlobalToLocalEnd_Moab;
1479304006b3SVijay Mahadevan   dm->ops->localtoglobalbegin       = DMLocalToGlobalBegin_Moab;
1480304006b3SVijay Mahadevan   dm->ops->localtoglobalend         = DMLocalToGlobalEnd_Moab;
1481304006b3SVijay Mahadevan   dm->ops->destroy                  = DMDestroy_Moab;
1482304006b3SVijay Mahadevan   dm->ops->createsubdm              = NULL /* DMCreateSubDM_Moab */;
1483304006b3SVijay Mahadevan   dm->ops->getdimpoints             = NULL /* DMGetDimPoints_Moab */;
1484304006b3SVijay Mahadevan   dm->ops->locatepoints             = NULL /* DMLocatePoints_Moab */;
14853ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1486304006b3SVijay Mahadevan }
1487304006b3SVijay Mahadevan 
DMClone_Moab(DM dm,DM * newdm)1488d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm)
1489d71ae5a4SJacob Faibussowitsch {
1490304006b3SVijay Mahadevan   PetscFunctionBegin;
1491304006b3SVijay Mahadevan   /* get all the necessary handles from the private DM object */
1492304006b3SVijay Mahadevan   (*newdm)->data = (DM_Moab *)dm->data;
1493304006b3SVijay Mahadevan   ((DM_Moab *)dm->data)->refct++;
1494304006b3SVijay Mahadevan 
14959566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)*newdm, DMMOAB));
14969566063dSJacob Faibussowitsch   PetscCall(DMInitialize_Moab(*newdm));
14973ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1498304006b3SVijay Mahadevan }
1499304006b3SVijay Mahadevan 
DMCreate_Moab(DM dm)1500d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
1501d71ae5a4SJacob Faibussowitsch {
1502f6829af0SVijay Mahadevan   PetscFunctionBegin;
1503f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
15044dfa11a4SJacob Faibussowitsch   PetscCall(PetscNew((DM_Moab **)&dm->data));
1505f6829af0SVijay Mahadevan 
1506f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->bs            = 1;
1507f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->numFields     = 1;
1508f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->n             = 0;
1509f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->nloc          = 0;
1510f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->nghost        = 0;
1511f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->nele          = 0;
1512f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->neleloc       = 0;
1513f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->neleghost     = 0;
1514c528d872SBarry Smith   ((DM_Moab *)dm->data)->ltog_map      = NULL;
1515c528d872SBarry Smith   ((DM_Moab *)dm->data)->ltog_sendrecv = NULL;
1516f6829af0SVijay Mahadevan 
1517304006b3SVijay Mahadevan   ((DM_Moab *)dm->data)->refct  = 1;
1518304006b3SVijay Mahadevan   ((DM_Moab *)dm->data)->parent = NULL;
1519f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->vlocal = new moab::Range();
1520f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->vowned = new moab::Range();
1521f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->vghost = new moab::Range();
1522f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->elocal = new moab::Range();
1523f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->eghost = new moab::Range();
1524f6829af0SVijay Mahadevan 
15259566063dSJacob Faibussowitsch   PetscCall(DMInitialize_Moab(dm));
15263ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1527f6829af0SVijay Mahadevan }
1528