xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 98921bda46e76d7aaed9e0138c5ff9d0ce93f355)
1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I  "petscdmmoab.h"   I*/
21d72bce8STim Tautges 
31d72bce8STim Tautges #include <petscdmmoab.h>
488face26SJed Brown #include <MBTagConventions.hpp>
59daf19fdSVijay Mahadevan #include <moab/NestedRefine.hpp>
61cec0304SVijay Mahadevan #include <moab/Skinner.hpp>
7032b8ab6SVijay Mahadevan 
8c6ef30f9SVijay Mahadevan /*MC
9c6ef30f9SVijay Mahadevan   DMMOAB = "moab" - A DM object that encapsulates an unstructured mesh described by the MOAB mesh database.
10c6ef30f9SVijay Mahadevan                     Direct access to the MOAB Interface and other mesh manipulation related objects are available
11c6ef30f9SVijay Mahadevan                     through public API. Ability to create global and local representation of Vecs containing all
12c6ef30f9SVijay Mahadevan                     unknowns in the interior and shared boundary via a transparent tag-data wrapper is provided
13c6ef30f9SVijay Mahadevan                     along with utility functions to traverse the mesh and assemble a discrete system via
14c6ef30f9SVijay Mahadevan                     field-based/blocked Vec(Get/Set) methods. Input from and output to different formats are
15c6ef30f9SVijay Mahadevan                     available.
16c6ef30f9SVijay Mahadevan 
17a8d69d7bSBarry Smith   Reference: https://www.mcs.anl.gov/~fathom/moab-docs/html/contents.html
18c6ef30f9SVijay Mahadevan 
19c6ef30f9SVijay Mahadevan   Level: intermediate
20c6ef30f9SVijay Mahadevan 
21c6ef30f9SVijay Mahadevan .seealso: DMType, DMMoabCreate(), DMCreate(), DMSetType(), DMMoabCreateMoab()
22c6ef30f9SVijay Mahadevan M*/
23c6ef30f9SVijay Mahadevan 
24304006b3SVijay Mahadevan /* External function declarations here */
25304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInterpolation_Moab(DM dmCoarse, DM dmFine, Mat *interpolation, Vec *scaling);
26304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateDefaultConstraints_Moab(DM dm);
27304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm,  Mat *J);
28304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateCoordinateDM_Moab(DM dm, DM *cdm);
29304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefine_Moab(DM dm, MPI_Comm comm, DM *dmRefined);
30304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsen_Moab(DM dm, MPI_Comm comm, DM *dmCoarsened);
31304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefineHierarchy_Moab(DM dm, PetscInt nlevels, DM dmRefined[]);
32304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsenHierarchy_Moab(DM dm, PetscInt nlevels, DM dmCoarsened[]);
33304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm);
34304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateGlobalVector_Moab(DM, Vec *);
35304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateLocalVector_Moab(DM, Vec *);
36304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm, Mat *J);
37304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalBegin_Moab(DM, Vec, InsertMode, Vec);
38304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalEnd_Moab(DM, Vec, InsertMode, Vec);
39304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalBegin_Moab(DM, Vec, InsertMode, Vec);
40304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalEnd_Moab(DM, Vec, InsertMode, Vec);
41304006b3SVijay Mahadevan 
42304006b3SVijay Mahadevan /* Un-implemented routines */
43304006b3SVijay Mahadevan /*
441bb6d2a8SBarry Smith PETSC_EXTERN PetscErrorCode DMCreatelocalsection_Moab(DM dm);
45304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInjection_Moab(DM dmCoarse, DM dmFine, Mat *mat);
46304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLoad_Moab(DM dm, PetscViewer viewer);
47304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGetDimPoints_Moab(DM dm, PetscInt dim, PetscInt *pStart, PetscInt *pEnd);
48304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateSubDM_Moab(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm);
49304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocatePoints_Moab(DM dm, Vec v, IS *cellIS);
50304006b3SVijay Mahadevan */
51c6ef30f9SVijay Mahadevan 
52cab5ea25SPierre Jolivet /*@C
531d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
541d72bce8STim Tautges 
55d083f849SBarry Smith   Collective
561d72bce8STim Tautges 
571d72bce8STim Tautges   Input Parameter:
581d72bce8STim Tautges . comm - The communicator for the DMMoab object
591d72bce8STim Tautges 
601d72bce8STim Tautges   Output Parameter:
61032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
621d72bce8STim Tautges 
631d72bce8STim Tautges   Level: beginner
641d72bce8STim Tautges 
651d72bce8STim Tautges @*/
66032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
671d72bce8STim Tautges {
681d72bce8STim Tautges   PetscErrorCode ierr;
691d72bce8STim Tautges 
701d72bce8STim Tautges   PetscFunctionBegin;
71032b8ab6SVijay Mahadevan   PetscValidPointer(dmb, 2);
72032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
73032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
741d72bce8STim Tautges   PetscFunctionReturn(0);
751d72bce8STim Tautges }
761d72bce8STim Tautges 
77cab5ea25SPierre Jolivet /*@C
78b117cd09SVijay Mahadevan   DMMoabCreateMoab - Creates a DMMoab object, optionally from an instance and other data
791d72bce8STim Tautges 
80d083f849SBarry Smith   Collective
811d72bce8STim Tautges 
82d8d19677SJose E. Roman   Input Parameters:
83a2b725a8SWilliam Gropp + comm - The communicator for the DMMoab object
84032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
85a4d2169cSTim Tautges          along with the DMMoab
861d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
87a2b725a8SWilliam Gropp - range - If non-NULL, contains range of entities to which DOFs will be assigned
881d72bce8STim Tautges 
891d72bce8STim Tautges   Output Parameter:
90032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
911d72bce8STim Tautges 
92032b8ab6SVijay Mahadevan   Level: intermediate
931d72bce8STim Tautges 
941d72bce8STim Tautges @*/
959daf19fdSVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
961d72bce8STim Tautges {
971d72bce8STim Tautges   PetscErrorCode ierr;
98032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
9985d305f5SVijay Mahadevan   DM             dmmb;
100853cdec3SJed Brown   DM_Moab        *dmmoab;
1011d72bce8STim Tautges 
1021d72bce8STim Tautges   PetscFunctionBegin;
103032b8ab6SVijay Mahadevan   PetscValidPointer(dmb, 6);
10485d305f5SVijay Mahadevan 
10585d305f5SVijay Mahadevan   ierr = DMMoabCreate(comm, &dmmb);CHKERRQ(ierr);
10685d305f5SVijay Mahadevan   dmmoab = (DM_Moab*)(dmmb)->data;
107a4d2169cSTim Tautges 
108a4d2169cSTim Tautges   if (!mbiface) {
10972ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
1107d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
1111d72bce8STim Tautges   }
1121cec0304SVijay Mahadevan   else {
1131cec0304SVijay Mahadevan     dmmoab->mbiface = mbiface;
1147d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
1151cec0304SVijay Mahadevan   }
1161cec0304SVijay Mahadevan 
117b5410836SVijay Mahadevan   /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */
118b5410836SVijay Mahadevan   dmmoab->fileset = 0;
119b117cd09SVijay Mahadevan   dmmoab->hlevel = 0;
12049d66b22SVijay Mahadevan   dmmoab->nghostrings = 0;
1217d89fc02STim Tautges 
1229daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1239daf19fdSVijay Mahadevan   moab::EntityHandle partnset;
124032b8ab6SVijay Mahadevan 
125db66d124SVijay Mahadevan   /* Create root sets for each mesh.  Then pass these
126db66d124SVijay Mahadevan       to the load_file functions to be populated. */
1270c8a2322SVijay Mahadevan   merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset); MBERR("Creating partition set failed", merr);
128032b8ab6SVijay Mahadevan 
129db66d124SVijay Mahadevan   /* Create the parallel communicator object with the partition handle associated with MOAB */
13072ff976dSVijay Mahadevan   dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
1319daf19fdSVijay Mahadevan #endif
132032b8ab6SVijay Mahadevan 
1334973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
1344973de03SVijay Mahadevan   dmmoab->bs = 1;
135addae81cSVijay Mahadevan   dmmoab->numFields = 1;
1363f1c6e43SVijay Mahadevan   ierr = PetscMalloc(dmmoab->numFields * sizeof(char*), &dmmoab->fieldNames);CHKERRQ(ierr);
1373f1c6e43SVijay Mahadevan   ierr = PetscStrallocpy("DEFAULT", (char**) &dmmoab->fieldNames[0]);CHKERRQ(ierr);
1382e4e7c01SVijay Mahadevan   dmmoab->rw_dbglevel = 0;
1392e4e7c01SVijay Mahadevan   dmmoab->partition_by_rank = PETSC_FALSE;
1402e4e7c01SVijay Mahadevan   dmmoab->extra_read_options[0] = '\0';
1412e4e7c01SVijay Mahadevan   dmmoab->extra_write_options[0] = '\0';
1422e4e7c01SVijay Mahadevan   dmmoab->read_mode = READ_PART;
1432e4e7c01SVijay Mahadevan   dmmoab->write_mode = WRITE_PART;
1444973de03SVijay Mahadevan 
1454973de03SVijay Mahadevan   /* set global ID tag handle */
1461a845d2aSVijay Mahadevan   if (ltog_tag && *ltog_tag) {
14785d305f5SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag);CHKERRQ(ierr);
148032b8ab6SVijay Mahadevan   }
149032b8ab6SVijay Mahadevan   else {
1501a845d2aSVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag); MBERRNM(merr);
1511a845d2aSVijay Mahadevan     if (ltog_tag) *ltog_tag = dmmoab->ltog_tag;
152a4d2169cSTim Tautges   }
153a4d2169cSTim Tautges 
154340f3b9aSVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag); MBERRNM(merr);
155340f3b9aSVijay Mahadevan 
1564973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
157a4d2169cSTim Tautges   if (range) {
15885d305f5SVijay Mahadevan     ierr = DMMoabSetLocalVertices(dmmb, range);CHKERRQ(ierr);
159a4d2169cSTim Tautges   }
16085d305f5SVijay Mahadevan   *dmb = dmmb;
1611d72bce8STim Tautges   PetscFunctionReturn(0);
1621d72bce8STim Tautges }
1631d72bce8STim Tautges 
1649daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1651d72bce8STim Tautges 
166cab5ea25SPierre Jolivet /*@C
167aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
168aa768e4cSTim Tautges 
169d083f849SBarry Smith   Collective
170aa768e4cSTim Tautges 
171aa768e4cSTim Tautges   Input Parameter:
172aa768e4cSTim Tautges . dm    - The DMMoab object being set
173aa768e4cSTim Tautges 
174aa768e4cSTim Tautges   Output Parameter:
175aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
176aa768e4cSTim Tautges 
177aa768e4cSTim Tautges   Level: beginner
178aa768e4cSTim Tautges 
179aa768e4cSTim Tautges @*/
1801d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm, moab::ParallelComm **pcomm)
1811d72bce8STim Tautges {
1821d72bce8STim Tautges   PetscFunctionBegin;
1831d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
184032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
1851d72bce8STim Tautges   PetscFunctionReturn(0);
1861d72bce8STim Tautges }
1871d72bce8STim Tautges 
1889daf19fdSVijay Mahadevan #endif /* MOAB_HAVE_MPI */
1899daf19fdSVijay Mahadevan 
190cab5ea25SPierre Jolivet /*@C
191aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
192aa768e4cSTim Tautges 
193d083f849SBarry Smith   Collective
194aa768e4cSTim Tautges 
195d8d19677SJose E. Roman   Input Parameters:
196a2b725a8SWilliam Gropp + dm      - The DMMoab object being set
197a2b725a8SWilliam Gropp - mbiface - The MOAB instance being set on this DMMoab
198aa768e4cSTim Tautges 
199aa768e4cSTim Tautges   Level: beginner
200aa768e4cSTim Tautges 
201aa768e4cSTim Tautges @*/
202a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm, moab::Interface *mbiface)
2031d72bce8STim Tautges {
204032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
205032b8ab6SVijay Mahadevan 
2061d72bce8STim Tautges   PetscFunctionBegin;
2071d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2081cec0304SVijay Mahadevan   PetscValidPointer(mbiface, 2);
2099daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
210032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
2119daf19fdSVijay Mahadevan #endif
212032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
213032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
2141d72bce8STim Tautges   PetscFunctionReturn(0);
2151d72bce8STim Tautges }
2161d72bce8STim Tautges 
217cab5ea25SPierre Jolivet /*@C
218aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
219aa768e4cSTim Tautges 
220d083f849SBarry Smith   Collective
221aa768e4cSTim Tautges 
222aa768e4cSTim Tautges   Input Parameter:
223aa768e4cSTim Tautges . dm      - The DMMoab object being set
224aa768e4cSTim Tautges 
225aa768e4cSTim Tautges   Output Parameter:
226aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
227aa768e4cSTim Tautges 
228aa768e4cSTim Tautges   Level: beginner
229aa768e4cSTim Tautges 
230aa768e4cSTim Tautges @*/
231a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm, moab::Interface **mbiface)
2321d72bce8STim Tautges {
2339426e041SSatish Balay   PetscErrorCode   ierr;
234cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
235cabb514dSBarry Smith 
2361d72bce8STim Tautges   PetscFunctionBegin;
2371d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
238cabb514dSBarry 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);
239a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
2401d72bce8STim Tautges   PetscFunctionReturn(0);
2411d72bce8STim Tautges }
2421d72bce8STim Tautges 
243cab5ea25SPierre Jolivet /*@C
2445eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
245aa768e4cSTim Tautges 
246d083f849SBarry Smith   Collective
247aa768e4cSTim Tautges 
248d8d19677SJose E. Roman   Input Parameters:
249a2b725a8SWilliam Gropp + dm    - The DMMoab object being set
250a2b725a8SWilliam Gropp - range - The entities treated by this DMMoab
251aa768e4cSTim Tautges 
252aa768e4cSTim Tautges   Level: beginner
253aa768e4cSTim Tautges 
254aa768e4cSTim Tautges @*/
2555eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm, moab::Range *range)
2561d72bce8STim Tautges {
257fd3326ddSVijay Mahadevan   moab::Range     tmpvtxs;
258032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
259032b8ab6SVijay Mahadevan 
2601d72bce8STim Tautges   PetscFunctionBegin;
2611d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
262032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
263032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
264fd3326ddSVijay Mahadevan 
265032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
266fd3326ddSVijay Mahadevan 
2679daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
2689daf19fdSVijay Mahadevan   moab::ErrorCode merr;
269fd3326ddSVijay Mahadevan   /* filter based on parallel status */
270fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned); MBERRNM(merr);
271fd3326ddSVijay Mahadevan 
272fd3326ddSVijay Mahadevan   /* filter all the non-owned and shared entities out of the list */
273fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
274fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(tmpvtxs, PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost); MBERRNM(merr);
275fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost);
276fd3326ddSVijay Mahadevan   *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs);
2779daf19fdSVijay Mahadevan #else
2789daf19fdSVijay Mahadevan   *dmmoab->vowned = *dmmoab->vlocal;
2799daf19fdSVijay Mahadevan #endif
280fd3326ddSVijay Mahadevan 
281fd3326ddSVijay Mahadevan   /* compute and cache the sizes of local and ghosted entities */
282032b8ab6SVijay Mahadevan   dmmoab->nloc = dmmoab->vowned->size();
283032b8ab6SVijay Mahadevan   dmmoab->nghost = dmmoab->vghost->size();
2849daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
2859daf19fdSVijay Mahadevan   PetscErrorCode  ierr;
286820f2d46SBarry Smith   ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRMPI(ierr);
2879daf19fdSVijay Mahadevan #else
2889daf19fdSVijay Mahadevan   dmmoab->n = dmmoab->nloc;
2899daf19fdSVijay Mahadevan #endif
2901d72bce8STim Tautges   PetscFunctionReturn(0);
2911d72bce8STim Tautges }
2921d72bce8STim Tautges 
293cab5ea25SPierre Jolivet /*@C
2948d8d51c8SVijay Mahadevan   DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab
2958d8d51c8SVijay Mahadevan 
296d083f849SBarry Smith   Collective
2978d8d51c8SVijay Mahadevan 
2988d8d51c8SVijay Mahadevan   Input Parameter:
2998d8d51c8SVijay Mahadevan . dm    - The DMMoab object being set
3008d8d51c8SVijay Mahadevan 
3018d8d51c8SVijay Mahadevan   Output Parameter:
3028d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted)
3038d8d51c8SVijay Mahadevan 
3048d8d51c8SVijay Mahadevan   Level: beginner
3058d8d51c8SVijay Mahadevan 
3068d8d51c8SVijay Mahadevan @*/
3078d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm, moab::Range *local)
3088d8d51c8SVijay Mahadevan {
3098d8d51c8SVijay Mahadevan   PetscFunctionBegin;
3108d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
3118d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab*)dm->data)->vlocal;
3128d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
3138d8d51c8SVijay Mahadevan }
3148d8d51c8SVijay Mahadevan 
315cab5ea25SPierre Jolivet /*@C
3165eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
317aa768e4cSTim Tautges 
318d083f849SBarry Smith   Collective
319aa768e4cSTim Tautges 
320aa768e4cSTim Tautges   Input Parameter:
321aa768e4cSTim Tautges . dm    - The DMMoab object being set
322aa768e4cSTim Tautges 
323a2b725a8SWilliam Gropp   Output Parameters:
324a2b725a8SWilliam Gropp + owned - The owned vertex entities in this DMMoab
325a2b725a8SWilliam Gropp - ghost - The ghosted entities (non-owned) stored locally in this partition
326aa768e4cSTim Tautges 
327aa768e4cSTim Tautges   Level: beginner
328aa768e4cSTim Tautges 
329aa768e4cSTim Tautges @*/
330351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm, const moab::Range **owned, const moab::Range **ghost)
3311d72bce8STim Tautges {
3321d72bce8STim Tautges   PetscFunctionBegin;
3331d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
334351b8a77SVijay Mahadevan   if (owned) *owned = ((DM_Moab*)dm->data)->vowned;
335351b8a77SVijay Mahadevan   if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost;
3361d72bce8STim Tautges   PetscFunctionReturn(0);
3371d72bce8STim Tautges }
3381d72bce8STim Tautges 
339cab5ea25SPierre Jolivet /*@C
3405eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
3415eb88e9dSVijay Mahadevan 
342d083f849SBarry Smith   Collective
3435eb88e9dSVijay Mahadevan 
3445eb88e9dSVijay Mahadevan   Input Parameter:
3455eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
3465eb88e9dSVijay Mahadevan 
3475eb88e9dSVijay Mahadevan   Output Parameter:
3485eb88e9dSVijay Mahadevan . range - The entities owned locally
3495eb88e9dSVijay Mahadevan 
3505eb88e9dSVijay Mahadevan   Level: beginner
3515eb88e9dSVijay Mahadevan 
3525eb88e9dSVijay Mahadevan @*/
353351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm, const moab::Range **range)
3545eb88e9dSVijay Mahadevan {
3555eb88e9dSVijay Mahadevan   PetscFunctionBegin;
3565eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
357351b8a77SVijay Mahadevan   if (range) *range = ((DM_Moab*)dm->data)->elocal;
3581cec0304SVijay Mahadevan   PetscFunctionReturn(0);
3591cec0304SVijay Mahadevan }
3601cec0304SVijay Mahadevan 
361cab5ea25SPierre Jolivet /*@C
3621cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
3631cec0304SVijay Mahadevan 
364d083f849SBarry Smith   Collective
3651cec0304SVijay Mahadevan 
366a2b725a8SWilliam Gropp   Input Parameters:
367a2b725a8SWilliam Gropp + dm    - The DMMoab object being set
368a2b725a8SWilliam Gropp - range - The entities treated by this DMMoab
3691cec0304SVijay Mahadevan 
3701cec0304SVijay Mahadevan   Level: beginner
3711cec0304SVijay Mahadevan 
3721cec0304SVijay Mahadevan @*/
3731cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm, moab::Range *range)
3741cec0304SVijay Mahadevan {
3751cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
3761cec0304SVijay Mahadevan 
3771cec0304SVijay Mahadevan   PetscFunctionBegin;
3781cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
3791cec0304SVijay Mahadevan   dmmoab->elocal->clear();
3801cec0304SVijay Mahadevan   dmmoab->eghost->clear();
3811cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
3829daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
3839daf19fdSVijay Mahadevan   moab::ErrorCode merr;
3841cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
3851cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
3869daf19fdSVijay Mahadevan #endif
3871cec0304SVijay Mahadevan   dmmoab->neleloc = dmmoab->elocal->size();
38841dd5348SVijay Mahadevan   dmmoab->neleghost = dmmoab->eghost->size();
3899daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
3909daf19fdSVijay Mahadevan   PetscErrorCode  ierr;
391820f2d46SBarry Smith   ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRMPI(ierr);
3928cbae1a6SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele);
3939daf19fdSVijay Mahadevan #else
3949daf19fdSVijay Mahadevan   dmmoab->nele = dmmoab->neleloc;
3959daf19fdSVijay Mahadevan #endif
3965eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
3975eb88e9dSVijay Mahadevan }
3985eb88e9dSVijay Mahadevan 
399cab5ea25SPierre Jolivet /*@C
400aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
401aa768e4cSTim Tautges 
402d083f849SBarry Smith   Collective
403aa768e4cSTim Tautges 
404a2b725a8SWilliam Gropp   Input Parameters:
405a2b725a8SWilliam Gropp + dm      - The DMMoab object being set
406a2b725a8SWilliam Gropp - ltogtag - The MOAB tag used for local to global ids
407aa768e4cSTim Tautges 
408aa768e4cSTim Tautges   Level: beginner
409aa768e4cSTim Tautges 
410aa768e4cSTim Tautges @*/
4111d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm, moab::Tag ltogtag)
4121d72bce8STim Tautges {
4131d72bce8STim Tautges   PetscFunctionBegin;
4141d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4151d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
4161d72bce8STim Tautges   PetscFunctionReturn(0);
4171d72bce8STim Tautges }
4181d72bce8STim Tautges 
419cab5ea25SPierre Jolivet /*@C
420aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
421aa768e4cSTim Tautges 
422d083f849SBarry Smith   Collective
423aa768e4cSTim Tautges 
424aa768e4cSTim Tautges   Input Parameter:
425aa768e4cSTim Tautges . dm      - The DMMoab object being set
426aa768e4cSTim Tautges 
427aa768e4cSTim Tautges   Output Parameter:
428aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
429aa768e4cSTim Tautges 
430aa768e4cSTim Tautges   Level: beginner
431aa768e4cSTim Tautges 
432aa768e4cSTim Tautges @*/
4331d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm, moab::Tag *ltog_tag)
4341d72bce8STim Tautges {
4351d72bce8STim Tautges   PetscFunctionBegin;
4361d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4371d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
4381d72bce8STim Tautges   PetscFunctionReturn(0);
4391d72bce8STim Tautges }
4401d72bce8STim Tautges 
441cab5ea25SPierre Jolivet /*@C
442aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
443aa768e4cSTim Tautges 
444d083f849SBarry Smith   Collective
445aa768e4cSTim Tautges 
446d8d19677SJose E. Roman   Input Parameters:
447a2b725a8SWilliam Gropp + dm - The DMMoab object being set
448a2b725a8SWilliam Gropp - bs - The block size used with this DMMoab
449aa768e4cSTim Tautges 
450aa768e4cSTim Tautges   Level: beginner
451aa768e4cSTim Tautges 
452aa768e4cSTim Tautges @*/
4531d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm, PetscInt bs)
4541d72bce8STim Tautges {
4551d72bce8STim Tautges   PetscFunctionBegin;
4561d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4571d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
4581d72bce8STim Tautges   PetscFunctionReturn(0);
4591d72bce8STim Tautges }
4601d72bce8STim Tautges 
461cab5ea25SPierre Jolivet /*@C
462aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
463aa768e4cSTim Tautges 
464d083f849SBarry Smith   Collective
465aa768e4cSTim Tautges 
466aa768e4cSTim Tautges   Input Parameter:
467aa768e4cSTim Tautges . dm - The DMMoab object being set
468aa768e4cSTim Tautges 
469aa768e4cSTim Tautges   Output Parameter:
470aa768e4cSTim Tautges . bs - The block size used with this DMMoab
471aa768e4cSTim Tautges 
472aa768e4cSTim Tautges   Level: beginner
473aa768e4cSTim Tautges 
474aa768e4cSTim Tautges @*/
4751d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm, PetscInt *bs)
4761d72bce8STim Tautges {
4771d72bce8STim Tautges   PetscFunctionBegin;
4781d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4791d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
4801d72bce8STim Tautges   PetscFunctionReturn(0);
4811d72bce8STim Tautges }
4821d72bce8STim Tautges 
483cab5ea25SPierre Jolivet /*@C
484212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
485212ad6d1SVijay Mahadevan 
486d083f849SBarry Smith   Collective on dm
487212ad6d1SVijay Mahadevan 
488212ad6d1SVijay Mahadevan   Input Parameter:
489212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
490212ad6d1SVijay Mahadevan 
491d8d19677SJose E. Roman   Output Parameters:
492a2b725a8SWilliam Gropp + neg - The number of global elements in the DMMoab instance
493a2b725a8SWilliam Gropp - nvg - The number of global vertices in the DMMoab instance
494212ad6d1SVijay Mahadevan 
495212ad6d1SVijay Mahadevan   Level: beginner
496212ad6d1SVijay Mahadevan 
497212ad6d1SVijay Mahadevan @*/
49841dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm, PetscInt *neg, PetscInt *nvg)
499212ad6d1SVijay Mahadevan {
500212ad6d1SVijay Mahadevan   PetscFunctionBegin;
501212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
50241dd5348SVijay Mahadevan   if (neg) *neg = ((DM_Moab*)dm->data)->nele;
50341dd5348SVijay Mahadevan   if (nvg) *nvg = ((DM_Moab*)dm->data)->n;
504212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
505212ad6d1SVijay Mahadevan }
506212ad6d1SVijay Mahadevan 
507cab5ea25SPierre Jolivet /*@C
508212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
509212ad6d1SVijay Mahadevan 
510d083f849SBarry Smith   Collective on dm
511212ad6d1SVijay Mahadevan 
512212ad6d1SVijay Mahadevan   Input Parameter:
513212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
514212ad6d1SVijay Mahadevan 
515d8d19677SJose E. Roman   Output Parameters:
516b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor
51700cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor
51800cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor
519a2b725a8SWilliam Gropp - nvg - The number of ghosted vertices in this processor
520212ad6d1SVijay Mahadevan 
521212ad6d1SVijay Mahadevan   Level: beginner
522212ad6d1SVijay Mahadevan 
523212ad6d1SVijay Mahadevan @*/
52441dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm, PetscInt *nel, PetscInt *neg, PetscInt *nvl, PetscInt *nvg)
525212ad6d1SVijay Mahadevan {
526212ad6d1SVijay Mahadevan   PetscFunctionBegin;
527212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
52841dd5348SVijay Mahadevan   if (nel) *nel = ((DM_Moab*)dm->data)->neleloc;
52941dd5348SVijay Mahadevan   if (neg) *neg = ((DM_Moab*)dm->data)->neleghost;
53041dd5348SVijay Mahadevan   if (nvl) *nvl = ((DM_Moab*)dm->data)->nloc;
53141dd5348SVijay Mahadevan   if (nvg) *nvg = ((DM_Moab*)dm->data)->nghost;
532212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
533212ad6d1SVijay Mahadevan }
534212ad6d1SVijay Mahadevan 
535cab5ea25SPierre Jolivet /*@C
53600cc10feSVijay Mahadevan   DMMoabGetOffset - Get the local offset for the global vector
53700cc10feSVijay Mahadevan 
538d083f849SBarry Smith   Collective
53900cc10feSVijay Mahadevan 
54000cc10feSVijay Mahadevan   Input Parameter:
54100cc10feSVijay Mahadevan . dm - The DMMoab object being set
54200cc10feSVijay Mahadevan 
54300cc10feSVijay Mahadevan   Output Parameter:
54400cc10feSVijay Mahadevan . offset - The local offset for the global vector
54500cc10feSVijay Mahadevan 
54600cc10feSVijay Mahadevan   Level: beginner
54700cc10feSVijay Mahadevan 
54800cc10feSVijay Mahadevan @*/
54900cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm, PetscInt *offset)
55000cc10feSVijay Mahadevan {
55100cc10feSVijay Mahadevan   PetscFunctionBegin;
55200cc10feSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
55300cc10feSVijay Mahadevan   *offset = ((DM_Moab*)dm->data)->vstart;
55400cc10feSVijay Mahadevan   PetscFunctionReturn(0);
55500cc10feSVijay Mahadevan }
55600cc10feSVijay Mahadevan 
557cab5ea25SPierre Jolivet /*@C
5584920ab11SVijay Mahadevan   DMMoabGetDimension - Get the dimension of the DM Mesh
5594920ab11SVijay Mahadevan 
560d083f849SBarry Smith   Collective
5614920ab11SVijay Mahadevan 
5624920ab11SVijay Mahadevan   Input Parameter:
563340f3b9aSVijay Mahadevan . dm - The DMMoab object
5644920ab11SVijay Mahadevan 
5654920ab11SVijay Mahadevan   Output Parameter:
5664920ab11SVijay Mahadevan . dim - The dimension of DM
5674920ab11SVijay Mahadevan 
5684920ab11SVijay Mahadevan   Level: beginner
5694920ab11SVijay Mahadevan 
5704920ab11SVijay Mahadevan @*/
5714920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm, PetscInt *dim)
5724920ab11SVijay Mahadevan {
5734920ab11SVijay Mahadevan   PetscFunctionBegin;
5744920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
5754920ab11SVijay Mahadevan   *dim = ((DM_Moab*)dm->data)->dim;
5764920ab11SVijay Mahadevan   PetscFunctionReturn(0);
5774920ab11SVijay Mahadevan }
5784920ab11SVijay Mahadevan 
579cab5ea25SPierre Jolivet /*@C
580755f3dfbSVijay Mahadevan   DMMoabGetHierarchyLevel - Get the current level of the mesh hierarchy
581755f3dfbSVijay Mahadevan   generated through uniform refinement.
582755f3dfbSVijay Mahadevan 
583d083f849SBarry Smith   Collective on dm
584755f3dfbSVijay Mahadevan 
585755f3dfbSVijay Mahadevan   Input Parameter:
586755f3dfbSVijay Mahadevan . dm - The DMMoab object being set
587755f3dfbSVijay Mahadevan 
588755f3dfbSVijay Mahadevan   Output Parameter:
589755f3dfbSVijay Mahadevan . nvg - The current mesh hierarchy level
590755f3dfbSVijay Mahadevan 
591755f3dfbSVijay Mahadevan   Level: beginner
592755f3dfbSVijay Mahadevan 
593755f3dfbSVijay Mahadevan @*/
594755f3dfbSVijay Mahadevan PetscErrorCode DMMoabGetHierarchyLevel(DM dm, PetscInt *nlevel)
595755f3dfbSVijay Mahadevan {
596755f3dfbSVijay Mahadevan   PetscFunctionBegin;
597755f3dfbSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
598755f3dfbSVijay Mahadevan   if (nlevel) *nlevel = ((DM_Moab*)dm->data)->hlevel;
599755f3dfbSVijay Mahadevan   PetscFunctionReturn(0);
600755f3dfbSVijay Mahadevan }
601755f3dfbSVijay Mahadevan 
602cab5ea25SPierre Jolivet /*@C
603340f3b9aSVijay Mahadevan   DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh
604340f3b9aSVijay Mahadevan 
605d083f849SBarry Smith   Collective
606340f3b9aSVijay Mahadevan 
607d8d19677SJose E. Roman   Input Parameters:
608a2b725a8SWilliam Gropp + dm - The DMMoab object
609a2b725a8SWilliam Gropp - ehandle - The element entity handle
610340f3b9aSVijay Mahadevan 
611340f3b9aSVijay Mahadevan   Output Parameter:
612340f3b9aSVijay Mahadevan . mat - The material ID for the current entity
613340f3b9aSVijay Mahadevan 
614340f3b9aSVijay Mahadevan   Level: beginner
615340f3b9aSVijay Mahadevan 
616340f3b9aSVijay Mahadevan @*/
617340f3b9aSVijay Mahadevan PetscErrorCode DMMoabGetMaterialBlock(DM dm, const moab::EntityHandle ehandle, PetscInt *mat)
618340f3b9aSVijay Mahadevan {
619340f3b9aSVijay Mahadevan   DM_Moab         *dmmoab;
620340f3b9aSVijay Mahadevan 
621340f3b9aSVijay Mahadevan   PetscFunctionBegin;
622340f3b9aSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
623340f3b9aSVijay Mahadevan   if (*mat) {
624340f3b9aSVijay Mahadevan     dmmoab = (DM_Moab*)(dm)->data;
625a044f6b6SVijay Mahadevan     *mat = dmmoab->materials[dmmoab->elocal->index(ehandle)];
626340f3b9aSVijay Mahadevan   }
627340f3b9aSVijay Mahadevan   PetscFunctionReturn(0);
628340f3b9aSVijay Mahadevan }
629340f3b9aSVijay Mahadevan 
630cab5ea25SPierre Jolivet /*@C
63185d305f5SVijay Mahadevan   DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities
63285d305f5SVijay Mahadevan 
633d083f849SBarry Smith   Collective
63485d305f5SVijay Mahadevan 
635d8d19677SJose E. Roman   Input Parameters:
636a2b725a8SWilliam Gropp + dm - The DMMoab object
63785d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
638a2b725a8SWilliam Gropp - conn - The vertex entity handles
63985d305f5SVijay Mahadevan 
64085d305f5SVijay Mahadevan   Output Parameter:
64185d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities
64285d305f5SVijay Mahadevan 
64385d305f5SVijay Mahadevan   Level: beginner
64485d305f5SVijay Mahadevan 
64585d305f5SVijay Mahadevan .seealso: DMMoabGetVertexConnectivity()
64685d305f5SVijay Mahadevan @*/
647cade3ad9SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm, PetscInt nconn, const moab::EntityHandle *conn, PetscReal *vpos)
6487023aa44SVijay Mahadevan {
6497023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
6507023aa44SVijay Mahadevan   moab::ErrorCode merr;
6517023aa44SVijay Mahadevan 
6527023aa44SVijay Mahadevan   PetscFunctionBegin;
6537023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
6547023aa44SVijay Mahadevan   PetscValidPointer(conn, 3);
6559c368985SVijay Mahadevan   PetscValidPointer(vpos, 4);
6567023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6577023aa44SVijay Mahadevan 
6587023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
6599c368985SVijay Mahadevan   if (dmmoab->hlevel) {
6609c368985SVijay Mahadevan     merr = dmmoab->hierarchy->get_coordinates(const_cast<moab::EntityHandle*>(conn), nconn, dmmoab->hlevel, vpos);MBERRNM(merr);
6619c368985SVijay Mahadevan   }
6629c368985SVijay Mahadevan   else {
6637023aa44SVijay Mahadevan     merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
6649c368985SVijay Mahadevan   }
6657023aa44SVijay Mahadevan   PetscFunctionReturn(0);
6667023aa44SVijay Mahadevan }
6677023aa44SVijay Mahadevan 
668cab5ea25SPierre Jolivet /*@C
66985d305f5SVijay Mahadevan   DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity
67085d305f5SVijay Mahadevan 
671d083f849SBarry Smith   Collective
67285d305f5SVijay Mahadevan 
673d8d19677SJose E. Roman   Input Parameters:
674a2b725a8SWilliam Gropp + dm - The DMMoab object
675a2b725a8SWilliam Gropp - vhandle - Vertex entity handle
67685d305f5SVijay Mahadevan 
677d8d19677SJose E. Roman   Output Parameters:
678a2b725a8SWilliam Gropp + nconn - Number of entities whose coordinates are needed
679a2b725a8SWilliam Gropp - conn - The vertex entity handles
68085d305f5SVijay Mahadevan 
68185d305f5SVijay Mahadevan   Level: beginner
68285d305f5SVijay Mahadevan 
68385d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabRestoreVertexConnectivity()
68485d305f5SVijay Mahadevan @*/
68585d305f5SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm, moab::EntityHandle vhandle, PetscInt* nconn, moab::EntityHandle **conn)
6868d8d51c8SVijay Mahadevan {
6878d8d51c8SVijay Mahadevan   DM_Moab        *dmmoab;
6888d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities, connect;
6898d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
6908d8d51c8SVijay Mahadevan   moab::ErrorCode merr;
6918d8d51c8SVijay Mahadevan 
6928d8d51c8SVijay Mahadevan   PetscFunctionBegin;
6938d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
6948d8d51c8SVijay Mahadevan   PetscValidPointer(conn, 4);
6958d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6968d8d51c8SVijay Mahadevan 
6978d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
69885d305f5SVijay Mahadevan   merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION); MBERRNM(merr);
6998d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0], adj_entities.size(), connect); MBERRNM(merr);
7008d8d51c8SVijay Mahadevan 
7018d8d51c8SVijay Mahadevan   if (conn) {
7028d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(moab::EntityHandle) * connect.size(), conn);CHKERRQ(ierr);
703580bdb30SBarry Smith     ierr = PetscArraycpy(*conn, &connect[0], connect.size());CHKERRQ(ierr);
7048d8d51c8SVijay Mahadevan   }
7058d8d51c8SVijay Mahadevan   if (nconn) *nconn = connect.size();
7068d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
7078d8d51c8SVijay Mahadevan }
7088d8d51c8SVijay Mahadevan 
709cab5ea25SPierre Jolivet /*@C
71085d305f5SVijay Mahadevan   DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity
71185d305f5SVijay Mahadevan 
712d083f849SBarry Smith   Collective
71385d305f5SVijay Mahadevan 
714d8d19677SJose E. Roman   Input Parameters:
715a2b725a8SWilliam Gropp + dm - The DMMoab object
71685d305f5SVijay Mahadevan . vhandle - Vertex entity handle
71785d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
718a2b725a8SWilliam Gropp - conn - The vertex entity handles
71985d305f5SVijay Mahadevan 
72085d305f5SVijay Mahadevan   Level: beginner
72185d305f5SVijay Mahadevan 
72285d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity()
72385d305f5SVijay Mahadevan @*/
7248d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt* nconn, moab::EntityHandle **conn)
7258d8d51c8SVijay Mahadevan {
7268d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
7278d8d51c8SVijay Mahadevan 
7288d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7298d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
7308d8d51c8SVijay Mahadevan   PetscValidPointer(conn, 4);
7318d8d51c8SVijay Mahadevan 
7328d8d51c8SVijay Mahadevan   if (conn) {
7338d8d51c8SVijay Mahadevan     ierr = PetscFree(*conn);CHKERRQ(ierr);
7348d8d51c8SVijay Mahadevan   }
7358d8d51c8SVijay Mahadevan   if (nconn) *nconn = 0;
7368d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
7378d8d51c8SVijay Mahadevan }
7388d8d51c8SVijay Mahadevan 
739cab5ea25SPierre Jolivet /*@C
74085d305f5SVijay Mahadevan   DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity
74185d305f5SVijay Mahadevan 
742d083f849SBarry Smith   Collective
74385d305f5SVijay Mahadevan 
744d8d19677SJose E. Roman   Input Parameters:
745a2b725a8SWilliam Gropp + dm - The DMMoab object
746a2b725a8SWilliam Gropp - ehandle - Vertex entity handle
74785d305f5SVijay Mahadevan 
748d8d19677SJose E. Roman   Output Parameters:
749a2b725a8SWilliam Gropp + nconn - Number of entities whose coordinates are needed
750a2b725a8SWilliam Gropp - conn - The vertex entity handles
75185d305f5SVijay Mahadevan 
75285d305f5SVijay Mahadevan   Level: beginner
75385d305f5SVijay Mahadevan 
75485d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity(), DMMoabRestoreVertexConnectivity()
75585d305f5SVijay Mahadevan @*/
7567023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt* nconn, const moab::EntityHandle **conn)
7577023aa44SVijay Mahadevan {
7587023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
7597023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
7609c368985SVijay Mahadevan   std::vector<moab::EntityHandle> vconn;
7617023aa44SVijay Mahadevan   moab::ErrorCode merr;
7627023aa44SVijay Mahadevan   PetscInt nnodes;
7637023aa44SVijay Mahadevan 
7647023aa44SVijay Mahadevan   PetscFunctionBegin;
7657023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
7667023aa44SVijay Mahadevan   PetscValidPointer(conn, 4);
7677023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7687023aa44SVijay Mahadevan 
7697023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
7707023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes); MBERRNM(merr);
7717023aa44SVijay Mahadevan   if (conn) *conn = connect;
7727023aa44SVijay Mahadevan   if (nconn) *nconn = nnodes;
7737023aa44SVijay Mahadevan   PetscFunctionReturn(0);
7747023aa44SVijay Mahadevan }
7757023aa44SVijay Mahadevan 
776cab5ea25SPierre Jolivet /*@C
77785d305f5SVijay Mahadevan   DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element)
77885d305f5SVijay Mahadevan 
779d083f849SBarry Smith   Collective
78085d305f5SVijay Mahadevan 
781d8d19677SJose E. Roman   Input Parameters:
782a2b725a8SWilliam Gropp + dm - The DMMoab object
783a2b725a8SWilliam Gropp - ent - Entity handle
78485d305f5SVijay Mahadevan 
78585d305f5SVijay Mahadevan   Output Parameter:
78685d305f5SVijay Mahadevan . ent_on_boundary - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
78785d305f5SVijay Mahadevan 
78885d305f5SVijay Mahadevan   Level: beginner
78985d305f5SVijay Mahadevan 
79085d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices()
79185d305f5SVijay Mahadevan @*/
79269263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm, const moab::EntityHandle ent, PetscBool* ent_on_boundary)
79369263071SVijay Mahadevan {
79469263071SVijay Mahadevan   moab::EntityType etype;
79569263071SVijay Mahadevan   DM_Moab         *dmmoab;
79669263071SVijay Mahadevan   PetscInt         edim;
79769263071SVijay Mahadevan 
79869263071SVijay Mahadevan   PetscFunctionBegin;
79969263071SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
80069263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary, 3);
80169263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
80269263071SVijay Mahadevan 
80369263071SVijay Mahadevan   /* get the entity type and handle accordingly */
80469263071SVijay Mahadevan   etype = dmmoab->mbiface->type_from_handle(ent);
805*98921bdaSJacob Faibussowitsch   if (etype >= moab::MBPOLYHEDRON) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Entity type on the boundary skin is invalid. EntityType = %D", etype);
80669263071SVijay Mahadevan 
80769263071SVijay Mahadevan   /* get the entity dimension */
80869263071SVijay Mahadevan   edim = dmmoab->mbiface->dimension_from_handle(ent);
80969263071SVijay Mahadevan 
81069263071SVijay Mahadevan   *ent_on_boundary = PETSC_FALSE;
81169263071SVijay Mahadevan   if (etype == moab::MBVERTEX && edim == 0) {
81249d66b22SVijay Mahadevan     *ent_on_boundary = ((dmmoab->bndyvtx->index(ent) >= 0) ? PETSC_TRUE : PETSC_FALSE);
81369263071SVijay Mahadevan   }
81469263071SVijay Mahadevan   else {
81569263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
8166d9eb265SVijay Mahadevan       if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE;
81769263071SVijay Mahadevan     }
81869263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
8196d9eb265SVijay Mahadevan       if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE;
82069263071SVijay Mahadevan     }
82169263071SVijay Mahadevan   }
82269263071SVijay Mahadevan   PetscFunctionReturn(0);
82369263071SVijay Mahadevan }
82469263071SVijay Mahadevan 
825cab5ea25SPierre Jolivet /*@C
8264597dd3dSJose E. Roman   DMMoabCheckBoundaryVertices - Check whether a given entity is on the boundary (vertex, edge, face, element)
82785d305f5SVijay Mahadevan 
82897bb3fdcSJose E. Roman   Input Parameters:
829a2b725a8SWilliam Gropp + dm - The DMMoab object
83085d305f5SVijay Mahadevan . nconn - Number of handles
831a2b725a8SWilliam Gropp - cnt - Array of entity handles
83285d305f5SVijay Mahadevan 
83385d305f5SVijay Mahadevan   Output Parameter:
83485d305f5SVijay Mahadevan . isbdvtx - Array of boundary markers - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
83585d305f5SVijay Mahadevan 
83685d305f5SVijay Mahadevan   Level: beginner
83785d305f5SVijay Mahadevan 
83885d305f5SVijay Mahadevan .seealso: DMMoabIsEntityOnBoundary()
83985d305f5SVijay Mahadevan @*/
84069263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm, PetscInt nconn, const moab::EntityHandle *cnt, PetscBool* isbdvtx)
8417023aa44SVijay Mahadevan {
8427023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
8437023aa44SVijay Mahadevan   PetscInt       i;
8447023aa44SVijay Mahadevan 
8457023aa44SVijay Mahadevan   PetscFunctionBegin;
8467023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
8477023aa44SVijay Mahadevan   PetscValidPointer(cnt, 3);
8487023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx, 4);
8497023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8507023aa44SVijay Mahadevan 
8517023aa44SVijay Mahadevan   for (i = 0; i < nconn; ++i) {
8526d9eb265SVijay Mahadevan     isbdvtx[i] = (dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE : PETSC_FALSE);
8537023aa44SVijay Mahadevan   }
8547023aa44SVijay Mahadevan   PetscFunctionReturn(0);
8557023aa44SVijay Mahadevan }
8567023aa44SVijay Mahadevan 
857cab5ea25SPierre Jolivet /*@C
85885d305f5SVijay Mahadevan   DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary
85985d305f5SVijay Mahadevan 
86085d305f5SVijay Mahadevan   Input Parameter:
86185d305f5SVijay Mahadevan . dm - The DMMoab object
86285d305f5SVijay Mahadevan 
863d8d19677SJose E. Roman   Output Parameters:
864a2b725a8SWilliam Gropp + bdvtx - Boundary vertices
86585d305f5SVijay Mahadevan . bdelems - Boundary elements
866a2b725a8SWilliam Gropp - bdfaces - Boundary faces
86785d305f5SVijay Mahadevan 
86885d305f5SVijay Mahadevan   Level: beginner
86985d305f5SVijay Mahadevan 
87085d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices(), DMMoabIsEntityOnBoundary()
87185d305f5SVijay Mahadevan @*/
8726d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm, const moab::Range **bdvtx, const moab::Range** bdelems, const moab::Range** bdfaces)
8731cec0304SVijay Mahadevan {
8741cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
8751cec0304SVijay Mahadevan 
8761cec0304SVijay Mahadevan   PetscFunctionBegin;
8771cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
8781cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8791cec0304SVijay Mahadevan 
8806d9eb265SVijay Mahadevan   if (bdvtx)  *bdvtx = dmmoab->bndyvtx;
8816d9eb265SVijay Mahadevan   if (bdfaces)  *bdfaces = dmmoab->bndyfaces;
8826d9eb265SVijay Mahadevan   if (bdelems)  *bdfaces = dmmoab->bndyelems;
8831cec0304SVijay Mahadevan   PetscFunctionReturn(0);
8841cec0304SVijay Mahadevan }
8851cec0304SVijay Mahadevan 
886f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm)
887f6829af0SVijay Mahadevan {
888f6829af0SVijay Mahadevan   PetscErrorCode  ierr;
88985d305f5SVijay Mahadevan   PetscInt        i;
890e882eb38SVijay Mahadevan   moab::ErrorCode merr;
891f6829af0SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
892f6829af0SVijay Mahadevan 
893f6829af0SVijay Mahadevan   PetscFunctionBegin;
894f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
895304006b3SVijay Mahadevan 
896304006b3SVijay Mahadevan   dmmoab->refct--;
897304006b3SVijay Mahadevan   if (!dmmoab->refct) {
898f6829af0SVijay Mahadevan     delete dmmoab->vlocal;
899f6829af0SVijay Mahadevan     delete dmmoab->vowned;
900f6829af0SVijay Mahadevan     delete dmmoab->vghost;
901f6829af0SVijay Mahadevan     delete dmmoab->elocal;
902f6829af0SVijay Mahadevan     delete dmmoab->eghost;
903f6829af0SVijay Mahadevan     delete dmmoab->bndyvtx;
904f6829af0SVijay Mahadevan     delete dmmoab->bndyfaces;
905f6829af0SVijay Mahadevan     delete dmmoab->bndyelems;
906f6829af0SVijay Mahadevan 
907f6829af0SVijay Mahadevan     ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr);
9087ae5e5b6SVijay Mahadevan     ierr = PetscFree2(dmmoab->gidmap, dmmoab->lidmap);CHKERRQ(ierr);
9095905e1eaSVijay Mahadevan     ierr = PetscFree(dmmoab->dfill);CHKERRQ(ierr);
9105905e1eaSVijay Mahadevan     ierr = PetscFree(dmmoab->ofill);CHKERRQ(ierr);
9119c368985SVijay Mahadevan     ierr = PetscFree(dmmoab->materials);CHKERRQ(ierr);
91285d305f5SVijay Mahadevan     if (dmmoab->fieldNames) {
91385d305f5SVijay Mahadevan       for (i = 0; i < dmmoab->numFields; i++) {
91485d305f5SVijay Mahadevan         ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr);
91585d305f5SVijay Mahadevan       }
91685d305f5SVijay Mahadevan       ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr);
91785d305f5SVijay Mahadevan     }
918b117cd09SVijay Mahadevan 
919b117cd09SVijay Mahadevan     if (dmmoab->nhlevels) {
920b117cd09SVijay Mahadevan       ierr = PetscFree(dmmoab->hsets);CHKERRQ(ierr);
921e882eb38SVijay Mahadevan       dmmoab->nhlevels = 0;
922e882eb38SVijay Mahadevan       if (!dmmoab->hlevel && dmmoab->icreatedinstance) delete dmmoab->hierarchy;
923e882eb38SVijay Mahadevan       dmmoab->hierarchy = NULL;
924b117cd09SVijay Mahadevan     }
925e882eb38SVijay Mahadevan 
926e882eb38SVijay Mahadevan     if (dmmoab->icreatedinstance) {
9279c368985SVijay Mahadevan       delete dmmoab->pcomm;
928e882eb38SVijay Mahadevan       merr = dmmoab->mbiface->delete_mesh(); MBERRNM(merr);
929e882eb38SVijay Mahadevan       delete dmmoab->mbiface;
930e882eb38SVijay Mahadevan     }
931e882eb38SVijay Mahadevan     dmmoab->mbiface = NULL;
9329daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
933e882eb38SVijay Mahadevan     dmmoab->pcomm = NULL;
9349daf19fdSVijay Mahadevan #endif
935f6829af0SVijay Mahadevan     ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
936f6829af0SVijay Mahadevan     ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr);
937f6829af0SVijay Mahadevan     ierr = PetscFree(dm->data);CHKERRQ(ierr);
938304006b3SVijay Mahadevan   }
939f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
940f6829af0SVijay Mahadevan }
941f6829af0SVijay Mahadevan 
9424416b707SBarry Smith PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(PetscOptionItems *PetscOptionsObject, DM dm)
9432e4e7c01SVijay Mahadevan {
9442e4e7c01SVijay Mahadevan   PetscErrorCode ierr;
9452e4e7c01SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
9462e4e7c01SVijay Mahadevan 
9472e4e7c01SVijay Mahadevan   PetscFunctionBegin;
9482e4e7c01SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
949cc310fddSBarry Smith   ierr = PetscOptionsHead(PetscOptionsObject, "DMMoab Options");CHKERRQ(ierr);
9505a856986SBarry 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);
9512e4e7c01SVijay 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);
9522e4e7c01SVijay Mahadevan   /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */
953589a23caSBarry 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);
954589a23caSBarry 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);
9552e4e7c01SVijay Mahadevan   ierr  = PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum*)&dmmoab->read_mode, NULL);CHKERRQ(ierr);
9562e4e7c01SVijay Mahadevan   ierr  = PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum*)&dmmoab->write_mode, NULL);CHKERRQ(ierr);
9572e4e7c01SVijay Mahadevan   PetscFunctionReturn(0);
9582e4e7c01SVijay Mahadevan }
9592e4e7c01SVijay Mahadevan 
960f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm)
961f6829af0SVijay Mahadevan {
962f6829af0SVijay Mahadevan   PetscErrorCode          ierr;
963f6829af0SVijay Mahadevan   moab::ErrorCode         merr;
964f6829af0SVijay Mahadevan   Vec                     local, global;
965f6829af0SVijay Mahadevan   IS                      from, to;
966f6829af0SVijay Mahadevan   moab::Range::iterator   iter;
967304006b3SVijay Mahadevan   PetscInt                i, j, f, bs, vent, totsize, *lgmap;
968f6829af0SVijay Mahadevan   DM_Moab                *dmmoab = (DM_Moab*)dm->data;
969f6829af0SVijay Mahadevan   moab::Range             adjs;
970f6829af0SVijay Mahadevan 
971f6829af0SVijay Mahadevan   PetscFunctionBegin;
972f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
973f6829af0SVijay Mahadevan   /* Get the local and shared vertices and cache it */
9749daf19fdSVijay Mahadevan   if (dmmoab->mbiface == NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface before calling SetUp.");
9759daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
9769daf19fdSVijay Mahadevan   if (dmmoab->pcomm == NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB ParallelComm object before calling SetUp.");
9779daf19fdSVijay Mahadevan #endif
978f6829af0SVijay Mahadevan 
979f6829af0SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
980f6829af0SVijay Mahadevan   if (dmmoab->vlocal->empty())
981f6829af0SVijay Mahadevan   {
98249d66b22SVijay Mahadevan     //merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
98349d66b22SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, 0, *dmmoab->vlocal, false); MBERRNM(merr);
984f6829af0SVijay Mahadevan 
9859daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
986f6829af0SVijay Mahadevan     /* filter based on parallel status */
987f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned); MBERRNM(merr);
988f6829af0SVijay Mahadevan 
989f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
9909c368985SVijay Mahadevan     // *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
991f6829af0SVijay Mahadevan     adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
99264e1c140SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(adjs, PSTATUS_GHOST | PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost); MBERRNM(merr);
993f6829af0SVijay Mahadevan     adjs = moab::subtract(adjs, *dmmoab->vghost);
994f6829af0SVijay Mahadevan     *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs);
9959daf19fdSVijay Mahadevan #else
9969daf19fdSVijay Mahadevan     *dmmoab->vowned = *dmmoab->vlocal;
9979daf19fdSVijay Mahadevan #endif
998f6829af0SVijay Mahadevan 
999f6829af0SVijay Mahadevan     /* compute and cache the sizes of local and ghosted entities */
1000f6829af0SVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
1001f6829af0SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
100249d66b22SVijay Mahadevan 
10039daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1004820f2d46SBarry Smith     ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRMPI(ierr);
100549d66b22SVijay Mahadevan     PetscInfo4(NULL, "Filset ID: %u, Vertices: local - %D, owned - %D, ghosted - %D.\n", dmmoab->fileset, dmmoab->vlocal->size(), dmmoab->nloc, dmmoab->nghost);
10069daf19fdSVijay Mahadevan #else
10079daf19fdSVijay Mahadevan     dmmoab->n = dmmoab->nloc;
10089daf19fdSVijay Mahadevan #endif
1009f6829af0SVijay Mahadevan   }
1010f6829af0SVijay Mahadevan 
1011f6829af0SVijay Mahadevan   {
1012f6829af0SVijay Mahadevan     /* get the information about the local elements in the mesh */
1013f6829af0SVijay Mahadevan     dmmoab->eghost->clear();
1014f6829af0SVijay Mahadevan 
1015f6829af0SVijay Mahadevan     /* first decipher the leading dimension */
1016f6829af0SVijay Mahadevan     for (i = 3; i > 0; i--) {
1017f6829af0SVijay Mahadevan       dmmoab->elocal->clear();
101849d66b22SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, false); MBERRNM(merr);
1019f6829af0SVijay Mahadevan 
1020f6829af0SVijay Mahadevan       /* store the current mesh dimension */
1021f6829af0SVijay Mahadevan       if (dmmoab->elocal->size()) {
1022f6829af0SVijay Mahadevan         dmmoab->dim = i;
1023f6829af0SVijay Mahadevan         break;
1024f6829af0SVijay Mahadevan       }
1025f6829af0SVijay Mahadevan     }
1026f6829af0SVijay Mahadevan 
1027b117cd09SVijay Mahadevan     ierr = DMSetDimension(dm, dmmoab->dim);CHKERRQ(ierr);
1028b117cd09SVijay Mahadevan 
10299daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1030f6829af0SVijay Mahadevan     /* filter the ghosted and owned element list */
1031f6829af0SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
1032f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
1033f6829af0SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
10349daf19fdSVijay Mahadevan #endif
1035f6829af0SVijay Mahadevan 
1036f6829af0SVijay Mahadevan     dmmoab->neleloc = dmmoab->elocal->size();
1037f6829af0SVijay Mahadevan     dmmoab->neleghost = dmmoab->eghost->size();
103849d66b22SVijay Mahadevan 
10399daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1040820f2d46SBarry Smith     ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRMPI(ierr);
104149d66b22SVijay Mahadevan     PetscInfo3(NULL, "%d-dim elements: owned - %D, ghosted - %D.\n", dmmoab->dim, dmmoab->neleloc, dmmoab->neleghost);
10429daf19fdSVijay Mahadevan #else
10439daf19fdSVijay Mahadevan     dmmoab->nele = dmmoab->neleloc;
10449daf19fdSVijay Mahadevan #endif
1045f6829af0SVijay Mahadevan   }
1046f6829af0SVijay Mahadevan 
1047f6829af0SVijay Mahadevan   bs = dmmoab->bs;
1048f6829af0SVijay Mahadevan   if (!dmmoab->ltog_tag) {
1049f6829af0SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
1050f6829af0SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
1051f6829af0SVijay Mahadevan        assemble the individual pieces of the mesh */
1052f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag); MBERRNM(merr);
1053f6829af0SVijay Mahadevan   }
1054f6829af0SVijay Mahadevan 
1055f6829af0SVijay Mahadevan   totsize = dmmoab->vlocal->size();
1056*98921bdaSJacob Faibussowitsch   if (totsize != dmmoab->nloc + dmmoab->nghost) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Mismatch between local and owned+ghost vertices. %D != %D.", totsize, dmmoab->nloc + dmmoab->nghost);
105749d66b22SVijay Mahadevan   ierr = PetscCalloc1(totsize, &dmmoab->gsindices);CHKERRQ(ierr);
1058f6829af0SVijay Mahadevan   {
1059f6829af0SVijay Mahadevan     /* first get the local indices */
1060f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vowned, &dmmoab->gsindices[0]); MBERRNM(merr);
10613f1c6e43SVijay Mahadevan     if (dmmoab->nghost) {  /* next get the ghosted indices */
1062f6829af0SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vghost, &dmmoab->gsindices[dmmoab->nloc]); MBERRNM(merr);
1063f6829af0SVijay Mahadevan     }
1064f6829af0SVijay Mahadevan 
1065f6829af0SVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
1066304006b3SVijay Mahadevan     dmmoab->lminmax[0] = dmmoab->lminmax[1] = dmmoab->gsindices[0];
1067f6829af0SVijay Mahadevan     for (i = 0; i < totsize; ++i) {
1068304006b3SVijay Mahadevan       if (dmmoab->lminmax[0] > dmmoab->gsindices[i]) dmmoab->lminmax[0] = dmmoab->gsindices[i];
1069304006b3SVijay Mahadevan       if (dmmoab->lminmax[1] < dmmoab->gsindices[i]) dmmoab->lminmax[1] = dmmoab->gsindices[i];
1070f6829af0SVijay Mahadevan     }
1071f6829af0SVijay Mahadevan 
1072820f2d46SBarry Smith     ierr = MPIU_Allreduce(&dmmoab->lminmax[0], &dmmoab->gminmax[0], 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRMPI(ierr);
1073820f2d46SBarry Smith     ierr = MPIU_Allreduce(&dmmoab->lminmax[1], &dmmoab->gminmax[1], 1, MPI_INT, MPI_MAX, ((PetscObject)dm)->comm);CHKERRMPI(ierr);
1074f6829af0SVijay Mahadevan 
1075f6829af0SVijay Mahadevan     /* set the GID map */
1076f6829af0SVijay Mahadevan     for (i = 0; i < totsize; ++i) {
1077304006b3SVijay Mahadevan       dmmoab->gsindices[i] -= dmmoab->gminmax[0]; /* zero based index needed for IS */
10789c368985SVijay Mahadevan 
1079f6829af0SVijay Mahadevan     }
1080304006b3SVijay Mahadevan     dmmoab->lminmax[0] -= dmmoab->gminmax[0];
1081304006b3SVijay Mahadevan     dmmoab->lminmax[1] -= dmmoab->gminmax[0];
1082f6829af0SVijay Mahadevan 
1083304006b3SVijay 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]);
1084f6829af0SVijay Mahadevan   }
1085*98921bdaSJacob Faibussowitsch   if (!(dmmoab->bs == dmmoab->numFields || dmmoab->bs == 1)) SETERRQ(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);
1086f6829af0SVijay Mahadevan 
1087f6829af0SVijay Mahadevan   {
10889c368985SVijay Mahadevan     dmmoab->seqstart = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->front());
10899c368985SVijay Mahadevan     dmmoab->seqend = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->back());
1090304006b3SVijay Mahadevan     PetscInfo2(NULL, "SEQUENCE: Local [min, max] - [%D, %D]\n", dmmoab->seqstart, dmmoab->seqend);
10913f1c6e43SVijay Mahadevan 
109249d66b22SVijay Mahadevan     ierr = PetscMalloc2(dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->gidmap, dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->lidmap);CHKERRQ(ierr);
10933f1c6e43SVijay Mahadevan     ierr = PetscMalloc1(totsize * dmmoab->numFields, &lgmap);CHKERRQ(ierr);
1094f6829af0SVijay Mahadevan 
1095f6829af0SVijay Mahadevan     i = j = 0;
1096f6829af0SVijay Mahadevan     /* set the owned vertex data first */
1097f6829af0SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++, i++) {
1098e92d1c7cSVijay Mahadevan       vent = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart;
1099f6829af0SVijay Mahadevan       dmmoab->gidmap[vent] = dmmoab->gsindices[i];
1100f6829af0SVijay Mahadevan       dmmoab->lidmap[vent] = i;
1101f6829af0SVijay Mahadevan       for (f = 0; f < dmmoab->numFields; f++, j++) {
11023f1c6e43SVijay Mahadevan         lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]);
1103f6829af0SVijay Mahadevan       }
1104f6829af0SVijay Mahadevan     }
1105f6829af0SVijay Mahadevan     /* next arrange all the ghosted data information */
1106f6829af0SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++, i++) {
1107e92d1c7cSVijay Mahadevan       vent = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart;
1108f6829af0SVijay Mahadevan       dmmoab->gidmap[vent] = dmmoab->gsindices[i];
1109f6829af0SVijay Mahadevan       dmmoab->lidmap[vent] = i;
1110f6829af0SVijay Mahadevan       for (f = 0; f < dmmoab->numFields; f++, j++) {
11113f1c6e43SVijay Mahadevan         lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]);
1112f6829af0SVijay Mahadevan       }
1113f6829af0SVijay Mahadevan     }
1114f6829af0SVijay Mahadevan 
1115f6829af0SVijay Mahadevan     /* We need to create the Global to Local Vector Scatter Contexts
1116f6829af0SVijay Mahadevan        1) First create a local and global vector
1117f6829af0SVijay Mahadevan        2) Create a local and global IS
1118f6829af0SVijay Mahadevan        3) Create VecScatter and LtoGMapping objects
1119f6829af0SVijay Mahadevan        4) Cleanup the IS and Vec objects
1120f6829af0SVijay Mahadevan     */
1121f6829af0SVijay Mahadevan     ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr);
1122f6829af0SVijay Mahadevan     ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr);
1123f6829af0SVijay Mahadevan 
1124f6829af0SVijay Mahadevan     ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr);
1125f6829af0SVijay Mahadevan 
1126f6829af0SVijay Mahadevan     /* global to local must retrieve ghost points */
1127f6829af0SVijay Mahadevan     ierr = ISCreateStride(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, dmmoab->vstart, 1, &from);CHKERRQ(ierr);
1128f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(from, bs);CHKERRQ(ierr);
1129f6829af0SVijay Mahadevan 
11303f1c6e43SVijay Mahadevan     ierr = ISCreateGeneral(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, &lgmap[0], PETSC_COPY_VALUES, &to);CHKERRQ(ierr);
1131f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(to, bs);CHKERRQ(ierr);
1132f6829af0SVijay Mahadevan 
1133f6829af0SVijay Mahadevan     if (!dmmoab->ltog_map) {
1134f6829af0SVijay Mahadevan       /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */
11353f1c6e43SVijay Mahadevan       ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm, dmmoab->bs, totsize * dmmoab->numFields, lgmap,
1136f6829af0SVijay Mahadevan                                           PETSC_COPY_VALUES, &dmmoab->ltog_map);CHKERRQ(ierr);
1137f6829af0SVijay Mahadevan     }
1138f6829af0SVijay Mahadevan 
1139f6829af0SVijay Mahadevan     /* now create the scatter object from local to global vector */
11409448b7f1SJunchao Zhang     ierr = VecScatterCreate(local, from, global, to, &dmmoab->ltog_sendrecv);CHKERRQ(ierr);
1141f6829af0SVijay Mahadevan 
1142f6829af0SVijay Mahadevan     /* clean up IS, Vec */
11433f1c6e43SVijay Mahadevan     ierr = PetscFree(lgmap);CHKERRQ(ierr);
1144f6829af0SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
1145f6829af0SVijay Mahadevan     ierr = ISDestroy(&to);CHKERRQ(ierr);
1146f6829af0SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
1147f6829af0SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
1148f6829af0SVijay Mahadevan   }
1149f6829af0SVijay Mahadevan 
115049d66b22SVijay Mahadevan   dmmoab->bndyvtx = new moab::Range();
115149d66b22SVijay Mahadevan   dmmoab->bndyfaces = new moab::Range();
115249d66b22SVijay Mahadevan   dmmoab->bndyelems = new moab::Range();
1153f6829af0SVijay Mahadevan   /* skin the boundary and store nodes */
11549c368985SVijay Mahadevan   if (!dmmoab->hlevel) {
1155f6829af0SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
1156f6829af0SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
1157f6829af0SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
1158f6829af0SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
1159f6829af0SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
1160f6829af0SVijay Mahadevan 
1161f6829af0SVijay Mahadevan     /* get the entities on the skin - only the faces */
11622417220eSVijay 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
1163f6829af0SVijay Mahadevan 
11649daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1165f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
1166f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
11672417220eSVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_INTERFACE, PSTATUS_NOT); MBERRNM(merr);
11689daf19fdSVijay Mahadevan #endif
1169f6829af0SVijay Mahadevan 
1170f6829af0SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
1171f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false); MBERRNM(ierr);
1172755f3dfbSVijay Mahadevan     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyvtx, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION); MBERRNM(ierr);
1173f6829af0SVijay Mahadevan   }
11749c368985SVijay Mahadevan   else {
11759c368985SVijay Mahadevan     /* Let us query the hierarchy manager and get the results directly for this level */
11769c368985SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->elocal->begin(); iter != dmmoab->elocal->end(); iter++) {
11779c368985SVijay Mahadevan       moab::EntityHandle elemHandle = *iter;
11789c368985SVijay Mahadevan       if (dmmoab->hierarchy->is_entity_on_boundary(elemHandle)) {
11799c368985SVijay Mahadevan         dmmoab->bndyelems->insert(elemHandle);
11809c368985SVijay Mahadevan         /* For this boundary element, query the vertices and add them to the list */
11819c368985SVijay Mahadevan         std::vector<moab::EntityHandle> connect;
11829c368985SVijay Mahadevan         merr = dmmoab->hierarchy->get_connectivity(elemHandle, dmmoab->hlevel, connect); MBERRNM(ierr);
11839c368985SVijay Mahadevan         for (unsigned iv=0; iv < connect.size(); ++iv)
11849c368985SVijay Mahadevan           if (dmmoab->hierarchy->is_entity_on_boundary(connect[iv]))
11859c368985SVijay Mahadevan             dmmoab->bndyvtx->insert(connect[iv]);
11869c368985SVijay Mahadevan         /* Next, let us query the boundary faces and add them also to the list */
11879c368985SVijay Mahadevan         std::vector<moab::EntityHandle> faces;
11889c368985SVijay Mahadevan         merr = dmmoab->hierarchy->get_adjacencies(elemHandle, dmmoab->dim-1, faces); MBERRNM(ierr);
11899c368985SVijay Mahadevan         for (unsigned ifa=0; ifa < faces.size(); ++ifa)
11909c368985SVijay Mahadevan           if (dmmoab->hierarchy->is_entity_on_boundary(faces[ifa]))
11919c368985SVijay Mahadevan             dmmoab->bndyfaces->insert(faces[ifa]);
11929c368985SVijay Mahadevan       }
11939c368985SVijay Mahadevan     }
11949c368985SVijay Mahadevan #ifdef MOAB_HAVE_MPI
11959c368985SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
11969c368985SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyvtx,   PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
11979c368985SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
11989c368985SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyelems, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
11999c368985SVijay Mahadevan #endif
12009c368985SVijay Mahadevan 
12019c368985SVijay Mahadevan   }
120249d66b22SVijay Mahadevan   PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyfaces->size(), dmmoab->bndyelems->size());
1203a044f6b6SVijay Mahadevan 
1204a044f6b6SVijay Mahadevan   /* Get the material sets and populate the data for all locally owned elements */
1205a044f6b6SVijay Mahadevan   {
1206a044f6b6SVijay Mahadevan     ierr = PetscCalloc1(dmmoab->elocal->size(), &dmmoab->materials);CHKERRQ(ierr);
1207a044f6b6SVijay Mahadevan     /* Get the count of entities of particular type from dmmoab->elocal
1208a044f6b6SVijay Mahadevan        -- Then, for each non-zero type, loop through and query the fileset to get the material tag data */
1209a044f6b6SVijay Mahadevan     moab::Range msets;
1210a044f6b6SVijay 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);
1211a044f6b6SVijay Mahadevan     if (msets.size() == 0) {
1212a044f6b6SVijay Mahadevan       PetscInfo(NULL, "No material sets found in the fileset.");
1213a044f6b6SVijay Mahadevan     }
1214a044f6b6SVijay Mahadevan 
1215a044f6b6SVijay Mahadevan     for (unsigned i=0; i < msets.size(); ++i) {
1216a044f6b6SVijay Mahadevan       moab::Range msetelems;
1217a044f6b6SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(msets[i], dmmoab->dim, msetelems, true);MB_CHK_ERR(merr);
1218aedf4482SVijay Mahadevan #ifdef MOAB_HAVE_MPI
1219aedf4482SVijay Mahadevan       /* filter all the non-owned and shared entities out of the list */
1220aedf4482SVijay Mahadevan       merr = dmmoab->pcomm->filter_pstatus(msetelems, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
1221aedf4482SVijay Mahadevan #endif
1222a044f6b6SVijay Mahadevan 
1223a044f6b6SVijay Mahadevan       int partID;
1224a044f6b6SVijay Mahadevan       moab::EntityHandle mset=msets[i];
1225a044f6b6SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &mset, 1, &partID);MB_CHK_ERR(merr);
1226a044f6b6SVijay Mahadevan 
1227a044f6b6SVijay Mahadevan       for (unsigned j=0; j < msetelems.size(); ++j)
1228a044f6b6SVijay Mahadevan         dmmoab->materials[dmmoab->elocal->index(msetelems[j])]=partID;
1229a044f6b6SVijay Mahadevan     }
1230a044f6b6SVijay Mahadevan   }
1231a044f6b6SVijay Mahadevan 
1232f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1233f6829af0SVijay Mahadevan }
1234f6829af0SVijay Mahadevan 
1235cab5ea25SPierre Jolivet /*@C
1236304006b3SVijay Mahadevan   DMMoabCreateVertices - Creates and adds several vertices to the primary set represented by the DM.
1237304006b3SVijay Mahadevan 
1238d083f849SBarry Smith   Collective
1239304006b3SVijay Mahadevan 
1240304006b3SVijay Mahadevan   Input Parameters:
1241304006b3SVijay Mahadevan + dm - The DM object
1242304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra)
1243304006b3SVijay Mahadevan . conn - The connectivity of the element
1244a2b725a8SWilliam Gropp - nverts - The number of vertices that form the element
1245304006b3SVijay Mahadevan 
1246304006b3SVijay Mahadevan   Output Parameter:
1247304006b3SVijay Mahadevan . overts  - The list of vertices that were created (can be NULL)
1248304006b3SVijay Mahadevan 
1249304006b3SVijay Mahadevan   Level: beginner
1250304006b3SVijay Mahadevan 
1251304006b3SVijay Mahadevan .seealso: DMMoabCreateSubmesh(), DMMoabCreateElement()
1252304006b3SVijay Mahadevan @*/
1253304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateVertices(DM dm, const PetscReal* coords, PetscInt nverts, moab::Range* overts)
1254304006b3SVijay Mahadevan {
1255304006b3SVijay Mahadevan   moab::ErrorCode     merr;
1256304006b3SVijay Mahadevan   DM_Moab            *dmmoab;
1257304006b3SVijay Mahadevan   moab::Range         verts;
1258304006b3SVijay Mahadevan 
1259304006b3SVijay Mahadevan   PetscFunctionBegin;
1260304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1261304006b3SVijay Mahadevan   PetscValidPointer(coords, 2);
1262304006b3SVijay Mahadevan 
1263304006b3SVijay Mahadevan   dmmoab = (DM_Moab*) dm->data;
1264304006b3SVijay Mahadevan 
1265304006b3SVijay Mahadevan   /* Insert new points */
1266304006b3SVijay Mahadevan   merr = dmmoab->mbiface->create_vertices(&coords[0], nverts, verts); MBERRNM(merr);
1267304006b3SVijay Mahadevan   merr = dmmoab->mbiface->add_entities(dmmoab->fileset, verts); MBERRNM(merr);
1268304006b3SVijay Mahadevan 
1269304006b3SVijay Mahadevan   if (overts) *overts = verts;
1270304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1271304006b3SVijay Mahadevan }
1272304006b3SVijay Mahadevan 
1273cab5ea25SPierre Jolivet /*@C
1274304006b3SVijay Mahadevan   DMMoabCreateElement - Adds an element of specified type to the primary set represented by the DM.
1275304006b3SVijay Mahadevan 
1276d083f849SBarry Smith   Collective
1277304006b3SVijay Mahadevan 
1278304006b3SVijay Mahadevan   Input Parameters:
1279304006b3SVijay Mahadevan + dm - The DM object
1280304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra)
1281304006b3SVijay Mahadevan . conn - The connectivity of the element
1282a2b725a8SWilliam Gropp - nverts - The number of vertices that form the element
1283304006b3SVijay Mahadevan 
1284304006b3SVijay Mahadevan   Output Parameter:
1285304006b3SVijay Mahadevan . oelem  - The handle to the element created and added to the DM object
1286304006b3SVijay Mahadevan 
1287304006b3SVijay Mahadevan   Level: beginner
1288304006b3SVijay Mahadevan 
1289304006b3SVijay Mahadevan .seealso: DMMoabCreateSubmesh(), DMMoabCreateVertices()
1290304006b3SVijay Mahadevan @*/
1291304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateElement(DM dm, const moab::EntityType type, const moab::EntityHandle* conn, PetscInt nverts, moab::EntityHandle* oelem)
1292304006b3SVijay Mahadevan {
1293304006b3SVijay Mahadevan   moab::ErrorCode     merr;
1294304006b3SVijay Mahadevan   DM_Moab            *dmmoab;
1295304006b3SVijay Mahadevan   moab::EntityHandle  elem;
1296304006b3SVijay Mahadevan 
1297304006b3SVijay Mahadevan   PetscFunctionBegin;
1298304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1299304006b3SVijay Mahadevan   PetscValidPointer(conn, 3);
1300304006b3SVijay Mahadevan 
1301304006b3SVijay Mahadevan   dmmoab = (DM_Moab*) dm->data;
1302304006b3SVijay Mahadevan 
1303304006b3SVijay Mahadevan   /* Insert new element */
1304304006b3SVijay Mahadevan   merr = dmmoab->mbiface->create_element(type, conn, nverts, elem); MBERRNM(merr);
1305304006b3SVijay Mahadevan   merr = dmmoab->mbiface->add_entities(dmmoab->fileset, &elem, 1); MBERRNM(merr);
1306304006b3SVijay Mahadevan 
1307304006b3SVijay Mahadevan   if (oelem) *oelem = elem;
1308304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1309304006b3SVijay Mahadevan }
1310304006b3SVijay Mahadevan 
1311cab5ea25SPierre Jolivet /*@C
1312304006b3SVijay Mahadevan   DMMoabCreateSubmesh - Creates a sub-DM object with a set that contains all vertices/elements of the parent
1313304006b3SVijay Mahadevan   in addition to providing support for dynamic mesh modifications. This is useful for AMR calculations to
1314304006b3SVijay Mahadevan   create a DM object on a refined level.
1315304006b3SVijay Mahadevan 
1316d083f849SBarry Smith   Collective
1317304006b3SVijay Mahadevan 
1318304006b3SVijay Mahadevan   Input Parameters:
1319a2b725a8SWilliam Gropp . dm - The DM object
1320304006b3SVijay Mahadevan 
1321304006b3SVijay Mahadevan   Output Parameter:
1322304006b3SVijay Mahadevan . newdm  - The sub DM object with updated set information
1323304006b3SVijay Mahadevan 
1324304006b3SVijay Mahadevan   Level: advanced
1325304006b3SVijay Mahadevan 
1326304006b3SVijay Mahadevan .seealso: DMCreate(), DMMoabCreateVertices(), DMMoabCreateElement()
1327304006b3SVijay Mahadevan @*/
1328304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateSubmesh(DM dm, DM *newdm)
1329304006b3SVijay Mahadevan {
1330304006b3SVijay Mahadevan   DM_Moab            *dmmoab;
1331304006b3SVijay Mahadevan   DM_Moab            *ndmmoab;
1332304006b3SVijay Mahadevan   moab::ErrorCode    merr;
1333304006b3SVijay Mahadevan   PetscErrorCode     ierr;
1334304006b3SVijay Mahadevan 
1335304006b3SVijay Mahadevan   PetscFunctionBegin;
1336304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1337304006b3SVijay Mahadevan 
1338304006b3SVijay Mahadevan   dmmoab = (DM_Moab*) dm->data;
1339304006b3SVijay Mahadevan 
1340304006b3SVijay Mahadevan   /* Create the basic DMMoab object and keep the default parameters created by DM impls */
13419daf19fdSVijay Mahadevan   ierr = DMMoabCreateMoab(((PetscObject)dm)->comm, dmmoab->mbiface, &dmmoab->ltog_tag, PETSC_NULL, newdm);CHKERRQ(ierr);
1342304006b3SVijay Mahadevan 
1343304006b3SVijay Mahadevan   /* get all the necessary handles from the private DM object */
1344304006b3SVijay Mahadevan   ndmmoab = (DM_Moab*) (*newdm)->data;
1345304006b3SVijay Mahadevan 
1346304006b3SVijay Mahadevan   /* set the sub-mesh's parent DM reference */
1347304006b3SVijay Mahadevan   ndmmoab->parent = &dm;
1348304006b3SVijay Mahadevan 
1349304006b3SVijay Mahadevan   /* create a file set to associate all entities in current mesh */
1350304006b3SVijay Mahadevan   merr = ndmmoab->mbiface->create_meshset(moab::MESHSET_SET, ndmmoab->fileset); MBERR("Creating file set failed", merr);
1351304006b3SVijay Mahadevan 
1352304006b3SVijay Mahadevan   /* create a meshset and then add old fileset as child */
1353304006b3SVijay Mahadevan   merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->vlocal); MBERR("Adding child vertices to parent failed", merr);
1354304006b3SVijay Mahadevan   merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->elocal); MBERR("Adding child elements to parent failed", merr);
1355304006b3SVijay Mahadevan 
1356304006b3SVijay Mahadevan   /* preserve the field association between the parent and sub-mesh objects */
1357304006b3SVijay Mahadevan   ierr = DMMoabSetFieldNames(*newdm, dmmoab->numFields, dmmoab->fieldNames);CHKERRQ(ierr);
1358304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1359304006b3SVijay Mahadevan }
1360304006b3SVijay Mahadevan 
1361304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_Ascii(DM dm, PetscViewer viewer)
1362304006b3SVijay Mahadevan {
1363304006b3SVijay Mahadevan   DM_Moab          *dmmoab = (DM_Moab*)(dm)->data;
1364304006b3SVijay Mahadevan   const char       *name;
1365304006b3SVijay Mahadevan   MPI_Comm          comm;
1366304006b3SVijay Mahadevan   PetscMPIInt       size;
1367304006b3SVijay Mahadevan   PetscErrorCode    ierr;
1368304006b3SVijay Mahadevan 
1369304006b3SVijay Mahadevan   PetscFunctionBegin;
1370304006b3SVijay Mahadevan   ierr = PetscObjectGetComm((PetscObject)dm, &comm);CHKERRQ(ierr);
1371ffc4695bSBarry Smith   ierr = MPI_Comm_size(comm, &size);CHKERRMPI(ierr);
1372304006b3SVijay Mahadevan   ierr = PetscObjectGetName((PetscObject) dm, &name);CHKERRQ(ierr);
1373304006b3SVijay Mahadevan   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1374304006b3SVijay Mahadevan   if (name) {ierr = PetscViewerASCIIPrintf(viewer, "%s in %D dimensions:\n", name, dmmoab->dim);CHKERRQ(ierr);}
1375304006b3SVijay Mahadevan   else      {ierr = PetscViewerASCIIPrintf(viewer, "Mesh in %D dimensions:\n", dmmoab->dim);CHKERRQ(ierr);}
1376304006b3SVijay Mahadevan   /* print details about the global mesh */
1377304006b3SVijay Mahadevan   {
1378304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
13799c368985SVijay Mahadevan     ierr = PetscViewerASCIIPrintf(viewer, "Sizes: cells=%D, vertices=%D, blocks=%D\n", dmmoab->nele, dmmoab->n, dmmoab->bs);CHKERRQ(ierr);
1380304006b3SVijay Mahadevan     /* print boundary data */
1381304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPrintf(viewer, "Boundary trace:\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size());CHKERRQ(ierr);
1382304006b3SVijay Mahadevan     {
1383304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1384304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPrintf(viewer, "cells=%D, faces=%D, vertices=%D\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size());CHKERRQ(ierr);
1385304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1386304006b3SVijay Mahadevan     }
1387304006b3SVijay Mahadevan     /* print field data */
1388304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPrintf(viewer, "Fields: %D components\n", dmmoab->numFields);CHKERRQ(ierr);
1389304006b3SVijay Mahadevan     {
1390304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1391304006b3SVijay Mahadevan       for (int i = 0; i < dmmoab->numFields; ++i) {
1392304006b3SVijay Mahadevan         ierr = PetscViewerASCIIPrintf(viewer, "[%D] - %s\n", i, dmmoab->fieldNames[i]);CHKERRQ(ierr);
1393304006b3SVijay Mahadevan       }
1394304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1395304006b3SVijay Mahadevan     }
1396304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1397304006b3SVijay Mahadevan   }
1398304006b3SVijay Mahadevan   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1399304006b3SVijay Mahadevan   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
1400304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1401304006b3SVijay Mahadevan }
1402304006b3SVijay Mahadevan 
1403304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_VTK(DM dm, PetscViewer v)
1404304006b3SVijay Mahadevan {
1405304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1406304006b3SVijay Mahadevan }
1407304006b3SVijay Mahadevan 
1408304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_HDF5(DM dm, PetscViewer v)
1409304006b3SVijay Mahadevan {
1410304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1411304006b3SVijay Mahadevan }
1412304006b3SVijay Mahadevan 
1413304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMView_Moab(DM dm, PetscViewer viewer)
1414304006b3SVijay Mahadevan {
1415304006b3SVijay Mahadevan   PetscBool      iascii, ishdf5, isvtk;
1416304006b3SVijay Mahadevan   PetscErrorCode ierr;
1417304006b3SVijay Mahadevan 
1418304006b3SVijay Mahadevan   PetscFunctionBegin;
1419304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1420304006b3SVijay Mahadevan   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
1421304006b3SVijay Mahadevan   ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr);
1422304006b3SVijay Mahadevan   ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERVTK,   &isvtk);CHKERRQ(ierr);
1423304006b3SVijay Mahadevan   ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERHDF5,  &ishdf5);CHKERRQ(ierr);
1424304006b3SVijay Mahadevan   if (iascii) {
1425304006b3SVijay Mahadevan     ierr = DMMoabView_Ascii(dm, viewer);CHKERRQ(ierr);
1426304006b3SVijay Mahadevan   } else if (ishdf5) {
1427304006b3SVijay Mahadevan #if defined(PETSC_HAVE_HDF5) && defined(MOAB_HAVE_HDF5)
1428304006b3SVijay Mahadevan     ierr = PetscViewerPushFormat(viewer, PETSC_VIEWER_HDF5_VIZ);CHKERRQ(ierr);
1429304006b3SVijay Mahadevan     ierr = DMMoabView_HDF5(dm, viewer);CHKERRQ(ierr);
1430304006b3SVijay Mahadevan     ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
1431304006b3SVijay Mahadevan #else
1432304006b3SVijay Mahadevan     SETERRQ(PetscObjectComm((PetscObject) dm), PETSC_ERR_SUP, "HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5");
1433304006b3SVijay Mahadevan #endif
1434304006b3SVijay Mahadevan   }
1435304006b3SVijay Mahadevan   else if (isvtk) {
1436304006b3SVijay Mahadevan     ierr = DMMoabView_VTK(dm, viewer);CHKERRQ(ierr);
1437304006b3SVijay Mahadevan   }
1438304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1439304006b3SVijay Mahadevan }
1440304006b3SVijay Mahadevan 
1441304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMInitialize_Moab(DM dm)
1442304006b3SVijay Mahadevan {
1443304006b3SVijay Mahadevan   PetscFunctionBegin;
1444304006b3SVijay Mahadevan   dm->ops->view                            = DMView_Moab;
1445304006b3SVijay Mahadevan   dm->ops->load                            = NULL /* DMLoad_Moab */;
1446304006b3SVijay Mahadevan   dm->ops->setfromoptions                  = DMSetFromOptions_Moab;
1447304006b3SVijay Mahadevan   dm->ops->clone                           = DMClone_Moab;
1448304006b3SVijay Mahadevan   dm->ops->setup                           = DMSetUp_Moab;
14491bb6d2a8SBarry Smith   dm->ops->createlocalsection            = NULL;
1450304006b3SVijay Mahadevan   dm->ops->createdefaultconstraints        = NULL;
1451304006b3SVijay Mahadevan   dm->ops->createglobalvector              = DMCreateGlobalVector_Moab;
1452304006b3SVijay Mahadevan   dm->ops->createlocalvector               = DMCreateLocalVector_Moab;
1453304006b3SVijay Mahadevan   dm->ops->getlocaltoglobalmapping         = NULL;
1454304006b3SVijay Mahadevan   dm->ops->createfieldis                   = NULL;
1455304006b3SVijay Mahadevan   dm->ops->createcoordinatedm              = NULL /* DMCreateCoordinateDM_Moab */;
1456304006b3SVijay Mahadevan   dm->ops->getcoloring                     = NULL;
1457304006b3SVijay Mahadevan   dm->ops->creatematrix                    = DMCreateMatrix_Moab;
1458304006b3SVijay Mahadevan   dm->ops->createinterpolation             = DMCreateInterpolation_Moab;
14595a84ad33SLisandro Dalcin   dm->ops->createinjection                 = NULL /* DMCreateInjection_Moab */;
1460304006b3SVijay Mahadevan   dm->ops->refine                          = DMRefine_Moab;
1461304006b3SVijay Mahadevan   dm->ops->coarsen                         = DMCoarsen_Moab;
1462304006b3SVijay Mahadevan   dm->ops->refinehierarchy                 = DMRefineHierarchy_Moab;
1463304006b3SVijay Mahadevan   dm->ops->coarsenhierarchy                = DMCoarsenHierarchy_Moab;
1464304006b3SVijay Mahadevan   dm->ops->globaltolocalbegin              = DMGlobalToLocalBegin_Moab;
1465304006b3SVijay Mahadevan   dm->ops->globaltolocalend                = DMGlobalToLocalEnd_Moab;
1466304006b3SVijay Mahadevan   dm->ops->localtoglobalbegin              = DMLocalToGlobalBegin_Moab;
1467304006b3SVijay Mahadevan   dm->ops->localtoglobalend                = DMLocalToGlobalEnd_Moab;
1468304006b3SVijay Mahadevan   dm->ops->destroy                         = DMDestroy_Moab;
1469304006b3SVijay Mahadevan   dm->ops->createsubdm                     = NULL /* DMCreateSubDM_Moab */;
1470304006b3SVijay Mahadevan   dm->ops->getdimpoints                    = NULL /* DMGetDimPoints_Moab */;
1471304006b3SVijay Mahadevan   dm->ops->locatepoints                    = NULL /* DMLocatePoints_Moab */;
1472304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1473304006b3SVijay Mahadevan }
1474304006b3SVijay Mahadevan 
1475304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm)
1476304006b3SVijay Mahadevan {
1477304006b3SVijay Mahadevan   PetscErrorCode     ierr;
1478304006b3SVijay Mahadevan 
1479304006b3SVijay Mahadevan   PetscFunctionBegin;
1480304006b3SVijay Mahadevan   /* get all the necessary handles from the private DM object */
1481304006b3SVijay Mahadevan   (*newdm)->data = (DM_Moab*) dm->data;
1482304006b3SVijay Mahadevan   ((DM_Moab*)dm->data)->refct++;
1483304006b3SVijay Mahadevan 
1484d57f96a3SLisandro Dalcin   ierr = PetscObjectChangeTypeName((PetscObject) *newdm, DMMOAB);CHKERRQ(ierr);
1485304006b3SVijay Mahadevan   ierr = DMInitialize_Moab(*newdm);CHKERRQ(ierr);
1486304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1487304006b3SVijay Mahadevan }
1488304006b3SVijay Mahadevan 
1489f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
1490f6829af0SVijay Mahadevan {
1491f6829af0SVijay Mahadevan   PetscErrorCode ierr;
1492f6829af0SVijay Mahadevan 
1493f6829af0SVijay Mahadevan   PetscFunctionBegin;
1494f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1495f90c3b0eSVijay Mahadevan   ierr = PetscNewLog(dm, (DM_Moab**)&dm->data);CHKERRQ(ierr);
1496f6829af0SVijay Mahadevan 
1497f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
1498f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->numFields = 1;
1499f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
1500f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
1501f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
1502f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
1503f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
1504f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleghost = 0;
1505c528d872SBarry Smith   ((DM_Moab*)dm->data)->ltog_map = NULL;
1506c528d872SBarry Smith   ((DM_Moab*)dm->data)->ltog_sendrecv = NULL;
1507f6829af0SVijay Mahadevan 
1508304006b3SVijay Mahadevan   ((DM_Moab*)dm->data)->refct = 1;
1509304006b3SVijay Mahadevan   ((DM_Moab*)dm->data)->parent = NULL;
1510f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
1511f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
1512f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
1513f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
1514f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
1515f6829af0SVijay Mahadevan 
1516304006b3SVijay Mahadevan   ierr = DMInitialize_Moab(dm);CHKERRQ(ierr);
1517f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1518f6829af0SVijay Mahadevan }
1519f6829af0SVijay Mahadevan 
1520