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