xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 589a23caa660d2a5f330cc8d1ed213e9cfaf51a7)
1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I  "petscdmmoab.h"   I*/
21d72bce8STim Tautges 
31d72bce8STim Tautges #include <petscdmmoab.h>
488face26SJed Brown #include <MBTagConventions.hpp>
59daf19fdSVijay Mahadevan #include <moab/NestedRefine.hpp>
61cec0304SVijay Mahadevan #include <moab/Skinner.hpp>
7032b8ab6SVijay Mahadevan 
8c6ef30f9SVijay Mahadevan /*MC
9c6ef30f9SVijay Mahadevan   DMMOAB = "moab" - A DM object that encapsulates an unstructured mesh described by the MOAB mesh database.
10c6ef30f9SVijay Mahadevan                     Direct access to the MOAB Interface and other mesh manipulation related objects are available
11c6ef30f9SVijay Mahadevan                     through public API. Ability to create global and local representation of Vecs containing all
12c6ef30f9SVijay Mahadevan                     unknowns in the interior and shared boundary via a transparent tag-data wrapper is provided
13c6ef30f9SVijay Mahadevan                     along with utility functions to traverse the mesh and assemble a discrete system via
14c6ef30f9SVijay Mahadevan                     field-based/blocked Vec(Get/Set) methods. Input from and output to different formats are
15c6ef30f9SVijay Mahadevan                     available.
16c6ef30f9SVijay Mahadevan 
17a8d69d7bSBarry Smith   Reference: https://www.mcs.anl.gov/~fathom/moab-docs/html/contents.html
18c6ef30f9SVijay Mahadevan 
19c6ef30f9SVijay Mahadevan   Level: intermediate
20c6ef30f9SVijay Mahadevan 
21c6ef30f9SVijay Mahadevan .seealso: DMType, DMMoabCreate(), DMCreate(), DMSetType(), DMMoabCreateMoab()
22c6ef30f9SVijay Mahadevan M*/
23c6ef30f9SVijay Mahadevan 
24304006b3SVijay Mahadevan /* External function declarations here */
25304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInterpolation_Moab(DM dmCoarse, DM dmFine, Mat *interpolation, Vec *scaling);
26304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateDefaultConstraints_Moab(DM dm);
27304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm,  Mat *J);
28304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateCoordinateDM_Moab(DM dm, DM *cdm);
29304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefine_Moab(DM dm, MPI_Comm comm, DM *dmRefined);
30304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsen_Moab(DM dm, MPI_Comm comm, DM *dmCoarsened);
31304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefineHierarchy_Moab(DM dm, PetscInt nlevels, DM dmRefined[]);
32304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsenHierarchy_Moab(DM dm, PetscInt nlevels, DM dmCoarsened[]);
33304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm);
34304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateGlobalVector_Moab(DM, Vec *);
35304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateLocalVector_Moab(DM, Vec *);
36304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm, Mat *J);
37304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalBegin_Moab(DM, Vec, InsertMode, Vec);
38304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalEnd_Moab(DM, Vec, InsertMode, Vec);
39304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalBegin_Moab(DM, Vec, InsertMode, Vec);
40304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalEnd_Moab(DM, Vec, InsertMode, Vec);
41304006b3SVijay Mahadevan 
42304006b3SVijay Mahadevan 
43304006b3SVijay Mahadevan /* Un-implemented routines */
44304006b3SVijay Mahadevan /*
451bb6d2a8SBarry Smith PETSC_EXTERN PetscErrorCode DMCreatelocalsection_Moab(DM dm);
46304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInjection_Moab(DM dmCoarse, DM dmFine, Mat *mat);
47304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLoad_Moab(DM dm, PetscViewer viewer);
48304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGetDimPoints_Moab(DM dm, PetscInt dim, PetscInt *pStart, PetscInt *pEnd);
49304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateSubDM_Moab(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm);
50304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocatePoints_Moab(DM dm, Vec v, IS *cellIS);
51304006b3SVijay Mahadevan */
52c6ef30f9SVijay Mahadevan 
53cab5ea25SPierre Jolivet /*@C
541d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
551d72bce8STim Tautges 
56d083f849SBarry Smith   Collective
571d72bce8STim Tautges 
581d72bce8STim Tautges   Input Parameter:
591d72bce8STim Tautges . comm - The communicator for the DMMoab object
601d72bce8STim Tautges 
611d72bce8STim Tautges   Output Parameter:
62032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
631d72bce8STim Tautges 
641d72bce8STim Tautges   Level: beginner
651d72bce8STim Tautges 
661d72bce8STim Tautges @*/
67032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
681d72bce8STim Tautges {
691d72bce8STim Tautges   PetscErrorCode ierr;
701d72bce8STim Tautges 
711d72bce8STim Tautges   PetscFunctionBegin;
72032b8ab6SVijay Mahadevan   PetscValidPointer(dmb, 2);
73032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
74032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
751d72bce8STim Tautges   PetscFunctionReturn(0);
761d72bce8STim Tautges }
771d72bce8STim Tautges 
78cab5ea25SPierre Jolivet /*@C
79b117cd09SVijay Mahadevan   DMMoabCreateMoab - Creates a DMMoab object, optionally from an instance and other data
801d72bce8STim Tautges 
81d083f849SBarry Smith   Collective
821d72bce8STim Tautges 
831d72bce8STim Tautges   Input Parameter:
84a2b725a8SWilliam Gropp + comm - The communicator for the DMMoab object
85032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
86a4d2169cSTim Tautges          along with the DMMoab
87a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
881d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
89a2b725a8SWilliam Gropp - range - If non-NULL, contains range of entities to which DOFs will be assigned
901d72bce8STim Tautges 
911d72bce8STim Tautges   Output Parameter:
92032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
931d72bce8STim Tautges 
94032b8ab6SVijay Mahadevan   Level: intermediate
951d72bce8STim Tautges 
961d72bce8STim Tautges @*/
979daf19fdSVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
981d72bce8STim Tautges {
991d72bce8STim Tautges   PetscErrorCode ierr;
100032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
10185d305f5SVijay Mahadevan   DM             dmmb;
102853cdec3SJed Brown   DM_Moab        *dmmoab;
1031d72bce8STim Tautges 
1041d72bce8STim Tautges   PetscFunctionBegin;
105032b8ab6SVijay Mahadevan   PetscValidPointer(dmb, 6);
10685d305f5SVijay Mahadevan 
10785d305f5SVijay Mahadevan   ierr = DMMoabCreate(comm, &dmmb);CHKERRQ(ierr);
10885d305f5SVijay Mahadevan   dmmoab = (DM_Moab*)(dmmb)->data;
109a4d2169cSTim Tautges 
110a4d2169cSTim Tautges   if (!mbiface) {
11172ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
1127d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
1131d72bce8STim Tautges   }
1141cec0304SVijay Mahadevan   else {
1151cec0304SVijay Mahadevan     dmmoab->mbiface = mbiface;
1167d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
1171cec0304SVijay Mahadevan   }
1181cec0304SVijay Mahadevan 
119b5410836SVijay Mahadevan   /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */
120b5410836SVijay Mahadevan   dmmoab->fileset = 0;
121b117cd09SVijay Mahadevan   dmmoab->hlevel = 0;
12249d66b22SVijay Mahadevan   dmmoab->nghostrings = 0;
1237d89fc02STim Tautges 
1249daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1259daf19fdSVijay Mahadevan   moab::EntityHandle partnset;
126032b8ab6SVijay Mahadevan 
127db66d124SVijay Mahadevan   /* Create root sets for each mesh.  Then pass these
128db66d124SVijay Mahadevan       to the load_file functions to be populated. */
1290c8a2322SVijay Mahadevan   merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset); MBERR("Creating partition set failed", merr);
130032b8ab6SVijay Mahadevan 
131db66d124SVijay Mahadevan   /* Create the parallel communicator object with the partition handle associated with MOAB */
13272ff976dSVijay Mahadevan   dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
1339daf19fdSVijay Mahadevan #endif
134032b8ab6SVijay Mahadevan 
1354973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
1364973de03SVijay Mahadevan   dmmoab->bs = 1;
137addae81cSVijay Mahadevan   dmmoab->numFields = 1;
1383f1c6e43SVijay Mahadevan   ierr = PetscMalloc(dmmoab->numFields * sizeof(char*), &dmmoab->fieldNames);CHKERRQ(ierr);
1393f1c6e43SVijay Mahadevan   ierr = PetscStrallocpy("DEFAULT", (char**) &dmmoab->fieldNames[0]);CHKERRQ(ierr);
1402e4e7c01SVijay Mahadevan   dmmoab->rw_dbglevel = 0;
1412e4e7c01SVijay Mahadevan   dmmoab->partition_by_rank = PETSC_FALSE;
1422e4e7c01SVijay Mahadevan   dmmoab->extra_read_options[0] = '\0';
1432e4e7c01SVijay Mahadevan   dmmoab->extra_write_options[0] = '\0';
1442e4e7c01SVijay Mahadevan   dmmoab->read_mode = READ_PART;
1452e4e7c01SVijay Mahadevan   dmmoab->write_mode = WRITE_PART;
1464973de03SVijay Mahadevan 
1474973de03SVijay Mahadevan   /* set global ID tag handle */
1481a845d2aSVijay Mahadevan   if (ltog_tag && *ltog_tag) {
14985d305f5SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag);CHKERRQ(ierr);
150032b8ab6SVijay Mahadevan   }
151032b8ab6SVijay Mahadevan   else {
1521a845d2aSVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag); MBERRNM(merr);
1531a845d2aSVijay Mahadevan     if (ltog_tag) *ltog_tag = dmmoab->ltog_tag;
154a4d2169cSTim Tautges   }
155a4d2169cSTim Tautges 
156340f3b9aSVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag); MBERRNM(merr);
157340f3b9aSVijay Mahadevan 
1584973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
159a4d2169cSTim Tautges   if (range) {
16085d305f5SVijay Mahadevan     ierr = DMMoabSetLocalVertices(dmmb, range);CHKERRQ(ierr);
161a4d2169cSTim Tautges   }
16285d305f5SVijay Mahadevan   *dmb = dmmb;
1631d72bce8STim Tautges   PetscFunctionReturn(0);
1641d72bce8STim Tautges }
1651d72bce8STim Tautges 
166304006b3SVijay Mahadevan 
1679daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1681d72bce8STim Tautges 
169cab5ea25SPierre Jolivet /*@C
170aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
171aa768e4cSTim Tautges 
172d083f849SBarry Smith   Collective
173aa768e4cSTim Tautges 
174aa768e4cSTim Tautges   Input Parameter:
175aa768e4cSTim Tautges . dm    - The DMMoab object being set
176aa768e4cSTim Tautges 
177aa768e4cSTim Tautges   Output Parameter:
178aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
179aa768e4cSTim Tautges 
180aa768e4cSTim Tautges   Level: beginner
181aa768e4cSTim Tautges 
182aa768e4cSTim Tautges @*/
1831d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm, moab::ParallelComm **pcomm)
1841d72bce8STim Tautges {
1851d72bce8STim Tautges   PetscFunctionBegin;
1861d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
187032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
1881d72bce8STim Tautges   PetscFunctionReturn(0);
1891d72bce8STim Tautges }
1901d72bce8STim Tautges 
1919daf19fdSVijay Mahadevan #endif /* MOAB_HAVE_MPI */
1929daf19fdSVijay Mahadevan 
1931d72bce8STim Tautges 
194cab5ea25SPierre Jolivet /*@C
195aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
196aa768e4cSTim Tautges 
197d083f849SBarry Smith   Collective
198aa768e4cSTim Tautges 
199aa768e4cSTim Tautges   Input Parameter:
200a2b725a8SWilliam Gropp + dm      - The DMMoab object being set
201a2b725a8SWilliam Gropp - mbiface - The MOAB instance being set on this DMMoab
202aa768e4cSTim Tautges 
203aa768e4cSTim Tautges   Level: beginner
204aa768e4cSTim Tautges 
205aa768e4cSTim Tautges @*/
206a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm, moab::Interface *mbiface)
2071d72bce8STim Tautges {
208032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
209032b8ab6SVijay Mahadevan 
2101d72bce8STim Tautges   PetscFunctionBegin;
2111d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2121cec0304SVijay Mahadevan   PetscValidPointer(mbiface, 2);
2139daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
214032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
2159daf19fdSVijay Mahadevan #endif
216032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
217032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
2181d72bce8STim Tautges   PetscFunctionReturn(0);
2191d72bce8STim Tautges }
2201d72bce8STim Tautges 
2211d72bce8STim Tautges 
222cab5ea25SPierre Jolivet /*@C
223aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
224aa768e4cSTim Tautges 
225d083f849SBarry Smith   Collective
226aa768e4cSTim Tautges 
227aa768e4cSTim Tautges   Input Parameter:
228aa768e4cSTim Tautges . dm      - The DMMoab object being set
229aa768e4cSTim Tautges 
230aa768e4cSTim Tautges   Output Parameter:
231aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
232aa768e4cSTim Tautges 
233aa768e4cSTim Tautges   Level: beginner
234aa768e4cSTim Tautges 
235aa768e4cSTim Tautges @*/
236a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm, moab::Interface **mbiface)
2371d72bce8STim Tautges {
2389426e041SSatish Balay   PetscErrorCode   ierr;
239cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
240cabb514dSBarry Smith 
2411d72bce8STim Tautges   PetscFunctionBegin;
2421d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
243cabb514dSBarry Smith   ierr = PetscCitationsRegister("@techreport{tautges_moab:_2004,\n  type = {{SAND2004-1592}},\n  title = {{MOAB:} A Mesh-Oriented Database},  institution = {Sandia National Laboratories},\n  author = {Tautges, T. J. and Meyers, R. and Merkley, K. and Stimpson, C. and Ernst, C.},\n  year = {2004},  note = {Report}\n}\n", &cite);CHKERRQ(ierr);
244a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
2451d72bce8STim Tautges   PetscFunctionReturn(0);
2461d72bce8STim Tautges }
2471d72bce8STim Tautges 
2481d72bce8STim Tautges 
249cab5ea25SPierre Jolivet /*@C
2505eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
251aa768e4cSTim Tautges 
252d083f849SBarry Smith   Collective
253aa768e4cSTim Tautges 
254aa768e4cSTim Tautges   Input Parameter:
255a2b725a8SWilliam Gropp + dm    - The DMMoab object being set
256a2b725a8SWilliam Gropp - range - The entities treated by this DMMoab
257aa768e4cSTim Tautges 
258aa768e4cSTim Tautges   Level: beginner
259aa768e4cSTim Tautges 
260aa768e4cSTim Tautges @*/
2615eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm, moab::Range *range)
2621d72bce8STim Tautges {
263fd3326ddSVijay Mahadevan   moab::Range     tmpvtxs;
264032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
265032b8ab6SVijay Mahadevan 
2661d72bce8STim Tautges   PetscFunctionBegin;
2671d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
268032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
269032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
270fd3326ddSVijay Mahadevan 
271032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
272fd3326ddSVijay Mahadevan 
2739daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
2749daf19fdSVijay Mahadevan   moab::ErrorCode merr;
275fd3326ddSVijay Mahadevan   /* filter based on parallel status */
276fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned); MBERRNM(merr);
277fd3326ddSVijay Mahadevan 
278fd3326ddSVijay Mahadevan   /* filter all the non-owned and shared entities out of the list */
279fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
280fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(tmpvtxs, PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost); MBERRNM(merr);
281fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost);
282fd3326ddSVijay Mahadevan   *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs);
2839daf19fdSVijay Mahadevan #else
2849daf19fdSVijay Mahadevan   *dmmoab->vowned = *dmmoab->vlocal;
2859daf19fdSVijay Mahadevan #endif
286fd3326ddSVijay Mahadevan 
287fd3326ddSVijay Mahadevan   /* compute and cache the sizes of local and ghosted entities */
288032b8ab6SVijay Mahadevan   dmmoab->nloc = dmmoab->vowned->size();
289032b8ab6SVijay Mahadevan   dmmoab->nghost = dmmoab->vghost->size();
2909daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
2919daf19fdSVijay Mahadevan   PetscErrorCode  ierr;
292b2566f29SBarry Smith   ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
2939daf19fdSVijay Mahadevan #else
2949daf19fdSVijay Mahadevan   dmmoab->n = dmmoab->nloc;
2959daf19fdSVijay Mahadevan #endif
2961d72bce8STim Tautges   PetscFunctionReturn(0);
2971d72bce8STim Tautges }
2981d72bce8STim Tautges 
2991d72bce8STim Tautges 
300cab5ea25SPierre Jolivet /*@C
3018d8d51c8SVijay Mahadevan   DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab
3028d8d51c8SVijay Mahadevan 
303d083f849SBarry Smith   Collective
3048d8d51c8SVijay Mahadevan 
3058d8d51c8SVijay Mahadevan   Input Parameter:
3068d8d51c8SVijay Mahadevan . dm    - The DMMoab object being set
3078d8d51c8SVijay Mahadevan 
3088d8d51c8SVijay Mahadevan   Output Parameter:
3098d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted)
3108d8d51c8SVijay Mahadevan 
3118d8d51c8SVijay Mahadevan   Level: beginner
3128d8d51c8SVijay Mahadevan 
3138d8d51c8SVijay Mahadevan @*/
3148d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm, moab::Range *local)
3158d8d51c8SVijay Mahadevan {
3168d8d51c8SVijay Mahadevan   PetscFunctionBegin;
3178d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
3188d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab*)dm->data)->vlocal;
3198d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
3208d8d51c8SVijay Mahadevan }
3218d8d51c8SVijay Mahadevan 
3228d8d51c8SVijay Mahadevan 
3238d8d51c8SVijay Mahadevan 
324cab5ea25SPierre Jolivet /*@C
3255eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
326aa768e4cSTim Tautges 
327d083f849SBarry Smith   Collective
328aa768e4cSTim Tautges 
329aa768e4cSTim Tautges   Input Parameter:
330aa768e4cSTim Tautges . dm    - The DMMoab object being set
331aa768e4cSTim Tautges 
332a2b725a8SWilliam Gropp   Output Parameters:
333a2b725a8SWilliam Gropp + owned - The owned vertex entities in this DMMoab
334a2b725a8SWilliam Gropp - ghost - The ghosted entities (non-owned) stored locally in this partition
335aa768e4cSTim Tautges 
336aa768e4cSTim Tautges   Level: beginner
337aa768e4cSTim Tautges 
338aa768e4cSTim Tautges @*/
339351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm, const moab::Range **owned, const moab::Range **ghost)
3401d72bce8STim Tautges {
3411d72bce8STim Tautges   PetscFunctionBegin;
3421d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
343351b8a77SVijay Mahadevan   if (owned) *owned = ((DM_Moab*)dm->data)->vowned;
344351b8a77SVijay Mahadevan   if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost;
3451d72bce8STim Tautges   PetscFunctionReturn(0);
3461d72bce8STim Tautges }
3471d72bce8STim Tautges 
348cab5ea25SPierre Jolivet /*@C
3495eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
3505eb88e9dSVijay Mahadevan 
351d083f849SBarry Smith   Collective
3525eb88e9dSVijay Mahadevan 
3535eb88e9dSVijay Mahadevan   Input Parameter:
3545eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
3555eb88e9dSVijay Mahadevan 
3565eb88e9dSVijay Mahadevan   Output Parameter:
3575eb88e9dSVijay Mahadevan . range - The entities owned locally
3585eb88e9dSVijay Mahadevan 
3595eb88e9dSVijay Mahadevan   Level: beginner
3605eb88e9dSVijay Mahadevan 
3615eb88e9dSVijay Mahadevan @*/
362351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm, const moab::Range **range)
3635eb88e9dSVijay Mahadevan {
3645eb88e9dSVijay Mahadevan   PetscFunctionBegin;
3655eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
366351b8a77SVijay Mahadevan   if (range) *range = ((DM_Moab*)dm->data)->elocal;
3671cec0304SVijay Mahadevan   PetscFunctionReturn(0);
3681cec0304SVijay Mahadevan }
3691cec0304SVijay Mahadevan 
3701cec0304SVijay Mahadevan 
371cab5ea25SPierre Jolivet /*@C
3721cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
3731cec0304SVijay Mahadevan 
374d083f849SBarry Smith   Collective
3751cec0304SVijay Mahadevan 
376a2b725a8SWilliam Gropp   Input Parameters:
377a2b725a8SWilliam Gropp + dm    - The DMMoab object being set
378a2b725a8SWilliam Gropp - range - The entities treated by this DMMoab
3791cec0304SVijay Mahadevan 
3801cec0304SVijay Mahadevan   Level: beginner
3811cec0304SVijay Mahadevan 
3821cec0304SVijay Mahadevan @*/
3831cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm, moab::Range *range)
3841cec0304SVijay Mahadevan {
3851cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
3861cec0304SVijay Mahadevan 
3871cec0304SVijay Mahadevan   PetscFunctionBegin;
3881cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
3891cec0304SVijay Mahadevan   dmmoab->elocal->clear();
3901cec0304SVijay Mahadevan   dmmoab->eghost->clear();
3911cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
3929daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
3939daf19fdSVijay Mahadevan   moab::ErrorCode merr;
3941cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
3951cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
3969daf19fdSVijay Mahadevan #endif
3971cec0304SVijay Mahadevan   dmmoab->neleloc = dmmoab->elocal->size();
39841dd5348SVijay Mahadevan   dmmoab->neleghost = dmmoab->eghost->size();
3999daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
4009daf19fdSVijay Mahadevan   PetscErrorCode  ierr;
4019daf19fdSVijay Mahadevan   ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
4028cbae1a6SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele);
4039daf19fdSVijay Mahadevan #else
4049daf19fdSVijay Mahadevan   dmmoab->nele = dmmoab->neleloc;
4059daf19fdSVijay Mahadevan #endif
4065eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
4075eb88e9dSVijay Mahadevan }
4085eb88e9dSVijay Mahadevan 
4095eb88e9dSVijay Mahadevan 
410cab5ea25SPierre Jolivet /*@C
411aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
412aa768e4cSTim Tautges 
413d083f849SBarry Smith   Collective
414aa768e4cSTim Tautges 
415a2b725a8SWilliam Gropp   Input Parameters:
416a2b725a8SWilliam Gropp + dm      - The DMMoab object being set
417a2b725a8SWilliam Gropp - ltogtag - The MOAB tag used for local to global ids
418aa768e4cSTim Tautges 
419aa768e4cSTim Tautges   Level: beginner
420aa768e4cSTim Tautges 
421aa768e4cSTim Tautges @*/
4221d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm, moab::Tag ltogtag)
4231d72bce8STim Tautges {
4241d72bce8STim Tautges   PetscFunctionBegin;
4251d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4261d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
4271d72bce8STim Tautges   PetscFunctionReturn(0);
4281d72bce8STim Tautges }
4291d72bce8STim Tautges 
4301d72bce8STim Tautges 
431cab5ea25SPierre Jolivet /*@C
432aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
433aa768e4cSTim Tautges 
434d083f849SBarry Smith   Collective
435aa768e4cSTim Tautges 
436aa768e4cSTim Tautges   Input Parameter:
437aa768e4cSTim Tautges . dm      - The DMMoab object being set
438aa768e4cSTim Tautges 
439aa768e4cSTim Tautges   Output Parameter:
440aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
441aa768e4cSTim Tautges 
442aa768e4cSTim Tautges   Level: beginner
443aa768e4cSTim Tautges 
444aa768e4cSTim Tautges @*/
4451d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm, moab::Tag *ltog_tag)
4461d72bce8STim Tautges {
4471d72bce8STim Tautges   PetscFunctionBegin;
4481d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4491d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
4501d72bce8STim Tautges   PetscFunctionReturn(0);
4511d72bce8STim Tautges }
4521d72bce8STim Tautges 
4531d72bce8STim Tautges 
454cab5ea25SPierre Jolivet /*@C
455aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
456aa768e4cSTim Tautges 
457d083f849SBarry Smith   Collective
458aa768e4cSTim Tautges 
459aa768e4cSTim Tautges   Input Parameter:
460a2b725a8SWilliam Gropp + dm - The DMMoab object being set
461a2b725a8SWilliam Gropp - bs - The block size used with this DMMoab
462aa768e4cSTim Tautges 
463aa768e4cSTim Tautges   Level: beginner
464aa768e4cSTim Tautges 
465aa768e4cSTim Tautges @*/
4661d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm, PetscInt bs)
4671d72bce8STim Tautges {
4681d72bce8STim Tautges   PetscFunctionBegin;
4691d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4701d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
4711d72bce8STim Tautges   PetscFunctionReturn(0);
4721d72bce8STim Tautges }
4731d72bce8STim Tautges 
4741d72bce8STim Tautges 
475cab5ea25SPierre Jolivet /*@C
476aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
477aa768e4cSTim Tautges 
478d083f849SBarry Smith   Collective
479aa768e4cSTim Tautges 
480aa768e4cSTim Tautges   Input Parameter:
481aa768e4cSTim Tautges . dm - The DMMoab object being set
482aa768e4cSTim Tautges 
483aa768e4cSTim Tautges   Output Parameter:
484aa768e4cSTim Tautges . bs - The block size used with this DMMoab
485aa768e4cSTim Tautges 
486aa768e4cSTim Tautges   Level: beginner
487aa768e4cSTim Tautges 
488aa768e4cSTim Tautges @*/
4891d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm, PetscInt *bs)
4901d72bce8STim Tautges {
4911d72bce8STim Tautges   PetscFunctionBegin;
4921d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4931d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
4941d72bce8STim Tautges   PetscFunctionReturn(0);
4951d72bce8STim Tautges }
4961d72bce8STim Tautges 
4971cec0304SVijay Mahadevan 
498cab5ea25SPierre Jolivet /*@C
499212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
500212ad6d1SVijay Mahadevan 
501d083f849SBarry Smith   Collective on dm
502212ad6d1SVijay Mahadevan 
503212ad6d1SVijay Mahadevan   Input Parameter:
504212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
505212ad6d1SVijay Mahadevan 
506212ad6d1SVijay Mahadevan   Output Parameter:
507a2b725a8SWilliam Gropp + neg - The number of global elements in the DMMoab instance
508a2b725a8SWilliam Gropp - nvg - The number of global vertices in the DMMoab instance
509212ad6d1SVijay Mahadevan 
510212ad6d1SVijay Mahadevan   Level: beginner
511212ad6d1SVijay Mahadevan 
512212ad6d1SVijay Mahadevan @*/
51341dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm, PetscInt *neg, PetscInt *nvg)
514212ad6d1SVijay Mahadevan {
515212ad6d1SVijay Mahadevan   PetscFunctionBegin;
516212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
51741dd5348SVijay Mahadevan   if (neg) *neg = ((DM_Moab*)dm->data)->nele;
51841dd5348SVijay Mahadevan   if (nvg) *nvg = ((DM_Moab*)dm->data)->n;
519212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
520212ad6d1SVijay Mahadevan }
521212ad6d1SVijay Mahadevan 
522212ad6d1SVijay Mahadevan 
523cab5ea25SPierre Jolivet /*@C
524212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
525212ad6d1SVijay Mahadevan 
526d083f849SBarry Smith   Collective on dm
527212ad6d1SVijay Mahadevan 
528212ad6d1SVijay Mahadevan   Input Parameter:
529212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
530212ad6d1SVijay Mahadevan 
531212ad6d1SVijay Mahadevan   Output Parameter:
532b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor
53300cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor
53400cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor
535a2b725a8SWilliam Gropp - nvg - The number of ghosted vertices in this processor
536212ad6d1SVijay Mahadevan 
537212ad6d1SVijay Mahadevan   Level: beginner
538212ad6d1SVijay Mahadevan 
539212ad6d1SVijay Mahadevan @*/
54041dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm, PetscInt *nel, PetscInt *neg, PetscInt *nvl, PetscInt *nvg)
541212ad6d1SVijay Mahadevan {
542212ad6d1SVijay Mahadevan   PetscFunctionBegin;
543212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
54441dd5348SVijay Mahadevan   if (nel) *nel = ((DM_Moab*)dm->data)->neleloc;
54541dd5348SVijay Mahadevan   if (neg) *neg = ((DM_Moab*)dm->data)->neleghost;
54641dd5348SVijay Mahadevan   if (nvl) *nvl = ((DM_Moab*)dm->data)->nloc;
54741dd5348SVijay Mahadevan   if (nvg) *nvg = ((DM_Moab*)dm->data)->nghost;
548212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
549212ad6d1SVijay Mahadevan }
550212ad6d1SVijay Mahadevan 
551212ad6d1SVijay Mahadevan 
552cab5ea25SPierre Jolivet /*@C
55300cc10feSVijay Mahadevan   DMMoabGetOffset - Get the local offset for the global vector
55400cc10feSVijay Mahadevan 
555d083f849SBarry Smith   Collective
55600cc10feSVijay Mahadevan 
55700cc10feSVijay Mahadevan   Input Parameter:
55800cc10feSVijay Mahadevan . dm - The DMMoab object being set
55900cc10feSVijay Mahadevan 
56000cc10feSVijay Mahadevan   Output Parameter:
56100cc10feSVijay Mahadevan . offset - The local offset for the global vector
56200cc10feSVijay Mahadevan 
56300cc10feSVijay Mahadevan   Level: beginner
56400cc10feSVijay Mahadevan 
56500cc10feSVijay Mahadevan @*/
56600cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm, PetscInt *offset)
56700cc10feSVijay Mahadevan {
56800cc10feSVijay Mahadevan   PetscFunctionBegin;
56900cc10feSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
57000cc10feSVijay Mahadevan   *offset = ((DM_Moab*)dm->data)->vstart;
57100cc10feSVijay Mahadevan   PetscFunctionReturn(0);
57200cc10feSVijay Mahadevan }
57300cc10feSVijay Mahadevan 
57400cc10feSVijay Mahadevan 
575cab5ea25SPierre Jolivet /*@C
5764920ab11SVijay Mahadevan   DMMoabGetDimension - Get the dimension of the DM Mesh
5774920ab11SVijay Mahadevan 
578d083f849SBarry Smith   Collective
5794920ab11SVijay Mahadevan 
5804920ab11SVijay Mahadevan   Input Parameter:
581340f3b9aSVijay Mahadevan . dm - The DMMoab object
5824920ab11SVijay Mahadevan 
5834920ab11SVijay Mahadevan   Output Parameter:
5844920ab11SVijay Mahadevan . dim - The dimension of DM
5854920ab11SVijay Mahadevan 
5864920ab11SVijay Mahadevan   Level: beginner
5874920ab11SVijay Mahadevan 
5884920ab11SVijay Mahadevan @*/
5894920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm, PetscInt *dim)
5904920ab11SVijay Mahadevan {
5914920ab11SVijay Mahadevan   PetscFunctionBegin;
5924920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
5934920ab11SVijay Mahadevan   *dim = ((DM_Moab*)dm->data)->dim;
5944920ab11SVijay Mahadevan   PetscFunctionReturn(0);
5954920ab11SVijay Mahadevan }
5964920ab11SVijay Mahadevan 
5974920ab11SVijay Mahadevan 
598cab5ea25SPierre Jolivet /*@C
599755f3dfbSVijay Mahadevan   DMMoabGetHierarchyLevel - Get the current level of the mesh hierarchy
600755f3dfbSVijay Mahadevan   generated through uniform refinement.
601755f3dfbSVijay Mahadevan 
602d083f849SBarry Smith   Collective on dm
603755f3dfbSVijay Mahadevan 
604755f3dfbSVijay Mahadevan   Input Parameter:
605755f3dfbSVijay Mahadevan . dm - The DMMoab object being set
606755f3dfbSVijay Mahadevan 
607755f3dfbSVijay Mahadevan   Output Parameter:
608755f3dfbSVijay Mahadevan . nvg - The current mesh hierarchy level
609755f3dfbSVijay Mahadevan 
610755f3dfbSVijay Mahadevan   Level: beginner
611755f3dfbSVijay Mahadevan 
612755f3dfbSVijay Mahadevan @*/
613755f3dfbSVijay Mahadevan PetscErrorCode DMMoabGetHierarchyLevel(DM dm, PetscInt *nlevel)
614755f3dfbSVijay Mahadevan {
615755f3dfbSVijay Mahadevan   PetscFunctionBegin;
616755f3dfbSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
617755f3dfbSVijay Mahadevan   if (nlevel) *nlevel = ((DM_Moab*)dm->data)->hlevel;
618755f3dfbSVijay Mahadevan   PetscFunctionReturn(0);
619755f3dfbSVijay Mahadevan }
620755f3dfbSVijay Mahadevan 
621755f3dfbSVijay Mahadevan 
622cab5ea25SPierre Jolivet /*@C
623340f3b9aSVijay Mahadevan   DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh
624340f3b9aSVijay Mahadevan 
625d083f849SBarry Smith   Collective
626340f3b9aSVijay Mahadevan 
627340f3b9aSVijay Mahadevan   Input Parameter:
628a2b725a8SWilliam Gropp + dm - The DMMoab object
629a2b725a8SWilliam Gropp - ehandle - The element entity handle
630340f3b9aSVijay Mahadevan 
631340f3b9aSVijay Mahadevan   Output Parameter:
632340f3b9aSVijay Mahadevan . mat - The material ID for the current entity
633340f3b9aSVijay Mahadevan 
634340f3b9aSVijay Mahadevan   Level: beginner
635340f3b9aSVijay Mahadevan 
636340f3b9aSVijay Mahadevan @*/
637340f3b9aSVijay Mahadevan PetscErrorCode DMMoabGetMaterialBlock(DM dm, const moab::EntityHandle ehandle, PetscInt *mat)
638340f3b9aSVijay Mahadevan {
639340f3b9aSVijay Mahadevan   DM_Moab         *dmmoab;
640340f3b9aSVijay Mahadevan 
641340f3b9aSVijay Mahadevan   PetscFunctionBegin;
642340f3b9aSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
643340f3b9aSVijay Mahadevan   if (*mat) {
644340f3b9aSVijay Mahadevan     dmmoab = (DM_Moab*)(dm)->data;
645a044f6b6SVijay Mahadevan     *mat = dmmoab->materials[dmmoab->elocal->index(ehandle)];
646340f3b9aSVijay Mahadevan   }
647340f3b9aSVijay Mahadevan   PetscFunctionReturn(0);
648340f3b9aSVijay Mahadevan }
649340f3b9aSVijay Mahadevan 
6504920ab11SVijay Mahadevan 
651cab5ea25SPierre Jolivet /*@C
65285d305f5SVijay Mahadevan   DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities
65385d305f5SVijay Mahadevan 
654d083f849SBarry Smith   Collective
65585d305f5SVijay Mahadevan 
65685d305f5SVijay Mahadevan   Input Parameter:
657a2b725a8SWilliam Gropp + dm - The DMMoab object
65885d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
659a2b725a8SWilliam Gropp - conn - The vertex entity handles
66085d305f5SVijay Mahadevan 
66185d305f5SVijay Mahadevan   Output Parameter:
66285d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities
66385d305f5SVijay Mahadevan 
66485d305f5SVijay Mahadevan   Level: beginner
66585d305f5SVijay Mahadevan 
66685d305f5SVijay Mahadevan .seealso: DMMoabGetVertexConnectivity()
66785d305f5SVijay Mahadevan @*/
668cade3ad9SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm, PetscInt nconn, const moab::EntityHandle *conn, PetscReal *vpos)
6697023aa44SVijay Mahadevan {
6707023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
6717023aa44SVijay Mahadevan   moab::ErrorCode merr;
6727023aa44SVijay Mahadevan 
6737023aa44SVijay Mahadevan   PetscFunctionBegin;
6747023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
6757023aa44SVijay Mahadevan   PetscValidPointer(conn, 3);
6769c368985SVijay Mahadevan   PetscValidPointer(vpos, 4);
6777023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6787023aa44SVijay Mahadevan 
6797023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
6809c368985SVijay Mahadevan   if (dmmoab->hlevel) {
6819c368985SVijay Mahadevan     merr = dmmoab->hierarchy->get_coordinates(const_cast<moab::EntityHandle*>(conn), nconn, dmmoab->hlevel, vpos);MBERRNM(merr);
6829c368985SVijay Mahadevan   }
6839c368985SVijay Mahadevan   else {
6847023aa44SVijay Mahadevan     merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
6859c368985SVijay Mahadevan   }
6867023aa44SVijay Mahadevan   PetscFunctionReturn(0);
6877023aa44SVijay Mahadevan }
6887023aa44SVijay Mahadevan 
6897023aa44SVijay Mahadevan 
690cab5ea25SPierre Jolivet /*@C
69185d305f5SVijay Mahadevan   DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity
69285d305f5SVijay Mahadevan 
693d083f849SBarry Smith   Collective
69485d305f5SVijay Mahadevan 
69585d305f5SVijay Mahadevan   Input Parameter:
696a2b725a8SWilliam Gropp + dm - The DMMoab object
697a2b725a8SWilliam Gropp - vhandle - Vertex entity handle
69885d305f5SVijay Mahadevan 
69985d305f5SVijay Mahadevan   Output Parameter:
700a2b725a8SWilliam Gropp + nconn - Number of entities whose coordinates are needed
701a2b725a8SWilliam Gropp - conn - The vertex entity handles
70285d305f5SVijay Mahadevan 
70385d305f5SVijay Mahadevan   Level: beginner
70485d305f5SVijay Mahadevan 
70585d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabRestoreVertexConnectivity()
70685d305f5SVijay Mahadevan @*/
70785d305f5SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm, moab::EntityHandle vhandle, PetscInt* nconn, moab::EntityHandle **conn)
7088d8d51c8SVijay Mahadevan {
7098d8d51c8SVijay Mahadevan   DM_Moab        *dmmoab;
7108d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities, connect;
7118d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
7128d8d51c8SVijay Mahadevan   moab::ErrorCode merr;
7138d8d51c8SVijay Mahadevan 
7148d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7158d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
7168d8d51c8SVijay Mahadevan   PetscValidPointer(conn, 4);
7178d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7188d8d51c8SVijay Mahadevan 
7198d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
72085d305f5SVijay Mahadevan   merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION); MBERRNM(merr);
7218d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0], adj_entities.size(), connect); MBERRNM(merr);
7228d8d51c8SVijay Mahadevan 
7238d8d51c8SVijay Mahadevan   if (conn) {
7248d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(moab::EntityHandle) * connect.size(), conn);CHKERRQ(ierr);
725580bdb30SBarry Smith     ierr = PetscArraycpy(*conn, &connect[0], connect.size());CHKERRQ(ierr);
7268d8d51c8SVijay Mahadevan   }
7278d8d51c8SVijay Mahadevan   if (nconn) *nconn = connect.size();
7288d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
7298d8d51c8SVijay Mahadevan }
7308d8d51c8SVijay Mahadevan 
7318d8d51c8SVijay Mahadevan 
732cab5ea25SPierre Jolivet /*@C
73385d305f5SVijay Mahadevan   DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity
73485d305f5SVijay Mahadevan 
735d083f849SBarry Smith   Collective
73685d305f5SVijay Mahadevan 
73785d305f5SVijay Mahadevan   Input Parameter:
738a2b725a8SWilliam Gropp + dm - The DMMoab object
73985d305f5SVijay Mahadevan . vhandle - Vertex entity handle
74085d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
741a2b725a8SWilliam Gropp - conn - The vertex entity handles
74285d305f5SVijay Mahadevan 
74385d305f5SVijay Mahadevan   Level: beginner
74485d305f5SVijay Mahadevan 
74585d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity()
74685d305f5SVijay Mahadevan @*/
7478d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt* nconn, moab::EntityHandle **conn)
7488d8d51c8SVijay Mahadevan {
7498d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
7508d8d51c8SVijay Mahadevan 
7518d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7528d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
7538d8d51c8SVijay Mahadevan   PetscValidPointer(conn, 4);
7548d8d51c8SVijay Mahadevan 
7558d8d51c8SVijay Mahadevan   if (conn) {
7568d8d51c8SVijay Mahadevan     ierr = PetscFree(*conn);CHKERRQ(ierr);
7578d8d51c8SVijay Mahadevan   }
7588d8d51c8SVijay Mahadevan   if (nconn) *nconn = 0;
7598d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
7608d8d51c8SVijay Mahadevan }
7618d8d51c8SVijay Mahadevan 
7628d8d51c8SVijay Mahadevan 
763cab5ea25SPierre Jolivet /*@C
76485d305f5SVijay Mahadevan   DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity
76585d305f5SVijay Mahadevan 
766d083f849SBarry Smith   Collective
76785d305f5SVijay Mahadevan 
76885d305f5SVijay Mahadevan   Input Parameter:
769a2b725a8SWilliam Gropp + dm - The DMMoab object
770a2b725a8SWilliam Gropp - ehandle - Vertex entity handle
77185d305f5SVijay Mahadevan 
77285d305f5SVijay Mahadevan   Output Parameter:
773a2b725a8SWilliam Gropp + nconn - Number of entities whose coordinates are needed
774a2b725a8SWilliam Gropp - conn - The vertex entity handles
77585d305f5SVijay Mahadevan 
77685d305f5SVijay Mahadevan   Level: beginner
77785d305f5SVijay Mahadevan 
77885d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity(), DMMoabRestoreVertexConnectivity()
77985d305f5SVijay Mahadevan @*/
7807023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt* nconn, const moab::EntityHandle **conn)
7817023aa44SVijay Mahadevan {
7827023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
7837023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
7849c368985SVijay Mahadevan   std::vector<moab::EntityHandle> vconn;
7857023aa44SVijay Mahadevan   moab::ErrorCode merr;
7867023aa44SVijay Mahadevan   PetscInt nnodes;
7877023aa44SVijay Mahadevan 
7887023aa44SVijay Mahadevan   PetscFunctionBegin;
7897023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
7907023aa44SVijay Mahadevan   PetscValidPointer(conn, 4);
7917023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7927023aa44SVijay Mahadevan 
7937023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
7947023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes); MBERRNM(merr);
7957023aa44SVijay Mahadevan   if (conn) *conn = connect;
7967023aa44SVijay Mahadevan   if (nconn) *nconn = nnodes;
7977023aa44SVijay Mahadevan   PetscFunctionReturn(0);
7987023aa44SVijay Mahadevan }
7997023aa44SVijay Mahadevan 
8007023aa44SVijay Mahadevan 
801cab5ea25SPierre Jolivet /*@C
80285d305f5SVijay Mahadevan   DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element)
80385d305f5SVijay Mahadevan 
804d083f849SBarry Smith   Collective
80585d305f5SVijay Mahadevan 
80685d305f5SVijay Mahadevan   Input Parameter:
807a2b725a8SWilliam Gropp + dm - The DMMoab object
808a2b725a8SWilliam Gropp - ent - Entity handle
80985d305f5SVijay Mahadevan 
81085d305f5SVijay Mahadevan   Output Parameter:
81185d305f5SVijay Mahadevan . ent_on_boundary - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
81285d305f5SVijay Mahadevan 
81385d305f5SVijay Mahadevan   Level: beginner
81485d305f5SVijay Mahadevan 
81585d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices()
81685d305f5SVijay Mahadevan @*/
81769263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm, const moab::EntityHandle ent, PetscBool* ent_on_boundary)
81869263071SVijay Mahadevan {
81969263071SVijay Mahadevan   moab::EntityType etype;
82069263071SVijay Mahadevan   DM_Moab         *dmmoab;
82169263071SVijay Mahadevan   PetscInt         edim;
82269263071SVijay Mahadevan 
82369263071SVijay Mahadevan   PetscFunctionBegin;
82469263071SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
82569263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary, 3);
82669263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
82769263071SVijay Mahadevan 
82869263071SVijay Mahadevan   /* get the entity type and handle accordingly */
82969263071SVijay Mahadevan   etype = dmmoab->mbiface->type_from_handle(ent);
83069263071SVijay Mahadevan   if (etype >= moab::MBPOLYHEDRON) SETERRQ1(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Entity type on the boundary skin is invalid. EntityType = %D\n", etype);
83169263071SVijay Mahadevan 
83269263071SVijay Mahadevan   /* get the entity dimension */
83369263071SVijay Mahadevan   edim = dmmoab->mbiface->dimension_from_handle(ent);
83469263071SVijay Mahadevan 
83569263071SVijay Mahadevan   *ent_on_boundary = PETSC_FALSE;
83669263071SVijay Mahadevan   if (etype == moab::MBVERTEX && edim == 0) {
83749d66b22SVijay Mahadevan     *ent_on_boundary = ((dmmoab->bndyvtx->index(ent) >= 0) ? PETSC_TRUE : PETSC_FALSE);
83869263071SVijay Mahadevan   }
83969263071SVijay Mahadevan   else {
84069263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
8416d9eb265SVijay Mahadevan       if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE;
84269263071SVijay Mahadevan     }
84369263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
8446d9eb265SVijay Mahadevan       if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE;
84569263071SVijay Mahadevan     }
84669263071SVijay Mahadevan   }
84769263071SVijay Mahadevan   PetscFunctionReturn(0);
84869263071SVijay Mahadevan }
84969263071SVijay Mahadevan 
85069263071SVijay Mahadevan 
851cab5ea25SPierre Jolivet /*@C
85285d305f5SVijay Mahadevan   DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element)
85385d305f5SVijay Mahadevan 
85485d305f5SVijay Mahadevan   Input Parameter:
855a2b725a8SWilliam Gropp + dm - The DMMoab object
85685d305f5SVijay Mahadevan . nconn - Number of handles
857a2b725a8SWilliam Gropp - cnt - Array of entity handles
85885d305f5SVijay Mahadevan 
85985d305f5SVijay Mahadevan   Output Parameter:
86085d305f5SVijay Mahadevan . isbdvtx - Array of boundary markers - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
86185d305f5SVijay Mahadevan 
86285d305f5SVijay Mahadevan   Level: beginner
86385d305f5SVijay Mahadevan 
86485d305f5SVijay Mahadevan .seealso: DMMoabIsEntityOnBoundary()
86585d305f5SVijay Mahadevan @*/
86669263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm, PetscInt nconn, const moab::EntityHandle *cnt, PetscBool* isbdvtx)
8677023aa44SVijay Mahadevan {
8687023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
8697023aa44SVijay Mahadevan   PetscInt       i;
8707023aa44SVijay Mahadevan 
8717023aa44SVijay Mahadevan   PetscFunctionBegin;
8727023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
8737023aa44SVijay Mahadevan   PetscValidPointer(cnt, 3);
8747023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx, 4);
8757023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8767023aa44SVijay Mahadevan 
8777023aa44SVijay Mahadevan   for (i = 0; i < nconn; ++i) {
8786d9eb265SVijay Mahadevan     isbdvtx[i] = (dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE : PETSC_FALSE);
8797023aa44SVijay Mahadevan   }
8807023aa44SVijay Mahadevan   PetscFunctionReturn(0);
8817023aa44SVijay Mahadevan }
8827023aa44SVijay Mahadevan 
8837023aa44SVijay Mahadevan 
884cab5ea25SPierre Jolivet /*@C
88585d305f5SVijay Mahadevan   DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary
88685d305f5SVijay Mahadevan 
88785d305f5SVijay Mahadevan   Input Parameter:
88885d305f5SVijay Mahadevan . dm - The DMMoab object
88985d305f5SVijay Mahadevan 
89085d305f5SVijay Mahadevan   Output Parameter:
891a2b725a8SWilliam Gropp + bdvtx - Boundary vertices
89285d305f5SVijay Mahadevan . bdelems - Boundary elements
893a2b725a8SWilliam Gropp - bdfaces - Boundary faces
89485d305f5SVijay Mahadevan 
89585d305f5SVijay Mahadevan   Level: beginner
89685d305f5SVijay Mahadevan 
89785d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices(), DMMoabIsEntityOnBoundary()
89885d305f5SVijay Mahadevan @*/
8996d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm, const moab::Range **bdvtx, const moab::Range** bdelems, const moab::Range** bdfaces)
9001cec0304SVijay Mahadevan {
9011cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
9021cec0304SVijay Mahadevan 
9031cec0304SVijay Mahadevan   PetscFunctionBegin;
9041cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
9051cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9061cec0304SVijay Mahadevan 
9076d9eb265SVijay Mahadevan   if (bdvtx)  *bdvtx = dmmoab->bndyvtx;
9086d9eb265SVijay Mahadevan   if (bdfaces)  *bdfaces = dmmoab->bndyfaces;
9096d9eb265SVijay Mahadevan   if (bdelems)  *bdfaces = dmmoab->bndyelems;
9101cec0304SVijay Mahadevan   PetscFunctionReturn(0);
9111cec0304SVijay Mahadevan }
9121cec0304SVijay Mahadevan 
913f6829af0SVijay Mahadevan 
914f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm)
915f6829af0SVijay Mahadevan {
916f6829af0SVijay Mahadevan   PetscErrorCode  ierr;
91785d305f5SVijay Mahadevan   PetscInt        i;
918e882eb38SVijay Mahadevan   moab::ErrorCode merr;
919f6829af0SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
920f6829af0SVijay Mahadevan 
921f6829af0SVijay Mahadevan   PetscFunctionBegin;
922f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
923304006b3SVijay Mahadevan 
924304006b3SVijay Mahadevan   dmmoab->refct--;
925304006b3SVijay Mahadevan   if (!dmmoab->refct) {
926f6829af0SVijay Mahadevan     delete dmmoab->vlocal;
927f6829af0SVijay Mahadevan     delete dmmoab->vowned;
928f6829af0SVijay Mahadevan     delete dmmoab->vghost;
929f6829af0SVijay Mahadevan     delete dmmoab->elocal;
930f6829af0SVijay Mahadevan     delete dmmoab->eghost;
931f6829af0SVijay Mahadevan     delete dmmoab->bndyvtx;
932f6829af0SVijay Mahadevan     delete dmmoab->bndyfaces;
933f6829af0SVijay Mahadevan     delete dmmoab->bndyelems;
934f6829af0SVijay Mahadevan 
935f6829af0SVijay Mahadevan     ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr);
9367ae5e5b6SVijay Mahadevan     ierr = PetscFree2(dmmoab->gidmap, dmmoab->lidmap);CHKERRQ(ierr);
9375905e1eaSVijay Mahadevan     ierr = PetscFree(dmmoab->dfill);CHKERRQ(ierr);
9385905e1eaSVijay Mahadevan     ierr = PetscFree(dmmoab->ofill);CHKERRQ(ierr);
9399c368985SVijay Mahadevan     ierr = PetscFree(dmmoab->materials);CHKERRQ(ierr);
94085d305f5SVijay Mahadevan     if (dmmoab->fieldNames) {
94185d305f5SVijay Mahadevan       for (i = 0; i < dmmoab->numFields; i++) {
94285d305f5SVijay Mahadevan         ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr);
94385d305f5SVijay Mahadevan       }
94485d305f5SVijay Mahadevan       ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr);
94585d305f5SVijay Mahadevan     }
946b117cd09SVijay Mahadevan 
947b117cd09SVijay Mahadevan     if (dmmoab->nhlevels) {
948b117cd09SVijay Mahadevan       ierr = PetscFree(dmmoab->hsets);CHKERRQ(ierr);
949e882eb38SVijay Mahadevan       dmmoab->nhlevels = 0;
950e882eb38SVijay Mahadevan       if (!dmmoab->hlevel && dmmoab->icreatedinstance) delete dmmoab->hierarchy;
951e882eb38SVijay Mahadevan       dmmoab->hierarchy = NULL;
952b117cd09SVijay Mahadevan     }
953e882eb38SVijay Mahadevan 
954e882eb38SVijay Mahadevan     if (dmmoab->icreatedinstance) {
9559c368985SVijay Mahadevan       delete dmmoab->pcomm;
956e882eb38SVijay Mahadevan       merr = dmmoab->mbiface->delete_mesh(); MBERRNM(merr);
957e882eb38SVijay Mahadevan       delete dmmoab->mbiface;
958e882eb38SVijay Mahadevan     }
959e882eb38SVijay Mahadevan     dmmoab->mbiface = NULL;
9609daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
961e882eb38SVijay Mahadevan     dmmoab->pcomm = NULL;
9629daf19fdSVijay Mahadevan #endif
963f6829af0SVijay Mahadevan     ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
964f6829af0SVijay Mahadevan     ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr);
965f6829af0SVijay Mahadevan     ierr = PetscFree(dm->data);CHKERRQ(ierr);
966304006b3SVijay Mahadevan   }
967f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
968f6829af0SVijay Mahadevan }
969f6829af0SVijay Mahadevan 
970f6829af0SVijay Mahadevan 
9714416b707SBarry Smith PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(PetscOptionItems *PetscOptionsObject, DM dm)
9722e4e7c01SVijay Mahadevan {
9732e4e7c01SVijay Mahadevan   PetscErrorCode ierr;
9742e4e7c01SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
9752e4e7c01SVijay Mahadevan 
9762e4e7c01SVijay Mahadevan   PetscFunctionBegin;
9772e4e7c01SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
978cc310fddSBarry Smith   ierr = PetscOptionsHead(PetscOptionsObject, "DMMoab Options");CHKERRQ(ierr);
9795a856986SBarry Smith   ierr  = PetscOptionsBoundedInt("-dm_moab_rw_dbg", "The verbosity level for reading and writing MOAB meshes", "DMView", dmmoab->rw_dbglevel, &dmmoab->rw_dbglevel, NULL,0);CHKERRQ(ierr);
9802e4e7c01SVijay Mahadevan   ierr  = 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);CHKERRQ(ierr);
9812e4e7c01SVijay Mahadevan   /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */
982*589a23caSBarry Smith   ierr  = 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);CHKERRQ(ierr);
983*589a23caSBarry Smith   ierr  = 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);CHKERRQ(ierr);
9842e4e7c01SVijay Mahadevan   ierr  = PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum*)&dmmoab->read_mode, NULL);CHKERRQ(ierr);
9852e4e7c01SVijay Mahadevan   ierr  = PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum*)&dmmoab->write_mode, NULL);CHKERRQ(ierr);
9862e4e7c01SVijay Mahadevan   PetscFunctionReturn(0);
9872e4e7c01SVijay Mahadevan }
9882e4e7c01SVijay Mahadevan 
9892e4e7c01SVijay Mahadevan 
990f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm)
991f6829af0SVijay Mahadevan {
992f6829af0SVijay Mahadevan   PetscErrorCode          ierr;
993f6829af0SVijay Mahadevan   moab::ErrorCode         merr;
994f6829af0SVijay Mahadevan   Vec                     local, global;
995f6829af0SVijay Mahadevan   IS                      from, to;
996f6829af0SVijay Mahadevan   moab::Range::iterator   iter;
997304006b3SVijay Mahadevan   PetscInt                i, j, f, bs, vent, totsize, *lgmap;
998f6829af0SVijay Mahadevan   DM_Moab                *dmmoab = (DM_Moab*)dm->data;
999f6829af0SVijay Mahadevan   moab::Range             adjs;
1000f6829af0SVijay Mahadevan 
1001f6829af0SVijay Mahadevan   PetscFunctionBegin;
1002f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1003f6829af0SVijay Mahadevan   /* Get the local and shared vertices and cache it */
10049daf19fdSVijay Mahadevan   if (dmmoab->mbiface == NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface before calling SetUp.");
10059daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
10069daf19fdSVijay Mahadevan   if (dmmoab->pcomm == NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB ParallelComm object before calling SetUp.");
10079daf19fdSVijay Mahadevan #endif
1008f6829af0SVijay Mahadevan 
1009f6829af0SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
1010f6829af0SVijay Mahadevan   if (dmmoab->vlocal->empty())
1011f6829af0SVijay Mahadevan   {
101249d66b22SVijay Mahadevan     //merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
101349d66b22SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, 0, *dmmoab->vlocal, false); MBERRNM(merr);
1014f6829af0SVijay Mahadevan 
10159daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1016f6829af0SVijay Mahadevan     /* filter based on parallel status */
1017f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned); MBERRNM(merr);
1018f6829af0SVijay Mahadevan 
1019f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
10209c368985SVijay Mahadevan     // *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
1021f6829af0SVijay Mahadevan     adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
102264e1c140SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(adjs, PSTATUS_GHOST | PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost); MBERRNM(merr);
1023f6829af0SVijay Mahadevan     adjs = moab::subtract(adjs, *dmmoab->vghost);
1024f6829af0SVijay Mahadevan     *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs);
10259daf19fdSVijay Mahadevan #else
10269daf19fdSVijay Mahadevan     *dmmoab->vowned = *dmmoab->vlocal;
10279daf19fdSVijay Mahadevan #endif
1028f6829af0SVijay Mahadevan 
1029f6829af0SVijay Mahadevan     /* compute and cache the sizes of local and ghosted entities */
1030f6829af0SVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
1031f6829af0SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
103249d66b22SVijay Mahadevan 
10339daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1034b2566f29SBarry Smith     ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
103549d66b22SVijay Mahadevan     PetscInfo4(NULL, "Filset ID: %u, Vertices: local - %D, owned - %D, ghosted - %D.\n", dmmoab->fileset, dmmoab->vlocal->size(), dmmoab->nloc, dmmoab->nghost);
10369daf19fdSVijay Mahadevan #else
10379daf19fdSVijay Mahadevan     dmmoab->n = dmmoab->nloc;
10389daf19fdSVijay Mahadevan #endif
1039f6829af0SVijay Mahadevan   }
1040f6829af0SVijay Mahadevan 
1041f6829af0SVijay Mahadevan   {
1042f6829af0SVijay Mahadevan     /* get the information about the local elements in the mesh */
1043f6829af0SVijay Mahadevan     dmmoab->eghost->clear();
1044f6829af0SVijay Mahadevan 
1045f6829af0SVijay Mahadevan     /* first decipher the leading dimension */
1046f6829af0SVijay Mahadevan     for (i = 3; i > 0; i--) {
1047f6829af0SVijay Mahadevan       dmmoab->elocal->clear();
104849d66b22SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, false); MBERRNM(merr);
1049f6829af0SVijay Mahadevan 
1050f6829af0SVijay Mahadevan       /* store the current mesh dimension */
1051f6829af0SVijay Mahadevan       if (dmmoab->elocal->size()) {
1052f6829af0SVijay Mahadevan         dmmoab->dim = i;
1053f6829af0SVijay Mahadevan         break;
1054f6829af0SVijay Mahadevan       }
1055f6829af0SVijay Mahadevan     }
1056f6829af0SVijay Mahadevan 
1057b117cd09SVijay Mahadevan     ierr = DMSetDimension(dm, dmmoab->dim);CHKERRQ(ierr);
1058b117cd09SVijay Mahadevan 
10599daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1060f6829af0SVijay Mahadevan     /* filter the ghosted and owned element list */
1061f6829af0SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
1062f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
1063f6829af0SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
10649daf19fdSVijay Mahadevan #endif
1065f6829af0SVijay Mahadevan 
1066f6829af0SVijay Mahadevan     dmmoab->neleloc = dmmoab->elocal->size();
1067f6829af0SVijay Mahadevan     dmmoab->neleghost = dmmoab->eghost->size();
106849d66b22SVijay Mahadevan 
10699daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1070b2566f29SBarry Smith     ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
107149d66b22SVijay Mahadevan     PetscInfo3(NULL, "%d-dim elements: owned - %D, ghosted - %D.\n", dmmoab->dim, dmmoab->neleloc, dmmoab->neleghost);
10729daf19fdSVijay Mahadevan #else
10739daf19fdSVijay Mahadevan     dmmoab->nele = dmmoab->neleloc;
10749daf19fdSVijay Mahadevan #endif
1075f6829af0SVijay Mahadevan   }
1076f6829af0SVijay Mahadevan 
1077f6829af0SVijay Mahadevan   bs = dmmoab->bs;
1078f6829af0SVijay Mahadevan   if (!dmmoab->ltog_tag) {
1079f6829af0SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
1080f6829af0SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
1081f6829af0SVijay Mahadevan        assemble the individual pieces of the mesh */
1082f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag); MBERRNM(merr);
1083f6829af0SVijay Mahadevan   }
1084f6829af0SVijay Mahadevan 
1085f6829af0SVijay Mahadevan   totsize = dmmoab->vlocal->size();
108649d66b22SVijay Mahadevan   if (totsize != dmmoab->nloc + dmmoab->nghost) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Mismatch between local and owned+ghost vertices. %D != %D.", totsize, dmmoab->nloc + dmmoab->nghost);
108749d66b22SVijay Mahadevan   ierr = PetscCalloc1(totsize, &dmmoab->gsindices);CHKERRQ(ierr);
1088f6829af0SVijay Mahadevan   {
1089f6829af0SVijay Mahadevan     /* first get the local indices */
1090f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vowned, &dmmoab->gsindices[0]); MBERRNM(merr);
10913f1c6e43SVijay Mahadevan     if (dmmoab->nghost) {  /* next get the ghosted indices */
1092f6829af0SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vghost, &dmmoab->gsindices[dmmoab->nloc]); MBERRNM(merr);
1093f6829af0SVijay Mahadevan     }
1094f6829af0SVijay Mahadevan 
1095f6829af0SVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
1096304006b3SVijay Mahadevan     dmmoab->lminmax[0] = dmmoab->lminmax[1] = dmmoab->gsindices[0];
1097f6829af0SVijay Mahadevan     for (i = 0; i < totsize; ++i) {
1098304006b3SVijay Mahadevan       if (dmmoab->lminmax[0] > dmmoab->gsindices[i]) dmmoab->lminmax[0] = dmmoab->gsindices[i];
1099304006b3SVijay Mahadevan       if (dmmoab->lminmax[1] < dmmoab->gsindices[i]) dmmoab->lminmax[1] = dmmoab->gsindices[i];
1100f6829af0SVijay Mahadevan     }
1101f6829af0SVijay Mahadevan 
1102304006b3SVijay Mahadevan     ierr = MPIU_Allreduce(&dmmoab->lminmax[0], &dmmoab->gminmax[0], 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr);
1103304006b3SVijay Mahadevan     ierr = MPIU_Allreduce(&dmmoab->lminmax[1], &dmmoab->gminmax[1], 1, MPI_INT, MPI_MAX, ((PetscObject)dm)->comm);CHKERRQ(ierr);
1104f6829af0SVijay Mahadevan 
1105f6829af0SVijay Mahadevan     /* set the GID map */
1106f6829af0SVijay Mahadevan     for (i = 0; i < totsize; ++i) {
1107304006b3SVijay Mahadevan       dmmoab->gsindices[i] -= dmmoab->gminmax[0]; /* zero based index needed for IS */
11089c368985SVijay Mahadevan 
1109f6829af0SVijay Mahadevan     }
1110304006b3SVijay Mahadevan     dmmoab->lminmax[0] -= dmmoab->gminmax[0];
1111304006b3SVijay Mahadevan     dmmoab->lminmax[1] -= dmmoab->gminmax[0];
1112f6829af0SVijay Mahadevan 
1113304006b3SVijay Mahadevan     PetscInfo4(NULL, "GLOBAL_ID: Local [min, max] - [%D, %D], Global [min, max] - [%D, %D]\n", dmmoab->lminmax[0], dmmoab->lminmax[1], dmmoab->gminmax[0], dmmoab->gminmax[1]);
1114f6829af0SVijay Mahadevan   }
111582dfd14aSVijay Mahadevan   if (!(dmmoab->bs == dmmoab->numFields || dmmoab->bs == 1)) SETERRQ3(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Mismatch between block size and number of component fields. %D != 1 OR %D != %D.", dmmoab->bs, dmmoab->bs, dmmoab->numFields);
1116f6829af0SVijay Mahadevan 
1117f6829af0SVijay Mahadevan   {
11189c368985SVijay Mahadevan     dmmoab->seqstart = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->front());
11199c368985SVijay Mahadevan     dmmoab->seqend = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->back());
1120304006b3SVijay Mahadevan     PetscInfo2(NULL, "SEQUENCE: Local [min, max] - [%D, %D]\n", dmmoab->seqstart, dmmoab->seqend);
11213f1c6e43SVijay Mahadevan 
112249d66b22SVijay Mahadevan     ierr = PetscMalloc2(dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->gidmap, dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->lidmap);CHKERRQ(ierr);
11233f1c6e43SVijay Mahadevan     ierr = PetscMalloc1(totsize * dmmoab->numFields, &lgmap);CHKERRQ(ierr);
1124f6829af0SVijay Mahadevan 
1125f6829af0SVijay Mahadevan     i = j = 0;
1126f6829af0SVijay Mahadevan     /* set the owned vertex data first */
1127f6829af0SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++, i++) {
1128e92d1c7cSVijay Mahadevan       vent = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart;
1129f6829af0SVijay Mahadevan       dmmoab->gidmap[vent] = dmmoab->gsindices[i];
1130f6829af0SVijay Mahadevan       dmmoab->lidmap[vent] = i;
1131f6829af0SVijay Mahadevan       for (f = 0; f < dmmoab->numFields; f++, j++) {
11323f1c6e43SVijay Mahadevan         lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]);
1133f6829af0SVijay Mahadevan       }
1134f6829af0SVijay Mahadevan     }
1135f6829af0SVijay Mahadevan     /* next arrange all the ghosted data information */
1136f6829af0SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++, i++) {
1137e92d1c7cSVijay Mahadevan       vent = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart;
1138f6829af0SVijay Mahadevan       dmmoab->gidmap[vent] = dmmoab->gsindices[i];
1139f6829af0SVijay Mahadevan       dmmoab->lidmap[vent] = i;
1140f6829af0SVijay Mahadevan       for (f = 0; f < dmmoab->numFields; f++, j++) {
11413f1c6e43SVijay Mahadevan         lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]);
1142f6829af0SVijay Mahadevan       }
1143f6829af0SVijay Mahadevan     }
1144f6829af0SVijay Mahadevan 
1145f6829af0SVijay Mahadevan     /* We need to create the Global to Local Vector Scatter Contexts
1146f6829af0SVijay Mahadevan        1) First create a local and global vector
1147f6829af0SVijay Mahadevan        2) Create a local and global IS
1148f6829af0SVijay Mahadevan        3) Create VecScatter and LtoGMapping objects
1149f6829af0SVijay Mahadevan        4) Cleanup the IS and Vec objects
1150f6829af0SVijay Mahadevan     */
1151f6829af0SVijay Mahadevan     ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr);
1152f6829af0SVijay Mahadevan     ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr);
1153f6829af0SVijay Mahadevan 
1154f6829af0SVijay Mahadevan     ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr);
1155f6829af0SVijay Mahadevan 
1156f6829af0SVijay Mahadevan     /* global to local must retrieve ghost points */
1157f6829af0SVijay Mahadevan     ierr = ISCreateStride(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, dmmoab->vstart, 1, &from);CHKERRQ(ierr);
1158f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(from, bs);CHKERRQ(ierr);
1159f6829af0SVijay Mahadevan 
11603f1c6e43SVijay Mahadevan     ierr = ISCreateGeneral(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, &lgmap[0], PETSC_COPY_VALUES, &to);CHKERRQ(ierr);
1161f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(to, bs);CHKERRQ(ierr);
1162f6829af0SVijay Mahadevan 
1163f6829af0SVijay Mahadevan     if (!dmmoab->ltog_map) {
1164f6829af0SVijay Mahadevan       /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */
11653f1c6e43SVijay Mahadevan       ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm, dmmoab->bs, totsize * dmmoab->numFields, lgmap,
1166f6829af0SVijay Mahadevan                                           PETSC_COPY_VALUES, &dmmoab->ltog_map);CHKERRQ(ierr);
1167f6829af0SVijay Mahadevan     }
1168f6829af0SVijay Mahadevan 
1169f6829af0SVijay Mahadevan     /* now create the scatter object from local to global vector */
11709448b7f1SJunchao Zhang     ierr = VecScatterCreate(local, from, global, to, &dmmoab->ltog_sendrecv);CHKERRQ(ierr);
1171f6829af0SVijay Mahadevan 
1172f6829af0SVijay Mahadevan     /* clean up IS, Vec */
11733f1c6e43SVijay Mahadevan     ierr = PetscFree(lgmap);CHKERRQ(ierr);
1174f6829af0SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
1175f6829af0SVijay Mahadevan     ierr = ISDestroy(&to);CHKERRQ(ierr);
1176f6829af0SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
1177f6829af0SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
1178f6829af0SVijay Mahadevan   }
1179f6829af0SVijay Mahadevan 
118049d66b22SVijay Mahadevan   dmmoab->bndyvtx = new moab::Range();
118149d66b22SVijay Mahadevan   dmmoab->bndyfaces = new moab::Range();
118249d66b22SVijay Mahadevan   dmmoab->bndyelems = new moab::Range();
1183f6829af0SVijay Mahadevan   /* skin the boundary and store nodes */
11849c368985SVijay Mahadevan   if (!dmmoab->hlevel) {
1185f6829af0SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
1186f6829af0SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
1187f6829af0SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
1188f6829af0SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
1189f6829af0SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
1190f6829af0SVijay Mahadevan 
1191f6829af0SVijay Mahadevan     /* get the entities on the skin - only the faces */
11922417220eSVijay Mahadevan     merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, *dmmoab->bndyfaces, NULL, true, true, false); MBERRNM(merr); // 'false' param indicates we want faces back, not vertices
1193f6829af0SVijay Mahadevan 
11949daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1195f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
1196f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
11972417220eSVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_INTERFACE, PSTATUS_NOT); MBERRNM(merr);
11989daf19fdSVijay Mahadevan #endif
1199f6829af0SVijay Mahadevan 
1200f6829af0SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
1201f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false); MBERRNM(ierr);
1202755f3dfbSVijay Mahadevan     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyvtx, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION); MBERRNM(ierr);
1203f6829af0SVijay Mahadevan   }
12049c368985SVijay Mahadevan   else {
12059c368985SVijay Mahadevan     /* Let us query the hierarchy manager and get the results directly for this level */
12069c368985SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->elocal->begin(); iter != dmmoab->elocal->end(); iter++) {
12079c368985SVijay Mahadevan       moab::EntityHandle elemHandle = *iter;
12089c368985SVijay Mahadevan       if (dmmoab->hierarchy->is_entity_on_boundary(elemHandle)) {
12099c368985SVijay Mahadevan         dmmoab->bndyelems->insert(elemHandle);
12109c368985SVijay Mahadevan         /* For this boundary element, query the vertices and add them to the list */
12119c368985SVijay Mahadevan         std::vector<moab::EntityHandle> connect;
12129c368985SVijay Mahadevan         merr = dmmoab->hierarchy->get_connectivity(elemHandle, dmmoab->hlevel, connect); MBERRNM(ierr);
12139c368985SVijay Mahadevan         for (unsigned iv=0; iv < connect.size(); ++iv)
12149c368985SVijay Mahadevan           if (dmmoab->hierarchy->is_entity_on_boundary(connect[iv]))
12159c368985SVijay Mahadevan             dmmoab->bndyvtx->insert(connect[iv]);
12169c368985SVijay Mahadevan         /* Next, let us query the boundary faces and add them also to the list */
12179c368985SVijay Mahadevan         std::vector<moab::EntityHandle> faces;
12189c368985SVijay Mahadevan         merr = dmmoab->hierarchy->get_adjacencies(elemHandle, dmmoab->dim-1, faces); MBERRNM(ierr);
12199c368985SVijay Mahadevan         for (unsigned ifa=0; ifa < faces.size(); ++ifa)
12209c368985SVijay Mahadevan           if (dmmoab->hierarchy->is_entity_on_boundary(faces[ifa]))
12219c368985SVijay Mahadevan             dmmoab->bndyfaces->insert(faces[ifa]);
12229c368985SVijay Mahadevan       }
12239c368985SVijay Mahadevan     }
12249c368985SVijay Mahadevan #ifdef MOAB_HAVE_MPI
12259c368985SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
12269c368985SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyvtx,   PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
12279c368985SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
12289c368985SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyelems, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
12299c368985SVijay Mahadevan #endif
12309c368985SVijay Mahadevan 
12319c368985SVijay Mahadevan   }
123249d66b22SVijay Mahadevan   PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyfaces->size(), dmmoab->bndyelems->size());
1233a044f6b6SVijay Mahadevan 
1234a044f6b6SVijay Mahadevan   /* Get the material sets and populate the data for all locally owned elements */
1235a044f6b6SVijay Mahadevan   {
1236a044f6b6SVijay Mahadevan     ierr = PetscCalloc1(dmmoab->elocal->size(), &dmmoab->materials);CHKERRQ(ierr);
1237a044f6b6SVijay Mahadevan     /* Get the count of entities of particular type from dmmoab->elocal
1238a044f6b6SVijay Mahadevan        -- Then, for each non-zero type, loop through and query the fileset to get the material tag data */
1239a044f6b6SVijay Mahadevan     moab::Range msets;
1240a044f6b6SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_type_and_tag(dmmoab->fileset, moab::MBENTITYSET, &dmmoab->material_tag, NULL, 1, msets, moab::Interface::UNION);MB_CHK_ERR(merr);
1241a044f6b6SVijay Mahadevan     if (msets.size() == 0) {
1242a044f6b6SVijay Mahadevan       PetscInfo(NULL, "No material sets found in the fileset.");
1243a044f6b6SVijay Mahadevan     }
1244a044f6b6SVijay Mahadevan 
1245a044f6b6SVijay Mahadevan     for (unsigned i=0; i < msets.size(); ++i) {
1246a044f6b6SVijay Mahadevan       moab::Range msetelems;
1247a044f6b6SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(msets[i], dmmoab->dim, msetelems, true);MB_CHK_ERR(merr);
1248aedf4482SVijay Mahadevan #ifdef MOAB_HAVE_MPI
1249aedf4482SVijay Mahadevan       /* filter all the non-owned and shared entities out of the list */
1250aedf4482SVijay Mahadevan       merr = dmmoab->pcomm->filter_pstatus(msetelems, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
1251aedf4482SVijay Mahadevan #endif
1252a044f6b6SVijay Mahadevan 
1253a044f6b6SVijay Mahadevan       int partID;
1254a044f6b6SVijay Mahadevan       moab::EntityHandle mset=msets[i];
1255a044f6b6SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &mset, 1, &partID);MB_CHK_ERR(merr);
1256a044f6b6SVijay Mahadevan 
1257a044f6b6SVijay Mahadevan       for (unsigned j=0; j < msetelems.size(); ++j)
1258a044f6b6SVijay Mahadevan         dmmoab->materials[dmmoab->elocal->index(msetelems[j])]=partID;
1259a044f6b6SVijay Mahadevan     }
1260a044f6b6SVijay Mahadevan   }
1261a044f6b6SVijay Mahadevan 
1262f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1263f6829af0SVijay Mahadevan }
1264f6829af0SVijay Mahadevan 
1265304006b3SVijay Mahadevan 
1266cab5ea25SPierre Jolivet /*@C
1267304006b3SVijay Mahadevan   DMMoabCreateVertices - Creates and adds several vertices to the primary set represented by the DM.
1268304006b3SVijay Mahadevan 
1269d083f849SBarry Smith   Collective
1270304006b3SVijay Mahadevan 
1271304006b3SVijay Mahadevan   Input Parameters:
1272304006b3SVijay Mahadevan + dm - The DM object
1273304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra)
1274304006b3SVijay Mahadevan . conn - The connectivity of the element
1275a2b725a8SWilliam Gropp - nverts - The number of vertices that form the element
1276304006b3SVijay Mahadevan 
1277304006b3SVijay Mahadevan   Output Parameter:
1278304006b3SVijay Mahadevan . overts  - The list of vertices that were created (can be NULL)
1279304006b3SVijay Mahadevan 
1280304006b3SVijay Mahadevan   Level: beginner
1281304006b3SVijay Mahadevan 
1282304006b3SVijay Mahadevan .seealso: DMMoabCreateSubmesh(), DMMoabCreateElement()
1283304006b3SVijay Mahadevan @*/
1284304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateVertices(DM dm, const PetscReal* coords, PetscInt nverts, moab::Range* overts)
1285304006b3SVijay Mahadevan {
1286304006b3SVijay Mahadevan   moab::ErrorCode     merr;
1287304006b3SVijay Mahadevan   DM_Moab            *dmmoab;
1288304006b3SVijay Mahadevan   moab::Range         verts;
1289304006b3SVijay Mahadevan 
1290304006b3SVijay Mahadevan   PetscFunctionBegin;
1291304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1292304006b3SVijay Mahadevan   PetscValidPointer(coords, 2);
1293304006b3SVijay Mahadevan 
1294304006b3SVijay Mahadevan   dmmoab = (DM_Moab*) dm->data;
1295304006b3SVijay Mahadevan 
1296304006b3SVijay Mahadevan   /* Insert new points */
1297304006b3SVijay Mahadevan   merr = dmmoab->mbiface->create_vertices(&coords[0], nverts, verts); MBERRNM(merr);
1298304006b3SVijay Mahadevan   merr = dmmoab->mbiface->add_entities(dmmoab->fileset, verts); MBERRNM(merr);
1299304006b3SVijay Mahadevan 
1300304006b3SVijay Mahadevan   if (overts) *overts = verts;
1301304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1302304006b3SVijay Mahadevan }
1303304006b3SVijay Mahadevan 
1304304006b3SVijay Mahadevan 
1305cab5ea25SPierre Jolivet /*@C
1306304006b3SVijay Mahadevan   DMMoabCreateElement - Adds an element of specified type to the primary set represented by the DM.
1307304006b3SVijay Mahadevan 
1308d083f849SBarry Smith   Collective
1309304006b3SVijay Mahadevan 
1310304006b3SVijay Mahadevan   Input Parameters:
1311304006b3SVijay Mahadevan + dm - The DM object
1312304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra)
1313304006b3SVijay Mahadevan . conn - The connectivity of the element
1314a2b725a8SWilliam Gropp - nverts - The number of vertices that form the element
1315304006b3SVijay Mahadevan 
1316304006b3SVijay Mahadevan   Output Parameter:
1317304006b3SVijay Mahadevan . oelem  - The handle to the element created and added to the DM object
1318304006b3SVijay Mahadevan 
1319304006b3SVijay Mahadevan   Level: beginner
1320304006b3SVijay Mahadevan 
1321304006b3SVijay Mahadevan .seealso: DMMoabCreateSubmesh(), DMMoabCreateVertices()
1322304006b3SVijay Mahadevan @*/
1323304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateElement(DM dm, const moab::EntityType type, const moab::EntityHandle* conn, PetscInt nverts, moab::EntityHandle* oelem)
1324304006b3SVijay Mahadevan {
1325304006b3SVijay Mahadevan   moab::ErrorCode     merr;
1326304006b3SVijay Mahadevan   DM_Moab            *dmmoab;
1327304006b3SVijay Mahadevan   moab::EntityHandle  elem;
1328304006b3SVijay Mahadevan 
1329304006b3SVijay Mahadevan   PetscFunctionBegin;
1330304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1331304006b3SVijay Mahadevan   PetscValidPointer(conn, 3);
1332304006b3SVijay Mahadevan 
1333304006b3SVijay Mahadevan   dmmoab = (DM_Moab*) dm->data;
1334304006b3SVijay Mahadevan 
1335304006b3SVijay Mahadevan   /* Insert new element */
1336304006b3SVijay Mahadevan   merr = dmmoab->mbiface->create_element(type, conn, nverts, elem); MBERRNM(merr);
1337304006b3SVijay Mahadevan   merr = dmmoab->mbiface->add_entities(dmmoab->fileset, &elem, 1); MBERRNM(merr);
1338304006b3SVijay Mahadevan 
1339304006b3SVijay Mahadevan   if (oelem) *oelem = elem;
1340304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1341304006b3SVijay Mahadevan }
1342304006b3SVijay Mahadevan 
1343304006b3SVijay Mahadevan 
1344cab5ea25SPierre Jolivet /*@C
1345304006b3SVijay Mahadevan   DMMoabCreateSubmesh - Creates a sub-DM object with a set that contains all vertices/elements of the parent
1346304006b3SVijay Mahadevan   in addition to providing support for dynamic mesh modifications. This is useful for AMR calculations to
1347304006b3SVijay Mahadevan   create a DM object on a refined level.
1348304006b3SVijay Mahadevan 
1349d083f849SBarry Smith   Collective
1350304006b3SVijay Mahadevan 
1351304006b3SVijay Mahadevan   Input Parameters:
1352a2b725a8SWilliam Gropp . dm - The DM object
1353304006b3SVijay Mahadevan 
1354304006b3SVijay Mahadevan   Output Parameter:
1355304006b3SVijay Mahadevan . newdm  - The sub DM object with updated set information
1356304006b3SVijay Mahadevan 
1357304006b3SVijay Mahadevan   Level: advanced
1358304006b3SVijay Mahadevan 
1359304006b3SVijay Mahadevan .seealso: DMCreate(), DMMoabCreateVertices(), DMMoabCreateElement()
1360304006b3SVijay Mahadevan @*/
1361304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateSubmesh(DM dm, DM *newdm)
1362304006b3SVijay Mahadevan {
1363304006b3SVijay Mahadevan   DM_Moab            *dmmoab;
1364304006b3SVijay Mahadevan   DM_Moab            *ndmmoab;
1365304006b3SVijay Mahadevan   moab::ErrorCode    merr;
1366304006b3SVijay Mahadevan   PetscErrorCode     ierr;
1367304006b3SVijay Mahadevan 
1368304006b3SVijay Mahadevan   PetscFunctionBegin;
1369304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1370304006b3SVijay Mahadevan 
1371304006b3SVijay Mahadevan   dmmoab = (DM_Moab*) dm->data;
1372304006b3SVijay Mahadevan 
1373304006b3SVijay Mahadevan   /* Create the basic DMMoab object and keep the default parameters created by DM impls */
13749daf19fdSVijay Mahadevan   ierr = DMMoabCreateMoab(((PetscObject)dm)->comm, dmmoab->mbiface, &dmmoab->ltog_tag, PETSC_NULL, newdm);CHKERRQ(ierr);
1375304006b3SVijay Mahadevan 
1376304006b3SVijay Mahadevan   /* get all the necessary handles from the private DM object */
1377304006b3SVijay Mahadevan   ndmmoab = (DM_Moab*) (*newdm)->data;
1378304006b3SVijay Mahadevan 
1379304006b3SVijay Mahadevan   /* set the sub-mesh's parent DM reference */
1380304006b3SVijay Mahadevan   ndmmoab->parent = &dm;
1381304006b3SVijay Mahadevan 
1382304006b3SVijay Mahadevan   /* create a file set to associate all entities in current mesh */
1383304006b3SVijay Mahadevan   merr = ndmmoab->mbiface->create_meshset(moab::MESHSET_SET, ndmmoab->fileset); MBERR("Creating file set failed", merr);
1384304006b3SVijay Mahadevan 
1385304006b3SVijay Mahadevan   /* create a meshset and then add old fileset as child */
1386304006b3SVijay Mahadevan   merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->vlocal); MBERR("Adding child vertices to parent failed", merr);
1387304006b3SVijay Mahadevan   merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->elocal); MBERR("Adding child elements to parent failed", merr);
1388304006b3SVijay Mahadevan 
1389304006b3SVijay Mahadevan   /* preserve the field association between the parent and sub-mesh objects */
1390304006b3SVijay Mahadevan   ierr = DMMoabSetFieldNames(*newdm, dmmoab->numFields, dmmoab->fieldNames);CHKERRQ(ierr);
1391304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1392304006b3SVijay Mahadevan }
1393304006b3SVijay Mahadevan 
1394304006b3SVijay Mahadevan 
1395304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_Ascii(DM dm, PetscViewer viewer)
1396304006b3SVijay Mahadevan {
1397304006b3SVijay Mahadevan   DM_Moab          *dmmoab = (DM_Moab*)(dm)->data;
1398304006b3SVijay Mahadevan   const char       *name;
1399304006b3SVijay Mahadevan   MPI_Comm          comm;
1400304006b3SVijay Mahadevan   PetscMPIInt       size;
1401304006b3SVijay Mahadevan   PetscErrorCode    ierr;
1402304006b3SVijay Mahadevan 
1403304006b3SVijay Mahadevan   PetscFunctionBegin;
1404304006b3SVijay Mahadevan   ierr = PetscObjectGetComm((PetscObject)dm, &comm);CHKERRQ(ierr);
1405304006b3SVijay Mahadevan   ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr);
1406304006b3SVijay Mahadevan   ierr = PetscObjectGetName((PetscObject) dm, &name);CHKERRQ(ierr);
1407304006b3SVijay Mahadevan   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1408304006b3SVijay Mahadevan   if (name) {ierr = PetscViewerASCIIPrintf(viewer, "%s in %D dimensions:\n", name, dmmoab->dim);CHKERRQ(ierr);}
1409304006b3SVijay Mahadevan   else      {ierr = PetscViewerASCIIPrintf(viewer, "Mesh in %D dimensions:\n", dmmoab->dim);CHKERRQ(ierr);}
1410304006b3SVijay Mahadevan   /* print details about the global mesh */
1411304006b3SVijay Mahadevan   {
1412304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
14139c368985SVijay Mahadevan     ierr = PetscViewerASCIIPrintf(viewer, "Sizes: cells=%D, vertices=%D, blocks=%D\n", dmmoab->nele, dmmoab->n, dmmoab->bs);CHKERRQ(ierr);
1414304006b3SVijay Mahadevan     /* print boundary data */
1415304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPrintf(viewer, "Boundary trace:\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size());CHKERRQ(ierr);
1416304006b3SVijay Mahadevan     {
1417304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1418304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPrintf(viewer, "cells=%D, faces=%D, vertices=%D\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size());CHKERRQ(ierr);
1419304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1420304006b3SVijay Mahadevan     }
1421304006b3SVijay Mahadevan     /* print field data */
1422304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPrintf(viewer, "Fields: %D components\n", dmmoab->numFields);CHKERRQ(ierr);
1423304006b3SVijay Mahadevan     {
1424304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1425304006b3SVijay Mahadevan       for (int i = 0; i < dmmoab->numFields; ++i) {
1426304006b3SVijay Mahadevan         ierr = PetscViewerASCIIPrintf(viewer, "[%D] - %s\n", i, dmmoab->fieldNames[i]);CHKERRQ(ierr);
1427304006b3SVijay Mahadevan       }
1428304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1429304006b3SVijay Mahadevan     }
1430304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1431304006b3SVijay Mahadevan   }
1432304006b3SVijay Mahadevan   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1433304006b3SVijay Mahadevan   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
1434304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1435304006b3SVijay Mahadevan }
1436304006b3SVijay Mahadevan 
1437304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_VTK(DM dm, PetscViewer v)
1438304006b3SVijay Mahadevan {
1439304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1440304006b3SVijay Mahadevan }
1441304006b3SVijay Mahadevan 
1442304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_HDF5(DM dm, PetscViewer v)
1443304006b3SVijay Mahadevan {
1444304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1445304006b3SVijay Mahadevan }
1446304006b3SVijay Mahadevan 
1447304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMView_Moab(DM dm, PetscViewer viewer)
1448304006b3SVijay Mahadevan {
1449304006b3SVijay Mahadevan   PetscBool      iascii, ishdf5, isvtk;
1450304006b3SVijay Mahadevan   PetscErrorCode ierr;
1451304006b3SVijay Mahadevan 
1452304006b3SVijay Mahadevan   PetscFunctionBegin;
1453304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1454304006b3SVijay Mahadevan   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
1455304006b3SVijay Mahadevan   ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr);
1456304006b3SVijay Mahadevan   ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERVTK,   &isvtk);CHKERRQ(ierr);
1457304006b3SVijay Mahadevan   ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERHDF5,  &ishdf5);CHKERRQ(ierr);
1458304006b3SVijay Mahadevan   if (iascii) {
1459304006b3SVijay Mahadevan     ierr = DMMoabView_Ascii(dm, viewer);CHKERRQ(ierr);
1460304006b3SVijay Mahadevan   } else if (ishdf5) {
1461304006b3SVijay Mahadevan #if defined(PETSC_HAVE_HDF5) && defined(MOAB_HAVE_HDF5)
1462304006b3SVijay Mahadevan     ierr = PetscViewerPushFormat(viewer, PETSC_VIEWER_HDF5_VIZ);CHKERRQ(ierr);
1463304006b3SVijay Mahadevan     ierr = DMMoabView_HDF5(dm, viewer);CHKERRQ(ierr);
1464304006b3SVijay Mahadevan     ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
1465304006b3SVijay Mahadevan #else
1466304006b3SVijay Mahadevan     SETERRQ(PetscObjectComm((PetscObject) dm), PETSC_ERR_SUP, "HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5");
1467304006b3SVijay Mahadevan #endif
1468304006b3SVijay Mahadevan   }
1469304006b3SVijay Mahadevan   else if (isvtk) {
1470304006b3SVijay Mahadevan     ierr = DMMoabView_VTK(dm, viewer);CHKERRQ(ierr);
1471304006b3SVijay Mahadevan   }
1472304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1473304006b3SVijay Mahadevan }
1474304006b3SVijay Mahadevan 
1475304006b3SVijay Mahadevan 
1476304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMInitialize_Moab(DM dm)
1477304006b3SVijay Mahadevan {
1478304006b3SVijay Mahadevan   PetscFunctionBegin;
1479304006b3SVijay Mahadevan   dm->ops->view                            = DMView_Moab;
1480304006b3SVijay Mahadevan   dm->ops->load                            = NULL /* DMLoad_Moab */;
1481304006b3SVijay Mahadevan   dm->ops->setfromoptions                  = DMSetFromOptions_Moab;
1482304006b3SVijay Mahadevan   dm->ops->clone                           = DMClone_Moab;
1483304006b3SVijay Mahadevan   dm->ops->setup                           = DMSetUp_Moab;
14841bb6d2a8SBarry Smith   dm->ops->createlocalsection            = NULL;
1485304006b3SVijay Mahadevan   dm->ops->createdefaultconstraints        = NULL;
1486304006b3SVijay Mahadevan   dm->ops->createglobalvector              = DMCreateGlobalVector_Moab;
1487304006b3SVijay Mahadevan   dm->ops->createlocalvector               = DMCreateLocalVector_Moab;
1488304006b3SVijay Mahadevan   dm->ops->getlocaltoglobalmapping         = NULL;
1489304006b3SVijay Mahadevan   dm->ops->createfieldis                   = NULL;
1490304006b3SVijay Mahadevan   dm->ops->createcoordinatedm              = NULL /* DMCreateCoordinateDM_Moab */;
1491304006b3SVijay Mahadevan   dm->ops->getcoloring                     = NULL;
1492304006b3SVijay Mahadevan   dm->ops->creatematrix                    = DMCreateMatrix_Moab;
1493304006b3SVijay Mahadevan   dm->ops->createinterpolation             = DMCreateInterpolation_Moab;
14945a84ad33SLisandro Dalcin   dm->ops->createinjection                 = NULL /* DMCreateInjection_Moab */;
1495304006b3SVijay Mahadevan   dm->ops->refine                          = DMRefine_Moab;
1496304006b3SVijay Mahadevan   dm->ops->coarsen                         = DMCoarsen_Moab;
1497304006b3SVijay Mahadevan   dm->ops->refinehierarchy                 = DMRefineHierarchy_Moab;
1498304006b3SVijay Mahadevan   dm->ops->coarsenhierarchy                = DMCoarsenHierarchy_Moab;
1499304006b3SVijay Mahadevan   dm->ops->globaltolocalbegin              = DMGlobalToLocalBegin_Moab;
1500304006b3SVijay Mahadevan   dm->ops->globaltolocalend                = DMGlobalToLocalEnd_Moab;
1501304006b3SVijay Mahadevan   dm->ops->localtoglobalbegin              = DMLocalToGlobalBegin_Moab;
1502304006b3SVijay Mahadevan   dm->ops->localtoglobalend                = DMLocalToGlobalEnd_Moab;
1503304006b3SVijay Mahadevan   dm->ops->destroy                         = DMDestroy_Moab;
1504304006b3SVijay Mahadevan   dm->ops->createsubdm                     = NULL /* DMCreateSubDM_Moab */;
1505304006b3SVijay Mahadevan   dm->ops->getdimpoints                    = NULL /* DMGetDimPoints_Moab */;
1506304006b3SVijay Mahadevan   dm->ops->locatepoints                    = NULL /* DMLocatePoints_Moab */;
1507304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1508304006b3SVijay Mahadevan }
1509304006b3SVijay Mahadevan 
1510304006b3SVijay Mahadevan 
1511304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm)
1512304006b3SVijay Mahadevan {
1513304006b3SVijay Mahadevan   PetscErrorCode     ierr;
1514304006b3SVijay Mahadevan 
1515304006b3SVijay Mahadevan   PetscFunctionBegin;
1516304006b3SVijay Mahadevan   /* get all the necessary handles from the private DM object */
1517304006b3SVijay Mahadevan   (*newdm)->data = (DM_Moab*) dm->data;
1518304006b3SVijay Mahadevan   ((DM_Moab*)dm->data)->refct++;
1519304006b3SVijay Mahadevan 
1520d57f96a3SLisandro Dalcin   ierr = PetscObjectChangeTypeName((PetscObject) *newdm, DMMOAB);CHKERRQ(ierr);
1521304006b3SVijay Mahadevan   ierr = DMInitialize_Moab(*newdm);CHKERRQ(ierr);
1522304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1523304006b3SVijay Mahadevan }
1524304006b3SVijay Mahadevan 
1525304006b3SVijay Mahadevan 
1526f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
1527f6829af0SVijay Mahadevan {
1528f6829af0SVijay Mahadevan   PetscErrorCode ierr;
1529f6829af0SVijay Mahadevan 
1530f6829af0SVijay Mahadevan   PetscFunctionBegin;
1531f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1532f90c3b0eSVijay Mahadevan   ierr = PetscNewLog(dm, (DM_Moab**)&dm->data);CHKERRQ(ierr);
1533f6829af0SVijay Mahadevan 
1534f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
1535f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->numFields = 1;
1536f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
1537f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
1538f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
1539f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
1540f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
1541f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleghost = 0;
1542c528d872SBarry Smith   ((DM_Moab*)dm->data)->ltog_map = NULL;
1543c528d872SBarry Smith   ((DM_Moab*)dm->data)->ltog_sendrecv = NULL;
1544f6829af0SVijay Mahadevan 
1545304006b3SVijay Mahadevan   ((DM_Moab*)dm->data)->refct = 1;
1546304006b3SVijay Mahadevan   ((DM_Moab*)dm->data)->parent = NULL;
1547f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
1548f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
1549f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
1550f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
1551f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
1552f6829af0SVijay Mahadevan 
1553304006b3SVijay Mahadevan   ierr = DMInitialize_Moab(dm);CHKERRQ(ierr);
1554f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1555f6829af0SVijay Mahadevan }
1556f6829af0SVijay Mahadevan 
1557