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