xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 755f3dfbc21a83a2a40e224cc9e5f876bede072f)
1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I  "petscdmmoab.h"   I*/
21d72bce8STim Tautges 
31d72bce8STim Tautges #include <petscdmmoab.h>
488face26SJed Brown #include <MBTagConventions.hpp>
51cec0304SVijay Mahadevan #include <moab/Skinner.hpp>
6032b8ab6SVijay Mahadevan 
7fd349b41STim Tautges 
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 
17c6ef30f9SVijay Mahadevan   Reference: http://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 
24c6ef30f9SVijay Mahadevan 
251d72bce8STim Tautges /*@
261d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
271d72bce8STim Tautges 
281d72bce8STim Tautges   Collective on MPI_Comm
291d72bce8STim Tautges 
301d72bce8STim Tautges   Input Parameter:
311d72bce8STim Tautges . comm - The communicator for the DMMoab object
321d72bce8STim Tautges 
331d72bce8STim Tautges   Output Parameter:
34032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
351d72bce8STim Tautges 
361d72bce8STim Tautges   Level: beginner
371d72bce8STim Tautges 
381d72bce8STim Tautges .keywords: DMMoab, create
391d72bce8STim Tautges @*/
40032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
411d72bce8STim Tautges {
421d72bce8STim Tautges   PetscErrorCode ierr;
431d72bce8STim Tautges 
441d72bce8STim Tautges   PetscFunctionBegin;
45032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,2);
46032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
47032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
481d72bce8STim Tautges   PetscFunctionReturn(0);
491d72bce8STim Tautges }
501d72bce8STim Tautges 
511d72bce8STim Tautges /*@
52b117cd09SVijay Mahadevan   DMMoabCreateMoab - Creates a DMMoab object, optionally from an instance and other data
531d72bce8STim Tautges 
541d72bce8STim Tautges   Collective on MPI_Comm
551d72bce8STim Tautges 
561d72bce8STim Tautges   Input Parameter:
571d72bce8STim Tautges . comm - The communicator for the DMMoab object
58032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
59a4d2169cSTim Tautges          along with the DMMoab
60a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
611d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
621d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
631d72bce8STim Tautges 
641d72bce8STim Tautges   Output Parameter:
65032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
661d72bce8STim Tautges 
67032b8ab6SVijay Mahadevan   Level: intermediate
681d72bce8STim Tautges 
691d72bce8STim Tautges .keywords: DMMoab, create
701d72bce8STim Tautges @*/
71032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
721d72bce8STim Tautges {
731d72bce8STim Tautges   PetscErrorCode ierr;
74032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
751cec0304SVijay Mahadevan   moab::EntityHandle partnset;
761cec0304SVijay Mahadevan   PetscInt rank, nprocs;
7785d305f5SVijay Mahadevan   DM             dmmb;
78853cdec3SJed Brown   DM_Moab        *dmmoab;
791d72bce8STim Tautges 
801d72bce8STim Tautges   PetscFunctionBegin;
81032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,6);
8285d305f5SVijay Mahadevan 
8385d305f5SVijay Mahadevan   ierr = DMMoabCreate(comm, &dmmb);CHKERRQ(ierr);
8485d305f5SVijay Mahadevan   dmmoab = (DM_Moab*)(dmmb)->data;
85a4d2169cSTim Tautges 
86a4d2169cSTim Tautges   if (!mbiface) {
8772ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
887d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
891d72bce8STim Tautges   }
901cec0304SVijay Mahadevan   else {
911cec0304SVijay Mahadevan     dmmoab->mbiface = mbiface;
927d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
931cec0304SVijay Mahadevan   }
941cec0304SVijay Mahadevan 
95b5410836SVijay Mahadevan   /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */
96b5410836SVijay Mahadevan   dmmoab->fileset=0;
97b117cd09SVijay Mahadevan   dmmoab->hlevel=0;
9849d66b22SVijay Mahadevan   dmmoab->nghostrings=0;
997d89fc02STim Tautges 
100a4d2169cSTim Tautges   if (!pcomm) {
101032b8ab6SVijay Mahadevan     ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
102032b8ab6SVijay Mahadevan     ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
103032b8ab6SVijay Mahadevan 
104db66d124SVijay Mahadevan     /* Create root sets for each mesh.  Then pass these
105db66d124SVijay Mahadevan        to the load_file functions to be populated. */
1060c8a2322SVijay Mahadevan     merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);MBERR("Creating partition set failed", merr);
107032b8ab6SVijay Mahadevan 
108db66d124SVijay Mahadevan     /* Create the parallel communicator object with the partition handle associated with MOAB */
10972ff976dSVijay Mahadevan     dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
11072ff976dSVijay Mahadevan   }
11172ff976dSVijay Mahadevan   else {
11285d305f5SVijay Mahadevan     ierr = DMMoabSetParallelComm(dmmb, pcomm);CHKERRQ(ierr);
113032b8ab6SVijay Mahadevan   }
114032b8ab6SVijay Mahadevan 
1154973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
1164973de03SVijay Mahadevan   dmmoab->bs = 1;
117addae81cSVijay Mahadevan   dmmoab->numFields = 1;
1183f1c6e43SVijay Mahadevan   ierr = PetscMalloc(dmmoab->numFields*sizeof(char*),&dmmoab->fieldNames);CHKERRQ(ierr);
1193f1c6e43SVijay Mahadevan   ierr = PetscStrallocpy("DEFAULT", (char**) &dmmoab->fieldNames[0]);CHKERRQ(ierr);
1202e4e7c01SVijay Mahadevan   dmmoab->rw_dbglevel = 0;
1212e4e7c01SVijay Mahadevan   dmmoab->partition_by_rank = PETSC_FALSE;
1222e4e7c01SVijay Mahadevan   dmmoab->extra_read_options[0] = '\0';
1232e4e7c01SVijay Mahadevan   dmmoab->extra_write_options[0] = '\0';
1242e4e7c01SVijay Mahadevan   dmmoab->read_mode = READ_PART;
1252e4e7c01SVijay Mahadevan   dmmoab->write_mode = WRITE_PART;
1264973de03SVijay Mahadevan 
1274973de03SVijay Mahadevan   /* set global ID tag handle */
1281a845d2aSVijay Mahadevan   if (ltog_tag && *ltog_tag) {
12985d305f5SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag);CHKERRQ(ierr);
130032b8ab6SVijay Mahadevan   }
131032b8ab6SVijay Mahadevan   else {
1321a845d2aSVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
1331a845d2aSVijay Mahadevan     if (ltog_tag) *ltog_tag = dmmoab->ltog_tag;
134a4d2169cSTim Tautges   }
135a4d2169cSTim Tautges 
136340f3b9aSVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag);MBERRNM(merr);
137340f3b9aSVijay Mahadevan 
1384973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
139a4d2169cSTim Tautges   if (range) {
14085d305f5SVijay Mahadevan     ierr = DMMoabSetLocalVertices(dmmb, range);CHKERRQ(ierr);
141a4d2169cSTim Tautges   }
14285d305f5SVijay Mahadevan   *dmb=dmmb;
1431d72bce8STim Tautges   PetscFunctionReturn(0);
1441d72bce8STim Tautges }
1451d72bce8STim Tautges 
146aa768e4cSTim Tautges /*@
147aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
148aa768e4cSTim Tautges 
149aa768e4cSTim Tautges   Collective on MPI_Comm
150aa768e4cSTim Tautges 
151aa768e4cSTim Tautges   Input Parameter:
152aa768e4cSTim Tautges . dm    - The DMMoab object being set
153aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
154aa768e4cSTim Tautges 
155aa768e4cSTim Tautges   Level: beginner
156aa768e4cSTim Tautges 
157aa768e4cSTim Tautges .keywords: DMMoab, create
158aa768e4cSTim Tautges @*/
1591d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
1601d72bce8STim Tautges {
161032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
162032b8ab6SVijay Mahadevan 
1631d72bce8STim Tautges   PetscFunctionBegin;
1641d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1651cec0304SVijay Mahadevan   PetscValidPointer(pcomm,2);
166032b8ab6SVijay Mahadevan   dmmoab->pcomm = pcomm;
167032b8ab6SVijay Mahadevan   dmmoab->mbiface = pcomm->get_moab();
168032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
1691d72bce8STim Tautges   PetscFunctionReturn(0);
1701d72bce8STim Tautges }
1711d72bce8STim Tautges 
1721d72bce8STim Tautges 
173aa768e4cSTim Tautges /*@
174aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
175aa768e4cSTim Tautges 
176aa768e4cSTim Tautges   Collective on MPI_Comm
177aa768e4cSTim Tautges 
178aa768e4cSTim Tautges   Input Parameter:
179aa768e4cSTim Tautges . dm    - The DMMoab object being set
180aa768e4cSTim Tautges 
181aa768e4cSTim Tautges   Output Parameter:
182aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
183aa768e4cSTim Tautges 
184aa768e4cSTim Tautges   Level: beginner
185aa768e4cSTim Tautges 
186aa768e4cSTim Tautges .keywords: DMMoab, create
187aa768e4cSTim Tautges @*/
1881d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
1891d72bce8STim Tautges {
1901d72bce8STim Tautges   PetscFunctionBegin;
1911d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
192032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
1931d72bce8STim Tautges   PetscFunctionReturn(0);
1941d72bce8STim Tautges }
1951d72bce8STim Tautges 
1961d72bce8STim Tautges 
197aa768e4cSTim Tautges /*@
198aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
199aa768e4cSTim Tautges 
200aa768e4cSTim Tautges   Collective on MPI_Comm
201aa768e4cSTim Tautges 
202aa768e4cSTim Tautges   Input Parameter:
203aa768e4cSTim Tautges . dm      - The DMMoab object being set
204aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
205aa768e4cSTim Tautges 
206aa768e4cSTim Tautges   Level: beginner
207aa768e4cSTim Tautges 
208aa768e4cSTim Tautges .keywords: DMMoab, create
209aa768e4cSTim Tautges @*/
210a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
2111d72bce8STim Tautges {
212032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
213032b8ab6SVijay Mahadevan 
2141d72bce8STim Tautges   PetscFunctionBegin;
2151d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2161cec0304SVijay Mahadevan   PetscValidPointer(mbiface,2);
217032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
218032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
219032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
2201d72bce8STim Tautges   PetscFunctionReturn(0);
2211d72bce8STim Tautges }
2221d72bce8STim Tautges 
2231d72bce8STim Tautges 
224aa768e4cSTim Tautges /*@
225aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
226aa768e4cSTim Tautges 
227aa768e4cSTim Tautges   Collective on MPI_Comm
228aa768e4cSTim Tautges 
229aa768e4cSTim Tautges   Input Parameter:
230aa768e4cSTim Tautges . dm      - The DMMoab object being set
231aa768e4cSTim Tautges 
232aa768e4cSTim Tautges   Output Parameter:
233aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
234aa768e4cSTim Tautges 
235aa768e4cSTim Tautges   Level: beginner
236aa768e4cSTim Tautges 
237aa768e4cSTim Tautges .keywords: DMMoab, create
238aa768e4cSTim Tautges @*/
239a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
2401d72bce8STim Tautges {
2419426e041SSatish Balay   PetscErrorCode   ierr;
242cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
243cabb514dSBarry Smith 
2441d72bce8STim Tautges   PetscFunctionBegin;
2451d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
246cabb514dSBarry 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);
247a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
2481d72bce8STim Tautges   PetscFunctionReturn(0);
2491d72bce8STim Tautges }
2501d72bce8STim Tautges 
2511d72bce8STim Tautges 
252aa768e4cSTim Tautges /*@
2535eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
254aa768e4cSTim Tautges 
255aa768e4cSTim Tautges   Collective on MPI_Comm
256aa768e4cSTim Tautges 
257aa768e4cSTim Tautges   Input Parameter:
258aa768e4cSTim Tautges . dm    - The DMMoab object being set
259aa768e4cSTim Tautges . range - The entities treated by this DMMoab
260aa768e4cSTim Tautges 
261aa768e4cSTim Tautges   Level: beginner
262aa768e4cSTim Tautges 
263aa768e4cSTim Tautges .keywords: DMMoab, create
264aa768e4cSTim Tautges @*/
2655eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range)
2661d72bce8STim Tautges {
267032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
268032b8ab6SVijay Mahadevan   PetscErrorCode  ierr;
269fd3326ddSVijay Mahadevan   moab::Range     tmpvtxs;
270032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
271032b8ab6SVijay Mahadevan 
2721d72bce8STim Tautges   PetscFunctionBegin;
2731d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
274032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
275032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
276fd3326ddSVijay Mahadevan 
277032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
278fd3326ddSVijay Mahadevan 
279fd3326ddSVijay Mahadevan   /* filter based on parallel status */
280fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
281fd3326ddSVijay Mahadevan 
282fd3326ddSVijay Mahadevan   /* filter all the non-owned and shared entities out of the list */
283fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
284fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(tmpvtxs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
285fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost);
286fd3326ddSVijay Mahadevan   *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs);
287fd3326ddSVijay Mahadevan 
288fd3326ddSVijay Mahadevan   /* compute and cache the sizes of local and ghosted entities */
289032b8ab6SVijay Mahadevan   dmmoab->nloc = dmmoab->vowned->size();
290032b8ab6SVijay Mahadevan   dmmoab->nghost = dmmoab->vghost->size();
291b2566f29SBarry Smith   ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
2921d72bce8STim Tautges   PetscFunctionReturn(0);
2931d72bce8STim Tautges }
2941d72bce8STim Tautges 
2951d72bce8STim Tautges 
2968d8d51c8SVijay Mahadevan /*@
2978d8d51c8SVijay Mahadevan   DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab
2988d8d51c8SVijay Mahadevan 
2998d8d51c8SVijay Mahadevan   Collective on MPI_Comm
3008d8d51c8SVijay Mahadevan 
3018d8d51c8SVijay Mahadevan   Input Parameter:
3028d8d51c8SVijay Mahadevan . dm    - The DMMoab object being set
3038d8d51c8SVijay Mahadevan 
3048d8d51c8SVijay Mahadevan   Output Parameter:
3058d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted)
3068d8d51c8SVijay Mahadevan 
3078d8d51c8SVijay Mahadevan   Level: beginner
3088d8d51c8SVijay Mahadevan 
3098d8d51c8SVijay Mahadevan .keywords: DMMoab, create
3108d8d51c8SVijay Mahadevan @*/
3118d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local)
3128d8d51c8SVijay Mahadevan {
3138d8d51c8SVijay Mahadevan   PetscFunctionBegin;
3148d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3158d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab*)dm->data)->vlocal;
3168d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
3178d8d51c8SVijay Mahadevan }
3188d8d51c8SVijay Mahadevan 
3198d8d51c8SVijay Mahadevan 
3208d8d51c8SVijay Mahadevan 
321aa768e4cSTim Tautges /*@
3225eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
323aa768e4cSTim Tautges 
324aa768e4cSTim Tautges   Collective on MPI_Comm
325aa768e4cSTim Tautges 
326aa768e4cSTim Tautges   Input Parameter:
327aa768e4cSTim Tautges . dm    - The DMMoab object being set
328aa768e4cSTim Tautges 
329aa768e4cSTim Tautges   Output Parameter:
3305eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab
3315eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition
332aa768e4cSTim Tautges 
333aa768e4cSTim Tautges   Level: beginner
334aa768e4cSTim Tautges 
335aa768e4cSTim Tautges .keywords: DMMoab, create
336aa768e4cSTim Tautges @*/
337351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,const moab::Range **owned,const moab::Range **ghost)
3381d72bce8STim Tautges {
3391d72bce8STim Tautges   PetscFunctionBegin;
3401d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
341351b8a77SVijay Mahadevan   if (owned) *owned = ((DM_Moab*)dm->data)->vowned;
342351b8a77SVijay Mahadevan   if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost;
3431d72bce8STim Tautges   PetscFunctionReturn(0);
3441d72bce8STim Tautges }
3451d72bce8STim Tautges 
3465eb88e9dSVijay Mahadevan /*@
3475eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
3485eb88e9dSVijay Mahadevan 
3495eb88e9dSVijay Mahadevan   Collective on MPI_Comm
3505eb88e9dSVijay Mahadevan 
3515eb88e9dSVijay Mahadevan   Input Parameter:
3525eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
3535eb88e9dSVijay Mahadevan 
3545eb88e9dSVijay Mahadevan   Output Parameter:
3555eb88e9dSVijay Mahadevan . range - The entities owned locally
3565eb88e9dSVijay Mahadevan 
3575eb88e9dSVijay Mahadevan   Level: beginner
3585eb88e9dSVijay Mahadevan 
3595eb88e9dSVijay Mahadevan .keywords: DMMoab, create
3605eb88e9dSVijay Mahadevan @*/
361351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,const moab::Range **range)
3625eb88e9dSVijay Mahadevan {
3635eb88e9dSVijay Mahadevan   PetscFunctionBegin;
3645eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
365351b8a77SVijay Mahadevan   if (range) *range = ((DM_Moab*)dm->data)->elocal;
3661cec0304SVijay Mahadevan   PetscFunctionReturn(0);
3671cec0304SVijay Mahadevan }
3681cec0304SVijay Mahadevan 
3691cec0304SVijay Mahadevan 
3701cec0304SVijay Mahadevan /*@
3711cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
3721cec0304SVijay Mahadevan 
3731cec0304SVijay Mahadevan   Collective on MPI_Comm
3741cec0304SVijay Mahadevan 
3751cec0304SVijay Mahadevan   Input Parameter:
3761cec0304SVijay Mahadevan . dm    - The DMMoab object being set
3771cec0304SVijay Mahadevan . range - The entities treated by this DMMoab
3781cec0304SVijay Mahadevan 
3791cec0304SVijay Mahadevan   Level: beginner
3801cec0304SVijay Mahadevan 
3811cec0304SVijay Mahadevan .keywords: DMMoab, create
3821cec0304SVijay Mahadevan @*/
3831cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range)
3841cec0304SVijay Mahadevan {
3851cec0304SVijay Mahadevan   moab::ErrorCode merr;
3861cec0304SVijay Mahadevan   PetscErrorCode  ierr;
3871cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
3881cec0304SVijay Mahadevan 
3891cec0304SVijay Mahadevan   PetscFunctionBegin;
3901cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3911cec0304SVijay Mahadevan   dmmoab->elocal->clear();
3921cec0304SVijay Mahadevan   dmmoab->eghost->clear();
3931cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
3941cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
3951cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
3961cec0304SVijay Mahadevan   dmmoab->neleloc=dmmoab->elocal->size();
39741dd5348SVijay Mahadevan   dmmoab->neleghost=dmmoab->eghost->size();
398b2566f29SBarry Smith   ierr = MPIU_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
3998cbae1a6SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele);
4005eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
4015eb88e9dSVijay Mahadevan }
4025eb88e9dSVijay Mahadevan 
4035eb88e9dSVijay Mahadevan 
404aa768e4cSTim Tautges /*@
405aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
406aa768e4cSTim Tautges 
407aa768e4cSTim Tautges   Collective on MPI_Comm
408aa768e4cSTim Tautges 
409aa768e4cSTim Tautges   Input Parameter:
410aa768e4cSTim Tautges . dm      - The DMMoab object being set
411aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
412aa768e4cSTim Tautges 
413aa768e4cSTim Tautges   Level: beginner
414aa768e4cSTim Tautges 
415aa768e4cSTim Tautges .keywords: DMMoab, create
416aa768e4cSTim Tautges @*/
4171d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
4181d72bce8STim Tautges {
4191d72bce8STim Tautges   PetscFunctionBegin;
4201d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4211d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
4221d72bce8STim Tautges   PetscFunctionReturn(0);
4231d72bce8STim Tautges }
4241d72bce8STim Tautges 
4251d72bce8STim Tautges 
426aa768e4cSTim Tautges /*@
427aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
428aa768e4cSTim Tautges 
429aa768e4cSTim Tautges   Collective on MPI_Comm
430aa768e4cSTim Tautges 
431aa768e4cSTim Tautges   Input Parameter:
432aa768e4cSTim Tautges . dm      - The DMMoab object being set
433aa768e4cSTim Tautges 
434aa768e4cSTim Tautges   Output Parameter:
435aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
436aa768e4cSTim Tautges 
437aa768e4cSTim Tautges   Level: beginner
438aa768e4cSTim Tautges 
439aa768e4cSTim Tautges .keywords: DMMoab, create
440aa768e4cSTim Tautges @*/
4411d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
4421d72bce8STim Tautges {
4431d72bce8STim Tautges   PetscFunctionBegin;
4441d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4451d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
4461d72bce8STim Tautges   PetscFunctionReturn(0);
4471d72bce8STim Tautges }
4481d72bce8STim Tautges 
4491d72bce8STim Tautges 
450aa768e4cSTim Tautges /*@
451aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
452aa768e4cSTim Tautges 
453aa768e4cSTim Tautges   Collective on MPI_Comm
454aa768e4cSTim Tautges 
455aa768e4cSTim Tautges   Input Parameter:
456aa768e4cSTim Tautges . dm - The DMMoab object being set
457aa768e4cSTim Tautges . bs - The block size used with this DMMoab
458aa768e4cSTim Tautges 
459aa768e4cSTim Tautges   Level: beginner
460aa768e4cSTim Tautges 
461aa768e4cSTim Tautges .keywords: DMMoab, create
462aa768e4cSTim Tautges @*/
4631d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
4641d72bce8STim Tautges {
4651d72bce8STim Tautges   PetscFunctionBegin;
4661d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4671d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
4681d72bce8STim Tautges   PetscFunctionReturn(0);
4691d72bce8STim Tautges }
4701d72bce8STim Tautges 
4711d72bce8STim Tautges 
472aa768e4cSTim Tautges /*@
473aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
474aa768e4cSTim Tautges 
475aa768e4cSTim Tautges   Collective on MPI_Comm
476aa768e4cSTim Tautges 
477aa768e4cSTim Tautges   Input Parameter:
478aa768e4cSTim Tautges . dm - The DMMoab object being set
479aa768e4cSTim Tautges 
480aa768e4cSTim Tautges   Output Parameter:
481aa768e4cSTim Tautges . bs - The block size used with this DMMoab
482aa768e4cSTim Tautges 
483aa768e4cSTim Tautges   Level: beginner
484aa768e4cSTim Tautges 
485aa768e4cSTim Tautges .keywords: DMMoab, create
486aa768e4cSTim Tautges @*/
4871d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
4881d72bce8STim Tautges {
4891d72bce8STim Tautges   PetscFunctionBegin;
4901d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4911d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
4921d72bce8STim Tautges   PetscFunctionReturn(0);
4931d72bce8STim Tautges }
4941d72bce8STim Tautges 
4951cec0304SVijay Mahadevan 
496212ad6d1SVijay Mahadevan /*@
497212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
498212ad6d1SVijay Mahadevan 
49900cc10feSVijay Mahadevan   Collective on DM
500212ad6d1SVijay Mahadevan 
501212ad6d1SVijay Mahadevan   Input Parameter:
502212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
503212ad6d1SVijay Mahadevan 
504212ad6d1SVijay Mahadevan   Output Parameter:
50500cc10feSVijay Mahadevan . neg - The number of global elements in the DMMoab instance
50600cc10feSVijay Mahadevan . nvg - The number of global vertices in the DMMoab instance
507212ad6d1SVijay Mahadevan 
508212ad6d1SVijay Mahadevan   Level: beginner
509212ad6d1SVijay Mahadevan 
510212ad6d1SVijay Mahadevan .keywords: DMMoab, create
511212ad6d1SVijay Mahadevan @*/
51241dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *neg,PetscInt *nvg)
513212ad6d1SVijay Mahadevan {
514212ad6d1SVijay Mahadevan   PetscFunctionBegin;
515212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
51641dd5348SVijay Mahadevan   if(neg) *neg = ((DM_Moab*)dm->data)->nele;
51741dd5348SVijay Mahadevan   if(nvg) *nvg = ((DM_Moab*)dm->data)->n;
518212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
519212ad6d1SVijay Mahadevan }
520212ad6d1SVijay Mahadevan 
521212ad6d1SVijay Mahadevan 
522212ad6d1SVijay Mahadevan /*@
523212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
524212ad6d1SVijay Mahadevan 
52500cc10feSVijay Mahadevan   Collective on DM
526212ad6d1SVijay Mahadevan 
527212ad6d1SVijay Mahadevan   Input Parameter:
528212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
529212ad6d1SVijay Mahadevan 
530212ad6d1SVijay Mahadevan   Output Parameter:
531b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor
53200cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor
53300cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor
53400cc10feSVijay Mahadevan . nvg - The number of ghosted vertices in this processor
535212ad6d1SVijay Mahadevan 
536212ad6d1SVijay Mahadevan   Level: beginner
537212ad6d1SVijay Mahadevan 
538212ad6d1SVijay Mahadevan .keywords: DMMoab, create
539212ad6d1SVijay Mahadevan @*/
54041dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nel,PetscInt *neg,PetscInt *nvl,PetscInt *nvg)
541212ad6d1SVijay Mahadevan {
542212ad6d1SVijay Mahadevan   PetscFunctionBegin;
543212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
54441dd5348SVijay Mahadevan   if(nel) *nel = ((DM_Moab*)dm->data)->neleloc;
54541dd5348SVijay Mahadevan   if(neg) *neg = ((DM_Moab*)dm->data)->neleghost;
54641dd5348SVijay Mahadevan   if(nvl) *nvl = ((DM_Moab*)dm->data)->nloc;
54741dd5348SVijay Mahadevan   if(nvg) *nvg = ((DM_Moab*)dm->data)->nghost;
548212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
549212ad6d1SVijay Mahadevan }
550212ad6d1SVijay Mahadevan 
551212ad6d1SVijay Mahadevan 
55200cc10feSVijay Mahadevan /*@
55300cc10feSVijay Mahadevan   DMMoabGetOffset - Get the local offset for the global vector
55400cc10feSVijay Mahadevan 
55500cc10feSVijay Mahadevan   Collective on MPI_Comm
55600cc10feSVijay Mahadevan 
55700cc10feSVijay Mahadevan   Input Parameter:
55800cc10feSVijay Mahadevan . dm - The DMMoab object being set
55900cc10feSVijay Mahadevan 
56000cc10feSVijay Mahadevan   Output Parameter:
56100cc10feSVijay Mahadevan . offset - The local offset for the global vector
56200cc10feSVijay Mahadevan 
56300cc10feSVijay Mahadevan   Level: beginner
56400cc10feSVijay Mahadevan 
56500cc10feSVijay Mahadevan .keywords: DMMoab, create
56600cc10feSVijay Mahadevan @*/
56700cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm,PetscInt *offset)
56800cc10feSVijay Mahadevan {
56900cc10feSVijay Mahadevan   PetscFunctionBegin;
57000cc10feSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
57100cc10feSVijay Mahadevan   *offset = ((DM_Moab*)dm->data)->vstart;
57200cc10feSVijay Mahadevan   PetscFunctionReturn(0);
57300cc10feSVijay Mahadevan }
57400cc10feSVijay Mahadevan 
57500cc10feSVijay Mahadevan 
5764920ab11SVijay Mahadevan /*@
5774920ab11SVijay Mahadevan   DMMoabGetDimension - Get the dimension of the DM Mesh
5784920ab11SVijay Mahadevan 
5794920ab11SVijay Mahadevan   Collective on MPI_Comm
5804920ab11SVijay Mahadevan 
5814920ab11SVijay Mahadevan   Input Parameter:
582340f3b9aSVijay Mahadevan . dm - The DMMoab object
5834920ab11SVijay Mahadevan 
5844920ab11SVijay Mahadevan   Output Parameter:
5854920ab11SVijay Mahadevan . dim - The dimension of DM
5864920ab11SVijay Mahadevan 
5874920ab11SVijay Mahadevan   Level: beginner
5884920ab11SVijay Mahadevan 
5894920ab11SVijay Mahadevan .keywords: DMMoab, create
5904920ab11SVijay Mahadevan @*/
5914920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim)
5924920ab11SVijay Mahadevan {
5934920ab11SVijay Mahadevan   PetscFunctionBegin;
5944920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5954920ab11SVijay Mahadevan   *dim = ((DM_Moab*)dm->data)->dim;
5964920ab11SVijay Mahadevan   PetscFunctionReturn(0);
5974920ab11SVijay Mahadevan }
5984920ab11SVijay Mahadevan 
5994920ab11SVijay Mahadevan 
600*755f3dfbSVijay Mahadevan #undef __FUNCT__
601*755f3dfbSVijay Mahadevan #define __FUNCT__ "DMMoabGetHierarchyLevel"
602*755f3dfbSVijay Mahadevan /*@
603*755f3dfbSVijay Mahadevan   DMMoabGetHierarchyLevel - Get the current level of the mesh hierarchy
604*755f3dfbSVijay Mahadevan   generated through uniform refinement.
605*755f3dfbSVijay Mahadevan 
606*755f3dfbSVijay Mahadevan   Collective on DM
607*755f3dfbSVijay Mahadevan 
608*755f3dfbSVijay Mahadevan   Input Parameter:
609*755f3dfbSVijay Mahadevan . dm - The DMMoab object being set
610*755f3dfbSVijay Mahadevan 
611*755f3dfbSVijay Mahadevan   Output Parameter:
612*755f3dfbSVijay Mahadevan . nvg - The current mesh hierarchy level
613*755f3dfbSVijay Mahadevan 
614*755f3dfbSVijay Mahadevan   Level: beginner
615*755f3dfbSVijay Mahadevan 
616*755f3dfbSVijay Mahadevan .keywords: DMMoab, multigrid
617*755f3dfbSVijay Mahadevan @*/
618*755f3dfbSVijay Mahadevan PetscErrorCode DMMoabGetHierarchyLevel(DM dm,PetscInt *nlevel)
619*755f3dfbSVijay Mahadevan {
620*755f3dfbSVijay Mahadevan   PetscFunctionBegin;
621*755f3dfbSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
622*755f3dfbSVijay Mahadevan   if(nlevel) *nlevel = ((DM_Moab*)dm->data)->hlevel;
623*755f3dfbSVijay Mahadevan   PetscFunctionReturn(0);
624*755f3dfbSVijay Mahadevan }
625*755f3dfbSVijay Mahadevan 
626*755f3dfbSVijay Mahadevan 
627*755f3dfbSVijay Mahadevan #undef __FUNCT__
628*755f3dfbSVijay Mahadevan #define __FUNCT__ "DMMoabGetMaterialBlock"
629340f3b9aSVijay Mahadevan /*@
630340f3b9aSVijay Mahadevan   DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh
631340f3b9aSVijay Mahadevan 
632340f3b9aSVijay Mahadevan   Collective on MPI_Comm
633340f3b9aSVijay Mahadevan 
634340f3b9aSVijay Mahadevan   Input Parameter:
635340f3b9aSVijay Mahadevan . dm - The DMMoab object
636340f3b9aSVijay Mahadevan . ehandle - The element entity handle
637340f3b9aSVijay Mahadevan 
638340f3b9aSVijay Mahadevan   Output Parameter:
639340f3b9aSVijay Mahadevan . mat - The material ID for the current entity
640340f3b9aSVijay Mahadevan 
641340f3b9aSVijay Mahadevan   Level: beginner
642340f3b9aSVijay Mahadevan 
643340f3b9aSVijay Mahadevan .keywords: DMMoab, create
644340f3b9aSVijay Mahadevan @*/
645340f3b9aSVijay Mahadevan PetscErrorCode DMMoabGetMaterialBlock(DM dm,const moab::EntityHandle ehandle, PetscInt *mat)
646340f3b9aSVijay Mahadevan {
647340f3b9aSVijay Mahadevan   DM_Moab         *dmmoab;
648340f3b9aSVijay Mahadevan   moab::ErrorCode merr;
649340f3b9aSVijay Mahadevan 
650340f3b9aSVijay Mahadevan   PetscFunctionBegin;
651340f3b9aSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
652340f3b9aSVijay Mahadevan   if (*mat) {
653340f3b9aSVijay Mahadevan     dmmoab = (DM_Moab*)(dm)->data;
65463cd93b2SVijay Mahadevan     merr=dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &ehandle, 1, mat);MBERRNM(merr);
655340f3b9aSVijay Mahadevan   }
656340f3b9aSVijay Mahadevan   PetscFunctionReturn(0);
657340f3b9aSVijay Mahadevan }
658340f3b9aSVijay Mahadevan 
6594920ab11SVijay Mahadevan 
66085d305f5SVijay Mahadevan /*@
66185d305f5SVijay Mahadevan   DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities
66285d305f5SVijay Mahadevan 
66385d305f5SVijay Mahadevan   Collective on MPI_Comm
66485d305f5SVijay Mahadevan 
66585d305f5SVijay Mahadevan   Input Parameter:
66685d305f5SVijay Mahadevan . dm - The DMMoab object
66785d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
66885d305f5SVijay Mahadevan . conn - The vertex entity handles
66985d305f5SVijay Mahadevan 
67085d305f5SVijay Mahadevan   Output Parameter:
67185d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities
67285d305f5SVijay Mahadevan 
67385d305f5SVijay Mahadevan   Level: beginner
67485d305f5SVijay Mahadevan 
67585d305f5SVijay Mahadevan .seealso: DMMoabGetVertexConnectivity()
67685d305f5SVijay Mahadevan @*/
677cade3ad9SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscReal *vpos)
6787023aa44SVijay Mahadevan {
6797023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
6807023aa44SVijay Mahadevan   PetscErrorCode  ierr;
6817023aa44SVijay Mahadevan   moab::ErrorCode merr;
6827023aa44SVijay Mahadevan 
6837023aa44SVijay Mahadevan   PetscFunctionBegin;
6847023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6857023aa44SVijay Mahadevan   PetscValidPointer(conn,3);
6867023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6877023aa44SVijay Mahadevan 
6887023aa44SVijay Mahadevan   if (!vpos) {
6897ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(nconn*3, &vpos);CHKERRQ(ierr);
6907023aa44SVijay Mahadevan   }
6917023aa44SVijay Mahadevan 
6927023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
6937023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
6947023aa44SVijay Mahadevan   PetscFunctionReturn(0);
6957023aa44SVijay Mahadevan }
6967023aa44SVijay Mahadevan 
6977023aa44SVijay Mahadevan 
69885d305f5SVijay Mahadevan /*@
69985d305f5SVijay Mahadevan   DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity
70085d305f5SVijay Mahadevan 
70185d305f5SVijay Mahadevan   Collective on MPI_Comm
70285d305f5SVijay Mahadevan 
70385d305f5SVijay Mahadevan   Input Parameter:
70485d305f5SVijay Mahadevan . dm - The DMMoab object
70585d305f5SVijay Mahadevan . vhandle - Vertex entity handle
70685d305f5SVijay Mahadevan 
70785d305f5SVijay Mahadevan   Output Parameter:
70885d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
70985d305f5SVijay Mahadevan . conn - The vertex entity handles
71085d305f5SVijay Mahadevan 
71185d305f5SVijay Mahadevan   Level: beginner
71285d305f5SVijay Mahadevan 
71385d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabRestoreVertexConnectivity()
71485d305f5SVijay Mahadevan @*/
71585d305f5SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle vhandle,PetscInt* nconn, moab::EntityHandle **conn)
7168d8d51c8SVijay Mahadevan {
7178d8d51c8SVijay Mahadevan   DM_Moab        *dmmoab;
7188d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities,connect;
7198d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
7208d8d51c8SVijay Mahadevan   moab::ErrorCode merr;
7218d8d51c8SVijay Mahadevan 
7228d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7238d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7248d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
7258d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7268d8d51c8SVijay Mahadevan 
7278d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
72885d305f5SVijay Mahadevan   merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr);
7298d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr);
7308d8d51c8SVijay Mahadevan 
7318d8d51c8SVijay Mahadevan   if (conn) {
7328d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr);
7338d8d51c8SVijay Mahadevan     ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr);
7348d8d51c8SVijay Mahadevan   }
7358d8d51c8SVijay Mahadevan   if (nconn) *nconn=connect.size();
7368d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
7378d8d51c8SVijay Mahadevan }
7388d8d51c8SVijay Mahadevan 
7398d8d51c8SVijay Mahadevan 
74085d305f5SVijay Mahadevan /*@
74185d305f5SVijay Mahadevan   DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity
74285d305f5SVijay Mahadevan 
74385d305f5SVijay Mahadevan   Collective on MPI_Comm
74485d305f5SVijay Mahadevan 
74585d305f5SVijay Mahadevan   Input Parameter:
74685d305f5SVijay Mahadevan . dm - The DMMoab object
74785d305f5SVijay Mahadevan . vhandle - Vertex entity handle
74885d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
74985d305f5SVijay Mahadevan . conn - The vertex entity handles
75085d305f5SVijay Mahadevan 
75185d305f5SVijay Mahadevan   Level: beginner
75285d305f5SVijay Mahadevan 
75385d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity()
75485d305f5SVijay Mahadevan @*/
7558d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
7568d8d51c8SVijay Mahadevan {
7578d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
7588d8d51c8SVijay Mahadevan 
7598d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7608d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7618d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
7628d8d51c8SVijay Mahadevan 
7638d8d51c8SVijay Mahadevan   if (conn) {
7648d8d51c8SVijay Mahadevan     ierr = PetscFree(*conn);CHKERRQ(ierr);
7658d8d51c8SVijay Mahadevan   }
7668d8d51c8SVijay Mahadevan   if (nconn) *nconn=0;
7678d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
7688d8d51c8SVijay Mahadevan }
7698d8d51c8SVijay Mahadevan 
7708d8d51c8SVijay Mahadevan 
77185d305f5SVijay Mahadevan /*@
77285d305f5SVijay Mahadevan   DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity
77385d305f5SVijay Mahadevan 
77485d305f5SVijay Mahadevan   Collective on MPI_Comm
77585d305f5SVijay Mahadevan 
77685d305f5SVijay Mahadevan   Input Parameter:
77785d305f5SVijay Mahadevan . dm - The DMMoab object
77885d305f5SVijay Mahadevan . ehandle - Vertex entity handle
77985d305f5SVijay Mahadevan 
78085d305f5SVijay Mahadevan   Output Parameter:
78185d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
78285d305f5SVijay Mahadevan . conn - The vertex entity handles
78385d305f5SVijay Mahadevan 
78485d305f5SVijay Mahadevan   Level: beginner
78585d305f5SVijay Mahadevan 
78685d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity(), DMMoabRestoreVertexConnectivity()
78785d305f5SVijay Mahadevan @*/
7887023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn)
7897023aa44SVijay Mahadevan {
7907023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
7917023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
7927023aa44SVijay Mahadevan   moab::ErrorCode merr;
7937023aa44SVijay Mahadevan   PetscInt nnodes;
7947023aa44SVijay Mahadevan 
7957023aa44SVijay Mahadevan   PetscFunctionBegin;
7967023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7977023aa44SVijay Mahadevan   PetscValidPointer(conn,4);
7987023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7997023aa44SVijay Mahadevan 
8007023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
8017023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr);
8027023aa44SVijay Mahadevan   if (conn) *conn=connect;
8037023aa44SVijay Mahadevan   if (nconn) *nconn=nnodes;
8047023aa44SVijay Mahadevan   PetscFunctionReturn(0);
8057023aa44SVijay Mahadevan }
8067023aa44SVijay Mahadevan 
8077023aa44SVijay Mahadevan 
80885d305f5SVijay Mahadevan /*@
80985d305f5SVijay Mahadevan   DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element)
81085d305f5SVijay Mahadevan 
81185d305f5SVijay Mahadevan   Collective on MPI_Comm
81285d305f5SVijay Mahadevan 
81385d305f5SVijay Mahadevan   Input Parameter:
81485d305f5SVijay Mahadevan . dm - The DMMoab object
81585d305f5SVijay Mahadevan . ent - Entity handle
81685d305f5SVijay Mahadevan 
81785d305f5SVijay Mahadevan   Output Parameter:
81885d305f5SVijay Mahadevan . ent_on_boundary - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
81985d305f5SVijay Mahadevan 
82085d305f5SVijay Mahadevan   Level: beginner
82185d305f5SVijay Mahadevan 
82285d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices()
82385d305f5SVijay Mahadevan @*/
82469263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary)
82569263071SVijay Mahadevan {
82669263071SVijay Mahadevan   moab::EntityType etype;
82769263071SVijay Mahadevan   DM_Moab         *dmmoab;
82869263071SVijay Mahadevan   PetscInt         edim;
82969263071SVijay Mahadevan 
83069263071SVijay Mahadevan   PetscFunctionBegin;
83169263071SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
83269263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary,3);
83369263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
83469263071SVijay Mahadevan 
83569263071SVijay Mahadevan   /* get the entity type and handle accordingly */
83669263071SVijay Mahadevan   etype=dmmoab->mbiface->type_from_handle(ent);
83769263071SVijay Mahadevan   if(etype >= moab::MBPOLYHEDRON) SETERRQ1(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Entity type on the boundary skin is invalid. EntityType = %D\n",etype);
83869263071SVijay Mahadevan 
83969263071SVijay Mahadevan   /* get the entity dimension */
84069263071SVijay Mahadevan   edim=dmmoab->mbiface->dimension_from_handle(ent);
84169263071SVijay Mahadevan 
84269263071SVijay Mahadevan   *ent_on_boundary=PETSC_FALSE;
84369263071SVijay Mahadevan   if(etype == moab::MBVERTEX && edim == 0) {
84449d66b22SVijay Mahadevan     *ent_on_boundary=((dmmoab->bndyvtx->index(ent) >= 0) ? PETSC_TRUE:PETSC_FALSE);
84569263071SVijay Mahadevan   }
84669263071SVijay Mahadevan   else {
84769263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
8486d9eb265SVijay Mahadevan       if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
84969263071SVijay Mahadevan     }
85069263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
8516d9eb265SVijay Mahadevan       if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
85269263071SVijay Mahadevan     }
85369263071SVijay Mahadevan   }
85469263071SVijay Mahadevan   PetscFunctionReturn(0);
85569263071SVijay Mahadevan }
85669263071SVijay Mahadevan 
85769263071SVijay Mahadevan 
85885d305f5SVijay Mahadevan /*@
85985d305f5SVijay Mahadevan   DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element)
86085d305f5SVijay Mahadevan 
86185d305f5SVijay Mahadevan   Input Parameter:
86285d305f5SVijay Mahadevan . dm - The DMMoab object
86385d305f5SVijay Mahadevan . nconn - Number of handles
86485d305f5SVijay Mahadevan . cnt - Array of entity handles
86585d305f5SVijay Mahadevan 
86685d305f5SVijay Mahadevan   Output Parameter:
86785d305f5SVijay Mahadevan . isbdvtx - Array of boundary markers - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
86885d305f5SVijay Mahadevan 
86985d305f5SVijay Mahadevan   Level: beginner
87085d305f5SVijay Mahadevan 
87185d305f5SVijay Mahadevan .seealso: DMMoabIsEntityOnBoundary()
87285d305f5SVijay Mahadevan @*/
87369263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx)
8747023aa44SVijay Mahadevan {
8757023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
8767023aa44SVijay Mahadevan   PetscInt       i;
8777023aa44SVijay Mahadevan 
8787023aa44SVijay Mahadevan   PetscFunctionBegin;
8797023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8807023aa44SVijay Mahadevan   PetscValidPointer(cnt,3);
8817023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx,4);
8827023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8837023aa44SVijay Mahadevan 
8847023aa44SVijay Mahadevan   for (i=0; i < nconn; ++i) {
8856d9eb265SVijay Mahadevan     isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE);
8867023aa44SVijay Mahadevan   }
8877023aa44SVijay Mahadevan   PetscFunctionReturn(0);
8887023aa44SVijay Mahadevan }
8897023aa44SVijay Mahadevan 
8907023aa44SVijay Mahadevan 
89185d305f5SVijay Mahadevan /*@
89285d305f5SVijay Mahadevan   DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary
89385d305f5SVijay Mahadevan 
89485d305f5SVijay Mahadevan   Input Parameter:
89585d305f5SVijay Mahadevan . dm - The DMMoab object
89685d305f5SVijay Mahadevan 
89785d305f5SVijay Mahadevan   Output Parameter:
89885d305f5SVijay Mahadevan . bdvtx - Boundary vertices
89985d305f5SVijay Mahadevan . bdelems - Boundary elements
90085d305f5SVijay Mahadevan . bdfaces - Boundary faces
90185d305f5SVijay Mahadevan 
90285d305f5SVijay Mahadevan   Level: beginner
90385d305f5SVijay Mahadevan 
90485d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices(), DMMoabIsEntityOnBoundary()
90585d305f5SVijay Mahadevan @*/
9066d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces)
9071cec0304SVijay Mahadevan {
9081cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
9091cec0304SVijay Mahadevan 
9101cec0304SVijay Mahadevan   PetscFunctionBegin;
9111cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9121cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9131cec0304SVijay Mahadevan 
9146d9eb265SVijay Mahadevan   if (bdvtx)  *bdvtx = dmmoab->bndyvtx;
9156d9eb265SVijay Mahadevan   if (bdfaces)  *bdfaces = dmmoab->bndyfaces;
9166d9eb265SVijay Mahadevan   if (bdelems)  *bdfaces = dmmoab->bndyelems;
9171cec0304SVijay Mahadevan   PetscFunctionReturn(0);
9181cec0304SVijay Mahadevan }
9191cec0304SVijay Mahadevan 
920f6829af0SVijay Mahadevan 
921f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm)
922f6829af0SVijay Mahadevan {
923f6829af0SVijay Mahadevan   PetscErrorCode  ierr;
92485d305f5SVijay Mahadevan   PetscInt        i;
925e882eb38SVijay Mahadevan   moab::ErrorCode merr;
926f6829af0SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
927f6829af0SVijay Mahadevan 
928f6829af0SVijay Mahadevan   PetscFunctionBegin;
929f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
930f6829af0SVijay Mahadevan   if (dmmoab->icreatedinstance) {
931f6829af0SVijay Mahadevan     delete dmmoab->mbiface;
932f6829af0SVijay Mahadevan   }
933f6829af0SVijay Mahadevan   dmmoab->mbiface = NULL;
934f6829af0SVijay Mahadevan   dmmoab->pcomm = NULL;
935f6829af0SVijay Mahadevan   delete dmmoab->vlocal;
936f6829af0SVijay Mahadevan   delete dmmoab->vowned;
937f6829af0SVijay Mahadevan   delete dmmoab->vghost;
938f6829af0SVijay Mahadevan   delete dmmoab->elocal;
939f6829af0SVijay Mahadevan   delete dmmoab->eghost;
940f6829af0SVijay Mahadevan   delete dmmoab->bndyvtx;
941f6829af0SVijay Mahadevan   delete dmmoab->bndyfaces;
942f6829af0SVijay Mahadevan   delete dmmoab->bndyelems;
943f6829af0SVijay Mahadevan 
944f6829af0SVijay Mahadevan   ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr);
9457ae5e5b6SVijay Mahadevan   ierr = PetscFree2(dmmoab->gidmap,dmmoab->lidmap);CHKERRQ(ierr);
9465905e1eaSVijay Mahadevan   ierr = PetscFree(dmmoab->dfill);CHKERRQ(ierr);
9475905e1eaSVijay Mahadevan   ierr = PetscFree(dmmoab->ofill);CHKERRQ(ierr);
94885d305f5SVijay Mahadevan   if (dmmoab->fieldNames) {
94985d305f5SVijay Mahadevan     for(i=0; i<dmmoab->numFields; i++) {
95085d305f5SVijay Mahadevan       ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr);
95185d305f5SVijay Mahadevan     }
95285d305f5SVijay Mahadevan     ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr);
95385d305f5SVijay Mahadevan   }
954b117cd09SVijay Mahadevan 
955b117cd09SVijay Mahadevan   if (dmmoab->nhlevels) {
956b117cd09SVijay Mahadevan     ierr = PetscFree(dmmoab->hsets);CHKERRQ(ierr);
957e882eb38SVijay Mahadevan     dmmoab->nhlevels=0;
958e882eb38SVijay Mahadevan     if (!dmmoab->hlevel && dmmoab->icreatedinstance) delete dmmoab->hierarchy;
959e882eb38SVijay Mahadevan     dmmoab->hierarchy=NULL;
960b117cd09SVijay Mahadevan   }
961e882eb38SVijay Mahadevan 
962e882eb38SVijay Mahadevan   if (dmmoab->icreatedinstance) {
963e882eb38SVijay Mahadevan     merr = dmmoab->mbiface->delete_mesh();MBERRNM(merr);
964e882eb38SVijay Mahadevan     delete dmmoab->mbiface;
965e882eb38SVijay Mahadevan   }
966e882eb38SVijay Mahadevan   dmmoab->mbiface = NULL;
967e882eb38SVijay Mahadevan   dmmoab->pcomm = NULL;
968e882eb38SVijay Mahadevan 
969f6829af0SVijay Mahadevan   ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
970f6829af0SVijay Mahadevan   ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr);
971f6829af0SVijay Mahadevan   ierr = PetscFree(dm->data);CHKERRQ(ierr);
972f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
973f6829af0SVijay Mahadevan }
974f6829af0SVijay Mahadevan 
975f6829af0SVijay Mahadevan 
9764416b707SBarry Smith PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(PetscOptionItems *PetscOptionsObject,DM dm)
9772e4e7c01SVijay Mahadevan {
9782e4e7c01SVijay Mahadevan   PetscErrorCode ierr;
9792e4e7c01SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
9802e4e7c01SVijay Mahadevan 
9812e4e7c01SVijay Mahadevan   PetscFunctionBegin;
9822e4e7c01SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
983cc310fddSBarry Smith   ierr = PetscOptionsHead(PetscOptionsObject,"DMMoab Options");CHKERRQ(ierr);
9842e4e7c01SVijay Mahadevan   ierr  = PetscOptionsInt("-dm_moab_rw_dbg", "The verbosity level for reading and writing MOAB meshes", "DMView", dmmoab->rw_dbglevel, &dmmoab->rw_dbglevel, NULL);CHKERRQ(ierr);
9852e4e7c01SVijay 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);
9862e4e7c01SVijay Mahadevan   /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */
9872e4e7c01SVijay Mahadevan   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, PETSC_MAX_PATH_LEN, NULL);CHKERRQ(ierr);
9882e4e7c01SVijay Mahadevan   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, PETSC_MAX_PATH_LEN, NULL);CHKERRQ(ierr);
9892e4e7c01SVijay Mahadevan   ierr  = PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum*)&dmmoab->read_mode, NULL);CHKERRQ(ierr);
9902e4e7c01SVijay Mahadevan   ierr  = PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum*)&dmmoab->write_mode, NULL);CHKERRQ(ierr);
9912e4e7c01SVijay Mahadevan   PetscFunctionReturn(0);
9922e4e7c01SVijay Mahadevan }
9932e4e7c01SVijay Mahadevan 
9942e4e7c01SVijay Mahadevan 
995f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm)
996f6829af0SVijay Mahadevan {
997f6829af0SVijay Mahadevan   PetscErrorCode          ierr;
998f6829af0SVijay Mahadevan   moab::ErrorCode         merr;
999f6829af0SVijay Mahadevan   Vec                     local, global;
1000f6829af0SVijay Mahadevan   IS                      from,to;
1001f6829af0SVijay Mahadevan   moab::Range::iterator   iter;
1002ce27a4eeSVijay Mahadevan   PetscInt                i,j,f,bs,gmin,lmin,lmax,vent,totsize,*lgmap;
1003f6829af0SVijay Mahadevan   DM_Moab                *dmmoab = (DM_Moab*)dm->data;
1004f6829af0SVijay Mahadevan   moab::Range             adjs;
1005f6829af0SVijay Mahadevan 
1006f6829af0SVijay Mahadevan   PetscFunctionBegin;
1007f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1008f6829af0SVijay Mahadevan   /* Get the local and shared vertices and cache it */
1009c528d872SBarry Smith   if (dmmoab->mbiface == NULL || dmmoab->pcomm == NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface and ParallelComm objects before calling SetUp.");
1010f6829af0SVijay Mahadevan 
1011f6829af0SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
1012f6829af0SVijay Mahadevan   if (dmmoab->vlocal->empty())
1013f6829af0SVijay Mahadevan   {
101449d66b22SVijay Mahadevan     //merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
101549d66b22SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, 0, *dmmoab->vlocal, false);MBERRNM(merr);
1016f6829af0SVijay Mahadevan 
1017f6829af0SVijay Mahadevan     /* filter based on parallel status */
1018f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
1019f6829af0SVijay Mahadevan 
1020f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
1021f6829af0SVijay Mahadevan     adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
102264e1c140SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_GHOST|PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
1023f6829af0SVijay Mahadevan     adjs = moab::subtract(adjs, *dmmoab->vghost);
1024f6829af0SVijay Mahadevan     *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs);
1025f6829af0SVijay Mahadevan 
1026f6829af0SVijay Mahadevan     /* compute and cache the sizes of local and ghosted entities */
1027f6829af0SVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
1028f6829af0SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
102949d66b22SVijay Mahadevan 
1030b2566f29SBarry Smith     ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
103149d66b22SVijay Mahadevan     PetscInfo4(NULL, "Filset ID: %u, Vertices: local - %D, owned - %D, ghosted - %D.\n", dmmoab->fileset, dmmoab->vlocal->size(), dmmoab->nloc, dmmoab->nghost);
1032f6829af0SVijay Mahadevan   }
1033f6829af0SVijay Mahadevan 
1034f6829af0SVijay Mahadevan   {
1035f6829af0SVijay Mahadevan     /* get the information about the local elements in the mesh */
1036f6829af0SVijay Mahadevan     dmmoab->eghost->clear();
1037f6829af0SVijay Mahadevan 
1038f6829af0SVijay Mahadevan     /* first decipher the leading dimension */
1039f6829af0SVijay Mahadevan     for (i=3;i>0;i--) {
1040f6829af0SVijay Mahadevan       dmmoab->elocal->clear();
104149d66b22SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, false);MBERRNM(merr);
1042f6829af0SVijay Mahadevan 
1043f6829af0SVijay Mahadevan       /* store the current mesh dimension */
1044f6829af0SVijay Mahadevan       if (dmmoab->elocal->size()) {
1045f6829af0SVijay Mahadevan         dmmoab->dim=i;
1046f6829af0SVijay Mahadevan         break;
1047f6829af0SVijay Mahadevan       }
1048f6829af0SVijay Mahadevan     }
1049f6829af0SVijay Mahadevan 
1050b117cd09SVijay Mahadevan     ierr = DMSetDimension(dm, dmmoab->dim);CHKERRQ(ierr);
1051b117cd09SVijay Mahadevan 
1052f6829af0SVijay Mahadevan     /* filter the ghosted and owned element list */
1053f6829af0SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
1054f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
1055f6829af0SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
1056f6829af0SVijay Mahadevan 
1057f6829af0SVijay Mahadevan     dmmoab->neleloc = dmmoab->elocal->size();
1058f6829af0SVijay Mahadevan     dmmoab->neleghost = dmmoab->eghost->size();
105949d66b22SVijay Mahadevan 
1060b2566f29SBarry Smith     ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
106149d66b22SVijay Mahadevan     PetscInfo3(NULL, "%d-dim elements: owned - %D, ghosted - %D.\n", dmmoab->dim, dmmoab->neleloc, dmmoab->neleghost);
1062f6829af0SVijay Mahadevan   }
1063f6829af0SVijay Mahadevan 
1064f6829af0SVijay Mahadevan   bs = dmmoab->bs;
1065f6829af0SVijay Mahadevan   if (!dmmoab->ltog_tag) {
1066f6829af0SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
1067f6829af0SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
1068f6829af0SVijay Mahadevan        assemble the individual pieces of the mesh */
1069f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
1070f6829af0SVijay Mahadevan   }
1071f6829af0SVijay Mahadevan 
1072f6829af0SVijay Mahadevan   totsize=dmmoab->vlocal->size();
107349d66b22SVijay Mahadevan   if (totsize != dmmoab->nloc+dmmoab->nghost) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Mismatch between local and owned+ghost vertices. %D != %D.",totsize,dmmoab->nloc+dmmoab->nghost);
107449d66b22SVijay Mahadevan   ierr = PetscCalloc1(totsize,&dmmoab->gsindices);CHKERRQ(ierr);
1075f6829af0SVijay Mahadevan   {
1076f6829af0SVijay Mahadevan     /* first get the local indices */
1077f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr);
10783f1c6e43SVijay Mahadevan     if (dmmoab->nghost) {  /* next get the ghosted indices */
1079f6829af0SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr);
1080f6829af0SVijay Mahadevan     }
1081f6829af0SVijay Mahadevan 
1082f6829af0SVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
1083f6829af0SVijay Mahadevan     lmin=lmax=dmmoab->gsindices[0];
1084f6829af0SVijay Mahadevan     for (i=0; i<totsize; ++i) {
1085f6829af0SVijay Mahadevan       if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i];
1086f6829af0SVijay Mahadevan       if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i];
1087f6829af0SVijay Mahadevan     }
1088f6829af0SVijay Mahadevan 
1089b2566f29SBarry Smith     ierr = MPIU_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr);
1090f6829af0SVijay Mahadevan 
1091f6829af0SVijay Mahadevan     /* set the GID map */
1092f6829af0SVijay Mahadevan     for (i=0; i<totsize; ++i) {
1093f6829af0SVijay Mahadevan       dmmoab->gsindices[i]-=gmin;   /* zero based index needed for IS */
1094f6829af0SVijay Mahadevan     }
1095f6829af0SVijay Mahadevan     lmin-=gmin;
1096f6829af0SVijay Mahadevan     lmax-=gmin;
1097f6829af0SVijay Mahadevan 
1098f6829af0SVijay Mahadevan     PetscInfo3(NULL, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin);
1099f6829af0SVijay Mahadevan   }
110082dfd14aSVijay Mahadevan   if(!(dmmoab->bs==dmmoab->numFields || dmmoab->bs == 1)) SETERRQ3(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Mismatch between block size and number of component fields. %D != 1 OR %D != %D.",dmmoab->bs,dmmoab->bs,dmmoab->numFields);
1101f6829af0SVijay Mahadevan 
1102f6829af0SVijay Mahadevan   {
11033f1c6e43SVijay Mahadevan     dmmoab->seqstart=((PetscInt)dmmoab->vlocal->front());
11043f1c6e43SVijay Mahadevan     dmmoab->seqend=((PetscInt)dmmoab->vlocal->back());
110549d66b22SVijay Mahadevan     PetscInfo2(NULL, "SEQUENCE: Local minima - %D, Local maxima - %D.\n", dmmoab->seqstart, dmmoab->seqend);
11063f1c6e43SVijay Mahadevan 
110749d66b22SVijay Mahadevan     ierr = PetscMalloc2(dmmoab->seqend-dmmoab->seqstart+1,&dmmoab->gidmap,dmmoab->seqend-dmmoab->seqstart+1,&dmmoab->lidmap);CHKERRQ(ierr);
11083f1c6e43SVijay Mahadevan     ierr = PetscMalloc1(totsize*dmmoab->numFields,&lgmap);CHKERRQ(ierr);
1109f6829af0SVijay Mahadevan 
1110f6829af0SVijay Mahadevan     i=j=0;
1111f6829af0SVijay Mahadevan     /* set the owned vertex data first */
1112f6829af0SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) {
11133f1c6e43SVijay Mahadevan       vent=(PetscInt)(*iter)-dmmoab->seqstart;
1114f6829af0SVijay Mahadevan       dmmoab->gidmap[vent]=dmmoab->gsindices[i];
1115f6829af0SVijay Mahadevan       dmmoab->lidmap[vent]=i;
1116f6829af0SVijay Mahadevan       for (f=0;f<dmmoab->numFields;f++,j++) {
11173f1c6e43SVijay Mahadevan         lgmap[j]=(bs > 1 ? dmmoab->gsindices[i]*dmmoab->numFields+f : totsize*f+dmmoab->gsindices[i]);
1118f6829af0SVijay Mahadevan       }
1119f6829af0SVijay Mahadevan     }
1120f6829af0SVijay Mahadevan     /* next arrange all the ghosted data information */
1121f6829af0SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) {
11223f1c6e43SVijay Mahadevan       vent=(PetscInt)(*iter)-dmmoab->seqstart;
1123f6829af0SVijay Mahadevan       dmmoab->gidmap[vent]=dmmoab->gsindices[i];
1124f6829af0SVijay Mahadevan       dmmoab->lidmap[vent]=i;
1125f6829af0SVijay Mahadevan       for (f=0;f<dmmoab->numFields;f++,j++) {
11263f1c6e43SVijay Mahadevan         lgmap[j]=(bs > 1 ? dmmoab->gsindices[i]*dmmoab->numFields+f : totsize*f+dmmoab->gsindices[i]);
1127f6829af0SVijay Mahadevan       }
1128f6829af0SVijay Mahadevan     }
1129f6829af0SVijay Mahadevan 
1130f6829af0SVijay Mahadevan     /* We need to create the Global to Local Vector Scatter Contexts
1131f6829af0SVijay Mahadevan        1) First create a local and global vector
1132f6829af0SVijay Mahadevan        2) Create a local and global IS
1133f6829af0SVijay Mahadevan        3) Create VecScatter and LtoGMapping objects
1134f6829af0SVijay Mahadevan        4) Cleanup the IS and Vec objects
1135f6829af0SVijay Mahadevan     */
1136f6829af0SVijay Mahadevan     ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr);
1137f6829af0SVijay Mahadevan     ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr);
1138f6829af0SVijay Mahadevan 
1139f6829af0SVijay Mahadevan     ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr);
1140f6829af0SVijay Mahadevan 
1141f6829af0SVijay Mahadevan     /* global to local must retrieve ghost points */
1142f6829af0SVijay Mahadevan     ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,dmmoab->vstart,1,&from);CHKERRQ(ierr);
1143f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr);
1144f6829af0SVijay Mahadevan 
11453f1c6e43SVijay Mahadevan     ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,&lgmap[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr);
1146f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(to,bs);CHKERRQ(ierr);
1147f6829af0SVijay Mahadevan 
1148f6829af0SVijay Mahadevan     if (!dmmoab->ltog_map) {
1149f6829af0SVijay Mahadevan       /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */
11503f1c6e43SVijay Mahadevan       ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,dmmoab->bs,totsize*dmmoab->numFields,lgmap,
1151f6829af0SVijay Mahadevan                                           PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr);
1152f6829af0SVijay Mahadevan     }
1153f6829af0SVijay Mahadevan 
1154f6829af0SVijay Mahadevan     /* now create the scatter object from local to global vector */
1155f6829af0SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
1156f6829af0SVijay Mahadevan 
1157f6829af0SVijay Mahadevan     /* clean up IS, Vec */
11583f1c6e43SVijay Mahadevan     ierr = PetscFree(lgmap);CHKERRQ(ierr);
1159f6829af0SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
1160f6829af0SVijay Mahadevan     ierr = ISDestroy(&to);CHKERRQ(ierr);
1161f6829af0SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
1162f6829af0SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
1163f6829af0SVijay Mahadevan   }
1164f6829af0SVijay Mahadevan 
116549d66b22SVijay Mahadevan   dmmoab->bndyvtx = new moab::Range();
116649d66b22SVijay Mahadevan   dmmoab->bndyfaces = new moab::Range();
116749d66b22SVijay Mahadevan   dmmoab->bndyelems = new moab::Range();
1168f6829af0SVijay Mahadevan   /* skin the boundary and store nodes */
1169f6829af0SVijay Mahadevan   {
1170f6829af0SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
1171f6829af0SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
1172f6829af0SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
1173f6829af0SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
1174f6829af0SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
1175f6829af0SVijay Mahadevan 
1176f6829af0SVijay Mahadevan     /* get the entities on the skin - only the faces */
1177f6829af0SVijay Mahadevan     merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, *dmmoab->bndyfaces, NULL, false, true, false);MBERRNM(merr); // 'false' param indicates we want faces back, not vertices
1178f6829af0SVijay Mahadevan 
1179f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
1180f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
1181f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr);
1182f6829af0SVijay Mahadevan 
1183f6829af0SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
1184f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr);
1185*755f3dfbSVijay Mahadevan     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyvtx, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr);
1186f6829af0SVijay Mahadevan   }
118749d66b22SVijay Mahadevan   PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyfaces->size(), dmmoab->bndyelems->size());
1188f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1189f6829af0SVijay Mahadevan }
1190f6829af0SVijay Mahadevan 
1191f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
1192f6829af0SVijay Mahadevan {
1193f6829af0SVijay Mahadevan   PetscErrorCode ierr;
1194f6829af0SVijay Mahadevan 
1195f6829af0SVijay Mahadevan   PetscFunctionBegin;
1196f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1197f90c3b0eSVijay Mahadevan   ierr = PetscNewLog(dm,(DM_Moab**)&dm->data);CHKERRQ(ierr);
1198f6829af0SVijay Mahadevan 
1199f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
1200f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->numFields = 1;
1201f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
1202f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
1203f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
1204f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
1205f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
1206f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleghost = 0;
1207c528d872SBarry Smith   ((DM_Moab*)dm->data)->ltog_map = NULL;
1208c528d872SBarry Smith   ((DM_Moab*)dm->data)->ltog_sendrecv = NULL;
1209f6829af0SVijay Mahadevan 
1210f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
1211f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
1212f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
1213f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
1214f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
1215f6829af0SVijay Mahadevan 
1216f6829af0SVijay Mahadevan   dm->ops->createglobalvector       = DMCreateGlobalVector_Moab;
1217f6829af0SVijay Mahadevan   dm->ops->createlocalvector        = DMCreateLocalVector_Moab;
1218f6829af0SVijay Mahadevan   dm->ops->creatematrix             = DMCreateMatrix_Moab;
1219f6829af0SVijay Mahadevan   dm->ops->setup                    = DMSetUp_Moab;
1220f6829af0SVijay Mahadevan   dm->ops->destroy                  = DMDestroy_Moab;
1221e882eb38SVijay Mahadevan   dm->ops->coarsenhierarchy         = DMCoarsenHierarchy_Moab;
1222e882eb38SVijay Mahadevan   dm->ops->refinehierarchy          = DMRefineHierarchy_Moab;
1223b117cd09SVijay Mahadevan   dm->ops->createinterpolation      = DMCreateInterpolation_Moab;
1224b117cd09SVijay Mahadevan   //dm->ops->getinjection             = DMCreateInjection_Moab;
1225b117cd09SVijay Mahadevan   dm->ops->refine                   = DMRefine_Moab;
1226b117cd09SVijay Mahadevan   dm->ops->coarsen                  = DMCoarsen_Moab;
12272e4e7c01SVijay Mahadevan   dm->ops->setfromoptions           = DMSetFromOptions_Moab;
1228f6829af0SVijay Mahadevan   dm->ops->globaltolocalbegin       = DMGlobalToLocalBegin_Moab;
1229f6829af0SVijay Mahadevan   dm->ops->globaltolocalend         = DMGlobalToLocalEnd_Moab;
1230f6829af0SVijay Mahadevan   dm->ops->localtoglobalbegin       = DMLocalToGlobalBegin_Moab;
1231f6829af0SVijay Mahadevan   dm->ops->localtoglobalend         = DMLocalToGlobalEnd_Moab;
1232f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1233f6829af0SVijay Mahadevan }
1234f6829af0SVijay Mahadevan 
1235