xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 0b207066d2d3a3addec4fb94db8892f79805fcda)
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
9*0b207066SBarry Smith   DMMOAB = "moab" - A `DM` object that encapsulates an unstructured mesh described by the MOAB mesh database.
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 
19*0b207066SBarry Smith   Reference:
20*0b207066SBarry Smith . * - https://www.mcs.anl.gov/~fathom/moab-docs/html/contents.html
21*0b207066SBarry Smith 
22*0b207066SBarry Smith .seealso: `DMMOAB`, `DMType`, `DMMoabCreate()`, `DMCreate()`, `DMSetType()`, `DMMoabCreateMoab()`
23c6ef30f9SVijay Mahadevan M*/
24c6ef30f9SVijay Mahadevan 
25304006b3SVijay Mahadevan /* External function declarations here */
26304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInterpolation_Moab(DM dmCoarse, DM dmFine, Mat *interpolation, Vec *scaling);
27304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateDefaultConstraints_Moab(DM dm);
28304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm, Mat *J);
29304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateCoordinateDM_Moab(DM dm, DM *cdm);
30304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefine_Moab(DM dm, MPI_Comm comm, DM *dmRefined);
31304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsen_Moab(DM dm, MPI_Comm comm, DM *dmCoarsened);
32304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefineHierarchy_Moab(DM dm, PetscInt nlevels, DM dmRefined[]);
33304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsenHierarchy_Moab(DM dm, PetscInt nlevels, DM dmCoarsened[]);
34304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm);
35304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateGlobalVector_Moab(DM, Vec *);
36304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateLocalVector_Moab(DM, Vec *);
37304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm, Mat *J);
38304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalBegin_Moab(DM, Vec, InsertMode, Vec);
39304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalEnd_Moab(DM, Vec, InsertMode, Vec);
40304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalBegin_Moab(DM, Vec, InsertMode, Vec);
41304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalEnd_Moab(DM, Vec, InsertMode, Vec);
42304006b3SVijay Mahadevan 
43304006b3SVijay Mahadevan /* Un-implemented routines */
44304006b3SVijay Mahadevan /*
451bb6d2a8SBarry Smith PETSC_EXTERN PetscErrorCode DMCreatelocalsection_Moab(DM dm);
46304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInjection_Moab(DM dmCoarse, DM dmFine, Mat *mat);
47304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLoad_Moab(DM dm, PetscViewer viewer);
48304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGetDimPoints_Moab(DM dm, PetscInt dim, PetscInt *pStart, PetscInt *pEnd);
49304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateSubDM_Moab(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm);
50304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocatePoints_Moab(DM dm, Vec v, IS *cellIS);
51304006b3SVijay Mahadevan */
52c6ef30f9SVijay Mahadevan 
53cab5ea25SPierre Jolivet /*@C
54*0b207066SBarry Smith   DMMoabCreate - Creates a `DMMOAB` object, which encapsulates a moab instance
551d72bce8STim Tautges 
56d083f849SBarry Smith   Collective
571d72bce8STim Tautges 
581d72bce8STim Tautges   Input Parameter:
59*0b207066SBarry Smith . comm - The communicator for the `DMMOAB` object
601d72bce8STim Tautges 
611d72bce8STim Tautges   Output Parameter:
62*0b207066SBarry Smith . dmb - The `DMMOAB` object
631d72bce8STim Tautges 
641d72bce8STim Tautges   Level: beginner
651d72bce8STim Tautges 
66*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabCreateMoab()`
671d72bce8STim Tautges @*/
68d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
69d71ae5a4SJacob Faibussowitsch {
701d72bce8STim Tautges   PetscFunctionBegin;
714f572ea9SToby Isaac   PetscAssertPointer(dmb, 2);
729566063dSJacob Faibussowitsch   PetscCall(DMCreate(comm, dmb));
739566063dSJacob Faibussowitsch   PetscCall(DMSetType(*dmb, DMMOAB));
743ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
751d72bce8STim Tautges }
761d72bce8STim Tautges 
77cab5ea25SPierre Jolivet /*@C
78*0b207066SBarry Smith   DMMoabCreateMoab - Creates a `DMMOAB` object, optionally from an instance and other data
791d72bce8STim Tautges 
80d083f849SBarry Smith   Collective
811d72bce8STim Tautges 
82d8d19677SJose E. Roman   Input Parameters:
83*0b207066SBarry Smith + comm     - The communicator for the `DMMOAB` object
84*0b207066SBarry Smith . mbiface  - (ptr to) the `DMMOAB` Instance; if passed in `NULL`, MOAB instance is created inside PETSc, and destroyed
85*0b207066SBarry Smith          along with the `DMMOAB`
861d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
87*0b207066SBarry Smith - range    - If non-`NULL`, contains range of entities to which DOFs will be assigned
881d72bce8STim Tautges 
891d72bce8STim Tautges   Output Parameter:
90*0b207066SBarry Smith . dmb - The `DMMOAB` object
911d72bce8STim Tautges 
92032b8ab6SVijay Mahadevan   Level: intermediate
931d72bce8STim Tautges 
94*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabCreate()`
951d72bce8STim Tautges @*/
96d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
97d71ae5a4SJacob Faibussowitsch {
98032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
9985d305f5SVijay Mahadevan   DM              dmmb;
100853cdec3SJed Brown   DM_Moab        *dmmoab;
1011d72bce8STim Tautges 
1021d72bce8STim Tautges   PetscFunctionBegin;
1034f572ea9SToby Isaac   PetscAssertPointer(dmb, 6);
10485d305f5SVijay Mahadevan 
1059566063dSJacob Faibussowitsch   PetscCall(DMMoabCreate(comm, &dmmb));
10685d305f5SVijay Mahadevan   dmmoab = (DM_Moab *)(dmmb)->data;
107a4d2169cSTim Tautges 
108a4d2169cSTim Tautges   if (!mbiface) {
10972ff976dSVijay Mahadevan     dmmoab->mbiface          = new moab::Core();
1107d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
1119371c9d4SSatish Balay   } else {
1121cec0304SVijay Mahadevan     dmmoab->mbiface          = mbiface;
1137d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
1141cec0304SVijay Mahadevan   }
1151cec0304SVijay Mahadevan 
116b5410836SVijay Mahadevan   /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */
117b5410836SVijay Mahadevan   dmmoab->fileset     = 0;
118b117cd09SVijay Mahadevan   dmmoab->hlevel      = 0;
11949d66b22SVijay Mahadevan   dmmoab->nghostrings = 0;
1207d89fc02STim Tautges 
1219daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1229daf19fdSVijay Mahadevan   moab::EntityHandle partnset;
123032b8ab6SVijay Mahadevan 
124db66d124SVijay Mahadevan   /* Create root sets for each mesh.  Then pass these
125db66d124SVijay Mahadevan       to the load_file functions to be populated. */
1269371c9d4SSatish Balay   merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);
1279371c9d4SSatish Balay   MBERR("Creating partition set failed", merr);
128032b8ab6SVijay Mahadevan 
129db66d124SVijay Mahadevan   /* Create the parallel communicator object with the partition handle associated with MOAB */
13072ff976dSVijay Mahadevan   dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
1319daf19fdSVijay Mahadevan #endif
132032b8ab6SVijay Mahadevan 
1334973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
1344973de03SVijay Mahadevan   dmmoab->bs        = 1;
135addae81cSVijay Mahadevan   dmmoab->numFields = 1;
1369566063dSJacob Faibussowitsch   PetscCall(PetscMalloc(dmmoab->numFields * sizeof(char *), &dmmoab->fieldNames));
1379566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy("DEFAULT", (char **)&dmmoab->fieldNames[0]));
1382e4e7c01SVijay Mahadevan   dmmoab->rw_dbglevel            = 0;
1392e4e7c01SVijay Mahadevan   dmmoab->partition_by_rank      = PETSC_FALSE;
1402e4e7c01SVijay Mahadevan   dmmoab->extra_read_options[0]  = '\0';
1412e4e7c01SVijay Mahadevan   dmmoab->extra_write_options[0] = '\0';
1422e4e7c01SVijay Mahadevan   dmmoab->read_mode              = READ_PART;
1432e4e7c01SVijay Mahadevan   dmmoab->write_mode             = WRITE_PART;
1444973de03SVijay Mahadevan 
1454973de03SVijay Mahadevan   /* set global ID tag handle */
1461a845d2aSVijay Mahadevan   if (ltog_tag && *ltog_tag) {
1479566063dSJacob Faibussowitsch     PetscCall(DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag));
1489371c9d4SSatish Balay   } else {
1499371c9d4SSatish Balay     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);
1509371c9d4SSatish Balay     MBERRNM(merr);
1511a845d2aSVijay Mahadevan     if (ltog_tag) *ltog_tag = dmmoab->ltog_tag;
152a4d2169cSTim Tautges   }
153a4d2169cSTim Tautges 
1549371c9d4SSatish Balay   merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag);
1559371c9d4SSatish Balay   MBERRNM(merr);
156340f3b9aSVijay Mahadevan 
1574973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
15848a46eb9SPierre Jolivet   if (range) PetscCall(DMMoabSetLocalVertices(dmmb, range));
15985d305f5SVijay Mahadevan   *dmb = dmmb;
1603ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1611d72bce8STim Tautges }
1621d72bce8STim Tautges 
1639daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1641d72bce8STim Tautges 
165cab5ea25SPierre Jolivet /*@C
166*0b207066SBarry Smith   DMMoabGetParallelComm - Get the ParallelComm used with this `DMMOAB`
167aa768e4cSTim Tautges 
168d083f849SBarry Smith   Collective
169aa768e4cSTim Tautges 
170aa768e4cSTim Tautges   Input Parameter:
171*0b207066SBarry Smith . dm    - The `DMMOAB` object being set
172aa768e4cSTim Tautges 
173aa768e4cSTim Tautges   Output Parameter:
174*0b207066SBarry Smith . pcomm - The ParallelComm for the `DMMOAB`
175aa768e4cSTim Tautges 
176aa768e4cSTim Tautges   Level: beginner
177aa768e4cSTim Tautges 
178*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabSetInterface()`
179aa768e4cSTim Tautges @*/
180d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetParallelComm(DM dm, moab::ParallelComm **pcomm)
181d71ae5a4SJacob Faibussowitsch {
1821d72bce8STim Tautges   PetscFunctionBegin;
1831d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
184032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab *)(dm)->data)->pcomm;
1853ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1861d72bce8STim Tautges }
1871d72bce8STim Tautges 
1889daf19fdSVijay Mahadevan #endif /* MOAB_HAVE_MPI */
1899daf19fdSVijay Mahadevan 
190cab5ea25SPierre Jolivet /*@C
191*0b207066SBarry Smith   DMMoabSetInterface - Set the MOAB instance used with this `DMMOAB`
192aa768e4cSTim Tautges 
193d083f849SBarry Smith   Collective
194aa768e4cSTim Tautges 
195d8d19677SJose E. Roman   Input Parameters:
196*0b207066SBarry Smith + dm      - The `DMMOAB` object being set
197*0b207066SBarry Smith - mbiface - The MOAB instance being set on this `DMMOAB`
198aa768e4cSTim Tautges 
199aa768e4cSTim Tautges   Level: beginner
200aa768e4cSTim Tautges 
201*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetInterface()`
202aa768e4cSTim Tautges @*/
203d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetInterface(DM dm, moab::Interface *mbiface)
204d71ae5a4SJacob Faibussowitsch {
205032b8ab6SVijay Mahadevan   DM_Moab *dmmoab = (DM_Moab *)(dm)->data;
206032b8ab6SVijay Mahadevan 
2071d72bce8STim Tautges   PetscFunctionBegin;
2081d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2094f572ea9SToby Isaac   PetscAssertPointer(mbiface, 2);
2109daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
211032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
2129daf19fdSVijay Mahadevan #endif
213032b8ab6SVijay Mahadevan   dmmoab->mbiface          = mbiface;
214032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
2153ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2161d72bce8STim Tautges }
2171d72bce8STim Tautges 
218cab5ea25SPierre Jolivet /*@C
219*0b207066SBarry Smith   DMMoabGetInterface - Get the MOAB instance used with this `DMMOAB`
220aa768e4cSTim Tautges 
221d083f849SBarry Smith   Collective
222aa768e4cSTim Tautges 
223aa768e4cSTim Tautges   Input Parameter:
224*0b207066SBarry Smith . dm - The `DMMOAB` object being set
225aa768e4cSTim Tautges 
226aa768e4cSTim Tautges   Output Parameter:
227*0b207066SBarry Smith . mbiface - The MOAB instance set on this `DMMOAB`
228aa768e4cSTim Tautges 
229aa768e4cSTim Tautges   Level: beginner
230aa768e4cSTim Tautges 
231*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabSetInterface()`
232aa768e4cSTim Tautges @*/
233d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetInterface(DM dm, moab::Interface **mbiface)
234d71ae5a4SJacob Faibussowitsch {
235cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
236cabb514dSBarry Smith 
2371d72bce8STim Tautges   PetscFunctionBegin;
2381d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2399371c9d4SSatish 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, "
2409371c9d4SSatish Balay                                    "K. and Stimpson, C. and Ernst, C.},\n  year = {2004},  note = {Report}\n}\n",
2419371c9d4SSatish Balay                                    &cite));
242a4d2169cSTim Tautges   *mbiface = ((DM_Moab *)dm->data)->mbiface;
2433ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2441d72bce8STim Tautges }
2451d72bce8STim Tautges 
246cab5ea25SPierre Jolivet /*@C
247*0b207066SBarry Smith   DMMoabSetLocalVertices - Set the entities having DOFs on this `DMMOAB`
248aa768e4cSTim Tautges 
249d083f849SBarry Smith   Collective
250aa768e4cSTim Tautges 
251d8d19677SJose E. Roman   Input Parameters:
252*0b207066SBarry Smith + dm    - The `DMMOAB` object being set
253*0b207066SBarry Smith - range - The entities treated by this `DMMOAB`
254aa768e4cSTim Tautges 
255aa768e4cSTim Tautges   Level: beginner
256aa768e4cSTim Tautges 
257*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetAllVertices()`
258aa768e4cSTim Tautges @*/
259d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetLocalVertices(DM dm, moab::Range *range)
260d71ae5a4SJacob Faibussowitsch {
261fd3326ddSVijay Mahadevan   moab::Range tmpvtxs;
262032b8ab6SVijay Mahadevan   DM_Moab    *dmmoab = (DM_Moab *)(dm)->data;
263032b8ab6SVijay Mahadevan 
2641d72bce8STim Tautges   PetscFunctionBegin;
2651d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
266032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
267032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
268fd3326ddSVijay Mahadevan 
269032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
270fd3326ddSVijay Mahadevan 
2719daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
2729daf19fdSVijay Mahadevan   moab::ErrorCode merr;
273fd3326ddSVijay Mahadevan   /* filter based on parallel status */
2749371c9d4SSatish Balay   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned);
2759371c9d4SSatish Balay   MBERRNM(merr);
276fd3326ddSVijay Mahadevan 
277fd3326ddSVijay Mahadevan   /* filter all the non-owned and shared entities out of the list */
278fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
2799371c9d4SSatish Balay   merr    = dmmoab->pcomm->filter_pstatus(tmpvtxs, PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost);
2809371c9d4SSatish Balay   MBERRNM(merr);
281fd3326ddSVijay Mahadevan   tmpvtxs         = moab::subtract(tmpvtxs, *dmmoab->vghost);
282fd3326ddSVijay Mahadevan   *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs);
2839daf19fdSVijay Mahadevan #else
2849daf19fdSVijay Mahadevan   *dmmoab->vowned = *dmmoab->vlocal;
2859daf19fdSVijay Mahadevan #endif
286fd3326ddSVijay Mahadevan 
287fd3326ddSVijay Mahadevan   /* compute and cache the sizes of local and ghosted entities */
288032b8ab6SVijay Mahadevan   dmmoab->nloc   = dmmoab->vowned->size();
289032b8ab6SVijay Mahadevan   dmmoab->nghost = dmmoab->vghost->size();
2909daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
2911c2dc1cbSBarry Smith   PetscCall(MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm));
2929daf19fdSVijay Mahadevan #else
2939daf19fdSVijay Mahadevan   dmmoab->n       = dmmoab->nloc;
2949daf19fdSVijay Mahadevan #endif
2953ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2961d72bce8STim Tautges }
2971d72bce8STim Tautges 
298cab5ea25SPierre Jolivet /*@C
299*0b207066SBarry Smith   DMMoabGetAllVertices - Get the entities having DOFs on this `DMMOAB`
3008d8d51c8SVijay Mahadevan 
301d083f849SBarry Smith   Collective
3028d8d51c8SVijay Mahadevan 
3038d8d51c8SVijay Mahadevan   Input Parameter:
304*0b207066SBarry Smith . dm - The `DMMOAB` object being set
3058d8d51c8SVijay Mahadevan 
3068d8d51c8SVijay Mahadevan   Output Parameter:
307*0b207066SBarry Smith . local - The local vertex entities in this `DMMOAB` = (owned+ghosted)
3088d8d51c8SVijay Mahadevan 
3098d8d51c8SVijay Mahadevan   Level: beginner
3108d8d51c8SVijay Mahadevan 
311*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetLocalVertices()`
3128d8d51c8SVijay Mahadevan @*/
313d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetAllVertices(DM dm, moab::Range *local)
314d71ae5a4SJacob Faibussowitsch {
3158d8d51c8SVijay Mahadevan   PetscFunctionBegin;
3168d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
3178d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab *)dm->data)->vlocal;
3183ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3198d8d51c8SVijay Mahadevan }
3208d8d51c8SVijay Mahadevan 
321cab5ea25SPierre Jolivet /*@C
322*0b207066SBarry Smith   DMMoabGetLocalVertices - Get the entities having DOFs on this `DMMOAB`
323aa768e4cSTim Tautges 
324d083f849SBarry Smith   Collective
325aa768e4cSTim Tautges 
326aa768e4cSTim Tautges   Input Parameter:
327*0b207066SBarry Smith . dm - The `DMMOAB` object being set
328aa768e4cSTim Tautges 
329a2b725a8SWilliam Gropp   Output Parameters:
330*0b207066SBarry Smith + owned - The owned vertex entities in this `DMMOAB`
331a2b725a8SWilliam Gropp - ghost - The ghosted entities (non-owned) stored locally in this partition
332aa768e4cSTim Tautges 
333aa768e4cSTim Tautges   Level: beginner
334aa768e4cSTim Tautges 
335*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetAllVertices()`
336aa768e4cSTim Tautges @*/
337d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetLocalVertices(DM dm, const moab::Range **owned, const moab::Range **ghost)
338d71ae5a4SJacob Faibussowitsch {
3391d72bce8STim Tautges   PetscFunctionBegin;
3401d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
341351b8a77SVijay Mahadevan   if (owned) *owned = ((DM_Moab *)dm->data)->vowned;
342351b8a77SVijay Mahadevan   if (ghost) *ghost = ((DM_Moab *)dm->data)->vghost;
3433ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3441d72bce8STim Tautges }
3451d72bce8STim Tautges 
346cab5ea25SPierre Jolivet /*@C
3475eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
3485eb88e9dSVijay Mahadevan 
349d083f849SBarry Smith   Collective
3505eb88e9dSVijay Mahadevan 
3515eb88e9dSVijay Mahadevan   Input Parameter:
352*0b207066SBarry Smith . dm - The `DMMOAB` object being set
3535eb88e9dSVijay Mahadevan 
3545eb88e9dSVijay Mahadevan   Output Parameter:
3555eb88e9dSVijay Mahadevan . range - The entities owned locally
3565eb88e9dSVijay Mahadevan 
3575eb88e9dSVijay Mahadevan   Level: beginner
3585eb88e9dSVijay Mahadevan 
359*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabSetLocalElements()`
3605eb88e9dSVijay Mahadevan @*/
361d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetLocalElements(DM dm, const moab::Range **range)
362d71ae5a4SJacob Faibussowitsch {
3635eb88e9dSVijay Mahadevan   PetscFunctionBegin;
3645eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
365351b8a77SVijay Mahadevan   if (range) *range = ((DM_Moab *)dm->data)->elocal;
3663ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3671cec0304SVijay Mahadevan }
3681cec0304SVijay Mahadevan 
369cab5ea25SPierre Jolivet /*@C
370*0b207066SBarry Smith   DMMoabSetLocalElements - Set the entities having DOFs on this `DMMOAB`
3711cec0304SVijay Mahadevan 
372d083f849SBarry Smith   Collective
3731cec0304SVijay Mahadevan 
374a2b725a8SWilliam Gropp   Input Parameters:
375*0b207066SBarry Smith + dm    - The `DMMOAB` object being set
376*0b207066SBarry Smith - range - The entities treated by this `DMMOAB`
3771cec0304SVijay Mahadevan 
3781cec0304SVijay Mahadevan   Level: beginner
3791cec0304SVijay Mahadevan 
380*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetLocalElements()`
3811cec0304SVijay Mahadevan @*/
382d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetLocalElements(DM dm, moab::Range *range)
383d71ae5a4SJacob Faibussowitsch {
3841cec0304SVijay Mahadevan   DM_Moab *dmmoab = (DM_Moab *)(dm)->data;
3851cec0304SVijay Mahadevan 
3861cec0304SVijay Mahadevan   PetscFunctionBegin;
3871cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
3881cec0304SVijay Mahadevan   dmmoab->elocal->clear();
3891cec0304SVijay Mahadevan   dmmoab->eghost->clear();
3901cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
3919daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
3929daf19fdSVijay Mahadevan   moab::ErrorCode merr;
3939371c9d4SSatish Balay   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT);
3949371c9d4SSatish Balay   MBERRNM(merr);
3951cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
3969daf19fdSVijay Mahadevan #endif
3971cec0304SVijay Mahadevan   dmmoab->neleloc   = dmmoab->elocal->size();
39841dd5348SVijay Mahadevan   dmmoab->neleghost = dmmoab->eghost->size();
3999daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
4001c2dc1cbSBarry Smith   PetscCall(MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm));
4013ba16761SJacob Faibussowitsch   PetscCall(PetscInfo(dm, "Created %" PetscInt_FMT " local and %" PetscInt_FMT " global elements.\n", dmmoab->neleloc, dmmoab->nele));
4029daf19fdSVijay Mahadevan #else
4039daf19fdSVijay Mahadevan   dmmoab->nele    = dmmoab->neleloc;
4049daf19fdSVijay Mahadevan #endif
4053ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4065eb88e9dSVijay Mahadevan }
4075eb88e9dSVijay Mahadevan 
408cab5ea25SPierre Jolivet /*@C
409aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
410aa768e4cSTim Tautges 
411d083f849SBarry Smith   Collective
412aa768e4cSTim Tautges 
413a2b725a8SWilliam Gropp   Input Parameters:
414*0b207066SBarry Smith + dm      - The `DMMOAB` object being set
415*0b207066SBarry Smith - ltogtag - The `DMMOAB` tag used for local to global ids
416aa768e4cSTim Tautges 
417aa768e4cSTim Tautges   Level: beginner
418aa768e4cSTim Tautges 
419*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetLocalToGlobalTag()`
420aa768e4cSTim Tautges @*/
421d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm, moab::Tag ltogtag)
422d71ae5a4SJacob Faibussowitsch {
4231d72bce8STim Tautges   PetscFunctionBegin;
4241d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4251d72bce8STim Tautges   ((DM_Moab *)dm->data)->ltog_tag = ltogtag;
4263ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4271d72bce8STim Tautges }
4281d72bce8STim Tautges 
429cab5ea25SPierre Jolivet /*@C
430aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
431aa768e4cSTim Tautges 
432d083f849SBarry Smith   Collective
433aa768e4cSTim Tautges 
434aa768e4cSTim Tautges   Input Parameter:
435*0b207066SBarry Smith . dm - The `DMMOAB` object being set
436aa768e4cSTim Tautges 
437aa768e4cSTim Tautges   Output Parameter:
43860225df5SJacob Faibussowitsch . ltog_tag - The MOAB tag used for local to global ids
439aa768e4cSTim Tautges 
440aa768e4cSTim Tautges   Level: beginner
441aa768e4cSTim Tautges 
442*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabSetLocalToGlobalTag()`
443aa768e4cSTim Tautges @*/
444d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm, moab::Tag *ltog_tag)
445d71ae5a4SJacob Faibussowitsch {
4461d72bce8STim Tautges   PetscFunctionBegin;
4471d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4481d72bce8STim Tautges   *ltog_tag = ((DM_Moab *)dm->data)->ltog_tag;
4493ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4501d72bce8STim Tautges }
4511d72bce8STim Tautges 
452cab5ea25SPierre Jolivet /*@C
453*0b207066SBarry Smith   DMMoabSetBlockSize - Set the block size used with this `DMMOAB`
454aa768e4cSTim Tautges 
455d083f849SBarry Smith   Collective
456aa768e4cSTim Tautges 
457d8d19677SJose E. Roman   Input Parameters:
458*0b207066SBarry Smith + dm - The `DMMOAB` object being set
459*0b207066SBarry Smith - bs - The block size used with this `DMMOAB`
460aa768e4cSTim Tautges 
461aa768e4cSTim Tautges   Level: beginner
462aa768e4cSTim Tautges 
463*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetBlockSize()`
464aa768e4cSTim Tautges @*/
465d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetBlockSize(DM dm, PetscInt bs)
466d71ae5a4SJacob Faibussowitsch {
4671d72bce8STim Tautges   PetscFunctionBegin;
4681d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4691d72bce8STim Tautges   ((DM_Moab *)dm->data)->bs = bs;
4703ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4711d72bce8STim Tautges }
4721d72bce8STim Tautges 
473cab5ea25SPierre Jolivet /*@C
474*0b207066SBarry Smith   DMMoabGetBlockSize - Get the block size used with this `DMMOAB`
475aa768e4cSTim Tautges 
476d083f849SBarry Smith   Collective
477aa768e4cSTim Tautges 
478aa768e4cSTim Tautges   Input Parameter:
479*0b207066SBarry Smith . dm - The `DMMOAB` object being set
480aa768e4cSTim Tautges 
481aa768e4cSTim Tautges   Output Parameter:
482*0b207066SBarry Smith . bs - The block size used with this `DMMOAB`
483aa768e4cSTim Tautges 
484aa768e4cSTim Tautges   Level: beginner
485aa768e4cSTim Tautges 
486*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabSetBlockSize()`
487aa768e4cSTim Tautges @*/
488d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetBlockSize(DM dm, PetscInt *bs)
489d71ae5a4SJacob Faibussowitsch {
4901d72bce8STim Tautges   PetscFunctionBegin;
4911d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4921d72bce8STim Tautges   *bs = ((DM_Moab *)dm->data)->bs;
4933ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4941d72bce8STim Tautges }
4951d72bce8STim Tautges 
496cab5ea25SPierre Jolivet /*@C
497*0b207066SBarry Smith   DMMoabGetSize - Get the global vertex size used with this `DMMOAB`
498212ad6d1SVijay Mahadevan 
499*0b207066SBarry Smith   Collective
500212ad6d1SVijay Mahadevan 
501212ad6d1SVijay Mahadevan   Input Parameter:
502*0b207066SBarry Smith . dm - The `DMMOAB` object being set
503212ad6d1SVijay Mahadevan 
504d8d19677SJose E. Roman   Output Parameters:
505*0b207066SBarry Smith + neg - The number of global elements in the `DMMOAB` instance
506*0b207066SBarry Smith - nvg - The number of global vertices in the `DMMOAB` instance
507212ad6d1SVijay Mahadevan 
508212ad6d1SVijay Mahadevan   Level: beginner
509212ad6d1SVijay Mahadevan 
510*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetLocalSize()`
511212ad6d1SVijay Mahadevan @*/
512d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetSize(DM dm, PetscInt *neg, PetscInt *nvg)
513d71ae5a4SJacob Faibussowitsch {
514212ad6d1SVijay Mahadevan   PetscFunctionBegin;
515212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
51641dd5348SVijay Mahadevan   if (neg) *neg = ((DM_Moab *)dm->data)->nele;
51741dd5348SVijay Mahadevan   if (nvg) *nvg = ((DM_Moab *)dm->data)->n;
5183ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
519212ad6d1SVijay Mahadevan }
520212ad6d1SVijay Mahadevan 
521cab5ea25SPierre Jolivet /*@C
522*0b207066SBarry Smith   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this `DMMOAB`
523212ad6d1SVijay Mahadevan 
524*0b207066SBarry Smith   Collective
525212ad6d1SVijay Mahadevan 
526212ad6d1SVijay Mahadevan   Input Parameter:
527*0b207066SBarry Smith . dm - The `DMMOAB` object being set
528212ad6d1SVijay Mahadevan 
529d8d19677SJose E. Roman   Output Parameters:
530b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor
53100cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor
53200cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor
533a2b725a8SWilliam Gropp - nvg - The number of ghosted vertices in this processor
534212ad6d1SVijay Mahadevan 
535212ad6d1SVijay Mahadevan   Level: beginner
536212ad6d1SVijay Mahadevan 
537*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetSize()`
538212ad6d1SVijay Mahadevan @*/
539d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetLocalSize(DM dm, PetscInt *nel, PetscInt *neg, PetscInt *nvl, PetscInt *nvg)
540d71ae5a4SJacob Faibussowitsch {
541212ad6d1SVijay Mahadevan   PetscFunctionBegin;
542212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
54341dd5348SVijay Mahadevan   if (nel) *nel = ((DM_Moab *)dm->data)->neleloc;
54441dd5348SVijay Mahadevan   if (neg) *neg = ((DM_Moab *)dm->data)->neleghost;
54541dd5348SVijay Mahadevan   if (nvl) *nvl = ((DM_Moab *)dm->data)->nloc;
54641dd5348SVijay Mahadevan   if (nvg) *nvg = ((DM_Moab *)dm->data)->nghost;
5473ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
548212ad6d1SVijay Mahadevan }
549212ad6d1SVijay Mahadevan 
550cab5ea25SPierre Jolivet /*@C
55100cc10feSVijay Mahadevan   DMMoabGetOffset - Get the local offset for the global vector
55200cc10feSVijay Mahadevan 
553d083f849SBarry Smith   Collective
55400cc10feSVijay Mahadevan 
55500cc10feSVijay Mahadevan   Input Parameter:
556*0b207066SBarry Smith . dm - The `DMMOAB` object being set
55700cc10feSVijay Mahadevan 
55800cc10feSVijay Mahadevan   Output Parameter:
55900cc10feSVijay Mahadevan . offset - The local offset for the global vector
56000cc10feSVijay Mahadevan 
56100cc10feSVijay Mahadevan   Level: beginner
56200cc10feSVijay Mahadevan 
563*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetDimension()`
56400cc10feSVijay Mahadevan @*/
565d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetOffset(DM dm, PetscInt *offset)
566d71ae5a4SJacob Faibussowitsch {
56700cc10feSVijay Mahadevan   PetscFunctionBegin;
56800cc10feSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
56900cc10feSVijay Mahadevan   *offset = ((DM_Moab *)dm->data)->vstart;
5703ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
57100cc10feSVijay Mahadevan }
57200cc10feSVijay Mahadevan 
573cab5ea25SPierre Jolivet /*@C
574*0b207066SBarry Smith   DMMoabGetDimension - Get the dimension of the `DM` Mesh
5754920ab11SVijay Mahadevan 
576d083f849SBarry Smith   Collective
5774920ab11SVijay Mahadevan 
5784920ab11SVijay Mahadevan   Input Parameter:
579*0b207066SBarry Smith . dm - The `DMMOAB` object
5804920ab11SVijay Mahadevan 
5814920ab11SVijay Mahadevan   Output Parameter:
582*0b207066SBarry Smith . dim - The dimension of `DM`
5834920ab11SVijay Mahadevan 
5844920ab11SVijay Mahadevan   Level: beginner
5854920ab11SVijay Mahadevan 
586*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetOffset()`
5874920ab11SVijay Mahadevan @*/
588d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetDimension(DM dm, PetscInt *dim)
589d71ae5a4SJacob Faibussowitsch {
5904920ab11SVijay Mahadevan   PetscFunctionBegin;
5914920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
5924920ab11SVijay Mahadevan   *dim = ((DM_Moab *)dm->data)->dim;
5933ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5944920ab11SVijay Mahadevan }
5954920ab11SVijay Mahadevan 
596cab5ea25SPierre Jolivet /*@C
597755f3dfbSVijay Mahadevan   DMMoabGetHierarchyLevel - Get the current level of the mesh hierarchy
598755f3dfbSVijay Mahadevan   generated through uniform refinement.
599755f3dfbSVijay Mahadevan 
600*0b207066SBarry Smith   Collective
601755f3dfbSVijay Mahadevan 
602755f3dfbSVijay Mahadevan   Input Parameter:
603*0b207066SBarry Smith . dm - The `DMMOAB` object being set
604755f3dfbSVijay Mahadevan 
605755f3dfbSVijay Mahadevan   Output Parameter:
60660225df5SJacob Faibussowitsch . nlevel - The current mesh hierarchy level
607755f3dfbSVijay Mahadevan 
608755f3dfbSVijay Mahadevan   Level: beginner
609755f3dfbSVijay Mahadevan 
610*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetMaterialBlock()`
611755f3dfbSVijay Mahadevan @*/
612d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetHierarchyLevel(DM dm, PetscInt *nlevel)
613d71ae5a4SJacob Faibussowitsch {
614755f3dfbSVijay Mahadevan   PetscFunctionBegin;
615755f3dfbSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
616755f3dfbSVijay Mahadevan   if (nlevel) *nlevel = ((DM_Moab *)dm->data)->hlevel;
6173ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
618755f3dfbSVijay Mahadevan }
619755f3dfbSVijay Mahadevan 
620cab5ea25SPierre Jolivet /*@C
621340f3b9aSVijay Mahadevan   DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh
622340f3b9aSVijay Mahadevan 
623d083f849SBarry Smith   Collective
624340f3b9aSVijay Mahadevan 
625d8d19677SJose E. Roman   Input Parameters:
626*0b207066SBarry Smith + dm      - The `DMMOAB` object
627a2b725a8SWilliam Gropp - ehandle - The element entity handle
628340f3b9aSVijay Mahadevan 
629340f3b9aSVijay Mahadevan   Output Parameter:
630340f3b9aSVijay Mahadevan . mat - The material ID for the current entity
631340f3b9aSVijay Mahadevan 
632340f3b9aSVijay Mahadevan   Level: beginner
633340f3b9aSVijay Mahadevan 
634*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetHierarchyLevel()`
635340f3b9aSVijay Mahadevan @*/
636d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetMaterialBlock(DM dm, const moab::EntityHandle ehandle, PetscInt *mat)
637d71ae5a4SJacob Faibussowitsch {
638340f3b9aSVijay Mahadevan   DM_Moab *dmmoab;
639340f3b9aSVijay Mahadevan 
640340f3b9aSVijay Mahadevan   PetscFunctionBegin;
641340f3b9aSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
642340f3b9aSVijay Mahadevan   if (*mat) {
643340f3b9aSVijay Mahadevan     dmmoab = (DM_Moab *)(dm)->data;
644a044f6b6SVijay Mahadevan     *mat   = dmmoab->materials[dmmoab->elocal->index(ehandle)];
645340f3b9aSVijay Mahadevan   }
6463ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
647340f3b9aSVijay Mahadevan }
648340f3b9aSVijay Mahadevan 
649cab5ea25SPierre Jolivet /*@C
65085d305f5SVijay Mahadevan   DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities
65185d305f5SVijay Mahadevan 
652d083f849SBarry Smith   Collective
65385d305f5SVijay Mahadevan 
654d8d19677SJose E. Roman   Input Parameters:
655*0b207066SBarry Smith + dm    - The `DMMOAB` object
65685d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
657a2b725a8SWilliam Gropp - conn  - The vertex entity handles
65885d305f5SVijay Mahadevan 
65985d305f5SVijay Mahadevan   Output Parameter:
66085d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities
66185d305f5SVijay Mahadevan 
66285d305f5SVijay Mahadevan   Level: beginner
66385d305f5SVijay Mahadevan 
664*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetVertexConnectivity()`
66585d305f5SVijay Mahadevan @*/
666d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetVertexCoordinates(DM dm, PetscInt nconn, const moab::EntityHandle *conn, PetscReal *vpos)
667d71ae5a4SJacob Faibussowitsch {
6687023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
6697023aa44SVijay Mahadevan   moab::ErrorCode merr;
6707023aa44SVijay Mahadevan 
6717023aa44SVijay Mahadevan   PetscFunctionBegin;
6727023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
6734f572ea9SToby Isaac   PetscAssertPointer(conn, 3);
6744f572ea9SToby Isaac   PetscAssertPointer(vpos, 4);
6757023aa44SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
6767023aa44SVijay Mahadevan 
6777023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
6789c368985SVijay Mahadevan   if (dmmoab->hlevel) {
6799371c9d4SSatish Balay     merr = dmmoab->hierarchy->get_coordinates(const_cast<moab::EntityHandle *>(conn), nconn, dmmoab->hlevel, vpos);
6809371c9d4SSatish Balay     MBERRNM(merr);
6819371c9d4SSatish Balay   } else {
6829371c9d4SSatish Balay     merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);
6839371c9d4SSatish Balay     MBERRNM(merr);
6849c368985SVijay Mahadevan   }
6853ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6867023aa44SVijay Mahadevan }
6877023aa44SVijay Mahadevan 
688cab5ea25SPierre Jolivet /*@C
68985d305f5SVijay Mahadevan   DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity
69085d305f5SVijay Mahadevan 
691d083f849SBarry Smith   Collective
69285d305f5SVijay Mahadevan 
693d8d19677SJose E. Roman   Input Parameters:
694*0b207066SBarry Smith + dm      - The `DMMOAB` object
695a2b725a8SWilliam Gropp - vhandle - Vertex entity handle
69685d305f5SVijay Mahadevan 
697d8d19677SJose E. Roman   Output Parameters:
698a2b725a8SWilliam Gropp + nconn - Number of entities whose coordinates are needed
699a2b725a8SWilliam Gropp - conn  - The vertex entity handles
70085d305f5SVijay Mahadevan 
70185d305f5SVijay Mahadevan   Level: beginner
70285d305f5SVijay Mahadevan 
703*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetVertexCoordinates()`, `DMMoabRestoreVertexConnectivity()`
70485d305f5SVijay Mahadevan @*/
705d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetVertexConnectivity(DM dm, moab::EntityHandle vhandle, PetscInt *nconn, moab::EntityHandle **conn)
706d71ae5a4SJacob Faibussowitsch {
7078d8d51c8SVijay Mahadevan   DM_Moab                        *dmmoab;
7088d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities, connect;
7098d8d51c8SVijay Mahadevan   moab::ErrorCode                 merr;
7108d8d51c8SVijay Mahadevan 
7118d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7128d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
7134f572ea9SToby Isaac   PetscAssertPointer(conn, 4);
7148d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
7158d8d51c8SVijay Mahadevan 
7168d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
7179371c9d4SSatish Balay   merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION);
7189371c9d4SSatish Balay   MBERRNM(merr);
7199371c9d4SSatish Balay   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0], adj_entities.size(), connect);
7209371c9d4SSatish Balay   MBERRNM(merr);
7218d8d51c8SVijay Mahadevan 
7228d8d51c8SVijay Mahadevan   if (conn) {
7239566063dSJacob Faibussowitsch     PetscCall(PetscMalloc(sizeof(moab::EntityHandle) * connect.size(), conn));
7249566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(*conn, &connect[0], connect.size()));
7258d8d51c8SVijay Mahadevan   }
7268d8d51c8SVijay Mahadevan   if (nconn) *nconn = connect.size();
7273ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7288d8d51c8SVijay Mahadevan }
7298d8d51c8SVijay Mahadevan 
730cab5ea25SPierre Jolivet /*@C
73185d305f5SVijay Mahadevan   DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity
73285d305f5SVijay Mahadevan 
733d083f849SBarry Smith   Collective
73485d305f5SVijay Mahadevan 
735d8d19677SJose E. Roman   Input Parameters:
736*0b207066SBarry Smith + dm      - The `DMMOAB` object
73760225df5SJacob Faibussowitsch . ehandle - Vertex entity handle
73885d305f5SVijay Mahadevan . nconn   - Number of entities whose coordinates are needed
739a2b725a8SWilliam Gropp - conn    - The vertex entity handles
74085d305f5SVijay Mahadevan 
74185d305f5SVijay Mahadevan   Level: beginner
74285d305f5SVijay Mahadevan 
743*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetVertexCoordinates()`, `DMMoabGetVertexConnectivity()`
74485d305f5SVijay Mahadevan @*/
745d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt *nconn, moab::EntityHandle **conn)
746d71ae5a4SJacob Faibussowitsch {
7478d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7488d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
7494f572ea9SToby Isaac   PetscAssertPointer(conn, 4);
7508d8d51c8SVijay Mahadevan 
75148a46eb9SPierre Jolivet   if (conn) PetscCall(PetscFree(*conn));
7528d8d51c8SVijay Mahadevan   if (nconn) *nconn = 0;
7533ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7548d8d51c8SVijay Mahadevan }
7558d8d51c8SVijay Mahadevan 
756cab5ea25SPierre Jolivet /*@C
75785d305f5SVijay Mahadevan   DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity
75885d305f5SVijay Mahadevan 
759d083f849SBarry Smith   Collective
76085d305f5SVijay Mahadevan 
761d8d19677SJose E. Roman   Input Parameters:
762*0b207066SBarry Smith + dm      - The `DMMOAB` object
763a2b725a8SWilliam Gropp - ehandle - Vertex entity handle
76485d305f5SVijay Mahadevan 
765d8d19677SJose E. Roman   Output Parameters:
766a2b725a8SWilliam Gropp + nconn - Number of entities whose coordinates are needed
767a2b725a8SWilliam Gropp - conn  - The vertex entity handles
76885d305f5SVijay Mahadevan 
76985d305f5SVijay Mahadevan   Level: beginner
77085d305f5SVijay Mahadevan 
771*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetVertexCoordinates()`, `DMMoabGetVertexConnectivity()`, `DMMoabRestoreVertexConnectivity()`
77285d305f5SVijay Mahadevan @*/
773d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetElementConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt *nconn, const moab::EntityHandle **conn)
774d71ae5a4SJacob Faibussowitsch {
7757023aa44SVijay Mahadevan   DM_Moab                        *dmmoab;
7767023aa44SVijay Mahadevan   const moab::EntityHandle       *connect;
7779c368985SVijay Mahadevan   std::vector<moab::EntityHandle> vconn;
7787023aa44SVijay Mahadevan   moab::ErrorCode                 merr;
7797023aa44SVijay Mahadevan   PetscInt                        nnodes;
7807023aa44SVijay Mahadevan 
7817023aa44SVijay Mahadevan   PetscFunctionBegin;
7827023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
7834f572ea9SToby Isaac   PetscAssertPointer(conn, 4);
7847023aa44SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
7857023aa44SVijay Mahadevan 
7867023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
7879371c9d4SSatish Balay   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);
7889371c9d4SSatish Balay   MBERRNM(merr);
7897023aa44SVijay Mahadevan   if (conn) *conn = connect;
7907023aa44SVijay Mahadevan   if (nconn) *nconn = nnodes;
7913ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7927023aa44SVijay Mahadevan }
7937023aa44SVijay Mahadevan 
794cab5ea25SPierre Jolivet /*@C
79585d305f5SVijay Mahadevan   DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element)
79685d305f5SVijay Mahadevan 
797d083f849SBarry Smith   Collective
79885d305f5SVijay Mahadevan 
799d8d19677SJose E. Roman   Input Parameters:
800*0b207066SBarry Smith + dm  - The `DMMOAB` object
801a2b725a8SWilliam Gropp - ent - Entity handle
80285d305f5SVijay Mahadevan 
80385d305f5SVijay Mahadevan   Output Parameter:
804*0b207066SBarry Smith . ent_on_boundary - `PETSC_TRUE` if entity on boundary; `PETSC_FALSE` otherwise
80585d305f5SVijay Mahadevan 
80685d305f5SVijay Mahadevan   Level: beginner
80785d305f5SVijay Mahadevan 
808*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabCheckBoundaryVertices()`
80985d305f5SVijay Mahadevan @*/
810d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabIsEntityOnBoundary(DM dm, const moab::EntityHandle ent, PetscBool *ent_on_boundary)
811d71ae5a4SJacob Faibussowitsch {
81269263071SVijay Mahadevan   moab::EntityType etype;
81369263071SVijay Mahadevan   DM_Moab         *dmmoab;
81469263071SVijay Mahadevan   PetscInt         edim;
81569263071SVijay Mahadevan 
81669263071SVijay Mahadevan   PetscFunctionBegin;
81769263071SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
8184f572ea9SToby Isaac   PetscAssertPointer(ent_on_boundary, 3);
81969263071SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
82069263071SVijay Mahadevan 
82169263071SVijay Mahadevan   /* get the entity type and handle accordingly */
82269263071SVijay Mahadevan   etype = dmmoab->mbiface->type_from_handle(ent);
8231dca8a05SBarry Smith   PetscCheck(etype < moab::MBPOLYHEDRON, PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Entity type on the boundary skin is invalid. EntityType = %" PetscInt_FMT, etype);
82469263071SVijay Mahadevan 
82569263071SVijay Mahadevan   /* get the entity dimension */
82669263071SVijay Mahadevan   edim = dmmoab->mbiface->dimension_from_handle(ent);
82769263071SVijay Mahadevan 
82869263071SVijay Mahadevan   *ent_on_boundary = PETSC_FALSE;
82969263071SVijay Mahadevan   if (etype == moab::MBVERTEX && edim == 0) {
83049d66b22SVijay Mahadevan     *ent_on_boundary = ((dmmoab->bndyvtx->index(ent) >= 0) ? PETSC_TRUE : PETSC_FALSE);
8319371c9d4SSatish Balay   } else {
83269263071SVijay Mahadevan     if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */
8336d9eb265SVijay Mahadevan       if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE;
8349371c9d4SSatish Balay     } else { /* next check the lower-dimensional faces */
8356d9eb265SVijay Mahadevan       if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE;
83669263071SVijay Mahadevan     }
83769263071SVijay Mahadevan   }
8383ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
83969263071SVijay Mahadevan }
84069263071SVijay Mahadevan 
841cab5ea25SPierre Jolivet /*@C
8424597dd3dSJose E. Roman   DMMoabCheckBoundaryVertices - Check whether a given entity is on the boundary (vertex, edge, face, element)
84385d305f5SVijay Mahadevan 
84497bb3fdcSJose E. Roman   Input Parameters:
845*0b207066SBarry Smith + dm    - The `DMMOAB` object
84685d305f5SVijay Mahadevan . nconn - Number of handles
847a2b725a8SWilliam Gropp - cnt   - Array of entity handles
84885d305f5SVijay Mahadevan 
84985d305f5SVijay Mahadevan   Output Parameter:
850*0b207066SBarry Smith . isbdvtx - Array of boundary markers - `PETSC_TRUE` if entity on boundary; `PETSC_FALSE` otherwise
85185d305f5SVijay Mahadevan 
85285d305f5SVijay Mahadevan   Level: beginner
85385d305f5SVijay Mahadevan 
854*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabIsEntityOnBoundary()`
85585d305f5SVijay Mahadevan @*/
856d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCheckBoundaryVertices(DM dm, PetscInt nconn, const moab::EntityHandle *cnt, PetscBool *isbdvtx)
857d71ae5a4SJacob Faibussowitsch {
8587023aa44SVijay Mahadevan   DM_Moab *dmmoab;
8597023aa44SVijay Mahadevan   PetscInt i;
8607023aa44SVijay Mahadevan 
8617023aa44SVijay Mahadevan   PetscFunctionBegin;
8627023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
8634f572ea9SToby Isaac   PetscAssertPointer(cnt, 3);
8644f572ea9SToby Isaac   PetscAssertPointer(isbdvtx, 4);
8657023aa44SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
8667023aa44SVijay Mahadevan 
867ad540459SPierre Jolivet   for (i = 0; i < nconn; ++i) isbdvtx[i] = (dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE : PETSC_FALSE);
8683ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8697023aa44SVijay Mahadevan }
8707023aa44SVijay Mahadevan 
871cab5ea25SPierre Jolivet /*@C
87285d305f5SVijay Mahadevan   DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary
87385d305f5SVijay Mahadevan 
87485d305f5SVijay Mahadevan   Input Parameter:
875*0b207066SBarry Smith . dm - The `DMMOAB` object
87685d305f5SVijay Mahadevan 
877d8d19677SJose E. Roman   Output Parameters:
878a2b725a8SWilliam Gropp + bdvtx   - Boundary vertices
87985d305f5SVijay Mahadevan . bdelems - Boundary elements
880a2b725a8SWilliam Gropp - bdfaces - Boundary faces
88185d305f5SVijay Mahadevan 
88285d305f5SVijay Mahadevan   Level: beginner
88385d305f5SVijay Mahadevan 
884*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabCheckBoundaryVertices()`, `DMMoabIsEntityOnBoundary()`
88585d305f5SVijay Mahadevan @*/
886d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetBoundaryMarkers(DM dm, const moab::Range **bdvtx, const moab::Range **bdelems, const moab::Range **bdfaces)
887d71ae5a4SJacob Faibussowitsch {
8881cec0304SVijay Mahadevan   DM_Moab *dmmoab;
8891cec0304SVijay Mahadevan 
8901cec0304SVijay Mahadevan   PetscFunctionBegin;
8911cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
8921cec0304SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
8931cec0304SVijay Mahadevan 
8946d9eb265SVijay Mahadevan   if (bdvtx) *bdvtx = dmmoab->bndyvtx;
8956d9eb265SVijay Mahadevan   if (bdfaces) *bdfaces = dmmoab->bndyfaces;
8966d9eb265SVijay Mahadevan   if (bdelems) *bdfaces = dmmoab->bndyelems;
8973ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8981cec0304SVijay Mahadevan }
8991cec0304SVijay Mahadevan 
900d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm)
901d71ae5a4SJacob Faibussowitsch {
90285d305f5SVijay Mahadevan   PetscInt        i;
903e882eb38SVijay Mahadevan   moab::ErrorCode merr;
904f6829af0SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab *)dm->data;
905f6829af0SVijay Mahadevan 
906f6829af0SVijay Mahadevan   PetscFunctionBegin;
907f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
908304006b3SVijay Mahadevan 
909304006b3SVijay Mahadevan   dmmoab->refct--;
910304006b3SVijay Mahadevan   if (!dmmoab->refct) {
911f6829af0SVijay Mahadevan     delete dmmoab->vlocal;
912f6829af0SVijay Mahadevan     delete dmmoab->vowned;
913f6829af0SVijay Mahadevan     delete dmmoab->vghost;
914f6829af0SVijay Mahadevan     delete dmmoab->elocal;
915f6829af0SVijay Mahadevan     delete dmmoab->eghost;
916f6829af0SVijay Mahadevan     delete dmmoab->bndyvtx;
917f6829af0SVijay Mahadevan     delete dmmoab->bndyfaces;
918f6829af0SVijay Mahadevan     delete dmmoab->bndyelems;
919f6829af0SVijay Mahadevan 
9209566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->gsindices));
9219566063dSJacob Faibussowitsch     PetscCall(PetscFree2(dmmoab->gidmap, dmmoab->lidmap));
9229566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->dfill));
9239566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->ofill));
9249566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->materials));
92585d305f5SVijay Mahadevan     if (dmmoab->fieldNames) {
92648a46eb9SPierre Jolivet       for (i = 0; i < dmmoab->numFields; i++) PetscCall(PetscFree(dmmoab->fieldNames[i]));
9279566063dSJacob Faibussowitsch       PetscCall(PetscFree(dmmoab->fieldNames));
92885d305f5SVijay Mahadevan     }
929b117cd09SVijay Mahadevan 
930b117cd09SVijay Mahadevan     if (dmmoab->nhlevels) {
9319566063dSJacob Faibussowitsch       PetscCall(PetscFree(dmmoab->hsets));
932e882eb38SVijay Mahadevan       dmmoab->nhlevels = 0;
933e882eb38SVijay Mahadevan       if (!dmmoab->hlevel && dmmoab->icreatedinstance) delete dmmoab->hierarchy;
934e882eb38SVijay Mahadevan       dmmoab->hierarchy = NULL;
935b117cd09SVijay Mahadevan     }
936e882eb38SVijay Mahadevan 
937e882eb38SVijay Mahadevan     if (dmmoab->icreatedinstance) {
9389c368985SVijay Mahadevan       delete dmmoab->pcomm;
9399371c9d4SSatish Balay       merr = dmmoab->mbiface->delete_mesh();
9409371c9d4SSatish Balay       MBERRNM(merr);
941e882eb38SVijay Mahadevan       delete dmmoab->mbiface;
942e882eb38SVijay Mahadevan     }
943e882eb38SVijay Mahadevan     dmmoab->mbiface = NULL;
9449daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
945e882eb38SVijay Mahadevan     dmmoab->pcomm = NULL;
9469daf19fdSVijay Mahadevan #endif
9479566063dSJacob Faibussowitsch     PetscCall(VecScatterDestroy(&dmmoab->ltog_sendrecv));
9489566063dSJacob Faibussowitsch     PetscCall(ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map));
9499566063dSJacob Faibussowitsch     PetscCall(PetscFree(dm->data));
950304006b3SVijay Mahadevan   }
9513ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
952f6829af0SVijay Mahadevan }
953f6829af0SVijay Mahadevan 
954d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(DM dm, PetscOptionItems *PetscOptionsObject)
955d71ae5a4SJacob Faibussowitsch {
9562e4e7c01SVijay Mahadevan   DM_Moab *dmmoab = (DM_Moab *)dm->data;
9572e4e7c01SVijay Mahadevan 
9582e4e7c01SVijay Mahadevan   PetscFunctionBegin;
959d0609cedSBarry Smith   PetscOptionsHeadBegin(PetscOptionsObject, "DMMoab Options");
9609566063dSJacob 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));
9619566063dSJacob 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));
9622e4e7c01SVijay Mahadevan   /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */
9639566063dSJacob 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));
9649566063dSJacob 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));
9659566063dSJacob Faibussowitsch   PetscCall(PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum *)&dmmoab->read_mode, NULL));
9669566063dSJacob Faibussowitsch   PetscCall(PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum *)&dmmoab->write_mode, NULL));
967d0609cedSBarry Smith   PetscOptionsHeadEnd();
9683ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9692e4e7c01SVijay Mahadevan }
9702e4e7c01SVijay Mahadevan 
971d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm)
972d71ae5a4SJacob Faibussowitsch {
973f6829af0SVijay Mahadevan   moab::ErrorCode       merr;
974f6829af0SVijay Mahadevan   Vec                   local, global;
975f6829af0SVijay Mahadevan   IS                    from, to;
976f6829af0SVijay Mahadevan   moab::Range::iterator iter;
977304006b3SVijay Mahadevan   PetscInt              i, j, f, bs, vent, totsize, *lgmap;
978f6829af0SVijay Mahadevan   DM_Moab              *dmmoab = (DM_Moab *)dm->data;
979f6829af0SVijay Mahadevan   moab::Range           adjs;
980f6829af0SVijay Mahadevan 
981f6829af0SVijay Mahadevan   PetscFunctionBegin;
982f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
983f6829af0SVijay Mahadevan   /* Get the local and shared vertices and cache it */
98408401ef6SPierre Jolivet   PetscCheck(dmmoab->mbiface != NULL, PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface before calling SetUp.");
9859daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
98608401ef6SPierre Jolivet   PetscCheck(dmmoab->pcomm != NULL, PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB ParallelComm object before calling SetUp.");
9879daf19fdSVijay Mahadevan #endif
988f6829af0SVijay Mahadevan 
989f6829af0SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
9909371c9d4SSatish Balay   if (dmmoab->vlocal->empty()) {
99149d66b22SVijay Mahadevan     //merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
9929371c9d4SSatish Balay     merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, 0, *dmmoab->vlocal, false);
9939371c9d4SSatish Balay     MBERRNM(merr);
994f6829af0SVijay Mahadevan 
9959daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
996f6829af0SVijay Mahadevan     /* filter based on parallel status */
9979371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned);
9989371c9d4SSatish Balay     MBERRNM(merr);
999f6829af0SVijay Mahadevan 
1000f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
10019c368985SVijay Mahadevan     // *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
1002f6829af0SVijay Mahadevan     adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
10039371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(adjs, PSTATUS_GHOST | PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost);
10049371c9d4SSatish Balay     MBERRNM(merr);
1005f6829af0SVijay Mahadevan     adjs            = moab::subtract(adjs, *dmmoab->vghost);
1006f6829af0SVijay Mahadevan     *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs);
10079daf19fdSVijay Mahadevan #else
10089daf19fdSVijay Mahadevan     *dmmoab->vowned = *dmmoab->vlocal;
10099daf19fdSVijay Mahadevan #endif
1010f6829af0SVijay Mahadevan 
1011f6829af0SVijay Mahadevan     /* compute and cache the sizes of local and ghosted entities */
1012f6829af0SVijay Mahadevan     dmmoab->nloc   = dmmoab->vowned->size();
1013f6829af0SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
101449d66b22SVijay Mahadevan 
10159daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
10161c2dc1cbSBarry Smith     PetscCall(MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm));
10173ba16761SJacob 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));
10189daf19fdSVijay Mahadevan #else
10199daf19fdSVijay Mahadevan     dmmoab->n       = dmmoab->nloc;
10209daf19fdSVijay Mahadevan #endif
1021f6829af0SVijay Mahadevan   }
1022f6829af0SVijay Mahadevan 
1023f6829af0SVijay Mahadevan   {
1024f6829af0SVijay Mahadevan     /* get the information about the local elements in the mesh */
1025f6829af0SVijay Mahadevan     dmmoab->eghost->clear();
1026f6829af0SVijay Mahadevan 
1027f6829af0SVijay Mahadevan     /* first decipher the leading dimension */
1028f6829af0SVijay Mahadevan     for (i = 3; i > 0; i--) {
1029f6829af0SVijay Mahadevan       dmmoab->elocal->clear();
10309371c9d4SSatish Balay       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, false);
10319371c9d4SSatish Balay       MBERRNM(merr);
1032f6829af0SVijay Mahadevan 
1033f6829af0SVijay Mahadevan       /* store the current mesh dimension */
1034f6829af0SVijay Mahadevan       if (dmmoab->elocal->size()) {
1035f6829af0SVijay Mahadevan         dmmoab->dim = i;
1036f6829af0SVijay Mahadevan         break;
1037f6829af0SVijay Mahadevan       }
1038f6829af0SVijay Mahadevan     }
1039f6829af0SVijay Mahadevan 
10409566063dSJacob Faibussowitsch     PetscCall(DMSetDimension(dm, dmmoab->dim));
1041b117cd09SVijay Mahadevan 
10429daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1043f6829af0SVijay Mahadevan     /* filter the ghosted and owned element list */
1044f6829af0SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
10459371c9d4SSatish Balay     merr            = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT);
10469371c9d4SSatish Balay     MBERRNM(merr);
1047f6829af0SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
10489daf19fdSVijay Mahadevan #endif
1049f6829af0SVijay Mahadevan 
1050f6829af0SVijay Mahadevan     dmmoab->neleloc   = dmmoab->elocal->size();
1051f6829af0SVijay Mahadevan     dmmoab->neleghost = dmmoab->eghost->size();
105249d66b22SVijay Mahadevan 
10539daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
10541c2dc1cbSBarry Smith     PetscCall(MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm));
10553ba16761SJacob Faibussowitsch     PetscCall(PetscInfo(NULL, "%d-dim elements: owned - %" PetscInt_FMT ", ghosted - %" PetscInt_FMT ".\n", dmmoab->dim, dmmoab->neleloc, dmmoab->neleghost));
10569daf19fdSVijay Mahadevan #else
10579daf19fdSVijay Mahadevan     dmmoab->nele    = dmmoab->neleloc;
10589daf19fdSVijay Mahadevan #endif
1059f6829af0SVijay Mahadevan   }
1060f6829af0SVijay Mahadevan 
1061f6829af0SVijay Mahadevan   bs = dmmoab->bs;
1062f6829af0SVijay Mahadevan   if (!dmmoab->ltog_tag) {
1063f6829af0SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
1064f6829af0SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
1065f6829af0SVijay Mahadevan        assemble the individual pieces of the mesh */
10669371c9d4SSatish Balay     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);
10679371c9d4SSatish Balay     MBERRNM(merr);
1068f6829af0SVijay Mahadevan   }
1069f6829af0SVijay Mahadevan 
1070f6829af0SVijay Mahadevan   totsize = dmmoab->vlocal->size();
10711dca8a05SBarry 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);
10729566063dSJacob Faibussowitsch   PetscCall(PetscCalloc1(totsize, &dmmoab->gsindices));
1073f6829af0SVijay Mahadevan   {
1074f6829af0SVijay Mahadevan     /* first get the local indices */
10759371c9d4SSatish Balay     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vowned, &dmmoab->gsindices[0]);
10769371c9d4SSatish Balay     MBERRNM(merr);
10773f1c6e43SVijay Mahadevan     if (dmmoab->nghost) { /* next get the ghosted indices */
10789371c9d4SSatish Balay       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vghost, &dmmoab->gsindices[dmmoab->nloc]);
10799371c9d4SSatish Balay       MBERRNM(merr);
1080f6829af0SVijay Mahadevan     }
1081f6829af0SVijay Mahadevan 
1082f6829af0SVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
1083304006b3SVijay Mahadevan     dmmoab->lminmax[0] = dmmoab->lminmax[1] = dmmoab->gsindices[0];
1084f6829af0SVijay Mahadevan     for (i = 0; i < totsize; ++i) {
1085304006b3SVijay Mahadevan       if (dmmoab->lminmax[0] > dmmoab->gsindices[i]) dmmoab->lminmax[0] = dmmoab->gsindices[i];
1086304006b3SVijay Mahadevan       if (dmmoab->lminmax[1] < dmmoab->gsindices[i]) dmmoab->lminmax[1] = dmmoab->gsindices[i];
1087f6829af0SVijay Mahadevan     }
1088f6829af0SVijay Mahadevan 
10891c2dc1cbSBarry Smith     PetscCall(MPIU_Allreduce(&dmmoab->lminmax[0], &dmmoab->gminmax[0], 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm));
10901c2dc1cbSBarry Smith     PetscCall(MPIU_Allreduce(&dmmoab->lminmax[1], &dmmoab->gminmax[1], 1, MPI_INT, MPI_MAX, ((PetscObject)dm)->comm));
1091f6829af0SVijay Mahadevan 
1092f6829af0SVijay Mahadevan     /* set the GID map */
10939371c9d4SSatish Balay     for (i = 0; i < totsize; ++i) { dmmoab->gsindices[i] -= dmmoab->gminmax[0]; /* zero based index needed for IS */ }
1094304006b3SVijay Mahadevan     dmmoab->lminmax[0] -= dmmoab->gminmax[0];
1095304006b3SVijay Mahadevan     dmmoab->lminmax[1] -= dmmoab->gminmax[0];
1096f6829af0SVijay Mahadevan 
10973ba16761SJacob 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]));
1098f6829af0SVijay Mahadevan   }
10999371c9d4SSatish 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,
11009371c9d4SSatish Balay              dmmoab->numFields);
1101f6829af0SVijay Mahadevan 
1102f6829af0SVijay Mahadevan   {
11039c368985SVijay Mahadevan     dmmoab->seqstart = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->front());
11049c368985SVijay Mahadevan     dmmoab->seqend   = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->back());
11053ba16761SJacob Faibussowitsch     PetscCall(PetscInfo(NULL, "SEQUENCE: Local [min, max] - [%" PetscInt_FMT ", %" PetscInt_FMT "]\n", dmmoab->seqstart, dmmoab->seqend));
11063f1c6e43SVijay Mahadevan 
11079566063dSJacob Faibussowitsch     PetscCall(PetscMalloc2(dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->gidmap, dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->lidmap));
11089566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(totsize * dmmoab->numFields, &lgmap));
1109f6829af0SVijay Mahadevan 
1110f6829af0SVijay Mahadevan     i = j = 0;
1111f6829af0SVijay Mahadevan     /* set the owned vertex data first */
1112f6829af0SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++, i++) {
1113e92d1c7cSVijay Mahadevan       vent                 = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart;
1114f6829af0SVijay Mahadevan       dmmoab->gidmap[vent] = dmmoab->gsindices[i];
1115f6829af0SVijay Mahadevan       dmmoab->lidmap[vent] = i;
1116ad540459SPierre Jolivet       for (f = 0; f < dmmoab->numFields; f++, j++) lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]);
1117f6829af0SVijay Mahadevan     }
1118f6829af0SVijay Mahadevan     /* next arrange all the ghosted data information */
1119f6829af0SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++, i++) {
1120e92d1c7cSVijay Mahadevan       vent                 = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart;
1121f6829af0SVijay Mahadevan       dmmoab->gidmap[vent] = dmmoab->gsindices[i];
1122f6829af0SVijay Mahadevan       dmmoab->lidmap[vent] = i;
1123ad540459SPierre Jolivet       for (f = 0; f < dmmoab->numFields; f++, j++) lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]);
1124f6829af0SVijay Mahadevan     }
1125f6829af0SVijay Mahadevan 
1126f6829af0SVijay Mahadevan     /* We need to create the Global to Local Vector Scatter Contexts
1127f6829af0SVijay Mahadevan        1) First create a local and global vector
1128f6829af0SVijay Mahadevan        2) Create a local and global IS
1129f6829af0SVijay Mahadevan        3) Create VecScatter and LtoGMapping objects
1130f6829af0SVijay Mahadevan        4) Cleanup the IS and Vec objects
1131f6829af0SVijay Mahadevan     */
11329566063dSJacob Faibussowitsch     PetscCall(DMCreateGlobalVector(dm, &global));
11339566063dSJacob Faibussowitsch     PetscCall(DMCreateLocalVector(dm, &local));
1134f6829af0SVijay Mahadevan 
11359566063dSJacob Faibussowitsch     PetscCall(VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend));
1136f6829af0SVijay Mahadevan 
1137f6829af0SVijay Mahadevan     /* global to local must retrieve ghost points */
11389566063dSJacob Faibussowitsch     PetscCall(ISCreateStride(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, dmmoab->vstart, 1, &from));
11399566063dSJacob Faibussowitsch     PetscCall(ISSetBlockSize(from, bs));
1140f6829af0SVijay Mahadevan 
11419566063dSJacob Faibussowitsch     PetscCall(ISCreateGeneral(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, &lgmap[0], PETSC_COPY_VALUES, &to));
11429566063dSJacob Faibussowitsch     PetscCall(ISSetBlockSize(to, bs));
1143f6829af0SVijay Mahadevan 
1144f6829af0SVijay Mahadevan     if (!dmmoab->ltog_map) {
1145f6829af0SVijay Mahadevan       /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */
11469566063dSJacob Faibussowitsch       PetscCall(ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm, dmmoab->bs, totsize * dmmoab->numFields, lgmap, PETSC_COPY_VALUES, &dmmoab->ltog_map));
1147f6829af0SVijay Mahadevan     }
1148f6829af0SVijay Mahadevan 
1149f6829af0SVijay Mahadevan     /* now create the scatter object from local to global vector */
11509566063dSJacob Faibussowitsch     PetscCall(VecScatterCreate(local, from, global, to, &dmmoab->ltog_sendrecv));
1151f6829af0SVijay Mahadevan 
1152f6829af0SVijay Mahadevan     /* clean up IS, Vec */
11539566063dSJacob Faibussowitsch     PetscCall(PetscFree(lgmap));
11549566063dSJacob Faibussowitsch     PetscCall(ISDestroy(&from));
11559566063dSJacob Faibussowitsch     PetscCall(ISDestroy(&to));
11569566063dSJacob Faibussowitsch     PetscCall(VecDestroy(&local));
11579566063dSJacob Faibussowitsch     PetscCall(VecDestroy(&global));
1158f6829af0SVijay Mahadevan   }
1159f6829af0SVijay Mahadevan 
116049d66b22SVijay Mahadevan   dmmoab->bndyvtx   = new moab::Range();
116149d66b22SVijay Mahadevan   dmmoab->bndyfaces = new moab::Range();
116249d66b22SVijay Mahadevan   dmmoab->bndyelems = new moab::Range();
1163f6829af0SVijay Mahadevan   /* skin the boundary and store nodes */
11649c368985SVijay Mahadevan   if (!dmmoab->hlevel) {
1165f6829af0SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
1166f6829af0SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
1167f6829af0SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
1168f6829af0SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
1169f6829af0SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
1170f6829af0SVijay Mahadevan 
1171f6829af0SVijay Mahadevan     /* get the entities on the skin - only the faces */
11729371c9d4SSatish Balay     merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, *dmmoab->bndyfaces, NULL, true, true, false);
11739371c9d4SSatish Balay     MBERRNM(merr); // 'false' param indicates we want faces back, not vertices
1174f6829af0SVijay Mahadevan 
11759daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1176f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
11779371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT);
11789371c9d4SSatish Balay     MBERRNM(merr);
11799371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_INTERFACE, PSTATUS_NOT);
11809371c9d4SSatish Balay     MBERRNM(merr);
11819daf19fdSVijay Mahadevan #endif
1182f6829af0SVijay Mahadevan 
1183f6829af0SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
11849371c9d4SSatish Balay     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);
11859371c9d4SSatish Balay     MBERRNM(merr);
11869371c9d4SSatish Balay     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyvtx, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);
11879371c9d4SSatish Balay     MBERRNM(merr);
11889371c9d4SSatish Balay   } else {
11899c368985SVijay Mahadevan     /* Let us query the hierarchy manager and get the results directly for this level */
11909c368985SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->elocal->begin(); iter != dmmoab->elocal->end(); iter++) {
11919c368985SVijay Mahadevan       moab::EntityHandle elemHandle = *iter;
11929c368985SVijay Mahadevan       if (dmmoab->hierarchy->is_entity_on_boundary(elemHandle)) {
11939c368985SVijay Mahadevan         dmmoab->bndyelems->insert(elemHandle);
11949c368985SVijay Mahadevan         /* For this boundary element, query the vertices and add them to the list */
11959c368985SVijay Mahadevan         std::vector<moab::EntityHandle> connect;
11969371c9d4SSatish Balay         merr = dmmoab->hierarchy->get_connectivity(elemHandle, dmmoab->hlevel, connect);
11979371c9d4SSatish Balay         MBERRNM(merr);
11989c368985SVijay Mahadevan         for (unsigned iv = 0; iv < connect.size(); ++iv)
11999371c9d4SSatish Balay           if (dmmoab->hierarchy->is_entity_on_boundary(connect[iv])) dmmoab->bndyvtx->insert(connect[iv]);
12009c368985SVijay Mahadevan         /* Next, let us query the boundary faces and add them also to the list */
12019c368985SVijay Mahadevan         std::vector<moab::EntityHandle> faces;
12029371c9d4SSatish Balay         merr = dmmoab->hierarchy->get_adjacencies(elemHandle, dmmoab->dim - 1, faces);
12039371c9d4SSatish Balay         MBERRNM(merr);
12049c368985SVijay Mahadevan         for (unsigned ifa = 0; ifa < faces.size(); ++ifa)
12059371c9d4SSatish Balay           if (dmmoab->hierarchy->is_entity_on_boundary(faces[ifa])) dmmoab->bndyfaces->insert(faces[ifa]);
12069c368985SVijay Mahadevan       }
12079c368985SVijay Mahadevan     }
12089c368985SVijay Mahadevan #ifdef MOAB_HAVE_MPI
12099c368985SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
12109371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyvtx, PSTATUS_NOT_OWNED, PSTATUS_NOT);
12119371c9d4SSatish Balay     MBERRNM(merr);
12129371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT);
12139371c9d4SSatish Balay     MBERRNM(merr);
12149371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyelems, PSTATUS_NOT_OWNED, PSTATUS_NOT);
12159371c9d4SSatish Balay     MBERRNM(merr);
12169c368985SVijay Mahadevan #endif
12179c368985SVijay Mahadevan   }
12183ba16761SJacob 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()));
1219a044f6b6SVijay Mahadevan 
1220a044f6b6SVijay Mahadevan   /* Get the material sets and populate the data for all locally owned elements */
1221a044f6b6SVijay Mahadevan   {
12229566063dSJacob Faibussowitsch     PetscCall(PetscCalloc1(dmmoab->elocal->size(), &dmmoab->materials));
1223a044f6b6SVijay Mahadevan     /* Get the count of entities of particular type from dmmoab->elocal
1224a044f6b6SVijay Mahadevan        -- Then, for each non-zero type, loop through and query the fileset to get the material tag data */
1225a044f6b6SVijay Mahadevan     moab::Range msets;
12269371c9d4SSatish Balay     merr = dmmoab->mbiface->get_entities_by_type_and_tag(dmmoab->fileset, moab::MBENTITYSET, &dmmoab->material_tag, NULL, 1, msets, moab::Interface::UNION);
12273ba16761SJacob Faibussowitsch     MBERRNM(merr);
12289d3446b2SPierre Jolivet     if (msets.size() == 0) PetscCall(PetscInfo(NULL, "No material sets found in the fileset.\n"));
1229a044f6b6SVijay Mahadevan 
1230a044f6b6SVijay Mahadevan     for (unsigned i = 0; i < msets.size(); ++i) {
1231a044f6b6SVijay Mahadevan       moab::Range msetelems;
12329371c9d4SSatish Balay       merr = dmmoab->mbiface->get_entities_by_dimension(msets[i], dmmoab->dim, msetelems, true);
12333ba16761SJacob Faibussowitsch       MBERRNM(merr);
1234aedf4482SVijay Mahadevan #ifdef MOAB_HAVE_MPI
1235aedf4482SVijay Mahadevan       /* filter all the non-owned and shared entities out of the list */
12369371c9d4SSatish Balay       merr = dmmoab->pcomm->filter_pstatus(msetelems, PSTATUS_NOT_OWNED, PSTATUS_NOT);
12379371c9d4SSatish Balay       MBERRNM(merr);
1238aedf4482SVijay Mahadevan #endif
1239a044f6b6SVijay Mahadevan 
1240a044f6b6SVijay Mahadevan       int                partID;
1241a044f6b6SVijay Mahadevan       moab::EntityHandle mset = msets[i];
12429371c9d4SSatish Balay       merr                    = dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &mset, 1, &partID);
12433ba16761SJacob Faibussowitsch       MBERRNM(merr);
1244a044f6b6SVijay Mahadevan 
12459371c9d4SSatish Balay       for (unsigned j = 0; j < msetelems.size(); ++j) dmmoab->materials[dmmoab->elocal->index(msetelems[j])] = partID;
1246a044f6b6SVijay Mahadevan     }
1247a044f6b6SVijay Mahadevan   }
1248a044f6b6SVijay Mahadevan 
12493ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1250f6829af0SVijay Mahadevan }
1251f6829af0SVijay Mahadevan 
1252cab5ea25SPierre Jolivet /*@C
1253304006b3SVijay Mahadevan   DMMoabCreateVertices - Creates and adds several vertices to the primary set represented by the DM.
1254304006b3SVijay Mahadevan 
1255d083f849SBarry Smith   Collective
1256304006b3SVijay Mahadevan 
1257304006b3SVijay Mahadevan   Input Parameters:
1258a4e35b19SJacob Faibussowitsch + dm     - The `DM` object
125960225df5SJacob Faibussowitsch . coords - The connectivity of the element
1260a2b725a8SWilliam Gropp - nverts - The number of vertices that form the element
1261304006b3SVijay Mahadevan 
1262304006b3SVijay Mahadevan   Output Parameter:
1263*0b207066SBarry Smith . overts - The list of vertices that were created (can be `NULL`)
1264304006b3SVijay Mahadevan 
1265304006b3SVijay Mahadevan   Level: beginner
1266304006b3SVijay Mahadevan 
1267*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabCreateSubmesh()`, `DMMoabCreateElement()`
1268304006b3SVijay Mahadevan @*/
1269d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreateVertices(DM dm, const PetscReal *coords, PetscInt nverts, moab::Range *overts)
1270d71ae5a4SJacob Faibussowitsch {
1271304006b3SVijay Mahadevan   moab::ErrorCode merr;
1272304006b3SVijay Mahadevan   DM_Moab        *dmmoab;
1273304006b3SVijay Mahadevan   moab::Range     verts;
1274304006b3SVijay Mahadevan 
1275304006b3SVijay Mahadevan   PetscFunctionBegin;
1276304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
12774f572ea9SToby Isaac   PetscAssertPointer(coords, 2);
1278304006b3SVijay Mahadevan 
1279304006b3SVijay Mahadevan   dmmoab = (DM_Moab *)dm->data;
1280304006b3SVijay Mahadevan 
1281304006b3SVijay Mahadevan   /* Insert new points */
12829371c9d4SSatish Balay   merr = dmmoab->mbiface->create_vertices(&coords[0], nverts, verts);
12839371c9d4SSatish Balay   MBERRNM(merr);
12849371c9d4SSatish Balay   merr = dmmoab->mbiface->add_entities(dmmoab->fileset, verts);
12859371c9d4SSatish Balay   MBERRNM(merr);
1286304006b3SVijay Mahadevan 
1287304006b3SVijay Mahadevan   if (overts) *overts = verts;
12883ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1289304006b3SVijay Mahadevan }
1290304006b3SVijay Mahadevan 
1291cab5ea25SPierre Jolivet /*@C
1292304006b3SVijay Mahadevan   DMMoabCreateElement - Adds an element of specified type to the primary set represented by the DM.
1293304006b3SVijay Mahadevan 
1294d083f849SBarry Smith   Collective
1295304006b3SVijay Mahadevan 
1296304006b3SVijay Mahadevan   Input Parameters:
1297304006b3SVijay Mahadevan + dm     - The DM object
1298304006b3SVijay Mahadevan . type   - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra)
1299304006b3SVijay Mahadevan . conn   - The connectivity of the element
1300a2b725a8SWilliam Gropp - nverts - The number of vertices that form the element
1301304006b3SVijay Mahadevan 
1302304006b3SVijay Mahadevan   Output Parameter:
1303*0b207066SBarry Smith . oelem - The handle to the element created and added to the `DM` object
1304304006b3SVijay Mahadevan 
1305304006b3SVijay Mahadevan   Level: beginner
1306304006b3SVijay Mahadevan 
1307*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabCreateSubmesh()`, `DMMoabCreateVertices()`
1308304006b3SVijay Mahadevan @*/
1309d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreateElement(DM dm, const moab::EntityType type, const moab::EntityHandle *conn, PetscInt nverts, moab::EntityHandle *oelem)
1310d71ae5a4SJacob Faibussowitsch {
1311304006b3SVijay Mahadevan   moab::ErrorCode    merr;
1312304006b3SVijay Mahadevan   DM_Moab           *dmmoab;
1313304006b3SVijay Mahadevan   moab::EntityHandle elem;
1314304006b3SVijay Mahadevan 
1315304006b3SVijay Mahadevan   PetscFunctionBegin;
1316304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
13174f572ea9SToby Isaac   PetscAssertPointer(conn, 3);
1318304006b3SVijay Mahadevan 
1319304006b3SVijay Mahadevan   dmmoab = (DM_Moab *)dm->data;
1320304006b3SVijay Mahadevan 
1321304006b3SVijay Mahadevan   /* Insert new element */
13229371c9d4SSatish Balay   merr = dmmoab->mbiface->create_element(type, conn, nverts, elem);
13239371c9d4SSatish Balay   MBERRNM(merr);
13249371c9d4SSatish Balay   merr = dmmoab->mbiface->add_entities(dmmoab->fileset, &elem, 1);
13259371c9d4SSatish Balay   MBERRNM(merr);
1326304006b3SVijay Mahadevan 
1327304006b3SVijay Mahadevan   if (oelem) *oelem = elem;
13283ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1329304006b3SVijay Mahadevan }
1330304006b3SVijay Mahadevan 
1331cab5ea25SPierre Jolivet /*@C
1332*0b207066SBarry Smith   DMMoabCreateSubmesh - Creates a sub-`DM` object with a set that contains all vertices/elements of the parent
1333304006b3SVijay Mahadevan   in addition to providing support for dynamic mesh modifications. This is useful for AMR calculations to
1334304006b3SVijay Mahadevan   create a DM object on a refined level.
1335304006b3SVijay Mahadevan 
1336d083f849SBarry Smith   Collective
1337304006b3SVijay Mahadevan 
1338304006b3SVijay Mahadevan   Input Parameters:
1339*0b207066SBarry Smith . dm - The `DM` object
1340304006b3SVijay Mahadevan 
1341304006b3SVijay Mahadevan   Output Parameter:
1342*0b207066SBarry Smith . newdm - The sub `DM` object with updated set information
1343304006b3SVijay Mahadevan 
1344304006b3SVijay Mahadevan   Level: advanced
1345304006b3SVijay Mahadevan 
1346*0b207066SBarry Smith .seealso: `DMMOAB`, `DMCreate()`, `DMMoabCreateVertices()`, `DMMoabCreateElement()`
1347304006b3SVijay Mahadevan @*/
1348d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreateSubmesh(DM dm, DM *newdm)
1349d71ae5a4SJacob Faibussowitsch {
1350304006b3SVijay Mahadevan   DM_Moab        *dmmoab;
1351304006b3SVijay Mahadevan   DM_Moab        *ndmmoab;
1352304006b3SVijay Mahadevan   moab::ErrorCode merr;
1353304006b3SVijay Mahadevan 
1354304006b3SVijay Mahadevan   PetscFunctionBegin;
1355304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1356304006b3SVijay Mahadevan 
1357304006b3SVijay Mahadevan   dmmoab = (DM_Moab *)dm->data;
1358304006b3SVijay Mahadevan 
1359*0b207066SBarry Smith   /* Create the basic DMMOAB object and keep the default parameters created by DM impls */
1360f3fa974cSJacob Faibussowitsch   PetscCall(DMMoabCreateMoab(((PetscObject)dm)->comm, dmmoab->mbiface, &dmmoab->ltog_tag, NULL, newdm));
1361304006b3SVijay Mahadevan 
1362304006b3SVijay Mahadevan   /* get all the necessary handles from the private DM object */
1363304006b3SVijay Mahadevan   ndmmoab = (DM_Moab *)(*newdm)->data;
1364304006b3SVijay Mahadevan 
1365304006b3SVijay Mahadevan   /* set the sub-mesh's parent DM reference */
1366304006b3SVijay Mahadevan   ndmmoab->parent = &dm;
1367304006b3SVijay Mahadevan 
1368304006b3SVijay Mahadevan   /* create a file set to associate all entities in current mesh */
13699371c9d4SSatish Balay   merr = ndmmoab->mbiface->create_meshset(moab::MESHSET_SET, ndmmoab->fileset);
13709371c9d4SSatish Balay   MBERR("Creating file set failed", merr);
1371304006b3SVijay Mahadevan 
1372304006b3SVijay Mahadevan   /* create a meshset and then add old fileset as child */
13739371c9d4SSatish Balay   merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->vlocal);
13749371c9d4SSatish Balay   MBERR("Adding child vertices to parent failed", merr);
13759371c9d4SSatish Balay   merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->elocal);
13769371c9d4SSatish Balay   MBERR("Adding child elements to parent failed", merr);
1377304006b3SVijay Mahadevan 
1378304006b3SVijay Mahadevan   /* preserve the field association between the parent and sub-mesh objects */
13799566063dSJacob Faibussowitsch   PetscCall(DMMoabSetFieldNames(*newdm, dmmoab->numFields, dmmoab->fieldNames));
13803ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1381304006b3SVijay Mahadevan }
1382304006b3SVijay Mahadevan 
1383d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMMoabView_Ascii(DM dm, PetscViewer viewer)
1384d71ae5a4SJacob Faibussowitsch {
1385304006b3SVijay Mahadevan   DM_Moab    *dmmoab = (DM_Moab *)(dm)->data;
1386304006b3SVijay Mahadevan   const char *name;
1387304006b3SVijay Mahadevan   MPI_Comm    comm;
1388304006b3SVijay Mahadevan   PetscMPIInt size;
1389304006b3SVijay Mahadevan 
1390304006b3SVijay Mahadevan   PetscFunctionBegin;
13919566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)dm, &comm));
13929566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm, &size));
13939566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetName((PetscObject)dm, &name));
13949566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushTab(viewer));
139563a3b9bcSJacob Faibussowitsch   if (name) PetscCall(PetscViewerASCIIPrintf(viewer, "%s in %" PetscInt_FMT " dimensions:\n", name, dmmoab->dim));
139663a3b9bcSJacob Faibussowitsch   else PetscCall(PetscViewerASCIIPrintf(viewer, "Mesh in %" PetscInt_FMT " dimensions:\n", dmmoab->dim));
1397304006b3SVijay Mahadevan   /* print details about the global mesh */
1398304006b3SVijay Mahadevan   {
13999566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushTab(viewer));
140063a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Sizes: cells=%" PetscInt_FMT ", vertices=%" PetscInt_FMT ", blocks=%" PetscInt_FMT "\n", dmmoab->nele, dmmoab->n, dmmoab->bs));
1401304006b3SVijay Mahadevan     /* print boundary data */
140263a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Boundary trace:\n"));
1403304006b3SVijay Mahadevan     {
14049566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(viewer));
140563a3b9bcSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(viewer, "cells=%zu, faces=%zu, vertices=%zu\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size()));
14069566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(viewer));
1407304006b3SVijay Mahadevan     }
1408304006b3SVijay Mahadevan     /* print field data */
140963a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Fields: %" PetscInt_FMT " components\n", dmmoab->numFields));
1410304006b3SVijay Mahadevan     {
14119566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(viewer));
141248a46eb9SPierre Jolivet       for (int i = 0; i < dmmoab->numFields; ++i) PetscCall(PetscViewerASCIIPrintf(viewer, "[%" PetscInt_FMT "] - %s\n", i, dmmoab->fieldNames[i]));
14139566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(viewer));
1414304006b3SVijay Mahadevan     }
14159566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopTab(viewer));
1416304006b3SVijay Mahadevan   }
14179566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopTab(viewer));
14189566063dSJacob Faibussowitsch   PetscCall(PetscViewerFlush(viewer));
14193ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1420304006b3SVijay Mahadevan }
1421304006b3SVijay Mahadevan 
1422d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMMoabView_VTK(DM dm, PetscViewer v)
1423d71ae5a4SJacob Faibussowitsch {
14243ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1425304006b3SVijay Mahadevan }
1426304006b3SVijay Mahadevan 
1427d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMMoabView_HDF5(DM dm, PetscViewer v)
1428d71ae5a4SJacob Faibussowitsch {
14293ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1430304006b3SVijay Mahadevan }
1431304006b3SVijay Mahadevan 
1432d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMView_Moab(DM dm, PetscViewer viewer)
1433d71ae5a4SJacob Faibussowitsch {
1434304006b3SVijay Mahadevan   PetscBool iascii, ishdf5, isvtk;
1435304006b3SVijay Mahadevan 
1436304006b3SVijay Mahadevan   PetscFunctionBegin;
1437304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1438304006b3SVijay Mahadevan   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
14399566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
14409566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERVTK, &isvtk));
14419566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERHDF5, &ishdf5));
1442304006b3SVijay Mahadevan   if (iascii) {
14439566063dSJacob Faibussowitsch     PetscCall(DMMoabView_Ascii(dm, viewer));
1444304006b3SVijay Mahadevan   } else if (ishdf5) {
1445304006b3SVijay Mahadevan #if defined(PETSC_HAVE_HDF5) && defined(MOAB_HAVE_HDF5)
14469566063dSJacob Faibussowitsch     PetscCall(PetscViewerPushFormat(viewer, PETSC_VIEWER_HDF5_VIZ));
14479566063dSJacob Faibussowitsch     PetscCall(DMMoabView_HDF5(dm, viewer));
14489566063dSJacob Faibussowitsch     PetscCall(PetscViewerPopFormat(viewer));
1449304006b3SVijay Mahadevan #else
1450304006b3SVijay Mahadevan     SETERRQ(PetscObjectComm((PetscObject)dm), PETSC_ERR_SUP, "HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5");
1451304006b3SVijay Mahadevan #endif
14529371c9d4SSatish Balay   } else if (isvtk) {
14539566063dSJacob Faibussowitsch     PetscCall(DMMoabView_VTK(dm, viewer));
1454304006b3SVijay Mahadevan   }
14553ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1456304006b3SVijay Mahadevan }
1457304006b3SVijay Mahadevan 
1458d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMInitialize_Moab(DM dm)
1459d71ae5a4SJacob Faibussowitsch {
1460304006b3SVijay Mahadevan   PetscFunctionBegin;
1461304006b3SVijay Mahadevan   dm->ops->view                     = DMView_Moab;
1462304006b3SVijay Mahadevan   dm->ops->load                     = NULL /* DMLoad_Moab */;
1463304006b3SVijay Mahadevan   dm->ops->setfromoptions           = DMSetFromOptions_Moab;
1464304006b3SVijay Mahadevan   dm->ops->clone                    = DMClone_Moab;
1465304006b3SVijay Mahadevan   dm->ops->setup                    = DMSetUp_Moab;
14661bb6d2a8SBarry Smith   dm->ops->createlocalsection       = NULL;
1467304006b3SVijay Mahadevan   dm->ops->createdefaultconstraints = NULL;
1468304006b3SVijay Mahadevan   dm->ops->createglobalvector       = DMCreateGlobalVector_Moab;
1469304006b3SVijay Mahadevan   dm->ops->createlocalvector        = DMCreateLocalVector_Moab;
1470304006b3SVijay Mahadevan   dm->ops->getlocaltoglobalmapping  = NULL;
1471304006b3SVijay Mahadevan   dm->ops->createfieldis            = NULL;
1472304006b3SVijay Mahadevan   dm->ops->createcoordinatedm       = NULL /* DMCreateCoordinateDM_Moab */;
1473304006b3SVijay Mahadevan   dm->ops->getcoloring              = NULL;
1474304006b3SVijay Mahadevan   dm->ops->creatematrix             = DMCreateMatrix_Moab;
1475304006b3SVijay Mahadevan   dm->ops->createinterpolation      = DMCreateInterpolation_Moab;
14765a84ad33SLisandro Dalcin   dm->ops->createinjection          = NULL /* DMCreateInjection_Moab */;
1477304006b3SVijay Mahadevan   dm->ops->refine                   = DMRefine_Moab;
1478304006b3SVijay Mahadevan   dm->ops->coarsen                  = DMCoarsen_Moab;
1479304006b3SVijay Mahadevan   dm->ops->refinehierarchy          = DMRefineHierarchy_Moab;
1480304006b3SVijay Mahadevan   dm->ops->coarsenhierarchy         = DMCoarsenHierarchy_Moab;
1481304006b3SVijay Mahadevan   dm->ops->globaltolocalbegin       = DMGlobalToLocalBegin_Moab;
1482304006b3SVijay Mahadevan   dm->ops->globaltolocalend         = DMGlobalToLocalEnd_Moab;
1483304006b3SVijay Mahadevan   dm->ops->localtoglobalbegin       = DMLocalToGlobalBegin_Moab;
1484304006b3SVijay Mahadevan   dm->ops->localtoglobalend         = DMLocalToGlobalEnd_Moab;
1485304006b3SVijay Mahadevan   dm->ops->destroy                  = DMDestroy_Moab;
1486304006b3SVijay Mahadevan   dm->ops->createsubdm              = NULL /* DMCreateSubDM_Moab */;
1487304006b3SVijay Mahadevan   dm->ops->getdimpoints             = NULL /* DMGetDimPoints_Moab */;
1488304006b3SVijay Mahadevan   dm->ops->locatepoints             = NULL /* DMLocatePoints_Moab */;
14893ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1490304006b3SVijay Mahadevan }
1491304006b3SVijay Mahadevan 
1492d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm)
1493d71ae5a4SJacob Faibussowitsch {
1494304006b3SVijay Mahadevan   PetscFunctionBegin;
1495304006b3SVijay Mahadevan   /* get all the necessary handles from the private DM object */
1496304006b3SVijay Mahadevan   (*newdm)->data = (DM_Moab *)dm->data;
1497304006b3SVijay Mahadevan   ((DM_Moab *)dm->data)->refct++;
1498304006b3SVijay Mahadevan 
14999566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)*newdm, DMMOAB));
15009566063dSJacob Faibussowitsch   PetscCall(DMInitialize_Moab(*newdm));
15013ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1502304006b3SVijay Mahadevan }
1503304006b3SVijay Mahadevan 
1504d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
1505d71ae5a4SJacob Faibussowitsch {
1506f6829af0SVijay Mahadevan   PetscFunctionBegin;
1507f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
15084dfa11a4SJacob Faibussowitsch   PetscCall(PetscNew((DM_Moab **)&dm->data));
1509f6829af0SVijay Mahadevan 
1510f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->bs            = 1;
1511f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->numFields     = 1;
1512f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->n             = 0;
1513f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->nloc          = 0;
1514f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->nghost        = 0;
1515f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->nele          = 0;
1516f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->neleloc       = 0;
1517f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->neleghost     = 0;
1518c528d872SBarry Smith   ((DM_Moab *)dm->data)->ltog_map      = NULL;
1519c528d872SBarry Smith   ((DM_Moab *)dm->data)->ltog_sendrecv = NULL;
1520f6829af0SVijay Mahadevan 
1521304006b3SVijay Mahadevan   ((DM_Moab *)dm->data)->refct  = 1;
1522304006b3SVijay Mahadevan   ((DM_Moab *)dm->data)->parent = NULL;
1523f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->vlocal = new moab::Range();
1524f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->vowned = new moab::Range();
1525f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->vghost = new moab::Range();
1526f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->elocal = new moab::Range();
1527f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->eghost = new moab::Range();
1528f6829af0SVijay Mahadevan 
15299566063dSJacob Faibussowitsch   PetscCall(DMInitialize_Moab(dm));
15303ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1531f6829af0SVijay Mahadevan }
1532