xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 6d9eb265be6640e8ae26236498f33716bac3fa23)
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 
7853cdec3SJed Brown #undef __FUNCT__
8853cdec3SJed Brown #define __FUNCT__ "DMDestroy_Moab"
9853cdec3SJed Brown PetscErrorCode DMDestroy_Moab(DM dm)
10853cdec3SJed Brown {
11853cdec3SJed Brown   PetscErrorCode ierr;
12032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
13853cdec3SJed Brown 
14853cdec3SJed Brown   PetscFunctionBegin;
15853cdec3SJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
16032b8ab6SVijay Mahadevan   if (dmmoab->icreatedinstance) {
17032b8ab6SVijay Mahadevan     delete dmmoab->mbiface;
18853cdec3SJed Brown   }
19032b8ab6SVijay Mahadevan   dmmoab->mbiface = NULL;
20032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
21032b8ab6SVijay Mahadevan   delete dmmoab->vlocal;
22032b8ab6SVijay Mahadevan   delete dmmoab->vowned;
23032b8ab6SVijay Mahadevan   delete dmmoab->vghost;
24032b8ab6SVijay Mahadevan   delete dmmoab->elocal;
25032b8ab6SVijay Mahadevan   delete dmmoab->eghost;
26*6d9eb265SVijay Mahadevan   delete dmmoab->bndyvtx;
27*6d9eb265SVijay Mahadevan   delete dmmoab->bndyfaces;
28*6d9eb265SVijay Mahadevan   delete dmmoab->bndyelems;
298d8d51c8SVijay Mahadevan 
30fc418013SVijay Mahadevan   ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr);
318cbae1a6SVijay Mahadevan   ierr = PetscFree(dmmoab->lidmap);CHKERRQ(ierr);
328cbae1a6SVijay Mahadevan   ierr = PetscFree(dmmoab->gidmap);CHKERRQ(ierr);
338cbae1a6SVijay Mahadevan   ierr = PetscFree(dmmoab->lmap);CHKERRQ(ierr);
348cbae1a6SVijay Mahadevan   ierr = PetscFree(dmmoab->lgmap);CHKERRQ(ierr);
35032b8ab6SVijay Mahadevan   ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
36032b8ab6SVijay Mahadevan   ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr);
37853cdec3SJed Brown   ierr = PetscFree(dm->data);CHKERRQ(ierr);
38853cdec3SJed Brown   PetscFunctionReturn(0);
39853cdec3SJed Brown }
40853cdec3SJed Brown 
41aa768e4cSTim Tautges #undef __FUNCT__
42032b8ab6SVijay Mahadevan #define __FUNCT__ "DMSetUp_Moab"
43032b8ab6SVijay Mahadevan PetscErrorCode DMSetUp_Moab(DM dm)
44032b8ab6SVijay Mahadevan {
45032b8ab6SVijay Mahadevan   PetscErrorCode          ierr;
46032b8ab6SVijay Mahadevan   moab::ErrorCode         merr;
47032b8ab6SVijay Mahadevan   Vec                     local, global;
488cbae1a6SVijay Mahadevan   IS                      from,to;
49032b8ab6SVijay Mahadevan   moab::Range::iterator   iter;
508cbae1a6SVijay Mahadevan   PetscInt                i,j,f,bs,gmin,lmin,lmax,totsize;
51032b8ab6SVijay Mahadevan   DM_Moab                *dmmoab = (DM_Moab*)dm->data;
528cbae1a6SVijay Mahadevan   moab::Range             adjs;
5369263071SVijay Mahadevan 
54032b8ab6SVijay Mahadevan   PetscFunctionBegin;
55032b8ab6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
56032b8ab6SVijay Mahadevan   /* Get the local and shared vertices and cache it */
57032b8ab6SVijay 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.");
58032b8ab6SVijay Mahadevan 
591cec0304SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
60fd3326ddSVijay Mahadevan   if (dmmoab->vlocal->empty())
618cbae1a6SVijay Mahadevan   {
621cec0304SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
63032b8ab6SVijay Mahadevan 
64032b8ab6SVijay Mahadevan     /* filter based on parallel status */
65fc418013SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
66032b8ab6SVijay Mahadevan 
67fd3326ddSVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
68fd3326ddSVijay Mahadevan     adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
69fd3326ddSVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
70fd3326ddSVijay Mahadevan     adjs = moab::subtract(adjs, *dmmoab->vghost);
71fd3326ddSVijay Mahadevan     *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs);
72fd3326ddSVijay Mahadevan 
73fd3326ddSVijay Mahadevan     /* compute and cache the sizes of local and ghosted entities */
74fd3326ddSVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
75fd3326ddSVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
76fd3326ddSVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
77fd3326ddSVijay Mahadevan 
78fd3326ddSVijay Mahadevan #if 0
79fd3326ddSVijay Mahadevan     if(dmmoab->pcomm->rank() || dmmoab->pcomm->size()==1) {
80fd3326ddSVijay Mahadevan       PetscPrintf(PETSC_COMM_SELF, "Vertices: global: %D, local: %D", dmmoab->n, dmmoab->nloc+dmmoab->nghost);
81fd3326ddSVijay Mahadevan       dmmoab->vlocal->print(0);
82fd3326ddSVijay Mahadevan       PetscPrintf(PETSC_COMM_SELF, "Vertices: owned: %D", dmmoab->nloc);
83fd3326ddSVijay Mahadevan       dmmoab->vowned->print(0);
84fd3326ddSVijay Mahadevan       PetscPrintf(PETSC_COMM_SELF, "Vertices: ghost: %D", dmmoab->nghost);
85fd3326ddSVijay Mahadevan       dmmoab->vghost->print(0);
86fd3326ddSVijay Mahadevan     }
87fd3326ddSVijay Mahadevan #endif
88fd3326ddSVijay Mahadevan   }
89fd3326ddSVijay Mahadevan 
90fd3326ddSVijay Mahadevan   {
91032b8ab6SVijay Mahadevan     /* get the information about the local elements in the mesh */
92032b8ab6SVijay Mahadevan     dmmoab->eghost->clear();
93fc418013SVijay Mahadevan 
94fc418013SVijay Mahadevan     /* first decipher the leading dimension */
95fc418013SVijay Mahadevan     for (i=3;i>0;i--) {
96fc418013SVijay Mahadevan       dmmoab->elocal->clear();
97fc418013SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr);
98fc418013SVijay Mahadevan 
99fc418013SVijay Mahadevan       /* store the current mesh dimension */
100fc418013SVijay Mahadevan       if (dmmoab->elocal->size()) {
101fc418013SVijay Mahadevan         dmmoab->dim=i;
102fc418013SVijay Mahadevan         break;
103fc418013SVijay Mahadevan       }
104fc418013SVijay Mahadevan     }
105fc418013SVijay Mahadevan 
1068cbae1a6SVijay Mahadevan     /* filter the ghosted and owned element list */
107032b8ab6SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
108032b8ab6SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
109032b8ab6SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
110032b8ab6SVijay Mahadevan 
111032b8ab6SVijay Mahadevan     dmmoab->neleloc = dmmoab->elocal->size();
112032b8ab6SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
113032b8ab6SVijay Mahadevan   }
114032b8ab6SVijay Mahadevan 
115032b8ab6SVijay Mahadevan   bs = dmmoab->bs;
116032b8ab6SVijay Mahadevan   if (!dmmoab->ltog_tag) {
117db66d124SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
118db66d124SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
119db66d124SVijay Mahadevan        assemble the individual pieces of the mesh */
120032b8ab6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
121032b8ab6SVijay Mahadevan   }
122032b8ab6SVijay Mahadevan 
123032b8ab6SVijay Mahadevan   totsize=dmmoab->vlocal->size();
1248cbae1a6SVijay 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);
125fc418013SVijay Mahadevan   ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->gsindices);CHKERRQ(ierr);
1261cec0304SVijay Mahadevan   {
127032b8ab6SVijay Mahadevan     /* first get the local indices */
128fc418013SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr);
1294a40b570SVijay Mahadevan     /* next get the ghosted indices */
130fc418013SVijay Mahadevan     if (dmmoab->nghost) {
131fc418013SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr);
1321cec0304SVijay Mahadevan     }
1336e40195eSVijay Mahadevan 
1346e40195eSVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
135eb9d2429SVijay Mahadevan     lmin=lmax=dmmoab->gsindices[0];
13669263071SVijay Mahadevan     for (i=0; i<totsize; ++i) {
137eb9d2429SVijay Mahadevan       if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i];
138eb9d2429SVijay Mahadevan       if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i];
139fc418013SVijay Mahadevan     }
1406e40195eSVijay Mahadevan 
141eb9d2429SVijay Mahadevan     ierr = MPI_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr);
142032b8ab6SVijay Mahadevan 
1438cbae1a6SVijay Mahadevan     /* set the GID map */
144fc418013SVijay Mahadevan     for (i=0; i<totsize; ++i) {
145eb9d2429SVijay Mahadevan       dmmoab->gsindices[i]-=gmin;   /* zero based index needed for IS */
146fc418013SVijay Mahadevan     }
147*6d9eb265SVijay Mahadevan     lmin-=gmin;
148*6d9eb265SVijay Mahadevan     lmax-=gmin;
149*6d9eb265SVijay Mahadevan 
150*6d9eb265SVijay Mahadevan     PetscInfo3(NULL, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin);
151*6d9eb265SVijay Mahadevan   }
152*6d9eb265SVijay Mahadevan 
153*6d9eb265SVijay Mahadevan   {
1548cbae1a6SVijay Mahadevan 
1558cbae1a6SVijay Mahadevan     ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->gidmap);CHKERRQ(ierr);
1568cbae1a6SVijay Mahadevan     ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->lidmap);CHKERRQ(ierr);
1578cbae1a6SVijay Mahadevan     ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->lmap);CHKERRQ(ierr);
1588cbae1a6SVijay Mahadevan     ierr = PetscMalloc(totsize*dmmoab->nfields*sizeof(PetscInt), &dmmoab->lgmap);CHKERRQ(ierr);
159*6d9eb265SVijay Mahadevan 
160*6d9eb265SVijay Mahadevan     i=j=0;
1618cbae1a6SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) {
1628cbae1a6SVijay Mahadevan       dmmoab->gidmap[(PetscInt)(*iter)]=dmmoab->gsindices[i];
1638cbae1a6SVijay Mahadevan       dmmoab->lidmap[(PetscInt)(*iter)]=i;
1648cbae1a6SVijay Mahadevan       dmmoab->lmap[i]=i;
165*6d9eb265SVijay Mahadevan       PetscInfo3(NULL, "Owned Vertex: %D   LID = %D \t GID = %D.\n", *iter, i, dmmoab->gsindices[i]);
1668cbae1a6SVijay Mahadevan       if (bs > 1)
1678cbae1a6SVijay Mahadevan         for (f=0;f<dmmoab->nfields;f++,j++)
1688cbae1a6SVijay Mahadevan           dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->nfields+f;
1698cbae1a6SVijay Mahadevan       else
1708cbae1a6SVijay Mahadevan         for (f=0;f<dmmoab->nfields;f++,j++)
1718cbae1a6SVijay Mahadevan           dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i];
1728cbae1a6SVijay Mahadevan     }
1738cbae1a6SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) {
1748cbae1a6SVijay Mahadevan       dmmoab->gidmap[(PetscInt)(*iter)]=dmmoab->gsindices[i];
1758cbae1a6SVijay Mahadevan       dmmoab->lidmap[(PetscInt)(*iter)]=i;
1768cbae1a6SVijay Mahadevan       dmmoab->lmap[i]=i;
177*6d9eb265SVijay Mahadevan       PetscInfo3(NULL, "Ghost Vertex: %D   LID = %D \t GID = %D.\n", *iter, i, dmmoab->gsindices[i]);
1788cbae1a6SVijay Mahadevan       if (bs > 1)
1798cbae1a6SVijay Mahadevan         for (f=0;f<dmmoab->nfields;f++,j++)
1808cbae1a6SVijay Mahadevan           dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->nfields+f;
1818cbae1a6SVijay Mahadevan       else
1828cbae1a6SVijay Mahadevan         for (f=0;f<dmmoab->nfields;f++,j++)
1838cbae1a6SVijay Mahadevan           dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i];
1848cbae1a6SVijay Mahadevan     }
1858cbae1a6SVijay Mahadevan 
186*6d9eb265SVijay Mahadevan     /* We need to create the Global to Local Vector Scatter Contexts
187*6d9eb265SVijay Mahadevan        1) First create a local and global vector
188*6d9eb265SVijay Mahadevan        2) Create a local and global IS
189*6d9eb265SVijay Mahadevan        3) Create VecScatter and LtoGMapping objects
190*6d9eb265SVijay Mahadevan        4) Cleanup the IS and Vec objects
191*6d9eb265SVijay Mahadevan     */
192*6d9eb265SVijay Mahadevan     ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr);
193*6d9eb265SVijay Mahadevan     ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr);
194*6d9eb265SVijay Mahadevan 
195*6d9eb265SVijay Mahadevan     ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr);
196*6d9eb265SVijay Mahadevan     PetscInfo3(NULL, "Total-size = %D\t Owned = %D, Ghosted = %D.\n", totsize, dmmoab->nloc, dmmoab->nghost);
197*6d9eb265SVijay Mahadevan 
1988cbae1a6SVijay Mahadevan     /* global to local must retrieve ghost points */
199*6d9eb265SVijay Mahadevan //    ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&dmmoab->lmap[0],PETSC_COPY_VALUES,&from);CHKERRQ(ierr);
200*6d9eb265SVijay Mahadevan //    ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&dmmoab->gsindices[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr);
201*6d9eb265SVijay Mahadevan 
202*6d9eb265SVijay Mahadevan //    ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,dmmoab->nghost,&dmmoab->lmap[dmmoab->nloc],PETSC_COPY_VALUES,&from);CHKERRQ(ierr);
203*6d9eb265SVijay Mahadevan //    ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&dmmoab->gsindices[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr);
204*6d9eb265SVijay Mahadevan 
205*6d9eb265SVijay Mahadevan 
206*6d9eb265SVijay Mahadevan     ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->nfields,dmmoab->vstart,1,&from);CHKERRQ(ierr);
207*6d9eb265SVijay Mahadevan     ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr);
208*6d9eb265SVijay Mahadevan 
209*6d9eb265SVijay Mahadevan     ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->nfields,&dmmoab->lgmap[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr);
210*6d9eb265SVijay Mahadevan     ierr = ISSetBlockSize(to,bs);CHKERRQ(ierr);
211*6d9eb265SVijay Mahadevan 
2128cbae1a6SVijay Mahadevan 
2138cbae1a6SVijay Mahadevan     if (!dmmoab->ltog_map) {
2148cbae1a6SVijay Mahadevan       /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */
2158cbae1a6SVijay Mahadevan       ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,totsize*dmmoab->nfields,dmmoab->lgmap,
2168cbae1a6SVijay Mahadevan                                           PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr);
2178cbae1a6SVijay Mahadevan     }
218fc418013SVijay Mahadevan 
2198cbae1a6SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
220*6d9eb265SVijay Mahadevan ///    ierr = VecScatterCreateToAll(global,&dmmoab->ltog_sendrecv,NULL);CHKERRQ(ierr);
221*6d9eb265SVijay Mahadevan //    PetscBarrier((PetscObject)dm);
222*6d9eb265SVijay Mahadevan //    VecScatterView(dmmoab->ltog_sendrecv,PETSC_VIEWER_STDOUT_SELF);
223*6d9eb265SVijay Mahadevan //    PetscBarrier((PetscObject)dm);
224032b8ab6SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
2258cbae1a6SVijay Mahadevan     ierr = ISDestroy(&to);CHKERRQ(ierr);
226032b8ab6SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
227032b8ab6SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
228032b8ab6SVijay Mahadevan   }
229032b8ab6SVijay Mahadevan 
2301cec0304SVijay Mahadevan   /* skin the boundary and store nodes */
2311cec0304SVijay Mahadevan   {
232eb9d2429SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
233eb9d2429SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
234eb9d2429SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
235eb9d2429SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
2361cec0304SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
237eb9d2429SVijay Mahadevan 
238*6d9eb265SVijay Mahadevan     dmmoab->bndyvtx = new moab::Range();
239*6d9eb265SVijay Mahadevan     dmmoab->bndyfaces = new moab::Range();
240*6d9eb265SVijay Mahadevan     dmmoab->bndyelems = new moab::Range();
241*6d9eb265SVijay Mahadevan 
242eb9d2429SVijay Mahadevan     /* get the entities on the skin - only the faces */
243*6d9eb265SVijay 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
244eb9d2429SVijay Mahadevan 
245eb9d2429SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
246*6d9eb265SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
247*6d9eb265SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr);
24869263071SVijay Mahadevan 
249eb9d2429SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
250*6d9eb265SVijay Mahadevan     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr);
251*6d9eb265SVijay Mahadevan     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr);
252*6d9eb265SVijay Mahadevan     PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size());
2531cec0304SVijay Mahadevan   }
254032b8ab6SVijay Mahadevan   PetscFunctionReturn(0);
255032b8ab6SVijay Mahadevan }
256032b8ab6SVijay Mahadevan 
2571cec0304SVijay Mahadevan 
258032b8ab6SVijay Mahadevan #undef __FUNCT__
259aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab"
260853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
261aa768e4cSTim Tautges {
262aa768e4cSTim Tautges   PetscErrorCode ierr;
263aa768e4cSTim Tautges 
264aa768e4cSTim Tautges   PetscFunctionBegin;
265aa768e4cSTim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
266032b8ab6SVijay Mahadevan   ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr);
267032b8ab6SVijay Mahadevan 
268032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
269324f1edfSVijay Mahadevan   ((DM_Moab*)dm->data)->nfields = 1;
270032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
271032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
272032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
273032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
274032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
275032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL;
276032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL;
277032b8ab6SVijay Mahadevan 
278032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
279032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
280032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
281032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
282032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
283aa768e4cSTim Tautges 
28497ea90e6SJed Brown   dm->ops->createglobalvector              = DMCreateGlobalVector_Moab;
28597ea90e6SJed Brown   dm->ops->createlocalvector               = DMCreateLocalVector_Moab;
286032b8ab6SVijay Mahadevan   dm->ops->creatematrix                    = DMCreateMatrix_Moab;
287032b8ab6SVijay Mahadevan   dm->ops->setup                           = DMSetUp_Moab;
28897ea90e6SJed Brown   dm->ops->destroy                         = DMDestroy_Moab;
289032b8ab6SVijay Mahadevan   dm->ops->globaltolocalbegin              = DMGlobalToLocalBegin_Moab;
290032b8ab6SVijay Mahadevan   dm->ops->globaltolocalend                = DMGlobalToLocalEnd_Moab;
291032b8ab6SVijay Mahadevan   dm->ops->localtoglobalbegin              = DMLocalToGlobalBegin_Moab;
292032b8ab6SVijay Mahadevan   dm->ops->localtoglobalend                = DMLocalToGlobalEnd_Moab;
293aa768e4cSTim Tautges   PetscFunctionReturn(0);
294aa768e4cSTim Tautges }
295fd349b41STim Tautges 
296fd349b41STim Tautges #undef __FUNCT__
2971d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate"
2981d72bce8STim Tautges /*@
2991d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
3001d72bce8STim Tautges 
3011d72bce8STim Tautges   Collective on MPI_Comm
3021d72bce8STim Tautges 
3031d72bce8STim Tautges   Input Parameter:
3041d72bce8STim Tautges . comm - The communicator for the DMMoab object
3051d72bce8STim Tautges 
3061d72bce8STim Tautges   Output Parameter:
307032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
3081d72bce8STim Tautges 
3091d72bce8STim Tautges   Level: beginner
3101d72bce8STim Tautges 
3111d72bce8STim Tautges .keywords: DMMoab, create
3121d72bce8STim Tautges @*/
313032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
3141d72bce8STim Tautges {
3151d72bce8STim Tautges   PetscErrorCode ierr;
3161d72bce8STim Tautges 
3171d72bce8STim Tautges   PetscFunctionBegin;
318032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,2);
319032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
320032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
3211d72bce8STim Tautges   PetscFunctionReturn(0);
3221d72bce8STim Tautges }
3231d72bce8STim Tautges 
3241d72bce8STim Tautges #undef __FUNCT__
325aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab"
3261d72bce8STim Tautges /*@
327a4d2169cSTim Tautges   DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data
3281d72bce8STim Tautges 
3291d72bce8STim Tautges   Collective on MPI_Comm
3301d72bce8STim Tautges 
3311d72bce8STim Tautges   Input Parameter:
3321d72bce8STim Tautges . comm - The communicator for the DMMoab object
333032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
334a4d2169cSTim Tautges          along with the DMMoab
335a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
3361d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
3371d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
3381d72bce8STim Tautges 
3391d72bce8STim Tautges   Output Parameter:
340032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
3411d72bce8STim Tautges 
342032b8ab6SVijay Mahadevan   Level: intermediate
3431d72bce8STim Tautges 
3441d72bce8STim Tautges .keywords: DMMoab, create
3451d72bce8STim Tautges @*/
346032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
3471d72bce8STim Tautges {
3481d72bce8STim Tautges   PetscErrorCode ierr;
349032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
3501cec0304SVijay Mahadevan   moab::EntityHandle partnset;
3511cec0304SVijay Mahadevan   PetscInt rank, nprocs;
352853cdec3SJed Brown   DM_Moab        *dmmoab;
3531d72bce8STim Tautges 
3541d72bce8STim Tautges   PetscFunctionBegin;
355032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,6);
356032b8ab6SVijay Mahadevan   ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr);
357032b8ab6SVijay Mahadevan   dmmoab = (DM_Moab*)(*dmb)->data;
358a4d2169cSTim Tautges 
359a4d2169cSTim Tautges   if (!mbiface) {
36072ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
3617d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
3621d72bce8STim Tautges   }
3631cec0304SVijay Mahadevan   else {
3641cec0304SVijay Mahadevan     dmmoab->mbiface = mbiface;
3657d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
3661cec0304SVijay Mahadevan   }
3671cec0304SVijay Mahadevan 
368b5410836SVijay Mahadevan   /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */
369b5410836SVijay Mahadevan   dmmoab->fileset=0;
3707d89fc02STim Tautges 
371a4d2169cSTim Tautges   if (!pcomm) {
372032b8ab6SVijay Mahadevan     ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
373032b8ab6SVijay Mahadevan     ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
374032b8ab6SVijay Mahadevan 
375db66d124SVijay Mahadevan     /* Create root sets for each mesh.  Then pass these
376db66d124SVijay Mahadevan        to the load_file functions to be populated. */
3770c8a2322SVijay Mahadevan     merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);MBERR("Creating partition set failed", merr);
378032b8ab6SVijay Mahadevan 
379db66d124SVijay Mahadevan     /* Create the parallel communicator object with the partition handle associated with MOAB */
38072ff976dSVijay Mahadevan     dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
38172ff976dSVijay Mahadevan   }
38272ff976dSVijay Mahadevan   else {
38372ff976dSVijay Mahadevan     ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr);
384032b8ab6SVijay Mahadevan   }
385032b8ab6SVijay Mahadevan 
3864973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
3874973de03SVijay Mahadevan   dmmoab->bs = 1;
388324f1edfSVijay Mahadevan   dmmoab->nfields = 1;
3894973de03SVijay Mahadevan 
3904973de03SVijay Mahadevan   /* set global ID tag handle */
391032b8ab6SVijay Mahadevan   if (!ltog_tag) {
3924973de03SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
393032b8ab6SVijay Mahadevan   }
394032b8ab6SVijay Mahadevan   else {
395032b8ab6SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr);
396a4d2169cSTim Tautges   }
397a4d2169cSTim Tautges 
3984973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
399a4d2169cSTim Tautges   if (range) {
4005eb88e9dSVijay Mahadevan     ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr);
401a4d2169cSTim Tautges   }
4021d72bce8STim Tautges   PetscFunctionReturn(0);
4031d72bce8STim Tautges }
4041d72bce8STim Tautges 
4051d72bce8STim Tautges #undef __FUNCT__
4061d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm"
407aa768e4cSTim Tautges /*@
408aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
409aa768e4cSTim Tautges 
410aa768e4cSTim Tautges   Collective on MPI_Comm
411aa768e4cSTim Tautges 
412aa768e4cSTim Tautges   Input Parameter:
413aa768e4cSTim Tautges . dm    - The DMMoab object being set
414aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
415aa768e4cSTim Tautges 
416aa768e4cSTim Tautges   Level: beginner
417aa768e4cSTim Tautges 
418aa768e4cSTim Tautges .keywords: DMMoab, create
419aa768e4cSTim Tautges @*/
4201d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
4211d72bce8STim Tautges {
422032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
423032b8ab6SVijay Mahadevan 
4241d72bce8STim Tautges   PetscFunctionBegin;
4251d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4261cec0304SVijay Mahadevan   PetscValidPointer(pcomm,2);
427032b8ab6SVijay Mahadevan   dmmoab->pcomm = pcomm;
428032b8ab6SVijay Mahadevan   dmmoab->mbiface = pcomm->get_moab();
429032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
4301d72bce8STim Tautges   PetscFunctionReturn(0);
4311d72bce8STim Tautges }
4321d72bce8STim Tautges 
4331d72bce8STim Tautges 
4341d72bce8STim Tautges #undef __FUNCT__
4351d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm"
436aa768e4cSTim Tautges /*@
437aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
438aa768e4cSTim Tautges 
439aa768e4cSTim Tautges   Collective on MPI_Comm
440aa768e4cSTim Tautges 
441aa768e4cSTim Tautges   Input Parameter:
442aa768e4cSTim Tautges . dm    - The DMMoab object being set
443aa768e4cSTim Tautges 
444aa768e4cSTim Tautges   Output Parameter:
445aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
446aa768e4cSTim Tautges 
447aa768e4cSTim Tautges   Level: beginner
448aa768e4cSTim Tautges 
449aa768e4cSTim Tautges .keywords: DMMoab, create
450aa768e4cSTim Tautges @*/
4511d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
4521d72bce8STim Tautges {
4531d72bce8STim Tautges   PetscFunctionBegin;
4541d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
455032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
4561d72bce8STim Tautges   PetscFunctionReturn(0);
4571d72bce8STim Tautges }
4581d72bce8STim Tautges 
4591d72bce8STim Tautges 
4601d72bce8STim Tautges #undef __FUNCT__
4611d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface"
462aa768e4cSTim Tautges /*@
463aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
464aa768e4cSTim Tautges 
465aa768e4cSTim Tautges   Collective on MPI_Comm
466aa768e4cSTim Tautges 
467aa768e4cSTim Tautges   Input Parameter:
468aa768e4cSTim Tautges . dm      - The DMMoab object being set
469aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
470aa768e4cSTim Tautges 
471aa768e4cSTim Tautges   Level: beginner
472aa768e4cSTim Tautges 
473aa768e4cSTim Tautges .keywords: DMMoab, create
474aa768e4cSTim Tautges @*/
475a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
4761d72bce8STim Tautges {
477032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
478032b8ab6SVijay Mahadevan 
4791d72bce8STim Tautges   PetscFunctionBegin;
4801d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4811cec0304SVijay Mahadevan   PetscValidPointer(mbiface,2);
482032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
483032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
484032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
4851d72bce8STim Tautges   PetscFunctionReturn(0);
4861d72bce8STim Tautges }
4871d72bce8STim Tautges 
4881d72bce8STim Tautges 
4891d72bce8STim Tautges #undef __FUNCT__
4901d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface"
491aa768e4cSTim Tautges /*@
492aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
493aa768e4cSTim Tautges 
494aa768e4cSTim Tautges   Collective on MPI_Comm
495aa768e4cSTim Tautges 
496aa768e4cSTim Tautges   Input Parameter:
497aa768e4cSTim Tautges . dm      - The DMMoab object being set
498aa768e4cSTim Tautges 
499aa768e4cSTim Tautges   Output Parameter:
500aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
501aa768e4cSTim Tautges 
502aa768e4cSTim Tautges   Level: beginner
503aa768e4cSTim Tautges 
504aa768e4cSTim Tautges .keywords: DMMoab, create
505aa768e4cSTim Tautges @*/
506a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
5071d72bce8STim Tautges {
5089426e041SSatish Balay   PetscErrorCode   ierr;
509cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
510cabb514dSBarry Smith 
5111d72bce8STim Tautges   PetscFunctionBegin;
5121d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
513cabb514dSBarry 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);
514a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
5151d72bce8STim Tautges   PetscFunctionReturn(0);
5161d72bce8STim Tautges }
5171d72bce8STim Tautges 
5181d72bce8STim Tautges 
5191d72bce8STim Tautges #undef __FUNCT__
5205eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices"
521aa768e4cSTim Tautges /*@
5225eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
523aa768e4cSTim Tautges 
524aa768e4cSTim Tautges   Collective on MPI_Comm
525aa768e4cSTim Tautges 
526aa768e4cSTim Tautges   Input Parameter:
527aa768e4cSTim Tautges . dm    - The DMMoab object being set
528aa768e4cSTim Tautges . range - The entities treated by this DMMoab
529aa768e4cSTim Tautges 
530aa768e4cSTim Tautges   Level: beginner
531aa768e4cSTim Tautges 
532aa768e4cSTim Tautges .keywords: DMMoab, create
533aa768e4cSTim Tautges @*/
5345eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range)
5351d72bce8STim Tautges {
536032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
537032b8ab6SVijay Mahadevan   PetscErrorCode  ierr;
538fd3326ddSVijay Mahadevan   moab::Range     tmpvtxs;
539032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
540032b8ab6SVijay Mahadevan 
5411d72bce8STim Tautges   PetscFunctionBegin;
5421d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
543032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
544032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
545fd3326ddSVijay Mahadevan 
546032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
547fd3326ddSVijay Mahadevan 
548fd3326ddSVijay Mahadevan   /* filter based on parallel status */
549fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
550fd3326ddSVijay Mahadevan 
551fd3326ddSVijay Mahadevan   /* filter all the non-owned and shared entities out of the list */
552fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
553fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(tmpvtxs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
554fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost);
555fd3326ddSVijay Mahadevan   *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs);
556fd3326ddSVijay Mahadevan 
557fd3326ddSVijay Mahadevan   /* compute and cache the sizes of local and ghosted entities */
558032b8ab6SVijay Mahadevan   dmmoab->nloc = dmmoab->vowned->size();
559032b8ab6SVijay Mahadevan   dmmoab->nghost = dmmoab->vghost->size();
560032b8ab6SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
5611d72bce8STim Tautges   PetscFunctionReturn(0);
5621d72bce8STim Tautges }
5631d72bce8STim Tautges 
5641d72bce8STim Tautges 
5651d72bce8STim Tautges #undef __FUNCT__
5668d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetAllVertices"
5678d8d51c8SVijay Mahadevan /*@
5688d8d51c8SVijay Mahadevan   DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab
5698d8d51c8SVijay Mahadevan 
5708d8d51c8SVijay Mahadevan   Collective on MPI_Comm
5718d8d51c8SVijay Mahadevan 
5728d8d51c8SVijay Mahadevan   Input Parameter:
5738d8d51c8SVijay Mahadevan . dm    - The DMMoab object being set
5748d8d51c8SVijay Mahadevan 
5758d8d51c8SVijay Mahadevan   Output Parameter:
5768d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted)
5778d8d51c8SVijay Mahadevan 
5788d8d51c8SVijay Mahadevan   Level: beginner
5798d8d51c8SVijay Mahadevan 
5808d8d51c8SVijay Mahadevan .keywords: DMMoab, create
5818d8d51c8SVijay Mahadevan @*/
5828d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local)
5838d8d51c8SVijay Mahadevan {
5848d8d51c8SVijay Mahadevan   PetscFunctionBegin;
5858d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5868d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab*)dm->data)->vlocal;
5878d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
5888d8d51c8SVijay Mahadevan }
5898d8d51c8SVijay Mahadevan 
5908d8d51c8SVijay Mahadevan 
5918d8d51c8SVijay Mahadevan 
5928d8d51c8SVijay Mahadevan #undef __FUNCT__
5935eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices"
594aa768e4cSTim Tautges /*@
5955eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
596aa768e4cSTim Tautges 
597aa768e4cSTim Tautges   Collective on MPI_Comm
598aa768e4cSTim Tautges 
599aa768e4cSTim Tautges   Input Parameter:
600aa768e4cSTim Tautges . dm    - The DMMoab object being set
601aa768e4cSTim Tautges 
602aa768e4cSTim Tautges   Output Parameter:
6035eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab
6045eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition
605aa768e4cSTim Tautges 
606aa768e4cSTim Tautges   Level: beginner
607aa768e4cSTim Tautges 
608aa768e4cSTim Tautges .keywords: DMMoab, create
609aa768e4cSTim Tautges @*/
6101cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,moab::Range *owned,moab::Range *ghost)
6111d72bce8STim Tautges {
6121d72bce8STim Tautges   PetscFunctionBegin;
6131d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6141cec0304SVijay Mahadevan   if (owned) *owned = *((DM_Moab*)dm->data)->vowned;
6151cec0304SVijay Mahadevan   if (ghost) *ghost = *((DM_Moab*)dm->data)->vghost;
6161d72bce8STim Tautges   PetscFunctionReturn(0);
6171d72bce8STim Tautges }
6181d72bce8STim Tautges 
6191d72bce8STim Tautges #undef __FUNCT__
6205eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements"
6215eb88e9dSVijay Mahadevan /*@
6225eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
6235eb88e9dSVijay Mahadevan 
6245eb88e9dSVijay Mahadevan   Collective on MPI_Comm
6255eb88e9dSVijay Mahadevan 
6265eb88e9dSVijay Mahadevan   Input Parameter:
6275eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
6285eb88e9dSVijay Mahadevan 
6295eb88e9dSVijay Mahadevan   Output Parameter:
6305eb88e9dSVijay Mahadevan . range - The entities owned locally
6315eb88e9dSVijay Mahadevan 
6325eb88e9dSVijay Mahadevan   Level: beginner
6335eb88e9dSVijay Mahadevan 
6345eb88e9dSVijay Mahadevan .keywords: DMMoab, create
6355eb88e9dSVijay Mahadevan @*/
6361cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,moab::Range *range)
6375eb88e9dSVijay Mahadevan {
6385eb88e9dSVijay Mahadevan   PetscFunctionBegin;
6395eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6401cec0304SVijay Mahadevan   if (range) *range = *((DM_Moab*)dm->data)->elocal;
6411cec0304SVijay Mahadevan   PetscFunctionReturn(0);
6421cec0304SVijay Mahadevan }
6431cec0304SVijay Mahadevan 
6441cec0304SVijay Mahadevan 
6451cec0304SVijay Mahadevan #undef __FUNCT__
6461cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements"
6471cec0304SVijay Mahadevan /*@
6481cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
6491cec0304SVijay Mahadevan 
6501cec0304SVijay Mahadevan   Collective on MPI_Comm
6511cec0304SVijay Mahadevan 
6521cec0304SVijay Mahadevan   Input Parameter:
6531cec0304SVijay Mahadevan . dm    - The DMMoab object being set
6541cec0304SVijay Mahadevan . range - The entities treated by this DMMoab
6551cec0304SVijay Mahadevan 
6561cec0304SVijay Mahadevan   Level: beginner
6571cec0304SVijay Mahadevan 
6581cec0304SVijay Mahadevan .keywords: DMMoab, create
6591cec0304SVijay Mahadevan @*/
6601cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range)
6611cec0304SVijay Mahadevan {
6621cec0304SVijay Mahadevan   moab::ErrorCode merr;
6631cec0304SVijay Mahadevan   PetscErrorCode  ierr;
6641cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
6651cec0304SVijay Mahadevan 
6661cec0304SVijay Mahadevan   PetscFunctionBegin;
6671cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6681cec0304SVijay Mahadevan   dmmoab->elocal->clear();
6691cec0304SVijay Mahadevan   dmmoab->eghost->clear();
6701cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
6711cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
6721cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
6731cec0304SVijay Mahadevan   dmmoab->neleloc=dmmoab->elocal->size();
6741cec0304SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
6758cbae1a6SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele);
6765eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
6775eb88e9dSVijay Mahadevan }
6785eb88e9dSVijay Mahadevan 
6795eb88e9dSVijay Mahadevan 
6805eb88e9dSVijay Mahadevan #undef __FUNCT__
6811d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag"
682aa768e4cSTim Tautges /*@
683aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
684aa768e4cSTim Tautges 
685aa768e4cSTim Tautges   Collective on MPI_Comm
686aa768e4cSTim Tautges 
687aa768e4cSTim Tautges   Input Parameter:
688aa768e4cSTim Tautges . dm      - The DMMoab object being set
689aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
690aa768e4cSTim Tautges 
691aa768e4cSTim Tautges   Level: beginner
692aa768e4cSTim Tautges 
693aa768e4cSTim Tautges .keywords: DMMoab, create
694aa768e4cSTim Tautges @*/
6951d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
6961d72bce8STim Tautges {
6971d72bce8STim Tautges   PetscFunctionBegin;
6981d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6991d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
7001d72bce8STim Tautges   PetscFunctionReturn(0);
7011d72bce8STim Tautges }
7021d72bce8STim Tautges 
7031d72bce8STim Tautges 
7041d72bce8STim Tautges #undef __FUNCT__
7051d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag"
706aa768e4cSTim Tautges /*@
707aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
708aa768e4cSTim Tautges 
709aa768e4cSTim Tautges   Collective on MPI_Comm
710aa768e4cSTim Tautges 
711aa768e4cSTim Tautges   Input Parameter:
712aa768e4cSTim Tautges . dm      - The DMMoab object being set
713aa768e4cSTim Tautges 
714aa768e4cSTim Tautges   Output Parameter:
715aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
716aa768e4cSTim Tautges 
717aa768e4cSTim Tautges   Level: beginner
718aa768e4cSTim Tautges 
719aa768e4cSTim Tautges .keywords: DMMoab, create
720aa768e4cSTim Tautges @*/
7211d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
7221d72bce8STim Tautges {
7231d72bce8STim Tautges   PetscFunctionBegin;
7241d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7251d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
7261d72bce8STim Tautges   PetscFunctionReturn(0);
7271d72bce8STim Tautges }
7281d72bce8STim Tautges 
7291d72bce8STim Tautges 
7301d72bce8STim Tautges #undef __FUNCT__
7311d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize"
732aa768e4cSTim Tautges /*@
733aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
734aa768e4cSTim Tautges 
735aa768e4cSTim Tautges   Collective on MPI_Comm
736aa768e4cSTim Tautges 
737aa768e4cSTim Tautges   Input Parameter:
738aa768e4cSTim Tautges . dm - The DMMoab object being set
739aa768e4cSTim Tautges . bs - The block size used with this DMMoab
740aa768e4cSTim Tautges 
741aa768e4cSTim Tautges   Level: beginner
742aa768e4cSTim Tautges 
743aa768e4cSTim Tautges .keywords: DMMoab, create
744aa768e4cSTim Tautges @*/
7451d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
7461d72bce8STim Tautges {
7471d72bce8STim Tautges   PetscFunctionBegin;
7481d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7491d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
7501d72bce8STim Tautges   PetscFunctionReturn(0);
7511d72bce8STim Tautges }
7521d72bce8STim Tautges 
7531d72bce8STim Tautges 
7541d72bce8STim Tautges #undef __FUNCT__
7551d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize"
756aa768e4cSTim Tautges /*@
757aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
758aa768e4cSTim Tautges 
759aa768e4cSTim Tautges   Collective on MPI_Comm
760aa768e4cSTim Tautges 
761aa768e4cSTim Tautges   Input Parameter:
762aa768e4cSTim Tautges . dm - The DMMoab object being set
763aa768e4cSTim Tautges 
764aa768e4cSTim Tautges   Output Parameter:
765aa768e4cSTim Tautges . bs - The block size used with this DMMoab
766aa768e4cSTim Tautges 
767aa768e4cSTim Tautges   Level: beginner
768aa768e4cSTim Tautges 
769aa768e4cSTim Tautges .keywords: DMMoab, create
770aa768e4cSTim Tautges @*/
7711d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
7721d72bce8STim Tautges {
7731d72bce8STim Tautges   PetscFunctionBegin;
7741d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7751d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
7761d72bce8STim Tautges   PetscFunctionReturn(0);
7771d72bce8STim Tautges }
7781d72bce8STim Tautges 
7791cec0304SVijay Mahadevan 
7801cec0304SVijay Mahadevan #undef __FUNCT__
781212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetSize"
782212ad6d1SVijay Mahadevan /*@
783212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
784212ad6d1SVijay Mahadevan 
785212ad6d1SVijay Mahadevan   Collective on MPI_Comm
786212ad6d1SVijay Mahadevan 
787212ad6d1SVijay Mahadevan   Input Parameter:
788212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
789212ad6d1SVijay Mahadevan 
790212ad6d1SVijay Mahadevan   Output Parameter:
791212ad6d1SVijay Mahadevan . ng - The global size of the DMMoab instance
792212ad6d1SVijay Mahadevan 
793212ad6d1SVijay Mahadevan   Level: beginner
794212ad6d1SVijay Mahadevan 
795212ad6d1SVijay Mahadevan .keywords: DMMoab, create
796212ad6d1SVijay Mahadevan @*/
797212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *ng)
798212ad6d1SVijay Mahadevan {
799212ad6d1SVijay Mahadevan   PetscFunctionBegin;
800212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
801212ad6d1SVijay Mahadevan   if(ng) *ng = ((DM_Moab*)dm->data)->n;
802212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
803212ad6d1SVijay Mahadevan }
804212ad6d1SVijay Mahadevan 
805212ad6d1SVijay Mahadevan 
806212ad6d1SVijay Mahadevan #undef __FUNCT__
807212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalSize"
808212ad6d1SVijay Mahadevan /*@
809212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
810212ad6d1SVijay Mahadevan 
811212ad6d1SVijay Mahadevan   Collective on MPI_Comm
812212ad6d1SVijay Mahadevan 
813212ad6d1SVijay Mahadevan   Input Parameter:
814212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
815212ad6d1SVijay Mahadevan 
816212ad6d1SVijay Mahadevan   Output Parameter:
817212ad6d1SVijay Mahadevan . nl - The local size of the DMMoab instance
818212ad6d1SVijay Mahadevan . ng - The ghosted size of the DMMoab instance
819212ad6d1SVijay Mahadevan 
820212ad6d1SVijay Mahadevan   Level: beginner
821212ad6d1SVijay Mahadevan 
822212ad6d1SVijay Mahadevan .keywords: DMMoab, create
823212ad6d1SVijay Mahadevan @*/
824212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nl,PetscInt *ng)
825212ad6d1SVijay Mahadevan {
826212ad6d1SVijay Mahadevan   PetscFunctionBegin;
827212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
828212ad6d1SVijay Mahadevan   if(nl) *nl = ((DM_Moab*)dm->data)->nloc;
829212ad6d1SVijay Mahadevan   if(ng) *ng = ((DM_Moab*)dm->data)->nghost;
830212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
831212ad6d1SVijay Mahadevan }
832212ad6d1SVijay Mahadevan 
833212ad6d1SVijay Mahadevan 
834212ad6d1SVijay Mahadevan #undef __FUNCT__
8354920ab11SVijay Mahadevan #define __FUNCT__ "DMMoabGetDimension"
8364920ab11SVijay Mahadevan /*@
8374920ab11SVijay Mahadevan   DMMoabGetDimension - Get the dimension of the DM Mesh
8384920ab11SVijay Mahadevan 
8394920ab11SVijay Mahadevan   Collective on MPI_Comm
8404920ab11SVijay Mahadevan 
8414920ab11SVijay Mahadevan   Input Parameter:
8424920ab11SVijay Mahadevan . dm - The DMMoab object being set
8434920ab11SVijay Mahadevan 
8444920ab11SVijay Mahadevan   Output Parameter:
8454920ab11SVijay Mahadevan . dim - The dimension of DM
8464920ab11SVijay Mahadevan 
8474920ab11SVijay Mahadevan   Level: beginner
8484920ab11SVijay Mahadevan 
8494920ab11SVijay Mahadevan .keywords: DMMoab, create
8504920ab11SVijay Mahadevan @*/
8514920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim)
8524920ab11SVijay Mahadevan {
8534920ab11SVijay Mahadevan   PetscFunctionBegin;
8544920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8554920ab11SVijay Mahadevan   *dim = ((DM_Moab*)dm->data)->dim;
8564920ab11SVijay Mahadevan   PetscFunctionReturn(0);
8574920ab11SVijay Mahadevan }
8584920ab11SVijay Mahadevan 
8594920ab11SVijay Mahadevan 
8604920ab11SVijay Mahadevan 
8614920ab11SVijay Mahadevan #undef __FUNCT__
8627023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates"
8637023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos)
8647023aa44SVijay Mahadevan {
8657023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
8667023aa44SVijay Mahadevan   PetscErrorCode  ierr;
8677023aa44SVijay Mahadevan   moab::ErrorCode merr;
8687023aa44SVijay Mahadevan 
8697023aa44SVijay Mahadevan   PetscFunctionBegin;
8707023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8717023aa44SVijay Mahadevan   PetscValidPointer(conn,3);
8727023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8737023aa44SVijay Mahadevan 
8747023aa44SVijay Mahadevan   if (!vpos) {
8757023aa44SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr);
8767023aa44SVijay Mahadevan   }
8777023aa44SVijay Mahadevan 
8787023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
8797023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
8807023aa44SVijay Mahadevan   PetscFunctionReturn(0);
8817023aa44SVijay Mahadevan }
8827023aa44SVijay Mahadevan 
8837023aa44SVijay Mahadevan 
8847023aa44SVijay Mahadevan #undef __FUNCT__
8858d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexConnectivity"
8868d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
8878d8d51c8SVijay Mahadevan {
8888d8d51c8SVijay Mahadevan   DM_Moab        *dmmoab;
8898d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities,connect;
8908d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
8918d8d51c8SVijay Mahadevan   moab::ErrorCode merr;
8928d8d51c8SVijay Mahadevan 
8938d8d51c8SVijay Mahadevan   PetscFunctionBegin;
8948d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8958d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
8968d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8978d8d51c8SVijay Mahadevan 
8988d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
8998d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_adjacencies(&ehandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr);
9008d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr);
9018d8d51c8SVijay Mahadevan 
9028d8d51c8SVijay Mahadevan   if (conn) {
9038d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr);
9048d8d51c8SVijay Mahadevan     ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr);
9058d8d51c8SVijay Mahadevan   }
9068d8d51c8SVijay Mahadevan   if (nconn) *nconn=connect.size();
9078d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
9088d8d51c8SVijay Mahadevan }
9098d8d51c8SVijay Mahadevan 
9108d8d51c8SVijay Mahadevan 
9118d8d51c8SVijay Mahadevan #undef __FUNCT__
9128d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabRestoreVertexConnectivity"
9138d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
9148d8d51c8SVijay Mahadevan {
9158d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
9168d8d51c8SVijay Mahadevan 
9178d8d51c8SVijay Mahadevan   PetscFunctionBegin;
9188d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9198d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
9208d8d51c8SVijay Mahadevan 
9218d8d51c8SVijay Mahadevan   if (conn) {
9228d8d51c8SVijay Mahadevan     ierr = PetscFree(*conn);CHKERRQ(ierr);
9238d8d51c8SVijay Mahadevan   }
9248d8d51c8SVijay Mahadevan   if (nconn) *nconn=0;
9258d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
9268d8d51c8SVijay Mahadevan }
9278d8d51c8SVijay Mahadevan 
9288d8d51c8SVijay Mahadevan 
9298d8d51c8SVijay Mahadevan 
9308d8d51c8SVijay Mahadevan #undef __FUNCT__
9317023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity"
9327023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn)
9337023aa44SVijay Mahadevan {
9347023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
9357023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
9367023aa44SVijay Mahadevan   moab::ErrorCode merr;
9377023aa44SVijay Mahadevan   PetscInt nnodes;
9387023aa44SVijay Mahadevan 
9397023aa44SVijay Mahadevan   PetscFunctionBegin;
9407023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9417023aa44SVijay Mahadevan   PetscValidPointer(conn,4);
9427023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9437023aa44SVijay Mahadevan 
9447023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
9457023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr);
9467023aa44SVijay Mahadevan   if (conn) *conn=connect;
9477023aa44SVijay Mahadevan   if (nconn) *nconn=nnodes;
9487023aa44SVijay Mahadevan   PetscFunctionReturn(0);
9497023aa44SVijay Mahadevan }
9507023aa44SVijay Mahadevan 
9517023aa44SVijay Mahadevan 
9527023aa44SVijay Mahadevan #undef __FUNCT__
95369263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary"
95469263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary)
95569263071SVijay Mahadevan {
95669263071SVijay Mahadevan   moab::EntityType etype;
95769263071SVijay Mahadevan   DM_Moab         *dmmoab;
95869263071SVijay Mahadevan   PetscInt         edim;
95969263071SVijay Mahadevan 
96069263071SVijay Mahadevan   PetscFunctionBegin;
96169263071SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
96269263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary,3);
96369263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
96469263071SVijay Mahadevan 
96569263071SVijay Mahadevan   /* get the entity type and handle accordingly */
96669263071SVijay Mahadevan   etype=dmmoab->mbiface->type_from_handle(ent);
96769263071SVijay 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);
96869263071SVijay Mahadevan 
96969263071SVijay Mahadevan   /* get the entity dimension */
97069263071SVijay Mahadevan   edim=dmmoab->mbiface->dimension_from_handle(ent);
97169263071SVijay Mahadevan 
97269263071SVijay Mahadevan   *ent_on_boundary=PETSC_FALSE;
97369263071SVijay Mahadevan   if(etype == moab::MBVERTEX && edim == 0) {
974*6d9eb265SVijay Mahadevan     if (dmmoab->bndyvtx->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
97569263071SVijay Mahadevan   }
97669263071SVijay Mahadevan   else {
97769263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
978*6d9eb265SVijay Mahadevan       if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
97969263071SVijay Mahadevan     }
98069263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
981*6d9eb265SVijay Mahadevan       if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
98269263071SVijay Mahadevan     }
98369263071SVijay Mahadevan   }
98469263071SVijay Mahadevan   PetscFunctionReturn(0);
98569263071SVijay Mahadevan }
98669263071SVijay Mahadevan 
98769263071SVijay Mahadevan 
98869263071SVijay Mahadevan #undef __FUNCT__
9897023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices"
99069263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx)
9917023aa44SVijay Mahadevan {
9927023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
9937023aa44SVijay Mahadevan   PetscInt       i;
9947023aa44SVijay Mahadevan 
9957023aa44SVijay Mahadevan   PetscFunctionBegin;
9967023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9977023aa44SVijay Mahadevan   PetscValidPointer(cnt,3);
9987023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx,4);
9997023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
10007023aa44SVijay Mahadevan 
10017023aa44SVijay Mahadevan   for (i=0; i < nconn; ++i) {
1002*6d9eb265SVijay Mahadevan     isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE);
10037023aa44SVijay Mahadevan   }
10047023aa44SVijay Mahadevan   PetscFunctionReturn(0);
10057023aa44SVijay Mahadevan }
10067023aa44SVijay Mahadevan 
10077023aa44SVijay Mahadevan 
10087023aa44SVijay Mahadevan #undef __FUNCT__
10090c8a2322SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryMarkers"
1010*6d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces)
10111cec0304SVijay Mahadevan {
10121cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
10131cec0304SVijay Mahadevan 
10141cec0304SVijay Mahadevan   PetscFunctionBegin;
10151cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
10161cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
10171cec0304SVijay Mahadevan 
1018*6d9eb265SVijay Mahadevan   if (bdvtx)  *bdvtx = dmmoab->bndyvtx;
1019*6d9eb265SVijay Mahadevan   if (bdfaces)  *bdfaces = dmmoab->bndyfaces;
1020*6d9eb265SVijay Mahadevan   if (bdelems)  *bdfaces = dmmoab->bndyelems;
10211cec0304SVijay Mahadevan   PetscFunctionReturn(0);
10221cec0304SVijay Mahadevan }
10231cec0304SVijay Mahadevan 
1024