xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 73d8e6d3981d8501e3ddab88a8323f7bcd6330b7)
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);
33*73d8e6d3SVijay 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;
50*73d8e6d3SVijay 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();
112032b8ab6SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
113032b8ab6SVijay Mahadevan   }
114032b8ab6SVijay Mahadevan 
115032b8ab6SVijay Mahadevan   bs = dmmoab->bs;
116032b8ab6SVijay Mahadevan   if (!dmmoab->ltog_tag) {
117db66d124SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
118db66d124SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
119db66d124SVijay Mahadevan        assemble the individual pieces of the mesh */
120032b8ab6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
121032b8ab6SVijay Mahadevan   }
122032b8ab6SVijay Mahadevan 
123032b8ab6SVijay Mahadevan   totsize=dmmoab->vlocal->size();
1248cbae1a6SVijay Mahadevan   if (totsize != dmmoab->nloc+dmmoab->nghost) SETERRQ2(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Mismatch between local and owned+ghost vertices. %D != %D.",totsize,dmmoab->nloc+dmmoab->nghost);
125fc418013SVijay Mahadevan   ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->gsindices);CHKERRQ(ierr);
1261cec0304SVijay Mahadevan   {
127032b8ab6SVijay Mahadevan     /* first get the local indices */
128fc418013SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr);
1294a40b570SVijay Mahadevan     /* next get the ghosted indices */
130fc418013SVijay Mahadevan     if (dmmoab->nghost) {
131fc418013SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr);
1321cec0304SVijay Mahadevan     }
1336e40195eSVijay Mahadevan 
1346e40195eSVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
135eb9d2429SVijay Mahadevan     lmin=lmax=dmmoab->gsindices[0];
13669263071SVijay Mahadevan     for (i=0; i<totsize; ++i) {
137eb9d2429SVijay Mahadevan       if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i];
138eb9d2429SVijay Mahadevan       if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i];
139fc418013SVijay Mahadevan     }
1406e40195eSVijay Mahadevan 
141eb9d2429SVijay Mahadevan     ierr = MPI_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr);
142032b8ab6SVijay Mahadevan 
1438cbae1a6SVijay Mahadevan     /* set the GID map */
144fc418013SVijay Mahadevan     for (i=0; i<totsize; ++i) {
145eb9d2429SVijay Mahadevan       dmmoab->gsindices[i]-=gmin;   /* zero based index needed for IS */
146fc418013SVijay Mahadevan     }
1476d9eb265SVijay Mahadevan     lmin-=gmin;
1486d9eb265SVijay Mahadevan     lmax-=gmin;
1496d9eb265SVijay Mahadevan 
1506d9eb265SVijay Mahadevan     PetscInfo3(NULL, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin);
1516d9eb265SVijay Mahadevan   }
1526d9eb265SVijay Mahadevan 
1536d9eb265SVijay Mahadevan   {
1548cbae1a6SVijay Mahadevan 
1558cbae1a6SVijay Mahadevan     ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->gidmap);CHKERRQ(ierr);
1568cbae1a6SVijay Mahadevan     ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->lidmap);CHKERRQ(ierr);
157*73d8e6d3SVijay Mahadevan     ierr = PetscMalloc(totsize*dmmoab->nfields*sizeof(PetscInt), &dmmoab->llmap);CHKERRQ(ierr);
1588cbae1a6SVijay Mahadevan     ierr = PetscMalloc(totsize*dmmoab->nfields*sizeof(PetscInt), &dmmoab->lgmap);CHKERRQ(ierr);
1596d9eb265SVijay Mahadevan 
1606d9eb265SVijay Mahadevan     i=j=0;
161*73d8e6d3SVijay Mahadevan     /* set the owned vertex data first */
1628cbae1a6SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) {
163*73d8e6d3SVijay Mahadevan       vent=(PetscInt)(*iter);
164*73d8e6d3SVijay Mahadevan       dmmoab->gidmap[vent]=dmmoab->gsindices[i];
165*73d8e6d3SVijay Mahadevan       dmmoab->lidmap[vent]=i;
166*73d8e6d3SVijay Mahadevan       if (bs > 1) {
167*73d8e6d3SVijay Mahadevan         for (f=0;f<dmmoab->nfields;f++,j++) {
1688cbae1a6SVijay Mahadevan           dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->nfields+f;
169*73d8e6d3SVijay Mahadevan           dmmoab->llmap[j]=i*dmmoab->nfields+f;
170*73d8e6d3SVijay Mahadevan           PetscInfo4(NULL, "Owned Vertex: %D,  Field: %D \t  LID = %D \t GID = %D.\n", *iter, f, i*dmmoab->nfields+f, dmmoab->gsindices[i]*dmmoab->nfields+f);
1718cbae1a6SVijay Mahadevan         }
172*73d8e6d3SVijay Mahadevan       }
173*73d8e6d3SVijay Mahadevan       else {
174*73d8e6d3SVijay Mahadevan         for (f=0;f<dmmoab->nfields;f++,j++) {
1758cbae1a6SVijay Mahadevan           dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i];
176*73d8e6d3SVijay Mahadevan           dmmoab->llmap[j]=totsize*f+i;
177*73d8e6d3SVijay 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]);
178*73d8e6d3SVijay Mahadevan         }
179*73d8e6d3SVijay Mahadevan       }
180*73d8e6d3SVijay Mahadevan     }
181*73d8e6d3SVijay Mahadevan     /* next arrange all the ghosted data information */
182*73d8e6d3SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) {
183*73d8e6d3SVijay Mahadevan       vent=(PetscInt)(*iter);
184*73d8e6d3SVijay Mahadevan       dmmoab->gidmap[vent]=dmmoab->gsindices[i];
185*73d8e6d3SVijay Mahadevan       dmmoab->lidmap[vent]=i;
186*73d8e6d3SVijay Mahadevan       if (bs > 1) {
187*73d8e6d3SVijay Mahadevan         for (f=0;f<dmmoab->nfields;f++,j++) {
188*73d8e6d3SVijay Mahadevan           dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->nfields+f;
189*73d8e6d3SVijay Mahadevan           dmmoab->llmap[j]=i*dmmoab->nfields+f;
190*73d8e6d3SVijay Mahadevan           PetscInfo4(NULL, "Ghost Vertex: %D,  Field: %D \t  LID = %D \t GID = %D.\n", vent, f, i*dmmoab->nfields+f, dmmoab->gsindices[i]*dmmoab->nfields+f);
191*73d8e6d3SVijay Mahadevan         }
192*73d8e6d3SVijay Mahadevan       }
193*73d8e6d3SVijay Mahadevan       else {
194*73d8e6d3SVijay Mahadevan         for (f=0;f<dmmoab->nfields;f++,j++) {
195*73d8e6d3SVijay Mahadevan           dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i];
196*73d8e6d3SVijay Mahadevan           dmmoab->llmap[j]=totsize*f+i;
197*73d8e6d3SVijay 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]);
198*73d8e6d3SVijay Mahadevan         }
199*73d8e6d3SVijay Mahadevan       }
2008cbae1a6SVijay Mahadevan     }
2018cbae1a6SVijay Mahadevan 
2026d9eb265SVijay Mahadevan     /* We need to create the Global to Local Vector Scatter Contexts
2036d9eb265SVijay Mahadevan        1) First create a local and global vector
2046d9eb265SVijay Mahadevan        2) Create a local and global IS
2056d9eb265SVijay Mahadevan        3) Create VecScatter and LtoGMapping objects
2066d9eb265SVijay Mahadevan        4) Cleanup the IS and Vec objects
2076d9eb265SVijay Mahadevan     */
2086d9eb265SVijay Mahadevan     ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr);
2096d9eb265SVijay Mahadevan     ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr);
2106d9eb265SVijay Mahadevan 
2116d9eb265SVijay Mahadevan     ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr);
2126d9eb265SVijay Mahadevan     PetscInfo3(NULL, "Total-size = %D\t Owned = %D, Ghosted = %D.\n", totsize, dmmoab->nloc, dmmoab->nghost);
2136d9eb265SVijay Mahadevan 
2148cbae1a6SVijay Mahadevan     /* global to local must retrieve ghost points */
2156d9eb265SVijay Mahadevan     ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->nfields,dmmoab->vstart,1,&from);CHKERRQ(ierr);
2166d9eb265SVijay Mahadevan     ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr);
2176d9eb265SVijay Mahadevan 
2186d9eb265SVijay Mahadevan     ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->nfields,&dmmoab->lgmap[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr);
2196d9eb265SVijay Mahadevan     ierr = ISSetBlockSize(to,bs);CHKERRQ(ierr);
2206d9eb265SVijay Mahadevan 
2218cbae1a6SVijay Mahadevan     if (!dmmoab->ltog_map) {
2228cbae1a6SVijay Mahadevan       /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */
2238cbae1a6SVijay Mahadevan       ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,totsize*dmmoab->nfields,dmmoab->lgmap,
2248cbae1a6SVijay Mahadevan                                           PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr);
2258cbae1a6SVijay Mahadevan     }
226fc418013SVijay Mahadevan 
227*73d8e6d3SVijay Mahadevan     /* now create the scatter object from local to global vector */
2288cbae1a6SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
229*73d8e6d3SVijay Mahadevan 
230*73d8e6d3SVijay Mahadevan     /* clean up IS, Vec */
231032b8ab6SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
2328cbae1a6SVijay Mahadevan     ierr = ISDestroy(&to);CHKERRQ(ierr);
233032b8ab6SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
234032b8ab6SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
235032b8ab6SVijay Mahadevan   }
236032b8ab6SVijay Mahadevan 
2371cec0304SVijay Mahadevan   /* skin the boundary and store nodes */
2381cec0304SVijay Mahadevan   {
239eb9d2429SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
240eb9d2429SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
241eb9d2429SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
242eb9d2429SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
2431cec0304SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
244eb9d2429SVijay Mahadevan 
2456d9eb265SVijay Mahadevan     dmmoab->bndyvtx = new moab::Range();
2466d9eb265SVijay Mahadevan     dmmoab->bndyfaces = new moab::Range();
2476d9eb265SVijay Mahadevan     dmmoab->bndyelems = new moab::Range();
2486d9eb265SVijay Mahadevan 
249eb9d2429SVijay Mahadevan     /* get the entities on the skin - only the faces */
2506d9eb265SVijay 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
251eb9d2429SVijay Mahadevan 
252eb9d2429SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
2536d9eb265SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
2546d9eb265SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr);
25569263071SVijay Mahadevan 
256eb9d2429SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
2576d9eb265SVijay Mahadevan     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr);
2586d9eb265SVijay Mahadevan     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr);
2596d9eb265SVijay Mahadevan     PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size());
2601cec0304SVijay Mahadevan   }
261032b8ab6SVijay Mahadevan   PetscFunctionReturn(0);
262032b8ab6SVijay Mahadevan }
263032b8ab6SVijay Mahadevan 
2641cec0304SVijay Mahadevan 
265032b8ab6SVijay Mahadevan #undef __FUNCT__
266aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab"
267853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
268aa768e4cSTim Tautges {
269aa768e4cSTim Tautges   PetscErrorCode ierr;
270aa768e4cSTim Tautges 
271aa768e4cSTim Tautges   PetscFunctionBegin;
272aa768e4cSTim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
273032b8ab6SVijay Mahadevan   ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr);
274032b8ab6SVijay Mahadevan 
275032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
276324f1edfSVijay Mahadevan   ((DM_Moab*)dm->data)->nfields = 1;
277032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
278032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
279032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
280032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
281032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
282032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL;
283032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL;
284032b8ab6SVijay Mahadevan 
285032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
286032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
287032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
288032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
289032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
290aa768e4cSTim Tautges 
29197ea90e6SJed Brown   dm->ops->createglobalvector              = DMCreateGlobalVector_Moab;
29297ea90e6SJed Brown   dm->ops->createlocalvector               = DMCreateLocalVector_Moab;
293032b8ab6SVijay Mahadevan   dm->ops->creatematrix                    = DMCreateMatrix_Moab;
294032b8ab6SVijay Mahadevan   dm->ops->setup                           = DMSetUp_Moab;
29597ea90e6SJed Brown   dm->ops->destroy                         = DMDestroy_Moab;
296032b8ab6SVijay Mahadevan   dm->ops->globaltolocalbegin              = DMGlobalToLocalBegin_Moab;
297032b8ab6SVijay Mahadevan   dm->ops->globaltolocalend                = DMGlobalToLocalEnd_Moab;
298032b8ab6SVijay Mahadevan   dm->ops->localtoglobalbegin              = DMLocalToGlobalBegin_Moab;
299032b8ab6SVijay Mahadevan   dm->ops->localtoglobalend                = DMLocalToGlobalEnd_Moab;
300aa768e4cSTim Tautges   PetscFunctionReturn(0);
301aa768e4cSTim Tautges }
302fd349b41STim Tautges 
303fd349b41STim Tautges #undef __FUNCT__
3041d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate"
3051d72bce8STim Tautges /*@
3061d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
3071d72bce8STim Tautges 
3081d72bce8STim Tautges   Collective on MPI_Comm
3091d72bce8STim Tautges 
3101d72bce8STim Tautges   Input Parameter:
3111d72bce8STim Tautges . comm - The communicator for the DMMoab object
3121d72bce8STim Tautges 
3131d72bce8STim Tautges   Output Parameter:
314032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
3151d72bce8STim Tautges 
3161d72bce8STim Tautges   Level: beginner
3171d72bce8STim Tautges 
3181d72bce8STim Tautges .keywords: DMMoab, create
3191d72bce8STim Tautges @*/
320032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
3211d72bce8STim Tautges {
3221d72bce8STim Tautges   PetscErrorCode ierr;
3231d72bce8STim Tautges 
3241d72bce8STim Tautges   PetscFunctionBegin;
325032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,2);
326032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
327032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
3281d72bce8STim Tautges   PetscFunctionReturn(0);
3291d72bce8STim Tautges }
3301d72bce8STim Tautges 
3311d72bce8STim Tautges #undef __FUNCT__
332aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab"
3331d72bce8STim Tautges /*@
334a4d2169cSTim Tautges   DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data
3351d72bce8STim Tautges 
3361d72bce8STim Tautges   Collective on MPI_Comm
3371d72bce8STim Tautges 
3381d72bce8STim Tautges   Input Parameter:
3391d72bce8STim Tautges . comm - The communicator for the DMMoab object
340032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
341a4d2169cSTim Tautges          along with the DMMoab
342a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
3431d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
3441d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
3451d72bce8STim Tautges 
3461d72bce8STim Tautges   Output Parameter:
347032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
3481d72bce8STim Tautges 
349032b8ab6SVijay Mahadevan   Level: intermediate
3501d72bce8STim Tautges 
3511d72bce8STim Tautges .keywords: DMMoab, create
3521d72bce8STim Tautges @*/
353032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
3541d72bce8STim Tautges {
3551d72bce8STim Tautges   PetscErrorCode ierr;
356032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
3571cec0304SVijay Mahadevan   moab::EntityHandle partnset;
3581cec0304SVijay Mahadevan   PetscInt rank, nprocs;
359853cdec3SJed Brown   DM_Moab        *dmmoab;
3601d72bce8STim Tautges 
3611d72bce8STim Tautges   PetscFunctionBegin;
362032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,6);
363032b8ab6SVijay Mahadevan   ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr);
364032b8ab6SVijay Mahadevan   dmmoab = (DM_Moab*)(*dmb)->data;
365a4d2169cSTim Tautges 
366a4d2169cSTim Tautges   if (!mbiface) {
36772ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
3687d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
3691d72bce8STim Tautges   }
3701cec0304SVijay Mahadevan   else {
3711cec0304SVijay Mahadevan     dmmoab->mbiface = mbiface;
3727d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
3731cec0304SVijay Mahadevan   }
3741cec0304SVijay Mahadevan 
375b5410836SVijay Mahadevan   /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */
376b5410836SVijay Mahadevan   dmmoab->fileset=0;
3777d89fc02STim Tautges 
378a4d2169cSTim Tautges   if (!pcomm) {
379032b8ab6SVijay Mahadevan     ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
380032b8ab6SVijay Mahadevan     ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
381032b8ab6SVijay Mahadevan 
382db66d124SVijay Mahadevan     /* Create root sets for each mesh.  Then pass these
383db66d124SVijay Mahadevan        to the load_file functions to be populated. */
3840c8a2322SVijay Mahadevan     merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);MBERR("Creating partition set failed", merr);
385032b8ab6SVijay Mahadevan 
386db66d124SVijay Mahadevan     /* Create the parallel communicator object with the partition handle associated with MOAB */
38772ff976dSVijay Mahadevan     dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
38872ff976dSVijay Mahadevan   }
38972ff976dSVijay Mahadevan   else {
39072ff976dSVijay Mahadevan     ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr);
391032b8ab6SVijay Mahadevan   }
392032b8ab6SVijay Mahadevan 
3934973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
3944973de03SVijay Mahadevan   dmmoab->bs = 1;
395324f1edfSVijay Mahadevan   dmmoab->nfields = 1;
3964973de03SVijay Mahadevan 
3974973de03SVijay Mahadevan   /* set global ID tag handle */
398032b8ab6SVijay Mahadevan   if (!ltog_tag) {
3994973de03SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
400032b8ab6SVijay Mahadevan   }
401032b8ab6SVijay Mahadevan   else {
402032b8ab6SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr);
403a4d2169cSTim Tautges   }
404a4d2169cSTim Tautges 
4054973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
406a4d2169cSTim Tautges   if (range) {
4075eb88e9dSVijay Mahadevan     ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr);
408a4d2169cSTim Tautges   }
4091d72bce8STim Tautges   PetscFunctionReturn(0);
4101d72bce8STim Tautges }
4111d72bce8STim Tautges 
4121d72bce8STim Tautges #undef __FUNCT__
4131d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm"
414aa768e4cSTim Tautges /*@
415aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
416aa768e4cSTim Tautges 
417aa768e4cSTim Tautges   Collective on MPI_Comm
418aa768e4cSTim Tautges 
419aa768e4cSTim Tautges   Input Parameter:
420aa768e4cSTim Tautges . dm    - The DMMoab object being set
421aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
422aa768e4cSTim Tautges 
423aa768e4cSTim Tautges   Level: beginner
424aa768e4cSTim Tautges 
425aa768e4cSTim Tautges .keywords: DMMoab, create
426aa768e4cSTim Tautges @*/
4271d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
4281d72bce8STim Tautges {
429032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
430032b8ab6SVijay Mahadevan 
4311d72bce8STim Tautges   PetscFunctionBegin;
4321d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4331cec0304SVijay Mahadevan   PetscValidPointer(pcomm,2);
434032b8ab6SVijay Mahadevan   dmmoab->pcomm = pcomm;
435032b8ab6SVijay Mahadevan   dmmoab->mbiface = pcomm->get_moab();
436032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
4371d72bce8STim Tautges   PetscFunctionReturn(0);
4381d72bce8STim Tautges }
4391d72bce8STim Tautges 
4401d72bce8STim Tautges 
4411d72bce8STim Tautges #undef __FUNCT__
4421d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm"
443aa768e4cSTim Tautges /*@
444aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
445aa768e4cSTim Tautges 
446aa768e4cSTim Tautges   Collective on MPI_Comm
447aa768e4cSTim Tautges 
448aa768e4cSTim Tautges   Input Parameter:
449aa768e4cSTim Tautges . dm    - The DMMoab object being set
450aa768e4cSTim Tautges 
451aa768e4cSTim Tautges   Output Parameter:
452aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
453aa768e4cSTim Tautges 
454aa768e4cSTim Tautges   Level: beginner
455aa768e4cSTim Tautges 
456aa768e4cSTim Tautges .keywords: DMMoab, create
457aa768e4cSTim Tautges @*/
4581d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
4591d72bce8STim Tautges {
4601d72bce8STim Tautges   PetscFunctionBegin;
4611d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
462032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
4631d72bce8STim Tautges   PetscFunctionReturn(0);
4641d72bce8STim Tautges }
4651d72bce8STim Tautges 
4661d72bce8STim Tautges 
4671d72bce8STim Tautges #undef __FUNCT__
4681d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface"
469aa768e4cSTim Tautges /*@
470aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
471aa768e4cSTim Tautges 
472aa768e4cSTim Tautges   Collective on MPI_Comm
473aa768e4cSTim Tautges 
474aa768e4cSTim Tautges   Input Parameter:
475aa768e4cSTim Tautges . dm      - The DMMoab object being set
476aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
477aa768e4cSTim Tautges 
478aa768e4cSTim Tautges   Level: beginner
479aa768e4cSTim Tautges 
480aa768e4cSTim Tautges .keywords: DMMoab, create
481aa768e4cSTim Tautges @*/
482a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
4831d72bce8STim Tautges {
484032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
485032b8ab6SVijay Mahadevan 
4861d72bce8STim Tautges   PetscFunctionBegin;
4871d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4881cec0304SVijay Mahadevan   PetscValidPointer(mbiface,2);
489032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
490032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
491032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
4921d72bce8STim Tautges   PetscFunctionReturn(0);
4931d72bce8STim Tautges }
4941d72bce8STim Tautges 
4951d72bce8STim Tautges 
4961d72bce8STim Tautges #undef __FUNCT__
4971d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface"
498aa768e4cSTim Tautges /*@
499aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
500aa768e4cSTim Tautges 
501aa768e4cSTim Tautges   Collective on MPI_Comm
502aa768e4cSTim Tautges 
503aa768e4cSTim Tautges   Input Parameter:
504aa768e4cSTim Tautges . dm      - The DMMoab object being set
505aa768e4cSTim Tautges 
506aa768e4cSTim Tautges   Output Parameter:
507aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
508aa768e4cSTim Tautges 
509aa768e4cSTim Tautges   Level: beginner
510aa768e4cSTim Tautges 
511aa768e4cSTim Tautges .keywords: DMMoab, create
512aa768e4cSTim Tautges @*/
513a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
5141d72bce8STim Tautges {
5159426e041SSatish Balay   PetscErrorCode   ierr;
516cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
517cabb514dSBarry Smith 
5181d72bce8STim Tautges   PetscFunctionBegin;
5191d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
520cabb514dSBarry 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);
521a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
5221d72bce8STim Tautges   PetscFunctionReturn(0);
5231d72bce8STim Tautges }
5241d72bce8STim Tautges 
5251d72bce8STim Tautges 
5261d72bce8STim Tautges #undef __FUNCT__
5275eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices"
528aa768e4cSTim Tautges /*@
5295eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
530aa768e4cSTim Tautges 
531aa768e4cSTim Tautges   Collective on MPI_Comm
532aa768e4cSTim Tautges 
533aa768e4cSTim Tautges   Input Parameter:
534aa768e4cSTim Tautges . dm    - The DMMoab object being set
535aa768e4cSTim Tautges . range - The entities treated by this DMMoab
536aa768e4cSTim Tautges 
537aa768e4cSTim Tautges   Level: beginner
538aa768e4cSTim Tautges 
539aa768e4cSTim Tautges .keywords: DMMoab, create
540aa768e4cSTim Tautges @*/
5415eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range)
5421d72bce8STim Tautges {
543032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
544032b8ab6SVijay Mahadevan   PetscErrorCode  ierr;
545fd3326ddSVijay Mahadevan   moab::Range     tmpvtxs;
546032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
547032b8ab6SVijay Mahadevan 
5481d72bce8STim Tautges   PetscFunctionBegin;
5491d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
550032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
551032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
552fd3326ddSVijay Mahadevan 
553032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
554fd3326ddSVijay Mahadevan 
555fd3326ddSVijay Mahadevan   /* filter based on parallel status */
556fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
557fd3326ddSVijay Mahadevan 
558fd3326ddSVijay Mahadevan   /* filter all the non-owned and shared entities out of the list */
559fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
560fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(tmpvtxs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
561fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost);
562fd3326ddSVijay Mahadevan   *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs);
563fd3326ddSVijay Mahadevan 
564fd3326ddSVijay Mahadevan   /* compute and cache the sizes of local and ghosted entities */
565032b8ab6SVijay Mahadevan   dmmoab->nloc = dmmoab->vowned->size();
566032b8ab6SVijay Mahadevan   dmmoab->nghost = dmmoab->vghost->size();
567032b8ab6SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
5681d72bce8STim Tautges   PetscFunctionReturn(0);
5691d72bce8STim Tautges }
5701d72bce8STim Tautges 
5711d72bce8STim Tautges 
5721d72bce8STim Tautges #undef __FUNCT__
5738d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetAllVertices"
5748d8d51c8SVijay Mahadevan /*@
5758d8d51c8SVijay Mahadevan   DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab
5768d8d51c8SVijay Mahadevan 
5778d8d51c8SVijay Mahadevan   Collective on MPI_Comm
5788d8d51c8SVijay Mahadevan 
5798d8d51c8SVijay Mahadevan   Input Parameter:
5808d8d51c8SVijay Mahadevan . dm    - The DMMoab object being set
5818d8d51c8SVijay Mahadevan 
5828d8d51c8SVijay Mahadevan   Output Parameter:
5838d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted)
5848d8d51c8SVijay Mahadevan 
5858d8d51c8SVijay Mahadevan   Level: beginner
5868d8d51c8SVijay Mahadevan 
5878d8d51c8SVijay Mahadevan .keywords: DMMoab, create
5888d8d51c8SVijay Mahadevan @*/
5898d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local)
5908d8d51c8SVijay Mahadevan {
5918d8d51c8SVijay Mahadevan   PetscFunctionBegin;
5928d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5938d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab*)dm->data)->vlocal;
5948d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
5958d8d51c8SVijay Mahadevan }
5968d8d51c8SVijay Mahadevan 
5978d8d51c8SVijay Mahadevan 
5988d8d51c8SVijay Mahadevan 
5998d8d51c8SVijay Mahadevan #undef __FUNCT__
6005eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices"
601aa768e4cSTim Tautges /*@
6025eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
603aa768e4cSTim Tautges 
604aa768e4cSTim Tautges   Collective on MPI_Comm
605aa768e4cSTim Tautges 
606aa768e4cSTim Tautges   Input Parameter:
607aa768e4cSTim Tautges . dm    - The DMMoab object being set
608aa768e4cSTim Tautges 
609aa768e4cSTim Tautges   Output Parameter:
6105eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab
6115eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition
612aa768e4cSTim Tautges 
613aa768e4cSTim Tautges   Level: beginner
614aa768e4cSTim Tautges 
615aa768e4cSTim Tautges .keywords: DMMoab, create
616aa768e4cSTim Tautges @*/
6171cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,moab::Range *owned,moab::Range *ghost)
6181d72bce8STim Tautges {
6191d72bce8STim Tautges   PetscFunctionBegin;
6201d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6211cec0304SVijay Mahadevan   if (owned) *owned = *((DM_Moab*)dm->data)->vowned;
6221cec0304SVijay Mahadevan   if (ghost) *ghost = *((DM_Moab*)dm->data)->vghost;
6231d72bce8STim Tautges   PetscFunctionReturn(0);
6241d72bce8STim Tautges }
6251d72bce8STim Tautges 
6261d72bce8STim Tautges #undef __FUNCT__
6275eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements"
6285eb88e9dSVijay Mahadevan /*@
6295eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
6305eb88e9dSVijay Mahadevan 
6315eb88e9dSVijay Mahadevan   Collective on MPI_Comm
6325eb88e9dSVijay Mahadevan 
6335eb88e9dSVijay Mahadevan   Input Parameter:
6345eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
6355eb88e9dSVijay Mahadevan 
6365eb88e9dSVijay Mahadevan   Output Parameter:
6375eb88e9dSVijay Mahadevan . range - The entities owned locally
6385eb88e9dSVijay Mahadevan 
6395eb88e9dSVijay Mahadevan   Level: beginner
6405eb88e9dSVijay Mahadevan 
6415eb88e9dSVijay Mahadevan .keywords: DMMoab, create
6425eb88e9dSVijay Mahadevan @*/
6431cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,moab::Range *range)
6445eb88e9dSVijay Mahadevan {
6455eb88e9dSVijay Mahadevan   PetscFunctionBegin;
6465eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6471cec0304SVijay Mahadevan   if (range) *range = *((DM_Moab*)dm->data)->elocal;
6481cec0304SVijay Mahadevan   PetscFunctionReturn(0);
6491cec0304SVijay Mahadevan }
6501cec0304SVijay Mahadevan 
6511cec0304SVijay Mahadevan 
6521cec0304SVijay Mahadevan #undef __FUNCT__
6531cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements"
6541cec0304SVijay Mahadevan /*@
6551cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
6561cec0304SVijay Mahadevan 
6571cec0304SVijay Mahadevan   Collective on MPI_Comm
6581cec0304SVijay Mahadevan 
6591cec0304SVijay Mahadevan   Input Parameter:
6601cec0304SVijay Mahadevan . dm    - The DMMoab object being set
6611cec0304SVijay Mahadevan . range - The entities treated by this DMMoab
6621cec0304SVijay Mahadevan 
6631cec0304SVijay Mahadevan   Level: beginner
6641cec0304SVijay Mahadevan 
6651cec0304SVijay Mahadevan .keywords: DMMoab, create
6661cec0304SVijay Mahadevan @*/
6671cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range)
6681cec0304SVijay Mahadevan {
6691cec0304SVijay Mahadevan   moab::ErrorCode merr;
6701cec0304SVijay Mahadevan   PetscErrorCode  ierr;
6711cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
6721cec0304SVijay Mahadevan 
6731cec0304SVijay Mahadevan   PetscFunctionBegin;
6741cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6751cec0304SVijay Mahadevan   dmmoab->elocal->clear();
6761cec0304SVijay Mahadevan   dmmoab->eghost->clear();
6771cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
6781cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
6791cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
6801cec0304SVijay Mahadevan   dmmoab->neleloc=dmmoab->elocal->size();
6811cec0304SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
6828cbae1a6SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele);
6835eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
6845eb88e9dSVijay Mahadevan }
6855eb88e9dSVijay Mahadevan 
6865eb88e9dSVijay Mahadevan 
6875eb88e9dSVijay Mahadevan #undef __FUNCT__
6881d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag"
689aa768e4cSTim Tautges /*@
690aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
691aa768e4cSTim Tautges 
692aa768e4cSTim Tautges   Collective on MPI_Comm
693aa768e4cSTim Tautges 
694aa768e4cSTim Tautges   Input Parameter:
695aa768e4cSTim Tautges . dm      - The DMMoab object being set
696aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
697aa768e4cSTim Tautges 
698aa768e4cSTim Tautges   Level: beginner
699aa768e4cSTim Tautges 
700aa768e4cSTim Tautges .keywords: DMMoab, create
701aa768e4cSTim Tautges @*/
7021d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
7031d72bce8STim Tautges {
7041d72bce8STim Tautges   PetscFunctionBegin;
7051d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7061d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
7071d72bce8STim Tautges   PetscFunctionReturn(0);
7081d72bce8STim Tautges }
7091d72bce8STim Tautges 
7101d72bce8STim Tautges 
7111d72bce8STim Tautges #undef __FUNCT__
7121d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag"
713aa768e4cSTim Tautges /*@
714aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
715aa768e4cSTim Tautges 
716aa768e4cSTim Tautges   Collective on MPI_Comm
717aa768e4cSTim Tautges 
718aa768e4cSTim Tautges   Input Parameter:
719aa768e4cSTim Tautges . dm      - The DMMoab object being set
720aa768e4cSTim Tautges 
721aa768e4cSTim Tautges   Output Parameter:
722aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
723aa768e4cSTim Tautges 
724aa768e4cSTim Tautges   Level: beginner
725aa768e4cSTim Tautges 
726aa768e4cSTim Tautges .keywords: DMMoab, create
727aa768e4cSTim Tautges @*/
7281d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
7291d72bce8STim Tautges {
7301d72bce8STim Tautges   PetscFunctionBegin;
7311d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7321d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
7331d72bce8STim Tautges   PetscFunctionReturn(0);
7341d72bce8STim Tautges }
7351d72bce8STim Tautges 
7361d72bce8STim Tautges 
7371d72bce8STim Tautges #undef __FUNCT__
7381d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize"
739aa768e4cSTim Tautges /*@
740aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
741aa768e4cSTim Tautges 
742aa768e4cSTim Tautges   Collective on MPI_Comm
743aa768e4cSTim Tautges 
744aa768e4cSTim Tautges   Input Parameter:
745aa768e4cSTim Tautges . dm - The DMMoab object being set
746aa768e4cSTim Tautges . bs - The block size used with this DMMoab
747aa768e4cSTim Tautges 
748aa768e4cSTim Tautges   Level: beginner
749aa768e4cSTim Tautges 
750aa768e4cSTim Tautges .keywords: DMMoab, create
751aa768e4cSTim Tautges @*/
7521d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
7531d72bce8STim Tautges {
7541d72bce8STim Tautges   PetscFunctionBegin;
7551d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7561d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
7571d72bce8STim Tautges   PetscFunctionReturn(0);
7581d72bce8STim Tautges }
7591d72bce8STim Tautges 
7601d72bce8STim Tautges 
7611d72bce8STim Tautges #undef __FUNCT__
7621d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize"
763aa768e4cSTim Tautges /*@
764aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
765aa768e4cSTim Tautges 
766aa768e4cSTim Tautges   Collective on MPI_Comm
767aa768e4cSTim Tautges 
768aa768e4cSTim Tautges   Input Parameter:
769aa768e4cSTim Tautges . dm - The DMMoab object being set
770aa768e4cSTim Tautges 
771aa768e4cSTim Tautges   Output Parameter:
772aa768e4cSTim Tautges . bs - The block size used with this DMMoab
773aa768e4cSTim Tautges 
774aa768e4cSTim Tautges   Level: beginner
775aa768e4cSTim Tautges 
776aa768e4cSTim Tautges .keywords: DMMoab, create
777aa768e4cSTim Tautges @*/
7781d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
7791d72bce8STim Tautges {
7801d72bce8STim Tautges   PetscFunctionBegin;
7811d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7821d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
7831d72bce8STim Tautges   PetscFunctionReturn(0);
7841d72bce8STim Tautges }
7851d72bce8STim Tautges 
7861cec0304SVijay Mahadevan 
7871cec0304SVijay Mahadevan #undef __FUNCT__
788212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetSize"
789212ad6d1SVijay Mahadevan /*@
790212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
791212ad6d1SVijay Mahadevan 
792212ad6d1SVijay Mahadevan   Collective on MPI_Comm
793212ad6d1SVijay Mahadevan 
794212ad6d1SVijay Mahadevan   Input Parameter:
795212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
796212ad6d1SVijay Mahadevan 
797212ad6d1SVijay Mahadevan   Output Parameter:
798212ad6d1SVijay Mahadevan . ng - The global size of the DMMoab instance
799212ad6d1SVijay Mahadevan 
800212ad6d1SVijay Mahadevan   Level: beginner
801212ad6d1SVijay Mahadevan 
802212ad6d1SVijay Mahadevan .keywords: DMMoab, create
803212ad6d1SVijay Mahadevan @*/
804212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *ng)
805212ad6d1SVijay Mahadevan {
806212ad6d1SVijay Mahadevan   PetscFunctionBegin;
807212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
808212ad6d1SVijay Mahadevan   if(ng) *ng = ((DM_Moab*)dm->data)->n;
809212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
810212ad6d1SVijay Mahadevan }
811212ad6d1SVijay Mahadevan 
812212ad6d1SVijay Mahadevan 
813212ad6d1SVijay Mahadevan #undef __FUNCT__
814212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalSize"
815212ad6d1SVijay Mahadevan /*@
816212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
817212ad6d1SVijay Mahadevan 
818212ad6d1SVijay Mahadevan   Collective on MPI_Comm
819212ad6d1SVijay Mahadevan 
820212ad6d1SVijay Mahadevan   Input Parameter:
821212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
822212ad6d1SVijay Mahadevan 
823212ad6d1SVijay Mahadevan   Output Parameter:
824212ad6d1SVijay Mahadevan . nl - The local size of the DMMoab instance
825212ad6d1SVijay Mahadevan . ng - The ghosted size of the DMMoab instance
826212ad6d1SVijay Mahadevan 
827212ad6d1SVijay Mahadevan   Level: beginner
828212ad6d1SVijay Mahadevan 
829212ad6d1SVijay Mahadevan .keywords: DMMoab, create
830212ad6d1SVijay Mahadevan @*/
831212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nl,PetscInt *ng)
832212ad6d1SVijay Mahadevan {
833212ad6d1SVijay Mahadevan   PetscFunctionBegin;
834212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
835212ad6d1SVijay Mahadevan   if(nl) *nl = ((DM_Moab*)dm->data)->nloc;
836212ad6d1SVijay Mahadevan   if(ng) *ng = ((DM_Moab*)dm->data)->nghost;
837212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
838212ad6d1SVijay Mahadevan }
839212ad6d1SVijay Mahadevan 
840212ad6d1SVijay Mahadevan 
841212ad6d1SVijay Mahadevan #undef __FUNCT__
8424920ab11SVijay Mahadevan #define __FUNCT__ "DMMoabGetDimension"
8434920ab11SVijay Mahadevan /*@
8444920ab11SVijay Mahadevan   DMMoabGetDimension - Get the dimension of the DM Mesh
8454920ab11SVijay Mahadevan 
8464920ab11SVijay Mahadevan   Collective on MPI_Comm
8474920ab11SVijay Mahadevan 
8484920ab11SVijay Mahadevan   Input Parameter:
8494920ab11SVijay Mahadevan . dm - The DMMoab object being set
8504920ab11SVijay Mahadevan 
8514920ab11SVijay Mahadevan   Output Parameter:
8524920ab11SVijay Mahadevan . dim - The dimension of DM
8534920ab11SVijay Mahadevan 
8544920ab11SVijay Mahadevan   Level: beginner
8554920ab11SVijay Mahadevan 
8564920ab11SVijay Mahadevan .keywords: DMMoab, create
8574920ab11SVijay Mahadevan @*/
8584920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim)
8594920ab11SVijay Mahadevan {
8604920ab11SVijay Mahadevan   PetscFunctionBegin;
8614920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8624920ab11SVijay Mahadevan   *dim = ((DM_Moab*)dm->data)->dim;
8634920ab11SVijay Mahadevan   PetscFunctionReturn(0);
8644920ab11SVijay Mahadevan }
8654920ab11SVijay Mahadevan 
8664920ab11SVijay Mahadevan 
8674920ab11SVijay Mahadevan 
8684920ab11SVijay Mahadevan #undef __FUNCT__
8697023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates"
8707023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos)
8717023aa44SVijay Mahadevan {
8727023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
8737023aa44SVijay Mahadevan   PetscErrorCode  ierr;
8747023aa44SVijay Mahadevan   moab::ErrorCode merr;
8757023aa44SVijay Mahadevan 
8767023aa44SVijay Mahadevan   PetscFunctionBegin;
8777023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8787023aa44SVijay Mahadevan   PetscValidPointer(conn,3);
8797023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8807023aa44SVijay Mahadevan 
8817023aa44SVijay Mahadevan   if (!vpos) {
8827023aa44SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr);
8837023aa44SVijay Mahadevan   }
8847023aa44SVijay Mahadevan 
8857023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
8867023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
8877023aa44SVijay Mahadevan   PetscFunctionReturn(0);
8887023aa44SVijay Mahadevan }
8897023aa44SVijay Mahadevan 
8907023aa44SVijay Mahadevan 
8917023aa44SVijay Mahadevan #undef __FUNCT__
8928d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexConnectivity"
8938d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
8948d8d51c8SVijay Mahadevan {
8958d8d51c8SVijay Mahadevan   DM_Moab        *dmmoab;
8968d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities,connect;
8978d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
8988d8d51c8SVijay Mahadevan   moab::ErrorCode merr;
8998d8d51c8SVijay Mahadevan 
9008d8d51c8SVijay Mahadevan   PetscFunctionBegin;
9018d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9028d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
9038d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9048d8d51c8SVijay Mahadevan 
9058d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
9068d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_adjacencies(&ehandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr);
9078d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr);
9088d8d51c8SVijay Mahadevan 
9098d8d51c8SVijay Mahadevan   if (conn) {
9108d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr);
9118d8d51c8SVijay Mahadevan     ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr);
9128d8d51c8SVijay Mahadevan   }
9138d8d51c8SVijay Mahadevan   if (nconn) *nconn=connect.size();
9148d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
9158d8d51c8SVijay Mahadevan }
9168d8d51c8SVijay Mahadevan 
9178d8d51c8SVijay Mahadevan 
9188d8d51c8SVijay Mahadevan #undef __FUNCT__
9198d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabRestoreVertexConnectivity"
9208d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
9218d8d51c8SVijay Mahadevan {
9228d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
9238d8d51c8SVijay Mahadevan 
9248d8d51c8SVijay Mahadevan   PetscFunctionBegin;
9258d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9268d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
9278d8d51c8SVijay Mahadevan 
9288d8d51c8SVijay Mahadevan   if (conn) {
9298d8d51c8SVijay Mahadevan     ierr = PetscFree(*conn);CHKERRQ(ierr);
9308d8d51c8SVijay Mahadevan   }
9318d8d51c8SVijay Mahadevan   if (nconn) *nconn=0;
9328d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
9338d8d51c8SVijay Mahadevan }
9348d8d51c8SVijay Mahadevan 
9358d8d51c8SVijay Mahadevan 
9368d8d51c8SVijay Mahadevan 
9378d8d51c8SVijay Mahadevan #undef __FUNCT__
9387023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity"
9397023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn)
9407023aa44SVijay Mahadevan {
9417023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
9427023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
9437023aa44SVijay Mahadevan   moab::ErrorCode merr;
9447023aa44SVijay Mahadevan   PetscInt nnodes;
9457023aa44SVijay Mahadevan 
9467023aa44SVijay Mahadevan   PetscFunctionBegin;
9477023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9487023aa44SVijay Mahadevan   PetscValidPointer(conn,4);
9497023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9507023aa44SVijay Mahadevan 
9517023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
9527023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr);
9537023aa44SVijay Mahadevan   if (conn) *conn=connect;
9547023aa44SVijay Mahadevan   if (nconn) *nconn=nnodes;
9557023aa44SVijay Mahadevan   PetscFunctionReturn(0);
9567023aa44SVijay Mahadevan }
9577023aa44SVijay Mahadevan 
9587023aa44SVijay Mahadevan 
9597023aa44SVijay Mahadevan #undef __FUNCT__
96069263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary"
96169263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary)
96269263071SVijay Mahadevan {
96369263071SVijay Mahadevan   moab::EntityType etype;
96469263071SVijay Mahadevan   DM_Moab         *dmmoab;
96569263071SVijay Mahadevan   PetscInt         edim;
96669263071SVijay Mahadevan 
96769263071SVijay Mahadevan   PetscFunctionBegin;
96869263071SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
96969263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary,3);
97069263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
97169263071SVijay Mahadevan 
97269263071SVijay Mahadevan   /* get the entity type and handle accordingly */
97369263071SVijay Mahadevan   etype=dmmoab->mbiface->type_from_handle(ent);
97469263071SVijay 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);
97569263071SVijay Mahadevan 
97669263071SVijay Mahadevan   /* get the entity dimension */
97769263071SVijay Mahadevan   edim=dmmoab->mbiface->dimension_from_handle(ent);
97869263071SVijay Mahadevan 
97969263071SVijay Mahadevan   *ent_on_boundary=PETSC_FALSE;
98069263071SVijay Mahadevan   if(etype == moab::MBVERTEX && edim == 0) {
9816d9eb265SVijay Mahadevan     if (dmmoab->bndyvtx->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
98269263071SVijay Mahadevan   }
98369263071SVijay Mahadevan   else {
98469263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
9856d9eb265SVijay Mahadevan       if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
98669263071SVijay Mahadevan     }
98769263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
9886d9eb265SVijay Mahadevan       if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
98969263071SVijay Mahadevan     }
99069263071SVijay Mahadevan   }
99169263071SVijay Mahadevan   PetscFunctionReturn(0);
99269263071SVijay Mahadevan }
99369263071SVijay Mahadevan 
99469263071SVijay Mahadevan 
99569263071SVijay Mahadevan #undef __FUNCT__
9967023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices"
99769263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx)
9987023aa44SVijay Mahadevan {
9997023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
10007023aa44SVijay Mahadevan   PetscInt       i;
10017023aa44SVijay Mahadevan 
10027023aa44SVijay Mahadevan   PetscFunctionBegin;
10037023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
10047023aa44SVijay Mahadevan   PetscValidPointer(cnt,3);
10057023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx,4);
10067023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
10077023aa44SVijay Mahadevan 
10087023aa44SVijay Mahadevan   for (i=0; i < nconn; ++i) {
10096d9eb265SVijay Mahadevan     isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE);
10107023aa44SVijay Mahadevan   }
10117023aa44SVijay Mahadevan   PetscFunctionReturn(0);
10127023aa44SVijay Mahadevan }
10137023aa44SVijay Mahadevan 
10147023aa44SVijay Mahadevan 
10157023aa44SVijay Mahadevan #undef __FUNCT__
10160c8a2322SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryMarkers"
10176d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces)
10181cec0304SVijay Mahadevan {
10191cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
10201cec0304SVijay Mahadevan 
10211cec0304SVijay Mahadevan   PetscFunctionBegin;
10221cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
10231cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
10241cec0304SVijay Mahadevan 
10256d9eb265SVijay Mahadevan   if (bdvtx)  *bdvtx = dmmoab->bndyvtx;
10266d9eb265SVijay Mahadevan   if (bdfaces)  *bdfaces = dmmoab->bndyfaces;
10276d9eb265SVijay Mahadevan   if (bdelems)  *bdfaces = dmmoab->bndyelems;
10281cec0304SVijay Mahadevan   PetscFunctionReturn(0);
10291cec0304SVijay Mahadevan }
10301cec0304SVijay Mahadevan 
1031