xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 1a845d2ab7fc923aa0f37ab667f30ab57ae65f5f)
1b8ecf6d3SVijay Mahadevan #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 
25fd349b41STim Tautges #undef __FUNCT__
261d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate"
271d72bce8STim Tautges /*@
281d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
291d72bce8STim Tautges 
301d72bce8STim Tautges   Collective on MPI_Comm
311d72bce8STim Tautges 
321d72bce8STim Tautges   Input Parameter:
331d72bce8STim Tautges . comm - The communicator for the DMMoab object
341d72bce8STim Tautges 
351d72bce8STim Tautges   Output Parameter:
36032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
371d72bce8STim Tautges 
381d72bce8STim Tautges   Level: beginner
391d72bce8STim Tautges 
401d72bce8STim Tautges .keywords: DMMoab, create
411d72bce8STim Tautges @*/
42032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
431d72bce8STim Tautges {
441d72bce8STim Tautges   PetscErrorCode ierr;
451d72bce8STim Tautges 
461d72bce8STim Tautges   PetscFunctionBegin;
47032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,2);
48032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
49032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
501d72bce8STim Tautges   PetscFunctionReturn(0);
511d72bce8STim Tautges }
521d72bce8STim Tautges 
531d72bce8STim Tautges #undef __FUNCT__
54aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab"
551d72bce8STim Tautges /*@
56a4d2169cSTim Tautges   DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data
571d72bce8STim Tautges 
581d72bce8STim Tautges   Collective on MPI_Comm
591d72bce8STim Tautges 
601d72bce8STim Tautges   Input Parameter:
611d72bce8STim Tautges . comm - The communicator for the DMMoab object
62032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
63a4d2169cSTim Tautges          along with the DMMoab
64a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
651d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
661d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
671d72bce8STim Tautges 
681d72bce8STim Tautges   Output Parameter:
69032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
701d72bce8STim Tautges 
71032b8ab6SVijay Mahadevan   Level: intermediate
721d72bce8STim Tautges 
731d72bce8STim Tautges .keywords: DMMoab, create
741d72bce8STim Tautges @*/
75032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
761d72bce8STim Tautges {
771d72bce8STim Tautges   PetscErrorCode ierr;
78032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
791cec0304SVijay Mahadevan   moab::EntityHandle partnset;
801cec0304SVijay Mahadevan   PetscInt rank, nprocs;
81853cdec3SJed Brown   DM_Moab        *dmmoab;
821d72bce8STim Tautges 
831d72bce8STim Tautges   PetscFunctionBegin;
84032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,6);
85032b8ab6SVijay Mahadevan   ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr);
86032b8ab6SVijay Mahadevan   dmmoab = (DM_Moab*)(*dmb)->data;
87a4d2169cSTim Tautges 
88a4d2169cSTim Tautges   if (!mbiface) {
8972ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
907d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
911d72bce8STim Tautges   }
921cec0304SVijay Mahadevan   else {
931cec0304SVijay Mahadevan     dmmoab->mbiface = mbiface;
947d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
951cec0304SVijay Mahadevan   }
961cec0304SVijay Mahadevan 
97b5410836SVijay Mahadevan   /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */
98b5410836SVijay Mahadevan   dmmoab->fileset=0;
997d89fc02STim Tautges 
100a4d2169cSTim Tautges   if (!pcomm) {
101032b8ab6SVijay Mahadevan     ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
102032b8ab6SVijay Mahadevan     ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
103032b8ab6SVijay Mahadevan 
104db66d124SVijay Mahadevan     /* Create root sets for each mesh.  Then pass these
105db66d124SVijay Mahadevan        to the load_file functions to be populated. */
1060c8a2322SVijay Mahadevan     merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);MBERR("Creating partition set failed", merr);
107032b8ab6SVijay Mahadevan 
108db66d124SVijay Mahadevan     /* Create the parallel communicator object with the partition handle associated with MOAB */
10972ff976dSVijay Mahadevan     dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
11072ff976dSVijay Mahadevan   }
11172ff976dSVijay Mahadevan   else {
11272ff976dSVijay Mahadevan     ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr);
113032b8ab6SVijay Mahadevan   }
114032b8ab6SVijay Mahadevan 
1154973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
1164973de03SVijay Mahadevan   dmmoab->bs = 1;
117addae81cSVijay Mahadevan   dmmoab->numFields = 1;
1184973de03SVijay Mahadevan 
1194973de03SVijay Mahadevan   /* set global ID tag handle */
120*1a845d2aSVijay Mahadevan   if (ltog_tag && *ltog_tag) {
121*1a845d2aSVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr);
122032b8ab6SVijay Mahadevan   }
123032b8ab6SVijay Mahadevan   else {
124*1a845d2aSVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
125*1a845d2aSVijay Mahadevan     if (ltog_tag) *ltog_tag = dmmoab->ltog_tag;
126a4d2169cSTim Tautges   }
127a4d2169cSTim Tautges 
1284973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
129a4d2169cSTim Tautges   if (range) {
1305eb88e9dSVijay Mahadevan     ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr);
131a4d2169cSTim Tautges   }
1321d72bce8STim Tautges   PetscFunctionReturn(0);
1331d72bce8STim Tautges }
1341d72bce8STim Tautges 
1351d72bce8STim Tautges #undef __FUNCT__
1361d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm"
137aa768e4cSTim Tautges /*@
138aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
139aa768e4cSTim Tautges 
140aa768e4cSTim Tautges   Collective on MPI_Comm
141aa768e4cSTim Tautges 
142aa768e4cSTim Tautges   Input Parameter:
143aa768e4cSTim Tautges . dm    - The DMMoab object being set
144aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
145aa768e4cSTim Tautges 
146aa768e4cSTim Tautges   Level: beginner
147aa768e4cSTim Tautges 
148aa768e4cSTim Tautges .keywords: DMMoab, create
149aa768e4cSTim Tautges @*/
1501d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
1511d72bce8STim Tautges {
152032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
153032b8ab6SVijay Mahadevan 
1541d72bce8STim Tautges   PetscFunctionBegin;
1551d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1561cec0304SVijay Mahadevan   PetscValidPointer(pcomm,2);
157032b8ab6SVijay Mahadevan   dmmoab->pcomm = pcomm;
158032b8ab6SVijay Mahadevan   dmmoab->mbiface = pcomm->get_moab();
159032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
1601d72bce8STim Tautges   PetscFunctionReturn(0);
1611d72bce8STim Tautges }
1621d72bce8STim Tautges 
1631d72bce8STim Tautges 
1641d72bce8STim Tautges #undef __FUNCT__
1651d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm"
166aa768e4cSTim Tautges /*@
167aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
168aa768e4cSTim Tautges 
169aa768e4cSTim Tautges   Collective on MPI_Comm
170aa768e4cSTim Tautges 
171aa768e4cSTim Tautges   Input Parameter:
172aa768e4cSTim Tautges . dm    - The DMMoab object being set
173aa768e4cSTim Tautges 
174aa768e4cSTim Tautges   Output Parameter:
175aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
176aa768e4cSTim Tautges 
177aa768e4cSTim Tautges   Level: beginner
178aa768e4cSTim Tautges 
179aa768e4cSTim Tautges .keywords: DMMoab, create
180aa768e4cSTim Tautges @*/
1811d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
1821d72bce8STim Tautges {
1831d72bce8STim Tautges   PetscFunctionBegin;
1841d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
185032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
1861d72bce8STim Tautges   PetscFunctionReturn(0);
1871d72bce8STim Tautges }
1881d72bce8STim Tautges 
1891d72bce8STim Tautges 
1901d72bce8STim Tautges #undef __FUNCT__
1911d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface"
192aa768e4cSTim Tautges /*@
193aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
194aa768e4cSTim Tautges 
195aa768e4cSTim Tautges   Collective on MPI_Comm
196aa768e4cSTim Tautges 
197aa768e4cSTim Tautges   Input Parameter:
198aa768e4cSTim Tautges . dm      - The DMMoab object being set
199aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
200aa768e4cSTim Tautges 
201aa768e4cSTim Tautges   Level: beginner
202aa768e4cSTim Tautges 
203aa768e4cSTim Tautges .keywords: DMMoab, create
204aa768e4cSTim Tautges @*/
205a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
2061d72bce8STim Tautges {
207032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
208032b8ab6SVijay Mahadevan 
2091d72bce8STim Tautges   PetscFunctionBegin;
2101d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2111cec0304SVijay Mahadevan   PetscValidPointer(mbiface,2);
212032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
213032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
214032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
2151d72bce8STim Tautges   PetscFunctionReturn(0);
2161d72bce8STim Tautges }
2171d72bce8STim Tautges 
2181d72bce8STim Tautges 
2191d72bce8STim Tautges #undef __FUNCT__
2201d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface"
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 
2491d72bce8STim Tautges #undef __FUNCT__
2505eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices"
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();
290032b8ab6SVijay Mahadevan   ierr = MPI_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 
2951d72bce8STim Tautges #undef __FUNCT__
2968d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetAllVertices"
2978d8d51c8SVijay Mahadevan /*@
2988d8d51c8SVijay Mahadevan   DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab
2998d8d51c8SVijay Mahadevan 
3008d8d51c8SVijay Mahadevan   Collective on MPI_Comm
3018d8d51c8SVijay Mahadevan 
3028d8d51c8SVijay Mahadevan   Input Parameter:
3038d8d51c8SVijay Mahadevan . dm    - The DMMoab object being set
3048d8d51c8SVijay Mahadevan 
3058d8d51c8SVijay Mahadevan   Output Parameter:
3068d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted)
3078d8d51c8SVijay Mahadevan 
3088d8d51c8SVijay Mahadevan   Level: beginner
3098d8d51c8SVijay Mahadevan 
3108d8d51c8SVijay Mahadevan .keywords: DMMoab, create
3118d8d51c8SVijay Mahadevan @*/
3128d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local)
3138d8d51c8SVijay Mahadevan {
3148d8d51c8SVijay Mahadevan   PetscFunctionBegin;
3158d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3168d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab*)dm->data)->vlocal;
3178d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
3188d8d51c8SVijay Mahadevan }
3198d8d51c8SVijay Mahadevan 
3208d8d51c8SVijay Mahadevan 
3218d8d51c8SVijay Mahadevan 
3228d8d51c8SVijay Mahadevan #undef __FUNCT__
3235eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices"
324aa768e4cSTim Tautges /*@
3255eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
326aa768e4cSTim Tautges 
327aa768e4cSTim Tautges   Collective on MPI_Comm
328aa768e4cSTim Tautges 
329aa768e4cSTim Tautges   Input Parameter:
330aa768e4cSTim Tautges . dm    - The DMMoab object being set
331aa768e4cSTim Tautges 
332aa768e4cSTim Tautges   Output Parameter:
3335eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab
3345eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition
335aa768e4cSTim Tautges 
336aa768e4cSTim Tautges   Level: beginner
337aa768e4cSTim Tautges 
338aa768e4cSTim Tautges .keywords: DMMoab, create
339aa768e4cSTim Tautges @*/
340351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,const moab::Range **owned,const moab::Range **ghost)
3411d72bce8STim Tautges {
3421d72bce8STim Tautges   PetscFunctionBegin;
3431d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
344351b8a77SVijay Mahadevan   if (owned) *owned = ((DM_Moab*)dm->data)->vowned;
345351b8a77SVijay Mahadevan   if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost;
3461d72bce8STim Tautges   PetscFunctionReturn(0);
3471d72bce8STim Tautges }
3481d72bce8STim Tautges 
3491d72bce8STim Tautges #undef __FUNCT__
3505eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements"
3515eb88e9dSVijay Mahadevan /*@
3525eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
3535eb88e9dSVijay Mahadevan 
3545eb88e9dSVijay Mahadevan   Collective on MPI_Comm
3555eb88e9dSVijay Mahadevan 
3565eb88e9dSVijay Mahadevan   Input Parameter:
3575eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
3585eb88e9dSVijay Mahadevan 
3595eb88e9dSVijay Mahadevan   Output Parameter:
3605eb88e9dSVijay Mahadevan . range - The entities owned locally
3615eb88e9dSVijay Mahadevan 
3625eb88e9dSVijay Mahadevan   Level: beginner
3635eb88e9dSVijay Mahadevan 
3645eb88e9dSVijay Mahadevan .keywords: DMMoab, create
3655eb88e9dSVijay Mahadevan @*/
366351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,const moab::Range **range)
3675eb88e9dSVijay Mahadevan {
3685eb88e9dSVijay Mahadevan   PetscFunctionBegin;
3695eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
370351b8a77SVijay Mahadevan   if (range) *range = ((DM_Moab*)dm->data)->elocal;
3711cec0304SVijay Mahadevan   PetscFunctionReturn(0);
3721cec0304SVijay Mahadevan }
3731cec0304SVijay Mahadevan 
3741cec0304SVijay Mahadevan 
3751cec0304SVijay Mahadevan #undef __FUNCT__
3761cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements"
3771cec0304SVijay Mahadevan /*@
3781cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
3791cec0304SVijay Mahadevan 
3801cec0304SVijay Mahadevan   Collective on MPI_Comm
3811cec0304SVijay Mahadevan 
3821cec0304SVijay Mahadevan   Input Parameter:
3831cec0304SVijay Mahadevan . dm    - The DMMoab object being set
3841cec0304SVijay Mahadevan . range - The entities treated by this DMMoab
3851cec0304SVijay Mahadevan 
3861cec0304SVijay Mahadevan   Level: beginner
3871cec0304SVijay Mahadevan 
3881cec0304SVijay Mahadevan .keywords: DMMoab, create
3891cec0304SVijay Mahadevan @*/
3901cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range)
3911cec0304SVijay Mahadevan {
3921cec0304SVijay Mahadevan   moab::ErrorCode merr;
3931cec0304SVijay Mahadevan   PetscErrorCode  ierr;
3941cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
3951cec0304SVijay Mahadevan 
3961cec0304SVijay Mahadevan   PetscFunctionBegin;
3971cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3981cec0304SVijay Mahadevan   dmmoab->elocal->clear();
3991cec0304SVijay Mahadevan   dmmoab->eghost->clear();
4001cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
4011cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
4021cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
4031cec0304SVijay Mahadevan   dmmoab->neleloc=dmmoab->elocal->size();
40441dd5348SVijay Mahadevan   dmmoab->neleghost=dmmoab->eghost->size();
4051cec0304SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
4068cbae1a6SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele);
4075eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
4085eb88e9dSVijay Mahadevan }
4095eb88e9dSVijay Mahadevan 
4105eb88e9dSVijay Mahadevan 
4115eb88e9dSVijay Mahadevan #undef __FUNCT__
4121d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag"
413aa768e4cSTim Tautges /*@
414aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
415aa768e4cSTim Tautges 
416aa768e4cSTim Tautges   Collective on MPI_Comm
417aa768e4cSTim Tautges 
418aa768e4cSTim Tautges   Input Parameter:
419aa768e4cSTim Tautges . dm      - The DMMoab object being set
420aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
421aa768e4cSTim Tautges 
422aa768e4cSTim Tautges   Level: beginner
423aa768e4cSTim Tautges 
424aa768e4cSTim Tautges .keywords: DMMoab, create
425aa768e4cSTim Tautges @*/
4261d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
4271d72bce8STim Tautges {
4281d72bce8STim Tautges   PetscFunctionBegin;
4291d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4301d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
4311d72bce8STim Tautges   PetscFunctionReturn(0);
4321d72bce8STim Tautges }
4331d72bce8STim Tautges 
4341d72bce8STim Tautges 
4351d72bce8STim Tautges #undef __FUNCT__
4361d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag"
437aa768e4cSTim Tautges /*@
438aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
439aa768e4cSTim Tautges 
440aa768e4cSTim Tautges   Collective on MPI_Comm
441aa768e4cSTim Tautges 
442aa768e4cSTim Tautges   Input Parameter:
443aa768e4cSTim Tautges . dm      - The DMMoab object being set
444aa768e4cSTim Tautges 
445aa768e4cSTim Tautges   Output Parameter:
446aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
447aa768e4cSTim Tautges 
448aa768e4cSTim Tautges   Level: beginner
449aa768e4cSTim Tautges 
450aa768e4cSTim Tautges .keywords: DMMoab, create
451aa768e4cSTim Tautges @*/
4521d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
4531d72bce8STim Tautges {
4541d72bce8STim Tautges   PetscFunctionBegin;
4551d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4561d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
4571d72bce8STim Tautges   PetscFunctionReturn(0);
4581d72bce8STim Tautges }
4591d72bce8STim Tautges 
4601d72bce8STim Tautges 
4611d72bce8STim Tautges #undef __FUNCT__
4621d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize"
463aa768e4cSTim Tautges /*@
464aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
465aa768e4cSTim Tautges 
466aa768e4cSTim Tautges   Collective on MPI_Comm
467aa768e4cSTim Tautges 
468aa768e4cSTim Tautges   Input Parameter:
469aa768e4cSTim Tautges . dm - The DMMoab object being set
470aa768e4cSTim Tautges . bs - The block size used with this DMMoab
471aa768e4cSTim Tautges 
472aa768e4cSTim Tautges   Level: beginner
473aa768e4cSTim Tautges 
474aa768e4cSTim Tautges .keywords: DMMoab, create
475aa768e4cSTim Tautges @*/
4761d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
4771d72bce8STim Tautges {
4781d72bce8STim Tautges   PetscFunctionBegin;
4791d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4801d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
4811d72bce8STim Tautges   PetscFunctionReturn(0);
4821d72bce8STim Tautges }
4831d72bce8STim Tautges 
4841d72bce8STim Tautges 
4851d72bce8STim Tautges #undef __FUNCT__
4861d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize"
487aa768e4cSTim Tautges /*@
488aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
489aa768e4cSTim Tautges 
490aa768e4cSTim Tautges   Collective on MPI_Comm
491aa768e4cSTim Tautges 
492aa768e4cSTim Tautges   Input Parameter:
493aa768e4cSTim Tautges . dm - The DMMoab object being set
494aa768e4cSTim Tautges 
495aa768e4cSTim Tautges   Output Parameter:
496aa768e4cSTim Tautges . bs - The block size used with this DMMoab
497aa768e4cSTim Tautges 
498aa768e4cSTim Tautges   Level: beginner
499aa768e4cSTim Tautges 
500aa768e4cSTim Tautges .keywords: DMMoab, create
501aa768e4cSTim Tautges @*/
5021d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
5031d72bce8STim Tautges {
5041d72bce8STim Tautges   PetscFunctionBegin;
5051d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5061d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
5071d72bce8STim Tautges   PetscFunctionReturn(0);
5081d72bce8STim Tautges }
5091d72bce8STim Tautges 
5101cec0304SVijay Mahadevan 
5111cec0304SVijay Mahadevan #undef __FUNCT__
512212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetSize"
513212ad6d1SVijay Mahadevan /*@
514212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
515212ad6d1SVijay Mahadevan 
51600cc10feSVijay Mahadevan   Collective on DM
517212ad6d1SVijay Mahadevan 
518212ad6d1SVijay Mahadevan   Input Parameter:
519212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
520212ad6d1SVijay Mahadevan 
521212ad6d1SVijay Mahadevan   Output Parameter:
52200cc10feSVijay Mahadevan . neg - The number of global elements in the DMMoab instance
52300cc10feSVijay Mahadevan . nvg - The number of global vertices in the DMMoab instance
524212ad6d1SVijay Mahadevan 
525212ad6d1SVijay Mahadevan   Level: beginner
526212ad6d1SVijay Mahadevan 
527212ad6d1SVijay Mahadevan .keywords: DMMoab, create
528212ad6d1SVijay Mahadevan @*/
52941dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *neg,PetscInt *nvg)
530212ad6d1SVijay Mahadevan {
531212ad6d1SVijay Mahadevan   PetscFunctionBegin;
532212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
53341dd5348SVijay Mahadevan   if(neg) *neg = ((DM_Moab*)dm->data)->nele;
53441dd5348SVijay Mahadevan   if(nvg) *nvg = ((DM_Moab*)dm->data)->n;
535212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
536212ad6d1SVijay Mahadevan }
537212ad6d1SVijay Mahadevan 
538212ad6d1SVijay Mahadevan 
539212ad6d1SVijay Mahadevan #undef __FUNCT__
540212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalSize"
541212ad6d1SVijay Mahadevan /*@
542212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
543212ad6d1SVijay Mahadevan 
54400cc10feSVijay Mahadevan   Collective on DM
545212ad6d1SVijay Mahadevan 
546212ad6d1SVijay Mahadevan   Input Parameter:
547212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
548212ad6d1SVijay Mahadevan 
549212ad6d1SVijay Mahadevan   Output Parameter:
550b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor
55100cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor
55200cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor
55300cc10feSVijay Mahadevan . nvg - The number of ghosted vertices in this processor
554212ad6d1SVijay Mahadevan 
555212ad6d1SVijay Mahadevan   Level: beginner
556212ad6d1SVijay Mahadevan 
557212ad6d1SVijay Mahadevan .keywords: DMMoab, create
558212ad6d1SVijay Mahadevan @*/
55941dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nel,PetscInt *neg,PetscInt *nvl,PetscInt *nvg)
560212ad6d1SVijay Mahadevan {
561212ad6d1SVijay Mahadevan   PetscFunctionBegin;
562212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
56341dd5348SVijay Mahadevan   if(nel) *nel = ((DM_Moab*)dm->data)->neleloc;
56441dd5348SVijay Mahadevan   if(neg) *neg = ((DM_Moab*)dm->data)->neleghost;
56541dd5348SVijay Mahadevan   if(nvl) *nvl = ((DM_Moab*)dm->data)->nloc;
56641dd5348SVijay Mahadevan   if(nvg) *nvg = ((DM_Moab*)dm->data)->nghost;
567212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
568212ad6d1SVijay Mahadevan }
569212ad6d1SVijay Mahadevan 
570212ad6d1SVijay Mahadevan 
571212ad6d1SVijay Mahadevan #undef __FUNCT__
57200cc10feSVijay Mahadevan #define __FUNCT__ "DMMoabGetOffset"
57300cc10feSVijay Mahadevan /*@
57400cc10feSVijay Mahadevan   DMMoabGetOffset - Get the local offset for the global vector
57500cc10feSVijay Mahadevan 
57600cc10feSVijay Mahadevan   Collective on MPI_Comm
57700cc10feSVijay Mahadevan 
57800cc10feSVijay Mahadevan   Input Parameter:
57900cc10feSVijay Mahadevan . dm - The DMMoab object being set
58000cc10feSVijay Mahadevan 
58100cc10feSVijay Mahadevan   Output Parameter:
58200cc10feSVijay Mahadevan . offset - The local offset for the global vector
58300cc10feSVijay Mahadevan 
58400cc10feSVijay Mahadevan   Level: beginner
58500cc10feSVijay Mahadevan 
58600cc10feSVijay Mahadevan .keywords: DMMoab, create
58700cc10feSVijay Mahadevan @*/
58800cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm,PetscInt *offset)
58900cc10feSVijay Mahadevan {
59000cc10feSVijay Mahadevan   PetscFunctionBegin;
59100cc10feSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
59200cc10feSVijay Mahadevan   *offset = ((DM_Moab*)dm->data)->vstart;
59300cc10feSVijay Mahadevan   PetscFunctionReturn(0);
59400cc10feSVijay Mahadevan }
59500cc10feSVijay Mahadevan 
59600cc10feSVijay Mahadevan 
59700cc10feSVijay Mahadevan #undef __FUNCT__
5984920ab11SVijay Mahadevan #define __FUNCT__ "DMMoabGetDimension"
5994920ab11SVijay Mahadevan /*@
6004920ab11SVijay Mahadevan   DMMoabGetDimension - Get the dimension of the DM Mesh
6014920ab11SVijay Mahadevan 
6024920ab11SVijay Mahadevan   Collective on MPI_Comm
6034920ab11SVijay Mahadevan 
6044920ab11SVijay Mahadevan   Input Parameter:
6054920ab11SVijay Mahadevan . dm - The DMMoab object being set
6064920ab11SVijay Mahadevan 
6074920ab11SVijay Mahadevan   Output Parameter:
6084920ab11SVijay Mahadevan . dim - The dimension of DM
6094920ab11SVijay Mahadevan 
6104920ab11SVijay Mahadevan   Level: beginner
6114920ab11SVijay Mahadevan 
6124920ab11SVijay Mahadevan .keywords: DMMoab, create
6134920ab11SVijay Mahadevan @*/
6144920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim)
6154920ab11SVijay Mahadevan {
6164920ab11SVijay Mahadevan   PetscFunctionBegin;
6174920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6184920ab11SVijay Mahadevan   *dim = ((DM_Moab*)dm->data)->dim;
6194920ab11SVijay Mahadevan   PetscFunctionReturn(0);
6204920ab11SVijay Mahadevan }
6214920ab11SVijay Mahadevan 
6224920ab11SVijay Mahadevan 
6234920ab11SVijay Mahadevan 
6244920ab11SVijay Mahadevan #undef __FUNCT__
6257023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates"
6267023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos)
6277023aa44SVijay Mahadevan {
6287023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
6297023aa44SVijay Mahadevan   PetscErrorCode  ierr;
6307023aa44SVijay Mahadevan   moab::ErrorCode merr;
6317023aa44SVijay Mahadevan 
6327023aa44SVijay Mahadevan   PetscFunctionBegin;
6337023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6347023aa44SVijay Mahadevan   PetscValidPointer(conn,3);
6357023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6367023aa44SVijay Mahadevan 
6377023aa44SVijay Mahadevan   if (!vpos) {
6387023aa44SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr);
6397023aa44SVijay Mahadevan   }
6407023aa44SVijay Mahadevan 
6417023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
6427023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
6437023aa44SVijay Mahadevan   PetscFunctionReturn(0);
6447023aa44SVijay Mahadevan }
6457023aa44SVijay Mahadevan 
6467023aa44SVijay Mahadevan 
6477023aa44SVijay Mahadevan #undef __FUNCT__
6488d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexConnectivity"
6498d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
6508d8d51c8SVijay Mahadevan {
6518d8d51c8SVijay Mahadevan   DM_Moab        *dmmoab;
6528d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities,connect;
6538d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
6548d8d51c8SVijay Mahadevan   moab::ErrorCode merr;
6558d8d51c8SVijay Mahadevan 
6568d8d51c8SVijay Mahadevan   PetscFunctionBegin;
6578d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6588d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
6598d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6608d8d51c8SVijay Mahadevan 
6618d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
6628d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_adjacencies(&ehandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr);
6638d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr);
6648d8d51c8SVijay Mahadevan 
6658d8d51c8SVijay Mahadevan   if (conn) {
6668d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr);
6678d8d51c8SVijay Mahadevan     ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr);
6688d8d51c8SVijay Mahadevan   }
6698d8d51c8SVijay Mahadevan   if (nconn) *nconn=connect.size();
6708d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
6718d8d51c8SVijay Mahadevan }
6728d8d51c8SVijay Mahadevan 
6738d8d51c8SVijay Mahadevan 
6748d8d51c8SVijay Mahadevan #undef __FUNCT__
6758d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabRestoreVertexConnectivity"
6768d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
6778d8d51c8SVijay Mahadevan {
6788d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
6798d8d51c8SVijay Mahadevan 
6808d8d51c8SVijay Mahadevan   PetscFunctionBegin;
6818d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6828d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
6838d8d51c8SVijay Mahadevan 
6848d8d51c8SVijay Mahadevan   if (conn) {
6858d8d51c8SVijay Mahadevan     ierr = PetscFree(*conn);CHKERRQ(ierr);
6868d8d51c8SVijay Mahadevan   }
6878d8d51c8SVijay Mahadevan   if (nconn) *nconn=0;
6888d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
6898d8d51c8SVijay Mahadevan }
6908d8d51c8SVijay Mahadevan 
6918d8d51c8SVijay Mahadevan 
6928d8d51c8SVijay Mahadevan 
6938d8d51c8SVijay Mahadevan #undef __FUNCT__
6947023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity"
6957023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn)
6967023aa44SVijay Mahadevan {
6977023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
6987023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
6997023aa44SVijay Mahadevan   moab::ErrorCode merr;
7007023aa44SVijay Mahadevan   PetscInt nnodes;
7017023aa44SVijay Mahadevan 
7027023aa44SVijay Mahadevan   PetscFunctionBegin;
7037023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7047023aa44SVijay Mahadevan   PetscValidPointer(conn,4);
7057023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7067023aa44SVijay Mahadevan 
7077023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
7087023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr);
7097023aa44SVijay Mahadevan   if (conn) *conn=connect;
7107023aa44SVijay Mahadevan   if (nconn) *nconn=nnodes;
7117023aa44SVijay Mahadevan   PetscFunctionReturn(0);
7127023aa44SVijay Mahadevan }
7137023aa44SVijay Mahadevan 
7147023aa44SVijay Mahadevan 
7157023aa44SVijay Mahadevan #undef __FUNCT__
71669263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary"
71769263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary)
71869263071SVijay Mahadevan {
71969263071SVijay Mahadevan   moab::EntityType etype;
72069263071SVijay Mahadevan   DM_Moab         *dmmoab;
72169263071SVijay Mahadevan   PetscInt         edim;
72269263071SVijay Mahadevan 
72369263071SVijay Mahadevan   PetscFunctionBegin;
72469263071SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
72569263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary,3);
72669263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
72769263071SVijay Mahadevan 
72869263071SVijay Mahadevan   /* get the entity type and handle accordingly */
72969263071SVijay Mahadevan   etype=dmmoab->mbiface->type_from_handle(ent);
73069263071SVijay 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);
73169263071SVijay Mahadevan 
73269263071SVijay Mahadevan   /* get the entity dimension */
73369263071SVijay Mahadevan   edim=dmmoab->mbiface->dimension_from_handle(ent);
73469263071SVijay Mahadevan 
73569263071SVijay Mahadevan   *ent_on_boundary=PETSC_FALSE;
73669263071SVijay Mahadevan   if(etype == moab::MBVERTEX && edim == 0) {
7376d9eb265SVijay Mahadevan     if (dmmoab->bndyvtx->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
73869263071SVijay Mahadevan   }
73969263071SVijay Mahadevan   else {
74069263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
7416d9eb265SVijay Mahadevan       if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
74269263071SVijay Mahadevan     }
74369263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
7446d9eb265SVijay Mahadevan       if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
74569263071SVijay Mahadevan     }
74669263071SVijay Mahadevan   }
74769263071SVijay Mahadevan   PetscFunctionReturn(0);
74869263071SVijay Mahadevan }
74969263071SVijay Mahadevan 
75069263071SVijay Mahadevan 
75169263071SVijay Mahadevan #undef __FUNCT__
7527023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices"
75369263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx)
7547023aa44SVijay Mahadevan {
7557023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
7567023aa44SVijay Mahadevan   PetscInt       i;
7577023aa44SVijay Mahadevan 
7587023aa44SVijay Mahadevan   PetscFunctionBegin;
7597023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7607023aa44SVijay Mahadevan   PetscValidPointer(cnt,3);
7617023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx,4);
7627023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7637023aa44SVijay Mahadevan 
7647023aa44SVijay Mahadevan   for (i=0; i < nconn; ++i) {
7656d9eb265SVijay Mahadevan     isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE);
7667023aa44SVijay Mahadevan   }
7677023aa44SVijay Mahadevan   PetscFunctionReturn(0);
7687023aa44SVijay Mahadevan }
7697023aa44SVijay Mahadevan 
7707023aa44SVijay Mahadevan 
7717023aa44SVijay Mahadevan #undef __FUNCT__
7720c8a2322SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryMarkers"
7736d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces)
7741cec0304SVijay Mahadevan {
7751cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
7761cec0304SVijay Mahadevan 
7771cec0304SVijay Mahadevan   PetscFunctionBegin;
7781cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7791cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7801cec0304SVijay Mahadevan 
7816d9eb265SVijay Mahadevan   if (bdvtx)  *bdvtx = dmmoab->bndyvtx;
7826d9eb265SVijay Mahadevan   if (bdfaces)  *bdfaces = dmmoab->bndyfaces;
7836d9eb265SVijay Mahadevan   if (bdelems)  *bdfaces = dmmoab->bndyelems;
7841cec0304SVijay Mahadevan   PetscFunctionReturn(0);
7851cec0304SVijay Mahadevan }
7861cec0304SVijay Mahadevan 
787f6829af0SVijay Mahadevan 
788f6829af0SVijay Mahadevan #undef __FUNCT__
789f6829af0SVijay Mahadevan #define __FUNCT__ "DMDestroy_Moab"
790f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm)
791f6829af0SVijay Mahadevan {
792f6829af0SVijay Mahadevan   PetscErrorCode ierr;
793f6829af0SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
794f6829af0SVijay Mahadevan 
795f6829af0SVijay Mahadevan   PetscFunctionBegin;
796f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
797f6829af0SVijay Mahadevan   if (dmmoab->icreatedinstance) {
798f6829af0SVijay Mahadevan     delete dmmoab->mbiface;
799f6829af0SVijay Mahadevan   }
800f6829af0SVijay Mahadevan   dmmoab->mbiface = NULL;
801f6829af0SVijay Mahadevan   dmmoab->pcomm = NULL;
802f6829af0SVijay Mahadevan   delete dmmoab->vlocal;
803f6829af0SVijay Mahadevan   delete dmmoab->vowned;
804f6829af0SVijay Mahadevan   delete dmmoab->vghost;
805f6829af0SVijay Mahadevan   delete dmmoab->elocal;
806f6829af0SVijay Mahadevan   delete dmmoab->eghost;
807f6829af0SVijay Mahadevan   delete dmmoab->bndyvtx;
808f6829af0SVijay Mahadevan   delete dmmoab->bndyfaces;
809f6829af0SVijay Mahadevan   delete dmmoab->bndyelems;
810f6829af0SVijay Mahadevan 
811f6829af0SVijay Mahadevan   ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr);
812f6829af0SVijay Mahadevan   ierr = PetscFree(dmmoab->lidmap);CHKERRQ(ierr);
813f6829af0SVijay Mahadevan   ierr = PetscFree(dmmoab->gidmap);CHKERRQ(ierr);
814f6829af0SVijay Mahadevan   ierr = PetscFree(dmmoab->llmap);CHKERRQ(ierr);
815f6829af0SVijay Mahadevan   ierr = PetscFree(dmmoab->lgmap);CHKERRQ(ierr);
816f6829af0SVijay Mahadevan   ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
817f6829af0SVijay Mahadevan   ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr);
818f6829af0SVijay Mahadevan   ierr = PetscFree(dm->data);CHKERRQ(ierr);
819f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
820f6829af0SVijay Mahadevan }
821f6829af0SVijay Mahadevan 
822f6829af0SVijay Mahadevan 
823f6829af0SVijay Mahadevan #undef __FUNCT__
824f6829af0SVijay Mahadevan #define __FUNCT__ "DMSetUp_Moab"
825f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm)
826f6829af0SVijay Mahadevan {
827f6829af0SVijay Mahadevan   PetscErrorCode          ierr;
828f6829af0SVijay Mahadevan   moab::ErrorCode         merr;
829f6829af0SVijay Mahadevan   Vec                     local, global;
830f6829af0SVijay Mahadevan   IS                      from,to;
831f6829af0SVijay Mahadevan   moab::Range::iterator   iter;
832f6829af0SVijay Mahadevan   PetscInt                i,j,f,bs,gmin,lmin,lmax,vent,totsize;
833f6829af0SVijay Mahadevan   DM_Moab                *dmmoab = (DM_Moab*)dm->data;
834f6829af0SVijay Mahadevan   moab::Range             adjs;
835f6829af0SVijay Mahadevan 
836f6829af0SVijay Mahadevan   PetscFunctionBegin;
837f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
838f6829af0SVijay Mahadevan   /* Get the local and shared vertices and cache it */
839f6829af0SVijay Mahadevan   if (dmmoab->mbiface == PETSC_NULL || dmmoab->pcomm == PETSC_NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface and ParallelComm objects before calling SetUp.");
840f6829af0SVijay Mahadevan 
841f6829af0SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
842f6829af0SVijay Mahadevan   if (dmmoab->vlocal->empty())
843f6829af0SVijay Mahadevan   {
844f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
845f6829af0SVijay Mahadevan 
846f6829af0SVijay Mahadevan     /* filter based on parallel status */
847f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
848f6829af0SVijay Mahadevan 
849f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
850f6829af0SVijay Mahadevan     adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
851f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
852f6829af0SVijay Mahadevan     adjs = moab::subtract(adjs, *dmmoab->vghost);
853f6829af0SVijay Mahadevan     *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs);
854f6829af0SVijay Mahadevan 
855f6829af0SVijay Mahadevan     /* compute and cache the sizes of local and ghosted entities */
856f6829af0SVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
857f6829af0SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
858f6829af0SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
859f6829af0SVijay Mahadevan   }
860f6829af0SVijay Mahadevan 
861f6829af0SVijay Mahadevan   {
862f6829af0SVijay Mahadevan     /* get the information about the local elements in the mesh */
863f6829af0SVijay Mahadevan     dmmoab->eghost->clear();
864f6829af0SVijay Mahadevan 
865f6829af0SVijay Mahadevan     /* first decipher the leading dimension */
866f6829af0SVijay Mahadevan     for (i=3;i>0;i--) {
867f6829af0SVijay Mahadevan       dmmoab->elocal->clear();
868f6829af0SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr);
869f6829af0SVijay Mahadevan 
870f6829af0SVijay Mahadevan       /* store the current mesh dimension */
871f6829af0SVijay Mahadevan       if (dmmoab->elocal->size()) {
872f6829af0SVijay Mahadevan         dmmoab->dim=i;
873f6829af0SVijay Mahadevan         break;
874f6829af0SVijay Mahadevan       }
875f6829af0SVijay Mahadevan     }
876f6829af0SVijay Mahadevan 
877f6829af0SVijay Mahadevan     /* filter the ghosted and owned element list */
878f6829af0SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
879f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
880f6829af0SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
881f6829af0SVijay Mahadevan 
882f6829af0SVijay Mahadevan     dmmoab->neleloc = dmmoab->elocal->size();
883f6829af0SVijay Mahadevan     dmmoab->neleghost = dmmoab->eghost->size();
884f6829af0SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
885f6829af0SVijay Mahadevan   }
886f6829af0SVijay Mahadevan 
887f6829af0SVijay Mahadevan   bs = dmmoab->bs;
888f6829af0SVijay Mahadevan   if (!dmmoab->ltog_tag) {
889f6829af0SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
890f6829af0SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
891f6829af0SVijay Mahadevan        assemble the individual pieces of the mesh */
892f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
893f6829af0SVijay Mahadevan   }
894f6829af0SVijay Mahadevan 
895f6829af0SVijay Mahadevan   totsize=dmmoab->vlocal->size();
896f6829af0SVijay 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);
897f6829af0SVijay Mahadevan   ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->gsindices);CHKERRQ(ierr);
898f6829af0SVijay Mahadevan   {
899f6829af0SVijay Mahadevan     /* first get the local indices */
900f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr);
901f6829af0SVijay Mahadevan     /* next get the ghosted indices */
902f6829af0SVijay Mahadevan     if (dmmoab->nghost) {
903f6829af0SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr);
904f6829af0SVijay Mahadevan     }
905f6829af0SVijay Mahadevan 
906f6829af0SVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
907f6829af0SVijay Mahadevan     lmin=lmax=dmmoab->gsindices[0];
908f6829af0SVijay Mahadevan     for (i=0; i<totsize; ++i) {
909f6829af0SVijay Mahadevan       if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i];
910f6829af0SVijay Mahadevan       if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i];
911f6829af0SVijay Mahadevan     }
912f6829af0SVijay Mahadevan 
913f6829af0SVijay Mahadevan     ierr = MPI_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr);
914f6829af0SVijay Mahadevan 
915f6829af0SVijay Mahadevan     /* set the GID map */
916f6829af0SVijay Mahadevan     for (i=0; i<totsize; ++i) {
917f6829af0SVijay Mahadevan       dmmoab->gsindices[i]-=gmin;   /* zero based index needed for IS */
918f6829af0SVijay Mahadevan     }
919f6829af0SVijay Mahadevan     lmin-=gmin;
920f6829af0SVijay Mahadevan     lmax-=gmin;
921f6829af0SVijay Mahadevan 
922f6829af0SVijay Mahadevan     PetscInfo3(NULL, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin);
923f6829af0SVijay Mahadevan   }
924f6829af0SVijay Mahadevan 
925f6829af0SVijay Mahadevan   {
926f6829af0SVijay Mahadevan     ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->gidmap);CHKERRQ(ierr);
927f6829af0SVijay Mahadevan     ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->lidmap);CHKERRQ(ierr);
928f6829af0SVijay Mahadevan     ierr = PetscMalloc(totsize*dmmoab->numFields*sizeof(PetscInt), &dmmoab->llmap);CHKERRQ(ierr);
929f6829af0SVijay Mahadevan     ierr = PetscMalloc(totsize*dmmoab->numFields*sizeof(PetscInt), &dmmoab->lgmap);CHKERRQ(ierr);
930f6829af0SVijay Mahadevan 
931f6829af0SVijay Mahadevan     i=j=0;
932f6829af0SVijay Mahadevan     /* set the owned vertex data first */
933f6829af0SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) {
934f6829af0SVijay Mahadevan       vent=(PetscInt)(*iter);
935f6829af0SVijay Mahadevan       dmmoab->gidmap[vent]=dmmoab->gsindices[i];
936f6829af0SVijay Mahadevan       dmmoab->lidmap[vent]=i;
937f6829af0SVijay Mahadevan       if (bs > 1) {
938f6829af0SVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
939f6829af0SVijay Mahadevan           dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f;
940f6829af0SVijay Mahadevan           dmmoab->llmap[j]=i*dmmoab->numFields+f;
941f6829af0SVijay Mahadevan         }
942f6829af0SVijay Mahadevan       }
943f6829af0SVijay Mahadevan       else {
944f6829af0SVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
945f6829af0SVijay Mahadevan           dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i];
946f6829af0SVijay Mahadevan           dmmoab->llmap[j]=totsize*f+i;
947f6829af0SVijay Mahadevan         }
948f6829af0SVijay Mahadevan       }
949f6829af0SVijay Mahadevan     }
950f6829af0SVijay Mahadevan     /* next arrange all the ghosted data information */
951f6829af0SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) {
952f6829af0SVijay Mahadevan       vent=(PetscInt)(*iter);
953f6829af0SVijay Mahadevan       dmmoab->gidmap[vent]=dmmoab->gsindices[i];
954f6829af0SVijay Mahadevan       dmmoab->lidmap[vent]=i;
955f6829af0SVijay Mahadevan       if (bs > 1) {
956f6829af0SVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
957f6829af0SVijay Mahadevan           dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f;
958f6829af0SVijay Mahadevan           dmmoab->llmap[j]=i*dmmoab->numFields+f;
959f6829af0SVijay Mahadevan         }
960f6829af0SVijay Mahadevan       }
961f6829af0SVijay Mahadevan       else {
962f6829af0SVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
963f6829af0SVijay Mahadevan           dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i];
964f6829af0SVijay Mahadevan           dmmoab->llmap[j]=totsize*f+i;
965f6829af0SVijay Mahadevan         }
966f6829af0SVijay Mahadevan       }
967f6829af0SVijay Mahadevan     }
968f6829af0SVijay Mahadevan 
969f6829af0SVijay Mahadevan     /* We need to create the Global to Local Vector Scatter Contexts
970f6829af0SVijay Mahadevan        1) First create a local and global vector
971f6829af0SVijay Mahadevan        2) Create a local and global IS
972f6829af0SVijay Mahadevan        3) Create VecScatter and LtoGMapping objects
973f6829af0SVijay Mahadevan        4) Cleanup the IS and Vec objects
974f6829af0SVijay Mahadevan     */
975f6829af0SVijay Mahadevan     ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr);
976f6829af0SVijay Mahadevan     ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr);
977f6829af0SVijay Mahadevan 
978f6829af0SVijay Mahadevan     ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr);
979f6829af0SVijay Mahadevan     PetscInfo3(NULL, "Total-size = %D\t Owned = %D, Ghosted = %D.\n", totsize, dmmoab->nloc, dmmoab->nghost);
980f6829af0SVijay Mahadevan 
981f6829af0SVijay Mahadevan     /* global to local must retrieve ghost points */
982f6829af0SVijay Mahadevan     ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,dmmoab->vstart,1,&from);CHKERRQ(ierr);
983f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr);
984f6829af0SVijay Mahadevan 
985f6829af0SVijay Mahadevan     ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,&dmmoab->lgmap[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr);
986f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(to,bs);CHKERRQ(ierr);
987f6829af0SVijay Mahadevan 
988f6829af0SVijay Mahadevan     if (!dmmoab->ltog_map) {
989f6829af0SVijay Mahadevan       /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */
990f6829af0SVijay Mahadevan       ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,totsize*dmmoab->numFields,dmmoab->lgmap,
991f6829af0SVijay Mahadevan                                           PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr);
992f6829af0SVijay Mahadevan     }
993f6829af0SVijay Mahadevan 
994f6829af0SVijay Mahadevan     /* now create the scatter object from local to global vector */
995f6829af0SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
996f6829af0SVijay Mahadevan 
997f6829af0SVijay Mahadevan     /* clean up IS, Vec */
998f6829af0SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
999f6829af0SVijay Mahadevan     ierr = ISDestroy(&to);CHKERRQ(ierr);
1000f6829af0SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
1001f6829af0SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
1002f6829af0SVijay Mahadevan   }
1003f6829af0SVijay Mahadevan 
1004f6829af0SVijay Mahadevan   /* skin the boundary and store nodes */
1005f6829af0SVijay Mahadevan   {
1006f6829af0SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
1007f6829af0SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
1008f6829af0SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
1009f6829af0SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
1010f6829af0SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
1011f6829af0SVijay Mahadevan 
1012f6829af0SVijay Mahadevan     dmmoab->bndyvtx = new moab::Range();
1013f6829af0SVijay Mahadevan     dmmoab->bndyfaces = new moab::Range();
1014f6829af0SVijay Mahadevan     dmmoab->bndyelems = new moab::Range();
1015f6829af0SVijay Mahadevan 
1016f6829af0SVijay Mahadevan     /* get the entities on the skin - only the faces */
1017f6829af0SVijay 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
1018f6829af0SVijay Mahadevan 
1019f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
1020f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
1021f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr);
1022f6829af0SVijay Mahadevan 
1023f6829af0SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
1024f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr);
1025f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr);
1026f6829af0SVijay Mahadevan     PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size());
1027f6829af0SVijay Mahadevan   }
1028f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1029f6829af0SVijay Mahadevan }
1030f6829af0SVijay Mahadevan 
1031f6829af0SVijay Mahadevan 
1032f6829af0SVijay Mahadevan #undef __FUNCT__
1033f6829af0SVijay Mahadevan #define __FUNCT__ "DMCreate_Moab"
1034f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
1035f6829af0SVijay Mahadevan {
1036f6829af0SVijay Mahadevan   PetscErrorCode ierr;
1037f6829af0SVijay Mahadevan 
1038f6829af0SVijay Mahadevan   PetscFunctionBegin;
1039f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1040f6829af0SVijay Mahadevan   ierr = PetscNewLog(dm,DM_Moab,&dm->data);CHKERRQ(ierr);
1041f6829af0SVijay Mahadevan 
1042f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
1043f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->numFields = 1;
1044f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
1045f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
1046f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
1047f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
1048f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
1049f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleghost = 0;
1050f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL;
1051f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL;
1052f6829af0SVijay Mahadevan 
1053f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
1054f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
1055f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
1056f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
1057f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
1058f6829af0SVijay Mahadevan 
1059f6829af0SVijay Mahadevan   dm->ops->createglobalvector       = DMCreateGlobalVector_Moab;
1060f6829af0SVijay Mahadevan   dm->ops->createlocalvector        = DMCreateLocalVector_Moab;
1061f6829af0SVijay Mahadevan   dm->ops->creatematrix             = DMCreateMatrix_Moab;
1062f6829af0SVijay Mahadevan   dm->ops->setup                    = DMSetUp_Moab;
1063f6829af0SVijay Mahadevan   dm->ops->destroy                  = DMDestroy_Moab;
1064f6829af0SVijay Mahadevan   dm->ops->globaltolocalbegin       = DMGlobalToLocalBegin_Moab;
1065f6829af0SVijay Mahadevan   dm->ops->globaltolocalend         = DMGlobalToLocalEnd_Moab;
1066f6829af0SVijay Mahadevan   dm->ops->localtoglobalbegin       = DMLocalToGlobalBegin_Moab;
1067f6829af0SVijay Mahadevan   dm->ops->localtoglobalend         = DMLocalToGlobalEnd_Moab;
1068f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1069f6829af0SVijay Mahadevan }
1070f6829af0SVijay Mahadevan 
1071