xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision b5410836913e7c4c7a7174a71cee4ffb67284430)
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;
268d8d51c8SVijay Mahadevan 
278d8d51c8SVijay Mahadevan   ierr = PetscFree(dmmoab->isbndyvtx);CHKERRQ(ierr);
288d8d51c8SVijay Mahadevan   ierr = PetscFree(dmmoab->isbndyfaces);CHKERRQ(ierr);
298d8d51c8SVijay Mahadevan   ierr = PetscFree(dmmoab->isbndyelems);CHKERRQ(ierr);
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.");
588cbae1a6SVijay Mahadevan   if (!dmmoab->vlocal->empty()) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "DMMoab already initialized.");
59032b8ab6SVijay Mahadevan 
601cec0304SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
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 
67032b8ab6SVijay Mahadevan     /* get the information about the local elements in the mesh */
68032b8ab6SVijay Mahadevan     dmmoab->eghost->clear();
69fc418013SVijay Mahadevan 
70fc418013SVijay Mahadevan     /* first decipher the leading dimension */
71fc418013SVijay Mahadevan     for (i=3;i>0;i--) {
72fc418013SVijay Mahadevan       dmmoab->elocal->clear();
73fc418013SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr);
74fc418013SVijay Mahadevan 
75fc418013SVijay Mahadevan       /* store the current mesh dimension */
76fc418013SVijay Mahadevan       if (dmmoab->elocal->size()) {
77fc418013SVijay Mahadevan         dmmoab->dim=i;
78fc418013SVijay Mahadevan         break;
79fc418013SVijay Mahadevan       }
80fc418013SVijay Mahadevan     }
81fc418013SVijay Mahadevan 
828cbae1a6SVijay Mahadevan     /* filter the ghosted and owned element list */
83032b8ab6SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
84032b8ab6SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
85032b8ab6SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
86032b8ab6SVijay Mahadevan 
878cbae1a6SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
888cbae1a6SVijay Mahadevan     adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
898cbae1a6SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
908cbae1a6SVijay Mahadevan     adjs = moab::subtract(adjs, *dmmoab->vghost);
918cbae1a6SVijay Mahadevan     *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs);
928cbae1a6SVijay Mahadevan 
938cbae1a6SVijay Mahadevan     /* compute and cache the sizes of local and ghosted entities */
948cbae1a6SVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
958cbae1a6SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
968cbae1a6SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
978cbae1a6SVijay Mahadevan 
98032b8ab6SVijay Mahadevan     dmmoab->neleloc = dmmoab->elocal->size();
99032b8ab6SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
1008cbae1a6SVijay Mahadevan 
1018cbae1a6SVijay Mahadevan #if 0
1028cbae1a6SVijay Mahadevan     if(dmmoab->pcomm->rank() || dmmoab->pcomm->size()==1) {
1038cbae1a6SVijay Mahadevan       PetscPrintf(PETSC_COMM_SELF, "Vertices: global: %D, local: %D", dmmoab->n, dmmoab->nloc+dmmoab->nghost);
1048cbae1a6SVijay Mahadevan       dmmoab->vlocal->print(0);
1058cbae1a6SVijay Mahadevan       PetscPrintf(PETSC_COMM_SELF, "Vertices: owned: %D", dmmoab->nloc);
1068cbae1a6SVijay Mahadevan       dmmoab->vowned->print(0);
1078cbae1a6SVijay Mahadevan       PetscPrintf(PETSC_COMM_SELF, "Vertices: ghost: %D", dmmoab->nghost);
1088cbae1a6SVijay Mahadevan       dmmoab->vghost->print(0);
1098cbae1a6SVijay Mahadevan     }
1108cbae1a6SVijay Mahadevan #endif
1118cbae1a6SVijay Mahadevan 
112032b8ab6SVijay Mahadevan   }
113032b8ab6SVijay Mahadevan 
114032b8ab6SVijay Mahadevan   bs = dmmoab->bs;
115032b8ab6SVijay Mahadevan   if (!dmmoab->ltog_tag) {
116db66d124SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
117db66d124SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
118db66d124SVijay Mahadevan        assemble the individual pieces of the mesh */
119032b8ab6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
120032b8ab6SVijay Mahadevan   }
121032b8ab6SVijay Mahadevan 
122032b8ab6SVijay Mahadevan   totsize=dmmoab->vlocal->size();
1238cbae1a6SVijay 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);
124fc418013SVijay Mahadevan   ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->gsindices);CHKERRQ(ierr);
1251cec0304SVijay Mahadevan   {
126032b8ab6SVijay Mahadevan     /* first get the local indices */
127fc418013SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr);
1284a40b570SVijay Mahadevan     /* next get the ghosted indices */
129fc418013SVijay Mahadevan     if (dmmoab->nghost) {
130fc418013SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr);
1311cec0304SVijay Mahadevan     }
1326e40195eSVijay Mahadevan 
1336e40195eSVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
134eb9d2429SVijay Mahadevan     lmin=lmax=dmmoab->gsindices[0];
13569263071SVijay Mahadevan     for (i=0; i<totsize; ++i) {
136eb9d2429SVijay Mahadevan       if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i];
137eb9d2429SVijay Mahadevan       if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i];
138fc418013SVijay Mahadevan     }
1396e40195eSVijay Mahadevan 
140eb9d2429SVijay Mahadevan     ierr = MPI_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr);
1418cbae1a6SVijay Mahadevan     PetscInfo3(NULL, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin);
1421cec0304SVijay Mahadevan   }
143032b8ab6SVijay Mahadevan 
1441cec0304SVijay Mahadevan   {
1458cbae1a6SVijay Mahadevan     /* set the GID map */
146fc418013SVijay Mahadevan     for (i=0; i<totsize; ++i) {
147eb9d2429SVijay Mahadevan       dmmoab->gsindices[i]-=gmin;   /* zero based index needed for IS */
148fc418013SVijay Mahadevan     }
1498cbae1a6SVijay Mahadevan     i=j=0;
1508cbae1a6SVijay Mahadevan 
1518cbae1a6SVijay Mahadevan     ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->gidmap);CHKERRQ(ierr);
1528cbae1a6SVijay Mahadevan     ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->lidmap);CHKERRQ(ierr);
1538cbae1a6SVijay Mahadevan     ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->lmap);CHKERRQ(ierr);
1548cbae1a6SVijay Mahadevan     ierr = PetscMalloc(totsize*dmmoab->nfields*sizeof(PetscInt), &dmmoab->lgmap);CHKERRQ(ierr);
1558cbae1a6SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) {
1568cbae1a6SVijay Mahadevan       dmmoab->gidmap[(PetscInt)(*iter)]=dmmoab->gsindices[i];
1578cbae1a6SVijay Mahadevan       dmmoab->lidmap[(PetscInt)(*iter)]=i;
1588cbae1a6SVijay Mahadevan       dmmoab->lmap[i]=i;
1598cbae1a6SVijay Mahadevan       if (bs > 1)
1608cbae1a6SVijay Mahadevan         for (f=0;f<dmmoab->nfields;f++,j++)
1618cbae1a6SVijay Mahadevan           dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->nfields+f;
1628cbae1a6SVijay Mahadevan       else
1638cbae1a6SVijay Mahadevan         for (f=0;f<dmmoab->nfields;f++,j++)
1648cbae1a6SVijay Mahadevan           dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i];
1658cbae1a6SVijay Mahadevan     }
1668cbae1a6SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) {
1678cbae1a6SVijay Mahadevan       dmmoab->gidmap[(PetscInt)(*iter)]=dmmoab->gsindices[i];
1688cbae1a6SVijay Mahadevan       dmmoab->lidmap[(PetscInt)(*iter)]=i;
1698cbae1a6SVijay Mahadevan       dmmoab->lmap[i]=i;
1708cbae1a6SVijay Mahadevan       if (bs > 1)
1718cbae1a6SVijay Mahadevan         for (f=0;f<dmmoab->nfields;f++,j++)
1728cbae1a6SVijay Mahadevan           dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->nfields+f;
1738cbae1a6SVijay Mahadevan       else
1748cbae1a6SVijay Mahadevan         for (f=0;f<dmmoab->nfields;f++,j++)
1758cbae1a6SVijay Mahadevan           dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i];
1768cbae1a6SVijay Mahadevan     }
1778cbae1a6SVijay Mahadevan 
1788cbae1a6SVijay Mahadevan     /* global to local must retrieve ghost points */
1798cbae1a6SVijay Mahadevan     ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&dmmoab->lmap[0],PETSC_COPY_VALUES,&from);CHKERRQ(ierr);
1808cbae1a6SVijay Mahadevan     ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&dmmoab->gsindices[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr);
1818cbae1a6SVijay Mahadevan 
1828cbae1a6SVijay Mahadevan     if (!dmmoab->ltog_map) {
1838cbae1a6SVijay Mahadevan       /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */
1848cbae1a6SVijay Mahadevan       ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,totsize*dmmoab->nfields,dmmoab->lgmap,
1858cbae1a6SVijay Mahadevan                                           PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr);
1868cbae1a6SVijay Mahadevan     }
187fc418013SVijay Mahadevan 
188032b8ab6SVijay Mahadevan     /* Create Global to Local Vector Scatter Context */
189032b8ab6SVijay Mahadevan     ierr = DMCreateGlobalVector_Moab(dm, &global);CHKERRQ(ierr);
190032b8ab6SVijay Mahadevan     ierr = DMCreateLocalVector_Moab(dm, &local);CHKERRQ(ierr);
191032b8ab6SVijay Mahadevan 
1928cbae1a6SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
193032b8ab6SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
1948cbae1a6SVijay Mahadevan     ierr = ISDestroy(&to);CHKERRQ(ierr);
195032b8ab6SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
196032b8ab6SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
197032b8ab6SVijay Mahadevan   }
198032b8ab6SVijay Mahadevan 
1991cec0304SVijay Mahadevan   /* skin the boundary and store nodes */
2001cec0304SVijay Mahadevan   {
2010c8a2322SVijay Mahadevan     moab::Range bndyfaces, bndyvtx, bndyelems;
202eb9d2429SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
203eb9d2429SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
204eb9d2429SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
205eb9d2429SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
2061cec0304SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
207eb9d2429SVijay Mahadevan 
208eb9d2429SVijay Mahadevan     /* get the entities on the skin - only the faces */
209*b5410836SVijay Mahadevan     merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, bndyfaces, NULL, false, true, false);MBERRNM(merr); // 'false' param indicates we want faces back, not vertices
210eb9d2429SVijay Mahadevan 
211eb9d2429SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
2120c8a2322SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
2130c8a2322SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr);
21469263071SVijay Mahadevan 
215eb9d2429SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
2160c8a2322SVijay Mahadevan     merr = dmmoab->mbiface->get_connectivity(bndyfaces, bndyvtx, false);MBERRNM(ierr);
2170c8a2322SVijay Mahadevan     merr = dmmoab->mbiface->get_adjacencies(bndyfaces, dmmoab->dim, false, bndyelems, moab::Interface::UNION);MBERRNM(ierr);
2188cbae1a6SVijay Mahadevan     PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", bndyvtx.size(), bndyvtx.size(), bndyelems.size());
2198d8d51c8SVijay Mahadevan 
2208d8d51c8SVijay Mahadevan     /* cache a bit-vector for easy query */
2210c8a2322SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscBool)*((PetscInt)(*bndyvtx.rbegin())+1),&dmmoab->isbndyvtx);CHKERRQ(ierr);
2220c8a2322SVijay Mahadevan     ierr = PetscMemzero(dmmoab->isbndyvtx,sizeof(PetscBool)*((PetscInt)(*bndyvtx.rbegin())+1));CHKERRQ(ierr);
2230c8a2322SVijay Mahadevan     for(moab::Range::iterator iter = bndyvtx.begin(); iter != bndyvtx.end(); iter++) {
2240c8a2322SVijay Mahadevan       dmmoab->isbndyvtx[(PetscInt)*iter]=PETSC_TRUE;
2258d8d51c8SVijay Mahadevan     }
2268d8d51c8SVijay Mahadevan 
2270c8a2322SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscBool)*((PetscInt)(*bndyelems.rbegin())+1),&dmmoab->isbndyelems);CHKERRQ(ierr);
2280c8a2322SVijay Mahadevan     ierr = PetscMemzero(dmmoab->isbndyelems,sizeof(PetscBool)*((PetscInt)(*bndyelems.rbegin())+1));CHKERRQ(ierr);
2290c8a2322SVijay Mahadevan     for(moab::Range::iterator iter = bndyelems.begin(); iter != bndyelems.end(); iter++) {
2300c8a2322SVijay Mahadevan       dmmoab->isbndyelems[(PetscInt)*iter]=PETSC_TRUE;
2318d8d51c8SVijay Mahadevan     }
2328d8d51c8SVijay Mahadevan 
2330c8a2322SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscBool)*((PetscInt)(*bndyfaces.rbegin())+1),&dmmoab->isbndyfaces);CHKERRQ(ierr);
2340c8a2322SVijay Mahadevan     ierr = PetscMemzero(dmmoab->isbndyfaces,sizeof(PetscBool)*((PetscInt)(*bndyfaces.rbegin())+1));CHKERRQ(ierr);
2350c8a2322SVijay Mahadevan     for(moab::Range::iterator iter = bndyfaces.begin(); iter != bndyfaces.end(); iter++) {
2360c8a2322SVijay Mahadevan       dmmoab->isbndyfaces[(PetscInt)*iter]=PETSC_TRUE;
2378d8d51c8SVijay Mahadevan     }
2381cec0304SVijay Mahadevan   }
239032b8ab6SVijay Mahadevan   PetscFunctionReturn(0);
240032b8ab6SVijay Mahadevan }
241032b8ab6SVijay Mahadevan 
2421cec0304SVijay Mahadevan 
243032b8ab6SVijay Mahadevan #undef __FUNCT__
244aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab"
245853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
246aa768e4cSTim Tautges {
247aa768e4cSTim Tautges   PetscErrorCode ierr;
248aa768e4cSTim Tautges 
249aa768e4cSTim Tautges   PetscFunctionBegin;
250aa768e4cSTim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
251032b8ab6SVijay Mahadevan   ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr);
252032b8ab6SVijay Mahadevan 
253032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
254324f1edfSVijay Mahadevan   ((DM_Moab*)dm->data)->nfields = 1;
255032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
256032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
257032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
258032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
259032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
260032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL;
261032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL;
262032b8ab6SVijay Mahadevan 
263032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
264032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
265032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
266032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
267032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
268aa768e4cSTim Tautges 
26997ea90e6SJed Brown   dm->ops->createglobalvector              = DMCreateGlobalVector_Moab;
27097ea90e6SJed Brown   dm->ops->createlocalvector               = DMCreateLocalVector_Moab;
271032b8ab6SVijay Mahadevan   dm->ops->creatematrix                    = DMCreateMatrix_Moab;
272032b8ab6SVijay Mahadevan   dm->ops->setup                           = DMSetUp_Moab;
27397ea90e6SJed Brown   dm->ops->destroy                         = DMDestroy_Moab;
274032b8ab6SVijay Mahadevan   dm->ops->globaltolocalbegin              = DMGlobalToLocalBegin_Moab;
275032b8ab6SVijay Mahadevan   dm->ops->globaltolocalend                = DMGlobalToLocalEnd_Moab;
276032b8ab6SVijay Mahadevan   dm->ops->localtoglobalbegin              = DMLocalToGlobalBegin_Moab;
277032b8ab6SVijay Mahadevan   dm->ops->localtoglobalend                = DMLocalToGlobalEnd_Moab;
278aa768e4cSTim Tautges   PetscFunctionReturn(0);
279aa768e4cSTim Tautges }
280fd349b41STim Tautges 
281fd349b41STim Tautges #undef __FUNCT__
2821d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate"
2831d72bce8STim Tautges /*@
2841d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
2851d72bce8STim Tautges 
2861d72bce8STim Tautges   Collective on MPI_Comm
2871d72bce8STim Tautges 
2881d72bce8STim Tautges   Input Parameter:
2891d72bce8STim Tautges . comm - The communicator for the DMMoab object
2901d72bce8STim Tautges 
2911d72bce8STim Tautges   Output Parameter:
292032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
2931d72bce8STim Tautges 
2941d72bce8STim Tautges   Level: beginner
2951d72bce8STim Tautges 
2961d72bce8STim Tautges .keywords: DMMoab, create
2971d72bce8STim Tautges @*/
298032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
2991d72bce8STim Tautges {
3001d72bce8STim Tautges   PetscErrorCode ierr;
3011d72bce8STim Tautges 
3021d72bce8STim Tautges   PetscFunctionBegin;
303032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,2);
304032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
305032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
3061d72bce8STim Tautges   PetscFunctionReturn(0);
3071d72bce8STim Tautges }
3081d72bce8STim Tautges 
3091d72bce8STim Tautges #undef __FUNCT__
310aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab"
3111d72bce8STim Tautges /*@
312a4d2169cSTim Tautges   DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data
3131d72bce8STim Tautges 
3141d72bce8STim Tautges   Collective on MPI_Comm
3151d72bce8STim Tautges 
3161d72bce8STim Tautges   Input Parameter:
3171d72bce8STim Tautges . comm - The communicator for the DMMoab object
318032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
319a4d2169cSTim Tautges          along with the DMMoab
320a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
3211d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
3221d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
3231d72bce8STim Tautges 
3241d72bce8STim Tautges   Output Parameter:
325032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
3261d72bce8STim Tautges 
327032b8ab6SVijay Mahadevan   Level: intermediate
3281d72bce8STim Tautges 
3291d72bce8STim Tautges .keywords: DMMoab, create
3301d72bce8STim Tautges @*/
331032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
3321d72bce8STim Tautges {
3331d72bce8STim Tautges   PetscErrorCode ierr;
334032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
3351cec0304SVijay Mahadevan   moab::EntityHandle partnset;
3361cec0304SVijay Mahadevan   PetscInt rank, nprocs;
337853cdec3SJed Brown   DM_Moab        *dmmoab;
3381d72bce8STim Tautges 
3391d72bce8STim Tautges   PetscFunctionBegin;
340032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,6);
341032b8ab6SVijay Mahadevan   ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr);
342032b8ab6SVijay Mahadevan   dmmoab = (DM_Moab*)(*dmb)->data;
343a4d2169cSTim Tautges 
344a4d2169cSTim Tautges   if (!mbiface) {
34572ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
3467d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
3471d72bce8STim Tautges   }
3481cec0304SVijay Mahadevan   else {
3491cec0304SVijay Mahadevan     dmmoab->mbiface = mbiface;
3507d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
3511cec0304SVijay Mahadevan   }
3521cec0304SVijay Mahadevan 
353*b5410836SVijay Mahadevan   /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */
354*b5410836SVijay Mahadevan   dmmoab->fileset=0;
3557d89fc02STim Tautges 
356a4d2169cSTim Tautges   if (!pcomm) {
357032b8ab6SVijay Mahadevan     ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
358032b8ab6SVijay Mahadevan     ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
359032b8ab6SVijay Mahadevan 
360db66d124SVijay Mahadevan     /* Create root sets for each mesh.  Then pass these
361db66d124SVijay Mahadevan        to the load_file functions to be populated. */
3620c8a2322SVijay Mahadevan     merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);MBERR("Creating partition set failed", merr);
363032b8ab6SVijay Mahadevan 
364db66d124SVijay Mahadevan     /* Create the parallel communicator object with the partition handle associated with MOAB */
36572ff976dSVijay Mahadevan     dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
36672ff976dSVijay Mahadevan   }
36772ff976dSVijay Mahadevan   else {
36872ff976dSVijay Mahadevan     ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr);
369032b8ab6SVijay Mahadevan   }
370032b8ab6SVijay Mahadevan 
3714973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
3724973de03SVijay Mahadevan   dmmoab->bs = 1;
373324f1edfSVijay Mahadevan   dmmoab->nfields = 1;
3744973de03SVijay Mahadevan 
3754973de03SVijay Mahadevan   /* set global ID tag handle */
376032b8ab6SVijay Mahadevan   if (!ltog_tag) {
3774973de03SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
378032b8ab6SVijay Mahadevan   }
379032b8ab6SVijay Mahadevan   else {
380032b8ab6SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr);
381a4d2169cSTim Tautges   }
382a4d2169cSTim Tautges 
3834973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
384a4d2169cSTim Tautges   if (range) {
3855eb88e9dSVijay Mahadevan     ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr);
386a4d2169cSTim Tautges   }
3871d72bce8STim Tautges   PetscFunctionReturn(0);
3881d72bce8STim Tautges }
3891d72bce8STim Tautges 
3901d72bce8STim Tautges #undef __FUNCT__
3911d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm"
392aa768e4cSTim Tautges /*@
393aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
394aa768e4cSTim Tautges 
395aa768e4cSTim Tautges   Collective on MPI_Comm
396aa768e4cSTim Tautges 
397aa768e4cSTim Tautges   Input Parameter:
398aa768e4cSTim Tautges . dm    - The DMMoab object being set
399aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
400aa768e4cSTim Tautges 
401aa768e4cSTim Tautges   Level: beginner
402aa768e4cSTim Tautges 
403aa768e4cSTim Tautges .keywords: DMMoab, create
404aa768e4cSTim Tautges @*/
4051d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
4061d72bce8STim Tautges {
407032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
408032b8ab6SVijay Mahadevan 
4091d72bce8STim Tautges   PetscFunctionBegin;
4101d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4111cec0304SVijay Mahadevan   PetscValidPointer(pcomm,2);
412032b8ab6SVijay Mahadevan   dmmoab->pcomm = pcomm;
413032b8ab6SVijay Mahadevan   dmmoab->mbiface = pcomm->get_moab();
414032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
4151d72bce8STim Tautges   PetscFunctionReturn(0);
4161d72bce8STim Tautges }
4171d72bce8STim Tautges 
4181d72bce8STim Tautges 
4191d72bce8STim Tautges #undef __FUNCT__
4201d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm"
421aa768e4cSTim Tautges /*@
422aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
423aa768e4cSTim Tautges 
424aa768e4cSTim Tautges   Collective on MPI_Comm
425aa768e4cSTim Tautges 
426aa768e4cSTim Tautges   Input Parameter:
427aa768e4cSTim Tautges . dm    - The DMMoab object being set
428aa768e4cSTim Tautges 
429aa768e4cSTim Tautges   Output Parameter:
430aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
431aa768e4cSTim Tautges 
432aa768e4cSTim Tautges   Level: beginner
433aa768e4cSTim Tautges 
434aa768e4cSTim Tautges .keywords: DMMoab, create
435aa768e4cSTim Tautges @*/
4361d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
4371d72bce8STim Tautges {
4381d72bce8STim Tautges   PetscFunctionBegin;
4391d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
440032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
4411d72bce8STim Tautges   PetscFunctionReturn(0);
4421d72bce8STim Tautges }
4431d72bce8STim Tautges 
4441d72bce8STim Tautges 
4451d72bce8STim Tautges #undef __FUNCT__
4461d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface"
447aa768e4cSTim Tautges /*@
448aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
449aa768e4cSTim Tautges 
450aa768e4cSTim Tautges   Collective on MPI_Comm
451aa768e4cSTim Tautges 
452aa768e4cSTim Tautges   Input Parameter:
453aa768e4cSTim Tautges . dm      - The DMMoab object being set
454aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
455aa768e4cSTim Tautges 
456aa768e4cSTim Tautges   Level: beginner
457aa768e4cSTim Tautges 
458aa768e4cSTim Tautges .keywords: DMMoab, create
459aa768e4cSTim Tautges @*/
460a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
4611d72bce8STim Tautges {
462032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
463032b8ab6SVijay Mahadevan 
4641d72bce8STim Tautges   PetscFunctionBegin;
4651d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4661cec0304SVijay Mahadevan   PetscValidPointer(mbiface,2);
467032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
468032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
469032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
4701d72bce8STim Tautges   PetscFunctionReturn(0);
4711d72bce8STim Tautges }
4721d72bce8STim Tautges 
4731d72bce8STim Tautges 
4741d72bce8STim Tautges #undef __FUNCT__
4751d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface"
476aa768e4cSTim Tautges /*@
477aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
478aa768e4cSTim Tautges 
479aa768e4cSTim Tautges   Collective on MPI_Comm
480aa768e4cSTim Tautges 
481aa768e4cSTim Tautges   Input Parameter:
482aa768e4cSTim Tautges . dm      - The DMMoab object being set
483aa768e4cSTim Tautges 
484aa768e4cSTim Tautges   Output Parameter:
485aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
486aa768e4cSTim Tautges 
487aa768e4cSTim Tautges   Level: beginner
488aa768e4cSTim Tautges 
489aa768e4cSTim Tautges .keywords: DMMoab, create
490aa768e4cSTim Tautges @*/
491a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
4921d72bce8STim Tautges {
4939426e041SSatish Balay   PetscErrorCode   ierr;
494cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
495cabb514dSBarry Smith 
4961d72bce8STim Tautges   PetscFunctionBegin;
4971d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
498cabb514dSBarry 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);
499a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
5001d72bce8STim Tautges   PetscFunctionReturn(0);
5011d72bce8STim Tautges }
5021d72bce8STim Tautges 
5031d72bce8STim Tautges 
5041d72bce8STim Tautges #undef __FUNCT__
5055eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices"
506aa768e4cSTim Tautges /*@
5075eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
508aa768e4cSTim Tautges 
509aa768e4cSTim Tautges   Collective on MPI_Comm
510aa768e4cSTim Tautges 
511aa768e4cSTim Tautges   Input Parameter:
512aa768e4cSTim Tautges . dm    - The DMMoab object being set
513aa768e4cSTim Tautges . range - The entities treated by this DMMoab
514aa768e4cSTim Tautges 
515aa768e4cSTim Tautges   Level: beginner
516aa768e4cSTim Tautges 
517aa768e4cSTim Tautges .keywords: DMMoab, create
518aa768e4cSTim Tautges @*/
5195eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range)
5201d72bce8STim Tautges {
521032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
522032b8ab6SVijay Mahadevan   PetscErrorCode  ierr;
523032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
524032b8ab6SVijay Mahadevan 
5251d72bce8STim Tautges   PetscFunctionBegin;
5261d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
527032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
528032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
529032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
530032b8ab6SVijay Mahadevan   *dmmoab->vowned = *dmmoab->vlocal;
531032b8ab6SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
532032b8ab6SVijay Mahadevan   *dmmoab->vghost = moab::subtract(*range, *dmmoab->vowned);
533032b8ab6SVijay Mahadevan   dmmoab->nloc=dmmoab->vowned->size();
534032b8ab6SVijay Mahadevan   dmmoab->nghost=dmmoab->vghost->size();
535032b8ab6SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
5361d72bce8STim Tautges   PetscFunctionReturn(0);
5371d72bce8STim Tautges }
5381d72bce8STim Tautges 
5391d72bce8STim Tautges 
5401d72bce8STim Tautges #undef __FUNCT__
5418d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetAllVertices"
5428d8d51c8SVijay Mahadevan /*@
5438d8d51c8SVijay Mahadevan   DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab
5448d8d51c8SVijay Mahadevan 
5458d8d51c8SVijay Mahadevan   Collective on MPI_Comm
5468d8d51c8SVijay Mahadevan 
5478d8d51c8SVijay Mahadevan   Input Parameter:
5488d8d51c8SVijay Mahadevan . dm    - The DMMoab object being set
5498d8d51c8SVijay Mahadevan 
5508d8d51c8SVijay Mahadevan   Output Parameter:
5518d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted)
5528d8d51c8SVijay Mahadevan 
5538d8d51c8SVijay Mahadevan   Level: beginner
5548d8d51c8SVijay Mahadevan 
5558d8d51c8SVijay Mahadevan .keywords: DMMoab, create
5568d8d51c8SVijay Mahadevan @*/
5578d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local)
5588d8d51c8SVijay Mahadevan {
5598d8d51c8SVijay Mahadevan   PetscFunctionBegin;
5608d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5618d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab*)dm->data)->vlocal;
5628d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
5638d8d51c8SVijay Mahadevan }
5648d8d51c8SVijay Mahadevan 
5658d8d51c8SVijay Mahadevan 
5668d8d51c8SVijay Mahadevan 
5678d8d51c8SVijay Mahadevan #undef __FUNCT__
5685eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices"
569aa768e4cSTim Tautges /*@
5705eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
571aa768e4cSTim Tautges 
572aa768e4cSTim Tautges   Collective on MPI_Comm
573aa768e4cSTim Tautges 
574aa768e4cSTim Tautges   Input Parameter:
575aa768e4cSTim Tautges . dm    - The DMMoab object being set
576aa768e4cSTim Tautges 
577aa768e4cSTim Tautges   Output Parameter:
5785eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab
5795eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition
580aa768e4cSTim Tautges 
581aa768e4cSTim Tautges   Level: beginner
582aa768e4cSTim Tautges 
583aa768e4cSTim Tautges .keywords: DMMoab, create
584aa768e4cSTim Tautges @*/
5851cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,moab::Range *owned,moab::Range *ghost)
5861d72bce8STim Tautges {
5871d72bce8STim Tautges   PetscFunctionBegin;
5881d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5891cec0304SVijay Mahadevan   if (owned) *owned = *((DM_Moab*)dm->data)->vowned;
5901cec0304SVijay Mahadevan   if (ghost) *ghost = *((DM_Moab*)dm->data)->vghost;
5911d72bce8STim Tautges   PetscFunctionReturn(0);
5921d72bce8STim Tautges }
5931d72bce8STim Tautges 
5941d72bce8STim Tautges #undef __FUNCT__
5955eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements"
5965eb88e9dSVijay Mahadevan /*@
5975eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
5985eb88e9dSVijay Mahadevan 
5995eb88e9dSVijay Mahadevan   Collective on MPI_Comm
6005eb88e9dSVijay Mahadevan 
6015eb88e9dSVijay Mahadevan   Input Parameter:
6025eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
6035eb88e9dSVijay Mahadevan 
6045eb88e9dSVijay Mahadevan   Output Parameter:
6055eb88e9dSVijay Mahadevan . range - The entities owned locally
6065eb88e9dSVijay Mahadevan 
6075eb88e9dSVijay Mahadevan   Level: beginner
6085eb88e9dSVijay Mahadevan 
6095eb88e9dSVijay Mahadevan .keywords: DMMoab, create
6105eb88e9dSVijay Mahadevan @*/
6111cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,moab::Range *range)
6125eb88e9dSVijay Mahadevan {
6135eb88e9dSVijay Mahadevan   PetscFunctionBegin;
6145eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6151cec0304SVijay Mahadevan   if (range) *range = *((DM_Moab*)dm->data)->elocal;
6161cec0304SVijay Mahadevan   PetscFunctionReturn(0);
6171cec0304SVijay Mahadevan }
6181cec0304SVijay Mahadevan 
6191cec0304SVijay Mahadevan 
6201cec0304SVijay Mahadevan #undef __FUNCT__
6211cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements"
6221cec0304SVijay Mahadevan /*@
6231cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
6241cec0304SVijay Mahadevan 
6251cec0304SVijay Mahadevan   Collective on MPI_Comm
6261cec0304SVijay Mahadevan 
6271cec0304SVijay Mahadevan   Input Parameter:
6281cec0304SVijay Mahadevan . dm    - The DMMoab object being set
6291cec0304SVijay Mahadevan . range - The entities treated by this DMMoab
6301cec0304SVijay Mahadevan 
6311cec0304SVijay Mahadevan   Level: beginner
6321cec0304SVijay Mahadevan 
6331cec0304SVijay Mahadevan .keywords: DMMoab, create
6341cec0304SVijay Mahadevan @*/
6351cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range)
6361cec0304SVijay Mahadevan {
6371cec0304SVijay Mahadevan   moab::ErrorCode merr;
6381cec0304SVijay Mahadevan   PetscErrorCode  ierr;
6391cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
6401cec0304SVijay Mahadevan 
6411cec0304SVijay Mahadevan   PetscFunctionBegin;
6421cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6431cec0304SVijay Mahadevan   dmmoab->elocal->clear();
6441cec0304SVijay Mahadevan   dmmoab->eghost->clear();
6451cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
6461cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
6471cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
6481cec0304SVijay Mahadevan   dmmoab->neleloc=dmmoab->elocal->size();
6491cec0304SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
6508cbae1a6SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele);
6515eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
6525eb88e9dSVijay Mahadevan }
6535eb88e9dSVijay Mahadevan 
6545eb88e9dSVijay Mahadevan 
6555eb88e9dSVijay Mahadevan #undef __FUNCT__
6561d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag"
657aa768e4cSTim Tautges /*@
658aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
659aa768e4cSTim Tautges 
660aa768e4cSTim Tautges   Collective on MPI_Comm
661aa768e4cSTim Tautges 
662aa768e4cSTim Tautges   Input Parameter:
663aa768e4cSTim Tautges . dm      - The DMMoab object being set
664aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
665aa768e4cSTim Tautges 
666aa768e4cSTim Tautges   Level: beginner
667aa768e4cSTim Tautges 
668aa768e4cSTim Tautges .keywords: DMMoab, create
669aa768e4cSTim Tautges @*/
6701d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
6711d72bce8STim Tautges {
6721d72bce8STim Tautges   PetscFunctionBegin;
6731d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6741d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
6751d72bce8STim Tautges   PetscFunctionReturn(0);
6761d72bce8STim Tautges }
6771d72bce8STim Tautges 
6781d72bce8STim Tautges 
6791d72bce8STim Tautges #undef __FUNCT__
6801d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag"
681aa768e4cSTim Tautges /*@
682aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
683aa768e4cSTim Tautges 
684aa768e4cSTim Tautges   Collective on MPI_Comm
685aa768e4cSTim Tautges 
686aa768e4cSTim Tautges   Input Parameter:
687aa768e4cSTim Tautges . dm      - The DMMoab object being set
688aa768e4cSTim Tautges 
689aa768e4cSTim Tautges   Output Parameter:
690aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
691aa768e4cSTim Tautges 
692aa768e4cSTim Tautges   Level: beginner
693aa768e4cSTim Tautges 
694aa768e4cSTim Tautges .keywords: DMMoab, create
695aa768e4cSTim Tautges @*/
6961d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
6971d72bce8STim Tautges {
6981d72bce8STim Tautges   PetscFunctionBegin;
6991d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7001d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
7011d72bce8STim Tautges   PetscFunctionReturn(0);
7021d72bce8STim Tautges }
7031d72bce8STim Tautges 
7041d72bce8STim Tautges 
7051d72bce8STim Tautges #undef __FUNCT__
7061d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize"
707aa768e4cSTim Tautges /*@
708aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
709aa768e4cSTim Tautges 
710aa768e4cSTim Tautges   Collective on MPI_Comm
711aa768e4cSTim Tautges 
712aa768e4cSTim Tautges   Input Parameter:
713aa768e4cSTim Tautges . dm - The DMMoab object being set
714aa768e4cSTim Tautges . bs - The block size used with this DMMoab
715aa768e4cSTim Tautges 
716aa768e4cSTim Tautges   Level: beginner
717aa768e4cSTim Tautges 
718aa768e4cSTim Tautges .keywords: DMMoab, create
719aa768e4cSTim Tautges @*/
7201d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
7211d72bce8STim Tautges {
7221d72bce8STim Tautges   PetscFunctionBegin;
7231d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7241d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
7251d72bce8STim Tautges   PetscFunctionReturn(0);
7261d72bce8STim Tautges }
7271d72bce8STim Tautges 
7281d72bce8STim Tautges 
7291d72bce8STim Tautges #undef __FUNCT__
7301d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize"
731aa768e4cSTim Tautges /*@
732aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
733aa768e4cSTim Tautges 
734aa768e4cSTim Tautges   Collective on MPI_Comm
735aa768e4cSTim Tautges 
736aa768e4cSTim Tautges   Input Parameter:
737aa768e4cSTim Tautges . dm - The DMMoab object being set
738aa768e4cSTim Tautges 
739aa768e4cSTim Tautges   Output Parameter:
740aa768e4cSTim Tautges . bs - The block size used with this DMMoab
741aa768e4cSTim Tautges 
742aa768e4cSTim Tautges   Level: beginner
743aa768e4cSTim Tautges 
744aa768e4cSTim Tautges .keywords: DMMoab, create
745aa768e4cSTim Tautges @*/
7461d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
7471d72bce8STim Tautges {
7481d72bce8STim Tautges   PetscFunctionBegin;
7491d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7501d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
7511d72bce8STim Tautges   PetscFunctionReturn(0);
7521d72bce8STim Tautges }
7531d72bce8STim Tautges 
7541cec0304SVijay Mahadevan 
7551cec0304SVijay Mahadevan #undef __FUNCT__
756212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetSize"
757212ad6d1SVijay Mahadevan /*@
758212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
759212ad6d1SVijay Mahadevan 
760212ad6d1SVijay Mahadevan   Collective on MPI_Comm
761212ad6d1SVijay Mahadevan 
762212ad6d1SVijay Mahadevan   Input Parameter:
763212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
764212ad6d1SVijay Mahadevan 
765212ad6d1SVijay Mahadevan   Output Parameter:
766212ad6d1SVijay Mahadevan . ng - The global size of the DMMoab instance
767212ad6d1SVijay Mahadevan 
768212ad6d1SVijay Mahadevan   Level: beginner
769212ad6d1SVijay Mahadevan 
770212ad6d1SVijay Mahadevan .keywords: DMMoab, create
771212ad6d1SVijay Mahadevan @*/
772212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *ng)
773212ad6d1SVijay Mahadevan {
774212ad6d1SVijay Mahadevan   PetscFunctionBegin;
775212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
776212ad6d1SVijay Mahadevan   if(ng) *ng = ((DM_Moab*)dm->data)->n;
777212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
778212ad6d1SVijay Mahadevan }
779212ad6d1SVijay Mahadevan 
780212ad6d1SVijay Mahadevan 
781212ad6d1SVijay Mahadevan #undef __FUNCT__
782212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalSize"
783212ad6d1SVijay Mahadevan /*@
784212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
785212ad6d1SVijay Mahadevan 
786212ad6d1SVijay Mahadevan   Collective on MPI_Comm
787212ad6d1SVijay Mahadevan 
788212ad6d1SVijay Mahadevan   Input Parameter:
789212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
790212ad6d1SVijay Mahadevan 
791212ad6d1SVijay Mahadevan   Output Parameter:
792212ad6d1SVijay Mahadevan . nl - The local size of the DMMoab instance
793212ad6d1SVijay Mahadevan . ng - The ghosted size of the DMMoab instance
794212ad6d1SVijay Mahadevan 
795212ad6d1SVijay Mahadevan   Level: beginner
796212ad6d1SVijay Mahadevan 
797212ad6d1SVijay Mahadevan .keywords: DMMoab, create
798212ad6d1SVijay Mahadevan @*/
799212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nl,PetscInt *ng)
800212ad6d1SVijay Mahadevan {
801212ad6d1SVijay Mahadevan   PetscFunctionBegin;
802212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
803212ad6d1SVijay Mahadevan   if(nl) *nl = ((DM_Moab*)dm->data)->nloc;
804212ad6d1SVijay Mahadevan   if(ng) *ng = ((DM_Moab*)dm->data)->nghost;
805212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
806212ad6d1SVijay Mahadevan }
807212ad6d1SVijay Mahadevan 
808212ad6d1SVijay Mahadevan 
809212ad6d1SVijay Mahadevan #undef __FUNCT__
8104920ab11SVijay Mahadevan #define __FUNCT__ "DMMoabGetDimension"
8114920ab11SVijay Mahadevan /*@
8124920ab11SVijay Mahadevan   DMMoabGetDimension - Get the dimension of the DM Mesh
8134920ab11SVijay Mahadevan 
8144920ab11SVijay Mahadevan   Collective on MPI_Comm
8154920ab11SVijay Mahadevan 
8164920ab11SVijay Mahadevan   Input Parameter:
8174920ab11SVijay Mahadevan . dm - The DMMoab object being set
8184920ab11SVijay Mahadevan 
8194920ab11SVijay Mahadevan   Output Parameter:
8204920ab11SVijay Mahadevan . dim - The dimension of DM
8214920ab11SVijay Mahadevan 
8224920ab11SVijay Mahadevan   Level: beginner
8234920ab11SVijay Mahadevan 
8244920ab11SVijay Mahadevan .keywords: DMMoab, create
8254920ab11SVijay Mahadevan @*/
8264920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim)
8274920ab11SVijay Mahadevan {
8284920ab11SVijay Mahadevan   PetscFunctionBegin;
8294920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8304920ab11SVijay Mahadevan   *dim = ((DM_Moab*)dm->data)->dim;
8314920ab11SVijay Mahadevan   PetscFunctionReturn(0);
8324920ab11SVijay Mahadevan }
8334920ab11SVijay Mahadevan 
8344920ab11SVijay Mahadevan 
8354920ab11SVijay Mahadevan 
8364920ab11SVijay Mahadevan #undef __FUNCT__
8377023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates"
8387023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos)
8397023aa44SVijay Mahadevan {
8407023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
8417023aa44SVijay Mahadevan   PetscErrorCode  ierr;
8427023aa44SVijay Mahadevan   moab::ErrorCode merr;
8437023aa44SVijay Mahadevan 
8447023aa44SVijay Mahadevan   PetscFunctionBegin;
8457023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8467023aa44SVijay Mahadevan   PetscValidPointer(conn,3);
8477023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8487023aa44SVijay Mahadevan 
8497023aa44SVijay Mahadevan   if (!vpos) {
8507023aa44SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr);
8517023aa44SVijay Mahadevan   }
8527023aa44SVijay Mahadevan 
8537023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
8547023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
8557023aa44SVijay Mahadevan   PetscFunctionReturn(0);
8567023aa44SVijay Mahadevan }
8577023aa44SVijay Mahadevan 
8587023aa44SVijay Mahadevan 
8597023aa44SVijay Mahadevan #undef __FUNCT__
8608d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexConnectivity"
8618d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
8628d8d51c8SVijay Mahadevan {
8638d8d51c8SVijay Mahadevan   DM_Moab        *dmmoab;
8648d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities,connect;
8658d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
8668d8d51c8SVijay Mahadevan   moab::ErrorCode merr;
8678d8d51c8SVijay Mahadevan 
8688d8d51c8SVijay Mahadevan   PetscFunctionBegin;
8698d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8708d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
8718d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8728d8d51c8SVijay Mahadevan 
8738d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
8748d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_adjacencies(&ehandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr);
8758d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr);
8768d8d51c8SVijay Mahadevan 
8778d8d51c8SVijay Mahadevan   if (conn) {
8788d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr);
8798d8d51c8SVijay Mahadevan     ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr);
8808d8d51c8SVijay Mahadevan   }
8818d8d51c8SVijay Mahadevan   if (nconn) *nconn=connect.size();
8828d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
8838d8d51c8SVijay Mahadevan }
8848d8d51c8SVijay Mahadevan 
8858d8d51c8SVijay Mahadevan 
8868d8d51c8SVijay Mahadevan #undef __FUNCT__
8878d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabRestoreVertexConnectivity"
8888d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
8898d8d51c8SVijay Mahadevan {
8908d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
8918d8d51c8SVijay Mahadevan 
8928d8d51c8SVijay Mahadevan   PetscFunctionBegin;
8938d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8948d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
8958d8d51c8SVijay Mahadevan 
8968d8d51c8SVijay Mahadevan   if (conn) {
8978d8d51c8SVijay Mahadevan     ierr = PetscFree(*conn);CHKERRQ(ierr);
8988d8d51c8SVijay Mahadevan   }
8998d8d51c8SVijay Mahadevan   if (nconn) *nconn=0;
9008d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
9018d8d51c8SVijay Mahadevan }
9028d8d51c8SVijay Mahadevan 
9038d8d51c8SVijay Mahadevan 
9048d8d51c8SVijay Mahadevan 
9058d8d51c8SVijay Mahadevan #undef __FUNCT__
9067023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity"
9077023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn)
9087023aa44SVijay Mahadevan {
9097023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
9107023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
9117023aa44SVijay Mahadevan   moab::ErrorCode merr;
9127023aa44SVijay Mahadevan   PetscInt nnodes;
9137023aa44SVijay Mahadevan 
9147023aa44SVijay Mahadevan   PetscFunctionBegin;
9157023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9167023aa44SVijay Mahadevan   PetscValidPointer(conn,4);
9177023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9187023aa44SVijay Mahadevan 
9197023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
9207023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr);
9217023aa44SVijay Mahadevan   if (conn) *conn=connect;
9227023aa44SVijay Mahadevan   if (nconn) *nconn=nnodes;
9237023aa44SVijay Mahadevan   PetscFunctionReturn(0);
9247023aa44SVijay Mahadevan }
9257023aa44SVijay Mahadevan 
9267023aa44SVijay Mahadevan 
9277023aa44SVijay Mahadevan #undef __FUNCT__
92869263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary"
92969263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary)
93069263071SVijay Mahadevan {
93169263071SVijay Mahadevan   moab::EntityType etype;
93269263071SVijay Mahadevan   DM_Moab         *dmmoab;
93369263071SVijay Mahadevan   PetscInt         edim;
93469263071SVijay Mahadevan 
93569263071SVijay Mahadevan   PetscFunctionBegin;
93669263071SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
93769263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary,3);
93869263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
93969263071SVijay Mahadevan 
94069263071SVijay Mahadevan   /* get the entity type and handle accordingly */
94169263071SVijay Mahadevan   etype=dmmoab->mbiface->type_from_handle(ent);
94269263071SVijay 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);
94369263071SVijay Mahadevan 
94469263071SVijay Mahadevan   /* get the entity dimension */
94569263071SVijay Mahadevan   edim=dmmoab->mbiface->dimension_from_handle(ent);
94669263071SVijay Mahadevan 
94769263071SVijay Mahadevan   *ent_on_boundary=PETSC_FALSE;
94869263071SVijay Mahadevan   if(etype == moab::MBVERTEX && edim == 0) {
9498d8d51c8SVijay Mahadevan     if (ent < (*dmmoab->vlocal)[0] || ent > (*dmmoab->vlocal)[dmmoab->nloc-1]) SETERRQ1(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Invalid boundary vertex entity handle: %D\n",ent);
9500c8a2322SVijay Mahadevan     *ent_on_boundary=dmmoab->isbndyvtx[(PetscInt)ent];
95169263071SVijay Mahadevan   }
95269263071SVijay Mahadevan   else {
95369263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
9548d8d51c8SVijay Mahadevan       if (ent < (*dmmoab->elocal)[0] || ent > (*dmmoab->elocal)[dmmoab->neleloc-1]) SETERRQ1(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Invalid boundary element entity handle: %D\n",ent);
9550c8a2322SVijay Mahadevan       *ent_on_boundary=dmmoab->isbndyelems[(PetscInt)ent];
95669263071SVijay Mahadevan     }
95769263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
9580c8a2322SVijay Mahadevan       /* how do we check the bounds before accessing ? will segfault for non-boundary faces */
9590c8a2322SVijay Mahadevan       *ent_on_boundary=dmmoab->isbndyfaces[(PetscInt)ent];
96069263071SVijay Mahadevan     }
96169263071SVijay Mahadevan   }
96269263071SVijay Mahadevan   PetscFunctionReturn(0);
96369263071SVijay Mahadevan }
96469263071SVijay Mahadevan 
96569263071SVijay Mahadevan 
96669263071SVijay Mahadevan #undef __FUNCT__
9677023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices"
96869263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx)
9697023aa44SVijay Mahadevan {
9707023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
9717023aa44SVijay Mahadevan   PetscInt       i;
9727023aa44SVijay Mahadevan 
9737023aa44SVijay Mahadevan   PetscFunctionBegin;
9747023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9757023aa44SVijay Mahadevan   PetscValidPointer(cnt,3);
9767023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx,4);
9777023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9787023aa44SVijay Mahadevan 
9797023aa44SVijay Mahadevan   for (i=0; i < nconn; ++i) {
9800c8a2322SVijay Mahadevan     isbdvtx[i]=dmmoab->isbndyvtx[(PetscInt)cnt[i]];
9817023aa44SVijay Mahadevan   }
9827023aa44SVijay Mahadevan   PetscFunctionReturn(0);
9837023aa44SVijay Mahadevan }
9847023aa44SVijay Mahadevan 
9857023aa44SVijay Mahadevan 
9867023aa44SVijay Mahadevan #undef __FUNCT__
9870c8a2322SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryMarkers"
9880c8a2322SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,PetscBool **bdvtx,PetscBool** bdelems,PetscBool** bdfaces)
9891cec0304SVijay Mahadevan {
9901cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
9911cec0304SVijay Mahadevan 
9921cec0304SVijay Mahadevan   PetscFunctionBegin;
9931cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9941cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9951cec0304SVijay Mahadevan 
9960c8a2322SVijay Mahadevan   if (bdvtx)  *bdvtx = dmmoab->isbndyvtx;
9970c8a2322SVijay Mahadevan   if (bdfaces)  *bdfaces = dmmoab->isbndyfaces;
9980c8a2322SVijay Mahadevan   if (bdelems)  *bdfaces = dmmoab->isbndyelems;
9991cec0304SVijay Mahadevan   PetscFunctionReturn(0);
10001cec0304SVijay Mahadevan }
10011cec0304SVijay Mahadevan 
1002