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; 26*6d9eb265SVijay Mahadevan delete dmmoab->bndyvtx; 27*6d9eb265SVijay Mahadevan delete dmmoab->bndyfaces; 28*6d9eb265SVijay 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); 338cbae1a6SVijay Mahadevan ierr = PetscFree(dmmoab->lmap);CHKERRQ(ierr); 348cbae1a6SVijay Mahadevan ierr = PetscFree(dmmoab->lgmap);CHKERRQ(ierr); 35032b8ab6SVijay Mahadevan ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 36032b8ab6SVijay Mahadevan ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr); 37853cdec3SJed Brown ierr = PetscFree(dm->data);CHKERRQ(ierr); 38853cdec3SJed Brown PetscFunctionReturn(0); 39853cdec3SJed Brown } 40853cdec3SJed Brown 41aa768e4cSTim Tautges #undef __FUNCT__ 42032b8ab6SVijay Mahadevan #define __FUNCT__ "DMSetUp_Moab" 43032b8ab6SVijay Mahadevan PetscErrorCode DMSetUp_Moab(DM dm) 44032b8ab6SVijay Mahadevan { 45032b8ab6SVijay Mahadevan PetscErrorCode ierr; 46032b8ab6SVijay Mahadevan moab::ErrorCode merr; 47032b8ab6SVijay Mahadevan Vec local, global; 488cbae1a6SVijay Mahadevan IS from,to; 49032b8ab6SVijay Mahadevan moab::Range::iterator iter; 508cbae1a6SVijay Mahadevan PetscInt i,j,f,bs,gmin,lmin,lmax,totsize; 51032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 528cbae1a6SVijay Mahadevan moab::Range adjs; 5369263071SVijay Mahadevan 54032b8ab6SVijay Mahadevan PetscFunctionBegin; 55032b8ab6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 56032b8ab6SVijay Mahadevan /* Get the local and shared vertices and cache it */ 57032b8ab6SVijay Mahadevan if (dmmoab->mbiface == PETSC_NULL || dmmoab->pcomm == PETSC_NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface and ParallelComm objects before calling SetUp."); 58032b8ab6SVijay Mahadevan 591cec0304SVijay Mahadevan /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */ 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 } 147*6d9eb265SVijay Mahadevan lmin-=gmin; 148*6d9eb265SVijay Mahadevan lmax-=gmin; 149*6d9eb265SVijay Mahadevan 150*6d9eb265SVijay Mahadevan PetscInfo3(NULL, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin); 151*6d9eb265SVijay Mahadevan } 152*6d9eb265SVijay Mahadevan 153*6d9eb265SVijay 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); 1578cbae1a6SVijay Mahadevan ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->lmap);CHKERRQ(ierr); 1588cbae1a6SVijay Mahadevan ierr = PetscMalloc(totsize*dmmoab->nfields*sizeof(PetscInt), &dmmoab->lgmap);CHKERRQ(ierr); 159*6d9eb265SVijay Mahadevan 160*6d9eb265SVijay Mahadevan i=j=0; 1618cbae1a6SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) { 1628cbae1a6SVijay Mahadevan dmmoab->gidmap[(PetscInt)(*iter)]=dmmoab->gsindices[i]; 1638cbae1a6SVijay Mahadevan dmmoab->lidmap[(PetscInt)(*iter)]=i; 1648cbae1a6SVijay Mahadevan dmmoab->lmap[i]=i; 165*6d9eb265SVijay Mahadevan PetscInfo3(NULL, "Owned Vertex: %D LID = %D \t GID = %D.\n", *iter, i, dmmoab->gsindices[i]); 1668cbae1a6SVijay Mahadevan if (bs > 1) 1678cbae1a6SVijay Mahadevan for (f=0;f<dmmoab->nfields;f++,j++) 1688cbae1a6SVijay Mahadevan dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->nfields+f; 1698cbae1a6SVijay Mahadevan else 1708cbae1a6SVijay Mahadevan for (f=0;f<dmmoab->nfields;f++,j++) 1718cbae1a6SVijay Mahadevan dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i]; 1728cbae1a6SVijay Mahadevan } 1738cbae1a6SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) { 1748cbae1a6SVijay Mahadevan dmmoab->gidmap[(PetscInt)(*iter)]=dmmoab->gsindices[i]; 1758cbae1a6SVijay Mahadevan dmmoab->lidmap[(PetscInt)(*iter)]=i; 1768cbae1a6SVijay Mahadevan dmmoab->lmap[i]=i; 177*6d9eb265SVijay Mahadevan PetscInfo3(NULL, "Ghost Vertex: %D LID = %D \t GID = %D.\n", *iter, i, dmmoab->gsindices[i]); 1788cbae1a6SVijay Mahadevan if (bs > 1) 1798cbae1a6SVijay Mahadevan for (f=0;f<dmmoab->nfields;f++,j++) 1808cbae1a6SVijay Mahadevan dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->nfields+f; 1818cbae1a6SVijay Mahadevan else 1828cbae1a6SVijay Mahadevan for (f=0;f<dmmoab->nfields;f++,j++) 1838cbae1a6SVijay Mahadevan dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i]; 1848cbae1a6SVijay Mahadevan } 1858cbae1a6SVijay Mahadevan 186*6d9eb265SVijay Mahadevan /* We need to create the Global to Local Vector Scatter Contexts 187*6d9eb265SVijay Mahadevan 1) First create a local and global vector 188*6d9eb265SVijay Mahadevan 2) Create a local and global IS 189*6d9eb265SVijay Mahadevan 3) Create VecScatter and LtoGMapping objects 190*6d9eb265SVijay Mahadevan 4) Cleanup the IS and Vec objects 191*6d9eb265SVijay Mahadevan */ 192*6d9eb265SVijay Mahadevan ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr); 193*6d9eb265SVijay Mahadevan ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr); 194*6d9eb265SVijay Mahadevan 195*6d9eb265SVijay Mahadevan ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr); 196*6d9eb265SVijay Mahadevan PetscInfo3(NULL, "Total-size = %D\t Owned = %D, Ghosted = %D.\n", totsize, dmmoab->nloc, dmmoab->nghost); 197*6d9eb265SVijay Mahadevan 1988cbae1a6SVijay Mahadevan /* global to local must retrieve ghost points */ 199*6d9eb265SVijay Mahadevan // ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&dmmoab->lmap[0],PETSC_COPY_VALUES,&from);CHKERRQ(ierr); 200*6d9eb265SVijay Mahadevan // ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&dmmoab->gsindices[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr); 201*6d9eb265SVijay Mahadevan 202*6d9eb265SVijay Mahadevan // ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,dmmoab->nghost,&dmmoab->lmap[dmmoab->nloc],PETSC_COPY_VALUES,&from);CHKERRQ(ierr); 203*6d9eb265SVijay Mahadevan // ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&dmmoab->gsindices[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr); 204*6d9eb265SVijay Mahadevan 205*6d9eb265SVijay Mahadevan 206*6d9eb265SVijay Mahadevan ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->nfields,dmmoab->vstart,1,&from);CHKERRQ(ierr); 207*6d9eb265SVijay Mahadevan ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr); 208*6d9eb265SVijay Mahadevan 209*6d9eb265SVijay Mahadevan ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->nfields,&dmmoab->lgmap[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr); 210*6d9eb265SVijay Mahadevan ierr = ISSetBlockSize(to,bs);CHKERRQ(ierr); 211*6d9eb265SVijay Mahadevan 2128cbae1a6SVijay Mahadevan 2138cbae1a6SVijay Mahadevan if (!dmmoab->ltog_map) { 2148cbae1a6SVijay Mahadevan /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */ 2158cbae1a6SVijay Mahadevan ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,totsize*dmmoab->nfields,dmmoab->lgmap, 2168cbae1a6SVijay Mahadevan PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr); 2178cbae1a6SVijay Mahadevan } 218fc418013SVijay Mahadevan 2198cbae1a6SVijay Mahadevan ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 220*6d9eb265SVijay Mahadevan /// ierr = VecScatterCreateToAll(global,&dmmoab->ltog_sendrecv,NULL);CHKERRQ(ierr); 221*6d9eb265SVijay Mahadevan // PetscBarrier((PetscObject)dm); 222*6d9eb265SVijay Mahadevan // VecScatterView(dmmoab->ltog_sendrecv,PETSC_VIEWER_STDOUT_SELF); 223*6d9eb265SVijay Mahadevan // PetscBarrier((PetscObject)dm); 224032b8ab6SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 2258cbae1a6SVijay Mahadevan ierr = ISDestroy(&to);CHKERRQ(ierr); 226032b8ab6SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 227032b8ab6SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 228032b8ab6SVijay Mahadevan } 229032b8ab6SVijay Mahadevan 2301cec0304SVijay Mahadevan /* skin the boundary and store nodes */ 2311cec0304SVijay Mahadevan { 232eb9d2429SVijay Mahadevan /* get the skin vertices of boundary faces for the current partition and then filter 233eb9d2429SVijay Mahadevan the local, boundary faces, vertices and elements alone via PSTATUS flags; 234eb9d2429SVijay Mahadevan this should not give us any ghosted boundary, but if user needs such a functionality 235eb9d2429SVijay Mahadevan it would be easy to add it based on the find_skin query below */ 2361cec0304SVijay Mahadevan moab::Skinner skinner(dmmoab->mbiface); 237eb9d2429SVijay Mahadevan 238*6d9eb265SVijay Mahadevan dmmoab->bndyvtx = new moab::Range(); 239*6d9eb265SVijay Mahadevan dmmoab->bndyfaces = new moab::Range(); 240*6d9eb265SVijay Mahadevan dmmoab->bndyelems = new moab::Range(); 241*6d9eb265SVijay Mahadevan 242eb9d2429SVijay Mahadevan /* get the entities on the skin - only the faces */ 243*6d9eb265SVijay 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 244eb9d2429SVijay Mahadevan 245eb9d2429SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 246*6d9eb265SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 247*6d9eb265SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr); 24869263071SVijay Mahadevan 249eb9d2429SVijay Mahadevan /* get all the nodes via connectivity and the parent elements via adjacency information */ 250*6d9eb265SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr); 251*6d9eb265SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr); 252*6d9eb265SVijay Mahadevan PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size()); 2531cec0304SVijay Mahadevan } 254032b8ab6SVijay Mahadevan PetscFunctionReturn(0); 255032b8ab6SVijay Mahadevan } 256032b8ab6SVijay Mahadevan 2571cec0304SVijay Mahadevan 258032b8ab6SVijay Mahadevan #undef __FUNCT__ 259aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab" 260853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 261aa768e4cSTim Tautges { 262aa768e4cSTim Tautges PetscErrorCode ierr; 263aa768e4cSTim Tautges 264aa768e4cSTim Tautges PetscFunctionBegin; 265aa768e4cSTim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 266032b8ab6SVijay Mahadevan ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr); 267032b8ab6SVijay Mahadevan 268032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 269324f1edfSVijay Mahadevan ((DM_Moab*)dm->data)->nfields = 1; 270032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 271032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 272032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 273032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 274032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 275032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL; 276032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL; 277032b8ab6SVijay Mahadevan 278032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 279032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 280032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 281032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 282032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 283aa768e4cSTim Tautges 28497ea90e6SJed Brown dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 28597ea90e6SJed Brown dm->ops->createlocalvector = DMCreateLocalVector_Moab; 286032b8ab6SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 287032b8ab6SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 28897ea90e6SJed Brown dm->ops->destroy = DMDestroy_Moab; 289032b8ab6SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 290032b8ab6SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 291032b8ab6SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 292032b8ab6SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 293aa768e4cSTim Tautges PetscFunctionReturn(0); 294aa768e4cSTim Tautges } 295fd349b41STim Tautges 296fd349b41STim Tautges #undef __FUNCT__ 2971d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate" 2981d72bce8STim Tautges /*@ 2991d72bce8STim Tautges DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance 3001d72bce8STim Tautges 3011d72bce8STim Tautges Collective on MPI_Comm 3021d72bce8STim Tautges 3031d72bce8STim Tautges Input Parameter: 3041d72bce8STim Tautges . comm - The communicator for the DMMoab object 3051d72bce8STim Tautges 3061d72bce8STim Tautges Output Parameter: 307032b8ab6SVijay Mahadevan . dmb - The DMMoab object 3081d72bce8STim Tautges 3091d72bce8STim Tautges Level: beginner 3101d72bce8STim Tautges 3111d72bce8STim Tautges .keywords: DMMoab, create 3121d72bce8STim Tautges @*/ 313032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb) 3141d72bce8STim Tautges { 3151d72bce8STim Tautges PetscErrorCode ierr; 3161d72bce8STim Tautges 3171d72bce8STim Tautges PetscFunctionBegin; 318032b8ab6SVijay Mahadevan PetscValidPointer(dmb,2); 319032b8ab6SVijay Mahadevan ierr = DMCreate(comm, dmb);CHKERRQ(ierr); 320032b8ab6SVijay Mahadevan ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr); 3211d72bce8STim Tautges PetscFunctionReturn(0); 3221d72bce8STim Tautges } 3231d72bce8STim Tautges 3241d72bce8STim Tautges #undef __FUNCT__ 325aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab" 3261d72bce8STim Tautges /*@ 327a4d2169cSTim Tautges DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data 3281d72bce8STim Tautges 3291d72bce8STim Tautges Collective on MPI_Comm 3301d72bce8STim Tautges 3311d72bce8STim Tautges Input Parameter: 3321d72bce8STim Tautges . comm - The communicator for the DMMoab object 333032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed 334a4d2169cSTim Tautges along with the DMMoab 335a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator 3361d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag 3371d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned 3381d72bce8STim Tautges 3391d72bce8STim Tautges Output Parameter: 340032b8ab6SVijay Mahadevan . dmb - The DMMoab object 3411d72bce8STim Tautges 342032b8ab6SVijay Mahadevan Level: intermediate 3431d72bce8STim Tautges 3441d72bce8STim Tautges .keywords: DMMoab, create 3451d72bce8STim Tautges @*/ 346032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb) 3471d72bce8STim Tautges { 3481d72bce8STim Tautges PetscErrorCode ierr; 349032b8ab6SVijay Mahadevan moab::ErrorCode merr; 3501cec0304SVijay Mahadevan moab::EntityHandle partnset; 3511cec0304SVijay Mahadevan PetscInt rank, nprocs; 352853cdec3SJed Brown DM_Moab *dmmoab; 3531d72bce8STim Tautges 3541d72bce8STim Tautges PetscFunctionBegin; 355032b8ab6SVijay Mahadevan PetscValidPointer(dmb,6); 356032b8ab6SVijay Mahadevan ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr); 357032b8ab6SVijay Mahadevan dmmoab = (DM_Moab*)(*dmb)->data; 358a4d2169cSTim Tautges 359a4d2169cSTim Tautges if (!mbiface) { 36072ff976dSVijay Mahadevan dmmoab->mbiface = new moab::Core(); 3617d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_TRUE; 3621d72bce8STim Tautges } 3631cec0304SVijay Mahadevan else { 3641cec0304SVijay Mahadevan dmmoab->mbiface = mbiface; 3657d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_FALSE; 3661cec0304SVijay Mahadevan } 3671cec0304SVijay Mahadevan 368b5410836SVijay Mahadevan /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */ 369b5410836SVijay Mahadevan dmmoab->fileset=0; 3707d89fc02STim Tautges 371a4d2169cSTim Tautges if (!pcomm) { 372032b8ab6SVijay Mahadevan ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 373032b8ab6SVijay Mahadevan ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr); 374032b8ab6SVijay Mahadevan 375db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 376db66d124SVijay Mahadevan to the load_file functions to be populated. */ 3770c8a2322SVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);MBERR("Creating partition set failed", merr); 378032b8ab6SVijay Mahadevan 379db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 38072ff976dSVijay Mahadevan dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm); 38172ff976dSVijay Mahadevan } 38272ff976dSVijay Mahadevan else { 38372ff976dSVijay Mahadevan ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr); 384032b8ab6SVijay Mahadevan } 385032b8ab6SVijay Mahadevan 3864973de03SVijay Mahadevan /* do the remaining initializations for DMMoab */ 3874973de03SVijay Mahadevan dmmoab->bs = 1; 388324f1edfSVijay Mahadevan dmmoab->nfields = 1; 3894973de03SVijay Mahadevan 3904973de03SVijay Mahadevan /* set global ID tag handle */ 391032b8ab6SVijay Mahadevan if (!ltog_tag) { 3924973de03SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 393032b8ab6SVijay Mahadevan } 394032b8ab6SVijay Mahadevan else { 395032b8ab6SVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr); 396a4d2169cSTim Tautges } 397a4d2169cSTim Tautges 3984973de03SVijay Mahadevan /* set the local range of entities (vertices) of interest */ 399a4d2169cSTim Tautges if (range) { 4005eb88e9dSVijay Mahadevan ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr); 401a4d2169cSTim Tautges } 4021d72bce8STim Tautges PetscFunctionReturn(0); 4031d72bce8STim Tautges } 4041d72bce8STim Tautges 4051d72bce8STim Tautges #undef __FUNCT__ 4061d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm" 407aa768e4cSTim Tautges /*@ 408aa768e4cSTim Tautges DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab 409aa768e4cSTim Tautges 410aa768e4cSTim Tautges Collective on MPI_Comm 411aa768e4cSTim Tautges 412aa768e4cSTim Tautges Input Parameter: 413aa768e4cSTim Tautges . dm - The DMMoab object being set 414aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab 415aa768e4cSTim Tautges 416aa768e4cSTim Tautges Level: beginner 417aa768e4cSTim Tautges 418aa768e4cSTim Tautges .keywords: DMMoab, create 419aa768e4cSTim Tautges @*/ 4201d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm) 4211d72bce8STim Tautges { 422032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 423032b8ab6SVijay Mahadevan 4241d72bce8STim Tautges PetscFunctionBegin; 4251d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4261cec0304SVijay Mahadevan PetscValidPointer(pcomm,2); 427032b8ab6SVijay Mahadevan dmmoab->pcomm = pcomm; 428032b8ab6SVijay Mahadevan dmmoab->mbiface = pcomm->get_moab(); 429032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 4301d72bce8STim Tautges PetscFunctionReturn(0); 4311d72bce8STim Tautges } 4321d72bce8STim Tautges 4331d72bce8STim Tautges 4341d72bce8STim Tautges #undef __FUNCT__ 4351d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm" 436aa768e4cSTim Tautges /*@ 437aa768e4cSTim Tautges DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab 438aa768e4cSTim Tautges 439aa768e4cSTim Tautges Collective on MPI_Comm 440aa768e4cSTim Tautges 441aa768e4cSTim Tautges Input Parameter: 442aa768e4cSTim Tautges . dm - The DMMoab object being set 443aa768e4cSTim Tautges 444aa768e4cSTim Tautges Output Parameter: 445aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 446aa768e4cSTim Tautges 447aa768e4cSTim Tautges Level: beginner 448aa768e4cSTim Tautges 449aa768e4cSTim Tautges .keywords: DMMoab, create 450aa768e4cSTim Tautges @*/ 4511d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm) 4521d72bce8STim Tautges { 4531d72bce8STim Tautges PetscFunctionBegin; 4541d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 455032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 4561d72bce8STim Tautges PetscFunctionReturn(0); 4571d72bce8STim Tautges } 4581d72bce8STim Tautges 4591d72bce8STim Tautges 4601d72bce8STim Tautges #undef __FUNCT__ 4611d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface" 462aa768e4cSTim Tautges /*@ 463aa768e4cSTim Tautges DMMoabSetInterface - Set the MOAB instance used with this DMMoab 464aa768e4cSTim Tautges 465aa768e4cSTim Tautges Collective on MPI_Comm 466aa768e4cSTim Tautges 467aa768e4cSTim Tautges Input Parameter: 468aa768e4cSTim Tautges . dm - The DMMoab object being set 469aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab 470aa768e4cSTim Tautges 471aa768e4cSTim Tautges Level: beginner 472aa768e4cSTim Tautges 473aa768e4cSTim Tautges .keywords: DMMoab, create 474aa768e4cSTim Tautges @*/ 475a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface) 4761d72bce8STim Tautges { 477032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 478032b8ab6SVijay Mahadevan 4791d72bce8STim Tautges PetscFunctionBegin; 4801d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4811cec0304SVijay Mahadevan PetscValidPointer(mbiface,2); 482032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 483032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 484032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 4851d72bce8STim Tautges PetscFunctionReturn(0); 4861d72bce8STim Tautges } 4871d72bce8STim Tautges 4881d72bce8STim Tautges 4891d72bce8STim Tautges #undef __FUNCT__ 4901d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface" 491aa768e4cSTim Tautges /*@ 492aa768e4cSTim Tautges DMMoabGetInterface - Get the MOAB instance used with this DMMoab 493aa768e4cSTim Tautges 494aa768e4cSTim Tautges Collective on MPI_Comm 495aa768e4cSTim Tautges 496aa768e4cSTim Tautges Input Parameter: 497aa768e4cSTim Tautges . dm - The DMMoab object being set 498aa768e4cSTim Tautges 499aa768e4cSTim Tautges Output Parameter: 500aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab 501aa768e4cSTim Tautges 502aa768e4cSTim Tautges Level: beginner 503aa768e4cSTim Tautges 504aa768e4cSTim Tautges .keywords: DMMoab, create 505aa768e4cSTim Tautges @*/ 506a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface) 5071d72bce8STim Tautges { 5089426e041SSatish Balay PetscErrorCode ierr; 509cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 510cabb514dSBarry Smith 5111d72bce8STim Tautges PetscFunctionBegin; 5121d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 513cabb514dSBarry 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); 514a4d2169cSTim Tautges *mbiface = ((DM_Moab*)dm->data)->mbiface; 5151d72bce8STim Tautges PetscFunctionReturn(0); 5161d72bce8STim Tautges } 5171d72bce8STim Tautges 5181d72bce8STim Tautges 5191d72bce8STim Tautges #undef __FUNCT__ 5205eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices" 521aa768e4cSTim Tautges /*@ 5225eb88e9dSVijay Mahadevan DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab 523aa768e4cSTim Tautges 524aa768e4cSTim Tautges Collective on MPI_Comm 525aa768e4cSTim Tautges 526aa768e4cSTim Tautges Input Parameter: 527aa768e4cSTim Tautges . dm - The DMMoab object being set 528aa768e4cSTim Tautges . range - The entities treated by this DMMoab 529aa768e4cSTim Tautges 530aa768e4cSTim Tautges Level: beginner 531aa768e4cSTim Tautges 532aa768e4cSTim Tautges .keywords: DMMoab, create 533aa768e4cSTim Tautges @*/ 5345eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range) 5351d72bce8STim Tautges { 536032b8ab6SVijay Mahadevan moab::ErrorCode merr; 537032b8ab6SVijay Mahadevan PetscErrorCode ierr; 538fd3326ddSVijay Mahadevan moab::Range tmpvtxs; 539032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 540032b8ab6SVijay Mahadevan 5411d72bce8STim Tautges PetscFunctionBegin; 5421d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 543032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 544032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 545fd3326ddSVijay Mahadevan 546032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 547fd3326ddSVijay Mahadevan 548fd3326ddSVijay Mahadevan /* filter based on parallel status */ 549fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 550fd3326ddSVijay Mahadevan 551fd3326ddSVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 552fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 553fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(tmpvtxs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr); 554fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost); 555fd3326ddSVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs); 556fd3326ddSVijay Mahadevan 557fd3326ddSVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 558032b8ab6SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 559032b8ab6SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 560032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 5611d72bce8STim Tautges PetscFunctionReturn(0); 5621d72bce8STim Tautges } 5631d72bce8STim Tautges 5641d72bce8STim Tautges 5651d72bce8STim Tautges #undef __FUNCT__ 5668d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetAllVertices" 5678d8d51c8SVijay Mahadevan /*@ 5688d8d51c8SVijay Mahadevan DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab 5698d8d51c8SVijay Mahadevan 5708d8d51c8SVijay Mahadevan Collective on MPI_Comm 5718d8d51c8SVijay Mahadevan 5728d8d51c8SVijay Mahadevan Input Parameter: 5738d8d51c8SVijay Mahadevan . dm - The DMMoab object being set 5748d8d51c8SVijay Mahadevan 5758d8d51c8SVijay Mahadevan Output Parameter: 5768d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted) 5778d8d51c8SVijay Mahadevan 5788d8d51c8SVijay Mahadevan Level: beginner 5798d8d51c8SVijay Mahadevan 5808d8d51c8SVijay Mahadevan .keywords: DMMoab, create 5818d8d51c8SVijay Mahadevan @*/ 5828d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local) 5838d8d51c8SVijay Mahadevan { 5848d8d51c8SVijay Mahadevan PetscFunctionBegin; 5858d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5868d8d51c8SVijay Mahadevan if (local) *local = *((DM_Moab*)dm->data)->vlocal; 5878d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 5888d8d51c8SVijay Mahadevan } 5898d8d51c8SVijay Mahadevan 5908d8d51c8SVijay Mahadevan 5918d8d51c8SVijay Mahadevan 5928d8d51c8SVijay Mahadevan #undef __FUNCT__ 5935eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices" 594aa768e4cSTim Tautges /*@ 5955eb88e9dSVijay Mahadevan DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab 596aa768e4cSTim Tautges 597aa768e4cSTim Tautges Collective on MPI_Comm 598aa768e4cSTim Tautges 599aa768e4cSTim Tautges Input Parameter: 600aa768e4cSTim Tautges . dm - The DMMoab object being set 601aa768e4cSTim Tautges 602aa768e4cSTim Tautges Output Parameter: 6035eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab 6045eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition 605aa768e4cSTim Tautges 606aa768e4cSTim Tautges Level: beginner 607aa768e4cSTim Tautges 608aa768e4cSTim Tautges .keywords: DMMoab, create 609aa768e4cSTim Tautges @*/ 6101cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,moab::Range *owned,moab::Range *ghost) 6111d72bce8STim Tautges { 6121d72bce8STim Tautges PetscFunctionBegin; 6131d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6141cec0304SVijay Mahadevan if (owned) *owned = *((DM_Moab*)dm->data)->vowned; 6151cec0304SVijay Mahadevan if (ghost) *ghost = *((DM_Moab*)dm->data)->vghost; 6161d72bce8STim Tautges PetscFunctionReturn(0); 6171d72bce8STim Tautges } 6181d72bce8STim Tautges 6191d72bce8STim Tautges #undef __FUNCT__ 6205eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements" 6215eb88e9dSVijay Mahadevan /*@ 6225eb88e9dSVijay Mahadevan DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned 6235eb88e9dSVijay Mahadevan 6245eb88e9dSVijay Mahadevan Collective on MPI_Comm 6255eb88e9dSVijay Mahadevan 6265eb88e9dSVijay Mahadevan Input Parameter: 6275eb88e9dSVijay Mahadevan . dm - The DMMoab object being set 6285eb88e9dSVijay Mahadevan 6295eb88e9dSVijay Mahadevan Output Parameter: 6305eb88e9dSVijay Mahadevan . range - The entities owned locally 6315eb88e9dSVijay Mahadevan 6325eb88e9dSVijay Mahadevan Level: beginner 6335eb88e9dSVijay Mahadevan 6345eb88e9dSVijay Mahadevan .keywords: DMMoab, create 6355eb88e9dSVijay Mahadevan @*/ 6361cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,moab::Range *range) 6375eb88e9dSVijay Mahadevan { 6385eb88e9dSVijay Mahadevan PetscFunctionBegin; 6395eb88e9dSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6401cec0304SVijay Mahadevan if (range) *range = *((DM_Moab*)dm->data)->elocal; 6411cec0304SVijay Mahadevan PetscFunctionReturn(0); 6421cec0304SVijay Mahadevan } 6431cec0304SVijay Mahadevan 6441cec0304SVijay Mahadevan 6451cec0304SVijay Mahadevan #undef __FUNCT__ 6461cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements" 6471cec0304SVijay Mahadevan /*@ 6481cec0304SVijay Mahadevan DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab 6491cec0304SVijay Mahadevan 6501cec0304SVijay Mahadevan Collective on MPI_Comm 6511cec0304SVijay Mahadevan 6521cec0304SVijay Mahadevan Input Parameter: 6531cec0304SVijay Mahadevan . dm - The DMMoab object being set 6541cec0304SVijay Mahadevan . range - The entities treated by this DMMoab 6551cec0304SVijay Mahadevan 6561cec0304SVijay Mahadevan Level: beginner 6571cec0304SVijay Mahadevan 6581cec0304SVijay Mahadevan .keywords: DMMoab, create 6591cec0304SVijay Mahadevan @*/ 6601cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range) 6611cec0304SVijay Mahadevan { 6621cec0304SVijay Mahadevan moab::ErrorCode merr; 6631cec0304SVijay Mahadevan PetscErrorCode ierr; 6641cec0304SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 6651cec0304SVijay Mahadevan 6661cec0304SVijay Mahadevan PetscFunctionBegin; 6671cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6681cec0304SVijay Mahadevan dmmoab->elocal->clear(); 6691cec0304SVijay Mahadevan dmmoab->eghost->clear(); 6701cec0304SVijay Mahadevan dmmoab->elocal->insert(range->begin(), range->end()); 6711cec0304SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 6721cec0304SVijay Mahadevan *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal); 6731cec0304SVijay Mahadevan dmmoab->neleloc=dmmoab->elocal->size(); 6741cec0304SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 6758cbae1a6SVijay Mahadevan PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele); 6765eb88e9dSVijay Mahadevan PetscFunctionReturn(0); 6775eb88e9dSVijay Mahadevan } 6785eb88e9dSVijay Mahadevan 6795eb88e9dSVijay Mahadevan 6805eb88e9dSVijay Mahadevan #undef __FUNCT__ 6811d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag" 682aa768e4cSTim Tautges /*@ 683aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 684aa768e4cSTim Tautges 685aa768e4cSTim Tautges Collective on MPI_Comm 686aa768e4cSTim Tautges 687aa768e4cSTim Tautges Input Parameter: 688aa768e4cSTim Tautges . dm - The DMMoab object being set 689aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 690aa768e4cSTim Tautges 691aa768e4cSTim Tautges Level: beginner 692aa768e4cSTim Tautges 693aa768e4cSTim Tautges .keywords: DMMoab, create 694aa768e4cSTim Tautges @*/ 6951d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag) 6961d72bce8STim Tautges { 6971d72bce8STim Tautges PetscFunctionBegin; 6981d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6991d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 7001d72bce8STim Tautges PetscFunctionReturn(0); 7011d72bce8STim Tautges } 7021d72bce8STim Tautges 7031d72bce8STim Tautges 7041d72bce8STim Tautges #undef __FUNCT__ 7051d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag" 706aa768e4cSTim Tautges /*@ 707aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 708aa768e4cSTim Tautges 709aa768e4cSTim Tautges Collective on MPI_Comm 710aa768e4cSTim Tautges 711aa768e4cSTim Tautges Input Parameter: 712aa768e4cSTim Tautges . dm - The DMMoab object being set 713aa768e4cSTim Tautges 714aa768e4cSTim Tautges Output Parameter: 715aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 716aa768e4cSTim Tautges 717aa768e4cSTim Tautges Level: beginner 718aa768e4cSTim Tautges 719aa768e4cSTim Tautges .keywords: DMMoab, create 720aa768e4cSTim Tautges @*/ 7211d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag) 7221d72bce8STim Tautges { 7231d72bce8STim Tautges PetscFunctionBegin; 7241d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7251d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 7261d72bce8STim Tautges PetscFunctionReturn(0); 7271d72bce8STim Tautges } 7281d72bce8STim Tautges 7291d72bce8STim Tautges 7301d72bce8STim Tautges #undef __FUNCT__ 7311d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize" 732aa768e4cSTim Tautges /*@ 733aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 734aa768e4cSTim Tautges 735aa768e4cSTim Tautges Collective on MPI_Comm 736aa768e4cSTim Tautges 737aa768e4cSTim Tautges Input Parameter: 738aa768e4cSTim Tautges . dm - The DMMoab object being set 739aa768e4cSTim Tautges . bs - The block size used with this DMMoab 740aa768e4cSTim Tautges 741aa768e4cSTim Tautges Level: beginner 742aa768e4cSTim Tautges 743aa768e4cSTim Tautges .keywords: DMMoab, create 744aa768e4cSTim Tautges @*/ 7451d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs) 7461d72bce8STim Tautges { 7471d72bce8STim Tautges PetscFunctionBegin; 7481d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7491d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 7501d72bce8STim Tautges PetscFunctionReturn(0); 7511d72bce8STim Tautges } 7521d72bce8STim Tautges 7531d72bce8STim Tautges 7541d72bce8STim Tautges #undef __FUNCT__ 7551d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize" 756aa768e4cSTim Tautges /*@ 757aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 758aa768e4cSTim Tautges 759aa768e4cSTim Tautges Collective on MPI_Comm 760aa768e4cSTim Tautges 761aa768e4cSTim Tautges Input Parameter: 762aa768e4cSTim Tautges . dm - The DMMoab object being set 763aa768e4cSTim Tautges 764aa768e4cSTim Tautges Output Parameter: 765aa768e4cSTim Tautges . bs - The block size used with this DMMoab 766aa768e4cSTim Tautges 767aa768e4cSTim Tautges Level: beginner 768aa768e4cSTim Tautges 769aa768e4cSTim Tautges .keywords: DMMoab, create 770aa768e4cSTim Tautges @*/ 7711d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs) 7721d72bce8STim Tautges { 7731d72bce8STim Tautges PetscFunctionBegin; 7741d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7751d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 7761d72bce8STim Tautges PetscFunctionReturn(0); 7771d72bce8STim Tautges } 7781d72bce8STim Tautges 7791cec0304SVijay Mahadevan 7801cec0304SVijay Mahadevan #undef __FUNCT__ 781212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetSize" 782212ad6d1SVijay Mahadevan /*@ 783212ad6d1SVijay Mahadevan DMMoabGetSize - Get the global vertex size used with this DMMoab 784212ad6d1SVijay Mahadevan 785212ad6d1SVijay Mahadevan Collective on MPI_Comm 786212ad6d1SVijay Mahadevan 787212ad6d1SVijay Mahadevan Input Parameter: 788212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 789212ad6d1SVijay Mahadevan 790212ad6d1SVijay Mahadevan Output Parameter: 791212ad6d1SVijay Mahadevan . ng - The global size of the DMMoab instance 792212ad6d1SVijay Mahadevan 793212ad6d1SVijay Mahadevan Level: beginner 794212ad6d1SVijay Mahadevan 795212ad6d1SVijay Mahadevan .keywords: DMMoab, create 796212ad6d1SVijay Mahadevan @*/ 797212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *ng) 798212ad6d1SVijay Mahadevan { 799212ad6d1SVijay Mahadevan PetscFunctionBegin; 800212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 801212ad6d1SVijay Mahadevan if(ng) *ng = ((DM_Moab*)dm->data)->n; 802212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 803212ad6d1SVijay Mahadevan } 804212ad6d1SVijay Mahadevan 805212ad6d1SVijay Mahadevan 806212ad6d1SVijay Mahadevan #undef __FUNCT__ 807212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalSize" 808212ad6d1SVijay Mahadevan /*@ 809212ad6d1SVijay Mahadevan DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab 810212ad6d1SVijay Mahadevan 811212ad6d1SVijay Mahadevan Collective on MPI_Comm 812212ad6d1SVijay Mahadevan 813212ad6d1SVijay Mahadevan Input Parameter: 814212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 815212ad6d1SVijay Mahadevan 816212ad6d1SVijay Mahadevan Output Parameter: 817212ad6d1SVijay Mahadevan . nl - The local size of the DMMoab instance 818212ad6d1SVijay Mahadevan . ng - The ghosted size of the DMMoab instance 819212ad6d1SVijay Mahadevan 820212ad6d1SVijay Mahadevan Level: beginner 821212ad6d1SVijay Mahadevan 822212ad6d1SVijay Mahadevan .keywords: DMMoab, create 823212ad6d1SVijay Mahadevan @*/ 824212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nl,PetscInt *ng) 825212ad6d1SVijay Mahadevan { 826212ad6d1SVijay Mahadevan PetscFunctionBegin; 827212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 828212ad6d1SVijay Mahadevan if(nl) *nl = ((DM_Moab*)dm->data)->nloc; 829212ad6d1SVijay Mahadevan if(ng) *ng = ((DM_Moab*)dm->data)->nghost; 830212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 831212ad6d1SVijay Mahadevan } 832212ad6d1SVijay Mahadevan 833212ad6d1SVijay Mahadevan 834212ad6d1SVijay Mahadevan #undef __FUNCT__ 8354920ab11SVijay Mahadevan #define __FUNCT__ "DMMoabGetDimension" 8364920ab11SVijay Mahadevan /*@ 8374920ab11SVijay Mahadevan DMMoabGetDimension - Get the dimension of the DM Mesh 8384920ab11SVijay Mahadevan 8394920ab11SVijay Mahadevan Collective on MPI_Comm 8404920ab11SVijay Mahadevan 8414920ab11SVijay Mahadevan Input Parameter: 8424920ab11SVijay Mahadevan . dm - The DMMoab object being set 8434920ab11SVijay Mahadevan 8444920ab11SVijay Mahadevan Output Parameter: 8454920ab11SVijay Mahadevan . dim - The dimension of DM 8464920ab11SVijay Mahadevan 8474920ab11SVijay Mahadevan Level: beginner 8484920ab11SVijay Mahadevan 8494920ab11SVijay Mahadevan .keywords: DMMoab, create 8504920ab11SVijay Mahadevan @*/ 8514920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim) 8524920ab11SVijay Mahadevan { 8534920ab11SVijay Mahadevan PetscFunctionBegin; 8544920ab11SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8554920ab11SVijay Mahadevan *dim = ((DM_Moab*)dm->data)->dim; 8564920ab11SVijay Mahadevan PetscFunctionReturn(0); 8574920ab11SVijay Mahadevan } 8584920ab11SVijay Mahadevan 8594920ab11SVijay Mahadevan 8604920ab11SVijay Mahadevan 8614920ab11SVijay Mahadevan #undef __FUNCT__ 8627023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates" 8637023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos) 8647023aa44SVijay Mahadevan { 8657023aa44SVijay Mahadevan DM_Moab *dmmoab; 8667023aa44SVijay Mahadevan PetscErrorCode ierr; 8677023aa44SVijay Mahadevan moab::ErrorCode merr; 8687023aa44SVijay Mahadevan 8697023aa44SVijay Mahadevan PetscFunctionBegin; 8707023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8717023aa44SVijay Mahadevan PetscValidPointer(conn,3); 8727023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8737023aa44SVijay Mahadevan 8747023aa44SVijay Mahadevan if (!vpos) { 8757023aa44SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr); 8767023aa44SVijay Mahadevan } 8777023aa44SVijay Mahadevan 8787023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 8797023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr); 8807023aa44SVijay Mahadevan PetscFunctionReturn(0); 8817023aa44SVijay Mahadevan } 8827023aa44SVijay Mahadevan 8837023aa44SVijay Mahadevan 8847023aa44SVijay Mahadevan #undef __FUNCT__ 8858d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexConnectivity" 8868d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn) 8878d8d51c8SVijay Mahadevan { 8888d8d51c8SVijay Mahadevan DM_Moab *dmmoab; 8898d8d51c8SVijay Mahadevan std::vector<moab::EntityHandle> adj_entities,connect; 8908d8d51c8SVijay Mahadevan PetscErrorCode ierr; 8918d8d51c8SVijay Mahadevan moab::ErrorCode merr; 8928d8d51c8SVijay Mahadevan 8938d8d51c8SVijay Mahadevan PetscFunctionBegin; 8948d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8958d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 8968d8d51c8SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8978d8d51c8SVijay Mahadevan 8988d8d51c8SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 8998d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(&ehandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr); 9008d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr); 9018d8d51c8SVijay Mahadevan 9028d8d51c8SVijay Mahadevan if (conn) { 9038d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr); 9048d8d51c8SVijay Mahadevan ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr); 9058d8d51c8SVijay Mahadevan } 9068d8d51c8SVijay Mahadevan if (nconn) *nconn=connect.size(); 9078d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 9088d8d51c8SVijay Mahadevan } 9098d8d51c8SVijay Mahadevan 9108d8d51c8SVijay Mahadevan 9118d8d51c8SVijay Mahadevan #undef __FUNCT__ 9128d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabRestoreVertexConnectivity" 9138d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn) 9148d8d51c8SVijay Mahadevan { 9158d8d51c8SVijay Mahadevan PetscErrorCode ierr; 9168d8d51c8SVijay Mahadevan 9178d8d51c8SVijay Mahadevan PetscFunctionBegin; 9188d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 9198d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 9208d8d51c8SVijay Mahadevan 9218d8d51c8SVijay Mahadevan if (conn) { 9228d8d51c8SVijay Mahadevan ierr = PetscFree(*conn);CHKERRQ(ierr); 9238d8d51c8SVijay Mahadevan } 9248d8d51c8SVijay Mahadevan if (nconn) *nconn=0; 9258d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 9268d8d51c8SVijay Mahadevan } 9278d8d51c8SVijay Mahadevan 9288d8d51c8SVijay Mahadevan 9298d8d51c8SVijay Mahadevan 9308d8d51c8SVijay Mahadevan #undef __FUNCT__ 9317023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity" 9327023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn) 9337023aa44SVijay Mahadevan { 9347023aa44SVijay Mahadevan DM_Moab *dmmoab; 9357023aa44SVijay Mahadevan const moab::EntityHandle *connect; 9367023aa44SVijay Mahadevan moab::ErrorCode merr; 9377023aa44SVijay Mahadevan PetscInt nnodes; 9387023aa44SVijay Mahadevan 9397023aa44SVijay Mahadevan PetscFunctionBegin; 9407023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 9417023aa44SVijay Mahadevan PetscValidPointer(conn,4); 9427023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 9437023aa44SVijay Mahadevan 9447023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 9457023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr); 9467023aa44SVijay Mahadevan if (conn) *conn=connect; 9477023aa44SVijay Mahadevan if (nconn) *nconn=nnodes; 9487023aa44SVijay Mahadevan PetscFunctionReturn(0); 9497023aa44SVijay Mahadevan } 9507023aa44SVijay Mahadevan 9517023aa44SVijay Mahadevan 9527023aa44SVijay Mahadevan #undef __FUNCT__ 95369263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary" 95469263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary) 95569263071SVijay Mahadevan { 95669263071SVijay Mahadevan moab::EntityType etype; 95769263071SVijay Mahadevan DM_Moab *dmmoab; 95869263071SVijay Mahadevan PetscInt edim; 95969263071SVijay Mahadevan 96069263071SVijay Mahadevan PetscFunctionBegin; 96169263071SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 96269263071SVijay Mahadevan PetscValidPointer(ent_on_boundary,3); 96369263071SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 96469263071SVijay Mahadevan 96569263071SVijay Mahadevan /* get the entity type and handle accordingly */ 96669263071SVijay Mahadevan etype=dmmoab->mbiface->type_from_handle(ent); 96769263071SVijay 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); 96869263071SVijay Mahadevan 96969263071SVijay Mahadevan /* get the entity dimension */ 97069263071SVijay Mahadevan edim=dmmoab->mbiface->dimension_from_handle(ent); 97169263071SVijay Mahadevan 97269263071SVijay Mahadevan *ent_on_boundary=PETSC_FALSE; 97369263071SVijay Mahadevan if(etype == moab::MBVERTEX && edim == 0) { 974*6d9eb265SVijay Mahadevan if (dmmoab->bndyvtx->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 97569263071SVijay Mahadevan } 97669263071SVijay Mahadevan else { 97769263071SVijay Mahadevan if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */ 978*6d9eb265SVijay Mahadevan if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 97969263071SVijay Mahadevan } 98069263071SVijay Mahadevan else { /* next check the lower-dimensional faces */ 981*6d9eb265SVijay Mahadevan if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 98269263071SVijay Mahadevan } 98369263071SVijay Mahadevan } 98469263071SVijay Mahadevan PetscFunctionReturn(0); 98569263071SVijay Mahadevan } 98669263071SVijay Mahadevan 98769263071SVijay Mahadevan 98869263071SVijay Mahadevan #undef __FUNCT__ 9897023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices" 99069263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx) 9917023aa44SVijay Mahadevan { 9927023aa44SVijay Mahadevan DM_Moab *dmmoab; 9937023aa44SVijay Mahadevan PetscInt i; 9947023aa44SVijay Mahadevan 9957023aa44SVijay Mahadevan PetscFunctionBegin; 9967023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 9977023aa44SVijay Mahadevan PetscValidPointer(cnt,3); 9987023aa44SVijay Mahadevan PetscValidPointer(isbdvtx,4); 9997023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 10007023aa44SVijay Mahadevan 10017023aa44SVijay Mahadevan for (i=0; i < nconn; ++i) { 1002*6d9eb265SVijay Mahadevan isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE); 10037023aa44SVijay Mahadevan } 10047023aa44SVijay Mahadevan PetscFunctionReturn(0); 10057023aa44SVijay Mahadevan } 10067023aa44SVijay Mahadevan 10077023aa44SVijay Mahadevan 10087023aa44SVijay Mahadevan #undef __FUNCT__ 10090c8a2322SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryMarkers" 1010*6d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces) 10111cec0304SVijay Mahadevan { 10121cec0304SVijay Mahadevan DM_Moab *dmmoab; 10131cec0304SVijay Mahadevan 10141cec0304SVijay Mahadevan PetscFunctionBegin; 10151cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 10161cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 10171cec0304SVijay Mahadevan 1018*6d9eb265SVijay Mahadevan if (bdvtx) *bdvtx = dmmoab->bndyvtx; 1019*6d9eb265SVijay Mahadevan if (bdfaces) *bdfaces = dmmoab->bndyfaces; 1020*6d9eb265SVijay Mahadevan if (bdelems) *bdfaces = dmmoab->bndyelems; 10211cec0304SVijay Mahadevan PetscFunctionReturn(0); 10221cec0304SVijay Mahadevan } 10231cec0304SVijay Mahadevan 1024