1032b8ab6SVijay Mahadevan #include <petsc-private/dmmbimpl.h> /*I "petscdm.h" I*/ 21d72bce8STim Tautges 31d72bce8STim Tautges #include <petscdmmoab.h> 488face26SJed Brown #include <MBTagConventions.hpp> 51cec0304SVijay Mahadevan #include <moab/Skinner.hpp> 6032b8ab6SVijay Mahadevan 7853cdec3SJed Brown #undef __FUNCT__ 8853cdec3SJed Brown #define __FUNCT__ "DMDestroy_Moab" 9853cdec3SJed Brown PetscErrorCode DMDestroy_Moab(DM dm) 10853cdec3SJed Brown { 11853cdec3SJed Brown PetscErrorCode ierr; 12032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 13853cdec3SJed Brown 14853cdec3SJed Brown PetscFunctionBegin; 15853cdec3SJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 16032b8ab6SVijay Mahadevan if (dmmoab->icreatedinstance) { 17032b8ab6SVijay Mahadevan delete dmmoab->mbiface; 18853cdec3SJed Brown } 19032b8ab6SVijay Mahadevan dmmoab->mbiface = NULL; 20032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 21032b8ab6SVijay Mahadevan delete dmmoab->vlocal; 22032b8ab6SVijay Mahadevan delete dmmoab->vowned; 23032b8ab6SVijay Mahadevan delete dmmoab->vghost; 24032b8ab6SVijay Mahadevan delete dmmoab->elocal; 25032b8ab6SVijay Mahadevan delete dmmoab->eghost; 268d8d51c8SVijay Mahadevan 278d8d51c8SVijay Mahadevan ierr = PetscFree(dmmoab->isbndyvtx);CHKERRQ(ierr); 288d8d51c8SVijay Mahadevan ierr = PetscFree(dmmoab->isbndyfaces);CHKERRQ(ierr); 298d8d51c8SVijay Mahadevan ierr = PetscFree(dmmoab->isbndyelems);CHKERRQ(ierr); 30fc418013SVijay Mahadevan ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr); 31*8cbae1a6SVijay Mahadevan ierr = PetscFree(dmmoab->lidmap);CHKERRQ(ierr); 32*8cbae1a6SVijay Mahadevan ierr = PetscFree(dmmoab->gidmap);CHKERRQ(ierr); 33*8cbae1a6SVijay Mahadevan ierr = PetscFree(dmmoab->lmap);CHKERRQ(ierr); 34*8cbae1a6SVijay 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; 48*8cbae1a6SVijay Mahadevan IS from,to; 49032b8ab6SVijay Mahadevan moab::Range::iterator iter; 50*8cbae1a6SVijay Mahadevan PetscInt i,j,f,bs,gmin,lmin,lmax,totsize; 51032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 52*8cbae1a6SVijay 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."); 58*8cbae1a6SVijay Mahadevan if (!dmmoab->vlocal->empty()) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "DMMoab already initialized."); 59032b8ab6SVijay Mahadevan 601cec0304SVijay Mahadevan /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */ 61*8cbae1a6SVijay 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 67032b8ab6SVijay Mahadevan /* get the information about the local elements in the mesh */ 68032b8ab6SVijay Mahadevan dmmoab->eghost->clear(); 69fc418013SVijay Mahadevan 70fc418013SVijay Mahadevan /* first decipher the leading dimension */ 71fc418013SVijay Mahadevan for (i=3;i>0;i--) { 72fc418013SVijay Mahadevan dmmoab->elocal->clear(); 73fc418013SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr); 74fc418013SVijay Mahadevan 75fc418013SVijay Mahadevan /* store the current mesh dimension */ 76fc418013SVijay Mahadevan if (dmmoab->elocal->size()) { 77fc418013SVijay Mahadevan dmmoab->dim=i; 78fc418013SVijay Mahadevan break; 79fc418013SVijay Mahadevan } 80fc418013SVijay Mahadevan } 81fc418013SVijay Mahadevan 82*8cbae1a6SVijay Mahadevan /* filter the ghosted and owned element list */ 83032b8ab6SVijay Mahadevan *dmmoab->eghost = *dmmoab->elocal; 84032b8ab6SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 85032b8ab6SVijay Mahadevan *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal); 86032b8ab6SVijay Mahadevan 87*8cbae1a6SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 88*8cbae1a6SVijay Mahadevan adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 89*8cbae1a6SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr); 90*8cbae1a6SVijay Mahadevan adjs = moab::subtract(adjs, *dmmoab->vghost); 91*8cbae1a6SVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs); 92*8cbae1a6SVijay Mahadevan 93*8cbae1a6SVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 94*8cbae1a6SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 95*8cbae1a6SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 96*8cbae1a6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 97*8cbae1a6SVijay Mahadevan 98032b8ab6SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 99032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 100*8cbae1a6SVijay Mahadevan 101*8cbae1a6SVijay Mahadevan #if 0 102*8cbae1a6SVijay Mahadevan if(dmmoab->pcomm->rank() || dmmoab->pcomm->size()==1) { 103*8cbae1a6SVijay Mahadevan PetscPrintf(PETSC_COMM_SELF, "Vertices: global: %D, local: %D", dmmoab->n, dmmoab->nloc+dmmoab->nghost); 104*8cbae1a6SVijay Mahadevan dmmoab->vlocal->print(0); 105*8cbae1a6SVijay Mahadevan PetscPrintf(PETSC_COMM_SELF, "Vertices: owned: %D", dmmoab->nloc); 106*8cbae1a6SVijay Mahadevan dmmoab->vowned->print(0); 107*8cbae1a6SVijay Mahadevan PetscPrintf(PETSC_COMM_SELF, "Vertices: ghost: %D", dmmoab->nghost); 108*8cbae1a6SVijay Mahadevan dmmoab->vghost->print(0); 109*8cbae1a6SVijay Mahadevan } 110*8cbae1a6SVijay Mahadevan #endif 111*8cbae1a6SVijay Mahadevan 112032b8ab6SVijay Mahadevan } 113032b8ab6SVijay Mahadevan 114032b8ab6SVijay Mahadevan bs = dmmoab->bs; 115032b8ab6SVijay Mahadevan if (!dmmoab->ltog_tag) { 116db66d124SVijay Mahadevan /* Get the global ID tag. The global ID tag is applied to each 117db66d124SVijay Mahadevan vertex. It acts as an global identifier which MOAB uses to 118db66d124SVijay Mahadevan assemble the individual pieces of the mesh */ 119032b8ab6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 120032b8ab6SVijay Mahadevan } 121032b8ab6SVijay Mahadevan 122032b8ab6SVijay Mahadevan totsize=dmmoab->vlocal->size(); 123*8cbae1a6SVijay 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); 124fc418013SVijay Mahadevan ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->gsindices);CHKERRQ(ierr); 1251cec0304SVijay Mahadevan { 126032b8ab6SVijay Mahadevan /* first get the local indices */ 127fc418013SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr); 1284a40b570SVijay Mahadevan /* next get the ghosted indices */ 129fc418013SVijay Mahadevan if (dmmoab->nghost) { 130fc418013SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr); 1311cec0304SVijay Mahadevan } 1326e40195eSVijay Mahadevan 1336e40195eSVijay Mahadevan /* find out the local and global minima of GLOBAL_ID */ 134eb9d2429SVijay Mahadevan lmin=lmax=dmmoab->gsindices[0]; 13569263071SVijay Mahadevan for (i=0; i<totsize; ++i) { 136eb9d2429SVijay Mahadevan if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i]; 137eb9d2429SVijay Mahadevan if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i]; 138fc418013SVijay Mahadevan } 1396e40195eSVijay Mahadevan 140eb9d2429SVijay Mahadevan ierr = MPI_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr); 141*8cbae1a6SVijay Mahadevan PetscInfo3(NULL, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin); 1421cec0304SVijay Mahadevan } 143032b8ab6SVijay Mahadevan 1441cec0304SVijay Mahadevan { 145*8cbae1a6SVijay Mahadevan /* set the GID map */ 146fc418013SVijay Mahadevan for (i=0; i<totsize; ++i) { 147eb9d2429SVijay Mahadevan dmmoab->gsindices[i]-=gmin; /* zero based index needed for IS */ 148fc418013SVijay Mahadevan } 149*8cbae1a6SVijay Mahadevan i=j=0; 150*8cbae1a6SVijay Mahadevan 151*8cbae1a6SVijay Mahadevan ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->gidmap);CHKERRQ(ierr); 152*8cbae1a6SVijay Mahadevan ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->lidmap);CHKERRQ(ierr); 153*8cbae1a6SVijay Mahadevan ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->lmap);CHKERRQ(ierr); 154*8cbae1a6SVijay Mahadevan ierr = PetscMalloc(totsize*dmmoab->nfields*sizeof(PetscInt), &dmmoab->lgmap);CHKERRQ(ierr); 155*8cbae1a6SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) { 156*8cbae1a6SVijay Mahadevan dmmoab->gidmap[(PetscInt)(*iter)]=dmmoab->gsindices[i]; 157*8cbae1a6SVijay Mahadevan dmmoab->lidmap[(PetscInt)(*iter)]=i; 158*8cbae1a6SVijay Mahadevan dmmoab->lmap[i]=i; 159*8cbae1a6SVijay Mahadevan if (bs > 1) 160*8cbae1a6SVijay Mahadevan for (f=0;f<dmmoab->nfields;f++,j++) 161*8cbae1a6SVijay Mahadevan dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->nfields+f; 162*8cbae1a6SVijay Mahadevan else 163*8cbae1a6SVijay Mahadevan for (f=0;f<dmmoab->nfields;f++,j++) 164*8cbae1a6SVijay Mahadevan dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i]; 165*8cbae1a6SVijay Mahadevan } 166*8cbae1a6SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) { 167*8cbae1a6SVijay Mahadevan dmmoab->gidmap[(PetscInt)(*iter)]=dmmoab->gsindices[i]; 168*8cbae1a6SVijay Mahadevan dmmoab->lidmap[(PetscInt)(*iter)]=i; 169*8cbae1a6SVijay Mahadevan dmmoab->lmap[i]=i; 170*8cbae1a6SVijay Mahadevan if (bs > 1) 171*8cbae1a6SVijay Mahadevan for (f=0;f<dmmoab->nfields;f++,j++) 172*8cbae1a6SVijay Mahadevan dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->nfields+f; 173*8cbae1a6SVijay Mahadevan else 174*8cbae1a6SVijay Mahadevan for (f=0;f<dmmoab->nfields;f++,j++) 175*8cbae1a6SVijay Mahadevan dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i]; 176*8cbae1a6SVijay Mahadevan } 177*8cbae1a6SVijay Mahadevan 178*8cbae1a6SVijay Mahadevan /* global to local must retrieve ghost points */ 179*8cbae1a6SVijay Mahadevan ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&dmmoab->lmap[0],PETSC_COPY_VALUES,&from);CHKERRQ(ierr); 180*8cbae1a6SVijay Mahadevan ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&dmmoab->gsindices[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr); 181*8cbae1a6SVijay Mahadevan 182*8cbae1a6SVijay Mahadevan if (!dmmoab->ltog_map) { 183*8cbae1a6SVijay Mahadevan /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */ 184*8cbae1a6SVijay Mahadevan ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,totsize*dmmoab->nfields,dmmoab->lgmap, 185*8cbae1a6SVijay Mahadevan PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr); 186*8cbae1a6SVijay Mahadevan } 187fc418013SVijay Mahadevan 188032b8ab6SVijay Mahadevan /* Create Global to Local Vector Scatter Context */ 189032b8ab6SVijay Mahadevan ierr = DMCreateGlobalVector_Moab(dm, &global);CHKERRQ(ierr); 190032b8ab6SVijay Mahadevan ierr = DMCreateLocalVector_Moab(dm, &local);CHKERRQ(ierr); 191032b8ab6SVijay Mahadevan 192*8cbae1a6SVijay Mahadevan ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 193032b8ab6SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 194*8cbae1a6SVijay Mahadevan ierr = ISDestroy(&to);CHKERRQ(ierr); 195032b8ab6SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 196032b8ab6SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 197032b8ab6SVijay Mahadevan } 198032b8ab6SVijay Mahadevan 1991cec0304SVijay Mahadevan /* skin the boundary and store nodes */ 2001cec0304SVijay Mahadevan { 2010c8a2322SVijay Mahadevan moab::Range bndyfaces, bndyvtx, bndyelems; 202eb9d2429SVijay Mahadevan /* get the skin vertices of boundary faces for the current partition and then filter 203eb9d2429SVijay Mahadevan the local, boundary faces, vertices and elements alone via PSTATUS flags; 204eb9d2429SVijay Mahadevan this should not give us any ghosted boundary, but if user needs such a functionality 205eb9d2429SVijay Mahadevan it would be easy to add it based on the find_skin query below */ 2061cec0304SVijay Mahadevan moab::Skinner skinner(dmmoab->mbiface); 207eb9d2429SVijay Mahadevan 208eb9d2429SVijay Mahadevan /* get the entities on the skin - only the faces */ 2090c8a2322SVijay Mahadevan merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, bndyfaces, NULL, false, true, false, false);MBERRNM(merr); // 'false' param indicates we want faces back, not vertices 210eb9d2429SVijay Mahadevan 211eb9d2429SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 2120c8a2322SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 2130c8a2322SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr); 21469263071SVijay Mahadevan 215eb9d2429SVijay Mahadevan /* get all the nodes via connectivity and the parent elements via adjacency information */ 2160c8a2322SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(bndyfaces, bndyvtx, false);MBERRNM(ierr); 2170c8a2322SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(bndyfaces, dmmoab->dim, false, bndyelems, moab::Interface::UNION);MBERRNM(ierr); 218*8cbae1a6SVijay Mahadevan PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", bndyvtx.size(), bndyvtx.size(), bndyelems.size()); 2198d8d51c8SVijay Mahadevan 2208d8d51c8SVijay Mahadevan /* cache a bit-vector for easy query */ 2210c8a2322SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscBool)*((PetscInt)(*bndyvtx.rbegin())+1),&dmmoab->isbndyvtx);CHKERRQ(ierr); 2220c8a2322SVijay Mahadevan ierr = PetscMemzero(dmmoab->isbndyvtx,sizeof(PetscBool)*((PetscInt)(*bndyvtx.rbegin())+1));CHKERRQ(ierr); 2230c8a2322SVijay Mahadevan for(moab::Range::iterator iter = bndyvtx.begin(); iter != bndyvtx.end(); iter++) { 2240c8a2322SVijay Mahadevan dmmoab->isbndyvtx[(PetscInt)*iter]=PETSC_TRUE; 2258d8d51c8SVijay Mahadevan } 2268d8d51c8SVijay Mahadevan 2270c8a2322SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscBool)*((PetscInt)(*bndyelems.rbegin())+1),&dmmoab->isbndyelems);CHKERRQ(ierr); 2280c8a2322SVijay Mahadevan ierr = PetscMemzero(dmmoab->isbndyelems,sizeof(PetscBool)*((PetscInt)(*bndyelems.rbegin())+1));CHKERRQ(ierr); 2290c8a2322SVijay Mahadevan for(moab::Range::iterator iter = bndyelems.begin(); iter != bndyelems.end(); iter++) { 2300c8a2322SVijay Mahadevan dmmoab->isbndyelems[(PetscInt)*iter]=PETSC_TRUE; 2318d8d51c8SVijay Mahadevan } 2328d8d51c8SVijay Mahadevan 2330c8a2322SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscBool)*((PetscInt)(*bndyfaces.rbegin())+1),&dmmoab->isbndyfaces);CHKERRQ(ierr); 2340c8a2322SVijay Mahadevan ierr = PetscMemzero(dmmoab->isbndyfaces,sizeof(PetscBool)*((PetscInt)(*bndyfaces.rbegin())+1));CHKERRQ(ierr); 2350c8a2322SVijay Mahadevan for(moab::Range::iterator iter = bndyfaces.begin(); iter != bndyfaces.end(); iter++) { 2360c8a2322SVijay Mahadevan dmmoab->isbndyfaces[(PetscInt)*iter]=PETSC_TRUE; 2378d8d51c8SVijay Mahadevan } 2381cec0304SVijay Mahadevan } 239032b8ab6SVijay Mahadevan PetscFunctionReturn(0); 240032b8ab6SVijay Mahadevan } 241032b8ab6SVijay Mahadevan 2421cec0304SVijay Mahadevan 243032b8ab6SVijay Mahadevan #undef __FUNCT__ 244aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab" 245853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 246aa768e4cSTim Tautges { 247aa768e4cSTim Tautges PetscErrorCode ierr; 248aa768e4cSTim Tautges 249aa768e4cSTim Tautges PetscFunctionBegin; 250aa768e4cSTim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 251032b8ab6SVijay Mahadevan ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr); 252032b8ab6SVijay Mahadevan 253032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 254324f1edfSVijay Mahadevan ((DM_Moab*)dm->data)->nfields = 1; 255032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 256032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 257032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 258032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 259032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 260032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL; 261032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL; 262032b8ab6SVijay Mahadevan 263032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 264032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 265032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 266032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 267032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 268aa768e4cSTim Tautges 26997ea90e6SJed Brown dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 27097ea90e6SJed Brown dm->ops->createlocalvector = DMCreateLocalVector_Moab; 271032b8ab6SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 272032b8ab6SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 27397ea90e6SJed Brown dm->ops->destroy = DMDestroy_Moab; 274032b8ab6SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 275032b8ab6SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 276032b8ab6SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 277032b8ab6SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 278aa768e4cSTim Tautges PetscFunctionReturn(0); 279aa768e4cSTim Tautges } 280fd349b41STim Tautges 281fd349b41STim Tautges #undef __FUNCT__ 2821d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate" 2831d72bce8STim Tautges /*@ 2841d72bce8STim Tautges DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance 2851d72bce8STim Tautges 2861d72bce8STim Tautges Collective on MPI_Comm 2871d72bce8STim Tautges 2881d72bce8STim Tautges Input Parameter: 2891d72bce8STim Tautges . comm - The communicator for the DMMoab object 2901d72bce8STim Tautges 2911d72bce8STim Tautges Output Parameter: 292032b8ab6SVijay Mahadevan . dmb - The DMMoab object 2931d72bce8STim Tautges 2941d72bce8STim Tautges Level: beginner 2951d72bce8STim Tautges 2961d72bce8STim Tautges .keywords: DMMoab, create 2971d72bce8STim Tautges @*/ 298032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb) 2991d72bce8STim Tautges { 3001d72bce8STim Tautges PetscErrorCode ierr; 3011d72bce8STim Tautges 3021d72bce8STim Tautges PetscFunctionBegin; 303032b8ab6SVijay Mahadevan PetscValidPointer(dmb,2); 304032b8ab6SVijay Mahadevan ierr = DMCreate(comm, dmb);CHKERRQ(ierr); 305032b8ab6SVijay Mahadevan ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr); 3061d72bce8STim Tautges PetscFunctionReturn(0); 3071d72bce8STim Tautges } 3081d72bce8STim Tautges 3091d72bce8STim Tautges #undef __FUNCT__ 310aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab" 3111d72bce8STim Tautges /*@ 312a4d2169cSTim Tautges DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data 3131d72bce8STim Tautges 3141d72bce8STim Tautges Collective on MPI_Comm 3151d72bce8STim Tautges 3161d72bce8STim Tautges Input Parameter: 3171d72bce8STim Tautges . comm - The communicator for the DMMoab object 318032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed 319a4d2169cSTim Tautges along with the DMMoab 320a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator 3211d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag 3221d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned 3231d72bce8STim Tautges 3241d72bce8STim Tautges Output Parameter: 325032b8ab6SVijay Mahadevan . dmb - The DMMoab object 3261d72bce8STim Tautges 327032b8ab6SVijay Mahadevan Level: intermediate 3281d72bce8STim Tautges 3291d72bce8STim Tautges .keywords: DMMoab, create 3301d72bce8STim Tautges @*/ 331032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb) 3321d72bce8STim Tautges { 3331d72bce8STim Tautges PetscErrorCode ierr; 334032b8ab6SVijay Mahadevan moab::ErrorCode merr; 3351cec0304SVijay Mahadevan moab::EntityHandle partnset; 3361cec0304SVijay Mahadevan PetscInt rank, nprocs; 337853cdec3SJed Brown DM_Moab *dmmoab; 3381d72bce8STim Tautges 3391d72bce8STim Tautges PetscFunctionBegin; 340032b8ab6SVijay Mahadevan PetscValidPointer(dmb,6); 341032b8ab6SVijay Mahadevan ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr); 342032b8ab6SVijay Mahadevan dmmoab = (DM_Moab*)(*dmb)->data; 343a4d2169cSTim Tautges 344a4d2169cSTim Tautges if (!mbiface) { 34572ff976dSVijay Mahadevan dmmoab->mbiface = new moab::Core(); 3467d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_TRUE; 3471d72bce8STim Tautges } 3481cec0304SVijay Mahadevan else { 3491cec0304SVijay Mahadevan dmmoab->mbiface = mbiface; 3507d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_FALSE; 3511cec0304SVijay Mahadevan } 3521cec0304SVijay Mahadevan 3531cec0304SVijay Mahadevan /* create a fileset to store the hierarchy of entities belonging to current DM */ 3541cec0304SVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_ORDERED, dmmoab->fileset);MBERR("Creating file set failed", merr); 3557d89fc02STim Tautges 356a4d2169cSTim Tautges if (!pcomm) { 357032b8ab6SVijay Mahadevan ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 358032b8ab6SVijay Mahadevan ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr); 359032b8ab6SVijay Mahadevan 360db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 361db66d124SVijay Mahadevan to the load_file functions to be populated. */ 3620c8a2322SVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);MBERR("Creating partition set failed", merr); 363032b8ab6SVijay Mahadevan 364db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 36572ff976dSVijay Mahadevan dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm); 36672ff976dSVijay Mahadevan } 36772ff976dSVijay Mahadevan else { 36872ff976dSVijay Mahadevan ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr); 369032b8ab6SVijay Mahadevan } 370032b8ab6SVijay Mahadevan 3714973de03SVijay Mahadevan /* do the remaining initializations for DMMoab */ 3724973de03SVijay Mahadevan dmmoab->bs = 1; 373324f1edfSVijay Mahadevan dmmoab->nfields = 1; 3744973de03SVijay Mahadevan 3754973de03SVijay Mahadevan /* set global ID tag handle */ 376032b8ab6SVijay Mahadevan if (!ltog_tag) { 3774973de03SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 378032b8ab6SVijay Mahadevan } 379032b8ab6SVijay Mahadevan else { 380032b8ab6SVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr); 381a4d2169cSTim Tautges } 382a4d2169cSTim Tautges 3834973de03SVijay Mahadevan /* set the local range of entities (vertices) of interest */ 384a4d2169cSTim Tautges if (range) { 3855eb88e9dSVijay Mahadevan ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr); 386a4d2169cSTim Tautges } 3871d72bce8STim Tautges PetscFunctionReturn(0); 3881d72bce8STim Tautges } 3891d72bce8STim Tautges 3901d72bce8STim Tautges #undef __FUNCT__ 3911d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm" 392aa768e4cSTim Tautges /*@ 393aa768e4cSTim Tautges DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab 394aa768e4cSTim Tautges 395aa768e4cSTim Tautges Collective on MPI_Comm 396aa768e4cSTim Tautges 397aa768e4cSTim Tautges Input Parameter: 398aa768e4cSTim Tautges . dm - The DMMoab object being set 399aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab 400aa768e4cSTim Tautges 401aa768e4cSTim Tautges Level: beginner 402aa768e4cSTim Tautges 403aa768e4cSTim Tautges .keywords: DMMoab, create 404aa768e4cSTim Tautges @*/ 4051d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm) 4061d72bce8STim Tautges { 407032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 408032b8ab6SVijay Mahadevan 4091d72bce8STim Tautges PetscFunctionBegin; 4101d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4111cec0304SVijay Mahadevan PetscValidPointer(pcomm,2); 412032b8ab6SVijay Mahadevan dmmoab->pcomm = pcomm; 413032b8ab6SVijay Mahadevan dmmoab->mbiface = pcomm->get_moab(); 414032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 4151d72bce8STim Tautges PetscFunctionReturn(0); 4161d72bce8STim Tautges } 4171d72bce8STim Tautges 4181d72bce8STim Tautges 4191d72bce8STim Tautges #undef __FUNCT__ 4201d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm" 421aa768e4cSTim Tautges /*@ 422aa768e4cSTim Tautges DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab 423aa768e4cSTim Tautges 424aa768e4cSTim Tautges Collective on MPI_Comm 425aa768e4cSTim Tautges 426aa768e4cSTim Tautges Input Parameter: 427aa768e4cSTim Tautges . dm - The DMMoab object being set 428aa768e4cSTim Tautges 429aa768e4cSTim Tautges Output Parameter: 430aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 431aa768e4cSTim Tautges 432aa768e4cSTim Tautges Level: beginner 433aa768e4cSTim Tautges 434aa768e4cSTim Tautges .keywords: DMMoab, create 435aa768e4cSTim Tautges @*/ 4361d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm) 4371d72bce8STim Tautges { 4381d72bce8STim Tautges PetscFunctionBegin; 4391d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 440032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 4411d72bce8STim Tautges PetscFunctionReturn(0); 4421d72bce8STim Tautges } 4431d72bce8STim Tautges 4441d72bce8STim Tautges 4451d72bce8STim Tautges #undef __FUNCT__ 4461d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface" 447aa768e4cSTim Tautges /*@ 448aa768e4cSTim Tautges DMMoabSetInterface - Set the MOAB instance used with this DMMoab 449aa768e4cSTim Tautges 450aa768e4cSTim Tautges Collective on MPI_Comm 451aa768e4cSTim Tautges 452aa768e4cSTim Tautges Input Parameter: 453aa768e4cSTim Tautges . dm - The DMMoab object being set 454aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab 455aa768e4cSTim Tautges 456aa768e4cSTim Tautges Level: beginner 457aa768e4cSTim Tautges 458aa768e4cSTim Tautges .keywords: DMMoab, create 459aa768e4cSTim Tautges @*/ 460a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface) 4611d72bce8STim Tautges { 462032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 463032b8ab6SVijay Mahadevan 4641d72bce8STim Tautges PetscFunctionBegin; 4651d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4661cec0304SVijay Mahadevan PetscValidPointer(mbiface,2); 467032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 468032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 469032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 4701d72bce8STim Tautges PetscFunctionReturn(0); 4711d72bce8STim Tautges } 4721d72bce8STim Tautges 4731d72bce8STim Tautges 4741d72bce8STim Tautges #undef __FUNCT__ 4751d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface" 476aa768e4cSTim Tautges /*@ 477aa768e4cSTim Tautges DMMoabGetInterface - Get the MOAB instance used with this DMMoab 478aa768e4cSTim Tautges 479aa768e4cSTim Tautges Collective on MPI_Comm 480aa768e4cSTim Tautges 481aa768e4cSTim Tautges Input Parameter: 482aa768e4cSTim Tautges . dm - The DMMoab object being set 483aa768e4cSTim Tautges 484aa768e4cSTim Tautges Output Parameter: 485aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab 486aa768e4cSTim Tautges 487aa768e4cSTim Tautges Level: beginner 488aa768e4cSTim Tautges 489aa768e4cSTim Tautges .keywords: DMMoab, create 490aa768e4cSTim Tautges @*/ 491a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface) 4921d72bce8STim Tautges { 4939426e041SSatish Balay PetscErrorCode ierr; 494cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 495cabb514dSBarry Smith 4961d72bce8STim Tautges PetscFunctionBegin; 4971d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 498cabb514dSBarry 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); 499a4d2169cSTim Tautges *mbiface = ((DM_Moab*)dm->data)->mbiface; 5001d72bce8STim Tautges PetscFunctionReturn(0); 5011d72bce8STim Tautges } 5021d72bce8STim Tautges 5031d72bce8STim Tautges 5041d72bce8STim Tautges #undef __FUNCT__ 5055eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices" 506aa768e4cSTim Tautges /*@ 5075eb88e9dSVijay Mahadevan DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab 508aa768e4cSTim Tautges 509aa768e4cSTim Tautges Collective on MPI_Comm 510aa768e4cSTim Tautges 511aa768e4cSTim Tautges Input Parameter: 512aa768e4cSTim Tautges . dm - The DMMoab object being set 513aa768e4cSTim Tautges . range - The entities treated by this DMMoab 514aa768e4cSTim Tautges 515aa768e4cSTim Tautges Level: beginner 516aa768e4cSTim Tautges 517aa768e4cSTim Tautges .keywords: DMMoab, create 518aa768e4cSTim Tautges @*/ 5195eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range) 5201d72bce8STim Tautges { 521032b8ab6SVijay Mahadevan moab::ErrorCode merr; 522032b8ab6SVijay Mahadevan PetscErrorCode ierr; 523032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 524032b8ab6SVijay Mahadevan 5251d72bce8STim Tautges PetscFunctionBegin; 5261d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 527032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 528032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 529032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 530032b8ab6SVijay Mahadevan *dmmoab->vowned = *dmmoab->vlocal; 531032b8ab6SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 532032b8ab6SVijay Mahadevan *dmmoab->vghost = moab::subtract(*range, *dmmoab->vowned); 533032b8ab6SVijay Mahadevan dmmoab->nloc=dmmoab->vowned->size(); 534032b8ab6SVijay Mahadevan dmmoab->nghost=dmmoab->vghost->size(); 535032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 5361d72bce8STim Tautges PetscFunctionReturn(0); 5371d72bce8STim Tautges } 5381d72bce8STim Tautges 5391d72bce8STim Tautges 5401d72bce8STim Tautges #undef __FUNCT__ 5418d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetAllVertices" 5428d8d51c8SVijay Mahadevan /*@ 5438d8d51c8SVijay Mahadevan DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab 5448d8d51c8SVijay Mahadevan 5458d8d51c8SVijay Mahadevan Collective on MPI_Comm 5468d8d51c8SVijay Mahadevan 5478d8d51c8SVijay Mahadevan Input Parameter: 5488d8d51c8SVijay Mahadevan . dm - The DMMoab object being set 5498d8d51c8SVijay Mahadevan 5508d8d51c8SVijay Mahadevan Output Parameter: 5518d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted) 5528d8d51c8SVijay Mahadevan 5538d8d51c8SVijay Mahadevan Level: beginner 5548d8d51c8SVijay Mahadevan 5558d8d51c8SVijay Mahadevan .keywords: DMMoab, create 5568d8d51c8SVijay Mahadevan @*/ 5578d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local) 5588d8d51c8SVijay Mahadevan { 5598d8d51c8SVijay Mahadevan PetscFunctionBegin; 5608d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5618d8d51c8SVijay Mahadevan if (local) *local = *((DM_Moab*)dm->data)->vlocal; 5628d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 5638d8d51c8SVijay Mahadevan } 5648d8d51c8SVijay Mahadevan 5658d8d51c8SVijay Mahadevan 5668d8d51c8SVijay Mahadevan 5678d8d51c8SVijay Mahadevan #undef __FUNCT__ 5685eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices" 569aa768e4cSTim Tautges /*@ 5705eb88e9dSVijay Mahadevan DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab 571aa768e4cSTim Tautges 572aa768e4cSTim Tautges Collective on MPI_Comm 573aa768e4cSTim Tautges 574aa768e4cSTim Tautges Input Parameter: 575aa768e4cSTim Tautges . dm - The DMMoab object being set 576aa768e4cSTim Tautges 577aa768e4cSTim Tautges Output Parameter: 5785eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab 5795eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition 580aa768e4cSTim Tautges 581aa768e4cSTim Tautges Level: beginner 582aa768e4cSTim Tautges 583aa768e4cSTim Tautges .keywords: DMMoab, create 584aa768e4cSTim Tautges @*/ 5851cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,moab::Range *owned,moab::Range *ghost) 5861d72bce8STim Tautges { 5871d72bce8STim Tautges PetscFunctionBegin; 5881d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5891cec0304SVijay Mahadevan if (owned) *owned = *((DM_Moab*)dm->data)->vowned; 5901cec0304SVijay Mahadevan if (ghost) *ghost = *((DM_Moab*)dm->data)->vghost; 5911d72bce8STim Tautges PetscFunctionReturn(0); 5921d72bce8STim Tautges } 5931d72bce8STim Tautges 5941d72bce8STim Tautges #undef __FUNCT__ 5955eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements" 5965eb88e9dSVijay Mahadevan /*@ 5975eb88e9dSVijay Mahadevan DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned 5985eb88e9dSVijay Mahadevan 5995eb88e9dSVijay Mahadevan Collective on MPI_Comm 6005eb88e9dSVijay Mahadevan 6015eb88e9dSVijay Mahadevan Input Parameter: 6025eb88e9dSVijay Mahadevan . dm - The DMMoab object being set 6035eb88e9dSVijay Mahadevan 6045eb88e9dSVijay Mahadevan Output Parameter: 6055eb88e9dSVijay Mahadevan . range - The entities owned locally 6065eb88e9dSVijay Mahadevan 6075eb88e9dSVijay Mahadevan Level: beginner 6085eb88e9dSVijay Mahadevan 6095eb88e9dSVijay Mahadevan .keywords: DMMoab, create 6105eb88e9dSVijay Mahadevan @*/ 6111cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,moab::Range *range) 6125eb88e9dSVijay Mahadevan { 6135eb88e9dSVijay Mahadevan PetscFunctionBegin; 6145eb88e9dSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6151cec0304SVijay Mahadevan if (range) *range = *((DM_Moab*)dm->data)->elocal; 6161cec0304SVijay Mahadevan PetscFunctionReturn(0); 6171cec0304SVijay Mahadevan } 6181cec0304SVijay Mahadevan 6191cec0304SVijay Mahadevan 6201cec0304SVijay Mahadevan #undef __FUNCT__ 6211cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements" 6221cec0304SVijay Mahadevan /*@ 6231cec0304SVijay Mahadevan DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab 6241cec0304SVijay Mahadevan 6251cec0304SVijay Mahadevan Collective on MPI_Comm 6261cec0304SVijay Mahadevan 6271cec0304SVijay Mahadevan Input Parameter: 6281cec0304SVijay Mahadevan . dm - The DMMoab object being set 6291cec0304SVijay Mahadevan . range - The entities treated by this DMMoab 6301cec0304SVijay Mahadevan 6311cec0304SVijay Mahadevan Level: beginner 6321cec0304SVijay Mahadevan 6331cec0304SVijay Mahadevan .keywords: DMMoab, create 6341cec0304SVijay Mahadevan @*/ 6351cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range) 6361cec0304SVijay Mahadevan { 6371cec0304SVijay Mahadevan moab::ErrorCode merr; 6381cec0304SVijay Mahadevan PetscErrorCode ierr; 6391cec0304SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 6401cec0304SVijay Mahadevan 6411cec0304SVijay Mahadevan PetscFunctionBegin; 6421cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6431cec0304SVijay Mahadevan dmmoab->elocal->clear(); 6441cec0304SVijay Mahadevan dmmoab->eghost->clear(); 6451cec0304SVijay Mahadevan dmmoab->elocal->insert(range->begin(), range->end()); 6461cec0304SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 6471cec0304SVijay Mahadevan *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal); 6481cec0304SVijay Mahadevan dmmoab->neleloc=dmmoab->elocal->size(); 6491cec0304SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 650*8cbae1a6SVijay Mahadevan PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele); 6515eb88e9dSVijay Mahadevan PetscFunctionReturn(0); 6525eb88e9dSVijay Mahadevan } 6535eb88e9dSVijay Mahadevan 6545eb88e9dSVijay Mahadevan 6555eb88e9dSVijay Mahadevan #undef __FUNCT__ 6561d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag" 657aa768e4cSTim Tautges /*@ 658aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 659aa768e4cSTim Tautges 660aa768e4cSTim Tautges Collective on MPI_Comm 661aa768e4cSTim Tautges 662aa768e4cSTim Tautges Input Parameter: 663aa768e4cSTim Tautges . dm - The DMMoab object being set 664aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 665aa768e4cSTim Tautges 666aa768e4cSTim Tautges Level: beginner 667aa768e4cSTim Tautges 668aa768e4cSTim Tautges .keywords: DMMoab, create 669aa768e4cSTim Tautges @*/ 6701d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag) 6711d72bce8STim Tautges { 6721d72bce8STim Tautges PetscFunctionBegin; 6731d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6741d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 6751d72bce8STim Tautges PetscFunctionReturn(0); 6761d72bce8STim Tautges } 6771d72bce8STim Tautges 6781d72bce8STim Tautges 6791d72bce8STim Tautges #undef __FUNCT__ 6801d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag" 681aa768e4cSTim Tautges /*@ 682aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 683aa768e4cSTim Tautges 684aa768e4cSTim Tautges Collective on MPI_Comm 685aa768e4cSTim Tautges 686aa768e4cSTim Tautges Input Parameter: 687aa768e4cSTim Tautges . dm - The DMMoab object being set 688aa768e4cSTim Tautges 689aa768e4cSTim Tautges Output Parameter: 690aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 691aa768e4cSTim Tautges 692aa768e4cSTim Tautges Level: beginner 693aa768e4cSTim Tautges 694aa768e4cSTim Tautges .keywords: DMMoab, create 695aa768e4cSTim Tautges @*/ 6961d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag) 6971d72bce8STim Tautges { 6981d72bce8STim Tautges PetscFunctionBegin; 6991d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7001d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 7011d72bce8STim Tautges PetscFunctionReturn(0); 7021d72bce8STim Tautges } 7031d72bce8STim Tautges 7041d72bce8STim Tautges 7051d72bce8STim Tautges #undef __FUNCT__ 7061d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize" 707aa768e4cSTim Tautges /*@ 708aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 709aa768e4cSTim Tautges 710aa768e4cSTim Tautges Collective on MPI_Comm 711aa768e4cSTim Tautges 712aa768e4cSTim Tautges Input Parameter: 713aa768e4cSTim Tautges . dm - The DMMoab object being set 714aa768e4cSTim Tautges . bs - The block size used with this DMMoab 715aa768e4cSTim Tautges 716aa768e4cSTim Tautges Level: beginner 717aa768e4cSTim Tautges 718aa768e4cSTim Tautges .keywords: DMMoab, create 719aa768e4cSTim Tautges @*/ 7201d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs) 7211d72bce8STim Tautges { 7221d72bce8STim Tautges PetscFunctionBegin; 7231d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7241d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 7251d72bce8STim Tautges PetscFunctionReturn(0); 7261d72bce8STim Tautges } 7271d72bce8STim Tautges 7281d72bce8STim Tautges 7291d72bce8STim Tautges #undef __FUNCT__ 7301d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize" 731aa768e4cSTim Tautges /*@ 732aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 733aa768e4cSTim Tautges 734aa768e4cSTim Tautges Collective on MPI_Comm 735aa768e4cSTim Tautges 736aa768e4cSTim Tautges Input Parameter: 737aa768e4cSTim Tautges . dm - The DMMoab object being set 738aa768e4cSTim Tautges 739aa768e4cSTim Tautges Output Parameter: 740aa768e4cSTim Tautges . bs - The block size used with this DMMoab 741aa768e4cSTim Tautges 742aa768e4cSTim Tautges Level: beginner 743aa768e4cSTim Tautges 744aa768e4cSTim Tautges .keywords: DMMoab, create 745aa768e4cSTim Tautges @*/ 7461d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs) 7471d72bce8STim Tautges { 7481d72bce8STim Tautges PetscFunctionBegin; 7491d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7501d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 7511d72bce8STim Tautges PetscFunctionReturn(0); 7521d72bce8STim Tautges } 7531d72bce8STim Tautges 7541cec0304SVijay Mahadevan 7551cec0304SVijay Mahadevan #undef __FUNCT__ 756212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetSize" 757212ad6d1SVijay Mahadevan /*@ 758212ad6d1SVijay Mahadevan DMMoabGetSize - Get the global vertex size used with this DMMoab 759212ad6d1SVijay Mahadevan 760212ad6d1SVijay Mahadevan Collective on MPI_Comm 761212ad6d1SVijay Mahadevan 762212ad6d1SVijay Mahadevan Input Parameter: 763212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 764212ad6d1SVijay Mahadevan 765212ad6d1SVijay Mahadevan Output Parameter: 766212ad6d1SVijay Mahadevan . ng - The global size of the DMMoab instance 767212ad6d1SVijay Mahadevan 768212ad6d1SVijay Mahadevan Level: beginner 769212ad6d1SVijay Mahadevan 770212ad6d1SVijay Mahadevan .keywords: DMMoab, create 771212ad6d1SVijay Mahadevan @*/ 772212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *ng) 773212ad6d1SVijay Mahadevan { 774212ad6d1SVijay Mahadevan PetscFunctionBegin; 775212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 776212ad6d1SVijay Mahadevan if(ng) *ng = ((DM_Moab*)dm->data)->n; 777212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 778212ad6d1SVijay Mahadevan } 779212ad6d1SVijay Mahadevan 780212ad6d1SVijay Mahadevan 781212ad6d1SVijay Mahadevan #undef __FUNCT__ 782212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalSize" 783212ad6d1SVijay Mahadevan /*@ 784212ad6d1SVijay Mahadevan DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab 785212ad6d1SVijay Mahadevan 786212ad6d1SVijay Mahadevan Collective on MPI_Comm 787212ad6d1SVijay Mahadevan 788212ad6d1SVijay Mahadevan Input Parameter: 789212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 790212ad6d1SVijay Mahadevan 791212ad6d1SVijay Mahadevan Output Parameter: 792212ad6d1SVijay Mahadevan . nl - The local size of the DMMoab instance 793212ad6d1SVijay Mahadevan . ng - The ghosted size of the DMMoab instance 794212ad6d1SVijay Mahadevan 795212ad6d1SVijay Mahadevan Level: beginner 796212ad6d1SVijay Mahadevan 797212ad6d1SVijay Mahadevan .keywords: DMMoab, create 798212ad6d1SVijay Mahadevan @*/ 799212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nl,PetscInt *ng) 800212ad6d1SVijay Mahadevan { 801212ad6d1SVijay Mahadevan PetscFunctionBegin; 802212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 803212ad6d1SVijay Mahadevan if(nl) *nl = ((DM_Moab*)dm->data)->nloc; 804212ad6d1SVijay Mahadevan if(ng) *ng = ((DM_Moab*)dm->data)->nghost; 805212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 806212ad6d1SVijay Mahadevan } 807212ad6d1SVijay Mahadevan 808212ad6d1SVijay Mahadevan 809212ad6d1SVijay Mahadevan #undef __FUNCT__ 8104920ab11SVijay Mahadevan #define __FUNCT__ "DMMoabGetDimension" 8114920ab11SVijay Mahadevan /*@ 8124920ab11SVijay Mahadevan DMMoabGetDimension - Get the dimension of the DM Mesh 8134920ab11SVijay Mahadevan 8144920ab11SVijay Mahadevan Collective on MPI_Comm 8154920ab11SVijay Mahadevan 8164920ab11SVijay Mahadevan Input Parameter: 8174920ab11SVijay Mahadevan . dm - The DMMoab object being set 8184920ab11SVijay Mahadevan 8194920ab11SVijay Mahadevan Output Parameter: 8204920ab11SVijay Mahadevan . dim - The dimension of DM 8214920ab11SVijay Mahadevan 8224920ab11SVijay Mahadevan Level: beginner 8234920ab11SVijay Mahadevan 8244920ab11SVijay Mahadevan .keywords: DMMoab, create 8254920ab11SVijay Mahadevan @*/ 8264920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim) 8274920ab11SVijay Mahadevan { 8284920ab11SVijay Mahadevan PetscFunctionBegin; 8294920ab11SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8304920ab11SVijay Mahadevan *dim = ((DM_Moab*)dm->data)->dim; 8314920ab11SVijay Mahadevan PetscFunctionReturn(0); 8324920ab11SVijay Mahadevan } 8334920ab11SVijay Mahadevan 8344920ab11SVijay Mahadevan 8354920ab11SVijay Mahadevan 8364920ab11SVijay Mahadevan #undef __FUNCT__ 8377023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates" 8387023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos) 8397023aa44SVijay Mahadevan { 8407023aa44SVijay Mahadevan DM_Moab *dmmoab; 8417023aa44SVijay Mahadevan PetscErrorCode ierr; 8427023aa44SVijay Mahadevan moab::ErrorCode merr; 8437023aa44SVijay Mahadevan 8447023aa44SVijay Mahadevan PetscFunctionBegin; 8457023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8467023aa44SVijay Mahadevan PetscValidPointer(conn,3); 8477023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8487023aa44SVijay Mahadevan 8497023aa44SVijay Mahadevan if (!vpos) { 8507023aa44SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr); 8517023aa44SVijay Mahadevan } 8527023aa44SVijay Mahadevan 8537023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 8547023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr); 8557023aa44SVijay Mahadevan PetscFunctionReturn(0); 8567023aa44SVijay Mahadevan } 8577023aa44SVijay Mahadevan 8587023aa44SVijay Mahadevan 8597023aa44SVijay Mahadevan #undef __FUNCT__ 8608d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexConnectivity" 8618d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn) 8628d8d51c8SVijay Mahadevan { 8638d8d51c8SVijay Mahadevan DM_Moab *dmmoab; 8648d8d51c8SVijay Mahadevan std::vector<moab::EntityHandle> adj_entities,connect; 8658d8d51c8SVijay Mahadevan PetscErrorCode ierr; 8668d8d51c8SVijay Mahadevan moab::ErrorCode merr; 8678d8d51c8SVijay Mahadevan 8688d8d51c8SVijay Mahadevan PetscFunctionBegin; 8698d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8708d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 8718d8d51c8SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8728d8d51c8SVijay Mahadevan 8738d8d51c8SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 8748d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(&ehandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr); 8758d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr); 8768d8d51c8SVijay Mahadevan 8778d8d51c8SVijay Mahadevan if (conn) { 8788d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr); 8798d8d51c8SVijay Mahadevan ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr); 8808d8d51c8SVijay Mahadevan } 8818d8d51c8SVijay Mahadevan if (nconn) *nconn=connect.size(); 8828d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 8838d8d51c8SVijay Mahadevan } 8848d8d51c8SVijay Mahadevan 8858d8d51c8SVijay Mahadevan 8868d8d51c8SVijay Mahadevan #undef __FUNCT__ 8878d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabRestoreVertexConnectivity" 8888d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn) 8898d8d51c8SVijay Mahadevan { 8908d8d51c8SVijay Mahadevan PetscErrorCode ierr; 8918d8d51c8SVijay Mahadevan 8928d8d51c8SVijay Mahadevan PetscFunctionBegin; 8938d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8948d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 8958d8d51c8SVijay Mahadevan 8968d8d51c8SVijay Mahadevan if (conn) { 8978d8d51c8SVijay Mahadevan ierr = PetscFree(*conn);CHKERRQ(ierr); 8988d8d51c8SVijay Mahadevan } 8998d8d51c8SVijay Mahadevan if (nconn) *nconn=0; 9008d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 9018d8d51c8SVijay Mahadevan } 9028d8d51c8SVijay Mahadevan 9038d8d51c8SVijay Mahadevan 9048d8d51c8SVijay Mahadevan 9058d8d51c8SVijay Mahadevan #undef __FUNCT__ 9067023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity" 9077023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn) 9087023aa44SVijay Mahadevan { 9097023aa44SVijay Mahadevan DM_Moab *dmmoab; 9107023aa44SVijay Mahadevan const moab::EntityHandle *connect; 9117023aa44SVijay Mahadevan moab::ErrorCode merr; 9127023aa44SVijay Mahadevan PetscInt nnodes; 9137023aa44SVijay Mahadevan 9147023aa44SVijay Mahadevan PetscFunctionBegin; 9157023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 9167023aa44SVijay Mahadevan PetscValidPointer(conn,4); 9177023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 9187023aa44SVijay Mahadevan 9197023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 9207023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr); 9217023aa44SVijay Mahadevan if (conn) *conn=connect; 9227023aa44SVijay Mahadevan if (nconn) *nconn=nnodes; 9237023aa44SVijay Mahadevan PetscFunctionReturn(0); 9247023aa44SVijay Mahadevan } 9257023aa44SVijay Mahadevan 9267023aa44SVijay Mahadevan 9277023aa44SVijay Mahadevan #undef __FUNCT__ 92869263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary" 92969263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary) 93069263071SVijay Mahadevan { 93169263071SVijay Mahadevan moab::EntityType etype; 93269263071SVijay Mahadevan DM_Moab *dmmoab; 93369263071SVijay Mahadevan PetscInt edim; 93469263071SVijay Mahadevan 93569263071SVijay Mahadevan PetscFunctionBegin; 93669263071SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 93769263071SVijay Mahadevan PetscValidPointer(ent_on_boundary,3); 93869263071SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 93969263071SVijay Mahadevan 94069263071SVijay Mahadevan /* get the entity type and handle accordingly */ 94169263071SVijay Mahadevan etype=dmmoab->mbiface->type_from_handle(ent); 94269263071SVijay 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); 94369263071SVijay Mahadevan 94469263071SVijay Mahadevan /* get the entity dimension */ 94569263071SVijay Mahadevan edim=dmmoab->mbiface->dimension_from_handle(ent); 94669263071SVijay Mahadevan 94769263071SVijay Mahadevan *ent_on_boundary=PETSC_FALSE; 94869263071SVijay Mahadevan if(etype == moab::MBVERTEX && edim == 0) { 9498d8d51c8SVijay Mahadevan if (ent < (*dmmoab->vlocal)[0] || ent > (*dmmoab->vlocal)[dmmoab->nloc-1]) SETERRQ1(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Invalid boundary vertex entity handle: %D\n",ent); 9500c8a2322SVijay Mahadevan *ent_on_boundary=dmmoab->isbndyvtx[(PetscInt)ent]; 95169263071SVijay Mahadevan } 95269263071SVijay Mahadevan else { 95369263071SVijay Mahadevan if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */ 9548d8d51c8SVijay Mahadevan if (ent < (*dmmoab->elocal)[0] || ent > (*dmmoab->elocal)[dmmoab->neleloc-1]) SETERRQ1(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Invalid boundary element entity handle: %D\n",ent); 9550c8a2322SVijay Mahadevan *ent_on_boundary=dmmoab->isbndyelems[(PetscInt)ent]; 95669263071SVijay Mahadevan } 95769263071SVijay Mahadevan else { /* next check the lower-dimensional faces */ 9580c8a2322SVijay Mahadevan /* how do we check the bounds before accessing ? will segfault for non-boundary faces */ 9590c8a2322SVijay Mahadevan *ent_on_boundary=dmmoab->isbndyfaces[(PetscInt)ent]; 96069263071SVijay Mahadevan } 96169263071SVijay Mahadevan } 96269263071SVijay Mahadevan PetscFunctionReturn(0); 96369263071SVijay Mahadevan } 96469263071SVijay Mahadevan 96569263071SVijay Mahadevan 96669263071SVijay Mahadevan #undef __FUNCT__ 9677023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices" 96869263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx) 9697023aa44SVijay Mahadevan { 9707023aa44SVijay Mahadevan DM_Moab *dmmoab; 9717023aa44SVijay Mahadevan PetscInt i; 9727023aa44SVijay Mahadevan 9737023aa44SVijay Mahadevan PetscFunctionBegin; 9747023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 9757023aa44SVijay Mahadevan PetscValidPointer(cnt,3); 9767023aa44SVijay Mahadevan PetscValidPointer(isbdvtx,4); 9777023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 9787023aa44SVijay Mahadevan 9797023aa44SVijay Mahadevan for (i=0; i < nconn; ++i) { 9800c8a2322SVijay Mahadevan isbdvtx[i]=dmmoab->isbndyvtx[(PetscInt)cnt[i]]; 9817023aa44SVijay Mahadevan } 9827023aa44SVijay Mahadevan PetscFunctionReturn(0); 9837023aa44SVijay Mahadevan } 9847023aa44SVijay Mahadevan 9857023aa44SVijay Mahadevan 9867023aa44SVijay Mahadevan #undef __FUNCT__ 9870c8a2322SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryMarkers" 9880c8a2322SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,PetscBool **bdvtx,PetscBool** bdelems,PetscBool** bdfaces) 9891cec0304SVijay Mahadevan { 9901cec0304SVijay Mahadevan DM_Moab *dmmoab; 9911cec0304SVijay Mahadevan 9921cec0304SVijay Mahadevan PetscFunctionBegin; 9931cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 9941cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 9951cec0304SVijay Mahadevan 9960c8a2322SVijay Mahadevan if (bdvtx) *bdvtx = dmmoab->isbndyvtx; 9970c8a2322SVijay Mahadevan if (bdfaces) *bdfaces = dmmoab->isbndyfaces; 9980c8a2322SVijay Mahadevan if (bdelems) *bdfaces = dmmoab->isbndyelems; 9991cec0304SVijay Mahadevan PetscFunctionReturn(0); 10001cec0304SVijay Mahadevan } 10011cec0304SVijay Mahadevan 1002