xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 08401ef684002a709c6d3db98a0c9f54a8bcf1ec)
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 
21c6ef30f9SVijay Mahadevan .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 
651d72bce8STim Tautges @*/
66032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
671d72bce8STim Tautges {
681d72bce8STim Tautges   PetscFunctionBegin;
69032b8ab6SVijay Mahadevan   PetscValidPointer(dmb, 2);
709566063dSJacob Faibussowitsch   PetscCall(DMCreate(comm, dmb));
719566063dSJacob Faibussowitsch   PetscCall(DMSetType(*dmb, DMMOAB));
721d72bce8STim Tautges   PetscFunctionReturn(0);
731d72bce8STim Tautges }
741d72bce8STim Tautges 
75cab5ea25SPierre Jolivet /*@C
76b117cd09SVijay Mahadevan   DMMoabCreateMoab - Creates a DMMoab object, optionally from an instance and other data
771d72bce8STim Tautges 
78d083f849SBarry Smith   Collective
791d72bce8STim Tautges 
80d8d19677SJose E. Roman   Input Parameters:
81a2b725a8SWilliam Gropp + comm - The communicator for the DMMoab object
82032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
83a4d2169cSTim Tautges          along with the DMMoab
841d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
85a2b725a8SWilliam Gropp - range - If non-NULL, contains range of entities to which DOFs will be assigned
861d72bce8STim Tautges 
871d72bce8STim Tautges   Output Parameter:
88032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
891d72bce8STim Tautges 
90032b8ab6SVijay Mahadevan   Level: intermediate
911d72bce8STim Tautges 
921d72bce8STim Tautges @*/
939daf19fdSVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
941d72bce8STim Tautges {
95032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
9685d305f5SVijay Mahadevan   DM             dmmb;
97853cdec3SJed Brown   DM_Moab        *dmmoab;
981d72bce8STim Tautges 
991d72bce8STim Tautges   PetscFunctionBegin;
100032b8ab6SVijay Mahadevan   PetscValidPointer(dmb, 6);
10185d305f5SVijay Mahadevan 
1029566063dSJacob Faibussowitsch   PetscCall(DMMoabCreate(comm, &dmmb));
10385d305f5SVijay Mahadevan   dmmoab = (DM_Moab*)(dmmb)->data;
104a4d2169cSTim Tautges 
105a4d2169cSTim Tautges   if (!mbiface) {
10672ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
1077d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
1081d72bce8STim Tautges   }
1091cec0304SVijay Mahadevan   else {
1101cec0304SVijay Mahadevan     dmmoab->mbiface = mbiface;
1117d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
1121cec0304SVijay Mahadevan   }
1131cec0304SVijay Mahadevan 
114b5410836SVijay Mahadevan   /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */
115b5410836SVijay Mahadevan   dmmoab->fileset = 0;
116b117cd09SVijay Mahadevan   dmmoab->hlevel = 0;
11749d66b22SVijay Mahadevan   dmmoab->nghostrings = 0;
1187d89fc02STim Tautges 
1199daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1209daf19fdSVijay Mahadevan   moab::EntityHandle partnset;
121032b8ab6SVijay Mahadevan 
122db66d124SVijay Mahadevan   /* Create root sets for each mesh.  Then pass these
123db66d124SVijay Mahadevan       to the load_file functions to be populated. */
1240c8a2322SVijay Mahadevan   merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset); MBERR("Creating partition set failed", merr);
125032b8ab6SVijay Mahadevan 
126db66d124SVijay Mahadevan   /* Create the parallel communicator object with the partition handle associated with MOAB */
12772ff976dSVijay Mahadevan   dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
1289daf19fdSVijay Mahadevan #endif
129032b8ab6SVijay Mahadevan 
1304973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
1314973de03SVijay Mahadevan   dmmoab->bs = 1;
132addae81cSVijay Mahadevan   dmmoab->numFields = 1;
1339566063dSJacob Faibussowitsch   PetscCall(PetscMalloc(dmmoab->numFields * sizeof(char*), &dmmoab->fieldNames));
1349566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy("DEFAULT", (char**) &dmmoab->fieldNames[0]));
1352e4e7c01SVijay Mahadevan   dmmoab->rw_dbglevel = 0;
1362e4e7c01SVijay Mahadevan   dmmoab->partition_by_rank = PETSC_FALSE;
1372e4e7c01SVijay Mahadevan   dmmoab->extra_read_options[0] = '\0';
1382e4e7c01SVijay Mahadevan   dmmoab->extra_write_options[0] = '\0';
1392e4e7c01SVijay Mahadevan   dmmoab->read_mode = READ_PART;
1402e4e7c01SVijay Mahadevan   dmmoab->write_mode = WRITE_PART;
1414973de03SVijay Mahadevan 
1424973de03SVijay Mahadevan   /* set global ID tag handle */
1431a845d2aSVijay Mahadevan   if (ltog_tag && *ltog_tag) {
1449566063dSJacob Faibussowitsch     PetscCall(DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag));
145032b8ab6SVijay Mahadevan   }
146032b8ab6SVijay Mahadevan   else {
1471a845d2aSVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag); MBERRNM(merr);
1481a845d2aSVijay Mahadevan     if (ltog_tag) *ltog_tag = dmmoab->ltog_tag;
149a4d2169cSTim Tautges   }
150a4d2169cSTim Tautges 
151340f3b9aSVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag); MBERRNM(merr);
152340f3b9aSVijay Mahadevan 
1534973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
154a4d2169cSTim Tautges   if (range) {
1559566063dSJacob Faibussowitsch     PetscCall(DMMoabSetLocalVertices(dmmb, range));
156a4d2169cSTim Tautges   }
15785d305f5SVijay Mahadevan   *dmb = dmmb;
1581d72bce8STim Tautges   PetscFunctionReturn(0);
1591d72bce8STim Tautges }
1601d72bce8STim Tautges 
1619daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1621d72bce8STim Tautges 
163cab5ea25SPierre Jolivet /*@C
164aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
165aa768e4cSTim Tautges 
166d083f849SBarry Smith   Collective
167aa768e4cSTim Tautges 
168aa768e4cSTim Tautges   Input Parameter:
169aa768e4cSTim Tautges . dm    - The DMMoab object being set
170aa768e4cSTim Tautges 
171aa768e4cSTim Tautges   Output Parameter:
172aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
173aa768e4cSTim Tautges 
174aa768e4cSTim Tautges   Level: beginner
175aa768e4cSTim Tautges 
176aa768e4cSTim Tautges @*/
1771d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm, moab::ParallelComm **pcomm)
1781d72bce8STim Tautges {
1791d72bce8STim Tautges   PetscFunctionBegin;
1801d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
181032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
1821d72bce8STim Tautges   PetscFunctionReturn(0);
1831d72bce8STim Tautges }
1841d72bce8STim Tautges 
1859daf19fdSVijay Mahadevan #endif /* MOAB_HAVE_MPI */
1869daf19fdSVijay Mahadevan 
187cab5ea25SPierre Jolivet /*@C
188aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
189aa768e4cSTim Tautges 
190d083f849SBarry Smith   Collective
191aa768e4cSTim Tautges 
192d8d19677SJose E. Roman   Input Parameters:
193a2b725a8SWilliam Gropp + dm      - The DMMoab object being set
194a2b725a8SWilliam Gropp - mbiface - The MOAB instance being set on this DMMoab
195aa768e4cSTim Tautges 
196aa768e4cSTim Tautges   Level: beginner
197aa768e4cSTim Tautges 
198aa768e4cSTim Tautges @*/
199a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm, moab::Interface *mbiface)
2001d72bce8STim Tautges {
201032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
202032b8ab6SVijay Mahadevan 
2031d72bce8STim Tautges   PetscFunctionBegin;
2041d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2051cec0304SVijay Mahadevan   PetscValidPointer(mbiface, 2);
2069daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
207032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
2089daf19fdSVijay Mahadevan #endif
209032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
210032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
2111d72bce8STim Tautges   PetscFunctionReturn(0);
2121d72bce8STim Tautges }
2131d72bce8STim Tautges 
214cab5ea25SPierre Jolivet /*@C
215aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
216aa768e4cSTim Tautges 
217d083f849SBarry Smith   Collective
218aa768e4cSTim Tautges 
219aa768e4cSTim Tautges   Input Parameter:
220aa768e4cSTim Tautges . dm      - The DMMoab object being set
221aa768e4cSTim Tautges 
222aa768e4cSTim Tautges   Output Parameter:
223aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
224aa768e4cSTim Tautges 
225aa768e4cSTim Tautges   Level: beginner
226aa768e4cSTim Tautges 
227aa768e4cSTim Tautges @*/
228a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm, moab::Interface **mbiface)
2291d72bce8STim Tautges {
230cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
231cabb514dSBarry Smith 
2321d72bce8STim Tautges   PetscFunctionBegin;
2331d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2349566063dSJacob Faibussowitsch   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, K. and Stimpson, C. and Ernst, C.},\n  year = {2004},  note = {Report}\n}\n", &cite));
235a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
2361d72bce8STim Tautges   PetscFunctionReturn(0);
2371d72bce8STim Tautges }
2381d72bce8STim Tautges 
239cab5ea25SPierre Jolivet /*@C
2405eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
241aa768e4cSTim Tautges 
242d083f849SBarry Smith   Collective
243aa768e4cSTim Tautges 
244d8d19677SJose E. Roman   Input Parameters:
245a2b725a8SWilliam Gropp + dm    - The DMMoab object being set
246a2b725a8SWilliam Gropp - range - The entities treated by this DMMoab
247aa768e4cSTim Tautges 
248aa768e4cSTim Tautges   Level: beginner
249aa768e4cSTim Tautges 
250aa768e4cSTim Tautges @*/
2515eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm, moab::Range *range)
2521d72bce8STim Tautges {
253fd3326ddSVijay Mahadevan   moab::Range     tmpvtxs;
254032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
255032b8ab6SVijay Mahadevan 
2561d72bce8STim Tautges   PetscFunctionBegin;
2571d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
258032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
259032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
260fd3326ddSVijay Mahadevan 
261032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
262fd3326ddSVijay Mahadevan 
2639daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
2649daf19fdSVijay Mahadevan   moab::ErrorCode merr;
265fd3326ddSVijay Mahadevan   /* filter based on parallel status */
266fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned); MBERRNM(merr);
267fd3326ddSVijay Mahadevan 
268fd3326ddSVijay Mahadevan   /* filter all the non-owned and shared entities out of the list */
269fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
270fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(tmpvtxs, PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost); MBERRNM(merr);
271fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost);
272fd3326ddSVijay Mahadevan   *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs);
2739daf19fdSVijay Mahadevan #else
2749daf19fdSVijay Mahadevan   *dmmoab->vowned = *dmmoab->vlocal;
2759daf19fdSVijay Mahadevan #endif
276fd3326ddSVijay Mahadevan 
277fd3326ddSVijay Mahadevan   /* compute and cache the sizes of local and ghosted entities */
278032b8ab6SVijay Mahadevan   dmmoab->nloc = dmmoab->vowned->size();
279032b8ab6SVijay Mahadevan   dmmoab->nghost = dmmoab->vghost->size();
2809daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
2811c2dc1cbSBarry Smith   PetscCall(MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm));
2829daf19fdSVijay Mahadevan #else
2839daf19fdSVijay Mahadevan   dmmoab->n = dmmoab->nloc;
2849daf19fdSVijay Mahadevan #endif
2851d72bce8STim Tautges   PetscFunctionReturn(0);
2861d72bce8STim Tautges }
2871d72bce8STim Tautges 
288cab5ea25SPierre Jolivet /*@C
2898d8d51c8SVijay Mahadevan   DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab
2908d8d51c8SVijay Mahadevan 
291d083f849SBarry Smith   Collective
2928d8d51c8SVijay Mahadevan 
2938d8d51c8SVijay Mahadevan   Input Parameter:
2948d8d51c8SVijay Mahadevan . dm    - The DMMoab object being set
2958d8d51c8SVijay Mahadevan 
2968d8d51c8SVijay Mahadevan   Output Parameter:
2978d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted)
2988d8d51c8SVijay Mahadevan 
2998d8d51c8SVijay Mahadevan   Level: beginner
3008d8d51c8SVijay Mahadevan 
3018d8d51c8SVijay Mahadevan @*/
3028d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm, moab::Range *local)
3038d8d51c8SVijay Mahadevan {
3048d8d51c8SVijay Mahadevan   PetscFunctionBegin;
3058d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
3068d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab*)dm->data)->vlocal;
3078d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
3088d8d51c8SVijay Mahadevan }
3098d8d51c8SVijay Mahadevan 
310cab5ea25SPierre Jolivet /*@C
3115eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
312aa768e4cSTim Tautges 
313d083f849SBarry Smith   Collective
314aa768e4cSTim Tautges 
315aa768e4cSTim Tautges   Input Parameter:
316aa768e4cSTim Tautges . dm    - The DMMoab object being set
317aa768e4cSTim Tautges 
318a2b725a8SWilliam Gropp   Output Parameters:
319a2b725a8SWilliam Gropp + owned - The owned vertex entities in this DMMoab
320a2b725a8SWilliam Gropp - ghost - The ghosted entities (non-owned) stored locally in this partition
321aa768e4cSTim Tautges 
322aa768e4cSTim Tautges   Level: beginner
323aa768e4cSTim Tautges 
324aa768e4cSTim Tautges @*/
325351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm, const moab::Range **owned, const moab::Range **ghost)
3261d72bce8STim Tautges {
3271d72bce8STim Tautges   PetscFunctionBegin;
3281d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
329351b8a77SVijay Mahadevan   if (owned) *owned = ((DM_Moab*)dm->data)->vowned;
330351b8a77SVijay Mahadevan   if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost;
3311d72bce8STim Tautges   PetscFunctionReturn(0);
3321d72bce8STim Tautges }
3331d72bce8STim Tautges 
334cab5ea25SPierre Jolivet /*@C
3355eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
3365eb88e9dSVijay Mahadevan 
337d083f849SBarry Smith   Collective
3385eb88e9dSVijay Mahadevan 
3395eb88e9dSVijay Mahadevan   Input Parameter:
3405eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
3415eb88e9dSVijay Mahadevan 
3425eb88e9dSVijay Mahadevan   Output Parameter:
3435eb88e9dSVijay Mahadevan . range - The entities owned locally
3445eb88e9dSVijay Mahadevan 
3455eb88e9dSVijay Mahadevan   Level: beginner
3465eb88e9dSVijay Mahadevan 
3475eb88e9dSVijay Mahadevan @*/
348351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm, const moab::Range **range)
3495eb88e9dSVijay Mahadevan {
3505eb88e9dSVijay Mahadevan   PetscFunctionBegin;
3515eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
352351b8a77SVijay Mahadevan   if (range) *range = ((DM_Moab*)dm->data)->elocal;
3531cec0304SVijay Mahadevan   PetscFunctionReturn(0);
3541cec0304SVijay Mahadevan }
3551cec0304SVijay Mahadevan 
356cab5ea25SPierre Jolivet /*@C
3571cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
3581cec0304SVijay Mahadevan 
359d083f849SBarry Smith   Collective
3601cec0304SVijay Mahadevan 
361a2b725a8SWilliam Gropp   Input Parameters:
362a2b725a8SWilliam Gropp + dm    - The DMMoab object being set
363a2b725a8SWilliam Gropp - range - The entities treated by this DMMoab
3641cec0304SVijay Mahadevan 
3651cec0304SVijay Mahadevan   Level: beginner
3661cec0304SVijay Mahadevan 
3671cec0304SVijay Mahadevan @*/
3681cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm, moab::Range *range)
3691cec0304SVijay Mahadevan {
3701cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
3711cec0304SVijay Mahadevan 
3721cec0304SVijay Mahadevan   PetscFunctionBegin;
3731cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
3741cec0304SVijay Mahadevan   dmmoab->elocal->clear();
3751cec0304SVijay Mahadevan   dmmoab->eghost->clear();
3761cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
3779daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
3789daf19fdSVijay Mahadevan   moab::ErrorCode merr;
3791cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
3801cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
3819daf19fdSVijay Mahadevan #endif
3821cec0304SVijay Mahadevan   dmmoab->neleloc = dmmoab->elocal->size();
38341dd5348SVijay Mahadevan   dmmoab->neleghost = dmmoab->eghost->size();
3849daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
3851c2dc1cbSBarry Smith   PetscCall(MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm));
3867d3de750SJacob Faibussowitsch   PetscInfo(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele);
3879daf19fdSVijay Mahadevan #else
3889daf19fdSVijay Mahadevan   dmmoab->nele = dmmoab->neleloc;
3899daf19fdSVijay Mahadevan #endif
3905eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
3915eb88e9dSVijay Mahadevan }
3925eb88e9dSVijay Mahadevan 
393cab5ea25SPierre Jolivet /*@C
394aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
395aa768e4cSTim Tautges 
396d083f849SBarry Smith   Collective
397aa768e4cSTim Tautges 
398a2b725a8SWilliam Gropp   Input Parameters:
399a2b725a8SWilliam Gropp + dm      - The DMMoab object being set
400a2b725a8SWilliam Gropp - ltogtag - The MOAB tag used for local to global ids
401aa768e4cSTim Tautges 
402aa768e4cSTim Tautges   Level: beginner
403aa768e4cSTim Tautges 
404aa768e4cSTim Tautges @*/
4051d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm, moab::Tag ltogtag)
4061d72bce8STim Tautges {
4071d72bce8STim Tautges   PetscFunctionBegin;
4081d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4091d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
4101d72bce8STim Tautges   PetscFunctionReturn(0);
4111d72bce8STim Tautges }
4121d72bce8STim Tautges 
413cab5ea25SPierre Jolivet /*@C
414aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
415aa768e4cSTim Tautges 
416d083f849SBarry Smith   Collective
417aa768e4cSTim Tautges 
418aa768e4cSTim Tautges   Input Parameter:
419aa768e4cSTim Tautges . dm      - The DMMoab object being set
420aa768e4cSTim Tautges 
421aa768e4cSTim Tautges   Output Parameter:
422aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
423aa768e4cSTim Tautges 
424aa768e4cSTim Tautges   Level: beginner
425aa768e4cSTim Tautges 
426aa768e4cSTim Tautges @*/
4271d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm, moab::Tag *ltog_tag)
4281d72bce8STim Tautges {
4291d72bce8STim Tautges   PetscFunctionBegin;
4301d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4311d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
4321d72bce8STim Tautges   PetscFunctionReturn(0);
4331d72bce8STim Tautges }
4341d72bce8STim Tautges 
435cab5ea25SPierre Jolivet /*@C
436aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
437aa768e4cSTim Tautges 
438d083f849SBarry Smith   Collective
439aa768e4cSTim Tautges 
440d8d19677SJose E. Roman   Input Parameters:
441a2b725a8SWilliam Gropp + dm - The DMMoab object being set
442a2b725a8SWilliam Gropp - bs - The block size used with this DMMoab
443aa768e4cSTim Tautges 
444aa768e4cSTim Tautges   Level: beginner
445aa768e4cSTim Tautges 
446aa768e4cSTim Tautges @*/
4471d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm, PetscInt bs)
4481d72bce8STim Tautges {
4491d72bce8STim Tautges   PetscFunctionBegin;
4501d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4511d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
4521d72bce8STim Tautges   PetscFunctionReturn(0);
4531d72bce8STim Tautges }
4541d72bce8STim Tautges 
455cab5ea25SPierre Jolivet /*@C
456aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
457aa768e4cSTim Tautges 
458d083f849SBarry Smith   Collective
459aa768e4cSTim Tautges 
460aa768e4cSTim Tautges   Input Parameter:
461aa768e4cSTim Tautges . dm - The DMMoab object being set
462aa768e4cSTim Tautges 
463aa768e4cSTim Tautges   Output Parameter:
464aa768e4cSTim Tautges . bs - The block size used with this DMMoab
465aa768e4cSTim Tautges 
466aa768e4cSTim Tautges   Level: beginner
467aa768e4cSTim Tautges 
468aa768e4cSTim Tautges @*/
4691d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm, PetscInt *bs)
4701d72bce8STim Tautges {
4711d72bce8STim Tautges   PetscFunctionBegin;
4721d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4731d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
4741d72bce8STim Tautges   PetscFunctionReturn(0);
4751d72bce8STim Tautges }
4761d72bce8STim Tautges 
477cab5ea25SPierre Jolivet /*@C
478212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
479212ad6d1SVijay Mahadevan 
480d083f849SBarry Smith   Collective on dm
481212ad6d1SVijay Mahadevan 
482212ad6d1SVijay Mahadevan   Input Parameter:
483212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
484212ad6d1SVijay Mahadevan 
485d8d19677SJose E. Roman   Output Parameters:
486a2b725a8SWilliam Gropp + neg - The number of global elements in the DMMoab instance
487a2b725a8SWilliam Gropp - nvg - The number of global vertices in the DMMoab instance
488212ad6d1SVijay Mahadevan 
489212ad6d1SVijay Mahadevan   Level: beginner
490212ad6d1SVijay Mahadevan 
491212ad6d1SVijay Mahadevan @*/
49241dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm, PetscInt *neg, PetscInt *nvg)
493212ad6d1SVijay Mahadevan {
494212ad6d1SVijay Mahadevan   PetscFunctionBegin;
495212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
49641dd5348SVijay Mahadevan   if (neg) *neg = ((DM_Moab*)dm->data)->nele;
49741dd5348SVijay Mahadevan   if (nvg) *nvg = ((DM_Moab*)dm->data)->n;
498212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
499212ad6d1SVijay Mahadevan }
500212ad6d1SVijay Mahadevan 
501cab5ea25SPierre Jolivet /*@C
502212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
503212ad6d1SVijay Mahadevan 
504d083f849SBarry Smith   Collective on dm
505212ad6d1SVijay Mahadevan 
506212ad6d1SVijay Mahadevan   Input Parameter:
507212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
508212ad6d1SVijay Mahadevan 
509d8d19677SJose E. Roman   Output Parameters:
510b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor
51100cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor
51200cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor
513a2b725a8SWilliam Gropp - nvg - The number of ghosted vertices in this processor
514212ad6d1SVijay Mahadevan 
515212ad6d1SVijay Mahadevan   Level: beginner
516212ad6d1SVijay Mahadevan 
517212ad6d1SVijay Mahadevan @*/
51841dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm, PetscInt *nel, PetscInt *neg, PetscInt *nvl, PetscInt *nvg)
519212ad6d1SVijay Mahadevan {
520212ad6d1SVijay Mahadevan   PetscFunctionBegin;
521212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
52241dd5348SVijay Mahadevan   if (nel) *nel = ((DM_Moab*)dm->data)->neleloc;
52341dd5348SVijay Mahadevan   if (neg) *neg = ((DM_Moab*)dm->data)->neleghost;
52441dd5348SVijay Mahadevan   if (nvl) *nvl = ((DM_Moab*)dm->data)->nloc;
52541dd5348SVijay Mahadevan   if (nvg) *nvg = ((DM_Moab*)dm->data)->nghost;
526212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
527212ad6d1SVijay Mahadevan }
528212ad6d1SVijay Mahadevan 
529cab5ea25SPierre Jolivet /*@C
53000cc10feSVijay Mahadevan   DMMoabGetOffset - Get the local offset for the global vector
53100cc10feSVijay Mahadevan 
532d083f849SBarry Smith   Collective
53300cc10feSVijay Mahadevan 
53400cc10feSVijay Mahadevan   Input Parameter:
53500cc10feSVijay Mahadevan . dm - The DMMoab object being set
53600cc10feSVijay Mahadevan 
53700cc10feSVijay Mahadevan   Output Parameter:
53800cc10feSVijay Mahadevan . offset - The local offset for the global vector
53900cc10feSVijay Mahadevan 
54000cc10feSVijay Mahadevan   Level: beginner
54100cc10feSVijay Mahadevan 
54200cc10feSVijay Mahadevan @*/
54300cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm, PetscInt *offset)
54400cc10feSVijay Mahadevan {
54500cc10feSVijay Mahadevan   PetscFunctionBegin;
54600cc10feSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
54700cc10feSVijay Mahadevan   *offset = ((DM_Moab*)dm->data)->vstart;
54800cc10feSVijay Mahadevan   PetscFunctionReturn(0);
54900cc10feSVijay Mahadevan }
55000cc10feSVijay Mahadevan 
551cab5ea25SPierre Jolivet /*@C
5524920ab11SVijay Mahadevan   DMMoabGetDimension - Get the dimension of the DM Mesh
5534920ab11SVijay Mahadevan 
554d083f849SBarry Smith   Collective
5554920ab11SVijay Mahadevan 
5564920ab11SVijay Mahadevan   Input Parameter:
557340f3b9aSVijay Mahadevan . dm - The DMMoab object
5584920ab11SVijay Mahadevan 
5594920ab11SVijay Mahadevan   Output Parameter:
5604920ab11SVijay Mahadevan . dim - The dimension of DM
5614920ab11SVijay Mahadevan 
5624920ab11SVijay Mahadevan   Level: beginner
5634920ab11SVijay Mahadevan 
5644920ab11SVijay Mahadevan @*/
5654920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm, PetscInt *dim)
5664920ab11SVijay Mahadevan {
5674920ab11SVijay Mahadevan   PetscFunctionBegin;
5684920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
5694920ab11SVijay Mahadevan   *dim = ((DM_Moab*)dm->data)->dim;
5704920ab11SVijay Mahadevan   PetscFunctionReturn(0);
5714920ab11SVijay Mahadevan }
5724920ab11SVijay Mahadevan 
573cab5ea25SPierre Jolivet /*@C
574755f3dfbSVijay Mahadevan   DMMoabGetHierarchyLevel - Get the current level of the mesh hierarchy
575755f3dfbSVijay Mahadevan   generated through uniform refinement.
576755f3dfbSVijay Mahadevan 
577d083f849SBarry Smith   Collective on dm
578755f3dfbSVijay Mahadevan 
579755f3dfbSVijay Mahadevan   Input Parameter:
580755f3dfbSVijay Mahadevan . dm - The DMMoab object being set
581755f3dfbSVijay Mahadevan 
582755f3dfbSVijay Mahadevan   Output Parameter:
583755f3dfbSVijay Mahadevan . nvg - The current mesh hierarchy level
584755f3dfbSVijay Mahadevan 
585755f3dfbSVijay Mahadevan   Level: beginner
586755f3dfbSVijay Mahadevan 
587755f3dfbSVijay Mahadevan @*/
588755f3dfbSVijay Mahadevan PetscErrorCode DMMoabGetHierarchyLevel(DM dm, PetscInt *nlevel)
589755f3dfbSVijay Mahadevan {
590755f3dfbSVijay Mahadevan   PetscFunctionBegin;
591755f3dfbSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
592755f3dfbSVijay Mahadevan   if (nlevel) *nlevel = ((DM_Moab*)dm->data)->hlevel;
593755f3dfbSVijay Mahadevan   PetscFunctionReturn(0);
594755f3dfbSVijay Mahadevan }
595755f3dfbSVijay Mahadevan 
596cab5ea25SPierre Jolivet /*@C
597340f3b9aSVijay Mahadevan   DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh
598340f3b9aSVijay Mahadevan 
599d083f849SBarry Smith   Collective
600340f3b9aSVijay Mahadevan 
601d8d19677SJose E. Roman   Input Parameters:
602a2b725a8SWilliam Gropp + dm - The DMMoab object
603a2b725a8SWilliam Gropp - ehandle - The element entity handle
604340f3b9aSVijay Mahadevan 
605340f3b9aSVijay Mahadevan   Output Parameter:
606340f3b9aSVijay Mahadevan . mat - The material ID for the current entity
607340f3b9aSVijay Mahadevan 
608340f3b9aSVijay Mahadevan   Level: beginner
609340f3b9aSVijay Mahadevan 
610340f3b9aSVijay Mahadevan @*/
611340f3b9aSVijay Mahadevan PetscErrorCode DMMoabGetMaterialBlock(DM dm, const moab::EntityHandle ehandle, PetscInt *mat)
612340f3b9aSVijay Mahadevan {
613340f3b9aSVijay Mahadevan   DM_Moab         *dmmoab;
614340f3b9aSVijay Mahadevan 
615340f3b9aSVijay Mahadevan   PetscFunctionBegin;
616340f3b9aSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
617340f3b9aSVijay Mahadevan   if (*mat) {
618340f3b9aSVijay Mahadevan     dmmoab = (DM_Moab*)(dm)->data;
619a044f6b6SVijay Mahadevan     *mat = dmmoab->materials[dmmoab->elocal->index(ehandle)];
620340f3b9aSVijay Mahadevan   }
621340f3b9aSVijay Mahadevan   PetscFunctionReturn(0);
622340f3b9aSVijay Mahadevan }
623340f3b9aSVijay Mahadevan 
624cab5ea25SPierre Jolivet /*@C
62585d305f5SVijay Mahadevan   DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities
62685d305f5SVijay Mahadevan 
627d083f849SBarry Smith   Collective
62885d305f5SVijay Mahadevan 
629d8d19677SJose E. Roman   Input Parameters:
630a2b725a8SWilliam Gropp + dm - The DMMoab object
63185d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
632a2b725a8SWilliam Gropp - conn - The vertex entity handles
63385d305f5SVijay Mahadevan 
63485d305f5SVijay Mahadevan   Output Parameter:
63585d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities
63685d305f5SVijay Mahadevan 
63785d305f5SVijay Mahadevan   Level: beginner
63885d305f5SVijay Mahadevan 
63985d305f5SVijay Mahadevan .seealso: DMMoabGetVertexConnectivity()
64085d305f5SVijay Mahadevan @*/
641cade3ad9SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm, PetscInt nconn, const moab::EntityHandle *conn, PetscReal *vpos)
6427023aa44SVijay Mahadevan {
6437023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
6447023aa44SVijay Mahadevan   moab::ErrorCode merr;
6457023aa44SVijay Mahadevan 
6467023aa44SVijay Mahadevan   PetscFunctionBegin;
6477023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
6487023aa44SVijay Mahadevan   PetscValidPointer(conn, 3);
6499c368985SVijay Mahadevan   PetscValidPointer(vpos, 4);
6507023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6517023aa44SVijay Mahadevan 
6527023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
6539c368985SVijay Mahadevan   if (dmmoab->hlevel) {
6549c368985SVijay Mahadevan     merr = dmmoab->hierarchy->get_coordinates(const_cast<moab::EntityHandle*>(conn), nconn, dmmoab->hlevel, vpos);MBERRNM(merr);
6559c368985SVijay Mahadevan   }
6569c368985SVijay Mahadevan   else {
6577023aa44SVijay Mahadevan     merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
6589c368985SVijay Mahadevan   }
6597023aa44SVijay Mahadevan   PetscFunctionReturn(0);
6607023aa44SVijay Mahadevan }
6617023aa44SVijay Mahadevan 
662cab5ea25SPierre Jolivet /*@C
66385d305f5SVijay Mahadevan   DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity
66485d305f5SVijay Mahadevan 
665d083f849SBarry Smith   Collective
66685d305f5SVijay Mahadevan 
667d8d19677SJose E. Roman   Input Parameters:
668a2b725a8SWilliam Gropp + dm - The DMMoab object
669a2b725a8SWilliam Gropp - vhandle - Vertex entity handle
67085d305f5SVijay Mahadevan 
671d8d19677SJose E. Roman   Output Parameters:
672a2b725a8SWilliam Gropp + nconn - Number of entities whose coordinates are needed
673a2b725a8SWilliam Gropp - conn - The vertex entity handles
67485d305f5SVijay Mahadevan 
67585d305f5SVijay Mahadevan   Level: beginner
67685d305f5SVijay Mahadevan 
67785d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabRestoreVertexConnectivity()
67885d305f5SVijay Mahadevan @*/
67985d305f5SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm, moab::EntityHandle vhandle, PetscInt* nconn, moab::EntityHandle **conn)
6808d8d51c8SVijay Mahadevan {
6818d8d51c8SVijay Mahadevan   DM_Moab        *dmmoab;
6828d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities, connect;
6838d8d51c8SVijay Mahadevan   moab::ErrorCode merr;
6848d8d51c8SVijay Mahadevan 
6858d8d51c8SVijay Mahadevan   PetscFunctionBegin;
6868d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
6878d8d51c8SVijay Mahadevan   PetscValidPointer(conn, 4);
6888d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6898d8d51c8SVijay Mahadevan 
6908d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
69185d305f5SVijay Mahadevan   merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION); MBERRNM(merr);
6928d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0], adj_entities.size(), connect); MBERRNM(merr);
6938d8d51c8SVijay Mahadevan 
6948d8d51c8SVijay Mahadevan   if (conn) {
6959566063dSJacob Faibussowitsch     PetscCall(PetscMalloc(sizeof(moab::EntityHandle) * connect.size(), conn));
6969566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(*conn, &connect[0], connect.size()));
6978d8d51c8SVijay Mahadevan   }
6988d8d51c8SVijay Mahadevan   if (nconn) *nconn = connect.size();
6998d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
7008d8d51c8SVijay Mahadevan }
7018d8d51c8SVijay Mahadevan 
702cab5ea25SPierre Jolivet /*@C
70385d305f5SVijay Mahadevan   DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity
70485d305f5SVijay Mahadevan 
705d083f849SBarry Smith   Collective
70685d305f5SVijay Mahadevan 
707d8d19677SJose E. Roman   Input Parameters:
708a2b725a8SWilliam Gropp + dm - The DMMoab object
70985d305f5SVijay Mahadevan . vhandle - Vertex entity handle
71085d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
711a2b725a8SWilliam Gropp - conn - The vertex entity handles
71285d305f5SVijay Mahadevan 
71385d305f5SVijay Mahadevan   Level: beginner
71485d305f5SVijay Mahadevan 
71585d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity()
71685d305f5SVijay Mahadevan @*/
7178d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt* nconn, moab::EntityHandle **conn)
7188d8d51c8SVijay Mahadevan {
7198d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7208d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
7218d8d51c8SVijay Mahadevan   PetscValidPointer(conn, 4);
7228d8d51c8SVijay Mahadevan 
7238d8d51c8SVijay Mahadevan   if (conn) {
7249566063dSJacob Faibussowitsch     PetscCall(PetscFree(*conn));
7258d8d51c8SVijay Mahadevan   }
7268d8d51c8SVijay Mahadevan   if (nconn) *nconn = 0;
7278d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
7288d8d51c8SVijay Mahadevan }
7298d8d51c8SVijay Mahadevan 
730cab5ea25SPierre Jolivet /*@C
73185d305f5SVijay Mahadevan   DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity
73285d305f5SVijay Mahadevan 
733d083f849SBarry Smith   Collective
73485d305f5SVijay Mahadevan 
735d8d19677SJose E. Roman   Input Parameters:
736a2b725a8SWilliam Gropp + dm - The DMMoab object
737a2b725a8SWilliam Gropp - ehandle - Vertex entity handle
73885d305f5SVijay Mahadevan 
739d8d19677SJose E. Roman   Output Parameters:
740a2b725a8SWilliam Gropp + nconn - Number of entities whose coordinates are needed
741a2b725a8SWilliam Gropp - conn - The vertex entity handles
74285d305f5SVijay Mahadevan 
74385d305f5SVijay Mahadevan   Level: beginner
74485d305f5SVijay Mahadevan 
74585d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity(), DMMoabRestoreVertexConnectivity()
74685d305f5SVijay Mahadevan @*/
7477023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt* nconn, const moab::EntityHandle **conn)
7487023aa44SVijay Mahadevan {
7497023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
7507023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
7519c368985SVijay Mahadevan   std::vector<moab::EntityHandle> vconn;
7527023aa44SVijay Mahadevan   moab::ErrorCode merr;
7537023aa44SVijay Mahadevan   PetscInt nnodes;
7547023aa44SVijay Mahadevan 
7557023aa44SVijay Mahadevan   PetscFunctionBegin;
7567023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
7577023aa44SVijay Mahadevan   PetscValidPointer(conn, 4);
7587023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7597023aa44SVijay Mahadevan 
7607023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
7617023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes); MBERRNM(merr);
7627023aa44SVijay Mahadevan   if (conn) *conn = connect;
7637023aa44SVijay Mahadevan   if (nconn) *nconn = nnodes;
7647023aa44SVijay Mahadevan   PetscFunctionReturn(0);
7657023aa44SVijay Mahadevan }
7667023aa44SVijay Mahadevan 
767cab5ea25SPierre Jolivet /*@C
76885d305f5SVijay Mahadevan   DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element)
76985d305f5SVijay Mahadevan 
770d083f849SBarry Smith   Collective
77185d305f5SVijay Mahadevan 
772d8d19677SJose E. Roman   Input Parameters:
773a2b725a8SWilliam Gropp + dm - The DMMoab object
774a2b725a8SWilliam Gropp - ent - Entity handle
77585d305f5SVijay Mahadevan 
77685d305f5SVijay Mahadevan   Output Parameter:
77785d305f5SVijay Mahadevan . ent_on_boundary - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
77885d305f5SVijay Mahadevan 
77985d305f5SVijay Mahadevan   Level: beginner
78085d305f5SVijay Mahadevan 
78185d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices()
78285d305f5SVijay Mahadevan @*/
78369263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm, const moab::EntityHandle ent, PetscBool* ent_on_boundary)
78469263071SVijay Mahadevan {
78569263071SVijay Mahadevan   moab::EntityType etype;
78669263071SVijay Mahadevan   DM_Moab         *dmmoab;
78769263071SVijay Mahadevan   PetscInt         edim;
78869263071SVijay Mahadevan 
78969263071SVijay Mahadevan   PetscFunctionBegin;
79069263071SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
79169263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary, 3);
79269263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
79369263071SVijay Mahadevan 
79469263071SVijay Mahadevan   /* get the entity type and handle accordingly */
79569263071SVijay Mahadevan   etype = dmmoab->mbiface->type_from_handle(ent);
7962c71b3e2SJacob Faibussowitsch   PetscCheckFalse(etype >= moab::MBPOLYHEDRON,PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Entity type on the boundary skin is invalid. EntityType = %D", etype);
79769263071SVijay Mahadevan 
79869263071SVijay Mahadevan   /* get the entity dimension */
79969263071SVijay Mahadevan   edim = dmmoab->mbiface->dimension_from_handle(ent);
80069263071SVijay Mahadevan 
80169263071SVijay Mahadevan   *ent_on_boundary = PETSC_FALSE;
80269263071SVijay Mahadevan   if (etype == moab::MBVERTEX && edim == 0) {
80349d66b22SVijay Mahadevan     *ent_on_boundary = ((dmmoab->bndyvtx->index(ent) >= 0) ? PETSC_TRUE : PETSC_FALSE);
80469263071SVijay Mahadevan   }
80569263071SVijay Mahadevan   else {
80669263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
8076d9eb265SVijay Mahadevan       if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE;
80869263071SVijay Mahadevan     }
80969263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
8106d9eb265SVijay Mahadevan       if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE;
81169263071SVijay Mahadevan     }
81269263071SVijay Mahadevan   }
81369263071SVijay Mahadevan   PetscFunctionReturn(0);
81469263071SVijay Mahadevan }
81569263071SVijay Mahadevan 
816cab5ea25SPierre Jolivet /*@C
8174597dd3dSJose E. Roman   DMMoabCheckBoundaryVertices - Check whether a given entity is on the boundary (vertex, edge, face, element)
81885d305f5SVijay Mahadevan 
81997bb3fdcSJose E. Roman   Input Parameters:
820a2b725a8SWilliam Gropp + dm - The DMMoab object
82185d305f5SVijay Mahadevan . nconn - Number of handles
822a2b725a8SWilliam Gropp - cnt - Array of entity handles
82385d305f5SVijay Mahadevan 
82485d305f5SVijay Mahadevan   Output Parameter:
82585d305f5SVijay Mahadevan . isbdvtx - Array of boundary markers - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
82685d305f5SVijay Mahadevan 
82785d305f5SVijay Mahadevan   Level: beginner
82885d305f5SVijay Mahadevan 
82985d305f5SVijay Mahadevan .seealso: DMMoabIsEntityOnBoundary()
83085d305f5SVijay Mahadevan @*/
83169263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm, PetscInt nconn, const moab::EntityHandle *cnt, PetscBool* isbdvtx)
8327023aa44SVijay Mahadevan {
8337023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
8347023aa44SVijay Mahadevan   PetscInt       i;
8357023aa44SVijay Mahadevan 
8367023aa44SVijay Mahadevan   PetscFunctionBegin;
8377023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
8387023aa44SVijay Mahadevan   PetscValidPointer(cnt, 3);
8397023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx, 4);
8407023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8417023aa44SVijay Mahadevan 
8427023aa44SVijay Mahadevan   for (i = 0; i < nconn; ++i) {
8436d9eb265SVijay Mahadevan     isbdvtx[i] = (dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE : PETSC_FALSE);
8447023aa44SVijay Mahadevan   }
8457023aa44SVijay Mahadevan   PetscFunctionReturn(0);
8467023aa44SVijay Mahadevan }
8477023aa44SVijay Mahadevan 
848cab5ea25SPierre Jolivet /*@C
84985d305f5SVijay Mahadevan   DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary
85085d305f5SVijay Mahadevan 
85185d305f5SVijay Mahadevan   Input Parameter:
85285d305f5SVijay Mahadevan . dm - The DMMoab object
85385d305f5SVijay Mahadevan 
854d8d19677SJose E. Roman   Output Parameters:
855a2b725a8SWilliam Gropp + bdvtx - Boundary vertices
85685d305f5SVijay Mahadevan . bdelems - Boundary elements
857a2b725a8SWilliam Gropp - bdfaces - Boundary faces
85885d305f5SVijay Mahadevan 
85985d305f5SVijay Mahadevan   Level: beginner
86085d305f5SVijay Mahadevan 
86185d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices(), DMMoabIsEntityOnBoundary()
86285d305f5SVijay Mahadevan @*/
8636d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm, const moab::Range **bdvtx, const moab::Range** bdelems, const moab::Range** bdfaces)
8641cec0304SVijay Mahadevan {
8651cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
8661cec0304SVijay Mahadevan 
8671cec0304SVijay Mahadevan   PetscFunctionBegin;
8681cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
8691cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8701cec0304SVijay Mahadevan 
8716d9eb265SVijay Mahadevan   if (bdvtx)  *bdvtx = dmmoab->bndyvtx;
8726d9eb265SVijay Mahadevan   if (bdfaces)  *bdfaces = dmmoab->bndyfaces;
8736d9eb265SVijay Mahadevan   if (bdelems)  *bdfaces = dmmoab->bndyelems;
8741cec0304SVijay Mahadevan   PetscFunctionReturn(0);
8751cec0304SVijay Mahadevan }
8761cec0304SVijay Mahadevan 
877f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm)
878f6829af0SVijay Mahadevan {
87985d305f5SVijay Mahadevan   PetscInt        i;
880e882eb38SVijay Mahadevan   moab::ErrorCode merr;
881f6829af0SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
882f6829af0SVijay Mahadevan 
883f6829af0SVijay Mahadevan   PetscFunctionBegin;
884f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
885304006b3SVijay Mahadevan 
886304006b3SVijay Mahadevan   dmmoab->refct--;
887304006b3SVijay Mahadevan   if (!dmmoab->refct) {
888f6829af0SVijay Mahadevan     delete dmmoab->vlocal;
889f6829af0SVijay Mahadevan     delete dmmoab->vowned;
890f6829af0SVijay Mahadevan     delete dmmoab->vghost;
891f6829af0SVijay Mahadevan     delete dmmoab->elocal;
892f6829af0SVijay Mahadevan     delete dmmoab->eghost;
893f6829af0SVijay Mahadevan     delete dmmoab->bndyvtx;
894f6829af0SVijay Mahadevan     delete dmmoab->bndyfaces;
895f6829af0SVijay Mahadevan     delete dmmoab->bndyelems;
896f6829af0SVijay Mahadevan 
8979566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->gsindices));
8989566063dSJacob Faibussowitsch     PetscCall(PetscFree2(dmmoab->gidmap, dmmoab->lidmap));
8999566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->dfill));
9009566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->ofill));
9019566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->materials));
90285d305f5SVijay Mahadevan     if (dmmoab->fieldNames) {
90385d305f5SVijay Mahadevan       for (i = 0; i < dmmoab->numFields; i++) {
9049566063dSJacob Faibussowitsch         PetscCall(PetscFree(dmmoab->fieldNames[i]));
90585d305f5SVijay Mahadevan       }
9069566063dSJacob Faibussowitsch       PetscCall(PetscFree(dmmoab->fieldNames));
90785d305f5SVijay Mahadevan     }
908b117cd09SVijay Mahadevan 
909b117cd09SVijay Mahadevan     if (dmmoab->nhlevels) {
9109566063dSJacob Faibussowitsch       PetscCall(PetscFree(dmmoab->hsets));
911e882eb38SVijay Mahadevan       dmmoab->nhlevels = 0;
912e882eb38SVijay Mahadevan       if (!dmmoab->hlevel && dmmoab->icreatedinstance) delete dmmoab->hierarchy;
913e882eb38SVijay Mahadevan       dmmoab->hierarchy = NULL;
914b117cd09SVijay Mahadevan     }
915e882eb38SVijay Mahadevan 
916e882eb38SVijay Mahadevan     if (dmmoab->icreatedinstance) {
9179c368985SVijay Mahadevan       delete dmmoab->pcomm;
918e882eb38SVijay Mahadevan       merr = dmmoab->mbiface->delete_mesh(); MBERRNM(merr);
919e882eb38SVijay Mahadevan       delete dmmoab->mbiface;
920e882eb38SVijay Mahadevan     }
921e882eb38SVijay Mahadevan     dmmoab->mbiface = NULL;
9229daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
923e882eb38SVijay Mahadevan     dmmoab->pcomm = NULL;
9249daf19fdSVijay Mahadevan #endif
9259566063dSJacob Faibussowitsch     PetscCall(VecScatterDestroy(&dmmoab->ltog_sendrecv));
9269566063dSJacob Faibussowitsch     PetscCall(ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map));
9279566063dSJacob Faibussowitsch     PetscCall(PetscFree(dm->data));
928304006b3SVijay Mahadevan   }
929f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
930f6829af0SVijay Mahadevan }
931f6829af0SVijay Mahadevan 
9324416b707SBarry Smith PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(PetscOptionItems *PetscOptionsObject, DM dm)
9332e4e7c01SVijay Mahadevan {
9342e4e7c01SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
9352e4e7c01SVijay Mahadevan 
9362e4e7c01SVijay Mahadevan   PetscFunctionBegin;
9372e4e7c01SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
9389566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHead(PetscOptionsObject, "DMMoab Options"));
9399566063dSJacob 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));
9409566063dSJacob 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));
9412e4e7c01SVijay Mahadevan   /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */
9429566063dSJacob 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));
9439566063dSJacob 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));
9449566063dSJacob Faibussowitsch   PetscCall(PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum*)&dmmoab->read_mode, NULL));
9459566063dSJacob Faibussowitsch   PetscCall(PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum*)&dmmoab->write_mode, NULL));
9462e4e7c01SVijay Mahadevan   PetscFunctionReturn(0);
9472e4e7c01SVijay Mahadevan }
9482e4e7c01SVijay Mahadevan 
949f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm)
950f6829af0SVijay Mahadevan {
951f6829af0SVijay Mahadevan   moab::ErrorCode         merr;
952f6829af0SVijay Mahadevan   Vec                     local, global;
953f6829af0SVijay Mahadevan   IS                      from, to;
954f6829af0SVijay Mahadevan   moab::Range::iterator   iter;
955304006b3SVijay Mahadevan   PetscInt                i, j, f, bs, vent, totsize, *lgmap;
956f6829af0SVijay Mahadevan   DM_Moab                *dmmoab = (DM_Moab*)dm->data;
957f6829af0SVijay Mahadevan   moab::Range             adjs;
958f6829af0SVijay Mahadevan 
959f6829af0SVijay Mahadevan   PetscFunctionBegin;
960f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
961f6829af0SVijay Mahadevan   /* Get the local and shared vertices and cache it */
962*08401ef6SPierre Jolivet   PetscCheck(dmmoab->mbiface != NULL,PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface before calling SetUp.");
9639daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
964*08401ef6SPierre Jolivet   PetscCheck(dmmoab->pcomm != NULL,PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB ParallelComm object before calling SetUp.");
9659daf19fdSVijay Mahadevan #endif
966f6829af0SVijay Mahadevan 
967f6829af0SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
968f6829af0SVijay Mahadevan   if (dmmoab->vlocal->empty())
969f6829af0SVijay Mahadevan   {
97049d66b22SVijay Mahadevan     //merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
97149d66b22SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, 0, *dmmoab->vlocal, false); MBERRNM(merr);
972f6829af0SVijay Mahadevan 
9739daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
974f6829af0SVijay Mahadevan     /* filter based on parallel status */
975f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned); MBERRNM(merr);
976f6829af0SVijay Mahadevan 
977f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
9789c368985SVijay Mahadevan     // *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
979f6829af0SVijay Mahadevan     adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
98064e1c140SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(adjs, PSTATUS_GHOST | PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost); MBERRNM(merr);
981f6829af0SVijay Mahadevan     adjs = moab::subtract(adjs, *dmmoab->vghost);
982f6829af0SVijay Mahadevan     *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs);
9839daf19fdSVijay Mahadevan #else
9849daf19fdSVijay Mahadevan     *dmmoab->vowned = *dmmoab->vlocal;
9859daf19fdSVijay Mahadevan #endif
986f6829af0SVijay Mahadevan 
987f6829af0SVijay Mahadevan     /* compute and cache the sizes of local and ghosted entities */
988f6829af0SVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
989f6829af0SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
99049d66b22SVijay Mahadevan 
9919daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
9921c2dc1cbSBarry Smith     PetscCall(MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm));
9937d3de750SJacob Faibussowitsch     PetscInfo(NULL, "Filset ID: %u, Vertices: local - %D, owned - %D, ghosted - %D.\n", dmmoab->fileset, dmmoab->vlocal->size(), dmmoab->nloc, dmmoab->nghost);
9949daf19fdSVijay Mahadevan #else
9959daf19fdSVijay Mahadevan     dmmoab->n = dmmoab->nloc;
9969daf19fdSVijay Mahadevan #endif
997f6829af0SVijay Mahadevan   }
998f6829af0SVijay Mahadevan 
999f6829af0SVijay Mahadevan   {
1000f6829af0SVijay Mahadevan     /* get the information about the local elements in the mesh */
1001f6829af0SVijay Mahadevan     dmmoab->eghost->clear();
1002f6829af0SVijay Mahadevan 
1003f6829af0SVijay Mahadevan     /* first decipher the leading dimension */
1004f6829af0SVijay Mahadevan     for (i = 3; i > 0; i--) {
1005f6829af0SVijay Mahadevan       dmmoab->elocal->clear();
100649d66b22SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, false); MBERRNM(merr);
1007f6829af0SVijay Mahadevan 
1008f6829af0SVijay Mahadevan       /* store the current mesh dimension */
1009f6829af0SVijay Mahadevan       if (dmmoab->elocal->size()) {
1010f6829af0SVijay Mahadevan         dmmoab->dim = i;
1011f6829af0SVijay Mahadevan         break;
1012f6829af0SVijay Mahadevan       }
1013f6829af0SVijay Mahadevan     }
1014f6829af0SVijay Mahadevan 
10159566063dSJacob Faibussowitsch     PetscCall(DMSetDimension(dm, dmmoab->dim));
1016b117cd09SVijay Mahadevan 
10179daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1018f6829af0SVijay Mahadevan     /* filter the ghosted and owned element list */
1019f6829af0SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
1020f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
1021f6829af0SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
10229daf19fdSVijay Mahadevan #endif
1023f6829af0SVijay Mahadevan 
1024f6829af0SVijay Mahadevan     dmmoab->neleloc = dmmoab->elocal->size();
1025f6829af0SVijay Mahadevan     dmmoab->neleghost = dmmoab->eghost->size();
102649d66b22SVijay Mahadevan 
10279daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
10281c2dc1cbSBarry Smith     PetscCall(MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm));
10297d3de750SJacob Faibussowitsch     PetscInfo(NULL, "%d-dim elements: owned - %D, ghosted - %D.\n", dmmoab->dim, dmmoab->neleloc, dmmoab->neleghost);
10309daf19fdSVijay Mahadevan #else
10319daf19fdSVijay Mahadevan     dmmoab->nele = dmmoab->neleloc;
10329daf19fdSVijay Mahadevan #endif
1033f6829af0SVijay Mahadevan   }
1034f6829af0SVijay Mahadevan 
1035f6829af0SVijay Mahadevan   bs = dmmoab->bs;
1036f6829af0SVijay Mahadevan   if (!dmmoab->ltog_tag) {
1037f6829af0SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
1038f6829af0SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
1039f6829af0SVijay Mahadevan        assemble the individual pieces of the mesh */
1040f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag); MBERRNM(merr);
1041f6829af0SVijay Mahadevan   }
1042f6829af0SVijay Mahadevan 
1043f6829af0SVijay Mahadevan   totsize = dmmoab->vlocal->size();
10442c71b3e2SJacob Faibussowitsch   PetscCheckFalse(totsize != dmmoab->nloc + dmmoab->nghost,PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Mismatch between local and owned+ghost vertices. %D != %D.", totsize, dmmoab->nloc + dmmoab->nghost);
10459566063dSJacob Faibussowitsch   PetscCall(PetscCalloc1(totsize, &dmmoab->gsindices));
1046f6829af0SVijay Mahadevan   {
1047f6829af0SVijay Mahadevan     /* first get the local indices */
1048f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vowned, &dmmoab->gsindices[0]); MBERRNM(merr);
10493f1c6e43SVijay Mahadevan     if (dmmoab->nghost) {  /* next get the ghosted indices */
1050f6829af0SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vghost, &dmmoab->gsindices[dmmoab->nloc]); MBERRNM(merr);
1051f6829af0SVijay Mahadevan     }
1052f6829af0SVijay Mahadevan 
1053f6829af0SVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
1054304006b3SVijay Mahadevan     dmmoab->lminmax[0] = dmmoab->lminmax[1] = dmmoab->gsindices[0];
1055f6829af0SVijay Mahadevan     for (i = 0; i < totsize; ++i) {
1056304006b3SVijay Mahadevan       if (dmmoab->lminmax[0] > dmmoab->gsindices[i]) dmmoab->lminmax[0] = dmmoab->gsindices[i];
1057304006b3SVijay Mahadevan       if (dmmoab->lminmax[1] < dmmoab->gsindices[i]) dmmoab->lminmax[1] = dmmoab->gsindices[i];
1058f6829af0SVijay Mahadevan     }
1059f6829af0SVijay Mahadevan 
10601c2dc1cbSBarry Smith     PetscCall(MPIU_Allreduce(&dmmoab->lminmax[0], &dmmoab->gminmax[0], 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm));
10611c2dc1cbSBarry Smith     PetscCall(MPIU_Allreduce(&dmmoab->lminmax[1], &dmmoab->gminmax[1], 1, MPI_INT, MPI_MAX, ((PetscObject)dm)->comm));
1062f6829af0SVijay Mahadevan 
1063f6829af0SVijay Mahadevan     /* set the GID map */
1064f6829af0SVijay Mahadevan     for (i = 0; i < totsize; ++i) {
1065304006b3SVijay Mahadevan       dmmoab->gsindices[i] -= dmmoab->gminmax[0]; /* zero based index needed for IS */
10669c368985SVijay Mahadevan 
1067f6829af0SVijay Mahadevan     }
1068304006b3SVijay Mahadevan     dmmoab->lminmax[0] -= dmmoab->gminmax[0];
1069304006b3SVijay Mahadevan     dmmoab->lminmax[1] -= dmmoab->gminmax[0];
1070f6829af0SVijay Mahadevan 
10717d3de750SJacob Faibussowitsch     PetscInfo(NULL, "GLOBAL_ID: Local [min, max] - [%D, %D], Global [min, max] - [%D, %D]\n", dmmoab->lminmax[0], dmmoab->lminmax[1], dmmoab->gminmax[0], dmmoab->gminmax[1]);
1072f6829af0SVijay Mahadevan   }
10737a8be351SBarry Smith   PetscCheck(dmmoab->bs == dmmoab->numFields || dmmoab->bs == 1,PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Mismatch between block size and number of component fields. %D != 1 OR %D != %D.", dmmoab->bs, dmmoab->bs, dmmoab->numFields);
1074f6829af0SVijay Mahadevan 
1075f6829af0SVijay Mahadevan   {
10769c368985SVijay Mahadevan     dmmoab->seqstart = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->front());
10779c368985SVijay Mahadevan     dmmoab->seqend = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->back());
10787d3de750SJacob Faibussowitsch     PetscInfo(NULL, "SEQUENCE: Local [min, max] - [%D, %D]\n", dmmoab->seqstart, dmmoab->seqend);
10793f1c6e43SVijay Mahadevan 
10809566063dSJacob Faibussowitsch     PetscCall(PetscMalloc2(dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->gidmap, dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->lidmap));
10819566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(totsize * dmmoab->numFields, &lgmap));
1082f6829af0SVijay Mahadevan 
1083f6829af0SVijay Mahadevan     i = j = 0;
1084f6829af0SVijay Mahadevan     /* set the owned vertex data first */
1085f6829af0SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++, i++) {
1086e92d1c7cSVijay Mahadevan       vent = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart;
1087f6829af0SVijay Mahadevan       dmmoab->gidmap[vent] = dmmoab->gsindices[i];
1088f6829af0SVijay Mahadevan       dmmoab->lidmap[vent] = i;
1089f6829af0SVijay Mahadevan       for (f = 0; f < dmmoab->numFields; f++, j++) {
10903f1c6e43SVijay Mahadevan         lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]);
1091f6829af0SVijay Mahadevan       }
1092f6829af0SVijay Mahadevan     }
1093f6829af0SVijay Mahadevan     /* next arrange all the ghosted data information */
1094f6829af0SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++, i++) {
1095e92d1c7cSVijay Mahadevan       vent = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart;
1096f6829af0SVijay Mahadevan       dmmoab->gidmap[vent] = dmmoab->gsindices[i];
1097f6829af0SVijay Mahadevan       dmmoab->lidmap[vent] = i;
1098f6829af0SVijay Mahadevan       for (f = 0; f < dmmoab->numFields; f++, j++) {
10993f1c6e43SVijay Mahadevan         lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]);
1100f6829af0SVijay Mahadevan       }
1101f6829af0SVijay Mahadevan     }
1102f6829af0SVijay Mahadevan 
1103f6829af0SVijay Mahadevan     /* We need to create the Global to Local Vector Scatter Contexts
1104f6829af0SVijay Mahadevan        1) First create a local and global vector
1105f6829af0SVijay Mahadevan        2) Create a local and global IS
1106f6829af0SVijay Mahadevan        3) Create VecScatter and LtoGMapping objects
1107f6829af0SVijay Mahadevan        4) Cleanup the IS and Vec objects
1108f6829af0SVijay Mahadevan     */
11099566063dSJacob Faibussowitsch     PetscCall(DMCreateGlobalVector(dm, &global));
11109566063dSJacob Faibussowitsch     PetscCall(DMCreateLocalVector(dm, &local));
1111f6829af0SVijay Mahadevan 
11129566063dSJacob Faibussowitsch     PetscCall(VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend));
1113f6829af0SVijay Mahadevan 
1114f6829af0SVijay Mahadevan     /* global to local must retrieve ghost points */
11159566063dSJacob Faibussowitsch     PetscCall(ISCreateStride(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, dmmoab->vstart, 1, &from));
11169566063dSJacob Faibussowitsch     PetscCall(ISSetBlockSize(from, bs));
1117f6829af0SVijay Mahadevan 
11189566063dSJacob Faibussowitsch     PetscCall(ISCreateGeneral(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, &lgmap[0], PETSC_COPY_VALUES, &to));
11199566063dSJacob Faibussowitsch     PetscCall(ISSetBlockSize(to, bs));
1120f6829af0SVijay Mahadevan 
1121f6829af0SVijay Mahadevan     if (!dmmoab->ltog_map) {
1122f6829af0SVijay Mahadevan       /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */
11239566063dSJacob Faibussowitsch       PetscCall(ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm, dmmoab->bs, totsize * dmmoab->numFields, lgmap,PETSC_COPY_VALUES, &dmmoab->ltog_map));
1124f6829af0SVijay Mahadevan     }
1125f6829af0SVijay Mahadevan 
1126f6829af0SVijay Mahadevan     /* now create the scatter object from local to global vector */
11279566063dSJacob Faibussowitsch     PetscCall(VecScatterCreate(local, from, global, to, &dmmoab->ltog_sendrecv));
1128f6829af0SVijay Mahadevan 
1129f6829af0SVijay Mahadevan     /* clean up IS, Vec */
11309566063dSJacob Faibussowitsch     PetscCall(PetscFree(lgmap));
11319566063dSJacob Faibussowitsch     PetscCall(ISDestroy(&from));
11329566063dSJacob Faibussowitsch     PetscCall(ISDestroy(&to));
11339566063dSJacob Faibussowitsch     PetscCall(VecDestroy(&local));
11349566063dSJacob Faibussowitsch     PetscCall(VecDestroy(&global));
1135f6829af0SVijay Mahadevan   }
1136f6829af0SVijay Mahadevan 
113749d66b22SVijay Mahadevan   dmmoab->bndyvtx = new moab::Range();
113849d66b22SVijay Mahadevan   dmmoab->bndyfaces = new moab::Range();
113949d66b22SVijay Mahadevan   dmmoab->bndyelems = new moab::Range();
1140f6829af0SVijay Mahadevan   /* skin the boundary and store nodes */
11419c368985SVijay Mahadevan   if (!dmmoab->hlevel) {
1142f6829af0SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
1143f6829af0SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
1144f6829af0SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
1145f6829af0SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
1146f6829af0SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
1147f6829af0SVijay Mahadevan 
1148f6829af0SVijay Mahadevan     /* get the entities on the skin - only the faces */
11492417220eSVijay Mahadevan     merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, *dmmoab->bndyfaces, NULL, true, true, false); MBERRNM(merr); // 'false' param indicates we want faces back, not vertices
1150f6829af0SVijay Mahadevan 
11519daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1152f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
1153f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT);MBERRNM(merr);
11542417220eSVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_INTERFACE, PSTATUS_NOT);MBERRNM(merr);
11559daf19fdSVijay Mahadevan #endif
1156f6829af0SVijay Mahadevan 
1157f6829af0SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
11585f80ce2aSJacob Faibussowitsch     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(merr);
11595f80ce2aSJacob Faibussowitsch     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyvtx, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(merr);
1160f6829af0SVijay Mahadevan   }
11619c368985SVijay Mahadevan   else {
11629c368985SVijay Mahadevan     /* Let us query the hierarchy manager and get the results directly for this level */
11639c368985SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->elocal->begin(); iter != dmmoab->elocal->end(); iter++) {
11649c368985SVijay Mahadevan       moab::EntityHandle elemHandle = *iter;
11659c368985SVijay Mahadevan       if (dmmoab->hierarchy->is_entity_on_boundary(elemHandle)) {
11669c368985SVijay Mahadevan         dmmoab->bndyelems->insert(elemHandle);
11679c368985SVijay Mahadevan         /* For this boundary element, query the vertices and add them to the list */
11689c368985SVijay Mahadevan         std::vector<moab::EntityHandle> connect;
11695f80ce2aSJacob Faibussowitsch         merr = dmmoab->hierarchy->get_connectivity(elemHandle, dmmoab->hlevel, connect);MBERRNM(merr);
11709c368985SVijay Mahadevan         for (unsigned iv=0; iv < connect.size(); ++iv)
11719c368985SVijay Mahadevan           if (dmmoab->hierarchy->is_entity_on_boundary(connect[iv]))
11729c368985SVijay Mahadevan             dmmoab->bndyvtx->insert(connect[iv]);
11739c368985SVijay Mahadevan         /* Next, let us query the boundary faces and add them also to the list */
11749c368985SVijay Mahadevan         std::vector<moab::EntityHandle> faces;
11755f80ce2aSJacob Faibussowitsch         merr = dmmoab->hierarchy->get_adjacencies(elemHandle, dmmoab->dim-1, faces);MBERRNM(merr);
11769c368985SVijay Mahadevan         for (unsigned ifa=0; ifa < faces.size(); ++ifa)
11779c368985SVijay Mahadevan           if (dmmoab->hierarchy->is_entity_on_boundary(faces[ifa]))
11789c368985SVijay Mahadevan             dmmoab->bndyfaces->insert(faces[ifa]);
11799c368985SVijay Mahadevan       }
11809c368985SVijay Mahadevan     }
11819c368985SVijay Mahadevan #ifdef MOAB_HAVE_MPI
11829c368985SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
11839c368985SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyvtx,   PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
11849c368985SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
11859c368985SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyelems, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
11869c368985SVijay Mahadevan #endif
11879c368985SVijay Mahadevan 
11889c368985SVijay Mahadevan   }
11897d3de750SJacob Faibussowitsch   PetscInfo(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyfaces->size(), dmmoab->bndyelems->size());
1190a044f6b6SVijay Mahadevan 
1191a044f6b6SVijay Mahadevan   /* Get the material sets and populate the data for all locally owned elements */
1192a044f6b6SVijay Mahadevan   {
11939566063dSJacob Faibussowitsch     PetscCall(PetscCalloc1(dmmoab->elocal->size(), &dmmoab->materials));
1194a044f6b6SVijay Mahadevan     /* Get the count of entities of particular type from dmmoab->elocal
1195a044f6b6SVijay Mahadevan        -- Then, for each non-zero type, loop through and query the fileset to get the material tag data */
1196a044f6b6SVijay Mahadevan     moab::Range msets;
1197a044f6b6SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_type_and_tag(dmmoab->fileset, moab::MBENTITYSET, &dmmoab->material_tag, NULL, 1, msets, moab::Interface::UNION);MB_CHK_ERR(merr);
1198a044f6b6SVijay Mahadevan     if (msets.size() == 0) {
1199a044f6b6SVijay Mahadevan       PetscInfo(NULL, "No material sets found in the fileset.");
1200a044f6b6SVijay Mahadevan     }
1201a044f6b6SVijay Mahadevan 
1202a044f6b6SVijay Mahadevan     for (unsigned i=0; i < msets.size(); ++i) {
1203a044f6b6SVijay Mahadevan       moab::Range msetelems;
1204a044f6b6SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(msets[i], dmmoab->dim, msetelems, true);MB_CHK_ERR(merr);
1205aedf4482SVijay Mahadevan #ifdef MOAB_HAVE_MPI
1206aedf4482SVijay Mahadevan       /* filter all the non-owned and shared entities out of the list */
1207aedf4482SVijay Mahadevan       merr = dmmoab->pcomm->filter_pstatus(msetelems, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
1208aedf4482SVijay Mahadevan #endif
1209a044f6b6SVijay Mahadevan 
1210a044f6b6SVijay Mahadevan       int partID;
1211a044f6b6SVijay Mahadevan       moab::EntityHandle mset=msets[i];
1212a044f6b6SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &mset, 1, &partID);MB_CHK_ERR(merr);
1213a044f6b6SVijay Mahadevan 
1214a044f6b6SVijay Mahadevan       for (unsigned j=0; j < msetelems.size(); ++j)
1215a044f6b6SVijay Mahadevan         dmmoab->materials[dmmoab->elocal->index(msetelems[j])]=partID;
1216a044f6b6SVijay Mahadevan     }
1217a044f6b6SVijay Mahadevan   }
1218a044f6b6SVijay Mahadevan 
1219f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1220f6829af0SVijay Mahadevan }
1221f6829af0SVijay Mahadevan 
1222cab5ea25SPierre Jolivet /*@C
1223304006b3SVijay Mahadevan   DMMoabCreateVertices - Creates and adds several vertices to the primary set represented by the DM.
1224304006b3SVijay Mahadevan 
1225d083f849SBarry Smith   Collective
1226304006b3SVijay Mahadevan 
1227304006b3SVijay Mahadevan   Input Parameters:
1228304006b3SVijay Mahadevan + dm - The DM object
1229304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra)
1230304006b3SVijay Mahadevan . conn - The connectivity of the element
1231a2b725a8SWilliam Gropp - nverts - The number of vertices that form the element
1232304006b3SVijay Mahadevan 
1233304006b3SVijay Mahadevan   Output Parameter:
1234304006b3SVijay Mahadevan . overts  - The list of vertices that were created (can be NULL)
1235304006b3SVijay Mahadevan 
1236304006b3SVijay Mahadevan   Level: beginner
1237304006b3SVijay Mahadevan 
1238304006b3SVijay Mahadevan .seealso: DMMoabCreateSubmesh(), DMMoabCreateElement()
1239304006b3SVijay Mahadevan @*/
1240304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateVertices(DM dm, const PetscReal* coords, PetscInt nverts, moab::Range* overts)
1241304006b3SVijay Mahadevan {
1242304006b3SVijay Mahadevan   moab::ErrorCode     merr;
1243304006b3SVijay Mahadevan   DM_Moab            *dmmoab;
1244304006b3SVijay Mahadevan   moab::Range         verts;
1245304006b3SVijay Mahadevan 
1246304006b3SVijay Mahadevan   PetscFunctionBegin;
1247304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1248304006b3SVijay Mahadevan   PetscValidPointer(coords, 2);
1249304006b3SVijay Mahadevan 
1250304006b3SVijay Mahadevan   dmmoab = (DM_Moab*) dm->data;
1251304006b3SVijay Mahadevan 
1252304006b3SVijay Mahadevan   /* Insert new points */
1253304006b3SVijay Mahadevan   merr = dmmoab->mbiface->create_vertices(&coords[0], nverts, verts); MBERRNM(merr);
1254304006b3SVijay Mahadevan   merr = dmmoab->mbiface->add_entities(dmmoab->fileset, verts); MBERRNM(merr);
1255304006b3SVijay Mahadevan 
1256304006b3SVijay Mahadevan   if (overts) *overts = verts;
1257304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1258304006b3SVijay Mahadevan }
1259304006b3SVijay Mahadevan 
1260cab5ea25SPierre Jolivet /*@C
1261304006b3SVijay Mahadevan   DMMoabCreateElement - Adds an element of specified type to the primary set represented by the DM.
1262304006b3SVijay Mahadevan 
1263d083f849SBarry Smith   Collective
1264304006b3SVijay Mahadevan 
1265304006b3SVijay Mahadevan   Input Parameters:
1266304006b3SVijay Mahadevan + dm - The DM object
1267304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra)
1268304006b3SVijay Mahadevan . conn - The connectivity of the element
1269a2b725a8SWilliam Gropp - nverts - The number of vertices that form the element
1270304006b3SVijay Mahadevan 
1271304006b3SVijay Mahadevan   Output Parameter:
1272304006b3SVijay Mahadevan . oelem  - The handle to the element created and added to the DM object
1273304006b3SVijay Mahadevan 
1274304006b3SVijay Mahadevan   Level: beginner
1275304006b3SVijay Mahadevan 
1276304006b3SVijay Mahadevan .seealso: DMMoabCreateSubmesh(), DMMoabCreateVertices()
1277304006b3SVijay Mahadevan @*/
1278304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateElement(DM dm, const moab::EntityType type, const moab::EntityHandle* conn, PetscInt nverts, moab::EntityHandle* oelem)
1279304006b3SVijay Mahadevan {
1280304006b3SVijay Mahadevan   moab::ErrorCode     merr;
1281304006b3SVijay Mahadevan   DM_Moab            *dmmoab;
1282304006b3SVijay Mahadevan   moab::EntityHandle  elem;
1283304006b3SVijay Mahadevan 
1284304006b3SVijay Mahadevan   PetscFunctionBegin;
1285304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1286304006b3SVijay Mahadevan   PetscValidPointer(conn, 3);
1287304006b3SVijay Mahadevan 
1288304006b3SVijay Mahadevan   dmmoab = (DM_Moab*) dm->data;
1289304006b3SVijay Mahadevan 
1290304006b3SVijay Mahadevan   /* Insert new element */
1291304006b3SVijay Mahadevan   merr = dmmoab->mbiface->create_element(type, conn, nverts, elem); MBERRNM(merr);
1292304006b3SVijay Mahadevan   merr = dmmoab->mbiface->add_entities(dmmoab->fileset, &elem, 1); MBERRNM(merr);
1293304006b3SVijay Mahadevan 
1294304006b3SVijay Mahadevan   if (oelem) *oelem = elem;
1295304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1296304006b3SVijay Mahadevan }
1297304006b3SVijay Mahadevan 
1298cab5ea25SPierre Jolivet /*@C
1299304006b3SVijay Mahadevan   DMMoabCreateSubmesh - Creates a sub-DM object with a set that contains all vertices/elements of the parent
1300304006b3SVijay Mahadevan   in addition to providing support for dynamic mesh modifications. This is useful for AMR calculations to
1301304006b3SVijay Mahadevan   create a DM object on a refined level.
1302304006b3SVijay Mahadevan 
1303d083f849SBarry Smith   Collective
1304304006b3SVijay Mahadevan 
1305304006b3SVijay Mahadevan   Input Parameters:
1306a2b725a8SWilliam Gropp . dm - The DM object
1307304006b3SVijay Mahadevan 
1308304006b3SVijay Mahadevan   Output Parameter:
1309304006b3SVijay Mahadevan . newdm  - The sub DM object with updated set information
1310304006b3SVijay Mahadevan 
1311304006b3SVijay Mahadevan   Level: advanced
1312304006b3SVijay Mahadevan 
1313304006b3SVijay Mahadevan .seealso: DMCreate(), DMMoabCreateVertices(), DMMoabCreateElement()
1314304006b3SVijay Mahadevan @*/
1315304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateSubmesh(DM dm, DM *newdm)
1316304006b3SVijay Mahadevan {
1317304006b3SVijay Mahadevan   DM_Moab            *dmmoab;
1318304006b3SVijay Mahadevan   DM_Moab            *ndmmoab;
1319304006b3SVijay Mahadevan   moab::ErrorCode    merr;
1320304006b3SVijay Mahadevan 
1321304006b3SVijay Mahadevan   PetscFunctionBegin;
1322304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1323304006b3SVijay Mahadevan 
1324304006b3SVijay Mahadevan   dmmoab = (DM_Moab*) dm->data;
1325304006b3SVijay Mahadevan 
1326304006b3SVijay Mahadevan   /* Create the basic DMMoab object and keep the default parameters created by DM impls */
13279566063dSJacob Faibussowitsch   PetscCall(DMMoabCreateMoab(((PetscObject)dm)->comm, dmmoab->mbiface, &dmmoab->ltog_tag, PETSC_NULL, newdm));
1328304006b3SVijay Mahadevan 
1329304006b3SVijay Mahadevan   /* get all the necessary handles from the private DM object */
1330304006b3SVijay Mahadevan   ndmmoab = (DM_Moab*) (*newdm)->data;
1331304006b3SVijay Mahadevan 
1332304006b3SVijay Mahadevan   /* set the sub-mesh's parent DM reference */
1333304006b3SVijay Mahadevan   ndmmoab->parent = &dm;
1334304006b3SVijay Mahadevan 
1335304006b3SVijay Mahadevan   /* create a file set to associate all entities in current mesh */
1336304006b3SVijay Mahadevan   merr = ndmmoab->mbiface->create_meshset(moab::MESHSET_SET, ndmmoab->fileset); MBERR("Creating file set failed", merr);
1337304006b3SVijay Mahadevan 
1338304006b3SVijay Mahadevan   /* create a meshset and then add old fileset as child */
1339304006b3SVijay Mahadevan   merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->vlocal); MBERR("Adding child vertices to parent failed", merr);
1340304006b3SVijay Mahadevan   merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->elocal); MBERR("Adding child elements to parent failed", merr);
1341304006b3SVijay Mahadevan 
1342304006b3SVijay Mahadevan   /* preserve the field association between the parent and sub-mesh objects */
13439566063dSJacob Faibussowitsch   PetscCall(DMMoabSetFieldNames(*newdm, dmmoab->numFields, dmmoab->fieldNames));
1344304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1345304006b3SVijay Mahadevan }
1346304006b3SVijay Mahadevan 
1347304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_Ascii(DM dm, PetscViewer viewer)
1348304006b3SVijay Mahadevan {
1349304006b3SVijay Mahadevan   DM_Moab          *dmmoab = (DM_Moab*)(dm)->data;
1350304006b3SVijay Mahadevan   const char       *name;
1351304006b3SVijay Mahadevan   MPI_Comm          comm;
1352304006b3SVijay Mahadevan   PetscMPIInt       size;
1353304006b3SVijay Mahadevan 
1354304006b3SVijay Mahadevan   PetscFunctionBegin;
13559566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)dm, &comm));
13569566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm, &size));
13579566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetName((PetscObject) dm, &name));
13589566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushTab(viewer));
13599566063dSJacob Faibussowitsch   if (name) PetscCall(PetscViewerASCIIPrintf(viewer, "%s in %D dimensions:\n", name, dmmoab->dim));
13609566063dSJacob Faibussowitsch   else      PetscCall(PetscViewerASCIIPrintf(viewer, "Mesh in %D dimensions:\n", dmmoab->dim));
1361304006b3SVijay Mahadevan   /* print details about the global mesh */
1362304006b3SVijay Mahadevan   {
13639566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushTab(viewer));
13649566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Sizes: cells=%D, vertices=%D, blocks=%D\n", dmmoab->nele, dmmoab->n, dmmoab->bs));
1365304006b3SVijay Mahadevan     /* print boundary data */
13669566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Boundary trace:\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size()));
1367304006b3SVijay Mahadevan     {
13689566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(viewer));
13699566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(viewer, "cells=%D, faces=%D, vertices=%D\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size()));
13709566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(viewer));
1371304006b3SVijay Mahadevan     }
1372304006b3SVijay Mahadevan     /* print field data */
13739566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Fields: %D components\n", dmmoab->numFields));
1374304006b3SVijay Mahadevan     {
13759566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(viewer));
1376304006b3SVijay Mahadevan       for (int i = 0; i < dmmoab->numFields; ++i) {
13779566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(viewer, "[%D] - %s\n", i, dmmoab->fieldNames[i]));
1378304006b3SVijay Mahadevan       }
13799566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(viewer));
1380304006b3SVijay Mahadevan     }
13819566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopTab(viewer));
1382304006b3SVijay Mahadevan   }
13839566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopTab(viewer));
13849566063dSJacob Faibussowitsch   PetscCall(PetscViewerFlush(viewer));
1385304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1386304006b3SVijay Mahadevan }
1387304006b3SVijay Mahadevan 
1388304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_VTK(DM dm, PetscViewer v)
1389304006b3SVijay Mahadevan {
1390304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1391304006b3SVijay Mahadevan }
1392304006b3SVijay Mahadevan 
1393304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_HDF5(DM dm, PetscViewer v)
1394304006b3SVijay Mahadevan {
1395304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1396304006b3SVijay Mahadevan }
1397304006b3SVijay Mahadevan 
1398304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMView_Moab(DM dm, PetscViewer viewer)
1399304006b3SVijay Mahadevan {
1400304006b3SVijay Mahadevan   PetscBool      iascii, ishdf5, isvtk;
1401304006b3SVijay Mahadevan 
1402304006b3SVijay Mahadevan   PetscFunctionBegin;
1403304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1404304006b3SVijay Mahadevan   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
14059566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII, &iascii));
14069566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERVTK,   &isvtk));
14079566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERHDF5,  &ishdf5));
1408304006b3SVijay Mahadevan   if (iascii) {
14099566063dSJacob Faibussowitsch     PetscCall(DMMoabView_Ascii(dm, viewer));
1410304006b3SVijay Mahadevan   } else if (ishdf5) {
1411304006b3SVijay Mahadevan #if defined(PETSC_HAVE_HDF5) && defined(MOAB_HAVE_HDF5)
14129566063dSJacob Faibussowitsch     PetscCall(PetscViewerPushFormat(viewer, PETSC_VIEWER_HDF5_VIZ));
14139566063dSJacob Faibussowitsch     PetscCall(DMMoabView_HDF5(dm, viewer));
14149566063dSJacob Faibussowitsch     PetscCall(PetscViewerPopFormat(viewer));
1415304006b3SVijay Mahadevan #else
1416304006b3SVijay Mahadevan     SETERRQ(PetscObjectComm((PetscObject) dm), PETSC_ERR_SUP, "HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5");
1417304006b3SVijay Mahadevan #endif
1418304006b3SVijay Mahadevan   }
1419304006b3SVijay Mahadevan   else if (isvtk) {
14209566063dSJacob Faibussowitsch     PetscCall(DMMoabView_VTK(dm, viewer));
1421304006b3SVijay Mahadevan   }
1422304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1423304006b3SVijay Mahadevan }
1424304006b3SVijay Mahadevan 
1425304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMInitialize_Moab(DM dm)
1426304006b3SVijay Mahadevan {
1427304006b3SVijay Mahadevan   PetscFunctionBegin;
1428304006b3SVijay Mahadevan   dm->ops->view                            = DMView_Moab;
1429304006b3SVijay Mahadevan   dm->ops->load                            = NULL /* DMLoad_Moab */;
1430304006b3SVijay Mahadevan   dm->ops->setfromoptions                  = DMSetFromOptions_Moab;
1431304006b3SVijay Mahadevan   dm->ops->clone                           = DMClone_Moab;
1432304006b3SVijay Mahadevan   dm->ops->setup                           = DMSetUp_Moab;
14331bb6d2a8SBarry Smith   dm->ops->createlocalsection            = NULL;
1434304006b3SVijay Mahadevan   dm->ops->createdefaultconstraints        = NULL;
1435304006b3SVijay Mahadevan   dm->ops->createglobalvector              = DMCreateGlobalVector_Moab;
1436304006b3SVijay Mahadevan   dm->ops->createlocalvector               = DMCreateLocalVector_Moab;
1437304006b3SVijay Mahadevan   dm->ops->getlocaltoglobalmapping         = NULL;
1438304006b3SVijay Mahadevan   dm->ops->createfieldis                   = NULL;
1439304006b3SVijay Mahadevan   dm->ops->createcoordinatedm              = NULL /* DMCreateCoordinateDM_Moab */;
1440304006b3SVijay Mahadevan   dm->ops->getcoloring                     = NULL;
1441304006b3SVijay Mahadevan   dm->ops->creatematrix                    = DMCreateMatrix_Moab;
1442304006b3SVijay Mahadevan   dm->ops->createinterpolation             = DMCreateInterpolation_Moab;
14435a84ad33SLisandro Dalcin   dm->ops->createinjection                 = NULL /* DMCreateInjection_Moab */;
1444304006b3SVijay Mahadevan   dm->ops->refine                          = DMRefine_Moab;
1445304006b3SVijay Mahadevan   dm->ops->coarsen                         = DMCoarsen_Moab;
1446304006b3SVijay Mahadevan   dm->ops->refinehierarchy                 = DMRefineHierarchy_Moab;
1447304006b3SVijay Mahadevan   dm->ops->coarsenhierarchy                = DMCoarsenHierarchy_Moab;
1448304006b3SVijay Mahadevan   dm->ops->globaltolocalbegin              = DMGlobalToLocalBegin_Moab;
1449304006b3SVijay Mahadevan   dm->ops->globaltolocalend                = DMGlobalToLocalEnd_Moab;
1450304006b3SVijay Mahadevan   dm->ops->localtoglobalbegin              = DMLocalToGlobalBegin_Moab;
1451304006b3SVijay Mahadevan   dm->ops->localtoglobalend                = DMLocalToGlobalEnd_Moab;
1452304006b3SVijay Mahadevan   dm->ops->destroy                         = DMDestroy_Moab;
1453304006b3SVijay Mahadevan   dm->ops->createsubdm                     = NULL /* DMCreateSubDM_Moab */;
1454304006b3SVijay Mahadevan   dm->ops->getdimpoints                    = NULL /* DMGetDimPoints_Moab */;
1455304006b3SVijay Mahadevan   dm->ops->locatepoints                    = NULL /* DMLocatePoints_Moab */;
1456304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1457304006b3SVijay Mahadevan }
1458304006b3SVijay Mahadevan 
1459304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm)
1460304006b3SVijay Mahadevan {
1461304006b3SVijay Mahadevan   PetscFunctionBegin;
1462304006b3SVijay Mahadevan   /* get all the necessary handles from the private DM object */
1463304006b3SVijay Mahadevan   (*newdm)->data = (DM_Moab*) dm->data;
1464304006b3SVijay Mahadevan   ((DM_Moab*)dm->data)->refct++;
1465304006b3SVijay Mahadevan 
14669566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject) *newdm, DMMOAB));
14679566063dSJacob Faibussowitsch   PetscCall(DMInitialize_Moab(*newdm));
1468304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1469304006b3SVijay Mahadevan }
1470304006b3SVijay Mahadevan 
1471f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
1472f6829af0SVijay Mahadevan {
1473f6829af0SVijay Mahadevan   PetscFunctionBegin;
1474f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
14759566063dSJacob Faibussowitsch   PetscCall(PetscNewLog(dm, (DM_Moab**)&dm->data));
1476f6829af0SVijay Mahadevan 
1477f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
1478f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->numFields = 1;
1479f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
1480f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
1481f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
1482f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
1483f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
1484f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleghost = 0;
1485c528d872SBarry Smith   ((DM_Moab*)dm->data)->ltog_map = NULL;
1486c528d872SBarry Smith   ((DM_Moab*)dm->data)->ltog_sendrecv = NULL;
1487f6829af0SVijay Mahadevan 
1488304006b3SVijay Mahadevan   ((DM_Moab*)dm->data)->refct = 1;
1489304006b3SVijay Mahadevan   ((DM_Moab*)dm->data)->parent = NULL;
1490f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
1491f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
1492f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
1493f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
1494f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
1495f6829af0SVijay Mahadevan 
14969566063dSJacob Faibussowitsch   PetscCall(DMInitialize_Moab(dm));
1497f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1498f6829af0SVijay Mahadevan }
1499