xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision ce27a4eedb575ea8fca2ab34774e5199472b2ffd)
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;
987d89fc02STim Tautges 
99a4d2169cSTim Tautges   if (!pcomm) {
100032b8ab6SVijay Mahadevan     ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
101032b8ab6SVijay Mahadevan     ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
102032b8ab6SVijay Mahadevan 
103db66d124SVijay Mahadevan     /* Create root sets for each mesh.  Then pass these
104db66d124SVijay Mahadevan        to the load_file functions to be populated. */
1050c8a2322SVijay Mahadevan     merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);MBERR("Creating partition set failed", merr);
106032b8ab6SVijay Mahadevan 
107db66d124SVijay Mahadevan     /* Create the parallel communicator object with the partition handle associated with MOAB */
10872ff976dSVijay Mahadevan     dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
10972ff976dSVijay Mahadevan   }
11072ff976dSVijay Mahadevan   else {
11185d305f5SVijay Mahadevan     ierr = DMMoabSetParallelComm(dmmb, pcomm);CHKERRQ(ierr);
112032b8ab6SVijay Mahadevan   }
113032b8ab6SVijay Mahadevan 
1144973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
1154973de03SVijay Mahadevan   dmmoab->bs = 1;
116addae81cSVijay Mahadevan   dmmoab->numFields = 1;
1173f1c6e43SVijay Mahadevan   ierr = PetscMalloc(dmmoab->numFields*sizeof(char*),&dmmoab->fieldNames);CHKERRQ(ierr);
1183f1c6e43SVijay Mahadevan   ierr = PetscStrallocpy("DEFAULT", (char**) &dmmoab->fieldNames[0]);CHKERRQ(ierr);
1192e4e7c01SVijay Mahadevan   dmmoab->rw_dbglevel = 0;
1202e4e7c01SVijay Mahadevan   dmmoab->partition_by_rank = PETSC_FALSE;
1212e4e7c01SVijay Mahadevan   dmmoab->extra_read_options[0] = '\0';
1222e4e7c01SVijay Mahadevan   dmmoab->extra_write_options[0] = '\0';
1232e4e7c01SVijay Mahadevan   dmmoab->read_mode = READ_PART;
1242e4e7c01SVijay Mahadevan   dmmoab->write_mode = WRITE_PART;
1254973de03SVijay Mahadevan 
1264973de03SVijay Mahadevan   /* set global ID tag handle */
1271a845d2aSVijay Mahadevan   if (ltog_tag && *ltog_tag) {
12885d305f5SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag);CHKERRQ(ierr);
129032b8ab6SVijay Mahadevan   }
130032b8ab6SVijay Mahadevan   else {
1311a845d2aSVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
1321a845d2aSVijay Mahadevan     if (ltog_tag) *ltog_tag = dmmoab->ltog_tag;
133a4d2169cSTim Tautges   }
134a4d2169cSTim Tautges 
135340f3b9aSVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag);MBERRNM(merr);
136340f3b9aSVijay Mahadevan 
1374973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
138a4d2169cSTim Tautges   if (range) {
13985d305f5SVijay Mahadevan     ierr = DMMoabSetLocalVertices(dmmb, range);CHKERRQ(ierr);
140a4d2169cSTim Tautges   }
14185d305f5SVijay Mahadevan   *dmb=dmmb;
1421d72bce8STim Tautges   PetscFunctionReturn(0);
1431d72bce8STim Tautges }
1441d72bce8STim Tautges 
145aa768e4cSTim Tautges /*@
146aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
147aa768e4cSTim Tautges 
148aa768e4cSTim Tautges   Collective on MPI_Comm
149aa768e4cSTim Tautges 
150aa768e4cSTim Tautges   Input Parameter:
151aa768e4cSTim Tautges . dm    - The DMMoab object being set
152aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
153aa768e4cSTim Tautges 
154aa768e4cSTim Tautges   Level: beginner
155aa768e4cSTim Tautges 
156aa768e4cSTim Tautges .keywords: DMMoab, create
157aa768e4cSTim Tautges @*/
1581d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
1591d72bce8STim Tautges {
160032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
161032b8ab6SVijay Mahadevan 
1621d72bce8STim Tautges   PetscFunctionBegin;
1631d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1641cec0304SVijay Mahadevan   PetscValidPointer(pcomm,2);
165032b8ab6SVijay Mahadevan   dmmoab->pcomm = pcomm;
166032b8ab6SVijay Mahadevan   dmmoab->mbiface = pcomm->get_moab();
167032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
1681d72bce8STim Tautges   PetscFunctionReturn(0);
1691d72bce8STim Tautges }
1701d72bce8STim Tautges 
1711d72bce8STim Tautges 
172aa768e4cSTim Tautges /*@
173aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
174aa768e4cSTim Tautges 
175aa768e4cSTim Tautges   Collective on MPI_Comm
176aa768e4cSTim Tautges 
177aa768e4cSTim Tautges   Input Parameter:
178aa768e4cSTim Tautges . dm    - The DMMoab object being set
179aa768e4cSTim Tautges 
180aa768e4cSTim Tautges   Output Parameter:
181aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
182aa768e4cSTim Tautges 
183aa768e4cSTim Tautges   Level: beginner
184aa768e4cSTim Tautges 
185aa768e4cSTim Tautges .keywords: DMMoab, create
186aa768e4cSTim Tautges @*/
1871d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
1881d72bce8STim Tautges {
1891d72bce8STim Tautges   PetscFunctionBegin;
1901d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
191032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
1921d72bce8STim Tautges   PetscFunctionReturn(0);
1931d72bce8STim Tautges }
1941d72bce8STim Tautges 
1951d72bce8STim Tautges 
196aa768e4cSTim Tautges /*@
197aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
198aa768e4cSTim Tautges 
199aa768e4cSTim Tautges   Collective on MPI_Comm
200aa768e4cSTim Tautges 
201aa768e4cSTim Tautges   Input Parameter:
202aa768e4cSTim Tautges . dm      - The DMMoab object being set
203aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
204aa768e4cSTim Tautges 
205aa768e4cSTim Tautges   Level: beginner
206aa768e4cSTim Tautges 
207aa768e4cSTim Tautges .keywords: DMMoab, create
208aa768e4cSTim Tautges @*/
209a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
2101d72bce8STim Tautges {
211032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
212032b8ab6SVijay Mahadevan 
2131d72bce8STim Tautges   PetscFunctionBegin;
2141d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2151cec0304SVijay Mahadevan   PetscValidPointer(mbiface,2);
216032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
217032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
218032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
2191d72bce8STim Tautges   PetscFunctionReturn(0);
2201d72bce8STim Tautges }
2211d72bce8STim Tautges 
2221d72bce8STim Tautges 
223aa768e4cSTim Tautges /*@
224aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
225aa768e4cSTim Tautges 
226aa768e4cSTim Tautges   Collective on MPI_Comm
227aa768e4cSTim Tautges 
228aa768e4cSTim Tautges   Input Parameter:
229aa768e4cSTim Tautges . dm      - The DMMoab object being set
230aa768e4cSTim Tautges 
231aa768e4cSTim Tautges   Output Parameter:
232aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
233aa768e4cSTim Tautges 
234aa768e4cSTim Tautges   Level: beginner
235aa768e4cSTim Tautges 
236aa768e4cSTim Tautges .keywords: DMMoab, create
237aa768e4cSTim Tautges @*/
238a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
2391d72bce8STim Tautges {
2409426e041SSatish Balay   PetscErrorCode   ierr;
241cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
242cabb514dSBarry Smith 
2431d72bce8STim Tautges   PetscFunctionBegin;
2441d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
245cabb514dSBarry 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);
246a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
2471d72bce8STim Tautges   PetscFunctionReturn(0);
2481d72bce8STim Tautges }
2491d72bce8STim Tautges 
2501d72bce8STim Tautges 
251aa768e4cSTim Tautges /*@
2525eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
253aa768e4cSTim Tautges 
254aa768e4cSTim Tautges   Collective on MPI_Comm
255aa768e4cSTim Tautges 
256aa768e4cSTim Tautges   Input Parameter:
257aa768e4cSTim Tautges . dm    - The DMMoab object being set
258aa768e4cSTim Tautges . range - The entities treated by this DMMoab
259aa768e4cSTim Tautges 
260aa768e4cSTim Tautges   Level: beginner
261aa768e4cSTim Tautges 
262aa768e4cSTim Tautges .keywords: DMMoab, create
263aa768e4cSTim Tautges @*/
2645eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range)
2651d72bce8STim Tautges {
266032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
267032b8ab6SVijay Mahadevan   PetscErrorCode  ierr;
268fd3326ddSVijay Mahadevan   moab::Range     tmpvtxs;
269032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
270032b8ab6SVijay Mahadevan 
2711d72bce8STim Tautges   PetscFunctionBegin;
2721d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
273032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
274032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
275fd3326ddSVijay Mahadevan 
276032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
277fd3326ddSVijay Mahadevan 
278fd3326ddSVijay Mahadevan   /* filter based on parallel status */
279fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
280fd3326ddSVijay Mahadevan 
281fd3326ddSVijay Mahadevan   /* filter all the non-owned and shared entities out of the list */
282fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
283fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(tmpvtxs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
284fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost);
285fd3326ddSVijay Mahadevan   *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs);
286fd3326ddSVijay Mahadevan 
287fd3326ddSVijay Mahadevan   /* compute and cache the sizes of local and ghosted entities */
288032b8ab6SVijay Mahadevan   dmmoab->nloc = dmmoab->vowned->size();
289032b8ab6SVijay Mahadevan   dmmoab->nghost = dmmoab->vghost->size();
290b2566f29SBarry Smith   ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
2911d72bce8STim Tautges   PetscFunctionReturn(0);
2921d72bce8STim Tautges }
2931d72bce8STim Tautges 
2941d72bce8STim Tautges 
2958d8d51c8SVijay Mahadevan /*@
2968d8d51c8SVijay Mahadevan   DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab
2978d8d51c8SVijay Mahadevan 
2988d8d51c8SVijay Mahadevan   Collective on MPI_Comm
2998d8d51c8SVijay Mahadevan 
3008d8d51c8SVijay Mahadevan   Input Parameter:
3018d8d51c8SVijay Mahadevan . dm    - The DMMoab object being set
3028d8d51c8SVijay Mahadevan 
3038d8d51c8SVijay Mahadevan   Output Parameter:
3048d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted)
3058d8d51c8SVijay Mahadevan 
3068d8d51c8SVijay Mahadevan   Level: beginner
3078d8d51c8SVijay Mahadevan 
3088d8d51c8SVijay Mahadevan .keywords: DMMoab, create
3098d8d51c8SVijay Mahadevan @*/
3108d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local)
3118d8d51c8SVijay Mahadevan {
3128d8d51c8SVijay Mahadevan   PetscFunctionBegin;
3138d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3148d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab*)dm->data)->vlocal;
3158d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
3168d8d51c8SVijay Mahadevan }
3178d8d51c8SVijay Mahadevan 
3188d8d51c8SVijay Mahadevan 
3198d8d51c8SVijay Mahadevan 
320aa768e4cSTim Tautges /*@
3215eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
322aa768e4cSTim Tautges 
323aa768e4cSTim Tautges   Collective on MPI_Comm
324aa768e4cSTim Tautges 
325aa768e4cSTim Tautges   Input Parameter:
326aa768e4cSTim Tautges . dm    - The DMMoab object being set
327aa768e4cSTim Tautges 
328aa768e4cSTim Tautges   Output Parameter:
3295eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab
3305eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition
331aa768e4cSTim Tautges 
332aa768e4cSTim Tautges   Level: beginner
333aa768e4cSTim Tautges 
334aa768e4cSTim Tautges .keywords: DMMoab, create
335aa768e4cSTim Tautges @*/
336351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,const moab::Range **owned,const moab::Range **ghost)
3371d72bce8STim Tautges {
3381d72bce8STim Tautges   PetscFunctionBegin;
3391d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
340351b8a77SVijay Mahadevan   if (owned) *owned = ((DM_Moab*)dm->data)->vowned;
341351b8a77SVijay Mahadevan   if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost;
3421d72bce8STim Tautges   PetscFunctionReturn(0);
3431d72bce8STim Tautges }
3441d72bce8STim Tautges 
3455eb88e9dSVijay Mahadevan /*@
3465eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
3475eb88e9dSVijay Mahadevan 
3485eb88e9dSVijay Mahadevan   Collective on MPI_Comm
3495eb88e9dSVijay Mahadevan 
3505eb88e9dSVijay Mahadevan   Input Parameter:
3515eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
3525eb88e9dSVijay Mahadevan 
3535eb88e9dSVijay Mahadevan   Output Parameter:
3545eb88e9dSVijay Mahadevan . range - The entities owned locally
3555eb88e9dSVijay Mahadevan 
3565eb88e9dSVijay Mahadevan   Level: beginner
3575eb88e9dSVijay Mahadevan 
3585eb88e9dSVijay Mahadevan .keywords: DMMoab, create
3595eb88e9dSVijay Mahadevan @*/
360351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,const moab::Range **range)
3615eb88e9dSVijay Mahadevan {
3625eb88e9dSVijay Mahadevan   PetscFunctionBegin;
3635eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
364351b8a77SVijay Mahadevan   if (range) *range = ((DM_Moab*)dm->data)->elocal;
3651cec0304SVijay Mahadevan   PetscFunctionReturn(0);
3661cec0304SVijay Mahadevan }
3671cec0304SVijay Mahadevan 
3681cec0304SVijay Mahadevan 
3691cec0304SVijay Mahadevan /*@
3701cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
3711cec0304SVijay Mahadevan 
3721cec0304SVijay Mahadevan   Collective on MPI_Comm
3731cec0304SVijay Mahadevan 
3741cec0304SVijay Mahadevan   Input Parameter:
3751cec0304SVijay Mahadevan . dm    - The DMMoab object being set
3761cec0304SVijay Mahadevan . range - The entities treated by this DMMoab
3771cec0304SVijay Mahadevan 
3781cec0304SVijay Mahadevan   Level: beginner
3791cec0304SVijay Mahadevan 
3801cec0304SVijay Mahadevan .keywords: DMMoab, create
3811cec0304SVijay Mahadevan @*/
3821cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range)
3831cec0304SVijay Mahadevan {
3841cec0304SVijay Mahadevan   moab::ErrorCode merr;
3851cec0304SVijay Mahadevan   PetscErrorCode  ierr;
3861cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
3871cec0304SVijay Mahadevan 
3881cec0304SVijay Mahadevan   PetscFunctionBegin;
3891cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3901cec0304SVijay Mahadevan   dmmoab->elocal->clear();
3911cec0304SVijay Mahadevan   dmmoab->eghost->clear();
3921cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
3931cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
3941cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
3951cec0304SVijay Mahadevan   dmmoab->neleloc=dmmoab->elocal->size();
39641dd5348SVijay Mahadevan   dmmoab->neleghost=dmmoab->eghost->size();
397b2566f29SBarry Smith   ierr = MPIU_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
3988cbae1a6SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele);
3995eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
4005eb88e9dSVijay Mahadevan }
4015eb88e9dSVijay Mahadevan 
4025eb88e9dSVijay Mahadevan 
403aa768e4cSTim Tautges /*@
404aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
405aa768e4cSTim Tautges 
406aa768e4cSTim Tautges   Collective on MPI_Comm
407aa768e4cSTim Tautges 
408aa768e4cSTim Tautges   Input Parameter:
409aa768e4cSTim Tautges . dm      - The DMMoab object being set
410aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
411aa768e4cSTim Tautges 
412aa768e4cSTim Tautges   Level: beginner
413aa768e4cSTim Tautges 
414aa768e4cSTim Tautges .keywords: DMMoab, create
415aa768e4cSTim Tautges @*/
4161d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
4171d72bce8STim Tautges {
4181d72bce8STim Tautges   PetscFunctionBegin;
4191d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4201d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
4211d72bce8STim Tautges   PetscFunctionReturn(0);
4221d72bce8STim Tautges }
4231d72bce8STim Tautges 
4241d72bce8STim Tautges 
425aa768e4cSTim Tautges /*@
426aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
427aa768e4cSTim Tautges 
428aa768e4cSTim Tautges   Collective on MPI_Comm
429aa768e4cSTim Tautges 
430aa768e4cSTim Tautges   Input Parameter:
431aa768e4cSTim Tautges . dm      - The DMMoab object being set
432aa768e4cSTim Tautges 
433aa768e4cSTim Tautges   Output Parameter:
434aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
435aa768e4cSTim Tautges 
436aa768e4cSTim Tautges   Level: beginner
437aa768e4cSTim Tautges 
438aa768e4cSTim Tautges .keywords: DMMoab, create
439aa768e4cSTim Tautges @*/
4401d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
4411d72bce8STim Tautges {
4421d72bce8STim Tautges   PetscFunctionBegin;
4431d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4441d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
4451d72bce8STim Tautges   PetscFunctionReturn(0);
4461d72bce8STim Tautges }
4471d72bce8STim Tautges 
4481d72bce8STim Tautges 
449aa768e4cSTim Tautges /*@
450aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
451aa768e4cSTim Tautges 
452aa768e4cSTim Tautges   Collective on MPI_Comm
453aa768e4cSTim Tautges 
454aa768e4cSTim Tautges   Input Parameter:
455aa768e4cSTim Tautges . dm - The DMMoab object being set
456aa768e4cSTim Tautges . bs - The block size used with this DMMoab
457aa768e4cSTim Tautges 
458aa768e4cSTim Tautges   Level: beginner
459aa768e4cSTim Tautges 
460aa768e4cSTim Tautges .keywords: DMMoab, create
461aa768e4cSTim Tautges @*/
4621d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
4631d72bce8STim Tautges {
4641d72bce8STim Tautges   PetscFunctionBegin;
4651d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4661d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
4671d72bce8STim Tautges   PetscFunctionReturn(0);
4681d72bce8STim Tautges }
4691d72bce8STim Tautges 
4701d72bce8STim Tautges 
471aa768e4cSTim Tautges /*@
472aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
473aa768e4cSTim Tautges 
474aa768e4cSTim Tautges   Collective on MPI_Comm
475aa768e4cSTim Tautges 
476aa768e4cSTim Tautges   Input Parameter:
477aa768e4cSTim Tautges . dm - The DMMoab object being set
478aa768e4cSTim Tautges 
479aa768e4cSTim Tautges   Output Parameter:
480aa768e4cSTim Tautges . bs - The block size used with this DMMoab
481aa768e4cSTim Tautges 
482aa768e4cSTim Tautges   Level: beginner
483aa768e4cSTim Tautges 
484aa768e4cSTim Tautges .keywords: DMMoab, create
485aa768e4cSTim Tautges @*/
4861d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
4871d72bce8STim Tautges {
4881d72bce8STim Tautges   PetscFunctionBegin;
4891d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4901d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
4911d72bce8STim Tautges   PetscFunctionReturn(0);
4921d72bce8STim Tautges }
4931d72bce8STim Tautges 
4941cec0304SVijay Mahadevan 
495212ad6d1SVijay Mahadevan /*@
496212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
497212ad6d1SVijay Mahadevan 
49800cc10feSVijay Mahadevan   Collective on DM
499212ad6d1SVijay Mahadevan 
500212ad6d1SVijay Mahadevan   Input Parameter:
501212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
502212ad6d1SVijay Mahadevan 
503212ad6d1SVijay Mahadevan   Output Parameter:
50400cc10feSVijay Mahadevan . neg - The number of global elements in the DMMoab instance
50500cc10feSVijay Mahadevan . nvg - The number of global vertices in the DMMoab instance
506212ad6d1SVijay Mahadevan 
507212ad6d1SVijay Mahadevan   Level: beginner
508212ad6d1SVijay Mahadevan 
509212ad6d1SVijay Mahadevan .keywords: DMMoab, create
510212ad6d1SVijay Mahadevan @*/
51141dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *neg,PetscInt *nvg)
512212ad6d1SVijay Mahadevan {
513212ad6d1SVijay Mahadevan   PetscFunctionBegin;
514212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
51541dd5348SVijay Mahadevan   if(neg) *neg = ((DM_Moab*)dm->data)->nele;
51641dd5348SVijay Mahadevan   if(nvg) *nvg = ((DM_Moab*)dm->data)->n;
517212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
518212ad6d1SVijay Mahadevan }
519212ad6d1SVijay Mahadevan 
520212ad6d1SVijay Mahadevan 
521212ad6d1SVijay Mahadevan /*@
522212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
523212ad6d1SVijay Mahadevan 
52400cc10feSVijay Mahadevan   Collective on DM
525212ad6d1SVijay Mahadevan 
526212ad6d1SVijay Mahadevan   Input Parameter:
527212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
528212ad6d1SVijay Mahadevan 
529212ad6d1SVijay Mahadevan   Output Parameter:
530b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor
53100cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor
53200cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor
53300cc10feSVijay Mahadevan . nvg - The number of ghosted vertices in this processor
534212ad6d1SVijay Mahadevan 
535212ad6d1SVijay Mahadevan   Level: beginner
536212ad6d1SVijay Mahadevan 
537212ad6d1SVijay Mahadevan .keywords: DMMoab, create
538212ad6d1SVijay Mahadevan @*/
53941dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nel,PetscInt *neg,PetscInt *nvl,PetscInt *nvg)
540212ad6d1SVijay Mahadevan {
541212ad6d1SVijay Mahadevan   PetscFunctionBegin;
542212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
54341dd5348SVijay Mahadevan   if(nel) *nel = ((DM_Moab*)dm->data)->neleloc;
54441dd5348SVijay Mahadevan   if(neg) *neg = ((DM_Moab*)dm->data)->neleghost;
54541dd5348SVijay Mahadevan   if(nvl) *nvl = ((DM_Moab*)dm->data)->nloc;
54641dd5348SVijay Mahadevan   if(nvg) *nvg = ((DM_Moab*)dm->data)->nghost;
547212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
548212ad6d1SVijay Mahadevan }
549212ad6d1SVijay Mahadevan 
550212ad6d1SVijay Mahadevan 
55100cc10feSVijay Mahadevan /*@
55200cc10feSVijay Mahadevan   DMMoabGetOffset - Get the local offset for the global vector
55300cc10feSVijay Mahadevan 
55400cc10feSVijay Mahadevan   Collective on MPI_Comm
55500cc10feSVijay Mahadevan 
55600cc10feSVijay Mahadevan   Input Parameter:
55700cc10feSVijay Mahadevan . dm - The DMMoab object being set
55800cc10feSVijay Mahadevan 
55900cc10feSVijay Mahadevan   Output Parameter:
56000cc10feSVijay Mahadevan . offset - The local offset for the global vector
56100cc10feSVijay Mahadevan 
56200cc10feSVijay Mahadevan   Level: beginner
56300cc10feSVijay Mahadevan 
56400cc10feSVijay Mahadevan .keywords: DMMoab, create
56500cc10feSVijay Mahadevan @*/
56600cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm,PetscInt *offset)
56700cc10feSVijay Mahadevan {
56800cc10feSVijay Mahadevan   PetscFunctionBegin;
56900cc10feSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
57000cc10feSVijay Mahadevan   *offset = ((DM_Moab*)dm->data)->vstart;
57100cc10feSVijay Mahadevan   PetscFunctionReturn(0);
57200cc10feSVijay Mahadevan }
57300cc10feSVijay Mahadevan 
57400cc10feSVijay Mahadevan 
5754920ab11SVijay Mahadevan /*@
5764920ab11SVijay Mahadevan   DMMoabGetDimension - Get the dimension of the DM Mesh
5774920ab11SVijay Mahadevan 
5784920ab11SVijay Mahadevan   Collective on MPI_Comm
5794920ab11SVijay Mahadevan 
5804920ab11SVijay Mahadevan   Input Parameter:
581340f3b9aSVijay Mahadevan . dm - The DMMoab object
5824920ab11SVijay Mahadevan 
5834920ab11SVijay Mahadevan   Output Parameter:
5844920ab11SVijay Mahadevan . dim - The dimension of DM
5854920ab11SVijay Mahadevan 
5864920ab11SVijay Mahadevan   Level: beginner
5874920ab11SVijay Mahadevan 
5884920ab11SVijay Mahadevan .keywords: DMMoab, create
5894920ab11SVijay Mahadevan @*/
5904920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim)
5914920ab11SVijay Mahadevan {
5924920ab11SVijay Mahadevan   PetscFunctionBegin;
5934920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5944920ab11SVijay Mahadevan   *dim = ((DM_Moab*)dm->data)->dim;
5954920ab11SVijay Mahadevan   PetscFunctionReturn(0);
5964920ab11SVijay Mahadevan }
5974920ab11SVijay Mahadevan 
5984920ab11SVijay Mahadevan 
599340f3b9aSVijay Mahadevan /*@
600340f3b9aSVijay Mahadevan   DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh
601340f3b9aSVijay Mahadevan 
602340f3b9aSVijay Mahadevan   Collective on MPI_Comm
603340f3b9aSVijay Mahadevan 
604340f3b9aSVijay Mahadevan   Input Parameter:
605340f3b9aSVijay Mahadevan . dm - The DMMoab object
606340f3b9aSVijay Mahadevan . ehandle - The element entity handle
607340f3b9aSVijay Mahadevan 
608340f3b9aSVijay Mahadevan   Output Parameter:
609340f3b9aSVijay Mahadevan . mat - The material ID for the current entity
610340f3b9aSVijay Mahadevan 
611340f3b9aSVijay Mahadevan   Level: beginner
612340f3b9aSVijay Mahadevan 
613340f3b9aSVijay Mahadevan .keywords: DMMoab, create
614340f3b9aSVijay Mahadevan @*/
615340f3b9aSVijay Mahadevan PetscErrorCode DMMoabGetMaterialBlock(DM dm,const moab::EntityHandle ehandle, PetscInt *mat)
616340f3b9aSVijay Mahadevan {
617340f3b9aSVijay Mahadevan   DM_Moab         *dmmoab;
618340f3b9aSVijay Mahadevan   moab::ErrorCode merr;
619340f3b9aSVijay Mahadevan 
620340f3b9aSVijay Mahadevan   PetscFunctionBegin;
621340f3b9aSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
622340f3b9aSVijay Mahadevan   if (*mat) {
623340f3b9aSVijay Mahadevan     dmmoab = (DM_Moab*)(dm)->data;
62463cd93b2SVijay Mahadevan     merr=dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &ehandle, 1, mat);MBERRNM(merr);
625340f3b9aSVijay Mahadevan   }
626340f3b9aSVijay Mahadevan   PetscFunctionReturn(0);
627340f3b9aSVijay Mahadevan }
628340f3b9aSVijay Mahadevan 
6294920ab11SVijay Mahadevan 
63085d305f5SVijay Mahadevan /*@
63185d305f5SVijay Mahadevan   DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities
63285d305f5SVijay Mahadevan 
63385d305f5SVijay Mahadevan   Collective on MPI_Comm
63485d305f5SVijay Mahadevan 
63585d305f5SVijay Mahadevan   Input Parameter:
63685d305f5SVijay Mahadevan . dm - The DMMoab object
63785d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
63885d305f5SVijay Mahadevan . 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   PetscErrorCode  ierr;
6517023aa44SVijay Mahadevan   moab::ErrorCode merr;
6527023aa44SVijay Mahadevan 
6537023aa44SVijay Mahadevan   PetscFunctionBegin;
6547023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6557023aa44SVijay Mahadevan   PetscValidPointer(conn,3);
6567023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6577023aa44SVijay Mahadevan 
6587023aa44SVijay Mahadevan   if (!vpos) {
6597ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(nconn*3, &vpos);CHKERRQ(ierr);
6607023aa44SVijay Mahadevan   }
6617023aa44SVijay Mahadevan 
6627023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
6637023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
6647023aa44SVijay Mahadevan   PetscFunctionReturn(0);
6657023aa44SVijay Mahadevan }
6667023aa44SVijay Mahadevan 
6677023aa44SVijay Mahadevan 
66885d305f5SVijay Mahadevan /*@
66985d305f5SVijay Mahadevan   DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity
67085d305f5SVijay Mahadevan 
67185d305f5SVijay Mahadevan   Collective on MPI_Comm
67285d305f5SVijay Mahadevan 
67385d305f5SVijay Mahadevan   Input Parameter:
67485d305f5SVijay Mahadevan . dm - The DMMoab object
67585d305f5SVijay Mahadevan . vhandle - Vertex entity handle
67685d305f5SVijay Mahadevan 
67785d305f5SVijay Mahadevan   Output Parameter:
67885d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
67985d305f5SVijay Mahadevan . 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);
7038d8d51c8SVijay Mahadevan     ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr);
7048d8d51c8SVijay Mahadevan   }
7058d8d51c8SVijay Mahadevan   if (nconn) *nconn=connect.size();
7068d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
7078d8d51c8SVijay Mahadevan }
7088d8d51c8SVijay Mahadevan 
7098d8d51c8SVijay Mahadevan 
71085d305f5SVijay Mahadevan /*@
71185d305f5SVijay Mahadevan   DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity
71285d305f5SVijay Mahadevan 
71385d305f5SVijay Mahadevan   Collective on MPI_Comm
71485d305f5SVijay Mahadevan 
71585d305f5SVijay Mahadevan   Input Parameter:
71685d305f5SVijay Mahadevan . dm - The DMMoab object
71785d305f5SVijay Mahadevan . vhandle - Vertex entity handle
71885d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
71985d305f5SVijay Mahadevan . conn - The vertex entity handles
72085d305f5SVijay Mahadevan 
72185d305f5SVijay Mahadevan   Level: beginner
72285d305f5SVijay Mahadevan 
72385d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity()
72485d305f5SVijay Mahadevan @*/
7258d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
7268d8d51c8SVijay Mahadevan {
7278d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
7288d8d51c8SVijay Mahadevan 
7298d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7308d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7318d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
7328d8d51c8SVijay Mahadevan 
7338d8d51c8SVijay Mahadevan   if (conn) {
7348d8d51c8SVijay Mahadevan     ierr = PetscFree(*conn);CHKERRQ(ierr);
7358d8d51c8SVijay Mahadevan   }
7368d8d51c8SVijay Mahadevan   if (nconn) *nconn=0;
7378d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
7388d8d51c8SVijay Mahadevan }
7398d8d51c8SVijay Mahadevan 
7408d8d51c8SVijay Mahadevan 
74185d305f5SVijay Mahadevan /*@
74285d305f5SVijay Mahadevan   DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity
74385d305f5SVijay Mahadevan 
74485d305f5SVijay Mahadevan   Collective on MPI_Comm
74585d305f5SVijay Mahadevan 
74685d305f5SVijay Mahadevan   Input Parameter:
74785d305f5SVijay Mahadevan . dm - The DMMoab object
74885d305f5SVijay Mahadevan . ehandle - Vertex entity handle
74985d305f5SVijay Mahadevan 
75085d305f5SVijay Mahadevan   Output Parameter:
75185d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
75285d305f5SVijay Mahadevan . conn - The vertex entity handles
75385d305f5SVijay Mahadevan 
75485d305f5SVijay Mahadevan   Level: beginner
75585d305f5SVijay Mahadevan 
75685d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity(), DMMoabRestoreVertexConnectivity()
75785d305f5SVijay Mahadevan @*/
7587023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn)
7597023aa44SVijay Mahadevan {
7607023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
7617023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
7627023aa44SVijay Mahadevan   moab::ErrorCode merr;
7637023aa44SVijay Mahadevan   PetscInt nnodes;
7647023aa44SVijay Mahadevan 
7657023aa44SVijay Mahadevan   PetscFunctionBegin;
7667023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7677023aa44SVijay Mahadevan   PetscValidPointer(conn,4);
7687023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7697023aa44SVijay Mahadevan 
7707023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
7717023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr);
7727023aa44SVijay Mahadevan   if (conn) *conn=connect;
7737023aa44SVijay Mahadevan   if (nconn) *nconn=nnodes;
7747023aa44SVijay Mahadevan   PetscFunctionReturn(0);
7757023aa44SVijay Mahadevan }
7767023aa44SVijay Mahadevan 
7777023aa44SVijay Mahadevan 
77885d305f5SVijay Mahadevan /*@
77985d305f5SVijay Mahadevan   DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element)
78085d305f5SVijay Mahadevan 
78185d305f5SVijay Mahadevan   Collective on MPI_Comm
78285d305f5SVijay Mahadevan 
78385d305f5SVijay Mahadevan   Input Parameter:
78485d305f5SVijay Mahadevan . dm - The DMMoab object
78585d305f5SVijay Mahadevan . ent - Entity handle
78685d305f5SVijay Mahadevan 
78785d305f5SVijay Mahadevan   Output Parameter:
78885d305f5SVijay Mahadevan . ent_on_boundary - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
78985d305f5SVijay Mahadevan 
79085d305f5SVijay Mahadevan   Level: beginner
79185d305f5SVijay Mahadevan 
79285d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices()
79385d305f5SVijay Mahadevan @*/
79469263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary)
79569263071SVijay Mahadevan {
79669263071SVijay Mahadevan   moab::EntityType etype;
79769263071SVijay Mahadevan   DM_Moab         *dmmoab;
79869263071SVijay Mahadevan   PetscInt         edim;
79969263071SVijay Mahadevan 
80069263071SVijay Mahadevan   PetscFunctionBegin;
80169263071SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
80269263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary,3);
80369263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
80469263071SVijay Mahadevan 
80569263071SVijay Mahadevan   /* get the entity type and handle accordingly */
80669263071SVijay Mahadevan   etype=dmmoab->mbiface->type_from_handle(ent);
80769263071SVijay 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);
80869263071SVijay Mahadevan 
80969263071SVijay Mahadevan   /* get the entity dimension */
81069263071SVijay Mahadevan   edim=dmmoab->mbiface->dimension_from_handle(ent);
81169263071SVijay Mahadevan 
81269263071SVijay Mahadevan   *ent_on_boundary=PETSC_FALSE;
81369263071SVijay Mahadevan   if(etype == moab::MBVERTEX && edim == 0) {
814b117cd09SVijay Mahadevan     if (dmmoab->hlevel) {
815b117cd09SVijay Mahadevan       *ent_on_boundary=(dmmoab->hierarchy->is_boundary_vertex(ent) ? PETSC_TRUE:PETSC_FALSE);
816b117cd09SVijay Mahadevan     }
817b117cd09SVijay Mahadevan     else *ent_on_boundary=((dmmoab->bndyvtx->index(ent) >= 0) ? PETSC_TRUE:PETSC_FALSE);
81869263071SVijay Mahadevan   }
81969263071SVijay Mahadevan   else {
82069263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
8216d9eb265SVijay Mahadevan       if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
82269263071SVijay Mahadevan     }
82369263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
8246d9eb265SVijay Mahadevan       if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
82569263071SVijay Mahadevan     }
82669263071SVijay Mahadevan   }
82769263071SVijay Mahadevan   PetscFunctionReturn(0);
82869263071SVijay Mahadevan }
82969263071SVijay Mahadevan 
83069263071SVijay Mahadevan 
83185d305f5SVijay Mahadevan /*@
83285d305f5SVijay Mahadevan   DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element)
83385d305f5SVijay Mahadevan 
83485d305f5SVijay Mahadevan   Input Parameter:
83585d305f5SVijay Mahadevan . dm - The DMMoab object
83685d305f5SVijay Mahadevan . nconn - Number of handles
83785d305f5SVijay Mahadevan . cnt - Array of entity handles
83885d305f5SVijay Mahadevan 
83985d305f5SVijay Mahadevan   Output Parameter:
84085d305f5SVijay Mahadevan . isbdvtx - Array of boundary markers - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
84185d305f5SVijay Mahadevan 
84285d305f5SVijay Mahadevan   Level: beginner
84385d305f5SVijay Mahadevan 
84485d305f5SVijay Mahadevan .seealso: DMMoabIsEntityOnBoundary()
84585d305f5SVijay Mahadevan @*/
84669263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx)
8477023aa44SVijay Mahadevan {
8487023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
8497023aa44SVijay Mahadevan   PetscInt       i;
8507023aa44SVijay Mahadevan 
8517023aa44SVijay Mahadevan   PetscFunctionBegin;
8527023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8537023aa44SVijay Mahadevan   PetscValidPointer(cnt,3);
8547023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx,4);
8557023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8567023aa44SVijay Mahadevan 
8577023aa44SVijay Mahadevan   for (i=0; i < nconn; ++i) {
858b117cd09SVijay Mahadevan     if (dmmoab->hlevel) {
859b117cd09SVijay Mahadevan       isbdvtx[i]=(dmmoab->hierarchy->is_boundary_vertex(cnt[i]) ? PETSC_TRUE:PETSC_FALSE);
860b117cd09SVijay Mahadevan     }
861b117cd09SVijay Mahadevan     else {
8626d9eb265SVijay Mahadevan       isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE);
8637023aa44SVijay Mahadevan     }
864b117cd09SVijay Mahadevan   }
8657023aa44SVijay Mahadevan   PetscFunctionReturn(0);
8667023aa44SVijay Mahadevan }
8677023aa44SVijay Mahadevan 
8687023aa44SVijay Mahadevan 
86985d305f5SVijay Mahadevan /*@
87085d305f5SVijay Mahadevan   DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary
87185d305f5SVijay Mahadevan 
87285d305f5SVijay Mahadevan   Input Parameter:
87385d305f5SVijay Mahadevan . dm - The DMMoab object
87485d305f5SVijay Mahadevan 
87585d305f5SVijay Mahadevan   Output Parameter:
87685d305f5SVijay Mahadevan . bdvtx - Boundary vertices
87785d305f5SVijay Mahadevan . bdelems - Boundary elements
87885d305f5SVijay Mahadevan . bdfaces - Boundary faces
87985d305f5SVijay Mahadevan 
88085d305f5SVijay Mahadevan   Level: beginner
88185d305f5SVijay Mahadevan 
88285d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices(), DMMoabIsEntityOnBoundary()
88385d305f5SVijay Mahadevan @*/
8846d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces)
8851cec0304SVijay Mahadevan {
8861cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
8871cec0304SVijay Mahadevan 
8881cec0304SVijay Mahadevan   PetscFunctionBegin;
8891cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8901cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8911cec0304SVijay Mahadevan 
8926d9eb265SVijay Mahadevan   if (bdvtx)  *bdvtx = dmmoab->bndyvtx;
8936d9eb265SVijay Mahadevan   if (bdfaces)  *bdfaces = dmmoab->bndyfaces;
8946d9eb265SVijay Mahadevan   if (bdelems)  *bdfaces = dmmoab->bndyelems;
8951cec0304SVijay Mahadevan   PetscFunctionReturn(0);
8961cec0304SVijay Mahadevan }
8971cec0304SVijay Mahadevan 
898f6829af0SVijay Mahadevan 
899f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm)
900f6829af0SVijay Mahadevan {
901f6829af0SVijay Mahadevan   PetscErrorCode  ierr;
90285d305f5SVijay Mahadevan   PetscInt        i;
903e882eb38SVijay Mahadevan   moab::ErrorCode merr;
904f6829af0SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
905f6829af0SVijay Mahadevan 
906f6829af0SVijay Mahadevan   PetscFunctionBegin;
907f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
908f6829af0SVijay Mahadevan   if (dmmoab->icreatedinstance) {
909f6829af0SVijay Mahadevan     delete dmmoab->mbiface;
910f6829af0SVijay Mahadevan   }
911f6829af0SVijay Mahadevan   dmmoab->mbiface = NULL;
912f6829af0SVijay Mahadevan   dmmoab->pcomm = NULL;
913f6829af0SVijay Mahadevan   delete dmmoab->vlocal;
914f6829af0SVijay Mahadevan   delete dmmoab->vowned;
915f6829af0SVijay Mahadevan   delete dmmoab->vghost;
916f6829af0SVijay Mahadevan   delete dmmoab->elocal;
917f6829af0SVijay Mahadevan   delete dmmoab->eghost;
918f6829af0SVijay Mahadevan   delete dmmoab->bndyvtx;
919f6829af0SVijay Mahadevan   delete dmmoab->bndyfaces;
920f6829af0SVijay Mahadevan   delete dmmoab->bndyelems;
921f6829af0SVijay Mahadevan 
922f6829af0SVijay Mahadevan   ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr);
9237ae5e5b6SVijay Mahadevan   ierr = PetscFree2(dmmoab->gidmap,dmmoab->lidmap);CHKERRQ(ierr);
9245905e1eaSVijay Mahadevan   ierr = PetscFree(dmmoab->dfill);CHKERRQ(ierr);
9255905e1eaSVijay Mahadevan   ierr = PetscFree(dmmoab->ofill);CHKERRQ(ierr);
92685d305f5SVijay Mahadevan   if (dmmoab->fieldNames) {
92785d305f5SVijay Mahadevan     for(i=0; i<dmmoab->numFields; i++) {
92885d305f5SVijay Mahadevan       ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr);
92985d305f5SVijay Mahadevan     }
93085d305f5SVijay Mahadevan     ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr);
93185d305f5SVijay Mahadevan   }
932b117cd09SVijay Mahadevan 
933b117cd09SVijay Mahadevan   if (dmmoab->nhlevels) {
934b117cd09SVijay Mahadevan     ierr = PetscFree(dmmoab->hsets);CHKERRQ(ierr);
935e882eb38SVijay Mahadevan     dmmoab->nhlevels=0;
936e882eb38SVijay Mahadevan     if (!dmmoab->hlevel && dmmoab->icreatedinstance) delete dmmoab->hierarchy;
937e882eb38SVijay Mahadevan     dmmoab->hierarchy=NULL;
938b117cd09SVijay Mahadevan   }
939e882eb38SVijay Mahadevan 
940e882eb38SVijay Mahadevan   if (dmmoab->icreatedinstance) {
941e882eb38SVijay Mahadevan     merr = dmmoab->mbiface->delete_mesh();MBERRNM(merr);
942e882eb38SVijay Mahadevan     delete dmmoab->mbiface;
943e882eb38SVijay Mahadevan   }
944e882eb38SVijay Mahadevan   dmmoab->mbiface = NULL;
945e882eb38SVijay Mahadevan   dmmoab->pcomm = NULL;
946e882eb38SVijay Mahadevan 
947f6829af0SVijay Mahadevan   ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
948f6829af0SVijay Mahadevan   ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr);
949f6829af0SVijay Mahadevan   ierr = PetscFree(dm->data);CHKERRQ(ierr);
950f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
951f6829af0SVijay Mahadevan }
952f6829af0SVijay Mahadevan 
953f6829af0SVijay Mahadevan 
9544416b707SBarry Smith PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(PetscOptionItems *PetscOptionsObject,DM dm)
9552e4e7c01SVijay Mahadevan {
9562e4e7c01SVijay Mahadevan   PetscErrorCode ierr;
9572e4e7c01SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
9582e4e7c01SVijay Mahadevan 
9592e4e7c01SVijay Mahadevan   PetscFunctionBegin;
9602e4e7c01SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
961cc310fddSBarry Smith   ierr = PetscOptionsHead(PetscOptionsObject,"DMMoab Options");CHKERRQ(ierr);
9622e4e7c01SVijay 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);
9632e4e7c01SVijay 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);
9642e4e7c01SVijay Mahadevan   /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */
9652e4e7c01SVijay 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);
9662e4e7c01SVijay 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);
9672e4e7c01SVijay Mahadevan   ierr  = PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum*)&dmmoab->read_mode, NULL);CHKERRQ(ierr);
9682e4e7c01SVijay Mahadevan   ierr  = PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum*)&dmmoab->write_mode, NULL);CHKERRQ(ierr);
9692e4e7c01SVijay Mahadevan   PetscFunctionReturn(0);
9702e4e7c01SVijay Mahadevan }
9712e4e7c01SVijay Mahadevan 
9722e4e7c01SVijay Mahadevan 
973f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm)
974f6829af0SVijay Mahadevan {
975f6829af0SVijay Mahadevan   PetscErrorCode          ierr;
976f6829af0SVijay Mahadevan   moab::ErrorCode         merr;
977f6829af0SVijay Mahadevan   Vec                     local, global;
978f6829af0SVijay Mahadevan   IS                      from,to;
979f6829af0SVijay Mahadevan   moab::Range::iterator   iter;
980*ce27a4eeSVijay Mahadevan   PetscInt                i,j,f,bs,gmin,lmin,lmax,vent,totsize,*lgmap;
981f6829af0SVijay Mahadevan   DM_Moab                *dmmoab = (DM_Moab*)dm->data;
982f6829af0SVijay Mahadevan   moab::Range             adjs;
983f6829af0SVijay Mahadevan 
984f6829af0SVijay Mahadevan   PetscFunctionBegin;
985f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
986f6829af0SVijay Mahadevan   /* Get the local and shared vertices and cache it */
987c528d872SBarry 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.");
988f6829af0SVijay Mahadevan 
989f6829af0SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
990f6829af0SVijay Mahadevan   if (dmmoab->vlocal->empty())
991f6829af0SVijay Mahadevan   {
992f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
993f6829af0SVijay Mahadevan 
994f6829af0SVijay Mahadevan     /* filter based on parallel status */
995f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
996f6829af0SVijay Mahadevan 
997f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
998f6829af0SVijay Mahadevan     adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
999f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
1000f6829af0SVijay Mahadevan     adjs = moab::subtract(adjs, *dmmoab->vghost);
1001f6829af0SVijay Mahadevan     *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs);
1002f6829af0SVijay Mahadevan 
1003f6829af0SVijay Mahadevan     /* compute and cache the sizes of local and ghosted entities */
1004f6829af0SVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
1005f6829af0SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
1006b2566f29SBarry Smith     ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
1007f6829af0SVijay Mahadevan   }
1008f6829af0SVijay Mahadevan 
1009f6829af0SVijay Mahadevan   {
1010f6829af0SVijay Mahadevan     /* get the information about the local elements in the mesh */
1011f6829af0SVijay Mahadevan     dmmoab->eghost->clear();
1012f6829af0SVijay Mahadevan 
1013f6829af0SVijay Mahadevan     /* first decipher the leading dimension */
1014f6829af0SVijay Mahadevan     for (i=3;i>0;i--) {
1015f6829af0SVijay Mahadevan       dmmoab->elocal->clear();
1016f6829af0SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr);
1017f6829af0SVijay Mahadevan 
1018f6829af0SVijay Mahadevan       /* store the current mesh dimension */
1019f6829af0SVijay Mahadevan       if (dmmoab->elocal->size()) {
1020f6829af0SVijay Mahadevan         dmmoab->dim=i;
1021f6829af0SVijay Mahadevan         break;
1022f6829af0SVijay Mahadevan       }
1023f6829af0SVijay Mahadevan     }
1024f6829af0SVijay Mahadevan 
1025b117cd09SVijay Mahadevan     ierr = DMSetDimension(dm, dmmoab->dim);CHKERRQ(ierr);
1026b117cd09SVijay Mahadevan 
1027f6829af0SVijay Mahadevan     /* filter the ghosted and owned element list */
1028f6829af0SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
1029f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
1030f6829af0SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
1031f6829af0SVijay Mahadevan 
1032f6829af0SVijay Mahadevan     dmmoab->neleloc = dmmoab->elocal->size();
1033f6829af0SVijay Mahadevan     dmmoab->neleghost = dmmoab->eghost->size();
1034b2566f29SBarry Smith     ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
1035f6829af0SVijay Mahadevan   }
1036f6829af0SVijay Mahadevan 
1037f6829af0SVijay Mahadevan   bs = dmmoab->bs;
1038f6829af0SVijay Mahadevan   if (!dmmoab->ltog_tag) {
1039f6829af0SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
1040f6829af0SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
1041f6829af0SVijay Mahadevan        assemble the individual pieces of the mesh */
1042f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
1043f6829af0SVijay Mahadevan   }
1044f6829af0SVijay Mahadevan 
1045f6829af0SVijay Mahadevan   totsize=dmmoab->vlocal->size();
1046f6829af0SVijay Mahadevan   if (totsize != dmmoab->nloc+dmmoab->nghost) SETERRQ2(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Mismatch between local and owned+ghost vertices. %D != %D.",totsize,dmmoab->nloc+dmmoab->nghost);
10477ae5e5b6SVijay Mahadevan   ierr = PetscMalloc1(totsize,&dmmoab->gsindices);CHKERRQ(ierr);
1048f6829af0SVijay Mahadevan   {
1049f6829af0SVijay Mahadevan     /* first get the local indices */
1050f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr);
10513f1c6e43SVijay Mahadevan     if (dmmoab->nghost) {  /* next get the ghosted indices */
1052f6829af0SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr);
1053f6829af0SVijay Mahadevan     }
1054f6829af0SVijay Mahadevan 
1055f6829af0SVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
1056f6829af0SVijay Mahadevan     lmin=lmax=dmmoab->gsindices[0];
1057f6829af0SVijay Mahadevan     for (i=0; i<totsize; ++i) {
1058f6829af0SVijay Mahadevan       if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i];
1059f6829af0SVijay Mahadevan       if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i];
1060f6829af0SVijay Mahadevan     }
1061f6829af0SVijay Mahadevan 
1062b2566f29SBarry Smith     ierr = MPIU_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr);
1063f6829af0SVijay Mahadevan 
1064f6829af0SVijay Mahadevan     /* set the GID map */
1065f6829af0SVijay Mahadevan     for (i=0; i<totsize; ++i) {
1066f6829af0SVijay Mahadevan       dmmoab->gsindices[i]-=gmin;   /* zero based index needed for IS */
1067f6829af0SVijay Mahadevan     }
1068f6829af0SVijay Mahadevan     lmin-=gmin;
1069f6829af0SVijay Mahadevan     lmax-=gmin;
1070f6829af0SVijay Mahadevan 
1071f6829af0SVijay Mahadevan     PetscInfo3(NULL, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin);
1072f6829af0SVijay Mahadevan   }
107382dfd14aSVijay 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);
1074f6829af0SVijay Mahadevan 
1075f6829af0SVijay Mahadevan   {
10763f1c6e43SVijay Mahadevan     dmmoab->seqstart=((PetscInt)dmmoab->vlocal->front());
10773f1c6e43SVijay Mahadevan     dmmoab->seqend=((PetscInt)dmmoab->vlocal->back());
10783f1c6e43SVijay Mahadevan 
10793f1c6e43SVijay Mahadevan     ierr = PetscMalloc2(dmmoab->seqend,&dmmoab->gidmap,dmmoab->seqend,&dmmoab->lidmap);CHKERRQ(ierr);
10803f1c6e43SVijay Mahadevan     ierr = PetscMalloc1(totsize*dmmoab->numFields,&lgmap);CHKERRQ(ierr);
1081f6829af0SVijay Mahadevan 
1082f6829af0SVijay Mahadevan     i=j=0;
1083f6829af0SVijay Mahadevan     /* set the owned vertex data first */
1084f6829af0SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) {
10853f1c6e43SVijay Mahadevan       vent=(PetscInt)(*iter)-dmmoab->seqstart;
1086f6829af0SVijay Mahadevan       dmmoab->gidmap[vent]=dmmoab->gsindices[i];
1087f6829af0SVijay Mahadevan       dmmoab->lidmap[vent]=i;
1088f6829af0SVijay Mahadevan       for (f=0;f<dmmoab->numFields;f++,j++) {
10893f1c6e43SVijay Mahadevan         lgmap[j]=(bs > 1 ? dmmoab->gsindices[i]*dmmoab->numFields+f : totsize*f+dmmoab->gsindices[i]);
1090f6829af0SVijay Mahadevan       }
1091f6829af0SVijay Mahadevan     }
1092f6829af0SVijay Mahadevan     /* next arrange all the ghosted data information */
1093f6829af0SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) {
10943f1c6e43SVijay Mahadevan       vent=(PetscInt)(*iter)-dmmoab->seqstart;
1095f6829af0SVijay Mahadevan       dmmoab->gidmap[vent]=dmmoab->gsindices[i];
1096f6829af0SVijay Mahadevan       dmmoab->lidmap[vent]=i;
1097f6829af0SVijay Mahadevan       for (f=0;f<dmmoab->numFields;f++,j++) {
10983f1c6e43SVijay Mahadevan         lgmap[j]=(bs > 1 ? dmmoab->gsindices[i]*dmmoab->numFields+f : totsize*f+dmmoab->gsindices[i]);
1099f6829af0SVijay Mahadevan       }
1100f6829af0SVijay Mahadevan     }
1101f6829af0SVijay Mahadevan 
1102f6829af0SVijay Mahadevan     /* We need to create the Global to Local Vector Scatter Contexts
1103f6829af0SVijay Mahadevan        1) First create a local and global vector
1104f6829af0SVijay Mahadevan        2) Create a local and global IS
1105f6829af0SVijay Mahadevan        3) Create VecScatter and LtoGMapping objects
1106f6829af0SVijay Mahadevan        4) Cleanup the IS and Vec objects
1107f6829af0SVijay Mahadevan     */
1108f6829af0SVijay Mahadevan     ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr);
1109f6829af0SVijay Mahadevan     ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr);
1110f6829af0SVijay Mahadevan 
1111f6829af0SVijay Mahadevan     ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr);
1112f6829af0SVijay Mahadevan     PetscInfo3(NULL, "Total-size = %D\t Owned = %D, Ghosted = %D.\n", totsize, dmmoab->nloc, dmmoab->nghost);
1113f6829af0SVijay Mahadevan 
1114f6829af0SVijay Mahadevan     /* global to local must retrieve ghost points */
1115f6829af0SVijay Mahadevan     ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,dmmoab->vstart,1,&from);CHKERRQ(ierr);
1116f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr);
1117f6829af0SVijay Mahadevan 
11183f1c6e43SVijay Mahadevan     ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,&lgmap[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr);
1119f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(to,bs);CHKERRQ(ierr);
1120f6829af0SVijay Mahadevan 
1121f6829af0SVijay Mahadevan     if (!dmmoab->ltog_map) {
1122f6829af0SVijay Mahadevan       /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */
11233f1c6e43SVijay Mahadevan       ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,dmmoab->bs,totsize*dmmoab->numFields,lgmap,
1124f6829af0SVijay Mahadevan                                           PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr);
1125f6829af0SVijay Mahadevan     }
1126f6829af0SVijay Mahadevan 
1127f6829af0SVijay Mahadevan     /* now create the scatter object from local to global vector */
1128f6829af0SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
1129f6829af0SVijay Mahadevan 
1130f6829af0SVijay Mahadevan     /* clean up IS, Vec */
11313f1c6e43SVijay Mahadevan     ierr = PetscFree(lgmap);CHKERRQ(ierr);
1132f6829af0SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
1133f6829af0SVijay Mahadevan     ierr = ISDestroy(&to);CHKERRQ(ierr);
1134f6829af0SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
1135f6829af0SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
1136f6829af0SVijay Mahadevan   }
1137f6829af0SVijay Mahadevan 
1138f6829af0SVijay Mahadevan   /* skin the boundary and store nodes */
1139f6829af0SVijay Mahadevan   {
1140f6829af0SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
1141f6829af0SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
1142f6829af0SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
1143f6829af0SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
1144f6829af0SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
1145f6829af0SVijay Mahadevan 
1146f6829af0SVijay Mahadevan     dmmoab->bndyvtx = new moab::Range();
1147f6829af0SVijay Mahadevan     dmmoab->bndyfaces = new moab::Range();
1148f6829af0SVijay Mahadevan     dmmoab->bndyelems = new moab::Range();
1149f6829af0SVijay Mahadevan 
1150f6829af0SVijay Mahadevan     /* get the entities on the skin - only the faces */
1151f6829af0SVijay 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
1152f6829af0SVijay Mahadevan 
1153f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
1154f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
1155f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr);
1156f6829af0SVijay Mahadevan 
1157f6829af0SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
1158f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr);
1159f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr);
1160f6829af0SVijay Mahadevan     PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size());
1161f6829af0SVijay Mahadevan   }
1162f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1163f6829af0SVijay Mahadevan }
1164f6829af0SVijay Mahadevan 
1165f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
1166f6829af0SVijay Mahadevan {
1167f6829af0SVijay Mahadevan   PetscErrorCode ierr;
1168f6829af0SVijay Mahadevan 
1169f6829af0SVijay Mahadevan   PetscFunctionBegin;
1170f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1171f90c3b0eSVijay Mahadevan   ierr = PetscNewLog(dm,(DM_Moab**)&dm->data);CHKERRQ(ierr);
1172f6829af0SVijay Mahadevan 
1173f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
1174f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->numFields = 1;
1175f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
1176f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
1177f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
1178f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
1179f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
1180f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleghost = 0;
1181c528d872SBarry Smith   ((DM_Moab*)dm->data)->ltog_map = NULL;
1182c528d872SBarry Smith   ((DM_Moab*)dm->data)->ltog_sendrecv = NULL;
1183f6829af0SVijay Mahadevan 
1184f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
1185f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
1186f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
1187f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
1188f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
1189f6829af0SVijay Mahadevan 
1190f6829af0SVijay Mahadevan   dm->ops->createglobalvector       = DMCreateGlobalVector_Moab;
1191f6829af0SVijay Mahadevan   dm->ops->createlocalvector        = DMCreateLocalVector_Moab;
1192f6829af0SVijay Mahadevan   dm->ops->creatematrix             = DMCreateMatrix_Moab;
1193f6829af0SVijay Mahadevan   dm->ops->setup                    = DMSetUp_Moab;
1194f6829af0SVijay Mahadevan   dm->ops->destroy                  = DMDestroy_Moab;
1195e882eb38SVijay Mahadevan   dm->ops->coarsenhierarchy         = DMCoarsenHierarchy_Moab;
1196e882eb38SVijay Mahadevan   dm->ops->refinehierarchy          = DMRefineHierarchy_Moab;
1197b117cd09SVijay Mahadevan   dm->ops->createinterpolation      = DMCreateInterpolation_Moab;
1198b117cd09SVijay Mahadevan   //dm->ops->getinjection             = DMCreateInjection_Moab;
1199b117cd09SVijay Mahadevan   dm->ops->refine                   = DMRefine_Moab;
1200b117cd09SVijay Mahadevan   dm->ops->coarsen                  = DMCoarsen_Moab;
12012e4e7c01SVijay Mahadevan   dm->ops->setfromoptions           = DMSetFromOptions_Moab;
1202f6829af0SVijay Mahadevan   dm->ops->globaltolocalbegin       = DMGlobalToLocalBegin_Moab;
1203f6829af0SVijay Mahadevan   dm->ops->globaltolocalend         = DMGlobalToLocalEnd_Moab;
1204f6829af0SVijay Mahadevan   dm->ops->localtoglobalbegin       = DMLocalToGlobalBegin_Moab;
1205f6829af0SVijay Mahadevan   dm->ops->localtoglobalend         = DMLocalToGlobalEnd_Moab;
1206f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1207f6829af0SVijay Mahadevan }
1208f6829af0SVijay Mahadevan 
1209