xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision fd3326ddcb8a6e5b5c2aff33d4a33fd55fec82ca)
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.");
58032b8ab6SVijay Mahadevan 
591cec0304SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
60*fd3326ddSVijay 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 
67*fd3326ddSVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
68*fd3326ddSVijay Mahadevan     adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
69*fd3326ddSVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
70*fd3326ddSVijay Mahadevan     adjs = moab::subtract(adjs, *dmmoab->vghost);
71*fd3326ddSVijay Mahadevan     *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs);
72*fd3326ddSVijay Mahadevan 
73*fd3326ddSVijay Mahadevan     /* compute and cache the sizes of local and ghosted entities */
74*fd3326ddSVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
75*fd3326ddSVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
76*fd3326ddSVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
77*fd3326ddSVijay Mahadevan 
78*fd3326ddSVijay Mahadevan #if 0
79*fd3326ddSVijay Mahadevan     if(dmmoab->pcomm->rank() || dmmoab->pcomm->size()==1) {
80*fd3326ddSVijay Mahadevan       PetscPrintf(PETSC_COMM_SELF, "Vertices: global: %D, local: %D", dmmoab->n, dmmoab->nloc+dmmoab->nghost);
81*fd3326ddSVijay Mahadevan       dmmoab->vlocal->print(0);
82*fd3326ddSVijay Mahadevan       PetscPrintf(PETSC_COMM_SELF, "Vertices: owned: %D", dmmoab->nloc);
83*fd3326ddSVijay Mahadevan       dmmoab->vowned->print(0);
84*fd3326ddSVijay Mahadevan       PetscPrintf(PETSC_COMM_SELF, "Vertices: ghost: %D", dmmoab->nghost);
85*fd3326ddSVijay Mahadevan       dmmoab->vghost->print(0);
86*fd3326ddSVijay Mahadevan     }
87*fd3326ddSVijay Mahadevan #endif
88*fd3326ddSVijay Mahadevan   }
89*fd3326ddSVijay Mahadevan 
90*fd3326ddSVijay 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);
1428cbae1a6SVijay Mahadevan     PetscInfo3(NULL, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin);
1431cec0304SVijay Mahadevan   }
144032b8ab6SVijay Mahadevan 
1451cec0304SVijay Mahadevan   {
1468cbae1a6SVijay Mahadevan     /* set the GID map */
147fc418013SVijay Mahadevan     for (i=0; i<totsize; ++i) {
148eb9d2429SVijay Mahadevan       dmmoab->gsindices[i]-=gmin;   /* zero based index needed for IS */
149fc418013SVijay Mahadevan     }
1508cbae1a6SVijay Mahadevan     i=j=0;
1518cbae1a6SVijay Mahadevan 
1528cbae1a6SVijay Mahadevan     ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->gidmap);CHKERRQ(ierr);
1538cbae1a6SVijay Mahadevan     ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->lidmap);CHKERRQ(ierr);
1548cbae1a6SVijay Mahadevan     ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->lmap);CHKERRQ(ierr);
1558cbae1a6SVijay Mahadevan     ierr = PetscMalloc(totsize*dmmoab->nfields*sizeof(PetscInt), &dmmoab->lgmap);CHKERRQ(ierr);
1568cbae1a6SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) {
1578cbae1a6SVijay Mahadevan       dmmoab->gidmap[(PetscInt)(*iter)]=dmmoab->gsindices[i];
1588cbae1a6SVijay Mahadevan       dmmoab->lidmap[(PetscInt)(*iter)]=i;
1598cbae1a6SVijay Mahadevan       dmmoab->lmap[i]=i;
1608cbae1a6SVijay Mahadevan       if (bs > 1)
1618cbae1a6SVijay Mahadevan         for (f=0;f<dmmoab->nfields;f++,j++)
1628cbae1a6SVijay Mahadevan           dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->nfields+f;
1638cbae1a6SVijay Mahadevan       else
1648cbae1a6SVijay Mahadevan         for (f=0;f<dmmoab->nfields;f++,j++)
1658cbae1a6SVijay Mahadevan           dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i];
1668cbae1a6SVijay Mahadevan     }
1678cbae1a6SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) {
1688cbae1a6SVijay Mahadevan       dmmoab->gidmap[(PetscInt)(*iter)]=dmmoab->gsindices[i];
1698cbae1a6SVijay Mahadevan       dmmoab->lidmap[(PetscInt)(*iter)]=i;
1708cbae1a6SVijay Mahadevan       dmmoab->lmap[i]=i;
1718cbae1a6SVijay Mahadevan       if (bs > 1)
1728cbae1a6SVijay Mahadevan         for (f=0;f<dmmoab->nfields;f++,j++)
1738cbae1a6SVijay Mahadevan           dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->nfields+f;
1748cbae1a6SVijay Mahadevan       else
1758cbae1a6SVijay Mahadevan         for (f=0;f<dmmoab->nfields;f++,j++)
1768cbae1a6SVijay Mahadevan           dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i];
1778cbae1a6SVijay Mahadevan     }
1788cbae1a6SVijay Mahadevan 
1798cbae1a6SVijay Mahadevan     /* global to local must retrieve ghost points */
1808cbae1a6SVijay Mahadevan     ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&dmmoab->lmap[0],PETSC_COPY_VALUES,&from);CHKERRQ(ierr);
1818cbae1a6SVijay Mahadevan     ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&dmmoab->gsindices[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr);
1828cbae1a6SVijay Mahadevan 
1838cbae1a6SVijay Mahadevan     if (!dmmoab->ltog_map) {
1848cbae1a6SVijay Mahadevan       /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */
1858cbae1a6SVijay Mahadevan       ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,totsize*dmmoab->nfields,dmmoab->lgmap,
1868cbae1a6SVijay Mahadevan                                           PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr);
1878cbae1a6SVijay Mahadevan     }
188fc418013SVijay Mahadevan 
189032b8ab6SVijay Mahadevan     /* Create Global to Local Vector Scatter Context */
190032b8ab6SVijay Mahadevan     ierr = DMCreateGlobalVector_Moab(dm, &global);CHKERRQ(ierr);
191032b8ab6SVijay Mahadevan     ierr = DMCreateLocalVector_Moab(dm, &local);CHKERRQ(ierr);
192032b8ab6SVijay Mahadevan 
1938cbae1a6SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
194032b8ab6SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
1958cbae1a6SVijay Mahadevan     ierr = ISDestroy(&to);CHKERRQ(ierr);
196032b8ab6SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
197032b8ab6SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
198032b8ab6SVijay Mahadevan   }
199032b8ab6SVijay Mahadevan 
2001cec0304SVijay Mahadevan   /* skin the boundary and store nodes */
2011cec0304SVijay Mahadevan   {
2020c8a2322SVijay Mahadevan     moab::Range bndyfaces, bndyvtx, bndyelems;
203eb9d2429SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
204eb9d2429SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
205eb9d2429SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
206eb9d2429SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
2071cec0304SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
208eb9d2429SVijay Mahadevan 
209eb9d2429SVijay Mahadevan     /* get the entities on the skin - only the faces */
210b5410836SVijay 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
211eb9d2429SVijay Mahadevan 
212eb9d2429SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
2130c8a2322SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
2140c8a2322SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr);
21569263071SVijay Mahadevan 
216eb9d2429SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
2170c8a2322SVijay Mahadevan     merr = dmmoab->mbiface->get_connectivity(bndyfaces, bndyvtx, false);MBERRNM(ierr);
2180c8a2322SVijay Mahadevan     merr = dmmoab->mbiface->get_adjacencies(bndyfaces, dmmoab->dim, false, bndyelems, moab::Interface::UNION);MBERRNM(ierr);
2198cbae1a6SVijay Mahadevan     PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", bndyvtx.size(), bndyvtx.size(), bndyelems.size());
2208d8d51c8SVijay Mahadevan 
2218d8d51c8SVijay Mahadevan     /* cache a bit-vector for easy query */
2220c8a2322SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscBool)*((PetscInt)(*bndyvtx.rbegin())+1),&dmmoab->isbndyvtx);CHKERRQ(ierr);
2230c8a2322SVijay Mahadevan     ierr = PetscMemzero(dmmoab->isbndyvtx,sizeof(PetscBool)*((PetscInt)(*bndyvtx.rbegin())+1));CHKERRQ(ierr);
2240c8a2322SVijay Mahadevan     for(moab::Range::iterator iter = bndyvtx.begin(); iter != bndyvtx.end(); iter++) {
2250c8a2322SVijay Mahadevan       dmmoab->isbndyvtx[(PetscInt)*iter]=PETSC_TRUE;
2268d8d51c8SVijay Mahadevan     }
2278d8d51c8SVijay Mahadevan 
2280c8a2322SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscBool)*((PetscInt)(*bndyelems.rbegin())+1),&dmmoab->isbndyelems);CHKERRQ(ierr);
2290c8a2322SVijay Mahadevan     ierr = PetscMemzero(dmmoab->isbndyelems,sizeof(PetscBool)*((PetscInt)(*bndyelems.rbegin())+1));CHKERRQ(ierr);
2300c8a2322SVijay Mahadevan     for(moab::Range::iterator iter = bndyelems.begin(); iter != bndyelems.end(); iter++) {
2310c8a2322SVijay Mahadevan       dmmoab->isbndyelems[(PetscInt)*iter]=PETSC_TRUE;
2328d8d51c8SVijay Mahadevan     }
2338d8d51c8SVijay Mahadevan 
2340c8a2322SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscBool)*((PetscInt)(*bndyfaces.rbegin())+1),&dmmoab->isbndyfaces);CHKERRQ(ierr);
2350c8a2322SVijay Mahadevan     ierr = PetscMemzero(dmmoab->isbndyfaces,sizeof(PetscBool)*((PetscInt)(*bndyfaces.rbegin())+1));CHKERRQ(ierr);
2360c8a2322SVijay Mahadevan     for(moab::Range::iterator iter = bndyfaces.begin(); iter != bndyfaces.end(); iter++) {
2370c8a2322SVijay Mahadevan       dmmoab->isbndyfaces[(PetscInt)*iter]=PETSC_TRUE;
2388d8d51c8SVijay Mahadevan     }
2391cec0304SVijay Mahadevan   }
240032b8ab6SVijay Mahadevan   PetscFunctionReturn(0);
241032b8ab6SVijay Mahadevan }
242032b8ab6SVijay Mahadevan 
2431cec0304SVijay Mahadevan 
244032b8ab6SVijay Mahadevan #undef __FUNCT__
245aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab"
246853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
247aa768e4cSTim Tautges {
248aa768e4cSTim Tautges   PetscErrorCode ierr;
249aa768e4cSTim Tautges 
250aa768e4cSTim Tautges   PetscFunctionBegin;
251aa768e4cSTim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
252032b8ab6SVijay Mahadevan   ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr);
253032b8ab6SVijay Mahadevan 
254032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
255324f1edfSVijay Mahadevan   ((DM_Moab*)dm->data)->nfields = 1;
256032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
257032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
258032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
259032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
260032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
261032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL;
262032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL;
263032b8ab6SVijay Mahadevan 
264032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
265032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
266032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
267032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
268032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
269aa768e4cSTim Tautges 
27097ea90e6SJed Brown   dm->ops->createglobalvector              = DMCreateGlobalVector_Moab;
27197ea90e6SJed Brown   dm->ops->createlocalvector               = DMCreateLocalVector_Moab;
272032b8ab6SVijay Mahadevan   dm->ops->creatematrix                    = DMCreateMatrix_Moab;
273032b8ab6SVijay Mahadevan   dm->ops->setup                           = DMSetUp_Moab;
27497ea90e6SJed Brown   dm->ops->destroy                         = DMDestroy_Moab;
275032b8ab6SVijay Mahadevan   dm->ops->globaltolocalbegin              = DMGlobalToLocalBegin_Moab;
276032b8ab6SVijay Mahadevan   dm->ops->globaltolocalend                = DMGlobalToLocalEnd_Moab;
277032b8ab6SVijay Mahadevan   dm->ops->localtoglobalbegin              = DMLocalToGlobalBegin_Moab;
278032b8ab6SVijay Mahadevan   dm->ops->localtoglobalend                = DMLocalToGlobalEnd_Moab;
279aa768e4cSTim Tautges   PetscFunctionReturn(0);
280aa768e4cSTim Tautges }
281fd349b41STim Tautges 
282fd349b41STim Tautges #undef __FUNCT__
2831d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate"
2841d72bce8STim Tautges /*@
2851d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
2861d72bce8STim Tautges 
2871d72bce8STim Tautges   Collective on MPI_Comm
2881d72bce8STim Tautges 
2891d72bce8STim Tautges   Input Parameter:
2901d72bce8STim Tautges . comm - The communicator for the DMMoab object
2911d72bce8STim Tautges 
2921d72bce8STim Tautges   Output Parameter:
293032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
2941d72bce8STim Tautges 
2951d72bce8STim Tautges   Level: beginner
2961d72bce8STim Tautges 
2971d72bce8STim Tautges .keywords: DMMoab, create
2981d72bce8STim Tautges @*/
299032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
3001d72bce8STim Tautges {
3011d72bce8STim Tautges   PetscErrorCode ierr;
3021d72bce8STim Tautges 
3031d72bce8STim Tautges   PetscFunctionBegin;
304032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,2);
305032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
306032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
3071d72bce8STim Tautges   PetscFunctionReturn(0);
3081d72bce8STim Tautges }
3091d72bce8STim Tautges 
3101d72bce8STim Tautges #undef __FUNCT__
311aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab"
3121d72bce8STim Tautges /*@
313a4d2169cSTim Tautges   DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data
3141d72bce8STim Tautges 
3151d72bce8STim Tautges   Collective on MPI_Comm
3161d72bce8STim Tautges 
3171d72bce8STim Tautges   Input Parameter:
3181d72bce8STim Tautges . comm - The communicator for the DMMoab object
319032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
320a4d2169cSTim Tautges          along with the DMMoab
321a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
3221d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
3231d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
3241d72bce8STim Tautges 
3251d72bce8STim Tautges   Output Parameter:
326032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
3271d72bce8STim Tautges 
328032b8ab6SVijay Mahadevan   Level: intermediate
3291d72bce8STim Tautges 
3301d72bce8STim Tautges .keywords: DMMoab, create
3311d72bce8STim Tautges @*/
332032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
3331d72bce8STim Tautges {
3341d72bce8STim Tautges   PetscErrorCode ierr;
335032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
3361cec0304SVijay Mahadevan   moab::EntityHandle partnset;
3371cec0304SVijay Mahadevan   PetscInt rank, nprocs;
338853cdec3SJed Brown   DM_Moab        *dmmoab;
3391d72bce8STim Tautges 
3401d72bce8STim Tautges   PetscFunctionBegin;
341032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,6);
342032b8ab6SVijay Mahadevan   ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr);
343032b8ab6SVijay Mahadevan   dmmoab = (DM_Moab*)(*dmb)->data;
344a4d2169cSTim Tautges 
345a4d2169cSTim Tautges   if (!mbiface) {
34672ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
3477d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
3481d72bce8STim Tautges   }
3491cec0304SVijay Mahadevan   else {
3501cec0304SVijay Mahadevan     dmmoab->mbiface = mbiface;
3517d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
3521cec0304SVijay Mahadevan   }
3531cec0304SVijay Mahadevan 
354b5410836SVijay Mahadevan   /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */
355b5410836SVijay Mahadevan   dmmoab->fileset=0;
3567d89fc02STim Tautges 
357a4d2169cSTim Tautges   if (!pcomm) {
358032b8ab6SVijay Mahadevan     ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
359032b8ab6SVijay Mahadevan     ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
360032b8ab6SVijay Mahadevan 
361db66d124SVijay Mahadevan     /* Create root sets for each mesh.  Then pass these
362db66d124SVijay Mahadevan        to the load_file functions to be populated. */
3630c8a2322SVijay Mahadevan     merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);MBERR("Creating partition set failed", merr);
364032b8ab6SVijay Mahadevan 
365db66d124SVijay Mahadevan     /* Create the parallel communicator object with the partition handle associated with MOAB */
36672ff976dSVijay Mahadevan     dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
36772ff976dSVijay Mahadevan   }
36872ff976dSVijay Mahadevan   else {
36972ff976dSVijay Mahadevan     ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr);
370032b8ab6SVijay Mahadevan   }
371032b8ab6SVijay Mahadevan 
3724973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
3734973de03SVijay Mahadevan   dmmoab->bs = 1;
374324f1edfSVijay Mahadevan   dmmoab->nfields = 1;
3754973de03SVijay Mahadevan 
3764973de03SVijay Mahadevan   /* set global ID tag handle */
377032b8ab6SVijay Mahadevan   if (!ltog_tag) {
3784973de03SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
379032b8ab6SVijay Mahadevan   }
380032b8ab6SVijay Mahadevan   else {
381032b8ab6SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr);
382a4d2169cSTim Tautges   }
383a4d2169cSTim Tautges 
3844973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
385a4d2169cSTim Tautges   if (range) {
3865eb88e9dSVijay Mahadevan     ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr);
387a4d2169cSTim Tautges   }
3881d72bce8STim Tautges   PetscFunctionReturn(0);
3891d72bce8STim Tautges }
3901d72bce8STim Tautges 
3911d72bce8STim Tautges #undef __FUNCT__
3921d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm"
393aa768e4cSTim Tautges /*@
394aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
395aa768e4cSTim Tautges 
396aa768e4cSTim Tautges   Collective on MPI_Comm
397aa768e4cSTim Tautges 
398aa768e4cSTim Tautges   Input Parameter:
399aa768e4cSTim Tautges . dm    - The DMMoab object being set
400aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
401aa768e4cSTim Tautges 
402aa768e4cSTim Tautges   Level: beginner
403aa768e4cSTim Tautges 
404aa768e4cSTim Tautges .keywords: DMMoab, create
405aa768e4cSTim Tautges @*/
4061d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
4071d72bce8STim Tautges {
408032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
409032b8ab6SVijay Mahadevan 
4101d72bce8STim Tautges   PetscFunctionBegin;
4111d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4121cec0304SVijay Mahadevan   PetscValidPointer(pcomm,2);
413032b8ab6SVijay Mahadevan   dmmoab->pcomm = pcomm;
414032b8ab6SVijay Mahadevan   dmmoab->mbiface = pcomm->get_moab();
415032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
4161d72bce8STim Tautges   PetscFunctionReturn(0);
4171d72bce8STim Tautges }
4181d72bce8STim Tautges 
4191d72bce8STim Tautges 
4201d72bce8STim Tautges #undef __FUNCT__
4211d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm"
422aa768e4cSTim Tautges /*@
423aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
424aa768e4cSTim Tautges 
425aa768e4cSTim Tautges   Collective on MPI_Comm
426aa768e4cSTim Tautges 
427aa768e4cSTim Tautges   Input Parameter:
428aa768e4cSTim Tautges . dm    - The DMMoab object being set
429aa768e4cSTim Tautges 
430aa768e4cSTim Tautges   Output Parameter:
431aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
432aa768e4cSTim Tautges 
433aa768e4cSTim Tautges   Level: beginner
434aa768e4cSTim Tautges 
435aa768e4cSTim Tautges .keywords: DMMoab, create
436aa768e4cSTim Tautges @*/
4371d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
4381d72bce8STim Tautges {
4391d72bce8STim Tautges   PetscFunctionBegin;
4401d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
441032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
4421d72bce8STim Tautges   PetscFunctionReturn(0);
4431d72bce8STim Tautges }
4441d72bce8STim Tautges 
4451d72bce8STim Tautges 
4461d72bce8STim Tautges #undef __FUNCT__
4471d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface"
448aa768e4cSTim Tautges /*@
449aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
450aa768e4cSTim Tautges 
451aa768e4cSTim Tautges   Collective on MPI_Comm
452aa768e4cSTim Tautges 
453aa768e4cSTim Tautges   Input Parameter:
454aa768e4cSTim Tautges . dm      - The DMMoab object being set
455aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
456aa768e4cSTim Tautges 
457aa768e4cSTim Tautges   Level: beginner
458aa768e4cSTim Tautges 
459aa768e4cSTim Tautges .keywords: DMMoab, create
460aa768e4cSTim Tautges @*/
461a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
4621d72bce8STim Tautges {
463032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
464032b8ab6SVijay Mahadevan 
4651d72bce8STim Tautges   PetscFunctionBegin;
4661d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4671cec0304SVijay Mahadevan   PetscValidPointer(mbiface,2);
468032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
469032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
470032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
4711d72bce8STim Tautges   PetscFunctionReturn(0);
4721d72bce8STim Tautges }
4731d72bce8STim Tautges 
4741d72bce8STim Tautges 
4751d72bce8STim Tautges #undef __FUNCT__
4761d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface"
477aa768e4cSTim Tautges /*@
478aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
479aa768e4cSTim Tautges 
480aa768e4cSTim Tautges   Collective on MPI_Comm
481aa768e4cSTim Tautges 
482aa768e4cSTim Tautges   Input Parameter:
483aa768e4cSTim Tautges . dm      - The DMMoab object being set
484aa768e4cSTim Tautges 
485aa768e4cSTim Tautges   Output Parameter:
486aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
487aa768e4cSTim Tautges 
488aa768e4cSTim Tautges   Level: beginner
489aa768e4cSTim Tautges 
490aa768e4cSTim Tautges .keywords: DMMoab, create
491aa768e4cSTim Tautges @*/
492a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
4931d72bce8STim Tautges {
4949426e041SSatish Balay   PetscErrorCode   ierr;
495cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
496cabb514dSBarry Smith 
4971d72bce8STim Tautges   PetscFunctionBegin;
4981d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
499cabb514dSBarry 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);
500a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
5011d72bce8STim Tautges   PetscFunctionReturn(0);
5021d72bce8STim Tautges }
5031d72bce8STim Tautges 
5041d72bce8STim Tautges 
5051d72bce8STim Tautges #undef __FUNCT__
5065eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices"
507aa768e4cSTim Tautges /*@
5085eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
509aa768e4cSTim Tautges 
510aa768e4cSTim Tautges   Collective on MPI_Comm
511aa768e4cSTim Tautges 
512aa768e4cSTim Tautges   Input Parameter:
513aa768e4cSTim Tautges . dm    - The DMMoab object being set
514aa768e4cSTim Tautges . range - The entities treated by this DMMoab
515aa768e4cSTim Tautges 
516aa768e4cSTim Tautges   Level: beginner
517aa768e4cSTim Tautges 
518aa768e4cSTim Tautges .keywords: DMMoab, create
519aa768e4cSTim Tautges @*/
5205eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range)
5211d72bce8STim Tautges {
522032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
523032b8ab6SVijay Mahadevan   PetscErrorCode  ierr;
524*fd3326ddSVijay Mahadevan   moab::Range     tmpvtxs;
525032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
526032b8ab6SVijay Mahadevan 
5271d72bce8STim Tautges   PetscFunctionBegin;
5281d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
529032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
530032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
531*fd3326ddSVijay Mahadevan 
532032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
533*fd3326ddSVijay Mahadevan 
534*fd3326ddSVijay Mahadevan   /* filter based on parallel status */
535*fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
536*fd3326ddSVijay Mahadevan 
537*fd3326ddSVijay Mahadevan   /* filter all the non-owned and shared entities out of the list */
538*fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
539*fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(tmpvtxs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
540*fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost);
541*fd3326ddSVijay Mahadevan   *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs);
542*fd3326ddSVijay Mahadevan 
543*fd3326ddSVijay Mahadevan   /* compute and cache the sizes of local and ghosted entities */
544032b8ab6SVijay Mahadevan   dmmoab->nloc = dmmoab->vowned->size();
545032b8ab6SVijay Mahadevan   dmmoab->nghost = dmmoab->vghost->size();
546032b8ab6SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
5471d72bce8STim Tautges   PetscFunctionReturn(0);
5481d72bce8STim Tautges }
5491d72bce8STim Tautges 
5501d72bce8STim Tautges 
5511d72bce8STim Tautges #undef __FUNCT__
5528d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetAllVertices"
5538d8d51c8SVijay Mahadevan /*@
5548d8d51c8SVijay Mahadevan   DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab
5558d8d51c8SVijay Mahadevan 
5568d8d51c8SVijay Mahadevan   Collective on MPI_Comm
5578d8d51c8SVijay Mahadevan 
5588d8d51c8SVijay Mahadevan   Input Parameter:
5598d8d51c8SVijay Mahadevan . dm    - The DMMoab object being set
5608d8d51c8SVijay Mahadevan 
5618d8d51c8SVijay Mahadevan   Output Parameter:
5628d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted)
5638d8d51c8SVijay Mahadevan 
5648d8d51c8SVijay Mahadevan   Level: beginner
5658d8d51c8SVijay Mahadevan 
5668d8d51c8SVijay Mahadevan .keywords: DMMoab, create
5678d8d51c8SVijay Mahadevan @*/
5688d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local)
5698d8d51c8SVijay Mahadevan {
5708d8d51c8SVijay Mahadevan   PetscFunctionBegin;
5718d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5728d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab*)dm->data)->vlocal;
5738d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
5748d8d51c8SVijay Mahadevan }
5758d8d51c8SVijay Mahadevan 
5768d8d51c8SVijay Mahadevan 
5778d8d51c8SVijay Mahadevan 
5788d8d51c8SVijay Mahadevan #undef __FUNCT__
5795eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices"
580aa768e4cSTim Tautges /*@
5815eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
582aa768e4cSTim Tautges 
583aa768e4cSTim Tautges   Collective on MPI_Comm
584aa768e4cSTim Tautges 
585aa768e4cSTim Tautges   Input Parameter:
586aa768e4cSTim Tautges . dm    - The DMMoab object being set
587aa768e4cSTim Tautges 
588aa768e4cSTim Tautges   Output Parameter:
5895eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab
5905eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition
591aa768e4cSTim Tautges 
592aa768e4cSTim Tautges   Level: beginner
593aa768e4cSTim Tautges 
594aa768e4cSTim Tautges .keywords: DMMoab, create
595aa768e4cSTim Tautges @*/
5961cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,moab::Range *owned,moab::Range *ghost)
5971d72bce8STim Tautges {
5981d72bce8STim Tautges   PetscFunctionBegin;
5991d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6001cec0304SVijay Mahadevan   if (owned) *owned = *((DM_Moab*)dm->data)->vowned;
6011cec0304SVijay Mahadevan   if (ghost) *ghost = *((DM_Moab*)dm->data)->vghost;
6021d72bce8STim Tautges   PetscFunctionReturn(0);
6031d72bce8STim Tautges }
6041d72bce8STim Tautges 
6051d72bce8STim Tautges #undef __FUNCT__
6065eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements"
6075eb88e9dSVijay Mahadevan /*@
6085eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
6095eb88e9dSVijay Mahadevan 
6105eb88e9dSVijay Mahadevan   Collective on MPI_Comm
6115eb88e9dSVijay Mahadevan 
6125eb88e9dSVijay Mahadevan   Input Parameter:
6135eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
6145eb88e9dSVijay Mahadevan 
6155eb88e9dSVijay Mahadevan   Output Parameter:
6165eb88e9dSVijay Mahadevan . range - The entities owned locally
6175eb88e9dSVijay Mahadevan 
6185eb88e9dSVijay Mahadevan   Level: beginner
6195eb88e9dSVijay Mahadevan 
6205eb88e9dSVijay Mahadevan .keywords: DMMoab, create
6215eb88e9dSVijay Mahadevan @*/
6221cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,moab::Range *range)
6235eb88e9dSVijay Mahadevan {
6245eb88e9dSVijay Mahadevan   PetscFunctionBegin;
6255eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6261cec0304SVijay Mahadevan   if (range) *range = *((DM_Moab*)dm->data)->elocal;
6271cec0304SVijay Mahadevan   PetscFunctionReturn(0);
6281cec0304SVijay Mahadevan }
6291cec0304SVijay Mahadevan 
6301cec0304SVijay Mahadevan 
6311cec0304SVijay Mahadevan #undef __FUNCT__
6321cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements"
6331cec0304SVijay Mahadevan /*@
6341cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
6351cec0304SVijay Mahadevan 
6361cec0304SVijay Mahadevan   Collective on MPI_Comm
6371cec0304SVijay Mahadevan 
6381cec0304SVijay Mahadevan   Input Parameter:
6391cec0304SVijay Mahadevan . dm    - The DMMoab object being set
6401cec0304SVijay Mahadevan . range - The entities treated by this DMMoab
6411cec0304SVijay Mahadevan 
6421cec0304SVijay Mahadevan   Level: beginner
6431cec0304SVijay Mahadevan 
6441cec0304SVijay Mahadevan .keywords: DMMoab, create
6451cec0304SVijay Mahadevan @*/
6461cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range)
6471cec0304SVijay Mahadevan {
6481cec0304SVijay Mahadevan   moab::ErrorCode merr;
6491cec0304SVijay Mahadevan   PetscErrorCode  ierr;
6501cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
6511cec0304SVijay Mahadevan 
6521cec0304SVijay Mahadevan   PetscFunctionBegin;
6531cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6541cec0304SVijay Mahadevan   dmmoab->elocal->clear();
6551cec0304SVijay Mahadevan   dmmoab->eghost->clear();
6561cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
6571cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
6581cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
6591cec0304SVijay Mahadevan   dmmoab->neleloc=dmmoab->elocal->size();
6601cec0304SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
6618cbae1a6SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele);
6625eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
6635eb88e9dSVijay Mahadevan }
6645eb88e9dSVijay Mahadevan 
6655eb88e9dSVijay Mahadevan 
6665eb88e9dSVijay Mahadevan #undef __FUNCT__
6671d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag"
668aa768e4cSTim Tautges /*@
669aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
670aa768e4cSTim Tautges 
671aa768e4cSTim Tautges   Collective on MPI_Comm
672aa768e4cSTim Tautges 
673aa768e4cSTim Tautges   Input Parameter:
674aa768e4cSTim Tautges . dm      - The DMMoab object being set
675aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
676aa768e4cSTim Tautges 
677aa768e4cSTim Tautges   Level: beginner
678aa768e4cSTim Tautges 
679aa768e4cSTim Tautges .keywords: DMMoab, create
680aa768e4cSTim Tautges @*/
6811d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
6821d72bce8STim Tautges {
6831d72bce8STim Tautges   PetscFunctionBegin;
6841d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6851d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
6861d72bce8STim Tautges   PetscFunctionReturn(0);
6871d72bce8STim Tautges }
6881d72bce8STim Tautges 
6891d72bce8STim Tautges 
6901d72bce8STim Tautges #undef __FUNCT__
6911d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag"
692aa768e4cSTim Tautges /*@
693aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
694aa768e4cSTim Tautges 
695aa768e4cSTim Tautges   Collective on MPI_Comm
696aa768e4cSTim Tautges 
697aa768e4cSTim Tautges   Input Parameter:
698aa768e4cSTim Tautges . dm      - The DMMoab object being set
699aa768e4cSTim Tautges 
700aa768e4cSTim Tautges   Output Parameter:
701aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
702aa768e4cSTim Tautges 
703aa768e4cSTim Tautges   Level: beginner
704aa768e4cSTim Tautges 
705aa768e4cSTim Tautges .keywords: DMMoab, create
706aa768e4cSTim Tautges @*/
7071d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
7081d72bce8STim Tautges {
7091d72bce8STim Tautges   PetscFunctionBegin;
7101d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7111d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
7121d72bce8STim Tautges   PetscFunctionReturn(0);
7131d72bce8STim Tautges }
7141d72bce8STim Tautges 
7151d72bce8STim Tautges 
7161d72bce8STim Tautges #undef __FUNCT__
7171d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize"
718aa768e4cSTim Tautges /*@
719aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
720aa768e4cSTim Tautges 
721aa768e4cSTim Tautges   Collective on MPI_Comm
722aa768e4cSTim Tautges 
723aa768e4cSTim Tautges   Input Parameter:
724aa768e4cSTim Tautges . dm - The DMMoab object being set
725aa768e4cSTim Tautges . bs - The block size used with this DMMoab
726aa768e4cSTim Tautges 
727aa768e4cSTim Tautges   Level: beginner
728aa768e4cSTim Tautges 
729aa768e4cSTim Tautges .keywords: DMMoab, create
730aa768e4cSTim Tautges @*/
7311d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
7321d72bce8STim Tautges {
7331d72bce8STim Tautges   PetscFunctionBegin;
7341d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7351d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
7361d72bce8STim Tautges   PetscFunctionReturn(0);
7371d72bce8STim Tautges }
7381d72bce8STim Tautges 
7391d72bce8STim Tautges 
7401d72bce8STim Tautges #undef __FUNCT__
7411d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize"
742aa768e4cSTim Tautges /*@
743aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
744aa768e4cSTim Tautges 
745aa768e4cSTim Tautges   Collective on MPI_Comm
746aa768e4cSTim Tautges 
747aa768e4cSTim Tautges   Input Parameter:
748aa768e4cSTim Tautges . dm - The DMMoab object being set
749aa768e4cSTim Tautges 
750aa768e4cSTim Tautges   Output Parameter:
751aa768e4cSTim Tautges . bs - The block size used with this DMMoab
752aa768e4cSTim Tautges 
753aa768e4cSTim Tautges   Level: beginner
754aa768e4cSTim Tautges 
755aa768e4cSTim Tautges .keywords: DMMoab, create
756aa768e4cSTim Tautges @*/
7571d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
7581d72bce8STim Tautges {
7591d72bce8STim Tautges   PetscFunctionBegin;
7601d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7611d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
7621d72bce8STim Tautges   PetscFunctionReturn(0);
7631d72bce8STim Tautges }
7641d72bce8STim Tautges 
7651cec0304SVijay Mahadevan 
7661cec0304SVijay Mahadevan #undef __FUNCT__
767212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetSize"
768212ad6d1SVijay Mahadevan /*@
769212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
770212ad6d1SVijay Mahadevan 
771212ad6d1SVijay Mahadevan   Collective on MPI_Comm
772212ad6d1SVijay Mahadevan 
773212ad6d1SVijay Mahadevan   Input Parameter:
774212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
775212ad6d1SVijay Mahadevan 
776212ad6d1SVijay Mahadevan   Output Parameter:
777212ad6d1SVijay Mahadevan . ng - The global size of the DMMoab instance
778212ad6d1SVijay Mahadevan 
779212ad6d1SVijay Mahadevan   Level: beginner
780212ad6d1SVijay Mahadevan 
781212ad6d1SVijay Mahadevan .keywords: DMMoab, create
782212ad6d1SVijay Mahadevan @*/
783212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *ng)
784212ad6d1SVijay Mahadevan {
785212ad6d1SVijay Mahadevan   PetscFunctionBegin;
786212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
787212ad6d1SVijay Mahadevan   if(ng) *ng = ((DM_Moab*)dm->data)->n;
788212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
789212ad6d1SVijay Mahadevan }
790212ad6d1SVijay Mahadevan 
791212ad6d1SVijay Mahadevan 
792212ad6d1SVijay Mahadevan #undef __FUNCT__
793212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalSize"
794212ad6d1SVijay Mahadevan /*@
795212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
796212ad6d1SVijay Mahadevan 
797212ad6d1SVijay Mahadevan   Collective on MPI_Comm
798212ad6d1SVijay Mahadevan 
799212ad6d1SVijay Mahadevan   Input Parameter:
800212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
801212ad6d1SVijay Mahadevan 
802212ad6d1SVijay Mahadevan   Output Parameter:
803212ad6d1SVijay Mahadevan . nl - The local size of the DMMoab instance
804212ad6d1SVijay Mahadevan . ng - The ghosted size of the DMMoab instance
805212ad6d1SVijay Mahadevan 
806212ad6d1SVijay Mahadevan   Level: beginner
807212ad6d1SVijay Mahadevan 
808212ad6d1SVijay Mahadevan .keywords: DMMoab, create
809212ad6d1SVijay Mahadevan @*/
810212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nl,PetscInt *ng)
811212ad6d1SVijay Mahadevan {
812212ad6d1SVijay Mahadevan   PetscFunctionBegin;
813212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
814212ad6d1SVijay Mahadevan   if(nl) *nl = ((DM_Moab*)dm->data)->nloc;
815212ad6d1SVijay Mahadevan   if(ng) *ng = ((DM_Moab*)dm->data)->nghost;
816212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
817212ad6d1SVijay Mahadevan }
818212ad6d1SVijay Mahadevan 
819212ad6d1SVijay Mahadevan 
820212ad6d1SVijay Mahadevan #undef __FUNCT__
8214920ab11SVijay Mahadevan #define __FUNCT__ "DMMoabGetDimension"
8224920ab11SVijay Mahadevan /*@
8234920ab11SVijay Mahadevan   DMMoabGetDimension - Get the dimension of the DM Mesh
8244920ab11SVijay Mahadevan 
8254920ab11SVijay Mahadevan   Collective on MPI_Comm
8264920ab11SVijay Mahadevan 
8274920ab11SVijay Mahadevan   Input Parameter:
8284920ab11SVijay Mahadevan . dm - The DMMoab object being set
8294920ab11SVijay Mahadevan 
8304920ab11SVijay Mahadevan   Output Parameter:
8314920ab11SVijay Mahadevan . dim - The dimension of DM
8324920ab11SVijay Mahadevan 
8334920ab11SVijay Mahadevan   Level: beginner
8344920ab11SVijay Mahadevan 
8354920ab11SVijay Mahadevan .keywords: DMMoab, create
8364920ab11SVijay Mahadevan @*/
8374920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim)
8384920ab11SVijay Mahadevan {
8394920ab11SVijay Mahadevan   PetscFunctionBegin;
8404920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8414920ab11SVijay Mahadevan   *dim = ((DM_Moab*)dm->data)->dim;
8424920ab11SVijay Mahadevan   PetscFunctionReturn(0);
8434920ab11SVijay Mahadevan }
8444920ab11SVijay Mahadevan 
8454920ab11SVijay Mahadevan 
8464920ab11SVijay Mahadevan 
8474920ab11SVijay Mahadevan #undef __FUNCT__
8487023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates"
8497023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos)
8507023aa44SVijay Mahadevan {
8517023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
8527023aa44SVijay Mahadevan   PetscErrorCode  ierr;
8537023aa44SVijay Mahadevan   moab::ErrorCode merr;
8547023aa44SVijay Mahadevan 
8557023aa44SVijay Mahadevan   PetscFunctionBegin;
8567023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8577023aa44SVijay Mahadevan   PetscValidPointer(conn,3);
8587023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8597023aa44SVijay Mahadevan 
8607023aa44SVijay Mahadevan   if (!vpos) {
8617023aa44SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr);
8627023aa44SVijay Mahadevan   }
8637023aa44SVijay Mahadevan 
8647023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
8657023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
8667023aa44SVijay Mahadevan   PetscFunctionReturn(0);
8677023aa44SVijay Mahadevan }
8687023aa44SVijay Mahadevan 
8697023aa44SVijay Mahadevan 
8707023aa44SVijay Mahadevan #undef __FUNCT__
8718d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexConnectivity"
8728d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
8738d8d51c8SVijay Mahadevan {
8748d8d51c8SVijay Mahadevan   DM_Moab        *dmmoab;
8758d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities,connect;
8768d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
8778d8d51c8SVijay Mahadevan   moab::ErrorCode merr;
8788d8d51c8SVijay Mahadevan 
8798d8d51c8SVijay Mahadevan   PetscFunctionBegin;
8808d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8818d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
8828d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8838d8d51c8SVijay Mahadevan 
8848d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
8858d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_adjacencies(&ehandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr);
8868d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr);
8878d8d51c8SVijay Mahadevan 
8888d8d51c8SVijay Mahadevan   if (conn) {
8898d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr);
8908d8d51c8SVijay Mahadevan     ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr);
8918d8d51c8SVijay Mahadevan   }
8928d8d51c8SVijay Mahadevan   if (nconn) *nconn=connect.size();
8938d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
8948d8d51c8SVijay Mahadevan }
8958d8d51c8SVijay Mahadevan 
8968d8d51c8SVijay Mahadevan 
8978d8d51c8SVijay Mahadevan #undef __FUNCT__
8988d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabRestoreVertexConnectivity"
8998d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
9008d8d51c8SVijay Mahadevan {
9018d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
9028d8d51c8SVijay Mahadevan 
9038d8d51c8SVijay Mahadevan   PetscFunctionBegin;
9048d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9058d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
9068d8d51c8SVijay Mahadevan 
9078d8d51c8SVijay Mahadevan   if (conn) {
9088d8d51c8SVijay Mahadevan     ierr = PetscFree(*conn);CHKERRQ(ierr);
9098d8d51c8SVijay Mahadevan   }
9108d8d51c8SVijay Mahadevan   if (nconn) *nconn=0;
9118d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
9128d8d51c8SVijay Mahadevan }
9138d8d51c8SVijay Mahadevan 
9148d8d51c8SVijay Mahadevan 
9158d8d51c8SVijay Mahadevan 
9168d8d51c8SVijay Mahadevan #undef __FUNCT__
9177023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity"
9187023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn)
9197023aa44SVijay Mahadevan {
9207023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
9217023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
9227023aa44SVijay Mahadevan   moab::ErrorCode merr;
9237023aa44SVijay Mahadevan   PetscInt nnodes;
9247023aa44SVijay Mahadevan 
9257023aa44SVijay Mahadevan   PetscFunctionBegin;
9267023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9277023aa44SVijay Mahadevan   PetscValidPointer(conn,4);
9287023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9297023aa44SVijay Mahadevan 
9307023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
9317023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr);
9327023aa44SVijay Mahadevan   if (conn) *conn=connect;
9337023aa44SVijay Mahadevan   if (nconn) *nconn=nnodes;
9347023aa44SVijay Mahadevan   PetscFunctionReturn(0);
9357023aa44SVijay Mahadevan }
9367023aa44SVijay Mahadevan 
9377023aa44SVijay Mahadevan 
9387023aa44SVijay Mahadevan #undef __FUNCT__
93969263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary"
94069263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary)
94169263071SVijay Mahadevan {
94269263071SVijay Mahadevan   moab::EntityType etype;
94369263071SVijay Mahadevan   DM_Moab         *dmmoab;
94469263071SVijay Mahadevan   PetscInt         edim;
94569263071SVijay Mahadevan 
94669263071SVijay Mahadevan   PetscFunctionBegin;
94769263071SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
94869263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary,3);
94969263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
95069263071SVijay Mahadevan 
95169263071SVijay Mahadevan   /* get the entity type and handle accordingly */
95269263071SVijay Mahadevan   etype=dmmoab->mbiface->type_from_handle(ent);
95369263071SVijay 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);
95469263071SVijay Mahadevan 
95569263071SVijay Mahadevan   /* get the entity dimension */
95669263071SVijay Mahadevan   edim=dmmoab->mbiface->dimension_from_handle(ent);
95769263071SVijay Mahadevan 
95869263071SVijay Mahadevan   *ent_on_boundary=PETSC_FALSE;
95969263071SVijay Mahadevan   if(etype == moab::MBVERTEX && edim == 0) {
9608d8d51c8SVijay 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);
9610c8a2322SVijay Mahadevan     *ent_on_boundary=dmmoab->isbndyvtx[(PetscInt)ent];
96269263071SVijay Mahadevan   }
96369263071SVijay Mahadevan   else {
96469263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
9658d8d51c8SVijay 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);
9660c8a2322SVijay Mahadevan       *ent_on_boundary=dmmoab->isbndyelems[(PetscInt)ent];
96769263071SVijay Mahadevan     }
96869263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
9690c8a2322SVijay Mahadevan       /* how do we check the bounds before accessing ? will segfault for non-boundary faces */
9700c8a2322SVijay Mahadevan       *ent_on_boundary=dmmoab->isbndyfaces[(PetscInt)ent];
97169263071SVijay Mahadevan     }
97269263071SVijay Mahadevan   }
97369263071SVijay Mahadevan   PetscFunctionReturn(0);
97469263071SVijay Mahadevan }
97569263071SVijay Mahadevan 
97669263071SVijay Mahadevan 
97769263071SVijay Mahadevan #undef __FUNCT__
9787023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices"
97969263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx)
9807023aa44SVijay Mahadevan {
9817023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
9827023aa44SVijay Mahadevan   PetscInt       i;
9837023aa44SVijay Mahadevan 
9847023aa44SVijay Mahadevan   PetscFunctionBegin;
9857023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9867023aa44SVijay Mahadevan   PetscValidPointer(cnt,3);
9877023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx,4);
9887023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9897023aa44SVijay Mahadevan 
9907023aa44SVijay Mahadevan   for (i=0; i < nconn; ++i) {
9910c8a2322SVijay Mahadevan     isbdvtx[i]=dmmoab->isbndyvtx[(PetscInt)cnt[i]];
9927023aa44SVijay Mahadevan   }
9937023aa44SVijay Mahadevan   PetscFunctionReturn(0);
9947023aa44SVijay Mahadevan }
9957023aa44SVijay Mahadevan 
9967023aa44SVijay Mahadevan 
9977023aa44SVijay Mahadevan #undef __FUNCT__
9980c8a2322SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryMarkers"
9990c8a2322SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,PetscBool **bdvtx,PetscBool** bdelems,PetscBool** bdfaces)
10001cec0304SVijay Mahadevan {
10011cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
10021cec0304SVijay Mahadevan 
10031cec0304SVijay Mahadevan   PetscFunctionBegin;
10041cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
10051cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
10061cec0304SVijay Mahadevan 
10070c8a2322SVijay Mahadevan   if (bdvtx)  *bdvtx = dmmoab->isbndyvtx;
10080c8a2322SVijay Mahadevan   if (bdfaces)  *bdfaces = dmmoab->isbndyfaces;
10090c8a2322SVijay Mahadevan   if (bdelems)  *bdfaces = dmmoab->isbndyelems;
10101cec0304SVijay Mahadevan   PetscFunctionReturn(0);
10111cec0304SVijay Mahadevan }
10121cec0304SVijay Mahadevan 
1013