xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision b117cd09e766aba90b52b0bef2091bbb861995da)
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 /*@
52*b117cd09SVijay 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;
97*b117cd09SVijay 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;
1172e4e7c01SVijay Mahadevan   dmmoab->rw_dbglevel = 0;
1182e4e7c01SVijay Mahadevan   dmmoab->partition_by_rank = PETSC_FALSE;
1192e4e7c01SVijay Mahadevan   dmmoab->extra_read_options[0] = '\0';
1202e4e7c01SVijay Mahadevan   dmmoab->extra_write_options[0] = '\0';
1212e4e7c01SVijay Mahadevan   dmmoab->read_mode = READ_PART;
1222e4e7c01SVijay Mahadevan   dmmoab->write_mode = WRITE_PART;
1234973de03SVijay Mahadevan 
1244973de03SVijay Mahadevan   /* set global ID tag handle */
1251a845d2aSVijay Mahadevan   if (ltog_tag && *ltog_tag) {
12685d305f5SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag);CHKERRQ(ierr);
127032b8ab6SVijay Mahadevan   }
128032b8ab6SVijay Mahadevan   else {
1291a845d2aSVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
1301a845d2aSVijay Mahadevan     if (ltog_tag) *ltog_tag = dmmoab->ltog_tag;
131a4d2169cSTim Tautges   }
132a4d2169cSTim Tautges 
133340f3b9aSVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag);MBERRNM(merr);
134340f3b9aSVijay Mahadevan 
1354973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
136a4d2169cSTim Tautges   if (range) {
13785d305f5SVijay Mahadevan     ierr = DMMoabSetLocalVertices(dmmb, range);CHKERRQ(ierr);
138a4d2169cSTim Tautges   }
13985d305f5SVijay Mahadevan   *dmb=dmmb;
1401d72bce8STim Tautges   PetscFunctionReturn(0);
1411d72bce8STim Tautges }
1421d72bce8STim Tautges 
143aa768e4cSTim Tautges /*@
144aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
145aa768e4cSTim Tautges 
146aa768e4cSTim Tautges   Collective on MPI_Comm
147aa768e4cSTim Tautges 
148aa768e4cSTim Tautges   Input Parameter:
149aa768e4cSTim Tautges . dm    - The DMMoab object being set
150aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
151aa768e4cSTim Tautges 
152aa768e4cSTim Tautges   Level: beginner
153aa768e4cSTim Tautges 
154aa768e4cSTim Tautges .keywords: DMMoab, create
155aa768e4cSTim Tautges @*/
1561d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
1571d72bce8STim Tautges {
158032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
159032b8ab6SVijay Mahadevan 
1601d72bce8STim Tautges   PetscFunctionBegin;
1611d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1621cec0304SVijay Mahadevan   PetscValidPointer(pcomm,2);
163032b8ab6SVijay Mahadevan   dmmoab->pcomm = pcomm;
164032b8ab6SVijay Mahadevan   dmmoab->mbiface = pcomm->get_moab();
165032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
1661d72bce8STim Tautges   PetscFunctionReturn(0);
1671d72bce8STim Tautges }
1681d72bce8STim Tautges 
1691d72bce8STim Tautges 
170aa768e4cSTim Tautges /*@
171aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
172aa768e4cSTim Tautges 
173aa768e4cSTim Tautges   Collective on MPI_Comm
174aa768e4cSTim Tautges 
175aa768e4cSTim Tautges   Input Parameter:
176aa768e4cSTim Tautges . dm    - The DMMoab object being set
177aa768e4cSTim Tautges 
178aa768e4cSTim Tautges   Output Parameter:
179aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
180aa768e4cSTim Tautges 
181aa768e4cSTim Tautges   Level: beginner
182aa768e4cSTim Tautges 
183aa768e4cSTim Tautges .keywords: DMMoab, create
184aa768e4cSTim Tautges @*/
1851d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
1861d72bce8STim Tautges {
1871d72bce8STim Tautges   PetscFunctionBegin;
1881d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
189032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
1901d72bce8STim Tautges   PetscFunctionReturn(0);
1911d72bce8STim Tautges }
1921d72bce8STim Tautges 
1931d72bce8STim Tautges 
194aa768e4cSTim Tautges /*@
195aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
196aa768e4cSTim Tautges 
197aa768e4cSTim Tautges   Collective on MPI_Comm
198aa768e4cSTim Tautges 
199aa768e4cSTim Tautges   Input Parameter:
200aa768e4cSTim Tautges . dm      - The DMMoab object being set
201aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
202aa768e4cSTim Tautges 
203aa768e4cSTim Tautges   Level: beginner
204aa768e4cSTim Tautges 
205aa768e4cSTim Tautges .keywords: DMMoab, create
206aa768e4cSTim Tautges @*/
207a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
2081d72bce8STim Tautges {
209032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
210032b8ab6SVijay Mahadevan 
2111d72bce8STim Tautges   PetscFunctionBegin;
2121d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2131cec0304SVijay Mahadevan   PetscValidPointer(mbiface,2);
214032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
215032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
216032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
2171d72bce8STim Tautges   PetscFunctionReturn(0);
2181d72bce8STim Tautges }
2191d72bce8STim Tautges 
2201d72bce8STim Tautges 
221aa768e4cSTim Tautges /*@
222aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
223aa768e4cSTim Tautges 
224aa768e4cSTim Tautges   Collective on MPI_Comm
225aa768e4cSTim Tautges 
226aa768e4cSTim Tautges   Input Parameter:
227aa768e4cSTim Tautges . dm      - The DMMoab object being set
228aa768e4cSTim Tautges 
229aa768e4cSTim Tautges   Output Parameter:
230aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
231aa768e4cSTim Tautges 
232aa768e4cSTim Tautges   Level: beginner
233aa768e4cSTim Tautges 
234aa768e4cSTim Tautges .keywords: DMMoab, create
235aa768e4cSTim Tautges @*/
236a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
2371d72bce8STim Tautges {
2389426e041SSatish Balay   PetscErrorCode   ierr;
239cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
240cabb514dSBarry Smith 
2411d72bce8STim Tautges   PetscFunctionBegin;
2421d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
243cabb514dSBarry Smith   ierr = PetscCitationsRegister("@techreport{tautges_moab:_2004,\n  type = {{SAND2004-1592}},\n  title = {{MOAB:} A Mesh-Oriented Database},  institution = {Sandia National Laboratories},\n  author = {Tautges, T. J. and Meyers, R. and Merkley, K. and Stimpson, C. and Ernst, C.},\n  year = {2004},  note = {Report}\n}\n",&cite);CHKERRQ(ierr);
244a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
2451d72bce8STim Tautges   PetscFunctionReturn(0);
2461d72bce8STim Tautges }
2471d72bce8STim Tautges 
2481d72bce8STim Tautges 
249aa768e4cSTim Tautges /*@
2505eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
251aa768e4cSTim Tautges 
252aa768e4cSTim Tautges   Collective on MPI_Comm
253aa768e4cSTim Tautges 
254aa768e4cSTim Tautges   Input Parameter:
255aa768e4cSTim Tautges . dm    - The DMMoab object being set
256aa768e4cSTim Tautges . range - The entities treated by this DMMoab
257aa768e4cSTim Tautges 
258aa768e4cSTim Tautges   Level: beginner
259aa768e4cSTim Tautges 
260aa768e4cSTim Tautges .keywords: DMMoab, create
261aa768e4cSTim Tautges @*/
2625eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range)
2631d72bce8STim Tautges {
264032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
265032b8ab6SVijay Mahadevan   PetscErrorCode  ierr;
266fd3326ddSVijay Mahadevan   moab::Range     tmpvtxs;
267032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
268032b8ab6SVijay Mahadevan 
2691d72bce8STim Tautges   PetscFunctionBegin;
2701d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
271032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
272032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
273fd3326ddSVijay Mahadevan 
274032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
275fd3326ddSVijay Mahadevan 
276fd3326ddSVijay Mahadevan   /* filter based on parallel status */
277fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
278fd3326ddSVijay Mahadevan 
279fd3326ddSVijay Mahadevan   /* filter all the non-owned and shared entities out of the list */
280fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
281fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(tmpvtxs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
282fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost);
283fd3326ddSVijay Mahadevan   *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs);
284fd3326ddSVijay Mahadevan 
285fd3326ddSVijay Mahadevan   /* compute and cache the sizes of local and ghosted entities */
286032b8ab6SVijay Mahadevan   dmmoab->nloc = dmmoab->vowned->size();
287032b8ab6SVijay Mahadevan   dmmoab->nghost = dmmoab->vghost->size();
288b2566f29SBarry Smith   ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
2891d72bce8STim Tautges   PetscFunctionReturn(0);
2901d72bce8STim Tautges }
2911d72bce8STim Tautges 
2921d72bce8STim Tautges 
2938d8d51c8SVijay Mahadevan /*@
2948d8d51c8SVijay Mahadevan   DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab
2958d8d51c8SVijay Mahadevan 
2968d8d51c8SVijay Mahadevan   Collective on MPI_Comm
2978d8d51c8SVijay Mahadevan 
2988d8d51c8SVijay Mahadevan   Input Parameter:
2998d8d51c8SVijay Mahadevan . dm    - The DMMoab object being set
3008d8d51c8SVijay Mahadevan 
3018d8d51c8SVijay Mahadevan   Output Parameter:
3028d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted)
3038d8d51c8SVijay Mahadevan 
3048d8d51c8SVijay Mahadevan   Level: beginner
3058d8d51c8SVijay Mahadevan 
3068d8d51c8SVijay Mahadevan .keywords: DMMoab, create
3078d8d51c8SVijay Mahadevan @*/
3088d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local)
3098d8d51c8SVijay Mahadevan {
3108d8d51c8SVijay Mahadevan   PetscFunctionBegin;
3118d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3128d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab*)dm->data)->vlocal;
3138d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
3148d8d51c8SVijay Mahadevan }
3158d8d51c8SVijay Mahadevan 
3168d8d51c8SVijay Mahadevan 
3178d8d51c8SVijay Mahadevan 
318aa768e4cSTim Tautges /*@
3195eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
320aa768e4cSTim Tautges 
321aa768e4cSTim Tautges   Collective on MPI_Comm
322aa768e4cSTim Tautges 
323aa768e4cSTim Tautges   Input Parameter:
324aa768e4cSTim Tautges . dm    - The DMMoab object being set
325aa768e4cSTim Tautges 
326aa768e4cSTim Tautges   Output Parameter:
3275eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab
3285eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition
329aa768e4cSTim Tautges 
330aa768e4cSTim Tautges   Level: beginner
331aa768e4cSTim Tautges 
332aa768e4cSTim Tautges .keywords: DMMoab, create
333aa768e4cSTim Tautges @*/
334351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,const moab::Range **owned,const moab::Range **ghost)
3351d72bce8STim Tautges {
3361d72bce8STim Tautges   PetscFunctionBegin;
3371d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
338351b8a77SVijay Mahadevan   if (owned) *owned = ((DM_Moab*)dm->data)->vowned;
339351b8a77SVijay Mahadevan   if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost;
3401d72bce8STim Tautges   PetscFunctionReturn(0);
3411d72bce8STim Tautges }
3421d72bce8STim Tautges 
3435eb88e9dSVijay Mahadevan /*@
3445eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
3455eb88e9dSVijay Mahadevan 
3465eb88e9dSVijay Mahadevan   Collective on MPI_Comm
3475eb88e9dSVijay Mahadevan 
3485eb88e9dSVijay Mahadevan   Input Parameter:
3495eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
3505eb88e9dSVijay Mahadevan 
3515eb88e9dSVijay Mahadevan   Output Parameter:
3525eb88e9dSVijay Mahadevan . range - The entities owned locally
3535eb88e9dSVijay Mahadevan 
3545eb88e9dSVijay Mahadevan   Level: beginner
3555eb88e9dSVijay Mahadevan 
3565eb88e9dSVijay Mahadevan .keywords: DMMoab, create
3575eb88e9dSVijay Mahadevan @*/
358351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,const moab::Range **range)
3595eb88e9dSVijay Mahadevan {
3605eb88e9dSVijay Mahadevan   PetscFunctionBegin;
3615eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
362351b8a77SVijay Mahadevan   if (range) *range = ((DM_Moab*)dm->data)->elocal;
3631cec0304SVijay Mahadevan   PetscFunctionReturn(0);
3641cec0304SVijay Mahadevan }
3651cec0304SVijay Mahadevan 
3661cec0304SVijay Mahadevan 
3671cec0304SVijay Mahadevan /*@
3681cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
3691cec0304SVijay Mahadevan 
3701cec0304SVijay Mahadevan   Collective on MPI_Comm
3711cec0304SVijay Mahadevan 
3721cec0304SVijay Mahadevan   Input Parameter:
3731cec0304SVijay Mahadevan . dm    - The DMMoab object being set
3741cec0304SVijay Mahadevan . range - The entities treated by this DMMoab
3751cec0304SVijay Mahadevan 
3761cec0304SVijay Mahadevan   Level: beginner
3771cec0304SVijay Mahadevan 
3781cec0304SVijay Mahadevan .keywords: DMMoab, create
3791cec0304SVijay Mahadevan @*/
3801cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range)
3811cec0304SVijay Mahadevan {
3821cec0304SVijay Mahadevan   moab::ErrorCode merr;
3831cec0304SVijay Mahadevan   PetscErrorCode  ierr;
3841cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
3851cec0304SVijay Mahadevan 
3861cec0304SVijay Mahadevan   PetscFunctionBegin;
3871cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3881cec0304SVijay Mahadevan   dmmoab->elocal->clear();
3891cec0304SVijay Mahadevan   dmmoab->eghost->clear();
3901cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
3911cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
3921cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
3931cec0304SVijay Mahadevan   dmmoab->neleloc=dmmoab->elocal->size();
39441dd5348SVijay Mahadevan   dmmoab->neleghost=dmmoab->eghost->size();
395b2566f29SBarry Smith   ierr = MPIU_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
3968cbae1a6SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele);
3975eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
3985eb88e9dSVijay Mahadevan }
3995eb88e9dSVijay Mahadevan 
4005eb88e9dSVijay Mahadevan 
401aa768e4cSTim Tautges /*@
402aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
403aa768e4cSTim Tautges 
404aa768e4cSTim Tautges   Collective on MPI_Comm
405aa768e4cSTim Tautges 
406aa768e4cSTim Tautges   Input Parameter:
407aa768e4cSTim Tautges . dm      - The DMMoab object being set
408aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
409aa768e4cSTim Tautges 
410aa768e4cSTim Tautges   Level: beginner
411aa768e4cSTim Tautges 
412aa768e4cSTim Tautges .keywords: DMMoab, create
413aa768e4cSTim Tautges @*/
4141d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
4151d72bce8STim Tautges {
4161d72bce8STim Tautges   PetscFunctionBegin;
4171d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4181d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
4191d72bce8STim Tautges   PetscFunctionReturn(0);
4201d72bce8STim Tautges }
4211d72bce8STim Tautges 
4221d72bce8STim Tautges 
423aa768e4cSTim Tautges /*@
424aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
425aa768e4cSTim Tautges 
426aa768e4cSTim Tautges   Collective on MPI_Comm
427aa768e4cSTim Tautges 
428aa768e4cSTim Tautges   Input Parameter:
429aa768e4cSTim Tautges . dm      - The DMMoab object being set
430aa768e4cSTim Tautges 
431aa768e4cSTim Tautges   Output Parameter:
432aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
433aa768e4cSTim Tautges 
434aa768e4cSTim Tautges   Level: beginner
435aa768e4cSTim Tautges 
436aa768e4cSTim Tautges .keywords: DMMoab, create
437aa768e4cSTim Tautges @*/
4381d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
4391d72bce8STim Tautges {
4401d72bce8STim Tautges   PetscFunctionBegin;
4411d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4421d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
4431d72bce8STim Tautges   PetscFunctionReturn(0);
4441d72bce8STim Tautges }
4451d72bce8STim Tautges 
4461d72bce8STim Tautges 
447aa768e4cSTim Tautges /*@
448aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
449aa768e4cSTim Tautges 
450aa768e4cSTim Tautges   Collective on MPI_Comm
451aa768e4cSTim Tautges 
452aa768e4cSTim Tautges   Input Parameter:
453aa768e4cSTim Tautges . dm - The DMMoab object being set
454aa768e4cSTim Tautges . bs - The block size used with this DMMoab
455aa768e4cSTim Tautges 
456aa768e4cSTim Tautges   Level: beginner
457aa768e4cSTim Tautges 
458aa768e4cSTim Tautges .keywords: DMMoab, create
459aa768e4cSTim Tautges @*/
4601d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
4611d72bce8STim Tautges {
4621d72bce8STim Tautges   PetscFunctionBegin;
4631d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4641d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
4651d72bce8STim Tautges   PetscFunctionReturn(0);
4661d72bce8STim Tautges }
4671d72bce8STim Tautges 
4681d72bce8STim Tautges 
469aa768e4cSTim Tautges /*@
470aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
471aa768e4cSTim Tautges 
472aa768e4cSTim Tautges   Collective on MPI_Comm
473aa768e4cSTim Tautges 
474aa768e4cSTim Tautges   Input Parameter:
475aa768e4cSTim Tautges . dm - The DMMoab object being set
476aa768e4cSTim Tautges 
477aa768e4cSTim Tautges   Output Parameter:
478aa768e4cSTim Tautges . bs - The block size used with this DMMoab
479aa768e4cSTim Tautges 
480aa768e4cSTim Tautges   Level: beginner
481aa768e4cSTim Tautges 
482aa768e4cSTim Tautges .keywords: DMMoab, create
483aa768e4cSTim Tautges @*/
4841d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
4851d72bce8STim Tautges {
4861d72bce8STim Tautges   PetscFunctionBegin;
4871d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4881d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
4891d72bce8STim Tautges   PetscFunctionReturn(0);
4901d72bce8STim Tautges }
4911d72bce8STim Tautges 
4921cec0304SVijay Mahadevan 
493212ad6d1SVijay Mahadevan /*@
494212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
495212ad6d1SVijay Mahadevan 
49600cc10feSVijay Mahadevan   Collective on DM
497212ad6d1SVijay Mahadevan 
498212ad6d1SVijay Mahadevan   Input Parameter:
499212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
500212ad6d1SVijay Mahadevan 
501212ad6d1SVijay Mahadevan   Output Parameter:
50200cc10feSVijay Mahadevan . neg - The number of global elements in the DMMoab instance
50300cc10feSVijay Mahadevan . nvg - The number of global vertices in the DMMoab instance
504212ad6d1SVijay Mahadevan 
505212ad6d1SVijay Mahadevan   Level: beginner
506212ad6d1SVijay Mahadevan 
507212ad6d1SVijay Mahadevan .keywords: DMMoab, create
508212ad6d1SVijay Mahadevan @*/
50941dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *neg,PetscInt *nvg)
510212ad6d1SVijay Mahadevan {
511212ad6d1SVijay Mahadevan   PetscFunctionBegin;
512212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
51341dd5348SVijay Mahadevan   if(neg) *neg = ((DM_Moab*)dm->data)->nele;
51441dd5348SVijay Mahadevan   if(nvg) *nvg = ((DM_Moab*)dm->data)->n;
515212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
516212ad6d1SVijay Mahadevan }
517212ad6d1SVijay Mahadevan 
518212ad6d1SVijay Mahadevan 
519212ad6d1SVijay Mahadevan /*@
520212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
521212ad6d1SVijay Mahadevan 
52200cc10feSVijay Mahadevan   Collective on DM
523212ad6d1SVijay Mahadevan 
524212ad6d1SVijay Mahadevan   Input Parameter:
525212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
526212ad6d1SVijay Mahadevan 
527212ad6d1SVijay Mahadevan   Output Parameter:
528b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor
52900cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor
53000cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor
53100cc10feSVijay Mahadevan . nvg - The number of ghosted vertices in this processor
532212ad6d1SVijay Mahadevan 
533212ad6d1SVijay Mahadevan   Level: beginner
534212ad6d1SVijay Mahadevan 
535212ad6d1SVijay Mahadevan .keywords: DMMoab, create
536212ad6d1SVijay Mahadevan @*/
53741dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nel,PetscInt *neg,PetscInt *nvl,PetscInt *nvg)
538212ad6d1SVijay Mahadevan {
539212ad6d1SVijay Mahadevan   PetscFunctionBegin;
540212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
54141dd5348SVijay Mahadevan   if(nel) *nel = ((DM_Moab*)dm->data)->neleloc;
54241dd5348SVijay Mahadevan   if(neg) *neg = ((DM_Moab*)dm->data)->neleghost;
54341dd5348SVijay Mahadevan   if(nvl) *nvl = ((DM_Moab*)dm->data)->nloc;
54441dd5348SVijay Mahadevan   if(nvg) *nvg = ((DM_Moab*)dm->data)->nghost;
545212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
546212ad6d1SVijay Mahadevan }
547212ad6d1SVijay Mahadevan 
548212ad6d1SVijay Mahadevan 
54900cc10feSVijay Mahadevan /*@
55000cc10feSVijay Mahadevan   DMMoabGetOffset - Get the local offset for the global vector
55100cc10feSVijay Mahadevan 
55200cc10feSVijay Mahadevan   Collective on MPI_Comm
55300cc10feSVijay Mahadevan 
55400cc10feSVijay Mahadevan   Input Parameter:
55500cc10feSVijay Mahadevan . dm - The DMMoab object being set
55600cc10feSVijay Mahadevan 
55700cc10feSVijay Mahadevan   Output Parameter:
55800cc10feSVijay Mahadevan . offset - The local offset for the global vector
55900cc10feSVijay Mahadevan 
56000cc10feSVijay Mahadevan   Level: beginner
56100cc10feSVijay Mahadevan 
56200cc10feSVijay Mahadevan .keywords: DMMoab, create
56300cc10feSVijay Mahadevan @*/
56400cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm,PetscInt *offset)
56500cc10feSVijay Mahadevan {
56600cc10feSVijay Mahadevan   PetscFunctionBegin;
56700cc10feSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
56800cc10feSVijay Mahadevan   *offset = ((DM_Moab*)dm->data)->vstart;
56900cc10feSVijay Mahadevan   PetscFunctionReturn(0);
57000cc10feSVijay Mahadevan }
57100cc10feSVijay Mahadevan 
57200cc10feSVijay Mahadevan 
5734920ab11SVijay Mahadevan /*@
5744920ab11SVijay Mahadevan   DMMoabGetDimension - Get the dimension of the DM Mesh
5754920ab11SVijay Mahadevan 
5764920ab11SVijay Mahadevan   Collective on MPI_Comm
5774920ab11SVijay Mahadevan 
5784920ab11SVijay Mahadevan   Input Parameter:
579340f3b9aSVijay Mahadevan . dm - The DMMoab object
5804920ab11SVijay Mahadevan 
5814920ab11SVijay Mahadevan   Output Parameter:
5824920ab11SVijay Mahadevan . dim - The dimension of DM
5834920ab11SVijay Mahadevan 
5844920ab11SVijay Mahadevan   Level: beginner
5854920ab11SVijay Mahadevan 
5864920ab11SVijay Mahadevan .keywords: DMMoab, create
5874920ab11SVijay Mahadevan @*/
5884920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim)
5894920ab11SVijay Mahadevan {
5904920ab11SVijay Mahadevan   PetscFunctionBegin;
5914920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5924920ab11SVijay Mahadevan   *dim = ((DM_Moab*)dm->data)->dim;
5934920ab11SVijay Mahadevan   PetscFunctionReturn(0);
5944920ab11SVijay Mahadevan }
5954920ab11SVijay Mahadevan 
5964920ab11SVijay Mahadevan 
597340f3b9aSVijay Mahadevan /*@
598340f3b9aSVijay Mahadevan   DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh
599340f3b9aSVijay Mahadevan 
600340f3b9aSVijay Mahadevan   Collective on MPI_Comm
601340f3b9aSVijay Mahadevan 
602340f3b9aSVijay Mahadevan   Input Parameter:
603340f3b9aSVijay Mahadevan . dm - The DMMoab object
604340f3b9aSVijay Mahadevan . ehandle - The element entity handle
605340f3b9aSVijay Mahadevan 
606340f3b9aSVijay Mahadevan   Output Parameter:
607340f3b9aSVijay Mahadevan . mat - The material ID for the current entity
608340f3b9aSVijay Mahadevan 
609340f3b9aSVijay Mahadevan   Level: beginner
610340f3b9aSVijay Mahadevan 
611340f3b9aSVijay Mahadevan .keywords: DMMoab, create
612340f3b9aSVijay Mahadevan @*/
613340f3b9aSVijay Mahadevan PetscErrorCode DMMoabGetMaterialBlock(DM dm,const moab::EntityHandle ehandle, PetscInt *mat)
614340f3b9aSVijay Mahadevan {
615340f3b9aSVijay Mahadevan   DM_Moab         *dmmoab;
616340f3b9aSVijay Mahadevan   moab::ErrorCode merr;
617340f3b9aSVijay Mahadevan 
618340f3b9aSVijay Mahadevan   PetscFunctionBegin;
619340f3b9aSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
620340f3b9aSVijay Mahadevan   if (*mat) {
621340f3b9aSVijay Mahadevan     dmmoab = (DM_Moab*)(dm)->data;
62263cd93b2SVijay Mahadevan     merr=dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &ehandle, 1, mat);MBERRNM(merr);
623340f3b9aSVijay Mahadevan   }
624340f3b9aSVijay Mahadevan   PetscFunctionReturn(0);
625340f3b9aSVijay Mahadevan }
626340f3b9aSVijay Mahadevan 
6274920ab11SVijay Mahadevan 
62885d305f5SVijay Mahadevan /*@
62985d305f5SVijay Mahadevan   DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities
63085d305f5SVijay Mahadevan 
63185d305f5SVijay Mahadevan   Collective on MPI_Comm
63285d305f5SVijay Mahadevan 
63385d305f5SVijay Mahadevan   Input Parameter:
63485d305f5SVijay Mahadevan . dm - The DMMoab object
63585d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
63685d305f5SVijay Mahadevan . conn - The vertex entity handles
63785d305f5SVijay Mahadevan 
63885d305f5SVijay Mahadevan   Output Parameter:
63985d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities
64085d305f5SVijay Mahadevan 
64185d305f5SVijay Mahadevan   Level: beginner
64285d305f5SVijay Mahadevan 
64385d305f5SVijay Mahadevan .seealso: DMMoabGetVertexConnectivity()
64485d305f5SVijay Mahadevan @*/
645cade3ad9SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscReal *vpos)
6467023aa44SVijay Mahadevan {
6477023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
6487023aa44SVijay Mahadevan   PetscErrorCode  ierr;
6497023aa44SVijay Mahadevan   moab::ErrorCode merr;
6507023aa44SVijay Mahadevan 
6517023aa44SVijay Mahadevan   PetscFunctionBegin;
6527023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6537023aa44SVijay Mahadevan   PetscValidPointer(conn,3);
6547023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6557023aa44SVijay Mahadevan 
6567023aa44SVijay Mahadevan   if (!vpos) {
6577ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(nconn*3, &vpos);CHKERRQ(ierr);
6587023aa44SVijay Mahadevan   }
6597023aa44SVijay Mahadevan 
6607023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
6617023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
6627023aa44SVijay Mahadevan   PetscFunctionReturn(0);
6637023aa44SVijay Mahadevan }
6647023aa44SVijay Mahadevan 
6657023aa44SVijay Mahadevan 
66685d305f5SVijay Mahadevan /*@
66785d305f5SVijay Mahadevan   DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity
66885d305f5SVijay Mahadevan 
66985d305f5SVijay Mahadevan   Collective on MPI_Comm
67085d305f5SVijay Mahadevan 
67185d305f5SVijay Mahadevan   Input Parameter:
67285d305f5SVijay Mahadevan . dm - The DMMoab object
67385d305f5SVijay Mahadevan . vhandle - Vertex entity handle
67485d305f5SVijay Mahadevan 
67585d305f5SVijay Mahadevan   Output Parameter:
67685d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
67785d305f5SVijay Mahadevan . conn - The vertex entity handles
67885d305f5SVijay Mahadevan 
67985d305f5SVijay Mahadevan   Level: beginner
68085d305f5SVijay Mahadevan 
68185d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabRestoreVertexConnectivity()
68285d305f5SVijay Mahadevan @*/
68385d305f5SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle vhandle,PetscInt* nconn, moab::EntityHandle **conn)
6848d8d51c8SVijay Mahadevan {
6858d8d51c8SVijay Mahadevan   DM_Moab        *dmmoab;
6868d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities,connect;
6878d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
6888d8d51c8SVijay Mahadevan   moab::ErrorCode merr;
6898d8d51c8SVijay Mahadevan 
6908d8d51c8SVijay Mahadevan   PetscFunctionBegin;
6918d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6928d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
6938d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6948d8d51c8SVijay Mahadevan 
6958d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
69685d305f5SVijay Mahadevan   merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr);
6978d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr);
6988d8d51c8SVijay Mahadevan 
6998d8d51c8SVijay Mahadevan   if (conn) {
7008d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr);
7018d8d51c8SVijay Mahadevan     ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr);
7028d8d51c8SVijay Mahadevan   }
7038d8d51c8SVijay Mahadevan   if (nconn) *nconn=connect.size();
7048d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
7058d8d51c8SVijay Mahadevan }
7068d8d51c8SVijay Mahadevan 
7078d8d51c8SVijay Mahadevan 
70885d305f5SVijay Mahadevan /*@
70985d305f5SVijay Mahadevan   DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity
71085d305f5SVijay Mahadevan 
71185d305f5SVijay Mahadevan   Collective on MPI_Comm
71285d305f5SVijay Mahadevan 
71385d305f5SVijay Mahadevan   Input Parameter:
71485d305f5SVijay Mahadevan . dm - The DMMoab object
71585d305f5SVijay Mahadevan . vhandle - Vertex entity handle
71685d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
71785d305f5SVijay Mahadevan . conn - The vertex entity handles
71885d305f5SVijay Mahadevan 
71985d305f5SVijay Mahadevan   Level: beginner
72085d305f5SVijay Mahadevan 
72185d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity()
72285d305f5SVijay Mahadevan @*/
7238d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
7248d8d51c8SVijay Mahadevan {
7258d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
7268d8d51c8SVijay Mahadevan 
7278d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7288d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7298d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
7308d8d51c8SVijay Mahadevan 
7318d8d51c8SVijay Mahadevan   if (conn) {
7328d8d51c8SVijay Mahadevan     ierr = PetscFree(*conn);CHKERRQ(ierr);
7338d8d51c8SVijay Mahadevan   }
7348d8d51c8SVijay Mahadevan   if (nconn) *nconn=0;
7358d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
7368d8d51c8SVijay Mahadevan }
7378d8d51c8SVijay Mahadevan 
7388d8d51c8SVijay Mahadevan 
73985d305f5SVijay Mahadevan /*@
74085d305f5SVijay Mahadevan   DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity
74185d305f5SVijay Mahadevan 
74285d305f5SVijay Mahadevan   Collective on MPI_Comm
74385d305f5SVijay Mahadevan 
74485d305f5SVijay Mahadevan   Input Parameter:
74585d305f5SVijay Mahadevan . dm - The DMMoab object
74685d305f5SVijay Mahadevan . ehandle - Vertex entity handle
74785d305f5SVijay Mahadevan 
74885d305f5SVijay Mahadevan   Output Parameter:
74985d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
75085d305f5SVijay Mahadevan . conn - The vertex entity handles
75185d305f5SVijay Mahadevan 
75285d305f5SVijay Mahadevan   Level: beginner
75385d305f5SVijay Mahadevan 
75485d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity(), DMMoabRestoreVertexConnectivity()
75585d305f5SVijay Mahadevan @*/
7567023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn)
7577023aa44SVijay Mahadevan {
7587023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
7597023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
7607023aa44SVijay Mahadevan   moab::ErrorCode merr;
7617023aa44SVijay Mahadevan   PetscInt nnodes;
7627023aa44SVijay Mahadevan 
7637023aa44SVijay Mahadevan   PetscFunctionBegin;
7647023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7657023aa44SVijay Mahadevan   PetscValidPointer(conn,4);
7667023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7677023aa44SVijay Mahadevan 
7687023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
7697023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr);
7707023aa44SVijay Mahadevan   if (conn) *conn=connect;
7717023aa44SVijay Mahadevan   if (nconn) *nconn=nnodes;
7727023aa44SVijay Mahadevan   PetscFunctionReturn(0);
7737023aa44SVijay Mahadevan }
7747023aa44SVijay Mahadevan 
7757023aa44SVijay Mahadevan 
77685d305f5SVijay Mahadevan /*@
77785d305f5SVijay Mahadevan   DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element)
77885d305f5SVijay Mahadevan 
77985d305f5SVijay Mahadevan   Collective on MPI_Comm
78085d305f5SVijay Mahadevan 
78185d305f5SVijay Mahadevan   Input Parameter:
78285d305f5SVijay Mahadevan . dm - The DMMoab object
78385d305f5SVijay Mahadevan . ent - Entity handle
78485d305f5SVijay Mahadevan 
78585d305f5SVijay Mahadevan   Output Parameter:
78685d305f5SVijay Mahadevan . ent_on_boundary - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
78785d305f5SVijay Mahadevan 
78885d305f5SVijay Mahadevan   Level: beginner
78985d305f5SVijay Mahadevan 
79085d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices()
79185d305f5SVijay Mahadevan @*/
79269263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary)
79369263071SVijay Mahadevan {
79469263071SVijay Mahadevan   moab::EntityType etype;
79569263071SVijay Mahadevan   DM_Moab         *dmmoab;
79669263071SVijay Mahadevan   PetscInt         edim;
79769263071SVijay Mahadevan 
79869263071SVijay Mahadevan   PetscFunctionBegin;
79969263071SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
80069263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary,3);
80169263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
80269263071SVijay Mahadevan 
80369263071SVijay Mahadevan   /* get the entity type and handle accordingly */
80469263071SVijay Mahadevan   etype=dmmoab->mbiface->type_from_handle(ent);
80569263071SVijay 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);
80669263071SVijay Mahadevan 
80769263071SVijay Mahadevan   /* get the entity dimension */
80869263071SVijay Mahadevan   edim=dmmoab->mbiface->dimension_from_handle(ent);
80969263071SVijay Mahadevan 
81069263071SVijay Mahadevan   *ent_on_boundary=PETSC_FALSE;
81169263071SVijay Mahadevan   if(etype == moab::MBVERTEX && edim == 0) {
812*b117cd09SVijay Mahadevan     if (dmmoab->hlevel) {
813*b117cd09SVijay Mahadevan       *ent_on_boundary=(dmmoab->hierarchy->is_boundary_vertex(ent) ? PETSC_TRUE:PETSC_FALSE);
814*b117cd09SVijay Mahadevan     }
815*b117cd09SVijay Mahadevan     else *ent_on_boundary=((dmmoab->bndyvtx->index(ent) >= 0) ? PETSC_TRUE:PETSC_FALSE);
81669263071SVijay Mahadevan   }
81769263071SVijay Mahadevan   else {
81869263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
8196d9eb265SVijay Mahadevan       if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
82069263071SVijay Mahadevan     }
82169263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
8226d9eb265SVijay Mahadevan       if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
82369263071SVijay Mahadevan     }
82469263071SVijay Mahadevan   }
82569263071SVijay Mahadevan   PetscFunctionReturn(0);
82669263071SVijay Mahadevan }
82769263071SVijay Mahadevan 
82869263071SVijay Mahadevan 
82985d305f5SVijay Mahadevan /*@
83085d305f5SVijay Mahadevan   DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element)
83185d305f5SVijay Mahadevan 
83285d305f5SVijay Mahadevan   Input Parameter:
83385d305f5SVijay Mahadevan . dm - The DMMoab object
83485d305f5SVijay Mahadevan . nconn - Number of handles
83585d305f5SVijay Mahadevan . cnt - Array of entity handles
83685d305f5SVijay Mahadevan 
83785d305f5SVijay Mahadevan   Output Parameter:
83885d305f5SVijay Mahadevan . isbdvtx - Array of boundary markers - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
83985d305f5SVijay Mahadevan 
84085d305f5SVijay Mahadevan   Level: beginner
84185d305f5SVijay Mahadevan 
84285d305f5SVijay Mahadevan .seealso: DMMoabIsEntityOnBoundary()
84385d305f5SVijay Mahadevan @*/
84469263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx)
8457023aa44SVijay Mahadevan {
8467023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
8477023aa44SVijay Mahadevan   PetscInt       i;
8487023aa44SVijay Mahadevan 
8497023aa44SVijay Mahadevan   PetscFunctionBegin;
8507023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8517023aa44SVijay Mahadevan   PetscValidPointer(cnt,3);
8527023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx,4);
8537023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8547023aa44SVijay Mahadevan 
8557023aa44SVijay Mahadevan   for (i=0; i < nconn; ++i) {
856*b117cd09SVijay Mahadevan     if (dmmoab->hlevel) {
857*b117cd09SVijay Mahadevan       isbdvtx[i]=(dmmoab->hierarchy->is_boundary_vertex(cnt[i]) ? PETSC_TRUE:PETSC_FALSE);
858*b117cd09SVijay Mahadevan     }
859*b117cd09SVijay Mahadevan     else {
8606d9eb265SVijay Mahadevan       isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE);
8617023aa44SVijay Mahadevan     }
862*b117cd09SVijay Mahadevan   }
8637023aa44SVijay Mahadevan   PetscFunctionReturn(0);
8647023aa44SVijay Mahadevan }
8657023aa44SVijay Mahadevan 
8667023aa44SVijay Mahadevan 
86785d305f5SVijay Mahadevan /*@
86885d305f5SVijay Mahadevan   DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary
86985d305f5SVijay Mahadevan 
87085d305f5SVijay Mahadevan   Input Parameter:
87185d305f5SVijay Mahadevan . dm - The DMMoab object
87285d305f5SVijay Mahadevan 
87385d305f5SVijay Mahadevan   Output Parameter:
87485d305f5SVijay Mahadevan . bdvtx - Boundary vertices
87585d305f5SVijay Mahadevan . bdelems - Boundary elements
87685d305f5SVijay Mahadevan . bdfaces - Boundary faces
87785d305f5SVijay Mahadevan 
87885d305f5SVijay Mahadevan   Level: beginner
87985d305f5SVijay Mahadevan 
88085d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices(), DMMoabIsEntityOnBoundary()
88185d305f5SVijay Mahadevan @*/
8826d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces)
8831cec0304SVijay Mahadevan {
8841cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
8851cec0304SVijay Mahadevan 
8861cec0304SVijay Mahadevan   PetscFunctionBegin;
8871cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8881cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8891cec0304SVijay Mahadevan 
8906d9eb265SVijay Mahadevan   if (bdvtx)  *bdvtx = dmmoab->bndyvtx;
8916d9eb265SVijay Mahadevan   if (bdfaces)  *bdfaces = dmmoab->bndyfaces;
8926d9eb265SVijay Mahadevan   if (bdelems)  *bdfaces = dmmoab->bndyelems;
8931cec0304SVijay Mahadevan   PetscFunctionReturn(0);
8941cec0304SVijay Mahadevan }
8951cec0304SVijay Mahadevan 
896f6829af0SVijay Mahadevan 
897f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm)
898f6829af0SVijay Mahadevan {
899f6829af0SVijay Mahadevan   PetscErrorCode ierr;
90085d305f5SVijay Mahadevan   PetscInt       i;
901f6829af0SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
902f6829af0SVijay Mahadevan 
903f6829af0SVijay Mahadevan   PetscFunctionBegin;
904f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
905f6829af0SVijay Mahadevan   if (dmmoab->icreatedinstance) {
906f6829af0SVijay Mahadevan     delete dmmoab->mbiface;
907f6829af0SVijay Mahadevan   }
908f6829af0SVijay Mahadevan   dmmoab->mbiface = NULL;
909f6829af0SVijay Mahadevan   dmmoab->pcomm = NULL;
910f6829af0SVijay Mahadevan   delete dmmoab->vlocal;
911f6829af0SVijay Mahadevan   delete dmmoab->vowned;
912f6829af0SVijay Mahadevan   delete dmmoab->vghost;
913f6829af0SVijay Mahadevan   delete dmmoab->elocal;
914f6829af0SVijay Mahadevan   delete dmmoab->eghost;
915f6829af0SVijay Mahadevan   delete dmmoab->bndyvtx;
916f6829af0SVijay Mahadevan   delete dmmoab->bndyfaces;
917f6829af0SVijay Mahadevan   delete dmmoab->bndyelems;
918f6829af0SVijay Mahadevan 
919f6829af0SVijay Mahadevan   ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr);
9207ae5e5b6SVijay Mahadevan   ierr = PetscFree2(dmmoab->gidmap,dmmoab->lidmap);CHKERRQ(ierr);
9217ae5e5b6SVijay Mahadevan   ierr = PetscFree2(dmmoab->lgmap,dmmoab->llmap);CHKERRQ(ierr);
9225905e1eaSVijay Mahadevan   ierr = PetscFree(dmmoab->dfill);CHKERRQ(ierr);
9235905e1eaSVijay Mahadevan   ierr = PetscFree(dmmoab->ofill);CHKERRQ(ierr);
92485d305f5SVijay Mahadevan   if (dmmoab->fieldNames) {
92585d305f5SVijay Mahadevan     for(i=0; i<dmmoab->numFields; i++) {
92685d305f5SVijay Mahadevan       ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr);
92785d305f5SVijay Mahadevan     }
92885d305f5SVijay Mahadevan     ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr);
92985d305f5SVijay Mahadevan   }
930*b117cd09SVijay Mahadevan 
931*b117cd09SVijay Mahadevan   if (dmmoab->nhlevels) {
932*b117cd09SVijay Mahadevan     ierr = PetscFree(dmmoab->hsets);CHKERRQ(ierr);
933*b117cd09SVijay Mahadevan   }
934f6829af0SVijay Mahadevan   ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
935f6829af0SVijay Mahadevan   ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr);
936f6829af0SVijay Mahadevan   ierr = PetscFree(dm->data);CHKERRQ(ierr);
937f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
938f6829af0SVijay Mahadevan }
939f6829af0SVijay Mahadevan 
940f6829af0SVijay Mahadevan 
9414416b707SBarry Smith PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(PetscOptionItems *PetscOptionsObject,DM dm)
9422e4e7c01SVijay Mahadevan {
9432e4e7c01SVijay Mahadevan   PetscErrorCode ierr;
9442e4e7c01SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
9452e4e7c01SVijay Mahadevan 
9462e4e7c01SVijay Mahadevan   PetscFunctionBegin;
9472e4e7c01SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
948cc310fddSBarry Smith   ierr = PetscOptionsHead(PetscOptionsObject,"DMMoab Options");CHKERRQ(ierr);
9492e4e7c01SVijay 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);
9502e4e7c01SVijay 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);
9512e4e7c01SVijay Mahadevan   /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */
9522e4e7c01SVijay 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);
9532e4e7c01SVijay 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);
9542e4e7c01SVijay Mahadevan   ierr  = PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum*)&dmmoab->read_mode, NULL);CHKERRQ(ierr);
9552e4e7c01SVijay Mahadevan   ierr  = PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum*)&dmmoab->write_mode, NULL);CHKERRQ(ierr);
9562e4e7c01SVijay Mahadevan   PetscFunctionReturn(0);
9572e4e7c01SVijay Mahadevan }
9582e4e7c01SVijay Mahadevan 
9592e4e7c01SVijay Mahadevan 
960f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm)
961f6829af0SVijay Mahadevan {
962f6829af0SVijay Mahadevan   PetscErrorCode          ierr;
963f6829af0SVijay Mahadevan   moab::ErrorCode         merr;
964f6829af0SVijay Mahadevan   Vec                     local, global;
965f6829af0SVijay Mahadevan   IS                      from,to;
966f6829af0SVijay Mahadevan   moab::Range::iterator   iter;
967f6829af0SVijay Mahadevan   PetscInt                i,j,f,bs,gmin,lmin,lmax,vent,totsize;
968f6829af0SVijay Mahadevan   DM_Moab                *dmmoab = (DM_Moab*)dm->data;
969f6829af0SVijay Mahadevan   moab::Range             adjs;
970f6829af0SVijay Mahadevan 
971f6829af0SVijay Mahadevan   PetscFunctionBegin;
972f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
973f6829af0SVijay Mahadevan   /* Get the local and shared vertices and cache it */
974c528d872SBarry 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.");
975f6829af0SVijay Mahadevan 
976f6829af0SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
977f6829af0SVijay Mahadevan   if (dmmoab->vlocal->empty())
978f6829af0SVijay Mahadevan   {
979f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
980f6829af0SVijay Mahadevan 
981f6829af0SVijay Mahadevan     /* filter based on parallel status */
982f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
983f6829af0SVijay Mahadevan 
984f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
985f6829af0SVijay Mahadevan     adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
986f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
987f6829af0SVijay Mahadevan     adjs = moab::subtract(adjs, *dmmoab->vghost);
988f6829af0SVijay Mahadevan     *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs);
989f6829af0SVijay Mahadevan 
990f6829af0SVijay Mahadevan     /* compute and cache the sizes of local and ghosted entities */
991f6829af0SVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
992f6829af0SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
993b2566f29SBarry Smith     ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
994f6829af0SVijay Mahadevan   }
995f6829af0SVijay Mahadevan 
996f6829af0SVijay Mahadevan   {
997f6829af0SVijay Mahadevan     /* get the information about the local elements in the mesh */
998f6829af0SVijay Mahadevan     dmmoab->eghost->clear();
999f6829af0SVijay Mahadevan 
1000f6829af0SVijay Mahadevan     /* first decipher the leading dimension */
1001f6829af0SVijay Mahadevan     for (i=3;i>0;i--) {
1002f6829af0SVijay Mahadevan       dmmoab->elocal->clear();
1003f6829af0SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr);
1004f6829af0SVijay Mahadevan 
1005f6829af0SVijay Mahadevan       /* store the current mesh dimension */
1006f6829af0SVijay Mahadevan       if (dmmoab->elocal->size()) {
1007f6829af0SVijay Mahadevan         dmmoab->dim=i;
1008f6829af0SVijay Mahadevan         break;
1009f6829af0SVijay Mahadevan       }
1010f6829af0SVijay Mahadevan     }
1011f6829af0SVijay Mahadevan 
1012*b117cd09SVijay Mahadevan     ierr = DMSetDimension(dm, dmmoab->dim);CHKERRQ(ierr);
1013*b117cd09SVijay Mahadevan 
1014f6829af0SVijay Mahadevan     /* filter the ghosted and owned element list */
1015f6829af0SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
1016f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
1017f6829af0SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
1018f6829af0SVijay Mahadevan 
1019f6829af0SVijay Mahadevan     dmmoab->neleloc = dmmoab->elocal->size();
1020f6829af0SVijay Mahadevan     dmmoab->neleghost = dmmoab->eghost->size();
1021b2566f29SBarry Smith     ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
1022f6829af0SVijay Mahadevan   }
1023f6829af0SVijay Mahadevan 
1024f6829af0SVijay Mahadevan   bs = dmmoab->bs;
1025f6829af0SVijay Mahadevan   if (!dmmoab->ltog_tag) {
1026f6829af0SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
1027f6829af0SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
1028f6829af0SVijay Mahadevan        assemble the individual pieces of the mesh */
1029f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
1030f6829af0SVijay Mahadevan   }
1031f6829af0SVijay Mahadevan 
1032f6829af0SVijay Mahadevan   totsize=dmmoab->vlocal->size();
1033f6829af0SVijay 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);
10347ae5e5b6SVijay Mahadevan   ierr = PetscMalloc1(totsize,&dmmoab->gsindices);CHKERRQ(ierr);
1035f6829af0SVijay Mahadevan   {
1036f6829af0SVijay Mahadevan     /* first get the local indices */
1037f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr);
1038f6829af0SVijay Mahadevan     /* next get the ghosted indices */
1039f6829af0SVijay Mahadevan     if (dmmoab->nghost) {
1040f6829af0SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr);
1041f6829af0SVijay Mahadevan     }
1042f6829af0SVijay Mahadevan 
1043f6829af0SVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
1044f6829af0SVijay Mahadevan     lmin=lmax=dmmoab->gsindices[0];
1045f6829af0SVijay Mahadevan     for (i=0; i<totsize; ++i) {
1046f6829af0SVijay Mahadevan       if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i];
1047f6829af0SVijay Mahadevan       if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i];
1048f6829af0SVijay Mahadevan     }
1049f6829af0SVijay Mahadevan 
1050b2566f29SBarry Smith     ierr = MPIU_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr);
1051f6829af0SVijay Mahadevan 
1052f6829af0SVijay Mahadevan     /* set the GID map */
1053f6829af0SVijay Mahadevan     for (i=0; i<totsize; ++i) {
1054f6829af0SVijay Mahadevan       dmmoab->gsindices[i]-=gmin;   /* zero based index needed for IS */
1055f6829af0SVijay Mahadevan     }
1056f6829af0SVijay Mahadevan     lmin-=gmin;
1057f6829af0SVijay Mahadevan     lmax-=gmin;
1058f6829af0SVijay Mahadevan 
1059f6829af0SVijay Mahadevan     PetscInfo3(NULL, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin);
1060f6829af0SVijay Mahadevan   }
106182dfd14aSVijay 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);
1062f6829af0SVijay Mahadevan 
1063f6829af0SVijay Mahadevan   {
10647ae5e5b6SVijay Mahadevan     i=(PetscInt)dmmoab->vlocal->back()+1;
10657ae5e5b6SVijay Mahadevan     //i=(PetscInt)(dmmoab->vlocal->back()-dmmoab->vlocal->front())+1;
10667ae5e5b6SVijay Mahadevan     j=totsize*dmmoab->numFields;
10677ae5e5b6SVijay Mahadevan     ierr = PetscMalloc2(i,&dmmoab->gidmap,i,&dmmoab->lidmap);CHKERRQ(ierr);
10687ae5e5b6SVijay Mahadevan     ierr = PetscMalloc2(j,&dmmoab->lgmap,j,&dmmoab->llmap);CHKERRQ(ierr);
1069f6829af0SVijay Mahadevan 
1070f6829af0SVijay Mahadevan     i=j=0;
1071f6829af0SVijay Mahadevan     /* set the owned vertex data first */
1072f6829af0SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) {
1073f6829af0SVijay Mahadevan       vent=(PetscInt)(*iter);
1074f6829af0SVijay Mahadevan       dmmoab->gidmap[vent]=dmmoab->gsindices[i];
1075f6829af0SVijay Mahadevan       dmmoab->lidmap[vent]=i;
1076f6829af0SVijay Mahadevan       if (bs > 1) {
1077f6829af0SVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
1078f6829af0SVijay Mahadevan           dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f;
1079f6829af0SVijay Mahadevan           dmmoab->llmap[j]=i*dmmoab->numFields+f;
1080f6829af0SVijay Mahadevan         }
1081f6829af0SVijay Mahadevan       }
1082f6829af0SVijay Mahadevan       else {
1083f6829af0SVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
1084f6829af0SVijay Mahadevan           dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i];
1085f6829af0SVijay Mahadevan           dmmoab->llmap[j]=totsize*f+i;
1086f6829af0SVijay Mahadevan         }
1087f6829af0SVijay Mahadevan       }
1088f6829af0SVijay Mahadevan     }
1089f6829af0SVijay Mahadevan     /* next arrange all the ghosted data information */
1090f6829af0SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) {
1091f6829af0SVijay Mahadevan       vent=(PetscInt)(*iter);
1092f6829af0SVijay Mahadevan       dmmoab->gidmap[vent]=dmmoab->gsindices[i];
1093f6829af0SVijay Mahadevan       dmmoab->lidmap[vent]=i;
1094f6829af0SVijay Mahadevan       if (bs > 1) {
1095f6829af0SVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
1096f6829af0SVijay Mahadevan           dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f;
1097f6829af0SVijay Mahadevan           dmmoab->llmap[j]=i*dmmoab->numFields+f;
1098f6829af0SVijay Mahadevan         }
1099f6829af0SVijay Mahadevan       }
1100f6829af0SVijay Mahadevan       else {
1101f6829af0SVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
1102f6829af0SVijay Mahadevan           dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i];
1103f6829af0SVijay Mahadevan           dmmoab->llmap[j]=totsize*f+i;
1104f6829af0SVijay Mahadevan         }
1105f6829af0SVijay Mahadevan       }
1106f6829af0SVijay Mahadevan     }
1107f6829af0SVijay Mahadevan 
1108f6829af0SVijay Mahadevan     /* We need to create the Global to Local Vector Scatter Contexts
1109f6829af0SVijay Mahadevan        1) First create a local and global vector
1110f6829af0SVijay Mahadevan        2) Create a local and global IS
1111f6829af0SVijay Mahadevan        3) Create VecScatter and LtoGMapping objects
1112f6829af0SVijay Mahadevan        4) Cleanup the IS and Vec objects
1113f6829af0SVijay Mahadevan     */
1114f6829af0SVijay Mahadevan     ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr);
1115f6829af0SVijay Mahadevan     ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr);
1116f6829af0SVijay Mahadevan 
1117f6829af0SVijay Mahadevan     ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr);
1118f6829af0SVijay Mahadevan     PetscInfo3(NULL, "Total-size = %D\t Owned = %D, Ghosted = %D.\n", totsize, dmmoab->nloc, dmmoab->nghost);
1119f6829af0SVijay Mahadevan 
1120f6829af0SVijay Mahadevan     /* global to local must retrieve ghost points */
1121f6829af0SVijay Mahadevan     ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,dmmoab->vstart,1,&from);CHKERRQ(ierr);
1122f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr);
1123f6829af0SVijay Mahadevan 
1124f6829af0SVijay Mahadevan     ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,&dmmoab->lgmap[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr);
1125f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(to,bs);CHKERRQ(ierr);
1126f6829af0SVijay Mahadevan 
1127f6829af0SVijay Mahadevan     if (!dmmoab->ltog_map) {
1128f6829af0SVijay Mahadevan       /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */
112982dfd14aSVijay Mahadevan       ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,dmmoab->bs,totsize*dmmoab->numFields,dmmoab->lgmap,
1130f6829af0SVijay Mahadevan                                           PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr);
1131f6829af0SVijay Mahadevan     }
1132f6829af0SVijay Mahadevan 
1133f6829af0SVijay Mahadevan     /* now create the scatter object from local to global vector */
1134f6829af0SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
1135f6829af0SVijay Mahadevan 
1136f6829af0SVijay Mahadevan     /* clean up IS, Vec */
1137f6829af0SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
1138f6829af0SVijay Mahadevan     ierr = ISDestroy(&to);CHKERRQ(ierr);
1139f6829af0SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
1140f6829af0SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
1141f6829af0SVijay Mahadevan   }
1142f6829af0SVijay Mahadevan 
1143f6829af0SVijay Mahadevan   /* skin the boundary and store nodes */
1144f6829af0SVijay Mahadevan   {
1145f6829af0SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
1146f6829af0SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
1147f6829af0SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
1148f6829af0SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
1149f6829af0SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
1150f6829af0SVijay Mahadevan 
1151f6829af0SVijay Mahadevan     dmmoab->bndyvtx = new moab::Range();
1152f6829af0SVijay Mahadevan     dmmoab->bndyfaces = new moab::Range();
1153f6829af0SVijay Mahadevan     dmmoab->bndyelems = new moab::Range();
1154f6829af0SVijay Mahadevan 
1155f6829af0SVijay Mahadevan     /* get the entities on the skin - only the faces */
1156f6829af0SVijay 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
1157f6829af0SVijay Mahadevan 
1158f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
1159f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
1160f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr);
1161f6829af0SVijay Mahadevan 
1162f6829af0SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
1163f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr);
1164f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr);
1165f6829af0SVijay Mahadevan     PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size());
1166f6829af0SVijay Mahadevan   }
1167f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1168f6829af0SVijay Mahadevan }
1169f6829af0SVijay Mahadevan 
1170f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
1171f6829af0SVijay Mahadevan {
1172f6829af0SVijay Mahadevan   PetscErrorCode ierr;
1173f6829af0SVijay Mahadevan 
1174f6829af0SVijay Mahadevan   PetscFunctionBegin;
1175f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1176f90c3b0eSVijay Mahadevan   ierr = PetscNewLog(dm,(DM_Moab**)&dm->data);CHKERRQ(ierr);
1177f6829af0SVijay Mahadevan 
1178f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
1179f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->numFields = 1;
1180f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
1181f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
1182f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
1183f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
1184f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
1185f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleghost = 0;
1186c528d872SBarry Smith   ((DM_Moab*)dm->data)->ltog_map = NULL;
1187c528d872SBarry Smith   ((DM_Moab*)dm->data)->ltog_sendrecv = NULL;
1188f6829af0SVijay Mahadevan 
1189f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
1190f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
1191f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
1192f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
1193f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
1194f6829af0SVijay Mahadevan 
1195f6829af0SVijay Mahadevan   dm->ops->createglobalvector       = DMCreateGlobalVector_Moab;
1196f6829af0SVijay Mahadevan   dm->ops->createlocalvector        = DMCreateLocalVector_Moab;
1197f6829af0SVijay Mahadevan   dm->ops->creatematrix             = DMCreateMatrix_Moab;
1198f6829af0SVijay Mahadevan   dm->ops->setup                    = DMSetUp_Moab;
1199f6829af0SVijay Mahadevan   dm->ops->destroy                  = DMDestroy_Moab;
1200*b117cd09SVijay Mahadevan   //dm->ops->coarsenhierarchy         = DMCoarsenHierarchy_Moab;
1201*b117cd09SVijay Mahadevan   //dm->ops->refinehierarchy          = DMRefineHierarchy_Moab;
1202*b117cd09SVijay Mahadevan   dm->ops->createinterpolation      = DMCreateInterpolation_Moab;
1203*b117cd09SVijay Mahadevan   //dm->ops->getinjection             = DMCreateInjection_Moab;
1204*b117cd09SVijay Mahadevan   dm->ops->refine                   = DMRefine_Moab;
1205*b117cd09SVijay Mahadevan   dm->ops->coarsen                  = DMCoarsen_Moab;
12062e4e7c01SVijay Mahadevan   dm->ops->setfromoptions           = DMSetFromOptions_Moab;
1207f6829af0SVijay Mahadevan   dm->ops->globaltolocalbegin       = DMGlobalToLocalBegin_Moab;
1208f6829af0SVijay Mahadevan   dm->ops->globaltolocalend         = DMGlobalToLocalEnd_Moab;
1209f6829af0SVijay Mahadevan   dm->ops->localtoglobalbegin       = DMLocalToGlobalBegin_Moab;
1210f6829af0SVijay Mahadevan   dm->ops->localtoglobalend         = DMLocalToGlobalEnd_Moab;
1211f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1212f6829af0SVijay Mahadevan }
1213f6829af0SVijay Mahadevan 
1214