1032b8ab6SVijay Mahadevan #include <petsc-private/dmmbimpl.h> /*I "petscdm.h" I*/ 21d72bce8STim Tautges 31d72bce8STim Tautges #include <petscdmmoab.h> 488face26SJed Brown #include <MBTagConventions.hpp> 51cec0304SVijay Mahadevan #include <moab/Skinner.hpp> 6032b8ab6SVijay Mahadevan 7853cdec3SJed Brown #undef __FUNCT__ 8853cdec3SJed Brown #define __FUNCT__ "DMDestroy_Moab" 9853cdec3SJed Brown PetscErrorCode DMDestroy_Moab(DM dm) 10853cdec3SJed Brown { 11853cdec3SJed Brown PetscErrorCode ierr; 12032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 13853cdec3SJed Brown 14853cdec3SJed Brown PetscFunctionBegin; 15853cdec3SJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 16032b8ab6SVijay Mahadevan if (dmmoab->icreatedinstance) { 17032b8ab6SVijay Mahadevan delete dmmoab->mbiface; 18853cdec3SJed Brown } 19032b8ab6SVijay Mahadevan dmmoab->mbiface = NULL; 20032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 21032b8ab6SVijay Mahadevan delete dmmoab->vlocal; 22032b8ab6SVijay Mahadevan delete dmmoab->vowned; 23032b8ab6SVijay Mahadevan delete dmmoab->vghost; 24032b8ab6SVijay Mahadevan delete dmmoab->elocal; 25032b8ab6SVijay Mahadevan delete dmmoab->eghost; 266d9eb265SVijay Mahadevan delete dmmoab->bndyvtx; 276d9eb265SVijay Mahadevan delete dmmoab->bndyfaces; 286d9eb265SVijay Mahadevan delete dmmoab->bndyelems; 298d8d51c8SVijay Mahadevan 30fc418013SVijay Mahadevan ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr); 318cbae1a6SVijay Mahadevan ierr = PetscFree(dmmoab->lidmap);CHKERRQ(ierr); 328cbae1a6SVijay Mahadevan ierr = PetscFree(dmmoab->gidmap);CHKERRQ(ierr); 3373d8e6d3SVijay Mahadevan ierr = PetscFree(dmmoab->llmap);CHKERRQ(ierr); 348cbae1a6SVijay Mahadevan ierr = PetscFree(dmmoab->lgmap);CHKERRQ(ierr); 35032b8ab6SVijay Mahadevan ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 36032b8ab6SVijay Mahadevan ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr); 37853cdec3SJed Brown ierr = PetscFree(dm->data);CHKERRQ(ierr); 38853cdec3SJed Brown PetscFunctionReturn(0); 39853cdec3SJed Brown } 40853cdec3SJed Brown 41aa768e4cSTim Tautges #undef __FUNCT__ 42032b8ab6SVijay Mahadevan #define __FUNCT__ "DMSetUp_Moab" 43032b8ab6SVijay Mahadevan PetscErrorCode DMSetUp_Moab(DM dm) 44032b8ab6SVijay Mahadevan { 45032b8ab6SVijay Mahadevan PetscErrorCode ierr; 46032b8ab6SVijay Mahadevan moab::ErrorCode merr; 47032b8ab6SVijay Mahadevan Vec local, global; 488cbae1a6SVijay Mahadevan IS from,to; 49032b8ab6SVijay Mahadevan moab::Range::iterator iter; 5073d8e6d3SVijay Mahadevan PetscInt i,j,f,bs,gmin,lmin,lmax,vent,totsize; 51032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 528cbae1a6SVijay Mahadevan moab::Range adjs; 5369263071SVijay Mahadevan 54032b8ab6SVijay Mahadevan PetscFunctionBegin; 55032b8ab6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 56032b8ab6SVijay Mahadevan /* Get the local and shared vertices and cache it */ 57032b8ab6SVijay Mahadevan if (dmmoab->mbiface == PETSC_NULL || dmmoab->pcomm == PETSC_NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface and ParallelComm objects before calling SetUp."); 58032b8ab6SVijay Mahadevan 591cec0304SVijay Mahadevan /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */ 60fd3326ddSVijay Mahadevan if (dmmoab->vlocal->empty()) 618cbae1a6SVijay Mahadevan { 621cec0304SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr); 63032b8ab6SVijay Mahadevan 64032b8ab6SVijay Mahadevan /* filter based on parallel status */ 65fc418013SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 66032b8ab6SVijay Mahadevan 67fd3326ddSVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 68fd3326ddSVijay Mahadevan adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 69fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr); 70fd3326ddSVijay Mahadevan adjs = moab::subtract(adjs, *dmmoab->vghost); 71fd3326ddSVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs); 72fd3326ddSVijay Mahadevan 73fd3326ddSVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 74fd3326ddSVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 75fd3326ddSVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 76fd3326ddSVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 77fd3326ddSVijay Mahadevan 78fd3326ddSVijay Mahadevan #if 0 79fd3326ddSVijay Mahadevan if(dmmoab->pcomm->rank() || dmmoab->pcomm->size()==1) { 80fd3326ddSVijay Mahadevan PetscPrintf(PETSC_COMM_SELF, "Vertices: global: %D, local: %D", dmmoab->n, dmmoab->nloc+dmmoab->nghost); 81fd3326ddSVijay Mahadevan dmmoab->vlocal->print(0); 82fd3326ddSVijay Mahadevan PetscPrintf(PETSC_COMM_SELF, "Vertices: owned: %D", dmmoab->nloc); 83fd3326ddSVijay Mahadevan dmmoab->vowned->print(0); 84fd3326ddSVijay Mahadevan PetscPrintf(PETSC_COMM_SELF, "Vertices: ghost: %D", dmmoab->nghost); 85fd3326ddSVijay Mahadevan dmmoab->vghost->print(0); 86fd3326ddSVijay Mahadevan } 87fd3326ddSVijay Mahadevan #endif 88fd3326ddSVijay Mahadevan } 89fd3326ddSVijay Mahadevan 90fd3326ddSVijay Mahadevan { 91032b8ab6SVijay Mahadevan /* get the information about the local elements in the mesh */ 92032b8ab6SVijay Mahadevan dmmoab->eghost->clear(); 93fc418013SVijay Mahadevan 94fc418013SVijay Mahadevan /* first decipher the leading dimension */ 95fc418013SVijay Mahadevan for (i=3;i>0;i--) { 96fc418013SVijay Mahadevan dmmoab->elocal->clear(); 97fc418013SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr); 98fc418013SVijay Mahadevan 99fc418013SVijay Mahadevan /* store the current mesh dimension */ 100fc418013SVijay Mahadevan if (dmmoab->elocal->size()) { 101fc418013SVijay Mahadevan dmmoab->dim=i; 102fc418013SVijay Mahadevan break; 103fc418013SVijay Mahadevan } 104fc418013SVijay Mahadevan } 105fc418013SVijay Mahadevan 1068cbae1a6SVijay Mahadevan /* filter the ghosted and owned element list */ 107032b8ab6SVijay Mahadevan *dmmoab->eghost = *dmmoab->elocal; 108032b8ab6SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 109032b8ab6SVijay Mahadevan *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal); 110032b8ab6SVijay Mahadevan 111032b8ab6SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 11241dd5348SVijay Mahadevan dmmoab->neleghost = dmmoab->eghost->size(); 113032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 114032b8ab6SVijay Mahadevan } 115032b8ab6SVijay Mahadevan 116032b8ab6SVijay Mahadevan bs = dmmoab->bs; 117032b8ab6SVijay Mahadevan if (!dmmoab->ltog_tag) { 118db66d124SVijay Mahadevan /* Get the global ID tag. The global ID tag is applied to each 119db66d124SVijay Mahadevan vertex. It acts as an global identifier which MOAB uses to 120db66d124SVijay Mahadevan assemble the individual pieces of the mesh */ 121032b8ab6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 122032b8ab6SVijay Mahadevan } 123032b8ab6SVijay Mahadevan 124032b8ab6SVijay Mahadevan totsize=dmmoab->vlocal->size(); 1258cbae1a6SVijay Mahadevan if (totsize != dmmoab->nloc+dmmoab->nghost) SETERRQ2(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Mismatch between local and owned+ghost vertices. %D != %D.",totsize,dmmoab->nloc+dmmoab->nghost); 126fc418013SVijay Mahadevan ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->gsindices);CHKERRQ(ierr); 1271cec0304SVijay Mahadevan { 128032b8ab6SVijay Mahadevan /* first get the local indices */ 129fc418013SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr); 1304a40b570SVijay Mahadevan /* next get the ghosted indices */ 131fc418013SVijay Mahadevan if (dmmoab->nghost) { 132fc418013SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr); 1331cec0304SVijay Mahadevan } 1346e40195eSVijay Mahadevan 1356e40195eSVijay Mahadevan /* find out the local and global minima of GLOBAL_ID */ 136eb9d2429SVijay Mahadevan lmin=lmax=dmmoab->gsindices[0]; 13769263071SVijay Mahadevan for (i=0; i<totsize; ++i) { 138eb9d2429SVijay Mahadevan if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i]; 139eb9d2429SVijay Mahadevan if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i]; 140fc418013SVijay Mahadevan } 1416e40195eSVijay Mahadevan 142eb9d2429SVijay Mahadevan ierr = MPI_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr); 143032b8ab6SVijay Mahadevan 1448cbae1a6SVijay Mahadevan /* set the GID map */ 145fc418013SVijay Mahadevan for (i=0; i<totsize; ++i) { 146eb9d2429SVijay Mahadevan dmmoab->gsindices[i]-=gmin; /* zero based index needed for IS */ 147fc418013SVijay Mahadevan } 1486d9eb265SVijay Mahadevan lmin-=gmin; 1496d9eb265SVijay Mahadevan lmax-=gmin; 1506d9eb265SVijay Mahadevan 1516d9eb265SVijay Mahadevan PetscInfo3(NULL, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin); 1526d9eb265SVijay Mahadevan } 1536d9eb265SVijay Mahadevan 1546d9eb265SVijay Mahadevan { 1558cbae1a6SVijay Mahadevan 1568cbae1a6SVijay Mahadevan ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->gidmap);CHKERRQ(ierr); 1578cbae1a6SVijay Mahadevan ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->lidmap);CHKERRQ(ierr); 158addae81cSVijay Mahadevan ierr = PetscMalloc(totsize*dmmoab->numFields*sizeof(PetscInt), &dmmoab->llmap);CHKERRQ(ierr); 159addae81cSVijay Mahadevan ierr = PetscMalloc(totsize*dmmoab->numFields*sizeof(PetscInt), &dmmoab->lgmap);CHKERRQ(ierr); 1606d9eb265SVijay Mahadevan 1616d9eb265SVijay Mahadevan i=j=0; 16273d8e6d3SVijay Mahadevan /* set the owned vertex data first */ 1638cbae1a6SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) { 16473d8e6d3SVijay Mahadevan vent=(PetscInt)(*iter); 16573d8e6d3SVijay Mahadevan dmmoab->gidmap[vent]=dmmoab->gsindices[i]; 16673d8e6d3SVijay Mahadevan dmmoab->lidmap[vent]=i; 16773d8e6d3SVijay Mahadevan if (bs > 1) { 168addae81cSVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 169addae81cSVijay Mahadevan dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f; 170addae81cSVijay Mahadevan dmmoab->llmap[j]=i*dmmoab->numFields+f; 171addae81cSVijay Mahadevan PetscInfo4(NULL, "Owned Vertex: %D, Field: %D \t LID = %D \t GID = %D.\n", *iter, f, i*dmmoab->numFields+f, dmmoab->gsindices[i]*dmmoab->numFields+f); 1728cbae1a6SVijay Mahadevan } 17373d8e6d3SVijay Mahadevan } 17473d8e6d3SVijay Mahadevan else { 175addae81cSVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 1768cbae1a6SVijay Mahadevan dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i]; 17773d8e6d3SVijay Mahadevan dmmoab->llmap[j]=totsize*f+i; 17873d8e6d3SVijay Mahadevan PetscInfo4(NULL, "Owned Vertex: %D, Field: %D \t LID = %D \t GID = %D.\n", *iter, f, totsize*f+i, totsize*f+dmmoab->gsindices[i]); 17973d8e6d3SVijay Mahadevan } 18073d8e6d3SVijay Mahadevan } 18173d8e6d3SVijay Mahadevan } 18273d8e6d3SVijay Mahadevan /* next arrange all the ghosted data information */ 18373d8e6d3SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) { 18473d8e6d3SVijay Mahadevan vent=(PetscInt)(*iter); 18573d8e6d3SVijay Mahadevan dmmoab->gidmap[vent]=dmmoab->gsindices[i]; 18673d8e6d3SVijay Mahadevan dmmoab->lidmap[vent]=i; 18773d8e6d3SVijay Mahadevan if (bs > 1) { 188addae81cSVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 189addae81cSVijay Mahadevan dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f; 190addae81cSVijay Mahadevan dmmoab->llmap[j]=i*dmmoab->numFields+f; 191addae81cSVijay Mahadevan PetscInfo4(NULL, "Ghost Vertex: %D, Field: %D \t LID = %D \t GID = %D.\n", vent, f, i*dmmoab->numFields+f, dmmoab->gsindices[i]*dmmoab->numFields+f); 19273d8e6d3SVijay Mahadevan } 19373d8e6d3SVijay Mahadevan } 19473d8e6d3SVijay Mahadevan else { 195addae81cSVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 19673d8e6d3SVijay Mahadevan dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i]; 19773d8e6d3SVijay Mahadevan dmmoab->llmap[j]=totsize*f+i; 19873d8e6d3SVijay Mahadevan PetscInfo4(NULL, "Ghost Vertex: %D, Field: %D \t LID = %D \t GID = %D.\n", vent, f, totsize*f+i, totsize*f+dmmoab->gsindices[i]); 19973d8e6d3SVijay Mahadevan } 20073d8e6d3SVijay Mahadevan } 2018cbae1a6SVijay Mahadevan } 2028cbae1a6SVijay Mahadevan 2036d9eb265SVijay Mahadevan /* We need to create the Global to Local Vector Scatter Contexts 2046d9eb265SVijay Mahadevan 1) First create a local and global vector 2056d9eb265SVijay Mahadevan 2) Create a local and global IS 2066d9eb265SVijay Mahadevan 3) Create VecScatter and LtoGMapping objects 2076d9eb265SVijay Mahadevan 4) Cleanup the IS and Vec objects 2086d9eb265SVijay Mahadevan */ 2096d9eb265SVijay Mahadevan ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr); 2106d9eb265SVijay Mahadevan ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr); 2116d9eb265SVijay Mahadevan 2126d9eb265SVijay Mahadevan ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr); 2136d9eb265SVijay Mahadevan PetscInfo3(NULL, "Total-size = %D\t Owned = %D, Ghosted = %D.\n", totsize, dmmoab->nloc, dmmoab->nghost); 2146d9eb265SVijay Mahadevan 2158cbae1a6SVijay Mahadevan /* global to local must retrieve ghost points */ 216addae81cSVijay Mahadevan ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,dmmoab->vstart,1,&from);CHKERRQ(ierr); 2176d9eb265SVijay Mahadevan ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr); 2186d9eb265SVijay Mahadevan 219addae81cSVijay Mahadevan ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,&dmmoab->lgmap[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr); 2206d9eb265SVijay Mahadevan ierr = ISSetBlockSize(to,bs);CHKERRQ(ierr); 2216d9eb265SVijay Mahadevan 2228cbae1a6SVijay Mahadevan if (!dmmoab->ltog_map) { 2238cbae1a6SVijay Mahadevan /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */ 224addae81cSVijay Mahadevan ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,totsize*dmmoab->numFields,dmmoab->lgmap, 2258cbae1a6SVijay Mahadevan PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr); 2268cbae1a6SVijay Mahadevan } 227fc418013SVijay Mahadevan 22873d8e6d3SVijay Mahadevan /* now create the scatter object from local to global vector */ 2298cbae1a6SVijay Mahadevan ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 23073d8e6d3SVijay Mahadevan 23173d8e6d3SVijay Mahadevan /* clean up IS, Vec */ 232032b8ab6SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 2338cbae1a6SVijay Mahadevan ierr = ISDestroy(&to);CHKERRQ(ierr); 234032b8ab6SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 235032b8ab6SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 236032b8ab6SVijay Mahadevan } 237032b8ab6SVijay Mahadevan 2381cec0304SVijay Mahadevan /* skin the boundary and store nodes */ 2391cec0304SVijay Mahadevan { 240eb9d2429SVijay Mahadevan /* get the skin vertices of boundary faces for the current partition and then filter 241eb9d2429SVijay Mahadevan the local, boundary faces, vertices and elements alone via PSTATUS flags; 242eb9d2429SVijay Mahadevan this should not give us any ghosted boundary, but if user needs such a functionality 243eb9d2429SVijay Mahadevan it would be easy to add it based on the find_skin query below */ 2441cec0304SVijay Mahadevan moab::Skinner skinner(dmmoab->mbiface); 245eb9d2429SVijay Mahadevan 2466d9eb265SVijay Mahadevan dmmoab->bndyvtx = new moab::Range(); 2476d9eb265SVijay Mahadevan dmmoab->bndyfaces = new moab::Range(); 2486d9eb265SVijay Mahadevan dmmoab->bndyelems = new moab::Range(); 2496d9eb265SVijay Mahadevan 250eb9d2429SVijay Mahadevan /* get the entities on the skin - only the faces */ 2516d9eb265SVijay Mahadevan merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, *dmmoab->bndyfaces, NULL, false, true, false);MBERRNM(merr); // 'false' param indicates we want faces back, not vertices 252eb9d2429SVijay Mahadevan 253eb9d2429SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 2546d9eb265SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 2556d9eb265SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr); 25669263071SVijay Mahadevan 257eb9d2429SVijay Mahadevan /* get all the nodes via connectivity and the parent elements via adjacency information */ 2586d9eb265SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr); 2596d9eb265SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr); 2606d9eb265SVijay Mahadevan PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size()); 2611cec0304SVijay Mahadevan } 262032b8ab6SVijay Mahadevan PetscFunctionReturn(0); 263032b8ab6SVijay Mahadevan } 264032b8ab6SVijay Mahadevan 2651cec0304SVijay Mahadevan 266032b8ab6SVijay Mahadevan #undef __FUNCT__ 267aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab" 268853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 269aa768e4cSTim Tautges { 270aa768e4cSTim Tautges PetscErrorCode ierr; 271aa768e4cSTim Tautges 272aa768e4cSTim Tautges PetscFunctionBegin; 273aa768e4cSTim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 274032b8ab6SVijay Mahadevan ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr); 275032b8ab6SVijay Mahadevan 276032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 277addae81cSVijay Mahadevan ((DM_Moab*)dm->data)->numFields = 1; 278032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 279032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 28041dd5348SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 281032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 282032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 28341dd5348SVijay Mahadevan ((DM_Moab*)dm->data)->neleghost = 0; 284032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL; 285032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL; 286032b8ab6SVijay Mahadevan 287032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 288032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 289032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 290032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 291032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 292aa768e4cSTim Tautges 29397ea90e6SJed Brown dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 29497ea90e6SJed Brown dm->ops->createlocalvector = DMCreateLocalVector_Moab; 295032b8ab6SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 296032b8ab6SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 29797ea90e6SJed Brown dm->ops->destroy = DMDestroy_Moab; 298032b8ab6SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 299032b8ab6SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 300032b8ab6SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 301032b8ab6SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 302aa768e4cSTim Tautges PetscFunctionReturn(0); 303aa768e4cSTim Tautges } 304fd349b41STim Tautges 305fd349b41STim Tautges #undef __FUNCT__ 3061d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate" 3071d72bce8STim Tautges /*@ 3081d72bce8STim Tautges DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance 3091d72bce8STim Tautges 3101d72bce8STim Tautges Collective on MPI_Comm 3111d72bce8STim Tautges 3121d72bce8STim Tautges Input Parameter: 3131d72bce8STim Tautges . comm - The communicator for the DMMoab object 3141d72bce8STim Tautges 3151d72bce8STim Tautges Output Parameter: 316032b8ab6SVijay Mahadevan . dmb - The DMMoab object 3171d72bce8STim Tautges 3181d72bce8STim Tautges Level: beginner 3191d72bce8STim Tautges 3201d72bce8STim Tautges .keywords: DMMoab, create 3211d72bce8STim Tautges @*/ 322032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb) 3231d72bce8STim Tautges { 3241d72bce8STim Tautges PetscErrorCode ierr; 3251d72bce8STim Tautges 3261d72bce8STim Tautges PetscFunctionBegin; 327032b8ab6SVijay Mahadevan PetscValidPointer(dmb,2); 328032b8ab6SVijay Mahadevan ierr = DMCreate(comm, dmb);CHKERRQ(ierr); 329032b8ab6SVijay Mahadevan ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr); 3301d72bce8STim Tautges PetscFunctionReturn(0); 3311d72bce8STim Tautges } 3321d72bce8STim Tautges 3331d72bce8STim Tautges #undef __FUNCT__ 334aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab" 3351d72bce8STim Tautges /*@ 336a4d2169cSTim Tautges DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data 3371d72bce8STim Tautges 3381d72bce8STim Tautges Collective on MPI_Comm 3391d72bce8STim Tautges 3401d72bce8STim Tautges Input Parameter: 3411d72bce8STim Tautges . comm - The communicator for the DMMoab object 342032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed 343a4d2169cSTim Tautges along with the DMMoab 344a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator 3451d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag 3461d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned 3471d72bce8STim Tautges 3481d72bce8STim Tautges Output Parameter: 349032b8ab6SVijay Mahadevan . dmb - The DMMoab object 3501d72bce8STim Tautges 351032b8ab6SVijay Mahadevan Level: intermediate 3521d72bce8STim Tautges 3531d72bce8STim Tautges .keywords: DMMoab, create 3541d72bce8STim Tautges @*/ 355032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb) 3561d72bce8STim Tautges { 3571d72bce8STim Tautges PetscErrorCode ierr; 358032b8ab6SVijay Mahadevan moab::ErrorCode merr; 3591cec0304SVijay Mahadevan moab::EntityHandle partnset; 3601cec0304SVijay Mahadevan PetscInt rank, nprocs; 361853cdec3SJed Brown DM_Moab *dmmoab; 3621d72bce8STim Tautges 3631d72bce8STim Tautges PetscFunctionBegin; 364032b8ab6SVijay Mahadevan PetscValidPointer(dmb,6); 365032b8ab6SVijay Mahadevan ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr); 366032b8ab6SVijay Mahadevan dmmoab = (DM_Moab*)(*dmb)->data; 367a4d2169cSTim Tautges 368a4d2169cSTim Tautges if (!mbiface) { 36972ff976dSVijay Mahadevan dmmoab->mbiface = new moab::Core(); 3707d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_TRUE; 3711d72bce8STim Tautges } 3721cec0304SVijay Mahadevan else { 3731cec0304SVijay Mahadevan dmmoab->mbiface = mbiface; 3747d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_FALSE; 3751cec0304SVijay Mahadevan } 3761cec0304SVijay Mahadevan 377b5410836SVijay Mahadevan /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */ 378b5410836SVijay Mahadevan dmmoab->fileset=0; 3797d89fc02STim Tautges 380a4d2169cSTim Tautges if (!pcomm) { 381032b8ab6SVijay Mahadevan ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 382032b8ab6SVijay Mahadevan ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr); 383032b8ab6SVijay Mahadevan 384db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 385db66d124SVijay Mahadevan to the load_file functions to be populated. */ 3860c8a2322SVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);MBERR("Creating partition set failed", merr); 387032b8ab6SVijay Mahadevan 388db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 38972ff976dSVijay Mahadevan dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm); 39072ff976dSVijay Mahadevan } 39172ff976dSVijay Mahadevan else { 39272ff976dSVijay Mahadevan ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr); 393032b8ab6SVijay Mahadevan } 394032b8ab6SVijay Mahadevan 3954973de03SVijay Mahadevan /* do the remaining initializations for DMMoab */ 3964973de03SVijay Mahadevan dmmoab->bs = 1; 397addae81cSVijay Mahadevan dmmoab->numFields = 1; 3984973de03SVijay Mahadevan 3994973de03SVijay Mahadevan /* set global ID tag handle */ 400032b8ab6SVijay Mahadevan if (!ltog_tag) { 4014973de03SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 402032b8ab6SVijay Mahadevan } 403032b8ab6SVijay Mahadevan else { 404032b8ab6SVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr); 405a4d2169cSTim Tautges } 406a4d2169cSTim Tautges 4074973de03SVijay Mahadevan /* set the local range of entities (vertices) of interest */ 408a4d2169cSTim Tautges if (range) { 4095eb88e9dSVijay Mahadevan ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr); 410a4d2169cSTim Tautges } 4111d72bce8STim Tautges PetscFunctionReturn(0); 4121d72bce8STim Tautges } 4131d72bce8STim Tautges 4141d72bce8STim Tautges #undef __FUNCT__ 4151d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm" 416aa768e4cSTim Tautges /*@ 417aa768e4cSTim Tautges DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab 418aa768e4cSTim Tautges 419aa768e4cSTim Tautges Collective on MPI_Comm 420aa768e4cSTim Tautges 421aa768e4cSTim Tautges Input Parameter: 422aa768e4cSTim Tautges . dm - The DMMoab object being set 423aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab 424aa768e4cSTim Tautges 425aa768e4cSTim Tautges Level: beginner 426aa768e4cSTim Tautges 427aa768e4cSTim Tautges .keywords: DMMoab, create 428aa768e4cSTim Tautges @*/ 4291d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm) 4301d72bce8STim Tautges { 431032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 432032b8ab6SVijay Mahadevan 4331d72bce8STim Tautges PetscFunctionBegin; 4341d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4351cec0304SVijay Mahadevan PetscValidPointer(pcomm,2); 436032b8ab6SVijay Mahadevan dmmoab->pcomm = pcomm; 437032b8ab6SVijay Mahadevan dmmoab->mbiface = pcomm->get_moab(); 438032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 4391d72bce8STim Tautges PetscFunctionReturn(0); 4401d72bce8STim Tautges } 4411d72bce8STim Tautges 4421d72bce8STim Tautges 4431d72bce8STim Tautges #undef __FUNCT__ 4441d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm" 445aa768e4cSTim Tautges /*@ 446aa768e4cSTim Tautges DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab 447aa768e4cSTim Tautges 448aa768e4cSTim Tautges Collective on MPI_Comm 449aa768e4cSTim Tautges 450aa768e4cSTim Tautges Input Parameter: 451aa768e4cSTim Tautges . dm - The DMMoab object being set 452aa768e4cSTim Tautges 453aa768e4cSTim Tautges Output Parameter: 454aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 455aa768e4cSTim Tautges 456aa768e4cSTim Tautges Level: beginner 457aa768e4cSTim Tautges 458aa768e4cSTim Tautges .keywords: DMMoab, create 459aa768e4cSTim Tautges @*/ 4601d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm) 4611d72bce8STim Tautges { 4621d72bce8STim Tautges PetscFunctionBegin; 4631d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 464032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 4651d72bce8STim Tautges PetscFunctionReturn(0); 4661d72bce8STim Tautges } 4671d72bce8STim Tautges 4681d72bce8STim Tautges 4691d72bce8STim Tautges #undef __FUNCT__ 4701d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface" 471aa768e4cSTim Tautges /*@ 472aa768e4cSTim Tautges DMMoabSetInterface - Set the MOAB instance used with this DMMoab 473aa768e4cSTim Tautges 474aa768e4cSTim Tautges Collective on MPI_Comm 475aa768e4cSTim Tautges 476aa768e4cSTim Tautges Input Parameter: 477aa768e4cSTim Tautges . dm - The DMMoab object being set 478aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab 479aa768e4cSTim Tautges 480aa768e4cSTim Tautges Level: beginner 481aa768e4cSTim Tautges 482aa768e4cSTim Tautges .keywords: DMMoab, create 483aa768e4cSTim Tautges @*/ 484a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface) 4851d72bce8STim Tautges { 486032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 487032b8ab6SVijay Mahadevan 4881d72bce8STim Tautges PetscFunctionBegin; 4891d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4901cec0304SVijay Mahadevan PetscValidPointer(mbiface,2); 491032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 492032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 493032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 4941d72bce8STim Tautges PetscFunctionReturn(0); 4951d72bce8STim Tautges } 4961d72bce8STim Tautges 4971d72bce8STim Tautges 4981d72bce8STim Tautges #undef __FUNCT__ 4991d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface" 500aa768e4cSTim Tautges /*@ 501aa768e4cSTim Tautges DMMoabGetInterface - Get the MOAB instance used with this DMMoab 502aa768e4cSTim Tautges 503aa768e4cSTim Tautges Collective on MPI_Comm 504aa768e4cSTim Tautges 505aa768e4cSTim Tautges Input Parameter: 506aa768e4cSTim Tautges . dm - The DMMoab object being set 507aa768e4cSTim Tautges 508aa768e4cSTim Tautges Output Parameter: 509aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab 510aa768e4cSTim Tautges 511aa768e4cSTim Tautges Level: beginner 512aa768e4cSTim Tautges 513aa768e4cSTim Tautges .keywords: DMMoab, create 514aa768e4cSTim Tautges @*/ 515a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface) 5161d72bce8STim Tautges { 5179426e041SSatish Balay PetscErrorCode ierr; 518cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 519cabb514dSBarry Smith 5201d72bce8STim Tautges PetscFunctionBegin; 5211d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 522cabb514dSBarry Smith ierr = PetscCitationsRegister("@techreport{tautges_moab:_2004,\n type = {{SAND2004-1592}},\n title = {{MOAB:} A Mesh-Oriented Database}, institution = {Sandia National Laboratories},\n author = {Tautges, T. J. and Meyers, R. and Merkley, K. and Stimpson, C. and Ernst, C.},\n year = {2004}, note = {Report}\n}\n",&cite);CHKERRQ(ierr); 523a4d2169cSTim Tautges *mbiface = ((DM_Moab*)dm->data)->mbiface; 5241d72bce8STim Tautges PetscFunctionReturn(0); 5251d72bce8STim Tautges } 5261d72bce8STim Tautges 5271d72bce8STim Tautges 5281d72bce8STim Tautges #undef __FUNCT__ 5295eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices" 530aa768e4cSTim Tautges /*@ 5315eb88e9dSVijay Mahadevan DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab 532aa768e4cSTim Tautges 533aa768e4cSTim Tautges Collective on MPI_Comm 534aa768e4cSTim Tautges 535aa768e4cSTim Tautges Input Parameter: 536aa768e4cSTim Tautges . dm - The DMMoab object being set 537aa768e4cSTim Tautges . range - The entities treated by this DMMoab 538aa768e4cSTim Tautges 539aa768e4cSTim Tautges Level: beginner 540aa768e4cSTim Tautges 541aa768e4cSTim Tautges .keywords: DMMoab, create 542aa768e4cSTim Tautges @*/ 5435eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range) 5441d72bce8STim Tautges { 545032b8ab6SVijay Mahadevan moab::ErrorCode merr; 546032b8ab6SVijay Mahadevan PetscErrorCode ierr; 547fd3326ddSVijay Mahadevan moab::Range tmpvtxs; 548032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 549032b8ab6SVijay Mahadevan 5501d72bce8STim Tautges PetscFunctionBegin; 5511d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 552032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 553032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 554fd3326ddSVijay Mahadevan 555032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 556fd3326ddSVijay Mahadevan 557fd3326ddSVijay Mahadevan /* filter based on parallel status */ 558fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 559fd3326ddSVijay Mahadevan 560fd3326ddSVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 561fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 562fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(tmpvtxs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr); 563fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost); 564fd3326ddSVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs); 565fd3326ddSVijay Mahadevan 566fd3326ddSVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 567032b8ab6SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 568032b8ab6SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 569032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 5701d72bce8STim Tautges PetscFunctionReturn(0); 5711d72bce8STim Tautges } 5721d72bce8STim Tautges 5731d72bce8STim Tautges 5741d72bce8STim Tautges #undef __FUNCT__ 5758d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetAllVertices" 5768d8d51c8SVijay Mahadevan /*@ 5778d8d51c8SVijay Mahadevan DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab 5788d8d51c8SVijay Mahadevan 5798d8d51c8SVijay Mahadevan Collective on MPI_Comm 5808d8d51c8SVijay Mahadevan 5818d8d51c8SVijay Mahadevan Input Parameter: 5828d8d51c8SVijay Mahadevan . dm - The DMMoab object being set 5838d8d51c8SVijay Mahadevan 5848d8d51c8SVijay Mahadevan Output Parameter: 5858d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted) 5868d8d51c8SVijay Mahadevan 5878d8d51c8SVijay Mahadevan Level: beginner 5888d8d51c8SVijay Mahadevan 5898d8d51c8SVijay Mahadevan .keywords: DMMoab, create 5908d8d51c8SVijay Mahadevan @*/ 5918d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local) 5928d8d51c8SVijay Mahadevan { 5938d8d51c8SVijay Mahadevan PetscFunctionBegin; 5948d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5958d8d51c8SVijay Mahadevan if (local) *local = *((DM_Moab*)dm->data)->vlocal; 5968d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 5978d8d51c8SVijay Mahadevan } 5988d8d51c8SVijay Mahadevan 5998d8d51c8SVijay Mahadevan 6008d8d51c8SVijay Mahadevan 6018d8d51c8SVijay Mahadevan #undef __FUNCT__ 6025eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices" 603aa768e4cSTim Tautges /*@ 6045eb88e9dSVijay Mahadevan DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab 605aa768e4cSTim Tautges 606aa768e4cSTim Tautges Collective on MPI_Comm 607aa768e4cSTim Tautges 608aa768e4cSTim Tautges Input Parameter: 609aa768e4cSTim Tautges . dm - The DMMoab object being set 610aa768e4cSTim Tautges 611aa768e4cSTim Tautges Output Parameter: 6125eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab 6135eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition 614aa768e4cSTim Tautges 615aa768e4cSTim Tautges Level: beginner 616aa768e4cSTim Tautges 617aa768e4cSTim Tautges .keywords: DMMoab, create 618aa768e4cSTim Tautges @*/ 619*351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,const moab::Range **owned,const moab::Range **ghost) 6201d72bce8STim Tautges { 6211d72bce8STim Tautges PetscFunctionBegin; 6221d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 623*351b8a77SVijay Mahadevan if (owned) *owned = ((DM_Moab*)dm->data)->vowned; 624*351b8a77SVijay Mahadevan if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost; 6251d72bce8STim Tautges PetscFunctionReturn(0); 6261d72bce8STim Tautges } 6271d72bce8STim Tautges 6281d72bce8STim Tautges #undef __FUNCT__ 6295eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements" 6305eb88e9dSVijay Mahadevan /*@ 6315eb88e9dSVijay Mahadevan DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned 6325eb88e9dSVijay Mahadevan 6335eb88e9dSVijay Mahadevan Collective on MPI_Comm 6345eb88e9dSVijay Mahadevan 6355eb88e9dSVijay Mahadevan Input Parameter: 6365eb88e9dSVijay Mahadevan . dm - The DMMoab object being set 6375eb88e9dSVijay Mahadevan 6385eb88e9dSVijay Mahadevan Output Parameter: 6395eb88e9dSVijay Mahadevan . range - The entities owned locally 6405eb88e9dSVijay Mahadevan 6415eb88e9dSVijay Mahadevan Level: beginner 6425eb88e9dSVijay Mahadevan 6435eb88e9dSVijay Mahadevan .keywords: DMMoab, create 6445eb88e9dSVijay Mahadevan @*/ 645*351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,const moab::Range **range) 6465eb88e9dSVijay Mahadevan { 6475eb88e9dSVijay Mahadevan PetscFunctionBegin; 6485eb88e9dSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 649*351b8a77SVijay Mahadevan if (range) *range = ((DM_Moab*)dm->data)->elocal; 6501cec0304SVijay Mahadevan PetscFunctionReturn(0); 6511cec0304SVijay Mahadevan } 6521cec0304SVijay Mahadevan 6531cec0304SVijay Mahadevan 6541cec0304SVijay Mahadevan #undef __FUNCT__ 6551cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements" 6561cec0304SVijay Mahadevan /*@ 6571cec0304SVijay Mahadevan DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab 6581cec0304SVijay Mahadevan 6591cec0304SVijay Mahadevan Collective on MPI_Comm 6601cec0304SVijay Mahadevan 6611cec0304SVijay Mahadevan Input Parameter: 6621cec0304SVijay Mahadevan . dm - The DMMoab object being set 6631cec0304SVijay Mahadevan . range - The entities treated by this DMMoab 6641cec0304SVijay Mahadevan 6651cec0304SVijay Mahadevan Level: beginner 6661cec0304SVijay Mahadevan 6671cec0304SVijay Mahadevan .keywords: DMMoab, create 6681cec0304SVijay Mahadevan @*/ 6691cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range) 6701cec0304SVijay Mahadevan { 6711cec0304SVijay Mahadevan moab::ErrorCode merr; 6721cec0304SVijay Mahadevan PetscErrorCode ierr; 6731cec0304SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 6741cec0304SVijay Mahadevan 6751cec0304SVijay Mahadevan PetscFunctionBegin; 6761cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6771cec0304SVijay Mahadevan dmmoab->elocal->clear(); 6781cec0304SVijay Mahadevan dmmoab->eghost->clear(); 6791cec0304SVijay Mahadevan dmmoab->elocal->insert(range->begin(), range->end()); 6801cec0304SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 6811cec0304SVijay Mahadevan *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal); 6821cec0304SVijay Mahadevan dmmoab->neleloc=dmmoab->elocal->size(); 68341dd5348SVijay Mahadevan dmmoab->neleghost=dmmoab->eghost->size(); 6841cec0304SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 6858cbae1a6SVijay Mahadevan PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele); 6865eb88e9dSVijay Mahadevan PetscFunctionReturn(0); 6875eb88e9dSVijay Mahadevan } 6885eb88e9dSVijay Mahadevan 6895eb88e9dSVijay Mahadevan 6905eb88e9dSVijay Mahadevan #undef __FUNCT__ 6911d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag" 692aa768e4cSTim Tautges /*@ 693aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 694aa768e4cSTim Tautges 695aa768e4cSTim Tautges Collective on MPI_Comm 696aa768e4cSTim Tautges 697aa768e4cSTim Tautges Input Parameter: 698aa768e4cSTim Tautges . dm - The DMMoab object being set 699aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 700aa768e4cSTim Tautges 701aa768e4cSTim Tautges Level: beginner 702aa768e4cSTim Tautges 703aa768e4cSTim Tautges .keywords: DMMoab, create 704aa768e4cSTim Tautges @*/ 7051d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag) 7061d72bce8STim Tautges { 7071d72bce8STim Tautges PetscFunctionBegin; 7081d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7091d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 7101d72bce8STim Tautges PetscFunctionReturn(0); 7111d72bce8STim Tautges } 7121d72bce8STim Tautges 7131d72bce8STim Tautges 7141d72bce8STim Tautges #undef __FUNCT__ 7151d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag" 716aa768e4cSTim Tautges /*@ 717aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 718aa768e4cSTim Tautges 719aa768e4cSTim Tautges Collective on MPI_Comm 720aa768e4cSTim Tautges 721aa768e4cSTim Tautges Input Parameter: 722aa768e4cSTim Tautges . dm - The DMMoab object being set 723aa768e4cSTim Tautges 724aa768e4cSTim Tautges Output Parameter: 725aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 726aa768e4cSTim Tautges 727aa768e4cSTim Tautges Level: beginner 728aa768e4cSTim Tautges 729aa768e4cSTim Tautges .keywords: DMMoab, create 730aa768e4cSTim Tautges @*/ 7311d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag) 7321d72bce8STim Tautges { 7331d72bce8STim Tautges PetscFunctionBegin; 7341d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7351d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 7361d72bce8STim Tautges PetscFunctionReturn(0); 7371d72bce8STim Tautges } 7381d72bce8STim Tautges 7391d72bce8STim Tautges 7401d72bce8STim Tautges #undef __FUNCT__ 7411d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize" 742aa768e4cSTim Tautges /*@ 743aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 744aa768e4cSTim Tautges 745aa768e4cSTim Tautges Collective on MPI_Comm 746aa768e4cSTim Tautges 747aa768e4cSTim Tautges Input Parameter: 748aa768e4cSTim Tautges . dm - The DMMoab object being set 749aa768e4cSTim Tautges . bs - The block size used with this DMMoab 750aa768e4cSTim Tautges 751aa768e4cSTim Tautges Level: beginner 752aa768e4cSTim Tautges 753aa768e4cSTim Tautges .keywords: DMMoab, create 754aa768e4cSTim Tautges @*/ 7551d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs) 7561d72bce8STim Tautges { 7571d72bce8STim Tautges PetscFunctionBegin; 7581d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7591d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 7601d72bce8STim Tautges PetscFunctionReturn(0); 7611d72bce8STim Tautges } 7621d72bce8STim Tautges 7631d72bce8STim Tautges 7641d72bce8STim Tautges #undef __FUNCT__ 7651d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize" 766aa768e4cSTim Tautges /*@ 767aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 768aa768e4cSTim Tautges 769aa768e4cSTim Tautges Collective on MPI_Comm 770aa768e4cSTim Tautges 771aa768e4cSTim Tautges Input Parameter: 772aa768e4cSTim Tautges . dm - The DMMoab object being set 773aa768e4cSTim Tautges 774aa768e4cSTim Tautges Output Parameter: 775aa768e4cSTim Tautges . bs - The block size used with this DMMoab 776aa768e4cSTim Tautges 777aa768e4cSTim Tautges Level: beginner 778aa768e4cSTim Tautges 779aa768e4cSTim Tautges .keywords: DMMoab, create 780aa768e4cSTim Tautges @*/ 7811d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs) 7821d72bce8STim Tautges { 7831d72bce8STim Tautges PetscFunctionBegin; 7841d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7851d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 7861d72bce8STim Tautges PetscFunctionReturn(0); 7871d72bce8STim Tautges } 7881d72bce8STim Tautges 7891cec0304SVijay Mahadevan 7901cec0304SVijay Mahadevan #undef __FUNCT__ 791212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetSize" 792212ad6d1SVijay Mahadevan /*@ 793212ad6d1SVijay Mahadevan DMMoabGetSize - Get the global vertex size used with this DMMoab 794212ad6d1SVijay Mahadevan 79500cc10feSVijay Mahadevan Collective on DM 796212ad6d1SVijay Mahadevan 797212ad6d1SVijay Mahadevan Input Parameter: 798212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 799212ad6d1SVijay Mahadevan 800212ad6d1SVijay Mahadevan Output Parameter: 80100cc10feSVijay Mahadevan . neg - The number of global elements in the DMMoab instance 80200cc10feSVijay Mahadevan . nvg - The number of global vertices in the DMMoab instance 803212ad6d1SVijay Mahadevan 804212ad6d1SVijay Mahadevan Level: beginner 805212ad6d1SVijay Mahadevan 806212ad6d1SVijay Mahadevan .keywords: DMMoab, create 807212ad6d1SVijay Mahadevan @*/ 80841dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *neg,PetscInt *nvg) 809212ad6d1SVijay Mahadevan { 810212ad6d1SVijay Mahadevan PetscFunctionBegin; 811212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 81241dd5348SVijay Mahadevan if(neg) *neg = ((DM_Moab*)dm->data)->nele; 81341dd5348SVijay Mahadevan if(nvg) *nvg = ((DM_Moab*)dm->data)->n; 814212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 815212ad6d1SVijay Mahadevan } 816212ad6d1SVijay Mahadevan 817212ad6d1SVijay Mahadevan 818212ad6d1SVijay Mahadevan #undef __FUNCT__ 819212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalSize" 820212ad6d1SVijay Mahadevan /*@ 821212ad6d1SVijay Mahadevan DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab 822212ad6d1SVijay Mahadevan 82300cc10feSVijay Mahadevan Collective on DM 824212ad6d1SVijay Mahadevan 825212ad6d1SVijay Mahadevan Input Parameter: 826212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 827212ad6d1SVijay Mahadevan 828212ad6d1SVijay Mahadevan Output Parameter: 82900cc10feSVijay Mahadevan . nel - The number of owned elements in this processor 83000cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor 83100cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor 83200cc10feSVijay Mahadevan . nvg - The number of ghosted vertices in this processor 833212ad6d1SVijay Mahadevan 834212ad6d1SVijay Mahadevan Level: beginner 835212ad6d1SVijay Mahadevan 836212ad6d1SVijay Mahadevan .keywords: DMMoab, create 837212ad6d1SVijay Mahadevan @*/ 83841dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nel,PetscInt *neg,PetscInt *nvl,PetscInt *nvg) 839212ad6d1SVijay Mahadevan { 840212ad6d1SVijay Mahadevan PetscFunctionBegin; 841212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 84241dd5348SVijay Mahadevan if(nel) *nel = ((DM_Moab*)dm->data)->neleloc; 84341dd5348SVijay Mahadevan if(neg) *neg = ((DM_Moab*)dm->data)->neleghost; 84441dd5348SVijay Mahadevan if(nvl) *nvl = ((DM_Moab*)dm->data)->nloc; 84541dd5348SVijay Mahadevan if(nvg) *nvg = ((DM_Moab*)dm->data)->nghost; 846212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 847212ad6d1SVijay Mahadevan } 848212ad6d1SVijay Mahadevan 849212ad6d1SVijay Mahadevan 850212ad6d1SVijay Mahadevan #undef __FUNCT__ 85100cc10feSVijay Mahadevan #define __FUNCT__ "DMMoabGetOffset" 85200cc10feSVijay Mahadevan /*@ 85300cc10feSVijay Mahadevan DMMoabGetOffset - Get the local offset for the global vector 85400cc10feSVijay Mahadevan 85500cc10feSVijay Mahadevan Collective on MPI_Comm 85600cc10feSVijay Mahadevan 85700cc10feSVijay Mahadevan Input Parameter: 85800cc10feSVijay Mahadevan . dm - The DMMoab object being set 85900cc10feSVijay Mahadevan 86000cc10feSVijay Mahadevan Output Parameter: 86100cc10feSVijay Mahadevan . offset - The local offset for the global vector 86200cc10feSVijay Mahadevan 86300cc10feSVijay Mahadevan Level: beginner 86400cc10feSVijay Mahadevan 86500cc10feSVijay Mahadevan .keywords: DMMoab, create 86600cc10feSVijay Mahadevan @*/ 86700cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm,PetscInt *offset) 86800cc10feSVijay Mahadevan { 86900cc10feSVijay Mahadevan PetscFunctionBegin; 87000cc10feSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 87100cc10feSVijay Mahadevan *offset = ((DM_Moab*)dm->data)->vstart; 87200cc10feSVijay Mahadevan PetscFunctionReturn(0); 87300cc10feSVijay Mahadevan } 87400cc10feSVijay Mahadevan 87500cc10feSVijay Mahadevan 87600cc10feSVijay Mahadevan #undef __FUNCT__ 8774920ab11SVijay Mahadevan #define __FUNCT__ "DMMoabGetDimension" 8784920ab11SVijay Mahadevan /*@ 8794920ab11SVijay Mahadevan DMMoabGetDimension - Get the dimension of the DM Mesh 8804920ab11SVijay Mahadevan 8814920ab11SVijay Mahadevan Collective on MPI_Comm 8824920ab11SVijay Mahadevan 8834920ab11SVijay Mahadevan Input Parameter: 8844920ab11SVijay Mahadevan . dm - The DMMoab object being set 8854920ab11SVijay Mahadevan 8864920ab11SVijay Mahadevan Output Parameter: 8874920ab11SVijay Mahadevan . dim - The dimension of DM 8884920ab11SVijay Mahadevan 8894920ab11SVijay Mahadevan Level: beginner 8904920ab11SVijay Mahadevan 8914920ab11SVijay Mahadevan .keywords: DMMoab, create 8924920ab11SVijay Mahadevan @*/ 8934920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim) 8944920ab11SVijay Mahadevan { 8954920ab11SVijay Mahadevan PetscFunctionBegin; 8964920ab11SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8974920ab11SVijay Mahadevan *dim = ((DM_Moab*)dm->data)->dim; 8984920ab11SVijay Mahadevan PetscFunctionReturn(0); 8994920ab11SVijay Mahadevan } 9004920ab11SVijay Mahadevan 9014920ab11SVijay Mahadevan 9024920ab11SVijay Mahadevan 9034920ab11SVijay Mahadevan #undef __FUNCT__ 9047023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates" 9057023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos) 9067023aa44SVijay Mahadevan { 9077023aa44SVijay Mahadevan DM_Moab *dmmoab; 9087023aa44SVijay Mahadevan PetscErrorCode ierr; 9097023aa44SVijay Mahadevan moab::ErrorCode merr; 9107023aa44SVijay Mahadevan 9117023aa44SVijay Mahadevan PetscFunctionBegin; 9127023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 9137023aa44SVijay Mahadevan PetscValidPointer(conn,3); 9147023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 9157023aa44SVijay Mahadevan 9167023aa44SVijay Mahadevan if (!vpos) { 9177023aa44SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr); 9187023aa44SVijay Mahadevan } 9197023aa44SVijay Mahadevan 9207023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 9217023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr); 9227023aa44SVijay Mahadevan PetscFunctionReturn(0); 9237023aa44SVijay Mahadevan } 9247023aa44SVijay Mahadevan 9257023aa44SVijay Mahadevan 9267023aa44SVijay Mahadevan #undef __FUNCT__ 9278d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexConnectivity" 9288d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn) 9298d8d51c8SVijay Mahadevan { 9308d8d51c8SVijay Mahadevan DM_Moab *dmmoab; 9318d8d51c8SVijay Mahadevan std::vector<moab::EntityHandle> adj_entities,connect; 9328d8d51c8SVijay Mahadevan PetscErrorCode ierr; 9338d8d51c8SVijay Mahadevan moab::ErrorCode merr; 9348d8d51c8SVijay Mahadevan 9358d8d51c8SVijay Mahadevan PetscFunctionBegin; 9368d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 9378d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 9388d8d51c8SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 9398d8d51c8SVijay Mahadevan 9408d8d51c8SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 9418d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(&ehandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr); 9428d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr); 9438d8d51c8SVijay Mahadevan 9448d8d51c8SVijay Mahadevan if (conn) { 9458d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr); 9468d8d51c8SVijay Mahadevan ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr); 9478d8d51c8SVijay Mahadevan } 9488d8d51c8SVijay Mahadevan if (nconn) *nconn=connect.size(); 9498d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 9508d8d51c8SVijay Mahadevan } 9518d8d51c8SVijay Mahadevan 9528d8d51c8SVijay Mahadevan 9538d8d51c8SVijay Mahadevan #undef __FUNCT__ 9548d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabRestoreVertexConnectivity" 9558d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn) 9568d8d51c8SVijay Mahadevan { 9578d8d51c8SVijay Mahadevan PetscErrorCode ierr; 9588d8d51c8SVijay Mahadevan 9598d8d51c8SVijay Mahadevan PetscFunctionBegin; 9608d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 9618d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 9628d8d51c8SVijay Mahadevan 9638d8d51c8SVijay Mahadevan if (conn) { 9648d8d51c8SVijay Mahadevan ierr = PetscFree(*conn);CHKERRQ(ierr); 9658d8d51c8SVijay Mahadevan } 9668d8d51c8SVijay Mahadevan if (nconn) *nconn=0; 9678d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 9688d8d51c8SVijay Mahadevan } 9698d8d51c8SVijay Mahadevan 9708d8d51c8SVijay Mahadevan 9718d8d51c8SVijay Mahadevan 9728d8d51c8SVijay Mahadevan #undef __FUNCT__ 9737023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity" 9747023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn) 9757023aa44SVijay Mahadevan { 9767023aa44SVijay Mahadevan DM_Moab *dmmoab; 9777023aa44SVijay Mahadevan const moab::EntityHandle *connect; 9787023aa44SVijay Mahadevan moab::ErrorCode merr; 9797023aa44SVijay Mahadevan PetscInt nnodes; 9807023aa44SVijay Mahadevan 9817023aa44SVijay Mahadevan PetscFunctionBegin; 9827023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 9837023aa44SVijay Mahadevan PetscValidPointer(conn,4); 9847023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 9857023aa44SVijay Mahadevan 9867023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 9877023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr); 9887023aa44SVijay Mahadevan if (conn) *conn=connect; 9897023aa44SVijay Mahadevan if (nconn) *nconn=nnodes; 9907023aa44SVijay Mahadevan PetscFunctionReturn(0); 9917023aa44SVijay Mahadevan } 9927023aa44SVijay Mahadevan 9937023aa44SVijay Mahadevan 9947023aa44SVijay Mahadevan #undef __FUNCT__ 99569263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary" 99669263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary) 99769263071SVijay Mahadevan { 99869263071SVijay Mahadevan moab::EntityType etype; 99969263071SVijay Mahadevan DM_Moab *dmmoab; 100069263071SVijay Mahadevan PetscInt edim; 100169263071SVijay Mahadevan 100269263071SVijay Mahadevan PetscFunctionBegin; 100369263071SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 100469263071SVijay Mahadevan PetscValidPointer(ent_on_boundary,3); 100569263071SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 100669263071SVijay Mahadevan 100769263071SVijay Mahadevan /* get the entity type and handle accordingly */ 100869263071SVijay Mahadevan etype=dmmoab->mbiface->type_from_handle(ent); 100969263071SVijay 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); 101069263071SVijay Mahadevan 101169263071SVijay Mahadevan /* get the entity dimension */ 101269263071SVijay Mahadevan edim=dmmoab->mbiface->dimension_from_handle(ent); 101369263071SVijay Mahadevan 101469263071SVijay Mahadevan *ent_on_boundary=PETSC_FALSE; 101569263071SVijay Mahadevan if(etype == moab::MBVERTEX && edim == 0) { 10166d9eb265SVijay Mahadevan if (dmmoab->bndyvtx->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 101769263071SVijay Mahadevan } 101869263071SVijay Mahadevan else { 101969263071SVijay Mahadevan if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */ 10206d9eb265SVijay Mahadevan if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 102169263071SVijay Mahadevan } 102269263071SVijay Mahadevan else { /* next check the lower-dimensional faces */ 10236d9eb265SVijay Mahadevan if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 102469263071SVijay Mahadevan } 102569263071SVijay Mahadevan } 102669263071SVijay Mahadevan PetscFunctionReturn(0); 102769263071SVijay Mahadevan } 102869263071SVijay Mahadevan 102969263071SVijay Mahadevan 103069263071SVijay Mahadevan #undef __FUNCT__ 10317023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices" 103269263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx) 10337023aa44SVijay Mahadevan { 10347023aa44SVijay Mahadevan DM_Moab *dmmoab; 10357023aa44SVijay Mahadevan PetscInt i; 10367023aa44SVijay Mahadevan 10377023aa44SVijay Mahadevan PetscFunctionBegin; 10387023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 10397023aa44SVijay Mahadevan PetscValidPointer(cnt,3); 10407023aa44SVijay Mahadevan PetscValidPointer(isbdvtx,4); 10417023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 10427023aa44SVijay Mahadevan 10437023aa44SVijay Mahadevan for (i=0; i < nconn; ++i) { 10446d9eb265SVijay Mahadevan isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE); 10457023aa44SVijay Mahadevan } 10467023aa44SVijay Mahadevan PetscFunctionReturn(0); 10477023aa44SVijay Mahadevan } 10487023aa44SVijay Mahadevan 10497023aa44SVijay Mahadevan 10507023aa44SVijay Mahadevan #undef __FUNCT__ 10510c8a2322SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryMarkers" 10526d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces) 10531cec0304SVijay Mahadevan { 10541cec0304SVijay Mahadevan DM_Moab *dmmoab; 10551cec0304SVijay Mahadevan 10561cec0304SVijay Mahadevan PetscFunctionBegin; 10571cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 10581cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 10591cec0304SVijay Mahadevan 10606d9eb265SVijay Mahadevan if (bdvtx) *bdvtx = dmmoab->bndyvtx; 10616d9eb265SVijay Mahadevan if (bdfaces) *bdfaces = dmmoab->bndyfaces; 10626d9eb265SVijay Mahadevan if (bdelems) *bdfaces = dmmoab->bndyelems; 10631cec0304SVijay Mahadevan PetscFunctionReturn(0); 10641cec0304SVijay Mahadevan } 10651cec0304SVijay Mahadevan 1066