xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision f6829af0cc05a47053f5ab6972ac976581ca15ed)
1032b8ab6SVijay Mahadevan #include <petsc-private/dmmbimpl.h> /*I  "petscdm.h"   I*/
21d72bce8STim Tautges 
31d72bce8STim Tautges #include <petscdmmoab.h>
488face26SJed Brown #include <MBTagConventions.hpp>
51cec0304SVijay Mahadevan #include <moab/Skinner.hpp>
6032b8ab6SVijay Mahadevan 
7fd349b41STim Tautges 
8fd349b41STim Tautges #undef __FUNCT__
91d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate"
101d72bce8STim Tautges /*@
111d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
121d72bce8STim Tautges 
131d72bce8STim Tautges   Collective on MPI_Comm
141d72bce8STim Tautges 
151d72bce8STim Tautges   Input Parameter:
161d72bce8STim Tautges . comm - The communicator for the DMMoab object
171d72bce8STim Tautges 
181d72bce8STim Tautges   Output Parameter:
19032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
201d72bce8STim Tautges 
211d72bce8STim Tautges   Level: beginner
221d72bce8STim Tautges 
231d72bce8STim Tautges .keywords: DMMoab, create
241d72bce8STim Tautges @*/
25032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
261d72bce8STim Tautges {
271d72bce8STim Tautges   PetscErrorCode ierr;
281d72bce8STim Tautges 
291d72bce8STim Tautges   PetscFunctionBegin;
30032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,2);
31032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
32032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
331d72bce8STim Tautges   PetscFunctionReturn(0);
341d72bce8STim Tautges }
351d72bce8STim Tautges 
361d72bce8STim Tautges #undef __FUNCT__
37aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab"
381d72bce8STim Tautges /*@
39a4d2169cSTim Tautges   DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data
401d72bce8STim Tautges 
411d72bce8STim Tautges   Collective on MPI_Comm
421d72bce8STim Tautges 
431d72bce8STim Tautges   Input Parameter:
441d72bce8STim Tautges . comm - The communicator for the DMMoab object
45032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
46a4d2169cSTim Tautges          along with the DMMoab
47a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
481d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
491d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
501d72bce8STim Tautges 
511d72bce8STim Tautges   Output Parameter:
52032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
531d72bce8STim Tautges 
54032b8ab6SVijay Mahadevan   Level: intermediate
551d72bce8STim Tautges 
561d72bce8STim Tautges .keywords: DMMoab, create
571d72bce8STim Tautges @*/
58032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
591d72bce8STim Tautges {
601d72bce8STim Tautges   PetscErrorCode ierr;
61032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
621cec0304SVijay Mahadevan   moab::EntityHandle partnset;
631cec0304SVijay Mahadevan   PetscInt rank, nprocs;
64853cdec3SJed Brown   DM_Moab        *dmmoab;
651d72bce8STim Tautges 
661d72bce8STim Tautges   PetscFunctionBegin;
67032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,6);
68032b8ab6SVijay Mahadevan   ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr);
69032b8ab6SVijay Mahadevan   dmmoab = (DM_Moab*)(*dmb)->data;
70a4d2169cSTim Tautges 
71a4d2169cSTim Tautges   if (!mbiface) {
7272ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
737d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
741d72bce8STim Tautges   }
751cec0304SVijay Mahadevan   else {
761cec0304SVijay Mahadevan     dmmoab->mbiface = mbiface;
777d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
781cec0304SVijay Mahadevan   }
791cec0304SVijay Mahadevan 
80b5410836SVijay Mahadevan   /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */
81b5410836SVijay Mahadevan   dmmoab->fileset=0;
827d89fc02STim Tautges 
83a4d2169cSTim Tautges   if (!pcomm) {
84032b8ab6SVijay Mahadevan     ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
85032b8ab6SVijay Mahadevan     ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
86032b8ab6SVijay Mahadevan 
87db66d124SVijay Mahadevan     /* Create root sets for each mesh.  Then pass these
88db66d124SVijay Mahadevan        to the load_file functions to be populated. */
890c8a2322SVijay Mahadevan     merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);MBERR("Creating partition set failed", merr);
90032b8ab6SVijay Mahadevan 
91db66d124SVijay Mahadevan     /* Create the parallel communicator object with the partition handle associated with MOAB */
9272ff976dSVijay Mahadevan     dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
9372ff976dSVijay Mahadevan   }
9472ff976dSVijay Mahadevan   else {
9572ff976dSVijay Mahadevan     ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr);
96032b8ab6SVijay Mahadevan   }
97032b8ab6SVijay Mahadevan 
984973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
994973de03SVijay Mahadevan   dmmoab->bs = 1;
100addae81cSVijay Mahadevan   dmmoab->numFields = 1;
1014973de03SVijay Mahadevan 
1024973de03SVijay Mahadevan   /* set global ID tag handle */
103032b8ab6SVijay Mahadevan   if (!ltog_tag) {
1044973de03SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
105032b8ab6SVijay Mahadevan   }
106032b8ab6SVijay Mahadevan   else {
107032b8ab6SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr);
108a4d2169cSTim Tautges   }
109a4d2169cSTim Tautges 
1104973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
111a4d2169cSTim Tautges   if (range) {
1125eb88e9dSVijay Mahadevan     ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr);
113a4d2169cSTim Tautges   }
1141d72bce8STim Tautges   PetscFunctionReturn(0);
1151d72bce8STim Tautges }
1161d72bce8STim Tautges 
1171d72bce8STim Tautges #undef __FUNCT__
1181d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm"
119aa768e4cSTim Tautges /*@
120aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
121aa768e4cSTim Tautges 
122aa768e4cSTim Tautges   Collective on MPI_Comm
123aa768e4cSTim Tautges 
124aa768e4cSTim Tautges   Input Parameter:
125aa768e4cSTim Tautges . dm    - The DMMoab object being set
126aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
127aa768e4cSTim Tautges 
128aa768e4cSTim Tautges   Level: beginner
129aa768e4cSTim Tautges 
130aa768e4cSTim Tautges .keywords: DMMoab, create
131aa768e4cSTim Tautges @*/
1321d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
1331d72bce8STim Tautges {
134032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
135032b8ab6SVijay Mahadevan 
1361d72bce8STim Tautges   PetscFunctionBegin;
1371d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1381cec0304SVijay Mahadevan   PetscValidPointer(pcomm,2);
139032b8ab6SVijay Mahadevan   dmmoab->pcomm = pcomm;
140032b8ab6SVijay Mahadevan   dmmoab->mbiface = pcomm->get_moab();
141032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
1421d72bce8STim Tautges   PetscFunctionReturn(0);
1431d72bce8STim Tautges }
1441d72bce8STim Tautges 
1451d72bce8STim Tautges 
1461d72bce8STim Tautges #undef __FUNCT__
1471d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm"
148aa768e4cSTim Tautges /*@
149aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
150aa768e4cSTim Tautges 
151aa768e4cSTim Tautges   Collective on MPI_Comm
152aa768e4cSTim Tautges 
153aa768e4cSTim Tautges   Input Parameter:
154aa768e4cSTim Tautges . dm    - The DMMoab object being set
155aa768e4cSTim Tautges 
156aa768e4cSTim Tautges   Output Parameter:
157aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
158aa768e4cSTim Tautges 
159aa768e4cSTim Tautges   Level: beginner
160aa768e4cSTim Tautges 
161aa768e4cSTim Tautges .keywords: DMMoab, create
162aa768e4cSTim Tautges @*/
1631d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
1641d72bce8STim Tautges {
1651d72bce8STim Tautges   PetscFunctionBegin;
1661d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
167032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
1681d72bce8STim Tautges   PetscFunctionReturn(0);
1691d72bce8STim Tautges }
1701d72bce8STim Tautges 
1711d72bce8STim Tautges 
1721d72bce8STim Tautges #undef __FUNCT__
1731d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface"
174aa768e4cSTim Tautges /*@
175aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
176aa768e4cSTim Tautges 
177aa768e4cSTim Tautges   Collective on MPI_Comm
178aa768e4cSTim Tautges 
179aa768e4cSTim Tautges   Input Parameter:
180aa768e4cSTim Tautges . dm      - The DMMoab object being set
181aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
182aa768e4cSTim Tautges 
183aa768e4cSTim Tautges   Level: beginner
184aa768e4cSTim Tautges 
185aa768e4cSTim Tautges .keywords: DMMoab, create
186aa768e4cSTim Tautges @*/
187a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
1881d72bce8STim Tautges {
189032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
190032b8ab6SVijay Mahadevan 
1911d72bce8STim Tautges   PetscFunctionBegin;
1921d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1931cec0304SVijay Mahadevan   PetscValidPointer(mbiface,2);
194032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
195032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
196032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
1971d72bce8STim Tautges   PetscFunctionReturn(0);
1981d72bce8STim Tautges }
1991d72bce8STim Tautges 
2001d72bce8STim Tautges 
2011d72bce8STim Tautges #undef __FUNCT__
2021d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface"
203aa768e4cSTim Tautges /*@
204aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
205aa768e4cSTim Tautges 
206aa768e4cSTim Tautges   Collective on MPI_Comm
207aa768e4cSTim Tautges 
208aa768e4cSTim Tautges   Input Parameter:
209aa768e4cSTim Tautges . dm      - The DMMoab object being set
210aa768e4cSTim Tautges 
211aa768e4cSTim Tautges   Output Parameter:
212aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
213aa768e4cSTim Tautges 
214aa768e4cSTim Tautges   Level: beginner
215aa768e4cSTim Tautges 
216aa768e4cSTim Tautges .keywords: DMMoab, create
217aa768e4cSTim Tautges @*/
218a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
2191d72bce8STim Tautges {
2209426e041SSatish Balay   PetscErrorCode   ierr;
221cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
222cabb514dSBarry Smith 
2231d72bce8STim Tautges   PetscFunctionBegin;
2241d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
225cabb514dSBarry 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);
226a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
2271d72bce8STim Tautges   PetscFunctionReturn(0);
2281d72bce8STim Tautges }
2291d72bce8STim Tautges 
2301d72bce8STim Tautges 
2311d72bce8STim Tautges #undef __FUNCT__
2325eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices"
233aa768e4cSTim Tautges /*@
2345eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
235aa768e4cSTim Tautges 
236aa768e4cSTim Tautges   Collective on MPI_Comm
237aa768e4cSTim Tautges 
238aa768e4cSTim Tautges   Input Parameter:
239aa768e4cSTim Tautges . dm    - The DMMoab object being set
240aa768e4cSTim Tautges . range - The entities treated by this DMMoab
241aa768e4cSTim Tautges 
242aa768e4cSTim Tautges   Level: beginner
243aa768e4cSTim Tautges 
244aa768e4cSTim Tautges .keywords: DMMoab, create
245aa768e4cSTim Tautges @*/
2465eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range)
2471d72bce8STim Tautges {
248032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
249032b8ab6SVijay Mahadevan   PetscErrorCode  ierr;
250fd3326ddSVijay Mahadevan   moab::Range     tmpvtxs;
251032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
252032b8ab6SVijay Mahadevan 
2531d72bce8STim Tautges   PetscFunctionBegin;
2541d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
255032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
256032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
257fd3326ddSVijay Mahadevan 
258032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
259fd3326ddSVijay Mahadevan 
260fd3326ddSVijay Mahadevan   /* filter based on parallel status */
261fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
262fd3326ddSVijay Mahadevan 
263fd3326ddSVijay Mahadevan   /* filter all the non-owned and shared entities out of the list */
264fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
265fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(tmpvtxs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
266fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost);
267fd3326ddSVijay Mahadevan   *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs);
268fd3326ddSVijay Mahadevan 
269fd3326ddSVijay Mahadevan   /* compute and cache the sizes of local and ghosted entities */
270032b8ab6SVijay Mahadevan   dmmoab->nloc = dmmoab->vowned->size();
271032b8ab6SVijay Mahadevan   dmmoab->nghost = dmmoab->vghost->size();
272032b8ab6SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
2731d72bce8STim Tautges   PetscFunctionReturn(0);
2741d72bce8STim Tautges }
2751d72bce8STim Tautges 
2761d72bce8STim Tautges 
2771d72bce8STim Tautges #undef __FUNCT__
2788d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetAllVertices"
2798d8d51c8SVijay Mahadevan /*@
2808d8d51c8SVijay Mahadevan   DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab
2818d8d51c8SVijay Mahadevan 
2828d8d51c8SVijay Mahadevan   Collective on MPI_Comm
2838d8d51c8SVijay Mahadevan 
2848d8d51c8SVijay Mahadevan   Input Parameter:
2858d8d51c8SVijay Mahadevan . dm    - The DMMoab object being set
2868d8d51c8SVijay Mahadevan 
2878d8d51c8SVijay Mahadevan   Output Parameter:
2888d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted)
2898d8d51c8SVijay Mahadevan 
2908d8d51c8SVijay Mahadevan   Level: beginner
2918d8d51c8SVijay Mahadevan 
2928d8d51c8SVijay Mahadevan .keywords: DMMoab, create
2938d8d51c8SVijay Mahadevan @*/
2948d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local)
2958d8d51c8SVijay Mahadevan {
2968d8d51c8SVijay Mahadevan   PetscFunctionBegin;
2978d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2988d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab*)dm->data)->vlocal;
2998d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
3008d8d51c8SVijay Mahadevan }
3018d8d51c8SVijay Mahadevan 
3028d8d51c8SVijay Mahadevan 
3038d8d51c8SVijay Mahadevan 
3048d8d51c8SVijay Mahadevan #undef __FUNCT__
3055eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices"
306aa768e4cSTim Tautges /*@
3075eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
308aa768e4cSTim Tautges 
309aa768e4cSTim Tautges   Collective on MPI_Comm
310aa768e4cSTim Tautges 
311aa768e4cSTim Tautges   Input Parameter:
312aa768e4cSTim Tautges . dm    - The DMMoab object being set
313aa768e4cSTim Tautges 
314aa768e4cSTim Tautges   Output Parameter:
3155eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab
3165eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition
317aa768e4cSTim Tautges 
318aa768e4cSTim Tautges   Level: beginner
319aa768e4cSTim Tautges 
320aa768e4cSTim Tautges .keywords: DMMoab, create
321aa768e4cSTim Tautges @*/
322351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,const moab::Range **owned,const moab::Range **ghost)
3231d72bce8STim Tautges {
3241d72bce8STim Tautges   PetscFunctionBegin;
3251d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
326351b8a77SVijay Mahadevan   if (owned) *owned = ((DM_Moab*)dm->data)->vowned;
327351b8a77SVijay Mahadevan   if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost;
3281d72bce8STim Tautges   PetscFunctionReturn(0);
3291d72bce8STim Tautges }
3301d72bce8STim Tautges 
3311d72bce8STim Tautges #undef __FUNCT__
3325eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements"
3335eb88e9dSVijay Mahadevan /*@
3345eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
3355eb88e9dSVijay Mahadevan 
3365eb88e9dSVijay Mahadevan   Collective on MPI_Comm
3375eb88e9dSVijay Mahadevan 
3385eb88e9dSVijay Mahadevan   Input Parameter:
3395eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
3405eb88e9dSVijay Mahadevan 
3415eb88e9dSVijay Mahadevan   Output Parameter:
3425eb88e9dSVijay Mahadevan . range - The entities owned locally
3435eb88e9dSVijay Mahadevan 
3445eb88e9dSVijay Mahadevan   Level: beginner
3455eb88e9dSVijay Mahadevan 
3465eb88e9dSVijay Mahadevan .keywords: DMMoab, create
3475eb88e9dSVijay Mahadevan @*/
348351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,const moab::Range **range)
3495eb88e9dSVijay Mahadevan {
3505eb88e9dSVijay Mahadevan   PetscFunctionBegin;
3515eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
352351b8a77SVijay Mahadevan   if (range) *range = ((DM_Moab*)dm->data)->elocal;
3531cec0304SVijay Mahadevan   PetscFunctionReturn(0);
3541cec0304SVijay Mahadevan }
3551cec0304SVijay Mahadevan 
3561cec0304SVijay Mahadevan 
3571cec0304SVijay Mahadevan #undef __FUNCT__
3581cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements"
3591cec0304SVijay Mahadevan /*@
3601cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
3611cec0304SVijay Mahadevan 
3621cec0304SVijay Mahadevan   Collective on MPI_Comm
3631cec0304SVijay Mahadevan 
3641cec0304SVijay Mahadevan   Input Parameter:
3651cec0304SVijay Mahadevan . dm    - The DMMoab object being set
3661cec0304SVijay Mahadevan . range - The entities treated by this DMMoab
3671cec0304SVijay Mahadevan 
3681cec0304SVijay Mahadevan   Level: beginner
3691cec0304SVijay Mahadevan 
3701cec0304SVijay Mahadevan .keywords: DMMoab, create
3711cec0304SVijay Mahadevan @*/
3721cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range)
3731cec0304SVijay Mahadevan {
3741cec0304SVijay Mahadevan   moab::ErrorCode merr;
3751cec0304SVijay Mahadevan   PetscErrorCode  ierr;
3761cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
3771cec0304SVijay Mahadevan 
3781cec0304SVijay Mahadevan   PetscFunctionBegin;
3791cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3801cec0304SVijay Mahadevan   dmmoab->elocal->clear();
3811cec0304SVijay Mahadevan   dmmoab->eghost->clear();
3821cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
3831cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
3841cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
3851cec0304SVijay Mahadevan   dmmoab->neleloc=dmmoab->elocal->size();
38641dd5348SVijay Mahadevan   dmmoab->neleghost=dmmoab->eghost->size();
3871cec0304SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
3888cbae1a6SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele);
3895eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
3905eb88e9dSVijay Mahadevan }
3915eb88e9dSVijay Mahadevan 
3925eb88e9dSVijay Mahadevan 
3935eb88e9dSVijay Mahadevan #undef __FUNCT__
3941d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag"
395aa768e4cSTim Tautges /*@
396aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
397aa768e4cSTim Tautges 
398aa768e4cSTim Tautges   Collective on MPI_Comm
399aa768e4cSTim Tautges 
400aa768e4cSTim Tautges   Input Parameter:
401aa768e4cSTim Tautges . dm      - The DMMoab object being set
402aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
403aa768e4cSTim Tautges 
404aa768e4cSTim Tautges   Level: beginner
405aa768e4cSTim Tautges 
406aa768e4cSTim Tautges .keywords: DMMoab, create
407aa768e4cSTim Tautges @*/
4081d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
4091d72bce8STim Tautges {
4101d72bce8STim Tautges   PetscFunctionBegin;
4111d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4121d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
4131d72bce8STim Tautges   PetscFunctionReturn(0);
4141d72bce8STim Tautges }
4151d72bce8STim Tautges 
4161d72bce8STim Tautges 
4171d72bce8STim Tautges #undef __FUNCT__
4181d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag"
419aa768e4cSTim Tautges /*@
420aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
421aa768e4cSTim Tautges 
422aa768e4cSTim Tautges   Collective on MPI_Comm
423aa768e4cSTim Tautges 
424aa768e4cSTim Tautges   Input Parameter:
425aa768e4cSTim Tautges . dm      - The DMMoab object being set
426aa768e4cSTim Tautges 
427aa768e4cSTim Tautges   Output Parameter:
428aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
429aa768e4cSTim Tautges 
430aa768e4cSTim Tautges   Level: beginner
431aa768e4cSTim Tautges 
432aa768e4cSTim Tautges .keywords: DMMoab, create
433aa768e4cSTim Tautges @*/
4341d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
4351d72bce8STim Tautges {
4361d72bce8STim Tautges   PetscFunctionBegin;
4371d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4381d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
4391d72bce8STim Tautges   PetscFunctionReturn(0);
4401d72bce8STim Tautges }
4411d72bce8STim Tautges 
4421d72bce8STim Tautges 
4431d72bce8STim Tautges #undef __FUNCT__
4441d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize"
445aa768e4cSTim Tautges /*@
446aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
447aa768e4cSTim Tautges 
448aa768e4cSTim Tautges   Collective on MPI_Comm
449aa768e4cSTim Tautges 
450aa768e4cSTim Tautges   Input Parameter:
451aa768e4cSTim Tautges . dm - The DMMoab object being set
452aa768e4cSTim Tautges . bs - The block size used with this DMMoab
453aa768e4cSTim Tautges 
454aa768e4cSTim Tautges   Level: beginner
455aa768e4cSTim Tautges 
456aa768e4cSTim Tautges .keywords: DMMoab, create
457aa768e4cSTim Tautges @*/
4581d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
4591d72bce8STim Tautges {
4601d72bce8STim Tautges   PetscFunctionBegin;
4611d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4621d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
4631d72bce8STim Tautges   PetscFunctionReturn(0);
4641d72bce8STim Tautges }
4651d72bce8STim Tautges 
4661d72bce8STim Tautges 
4671d72bce8STim Tautges #undef __FUNCT__
4681d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize"
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 
4931cec0304SVijay Mahadevan #undef __FUNCT__
494212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetSize"
495212ad6d1SVijay Mahadevan /*@
496212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
497212ad6d1SVijay Mahadevan 
49800cc10feSVijay Mahadevan   Collective on DM
499212ad6d1SVijay Mahadevan 
500212ad6d1SVijay Mahadevan   Input Parameter:
501212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
502212ad6d1SVijay Mahadevan 
503212ad6d1SVijay Mahadevan   Output Parameter:
50400cc10feSVijay Mahadevan . neg - The number of global elements in the DMMoab instance
50500cc10feSVijay Mahadevan . nvg - The number of global vertices in the DMMoab instance
506212ad6d1SVijay Mahadevan 
507212ad6d1SVijay Mahadevan   Level: beginner
508212ad6d1SVijay Mahadevan 
509212ad6d1SVijay Mahadevan .keywords: DMMoab, create
510212ad6d1SVijay Mahadevan @*/
51141dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *neg,PetscInt *nvg)
512212ad6d1SVijay Mahadevan {
513212ad6d1SVijay Mahadevan   PetscFunctionBegin;
514212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
51541dd5348SVijay Mahadevan   if(neg) *neg = ((DM_Moab*)dm->data)->nele;
51641dd5348SVijay Mahadevan   if(nvg) *nvg = ((DM_Moab*)dm->data)->n;
517212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
518212ad6d1SVijay Mahadevan }
519212ad6d1SVijay Mahadevan 
520212ad6d1SVijay Mahadevan 
521212ad6d1SVijay Mahadevan #undef __FUNCT__
522212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalSize"
523212ad6d1SVijay Mahadevan /*@
524212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
525212ad6d1SVijay Mahadevan 
52600cc10feSVijay Mahadevan   Collective on DM
527212ad6d1SVijay Mahadevan 
528212ad6d1SVijay Mahadevan   Input Parameter:
529212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
530212ad6d1SVijay Mahadevan 
531212ad6d1SVijay Mahadevan   Output Parameter:
53200cc10feSVijay Mahadevan . nel - The number of owned elements in this processor
53300cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor
53400cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor
53500cc10feSVijay Mahadevan . nvg - The number of ghosted vertices in this processor
536212ad6d1SVijay Mahadevan 
537212ad6d1SVijay Mahadevan   Level: beginner
538212ad6d1SVijay Mahadevan 
539212ad6d1SVijay Mahadevan .keywords: DMMoab, create
540212ad6d1SVijay Mahadevan @*/
54141dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nel,PetscInt *neg,PetscInt *nvl,PetscInt *nvg)
542212ad6d1SVijay Mahadevan {
543212ad6d1SVijay Mahadevan   PetscFunctionBegin;
544212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
54541dd5348SVijay Mahadevan   if(nel) *nel = ((DM_Moab*)dm->data)->neleloc;
54641dd5348SVijay Mahadevan   if(neg) *neg = ((DM_Moab*)dm->data)->neleghost;
54741dd5348SVijay Mahadevan   if(nvl) *nvl = ((DM_Moab*)dm->data)->nloc;
54841dd5348SVijay Mahadevan   if(nvg) *nvg = ((DM_Moab*)dm->data)->nghost;
549212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
550212ad6d1SVijay Mahadevan }
551212ad6d1SVijay Mahadevan 
552212ad6d1SVijay Mahadevan 
553212ad6d1SVijay Mahadevan #undef __FUNCT__
55400cc10feSVijay Mahadevan #define __FUNCT__ "DMMoabGetOffset"
55500cc10feSVijay Mahadevan /*@
55600cc10feSVijay Mahadevan   DMMoabGetOffset - Get the local offset for the global vector
55700cc10feSVijay Mahadevan 
55800cc10feSVijay Mahadevan   Collective on MPI_Comm
55900cc10feSVijay Mahadevan 
56000cc10feSVijay Mahadevan   Input Parameter:
56100cc10feSVijay Mahadevan . dm - The DMMoab object being set
56200cc10feSVijay Mahadevan 
56300cc10feSVijay Mahadevan   Output Parameter:
56400cc10feSVijay Mahadevan . offset - The local offset for the global vector
56500cc10feSVijay Mahadevan 
56600cc10feSVijay Mahadevan   Level: beginner
56700cc10feSVijay Mahadevan 
56800cc10feSVijay Mahadevan .keywords: DMMoab, create
56900cc10feSVijay Mahadevan @*/
57000cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm,PetscInt *offset)
57100cc10feSVijay Mahadevan {
57200cc10feSVijay Mahadevan   PetscFunctionBegin;
57300cc10feSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
57400cc10feSVijay Mahadevan   *offset = ((DM_Moab*)dm->data)->vstart;
57500cc10feSVijay Mahadevan   PetscFunctionReturn(0);
57600cc10feSVijay Mahadevan }
57700cc10feSVijay Mahadevan 
57800cc10feSVijay Mahadevan 
57900cc10feSVijay Mahadevan #undef __FUNCT__
5804920ab11SVijay Mahadevan #define __FUNCT__ "DMMoabGetDimension"
5814920ab11SVijay Mahadevan /*@
5824920ab11SVijay Mahadevan   DMMoabGetDimension - Get the dimension of the DM Mesh
5834920ab11SVijay Mahadevan 
5844920ab11SVijay Mahadevan   Collective on MPI_Comm
5854920ab11SVijay Mahadevan 
5864920ab11SVijay Mahadevan   Input Parameter:
5874920ab11SVijay Mahadevan . dm - The DMMoab object being set
5884920ab11SVijay Mahadevan 
5894920ab11SVijay Mahadevan   Output Parameter:
5904920ab11SVijay Mahadevan . dim - The dimension of DM
5914920ab11SVijay Mahadevan 
5924920ab11SVijay Mahadevan   Level: beginner
5934920ab11SVijay Mahadevan 
5944920ab11SVijay Mahadevan .keywords: DMMoab, create
5954920ab11SVijay Mahadevan @*/
5964920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim)
5974920ab11SVijay Mahadevan {
5984920ab11SVijay Mahadevan   PetscFunctionBegin;
5994920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6004920ab11SVijay Mahadevan   *dim = ((DM_Moab*)dm->data)->dim;
6014920ab11SVijay Mahadevan   PetscFunctionReturn(0);
6024920ab11SVijay Mahadevan }
6034920ab11SVijay Mahadevan 
6044920ab11SVijay Mahadevan 
6054920ab11SVijay Mahadevan 
6064920ab11SVijay Mahadevan #undef __FUNCT__
6077023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates"
6087023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos)
6097023aa44SVijay Mahadevan {
6107023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
6117023aa44SVijay Mahadevan   PetscErrorCode  ierr;
6127023aa44SVijay Mahadevan   moab::ErrorCode merr;
6137023aa44SVijay Mahadevan 
6147023aa44SVijay Mahadevan   PetscFunctionBegin;
6157023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6167023aa44SVijay Mahadevan   PetscValidPointer(conn,3);
6177023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6187023aa44SVijay Mahadevan 
6197023aa44SVijay Mahadevan   if (!vpos) {
6207023aa44SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr);
6217023aa44SVijay Mahadevan   }
6227023aa44SVijay Mahadevan 
6237023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
6247023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
6257023aa44SVijay Mahadevan   PetscFunctionReturn(0);
6267023aa44SVijay Mahadevan }
6277023aa44SVijay Mahadevan 
6287023aa44SVijay Mahadevan 
6297023aa44SVijay Mahadevan #undef __FUNCT__
6308d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexConnectivity"
6318d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
6328d8d51c8SVijay Mahadevan {
6338d8d51c8SVijay Mahadevan   DM_Moab        *dmmoab;
6348d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities,connect;
6358d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
6368d8d51c8SVijay Mahadevan   moab::ErrorCode merr;
6378d8d51c8SVijay Mahadevan 
6388d8d51c8SVijay Mahadevan   PetscFunctionBegin;
6398d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6408d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
6418d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6428d8d51c8SVijay Mahadevan 
6438d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
6448d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_adjacencies(&ehandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr);
6458d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr);
6468d8d51c8SVijay Mahadevan 
6478d8d51c8SVijay Mahadevan   if (conn) {
6488d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr);
6498d8d51c8SVijay Mahadevan     ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr);
6508d8d51c8SVijay Mahadevan   }
6518d8d51c8SVijay Mahadevan   if (nconn) *nconn=connect.size();
6528d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
6538d8d51c8SVijay Mahadevan }
6548d8d51c8SVijay Mahadevan 
6558d8d51c8SVijay Mahadevan 
6568d8d51c8SVijay Mahadevan #undef __FUNCT__
6578d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabRestoreVertexConnectivity"
6588d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
6598d8d51c8SVijay Mahadevan {
6608d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
6618d8d51c8SVijay Mahadevan 
6628d8d51c8SVijay Mahadevan   PetscFunctionBegin;
6638d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6648d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
6658d8d51c8SVijay Mahadevan 
6668d8d51c8SVijay Mahadevan   if (conn) {
6678d8d51c8SVijay Mahadevan     ierr = PetscFree(*conn);CHKERRQ(ierr);
6688d8d51c8SVijay Mahadevan   }
6698d8d51c8SVijay Mahadevan   if (nconn) *nconn=0;
6708d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
6718d8d51c8SVijay Mahadevan }
6728d8d51c8SVijay Mahadevan 
6738d8d51c8SVijay Mahadevan 
6748d8d51c8SVijay Mahadevan 
6758d8d51c8SVijay Mahadevan #undef __FUNCT__
6767023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity"
6777023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn)
6787023aa44SVijay Mahadevan {
6797023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
6807023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
6817023aa44SVijay Mahadevan   moab::ErrorCode merr;
6827023aa44SVijay Mahadevan   PetscInt nnodes;
6837023aa44SVijay Mahadevan 
6847023aa44SVijay Mahadevan   PetscFunctionBegin;
6857023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6867023aa44SVijay Mahadevan   PetscValidPointer(conn,4);
6877023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6887023aa44SVijay Mahadevan 
6897023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
6907023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr);
6917023aa44SVijay Mahadevan   if (conn) *conn=connect;
6927023aa44SVijay Mahadevan   if (nconn) *nconn=nnodes;
6937023aa44SVijay Mahadevan   PetscFunctionReturn(0);
6947023aa44SVijay Mahadevan }
6957023aa44SVijay Mahadevan 
6967023aa44SVijay Mahadevan 
6977023aa44SVijay Mahadevan #undef __FUNCT__
69869263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary"
69969263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary)
70069263071SVijay Mahadevan {
70169263071SVijay Mahadevan   moab::EntityType etype;
70269263071SVijay Mahadevan   DM_Moab         *dmmoab;
70369263071SVijay Mahadevan   PetscInt         edim;
70469263071SVijay Mahadevan 
70569263071SVijay Mahadevan   PetscFunctionBegin;
70669263071SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
70769263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary,3);
70869263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
70969263071SVijay Mahadevan 
71069263071SVijay Mahadevan   /* get the entity type and handle accordingly */
71169263071SVijay Mahadevan   etype=dmmoab->mbiface->type_from_handle(ent);
71269263071SVijay 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);
71369263071SVijay Mahadevan 
71469263071SVijay Mahadevan   /* get the entity dimension */
71569263071SVijay Mahadevan   edim=dmmoab->mbiface->dimension_from_handle(ent);
71669263071SVijay Mahadevan 
71769263071SVijay Mahadevan   *ent_on_boundary=PETSC_FALSE;
71869263071SVijay Mahadevan   if(etype == moab::MBVERTEX && edim == 0) {
7196d9eb265SVijay Mahadevan     if (dmmoab->bndyvtx->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
72069263071SVijay Mahadevan   }
72169263071SVijay Mahadevan   else {
72269263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
7236d9eb265SVijay Mahadevan       if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
72469263071SVijay Mahadevan     }
72569263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
7266d9eb265SVijay Mahadevan       if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
72769263071SVijay Mahadevan     }
72869263071SVijay Mahadevan   }
72969263071SVijay Mahadevan   PetscFunctionReturn(0);
73069263071SVijay Mahadevan }
73169263071SVijay Mahadevan 
73269263071SVijay Mahadevan 
73369263071SVijay Mahadevan #undef __FUNCT__
7347023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices"
73569263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx)
7367023aa44SVijay Mahadevan {
7377023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
7387023aa44SVijay Mahadevan   PetscInt       i;
7397023aa44SVijay Mahadevan 
7407023aa44SVijay Mahadevan   PetscFunctionBegin;
7417023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7427023aa44SVijay Mahadevan   PetscValidPointer(cnt,3);
7437023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx,4);
7447023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7457023aa44SVijay Mahadevan 
7467023aa44SVijay Mahadevan   for (i=0; i < nconn; ++i) {
7476d9eb265SVijay Mahadevan     isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE);
7487023aa44SVijay Mahadevan   }
7497023aa44SVijay Mahadevan   PetscFunctionReturn(0);
7507023aa44SVijay Mahadevan }
7517023aa44SVijay Mahadevan 
7527023aa44SVijay Mahadevan 
7537023aa44SVijay Mahadevan #undef __FUNCT__
7540c8a2322SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryMarkers"
7556d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces)
7561cec0304SVijay Mahadevan {
7571cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
7581cec0304SVijay Mahadevan 
7591cec0304SVijay Mahadevan   PetscFunctionBegin;
7601cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7611cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7621cec0304SVijay Mahadevan 
7636d9eb265SVijay Mahadevan   if (bdvtx)  *bdvtx = dmmoab->bndyvtx;
7646d9eb265SVijay Mahadevan   if (bdfaces)  *bdfaces = dmmoab->bndyfaces;
7656d9eb265SVijay Mahadevan   if (bdelems)  *bdfaces = dmmoab->bndyelems;
7661cec0304SVijay Mahadevan   PetscFunctionReturn(0);
7671cec0304SVijay Mahadevan }
7681cec0304SVijay Mahadevan 
769*f6829af0SVijay Mahadevan 
770*f6829af0SVijay Mahadevan #undef __FUNCT__
771*f6829af0SVijay Mahadevan #define __FUNCT__ "DMDestroy_Moab"
772*f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm)
773*f6829af0SVijay Mahadevan {
774*f6829af0SVijay Mahadevan   PetscErrorCode ierr;
775*f6829af0SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
776*f6829af0SVijay Mahadevan 
777*f6829af0SVijay Mahadevan   PetscFunctionBegin;
778*f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
779*f6829af0SVijay Mahadevan   if (dmmoab->icreatedinstance) {
780*f6829af0SVijay Mahadevan     delete dmmoab->mbiface;
781*f6829af0SVijay Mahadevan   }
782*f6829af0SVijay Mahadevan   dmmoab->mbiface = NULL;
783*f6829af0SVijay Mahadevan   dmmoab->pcomm = NULL;
784*f6829af0SVijay Mahadevan   delete dmmoab->vlocal;
785*f6829af0SVijay Mahadevan   delete dmmoab->vowned;
786*f6829af0SVijay Mahadevan   delete dmmoab->vghost;
787*f6829af0SVijay Mahadevan   delete dmmoab->elocal;
788*f6829af0SVijay Mahadevan   delete dmmoab->eghost;
789*f6829af0SVijay Mahadevan   delete dmmoab->bndyvtx;
790*f6829af0SVijay Mahadevan   delete dmmoab->bndyfaces;
791*f6829af0SVijay Mahadevan   delete dmmoab->bndyelems;
792*f6829af0SVijay Mahadevan 
793*f6829af0SVijay Mahadevan   ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr);
794*f6829af0SVijay Mahadevan   ierr = PetscFree(dmmoab->lidmap);CHKERRQ(ierr);
795*f6829af0SVijay Mahadevan   ierr = PetscFree(dmmoab->gidmap);CHKERRQ(ierr);
796*f6829af0SVijay Mahadevan   ierr = PetscFree(dmmoab->llmap);CHKERRQ(ierr);
797*f6829af0SVijay Mahadevan   ierr = PetscFree(dmmoab->lgmap);CHKERRQ(ierr);
798*f6829af0SVijay Mahadevan   ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
799*f6829af0SVijay Mahadevan   ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr);
800*f6829af0SVijay Mahadevan   ierr = PetscFree(dm->data);CHKERRQ(ierr);
801*f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
802*f6829af0SVijay Mahadevan }
803*f6829af0SVijay Mahadevan 
804*f6829af0SVijay Mahadevan 
805*f6829af0SVijay Mahadevan #undef __FUNCT__
806*f6829af0SVijay Mahadevan #define __FUNCT__ "DMSetUp_Moab"
807*f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm)
808*f6829af0SVijay Mahadevan {
809*f6829af0SVijay Mahadevan   PetscErrorCode          ierr;
810*f6829af0SVijay Mahadevan   moab::ErrorCode         merr;
811*f6829af0SVijay Mahadevan   Vec                     local, global;
812*f6829af0SVijay Mahadevan   IS                      from,to;
813*f6829af0SVijay Mahadevan   moab::Range::iterator   iter;
814*f6829af0SVijay Mahadevan   PetscInt                i,j,f,bs,gmin,lmin,lmax,vent,totsize;
815*f6829af0SVijay Mahadevan   DM_Moab                *dmmoab = (DM_Moab*)dm->data;
816*f6829af0SVijay Mahadevan   moab::Range             adjs;
817*f6829af0SVijay Mahadevan 
818*f6829af0SVijay Mahadevan   PetscFunctionBegin;
819*f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
820*f6829af0SVijay Mahadevan   /* Get the local and shared vertices and cache it */
821*f6829af0SVijay 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.");
822*f6829af0SVijay Mahadevan 
823*f6829af0SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
824*f6829af0SVijay Mahadevan   if (dmmoab->vlocal->empty())
825*f6829af0SVijay Mahadevan   {
826*f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
827*f6829af0SVijay Mahadevan 
828*f6829af0SVijay Mahadevan     /* filter based on parallel status */
829*f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
830*f6829af0SVijay Mahadevan 
831*f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
832*f6829af0SVijay Mahadevan     adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
833*f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
834*f6829af0SVijay Mahadevan     adjs = moab::subtract(adjs, *dmmoab->vghost);
835*f6829af0SVijay Mahadevan     *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs);
836*f6829af0SVijay Mahadevan 
837*f6829af0SVijay Mahadevan     /* compute and cache the sizes of local and ghosted entities */
838*f6829af0SVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
839*f6829af0SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
840*f6829af0SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
841*f6829af0SVijay Mahadevan   }
842*f6829af0SVijay Mahadevan 
843*f6829af0SVijay Mahadevan   {
844*f6829af0SVijay Mahadevan     /* get the information about the local elements in the mesh */
845*f6829af0SVijay Mahadevan     dmmoab->eghost->clear();
846*f6829af0SVijay Mahadevan 
847*f6829af0SVijay Mahadevan     /* first decipher the leading dimension */
848*f6829af0SVijay Mahadevan     for (i=3;i>0;i--) {
849*f6829af0SVijay Mahadevan       dmmoab->elocal->clear();
850*f6829af0SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr);
851*f6829af0SVijay Mahadevan 
852*f6829af0SVijay Mahadevan       /* store the current mesh dimension */
853*f6829af0SVijay Mahadevan       if (dmmoab->elocal->size()) {
854*f6829af0SVijay Mahadevan         dmmoab->dim=i;
855*f6829af0SVijay Mahadevan         break;
856*f6829af0SVijay Mahadevan       }
857*f6829af0SVijay Mahadevan     }
858*f6829af0SVijay Mahadevan 
859*f6829af0SVijay Mahadevan     /* filter the ghosted and owned element list */
860*f6829af0SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
861*f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
862*f6829af0SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
863*f6829af0SVijay Mahadevan 
864*f6829af0SVijay Mahadevan     dmmoab->neleloc = dmmoab->elocal->size();
865*f6829af0SVijay Mahadevan     dmmoab->neleghost = dmmoab->eghost->size();
866*f6829af0SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
867*f6829af0SVijay Mahadevan   }
868*f6829af0SVijay Mahadevan 
869*f6829af0SVijay Mahadevan   bs = dmmoab->bs;
870*f6829af0SVijay Mahadevan   if (!dmmoab->ltog_tag) {
871*f6829af0SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
872*f6829af0SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
873*f6829af0SVijay Mahadevan        assemble the individual pieces of the mesh */
874*f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
875*f6829af0SVijay Mahadevan   }
876*f6829af0SVijay Mahadevan 
877*f6829af0SVijay Mahadevan   totsize=dmmoab->vlocal->size();
878*f6829af0SVijay 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);
879*f6829af0SVijay Mahadevan   ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->gsindices);CHKERRQ(ierr);
880*f6829af0SVijay Mahadevan   {
881*f6829af0SVijay Mahadevan     /* first get the local indices */
882*f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr);
883*f6829af0SVijay Mahadevan     /* next get the ghosted indices */
884*f6829af0SVijay Mahadevan     if (dmmoab->nghost) {
885*f6829af0SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr);
886*f6829af0SVijay Mahadevan     }
887*f6829af0SVijay Mahadevan 
888*f6829af0SVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
889*f6829af0SVijay Mahadevan     lmin=lmax=dmmoab->gsindices[0];
890*f6829af0SVijay Mahadevan     for (i=0; i<totsize; ++i) {
891*f6829af0SVijay Mahadevan       if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i];
892*f6829af0SVijay Mahadevan       if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i];
893*f6829af0SVijay Mahadevan     }
894*f6829af0SVijay Mahadevan 
895*f6829af0SVijay Mahadevan     ierr = MPI_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr);
896*f6829af0SVijay Mahadevan 
897*f6829af0SVijay Mahadevan     /* set the GID map */
898*f6829af0SVijay Mahadevan     for (i=0; i<totsize; ++i) {
899*f6829af0SVijay Mahadevan       dmmoab->gsindices[i]-=gmin;   /* zero based index needed for IS */
900*f6829af0SVijay Mahadevan     }
901*f6829af0SVijay Mahadevan     lmin-=gmin;
902*f6829af0SVijay Mahadevan     lmax-=gmin;
903*f6829af0SVijay Mahadevan 
904*f6829af0SVijay Mahadevan     PetscInfo3(NULL, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin);
905*f6829af0SVijay Mahadevan   }
906*f6829af0SVijay Mahadevan 
907*f6829af0SVijay Mahadevan   {
908*f6829af0SVijay Mahadevan     ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->gidmap);CHKERRQ(ierr);
909*f6829af0SVijay Mahadevan     ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->lidmap);CHKERRQ(ierr);
910*f6829af0SVijay Mahadevan     ierr = PetscMalloc(totsize*dmmoab->numFields*sizeof(PetscInt), &dmmoab->llmap);CHKERRQ(ierr);
911*f6829af0SVijay Mahadevan     ierr = PetscMalloc(totsize*dmmoab->numFields*sizeof(PetscInt), &dmmoab->lgmap);CHKERRQ(ierr);
912*f6829af0SVijay Mahadevan 
913*f6829af0SVijay Mahadevan     i=j=0;
914*f6829af0SVijay Mahadevan     /* set the owned vertex data first */
915*f6829af0SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) {
916*f6829af0SVijay Mahadevan       vent=(PetscInt)(*iter);
917*f6829af0SVijay Mahadevan       dmmoab->gidmap[vent]=dmmoab->gsindices[i];
918*f6829af0SVijay Mahadevan       dmmoab->lidmap[vent]=i;
919*f6829af0SVijay Mahadevan       if (bs > 1) {
920*f6829af0SVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
921*f6829af0SVijay Mahadevan           dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f;
922*f6829af0SVijay Mahadevan           dmmoab->llmap[j]=i*dmmoab->numFields+f;
923*f6829af0SVijay Mahadevan         }
924*f6829af0SVijay Mahadevan       }
925*f6829af0SVijay Mahadevan       else {
926*f6829af0SVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
927*f6829af0SVijay Mahadevan           dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i];
928*f6829af0SVijay Mahadevan           dmmoab->llmap[j]=totsize*f+i;
929*f6829af0SVijay Mahadevan         }
930*f6829af0SVijay Mahadevan       }
931*f6829af0SVijay Mahadevan     }
932*f6829af0SVijay Mahadevan     /* next arrange all the ghosted data information */
933*f6829af0SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) {
934*f6829af0SVijay Mahadevan       vent=(PetscInt)(*iter);
935*f6829af0SVijay Mahadevan       dmmoab->gidmap[vent]=dmmoab->gsindices[i];
936*f6829af0SVijay Mahadevan       dmmoab->lidmap[vent]=i;
937*f6829af0SVijay Mahadevan       if (bs > 1) {
938*f6829af0SVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
939*f6829af0SVijay Mahadevan           dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f;
940*f6829af0SVijay Mahadevan           dmmoab->llmap[j]=i*dmmoab->numFields+f;
941*f6829af0SVijay Mahadevan         }
942*f6829af0SVijay Mahadevan       }
943*f6829af0SVijay Mahadevan       else {
944*f6829af0SVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
945*f6829af0SVijay Mahadevan           dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i];
946*f6829af0SVijay Mahadevan           dmmoab->llmap[j]=totsize*f+i;
947*f6829af0SVijay Mahadevan         }
948*f6829af0SVijay Mahadevan       }
949*f6829af0SVijay Mahadevan     }
950*f6829af0SVijay Mahadevan 
951*f6829af0SVijay Mahadevan     /* We need to create the Global to Local Vector Scatter Contexts
952*f6829af0SVijay Mahadevan        1) First create a local and global vector
953*f6829af0SVijay Mahadevan        2) Create a local and global IS
954*f6829af0SVijay Mahadevan        3) Create VecScatter and LtoGMapping objects
955*f6829af0SVijay Mahadevan        4) Cleanup the IS and Vec objects
956*f6829af0SVijay Mahadevan     */
957*f6829af0SVijay Mahadevan     ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr);
958*f6829af0SVijay Mahadevan     ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr);
959*f6829af0SVijay Mahadevan 
960*f6829af0SVijay Mahadevan     ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr);
961*f6829af0SVijay Mahadevan     PetscInfo3(NULL, "Total-size = %D\t Owned = %D, Ghosted = %D.\n", totsize, dmmoab->nloc, dmmoab->nghost);
962*f6829af0SVijay Mahadevan 
963*f6829af0SVijay Mahadevan     /* global to local must retrieve ghost points */
964*f6829af0SVijay Mahadevan     ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,dmmoab->vstart,1,&from);CHKERRQ(ierr);
965*f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr);
966*f6829af0SVijay Mahadevan 
967*f6829af0SVijay Mahadevan     ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,&dmmoab->lgmap[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr);
968*f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(to,bs);CHKERRQ(ierr);
969*f6829af0SVijay Mahadevan 
970*f6829af0SVijay Mahadevan     if (!dmmoab->ltog_map) {
971*f6829af0SVijay Mahadevan       /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */
972*f6829af0SVijay Mahadevan       ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,totsize*dmmoab->numFields,dmmoab->lgmap,
973*f6829af0SVijay Mahadevan                                           PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr);
974*f6829af0SVijay Mahadevan     }
975*f6829af0SVijay Mahadevan 
976*f6829af0SVijay Mahadevan     /* now create the scatter object from local to global vector */
977*f6829af0SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
978*f6829af0SVijay Mahadevan 
979*f6829af0SVijay Mahadevan     /* clean up IS, Vec */
980*f6829af0SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
981*f6829af0SVijay Mahadevan     ierr = ISDestroy(&to);CHKERRQ(ierr);
982*f6829af0SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
983*f6829af0SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
984*f6829af0SVijay Mahadevan   }
985*f6829af0SVijay Mahadevan 
986*f6829af0SVijay Mahadevan   /* skin the boundary and store nodes */
987*f6829af0SVijay Mahadevan   {
988*f6829af0SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
989*f6829af0SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
990*f6829af0SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
991*f6829af0SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
992*f6829af0SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
993*f6829af0SVijay Mahadevan 
994*f6829af0SVijay Mahadevan     dmmoab->bndyvtx = new moab::Range();
995*f6829af0SVijay Mahadevan     dmmoab->bndyfaces = new moab::Range();
996*f6829af0SVijay Mahadevan     dmmoab->bndyelems = new moab::Range();
997*f6829af0SVijay Mahadevan 
998*f6829af0SVijay Mahadevan     /* get the entities on the skin - only the faces */
999*f6829af0SVijay 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
1000*f6829af0SVijay Mahadevan 
1001*f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
1002*f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
1003*f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr);
1004*f6829af0SVijay Mahadevan 
1005*f6829af0SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
1006*f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr);
1007*f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr);
1008*f6829af0SVijay Mahadevan     PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size());
1009*f6829af0SVijay Mahadevan   }
1010*f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1011*f6829af0SVijay Mahadevan }
1012*f6829af0SVijay Mahadevan 
1013*f6829af0SVijay Mahadevan 
1014*f6829af0SVijay Mahadevan #undef __FUNCT__
1015*f6829af0SVijay Mahadevan #define __FUNCT__ "DMCreate_Moab"
1016*f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
1017*f6829af0SVijay Mahadevan {
1018*f6829af0SVijay Mahadevan   PetscErrorCode ierr;
1019*f6829af0SVijay Mahadevan 
1020*f6829af0SVijay Mahadevan   PetscFunctionBegin;
1021*f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1022*f6829af0SVijay Mahadevan   ierr = PetscNewLog(dm,DM_Moab,&dm->data);CHKERRQ(ierr);
1023*f6829af0SVijay Mahadevan 
1024*f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
1025*f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->numFields = 1;
1026*f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
1027*f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
1028*f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
1029*f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
1030*f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
1031*f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleghost = 0;
1032*f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL;
1033*f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL;
1034*f6829af0SVijay Mahadevan 
1035*f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
1036*f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
1037*f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
1038*f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
1039*f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
1040*f6829af0SVijay Mahadevan 
1041*f6829af0SVijay Mahadevan   dm->ops->createglobalvector       = DMCreateGlobalVector_Moab;
1042*f6829af0SVijay Mahadevan   dm->ops->createlocalvector        = DMCreateLocalVector_Moab;
1043*f6829af0SVijay Mahadevan   dm->ops->creatematrix             = DMCreateMatrix_Moab;
1044*f6829af0SVijay Mahadevan   dm->ops->setup                    = DMSetUp_Moab;
1045*f6829af0SVijay Mahadevan   dm->ops->destroy                  = DMDestroy_Moab;
1046*f6829af0SVijay Mahadevan   dm->ops->globaltolocalbegin       = DMGlobalToLocalBegin_Moab;
1047*f6829af0SVijay Mahadevan   dm->ops->globaltolocalend         = DMGlobalToLocalEnd_Moab;
1048*f6829af0SVijay Mahadevan   dm->ops->localtoglobalbegin       = DMLocalToGlobalBegin_Moab;
1049*f6829af0SVijay Mahadevan   dm->ops->localtoglobalend         = DMLocalToGlobalEnd_Moab;
1050*f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1051*f6829af0SVijay Mahadevan }
1052*f6829af0SVijay Mahadevan 
1053