xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 60225df5d8469840be2bf9c1f64795a92b19f3c2)
1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I  "petscdmmoab.h"   I*/
21d72bce8STim Tautges 
31d72bce8STim Tautges #include <petscdmmoab.h>
488face26SJed Brown #include <MBTagConventions.hpp>
59daf19fdSVijay Mahadevan #include <moab/NestedRefine.hpp>
61cec0304SVijay Mahadevan #include <moab/Skinner.hpp>
7032b8ab6SVijay Mahadevan 
8c6ef30f9SVijay Mahadevan /*MC
9c6ef30f9SVijay Mahadevan   DMMOAB = "moab" - A DM object that encapsulates an unstructured mesh described by the MOAB mesh database.
10c6ef30f9SVijay Mahadevan                     Direct access to the MOAB Interface and other mesh manipulation related objects are available
11c6ef30f9SVijay Mahadevan                     through public API. Ability to create global and local representation of Vecs containing all
12c6ef30f9SVijay Mahadevan                     unknowns in the interior and shared boundary via a transparent tag-data wrapper is provided
13c6ef30f9SVijay Mahadevan                     along with utility functions to traverse the mesh and assemble a discrete system via
14c6ef30f9SVijay Mahadevan                     field-based/blocked Vec(Get/Set) methods. Input from and output to different formats are
15c6ef30f9SVijay Mahadevan                     available.
16c6ef30f9SVijay Mahadevan 
17a8d69d7bSBarry Smith   Reference: https://www.mcs.anl.gov/~fathom/moab-docs/html/contents.html
18c6ef30f9SVijay Mahadevan 
19c6ef30f9SVijay Mahadevan   Level: intermediate
20c6ef30f9SVijay Mahadevan 
21db781477SPatrick Sanan .seealso: `DMType`, `DMMoabCreate()`, `DMCreate()`, `DMSetType()`, `DMMoabCreateMoab()`
22c6ef30f9SVijay Mahadevan M*/
23c6ef30f9SVijay Mahadevan 
24304006b3SVijay Mahadevan /* External function declarations here */
25304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInterpolation_Moab(DM dmCoarse, DM dmFine, Mat *interpolation, Vec *scaling);
26304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateDefaultConstraints_Moab(DM dm);
27304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm, Mat *J);
28304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateCoordinateDM_Moab(DM dm, DM *cdm);
29304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefine_Moab(DM dm, MPI_Comm comm, DM *dmRefined);
30304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsen_Moab(DM dm, MPI_Comm comm, DM *dmCoarsened);
31304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefineHierarchy_Moab(DM dm, PetscInt nlevels, DM dmRefined[]);
32304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsenHierarchy_Moab(DM dm, PetscInt nlevels, DM dmCoarsened[]);
33304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm);
34304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateGlobalVector_Moab(DM, Vec *);
35304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateLocalVector_Moab(DM, Vec *);
36304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm, Mat *J);
37304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalBegin_Moab(DM, Vec, InsertMode, Vec);
38304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalEnd_Moab(DM, Vec, InsertMode, Vec);
39304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalBegin_Moab(DM, Vec, InsertMode, Vec);
40304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalEnd_Moab(DM, Vec, InsertMode, Vec);
41304006b3SVijay Mahadevan 
42304006b3SVijay Mahadevan /* Un-implemented routines */
43304006b3SVijay Mahadevan /*
441bb6d2a8SBarry Smith PETSC_EXTERN PetscErrorCode DMCreatelocalsection_Moab(DM dm);
45304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInjection_Moab(DM dmCoarse, DM dmFine, Mat *mat);
46304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLoad_Moab(DM dm, PetscViewer viewer);
47304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGetDimPoints_Moab(DM dm, PetscInt dim, PetscInt *pStart, PetscInt *pEnd);
48304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateSubDM_Moab(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm);
49304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocatePoints_Moab(DM dm, Vec v, IS *cellIS);
50304006b3SVijay Mahadevan */
51c6ef30f9SVijay Mahadevan 
52cab5ea25SPierre Jolivet /*@C
531d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
541d72bce8STim Tautges 
55d083f849SBarry Smith   Collective
561d72bce8STim Tautges 
571d72bce8STim Tautges   Input Parameter:
581d72bce8STim Tautges . comm - The communicator for the DMMoab object
591d72bce8STim Tautges 
601d72bce8STim Tautges   Output Parameter:
61032b8ab6SVijay Mahadevan . dmb - The DMMoab object
621d72bce8STim Tautges 
631d72bce8STim Tautges   Level: beginner
641d72bce8STim Tautges 
651d72bce8STim Tautges @*/
66d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
67d71ae5a4SJacob Faibussowitsch {
681d72bce8STim Tautges   PetscFunctionBegin;
69032b8ab6SVijay Mahadevan   PetscValidPointer(dmb, 2);
709566063dSJacob Faibussowitsch   PetscCall(DMCreate(comm, dmb));
719566063dSJacob Faibussowitsch   PetscCall(DMSetType(*dmb, DMMOAB));
723ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
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 @*/
93d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
94d71ae5a4SJacob Faibussowitsch {
95032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
9685d305f5SVijay Mahadevan   DM              dmmb;
97853cdec3SJed Brown   DM_Moab        *dmmoab;
981d72bce8STim Tautges 
991d72bce8STim Tautges   PetscFunctionBegin;
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;
1089371c9d4SSatish Balay   } else {
1091cec0304SVijay Mahadevan     dmmoab->mbiface          = mbiface;
1107d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
1111cec0304SVijay Mahadevan   }
1121cec0304SVijay Mahadevan 
113b5410836SVijay Mahadevan   /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */
114b5410836SVijay Mahadevan   dmmoab->fileset     = 0;
115b117cd09SVijay Mahadevan   dmmoab->hlevel      = 0;
11649d66b22SVijay Mahadevan   dmmoab->nghostrings = 0;
1177d89fc02STim Tautges 
1189daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1199daf19fdSVijay Mahadevan   moab::EntityHandle partnset;
120032b8ab6SVijay Mahadevan 
121db66d124SVijay Mahadevan   /* Create root sets for each mesh.  Then pass these
122db66d124SVijay Mahadevan       to the load_file functions to be populated. */
1239371c9d4SSatish Balay   merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);
1249371c9d4SSatish Balay   MBERR("Creating partition set failed", merr);
125032b8ab6SVijay Mahadevan 
126db66d124SVijay Mahadevan   /* Create the parallel communicator object with the partition handle associated with MOAB */
12772ff976dSVijay Mahadevan   dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
1289daf19fdSVijay Mahadevan #endif
129032b8ab6SVijay Mahadevan 
1304973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
1314973de03SVijay Mahadevan   dmmoab->bs        = 1;
132addae81cSVijay Mahadevan   dmmoab->numFields = 1;
1339566063dSJacob Faibussowitsch   PetscCall(PetscMalloc(dmmoab->numFields * sizeof(char *), &dmmoab->fieldNames));
1349566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy("DEFAULT", (char **)&dmmoab->fieldNames[0]));
1352e4e7c01SVijay Mahadevan   dmmoab->rw_dbglevel            = 0;
1362e4e7c01SVijay Mahadevan   dmmoab->partition_by_rank      = PETSC_FALSE;
1372e4e7c01SVijay Mahadevan   dmmoab->extra_read_options[0]  = '\0';
1382e4e7c01SVijay Mahadevan   dmmoab->extra_write_options[0] = '\0';
1392e4e7c01SVijay Mahadevan   dmmoab->read_mode              = READ_PART;
1402e4e7c01SVijay Mahadevan   dmmoab->write_mode             = WRITE_PART;
1414973de03SVijay Mahadevan 
1424973de03SVijay Mahadevan   /* set global ID tag handle */
1431a845d2aSVijay Mahadevan   if (ltog_tag && *ltog_tag) {
1449566063dSJacob Faibussowitsch     PetscCall(DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag));
1459371c9d4SSatish Balay   } else {
1469371c9d4SSatish Balay     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);
1479371c9d4SSatish Balay     MBERRNM(merr);
1481a845d2aSVijay Mahadevan     if (ltog_tag) *ltog_tag = dmmoab->ltog_tag;
149a4d2169cSTim Tautges   }
150a4d2169cSTim Tautges 
1519371c9d4SSatish Balay   merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag);
1529371c9d4SSatish Balay   MBERRNM(merr);
153340f3b9aSVijay Mahadevan 
1544973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
15548a46eb9SPierre Jolivet   if (range) PetscCall(DMMoabSetLocalVertices(dmmb, range));
15685d305f5SVijay Mahadevan   *dmb = dmmb;
1573ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1581d72bce8STim Tautges }
1591d72bce8STim Tautges 
1609daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1611d72bce8STim Tautges 
162cab5ea25SPierre Jolivet /*@C
163aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
164aa768e4cSTim Tautges 
165d083f849SBarry Smith   Collective
166aa768e4cSTim Tautges 
167aa768e4cSTim Tautges   Input Parameter:
168aa768e4cSTim Tautges . dm    - The DMMoab object being set
169aa768e4cSTim Tautges 
170aa768e4cSTim Tautges   Output Parameter:
171aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
172aa768e4cSTim Tautges 
173aa768e4cSTim Tautges   Level: beginner
174aa768e4cSTim Tautges 
175aa768e4cSTim Tautges @*/
176d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetParallelComm(DM dm, moab::ParallelComm **pcomm)
177d71ae5a4SJacob Faibussowitsch {
1781d72bce8STim Tautges   PetscFunctionBegin;
1791d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
180032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab *)(dm)->data)->pcomm;
1813ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1821d72bce8STim Tautges }
1831d72bce8STim Tautges 
1849daf19fdSVijay Mahadevan #endif /* MOAB_HAVE_MPI */
1859daf19fdSVijay Mahadevan 
186cab5ea25SPierre Jolivet /*@C
187aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
188aa768e4cSTim Tautges 
189d083f849SBarry Smith   Collective
190aa768e4cSTim Tautges 
191d8d19677SJose E. Roman   Input Parameters:
192a2b725a8SWilliam Gropp + dm      - The DMMoab object being set
193a2b725a8SWilliam Gropp - mbiface - The MOAB instance being set on this DMMoab
194aa768e4cSTim Tautges 
195aa768e4cSTim Tautges   Level: beginner
196aa768e4cSTim Tautges 
197aa768e4cSTim Tautges @*/
198d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetInterface(DM dm, moab::Interface *mbiface)
199d71ae5a4SJacob Faibussowitsch {
200032b8ab6SVijay Mahadevan   DM_Moab *dmmoab = (DM_Moab *)(dm)->data;
201032b8ab6SVijay Mahadevan 
2021d72bce8STim Tautges   PetscFunctionBegin;
2031d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2041cec0304SVijay Mahadevan   PetscValidPointer(mbiface, 2);
2059daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
206032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
2079daf19fdSVijay Mahadevan #endif
208032b8ab6SVijay Mahadevan   dmmoab->mbiface          = mbiface;
209032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
2103ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2111d72bce8STim Tautges }
2121d72bce8STim Tautges 
213cab5ea25SPierre Jolivet /*@C
214aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
215aa768e4cSTim Tautges 
216d083f849SBarry Smith   Collective
217aa768e4cSTim Tautges 
218aa768e4cSTim Tautges   Input Parameter:
219aa768e4cSTim Tautges . dm - The DMMoab object being set
220aa768e4cSTim Tautges 
221aa768e4cSTim Tautges   Output Parameter:
222aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
223aa768e4cSTim Tautges 
224aa768e4cSTim Tautges   Level: beginner
225aa768e4cSTim Tautges 
226aa768e4cSTim Tautges @*/
227d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetInterface(DM dm, moab::Interface **mbiface)
228d71ae5a4SJacob Faibussowitsch {
229cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
230cabb514dSBarry Smith 
2311d72bce8STim Tautges   PetscFunctionBegin;
2321d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2339371c9d4SSatish Balay   PetscCall(PetscCitationsRegister("@techreport{tautges_moab:_2004,\n  type = {{SAND2004-1592}},\n  title = {{MOAB:} A Mesh-Oriented Database},  institution = {Sandia National Laboratories},\n  author = {Tautges, T. J. and Meyers, R. and Merkley, "
2349371c9d4SSatish Balay                                    "K. and Stimpson, C. and Ernst, C.},\n  year = {2004},  note = {Report}\n}\n",
2359371c9d4SSatish Balay                                    &cite));
236a4d2169cSTim Tautges   *mbiface = ((DM_Moab *)dm->data)->mbiface;
2373ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2381d72bce8STim Tautges }
2391d72bce8STim Tautges 
240cab5ea25SPierre Jolivet /*@C
2415eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
242aa768e4cSTim Tautges 
243d083f849SBarry Smith   Collective
244aa768e4cSTim Tautges 
245d8d19677SJose E. Roman   Input Parameters:
246a2b725a8SWilliam Gropp + dm    - The DMMoab object being set
247a2b725a8SWilliam Gropp - range - The entities treated by this DMMoab
248aa768e4cSTim Tautges 
249aa768e4cSTim Tautges   Level: beginner
250aa768e4cSTim Tautges 
251aa768e4cSTim Tautges @*/
252d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetLocalVertices(DM dm, moab::Range *range)
253d71ae5a4SJacob Faibussowitsch {
254fd3326ddSVijay Mahadevan   moab::Range tmpvtxs;
255032b8ab6SVijay Mahadevan   DM_Moab    *dmmoab = (DM_Moab *)(dm)->data;
256032b8ab6SVijay Mahadevan 
2571d72bce8STim Tautges   PetscFunctionBegin;
2581d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
259032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
260032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
261fd3326ddSVijay Mahadevan 
262032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
263fd3326ddSVijay Mahadevan 
2649daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
2659daf19fdSVijay Mahadevan   moab::ErrorCode merr;
266fd3326ddSVijay Mahadevan   /* filter based on parallel status */
2679371c9d4SSatish Balay   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned);
2689371c9d4SSatish Balay   MBERRNM(merr);
269fd3326ddSVijay Mahadevan 
270fd3326ddSVijay Mahadevan   /* filter all the non-owned and shared entities out of the list */
271fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
2729371c9d4SSatish Balay   merr    = dmmoab->pcomm->filter_pstatus(tmpvtxs, PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost);
2739371c9d4SSatish Balay   MBERRNM(merr);
274fd3326ddSVijay Mahadevan   tmpvtxs         = moab::subtract(tmpvtxs, *dmmoab->vghost);
275fd3326ddSVijay Mahadevan   *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs);
2769daf19fdSVijay Mahadevan #else
2779daf19fdSVijay Mahadevan   *dmmoab->vowned = *dmmoab->vlocal;
2789daf19fdSVijay Mahadevan #endif
279fd3326ddSVijay Mahadevan 
280fd3326ddSVijay Mahadevan   /* compute and cache the sizes of local and ghosted entities */
281032b8ab6SVijay Mahadevan   dmmoab->nloc   = dmmoab->vowned->size();
282032b8ab6SVijay Mahadevan   dmmoab->nghost = dmmoab->vghost->size();
2839daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
2841c2dc1cbSBarry Smith   PetscCall(MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm));
2859daf19fdSVijay Mahadevan #else
2869daf19fdSVijay Mahadevan   dmmoab->n       = dmmoab->nloc;
2879daf19fdSVijay Mahadevan #endif
2883ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2891d72bce8STim Tautges }
2901d72bce8STim Tautges 
291cab5ea25SPierre Jolivet /*@C
2928d8d51c8SVijay Mahadevan   DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab
2938d8d51c8SVijay Mahadevan 
294d083f849SBarry Smith   Collective
2958d8d51c8SVijay Mahadevan 
2968d8d51c8SVijay Mahadevan   Input Parameter:
2978d8d51c8SVijay Mahadevan . dm - The DMMoab object being set
2988d8d51c8SVijay Mahadevan 
2998d8d51c8SVijay Mahadevan   Output Parameter:
300*60225df5SJacob Faibussowitsch . local - The local vertex entities in this DMMoab = (owned+ghosted)
3018d8d51c8SVijay Mahadevan 
3028d8d51c8SVijay Mahadevan   Level: beginner
3038d8d51c8SVijay Mahadevan 
3048d8d51c8SVijay Mahadevan @*/
305d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetAllVertices(DM dm, moab::Range *local)
306d71ae5a4SJacob Faibussowitsch {
3078d8d51c8SVijay Mahadevan   PetscFunctionBegin;
3088d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
3098d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab *)dm->data)->vlocal;
3103ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3118d8d51c8SVijay Mahadevan }
3128d8d51c8SVijay Mahadevan 
313cab5ea25SPierre Jolivet /*@C
3145eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
315aa768e4cSTim Tautges 
316d083f849SBarry Smith   Collective
317aa768e4cSTim Tautges 
318aa768e4cSTim Tautges   Input Parameter:
319aa768e4cSTim Tautges . dm - The DMMoab object being set
320aa768e4cSTim Tautges 
321a2b725a8SWilliam Gropp   Output Parameters:
322a2b725a8SWilliam Gropp + owned - The owned vertex entities in this DMMoab
323a2b725a8SWilliam Gropp - ghost - The ghosted entities (non-owned) stored locally in this partition
324aa768e4cSTim Tautges 
325aa768e4cSTim Tautges   Level: beginner
326aa768e4cSTim Tautges 
327aa768e4cSTim Tautges @*/
328d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetLocalVertices(DM dm, const moab::Range **owned, const moab::Range **ghost)
329d71ae5a4SJacob Faibussowitsch {
3301d72bce8STim Tautges   PetscFunctionBegin;
3311d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
332351b8a77SVijay Mahadevan   if (owned) *owned = ((DM_Moab *)dm->data)->vowned;
333351b8a77SVijay Mahadevan   if (ghost) *ghost = ((DM_Moab *)dm->data)->vghost;
3343ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3351d72bce8STim Tautges }
3361d72bce8STim Tautges 
337cab5ea25SPierre Jolivet /*@C
3385eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
3395eb88e9dSVijay Mahadevan 
340d083f849SBarry Smith   Collective
3415eb88e9dSVijay Mahadevan 
3425eb88e9dSVijay Mahadevan   Input Parameter:
3435eb88e9dSVijay Mahadevan . dm - The DMMoab object being set
3445eb88e9dSVijay Mahadevan 
3455eb88e9dSVijay Mahadevan   Output Parameter:
3465eb88e9dSVijay Mahadevan . range - The entities owned locally
3475eb88e9dSVijay Mahadevan 
3485eb88e9dSVijay Mahadevan   Level: beginner
3495eb88e9dSVijay Mahadevan 
3505eb88e9dSVijay Mahadevan @*/
351d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetLocalElements(DM dm, const moab::Range **range)
352d71ae5a4SJacob Faibussowitsch {
3535eb88e9dSVijay Mahadevan   PetscFunctionBegin;
3545eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
355351b8a77SVijay Mahadevan   if (range) *range = ((DM_Moab *)dm->data)->elocal;
3563ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3571cec0304SVijay Mahadevan }
3581cec0304SVijay Mahadevan 
359cab5ea25SPierre Jolivet /*@C
3601cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
3611cec0304SVijay Mahadevan 
362d083f849SBarry Smith   Collective
3631cec0304SVijay Mahadevan 
364a2b725a8SWilliam Gropp   Input Parameters:
365a2b725a8SWilliam Gropp + dm    - The DMMoab object being set
366a2b725a8SWilliam Gropp - range - The entities treated by this DMMoab
3671cec0304SVijay Mahadevan 
3681cec0304SVijay Mahadevan   Level: beginner
3691cec0304SVijay Mahadevan 
3701cec0304SVijay Mahadevan @*/
371d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetLocalElements(DM dm, moab::Range *range)
372d71ae5a4SJacob Faibussowitsch {
3731cec0304SVijay Mahadevan   DM_Moab *dmmoab = (DM_Moab *)(dm)->data;
3741cec0304SVijay Mahadevan 
3751cec0304SVijay Mahadevan   PetscFunctionBegin;
3761cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
3771cec0304SVijay Mahadevan   dmmoab->elocal->clear();
3781cec0304SVijay Mahadevan   dmmoab->eghost->clear();
3791cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
3809daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
3819daf19fdSVijay Mahadevan   moab::ErrorCode merr;
3829371c9d4SSatish Balay   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT);
3839371c9d4SSatish Balay   MBERRNM(merr);
3841cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
3859daf19fdSVijay Mahadevan #endif
3861cec0304SVijay Mahadevan   dmmoab->neleloc   = dmmoab->elocal->size();
38741dd5348SVijay Mahadevan   dmmoab->neleghost = dmmoab->eghost->size();
3889daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
3891c2dc1cbSBarry Smith   PetscCall(MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm));
3903ba16761SJacob Faibussowitsch   PetscCall(PetscInfo(dm, "Created %" PetscInt_FMT " local and %" PetscInt_FMT " global elements.\n", dmmoab->neleloc, dmmoab->nele));
3919daf19fdSVijay Mahadevan #else
3929daf19fdSVijay Mahadevan   dmmoab->nele    = dmmoab->neleloc;
3939daf19fdSVijay Mahadevan #endif
3943ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3955eb88e9dSVijay Mahadevan }
3965eb88e9dSVijay Mahadevan 
397cab5ea25SPierre Jolivet /*@C
398aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
399aa768e4cSTim Tautges 
400d083f849SBarry Smith   Collective
401aa768e4cSTim Tautges 
402a2b725a8SWilliam Gropp   Input Parameters:
403a2b725a8SWilliam Gropp + dm      - The DMMoab object being set
404a2b725a8SWilliam Gropp - ltogtag - The MOAB tag used for local to global ids
405aa768e4cSTim Tautges 
406aa768e4cSTim Tautges   Level: beginner
407aa768e4cSTim Tautges 
408aa768e4cSTim Tautges @*/
409d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm, moab::Tag ltogtag)
410d71ae5a4SJacob Faibussowitsch {
4111d72bce8STim Tautges   PetscFunctionBegin;
4121d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4131d72bce8STim Tautges   ((DM_Moab *)dm->data)->ltog_tag = ltogtag;
4143ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4151d72bce8STim Tautges }
4161d72bce8STim Tautges 
417cab5ea25SPierre Jolivet /*@C
418aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
419aa768e4cSTim Tautges 
420d083f849SBarry Smith   Collective
421aa768e4cSTim Tautges 
422aa768e4cSTim Tautges   Input Parameter:
423aa768e4cSTim Tautges . dm - The DMMoab object being set
424aa768e4cSTim Tautges 
425aa768e4cSTim Tautges   Output Parameter:
426*60225df5SJacob Faibussowitsch . ltog_tag - The MOAB tag used for local to global ids
427aa768e4cSTim Tautges 
428aa768e4cSTim Tautges   Level: beginner
429aa768e4cSTim Tautges 
430aa768e4cSTim Tautges @*/
431d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm, moab::Tag *ltog_tag)
432d71ae5a4SJacob Faibussowitsch {
4331d72bce8STim Tautges   PetscFunctionBegin;
4341d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4351d72bce8STim Tautges   *ltog_tag = ((DM_Moab *)dm->data)->ltog_tag;
4363ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4371d72bce8STim Tautges }
4381d72bce8STim Tautges 
439cab5ea25SPierre Jolivet /*@C
440aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
441aa768e4cSTim Tautges 
442d083f849SBarry Smith   Collective
443aa768e4cSTim Tautges 
444d8d19677SJose E. Roman   Input Parameters:
445a2b725a8SWilliam Gropp + dm - The DMMoab object being set
446a2b725a8SWilliam Gropp - bs - The block size used with this DMMoab
447aa768e4cSTim Tautges 
448aa768e4cSTim Tautges   Level: beginner
449aa768e4cSTim Tautges 
450aa768e4cSTim Tautges @*/
451d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetBlockSize(DM dm, PetscInt bs)
452d71ae5a4SJacob Faibussowitsch {
4531d72bce8STim Tautges   PetscFunctionBegin;
4541d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4551d72bce8STim Tautges   ((DM_Moab *)dm->data)->bs = bs;
4563ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4571d72bce8STim Tautges }
4581d72bce8STim Tautges 
459cab5ea25SPierre Jolivet /*@C
460aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
461aa768e4cSTim Tautges 
462d083f849SBarry Smith   Collective
463aa768e4cSTim Tautges 
464aa768e4cSTim Tautges   Input Parameter:
465aa768e4cSTim Tautges . dm - The DMMoab object being set
466aa768e4cSTim Tautges 
467aa768e4cSTim Tautges   Output Parameter:
468aa768e4cSTim Tautges . bs - The block size used with this DMMoab
469aa768e4cSTim Tautges 
470aa768e4cSTim Tautges   Level: beginner
471aa768e4cSTim Tautges 
472aa768e4cSTim Tautges @*/
473d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetBlockSize(DM dm, PetscInt *bs)
474d71ae5a4SJacob Faibussowitsch {
4751d72bce8STim Tautges   PetscFunctionBegin;
4761d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4771d72bce8STim Tautges   *bs = ((DM_Moab *)dm->data)->bs;
4783ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4791d72bce8STim Tautges }
4801d72bce8STim Tautges 
481cab5ea25SPierre Jolivet /*@C
482212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
483212ad6d1SVijay Mahadevan 
484d083f849SBarry Smith   Collective on dm
485212ad6d1SVijay Mahadevan 
486212ad6d1SVijay Mahadevan   Input Parameter:
487212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
488212ad6d1SVijay Mahadevan 
489d8d19677SJose E. Roman   Output Parameters:
490a2b725a8SWilliam Gropp + neg - The number of global elements in the DMMoab instance
491a2b725a8SWilliam Gropp - nvg - The number of global vertices in the DMMoab instance
492212ad6d1SVijay Mahadevan 
493212ad6d1SVijay Mahadevan   Level: beginner
494212ad6d1SVijay Mahadevan 
495212ad6d1SVijay Mahadevan @*/
496d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetSize(DM dm, PetscInt *neg, PetscInt *nvg)
497d71ae5a4SJacob Faibussowitsch {
498212ad6d1SVijay Mahadevan   PetscFunctionBegin;
499212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
50041dd5348SVijay Mahadevan   if (neg) *neg = ((DM_Moab *)dm->data)->nele;
50141dd5348SVijay Mahadevan   if (nvg) *nvg = ((DM_Moab *)dm->data)->n;
5023ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
503212ad6d1SVijay Mahadevan }
504212ad6d1SVijay Mahadevan 
505cab5ea25SPierre Jolivet /*@C
506212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
507212ad6d1SVijay Mahadevan 
508d083f849SBarry Smith   Collective on dm
509212ad6d1SVijay Mahadevan 
510212ad6d1SVijay Mahadevan   Input Parameter:
511212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
512212ad6d1SVijay Mahadevan 
513d8d19677SJose E. Roman   Output Parameters:
514b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor
51500cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor
51600cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor
517a2b725a8SWilliam Gropp - nvg - The number of ghosted vertices in this processor
518212ad6d1SVijay Mahadevan 
519212ad6d1SVijay Mahadevan   Level: beginner
520212ad6d1SVijay Mahadevan 
521212ad6d1SVijay Mahadevan @*/
522d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetLocalSize(DM dm, PetscInt *nel, PetscInt *neg, PetscInt *nvl, PetscInt *nvg)
523d71ae5a4SJacob Faibussowitsch {
524212ad6d1SVijay Mahadevan   PetscFunctionBegin;
525212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
52641dd5348SVijay Mahadevan   if (nel) *nel = ((DM_Moab *)dm->data)->neleloc;
52741dd5348SVijay Mahadevan   if (neg) *neg = ((DM_Moab *)dm->data)->neleghost;
52841dd5348SVijay Mahadevan   if (nvl) *nvl = ((DM_Moab *)dm->data)->nloc;
52941dd5348SVijay Mahadevan   if (nvg) *nvg = ((DM_Moab *)dm->data)->nghost;
5303ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
531212ad6d1SVijay Mahadevan }
532212ad6d1SVijay Mahadevan 
533cab5ea25SPierre Jolivet /*@C
53400cc10feSVijay Mahadevan   DMMoabGetOffset - Get the local offset for the global vector
53500cc10feSVijay Mahadevan 
536d083f849SBarry Smith   Collective
53700cc10feSVijay Mahadevan 
53800cc10feSVijay Mahadevan   Input Parameter:
53900cc10feSVijay Mahadevan . dm - The DMMoab object being set
54000cc10feSVijay Mahadevan 
54100cc10feSVijay Mahadevan   Output Parameter:
54200cc10feSVijay Mahadevan . offset - The local offset for the global vector
54300cc10feSVijay Mahadevan 
54400cc10feSVijay Mahadevan   Level: beginner
54500cc10feSVijay Mahadevan 
54600cc10feSVijay Mahadevan @*/
547d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetOffset(DM dm, PetscInt *offset)
548d71ae5a4SJacob Faibussowitsch {
54900cc10feSVijay Mahadevan   PetscFunctionBegin;
55000cc10feSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
55100cc10feSVijay Mahadevan   *offset = ((DM_Moab *)dm->data)->vstart;
5523ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
55300cc10feSVijay Mahadevan }
55400cc10feSVijay Mahadevan 
555cab5ea25SPierre Jolivet /*@C
5564920ab11SVijay Mahadevan   DMMoabGetDimension - Get the dimension of the DM Mesh
5574920ab11SVijay Mahadevan 
558d083f849SBarry Smith   Collective
5594920ab11SVijay Mahadevan 
5604920ab11SVijay Mahadevan   Input Parameter:
561340f3b9aSVijay Mahadevan . dm - The DMMoab object
5624920ab11SVijay Mahadevan 
5634920ab11SVijay Mahadevan   Output Parameter:
5644920ab11SVijay Mahadevan . dim - The dimension of DM
5654920ab11SVijay Mahadevan 
5664920ab11SVijay Mahadevan   Level: beginner
5674920ab11SVijay Mahadevan 
5684920ab11SVijay Mahadevan @*/
569d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetDimension(DM dm, PetscInt *dim)
570d71ae5a4SJacob Faibussowitsch {
5714920ab11SVijay Mahadevan   PetscFunctionBegin;
5724920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
5734920ab11SVijay Mahadevan   *dim = ((DM_Moab *)dm->data)->dim;
5743ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5754920ab11SVijay Mahadevan }
5764920ab11SVijay Mahadevan 
577cab5ea25SPierre Jolivet /*@C
578755f3dfbSVijay Mahadevan   DMMoabGetHierarchyLevel - Get the current level of the mesh hierarchy
579755f3dfbSVijay Mahadevan   generated through uniform refinement.
580755f3dfbSVijay Mahadevan 
581d083f849SBarry Smith   Collective on dm
582755f3dfbSVijay Mahadevan 
583755f3dfbSVijay Mahadevan   Input Parameter:
584755f3dfbSVijay Mahadevan . dm - The DMMoab object being set
585755f3dfbSVijay Mahadevan 
586755f3dfbSVijay Mahadevan   Output Parameter:
587*60225df5SJacob Faibussowitsch . nlevel - The current mesh hierarchy level
588755f3dfbSVijay Mahadevan 
589755f3dfbSVijay Mahadevan   Level: beginner
590755f3dfbSVijay Mahadevan 
591755f3dfbSVijay Mahadevan @*/
592d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetHierarchyLevel(DM dm, PetscInt *nlevel)
593d71ae5a4SJacob Faibussowitsch {
594755f3dfbSVijay Mahadevan   PetscFunctionBegin;
595755f3dfbSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
596755f3dfbSVijay Mahadevan   if (nlevel) *nlevel = ((DM_Moab *)dm->data)->hlevel;
5973ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
598755f3dfbSVijay Mahadevan }
599755f3dfbSVijay Mahadevan 
600cab5ea25SPierre Jolivet /*@C
601340f3b9aSVijay Mahadevan   DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh
602340f3b9aSVijay Mahadevan 
603d083f849SBarry Smith   Collective
604340f3b9aSVijay Mahadevan 
605d8d19677SJose E. Roman   Input Parameters:
606a2b725a8SWilliam Gropp + dm      - The DMMoab object
607a2b725a8SWilliam Gropp - ehandle - The element entity handle
608340f3b9aSVijay Mahadevan 
609340f3b9aSVijay Mahadevan   Output Parameter:
610340f3b9aSVijay Mahadevan . mat - The material ID for the current entity
611340f3b9aSVijay Mahadevan 
612340f3b9aSVijay Mahadevan   Level: beginner
613340f3b9aSVijay Mahadevan 
614340f3b9aSVijay Mahadevan @*/
615d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetMaterialBlock(DM dm, const moab::EntityHandle ehandle, PetscInt *mat)
616d71ae5a4SJacob Faibussowitsch {
617340f3b9aSVijay Mahadevan   DM_Moab *dmmoab;
618340f3b9aSVijay Mahadevan 
619340f3b9aSVijay Mahadevan   PetscFunctionBegin;
620340f3b9aSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
621340f3b9aSVijay Mahadevan   if (*mat) {
622340f3b9aSVijay Mahadevan     dmmoab = (DM_Moab *)(dm)->data;
623a044f6b6SVijay Mahadevan     *mat   = dmmoab->materials[dmmoab->elocal->index(ehandle)];
624340f3b9aSVijay Mahadevan   }
6253ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
626340f3b9aSVijay Mahadevan }
627340f3b9aSVijay Mahadevan 
628cab5ea25SPierre Jolivet /*@C
62985d305f5SVijay Mahadevan   DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities
63085d305f5SVijay Mahadevan 
631d083f849SBarry Smith   Collective
63285d305f5SVijay Mahadevan 
633d8d19677SJose E. Roman   Input Parameters:
634a2b725a8SWilliam Gropp + dm    - The DMMoab object
63585d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
636a2b725a8SWilliam Gropp - conn  - The vertex entity handles
63785d305f5SVijay Mahadevan 
63885d305f5SVijay Mahadevan   Output Parameter:
63985d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities
64085d305f5SVijay Mahadevan 
64185d305f5SVijay Mahadevan   Level: beginner
64285d305f5SVijay Mahadevan 
643db781477SPatrick Sanan .seealso: `DMMoabGetVertexConnectivity()`
64485d305f5SVijay Mahadevan @*/
645d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetVertexCoordinates(DM dm, PetscInt nconn, const moab::EntityHandle *conn, PetscReal *vpos)
646d71ae5a4SJacob Faibussowitsch {
6477023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
6487023aa44SVijay Mahadevan   moab::ErrorCode merr;
6497023aa44SVijay Mahadevan 
6507023aa44SVijay Mahadevan   PetscFunctionBegin;
6517023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
6527023aa44SVijay Mahadevan   PetscValidPointer(conn, 3);
6539c368985SVijay Mahadevan   PetscValidPointer(vpos, 4);
6547023aa44SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
6557023aa44SVijay Mahadevan 
6567023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
6579c368985SVijay Mahadevan   if (dmmoab->hlevel) {
6589371c9d4SSatish Balay     merr = dmmoab->hierarchy->get_coordinates(const_cast<moab::EntityHandle *>(conn), nconn, dmmoab->hlevel, vpos);
6599371c9d4SSatish Balay     MBERRNM(merr);
6609371c9d4SSatish Balay   } else {
6619371c9d4SSatish Balay     merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);
6629371c9d4SSatish Balay     MBERRNM(merr);
6639c368985SVijay Mahadevan   }
6643ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6657023aa44SVijay Mahadevan }
6667023aa44SVijay Mahadevan 
667cab5ea25SPierre Jolivet /*@C
66885d305f5SVijay Mahadevan   DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity
66985d305f5SVijay Mahadevan 
670d083f849SBarry Smith   Collective
67185d305f5SVijay Mahadevan 
672d8d19677SJose E. Roman   Input Parameters:
673a2b725a8SWilliam Gropp + dm      - The DMMoab object
674a2b725a8SWilliam Gropp - vhandle - Vertex entity handle
67585d305f5SVijay Mahadevan 
676d8d19677SJose E. Roman   Output Parameters:
677a2b725a8SWilliam Gropp + nconn - Number of entities whose coordinates are needed
678a2b725a8SWilliam Gropp - conn  - The vertex entity handles
67985d305f5SVijay Mahadevan 
68085d305f5SVijay Mahadevan   Level: beginner
68185d305f5SVijay Mahadevan 
682db781477SPatrick Sanan .seealso: `DMMoabGetVertexCoordinates()`, `DMMoabRestoreVertexConnectivity()`
68385d305f5SVijay Mahadevan @*/
684d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetVertexConnectivity(DM dm, moab::EntityHandle vhandle, PetscInt *nconn, moab::EntityHandle **conn)
685d71ae5a4SJacob Faibussowitsch {
6868d8d51c8SVijay Mahadevan   DM_Moab                        *dmmoab;
6878d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities, connect;
6888d8d51c8SVijay Mahadevan   moab::ErrorCode                 merr;
6898d8d51c8SVijay Mahadevan 
6908d8d51c8SVijay Mahadevan   PetscFunctionBegin;
6918d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
6928d8d51c8SVijay Mahadevan   PetscValidPointer(conn, 4);
6938d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
6948d8d51c8SVijay Mahadevan 
6958d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
6969371c9d4SSatish Balay   merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION);
6979371c9d4SSatish Balay   MBERRNM(merr);
6989371c9d4SSatish Balay   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0], adj_entities.size(), connect);
6999371c9d4SSatish Balay   MBERRNM(merr);
7008d8d51c8SVijay Mahadevan 
7018d8d51c8SVijay Mahadevan   if (conn) {
7029566063dSJacob Faibussowitsch     PetscCall(PetscMalloc(sizeof(moab::EntityHandle) * connect.size(), conn));
7039566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(*conn, &connect[0], connect.size()));
7048d8d51c8SVijay Mahadevan   }
7058d8d51c8SVijay Mahadevan   if (nconn) *nconn = connect.size();
7063ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7078d8d51c8SVijay Mahadevan }
7088d8d51c8SVijay Mahadevan 
709cab5ea25SPierre Jolivet /*@C
71085d305f5SVijay Mahadevan   DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity
71185d305f5SVijay Mahadevan 
712d083f849SBarry Smith   Collective
71385d305f5SVijay Mahadevan 
714d8d19677SJose E. Roman   Input Parameters:
715a2b725a8SWilliam Gropp + dm      - The DMMoab object
716*60225df5SJacob Faibussowitsch . ehandle - Vertex entity handle
71785d305f5SVijay Mahadevan . nconn   - Number of entities whose coordinates are needed
718a2b725a8SWilliam Gropp - conn    - The vertex entity handles
71985d305f5SVijay Mahadevan 
72085d305f5SVijay Mahadevan   Level: beginner
72185d305f5SVijay Mahadevan 
722db781477SPatrick Sanan .seealso: `DMMoabGetVertexCoordinates()`, `DMMoabGetVertexConnectivity()`
72385d305f5SVijay Mahadevan @*/
724d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt *nconn, moab::EntityHandle **conn)
725d71ae5a4SJacob Faibussowitsch {
7268d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7278d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
7288d8d51c8SVijay Mahadevan   PetscValidPointer(conn, 4);
7298d8d51c8SVijay Mahadevan 
73048a46eb9SPierre Jolivet   if (conn) PetscCall(PetscFree(*conn));
7318d8d51c8SVijay Mahadevan   if (nconn) *nconn = 0;
7323ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7338d8d51c8SVijay Mahadevan }
7348d8d51c8SVijay Mahadevan 
735cab5ea25SPierre Jolivet /*@C
73685d305f5SVijay Mahadevan   DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity
73785d305f5SVijay Mahadevan 
738d083f849SBarry Smith   Collective
73985d305f5SVijay Mahadevan 
740d8d19677SJose E. Roman   Input Parameters:
741a2b725a8SWilliam Gropp + dm      - The DMMoab object
742a2b725a8SWilliam Gropp - ehandle - Vertex entity handle
74385d305f5SVijay Mahadevan 
744d8d19677SJose E. Roman   Output Parameters:
745a2b725a8SWilliam Gropp + nconn - Number of entities whose coordinates are needed
746a2b725a8SWilliam Gropp - conn  - The vertex entity handles
74785d305f5SVijay Mahadevan 
74885d305f5SVijay Mahadevan   Level: beginner
74985d305f5SVijay Mahadevan 
750db781477SPatrick Sanan .seealso: `DMMoabGetVertexCoordinates()`, `DMMoabGetVertexConnectivity()`, `DMMoabRestoreVertexConnectivity()`
75185d305f5SVijay Mahadevan @*/
752d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetElementConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt *nconn, const moab::EntityHandle **conn)
753d71ae5a4SJacob Faibussowitsch {
7547023aa44SVijay Mahadevan   DM_Moab                        *dmmoab;
7557023aa44SVijay Mahadevan   const moab::EntityHandle       *connect;
7569c368985SVijay Mahadevan   std::vector<moab::EntityHandle> vconn;
7577023aa44SVijay Mahadevan   moab::ErrorCode                 merr;
7587023aa44SVijay Mahadevan   PetscInt                        nnodes;
7597023aa44SVijay Mahadevan 
7607023aa44SVijay Mahadevan   PetscFunctionBegin;
7617023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
7627023aa44SVijay Mahadevan   PetscValidPointer(conn, 4);
7637023aa44SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
7647023aa44SVijay Mahadevan 
7657023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
7669371c9d4SSatish Balay   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);
7679371c9d4SSatish Balay   MBERRNM(merr);
7687023aa44SVijay Mahadevan   if (conn) *conn = connect;
7697023aa44SVijay Mahadevan   if (nconn) *nconn = nnodes;
7703ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7717023aa44SVijay Mahadevan }
7727023aa44SVijay Mahadevan 
773cab5ea25SPierre Jolivet /*@C
77485d305f5SVijay Mahadevan   DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element)
77585d305f5SVijay Mahadevan 
776d083f849SBarry Smith   Collective
77785d305f5SVijay Mahadevan 
778d8d19677SJose E. Roman   Input Parameters:
779a2b725a8SWilliam Gropp + dm  - The DMMoab object
780a2b725a8SWilliam Gropp - ent - Entity handle
78185d305f5SVijay Mahadevan 
78285d305f5SVijay Mahadevan   Output Parameter:
78385d305f5SVijay Mahadevan . ent_on_boundary - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
78485d305f5SVijay Mahadevan 
78585d305f5SVijay Mahadevan   Level: beginner
78685d305f5SVijay Mahadevan 
787db781477SPatrick Sanan .seealso: `DMMoabCheckBoundaryVertices()`
78885d305f5SVijay Mahadevan @*/
789d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabIsEntityOnBoundary(DM dm, const moab::EntityHandle ent, PetscBool *ent_on_boundary)
790d71ae5a4SJacob Faibussowitsch {
79169263071SVijay Mahadevan   moab::EntityType etype;
79269263071SVijay Mahadevan   DM_Moab         *dmmoab;
79369263071SVijay Mahadevan   PetscInt         edim;
79469263071SVijay Mahadevan 
79569263071SVijay Mahadevan   PetscFunctionBegin;
79669263071SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
79769263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary, 3);
79869263071SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
79969263071SVijay Mahadevan 
80069263071SVijay Mahadevan   /* get the entity type and handle accordingly */
80169263071SVijay Mahadevan   etype = dmmoab->mbiface->type_from_handle(ent);
8021dca8a05SBarry Smith   PetscCheck(etype < moab::MBPOLYHEDRON, PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Entity type on the boundary skin is invalid. EntityType = %" PetscInt_FMT, etype);
80369263071SVijay Mahadevan 
80469263071SVijay Mahadevan   /* get the entity dimension */
80569263071SVijay Mahadevan   edim = dmmoab->mbiface->dimension_from_handle(ent);
80669263071SVijay Mahadevan 
80769263071SVijay Mahadevan   *ent_on_boundary = PETSC_FALSE;
80869263071SVijay Mahadevan   if (etype == moab::MBVERTEX && edim == 0) {
80949d66b22SVijay Mahadevan     *ent_on_boundary = ((dmmoab->bndyvtx->index(ent) >= 0) ? PETSC_TRUE : PETSC_FALSE);
8109371c9d4SSatish Balay   } else {
81169263071SVijay Mahadevan     if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */
8126d9eb265SVijay Mahadevan       if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE;
8139371c9d4SSatish Balay     } else { /* next check the lower-dimensional faces */
8146d9eb265SVijay Mahadevan       if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE;
81569263071SVijay Mahadevan     }
81669263071SVijay Mahadevan   }
8173ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
81869263071SVijay Mahadevan }
81969263071SVijay Mahadevan 
820cab5ea25SPierre Jolivet /*@C
8214597dd3dSJose E. Roman   DMMoabCheckBoundaryVertices - Check whether a given entity is on the boundary (vertex, edge, face, element)
82285d305f5SVijay Mahadevan 
82397bb3fdcSJose E. Roman   Input Parameters:
824a2b725a8SWilliam Gropp + dm    - The DMMoab object
82585d305f5SVijay Mahadevan . nconn - Number of handles
826a2b725a8SWilliam Gropp - cnt   - Array of entity handles
82785d305f5SVijay Mahadevan 
82885d305f5SVijay Mahadevan   Output Parameter:
82985d305f5SVijay Mahadevan . isbdvtx - Array of boundary markers - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
83085d305f5SVijay Mahadevan 
83185d305f5SVijay Mahadevan   Level: beginner
83285d305f5SVijay Mahadevan 
833db781477SPatrick Sanan .seealso: `DMMoabIsEntityOnBoundary()`
83485d305f5SVijay Mahadevan @*/
835d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCheckBoundaryVertices(DM dm, PetscInt nconn, const moab::EntityHandle *cnt, PetscBool *isbdvtx)
836d71ae5a4SJacob Faibussowitsch {
8377023aa44SVijay Mahadevan   DM_Moab *dmmoab;
8387023aa44SVijay Mahadevan   PetscInt i;
8397023aa44SVijay Mahadevan 
8407023aa44SVijay Mahadevan   PetscFunctionBegin;
8417023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
8427023aa44SVijay Mahadevan   PetscValidPointer(cnt, 3);
8437023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx, 4);
8447023aa44SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
8457023aa44SVijay Mahadevan 
846ad540459SPierre Jolivet   for (i = 0; i < nconn; ++i) isbdvtx[i] = (dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE : PETSC_FALSE);
8473ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8487023aa44SVijay Mahadevan }
8497023aa44SVijay Mahadevan 
850cab5ea25SPierre Jolivet /*@C
85185d305f5SVijay Mahadevan   DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary
85285d305f5SVijay Mahadevan 
85385d305f5SVijay Mahadevan   Input Parameter:
85485d305f5SVijay Mahadevan . dm - The DMMoab object
85585d305f5SVijay Mahadevan 
856d8d19677SJose E. Roman   Output Parameters:
857a2b725a8SWilliam Gropp + bdvtx   - Boundary vertices
85885d305f5SVijay Mahadevan . bdelems - Boundary elements
859a2b725a8SWilliam Gropp - bdfaces - Boundary faces
86085d305f5SVijay Mahadevan 
86185d305f5SVijay Mahadevan   Level: beginner
86285d305f5SVijay Mahadevan 
863db781477SPatrick Sanan .seealso: `DMMoabCheckBoundaryVertices()`, `DMMoabIsEntityOnBoundary()`
86485d305f5SVijay Mahadevan @*/
865d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetBoundaryMarkers(DM dm, const moab::Range **bdvtx, const moab::Range **bdelems, const moab::Range **bdfaces)
866d71ae5a4SJacob Faibussowitsch {
8671cec0304SVijay Mahadevan   DM_Moab *dmmoab;
8681cec0304SVijay Mahadevan 
8691cec0304SVijay Mahadevan   PetscFunctionBegin;
8701cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
8711cec0304SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
8721cec0304SVijay Mahadevan 
8736d9eb265SVijay Mahadevan   if (bdvtx) *bdvtx = dmmoab->bndyvtx;
8746d9eb265SVijay Mahadevan   if (bdfaces) *bdfaces = dmmoab->bndyfaces;
8756d9eb265SVijay Mahadevan   if (bdelems) *bdfaces = dmmoab->bndyelems;
8763ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8771cec0304SVijay Mahadevan }
8781cec0304SVijay Mahadevan 
879d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm)
880d71ae5a4SJacob Faibussowitsch {
88185d305f5SVijay Mahadevan   PetscInt        i;
882e882eb38SVijay Mahadevan   moab::ErrorCode merr;
883f6829af0SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab *)dm->data;
884f6829af0SVijay Mahadevan 
885f6829af0SVijay Mahadevan   PetscFunctionBegin;
886f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
887304006b3SVijay Mahadevan 
888304006b3SVijay Mahadevan   dmmoab->refct--;
889304006b3SVijay Mahadevan   if (!dmmoab->refct) {
890f6829af0SVijay Mahadevan     delete dmmoab->vlocal;
891f6829af0SVijay Mahadevan     delete dmmoab->vowned;
892f6829af0SVijay Mahadevan     delete dmmoab->vghost;
893f6829af0SVijay Mahadevan     delete dmmoab->elocal;
894f6829af0SVijay Mahadevan     delete dmmoab->eghost;
895f6829af0SVijay Mahadevan     delete dmmoab->bndyvtx;
896f6829af0SVijay Mahadevan     delete dmmoab->bndyfaces;
897f6829af0SVijay Mahadevan     delete dmmoab->bndyelems;
898f6829af0SVijay Mahadevan 
8999566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->gsindices));
9009566063dSJacob Faibussowitsch     PetscCall(PetscFree2(dmmoab->gidmap, dmmoab->lidmap));
9019566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->dfill));
9029566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->ofill));
9039566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->materials));
90485d305f5SVijay Mahadevan     if (dmmoab->fieldNames) {
90548a46eb9SPierre Jolivet       for (i = 0; i < dmmoab->numFields; i++) PetscCall(PetscFree(dmmoab->fieldNames[i]));
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;
9189371c9d4SSatish Balay       merr = dmmoab->mbiface->delete_mesh();
9199371c9d4SSatish Balay       MBERRNM(merr);
920e882eb38SVijay Mahadevan       delete dmmoab->mbiface;
921e882eb38SVijay Mahadevan     }
922e882eb38SVijay Mahadevan     dmmoab->mbiface = NULL;
9239daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
924e882eb38SVijay Mahadevan     dmmoab->pcomm = NULL;
9259daf19fdSVijay Mahadevan #endif
9269566063dSJacob Faibussowitsch     PetscCall(VecScatterDestroy(&dmmoab->ltog_sendrecv));
9279566063dSJacob Faibussowitsch     PetscCall(ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map));
9289566063dSJacob Faibussowitsch     PetscCall(PetscFree(dm->data));
929304006b3SVijay Mahadevan   }
9303ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
931f6829af0SVijay Mahadevan }
932f6829af0SVijay Mahadevan 
933d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(DM dm, PetscOptionItems *PetscOptionsObject)
934d71ae5a4SJacob Faibussowitsch {
9352e4e7c01SVijay Mahadevan   DM_Moab *dmmoab = (DM_Moab *)dm->data;
9362e4e7c01SVijay Mahadevan 
9372e4e7c01SVijay Mahadevan   PetscFunctionBegin;
938d0609cedSBarry Smith   PetscOptionsHeadBegin(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));
946d0609cedSBarry Smith   PetscOptionsHeadEnd();
9473ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9482e4e7c01SVijay Mahadevan }
9492e4e7c01SVijay Mahadevan 
950d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm)
951d71ae5a4SJacob Faibussowitsch {
952f6829af0SVijay Mahadevan   moab::ErrorCode       merr;
953f6829af0SVijay Mahadevan   Vec                   local, global;
954f6829af0SVijay Mahadevan   IS                    from, to;
955f6829af0SVijay Mahadevan   moab::Range::iterator iter;
956304006b3SVijay Mahadevan   PetscInt              i, j, f, bs, vent, totsize, *lgmap;
957f6829af0SVijay Mahadevan   DM_Moab              *dmmoab = (DM_Moab *)dm->data;
958f6829af0SVijay Mahadevan   moab::Range           adjs;
959f6829af0SVijay Mahadevan 
960f6829af0SVijay Mahadevan   PetscFunctionBegin;
961f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
962f6829af0SVijay Mahadevan   /* Get the local and shared vertices and cache it */
96308401ef6SPierre Jolivet   PetscCheck(dmmoab->mbiface != NULL, PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface before calling SetUp.");
9649daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
96508401ef6SPierre Jolivet   PetscCheck(dmmoab->pcomm != NULL, PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB ParallelComm object before calling SetUp.");
9669daf19fdSVijay Mahadevan #endif
967f6829af0SVijay Mahadevan 
968f6829af0SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
9699371c9d4SSatish Balay   if (dmmoab->vlocal->empty()) {
97049d66b22SVijay Mahadevan     //merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
9719371c9d4SSatish Balay     merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, 0, *dmmoab->vlocal, false);
9729371c9d4SSatish Balay     MBERRNM(merr);
973f6829af0SVijay Mahadevan 
9749daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
975f6829af0SVijay Mahadevan     /* filter based on parallel status */
9769371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned);
9779371c9d4SSatish Balay     MBERRNM(merr);
978f6829af0SVijay Mahadevan 
979f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
9809c368985SVijay Mahadevan     // *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
981f6829af0SVijay Mahadevan     adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
9829371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(adjs, PSTATUS_GHOST | PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost);
9839371c9d4SSatish Balay     MBERRNM(merr);
984f6829af0SVijay Mahadevan     adjs            = moab::subtract(adjs, *dmmoab->vghost);
985f6829af0SVijay Mahadevan     *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs);
9869daf19fdSVijay Mahadevan #else
9879daf19fdSVijay Mahadevan     *dmmoab->vowned = *dmmoab->vlocal;
9889daf19fdSVijay Mahadevan #endif
989f6829af0SVijay Mahadevan 
990f6829af0SVijay Mahadevan     /* compute and cache the sizes of local and ghosted entities */
991f6829af0SVijay Mahadevan     dmmoab->nloc   = dmmoab->vowned->size();
992f6829af0SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
99349d66b22SVijay Mahadevan 
9949daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
9951c2dc1cbSBarry Smith     PetscCall(MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm));
9963ba16761SJacob Faibussowitsch     PetscCall(PetscInfo(NULL, "Filset ID: %lu, Vertices: local - %zu, owned - %" PetscInt_FMT ", ghosted - %" PetscInt_FMT ".\n", dmmoab->fileset, dmmoab->vlocal->size(), dmmoab->nloc, dmmoab->nghost));
9979daf19fdSVijay Mahadevan #else
9989daf19fdSVijay Mahadevan     dmmoab->n       = dmmoab->nloc;
9999daf19fdSVijay Mahadevan #endif
1000f6829af0SVijay Mahadevan   }
1001f6829af0SVijay Mahadevan 
1002f6829af0SVijay Mahadevan   {
1003f6829af0SVijay Mahadevan     /* get the information about the local elements in the mesh */
1004f6829af0SVijay Mahadevan     dmmoab->eghost->clear();
1005f6829af0SVijay Mahadevan 
1006f6829af0SVijay Mahadevan     /* first decipher the leading dimension */
1007f6829af0SVijay Mahadevan     for (i = 3; i > 0; i--) {
1008f6829af0SVijay Mahadevan       dmmoab->elocal->clear();
10099371c9d4SSatish Balay       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, false);
10109371c9d4SSatish Balay       MBERRNM(merr);
1011f6829af0SVijay Mahadevan 
1012f6829af0SVijay Mahadevan       /* store the current mesh dimension */
1013f6829af0SVijay Mahadevan       if (dmmoab->elocal->size()) {
1014f6829af0SVijay Mahadevan         dmmoab->dim = i;
1015f6829af0SVijay Mahadevan         break;
1016f6829af0SVijay Mahadevan       }
1017f6829af0SVijay Mahadevan     }
1018f6829af0SVijay Mahadevan 
10199566063dSJacob Faibussowitsch     PetscCall(DMSetDimension(dm, dmmoab->dim));
1020b117cd09SVijay Mahadevan 
10219daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1022f6829af0SVijay Mahadevan     /* filter the ghosted and owned element list */
1023f6829af0SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
10249371c9d4SSatish Balay     merr            = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT);
10259371c9d4SSatish Balay     MBERRNM(merr);
1026f6829af0SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
10279daf19fdSVijay Mahadevan #endif
1028f6829af0SVijay Mahadevan 
1029f6829af0SVijay Mahadevan     dmmoab->neleloc   = dmmoab->elocal->size();
1030f6829af0SVijay Mahadevan     dmmoab->neleghost = dmmoab->eghost->size();
103149d66b22SVijay Mahadevan 
10329daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
10331c2dc1cbSBarry Smith     PetscCall(MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm));
10343ba16761SJacob Faibussowitsch     PetscCall(PetscInfo(NULL, "%d-dim elements: owned - %" PetscInt_FMT ", ghosted - %" PetscInt_FMT ".\n", dmmoab->dim, dmmoab->neleloc, dmmoab->neleghost));
10359daf19fdSVijay Mahadevan #else
10369daf19fdSVijay Mahadevan     dmmoab->nele    = dmmoab->neleloc;
10379daf19fdSVijay Mahadevan #endif
1038f6829af0SVijay Mahadevan   }
1039f6829af0SVijay Mahadevan 
1040f6829af0SVijay Mahadevan   bs = dmmoab->bs;
1041f6829af0SVijay Mahadevan   if (!dmmoab->ltog_tag) {
1042f6829af0SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
1043f6829af0SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
1044f6829af0SVijay Mahadevan        assemble the individual pieces of the mesh */
10459371c9d4SSatish Balay     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);
10469371c9d4SSatish Balay     MBERRNM(merr);
1047f6829af0SVijay Mahadevan   }
1048f6829af0SVijay Mahadevan 
1049f6829af0SVijay Mahadevan   totsize = dmmoab->vlocal->size();
10501dca8a05SBarry Smith   PetscCheck(totsize == dmmoab->nloc + dmmoab->nghost, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Mismatch between local and owned+ghost vertices. %" PetscInt_FMT " != %" PetscInt_FMT ".", totsize, dmmoab->nloc + dmmoab->nghost);
10519566063dSJacob Faibussowitsch   PetscCall(PetscCalloc1(totsize, &dmmoab->gsindices));
1052f6829af0SVijay Mahadevan   {
1053f6829af0SVijay Mahadevan     /* first get the local indices */
10549371c9d4SSatish Balay     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vowned, &dmmoab->gsindices[0]);
10559371c9d4SSatish Balay     MBERRNM(merr);
10563f1c6e43SVijay Mahadevan     if (dmmoab->nghost) { /* next get the ghosted indices */
10579371c9d4SSatish Balay       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vghost, &dmmoab->gsindices[dmmoab->nloc]);
10589371c9d4SSatish Balay       MBERRNM(merr);
1059f6829af0SVijay Mahadevan     }
1060f6829af0SVijay Mahadevan 
1061f6829af0SVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
1062304006b3SVijay Mahadevan     dmmoab->lminmax[0] = dmmoab->lminmax[1] = dmmoab->gsindices[0];
1063f6829af0SVijay Mahadevan     for (i = 0; i < totsize; ++i) {
1064304006b3SVijay Mahadevan       if (dmmoab->lminmax[0] > dmmoab->gsindices[i]) dmmoab->lminmax[0] = dmmoab->gsindices[i];
1065304006b3SVijay Mahadevan       if (dmmoab->lminmax[1] < dmmoab->gsindices[i]) dmmoab->lminmax[1] = dmmoab->gsindices[i];
1066f6829af0SVijay Mahadevan     }
1067f6829af0SVijay Mahadevan 
10681c2dc1cbSBarry Smith     PetscCall(MPIU_Allreduce(&dmmoab->lminmax[0], &dmmoab->gminmax[0], 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm));
10691c2dc1cbSBarry Smith     PetscCall(MPIU_Allreduce(&dmmoab->lminmax[1], &dmmoab->gminmax[1], 1, MPI_INT, MPI_MAX, ((PetscObject)dm)->comm));
1070f6829af0SVijay Mahadevan 
1071f6829af0SVijay Mahadevan     /* set the GID map */
10729371c9d4SSatish Balay     for (i = 0; i < totsize; ++i) { dmmoab->gsindices[i] -= dmmoab->gminmax[0]; /* zero based index needed for IS */ }
1073304006b3SVijay Mahadevan     dmmoab->lminmax[0] -= dmmoab->gminmax[0];
1074304006b3SVijay Mahadevan     dmmoab->lminmax[1] -= dmmoab->gminmax[0];
1075f6829af0SVijay Mahadevan 
10763ba16761SJacob Faibussowitsch     PetscCall(PetscInfo(NULL, "GLOBAL_ID: Local [min, max] - [%" PetscInt_FMT ", %" PetscInt_FMT "], Global [min, max] - [%" PetscInt_FMT ", %" PetscInt_FMT "]\n", dmmoab->lminmax[0], dmmoab->lminmax[1], dmmoab->gminmax[0], dmmoab->gminmax[1]));
1077f6829af0SVijay Mahadevan   }
10789371c9d4SSatish Balay   PetscCheck(dmmoab->bs == dmmoab->numFields || dmmoab->bs == 1, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Mismatch between block size and number of component fields. %" PetscInt_FMT " != 1 OR %" PetscInt_FMT " != %" PetscInt_FMT ".", dmmoab->bs, dmmoab->bs,
10799371c9d4SSatish Balay              dmmoab->numFields);
1080f6829af0SVijay Mahadevan 
1081f6829af0SVijay Mahadevan   {
10829c368985SVijay Mahadevan     dmmoab->seqstart = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->front());
10839c368985SVijay Mahadevan     dmmoab->seqend   = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->back());
10843ba16761SJacob Faibussowitsch     PetscCall(PetscInfo(NULL, "SEQUENCE: Local [min, max] - [%" PetscInt_FMT ", %" PetscInt_FMT "]\n", dmmoab->seqstart, dmmoab->seqend));
10853f1c6e43SVijay Mahadevan 
10869566063dSJacob Faibussowitsch     PetscCall(PetscMalloc2(dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->gidmap, dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->lidmap));
10879566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(totsize * dmmoab->numFields, &lgmap));
1088f6829af0SVijay Mahadevan 
1089f6829af0SVijay Mahadevan     i = j = 0;
1090f6829af0SVijay Mahadevan     /* set the owned vertex data first */
1091f6829af0SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++, i++) {
1092e92d1c7cSVijay Mahadevan       vent                 = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart;
1093f6829af0SVijay Mahadevan       dmmoab->gidmap[vent] = dmmoab->gsindices[i];
1094f6829af0SVijay Mahadevan       dmmoab->lidmap[vent] = i;
1095ad540459SPierre Jolivet       for (f = 0; f < dmmoab->numFields; f++, j++) lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]);
1096f6829af0SVijay Mahadevan     }
1097f6829af0SVijay Mahadevan     /* next arrange all the ghosted data information */
1098f6829af0SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++, i++) {
1099e92d1c7cSVijay Mahadevan       vent                 = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart;
1100f6829af0SVijay Mahadevan       dmmoab->gidmap[vent] = dmmoab->gsindices[i];
1101f6829af0SVijay Mahadevan       dmmoab->lidmap[vent] = i;
1102ad540459SPierre Jolivet       for (f = 0; f < dmmoab->numFields; f++, j++) lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]);
1103f6829af0SVijay Mahadevan     }
1104f6829af0SVijay Mahadevan 
1105f6829af0SVijay Mahadevan     /* We need to create the Global to Local Vector Scatter Contexts
1106f6829af0SVijay Mahadevan        1) First create a local and global vector
1107f6829af0SVijay Mahadevan        2) Create a local and global IS
1108f6829af0SVijay Mahadevan        3) Create VecScatter and LtoGMapping objects
1109f6829af0SVijay Mahadevan        4) Cleanup the IS and Vec objects
1110f6829af0SVijay Mahadevan     */
11119566063dSJacob Faibussowitsch     PetscCall(DMCreateGlobalVector(dm, &global));
11129566063dSJacob Faibussowitsch     PetscCall(DMCreateLocalVector(dm, &local));
1113f6829af0SVijay Mahadevan 
11149566063dSJacob Faibussowitsch     PetscCall(VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend));
1115f6829af0SVijay Mahadevan 
1116f6829af0SVijay Mahadevan     /* global to local must retrieve ghost points */
11179566063dSJacob Faibussowitsch     PetscCall(ISCreateStride(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, dmmoab->vstart, 1, &from));
11189566063dSJacob Faibussowitsch     PetscCall(ISSetBlockSize(from, bs));
1119f6829af0SVijay Mahadevan 
11209566063dSJacob Faibussowitsch     PetscCall(ISCreateGeneral(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, &lgmap[0], PETSC_COPY_VALUES, &to));
11219566063dSJacob Faibussowitsch     PetscCall(ISSetBlockSize(to, bs));
1122f6829af0SVijay Mahadevan 
1123f6829af0SVijay Mahadevan     if (!dmmoab->ltog_map) {
1124f6829af0SVijay Mahadevan       /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */
11259566063dSJacob Faibussowitsch       PetscCall(ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm, dmmoab->bs, totsize * dmmoab->numFields, lgmap, PETSC_COPY_VALUES, &dmmoab->ltog_map));
1126f6829af0SVijay Mahadevan     }
1127f6829af0SVijay Mahadevan 
1128f6829af0SVijay Mahadevan     /* now create the scatter object from local to global vector */
11299566063dSJacob Faibussowitsch     PetscCall(VecScatterCreate(local, from, global, to, &dmmoab->ltog_sendrecv));
1130f6829af0SVijay Mahadevan 
1131f6829af0SVijay Mahadevan     /* clean up IS, Vec */
11329566063dSJacob Faibussowitsch     PetscCall(PetscFree(lgmap));
11339566063dSJacob Faibussowitsch     PetscCall(ISDestroy(&from));
11349566063dSJacob Faibussowitsch     PetscCall(ISDestroy(&to));
11359566063dSJacob Faibussowitsch     PetscCall(VecDestroy(&local));
11369566063dSJacob Faibussowitsch     PetscCall(VecDestroy(&global));
1137f6829af0SVijay Mahadevan   }
1138f6829af0SVijay Mahadevan 
113949d66b22SVijay Mahadevan   dmmoab->bndyvtx   = new moab::Range();
114049d66b22SVijay Mahadevan   dmmoab->bndyfaces = new moab::Range();
114149d66b22SVijay Mahadevan   dmmoab->bndyelems = new moab::Range();
1142f6829af0SVijay Mahadevan   /* skin the boundary and store nodes */
11439c368985SVijay Mahadevan   if (!dmmoab->hlevel) {
1144f6829af0SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
1145f6829af0SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
1146f6829af0SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
1147f6829af0SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
1148f6829af0SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
1149f6829af0SVijay Mahadevan 
1150f6829af0SVijay Mahadevan     /* get the entities on the skin - only the faces */
11519371c9d4SSatish Balay     merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, *dmmoab->bndyfaces, NULL, true, true, false);
11529371c9d4SSatish Balay     MBERRNM(merr); // 'false' param indicates we want faces back, not vertices
1153f6829af0SVijay Mahadevan 
11549daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1155f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
11569371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT);
11579371c9d4SSatish Balay     MBERRNM(merr);
11589371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_INTERFACE, PSTATUS_NOT);
11599371c9d4SSatish Balay     MBERRNM(merr);
11609daf19fdSVijay Mahadevan #endif
1161f6829af0SVijay Mahadevan 
1162f6829af0SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
11639371c9d4SSatish Balay     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);
11649371c9d4SSatish Balay     MBERRNM(merr);
11659371c9d4SSatish Balay     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyvtx, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);
11669371c9d4SSatish Balay     MBERRNM(merr);
11679371c9d4SSatish Balay   } else {
11689c368985SVijay Mahadevan     /* Let us query the hierarchy manager and get the results directly for this level */
11699c368985SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->elocal->begin(); iter != dmmoab->elocal->end(); iter++) {
11709c368985SVijay Mahadevan       moab::EntityHandle elemHandle = *iter;
11719c368985SVijay Mahadevan       if (dmmoab->hierarchy->is_entity_on_boundary(elemHandle)) {
11729c368985SVijay Mahadevan         dmmoab->bndyelems->insert(elemHandle);
11739c368985SVijay Mahadevan         /* For this boundary element, query the vertices and add them to the list */
11749c368985SVijay Mahadevan         std::vector<moab::EntityHandle> connect;
11759371c9d4SSatish Balay         merr = dmmoab->hierarchy->get_connectivity(elemHandle, dmmoab->hlevel, connect);
11769371c9d4SSatish Balay         MBERRNM(merr);
11779c368985SVijay Mahadevan         for (unsigned iv = 0; iv < connect.size(); ++iv)
11789371c9d4SSatish Balay           if (dmmoab->hierarchy->is_entity_on_boundary(connect[iv])) dmmoab->bndyvtx->insert(connect[iv]);
11799c368985SVijay Mahadevan         /* Next, let us query the boundary faces and add them also to the list */
11809c368985SVijay Mahadevan         std::vector<moab::EntityHandle> faces;
11819371c9d4SSatish Balay         merr = dmmoab->hierarchy->get_adjacencies(elemHandle, dmmoab->dim - 1, faces);
11829371c9d4SSatish Balay         MBERRNM(merr);
11839c368985SVijay Mahadevan         for (unsigned ifa = 0; ifa < faces.size(); ++ifa)
11849371c9d4SSatish Balay           if (dmmoab->hierarchy->is_entity_on_boundary(faces[ifa])) dmmoab->bndyfaces->insert(faces[ifa]);
11859c368985SVijay Mahadevan       }
11869c368985SVijay Mahadevan     }
11879c368985SVijay Mahadevan #ifdef MOAB_HAVE_MPI
11889c368985SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
11899371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyvtx, PSTATUS_NOT_OWNED, PSTATUS_NOT);
11909371c9d4SSatish Balay     MBERRNM(merr);
11919371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT);
11929371c9d4SSatish Balay     MBERRNM(merr);
11939371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyelems, PSTATUS_NOT_OWNED, PSTATUS_NOT);
11949371c9d4SSatish Balay     MBERRNM(merr);
11959c368985SVijay Mahadevan #endif
11969c368985SVijay Mahadevan   }
11973ba16761SJacob Faibussowitsch   PetscCall(PetscInfo(NULL, "Found %zu boundary vertices, %zu boundary faces and %zu boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyfaces->size(), dmmoab->bndyelems->size()));
1198a044f6b6SVijay Mahadevan 
1199a044f6b6SVijay Mahadevan   /* Get the material sets and populate the data for all locally owned elements */
1200a044f6b6SVijay Mahadevan   {
12019566063dSJacob Faibussowitsch     PetscCall(PetscCalloc1(dmmoab->elocal->size(), &dmmoab->materials));
1202a044f6b6SVijay Mahadevan     /* Get the count of entities of particular type from dmmoab->elocal
1203a044f6b6SVijay Mahadevan        -- Then, for each non-zero type, loop through and query the fileset to get the material tag data */
1204a044f6b6SVijay Mahadevan     moab::Range msets;
12059371c9d4SSatish Balay     merr = dmmoab->mbiface->get_entities_by_type_and_tag(dmmoab->fileset, moab::MBENTITYSET, &dmmoab->material_tag, NULL, 1, msets, moab::Interface::UNION);
12063ba16761SJacob Faibussowitsch     MBERRNM(merr);
12073ba16761SJacob Faibussowitsch     if (msets.size() == 0) PetscCall(PetscInfo(NULL, "No material sets found in the fileset."));
1208a044f6b6SVijay Mahadevan 
1209a044f6b6SVijay Mahadevan     for (unsigned i = 0; i < msets.size(); ++i) {
1210a044f6b6SVijay Mahadevan       moab::Range msetelems;
12119371c9d4SSatish Balay       merr = dmmoab->mbiface->get_entities_by_dimension(msets[i], dmmoab->dim, msetelems, true);
12123ba16761SJacob Faibussowitsch       MBERRNM(merr);
1213aedf4482SVijay Mahadevan #ifdef MOAB_HAVE_MPI
1214aedf4482SVijay Mahadevan       /* filter all the non-owned and shared entities out of the list */
12159371c9d4SSatish Balay       merr = dmmoab->pcomm->filter_pstatus(msetelems, PSTATUS_NOT_OWNED, PSTATUS_NOT);
12169371c9d4SSatish Balay       MBERRNM(merr);
1217aedf4482SVijay Mahadevan #endif
1218a044f6b6SVijay Mahadevan 
1219a044f6b6SVijay Mahadevan       int                partID;
1220a044f6b6SVijay Mahadevan       moab::EntityHandle mset = msets[i];
12219371c9d4SSatish Balay       merr                    = dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &mset, 1, &partID);
12223ba16761SJacob Faibussowitsch       MBERRNM(merr);
1223a044f6b6SVijay Mahadevan 
12249371c9d4SSatish Balay       for (unsigned j = 0; j < msetelems.size(); ++j) dmmoab->materials[dmmoab->elocal->index(msetelems[j])] = partID;
1225a044f6b6SVijay Mahadevan     }
1226a044f6b6SVijay Mahadevan   }
1227a044f6b6SVijay Mahadevan 
12283ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1229f6829af0SVijay Mahadevan }
1230f6829af0SVijay Mahadevan 
1231cab5ea25SPierre Jolivet /*@C
1232304006b3SVijay Mahadevan   DMMoabCreateVertices - Creates and adds several vertices to the primary set represented by the DM.
1233304006b3SVijay Mahadevan 
1234d083f849SBarry Smith   Collective
1235304006b3SVijay Mahadevan 
1236304006b3SVijay Mahadevan   Input Parameters:
1237304006b3SVijay Mahadevan + dm     - The DM object
1238304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra)
1239*60225df5SJacob Faibussowitsch . coords - The connectivity of the element
1240a2b725a8SWilliam Gropp - nverts - The number of vertices that form the element
1241304006b3SVijay Mahadevan 
1242304006b3SVijay Mahadevan   Output Parameter:
1243304006b3SVijay Mahadevan . overts - The list of vertices that were created (can be NULL)
1244304006b3SVijay Mahadevan 
1245304006b3SVijay Mahadevan   Level: beginner
1246304006b3SVijay Mahadevan 
1247db781477SPatrick Sanan .seealso: `DMMoabCreateSubmesh()`, `DMMoabCreateElement()`
1248304006b3SVijay Mahadevan @*/
1249d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreateVertices(DM dm, const PetscReal *coords, PetscInt nverts, moab::Range *overts)
1250d71ae5a4SJacob Faibussowitsch {
1251304006b3SVijay Mahadevan   moab::ErrorCode merr;
1252304006b3SVijay Mahadevan   DM_Moab        *dmmoab;
1253304006b3SVijay Mahadevan   moab::Range     verts;
1254304006b3SVijay Mahadevan 
1255304006b3SVijay Mahadevan   PetscFunctionBegin;
1256304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1257304006b3SVijay Mahadevan   PetscValidPointer(coords, 2);
1258304006b3SVijay Mahadevan 
1259304006b3SVijay Mahadevan   dmmoab = (DM_Moab *)dm->data;
1260304006b3SVijay Mahadevan 
1261304006b3SVijay Mahadevan   /* Insert new points */
12629371c9d4SSatish Balay   merr = dmmoab->mbiface->create_vertices(&coords[0], nverts, verts);
12639371c9d4SSatish Balay   MBERRNM(merr);
12649371c9d4SSatish Balay   merr = dmmoab->mbiface->add_entities(dmmoab->fileset, verts);
12659371c9d4SSatish Balay   MBERRNM(merr);
1266304006b3SVijay Mahadevan 
1267304006b3SVijay Mahadevan   if (overts) *overts = verts;
12683ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1269304006b3SVijay Mahadevan }
1270304006b3SVijay Mahadevan 
1271cab5ea25SPierre Jolivet /*@C
1272304006b3SVijay Mahadevan   DMMoabCreateElement - Adds an element of specified type to the primary set represented by the DM.
1273304006b3SVijay Mahadevan 
1274d083f849SBarry Smith   Collective
1275304006b3SVijay Mahadevan 
1276304006b3SVijay Mahadevan   Input Parameters:
1277304006b3SVijay Mahadevan + dm     - The DM object
1278304006b3SVijay Mahadevan . type   - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra)
1279304006b3SVijay Mahadevan . conn   - The connectivity of the element
1280a2b725a8SWilliam Gropp - nverts - The number of vertices that form the element
1281304006b3SVijay Mahadevan 
1282304006b3SVijay Mahadevan   Output Parameter:
1283304006b3SVijay Mahadevan . oelem - The handle to the element created and added to the DM object
1284304006b3SVijay Mahadevan 
1285304006b3SVijay Mahadevan   Level: beginner
1286304006b3SVijay Mahadevan 
1287db781477SPatrick Sanan .seealso: `DMMoabCreateSubmesh()`, `DMMoabCreateVertices()`
1288304006b3SVijay Mahadevan @*/
1289d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreateElement(DM dm, const moab::EntityType type, const moab::EntityHandle *conn, PetscInt nverts, moab::EntityHandle *oelem)
1290d71ae5a4SJacob Faibussowitsch {
1291304006b3SVijay Mahadevan   moab::ErrorCode    merr;
1292304006b3SVijay Mahadevan   DM_Moab           *dmmoab;
1293304006b3SVijay Mahadevan   moab::EntityHandle elem;
1294304006b3SVijay Mahadevan 
1295304006b3SVijay Mahadevan   PetscFunctionBegin;
1296304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1297304006b3SVijay Mahadevan   PetscValidPointer(conn, 3);
1298304006b3SVijay Mahadevan 
1299304006b3SVijay Mahadevan   dmmoab = (DM_Moab *)dm->data;
1300304006b3SVijay Mahadevan 
1301304006b3SVijay Mahadevan   /* Insert new element */
13029371c9d4SSatish Balay   merr = dmmoab->mbiface->create_element(type, conn, nverts, elem);
13039371c9d4SSatish Balay   MBERRNM(merr);
13049371c9d4SSatish Balay   merr = dmmoab->mbiface->add_entities(dmmoab->fileset, &elem, 1);
13059371c9d4SSatish Balay   MBERRNM(merr);
1306304006b3SVijay Mahadevan 
1307304006b3SVijay Mahadevan   if (oelem) *oelem = elem;
13083ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1309304006b3SVijay Mahadevan }
1310304006b3SVijay Mahadevan 
1311cab5ea25SPierre Jolivet /*@C
1312304006b3SVijay Mahadevan   DMMoabCreateSubmesh - Creates a sub-DM object with a set that contains all vertices/elements of the parent
1313304006b3SVijay Mahadevan   in addition to providing support for dynamic mesh modifications. This is useful for AMR calculations to
1314304006b3SVijay Mahadevan   create a DM object on a refined level.
1315304006b3SVijay Mahadevan 
1316d083f849SBarry Smith   Collective
1317304006b3SVijay Mahadevan 
1318304006b3SVijay Mahadevan   Input Parameters:
1319a2b725a8SWilliam Gropp . dm - The DM object
1320304006b3SVijay Mahadevan 
1321304006b3SVijay Mahadevan   Output Parameter:
1322304006b3SVijay Mahadevan . newdm - The sub DM object with updated set information
1323304006b3SVijay Mahadevan 
1324304006b3SVijay Mahadevan   Level: advanced
1325304006b3SVijay Mahadevan 
1326db781477SPatrick Sanan .seealso: `DMCreate()`, `DMMoabCreateVertices()`, `DMMoabCreateElement()`
1327304006b3SVijay Mahadevan @*/
1328d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreateSubmesh(DM dm, DM *newdm)
1329d71ae5a4SJacob Faibussowitsch {
1330304006b3SVijay Mahadevan   DM_Moab        *dmmoab;
1331304006b3SVijay Mahadevan   DM_Moab        *ndmmoab;
1332304006b3SVijay Mahadevan   moab::ErrorCode merr;
1333304006b3SVijay Mahadevan 
1334304006b3SVijay Mahadevan   PetscFunctionBegin;
1335304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1336304006b3SVijay Mahadevan 
1337304006b3SVijay Mahadevan   dmmoab = (DM_Moab *)dm->data;
1338304006b3SVijay Mahadevan 
1339304006b3SVijay Mahadevan   /* Create the basic DMMoab object and keep the default parameters created by DM impls */
1340f3fa974cSJacob Faibussowitsch   PetscCall(DMMoabCreateMoab(((PetscObject)dm)->comm, dmmoab->mbiface, &dmmoab->ltog_tag, NULL, newdm));
1341304006b3SVijay Mahadevan 
1342304006b3SVijay Mahadevan   /* get all the necessary handles from the private DM object */
1343304006b3SVijay Mahadevan   ndmmoab = (DM_Moab *)(*newdm)->data;
1344304006b3SVijay Mahadevan 
1345304006b3SVijay Mahadevan   /* set the sub-mesh's parent DM reference */
1346304006b3SVijay Mahadevan   ndmmoab->parent = &dm;
1347304006b3SVijay Mahadevan 
1348304006b3SVijay Mahadevan   /* create a file set to associate all entities in current mesh */
13499371c9d4SSatish Balay   merr = ndmmoab->mbiface->create_meshset(moab::MESHSET_SET, ndmmoab->fileset);
13509371c9d4SSatish Balay   MBERR("Creating file set failed", merr);
1351304006b3SVijay Mahadevan 
1352304006b3SVijay Mahadevan   /* create a meshset and then add old fileset as child */
13539371c9d4SSatish Balay   merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->vlocal);
13549371c9d4SSatish Balay   MBERR("Adding child vertices to parent failed", merr);
13559371c9d4SSatish Balay   merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->elocal);
13569371c9d4SSatish Balay   MBERR("Adding child elements to parent failed", merr);
1357304006b3SVijay Mahadevan 
1358304006b3SVijay Mahadevan   /* preserve the field association between the parent and sub-mesh objects */
13599566063dSJacob Faibussowitsch   PetscCall(DMMoabSetFieldNames(*newdm, dmmoab->numFields, dmmoab->fieldNames));
13603ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1361304006b3SVijay Mahadevan }
1362304006b3SVijay Mahadevan 
1363d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMMoabView_Ascii(DM dm, PetscViewer viewer)
1364d71ae5a4SJacob Faibussowitsch {
1365304006b3SVijay Mahadevan   DM_Moab    *dmmoab = (DM_Moab *)(dm)->data;
1366304006b3SVijay Mahadevan   const char *name;
1367304006b3SVijay Mahadevan   MPI_Comm    comm;
1368304006b3SVijay Mahadevan   PetscMPIInt size;
1369304006b3SVijay Mahadevan 
1370304006b3SVijay Mahadevan   PetscFunctionBegin;
13719566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)dm, &comm));
13729566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm, &size));
13739566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetName((PetscObject)dm, &name));
13749566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushTab(viewer));
137563a3b9bcSJacob Faibussowitsch   if (name) PetscCall(PetscViewerASCIIPrintf(viewer, "%s in %" PetscInt_FMT " dimensions:\n", name, dmmoab->dim));
137663a3b9bcSJacob Faibussowitsch   else PetscCall(PetscViewerASCIIPrintf(viewer, "Mesh in %" PetscInt_FMT " dimensions:\n", dmmoab->dim));
1377304006b3SVijay Mahadevan   /* print details about the global mesh */
1378304006b3SVijay Mahadevan   {
13799566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushTab(viewer));
138063a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Sizes: cells=%" PetscInt_FMT ", vertices=%" PetscInt_FMT ", blocks=%" PetscInt_FMT "\n", dmmoab->nele, dmmoab->n, dmmoab->bs));
1381304006b3SVijay Mahadevan     /* print boundary data */
138263a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Boundary trace:\n"));
1383304006b3SVijay Mahadevan     {
13849566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(viewer));
138563a3b9bcSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(viewer, "cells=%zu, faces=%zu, vertices=%zu\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size()));
13869566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(viewer));
1387304006b3SVijay Mahadevan     }
1388304006b3SVijay Mahadevan     /* print field data */
138963a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Fields: %" PetscInt_FMT " components\n", dmmoab->numFields));
1390304006b3SVijay Mahadevan     {
13919566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(viewer));
139248a46eb9SPierre Jolivet       for (int i = 0; i < dmmoab->numFields; ++i) PetscCall(PetscViewerASCIIPrintf(viewer, "[%" PetscInt_FMT "] - %s\n", i, dmmoab->fieldNames[i]));
13939566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(viewer));
1394304006b3SVijay Mahadevan     }
13959566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopTab(viewer));
1396304006b3SVijay Mahadevan   }
13979566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopTab(viewer));
13989566063dSJacob Faibussowitsch   PetscCall(PetscViewerFlush(viewer));
13993ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1400304006b3SVijay Mahadevan }
1401304006b3SVijay Mahadevan 
1402d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMMoabView_VTK(DM dm, PetscViewer v)
1403d71ae5a4SJacob Faibussowitsch {
14043ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1405304006b3SVijay Mahadevan }
1406304006b3SVijay Mahadevan 
1407d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMMoabView_HDF5(DM dm, PetscViewer v)
1408d71ae5a4SJacob Faibussowitsch {
14093ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1410304006b3SVijay Mahadevan }
1411304006b3SVijay Mahadevan 
1412d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMView_Moab(DM dm, PetscViewer viewer)
1413d71ae5a4SJacob Faibussowitsch {
1414304006b3SVijay Mahadevan   PetscBool iascii, ishdf5, isvtk;
1415304006b3SVijay Mahadevan 
1416304006b3SVijay Mahadevan   PetscFunctionBegin;
1417304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1418304006b3SVijay Mahadevan   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
14199566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
14209566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERVTK, &isvtk));
14219566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERHDF5, &ishdf5));
1422304006b3SVijay Mahadevan   if (iascii) {
14239566063dSJacob Faibussowitsch     PetscCall(DMMoabView_Ascii(dm, viewer));
1424304006b3SVijay Mahadevan   } else if (ishdf5) {
1425304006b3SVijay Mahadevan #if defined(PETSC_HAVE_HDF5) && defined(MOAB_HAVE_HDF5)
14269566063dSJacob Faibussowitsch     PetscCall(PetscViewerPushFormat(viewer, PETSC_VIEWER_HDF5_VIZ));
14279566063dSJacob Faibussowitsch     PetscCall(DMMoabView_HDF5(dm, viewer));
14289566063dSJacob Faibussowitsch     PetscCall(PetscViewerPopFormat(viewer));
1429304006b3SVijay Mahadevan #else
1430304006b3SVijay Mahadevan     SETERRQ(PetscObjectComm((PetscObject)dm), PETSC_ERR_SUP, "HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5");
1431304006b3SVijay Mahadevan #endif
14329371c9d4SSatish Balay   } else if (isvtk) {
14339566063dSJacob Faibussowitsch     PetscCall(DMMoabView_VTK(dm, viewer));
1434304006b3SVijay Mahadevan   }
14353ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1436304006b3SVijay Mahadevan }
1437304006b3SVijay Mahadevan 
1438d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMInitialize_Moab(DM dm)
1439d71ae5a4SJacob Faibussowitsch {
1440304006b3SVijay Mahadevan   PetscFunctionBegin;
1441304006b3SVijay Mahadevan   dm->ops->view                     = DMView_Moab;
1442304006b3SVijay Mahadevan   dm->ops->load                     = NULL /* DMLoad_Moab */;
1443304006b3SVijay Mahadevan   dm->ops->setfromoptions           = DMSetFromOptions_Moab;
1444304006b3SVijay Mahadevan   dm->ops->clone                    = DMClone_Moab;
1445304006b3SVijay Mahadevan   dm->ops->setup                    = DMSetUp_Moab;
14461bb6d2a8SBarry Smith   dm->ops->createlocalsection       = NULL;
1447304006b3SVijay Mahadevan   dm->ops->createdefaultconstraints = NULL;
1448304006b3SVijay Mahadevan   dm->ops->createglobalvector       = DMCreateGlobalVector_Moab;
1449304006b3SVijay Mahadevan   dm->ops->createlocalvector        = DMCreateLocalVector_Moab;
1450304006b3SVijay Mahadevan   dm->ops->getlocaltoglobalmapping  = NULL;
1451304006b3SVijay Mahadevan   dm->ops->createfieldis            = NULL;
1452304006b3SVijay Mahadevan   dm->ops->createcoordinatedm       = NULL /* DMCreateCoordinateDM_Moab */;
1453304006b3SVijay Mahadevan   dm->ops->getcoloring              = NULL;
1454304006b3SVijay Mahadevan   dm->ops->creatematrix             = DMCreateMatrix_Moab;
1455304006b3SVijay Mahadevan   dm->ops->createinterpolation      = DMCreateInterpolation_Moab;
14565a84ad33SLisandro Dalcin   dm->ops->createinjection          = NULL /* DMCreateInjection_Moab */;
1457304006b3SVijay Mahadevan   dm->ops->refine                   = DMRefine_Moab;
1458304006b3SVijay Mahadevan   dm->ops->coarsen                  = DMCoarsen_Moab;
1459304006b3SVijay Mahadevan   dm->ops->refinehierarchy          = DMRefineHierarchy_Moab;
1460304006b3SVijay Mahadevan   dm->ops->coarsenhierarchy         = DMCoarsenHierarchy_Moab;
1461304006b3SVijay Mahadevan   dm->ops->globaltolocalbegin       = DMGlobalToLocalBegin_Moab;
1462304006b3SVijay Mahadevan   dm->ops->globaltolocalend         = DMGlobalToLocalEnd_Moab;
1463304006b3SVijay Mahadevan   dm->ops->localtoglobalbegin       = DMLocalToGlobalBegin_Moab;
1464304006b3SVijay Mahadevan   dm->ops->localtoglobalend         = DMLocalToGlobalEnd_Moab;
1465304006b3SVijay Mahadevan   dm->ops->destroy                  = DMDestroy_Moab;
1466304006b3SVijay Mahadevan   dm->ops->createsubdm              = NULL /* DMCreateSubDM_Moab */;
1467304006b3SVijay Mahadevan   dm->ops->getdimpoints             = NULL /* DMGetDimPoints_Moab */;
1468304006b3SVijay Mahadevan   dm->ops->locatepoints             = NULL /* DMLocatePoints_Moab */;
14693ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1470304006b3SVijay Mahadevan }
1471304006b3SVijay Mahadevan 
1472d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm)
1473d71ae5a4SJacob Faibussowitsch {
1474304006b3SVijay Mahadevan   PetscFunctionBegin;
1475304006b3SVijay Mahadevan   /* get all the necessary handles from the private DM object */
1476304006b3SVijay Mahadevan   (*newdm)->data = (DM_Moab *)dm->data;
1477304006b3SVijay Mahadevan   ((DM_Moab *)dm->data)->refct++;
1478304006b3SVijay Mahadevan 
14799566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)*newdm, DMMOAB));
14809566063dSJacob Faibussowitsch   PetscCall(DMInitialize_Moab(*newdm));
14813ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1482304006b3SVijay Mahadevan }
1483304006b3SVijay Mahadevan 
1484d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
1485d71ae5a4SJacob Faibussowitsch {
1486f6829af0SVijay Mahadevan   PetscFunctionBegin;
1487f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
14884dfa11a4SJacob Faibussowitsch   PetscCall(PetscNew((DM_Moab **)&dm->data));
1489f6829af0SVijay Mahadevan 
1490f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->bs            = 1;
1491f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->numFields     = 1;
1492f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->n             = 0;
1493f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->nloc          = 0;
1494f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->nghost        = 0;
1495f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->nele          = 0;
1496f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->neleloc       = 0;
1497f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->neleghost     = 0;
1498c528d872SBarry Smith   ((DM_Moab *)dm->data)->ltog_map      = NULL;
1499c528d872SBarry Smith   ((DM_Moab *)dm->data)->ltog_sendrecv = NULL;
1500f6829af0SVijay Mahadevan 
1501304006b3SVijay Mahadevan   ((DM_Moab *)dm->data)->refct  = 1;
1502304006b3SVijay Mahadevan   ((DM_Moab *)dm->data)->parent = NULL;
1503f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->vlocal = new moab::Range();
1504f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->vowned = new moab::Range();
1505f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->vghost = new moab::Range();
1506f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->elocal = new moab::Range();
1507f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->eghost = new moab::Range();
1508f6829af0SVijay Mahadevan 
15099566063dSJacob Faibussowitsch   PetscCall(DMInitialize_Moab(dm));
15103ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1511f6829af0SVijay Mahadevan }
1512