xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 00cc10fe87a41897d4accd8ccd86b3adfb380782)
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;
266d9eb265SVijay Mahadevan   delete dmmoab->bndyvtx;
276d9eb265SVijay Mahadevan   delete dmmoab->bndyfaces;
286d9eb265SVijay Mahadevan   delete dmmoab->bndyelems;
298d8d51c8SVijay Mahadevan 
30fc418013SVijay Mahadevan   ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr);
318cbae1a6SVijay Mahadevan   ierr = PetscFree(dmmoab->lidmap);CHKERRQ(ierr);
328cbae1a6SVijay Mahadevan   ierr = PetscFree(dmmoab->gidmap);CHKERRQ(ierr);
3373d8e6d3SVijay Mahadevan   ierr = PetscFree(dmmoab->llmap);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;
5073d8e6d3SVijay Mahadevan   PetscInt                i,j,f,bs,gmin,lmin,lmax,vent,totsize;
51032b8ab6SVijay Mahadevan   DM_Moab                *dmmoab = (DM_Moab*)dm->data;
528cbae1a6SVijay Mahadevan   moab::Range             adjs;
5369263071SVijay Mahadevan 
54032b8ab6SVijay Mahadevan   PetscFunctionBegin;
55032b8ab6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
56032b8ab6SVijay Mahadevan   /* Get the local and shared vertices and cache it */
57032b8ab6SVijay Mahadevan   if (dmmoab->mbiface == PETSC_NULL || dmmoab->pcomm == PETSC_NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface and ParallelComm objects before calling SetUp.");
58032b8ab6SVijay Mahadevan 
591cec0304SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
60fd3326ddSVijay Mahadevan   if (dmmoab->vlocal->empty())
618cbae1a6SVijay Mahadevan   {
621cec0304SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
63032b8ab6SVijay Mahadevan 
64032b8ab6SVijay Mahadevan     /* filter based on parallel status */
65fc418013SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
66032b8ab6SVijay Mahadevan 
67fd3326ddSVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
68fd3326ddSVijay Mahadevan     adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
69fd3326ddSVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
70fd3326ddSVijay Mahadevan     adjs = moab::subtract(adjs, *dmmoab->vghost);
71fd3326ddSVijay Mahadevan     *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs);
72fd3326ddSVijay Mahadevan 
73fd3326ddSVijay Mahadevan     /* compute and cache the sizes of local and ghosted entities */
74fd3326ddSVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
75fd3326ddSVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
76fd3326ddSVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
77fd3326ddSVijay Mahadevan 
78fd3326ddSVijay Mahadevan #if 0
79fd3326ddSVijay Mahadevan     if(dmmoab->pcomm->rank() || dmmoab->pcomm->size()==1) {
80fd3326ddSVijay Mahadevan       PetscPrintf(PETSC_COMM_SELF, "Vertices: global: %D, local: %D", dmmoab->n, dmmoab->nloc+dmmoab->nghost);
81fd3326ddSVijay Mahadevan       dmmoab->vlocal->print(0);
82fd3326ddSVijay Mahadevan       PetscPrintf(PETSC_COMM_SELF, "Vertices: owned: %D", dmmoab->nloc);
83fd3326ddSVijay Mahadevan       dmmoab->vowned->print(0);
84fd3326ddSVijay Mahadevan       PetscPrintf(PETSC_COMM_SELF, "Vertices: ghost: %D", dmmoab->nghost);
85fd3326ddSVijay Mahadevan       dmmoab->vghost->print(0);
86fd3326ddSVijay Mahadevan     }
87fd3326ddSVijay Mahadevan #endif
88fd3326ddSVijay Mahadevan   }
89fd3326ddSVijay Mahadevan 
90fd3326ddSVijay Mahadevan   {
91032b8ab6SVijay Mahadevan     /* get the information about the local elements in the mesh */
92032b8ab6SVijay Mahadevan     dmmoab->eghost->clear();
93fc418013SVijay Mahadevan 
94fc418013SVijay Mahadevan     /* first decipher the leading dimension */
95fc418013SVijay Mahadevan     for (i=3;i>0;i--) {
96fc418013SVijay Mahadevan       dmmoab->elocal->clear();
97fc418013SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr);
98fc418013SVijay Mahadevan 
99fc418013SVijay Mahadevan       /* store the current mesh dimension */
100fc418013SVijay Mahadevan       if (dmmoab->elocal->size()) {
101fc418013SVijay Mahadevan         dmmoab->dim=i;
102fc418013SVijay Mahadevan         break;
103fc418013SVijay Mahadevan       }
104fc418013SVijay Mahadevan     }
105fc418013SVijay Mahadevan 
1068cbae1a6SVijay Mahadevan     /* filter the ghosted and owned element list */
107032b8ab6SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
108032b8ab6SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
109032b8ab6SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
110032b8ab6SVijay Mahadevan 
111032b8ab6SVijay Mahadevan     dmmoab->neleloc = dmmoab->elocal->size();
11241dd5348SVijay Mahadevan     dmmoab->neleghost = dmmoab->eghost->size();
113032b8ab6SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
114032b8ab6SVijay Mahadevan   }
115032b8ab6SVijay Mahadevan 
116032b8ab6SVijay Mahadevan   bs = dmmoab->bs;
117032b8ab6SVijay Mahadevan   if (!dmmoab->ltog_tag) {
118db66d124SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
119db66d124SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
120db66d124SVijay Mahadevan        assemble the individual pieces of the mesh */
121032b8ab6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
122032b8ab6SVijay Mahadevan   }
123032b8ab6SVijay Mahadevan 
124032b8ab6SVijay Mahadevan   totsize=dmmoab->vlocal->size();
1258cbae1a6SVijay 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);
126fc418013SVijay Mahadevan   ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->gsindices);CHKERRQ(ierr);
1271cec0304SVijay Mahadevan   {
128032b8ab6SVijay Mahadevan     /* first get the local indices */
129fc418013SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr);
1304a40b570SVijay Mahadevan     /* next get the ghosted indices */
131fc418013SVijay Mahadevan     if (dmmoab->nghost) {
132fc418013SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr);
1331cec0304SVijay Mahadevan     }
1346e40195eSVijay Mahadevan 
1356e40195eSVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
136eb9d2429SVijay Mahadevan     lmin=lmax=dmmoab->gsindices[0];
13769263071SVijay Mahadevan     for (i=0; i<totsize; ++i) {
138eb9d2429SVijay Mahadevan       if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i];
139eb9d2429SVijay Mahadevan       if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i];
140fc418013SVijay Mahadevan     }
1416e40195eSVijay Mahadevan 
142eb9d2429SVijay Mahadevan     ierr = MPI_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr);
143032b8ab6SVijay Mahadevan 
1448cbae1a6SVijay Mahadevan     /* set the GID map */
145fc418013SVijay Mahadevan     for (i=0; i<totsize; ++i) {
146eb9d2429SVijay Mahadevan       dmmoab->gsindices[i]-=gmin;   /* zero based index needed for IS */
147fc418013SVijay Mahadevan     }
1486d9eb265SVijay Mahadevan     lmin-=gmin;
1496d9eb265SVijay Mahadevan     lmax-=gmin;
1506d9eb265SVijay Mahadevan 
1516d9eb265SVijay Mahadevan     PetscInfo3(NULL, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin);
1526d9eb265SVijay Mahadevan   }
1536d9eb265SVijay Mahadevan 
1546d9eb265SVijay Mahadevan   {
1558cbae1a6SVijay Mahadevan 
1568cbae1a6SVijay Mahadevan     ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->gidmap);CHKERRQ(ierr);
1578cbae1a6SVijay Mahadevan     ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->lidmap);CHKERRQ(ierr);
158addae81cSVijay Mahadevan     ierr = PetscMalloc(totsize*dmmoab->numFields*sizeof(PetscInt), &dmmoab->llmap);CHKERRQ(ierr);
159addae81cSVijay Mahadevan     ierr = PetscMalloc(totsize*dmmoab->numFields*sizeof(PetscInt), &dmmoab->lgmap);CHKERRQ(ierr);
1606d9eb265SVijay Mahadevan 
1616d9eb265SVijay Mahadevan     i=j=0;
16273d8e6d3SVijay Mahadevan     /* set the owned vertex data first */
1638cbae1a6SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) {
16473d8e6d3SVijay Mahadevan       vent=(PetscInt)(*iter);
16573d8e6d3SVijay Mahadevan       dmmoab->gidmap[vent]=dmmoab->gsindices[i];
16673d8e6d3SVijay Mahadevan       dmmoab->lidmap[vent]=i;
16773d8e6d3SVijay Mahadevan       if (bs > 1) {
168addae81cSVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
169addae81cSVijay Mahadevan           dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f;
170addae81cSVijay Mahadevan           dmmoab->llmap[j]=i*dmmoab->numFields+f;
171addae81cSVijay Mahadevan           PetscInfo4(NULL, "Owned Vertex: %D,  Field: %D \t  LID = %D \t GID = %D.\n", *iter, f, i*dmmoab->numFields+f, dmmoab->gsindices[i]*dmmoab->numFields+f);
1728cbae1a6SVijay Mahadevan         }
17373d8e6d3SVijay Mahadevan       }
17473d8e6d3SVijay Mahadevan       else {
175addae81cSVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
1768cbae1a6SVijay Mahadevan           dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i];
17773d8e6d3SVijay Mahadevan           dmmoab->llmap[j]=totsize*f+i;
17873d8e6d3SVijay Mahadevan           PetscInfo4(NULL, "Owned Vertex: %D,  Field: %D \t  LID = %D \t GID = %D.\n", *iter, f, totsize*f+i, totsize*f+dmmoab->gsindices[i]);
17973d8e6d3SVijay Mahadevan         }
18073d8e6d3SVijay Mahadevan       }
18173d8e6d3SVijay Mahadevan     }
18273d8e6d3SVijay Mahadevan     /* next arrange all the ghosted data information */
18373d8e6d3SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) {
18473d8e6d3SVijay Mahadevan       vent=(PetscInt)(*iter);
18573d8e6d3SVijay Mahadevan       dmmoab->gidmap[vent]=dmmoab->gsindices[i];
18673d8e6d3SVijay Mahadevan       dmmoab->lidmap[vent]=i;
18773d8e6d3SVijay Mahadevan       if (bs > 1) {
188addae81cSVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
189addae81cSVijay Mahadevan           dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f;
190addae81cSVijay Mahadevan           dmmoab->llmap[j]=i*dmmoab->numFields+f;
191addae81cSVijay Mahadevan           PetscInfo4(NULL, "Ghost Vertex: %D,  Field: %D \t  LID = %D \t GID = %D.\n", vent, f, i*dmmoab->numFields+f, dmmoab->gsindices[i]*dmmoab->numFields+f);
19273d8e6d3SVijay Mahadevan         }
19373d8e6d3SVijay Mahadevan       }
19473d8e6d3SVijay Mahadevan       else {
195addae81cSVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
19673d8e6d3SVijay Mahadevan           dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i];
19773d8e6d3SVijay Mahadevan           dmmoab->llmap[j]=totsize*f+i;
19873d8e6d3SVijay Mahadevan           PetscInfo4(NULL, "Ghost Vertex: %D,  Field: %D \t  LID = %D \t GID = %D.\n", vent, f, totsize*f+i, totsize*f+dmmoab->gsindices[i]);
19973d8e6d3SVijay Mahadevan         }
20073d8e6d3SVijay Mahadevan       }
2018cbae1a6SVijay Mahadevan     }
2028cbae1a6SVijay Mahadevan 
2036d9eb265SVijay Mahadevan     /* We need to create the Global to Local Vector Scatter Contexts
2046d9eb265SVijay Mahadevan        1) First create a local and global vector
2056d9eb265SVijay Mahadevan        2) Create a local and global IS
2066d9eb265SVijay Mahadevan        3) Create VecScatter and LtoGMapping objects
2076d9eb265SVijay Mahadevan        4) Cleanup the IS and Vec objects
2086d9eb265SVijay Mahadevan     */
2096d9eb265SVijay Mahadevan     ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr);
2106d9eb265SVijay Mahadevan     ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr);
2116d9eb265SVijay Mahadevan 
2126d9eb265SVijay Mahadevan     ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr);
2136d9eb265SVijay Mahadevan     PetscInfo3(NULL, "Total-size = %D\t Owned = %D, Ghosted = %D.\n", totsize, dmmoab->nloc, dmmoab->nghost);
2146d9eb265SVijay Mahadevan 
2158cbae1a6SVijay Mahadevan     /* global to local must retrieve ghost points */
216addae81cSVijay Mahadevan     ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,dmmoab->vstart,1,&from);CHKERRQ(ierr);
2176d9eb265SVijay Mahadevan     ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr);
2186d9eb265SVijay Mahadevan 
219addae81cSVijay Mahadevan     ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,&dmmoab->lgmap[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr);
2206d9eb265SVijay Mahadevan     ierr = ISSetBlockSize(to,bs);CHKERRQ(ierr);
2216d9eb265SVijay Mahadevan 
2228cbae1a6SVijay Mahadevan     if (!dmmoab->ltog_map) {
2238cbae1a6SVijay Mahadevan       /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */
224addae81cSVijay Mahadevan       ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,totsize*dmmoab->numFields,dmmoab->lgmap,
2258cbae1a6SVijay Mahadevan                                           PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr);
2268cbae1a6SVijay Mahadevan     }
227fc418013SVijay Mahadevan 
22873d8e6d3SVijay Mahadevan     /* now create the scatter object from local to global vector */
2298cbae1a6SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
23073d8e6d3SVijay Mahadevan 
23173d8e6d3SVijay Mahadevan     /* clean up IS, Vec */
232032b8ab6SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
2338cbae1a6SVijay Mahadevan     ierr = ISDestroy(&to);CHKERRQ(ierr);
234032b8ab6SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
235032b8ab6SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
236032b8ab6SVijay Mahadevan   }
237032b8ab6SVijay Mahadevan 
2381cec0304SVijay Mahadevan   /* skin the boundary and store nodes */
2391cec0304SVijay Mahadevan   {
240eb9d2429SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
241eb9d2429SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
242eb9d2429SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
243eb9d2429SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
2441cec0304SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
245eb9d2429SVijay Mahadevan 
2466d9eb265SVijay Mahadevan     dmmoab->bndyvtx = new moab::Range();
2476d9eb265SVijay Mahadevan     dmmoab->bndyfaces = new moab::Range();
2486d9eb265SVijay Mahadevan     dmmoab->bndyelems = new moab::Range();
2496d9eb265SVijay Mahadevan 
250eb9d2429SVijay Mahadevan     /* get the entities on the skin - only the faces */
2516d9eb265SVijay Mahadevan     merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, *dmmoab->bndyfaces, NULL, false, true, false);MBERRNM(merr); // 'false' param indicates we want faces back, not vertices
252eb9d2429SVijay Mahadevan 
253eb9d2429SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
2546d9eb265SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
2556d9eb265SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr);
25669263071SVijay Mahadevan 
257eb9d2429SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
2586d9eb265SVijay Mahadevan     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr);
2596d9eb265SVijay Mahadevan     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr);
2606d9eb265SVijay Mahadevan     PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size());
2611cec0304SVijay Mahadevan   }
262032b8ab6SVijay Mahadevan   PetscFunctionReturn(0);
263032b8ab6SVijay Mahadevan }
264032b8ab6SVijay Mahadevan 
2651cec0304SVijay Mahadevan 
266032b8ab6SVijay Mahadevan #undef __FUNCT__
267aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab"
268853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
269aa768e4cSTim Tautges {
270aa768e4cSTim Tautges   PetscErrorCode ierr;
271aa768e4cSTim Tautges 
272aa768e4cSTim Tautges   PetscFunctionBegin;
273aa768e4cSTim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
274032b8ab6SVijay Mahadevan   ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr);
275032b8ab6SVijay Mahadevan 
276032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
277addae81cSVijay Mahadevan   ((DM_Moab*)dm->data)->numFields = 1;
278032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
279032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
28041dd5348SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
281032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
282032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
28341dd5348SVijay Mahadevan   ((DM_Moab*)dm->data)->neleghost = 0;
284032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL;
285032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL;
286032b8ab6SVijay Mahadevan 
287032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
288032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
289032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
290032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
291032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
292aa768e4cSTim Tautges 
29397ea90e6SJed Brown   dm->ops->createglobalvector              = DMCreateGlobalVector_Moab;
29497ea90e6SJed Brown   dm->ops->createlocalvector               = DMCreateLocalVector_Moab;
295032b8ab6SVijay Mahadevan   dm->ops->creatematrix                    = DMCreateMatrix_Moab;
296032b8ab6SVijay Mahadevan   dm->ops->setup                           = DMSetUp_Moab;
29797ea90e6SJed Brown   dm->ops->destroy                         = DMDestroy_Moab;
298032b8ab6SVijay Mahadevan   dm->ops->globaltolocalbegin              = DMGlobalToLocalBegin_Moab;
299032b8ab6SVijay Mahadevan   dm->ops->globaltolocalend                = DMGlobalToLocalEnd_Moab;
300032b8ab6SVijay Mahadevan   dm->ops->localtoglobalbegin              = DMLocalToGlobalBegin_Moab;
301032b8ab6SVijay Mahadevan   dm->ops->localtoglobalend                = DMLocalToGlobalEnd_Moab;
302aa768e4cSTim Tautges   PetscFunctionReturn(0);
303aa768e4cSTim Tautges }
304fd349b41STim Tautges 
305fd349b41STim Tautges #undef __FUNCT__
3061d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate"
3071d72bce8STim Tautges /*@
3081d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
3091d72bce8STim Tautges 
3101d72bce8STim Tautges   Collective on MPI_Comm
3111d72bce8STim Tautges 
3121d72bce8STim Tautges   Input Parameter:
3131d72bce8STim Tautges . comm - The communicator for the DMMoab object
3141d72bce8STim Tautges 
3151d72bce8STim Tautges   Output Parameter:
316032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
3171d72bce8STim Tautges 
3181d72bce8STim Tautges   Level: beginner
3191d72bce8STim Tautges 
3201d72bce8STim Tautges .keywords: DMMoab, create
3211d72bce8STim Tautges @*/
322032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
3231d72bce8STim Tautges {
3241d72bce8STim Tautges   PetscErrorCode ierr;
3251d72bce8STim Tautges 
3261d72bce8STim Tautges   PetscFunctionBegin;
327032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,2);
328032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
329032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
3301d72bce8STim Tautges   PetscFunctionReturn(0);
3311d72bce8STim Tautges }
3321d72bce8STim Tautges 
3331d72bce8STim Tautges #undef __FUNCT__
334aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab"
3351d72bce8STim Tautges /*@
336a4d2169cSTim Tautges   DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data
3371d72bce8STim Tautges 
3381d72bce8STim Tautges   Collective on MPI_Comm
3391d72bce8STim Tautges 
3401d72bce8STim Tautges   Input Parameter:
3411d72bce8STim Tautges . comm - The communicator for the DMMoab object
342032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
343a4d2169cSTim Tautges          along with the DMMoab
344a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
3451d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
3461d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
3471d72bce8STim Tautges 
3481d72bce8STim Tautges   Output Parameter:
349032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
3501d72bce8STim Tautges 
351032b8ab6SVijay Mahadevan   Level: intermediate
3521d72bce8STim Tautges 
3531d72bce8STim Tautges .keywords: DMMoab, create
3541d72bce8STim Tautges @*/
355032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
3561d72bce8STim Tautges {
3571d72bce8STim Tautges   PetscErrorCode ierr;
358032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
3591cec0304SVijay Mahadevan   moab::EntityHandle partnset;
3601cec0304SVijay Mahadevan   PetscInt rank, nprocs;
361853cdec3SJed Brown   DM_Moab        *dmmoab;
3621d72bce8STim Tautges 
3631d72bce8STim Tautges   PetscFunctionBegin;
364032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,6);
365032b8ab6SVijay Mahadevan   ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr);
366032b8ab6SVijay Mahadevan   dmmoab = (DM_Moab*)(*dmb)->data;
367a4d2169cSTim Tautges 
368a4d2169cSTim Tautges   if (!mbiface) {
36972ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
3707d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
3711d72bce8STim Tautges   }
3721cec0304SVijay Mahadevan   else {
3731cec0304SVijay Mahadevan     dmmoab->mbiface = mbiface;
3747d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
3751cec0304SVijay Mahadevan   }
3761cec0304SVijay Mahadevan 
377b5410836SVijay Mahadevan   /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */
378b5410836SVijay Mahadevan   dmmoab->fileset=0;
3797d89fc02STim Tautges 
380a4d2169cSTim Tautges   if (!pcomm) {
381032b8ab6SVijay Mahadevan     ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
382032b8ab6SVijay Mahadevan     ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
383032b8ab6SVijay Mahadevan 
384db66d124SVijay Mahadevan     /* Create root sets for each mesh.  Then pass these
385db66d124SVijay Mahadevan        to the load_file functions to be populated. */
3860c8a2322SVijay Mahadevan     merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);MBERR("Creating partition set failed", merr);
387032b8ab6SVijay Mahadevan 
388db66d124SVijay Mahadevan     /* Create the parallel communicator object with the partition handle associated with MOAB */
38972ff976dSVijay Mahadevan     dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
39072ff976dSVijay Mahadevan   }
39172ff976dSVijay Mahadevan   else {
39272ff976dSVijay Mahadevan     ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr);
393032b8ab6SVijay Mahadevan   }
394032b8ab6SVijay Mahadevan 
3954973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
3964973de03SVijay Mahadevan   dmmoab->bs = 1;
397addae81cSVijay Mahadevan   dmmoab->numFields = 1;
3984973de03SVijay Mahadevan 
3994973de03SVijay Mahadevan   /* set global ID tag handle */
400032b8ab6SVijay Mahadevan   if (!ltog_tag) {
4014973de03SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
402032b8ab6SVijay Mahadevan   }
403032b8ab6SVijay Mahadevan   else {
404032b8ab6SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr);
405a4d2169cSTim Tautges   }
406a4d2169cSTim Tautges 
4074973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
408a4d2169cSTim Tautges   if (range) {
4095eb88e9dSVijay Mahadevan     ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr);
410a4d2169cSTim Tautges   }
4111d72bce8STim Tautges   PetscFunctionReturn(0);
4121d72bce8STim Tautges }
4131d72bce8STim Tautges 
4141d72bce8STim Tautges #undef __FUNCT__
4151d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm"
416aa768e4cSTim Tautges /*@
417aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
418aa768e4cSTim Tautges 
419aa768e4cSTim Tautges   Collective on MPI_Comm
420aa768e4cSTim Tautges 
421aa768e4cSTim Tautges   Input Parameter:
422aa768e4cSTim Tautges . dm    - The DMMoab object being set
423aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
424aa768e4cSTim Tautges 
425aa768e4cSTim Tautges   Level: beginner
426aa768e4cSTim Tautges 
427aa768e4cSTim Tautges .keywords: DMMoab, create
428aa768e4cSTim Tautges @*/
4291d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
4301d72bce8STim Tautges {
431032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
432032b8ab6SVijay Mahadevan 
4331d72bce8STim Tautges   PetscFunctionBegin;
4341d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4351cec0304SVijay Mahadevan   PetscValidPointer(pcomm,2);
436032b8ab6SVijay Mahadevan   dmmoab->pcomm = pcomm;
437032b8ab6SVijay Mahadevan   dmmoab->mbiface = pcomm->get_moab();
438032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
4391d72bce8STim Tautges   PetscFunctionReturn(0);
4401d72bce8STim Tautges }
4411d72bce8STim Tautges 
4421d72bce8STim Tautges 
4431d72bce8STim Tautges #undef __FUNCT__
4441d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm"
445aa768e4cSTim Tautges /*@
446aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
447aa768e4cSTim Tautges 
448aa768e4cSTim Tautges   Collective on MPI_Comm
449aa768e4cSTim Tautges 
450aa768e4cSTim Tautges   Input Parameter:
451aa768e4cSTim Tautges . dm    - The DMMoab object being set
452aa768e4cSTim Tautges 
453aa768e4cSTim Tautges   Output Parameter:
454aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
455aa768e4cSTim Tautges 
456aa768e4cSTim Tautges   Level: beginner
457aa768e4cSTim Tautges 
458aa768e4cSTim Tautges .keywords: DMMoab, create
459aa768e4cSTim Tautges @*/
4601d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
4611d72bce8STim Tautges {
4621d72bce8STim Tautges   PetscFunctionBegin;
4631d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
464032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
4651d72bce8STim Tautges   PetscFunctionReturn(0);
4661d72bce8STim Tautges }
4671d72bce8STim Tautges 
4681d72bce8STim Tautges 
4691d72bce8STim Tautges #undef __FUNCT__
4701d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface"
471aa768e4cSTim Tautges /*@
472aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
473aa768e4cSTim Tautges 
474aa768e4cSTim Tautges   Collective on MPI_Comm
475aa768e4cSTim Tautges 
476aa768e4cSTim Tautges   Input Parameter:
477aa768e4cSTim Tautges . dm      - The DMMoab object being set
478aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
479aa768e4cSTim Tautges 
480aa768e4cSTim Tautges   Level: beginner
481aa768e4cSTim Tautges 
482aa768e4cSTim Tautges .keywords: DMMoab, create
483aa768e4cSTim Tautges @*/
484a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
4851d72bce8STim Tautges {
486032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
487032b8ab6SVijay Mahadevan 
4881d72bce8STim Tautges   PetscFunctionBegin;
4891d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4901cec0304SVijay Mahadevan   PetscValidPointer(mbiface,2);
491032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
492032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
493032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
4941d72bce8STim Tautges   PetscFunctionReturn(0);
4951d72bce8STim Tautges }
4961d72bce8STim Tautges 
4971d72bce8STim Tautges 
4981d72bce8STim Tautges #undef __FUNCT__
4991d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface"
500aa768e4cSTim Tautges /*@
501aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
502aa768e4cSTim Tautges 
503aa768e4cSTim Tautges   Collective on MPI_Comm
504aa768e4cSTim Tautges 
505aa768e4cSTim Tautges   Input Parameter:
506aa768e4cSTim Tautges . dm      - The DMMoab object being set
507aa768e4cSTim Tautges 
508aa768e4cSTim Tautges   Output Parameter:
509aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
510aa768e4cSTim Tautges 
511aa768e4cSTim Tautges   Level: beginner
512aa768e4cSTim Tautges 
513aa768e4cSTim Tautges .keywords: DMMoab, create
514aa768e4cSTim Tautges @*/
515a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
5161d72bce8STim Tautges {
5179426e041SSatish Balay   PetscErrorCode   ierr;
518cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
519cabb514dSBarry Smith 
5201d72bce8STim Tautges   PetscFunctionBegin;
5211d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
522cabb514dSBarry 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);
523a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
5241d72bce8STim Tautges   PetscFunctionReturn(0);
5251d72bce8STim Tautges }
5261d72bce8STim Tautges 
5271d72bce8STim Tautges 
5281d72bce8STim Tautges #undef __FUNCT__
5295eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices"
530aa768e4cSTim Tautges /*@
5315eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
532aa768e4cSTim Tautges 
533aa768e4cSTim Tautges   Collective on MPI_Comm
534aa768e4cSTim Tautges 
535aa768e4cSTim Tautges   Input Parameter:
536aa768e4cSTim Tautges . dm    - The DMMoab object being set
537aa768e4cSTim Tautges . range - The entities treated by this DMMoab
538aa768e4cSTim Tautges 
539aa768e4cSTim Tautges   Level: beginner
540aa768e4cSTim Tautges 
541aa768e4cSTim Tautges .keywords: DMMoab, create
542aa768e4cSTim Tautges @*/
5435eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range)
5441d72bce8STim Tautges {
545032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
546032b8ab6SVijay Mahadevan   PetscErrorCode  ierr;
547fd3326ddSVijay Mahadevan   moab::Range     tmpvtxs;
548032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
549032b8ab6SVijay Mahadevan 
5501d72bce8STim Tautges   PetscFunctionBegin;
5511d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
552032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
553032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
554fd3326ddSVijay Mahadevan 
555032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
556fd3326ddSVijay Mahadevan 
557fd3326ddSVijay Mahadevan   /* filter based on parallel status */
558fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
559fd3326ddSVijay Mahadevan 
560fd3326ddSVijay Mahadevan   /* filter all the non-owned and shared entities out of the list */
561fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
562fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(tmpvtxs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
563fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost);
564fd3326ddSVijay Mahadevan   *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs);
565fd3326ddSVijay Mahadevan 
566fd3326ddSVijay Mahadevan   /* compute and cache the sizes of local and ghosted entities */
567032b8ab6SVijay Mahadevan   dmmoab->nloc = dmmoab->vowned->size();
568032b8ab6SVijay Mahadevan   dmmoab->nghost = dmmoab->vghost->size();
569032b8ab6SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
5701d72bce8STim Tautges   PetscFunctionReturn(0);
5711d72bce8STim Tautges }
5721d72bce8STim Tautges 
5731d72bce8STim Tautges 
5741d72bce8STim Tautges #undef __FUNCT__
5758d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetAllVertices"
5768d8d51c8SVijay Mahadevan /*@
5778d8d51c8SVijay Mahadevan   DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab
5788d8d51c8SVijay Mahadevan 
5798d8d51c8SVijay Mahadevan   Collective on MPI_Comm
5808d8d51c8SVijay Mahadevan 
5818d8d51c8SVijay Mahadevan   Input Parameter:
5828d8d51c8SVijay Mahadevan . dm    - The DMMoab object being set
5838d8d51c8SVijay Mahadevan 
5848d8d51c8SVijay Mahadevan   Output Parameter:
5858d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted)
5868d8d51c8SVijay Mahadevan 
5878d8d51c8SVijay Mahadevan   Level: beginner
5888d8d51c8SVijay Mahadevan 
5898d8d51c8SVijay Mahadevan .keywords: DMMoab, create
5908d8d51c8SVijay Mahadevan @*/
5918d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local)
5928d8d51c8SVijay Mahadevan {
5938d8d51c8SVijay Mahadevan   PetscFunctionBegin;
5948d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5958d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab*)dm->data)->vlocal;
5968d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
5978d8d51c8SVijay Mahadevan }
5988d8d51c8SVijay Mahadevan 
5998d8d51c8SVijay Mahadevan 
6008d8d51c8SVijay Mahadevan 
6018d8d51c8SVijay Mahadevan #undef __FUNCT__
6025eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices"
603aa768e4cSTim Tautges /*@
6045eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
605aa768e4cSTim Tautges 
606aa768e4cSTim Tautges   Collective on MPI_Comm
607aa768e4cSTim Tautges 
608aa768e4cSTim Tautges   Input Parameter:
609aa768e4cSTim Tautges . dm    - The DMMoab object being set
610aa768e4cSTim Tautges 
611aa768e4cSTim Tautges   Output Parameter:
6125eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab
6135eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition
614aa768e4cSTim Tautges 
615aa768e4cSTim Tautges   Level: beginner
616aa768e4cSTim Tautges 
617aa768e4cSTim Tautges .keywords: DMMoab, create
618aa768e4cSTim Tautges @*/
6191cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,moab::Range *owned,moab::Range *ghost)
6201d72bce8STim Tautges {
6211d72bce8STim Tautges   PetscFunctionBegin;
6221d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6231cec0304SVijay Mahadevan   if (owned) *owned = *((DM_Moab*)dm->data)->vowned;
6241cec0304SVijay Mahadevan   if (ghost) *ghost = *((DM_Moab*)dm->data)->vghost;
6251d72bce8STim Tautges   PetscFunctionReturn(0);
6261d72bce8STim Tautges }
6271d72bce8STim Tautges 
6281d72bce8STim Tautges #undef __FUNCT__
6295eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements"
6305eb88e9dSVijay Mahadevan /*@
6315eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
6325eb88e9dSVijay Mahadevan 
6335eb88e9dSVijay Mahadevan   Collective on MPI_Comm
6345eb88e9dSVijay Mahadevan 
6355eb88e9dSVijay Mahadevan   Input Parameter:
6365eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
6375eb88e9dSVijay Mahadevan 
6385eb88e9dSVijay Mahadevan   Output Parameter:
6395eb88e9dSVijay Mahadevan . range - The entities owned locally
6405eb88e9dSVijay Mahadevan 
6415eb88e9dSVijay Mahadevan   Level: beginner
6425eb88e9dSVijay Mahadevan 
6435eb88e9dSVijay Mahadevan .keywords: DMMoab, create
6445eb88e9dSVijay Mahadevan @*/
6451cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,moab::Range *range)
6465eb88e9dSVijay Mahadevan {
6475eb88e9dSVijay Mahadevan   PetscFunctionBegin;
6485eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6491cec0304SVijay Mahadevan   if (range) *range = *((DM_Moab*)dm->data)->elocal;
6501cec0304SVijay Mahadevan   PetscFunctionReturn(0);
6511cec0304SVijay Mahadevan }
6521cec0304SVijay Mahadevan 
6531cec0304SVijay Mahadevan 
6541cec0304SVijay Mahadevan #undef __FUNCT__
6551cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements"
6561cec0304SVijay Mahadevan /*@
6571cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
6581cec0304SVijay Mahadevan 
6591cec0304SVijay Mahadevan   Collective on MPI_Comm
6601cec0304SVijay Mahadevan 
6611cec0304SVijay Mahadevan   Input Parameter:
6621cec0304SVijay Mahadevan . dm    - The DMMoab object being set
6631cec0304SVijay Mahadevan . range - The entities treated by this DMMoab
6641cec0304SVijay Mahadevan 
6651cec0304SVijay Mahadevan   Level: beginner
6661cec0304SVijay Mahadevan 
6671cec0304SVijay Mahadevan .keywords: DMMoab, create
6681cec0304SVijay Mahadevan @*/
6691cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range)
6701cec0304SVijay Mahadevan {
6711cec0304SVijay Mahadevan   moab::ErrorCode merr;
6721cec0304SVijay Mahadevan   PetscErrorCode  ierr;
6731cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
6741cec0304SVijay Mahadevan 
6751cec0304SVijay Mahadevan   PetscFunctionBegin;
6761cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6771cec0304SVijay Mahadevan   dmmoab->elocal->clear();
6781cec0304SVijay Mahadevan   dmmoab->eghost->clear();
6791cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
6801cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
6811cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
6821cec0304SVijay Mahadevan   dmmoab->neleloc=dmmoab->elocal->size();
68341dd5348SVijay Mahadevan   dmmoab->neleghost=dmmoab->eghost->size();
6841cec0304SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
6858cbae1a6SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele);
6865eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
6875eb88e9dSVijay Mahadevan }
6885eb88e9dSVijay Mahadevan 
6895eb88e9dSVijay Mahadevan 
6905eb88e9dSVijay Mahadevan #undef __FUNCT__
6911d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag"
692aa768e4cSTim Tautges /*@
693aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set 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 . ltogtag - The MOAB tag used for local to global ids
700aa768e4cSTim Tautges 
701aa768e4cSTim Tautges   Level: beginner
702aa768e4cSTim Tautges 
703aa768e4cSTim Tautges .keywords: DMMoab, create
704aa768e4cSTim Tautges @*/
7051d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
7061d72bce8STim Tautges {
7071d72bce8STim Tautges   PetscFunctionBegin;
7081d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7091d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
7101d72bce8STim Tautges   PetscFunctionReturn(0);
7111d72bce8STim Tautges }
7121d72bce8STim Tautges 
7131d72bce8STim Tautges 
7141d72bce8STim Tautges #undef __FUNCT__
7151d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag"
716aa768e4cSTim Tautges /*@
717aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
718aa768e4cSTim Tautges 
719aa768e4cSTim Tautges   Collective on MPI_Comm
720aa768e4cSTim Tautges 
721aa768e4cSTim Tautges   Input Parameter:
722aa768e4cSTim Tautges . dm      - The DMMoab object being set
723aa768e4cSTim Tautges 
724aa768e4cSTim Tautges   Output Parameter:
725aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
726aa768e4cSTim Tautges 
727aa768e4cSTim Tautges   Level: beginner
728aa768e4cSTim Tautges 
729aa768e4cSTim Tautges .keywords: DMMoab, create
730aa768e4cSTim Tautges @*/
7311d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
7321d72bce8STim Tautges {
7331d72bce8STim Tautges   PetscFunctionBegin;
7341d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7351d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
7361d72bce8STim Tautges   PetscFunctionReturn(0);
7371d72bce8STim Tautges }
7381d72bce8STim Tautges 
7391d72bce8STim Tautges 
7401d72bce8STim Tautges #undef __FUNCT__
7411d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize"
742aa768e4cSTim Tautges /*@
743aa768e4cSTim Tautges   DMMoabSetBlockSize - Set 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 . bs - The block size used with this DMMoab
750aa768e4cSTim Tautges 
751aa768e4cSTim Tautges   Level: beginner
752aa768e4cSTim Tautges 
753aa768e4cSTim Tautges .keywords: DMMoab, create
754aa768e4cSTim Tautges @*/
7551d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
7561d72bce8STim Tautges {
7571d72bce8STim Tautges   PetscFunctionBegin;
7581d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7591d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
7601d72bce8STim Tautges   PetscFunctionReturn(0);
7611d72bce8STim Tautges }
7621d72bce8STim Tautges 
7631d72bce8STim Tautges 
7641d72bce8STim Tautges #undef __FUNCT__
7651d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize"
766aa768e4cSTim Tautges /*@
767aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
768aa768e4cSTim Tautges 
769aa768e4cSTim Tautges   Collective on MPI_Comm
770aa768e4cSTim Tautges 
771aa768e4cSTim Tautges   Input Parameter:
772aa768e4cSTim Tautges . dm - The DMMoab object being set
773aa768e4cSTim Tautges 
774aa768e4cSTim Tautges   Output Parameter:
775aa768e4cSTim Tautges . bs - The block size used with this DMMoab
776aa768e4cSTim Tautges 
777aa768e4cSTim Tautges   Level: beginner
778aa768e4cSTim Tautges 
779aa768e4cSTim Tautges .keywords: DMMoab, create
780aa768e4cSTim Tautges @*/
7811d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
7821d72bce8STim Tautges {
7831d72bce8STim Tautges   PetscFunctionBegin;
7841d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7851d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
7861d72bce8STim Tautges   PetscFunctionReturn(0);
7871d72bce8STim Tautges }
7881d72bce8STim Tautges 
7891cec0304SVijay Mahadevan 
7901cec0304SVijay Mahadevan #undef __FUNCT__
791212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetSize"
792212ad6d1SVijay Mahadevan /*@
793212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
794212ad6d1SVijay Mahadevan 
795*00cc10feSVijay Mahadevan   Collective on DM
796212ad6d1SVijay Mahadevan 
797212ad6d1SVijay Mahadevan   Input Parameter:
798212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
799212ad6d1SVijay Mahadevan 
800212ad6d1SVijay Mahadevan   Output Parameter:
801*00cc10feSVijay Mahadevan . neg - The number of global elements in the DMMoab instance
802*00cc10feSVijay Mahadevan . nvg - The number of global vertices in the DMMoab instance
803212ad6d1SVijay Mahadevan 
804212ad6d1SVijay Mahadevan   Level: beginner
805212ad6d1SVijay Mahadevan 
806212ad6d1SVijay Mahadevan .keywords: DMMoab, create
807212ad6d1SVijay Mahadevan @*/
80841dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *neg,PetscInt *nvg)
809212ad6d1SVijay Mahadevan {
810212ad6d1SVijay Mahadevan   PetscFunctionBegin;
811212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
81241dd5348SVijay Mahadevan   if(neg) *neg = ((DM_Moab*)dm->data)->nele;
81341dd5348SVijay Mahadevan   if(nvg) *nvg = ((DM_Moab*)dm->data)->n;
814212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
815212ad6d1SVijay Mahadevan }
816212ad6d1SVijay Mahadevan 
817212ad6d1SVijay Mahadevan 
818212ad6d1SVijay Mahadevan #undef __FUNCT__
819212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalSize"
820212ad6d1SVijay Mahadevan /*@
821212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
822212ad6d1SVijay Mahadevan 
823*00cc10feSVijay Mahadevan   Collective on DM
824212ad6d1SVijay Mahadevan 
825212ad6d1SVijay Mahadevan   Input Parameter:
826212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
827212ad6d1SVijay Mahadevan 
828212ad6d1SVijay Mahadevan   Output Parameter:
829*00cc10feSVijay Mahadevan . nel - The number of owned elements in this processor
830*00cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor
831*00cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor
832*00cc10feSVijay Mahadevan . nvg - The number of ghosted vertices in this processor
833212ad6d1SVijay Mahadevan 
834212ad6d1SVijay Mahadevan   Level: beginner
835212ad6d1SVijay Mahadevan 
836212ad6d1SVijay Mahadevan .keywords: DMMoab, create
837212ad6d1SVijay Mahadevan @*/
83841dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nel,PetscInt *neg,PetscInt *nvl,PetscInt *nvg)
839212ad6d1SVijay Mahadevan {
840212ad6d1SVijay Mahadevan   PetscFunctionBegin;
841212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
84241dd5348SVijay Mahadevan   if(nel) *nel = ((DM_Moab*)dm->data)->neleloc;
84341dd5348SVijay Mahadevan   if(neg) *neg = ((DM_Moab*)dm->data)->neleghost;
84441dd5348SVijay Mahadevan   if(nvl) *nvl = ((DM_Moab*)dm->data)->nloc;
84541dd5348SVijay Mahadevan   if(nvg) *nvg = ((DM_Moab*)dm->data)->nghost;
846212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
847212ad6d1SVijay Mahadevan }
848212ad6d1SVijay Mahadevan 
849212ad6d1SVijay Mahadevan 
850212ad6d1SVijay Mahadevan #undef __FUNCT__
851*00cc10feSVijay Mahadevan #define __FUNCT__ "DMMoabGetOffset"
852*00cc10feSVijay Mahadevan /*@
853*00cc10feSVijay Mahadevan   DMMoabGetOffset - Get the local offset for the global vector
854*00cc10feSVijay Mahadevan 
855*00cc10feSVijay Mahadevan   Collective on MPI_Comm
856*00cc10feSVijay Mahadevan 
857*00cc10feSVijay Mahadevan   Input Parameter:
858*00cc10feSVijay Mahadevan . dm - The DMMoab object being set
859*00cc10feSVijay Mahadevan 
860*00cc10feSVijay Mahadevan   Output Parameter:
861*00cc10feSVijay Mahadevan . offset - The local offset for the global vector
862*00cc10feSVijay Mahadevan 
863*00cc10feSVijay Mahadevan   Level: beginner
864*00cc10feSVijay Mahadevan 
865*00cc10feSVijay Mahadevan .keywords: DMMoab, create
866*00cc10feSVijay Mahadevan @*/
867*00cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm,PetscInt *offset)
868*00cc10feSVijay Mahadevan {
869*00cc10feSVijay Mahadevan   PetscFunctionBegin;
870*00cc10feSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
871*00cc10feSVijay Mahadevan   *offset = ((DM_Moab*)dm->data)->vstart;
872*00cc10feSVijay Mahadevan   PetscFunctionReturn(0);
873*00cc10feSVijay Mahadevan }
874*00cc10feSVijay Mahadevan 
875*00cc10feSVijay Mahadevan 
876*00cc10feSVijay Mahadevan #undef __FUNCT__
8774920ab11SVijay Mahadevan #define __FUNCT__ "DMMoabGetDimension"
8784920ab11SVijay Mahadevan /*@
8794920ab11SVijay Mahadevan   DMMoabGetDimension - Get the dimension of the DM Mesh
8804920ab11SVijay Mahadevan 
8814920ab11SVijay Mahadevan   Collective on MPI_Comm
8824920ab11SVijay Mahadevan 
8834920ab11SVijay Mahadevan   Input Parameter:
8844920ab11SVijay Mahadevan . dm - The DMMoab object being set
8854920ab11SVijay Mahadevan 
8864920ab11SVijay Mahadevan   Output Parameter:
8874920ab11SVijay Mahadevan . dim - The dimension of DM
8884920ab11SVijay Mahadevan 
8894920ab11SVijay Mahadevan   Level: beginner
8904920ab11SVijay Mahadevan 
8914920ab11SVijay Mahadevan .keywords: DMMoab, create
8924920ab11SVijay Mahadevan @*/
8934920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim)
8944920ab11SVijay Mahadevan {
8954920ab11SVijay Mahadevan   PetscFunctionBegin;
8964920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8974920ab11SVijay Mahadevan   *dim = ((DM_Moab*)dm->data)->dim;
8984920ab11SVijay Mahadevan   PetscFunctionReturn(0);
8994920ab11SVijay Mahadevan }
9004920ab11SVijay Mahadevan 
9014920ab11SVijay Mahadevan 
9024920ab11SVijay Mahadevan 
9034920ab11SVijay Mahadevan #undef __FUNCT__
9047023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates"
9057023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos)
9067023aa44SVijay Mahadevan {
9077023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
9087023aa44SVijay Mahadevan   PetscErrorCode  ierr;
9097023aa44SVijay Mahadevan   moab::ErrorCode merr;
9107023aa44SVijay Mahadevan 
9117023aa44SVijay Mahadevan   PetscFunctionBegin;
9127023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9137023aa44SVijay Mahadevan   PetscValidPointer(conn,3);
9147023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9157023aa44SVijay Mahadevan 
9167023aa44SVijay Mahadevan   if (!vpos) {
9177023aa44SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr);
9187023aa44SVijay Mahadevan   }
9197023aa44SVijay Mahadevan 
9207023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
9217023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
9227023aa44SVijay Mahadevan   PetscFunctionReturn(0);
9237023aa44SVijay Mahadevan }
9247023aa44SVijay Mahadevan 
9257023aa44SVijay Mahadevan 
9267023aa44SVijay Mahadevan #undef __FUNCT__
9278d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexConnectivity"
9288d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
9298d8d51c8SVijay Mahadevan {
9308d8d51c8SVijay Mahadevan   DM_Moab        *dmmoab;
9318d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities,connect;
9328d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
9338d8d51c8SVijay Mahadevan   moab::ErrorCode merr;
9348d8d51c8SVijay Mahadevan 
9358d8d51c8SVijay Mahadevan   PetscFunctionBegin;
9368d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9378d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
9388d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9398d8d51c8SVijay Mahadevan 
9408d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
9418d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_adjacencies(&ehandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr);
9428d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr);
9438d8d51c8SVijay Mahadevan 
9448d8d51c8SVijay Mahadevan   if (conn) {
9458d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr);
9468d8d51c8SVijay Mahadevan     ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr);
9478d8d51c8SVijay Mahadevan   }
9488d8d51c8SVijay Mahadevan   if (nconn) *nconn=connect.size();
9498d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
9508d8d51c8SVijay Mahadevan }
9518d8d51c8SVijay Mahadevan 
9528d8d51c8SVijay Mahadevan 
9538d8d51c8SVijay Mahadevan #undef __FUNCT__
9548d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabRestoreVertexConnectivity"
9558d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
9568d8d51c8SVijay Mahadevan {
9578d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
9588d8d51c8SVijay Mahadevan 
9598d8d51c8SVijay Mahadevan   PetscFunctionBegin;
9608d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9618d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
9628d8d51c8SVijay Mahadevan 
9638d8d51c8SVijay Mahadevan   if (conn) {
9648d8d51c8SVijay Mahadevan     ierr = PetscFree(*conn);CHKERRQ(ierr);
9658d8d51c8SVijay Mahadevan   }
9668d8d51c8SVijay Mahadevan   if (nconn) *nconn=0;
9678d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
9688d8d51c8SVijay Mahadevan }
9698d8d51c8SVijay Mahadevan 
9708d8d51c8SVijay Mahadevan 
9718d8d51c8SVijay Mahadevan 
9728d8d51c8SVijay Mahadevan #undef __FUNCT__
9737023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity"
9747023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn)
9757023aa44SVijay Mahadevan {
9767023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
9777023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
9787023aa44SVijay Mahadevan   moab::ErrorCode merr;
9797023aa44SVijay Mahadevan   PetscInt nnodes;
9807023aa44SVijay Mahadevan 
9817023aa44SVijay Mahadevan   PetscFunctionBegin;
9827023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9837023aa44SVijay Mahadevan   PetscValidPointer(conn,4);
9847023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9857023aa44SVijay Mahadevan 
9867023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
9877023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr);
9887023aa44SVijay Mahadevan   if (conn) *conn=connect;
9897023aa44SVijay Mahadevan   if (nconn) *nconn=nnodes;
9907023aa44SVijay Mahadevan   PetscFunctionReturn(0);
9917023aa44SVijay Mahadevan }
9927023aa44SVijay Mahadevan 
9937023aa44SVijay Mahadevan 
9947023aa44SVijay Mahadevan #undef __FUNCT__
99569263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary"
99669263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary)
99769263071SVijay Mahadevan {
99869263071SVijay Mahadevan   moab::EntityType etype;
99969263071SVijay Mahadevan   DM_Moab         *dmmoab;
100069263071SVijay Mahadevan   PetscInt         edim;
100169263071SVijay Mahadevan 
100269263071SVijay Mahadevan   PetscFunctionBegin;
100369263071SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
100469263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary,3);
100569263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
100669263071SVijay Mahadevan 
100769263071SVijay Mahadevan   /* get the entity type and handle accordingly */
100869263071SVijay Mahadevan   etype=dmmoab->mbiface->type_from_handle(ent);
100969263071SVijay 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);
101069263071SVijay Mahadevan 
101169263071SVijay Mahadevan   /* get the entity dimension */
101269263071SVijay Mahadevan   edim=dmmoab->mbiface->dimension_from_handle(ent);
101369263071SVijay Mahadevan 
101469263071SVijay Mahadevan   *ent_on_boundary=PETSC_FALSE;
101569263071SVijay Mahadevan   if(etype == moab::MBVERTEX && edim == 0) {
10166d9eb265SVijay Mahadevan     if (dmmoab->bndyvtx->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
101769263071SVijay Mahadevan   }
101869263071SVijay Mahadevan   else {
101969263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
10206d9eb265SVijay Mahadevan       if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
102169263071SVijay Mahadevan     }
102269263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
10236d9eb265SVijay Mahadevan       if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
102469263071SVijay Mahadevan     }
102569263071SVijay Mahadevan   }
102669263071SVijay Mahadevan   PetscFunctionReturn(0);
102769263071SVijay Mahadevan }
102869263071SVijay Mahadevan 
102969263071SVijay Mahadevan 
103069263071SVijay Mahadevan #undef __FUNCT__
10317023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices"
103269263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx)
10337023aa44SVijay Mahadevan {
10347023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
10357023aa44SVijay Mahadevan   PetscInt       i;
10367023aa44SVijay Mahadevan 
10377023aa44SVijay Mahadevan   PetscFunctionBegin;
10387023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
10397023aa44SVijay Mahadevan   PetscValidPointer(cnt,3);
10407023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx,4);
10417023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
10427023aa44SVijay Mahadevan 
10437023aa44SVijay Mahadevan   for (i=0; i < nconn; ++i) {
10446d9eb265SVijay Mahadevan     isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE);
10457023aa44SVijay Mahadevan   }
10467023aa44SVijay Mahadevan   PetscFunctionReturn(0);
10477023aa44SVijay Mahadevan }
10487023aa44SVijay Mahadevan 
10497023aa44SVijay Mahadevan 
10507023aa44SVijay Mahadevan #undef __FUNCT__
10510c8a2322SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryMarkers"
10526d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces)
10531cec0304SVijay Mahadevan {
10541cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
10551cec0304SVijay Mahadevan 
10561cec0304SVijay Mahadevan   PetscFunctionBegin;
10571cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
10581cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
10591cec0304SVijay Mahadevan 
10606d9eb265SVijay Mahadevan   if (bdvtx)  *bdvtx = dmmoab->bndyvtx;
10616d9eb265SVijay Mahadevan   if (bdfaces)  *bdfaces = dmmoab->bndyfaces;
10626d9eb265SVijay Mahadevan   if (bdelems)  *bdfaces = dmmoab->bndyelems;
10631cec0304SVijay Mahadevan   PetscFunctionReturn(0);
10641cec0304SVijay Mahadevan }
10651cec0304SVijay Mahadevan 
1066