1032b8ab6SVijay Mahadevan #include <petsc-private/dmmbimpl.h> /*I "petscdm.h" I*/ 2aa768e4cSTim Tautges #include <petsc-private/vecimpl.h> /*I "petscdm.h" I*/ 31d72bce8STim Tautges 41d72bce8STim Tautges #include <petscdmmoab.h> 588face26SJed Brown #include <MBTagConventions.hpp> 61cec0304SVijay Mahadevan #include <moab/Skinner.hpp> 7032b8ab6SVijay Mahadevan 8853cdec3SJed Brown #undef __FUNCT__ 9853cdec3SJed Brown #define __FUNCT__ "DMDestroy_Moab" 10853cdec3SJed Brown PetscErrorCode DMDestroy_Moab(DM dm) 11853cdec3SJed Brown { 12853cdec3SJed Brown PetscErrorCode ierr; 13032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 14*212ad6d1SVijay Mahadevan PetscSection section; 15853cdec3SJed Brown 16853cdec3SJed Brown PetscFunctionBegin; 17853cdec3SJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 18*212ad6d1SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 19*212ad6d1SVijay Mahadevan ierr = PetscSectionDestroy(§ion);CHKERRQ(ierr); 20032b8ab6SVijay Mahadevan if (dmmoab->icreatedinstance) { 21032b8ab6SVijay Mahadevan delete dmmoab->mbiface; 22853cdec3SJed Brown } 23032b8ab6SVijay Mahadevan dmmoab->mbiface = NULL; 24032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 25032b8ab6SVijay Mahadevan delete dmmoab->vlocal; 26032b8ab6SVijay Mahadevan delete dmmoab->vowned; 27032b8ab6SVijay Mahadevan delete dmmoab->vghost; 28032b8ab6SVijay Mahadevan delete dmmoab->elocal; 29032b8ab6SVijay Mahadevan delete dmmoab->eghost; 301cec0304SVijay Mahadevan delete dmmoab->bndyvtx; 311cec0304SVijay Mahadevan delete dmmoab->bndyfaces; 3269263071SVijay Mahadevan delete dmmoab->bndyelems; 33fc418013SVijay Mahadevan 34fc418013SVijay Mahadevan ierr = PetscFree(dmmoab->gsindices);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; 48032b8ab6SVijay Mahadevan IS from; 49032b8ab6SVijay Mahadevan moab::Range::iterator iter; 50fc418013SVijay Mahadevan PetscInt i,j,bs,gsiz,lsiz; 51032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 52eb9d2429SVijay Mahadevan PetscInt totsize; 531cec0304SVijay Mahadevan PetscSection section; 54eb9d2429SVijay Mahadevan PetscInt gmin,lmin,lmax; 55032b8ab6SVijay Mahadevan 5669263071SVijay Mahadevan moab::Range adj; 5769263071SVijay Mahadevan 58032b8ab6SVijay Mahadevan PetscFunctionBegin; 59032b8ab6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 60032b8ab6SVijay Mahadevan /* Get the local and shared vertices and cache it */ 61032b8ab6SVijay 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."); 62032b8ab6SVijay Mahadevan 631cec0304SVijay Mahadevan /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */ 64032b8ab6SVijay Mahadevan if (dmmoab->vlocal->empty()) { 651cec0304SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr); 66032b8ab6SVijay Mahadevan 67032b8ab6SVijay Mahadevan /* filter based on parallel status */ 68fc418013SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 69032b8ab6SVijay Mahadevan *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 70032b8ab6SVijay Mahadevan 71032b8ab6SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 72032b8ab6SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 73032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 74fc418013SVijay Mahadevan 75e23c60ebSVijay Mahadevan #if 0 76fc418013SVijay Mahadevan if(dmmoab->pcomm->rank() || dmmoab->pcomm->size()==1) { 77fc418013SVijay Mahadevan PetscPrintf(PETSC_COMM_SELF, "Vertices: global: %D, local: %D", dmmoab->n, dmmoab->nloc+dmmoab->nghost); 78fc418013SVijay Mahadevan dmmoab->vlocal->print(0); 79fc418013SVijay Mahadevan PetscPrintf(PETSC_COMM_SELF, "Vertices: owned: %D", dmmoab->nloc); 80fc418013SVijay Mahadevan dmmoab->vowned->print(0); 81fc418013SVijay Mahadevan PetscPrintf(PETSC_COMM_SELF, "Vertices: ghost: %D", dmmoab->nghost); 82fc418013SVijay Mahadevan dmmoab->vghost->print(0); 83fc418013SVijay Mahadevan } 84fc418013SVijay Mahadevan #endif 85032b8ab6SVijay Mahadevan } 86032b8ab6SVijay Mahadevan 87032b8ab6SVijay Mahadevan /* get the information about the local elements in the mesh */ 88032b8ab6SVijay Mahadevan { 89032b8ab6SVijay Mahadevan dmmoab->eghost->clear(); 90fc418013SVijay Mahadevan 91fc418013SVijay Mahadevan /* first decipher the leading dimension */ 92fc418013SVijay Mahadevan for (i=3;i>0;i--) { 93fc418013SVijay Mahadevan dmmoab->elocal->clear(); 94fc418013SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr); 95fc418013SVijay Mahadevan 96fc418013SVijay Mahadevan /* store the current mesh dimension */ 97fc418013SVijay Mahadevan if (dmmoab->elocal->size()) { 98fc418013SVijay Mahadevan dmmoab->dim=i; 99fc418013SVijay Mahadevan break; 100fc418013SVijay Mahadevan } 101fc418013SVijay Mahadevan } 102fc418013SVijay Mahadevan 103032b8ab6SVijay Mahadevan *dmmoab->eghost = *dmmoab->elocal; 104032b8ab6SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 105032b8ab6SVijay Mahadevan *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal); 106032b8ab6SVijay Mahadevan 107032b8ab6SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 108032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 109032b8ab6SVijay Mahadevan } 110032b8ab6SVijay Mahadevan 111032b8ab6SVijay Mahadevan bs = dmmoab->bs; 112032b8ab6SVijay Mahadevan if (!dmmoab->ltog_tag) { 113db66d124SVijay Mahadevan /* Get the global ID tag. The global ID tag is applied to each 114db66d124SVijay Mahadevan vertex. It acts as an global identifier which MOAB uses to 115db66d124SVijay Mahadevan assemble the individual pieces of the mesh */ 116032b8ab6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 117032b8ab6SVijay Mahadevan } 118032b8ab6SVijay Mahadevan 119032b8ab6SVijay Mahadevan totsize=dmmoab->vlocal->size(); 120fc418013SVijay Mahadevan ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->gsindices);CHKERRQ(ierr); 1211cec0304SVijay Mahadevan { 122032b8ab6SVijay Mahadevan /* first get the local indices */ 123fc418013SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr); 1244a40b570SVijay Mahadevan /* next get the ghosted indices */ 125fc418013SVijay Mahadevan if (dmmoab->nghost) { 126fc418013SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr); 1271cec0304SVijay Mahadevan } 1286e40195eSVijay Mahadevan 1296e40195eSVijay Mahadevan /* find out the local and global minima of GLOBAL_ID */ 130eb9d2429SVijay Mahadevan lmin=lmax=dmmoab->gsindices[0]; 13169263071SVijay Mahadevan for (i=0; i<totsize; ++i) { 132eb9d2429SVijay Mahadevan if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i]; 133eb9d2429SVijay Mahadevan if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i]; 134fc418013SVijay Mahadevan } 1356e40195eSVijay Mahadevan 136eb9d2429SVijay Mahadevan ierr = MPI_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr); 137eb9d2429SVijay Mahadevan PetscInfo3(dm, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin); 1381cec0304SVijay Mahadevan } 139032b8ab6SVijay Mahadevan 1401cec0304SVijay Mahadevan { 1411cec0304SVijay Mahadevan ierr = PetscSectionCreate(((PetscObject)dm)->comm, §ion);CHKERRQ(ierr); 1421cec0304SVijay Mahadevan ierr = PetscSectionSetNumFields(section, dmmoab->nfields);CHKERRQ(ierr); 143eb9d2429SVijay Mahadevan ierr = PetscSectionSetChart(section, lmin, lmax+1);CHKERRQ(ierr); 144fc418013SVijay Mahadevan for (j=0; j<totsize; ++j) { 145fc418013SVijay Mahadevan PetscInt locgid = dmmoab->gsindices[j]; 1461cec0304SVijay Mahadevan for (i=0; i < dmmoab->nfields; ++i) { 1471cec0304SVijay Mahadevan ierr = PetscSectionSetFieldName(section, i, dmmoab->fields[i]);CHKERRQ(ierr); 1481cec0304SVijay Mahadevan if (bs>1) { 149eb9d2429SVijay Mahadevan ierr = PetscSectionSetFieldDof(section, locgid, i, (locgid-gmin)*dmmoab->nfields+i);CHKERRQ(ierr); 150eb9d2429SVijay Mahadevan ierr = PetscSectionSetFieldOffset(section, locgid, i, (locgid-gmin)*dmmoab->nfields); 1511cec0304SVijay Mahadevan } 1521cec0304SVijay Mahadevan else { 153eb9d2429SVijay Mahadevan ierr = PetscSectionSetFieldDof(section, locgid, i, dmmoab->n*i+locgid-gmin);CHKERRQ(ierr); 15469263071SVijay Mahadevan ierr = PetscSectionSetFieldOffset(section, locgid, i, i*dmmoab->n); 1551cec0304SVijay Mahadevan } 1561cec0304SVijay Mahadevan } 157fc418013SVijay Mahadevan ierr = PetscSectionSetDof(section, locgid, dmmoab->nfields);CHKERRQ(ierr); 1581cec0304SVijay Mahadevan } 1591cec0304SVijay Mahadevan ierr = PetscSectionSetUp(section);CHKERRQ(ierr); 1601cec0304SVijay Mahadevan ierr = DMSetDefaultSection(dm, section);CHKERRQ(ierr); 1611cec0304SVijay Mahadevan } 1621cec0304SVijay Mahadevan 1631cec0304SVijay Mahadevan { 164fc418013SVijay Mahadevan for (i=0; i<totsize; ++i) { 165eb9d2429SVijay Mahadevan dmmoab->gsindices[i]-=gmin; /* zero based index needed for IS */ 166fc418013SVijay Mahadevan } 167fc418013SVijay Mahadevan 168032b8ab6SVijay Mahadevan /* Create Global to Local Vector Scatter Context */ 169032b8ab6SVijay Mahadevan ierr = DMCreateGlobalVector_Moab(dm, &global);CHKERRQ(ierr); 170032b8ab6SVijay Mahadevan ierr = DMCreateLocalVector_Moab(dm, &local);CHKERRQ(ierr); 171032b8ab6SVijay Mahadevan 172032b8ab6SVijay Mahadevan /* global to local must retrieve ghost points */ 173fc418013SVijay Mahadevan ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&dmmoab->gsindices[0],PETSC_COPY_VALUES,&from);CHKERRQ(ierr); 174032b8ab6SVijay Mahadevan 175db66d124SVijay Mahadevan ierr = VecGetLocalSize(global,&gsiz);CHKERRQ(ierr); 176db66d124SVijay Mahadevan ierr = VecGetLocalSize(local,&lsiz);CHKERRQ(ierr); 177032b8ab6SVijay Mahadevan 178032b8ab6SVijay Mahadevan ierr = VecScatterCreate(local,from,global,from,&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 179032b8ab6SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 180032b8ab6SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 181032b8ab6SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 182032b8ab6SVijay Mahadevan } 183032b8ab6SVijay Mahadevan 1841cec0304SVijay Mahadevan /* skin the boundary and store nodes */ 1851cec0304SVijay Mahadevan { 186eb9d2429SVijay Mahadevan /* get the skin vertices of boundary faces for the current partition and then filter 187eb9d2429SVijay Mahadevan the local, boundary faces, vertices and elements alone via PSTATUS flags; 188eb9d2429SVijay Mahadevan this should not give us any ghosted boundary, but if user needs such a functionality 189eb9d2429SVijay Mahadevan it would be easy to add it based on the find_skin query below */ 1901cec0304SVijay Mahadevan moab::Skinner skinner(dmmoab->mbiface); 1911cec0304SVijay Mahadevan dmmoab->bndyvtx = new moab::Range(); 1921cec0304SVijay Mahadevan dmmoab->bndyfaces = new moab::Range(); 19369263071SVijay Mahadevan dmmoab->bndyelems = new moab::Range(); 194eb9d2429SVijay Mahadevan 195eb9d2429SVijay Mahadevan /* get the entities on the skin - only the faces */ 19669263071SVijay Mahadevan merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, *dmmoab->bndyfaces, NULL, false, true, false, false);MBERRNM(merr); // 'false' param indicates we want faces back, not vertices 197eb9d2429SVijay Mahadevan 198eb9d2429SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 199eb9d2429SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 200eb9d2429SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr); 20169263071SVijay Mahadevan 20269263071SVijay Mahadevan if (dmmoab->dim == 3) { 20369263071SVijay Mahadevan // get the edges from faces and then do the same if needed 20469263071SVijay Mahadevan } 20569263071SVijay Mahadevan 206eb9d2429SVijay Mahadevan /* get all the nodes via connectivity and the parent elements via adjacency information */ 20769263071SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr); 20869263071SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr); 20969263071SVijay Mahadevan PetscInfo3(dm, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size()); 2101cec0304SVijay Mahadevan } 211032b8ab6SVijay Mahadevan PetscFunctionReturn(0); 212032b8ab6SVijay Mahadevan } 213032b8ab6SVijay Mahadevan 2141cec0304SVijay Mahadevan 215032b8ab6SVijay Mahadevan #undef __FUNCT__ 216aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab" 217853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 218aa768e4cSTim Tautges { 219aa768e4cSTim Tautges PetscErrorCode ierr; 220aa768e4cSTim Tautges 221aa768e4cSTim Tautges PetscFunctionBegin; 222aa768e4cSTim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 223032b8ab6SVijay Mahadevan ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr); 224032b8ab6SVijay Mahadevan 225032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 226032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 227032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 228032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 229032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 230032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 231032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL; 232032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL; 233032b8ab6SVijay Mahadevan 234032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 235032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 236032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 237032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 238032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 239aa768e4cSTim Tautges 24097ea90e6SJed Brown dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 24197ea90e6SJed Brown dm->ops->createlocalvector = DMCreateLocalVector_Moab; 242032b8ab6SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 243032b8ab6SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 24497ea90e6SJed Brown dm->ops->destroy = DMDestroy_Moab; 245032b8ab6SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 246032b8ab6SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 247032b8ab6SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 248032b8ab6SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 249aa768e4cSTim Tautges PetscFunctionReturn(0); 250aa768e4cSTim Tautges } 251fd349b41STim Tautges 252fd349b41STim Tautges #undef __FUNCT__ 2531d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate" 2541d72bce8STim Tautges /*@ 2551d72bce8STim Tautges DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance 2561d72bce8STim Tautges 2571d72bce8STim Tautges Collective on MPI_Comm 2581d72bce8STim Tautges 2591d72bce8STim Tautges Input Parameter: 2601d72bce8STim Tautges . comm - The communicator for the DMMoab object 2611d72bce8STim Tautges 2621d72bce8STim Tautges Output Parameter: 263032b8ab6SVijay Mahadevan . dmb - The DMMoab object 2641d72bce8STim Tautges 2651d72bce8STim Tautges Level: beginner 2661d72bce8STim Tautges 2671d72bce8STim Tautges .keywords: DMMoab, create 2681d72bce8STim Tautges @*/ 269032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb) 2701d72bce8STim Tautges { 2711d72bce8STim Tautges PetscErrorCode ierr; 2721d72bce8STim Tautges 2731d72bce8STim Tautges PetscFunctionBegin; 274032b8ab6SVijay Mahadevan PetscValidPointer(dmb,2); 275032b8ab6SVijay Mahadevan ierr = DMCreate(comm, dmb);CHKERRQ(ierr); 276032b8ab6SVijay Mahadevan ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr); 2771d72bce8STim Tautges PetscFunctionReturn(0); 2781d72bce8STim Tautges } 2791d72bce8STim Tautges 2801d72bce8STim Tautges #undef __FUNCT__ 281aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab" 2821d72bce8STim Tautges /*@ 283a4d2169cSTim Tautges DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data 2841d72bce8STim Tautges 2851d72bce8STim Tautges Collective on MPI_Comm 2861d72bce8STim Tautges 2871d72bce8STim Tautges Input Parameter: 2881d72bce8STim Tautges . comm - The communicator for the DMMoab object 289032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed 290a4d2169cSTim Tautges along with the DMMoab 291a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator 2921d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag 2931d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned 2941d72bce8STim Tautges 2951d72bce8STim Tautges Output Parameter: 296032b8ab6SVijay Mahadevan . dmb - The DMMoab object 2971d72bce8STim Tautges 298032b8ab6SVijay Mahadevan Level: intermediate 2991d72bce8STim Tautges 3001d72bce8STim Tautges .keywords: DMMoab, create 3011d72bce8STim Tautges @*/ 302032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb) 3031d72bce8STim Tautges { 3041d72bce8STim Tautges PetscErrorCode ierr; 305032b8ab6SVijay Mahadevan moab::ErrorCode merr; 3061cec0304SVijay Mahadevan moab::EntityHandle partnset; 3071cec0304SVijay Mahadevan PetscInt rank, nprocs; 308853cdec3SJed Brown DM_Moab *dmmoab; 3091d72bce8STim Tautges 3101d72bce8STim Tautges PetscFunctionBegin; 311032b8ab6SVijay Mahadevan PetscValidPointer(dmb,6); 312032b8ab6SVijay Mahadevan ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr); 313032b8ab6SVijay Mahadevan dmmoab = (DM_Moab*)(*dmb)->data; 314a4d2169cSTim Tautges 315a4d2169cSTim Tautges if (!mbiface) { 31672ff976dSVijay Mahadevan dmmoab->mbiface = new moab::Core(); 3177d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_TRUE; 3181d72bce8STim Tautges } 3191cec0304SVijay Mahadevan else { 3201cec0304SVijay Mahadevan dmmoab->mbiface = mbiface; 3217d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_FALSE; 3221cec0304SVijay Mahadevan } 3231cec0304SVijay Mahadevan 3241cec0304SVijay Mahadevan /* create a fileset to store the hierarchy of entities belonging to current DM */ 3251cec0304SVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_ORDERED, dmmoab->fileset);MBERR("Creating file set failed", merr); 3267d89fc02STim Tautges 327a4d2169cSTim Tautges if (!pcomm) { 328032b8ab6SVijay Mahadevan ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 329032b8ab6SVijay Mahadevan ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr); 330032b8ab6SVijay Mahadevan 331db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 332db66d124SVijay Mahadevan to the load_file functions to be populated. */ 33372ff976dSVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset); 334032b8ab6SVijay Mahadevan MBERR("Creating partition set failed", merr); 335032b8ab6SVijay Mahadevan 336db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 33772ff976dSVijay Mahadevan dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm); 33872ff976dSVijay Mahadevan } 33972ff976dSVijay Mahadevan else { 34072ff976dSVijay Mahadevan ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr); 341032b8ab6SVijay Mahadevan } 342032b8ab6SVijay Mahadevan 3434973de03SVijay Mahadevan /* do the remaining initializations for DMMoab */ 3444973de03SVijay Mahadevan dmmoab->bs = 1; 3454973de03SVijay Mahadevan 3464973de03SVijay Mahadevan /* set global ID tag handle */ 347032b8ab6SVijay Mahadevan if (!ltog_tag) { 3484973de03SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 349032b8ab6SVijay Mahadevan } 350032b8ab6SVijay Mahadevan else { 351032b8ab6SVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr); 352a4d2169cSTim Tautges } 353a4d2169cSTim Tautges 3544973de03SVijay Mahadevan /* set the local range of entities (vertices) of interest */ 355a4d2169cSTim Tautges if (range) { 3565eb88e9dSVijay Mahadevan ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr); 357a4d2169cSTim Tautges } 3581d72bce8STim Tautges PetscFunctionReturn(0); 3591d72bce8STim Tautges } 3601d72bce8STim Tautges 3611d72bce8STim Tautges #undef __FUNCT__ 3621d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm" 363aa768e4cSTim Tautges /*@ 364aa768e4cSTim Tautges DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab 365aa768e4cSTim Tautges 366aa768e4cSTim Tautges Collective on MPI_Comm 367aa768e4cSTim Tautges 368aa768e4cSTim Tautges Input Parameter: 369aa768e4cSTim Tautges . dm - The DMMoab object being set 370aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab 371aa768e4cSTim Tautges 372aa768e4cSTim Tautges Level: beginner 373aa768e4cSTim Tautges 374aa768e4cSTim Tautges .keywords: DMMoab, create 375aa768e4cSTim Tautges @*/ 3761d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm) 3771d72bce8STim Tautges { 378032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 379032b8ab6SVijay Mahadevan 3801d72bce8STim Tautges PetscFunctionBegin; 3811d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3821cec0304SVijay Mahadevan PetscValidPointer(pcomm,2); 383032b8ab6SVijay Mahadevan dmmoab->pcomm = pcomm; 384032b8ab6SVijay Mahadevan dmmoab->mbiface = pcomm->get_moab(); 385032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 3861d72bce8STim Tautges PetscFunctionReturn(0); 3871d72bce8STim Tautges } 3881d72bce8STim Tautges 3891d72bce8STim Tautges 3901d72bce8STim Tautges #undef __FUNCT__ 3911d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm" 392aa768e4cSTim Tautges /*@ 393aa768e4cSTim Tautges DMMoabGetParallelComm - Get 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 400aa768e4cSTim Tautges Output Parameter: 401aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 402aa768e4cSTim Tautges 403aa768e4cSTim Tautges Level: beginner 404aa768e4cSTim Tautges 405aa768e4cSTim Tautges .keywords: DMMoab, create 406aa768e4cSTim Tautges @*/ 4071d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm) 4081d72bce8STim Tautges { 4091d72bce8STim Tautges PetscFunctionBegin; 4101d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 411032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 4121d72bce8STim Tautges PetscFunctionReturn(0); 4131d72bce8STim Tautges } 4141d72bce8STim Tautges 4151d72bce8STim Tautges 4161d72bce8STim Tautges #undef __FUNCT__ 4171d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface" 418aa768e4cSTim Tautges /*@ 419aa768e4cSTim Tautges DMMoabSetInterface - Set the MOAB instance used with this DMMoab 420aa768e4cSTim Tautges 421aa768e4cSTim Tautges Collective on MPI_Comm 422aa768e4cSTim Tautges 423aa768e4cSTim Tautges Input Parameter: 424aa768e4cSTim Tautges . dm - The DMMoab object being set 425aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab 426aa768e4cSTim Tautges 427aa768e4cSTim Tautges Level: beginner 428aa768e4cSTim Tautges 429aa768e4cSTim Tautges .keywords: DMMoab, create 430aa768e4cSTim Tautges @*/ 431a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface) 4321d72bce8STim Tautges { 433032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 434032b8ab6SVijay Mahadevan 4351d72bce8STim Tautges PetscFunctionBegin; 4361d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4371cec0304SVijay Mahadevan PetscValidPointer(mbiface,2); 438032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 439032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 440032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 4411d72bce8STim Tautges PetscFunctionReturn(0); 4421d72bce8STim Tautges } 4431d72bce8STim Tautges 4441d72bce8STim Tautges 4451d72bce8STim Tautges #undef __FUNCT__ 4461d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface" 447aa768e4cSTim Tautges /*@ 448aa768e4cSTim Tautges DMMoabGetInterface - Get 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 455aa768e4cSTim Tautges Output Parameter: 456aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab 457aa768e4cSTim Tautges 458aa768e4cSTim Tautges Level: beginner 459aa768e4cSTim Tautges 460aa768e4cSTim Tautges .keywords: DMMoab, create 461aa768e4cSTim Tautges @*/ 462a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface) 4631d72bce8STim Tautges { 4649426e041SSatish Balay PetscErrorCode ierr; 465cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 466cabb514dSBarry Smith 4671d72bce8STim Tautges PetscFunctionBegin; 4681d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 469cabb514dSBarry 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); 470a4d2169cSTim Tautges *mbiface = ((DM_Moab*)dm->data)->mbiface; 4711d72bce8STim Tautges PetscFunctionReturn(0); 4721d72bce8STim Tautges } 4731d72bce8STim Tautges 4741d72bce8STim Tautges 4751d72bce8STim Tautges #undef __FUNCT__ 4765eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices" 477aa768e4cSTim Tautges /*@ 4785eb88e9dSVijay Mahadevan DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab 479aa768e4cSTim Tautges 480aa768e4cSTim Tautges Collective on MPI_Comm 481aa768e4cSTim Tautges 482aa768e4cSTim Tautges Input Parameter: 483aa768e4cSTim Tautges . dm - The DMMoab object being set 484aa768e4cSTim Tautges . range - The entities treated by this DMMoab 485aa768e4cSTim Tautges 486aa768e4cSTim Tautges Level: beginner 487aa768e4cSTim Tautges 488aa768e4cSTim Tautges .keywords: DMMoab, create 489aa768e4cSTim Tautges @*/ 4905eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range) 4911d72bce8STim Tautges { 492032b8ab6SVijay Mahadevan moab::ErrorCode merr; 493032b8ab6SVijay Mahadevan PetscErrorCode ierr; 494032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 495032b8ab6SVijay Mahadevan 4961d72bce8STim Tautges PetscFunctionBegin; 4971d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 498032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 499032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 500032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 501032b8ab6SVijay Mahadevan *dmmoab->vowned = *dmmoab->vlocal; 502032b8ab6SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 503032b8ab6SVijay Mahadevan *dmmoab->vghost = moab::subtract(*range, *dmmoab->vowned); 504032b8ab6SVijay Mahadevan dmmoab->nloc=dmmoab->vowned->size(); 505032b8ab6SVijay Mahadevan dmmoab->nghost=dmmoab->vghost->size(); 506032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 5071d72bce8STim Tautges PetscFunctionReturn(0); 5081d72bce8STim Tautges } 5091d72bce8STim Tautges 5101d72bce8STim Tautges 5111d72bce8STim Tautges #undef __FUNCT__ 5125eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices" 513aa768e4cSTim Tautges /*@ 5145eb88e9dSVijay Mahadevan DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab 515aa768e4cSTim Tautges 516aa768e4cSTim Tautges Collective on MPI_Comm 517aa768e4cSTim Tautges 518aa768e4cSTim Tautges Input Parameter: 519aa768e4cSTim Tautges . dm - The DMMoab object being set 520aa768e4cSTim Tautges 521aa768e4cSTim Tautges Output Parameter: 5225eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab 5235eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition 524aa768e4cSTim Tautges 525aa768e4cSTim Tautges Level: beginner 526aa768e4cSTim Tautges 527aa768e4cSTim Tautges .keywords: DMMoab, create 528aa768e4cSTim Tautges @*/ 5291cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,moab::Range *owned,moab::Range *ghost) 5301d72bce8STim Tautges { 5311d72bce8STim Tautges PetscFunctionBegin; 5321d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5331cec0304SVijay Mahadevan if (owned) *owned = *((DM_Moab*)dm->data)->vowned; 5341cec0304SVijay Mahadevan if (ghost) *ghost = *((DM_Moab*)dm->data)->vghost; 5351d72bce8STim Tautges PetscFunctionReturn(0); 5361d72bce8STim Tautges } 5371d72bce8STim Tautges 5381d72bce8STim Tautges #undef __FUNCT__ 5395eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements" 5405eb88e9dSVijay Mahadevan /*@ 5415eb88e9dSVijay Mahadevan DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned 5425eb88e9dSVijay Mahadevan 5435eb88e9dSVijay Mahadevan Collective on MPI_Comm 5445eb88e9dSVijay Mahadevan 5455eb88e9dSVijay Mahadevan Input Parameter: 5465eb88e9dSVijay Mahadevan . dm - The DMMoab object being set 5475eb88e9dSVijay Mahadevan 5485eb88e9dSVijay Mahadevan Output Parameter: 5495eb88e9dSVijay Mahadevan . range - The entities owned locally 5505eb88e9dSVijay Mahadevan 5515eb88e9dSVijay Mahadevan Level: beginner 5525eb88e9dSVijay Mahadevan 5535eb88e9dSVijay Mahadevan .keywords: DMMoab, create 5545eb88e9dSVijay Mahadevan @*/ 5551cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,moab::Range *range) 5565eb88e9dSVijay Mahadevan { 5575eb88e9dSVijay Mahadevan PetscFunctionBegin; 5585eb88e9dSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5591cec0304SVijay Mahadevan if (range) *range = *((DM_Moab*)dm->data)->elocal; 5601cec0304SVijay Mahadevan PetscFunctionReturn(0); 5611cec0304SVijay Mahadevan } 5621cec0304SVijay Mahadevan 5631cec0304SVijay Mahadevan 5641cec0304SVijay Mahadevan #undef __FUNCT__ 5651cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements" 5661cec0304SVijay Mahadevan /*@ 5671cec0304SVijay Mahadevan DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab 5681cec0304SVijay Mahadevan 5691cec0304SVijay Mahadevan Collective on MPI_Comm 5701cec0304SVijay Mahadevan 5711cec0304SVijay Mahadevan Input Parameter: 5721cec0304SVijay Mahadevan . dm - The DMMoab object being set 5731cec0304SVijay Mahadevan . range - The entities treated by this DMMoab 5741cec0304SVijay Mahadevan 5751cec0304SVijay Mahadevan Level: beginner 5761cec0304SVijay Mahadevan 5771cec0304SVijay Mahadevan .keywords: DMMoab, create 5781cec0304SVijay Mahadevan @*/ 5791cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range) 5801cec0304SVijay Mahadevan { 5811cec0304SVijay Mahadevan moab::ErrorCode merr; 5821cec0304SVijay Mahadevan PetscErrorCode ierr; 5831cec0304SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 5841cec0304SVijay Mahadevan 5851cec0304SVijay Mahadevan PetscFunctionBegin; 5861cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5871cec0304SVijay Mahadevan dmmoab->elocal->clear(); 5881cec0304SVijay Mahadevan dmmoab->eghost->clear(); 5891cec0304SVijay Mahadevan dmmoab->elocal->insert(range->begin(), range->end()); 5901cec0304SVijay Mahadevan PetscInfo2(dm, "Range size = %D; elocal size = %D.\n", range->size(), dmmoab->elocal->size()); 5911cec0304SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 5921cec0304SVijay Mahadevan *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal); 5931cec0304SVijay Mahadevan dmmoab->neleloc=dmmoab->elocal->size(); 5941cec0304SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 5951cec0304SVijay Mahadevan PetscInfo2(dm, "Created %D local and %D glocal elements.\n", dmmoab->neleloc, dmmoab->nele); 5965eb88e9dSVijay Mahadevan PetscFunctionReturn(0); 5975eb88e9dSVijay Mahadevan } 5985eb88e9dSVijay Mahadevan 5995eb88e9dSVijay Mahadevan 6005eb88e9dSVijay Mahadevan #undef __FUNCT__ 6011d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag" 602aa768e4cSTim Tautges /*@ 603aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 604aa768e4cSTim Tautges 605aa768e4cSTim Tautges Collective on MPI_Comm 606aa768e4cSTim Tautges 607aa768e4cSTim Tautges Input Parameter: 608aa768e4cSTim Tautges . dm - The DMMoab object being set 609aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 610aa768e4cSTim Tautges 611aa768e4cSTim Tautges Level: beginner 612aa768e4cSTim Tautges 613aa768e4cSTim Tautges .keywords: DMMoab, create 614aa768e4cSTim Tautges @*/ 6151d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag) 6161d72bce8STim Tautges { 6171d72bce8STim Tautges PetscFunctionBegin; 6181d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6191d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 6201d72bce8STim Tautges PetscFunctionReturn(0); 6211d72bce8STim Tautges } 6221d72bce8STim Tautges 6231d72bce8STim Tautges 6241d72bce8STim Tautges #undef __FUNCT__ 6251d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag" 626aa768e4cSTim Tautges /*@ 627aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 628aa768e4cSTim Tautges 629aa768e4cSTim Tautges Collective on MPI_Comm 630aa768e4cSTim Tautges 631aa768e4cSTim Tautges Input Parameter: 632aa768e4cSTim Tautges . dm - The DMMoab object being set 633aa768e4cSTim Tautges 634aa768e4cSTim Tautges Output Parameter: 635aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 636aa768e4cSTim Tautges 637aa768e4cSTim Tautges Level: beginner 638aa768e4cSTim Tautges 639aa768e4cSTim Tautges .keywords: DMMoab, create 640aa768e4cSTim Tautges @*/ 6411d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag) 6421d72bce8STim Tautges { 6431d72bce8STim Tautges PetscFunctionBegin; 6441d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6451d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 6461d72bce8STim Tautges PetscFunctionReturn(0); 6471d72bce8STim Tautges } 6481d72bce8STim Tautges 6491d72bce8STim Tautges 6501d72bce8STim Tautges #undef __FUNCT__ 6511d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize" 652aa768e4cSTim Tautges /*@ 653aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 654aa768e4cSTim Tautges 655aa768e4cSTim Tautges Collective on MPI_Comm 656aa768e4cSTim Tautges 657aa768e4cSTim Tautges Input Parameter: 658aa768e4cSTim Tautges . dm - The DMMoab object being set 659aa768e4cSTim Tautges . bs - The block size used with this DMMoab 660aa768e4cSTim Tautges 661aa768e4cSTim Tautges Level: beginner 662aa768e4cSTim Tautges 663aa768e4cSTim Tautges .keywords: DMMoab, create 664aa768e4cSTim Tautges @*/ 6651d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs) 6661d72bce8STim Tautges { 6671d72bce8STim Tautges PetscFunctionBegin; 6681d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6691d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 6701d72bce8STim Tautges PetscFunctionReturn(0); 6711d72bce8STim Tautges } 6721d72bce8STim Tautges 6731d72bce8STim Tautges 6741d72bce8STim Tautges #undef __FUNCT__ 6751d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize" 676aa768e4cSTim Tautges /*@ 677aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 678aa768e4cSTim Tautges 679aa768e4cSTim Tautges Collective on MPI_Comm 680aa768e4cSTim Tautges 681aa768e4cSTim Tautges Input Parameter: 682aa768e4cSTim Tautges . dm - The DMMoab object being set 683aa768e4cSTim Tautges 684aa768e4cSTim Tautges Output Parameter: 685aa768e4cSTim Tautges . bs - The block size used with this DMMoab 686aa768e4cSTim Tautges 687aa768e4cSTim Tautges Level: beginner 688aa768e4cSTim Tautges 689aa768e4cSTim Tautges .keywords: DMMoab, create 690aa768e4cSTim Tautges @*/ 6911d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs) 6921d72bce8STim Tautges { 6931d72bce8STim Tautges PetscFunctionBegin; 6941d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6951d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 6961d72bce8STim Tautges PetscFunctionReturn(0); 6971d72bce8STim Tautges } 6981d72bce8STim Tautges 6991cec0304SVijay Mahadevan 7001cec0304SVijay Mahadevan #undef __FUNCT__ 701*212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetSize" 702*212ad6d1SVijay Mahadevan /*@ 703*212ad6d1SVijay Mahadevan DMMoabGetSize - Get the global vertex size used with this DMMoab 704*212ad6d1SVijay Mahadevan 705*212ad6d1SVijay Mahadevan Collective on MPI_Comm 706*212ad6d1SVijay Mahadevan 707*212ad6d1SVijay Mahadevan Input Parameter: 708*212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 709*212ad6d1SVijay Mahadevan 710*212ad6d1SVijay Mahadevan Output Parameter: 711*212ad6d1SVijay Mahadevan . ng - The global size of the DMMoab instance 712*212ad6d1SVijay Mahadevan 713*212ad6d1SVijay Mahadevan Level: beginner 714*212ad6d1SVijay Mahadevan 715*212ad6d1SVijay Mahadevan .keywords: DMMoab, create 716*212ad6d1SVijay Mahadevan @*/ 717*212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *ng) 718*212ad6d1SVijay Mahadevan { 719*212ad6d1SVijay Mahadevan PetscFunctionBegin; 720*212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 721*212ad6d1SVijay Mahadevan if(ng) *ng = ((DM_Moab*)dm->data)->n; 722*212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 723*212ad6d1SVijay Mahadevan } 724*212ad6d1SVijay Mahadevan 725*212ad6d1SVijay Mahadevan 726*212ad6d1SVijay Mahadevan #undef __FUNCT__ 727*212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalSize" 728*212ad6d1SVijay Mahadevan /*@ 729*212ad6d1SVijay Mahadevan DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab 730*212ad6d1SVijay Mahadevan 731*212ad6d1SVijay Mahadevan Collective on MPI_Comm 732*212ad6d1SVijay Mahadevan 733*212ad6d1SVijay Mahadevan Input Parameter: 734*212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 735*212ad6d1SVijay Mahadevan 736*212ad6d1SVijay Mahadevan Output Parameter: 737*212ad6d1SVijay Mahadevan . nl - The local size of the DMMoab instance 738*212ad6d1SVijay Mahadevan . ng - The ghosted size of the DMMoab instance 739*212ad6d1SVijay Mahadevan 740*212ad6d1SVijay Mahadevan Level: beginner 741*212ad6d1SVijay Mahadevan 742*212ad6d1SVijay Mahadevan .keywords: DMMoab, create 743*212ad6d1SVijay Mahadevan @*/ 744*212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nl,PetscInt *ng) 745*212ad6d1SVijay Mahadevan { 746*212ad6d1SVijay Mahadevan PetscFunctionBegin; 747*212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 748*212ad6d1SVijay Mahadevan if(nl) *nl = ((DM_Moab*)dm->data)->nloc; 749*212ad6d1SVijay Mahadevan if(ng) *ng = ((DM_Moab*)dm->data)->nghost; 750*212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 751*212ad6d1SVijay Mahadevan } 752*212ad6d1SVijay Mahadevan 753*212ad6d1SVijay Mahadevan 754*212ad6d1SVijay Mahadevan #undef __FUNCT__ 7551cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldVector" 7561cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec) 7571cec0304SVijay Mahadevan { 7581cec0304SVijay Mahadevan DM_Moab *dmmoab; 7591cec0304SVijay Mahadevan moab::Tag vtag,ntag; 760*212ad6d1SVijay Mahadevan const PetscScalar *varray; 761*212ad6d1SVijay Mahadevan PetscScalar *farray; 7621cec0304SVijay Mahadevan moab::ErrorCode merr; 7631cec0304SVijay Mahadevan PetscErrorCode ierr; 7641cec0304SVijay Mahadevan PetscInt doff; 7651cec0304SVijay Mahadevan std::string tag_name; 7661cec0304SVijay Mahadevan moab::Range::iterator iter; 7671cec0304SVijay Mahadevan 7681cec0304SVijay Mahadevan PetscFunctionBegin; 7691cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7701cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7711cec0304SVijay Mahadevan 7721cec0304SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 7731cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag, 7741cec0304SVijay Mahadevan moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr); 7751cec0304SVijay Mahadevan 7761cec0304SVijay Mahadevan ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr); 7771cec0304SVijay Mahadevan 7781cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name); 7791cec0304SVijay Mahadevan if (!tag_name.length() && merr !=moab::MB_SUCCESS) { 780*212ad6d1SVijay Mahadevan ierr = VecGetArrayRead(fvec,&varray);CHKERRQ(ierr); 781*212ad6d1SVijay Mahadevan 7821cec0304SVijay Mahadevan for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) { 7831cec0304SVijay Mahadevan moab::EntityHandle vtx = (*iter); 7841cec0304SVijay Mahadevan 7851cec0304SVijay Mahadevan /* get field dof index */ 786*212ad6d1SVijay Mahadevan ierr = DMMoabGetFieldDof(dm, vtx, ifield, &doff); 7871cec0304SVijay Mahadevan 7881cec0304SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */ 7891cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, &vtx, 1, (const void*)&varray[doff]);MBERRNM(merr); 7901cec0304SVijay Mahadevan } 791*212ad6d1SVijay Mahadevan ierr = VecRestoreArrayRead(fvec,&varray);CHKERRQ(ierr); 7921cec0304SVijay Mahadevan } 7931cec0304SVijay Mahadevan else { 794*212ad6d1SVijay Mahadevan ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&farray);CHKERRQ(ierr); 7951cec0304SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 796*212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)farray);MBERRNM(merr); 797*212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr); 7981cec0304SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 7991cec0304SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr); 800*212ad6d1SVijay Mahadevan ierr = PetscFree(farray);CHKERRQ(ierr); 801*212ad6d1SVijay Mahadevan } 802*212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 803*212ad6d1SVijay Mahadevan } 804*212ad6d1SVijay Mahadevan 805*212ad6d1SVijay Mahadevan 806*212ad6d1SVijay Mahadevan #undef __FUNCT__ 807*212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabSetGlobalFieldVector" 808*212ad6d1SVijay Mahadevan PetscErrorCode DMMoabSetGlobalFieldVector(DM dm, Vec fvec) 809*212ad6d1SVijay Mahadevan { 810*212ad6d1SVijay Mahadevan DM_Moab *dmmoab; 811*212ad6d1SVijay Mahadevan moab::Tag vtag,ntag; 812*212ad6d1SVijay Mahadevan const PetscScalar *varray; 813*212ad6d1SVijay Mahadevan PetscScalar *farray; 814*212ad6d1SVijay Mahadevan moab::ErrorCode merr; 815*212ad6d1SVijay Mahadevan PetscErrorCode ierr; 816*212ad6d1SVijay Mahadevan PetscSection section; 817*212ad6d1SVijay Mahadevan PetscInt i,doff,ifield; 818*212ad6d1SVijay Mahadevan std::string tag_name; 819*212ad6d1SVijay Mahadevan moab::Range::iterator iter; 820*212ad6d1SVijay Mahadevan 821*212ad6d1SVijay Mahadevan PetscFunctionBegin; 822*212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 823*212ad6d1SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 824*212ad6d1SVijay Mahadevan 825*212ad6d1SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 826*212ad6d1SVijay Mahadevan 827*212ad6d1SVijay Mahadevan /* get the Tag corresponding to the global vector - possible that there is no tag associated.. */ 828*212ad6d1SVijay Mahadevan ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr); 829*212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name); 830*212ad6d1SVijay Mahadevan if (!tag_name.length() && merr !=moab::MB_SUCCESS) { 831*212ad6d1SVijay Mahadevan /* not a MOAB vector - use VecGetSubVector to get the parts as needed */ 832*212ad6d1SVijay Mahadevan 833*212ad6d1SVijay Mahadevan ierr = VecGetArrayRead(fvec,&varray);CHKERRQ(ierr); 834*212ad6d1SVijay Mahadevan for (ifield=0; ifield<dmmoab->nfields; ++ifield) { 835*212ad6d1SVijay Mahadevan 836*212ad6d1SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 837*212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag, 838*212ad6d1SVijay Mahadevan moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr); 839*212ad6d1SVijay Mahadevan 840*212ad6d1SVijay Mahadevan for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) { 841*212ad6d1SVijay Mahadevan moab::EntityHandle vtx = (*iter); 842*212ad6d1SVijay Mahadevan 843*212ad6d1SVijay Mahadevan /* get field dof index */ 844*212ad6d1SVijay Mahadevan ierr = DMMoabGetFieldDof(dm, vtx, ifield, &doff); 845*212ad6d1SVijay Mahadevan 846*212ad6d1SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */ 847*212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, &vtx, 1, (const void*)&varray[doff]);MBERRNM(merr); 848*212ad6d1SVijay Mahadevan } 849*212ad6d1SVijay Mahadevan } 850*212ad6d1SVijay Mahadevan ierr = VecRestoreArrayRead(fvec,&varray);CHKERRQ(ierr); 851*212ad6d1SVijay Mahadevan } 852*212ad6d1SVijay Mahadevan else { 853*212ad6d1SVijay Mahadevan ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&farray);CHKERRQ(ierr); 854*212ad6d1SVijay Mahadevan ierr = PetscMalloc(dmmoab->nloc*dmmoab->bs*sizeof(PetscScalar),&varray);CHKERRQ(ierr); 855*212ad6d1SVijay Mahadevan 856*212ad6d1SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 857*212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray);MBERRNM(merr); 858*212ad6d1SVijay Mahadevan for (ifield=0; ifield<dmmoab->nfields; ++ifield) { 859*212ad6d1SVijay Mahadevan 860*212ad6d1SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 861*212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag, 862*212ad6d1SVijay Mahadevan moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr); 863*212ad6d1SVijay Mahadevan 864*212ad6d1SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 865*212ad6d1SVijay Mahadevan for(i=0; i < dmmoab->nloc; i++) { 866*212ad6d1SVijay Mahadevan farray[i] = varray[i*dmmoab->bs+ifield]; 867*212ad6d1SVijay Mahadevan } 868*212ad6d1SVijay Mahadevan 869*212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr); 870*212ad6d1SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 871*212ad6d1SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr); 872*212ad6d1SVijay Mahadevan } 873*212ad6d1SVijay Mahadevan ierr = PetscFree(farray);CHKERRQ(ierr); 8741cec0304SVijay Mahadevan ierr = PetscFree(varray);CHKERRQ(ierr); 8751cec0304SVijay Mahadevan } 8761cec0304SVijay Mahadevan PetscFunctionReturn(0); 8771cec0304SVijay Mahadevan } 8781cec0304SVijay Mahadevan 8791cec0304SVijay Mahadevan 880*212ad6d1SVijay Mahadevan 8811cec0304SVijay Mahadevan #undef __FUNCT__ 8827023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates" 8837023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos) 8847023aa44SVijay Mahadevan { 8857023aa44SVijay Mahadevan DM_Moab *dmmoab; 8867023aa44SVijay Mahadevan PetscErrorCode ierr; 8877023aa44SVijay Mahadevan moab::ErrorCode merr; 8887023aa44SVijay Mahadevan 8897023aa44SVijay Mahadevan PetscFunctionBegin; 8907023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8917023aa44SVijay Mahadevan PetscValidPointer(conn,3); 8927023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8937023aa44SVijay Mahadevan 8947023aa44SVijay Mahadevan if (!vpos) { 8957023aa44SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr); 8967023aa44SVijay Mahadevan } 8977023aa44SVijay Mahadevan 8987023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 8997023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr); 9007023aa44SVijay Mahadevan PetscFunctionReturn(0); 9017023aa44SVijay Mahadevan } 9027023aa44SVijay Mahadevan 9037023aa44SVijay Mahadevan 9047023aa44SVijay Mahadevan #undef __FUNCT__ 9057023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity" 9067023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn) 9077023aa44SVijay Mahadevan { 9087023aa44SVijay Mahadevan DM_Moab *dmmoab; 9097023aa44SVijay Mahadevan const moab::EntityHandle *connect; 9107023aa44SVijay Mahadevan moab::ErrorCode merr; 9117023aa44SVijay Mahadevan PetscInt nnodes; 9127023aa44SVijay Mahadevan 9137023aa44SVijay Mahadevan PetscFunctionBegin; 9147023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 9157023aa44SVijay Mahadevan PetscValidPointer(conn,4); 9167023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 9177023aa44SVijay Mahadevan 9187023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 9197023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr); 9207023aa44SVijay Mahadevan if (conn) *conn=connect; 9217023aa44SVijay Mahadevan if (nconn) *nconn=nnodes; 9227023aa44SVijay Mahadevan PetscFunctionReturn(0); 9237023aa44SVijay Mahadevan } 9247023aa44SVijay Mahadevan 9257023aa44SVijay Mahadevan 9267023aa44SVijay Mahadevan #undef __FUNCT__ 92769263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary" 92869263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary) 92969263071SVijay Mahadevan { 93069263071SVijay Mahadevan moab::EntityType etype; 93169263071SVijay Mahadevan DM_Moab *dmmoab; 93269263071SVijay Mahadevan PetscInt edim; 93369263071SVijay Mahadevan 93469263071SVijay Mahadevan PetscFunctionBegin; 93569263071SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 93669263071SVijay Mahadevan PetscValidPointer(ent_on_boundary,3); 93769263071SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 93869263071SVijay Mahadevan 93969263071SVijay Mahadevan /* get the entity type and handle accordingly */ 94069263071SVijay Mahadevan etype=dmmoab->mbiface->type_from_handle(ent); 94169263071SVijay 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); 94269263071SVijay Mahadevan 94369263071SVijay Mahadevan /* get the entity dimension */ 94469263071SVijay Mahadevan edim=dmmoab->mbiface->dimension_from_handle(ent); 94569263071SVijay Mahadevan 94669263071SVijay Mahadevan *ent_on_boundary=PETSC_FALSE; 94769263071SVijay Mahadevan if(etype == moab::MBVERTEX && edim == 0) { 94869263071SVijay Mahadevan moab::Range::const_iterator giter = dmmoab->bndyvtx->find(ent); 94969263071SVijay Mahadevan if (giter != dmmoab->bndyvtx->end()) *ent_on_boundary=PETSC_TRUE; 95069263071SVijay Mahadevan } 95169263071SVijay Mahadevan else { 95269263071SVijay Mahadevan if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */ 95369263071SVijay Mahadevan moab::Range::const_iterator geiter = dmmoab->bndyelems->find(ent); 95469263071SVijay Mahadevan if (geiter != dmmoab->bndyelems->end()) *ent_on_boundary=PETSC_TRUE; 95569263071SVijay Mahadevan } 95669263071SVijay Mahadevan else { /* next check the lower-dimensional faces */ 95769263071SVijay Mahadevan moab::Range::const_iterator gfiter = dmmoab->bndyfaces->find(ent); 95869263071SVijay Mahadevan if (gfiter != dmmoab->bndyfaces->end()) *ent_on_boundary=PETSC_TRUE; 95969263071SVijay Mahadevan } 96069263071SVijay Mahadevan } 96169263071SVijay Mahadevan PetscFunctionReturn(0); 96269263071SVijay Mahadevan } 96369263071SVijay Mahadevan 96469263071SVijay Mahadevan 96569263071SVijay Mahadevan #undef __FUNCT__ 9667023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices" 96769263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx) 9687023aa44SVijay Mahadevan { 9697023aa44SVijay Mahadevan DM_Moab *dmmoab; 9707023aa44SVijay Mahadevan PetscInt i; 9717023aa44SVijay Mahadevan 9727023aa44SVijay Mahadevan PetscFunctionBegin; 9737023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 9747023aa44SVijay Mahadevan PetscValidPointer(cnt,3); 9757023aa44SVijay Mahadevan PetscValidPointer(isbdvtx,4); 9767023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 9777023aa44SVijay Mahadevan 9787023aa44SVijay Mahadevan for (i=0; i < nconn; ++i) { 9797023aa44SVijay Mahadevan moab::Range::const_iterator giter = dmmoab->bndyvtx->find(cnt[i]); 98069263071SVijay Mahadevan if (giter != dmmoab->bndyvtx->end()) isbdvtx[i] = PETSC_TRUE; 9817023aa44SVijay Mahadevan else isbdvtx[i] = PETSC_FALSE; 9827023aa44SVijay Mahadevan } 9837023aa44SVijay Mahadevan PetscFunctionReturn(0); 9847023aa44SVijay Mahadevan } 9857023aa44SVijay Mahadevan 9867023aa44SVijay Mahadevan 9877023aa44SVijay Mahadevan #undef __FUNCT__ 9881cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryEntities" 98969263071SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryEntities(DM dm,moab::Range *bdvtx,moab::Range* bdfaces,moab::Range* bdelems) 9901cec0304SVijay Mahadevan { 9911cec0304SVijay Mahadevan DM_Moab *dmmoab; 9921cec0304SVijay Mahadevan 9931cec0304SVijay Mahadevan PetscFunctionBegin; 9941cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 9951cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 9961cec0304SVijay Mahadevan 9971cec0304SVijay Mahadevan if (bdvtx) *bdvtx = *dmmoab->bndyvtx; 9981cec0304SVijay Mahadevan if (bdfaces) *bdfaces = *dmmoab->bndyfaces; 99969263071SVijay Mahadevan if (bdelems) *bdfaces = *dmmoab->bndyelems; 10001cec0304SVijay Mahadevan PetscFunctionReturn(0); 10011cec0304SVijay Mahadevan } 10021cec0304SVijay Mahadevan 10031cec0304SVijay Mahadevan 10041cec0304SVijay Mahadevan #undef __FUNCT__ 10051cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFields" 10061cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFields(DM dm,PetscInt nfields,const char** fields) 10071cec0304SVijay Mahadevan { 10081cec0304SVijay Mahadevan DM_Moab *dmmoab; 10091cec0304SVijay Mahadevan 10101cec0304SVijay Mahadevan PetscFunctionBegin; 10111cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 10121cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 10131cec0304SVijay Mahadevan 10141cec0304SVijay Mahadevan dmmoab->fields = fields; 10151cec0304SVijay Mahadevan dmmoab->nfields = nfields; 10161cec0304SVijay Mahadevan PetscFunctionReturn(0); 10171cec0304SVijay Mahadevan } 10181cec0304SVijay Mahadevan 10191cec0304SVijay Mahadevan 10201cec0304SVijay Mahadevan #undef __FUNCT__ 10211cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDof" 10221cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof) 10231cec0304SVijay Mahadevan { 10241cec0304SVijay Mahadevan PetscSection section; 1025fc418013SVijay Mahadevan PetscInt gid; 10261cec0304SVijay Mahadevan PetscErrorCode ierr; 1027fc418013SVijay Mahadevan moab::ErrorCode merr; 1028fc418013SVijay Mahadevan DM_Moab *dmmoab; 10291cec0304SVijay Mahadevan 10301cec0304SVijay Mahadevan PetscFunctionBegin; 10311cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1032fc418013SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1033fc418013SVijay Mahadevan 10341cec0304SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 1035fc418013SVijay Mahadevan 1036fc418013SVijay Mahadevan /* first get the global ID for the point */ 1037fc418013SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,&point,1,&gid);MBERRNM(merr); 1038fc418013SVijay Mahadevan 1039fc418013SVijay Mahadevan /* get the dof value for the field */ 1040fc418013SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, gid, field, dof);CHKERRQ(ierr); 10411cec0304SVijay Mahadevan PetscFunctionReturn(0); 10421cec0304SVijay Mahadevan } 10431cec0304SVijay Mahadevan 10441cec0304SVijay Mahadevan 10451cec0304SVijay Mahadevan #undef __FUNCT__ 10461cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofs" 10471cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof) 10481cec0304SVijay Mahadevan { 1049fc418013SVijay Mahadevan PetscInt i,gid; 10501cec0304SVijay Mahadevan PetscSection section; 10511cec0304SVijay Mahadevan PetscErrorCode ierr; 1052fc418013SVijay Mahadevan moab::ErrorCode merr; 1053fc418013SVijay Mahadevan DM_Moab *dmmoab; 10541cec0304SVijay Mahadevan 10551cec0304SVijay Mahadevan PetscFunctionBegin; 10561cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1057fc418013SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1058fc418013SVijay Mahadevan 10591cec0304SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 10601cec0304SVijay Mahadevan if (!dof) { 10611cec0304SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr); 10621cec0304SVijay Mahadevan } 1063fc418013SVijay Mahadevan 1064fc418013SVijay Mahadevan /* first get the local indices */ 1065fc418013SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,points,npoints,dof);MBERRNM(merr); 1066fc418013SVijay Mahadevan 10671cec0304SVijay Mahadevan for (i=0; i<npoints; ++i) { 1068fc418013SVijay Mahadevan gid=dof[i]; 1069fc418013SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, gid, field, &dof[i]);CHKERRQ(ierr); 10701cec0304SVijay Mahadevan } 10711cec0304SVijay Mahadevan PetscFunctionReturn(0); 10721cec0304SVijay Mahadevan } 10731cec0304SVijay Mahadevan 10741cec0304SVijay Mahadevan 1075fc418013SVijay Mahadevan #undef __FUNCT__ 1076*212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofsLocal" 1077*212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof) 1078eb9d2429SVijay Mahadevan { 1079eb9d2429SVijay Mahadevan PetscInt i,offset; 1080eb9d2429SVijay Mahadevan PetscErrorCode ierr; 1081eb9d2429SVijay Mahadevan DM_Moab *dmmoab; 1082eb9d2429SVijay Mahadevan 1083eb9d2429SVijay Mahadevan PetscFunctionBegin; 1084eb9d2429SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1085eb9d2429SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1086eb9d2429SVijay Mahadevan 1087eb9d2429SVijay Mahadevan if (!dof) { 1088eb9d2429SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr); 1089eb9d2429SVijay Mahadevan } 1090eb9d2429SVijay Mahadevan 1091eb9d2429SVijay Mahadevan if (dmmoab->bs > 1) { 1092eb9d2429SVijay Mahadevan for (i=0; i<npoints; ++i) 1093eb9d2429SVijay Mahadevan dof[i] = (points[i]-1)*dmmoab->bs+field; 1094eb9d2429SVijay Mahadevan } 1095eb9d2429SVijay Mahadevan else { 1096eb9d2429SVijay Mahadevan offset = field*dmmoab->n; /* assume all fields have equal distribution */ 1097eb9d2429SVijay Mahadevan for (i=0; i<npoints; ++i) 1098eb9d2429SVijay Mahadevan dof[i] = offset+points[i]-1; 1099eb9d2429SVijay Mahadevan } 1100eb9d2429SVijay Mahadevan PetscFunctionReturn(0); 1101eb9d2429SVijay Mahadevan } 1102eb9d2429SVijay Mahadevan 1103eb9d2429SVijay Mahadevan 1104eb9d2429SVijay Mahadevan #undef __FUNCT__ 1105*212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofs" 1106*212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 1107*212ad6d1SVijay Mahadevan { 1108*212ad6d1SVijay Mahadevan PetscInt i,f,gid; 1109*212ad6d1SVijay Mahadevan PetscSection section; 1110*212ad6d1SVijay Mahadevan PetscErrorCode ierr; 1111*212ad6d1SVijay Mahadevan moab::ErrorCode merr; 1112*212ad6d1SVijay Mahadevan DM_Moab *dmmoab; 1113*212ad6d1SVijay Mahadevan 1114*212ad6d1SVijay Mahadevan PetscFunctionBegin; 1115*212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1116*212ad6d1SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1117*212ad6d1SVijay Mahadevan 1118*212ad6d1SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 1119*212ad6d1SVijay Mahadevan if (!dof) { 1120*212ad6d1SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*dmmoab->nfields*npoints, &dof);CHKERRQ(ierr); 1121*212ad6d1SVijay Mahadevan } 1122*212ad6d1SVijay Mahadevan 1123*212ad6d1SVijay Mahadevan /* first get the local indices */ 1124*212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,points,npoints,dof);MBERRNM(merr); 1125*212ad6d1SVijay Mahadevan 1126*212ad6d1SVijay Mahadevan for (i=0; i<npoints; ++i) { 1127*212ad6d1SVijay Mahadevan gid=dof[i]; 1128*212ad6d1SVijay Mahadevan for (f=0; f<dmmoab->nfields; ++f) { 1129*212ad6d1SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, gid, f, &dof[i*dmmoab->nfields+f]);CHKERRQ(ierr); 1130*212ad6d1SVijay Mahadevan } 1131*212ad6d1SVijay Mahadevan } 1132*212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 1133*212ad6d1SVijay Mahadevan } 1134*212ad6d1SVijay Mahadevan 1135*212ad6d1SVijay Mahadevan 1136*212ad6d1SVijay Mahadevan #undef __FUNCT__ 1137*212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsLocal" 1138*212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 1139*212ad6d1SVijay Mahadevan { 1140*212ad6d1SVijay Mahadevan PetscInt i,f,offset; 1141*212ad6d1SVijay Mahadevan PetscErrorCode ierr; 1142*212ad6d1SVijay Mahadevan DM_Moab *dmmoab; 1143*212ad6d1SVijay Mahadevan 1144*212ad6d1SVijay Mahadevan PetscFunctionBegin; 1145*212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1146*212ad6d1SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1147*212ad6d1SVijay Mahadevan 1148*212ad6d1SVijay Mahadevan if (!dof) { 1149*212ad6d1SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*dmmoab->nfields*npoints, &dof);CHKERRQ(ierr); 1150*212ad6d1SVijay Mahadevan } 1151*212ad6d1SVijay Mahadevan 1152*212ad6d1SVijay Mahadevan if (dmmoab->bs > 1) { 1153*212ad6d1SVijay Mahadevan for (f=0; f<dmmoab->nfields; ++f) 1154*212ad6d1SVijay Mahadevan for (i=0; i<npoints; ++i) 1155*212ad6d1SVijay Mahadevan dof[i*dmmoab->nfields+f] = (points[i]-1)*dmmoab->bs+f; 1156*212ad6d1SVijay Mahadevan } 1157*212ad6d1SVijay Mahadevan else { 1158*212ad6d1SVijay Mahadevan for (f=0; f<dmmoab->nfields; ++f) { 1159*212ad6d1SVijay Mahadevan offset = f*dmmoab->n; /* assume all fields have equal distribution - say all vertex based */ 1160*212ad6d1SVijay Mahadevan for (i=0; i<npoints; ++i) 1161*212ad6d1SVijay Mahadevan dof[i*dmmoab->nfields+f] = offset+points[i]-1; 1162*212ad6d1SVijay Mahadevan } 1163*212ad6d1SVijay Mahadevan } 1164*212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 1165*212ad6d1SVijay Mahadevan } 1166*212ad6d1SVijay Mahadevan 1167*212ad6d1SVijay Mahadevan 1168*212ad6d1SVijay Mahadevan #undef __FUNCT__ 1169*212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlocked" 1170*212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlocked(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 1171*212ad6d1SVijay Mahadevan { 1172*212ad6d1SVijay Mahadevan PetscInt i,gid,dofindx; 1173*212ad6d1SVijay Mahadevan PetscSection section; 1174*212ad6d1SVijay Mahadevan PetscErrorCode ierr; 1175*212ad6d1SVijay Mahadevan moab::ErrorCode merr; 1176*212ad6d1SVijay Mahadevan DM_Moab *dmmoab; 1177*212ad6d1SVijay Mahadevan 1178*212ad6d1SVijay Mahadevan PetscFunctionBegin; 1179*212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1180*212ad6d1SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1181*212ad6d1SVijay Mahadevan 1182*212ad6d1SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 1183*212ad6d1SVijay Mahadevan if (!dof) { 1184*212ad6d1SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr); 1185*212ad6d1SVijay Mahadevan } 1186*212ad6d1SVijay Mahadevan 1187*212ad6d1SVijay Mahadevan /* first get the local indices */ 1188*212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,points,npoints,dof);MBERRNM(merr); 1189*212ad6d1SVijay Mahadevan 1190*212ad6d1SVijay Mahadevan for (i=0; i<npoints; ++i) { 1191*212ad6d1SVijay Mahadevan gid=dof[i]; 1192*212ad6d1SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, gid, 0, &dofindx);CHKERRQ(ierr); 1193*212ad6d1SVijay Mahadevan if (dmmoab->bs > 1) dof[i]=dofindx/dmmoab->bs; 1194*212ad6d1SVijay Mahadevan else dof[i]=dofindx; 1195*212ad6d1SVijay Mahadevan // PetscPrintf(PETSC_COMM_SELF, "I=%D, GID=%D, DOFINDX=%D, DOF=%D\n", i, gid, dofindx, dof[i]); 1196*212ad6d1SVijay Mahadevan } 1197*212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 1198*212ad6d1SVijay Mahadevan } 1199*212ad6d1SVijay Mahadevan 1200*212ad6d1SVijay Mahadevan 1201*212ad6d1SVijay Mahadevan #undef __FUNCT__ 1202*212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlockedLocal" 1203*212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 1204*212ad6d1SVijay Mahadevan { 1205*212ad6d1SVijay Mahadevan PetscInt i; 1206*212ad6d1SVijay Mahadevan PetscErrorCode ierr; 1207*212ad6d1SVijay Mahadevan 1208*212ad6d1SVijay Mahadevan PetscFunctionBegin; 1209*212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1210*212ad6d1SVijay Mahadevan 1211*212ad6d1SVijay Mahadevan if (!dof) { 1212*212ad6d1SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr); 1213*212ad6d1SVijay Mahadevan } 1214*212ad6d1SVijay Mahadevan 1215*212ad6d1SVijay Mahadevan for (i=0; i<npoints; ++i) 1216*212ad6d1SVijay Mahadevan dof[i] = points[i]-1; 1217*212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 1218*212ad6d1SVijay Mahadevan } 1219*212ad6d1SVijay Mahadevan 1220*212ad6d1SVijay Mahadevan #undef __FUNCT__ 1221fc418013SVijay Mahadevan #define __FUNCT__ "DMMoab_GetWriteOptions_Private" 1222fc418013SVijay Mahadevan PetscErrorCode DMMoab_GetWriteOptions_Private(PetscInt fsetid, PetscInt numproc, PetscInt dim, MoabWriteMode mode, PetscInt dbglevel, const char* extra_opts, const char** write_opts) 1223fc418013SVijay Mahadevan { 1224fc418013SVijay Mahadevan std::ostringstream str; 1225fc418013SVijay Mahadevan 1226fc418013SVijay Mahadevan PetscFunctionBegin; 1227fc418013SVijay Mahadevan 1228fc418013SVijay Mahadevan // do parallel read unless only one processor 1229fc418013SVijay Mahadevan if (numproc > 1) { 1230fc418013SVijay Mahadevan str << "PARALLEL=" << mode << ";"; 1231fc418013SVijay Mahadevan if (fsetid>=0) str << "PARALLEL_COMM=" << fsetid << ";"; 1232fc418013SVijay Mahadevan } 1233fc418013SVijay Mahadevan 1234fc418013SVijay Mahadevan if (dbglevel) 1235fc418013SVijay Mahadevan str << "CPUTIME;DEBUG_IO=" << dbglevel << ";"; 1236fc418013SVijay Mahadevan 1237fc418013SVijay Mahadevan if (extra_opts) 1238fc418013SVijay Mahadevan str << extra_opts ; 1239fc418013SVijay Mahadevan 1240fc418013SVijay Mahadevan *write_opts = str.str().c_str(); 1241fc418013SVijay Mahadevan PetscFunctionReturn(0); 1242fc418013SVijay Mahadevan } 1243fc418013SVijay Mahadevan 1244fc418013SVijay Mahadevan 1245fc418013SVijay Mahadevan #undef __FUNCT__ 1246fc418013SVijay Mahadevan #define __FUNCT__ "DMMoabOutput" 1247fc418013SVijay Mahadevan PetscErrorCode DMMoabOutput(DM dm,const char* filename,const char* usrwriteopts) 1248fc418013SVijay Mahadevan { 1249fc418013SVijay Mahadevan DM_Moab *dmmoab; 1250fc418013SVijay Mahadevan PetscInt dbglevel=0; 1251fc418013SVijay Mahadevan const char *writeopts; 1252fc418013SVijay Mahadevan 1253fc418013SVijay Mahadevan PetscErrorCode ierr; 1254fc418013SVijay Mahadevan moab::ErrorCode merr; 1255fc418013SVijay Mahadevan 1256fc418013SVijay Mahadevan PetscFunctionBegin; 1257fc418013SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1258fc418013SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1259fc418013SVijay Mahadevan 1260fc418013SVijay Mahadevan PetscBarrier((PetscObject)dm); 1261fc418013SVijay Mahadevan 1262fc418013SVijay Mahadevan /* TODO: Use command-line options to control by_rank, verbosity, MoabReadMode and extra options */ 1263fc418013SVijay Mahadevan ierr = PetscOptionsBegin(PETSC_COMM_WORLD, "", "Options for reading/writing MOAB based meshes from file", "DMMoab"); 1264fc418013SVijay Mahadevan ierr = PetscOptionsInt("-dmmb_rw_dbg", "The verbosity level for reading and writing MOAB meshes", "dmmbutil.cxx", dbglevel, &dbglevel, NULL);CHKERRQ(ierr); 1265fc418013SVijay Mahadevan ierr = PetscOptionsEnd(); 1266fc418013SVijay Mahadevan 1267fc418013SVijay Mahadevan /* add mesh loading options specific to the DM */ 1268fc418013SVijay Mahadevan ierr = DMMoab_GetWriteOptions_Private(dmmoab->pcomm->get_id(), dmmoab->pcomm->size(), dmmoab->dim, MOAB_PARWOPTS_WRITE_PART, dbglevel, usrwriteopts, &writeopts);CHKERRQ(ierr); 1269fc418013SVijay Mahadevan PetscInfo2(dm, "Writing file %s with options: %s\n",filename,writeopts); 1270fc418013SVijay Mahadevan 1271fc418013SVijay Mahadevan /* output file, using parallel write */ 1272fc418013SVijay Mahadevan merr = dmmoab->mbiface->write_file(filename, NULL, writeopts, &dmmoab->fileset, 1);MBERRVM(dmmoab->mbiface,"Writing output of DMMoab failed.",merr); 1273fc418013SVijay Mahadevan PetscFunctionReturn(0); 1274fc418013SVijay Mahadevan } 1275fc418013SVijay Mahadevan 1276