xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 41dd534805b5ad9741ef0ba8ec287ed951ad4280)
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();
112*41dd5348SVijay 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);
15873d8e6d3SVijay Mahadevan     ierr = PetscMalloc(totsize*dmmoab->nfields*sizeof(PetscInt), &dmmoab->llmap);CHKERRQ(ierr);
1598cbae1a6SVijay Mahadevan     ierr = PetscMalloc(totsize*dmmoab->nfields*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) {
16873d8e6d3SVijay Mahadevan         for (f=0;f<dmmoab->nfields;f++,j++) {
1698cbae1a6SVijay Mahadevan           dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->nfields+f;
17073d8e6d3SVijay Mahadevan           dmmoab->llmap[j]=i*dmmoab->nfields+f;
17173d8e6d3SVijay 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);
1728cbae1a6SVijay Mahadevan         }
17373d8e6d3SVijay Mahadevan       }
17473d8e6d3SVijay Mahadevan       else {
17573d8e6d3SVijay Mahadevan         for (f=0;f<dmmoab->nfields;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) {
18873d8e6d3SVijay Mahadevan         for (f=0;f<dmmoab->nfields;f++,j++) {
18973d8e6d3SVijay Mahadevan           dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->nfields+f;
19073d8e6d3SVijay Mahadevan           dmmoab->llmap[j]=i*dmmoab->nfields+f;
19173d8e6d3SVijay 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);
19273d8e6d3SVijay Mahadevan         }
19373d8e6d3SVijay Mahadevan       }
19473d8e6d3SVijay Mahadevan       else {
19573d8e6d3SVijay Mahadevan         for (f=0;f<dmmoab->nfields;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 */
2166d9eb265SVijay Mahadevan     ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->nfields,dmmoab->vstart,1,&from);CHKERRQ(ierr);
2176d9eb265SVijay Mahadevan     ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr);
2186d9eb265SVijay Mahadevan 
2196d9eb265SVijay Mahadevan     ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->nfields,&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 */
2248cbae1a6SVijay Mahadevan       ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,totsize*dmmoab->nfields,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;
277324f1edfSVijay Mahadevan   ((DM_Moab*)dm->data)->nfields = 1;
278032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
279032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
280*41dd5348SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
281032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
282032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
283*41dd5348SVijay 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;
397324f1edfSVijay Mahadevan   dmmoab->nfields = 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();
683*41dd5348SVijay 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 
795212ad6d1SVijay Mahadevan   Collective on MPI_Comm
796212ad6d1SVijay Mahadevan 
797212ad6d1SVijay Mahadevan   Input Parameter:
798212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
799212ad6d1SVijay Mahadevan 
800212ad6d1SVijay Mahadevan   Output Parameter:
801212ad6d1SVijay Mahadevan . ng - The global size of the DMMoab instance
802212ad6d1SVijay Mahadevan 
803212ad6d1SVijay Mahadevan   Level: beginner
804212ad6d1SVijay Mahadevan 
805212ad6d1SVijay Mahadevan .keywords: DMMoab, create
806212ad6d1SVijay Mahadevan @*/
807*41dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *neg,PetscInt *nvg)
808212ad6d1SVijay Mahadevan {
809212ad6d1SVijay Mahadevan   PetscFunctionBegin;
810212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
811*41dd5348SVijay Mahadevan   if(neg) *neg = ((DM_Moab*)dm->data)->nele;
812*41dd5348SVijay Mahadevan   if(nvg) *nvg = ((DM_Moab*)dm->data)->n;
813212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
814212ad6d1SVijay Mahadevan }
815212ad6d1SVijay Mahadevan 
816212ad6d1SVijay Mahadevan 
817212ad6d1SVijay Mahadevan #undef __FUNCT__
818212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalSize"
819212ad6d1SVijay Mahadevan /*@
820212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
821212ad6d1SVijay Mahadevan 
822212ad6d1SVijay Mahadevan   Collective on MPI_Comm
823212ad6d1SVijay Mahadevan 
824212ad6d1SVijay Mahadevan   Input Parameter:
825212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
826212ad6d1SVijay Mahadevan 
827212ad6d1SVijay Mahadevan   Output Parameter:
828212ad6d1SVijay Mahadevan . nl - The local size of the DMMoab instance
829212ad6d1SVijay Mahadevan . ng - The ghosted size of the DMMoab instance
830212ad6d1SVijay Mahadevan 
831212ad6d1SVijay Mahadevan   Level: beginner
832212ad6d1SVijay Mahadevan 
833212ad6d1SVijay Mahadevan .keywords: DMMoab, create
834212ad6d1SVijay Mahadevan @*/
835*41dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nel,PetscInt *neg,PetscInt *nvl,PetscInt *nvg)
836212ad6d1SVijay Mahadevan {
837212ad6d1SVijay Mahadevan   PetscFunctionBegin;
838212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
839*41dd5348SVijay Mahadevan   if(nel) *nel = ((DM_Moab*)dm->data)->neleloc;
840*41dd5348SVijay Mahadevan   if(neg) *neg = ((DM_Moab*)dm->data)->neleghost;
841*41dd5348SVijay Mahadevan   if(nvl) *nvl = ((DM_Moab*)dm->data)->nloc;
842*41dd5348SVijay Mahadevan   if(nvg) *nvg = ((DM_Moab*)dm->data)->nghost;
843212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
844212ad6d1SVijay Mahadevan }
845212ad6d1SVijay Mahadevan 
846212ad6d1SVijay Mahadevan 
847212ad6d1SVijay Mahadevan #undef __FUNCT__
8484920ab11SVijay Mahadevan #define __FUNCT__ "DMMoabGetDimension"
8494920ab11SVijay Mahadevan /*@
8504920ab11SVijay Mahadevan   DMMoabGetDimension - Get the dimension of the DM Mesh
8514920ab11SVijay Mahadevan 
8524920ab11SVijay Mahadevan   Collective on MPI_Comm
8534920ab11SVijay Mahadevan 
8544920ab11SVijay Mahadevan   Input Parameter:
8554920ab11SVijay Mahadevan . dm - The DMMoab object being set
8564920ab11SVijay Mahadevan 
8574920ab11SVijay Mahadevan   Output Parameter:
8584920ab11SVijay Mahadevan . dim - The dimension of DM
8594920ab11SVijay Mahadevan 
8604920ab11SVijay Mahadevan   Level: beginner
8614920ab11SVijay Mahadevan 
8624920ab11SVijay Mahadevan .keywords: DMMoab, create
8634920ab11SVijay Mahadevan @*/
8644920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim)
8654920ab11SVijay Mahadevan {
8664920ab11SVijay Mahadevan   PetscFunctionBegin;
8674920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8684920ab11SVijay Mahadevan   *dim = ((DM_Moab*)dm->data)->dim;
8694920ab11SVijay Mahadevan   PetscFunctionReturn(0);
8704920ab11SVijay Mahadevan }
8714920ab11SVijay Mahadevan 
8724920ab11SVijay Mahadevan 
8734920ab11SVijay Mahadevan 
8744920ab11SVijay Mahadevan #undef __FUNCT__
8757023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates"
8767023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos)
8777023aa44SVijay Mahadevan {
8787023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
8797023aa44SVijay Mahadevan   PetscErrorCode  ierr;
8807023aa44SVijay Mahadevan   moab::ErrorCode merr;
8817023aa44SVijay Mahadevan 
8827023aa44SVijay Mahadevan   PetscFunctionBegin;
8837023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8847023aa44SVijay Mahadevan   PetscValidPointer(conn,3);
8857023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8867023aa44SVijay Mahadevan 
8877023aa44SVijay Mahadevan   if (!vpos) {
8887023aa44SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr);
8897023aa44SVijay Mahadevan   }
8907023aa44SVijay Mahadevan 
8917023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
8927023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
8937023aa44SVijay Mahadevan   PetscFunctionReturn(0);
8947023aa44SVijay Mahadevan }
8957023aa44SVijay Mahadevan 
8967023aa44SVijay Mahadevan 
8977023aa44SVijay Mahadevan #undef __FUNCT__
8988d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexConnectivity"
8998d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
9008d8d51c8SVijay Mahadevan {
9018d8d51c8SVijay Mahadevan   DM_Moab        *dmmoab;
9028d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities,connect;
9038d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
9048d8d51c8SVijay Mahadevan   moab::ErrorCode merr;
9058d8d51c8SVijay Mahadevan 
9068d8d51c8SVijay Mahadevan   PetscFunctionBegin;
9078d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9088d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
9098d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9108d8d51c8SVijay Mahadevan 
9118d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
9128d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_adjacencies(&ehandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr);
9138d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr);
9148d8d51c8SVijay Mahadevan 
9158d8d51c8SVijay Mahadevan   if (conn) {
9168d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr);
9178d8d51c8SVijay Mahadevan     ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr);
9188d8d51c8SVijay Mahadevan   }
9198d8d51c8SVijay Mahadevan   if (nconn) *nconn=connect.size();
9208d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
9218d8d51c8SVijay Mahadevan }
9228d8d51c8SVijay Mahadevan 
9238d8d51c8SVijay Mahadevan 
9248d8d51c8SVijay Mahadevan #undef __FUNCT__
9258d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabRestoreVertexConnectivity"
9268d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
9278d8d51c8SVijay Mahadevan {
9288d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
9298d8d51c8SVijay Mahadevan 
9308d8d51c8SVijay Mahadevan   PetscFunctionBegin;
9318d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9328d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
9338d8d51c8SVijay Mahadevan 
9348d8d51c8SVijay Mahadevan   if (conn) {
9358d8d51c8SVijay Mahadevan     ierr = PetscFree(*conn);CHKERRQ(ierr);
9368d8d51c8SVijay Mahadevan   }
9378d8d51c8SVijay Mahadevan   if (nconn) *nconn=0;
9388d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
9398d8d51c8SVijay Mahadevan }
9408d8d51c8SVijay Mahadevan 
9418d8d51c8SVijay Mahadevan 
9428d8d51c8SVijay Mahadevan 
9438d8d51c8SVijay Mahadevan #undef __FUNCT__
9447023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity"
9457023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn)
9467023aa44SVijay Mahadevan {
9477023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
9487023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
9497023aa44SVijay Mahadevan   moab::ErrorCode merr;
9507023aa44SVijay Mahadevan   PetscInt nnodes;
9517023aa44SVijay Mahadevan 
9527023aa44SVijay Mahadevan   PetscFunctionBegin;
9537023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9547023aa44SVijay Mahadevan   PetscValidPointer(conn,4);
9557023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9567023aa44SVijay Mahadevan 
9577023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
9587023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr);
9597023aa44SVijay Mahadevan   if (conn) *conn=connect;
9607023aa44SVijay Mahadevan   if (nconn) *nconn=nnodes;
9617023aa44SVijay Mahadevan   PetscFunctionReturn(0);
9627023aa44SVijay Mahadevan }
9637023aa44SVijay Mahadevan 
9647023aa44SVijay Mahadevan 
9657023aa44SVijay Mahadevan #undef __FUNCT__
96669263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary"
96769263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary)
96869263071SVijay Mahadevan {
96969263071SVijay Mahadevan   moab::EntityType etype;
97069263071SVijay Mahadevan   DM_Moab         *dmmoab;
97169263071SVijay Mahadevan   PetscInt         edim;
97269263071SVijay Mahadevan 
97369263071SVijay Mahadevan   PetscFunctionBegin;
97469263071SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
97569263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary,3);
97669263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
97769263071SVijay Mahadevan 
97869263071SVijay Mahadevan   /* get the entity type and handle accordingly */
97969263071SVijay Mahadevan   etype=dmmoab->mbiface->type_from_handle(ent);
98069263071SVijay 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);
98169263071SVijay Mahadevan 
98269263071SVijay Mahadevan   /* get the entity dimension */
98369263071SVijay Mahadevan   edim=dmmoab->mbiface->dimension_from_handle(ent);
98469263071SVijay Mahadevan 
98569263071SVijay Mahadevan   *ent_on_boundary=PETSC_FALSE;
98669263071SVijay Mahadevan   if(etype == moab::MBVERTEX && edim == 0) {
9876d9eb265SVijay Mahadevan     if (dmmoab->bndyvtx->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
98869263071SVijay Mahadevan   }
98969263071SVijay Mahadevan   else {
99069263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
9916d9eb265SVijay Mahadevan       if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
99269263071SVijay Mahadevan     }
99369263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
9946d9eb265SVijay Mahadevan       if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
99569263071SVijay Mahadevan     }
99669263071SVijay Mahadevan   }
99769263071SVijay Mahadevan   PetscFunctionReturn(0);
99869263071SVijay Mahadevan }
99969263071SVijay Mahadevan 
100069263071SVijay Mahadevan 
100169263071SVijay Mahadevan #undef __FUNCT__
10027023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices"
100369263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx)
10047023aa44SVijay Mahadevan {
10057023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
10067023aa44SVijay Mahadevan   PetscInt       i;
10077023aa44SVijay Mahadevan 
10087023aa44SVijay Mahadevan   PetscFunctionBegin;
10097023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
10107023aa44SVijay Mahadevan   PetscValidPointer(cnt,3);
10117023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx,4);
10127023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
10137023aa44SVijay Mahadevan 
10147023aa44SVijay Mahadevan   for (i=0; i < nconn; ++i) {
10156d9eb265SVijay Mahadevan     isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE);
10167023aa44SVijay Mahadevan   }
10177023aa44SVijay Mahadevan   PetscFunctionReturn(0);
10187023aa44SVijay Mahadevan }
10197023aa44SVijay Mahadevan 
10207023aa44SVijay Mahadevan 
10217023aa44SVijay Mahadevan #undef __FUNCT__
10220c8a2322SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryMarkers"
10236d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces)
10241cec0304SVijay Mahadevan {
10251cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
10261cec0304SVijay Mahadevan 
10271cec0304SVijay Mahadevan   PetscFunctionBegin;
10281cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
10291cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
10301cec0304SVijay Mahadevan 
10316d9eb265SVijay Mahadevan   if (bdvtx)  *bdvtx = dmmoab->bndyvtx;
10326d9eb265SVijay Mahadevan   if (bdfaces)  *bdfaces = dmmoab->bndyfaces;
10336d9eb265SVijay Mahadevan   if (bdelems)  *bdfaces = dmmoab->bndyelems;
10341cec0304SVijay Mahadevan   PetscFunctionReturn(0);
10351cec0304SVijay Mahadevan }
10361cec0304SVijay Mahadevan 
1037