xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision a4e35b1925eceef64945ea472b84f2bf06a67b5e)
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
9c6ef30f9SVijay Mahadevan   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 
17a8d69d7bSBarry Smith   Reference: https://www.mcs.anl.gov/~fathom/moab-docs/html/contents.html
18c6ef30f9SVijay Mahadevan 
19c6ef30f9SVijay Mahadevan   Level: intermediate
20c6ef30f9SVijay Mahadevan 
21db781477SPatrick Sanan .seealso: `DMType`, `DMMoabCreate()`, `DMCreate()`, `DMSetType()`, `DMMoabCreateMoab()`
22c6ef30f9SVijay Mahadevan M*/
23c6ef30f9SVijay Mahadevan 
24304006b3SVijay Mahadevan /* External function declarations here */
25304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInterpolation_Moab(DM dmCoarse, DM dmFine, Mat *interpolation, Vec *scaling);
26304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateDefaultConstraints_Moab(DM dm);
27304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm, Mat *J);
28304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateCoordinateDM_Moab(DM dm, DM *cdm);
29304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefine_Moab(DM dm, MPI_Comm comm, DM *dmRefined);
30304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsen_Moab(DM dm, MPI_Comm comm, DM *dmCoarsened);
31304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefineHierarchy_Moab(DM dm, PetscInt nlevels, DM dmRefined[]);
32304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsenHierarchy_Moab(DM dm, PetscInt nlevels, DM dmCoarsened[]);
33304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm);
34304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateGlobalVector_Moab(DM, Vec *);
35304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateLocalVector_Moab(DM, Vec *);
36304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm, Mat *J);
37304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalBegin_Moab(DM, Vec, InsertMode, Vec);
38304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalEnd_Moab(DM, Vec, InsertMode, Vec);
39304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalBegin_Moab(DM, Vec, InsertMode, Vec);
40304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalEnd_Moab(DM, Vec, InsertMode, Vec);
41304006b3SVijay Mahadevan 
42304006b3SVijay Mahadevan /* Un-implemented routines */
43304006b3SVijay Mahadevan /*
441bb6d2a8SBarry Smith PETSC_EXTERN PetscErrorCode DMCreatelocalsection_Moab(DM dm);
45304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInjection_Moab(DM dmCoarse, DM dmFine, Mat *mat);
46304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLoad_Moab(DM dm, PetscViewer viewer);
47304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGetDimPoints_Moab(DM dm, PetscInt dim, PetscInt *pStart, PetscInt *pEnd);
48304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateSubDM_Moab(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm);
49304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocatePoints_Moab(DM dm, Vec v, IS *cellIS);
50304006b3SVijay Mahadevan */
51c6ef30f9SVijay Mahadevan 
52cab5ea25SPierre Jolivet /*@C
531d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
541d72bce8STim Tautges 
55d083f849SBarry Smith   Collective
561d72bce8STim Tautges 
571d72bce8STim Tautges   Input Parameter:
581d72bce8STim Tautges . comm - The communicator for the DMMoab object
591d72bce8STim Tautges 
601d72bce8STim Tautges   Output Parameter:
61032b8ab6SVijay Mahadevan . dmb - The DMMoab object
621d72bce8STim Tautges 
631d72bce8STim Tautges   Level: beginner
641d72bce8STim Tautges 
65*a4e35b19SJacob Faibussowitsch .seealso: `DMMoabCreateMoab()`
661d72bce8STim Tautges @*/
67d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
68d71ae5a4SJacob Faibussowitsch {
691d72bce8STim Tautges   PetscFunctionBegin;
704f572ea9SToby Isaac   PetscAssertPointer(dmb, 2);
719566063dSJacob Faibussowitsch   PetscCall(DMCreate(comm, dmb));
729566063dSJacob Faibussowitsch   PetscCall(DMSetType(*dmb, DMMOAB));
733ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
741d72bce8STim Tautges }
751d72bce8STim Tautges 
76cab5ea25SPierre Jolivet /*@C
77b117cd09SVijay Mahadevan   DMMoabCreateMoab - Creates a DMMoab object, optionally from an instance and other data
781d72bce8STim Tautges 
79d083f849SBarry Smith   Collective
801d72bce8STim Tautges 
81d8d19677SJose E. Roman   Input Parameters:
82a2b725a8SWilliam Gropp + comm     - The communicator for the DMMoab object
83032b8ab6SVijay Mahadevan . mbiface  - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
84a4d2169cSTim Tautges          along with the DMMoab
851d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
86a2b725a8SWilliam Gropp - range    - If non-NULL, contains range of entities to which DOFs will be assigned
871d72bce8STim Tautges 
881d72bce8STim Tautges   Output Parameter:
89032b8ab6SVijay Mahadevan . dmb - The DMMoab object
901d72bce8STim Tautges 
91032b8ab6SVijay Mahadevan   Level: intermediate
921d72bce8STim Tautges 
93*a4e35b19SJacob Faibussowitsch .seealso: `DMMoabCreate()`
941d72bce8STim Tautges @*/
95d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
96d71ae5a4SJacob Faibussowitsch {
97032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
9885d305f5SVijay Mahadevan   DM              dmmb;
99853cdec3SJed Brown   DM_Moab        *dmmoab;
1001d72bce8STim Tautges 
1011d72bce8STim Tautges   PetscFunctionBegin;
1024f572ea9SToby Isaac   PetscAssertPointer(dmb, 6);
10385d305f5SVijay Mahadevan 
1049566063dSJacob Faibussowitsch   PetscCall(DMMoabCreate(comm, &dmmb));
10585d305f5SVijay Mahadevan   dmmoab = (DM_Moab *)(dmmb)->data;
106a4d2169cSTim Tautges 
107a4d2169cSTim Tautges   if (!mbiface) {
10872ff976dSVijay Mahadevan     dmmoab->mbiface          = new moab::Core();
1097d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
1109371c9d4SSatish Balay   } else {
1111cec0304SVijay Mahadevan     dmmoab->mbiface          = mbiface;
1127d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
1131cec0304SVijay Mahadevan   }
1141cec0304SVijay Mahadevan 
115b5410836SVijay Mahadevan   /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */
116b5410836SVijay Mahadevan   dmmoab->fileset     = 0;
117b117cd09SVijay Mahadevan   dmmoab->hlevel      = 0;
11849d66b22SVijay Mahadevan   dmmoab->nghostrings = 0;
1197d89fc02STim Tautges 
1209daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1219daf19fdSVijay Mahadevan   moab::EntityHandle partnset;
122032b8ab6SVijay Mahadevan 
123db66d124SVijay Mahadevan   /* Create root sets for each mesh.  Then pass these
124db66d124SVijay Mahadevan       to the load_file functions to be populated. */
1259371c9d4SSatish Balay   merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);
1269371c9d4SSatish Balay   MBERR("Creating partition set failed", merr);
127032b8ab6SVijay Mahadevan 
128db66d124SVijay Mahadevan   /* Create the parallel communicator object with the partition handle associated with MOAB */
12972ff976dSVijay Mahadevan   dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
1309daf19fdSVijay Mahadevan #endif
131032b8ab6SVijay Mahadevan 
1324973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
1334973de03SVijay Mahadevan   dmmoab->bs        = 1;
134addae81cSVijay Mahadevan   dmmoab->numFields = 1;
1359566063dSJacob Faibussowitsch   PetscCall(PetscMalloc(dmmoab->numFields * sizeof(char *), &dmmoab->fieldNames));
1369566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy("DEFAULT", (char **)&dmmoab->fieldNames[0]));
1372e4e7c01SVijay Mahadevan   dmmoab->rw_dbglevel            = 0;
1382e4e7c01SVijay Mahadevan   dmmoab->partition_by_rank      = PETSC_FALSE;
1392e4e7c01SVijay Mahadevan   dmmoab->extra_read_options[0]  = '\0';
1402e4e7c01SVijay Mahadevan   dmmoab->extra_write_options[0] = '\0';
1412e4e7c01SVijay Mahadevan   dmmoab->read_mode              = READ_PART;
1422e4e7c01SVijay Mahadevan   dmmoab->write_mode             = WRITE_PART;
1434973de03SVijay Mahadevan 
1444973de03SVijay Mahadevan   /* set global ID tag handle */
1451a845d2aSVijay Mahadevan   if (ltog_tag && *ltog_tag) {
1469566063dSJacob Faibussowitsch     PetscCall(DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag));
1479371c9d4SSatish Balay   } else {
1489371c9d4SSatish Balay     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);
1499371c9d4SSatish Balay     MBERRNM(merr);
1501a845d2aSVijay Mahadevan     if (ltog_tag) *ltog_tag = dmmoab->ltog_tag;
151a4d2169cSTim Tautges   }
152a4d2169cSTim Tautges 
1539371c9d4SSatish Balay   merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag);
1549371c9d4SSatish Balay   MBERRNM(merr);
155340f3b9aSVijay Mahadevan 
1564973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
15748a46eb9SPierre Jolivet   if (range) PetscCall(DMMoabSetLocalVertices(dmmb, range));
15885d305f5SVijay Mahadevan   *dmb = dmmb;
1593ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1601d72bce8STim Tautges }
1611d72bce8STim Tautges 
1629daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1631d72bce8STim Tautges 
164cab5ea25SPierre Jolivet /*@C
165aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
166aa768e4cSTim Tautges 
167d083f849SBarry Smith   Collective
168aa768e4cSTim Tautges 
169aa768e4cSTim Tautges   Input Parameter:
170aa768e4cSTim Tautges . dm    - The DMMoab object being set
171aa768e4cSTim Tautges 
172aa768e4cSTim Tautges   Output Parameter:
173aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
174aa768e4cSTim Tautges 
175aa768e4cSTim Tautges   Level: beginner
176aa768e4cSTim Tautges 
177*a4e35b19SJacob Faibussowitsch .seealso: `DMMoabSetInterface()`
178aa768e4cSTim Tautges @*/
179d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetParallelComm(DM dm, moab::ParallelComm **pcomm)
180d71ae5a4SJacob Faibussowitsch {
1811d72bce8STim Tautges   PetscFunctionBegin;
1821d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
183032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab *)(dm)->data)->pcomm;
1843ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1851d72bce8STim Tautges }
1861d72bce8STim Tautges 
1879daf19fdSVijay Mahadevan #endif /* MOAB_HAVE_MPI */
1889daf19fdSVijay Mahadevan 
189cab5ea25SPierre Jolivet /*@C
190aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
191aa768e4cSTim Tautges 
192d083f849SBarry Smith   Collective
193aa768e4cSTim Tautges 
194d8d19677SJose E. Roman   Input Parameters:
195a2b725a8SWilliam Gropp + dm      - The DMMoab object being set
196a2b725a8SWilliam Gropp - mbiface - The MOAB instance being set on this DMMoab
197aa768e4cSTim Tautges 
198aa768e4cSTim Tautges   Level: beginner
199aa768e4cSTim Tautges 
200*a4e35b19SJacob Faibussowitsch .seealso: `DMMoabGetInterface()`
201aa768e4cSTim Tautges @*/
202d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetInterface(DM dm, moab::Interface *mbiface)
203d71ae5a4SJacob Faibussowitsch {
204032b8ab6SVijay Mahadevan   DM_Moab *dmmoab = (DM_Moab *)(dm)->data;
205032b8ab6SVijay Mahadevan 
2061d72bce8STim Tautges   PetscFunctionBegin;
2071d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2084f572ea9SToby Isaac   PetscAssertPointer(mbiface, 2);
2099daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
210032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
2119daf19fdSVijay Mahadevan #endif
212032b8ab6SVijay Mahadevan   dmmoab->mbiface          = mbiface;
213032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
2143ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2151d72bce8STim Tautges }
2161d72bce8STim Tautges 
217cab5ea25SPierre Jolivet /*@C
218aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
219aa768e4cSTim Tautges 
220d083f849SBarry Smith   Collective
221aa768e4cSTim Tautges 
222aa768e4cSTim Tautges   Input Parameter:
223aa768e4cSTim Tautges . dm - The DMMoab object being set
224aa768e4cSTim Tautges 
225aa768e4cSTim Tautges   Output Parameter:
226aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
227aa768e4cSTim Tautges 
228aa768e4cSTim Tautges   Level: beginner
229aa768e4cSTim Tautges 
230*a4e35b19SJacob Faibussowitsch .seealso: `DMMoabSetInterface()`
231aa768e4cSTim Tautges @*/
232d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetInterface(DM dm, moab::Interface **mbiface)
233d71ae5a4SJacob Faibussowitsch {
234cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
235cabb514dSBarry Smith 
2361d72bce8STim Tautges   PetscFunctionBegin;
2371d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2389371c9d4SSatish 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, "
2399371c9d4SSatish Balay                                    "K. and Stimpson, C. and Ernst, C.},\n  year = {2004},  note = {Report}\n}\n",
2409371c9d4SSatish Balay                                    &cite));
241a4d2169cSTim Tautges   *mbiface = ((DM_Moab *)dm->data)->mbiface;
2423ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2431d72bce8STim Tautges }
2441d72bce8STim Tautges 
245cab5ea25SPierre Jolivet /*@C
2465eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
247aa768e4cSTim Tautges 
248d083f849SBarry Smith   Collective
249aa768e4cSTim Tautges 
250d8d19677SJose E. Roman   Input Parameters:
251a2b725a8SWilliam Gropp + dm    - The DMMoab object being set
252a2b725a8SWilliam Gropp - range - The entities treated by this DMMoab
253aa768e4cSTim Tautges 
254aa768e4cSTim Tautges   Level: beginner
255aa768e4cSTim Tautges 
256*a4e35b19SJacob Faibussowitsch .seealso: `DMMoabGetAllVertices()`
257aa768e4cSTim Tautges @*/
258d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetLocalVertices(DM dm, moab::Range *range)
259d71ae5a4SJacob Faibussowitsch {
260fd3326ddSVijay Mahadevan   moab::Range tmpvtxs;
261032b8ab6SVijay Mahadevan   DM_Moab    *dmmoab = (DM_Moab *)(dm)->data;
262032b8ab6SVijay Mahadevan 
2631d72bce8STim Tautges   PetscFunctionBegin;
2641d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
265032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
266032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
267fd3326ddSVijay Mahadevan 
268032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
269fd3326ddSVijay Mahadevan 
2709daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
2719daf19fdSVijay Mahadevan   moab::ErrorCode merr;
272fd3326ddSVijay Mahadevan   /* filter based on parallel status */
2739371c9d4SSatish Balay   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned);
2749371c9d4SSatish Balay   MBERRNM(merr);
275fd3326ddSVijay Mahadevan 
276fd3326ddSVijay Mahadevan   /* filter all the non-owned and shared entities out of the list */
277fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
2789371c9d4SSatish Balay   merr    = dmmoab->pcomm->filter_pstatus(tmpvtxs, PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost);
2799371c9d4SSatish Balay   MBERRNM(merr);
280fd3326ddSVijay Mahadevan   tmpvtxs         = moab::subtract(tmpvtxs, *dmmoab->vghost);
281fd3326ddSVijay Mahadevan   *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs);
2829daf19fdSVijay Mahadevan #else
2839daf19fdSVijay Mahadevan   *dmmoab->vowned = *dmmoab->vlocal;
2849daf19fdSVijay Mahadevan #endif
285fd3326ddSVijay Mahadevan 
286fd3326ddSVijay Mahadevan   /* compute and cache the sizes of local and ghosted entities */
287032b8ab6SVijay Mahadevan   dmmoab->nloc   = dmmoab->vowned->size();
288032b8ab6SVijay Mahadevan   dmmoab->nghost = dmmoab->vghost->size();
2899daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
2901c2dc1cbSBarry Smith   PetscCall(MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm));
2919daf19fdSVijay Mahadevan #else
2929daf19fdSVijay Mahadevan   dmmoab->n       = dmmoab->nloc;
2939daf19fdSVijay Mahadevan #endif
2943ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2951d72bce8STim Tautges }
2961d72bce8STim Tautges 
297cab5ea25SPierre Jolivet /*@C
2988d8d51c8SVijay Mahadevan   DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab
2998d8d51c8SVijay Mahadevan 
300d083f849SBarry Smith   Collective
3018d8d51c8SVijay Mahadevan 
3028d8d51c8SVijay Mahadevan   Input Parameter:
3038d8d51c8SVijay Mahadevan . dm - The DMMoab object being set
3048d8d51c8SVijay Mahadevan 
3058d8d51c8SVijay Mahadevan   Output Parameter:
30660225df5SJacob Faibussowitsch . local - The local vertex entities in this DMMoab = (owned+ghosted)
3078d8d51c8SVijay Mahadevan 
3088d8d51c8SVijay Mahadevan   Level: beginner
3098d8d51c8SVijay Mahadevan 
310*a4e35b19SJacob Faibussowitsch .seealso: `DMMoabGetLocalVertices()`
3118d8d51c8SVijay Mahadevan @*/
312d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetAllVertices(DM dm, moab::Range *local)
313d71ae5a4SJacob Faibussowitsch {
3148d8d51c8SVijay Mahadevan   PetscFunctionBegin;
3158d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
3168d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab *)dm->data)->vlocal;
3173ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3188d8d51c8SVijay Mahadevan }
3198d8d51c8SVijay Mahadevan 
320cab5ea25SPierre Jolivet /*@C
3215eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
322aa768e4cSTim Tautges 
323d083f849SBarry Smith   Collective
324aa768e4cSTim Tautges 
325aa768e4cSTim Tautges   Input Parameter:
326aa768e4cSTim Tautges . dm - The DMMoab object being set
327aa768e4cSTim Tautges 
328a2b725a8SWilliam Gropp   Output Parameters:
329a2b725a8SWilliam Gropp + owned - The owned vertex entities in this DMMoab
330a2b725a8SWilliam Gropp - ghost - The ghosted entities (non-owned) stored locally in this partition
331aa768e4cSTim Tautges 
332aa768e4cSTim Tautges   Level: beginner
333aa768e4cSTim Tautges 
334*a4e35b19SJacob Faibussowitsch .seealso: `DMMoabGetAllVertices()`
335aa768e4cSTim Tautges @*/
336d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetLocalVertices(DM dm, const moab::Range **owned, const moab::Range **ghost)
337d71ae5a4SJacob Faibussowitsch {
3381d72bce8STim Tautges   PetscFunctionBegin;
3391d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
340351b8a77SVijay Mahadevan   if (owned) *owned = ((DM_Moab *)dm->data)->vowned;
341351b8a77SVijay Mahadevan   if (ghost) *ghost = ((DM_Moab *)dm->data)->vghost;
3423ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3431d72bce8STim Tautges }
3441d72bce8STim Tautges 
345cab5ea25SPierre Jolivet /*@C
3465eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
3475eb88e9dSVijay Mahadevan 
348d083f849SBarry Smith   Collective
3495eb88e9dSVijay Mahadevan 
3505eb88e9dSVijay Mahadevan   Input Parameter:
3515eb88e9dSVijay Mahadevan . dm - The DMMoab object being set
3525eb88e9dSVijay Mahadevan 
3535eb88e9dSVijay Mahadevan   Output Parameter:
3545eb88e9dSVijay Mahadevan . range - The entities owned locally
3555eb88e9dSVijay Mahadevan 
3565eb88e9dSVijay Mahadevan   Level: beginner
3575eb88e9dSVijay Mahadevan 
358*a4e35b19SJacob Faibussowitsch .seealso: `DMMoabSetLocalElements()`
3595eb88e9dSVijay Mahadevan @*/
360d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetLocalElements(DM dm, const moab::Range **range)
361d71ae5a4SJacob Faibussowitsch {
3625eb88e9dSVijay Mahadevan   PetscFunctionBegin;
3635eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
364351b8a77SVijay Mahadevan   if (range) *range = ((DM_Moab *)dm->data)->elocal;
3653ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3661cec0304SVijay Mahadevan }
3671cec0304SVijay Mahadevan 
368cab5ea25SPierre Jolivet /*@C
3691cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
3701cec0304SVijay Mahadevan 
371d083f849SBarry Smith   Collective
3721cec0304SVijay Mahadevan 
373a2b725a8SWilliam Gropp   Input Parameters:
374a2b725a8SWilliam Gropp + dm    - The DMMoab object being set
375a2b725a8SWilliam Gropp - range - The entities treated by this DMMoab
3761cec0304SVijay Mahadevan 
3771cec0304SVijay Mahadevan   Level: beginner
3781cec0304SVijay Mahadevan 
379*a4e35b19SJacob Faibussowitsch .seealso: `DMMoabGetLocalElements()`
3801cec0304SVijay Mahadevan @*/
381d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetLocalElements(DM dm, moab::Range *range)
382d71ae5a4SJacob Faibussowitsch {
3831cec0304SVijay Mahadevan   DM_Moab *dmmoab = (DM_Moab *)(dm)->data;
3841cec0304SVijay Mahadevan 
3851cec0304SVijay Mahadevan   PetscFunctionBegin;
3861cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
3871cec0304SVijay Mahadevan   dmmoab->elocal->clear();
3881cec0304SVijay Mahadevan   dmmoab->eghost->clear();
3891cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
3909daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
3919daf19fdSVijay Mahadevan   moab::ErrorCode merr;
3929371c9d4SSatish Balay   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT);
3939371c9d4SSatish Balay   MBERRNM(merr);
3941cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
3959daf19fdSVijay Mahadevan #endif
3961cec0304SVijay Mahadevan   dmmoab->neleloc   = dmmoab->elocal->size();
39741dd5348SVijay Mahadevan   dmmoab->neleghost = dmmoab->eghost->size();
3989daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
3991c2dc1cbSBarry Smith   PetscCall(MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm));
4003ba16761SJacob Faibussowitsch   PetscCall(PetscInfo(dm, "Created %" PetscInt_FMT " local and %" PetscInt_FMT " global elements.\n", dmmoab->neleloc, dmmoab->nele));
4019daf19fdSVijay Mahadevan #else
4029daf19fdSVijay Mahadevan   dmmoab->nele    = dmmoab->neleloc;
4039daf19fdSVijay Mahadevan #endif
4043ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4055eb88e9dSVijay Mahadevan }
4065eb88e9dSVijay Mahadevan 
407cab5ea25SPierre Jolivet /*@C
408aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
409aa768e4cSTim Tautges 
410d083f849SBarry Smith   Collective
411aa768e4cSTim Tautges 
412a2b725a8SWilliam Gropp   Input Parameters:
413a2b725a8SWilliam Gropp + dm      - The DMMoab object being set
414a2b725a8SWilliam Gropp - ltogtag - The MOAB tag used for local to global ids
415aa768e4cSTim Tautges 
416aa768e4cSTim Tautges   Level: beginner
417aa768e4cSTim Tautges 
418*a4e35b19SJacob Faibussowitsch .seealso: `DMMoabGetLocalToGlobalTag()`
419aa768e4cSTim Tautges @*/
420d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm, moab::Tag ltogtag)
421d71ae5a4SJacob Faibussowitsch {
4221d72bce8STim Tautges   PetscFunctionBegin;
4231d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4241d72bce8STim Tautges   ((DM_Moab *)dm->data)->ltog_tag = ltogtag;
4253ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4261d72bce8STim Tautges }
4271d72bce8STim Tautges 
428cab5ea25SPierre Jolivet /*@C
429aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
430aa768e4cSTim Tautges 
431d083f849SBarry Smith   Collective
432aa768e4cSTim Tautges 
433aa768e4cSTim Tautges   Input Parameter:
434aa768e4cSTim Tautges . dm - The DMMoab object being set
435aa768e4cSTim Tautges 
436aa768e4cSTim Tautges   Output Parameter:
43760225df5SJacob Faibussowitsch . ltog_tag - The MOAB tag used for local to global ids
438aa768e4cSTim Tautges 
439aa768e4cSTim Tautges   Level: beginner
440aa768e4cSTim Tautges 
441*a4e35b19SJacob Faibussowitsch .seealso: `DMMoabSetLocalToGlobalTag()`
442aa768e4cSTim Tautges @*/
443d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm, moab::Tag *ltog_tag)
444d71ae5a4SJacob Faibussowitsch {
4451d72bce8STim Tautges   PetscFunctionBegin;
4461d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4471d72bce8STim Tautges   *ltog_tag = ((DM_Moab *)dm->data)->ltog_tag;
4483ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4491d72bce8STim Tautges }
4501d72bce8STim Tautges 
451cab5ea25SPierre Jolivet /*@C
452aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
453aa768e4cSTim Tautges 
454d083f849SBarry Smith   Collective
455aa768e4cSTim Tautges 
456d8d19677SJose E. Roman   Input Parameters:
457a2b725a8SWilliam Gropp + dm - The DMMoab object being set
458a2b725a8SWilliam Gropp - bs - The block size used with this DMMoab
459aa768e4cSTim Tautges 
460aa768e4cSTim Tautges   Level: beginner
461aa768e4cSTim Tautges 
462*a4e35b19SJacob Faibussowitsch .seealso: `DMMoabGetBlockSize()`
463aa768e4cSTim Tautges @*/
464d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetBlockSize(DM dm, PetscInt bs)
465d71ae5a4SJacob Faibussowitsch {
4661d72bce8STim Tautges   PetscFunctionBegin;
4671d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4681d72bce8STim Tautges   ((DM_Moab *)dm->data)->bs = bs;
4693ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4701d72bce8STim Tautges }
4711d72bce8STim Tautges 
472cab5ea25SPierre Jolivet /*@C
473aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
474aa768e4cSTim Tautges 
475d083f849SBarry Smith   Collective
476aa768e4cSTim Tautges 
477aa768e4cSTim Tautges   Input Parameter:
478aa768e4cSTim Tautges . dm - The DMMoab object being set
479aa768e4cSTim Tautges 
480aa768e4cSTim Tautges   Output Parameter:
481aa768e4cSTim Tautges . bs - The block size used with this DMMoab
482aa768e4cSTim Tautges 
483aa768e4cSTim Tautges   Level: beginner
484aa768e4cSTim Tautges 
485*a4e35b19SJacob Faibussowitsch .seealso: `DMMoabSetBlockSize()`
486aa768e4cSTim Tautges @*/
487d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetBlockSize(DM dm, PetscInt *bs)
488d71ae5a4SJacob Faibussowitsch {
4891d72bce8STim Tautges   PetscFunctionBegin;
4901d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4911d72bce8STim Tautges   *bs = ((DM_Moab *)dm->data)->bs;
4923ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4931d72bce8STim Tautges }
4941d72bce8STim Tautges 
495cab5ea25SPierre Jolivet /*@C
496212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
497212ad6d1SVijay Mahadevan 
498d083f849SBarry Smith   Collective on dm
499212ad6d1SVijay Mahadevan 
500212ad6d1SVijay Mahadevan   Input Parameter:
501212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
502212ad6d1SVijay Mahadevan 
503d8d19677SJose E. Roman   Output Parameters:
504a2b725a8SWilliam Gropp + neg - The number of global elements in the DMMoab instance
505a2b725a8SWilliam Gropp - nvg - The number of global vertices in the DMMoab instance
506212ad6d1SVijay Mahadevan 
507212ad6d1SVijay Mahadevan   Level: beginner
508212ad6d1SVijay Mahadevan 
509*a4e35b19SJacob Faibussowitsch .seealso: `DMMoabGetLocalSize()`
510212ad6d1SVijay Mahadevan @*/
511d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetSize(DM dm, PetscInt *neg, PetscInt *nvg)
512d71ae5a4SJacob Faibussowitsch {
513212ad6d1SVijay Mahadevan   PetscFunctionBegin;
514212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
51541dd5348SVijay Mahadevan   if (neg) *neg = ((DM_Moab *)dm->data)->nele;
51641dd5348SVijay Mahadevan   if (nvg) *nvg = ((DM_Moab *)dm->data)->n;
5173ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
518212ad6d1SVijay Mahadevan }
519212ad6d1SVijay Mahadevan 
520cab5ea25SPierre Jolivet /*@C
521212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
522212ad6d1SVijay Mahadevan 
523d083f849SBarry Smith   Collective on dm
524212ad6d1SVijay Mahadevan 
525212ad6d1SVijay Mahadevan   Input Parameter:
526212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
527212ad6d1SVijay Mahadevan 
528d8d19677SJose E. Roman   Output Parameters:
529b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor
53000cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor
53100cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor
532a2b725a8SWilliam Gropp - nvg - The number of ghosted vertices in this processor
533212ad6d1SVijay Mahadevan 
534212ad6d1SVijay Mahadevan   Level: beginner
535212ad6d1SVijay Mahadevan 
536*a4e35b19SJacob Faibussowitsch .seealso: `DMMoabGetSize()`
537212ad6d1SVijay Mahadevan @*/
538d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetLocalSize(DM dm, PetscInt *nel, PetscInt *neg, PetscInt *nvl, PetscInt *nvg)
539d71ae5a4SJacob Faibussowitsch {
540212ad6d1SVijay Mahadevan   PetscFunctionBegin;
541212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
54241dd5348SVijay Mahadevan   if (nel) *nel = ((DM_Moab *)dm->data)->neleloc;
54341dd5348SVijay Mahadevan   if (neg) *neg = ((DM_Moab *)dm->data)->neleghost;
54441dd5348SVijay Mahadevan   if (nvl) *nvl = ((DM_Moab *)dm->data)->nloc;
54541dd5348SVijay Mahadevan   if (nvg) *nvg = ((DM_Moab *)dm->data)->nghost;
5463ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
547212ad6d1SVijay Mahadevan }
548212ad6d1SVijay Mahadevan 
549cab5ea25SPierre Jolivet /*@C
55000cc10feSVijay Mahadevan   DMMoabGetOffset - Get the local offset for the global vector
55100cc10feSVijay Mahadevan 
552d083f849SBarry Smith   Collective
55300cc10feSVijay Mahadevan 
55400cc10feSVijay Mahadevan   Input Parameter:
55500cc10feSVijay Mahadevan . dm - The DMMoab object being set
55600cc10feSVijay Mahadevan 
55700cc10feSVijay Mahadevan   Output Parameter:
55800cc10feSVijay Mahadevan . offset - The local offset for the global vector
55900cc10feSVijay Mahadevan 
56000cc10feSVijay Mahadevan   Level: beginner
56100cc10feSVijay Mahadevan 
562*a4e35b19SJacob Faibussowitsch .seealso: `DMMoabGetDimension()`
56300cc10feSVijay Mahadevan @*/
564d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetOffset(DM dm, PetscInt *offset)
565d71ae5a4SJacob Faibussowitsch {
56600cc10feSVijay Mahadevan   PetscFunctionBegin;
56700cc10feSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
56800cc10feSVijay Mahadevan   *offset = ((DM_Moab *)dm->data)->vstart;
5693ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
57000cc10feSVijay Mahadevan }
57100cc10feSVijay Mahadevan 
572cab5ea25SPierre Jolivet /*@C
5734920ab11SVijay Mahadevan   DMMoabGetDimension - Get the dimension of the DM Mesh
5744920ab11SVijay Mahadevan 
575d083f849SBarry Smith   Collective
5764920ab11SVijay Mahadevan 
5774920ab11SVijay Mahadevan   Input Parameter:
578340f3b9aSVijay Mahadevan . dm - The DMMoab object
5794920ab11SVijay Mahadevan 
5804920ab11SVijay Mahadevan   Output Parameter:
5814920ab11SVijay Mahadevan . dim - The dimension of DM
5824920ab11SVijay Mahadevan 
5834920ab11SVijay Mahadevan   Level: beginner
5844920ab11SVijay Mahadevan 
585*a4e35b19SJacob Faibussowitsch .seealso: `DMMoabGetOffset()`
5864920ab11SVijay Mahadevan @*/
587d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetDimension(DM dm, PetscInt *dim)
588d71ae5a4SJacob Faibussowitsch {
5894920ab11SVijay Mahadevan   PetscFunctionBegin;
5904920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
5914920ab11SVijay Mahadevan   *dim = ((DM_Moab *)dm->data)->dim;
5923ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5934920ab11SVijay Mahadevan }
5944920ab11SVijay Mahadevan 
595cab5ea25SPierre Jolivet /*@C
596755f3dfbSVijay Mahadevan   DMMoabGetHierarchyLevel - Get the current level of the mesh hierarchy
597755f3dfbSVijay Mahadevan   generated through uniform refinement.
598755f3dfbSVijay Mahadevan 
599d083f849SBarry Smith   Collective on dm
600755f3dfbSVijay Mahadevan 
601755f3dfbSVijay Mahadevan   Input Parameter:
602755f3dfbSVijay Mahadevan . dm - The DMMoab object being set
603755f3dfbSVijay Mahadevan 
604755f3dfbSVijay Mahadevan   Output Parameter:
60560225df5SJacob Faibussowitsch . nlevel - The current mesh hierarchy level
606755f3dfbSVijay Mahadevan 
607755f3dfbSVijay Mahadevan   Level: beginner
608755f3dfbSVijay Mahadevan 
609*a4e35b19SJacob Faibussowitsch .seealso: `DMMoabGetMaterialBlock()`
610755f3dfbSVijay Mahadevan @*/
611d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetHierarchyLevel(DM dm, PetscInt *nlevel)
612d71ae5a4SJacob Faibussowitsch {
613755f3dfbSVijay Mahadevan   PetscFunctionBegin;
614755f3dfbSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
615755f3dfbSVijay Mahadevan   if (nlevel) *nlevel = ((DM_Moab *)dm->data)->hlevel;
6163ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
617755f3dfbSVijay Mahadevan }
618755f3dfbSVijay Mahadevan 
619cab5ea25SPierre Jolivet /*@C
620340f3b9aSVijay Mahadevan   DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh
621340f3b9aSVijay Mahadevan 
622d083f849SBarry Smith   Collective
623340f3b9aSVijay Mahadevan 
624d8d19677SJose E. Roman   Input Parameters:
625a2b725a8SWilliam Gropp + dm      - The DMMoab object
626a2b725a8SWilliam Gropp - ehandle - The element entity handle
627340f3b9aSVijay Mahadevan 
628340f3b9aSVijay Mahadevan   Output Parameter:
629340f3b9aSVijay Mahadevan . mat - The material ID for the current entity
630340f3b9aSVijay Mahadevan 
631340f3b9aSVijay Mahadevan   Level: beginner
632340f3b9aSVijay Mahadevan 
633*a4e35b19SJacob Faibussowitsch .seealso: `DMMoabGetHierarchyLevel()`
634340f3b9aSVijay Mahadevan @*/
635d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetMaterialBlock(DM dm, const moab::EntityHandle ehandle, PetscInt *mat)
636d71ae5a4SJacob Faibussowitsch {
637340f3b9aSVijay Mahadevan   DM_Moab *dmmoab;
638340f3b9aSVijay Mahadevan 
639340f3b9aSVijay Mahadevan   PetscFunctionBegin;
640340f3b9aSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
641340f3b9aSVijay Mahadevan   if (*mat) {
642340f3b9aSVijay Mahadevan     dmmoab = (DM_Moab *)(dm)->data;
643a044f6b6SVijay Mahadevan     *mat   = dmmoab->materials[dmmoab->elocal->index(ehandle)];
644340f3b9aSVijay Mahadevan   }
6453ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
646340f3b9aSVijay Mahadevan }
647340f3b9aSVijay Mahadevan 
648cab5ea25SPierre Jolivet /*@C
64985d305f5SVijay Mahadevan   DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities
65085d305f5SVijay Mahadevan 
651d083f849SBarry Smith   Collective
65285d305f5SVijay Mahadevan 
653d8d19677SJose E. Roman   Input Parameters:
654a2b725a8SWilliam Gropp + dm    - The DMMoab object
65585d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
656a2b725a8SWilliam Gropp - conn  - The vertex entity handles
65785d305f5SVijay Mahadevan 
65885d305f5SVijay Mahadevan   Output Parameter:
65985d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities
66085d305f5SVijay Mahadevan 
66185d305f5SVijay Mahadevan   Level: beginner
66285d305f5SVijay Mahadevan 
663db781477SPatrick Sanan .seealso: `DMMoabGetVertexConnectivity()`
66485d305f5SVijay Mahadevan @*/
665d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetVertexCoordinates(DM dm, PetscInt nconn, const moab::EntityHandle *conn, PetscReal *vpos)
666d71ae5a4SJacob Faibussowitsch {
6677023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
6687023aa44SVijay Mahadevan   moab::ErrorCode merr;
6697023aa44SVijay Mahadevan 
6707023aa44SVijay Mahadevan   PetscFunctionBegin;
6717023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
6724f572ea9SToby Isaac   PetscAssertPointer(conn, 3);
6734f572ea9SToby Isaac   PetscAssertPointer(vpos, 4);
6747023aa44SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
6757023aa44SVijay Mahadevan 
6767023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
6779c368985SVijay Mahadevan   if (dmmoab->hlevel) {
6789371c9d4SSatish Balay     merr = dmmoab->hierarchy->get_coordinates(const_cast<moab::EntityHandle *>(conn), nconn, dmmoab->hlevel, vpos);
6799371c9d4SSatish Balay     MBERRNM(merr);
6809371c9d4SSatish Balay   } else {
6819371c9d4SSatish Balay     merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);
6829371c9d4SSatish Balay     MBERRNM(merr);
6839c368985SVijay Mahadevan   }
6843ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6857023aa44SVijay Mahadevan }
6867023aa44SVijay Mahadevan 
687cab5ea25SPierre Jolivet /*@C
68885d305f5SVijay Mahadevan   DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity
68985d305f5SVijay Mahadevan 
690d083f849SBarry Smith   Collective
69185d305f5SVijay Mahadevan 
692d8d19677SJose E. Roman   Input Parameters:
693a2b725a8SWilliam Gropp + dm      - The DMMoab object
694a2b725a8SWilliam Gropp - vhandle - Vertex entity handle
69585d305f5SVijay Mahadevan 
696d8d19677SJose E. Roman   Output Parameters:
697a2b725a8SWilliam Gropp + nconn - Number of entities whose coordinates are needed
698a2b725a8SWilliam Gropp - conn  - The vertex entity handles
69985d305f5SVijay Mahadevan 
70085d305f5SVijay Mahadevan   Level: beginner
70185d305f5SVijay Mahadevan 
702db781477SPatrick Sanan .seealso: `DMMoabGetVertexCoordinates()`, `DMMoabRestoreVertexConnectivity()`
70385d305f5SVijay Mahadevan @*/
704d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetVertexConnectivity(DM dm, moab::EntityHandle vhandle, PetscInt *nconn, moab::EntityHandle **conn)
705d71ae5a4SJacob Faibussowitsch {
7068d8d51c8SVijay Mahadevan   DM_Moab                        *dmmoab;
7078d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities, connect;
7088d8d51c8SVijay Mahadevan   moab::ErrorCode                 merr;
7098d8d51c8SVijay Mahadevan 
7108d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7118d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
7124f572ea9SToby Isaac   PetscAssertPointer(conn, 4);
7138d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
7148d8d51c8SVijay Mahadevan 
7158d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
7169371c9d4SSatish Balay   merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION);
7179371c9d4SSatish Balay   MBERRNM(merr);
7189371c9d4SSatish Balay   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0], adj_entities.size(), connect);
7199371c9d4SSatish Balay   MBERRNM(merr);
7208d8d51c8SVijay Mahadevan 
7218d8d51c8SVijay Mahadevan   if (conn) {
7229566063dSJacob Faibussowitsch     PetscCall(PetscMalloc(sizeof(moab::EntityHandle) * connect.size(), conn));
7239566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(*conn, &connect[0], connect.size()));
7248d8d51c8SVijay Mahadevan   }
7258d8d51c8SVijay Mahadevan   if (nconn) *nconn = connect.size();
7263ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7278d8d51c8SVijay Mahadevan }
7288d8d51c8SVijay Mahadevan 
729cab5ea25SPierre Jolivet /*@C
73085d305f5SVijay Mahadevan   DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity
73185d305f5SVijay Mahadevan 
732d083f849SBarry Smith   Collective
73385d305f5SVijay Mahadevan 
734d8d19677SJose E. Roman   Input Parameters:
735a2b725a8SWilliam Gropp + dm      - The DMMoab object
73660225df5SJacob Faibussowitsch . ehandle - Vertex entity handle
73785d305f5SVijay Mahadevan . nconn   - Number of entities whose coordinates are needed
738a2b725a8SWilliam Gropp - conn    - The vertex entity handles
73985d305f5SVijay Mahadevan 
74085d305f5SVijay Mahadevan   Level: beginner
74185d305f5SVijay Mahadevan 
742db781477SPatrick Sanan .seealso: `DMMoabGetVertexCoordinates()`, `DMMoabGetVertexConnectivity()`
74385d305f5SVijay Mahadevan @*/
744d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt *nconn, moab::EntityHandle **conn)
745d71ae5a4SJacob Faibussowitsch {
7468d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7478d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
7484f572ea9SToby Isaac   PetscAssertPointer(conn, 4);
7498d8d51c8SVijay Mahadevan 
75048a46eb9SPierre Jolivet   if (conn) PetscCall(PetscFree(*conn));
7518d8d51c8SVijay Mahadevan   if (nconn) *nconn = 0;
7523ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7538d8d51c8SVijay Mahadevan }
7548d8d51c8SVijay Mahadevan 
755cab5ea25SPierre Jolivet /*@C
75685d305f5SVijay Mahadevan   DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity
75785d305f5SVijay Mahadevan 
758d083f849SBarry Smith   Collective
75985d305f5SVijay Mahadevan 
760d8d19677SJose E. Roman   Input Parameters:
761a2b725a8SWilliam Gropp + dm      - The DMMoab object
762a2b725a8SWilliam Gropp - ehandle - Vertex entity handle
76385d305f5SVijay Mahadevan 
764d8d19677SJose E. Roman   Output Parameters:
765a2b725a8SWilliam Gropp + nconn - Number of entities whose coordinates are needed
766a2b725a8SWilliam Gropp - conn  - The vertex entity handles
76785d305f5SVijay Mahadevan 
76885d305f5SVijay Mahadevan   Level: beginner
76985d305f5SVijay Mahadevan 
770db781477SPatrick Sanan .seealso: `DMMoabGetVertexCoordinates()`, `DMMoabGetVertexConnectivity()`, `DMMoabRestoreVertexConnectivity()`
77185d305f5SVijay Mahadevan @*/
772d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetElementConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt *nconn, const moab::EntityHandle **conn)
773d71ae5a4SJacob Faibussowitsch {
7747023aa44SVijay Mahadevan   DM_Moab                        *dmmoab;
7757023aa44SVijay Mahadevan   const moab::EntityHandle       *connect;
7769c368985SVijay Mahadevan   std::vector<moab::EntityHandle> vconn;
7777023aa44SVijay Mahadevan   moab::ErrorCode                 merr;
7787023aa44SVijay Mahadevan   PetscInt                        nnodes;
7797023aa44SVijay Mahadevan 
7807023aa44SVijay Mahadevan   PetscFunctionBegin;
7817023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
7824f572ea9SToby Isaac   PetscAssertPointer(conn, 4);
7837023aa44SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
7847023aa44SVijay Mahadevan 
7857023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
7869371c9d4SSatish Balay   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);
7879371c9d4SSatish Balay   MBERRNM(merr);
7887023aa44SVijay Mahadevan   if (conn) *conn = connect;
7897023aa44SVijay Mahadevan   if (nconn) *nconn = nnodes;
7903ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7917023aa44SVijay Mahadevan }
7927023aa44SVijay Mahadevan 
793cab5ea25SPierre Jolivet /*@C
79485d305f5SVijay Mahadevan   DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element)
79585d305f5SVijay Mahadevan 
796d083f849SBarry Smith   Collective
79785d305f5SVijay Mahadevan 
798d8d19677SJose E. Roman   Input Parameters:
799a2b725a8SWilliam Gropp + dm  - The DMMoab object
800a2b725a8SWilliam Gropp - ent - Entity handle
80185d305f5SVijay Mahadevan 
80285d305f5SVijay Mahadevan   Output Parameter:
80385d305f5SVijay Mahadevan . ent_on_boundary - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
80485d305f5SVijay Mahadevan 
80585d305f5SVijay Mahadevan   Level: beginner
80685d305f5SVijay Mahadevan 
807db781477SPatrick Sanan .seealso: `DMMoabCheckBoundaryVertices()`
80885d305f5SVijay Mahadevan @*/
809d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabIsEntityOnBoundary(DM dm, const moab::EntityHandle ent, PetscBool *ent_on_boundary)
810d71ae5a4SJacob Faibussowitsch {
81169263071SVijay Mahadevan   moab::EntityType etype;
81269263071SVijay Mahadevan   DM_Moab         *dmmoab;
81369263071SVijay Mahadevan   PetscInt         edim;
81469263071SVijay Mahadevan 
81569263071SVijay Mahadevan   PetscFunctionBegin;
81669263071SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
8174f572ea9SToby Isaac   PetscAssertPointer(ent_on_boundary, 3);
81869263071SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
81969263071SVijay Mahadevan 
82069263071SVijay Mahadevan   /* get the entity type and handle accordingly */
82169263071SVijay Mahadevan   etype = dmmoab->mbiface->type_from_handle(ent);
8221dca8a05SBarry Smith   PetscCheck(etype < moab::MBPOLYHEDRON, PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Entity type on the boundary skin is invalid. EntityType = %" PetscInt_FMT, etype);
82369263071SVijay Mahadevan 
82469263071SVijay Mahadevan   /* get the entity dimension */
82569263071SVijay Mahadevan   edim = dmmoab->mbiface->dimension_from_handle(ent);
82669263071SVijay Mahadevan 
82769263071SVijay Mahadevan   *ent_on_boundary = PETSC_FALSE;
82869263071SVijay Mahadevan   if (etype == moab::MBVERTEX && edim == 0) {
82949d66b22SVijay Mahadevan     *ent_on_boundary = ((dmmoab->bndyvtx->index(ent) >= 0) ? PETSC_TRUE : PETSC_FALSE);
8309371c9d4SSatish Balay   } else {
83169263071SVijay Mahadevan     if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */
8326d9eb265SVijay Mahadevan       if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE;
8339371c9d4SSatish Balay     } else { /* next check the lower-dimensional faces */
8346d9eb265SVijay Mahadevan       if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE;
83569263071SVijay Mahadevan     }
83669263071SVijay Mahadevan   }
8373ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
83869263071SVijay Mahadevan }
83969263071SVijay Mahadevan 
840cab5ea25SPierre Jolivet /*@C
8414597dd3dSJose E. Roman   DMMoabCheckBoundaryVertices - Check whether a given entity is on the boundary (vertex, edge, face, element)
84285d305f5SVijay Mahadevan 
84397bb3fdcSJose E. Roman   Input Parameters:
844a2b725a8SWilliam Gropp + dm    - The DMMoab object
84585d305f5SVijay Mahadevan . nconn - Number of handles
846a2b725a8SWilliam Gropp - cnt   - Array of entity handles
84785d305f5SVijay Mahadevan 
84885d305f5SVijay Mahadevan   Output Parameter:
84985d305f5SVijay Mahadevan . isbdvtx - Array of boundary markers - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
85085d305f5SVijay Mahadevan 
85185d305f5SVijay Mahadevan   Level: beginner
85285d305f5SVijay Mahadevan 
853db781477SPatrick Sanan .seealso: `DMMoabIsEntityOnBoundary()`
85485d305f5SVijay Mahadevan @*/
855d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCheckBoundaryVertices(DM dm, PetscInt nconn, const moab::EntityHandle *cnt, PetscBool *isbdvtx)
856d71ae5a4SJacob Faibussowitsch {
8577023aa44SVijay Mahadevan   DM_Moab *dmmoab;
8587023aa44SVijay Mahadevan   PetscInt i;
8597023aa44SVijay Mahadevan 
8607023aa44SVijay Mahadevan   PetscFunctionBegin;
8617023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
8624f572ea9SToby Isaac   PetscAssertPointer(cnt, 3);
8634f572ea9SToby Isaac   PetscAssertPointer(isbdvtx, 4);
8647023aa44SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
8657023aa44SVijay Mahadevan 
866ad540459SPierre Jolivet   for (i = 0; i < nconn; ++i) isbdvtx[i] = (dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE : PETSC_FALSE);
8673ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8687023aa44SVijay Mahadevan }
8697023aa44SVijay Mahadevan 
870cab5ea25SPierre Jolivet /*@C
87185d305f5SVijay Mahadevan   DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary
87285d305f5SVijay Mahadevan 
87385d305f5SVijay Mahadevan   Input Parameter:
87485d305f5SVijay Mahadevan . dm - The DMMoab object
87585d305f5SVijay Mahadevan 
876d8d19677SJose E. Roman   Output Parameters:
877a2b725a8SWilliam Gropp + bdvtx   - Boundary vertices
87885d305f5SVijay Mahadevan . bdelems - Boundary elements
879a2b725a8SWilliam Gropp - bdfaces - Boundary faces
88085d305f5SVijay Mahadevan 
88185d305f5SVijay Mahadevan   Level: beginner
88285d305f5SVijay Mahadevan 
883db781477SPatrick Sanan .seealso: `DMMoabCheckBoundaryVertices()`, `DMMoabIsEntityOnBoundary()`
88485d305f5SVijay Mahadevan @*/
885d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetBoundaryMarkers(DM dm, const moab::Range **bdvtx, const moab::Range **bdelems, const moab::Range **bdfaces)
886d71ae5a4SJacob Faibussowitsch {
8871cec0304SVijay Mahadevan   DM_Moab *dmmoab;
8881cec0304SVijay Mahadevan 
8891cec0304SVijay Mahadevan   PetscFunctionBegin;
8901cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
8911cec0304SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
8921cec0304SVijay Mahadevan 
8936d9eb265SVijay Mahadevan   if (bdvtx) *bdvtx = dmmoab->bndyvtx;
8946d9eb265SVijay Mahadevan   if (bdfaces) *bdfaces = dmmoab->bndyfaces;
8956d9eb265SVijay Mahadevan   if (bdelems) *bdfaces = dmmoab->bndyelems;
8963ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8971cec0304SVijay Mahadevan }
8981cec0304SVijay Mahadevan 
899d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm)
900d71ae5a4SJacob Faibussowitsch {
90185d305f5SVijay Mahadevan   PetscInt        i;
902e882eb38SVijay Mahadevan   moab::ErrorCode merr;
903f6829af0SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab *)dm->data;
904f6829af0SVijay Mahadevan 
905f6829af0SVijay Mahadevan   PetscFunctionBegin;
906f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
907304006b3SVijay Mahadevan 
908304006b3SVijay Mahadevan   dmmoab->refct--;
909304006b3SVijay Mahadevan   if (!dmmoab->refct) {
910f6829af0SVijay Mahadevan     delete dmmoab->vlocal;
911f6829af0SVijay Mahadevan     delete dmmoab->vowned;
912f6829af0SVijay Mahadevan     delete dmmoab->vghost;
913f6829af0SVijay Mahadevan     delete dmmoab->elocal;
914f6829af0SVijay Mahadevan     delete dmmoab->eghost;
915f6829af0SVijay Mahadevan     delete dmmoab->bndyvtx;
916f6829af0SVijay Mahadevan     delete dmmoab->bndyfaces;
917f6829af0SVijay Mahadevan     delete dmmoab->bndyelems;
918f6829af0SVijay Mahadevan 
9199566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->gsindices));
9209566063dSJacob Faibussowitsch     PetscCall(PetscFree2(dmmoab->gidmap, dmmoab->lidmap));
9219566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->dfill));
9229566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->ofill));
9239566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->materials));
92485d305f5SVijay Mahadevan     if (dmmoab->fieldNames) {
92548a46eb9SPierre Jolivet       for (i = 0; i < dmmoab->numFields; i++) PetscCall(PetscFree(dmmoab->fieldNames[i]));
9269566063dSJacob Faibussowitsch       PetscCall(PetscFree(dmmoab->fieldNames));
92785d305f5SVijay Mahadevan     }
928b117cd09SVijay Mahadevan 
929b117cd09SVijay Mahadevan     if (dmmoab->nhlevels) {
9309566063dSJacob Faibussowitsch       PetscCall(PetscFree(dmmoab->hsets));
931e882eb38SVijay Mahadevan       dmmoab->nhlevels = 0;
932e882eb38SVijay Mahadevan       if (!dmmoab->hlevel && dmmoab->icreatedinstance) delete dmmoab->hierarchy;
933e882eb38SVijay Mahadevan       dmmoab->hierarchy = NULL;
934b117cd09SVijay Mahadevan     }
935e882eb38SVijay Mahadevan 
936e882eb38SVijay Mahadevan     if (dmmoab->icreatedinstance) {
9379c368985SVijay Mahadevan       delete dmmoab->pcomm;
9389371c9d4SSatish Balay       merr = dmmoab->mbiface->delete_mesh();
9399371c9d4SSatish Balay       MBERRNM(merr);
940e882eb38SVijay Mahadevan       delete dmmoab->mbiface;
941e882eb38SVijay Mahadevan     }
942e882eb38SVijay Mahadevan     dmmoab->mbiface = NULL;
9439daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
944e882eb38SVijay Mahadevan     dmmoab->pcomm = NULL;
9459daf19fdSVijay Mahadevan #endif
9469566063dSJacob Faibussowitsch     PetscCall(VecScatterDestroy(&dmmoab->ltog_sendrecv));
9479566063dSJacob Faibussowitsch     PetscCall(ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map));
9489566063dSJacob Faibussowitsch     PetscCall(PetscFree(dm->data));
949304006b3SVijay Mahadevan   }
9503ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
951f6829af0SVijay Mahadevan }
952f6829af0SVijay Mahadevan 
953d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(DM dm, PetscOptionItems *PetscOptionsObject)
954d71ae5a4SJacob Faibussowitsch {
9552e4e7c01SVijay Mahadevan   DM_Moab *dmmoab = (DM_Moab *)dm->data;
9562e4e7c01SVijay Mahadevan 
9572e4e7c01SVijay Mahadevan   PetscFunctionBegin;
958d0609cedSBarry Smith   PetscOptionsHeadBegin(PetscOptionsObject, "DMMoab Options");
9599566063dSJacob 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));
9609566063dSJacob 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));
9612e4e7c01SVijay Mahadevan   /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */
9629566063dSJacob 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));
9639566063dSJacob 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));
9649566063dSJacob Faibussowitsch   PetscCall(PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum *)&dmmoab->read_mode, NULL));
9659566063dSJacob Faibussowitsch   PetscCall(PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum *)&dmmoab->write_mode, NULL));
966d0609cedSBarry Smith   PetscOptionsHeadEnd();
9673ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9682e4e7c01SVijay Mahadevan }
9692e4e7c01SVijay Mahadevan 
970d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm)
971d71ae5a4SJacob Faibussowitsch {
972f6829af0SVijay Mahadevan   moab::ErrorCode       merr;
973f6829af0SVijay Mahadevan   Vec                   local, global;
974f6829af0SVijay Mahadevan   IS                    from, to;
975f6829af0SVijay Mahadevan   moab::Range::iterator iter;
976304006b3SVijay Mahadevan   PetscInt              i, j, f, bs, vent, totsize, *lgmap;
977f6829af0SVijay Mahadevan   DM_Moab              *dmmoab = (DM_Moab *)dm->data;
978f6829af0SVijay Mahadevan   moab::Range           adjs;
979f6829af0SVijay Mahadevan 
980f6829af0SVijay Mahadevan   PetscFunctionBegin;
981f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
982f6829af0SVijay Mahadevan   /* Get the local and shared vertices and cache it */
98308401ef6SPierre Jolivet   PetscCheck(dmmoab->mbiface != NULL, PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface before calling SetUp.");
9849daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
98508401ef6SPierre Jolivet   PetscCheck(dmmoab->pcomm != NULL, PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB ParallelComm object before calling SetUp.");
9869daf19fdSVijay Mahadevan #endif
987f6829af0SVijay Mahadevan 
988f6829af0SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
9899371c9d4SSatish Balay   if (dmmoab->vlocal->empty()) {
99049d66b22SVijay Mahadevan     //merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
9919371c9d4SSatish Balay     merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, 0, *dmmoab->vlocal, false);
9929371c9d4SSatish Balay     MBERRNM(merr);
993f6829af0SVijay Mahadevan 
9949daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
995f6829af0SVijay Mahadevan     /* filter based on parallel status */
9969371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned);
9979371c9d4SSatish Balay     MBERRNM(merr);
998f6829af0SVijay Mahadevan 
999f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
10009c368985SVijay Mahadevan     // *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
1001f6829af0SVijay Mahadevan     adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
10029371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(adjs, PSTATUS_GHOST | PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost);
10039371c9d4SSatish Balay     MBERRNM(merr);
1004f6829af0SVijay Mahadevan     adjs            = moab::subtract(adjs, *dmmoab->vghost);
1005f6829af0SVijay Mahadevan     *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs);
10069daf19fdSVijay Mahadevan #else
10079daf19fdSVijay Mahadevan     *dmmoab->vowned = *dmmoab->vlocal;
10089daf19fdSVijay Mahadevan #endif
1009f6829af0SVijay Mahadevan 
1010f6829af0SVijay Mahadevan     /* compute and cache the sizes of local and ghosted entities */
1011f6829af0SVijay Mahadevan     dmmoab->nloc   = dmmoab->vowned->size();
1012f6829af0SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
101349d66b22SVijay Mahadevan 
10149daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
10151c2dc1cbSBarry Smith     PetscCall(MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm));
10163ba16761SJacob 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));
10179daf19fdSVijay Mahadevan #else
10189daf19fdSVijay Mahadevan     dmmoab->n       = dmmoab->nloc;
10199daf19fdSVijay Mahadevan #endif
1020f6829af0SVijay Mahadevan   }
1021f6829af0SVijay Mahadevan 
1022f6829af0SVijay Mahadevan   {
1023f6829af0SVijay Mahadevan     /* get the information about the local elements in the mesh */
1024f6829af0SVijay Mahadevan     dmmoab->eghost->clear();
1025f6829af0SVijay Mahadevan 
1026f6829af0SVijay Mahadevan     /* first decipher the leading dimension */
1027f6829af0SVijay Mahadevan     for (i = 3; i > 0; i--) {
1028f6829af0SVijay Mahadevan       dmmoab->elocal->clear();
10299371c9d4SSatish Balay       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, false);
10309371c9d4SSatish Balay       MBERRNM(merr);
1031f6829af0SVijay Mahadevan 
1032f6829af0SVijay Mahadevan       /* store the current mesh dimension */
1033f6829af0SVijay Mahadevan       if (dmmoab->elocal->size()) {
1034f6829af0SVijay Mahadevan         dmmoab->dim = i;
1035f6829af0SVijay Mahadevan         break;
1036f6829af0SVijay Mahadevan       }
1037f6829af0SVijay Mahadevan     }
1038f6829af0SVijay Mahadevan 
10399566063dSJacob Faibussowitsch     PetscCall(DMSetDimension(dm, dmmoab->dim));
1040b117cd09SVijay Mahadevan 
10419daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1042f6829af0SVijay Mahadevan     /* filter the ghosted and owned element list */
1043f6829af0SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
10449371c9d4SSatish Balay     merr            = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT);
10459371c9d4SSatish Balay     MBERRNM(merr);
1046f6829af0SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
10479daf19fdSVijay Mahadevan #endif
1048f6829af0SVijay Mahadevan 
1049f6829af0SVijay Mahadevan     dmmoab->neleloc   = dmmoab->elocal->size();
1050f6829af0SVijay Mahadevan     dmmoab->neleghost = dmmoab->eghost->size();
105149d66b22SVijay Mahadevan 
10529daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
10531c2dc1cbSBarry Smith     PetscCall(MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm));
10543ba16761SJacob Faibussowitsch     PetscCall(PetscInfo(NULL, "%d-dim elements: owned - %" PetscInt_FMT ", ghosted - %" PetscInt_FMT ".\n", dmmoab->dim, dmmoab->neleloc, dmmoab->neleghost));
10559daf19fdSVijay Mahadevan #else
10569daf19fdSVijay Mahadevan     dmmoab->nele    = dmmoab->neleloc;
10579daf19fdSVijay Mahadevan #endif
1058f6829af0SVijay Mahadevan   }
1059f6829af0SVijay Mahadevan 
1060f6829af0SVijay Mahadevan   bs = dmmoab->bs;
1061f6829af0SVijay Mahadevan   if (!dmmoab->ltog_tag) {
1062f6829af0SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
1063f6829af0SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
1064f6829af0SVijay Mahadevan        assemble the individual pieces of the mesh */
10659371c9d4SSatish Balay     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);
10669371c9d4SSatish Balay     MBERRNM(merr);
1067f6829af0SVijay Mahadevan   }
1068f6829af0SVijay Mahadevan 
1069f6829af0SVijay Mahadevan   totsize = dmmoab->vlocal->size();
10701dca8a05SBarry 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);
10719566063dSJacob Faibussowitsch   PetscCall(PetscCalloc1(totsize, &dmmoab->gsindices));
1072f6829af0SVijay Mahadevan   {
1073f6829af0SVijay Mahadevan     /* first get the local indices */
10749371c9d4SSatish Balay     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vowned, &dmmoab->gsindices[0]);
10759371c9d4SSatish Balay     MBERRNM(merr);
10763f1c6e43SVijay Mahadevan     if (dmmoab->nghost) { /* next get the ghosted indices */
10779371c9d4SSatish Balay       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vghost, &dmmoab->gsindices[dmmoab->nloc]);
10789371c9d4SSatish Balay       MBERRNM(merr);
1079f6829af0SVijay Mahadevan     }
1080f6829af0SVijay Mahadevan 
1081f6829af0SVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
1082304006b3SVijay Mahadevan     dmmoab->lminmax[0] = dmmoab->lminmax[1] = dmmoab->gsindices[0];
1083f6829af0SVijay Mahadevan     for (i = 0; i < totsize; ++i) {
1084304006b3SVijay Mahadevan       if (dmmoab->lminmax[0] > dmmoab->gsindices[i]) dmmoab->lminmax[0] = dmmoab->gsindices[i];
1085304006b3SVijay Mahadevan       if (dmmoab->lminmax[1] < dmmoab->gsindices[i]) dmmoab->lminmax[1] = dmmoab->gsindices[i];
1086f6829af0SVijay Mahadevan     }
1087f6829af0SVijay Mahadevan 
10881c2dc1cbSBarry Smith     PetscCall(MPIU_Allreduce(&dmmoab->lminmax[0], &dmmoab->gminmax[0], 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm));
10891c2dc1cbSBarry Smith     PetscCall(MPIU_Allreduce(&dmmoab->lminmax[1], &dmmoab->gminmax[1], 1, MPI_INT, MPI_MAX, ((PetscObject)dm)->comm));
1090f6829af0SVijay Mahadevan 
1091f6829af0SVijay Mahadevan     /* set the GID map */
10929371c9d4SSatish Balay     for (i = 0; i < totsize; ++i) { dmmoab->gsindices[i] -= dmmoab->gminmax[0]; /* zero based index needed for IS */ }
1093304006b3SVijay Mahadevan     dmmoab->lminmax[0] -= dmmoab->gminmax[0];
1094304006b3SVijay Mahadevan     dmmoab->lminmax[1] -= dmmoab->gminmax[0];
1095f6829af0SVijay Mahadevan 
10963ba16761SJacob 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]));
1097f6829af0SVijay Mahadevan   }
10989371c9d4SSatish 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,
10999371c9d4SSatish Balay              dmmoab->numFields);
1100f6829af0SVijay Mahadevan 
1101f6829af0SVijay Mahadevan   {
11029c368985SVijay Mahadevan     dmmoab->seqstart = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->front());
11039c368985SVijay Mahadevan     dmmoab->seqend   = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->back());
11043ba16761SJacob Faibussowitsch     PetscCall(PetscInfo(NULL, "SEQUENCE: Local [min, max] - [%" PetscInt_FMT ", %" PetscInt_FMT "]\n", dmmoab->seqstart, dmmoab->seqend));
11053f1c6e43SVijay Mahadevan 
11069566063dSJacob Faibussowitsch     PetscCall(PetscMalloc2(dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->gidmap, dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->lidmap));
11079566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(totsize * dmmoab->numFields, &lgmap));
1108f6829af0SVijay Mahadevan 
1109f6829af0SVijay Mahadevan     i = j = 0;
1110f6829af0SVijay Mahadevan     /* set the owned vertex data first */
1111f6829af0SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++, i++) {
1112e92d1c7cSVijay Mahadevan       vent                 = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart;
1113f6829af0SVijay Mahadevan       dmmoab->gidmap[vent] = dmmoab->gsindices[i];
1114f6829af0SVijay Mahadevan       dmmoab->lidmap[vent] = i;
1115ad540459SPierre Jolivet       for (f = 0; f < dmmoab->numFields; f++, j++) lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]);
1116f6829af0SVijay Mahadevan     }
1117f6829af0SVijay Mahadevan     /* next arrange all the ghosted data information */
1118f6829af0SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++, i++) {
1119e92d1c7cSVijay Mahadevan       vent                 = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart;
1120f6829af0SVijay Mahadevan       dmmoab->gidmap[vent] = dmmoab->gsindices[i];
1121f6829af0SVijay Mahadevan       dmmoab->lidmap[vent] = i;
1122ad540459SPierre Jolivet       for (f = 0; f < dmmoab->numFields; f++, j++) lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]);
1123f6829af0SVijay Mahadevan     }
1124f6829af0SVijay Mahadevan 
1125f6829af0SVijay Mahadevan     /* We need to create the Global to Local Vector Scatter Contexts
1126f6829af0SVijay Mahadevan        1) First create a local and global vector
1127f6829af0SVijay Mahadevan        2) Create a local and global IS
1128f6829af0SVijay Mahadevan        3) Create VecScatter and LtoGMapping objects
1129f6829af0SVijay Mahadevan        4) Cleanup the IS and Vec objects
1130f6829af0SVijay Mahadevan     */
11319566063dSJacob Faibussowitsch     PetscCall(DMCreateGlobalVector(dm, &global));
11329566063dSJacob Faibussowitsch     PetscCall(DMCreateLocalVector(dm, &local));
1133f6829af0SVijay Mahadevan 
11349566063dSJacob Faibussowitsch     PetscCall(VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend));
1135f6829af0SVijay Mahadevan 
1136f6829af0SVijay Mahadevan     /* global to local must retrieve ghost points */
11379566063dSJacob Faibussowitsch     PetscCall(ISCreateStride(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, dmmoab->vstart, 1, &from));
11389566063dSJacob Faibussowitsch     PetscCall(ISSetBlockSize(from, bs));
1139f6829af0SVijay Mahadevan 
11409566063dSJacob Faibussowitsch     PetscCall(ISCreateGeneral(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, &lgmap[0], PETSC_COPY_VALUES, &to));
11419566063dSJacob Faibussowitsch     PetscCall(ISSetBlockSize(to, bs));
1142f6829af0SVijay Mahadevan 
1143f6829af0SVijay Mahadevan     if (!dmmoab->ltog_map) {
1144f6829af0SVijay Mahadevan       /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */
11459566063dSJacob Faibussowitsch       PetscCall(ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm, dmmoab->bs, totsize * dmmoab->numFields, lgmap, PETSC_COPY_VALUES, &dmmoab->ltog_map));
1146f6829af0SVijay Mahadevan     }
1147f6829af0SVijay Mahadevan 
1148f6829af0SVijay Mahadevan     /* now create the scatter object from local to global vector */
11499566063dSJacob Faibussowitsch     PetscCall(VecScatterCreate(local, from, global, to, &dmmoab->ltog_sendrecv));
1150f6829af0SVijay Mahadevan 
1151f6829af0SVijay Mahadevan     /* clean up IS, Vec */
11529566063dSJacob Faibussowitsch     PetscCall(PetscFree(lgmap));
11539566063dSJacob Faibussowitsch     PetscCall(ISDestroy(&from));
11549566063dSJacob Faibussowitsch     PetscCall(ISDestroy(&to));
11559566063dSJacob Faibussowitsch     PetscCall(VecDestroy(&local));
11569566063dSJacob Faibussowitsch     PetscCall(VecDestroy(&global));
1157f6829af0SVijay Mahadevan   }
1158f6829af0SVijay Mahadevan 
115949d66b22SVijay Mahadevan   dmmoab->bndyvtx   = new moab::Range();
116049d66b22SVijay Mahadevan   dmmoab->bndyfaces = new moab::Range();
116149d66b22SVijay Mahadevan   dmmoab->bndyelems = new moab::Range();
1162f6829af0SVijay Mahadevan   /* skin the boundary and store nodes */
11639c368985SVijay Mahadevan   if (!dmmoab->hlevel) {
1164f6829af0SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
1165f6829af0SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
1166f6829af0SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
1167f6829af0SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
1168f6829af0SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
1169f6829af0SVijay Mahadevan 
1170f6829af0SVijay Mahadevan     /* get the entities on the skin - only the faces */
11719371c9d4SSatish Balay     merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, *dmmoab->bndyfaces, NULL, true, true, false);
11729371c9d4SSatish Balay     MBERRNM(merr); // 'false' param indicates we want faces back, not vertices
1173f6829af0SVijay Mahadevan 
11749daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1175f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
11769371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT);
11779371c9d4SSatish Balay     MBERRNM(merr);
11789371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_INTERFACE, PSTATUS_NOT);
11799371c9d4SSatish Balay     MBERRNM(merr);
11809daf19fdSVijay Mahadevan #endif
1181f6829af0SVijay Mahadevan 
1182f6829af0SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
11839371c9d4SSatish Balay     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);
11849371c9d4SSatish Balay     MBERRNM(merr);
11859371c9d4SSatish Balay     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyvtx, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);
11869371c9d4SSatish Balay     MBERRNM(merr);
11879371c9d4SSatish Balay   } else {
11889c368985SVijay Mahadevan     /* Let us query the hierarchy manager and get the results directly for this level */
11899c368985SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->elocal->begin(); iter != dmmoab->elocal->end(); iter++) {
11909c368985SVijay Mahadevan       moab::EntityHandle elemHandle = *iter;
11919c368985SVijay Mahadevan       if (dmmoab->hierarchy->is_entity_on_boundary(elemHandle)) {
11929c368985SVijay Mahadevan         dmmoab->bndyelems->insert(elemHandle);
11939c368985SVijay Mahadevan         /* For this boundary element, query the vertices and add them to the list */
11949c368985SVijay Mahadevan         std::vector<moab::EntityHandle> connect;
11959371c9d4SSatish Balay         merr = dmmoab->hierarchy->get_connectivity(elemHandle, dmmoab->hlevel, connect);
11969371c9d4SSatish Balay         MBERRNM(merr);
11979c368985SVijay Mahadevan         for (unsigned iv = 0; iv < connect.size(); ++iv)
11989371c9d4SSatish Balay           if (dmmoab->hierarchy->is_entity_on_boundary(connect[iv])) dmmoab->bndyvtx->insert(connect[iv]);
11999c368985SVijay Mahadevan         /* Next, let us query the boundary faces and add them also to the list */
12009c368985SVijay Mahadevan         std::vector<moab::EntityHandle> faces;
12019371c9d4SSatish Balay         merr = dmmoab->hierarchy->get_adjacencies(elemHandle, dmmoab->dim - 1, faces);
12029371c9d4SSatish Balay         MBERRNM(merr);
12039c368985SVijay Mahadevan         for (unsigned ifa = 0; ifa < faces.size(); ++ifa)
12049371c9d4SSatish Balay           if (dmmoab->hierarchy->is_entity_on_boundary(faces[ifa])) dmmoab->bndyfaces->insert(faces[ifa]);
12059c368985SVijay Mahadevan       }
12069c368985SVijay Mahadevan     }
12079c368985SVijay Mahadevan #ifdef MOAB_HAVE_MPI
12089c368985SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
12099371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyvtx, PSTATUS_NOT_OWNED, PSTATUS_NOT);
12109371c9d4SSatish Balay     MBERRNM(merr);
12119371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT);
12129371c9d4SSatish Balay     MBERRNM(merr);
12139371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyelems, PSTATUS_NOT_OWNED, PSTATUS_NOT);
12149371c9d4SSatish Balay     MBERRNM(merr);
12159c368985SVijay Mahadevan #endif
12169c368985SVijay Mahadevan   }
12173ba16761SJacob 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()));
1218a044f6b6SVijay Mahadevan 
1219a044f6b6SVijay Mahadevan   /* Get the material sets and populate the data for all locally owned elements */
1220a044f6b6SVijay Mahadevan   {
12219566063dSJacob Faibussowitsch     PetscCall(PetscCalloc1(dmmoab->elocal->size(), &dmmoab->materials));
1222a044f6b6SVijay Mahadevan     /* Get the count of entities of particular type from dmmoab->elocal
1223a044f6b6SVijay Mahadevan        -- Then, for each non-zero type, loop through and query the fileset to get the material tag data */
1224a044f6b6SVijay Mahadevan     moab::Range msets;
12259371c9d4SSatish Balay     merr = dmmoab->mbiface->get_entities_by_type_and_tag(dmmoab->fileset, moab::MBENTITYSET, &dmmoab->material_tag, NULL, 1, msets, moab::Interface::UNION);
12263ba16761SJacob Faibussowitsch     MBERRNM(merr);
12279d3446b2SPierre Jolivet     if (msets.size() == 0) PetscCall(PetscInfo(NULL, "No material sets found in the fileset.\n"));
1228a044f6b6SVijay Mahadevan 
1229a044f6b6SVijay Mahadevan     for (unsigned i = 0; i < msets.size(); ++i) {
1230a044f6b6SVijay Mahadevan       moab::Range msetelems;
12319371c9d4SSatish Balay       merr = dmmoab->mbiface->get_entities_by_dimension(msets[i], dmmoab->dim, msetelems, true);
12323ba16761SJacob Faibussowitsch       MBERRNM(merr);
1233aedf4482SVijay Mahadevan #ifdef MOAB_HAVE_MPI
1234aedf4482SVijay Mahadevan       /* filter all the non-owned and shared entities out of the list */
12359371c9d4SSatish Balay       merr = dmmoab->pcomm->filter_pstatus(msetelems, PSTATUS_NOT_OWNED, PSTATUS_NOT);
12369371c9d4SSatish Balay       MBERRNM(merr);
1237aedf4482SVijay Mahadevan #endif
1238a044f6b6SVijay Mahadevan 
1239a044f6b6SVijay Mahadevan       int                partID;
1240a044f6b6SVijay Mahadevan       moab::EntityHandle mset = msets[i];
12419371c9d4SSatish Balay       merr                    = dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &mset, 1, &partID);
12423ba16761SJacob Faibussowitsch       MBERRNM(merr);
1243a044f6b6SVijay Mahadevan 
12449371c9d4SSatish Balay       for (unsigned j = 0; j < msetelems.size(); ++j) dmmoab->materials[dmmoab->elocal->index(msetelems[j])] = partID;
1245a044f6b6SVijay Mahadevan     }
1246a044f6b6SVijay Mahadevan   }
1247a044f6b6SVijay Mahadevan 
12483ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1249f6829af0SVijay Mahadevan }
1250f6829af0SVijay Mahadevan 
1251cab5ea25SPierre Jolivet /*@C
1252304006b3SVijay Mahadevan   DMMoabCreateVertices - Creates and adds several vertices to the primary set represented by the DM.
1253304006b3SVijay Mahadevan 
1254d083f849SBarry Smith   Collective
1255304006b3SVijay Mahadevan 
1256304006b3SVijay Mahadevan   Input Parameters:
1257*a4e35b19SJacob Faibussowitsch + dm     - The `DM` object
125860225df5SJacob Faibussowitsch . coords - The connectivity of the element
1259a2b725a8SWilliam Gropp - nverts - The number of vertices that form the element
1260304006b3SVijay Mahadevan 
1261304006b3SVijay Mahadevan   Output Parameter:
1262304006b3SVijay Mahadevan . overts - The list of vertices that were created (can be NULL)
1263304006b3SVijay Mahadevan 
1264304006b3SVijay Mahadevan   Level: beginner
1265304006b3SVijay Mahadevan 
1266db781477SPatrick Sanan .seealso: `DMMoabCreateSubmesh()`, `DMMoabCreateElement()`
1267304006b3SVijay Mahadevan @*/
1268d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreateVertices(DM dm, const PetscReal *coords, PetscInt nverts, moab::Range *overts)
1269d71ae5a4SJacob Faibussowitsch {
1270304006b3SVijay Mahadevan   moab::ErrorCode merr;
1271304006b3SVijay Mahadevan   DM_Moab        *dmmoab;
1272304006b3SVijay Mahadevan   moab::Range     verts;
1273304006b3SVijay Mahadevan 
1274304006b3SVijay Mahadevan   PetscFunctionBegin;
1275304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
12764f572ea9SToby Isaac   PetscAssertPointer(coords, 2);
1277304006b3SVijay Mahadevan 
1278304006b3SVijay Mahadevan   dmmoab = (DM_Moab *)dm->data;
1279304006b3SVijay Mahadevan 
1280304006b3SVijay Mahadevan   /* Insert new points */
12819371c9d4SSatish Balay   merr = dmmoab->mbiface->create_vertices(&coords[0], nverts, verts);
12829371c9d4SSatish Balay   MBERRNM(merr);
12839371c9d4SSatish Balay   merr = dmmoab->mbiface->add_entities(dmmoab->fileset, verts);
12849371c9d4SSatish Balay   MBERRNM(merr);
1285304006b3SVijay Mahadevan 
1286304006b3SVijay Mahadevan   if (overts) *overts = verts;
12873ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1288304006b3SVijay Mahadevan }
1289304006b3SVijay Mahadevan 
1290cab5ea25SPierre Jolivet /*@C
1291304006b3SVijay Mahadevan   DMMoabCreateElement - Adds an element of specified type to the primary set represented by the DM.
1292304006b3SVijay Mahadevan 
1293d083f849SBarry Smith   Collective
1294304006b3SVijay Mahadevan 
1295304006b3SVijay Mahadevan   Input Parameters:
1296304006b3SVijay Mahadevan + dm     - The DM object
1297304006b3SVijay Mahadevan . type   - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra)
1298304006b3SVijay Mahadevan . conn   - The connectivity of the element
1299a2b725a8SWilliam Gropp - nverts - The number of vertices that form the element
1300304006b3SVijay Mahadevan 
1301304006b3SVijay Mahadevan   Output Parameter:
1302304006b3SVijay Mahadevan . oelem - The handle to the element created and added to the DM object
1303304006b3SVijay Mahadevan 
1304304006b3SVijay Mahadevan   Level: beginner
1305304006b3SVijay Mahadevan 
1306db781477SPatrick Sanan .seealso: `DMMoabCreateSubmesh()`, `DMMoabCreateVertices()`
1307304006b3SVijay Mahadevan @*/
1308d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreateElement(DM dm, const moab::EntityType type, const moab::EntityHandle *conn, PetscInt nverts, moab::EntityHandle *oelem)
1309d71ae5a4SJacob Faibussowitsch {
1310304006b3SVijay Mahadevan   moab::ErrorCode    merr;
1311304006b3SVijay Mahadevan   DM_Moab           *dmmoab;
1312304006b3SVijay Mahadevan   moab::EntityHandle elem;
1313304006b3SVijay Mahadevan 
1314304006b3SVijay Mahadevan   PetscFunctionBegin;
1315304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
13164f572ea9SToby Isaac   PetscAssertPointer(conn, 3);
1317304006b3SVijay Mahadevan 
1318304006b3SVijay Mahadevan   dmmoab = (DM_Moab *)dm->data;
1319304006b3SVijay Mahadevan 
1320304006b3SVijay Mahadevan   /* Insert new element */
13219371c9d4SSatish Balay   merr = dmmoab->mbiface->create_element(type, conn, nverts, elem);
13229371c9d4SSatish Balay   MBERRNM(merr);
13239371c9d4SSatish Balay   merr = dmmoab->mbiface->add_entities(dmmoab->fileset, &elem, 1);
13249371c9d4SSatish Balay   MBERRNM(merr);
1325304006b3SVijay Mahadevan 
1326304006b3SVijay Mahadevan   if (oelem) *oelem = elem;
13273ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1328304006b3SVijay Mahadevan }
1329304006b3SVijay Mahadevan 
1330cab5ea25SPierre Jolivet /*@C
1331304006b3SVijay Mahadevan   DMMoabCreateSubmesh - Creates a sub-DM object with a set that contains all vertices/elements of the parent
1332304006b3SVijay Mahadevan   in addition to providing support for dynamic mesh modifications. This is useful for AMR calculations to
1333304006b3SVijay Mahadevan   create a DM object on a refined level.
1334304006b3SVijay Mahadevan 
1335d083f849SBarry Smith   Collective
1336304006b3SVijay Mahadevan 
1337304006b3SVijay Mahadevan   Input Parameters:
1338a2b725a8SWilliam Gropp . dm - The DM object
1339304006b3SVijay Mahadevan 
1340304006b3SVijay Mahadevan   Output Parameter:
1341304006b3SVijay Mahadevan . newdm - The sub DM object with updated set information
1342304006b3SVijay Mahadevan 
1343304006b3SVijay Mahadevan   Level: advanced
1344304006b3SVijay Mahadevan 
1345db781477SPatrick Sanan .seealso: `DMCreate()`, `DMMoabCreateVertices()`, `DMMoabCreateElement()`
1346304006b3SVijay Mahadevan @*/
1347d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreateSubmesh(DM dm, DM *newdm)
1348d71ae5a4SJacob Faibussowitsch {
1349304006b3SVijay Mahadevan   DM_Moab        *dmmoab;
1350304006b3SVijay Mahadevan   DM_Moab        *ndmmoab;
1351304006b3SVijay Mahadevan   moab::ErrorCode merr;
1352304006b3SVijay Mahadevan 
1353304006b3SVijay Mahadevan   PetscFunctionBegin;
1354304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1355304006b3SVijay Mahadevan 
1356304006b3SVijay Mahadevan   dmmoab = (DM_Moab *)dm->data;
1357304006b3SVijay Mahadevan 
1358304006b3SVijay Mahadevan   /* Create the basic DMMoab object and keep the default parameters created by DM impls */
1359f3fa974cSJacob Faibussowitsch   PetscCall(DMMoabCreateMoab(((PetscObject)dm)->comm, dmmoab->mbiface, &dmmoab->ltog_tag, NULL, newdm));
1360304006b3SVijay Mahadevan 
1361304006b3SVijay Mahadevan   /* get all the necessary handles from the private DM object */
1362304006b3SVijay Mahadevan   ndmmoab = (DM_Moab *)(*newdm)->data;
1363304006b3SVijay Mahadevan 
1364304006b3SVijay Mahadevan   /* set the sub-mesh's parent DM reference */
1365304006b3SVijay Mahadevan   ndmmoab->parent = &dm;
1366304006b3SVijay Mahadevan 
1367304006b3SVijay Mahadevan   /* create a file set to associate all entities in current mesh */
13689371c9d4SSatish Balay   merr = ndmmoab->mbiface->create_meshset(moab::MESHSET_SET, ndmmoab->fileset);
13699371c9d4SSatish Balay   MBERR("Creating file set failed", merr);
1370304006b3SVijay Mahadevan 
1371304006b3SVijay Mahadevan   /* create a meshset and then add old fileset as child */
13729371c9d4SSatish Balay   merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->vlocal);
13739371c9d4SSatish Balay   MBERR("Adding child vertices to parent failed", merr);
13749371c9d4SSatish Balay   merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->elocal);
13759371c9d4SSatish Balay   MBERR("Adding child elements to parent failed", merr);
1376304006b3SVijay Mahadevan 
1377304006b3SVijay Mahadevan   /* preserve the field association between the parent and sub-mesh objects */
13789566063dSJacob Faibussowitsch   PetscCall(DMMoabSetFieldNames(*newdm, dmmoab->numFields, dmmoab->fieldNames));
13793ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1380304006b3SVijay Mahadevan }
1381304006b3SVijay Mahadevan 
1382d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMMoabView_Ascii(DM dm, PetscViewer viewer)
1383d71ae5a4SJacob Faibussowitsch {
1384304006b3SVijay Mahadevan   DM_Moab    *dmmoab = (DM_Moab *)(dm)->data;
1385304006b3SVijay Mahadevan   const char *name;
1386304006b3SVijay Mahadevan   MPI_Comm    comm;
1387304006b3SVijay Mahadevan   PetscMPIInt size;
1388304006b3SVijay Mahadevan 
1389304006b3SVijay Mahadevan   PetscFunctionBegin;
13909566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)dm, &comm));
13919566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm, &size));
13929566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetName((PetscObject)dm, &name));
13939566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushTab(viewer));
139463a3b9bcSJacob Faibussowitsch   if (name) PetscCall(PetscViewerASCIIPrintf(viewer, "%s in %" PetscInt_FMT " dimensions:\n", name, dmmoab->dim));
139563a3b9bcSJacob Faibussowitsch   else PetscCall(PetscViewerASCIIPrintf(viewer, "Mesh in %" PetscInt_FMT " dimensions:\n", dmmoab->dim));
1396304006b3SVijay Mahadevan   /* print details about the global mesh */
1397304006b3SVijay Mahadevan   {
13989566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushTab(viewer));
139963a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Sizes: cells=%" PetscInt_FMT ", vertices=%" PetscInt_FMT ", blocks=%" PetscInt_FMT "\n", dmmoab->nele, dmmoab->n, dmmoab->bs));
1400304006b3SVijay Mahadevan     /* print boundary data */
140163a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Boundary trace:\n"));
1402304006b3SVijay Mahadevan     {
14039566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(viewer));
140463a3b9bcSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(viewer, "cells=%zu, faces=%zu, vertices=%zu\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size()));
14059566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(viewer));
1406304006b3SVijay Mahadevan     }
1407304006b3SVijay Mahadevan     /* print field data */
140863a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Fields: %" PetscInt_FMT " components\n", dmmoab->numFields));
1409304006b3SVijay Mahadevan     {
14109566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(viewer));
141148a46eb9SPierre Jolivet       for (int i = 0; i < dmmoab->numFields; ++i) PetscCall(PetscViewerASCIIPrintf(viewer, "[%" PetscInt_FMT "] - %s\n", i, dmmoab->fieldNames[i]));
14129566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(viewer));
1413304006b3SVijay Mahadevan     }
14149566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopTab(viewer));
1415304006b3SVijay Mahadevan   }
14169566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopTab(viewer));
14179566063dSJacob Faibussowitsch   PetscCall(PetscViewerFlush(viewer));
14183ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1419304006b3SVijay Mahadevan }
1420304006b3SVijay Mahadevan 
1421d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMMoabView_VTK(DM dm, PetscViewer v)
1422d71ae5a4SJacob Faibussowitsch {
14233ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1424304006b3SVijay Mahadevan }
1425304006b3SVijay Mahadevan 
1426d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMMoabView_HDF5(DM dm, PetscViewer v)
1427d71ae5a4SJacob Faibussowitsch {
14283ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1429304006b3SVijay Mahadevan }
1430304006b3SVijay Mahadevan 
1431d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMView_Moab(DM dm, PetscViewer viewer)
1432d71ae5a4SJacob Faibussowitsch {
1433304006b3SVijay Mahadevan   PetscBool iascii, ishdf5, isvtk;
1434304006b3SVijay Mahadevan 
1435304006b3SVijay Mahadevan   PetscFunctionBegin;
1436304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1437304006b3SVijay Mahadevan   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
14389566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
14399566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERVTK, &isvtk));
14409566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERHDF5, &ishdf5));
1441304006b3SVijay Mahadevan   if (iascii) {
14429566063dSJacob Faibussowitsch     PetscCall(DMMoabView_Ascii(dm, viewer));
1443304006b3SVijay Mahadevan   } else if (ishdf5) {
1444304006b3SVijay Mahadevan #if defined(PETSC_HAVE_HDF5) && defined(MOAB_HAVE_HDF5)
14459566063dSJacob Faibussowitsch     PetscCall(PetscViewerPushFormat(viewer, PETSC_VIEWER_HDF5_VIZ));
14469566063dSJacob Faibussowitsch     PetscCall(DMMoabView_HDF5(dm, viewer));
14479566063dSJacob Faibussowitsch     PetscCall(PetscViewerPopFormat(viewer));
1448304006b3SVijay Mahadevan #else
1449304006b3SVijay Mahadevan     SETERRQ(PetscObjectComm((PetscObject)dm), PETSC_ERR_SUP, "HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5");
1450304006b3SVijay Mahadevan #endif
14519371c9d4SSatish Balay   } else if (isvtk) {
14529566063dSJacob Faibussowitsch     PetscCall(DMMoabView_VTK(dm, viewer));
1453304006b3SVijay Mahadevan   }
14543ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1455304006b3SVijay Mahadevan }
1456304006b3SVijay Mahadevan 
1457d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMInitialize_Moab(DM dm)
1458d71ae5a4SJacob Faibussowitsch {
1459304006b3SVijay Mahadevan   PetscFunctionBegin;
1460304006b3SVijay Mahadevan   dm->ops->view                     = DMView_Moab;
1461304006b3SVijay Mahadevan   dm->ops->load                     = NULL /* DMLoad_Moab */;
1462304006b3SVijay Mahadevan   dm->ops->setfromoptions           = DMSetFromOptions_Moab;
1463304006b3SVijay Mahadevan   dm->ops->clone                    = DMClone_Moab;
1464304006b3SVijay Mahadevan   dm->ops->setup                    = DMSetUp_Moab;
14651bb6d2a8SBarry Smith   dm->ops->createlocalsection       = NULL;
1466304006b3SVijay Mahadevan   dm->ops->createdefaultconstraints = NULL;
1467304006b3SVijay Mahadevan   dm->ops->createglobalvector       = DMCreateGlobalVector_Moab;
1468304006b3SVijay Mahadevan   dm->ops->createlocalvector        = DMCreateLocalVector_Moab;
1469304006b3SVijay Mahadevan   dm->ops->getlocaltoglobalmapping  = NULL;
1470304006b3SVijay Mahadevan   dm->ops->createfieldis            = NULL;
1471304006b3SVijay Mahadevan   dm->ops->createcoordinatedm       = NULL /* DMCreateCoordinateDM_Moab */;
1472304006b3SVijay Mahadevan   dm->ops->getcoloring              = NULL;
1473304006b3SVijay Mahadevan   dm->ops->creatematrix             = DMCreateMatrix_Moab;
1474304006b3SVijay Mahadevan   dm->ops->createinterpolation      = DMCreateInterpolation_Moab;
14755a84ad33SLisandro Dalcin   dm->ops->createinjection          = NULL /* DMCreateInjection_Moab */;
1476304006b3SVijay Mahadevan   dm->ops->refine                   = DMRefine_Moab;
1477304006b3SVijay Mahadevan   dm->ops->coarsen                  = DMCoarsen_Moab;
1478304006b3SVijay Mahadevan   dm->ops->refinehierarchy          = DMRefineHierarchy_Moab;
1479304006b3SVijay Mahadevan   dm->ops->coarsenhierarchy         = DMCoarsenHierarchy_Moab;
1480304006b3SVijay Mahadevan   dm->ops->globaltolocalbegin       = DMGlobalToLocalBegin_Moab;
1481304006b3SVijay Mahadevan   dm->ops->globaltolocalend         = DMGlobalToLocalEnd_Moab;
1482304006b3SVijay Mahadevan   dm->ops->localtoglobalbegin       = DMLocalToGlobalBegin_Moab;
1483304006b3SVijay Mahadevan   dm->ops->localtoglobalend         = DMLocalToGlobalEnd_Moab;
1484304006b3SVijay Mahadevan   dm->ops->destroy                  = DMDestroy_Moab;
1485304006b3SVijay Mahadevan   dm->ops->createsubdm              = NULL /* DMCreateSubDM_Moab */;
1486304006b3SVijay Mahadevan   dm->ops->getdimpoints             = NULL /* DMGetDimPoints_Moab */;
1487304006b3SVijay Mahadevan   dm->ops->locatepoints             = NULL /* DMLocatePoints_Moab */;
14883ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1489304006b3SVijay Mahadevan }
1490304006b3SVijay Mahadevan 
1491d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm)
1492d71ae5a4SJacob Faibussowitsch {
1493304006b3SVijay Mahadevan   PetscFunctionBegin;
1494304006b3SVijay Mahadevan   /* get all the necessary handles from the private DM object */
1495304006b3SVijay Mahadevan   (*newdm)->data = (DM_Moab *)dm->data;
1496304006b3SVijay Mahadevan   ((DM_Moab *)dm->data)->refct++;
1497304006b3SVijay Mahadevan 
14989566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)*newdm, DMMOAB));
14999566063dSJacob Faibussowitsch   PetscCall(DMInitialize_Moab(*newdm));
15003ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1501304006b3SVijay Mahadevan }
1502304006b3SVijay Mahadevan 
1503d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
1504d71ae5a4SJacob Faibussowitsch {
1505f6829af0SVijay Mahadevan   PetscFunctionBegin;
1506f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
15074dfa11a4SJacob Faibussowitsch   PetscCall(PetscNew((DM_Moab **)&dm->data));
1508f6829af0SVijay Mahadevan 
1509f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->bs            = 1;
1510f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->numFields     = 1;
1511f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->n             = 0;
1512f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->nloc          = 0;
1513f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->nghost        = 0;
1514f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->nele          = 0;
1515f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->neleloc       = 0;
1516f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->neleghost     = 0;
1517c528d872SBarry Smith   ((DM_Moab *)dm->data)->ltog_map      = NULL;
1518c528d872SBarry Smith   ((DM_Moab *)dm->data)->ltog_sendrecv = NULL;
1519f6829af0SVijay Mahadevan 
1520304006b3SVijay Mahadevan   ((DM_Moab *)dm->data)->refct  = 1;
1521304006b3SVijay Mahadevan   ((DM_Moab *)dm->data)->parent = NULL;
1522f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->vlocal = new moab::Range();
1523f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->vowned = new moab::Range();
1524f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->vghost = new moab::Range();
1525f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->elocal = new moab::Range();
1526f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->eghost = new moab::Range();
1527f6829af0SVijay Mahadevan 
15289566063dSJacob Faibussowitsch   PetscCall(DMInitialize_Moab(dm));
15293ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1530f6829af0SVijay Mahadevan }
1531