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; 14212ad6d1SVijay Mahadevan PetscSection section; 15853cdec3SJed Brown 16853cdec3SJed Brown PetscFunctionBegin; 17853cdec3SJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 18212ad6d1SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 19212ad6d1SVijay 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; 226*324f1edfSVijay Mahadevan ((DM_Moab*)dm->data)->nfields = 1; 227032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 228032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 229032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 230032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 231032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 232032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL; 233032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL; 234032b8ab6SVijay Mahadevan 235032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 236032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 237032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 238032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 239032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 240aa768e4cSTim Tautges 24197ea90e6SJed Brown dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 24297ea90e6SJed Brown dm->ops->createlocalvector = DMCreateLocalVector_Moab; 243032b8ab6SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 244032b8ab6SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 24597ea90e6SJed Brown dm->ops->destroy = DMDestroy_Moab; 246032b8ab6SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 247032b8ab6SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 248032b8ab6SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 249032b8ab6SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 250aa768e4cSTim Tautges PetscFunctionReturn(0); 251aa768e4cSTim Tautges } 252fd349b41STim Tautges 253fd349b41STim Tautges #undef __FUNCT__ 2541d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate" 2551d72bce8STim Tautges /*@ 2561d72bce8STim Tautges DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance 2571d72bce8STim Tautges 2581d72bce8STim Tautges Collective on MPI_Comm 2591d72bce8STim Tautges 2601d72bce8STim Tautges Input Parameter: 2611d72bce8STim Tautges . comm - The communicator for the DMMoab object 2621d72bce8STim Tautges 2631d72bce8STim Tautges Output Parameter: 264032b8ab6SVijay Mahadevan . dmb - The DMMoab object 2651d72bce8STim Tautges 2661d72bce8STim Tautges Level: beginner 2671d72bce8STim Tautges 2681d72bce8STim Tautges .keywords: DMMoab, create 2691d72bce8STim Tautges @*/ 270032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb) 2711d72bce8STim Tautges { 2721d72bce8STim Tautges PetscErrorCode ierr; 2731d72bce8STim Tautges 2741d72bce8STim Tautges PetscFunctionBegin; 275032b8ab6SVijay Mahadevan PetscValidPointer(dmb,2); 276032b8ab6SVijay Mahadevan ierr = DMCreate(comm, dmb);CHKERRQ(ierr); 277032b8ab6SVijay Mahadevan ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr); 2781d72bce8STim Tautges PetscFunctionReturn(0); 2791d72bce8STim Tautges } 2801d72bce8STim Tautges 2811d72bce8STim Tautges #undef __FUNCT__ 282aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab" 2831d72bce8STim Tautges /*@ 284a4d2169cSTim Tautges DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data 2851d72bce8STim Tautges 2861d72bce8STim Tautges Collective on MPI_Comm 2871d72bce8STim Tautges 2881d72bce8STim Tautges Input Parameter: 2891d72bce8STim Tautges . comm - The communicator for the DMMoab object 290032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed 291a4d2169cSTim Tautges along with the DMMoab 292a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator 2931d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag 2941d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned 2951d72bce8STim Tautges 2961d72bce8STim Tautges Output Parameter: 297032b8ab6SVijay Mahadevan . dmb - The DMMoab object 2981d72bce8STim Tautges 299032b8ab6SVijay Mahadevan Level: intermediate 3001d72bce8STim Tautges 3011d72bce8STim Tautges .keywords: DMMoab, create 3021d72bce8STim Tautges @*/ 303032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb) 3041d72bce8STim Tautges { 3051d72bce8STim Tautges PetscErrorCode ierr; 306032b8ab6SVijay Mahadevan moab::ErrorCode merr; 3071cec0304SVijay Mahadevan moab::EntityHandle partnset; 3081cec0304SVijay Mahadevan PetscInt rank, nprocs; 309853cdec3SJed Brown DM_Moab *dmmoab; 3101d72bce8STim Tautges 3111d72bce8STim Tautges PetscFunctionBegin; 312032b8ab6SVijay Mahadevan PetscValidPointer(dmb,6); 313032b8ab6SVijay Mahadevan ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr); 314032b8ab6SVijay Mahadevan dmmoab = (DM_Moab*)(*dmb)->data; 315a4d2169cSTim Tautges 316a4d2169cSTim Tautges if (!mbiface) { 31772ff976dSVijay Mahadevan dmmoab->mbiface = new moab::Core(); 3187d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_TRUE; 3191d72bce8STim Tautges } 3201cec0304SVijay Mahadevan else { 3211cec0304SVijay Mahadevan dmmoab->mbiface = mbiface; 3227d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_FALSE; 3231cec0304SVijay Mahadevan } 3241cec0304SVijay Mahadevan 3251cec0304SVijay Mahadevan /* create a fileset to store the hierarchy of entities belonging to current DM */ 3261cec0304SVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_ORDERED, dmmoab->fileset);MBERR("Creating file set failed", merr); 3277d89fc02STim Tautges 328a4d2169cSTim Tautges if (!pcomm) { 329032b8ab6SVijay Mahadevan ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 330032b8ab6SVijay Mahadevan ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr); 331032b8ab6SVijay Mahadevan 332db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 333db66d124SVijay Mahadevan to the load_file functions to be populated. */ 33472ff976dSVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset); 335032b8ab6SVijay Mahadevan MBERR("Creating partition set failed", merr); 336032b8ab6SVijay Mahadevan 337db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 33872ff976dSVijay Mahadevan dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm); 33972ff976dSVijay Mahadevan } 34072ff976dSVijay Mahadevan else { 34172ff976dSVijay Mahadevan ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr); 342032b8ab6SVijay Mahadevan } 343032b8ab6SVijay Mahadevan 3444973de03SVijay Mahadevan /* do the remaining initializations for DMMoab */ 3454973de03SVijay Mahadevan dmmoab->bs = 1; 346*324f1edfSVijay Mahadevan dmmoab->nfields = 1; 3474973de03SVijay Mahadevan 3484973de03SVijay Mahadevan /* set global ID tag handle */ 349032b8ab6SVijay Mahadevan if (!ltog_tag) { 3504973de03SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 351032b8ab6SVijay Mahadevan } 352032b8ab6SVijay Mahadevan else { 353032b8ab6SVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr); 354a4d2169cSTim Tautges } 355a4d2169cSTim Tautges 3564973de03SVijay Mahadevan /* set the local range of entities (vertices) of interest */ 357a4d2169cSTim Tautges if (range) { 3585eb88e9dSVijay Mahadevan ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr); 359a4d2169cSTim Tautges } 3601d72bce8STim Tautges PetscFunctionReturn(0); 3611d72bce8STim Tautges } 3621d72bce8STim Tautges 3631d72bce8STim Tautges #undef __FUNCT__ 3641d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm" 365aa768e4cSTim Tautges /*@ 366aa768e4cSTim Tautges DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab 367aa768e4cSTim Tautges 368aa768e4cSTim Tautges Collective on MPI_Comm 369aa768e4cSTim Tautges 370aa768e4cSTim Tautges Input Parameter: 371aa768e4cSTim Tautges . dm - The DMMoab object being set 372aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab 373aa768e4cSTim Tautges 374aa768e4cSTim Tautges Level: beginner 375aa768e4cSTim Tautges 376aa768e4cSTim Tautges .keywords: DMMoab, create 377aa768e4cSTim Tautges @*/ 3781d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm) 3791d72bce8STim Tautges { 380032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 381032b8ab6SVijay Mahadevan 3821d72bce8STim Tautges PetscFunctionBegin; 3831d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3841cec0304SVijay Mahadevan PetscValidPointer(pcomm,2); 385032b8ab6SVijay Mahadevan dmmoab->pcomm = pcomm; 386032b8ab6SVijay Mahadevan dmmoab->mbiface = pcomm->get_moab(); 387032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 3881d72bce8STim Tautges PetscFunctionReturn(0); 3891d72bce8STim Tautges } 3901d72bce8STim Tautges 3911d72bce8STim Tautges 3921d72bce8STim Tautges #undef __FUNCT__ 3931d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm" 394aa768e4cSTim Tautges /*@ 395aa768e4cSTim Tautges DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab 396aa768e4cSTim Tautges 397aa768e4cSTim Tautges Collective on MPI_Comm 398aa768e4cSTim Tautges 399aa768e4cSTim Tautges Input Parameter: 400aa768e4cSTim Tautges . dm - The DMMoab object being set 401aa768e4cSTim Tautges 402aa768e4cSTim Tautges Output Parameter: 403aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 404aa768e4cSTim Tautges 405aa768e4cSTim Tautges Level: beginner 406aa768e4cSTim Tautges 407aa768e4cSTim Tautges .keywords: DMMoab, create 408aa768e4cSTim Tautges @*/ 4091d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm) 4101d72bce8STim Tautges { 4111d72bce8STim Tautges PetscFunctionBegin; 4121d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 413032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 4141d72bce8STim Tautges PetscFunctionReturn(0); 4151d72bce8STim Tautges } 4161d72bce8STim Tautges 4171d72bce8STim Tautges 4181d72bce8STim Tautges #undef __FUNCT__ 4191d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface" 420aa768e4cSTim Tautges /*@ 421aa768e4cSTim Tautges DMMoabSetInterface - Set the MOAB instance used with this DMMoab 422aa768e4cSTim Tautges 423aa768e4cSTim Tautges Collective on MPI_Comm 424aa768e4cSTim Tautges 425aa768e4cSTim Tautges Input Parameter: 426aa768e4cSTim Tautges . dm - The DMMoab object being set 427aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab 428aa768e4cSTim Tautges 429aa768e4cSTim Tautges Level: beginner 430aa768e4cSTim Tautges 431aa768e4cSTim Tautges .keywords: DMMoab, create 432aa768e4cSTim Tautges @*/ 433a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface) 4341d72bce8STim Tautges { 435032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 436032b8ab6SVijay Mahadevan 4371d72bce8STim Tautges PetscFunctionBegin; 4381d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4391cec0304SVijay Mahadevan PetscValidPointer(mbiface,2); 440032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 441032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 442032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 4431d72bce8STim Tautges PetscFunctionReturn(0); 4441d72bce8STim Tautges } 4451d72bce8STim Tautges 4461d72bce8STim Tautges 4471d72bce8STim Tautges #undef __FUNCT__ 4481d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface" 449aa768e4cSTim Tautges /*@ 450aa768e4cSTim Tautges DMMoabGetInterface - Get the MOAB instance used with this DMMoab 451aa768e4cSTim Tautges 452aa768e4cSTim Tautges Collective on MPI_Comm 453aa768e4cSTim Tautges 454aa768e4cSTim Tautges Input Parameter: 455aa768e4cSTim Tautges . dm - The DMMoab object being set 456aa768e4cSTim Tautges 457aa768e4cSTim Tautges Output Parameter: 458aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab 459aa768e4cSTim Tautges 460aa768e4cSTim Tautges Level: beginner 461aa768e4cSTim Tautges 462aa768e4cSTim Tautges .keywords: DMMoab, create 463aa768e4cSTim Tautges @*/ 464a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface) 4651d72bce8STim Tautges { 4669426e041SSatish Balay PetscErrorCode ierr; 467cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 468cabb514dSBarry Smith 4691d72bce8STim Tautges PetscFunctionBegin; 4701d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 471cabb514dSBarry 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); 472a4d2169cSTim Tautges *mbiface = ((DM_Moab*)dm->data)->mbiface; 4731d72bce8STim Tautges PetscFunctionReturn(0); 4741d72bce8STim Tautges } 4751d72bce8STim Tautges 4761d72bce8STim Tautges 4771d72bce8STim Tautges #undef __FUNCT__ 4785eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices" 479aa768e4cSTim Tautges /*@ 4805eb88e9dSVijay Mahadevan DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab 481aa768e4cSTim Tautges 482aa768e4cSTim Tautges Collective on MPI_Comm 483aa768e4cSTim Tautges 484aa768e4cSTim Tautges Input Parameter: 485aa768e4cSTim Tautges . dm - The DMMoab object being set 486aa768e4cSTim Tautges . range - The entities treated by this DMMoab 487aa768e4cSTim Tautges 488aa768e4cSTim Tautges Level: beginner 489aa768e4cSTim Tautges 490aa768e4cSTim Tautges .keywords: DMMoab, create 491aa768e4cSTim Tautges @*/ 4925eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range) 4931d72bce8STim Tautges { 494032b8ab6SVijay Mahadevan moab::ErrorCode merr; 495032b8ab6SVijay Mahadevan PetscErrorCode ierr; 496032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 497032b8ab6SVijay Mahadevan 4981d72bce8STim Tautges PetscFunctionBegin; 4991d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 500032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 501032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 502032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 503032b8ab6SVijay Mahadevan *dmmoab->vowned = *dmmoab->vlocal; 504032b8ab6SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 505032b8ab6SVijay Mahadevan *dmmoab->vghost = moab::subtract(*range, *dmmoab->vowned); 506032b8ab6SVijay Mahadevan dmmoab->nloc=dmmoab->vowned->size(); 507032b8ab6SVijay Mahadevan dmmoab->nghost=dmmoab->vghost->size(); 508032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 5091d72bce8STim Tautges PetscFunctionReturn(0); 5101d72bce8STim Tautges } 5111d72bce8STim Tautges 5121d72bce8STim Tautges 5131d72bce8STim Tautges #undef __FUNCT__ 5145eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices" 515aa768e4cSTim Tautges /*@ 5165eb88e9dSVijay Mahadevan DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab 517aa768e4cSTim Tautges 518aa768e4cSTim Tautges Collective on MPI_Comm 519aa768e4cSTim Tautges 520aa768e4cSTim Tautges Input Parameter: 521aa768e4cSTim Tautges . dm - The DMMoab object being set 522aa768e4cSTim Tautges 523aa768e4cSTim Tautges Output Parameter: 5245eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab 5255eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition 526aa768e4cSTim Tautges 527aa768e4cSTim Tautges Level: beginner 528aa768e4cSTim Tautges 529aa768e4cSTim Tautges .keywords: DMMoab, create 530aa768e4cSTim Tautges @*/ 5311cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,moab::Range *owned,moab::Range *ghost) 5321d72bce8STim Tautges { 5331d72bce8STim Tautges PetscFunctionBegin; 5341d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5351cec0304SVijay Mahadevan if (owned) *owned = *((DM_Moab*)dm->data)->vowned; 5361cec0304SVijay Mahadevan if (ghost) *ghost = *((DM_Moab*)dm->data)->vghost; 5371d72bce8STim Tautges PetscFunctionReturn(0); 5381d72bce8STim Tautges } 5391d72bce8STim Tautges 5401d72bce8STim Tautges #undef __FUNCT__ 5415eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements" 5425eb88e9dSVijay Mahadevan /*@ 5435eb88e9dSVijay Mahadevan DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned 5445eb88e9dSVijay Mahadevan 5455eb88e9dSVijay Mahadevan Collective on MPI_Comm 5465eb88e9dSVijay Mahadevan 5475eb88e9dSVijay Mahadevan Input Parameter: 5485eb88e9dSVijay Mahadevan . dm - The DMMoab object being set 5495eb88e9dSVijay Mahadevan 5505eb88e9dSVijay Mahadevan Output Parameter: 5515eb88e9dSVijay Mahadevan . range - The entities owned locally 5525eb88e9dSVijay Mahadevan 5535eb88e9dSVijay Mahadevan Level: beginner 5545eb88e9dSVijay Mahadevan 5555eb88e9dSVijay Mahadevan .keywords: DMMoab, create 5565eb88e9dSVijay Mahadevan @*/ 5571cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,moab::Range *range) 5585eb88e9dSVijay Mahadevan { 5595eb88e9dSVijay Mahadevan PetscFunctionBegin; 5605eb88e9dSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5611cec0304SVijay Mahadevan if (range) *range = *((DM_Moab*)dm->data)->elocal; 5621cec0304SVijay Mahadevan PetscFunctionReturn(0); 5631cec0304SVijay Mahadevan } 5641cec0304SVijay Mahadevan 5651cec0304SVijay Mahadevan 5661cec0304SVijay Mahadevan #undef __FUNCT__ 5671cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements" 5681cec0304SVijay Mahadevan /*@ 5691cec0304SVijay Mahadevan DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab 5701cec0304SVijay Mahadevan 5711cec0304SVijay Mahadevan Collective on MPI_Comm 5721cec0304SVijay Mahadevan 5731cec0304SVijay Mahadevan Input Parameter: 5741cec0304SVijay Mahadevan . dm - The DMMoab object being set 5751cec0304SVijay Mahadevan . range - The entities treated by this DMMoab 5761cec0304SVijay Mahadevan 5771cec0304SVijay Mahadevan Level: beginner 5781cec0304SVijay Mahadevan 5791cec0304SVijay Mahadevan .keywords: DMMoab, create 5801cec0304SVijay Mahadevan @*/ 5811cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range) 5821cec0304SVijay Mahadevan { 5831cec0304SVijay Mahadevan moab::ErrorCode merr; 5841cec0304SVijay Mahadevan PetscErrorCode ierr; 5851cec0304SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 5861cec0304SVijay Mahadevan 5871cec0304SVijay Mahadevan PetscFunctionBegin; 5881cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5891cec0304SVijay Mahadevan dmmoab->elocal->clear(); 5901cec0304SVijay Mahadevan dmmoab->eghost->clear(); 5911cec0304SVijay Mahadevan dmmoab->elocal->insert(range->begin(), range->end()); 5921cec0304SVijay Mahadevan PetscInfo2(dm, "Range size = %D; elocal size = %D.\n", range->size(), dmmoab->elocal->size()); 5931cec0304SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 5941cec0304SVijay Mahadevan *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal); 5951cec0304SVijay Mahadevan dmmoab->neleloc=dmmoab->elocal->size(); 5961cec0304SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 5971cec0304SVijay Mahadevan PetscInfo2(dm, "Created %D local and %D glocal elements.\n", dmmoab->neleloc, dmmoab->nele); 5985eb88e9dSVijay Mahadevan PetscFunctionReturn(0); 5995eb88e9dSVijay Mahadevan } 6005eb88e9dSVijay Mahadevan 6015eb88e9dSVijay Mahadevan 6025eb88e9dSVijay Mahadevan #undef __FUNCT__ 6031d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag" 604aa768e4cSTim Tautges /*@ 605aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 606aa768e4cSTim Tautges 607aa768e4cSTim Tautges Collective on MPI_Comm 608aa768e4cSTim Tautges 609aa768e4cSTim Tautges Input Parameter: 610aa768e4cSTim Tautges . dm - The DMMoab object being set 611aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 612aa768e4cSTim Tautges 613aa768e4cSTim Tautges Level: beginner 614aa768e4cSTim Tautges 615aa768e4cSTim Tautges .keywords: DMMoab, create 616aa768e4cSTim Tautges @*/ 6171d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag) 6181d72bce8STim Tautges { 6191d72bce8STim Tautges PetscFunctionBegin; 6201d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6211d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 6221d72bce8STim Tautges PetscFunctionReturn(0); 6231d72bce8STim Tautges } 6241d72bce8STim Tautges 6251d72bce8STim Tautges 6261d72bce8STim Tautges #undef __FUNCT__ 6271d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag" 628aa768e4cSTim Tautges /*@ 629aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 630aa768e4cSTim Tautges 631aa768e4cSTim Tautges Collective on MPI_Comm 632aa768e4cSTim Tautges 633aa768e4cSTim Tautges Input Parameter: 634aa768e4cSTim Tautges . dm - The DMMoab object being set 635aa768e4cSTim Tautges 636aa768e4cSTim Tautges Output Parameter: 637aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 638aa768e4cSTim Tautges 639aa768e4cSTim Tautges Level: beginner 640aa768e4cSTim Tautges 641aa768e4cSTim Tautges .keywords: DMMoab, create 642aa768e4cSTim Tautges @*/ 6431d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag) 6441d72bce8STim Tautges { 6451d72bce8STim Tautges PetscFunctionBegin; 6461d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6471d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 6481d72bce8STim Tautges PetscFunctionReturn(0); 6491d72bce8STim Tautges } 6501d72bce8STim Tautges 6511d72bce8STim Tautges 6521d72bce8STim Tautges #undef __FUNCT__ 6531d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize" 654aa768e4cSTim Tautges /*@ 655aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 656aa768e4cSTim Tautges 657aa768e4cSTim Tautges Collective on MPI_Comm 658aa768e4cSTim Tautges 659aa768e4cSTim Tautges Input Parameter: 660aa768e4cSTim Tautges . dm - The DMMoab object being set 661aa768e4cSTim Tautges . bs - The block size used with this DMMoab 662aa768e4cSTim Tautges 663aa768e4cSTim Tautges Level: beginner 664aa768e4cSTim Tautges 665aa768e4cSTim Tautges .keywords: DMMoab, create 666aa768e4cSTim Tautges @*/ 6671d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs) 6681d72bce8STim Tautges { 6691d72bce8STim Tautges PetscFunctionBegin; 6701d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6711d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 6721d72bce8STim Tautges PetscFunctionReturn(0); 6731d72bce8STim Tautges } 6741d72bce8STim Tautges 6751d72bce8STim Tautges 6761d72bce8STim Tautges #undef __FUNCT__ 6771d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize" 678aa768e4cSTim Tautges /*@ 679aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 680aa768e4cSTim Tautges 681aa768e4cSTim Tautges Collective on MPI_Comm 682aa768e4cSTim Tautges 683aa768e4cSTim Tautges Input Parameter: 684aa768e4cSTim Tautges . dm - The DMMoab object being set 685aa768e4cSTim Tautges 686aa768e4cSTim Tautges Output Parameter: 687aa768e4cSTim Tautges . bs - The block size used with this DMMoab 688aa768e4cSTim Tautges 689aa768e4cSTim Tautges Level: beginner 690aa768e4cSTim Tautges 691aa768e4cSTim Tautges .keywords: DMMoab, create 692aa768e4cSTim Tautges @*/ 6931d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs) 6941d72bce8STim Tautges { 6951d72bce8STim Tautges PetscFunctionBegin; 6961d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6971d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 6981d72bce8STim Tautges PetscFunctionReturn(0); 6991d72bce8STim Tautges } 7001d72bce8STim Tautges 7011cec0304SVijay Mahadevan 7021cec0304SVijay Mahadevan #undef __FUNCT__ 703212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetSize" 704212ad6d1SVijay Mahadevan /*@ 705212ad6d1SVijay Mahadevan DMMoabGetSize - Get the global vertex size used with this DMMoab 706212ad6d1SVijay Mahadevan 707212ad6d1SVijay Mahadevan Collective on MPI_Comm 708212ad6d1SVijay Mahadevan 709212ad6d1SVijay Mahadevan Input Parameter: 710212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 711212ad6d1SVijay Mahadevan 712212ad6d1SVijay Mahadevan Output Parameter: 713212ad6d1SVijay Mahadevan . ng - The global size of the DMMoab instance 714212ad6d1SVijay Mahadevan 715212ad6d1SVijay Mahadevan Level: beginner 716212ad6d1SVijay Mahadevan 717212ad6d1SVijay Mahadevan .keywords: DMMoab, create 718212ad6d1SVijay Mahadevan @*/ 719212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *ng) 720212ad6d1SVijay Mahadevan { 721212ad6d1SVijay Mahadevan PetscFunctionBegin; 722212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 723212ad6d1SVijay Mahadevan if(ng) *ng = ((DM_Moab*)dm->data)->n; 724212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 725212ad6d1SVijay Mahadevan } 726212ad6d1SVijay Mahadevan 727212ad6d1SVijay Mahadevan 728212ad6d1SVijay Mahadevan #undef __FUNCT__ 729212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalSize" 730212ad6d1SVijay Mahadevan /*@ 731212ad6d1SVijay Mahadevan DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab 732212ad6d1SVijay Mahadevan 733212ad6d1SVijay Mahadevan Collective on MPI_Comm 734212ad6d1SVijay Mahadevan 735212ad6d1SVijay Mahadevan Input Parameter: 736212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 737212ad6d1SVijay Mahadevan 738212ad6d1SVijay Mahadevan Output Parameter: 739212ad6d1SVijay Mahadevan . nl - The local size of the DMMoab instance 740212ad6d1SVijay Mahadevan . ng - The ghosted size of the DMMoab instance 741212ad6d1SVijay Mahadevan 742212ad6d1SVijay Mahadevan Level: beginner 743212ad6d1SVijay Mahadevan 744212ad6d1SVijay Mahadevan .keywords: DMMoab, create 745212ad6d1SVijay Mahadevan @*/ 746212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nl,PetscInt *ng) 747212ad6d1SVijay Mahadevan { 748212ad6d1SVijay Mahadevan PetscFunctionBegin; 749212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 750212ad6d1SVijay Mahadevan if(nl) *nl = ((DM_Moab*)dm->data)->nloc; 751212ad6d1SVijay Mahadevan if(ng) *ng = ((DM_Moab*)dm->data)->nghost; 752212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 753212ad6d1SVijay Mahadevan } 754212ad6d1SVijay Mahadevan 755212ad6d1SVijay Mahadevan 756212ad6d1SVijay Mahadevan #undef __FUNCT__ 7571cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldVector" 7581cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec) 7591cec0304SVijay Mahadevan { 7601cec0304SVijay Mahadevan DM_Moab *dmmoab; 7611cec0304SVijay Mahadevan moab::Tag vtag,ntag; 762212ad6d1SVijay Mahadevan const PetscScalar *varray; 763212ad6d1SVijay Mahadevan PetscScalar *farray; 7641cec0304SVijay Mahadevan moab::ErrorCode merr; 7651cec0304SVijay Mahadevan PetscErrorCode ierr; 7661cec0304SVijay Mahadevan PetscInt doff; 7671cec0304SVijay Mahadevan std::string tag_name; 7681cec0304SVijay Mahadevan moab::Range::iterator iter; 7691cec0304SVijay Mahadevan 7701cec0304SVijay Mahadevan PetscFunctionBegin; 7711cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7721cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7731cec0304SVijay Mahadevan 7741cec0304SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 7751cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag, 7761cec0304SVijay Mahadevan moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr); 7771cec0304SVijay Mahadevan 7781cec0304SVijay Mahadevan ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr); 7791cec0304SVijay Mahadevan 7801cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name); 7811cec0304SVijay Mahadevan if (!tag_name.length() && merr !=moab::MB_SUCCESS) { 782212ad6d1SVijay Mahadevan ierr = VecGetArrayRead(fvec,&varray);CHKERRQ(ierr); 783212ad6d1SVijay Mahadevan 7841cec0304SVijay Mahadevan for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) { 7851cec0304SVijay Mahadevan moab::EntityHandle vtx = (*iter); 7861cec0304SVijay Mahadevan 7871cec0304SVijay Mahadevan /* get field dof index */ 788212ad6d1SVijay Mahadevan ierr = DMMoabGetFieldDof(dm, vtx, ifield, &doff); 7891cec0304SVijay Mahadevan 7901cec0304SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */ 7911cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, &vtx, 1, (const void*)&varray[doff]);MBERRNM(merr); 7921cec0304SVijay Mahadevan } 793212ad6d1SVijay Mahadevan ierr = VecRestoreArrayRead(fvec,&varray);CHKERRQ(ierr); 7941cec0304SVijay Mahadevan } 7951cec0304SVijay Mahadevan else { 796212ad6d1SVijay Mahadevan ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&farray);CHKERRQ(ierr); 7971cec0304SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 798212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)farray);MBERRNM(merr); 799212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr); 8001cec0304SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 8011cec0304SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr); 802212ad6d1SVijay Mahadevan ierr = PetscFree(farray);CHKERRQ(ierr); 803212ad6d1SVijay Mahadevan } 804212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 805212ad6d1SVijay Mahadevan } 806212ad6d1SVijay Mahadevan 807212ad6d1SVijay Mahadevan 808212ad6d1SVijay Mahadevan #undef __FUNCT__ 809212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabSetGlobalFieldVector" 810212ad6d1SVijay Mahadevan PetscErrorCode DMMoabSetGlobalFieldVector(DM dm, Vec fvec) 811212ad6d1SVijay Mahadevan { 812212ad6d1SVijay Mahadevan DM_Moab *dmmoab; 813212ad6d1SVijay Mahadevan moab::Tag vtag,ntag; 814212ad6d1SVijay Mahadevan const PetscScalar *varray; 815212ad6d1SVijay Mahadevan PetscScalar *farray; 816212ad6d1SVijay Mahadevan moab::ErrorCode merr; 817212ad6d1SVijay Mahadevan PetscErrorCode ierr; 818212ad6d1SVijay Mahadevan PetscSection section; 819212ad6d1SVijay Mahadevan PetscInt i,doff,ifield; 820212ad6d1SVijay Mahadevan std::string tag_name; 821212ad6d1SVijay Mahadevan moab::Range::iterator iter; 822212ad6d1SVijay Mahadevan 823212ad6d1SVijay Mahadevan PetscFunctionBegin; 824212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 825212ad6d1SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 826212ad6d1SVijay Mahadevan 827212ad6d1SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 828212ad6d1SVijay Mahadevan 829212ad6d1SVijay Mahadevan /* get the Tag corresponding to the global vector - possible that there is no tag associated.. */ 830212ad6d1SVijay Mahadevan ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr); 831212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name); 832212ad6d1SVijay Mahadevan if (!tag_name.length() && merr !=moab::MB_SUCCESS) { 833212ad6d1SVijay Mahadevan /* not a MOAB vector - use VecGetSubVector to get the parts as needed */ 834212ad6d1SVijay Mahadevan 835212ad6d1SVijay Mahadevan ierr = VecGetArrayRead(fvec,&varray);CHKERRQ(ierr); 836212ad6d1SVijay Mahadevan for (ifield=0; ifield<dmmoab->nfields; ++ifield) { 837212ad6d1SVijay Mahadevan 838212ad6d1SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 839212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag, 840212ad6d1SVijay Mahadevan moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr); 841212ad6d1SVijay Mahadevan 842212ad6d1SVijay Mahadevan for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) { 843212ad6d1SVijay Mahadevan moab::EntityHandle vtx = (*iter); 844212ad6d1SVijay Mahadevan 845212ad6d1SVijay Mahadevan /* get field dof index */ 846212ad6d1SVijay Mahadevan ierr = DMMoabGetFieldDof(dm, vtx, ifield, &doff); 847212ad6d1SVijay Mahadevan 848212ad6d1SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */ 849212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, &vtx, 1, (const void*)&varray[doff]);MBERRNM(merr); 850212ad6d1SVijay Mahadevan } 851212ad6d1SVijay Mahadevan } 852212ad6d1SVijay Mahadevan ierr = VecRestoreArrayRead(fvec,&varray);CHKERRQ(ierr); 853212ad6d1SVijay Mahadevan } 854212ad6d1SVijay Mahadevan else { 855212ad6d1SVijay Mahadevan ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&farray);CHKERRQ(ierr); 856212ad6d1SVijay Mahadevan ierr = PetscMalloc(dmmoab->nloc*dmmoab->bs*sizeof(PetscScalar),&varray);CHKERRQ(ierr); 857212ad6d1SVijay Mahadevan 858212ad6d1SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 859212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray);MBERRNM(merr); 860212ad6d1SVijay Mahadevan for (ifield=0; ifield<dmmoab->nfields; ++ifield) { 861212ad6d1SVijay Mahadevan 862212ad6d1SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 863212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag, 864212ad6d1SVijay Mahadevan moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr); 865212ad6d1SVijay Mahadevan 866212ad6d1SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 867212ad6d1SVijay Mahadevan for(i=0; i < dmmoab->nloc; i++) { 868212ad6d1SVijay Mahadevan farray[i] = varray[i*dmmoab->bs+ifield]; 869212ad6d1SVijay Mahadevan } 870212ad6d1SVijay Mahadevan 871212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr); 872212ad6d1SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 873212ad6d1SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr); 874212ad6d1SVijay Mahadevan } 875212ad6d1SVijay Mahadevan ierr = PetscFree(farray);CHKERRQ(ierr); 8761cec0304SVijay Mahadevan ierr = PetscFree(varray);CHKERRQ(ierr); 8771cec0304SVijay Mahadevan } 8781cec0304SVijay Mahadevan PetscFunctionReturn(0); 8791cec0304SVijay Mahadevan } 8801cec0304SVijay Mahadevan 8811cec0304SVijay Mahadevan 882212ad6d1SVijay Mahadevan 8831cec0304SVijay Mahadevan #undef __FUNCT__ 8847023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates" 8857023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos) 8867023aa44SVijay Mahadevan { 8877023aa44SVijay Mahadevan DM_Moab *dmmoab; 8887023aa44SVijay Mahadevan PetscErrorCode ierr; 8897023aa44SVijay Mahadevan moab::ErrorCode merr; 8907023aa44SVijay Mahadevan 8917023aa44SVijay Mahadevan PetscFunctionBegin; 8927023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8937023aa44SVijay Mahadevan PetscValidPointer(conn,3); 8947023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8957023aa44SVijay Mahadevan 8967023aa44SVijay Mahadevan if (!vpos) { 8977023aa44SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr); 8987023aa44SVijay Mahadevan } 8997023aa44SVijay Mahadevan 9007023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 9017023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr); 9027023aa44SVijay Mahadevan PetscFunctionReturn(0); 9037023aa44SVijay Mahadevan } 9047023aa44SVijay Mahadevan 9057023aa44SVijay Mahadevan 9067023aa44SVijay Mahadevan #undef __FUNCT__ 9077023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity" 9087023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn) 9097023aa44SVijay Mahadevan { 9107023aa44SVijay Mahadevan DM_Moab *dmmoab; 9117023aa44SVijay Mahadevan const moab::EntityHandle *connect; 9127023aa44SVijay Mahadevan moab::ErrorCode merr; 9137023aa44SVijay Mahadevan PetscInt nnodes; 9147023aa44SVijay Mahadevan 9157023aa44SVijay Mahadevan PetscFunctionBegin; 9167023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 9177023aa44SVijay Mahadevan PetscValidPointer(conn,4); 9187023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 9197023aa44SVijay Mahadevan 9207023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 9217023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr); 9227023aa44SVijay Mahadevan if (conn) *conn=connect; 9237023aa44SVijay Mahadevan if (nconn) *nconn=nnodes; 9247023aa44SVijay Mahadevan PetscFunctionReturn(0); 9257023aa44SVijay Mahadevan } 9267023aa44SVijay Mahadevan 9277023aa44SVijay Mahadevan 9287023aa44SVijay Mahadevan #undef __FUNCT__ 92969263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary" 93069263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary) 93169263071SVijay Mahadevan { 93269263071SVijay Mahadevan moab::EntityType etype; 93369263071SVijay Mahadevan DM_Moab *dmmoab; 93469263071SVijay Mahadevan PetscInt edim; 93569263071SVijay Mahadevan 93669263071SVijay Mahadevan PetscFunctionBegin; 93769263071SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 93869263071SVijay Mahadevan PetscValidPointer(ent_on_boundary,3); 93969263071SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 94069263071SVijay Mahadevan 94169263071SVijay Mahadevan /* get the entity type and handle accordingly */ 94269263071SVijay Mahadevan etype=dmmoab->mbiface->type_from_handle(ent); 94369263071SVijay 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); 94469263071SVijay Mahadevan 94569263071SVijay Mahadevan /* get the entity dimension */ 94669263071SVijay Mahadevan edim=dmmoab->mbiface->dimension_from_handle(ent); 94769263071SVijay Mahadevan 94869263071SVijay Mahadevan *ent_on_boundary=PETSC_FALSE; 94969263071SVijay Mahadevan if(etype == moab::MBVERTEX && edim == 0) { 95069263071SVijay Mahadevan moab::Range::const_iterator giter = dmmoab->bndyvtx->find(ent); 95169263071SVijay Mahadevan if (giter != dmmoab->bndyvtx->end()) *ent_on_boundary=PETSC_TRUE; 95269263071SVijay Mahadevan } 95369263071SVijay Mahadevan else { 95469263071SVijay Mahadevan if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */ 95569263071SVijay Mahadevan moab::Range::const_iterator geiter = dmmoab->bndyelems->find(ent); 95669263071SVijay Mahadevan if (geiter != dmmoab->bndyelems->end()) *ent_on_boundary=PETSC_TRUE; 95769263071SVijay Mahadevan } 95869263071SVijay Mahadevan else { /* next check the lower-dimensional faces */ 95969263071SVijay Mahadevan moab::Range::const_iterator gfiter = dmmoab->bndyfaces->find(ent); 96069263071SVijay Mahadevan if (gfiter != dmmoab->bndyfaces->end()) *ent_on_boundary=PETSC_TRUE; 96169263071SVijay Mahadevan } 96269263071SVijay Mahadevan } 96369263071SVijay Mahadevan PetscFunctionReturn(0); 96469263071SVijay Mahadevan } 96569263071SVijay Mahadevan 96669263071SVijay Mahadevan 96769263071SVijay Mahadevan #undef __FUNCT__ 9687023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices" 96969263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx) 9707023aa44SVijay Mahadevan { 9717023aa44SVijay Mahadevan DM_Moab *dmmoab; 9727023aa44SVijay Mahadevan PetscInt i; 9737023aa44SVijay Mahadevan 9747023aa44SVijay Mahadevan PetscFunctionBegin; 9757023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 9767023aa44SVijay Mahadevan PetscValidPointer(cnt,3); 9777023aa44SVijay Mahadevan PetscValidPointer(isbdvtx,4); 9787023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 9797023aa44SVijay Mahadevan 9807023aa44SVijay Mahadevan for (i=0; i < nconn; ++i) { 9817023aa44SVijay Mahadevan moab::Range::const_iterator giter = dmmoab->bndyvtx->find(cnt[i]); 98269263071SVijay Mahadevan if (giter != dmmoab->bndyvtx->end()) isbdvtx[i] = PETSC_TRUE; 9837023aa44SVijay Mahadevan else isbdvtx[i] = PETSC_FALSE; 9847023aa44SVijay Mahadevan } 9857023aa44SVijay Mahadevan PetscFunctionReturn(0); 9867023aa44SVijay Mahadevan } 9877023aa44SVijay Mahadevan 9887023aa44SVijay Mahadevan 9897023aa44SVijay Mahadevan #undef __FUNCT__ 9901cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryEntities" 99169263071SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryEntities(DM dm,moab::Range *bdvtx,moab::Range* bdfaces,moab::Range* bdelems) 9921cec0304SVijay Mahadevan { 9931cec0304SVijay Mahadevan DM_Moab *dmmoab; 9941cec0304SVijay Mahadevan 9951cec0304SVijay Mahadevan PetscFunctionBegin; 9961cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 9971cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 9981cec0304SVijay Mahadevan 9991cec0304SVijay Mahadevan if (bdvtx) *bdvtx = *dmmoab->bndyvtx; 10001cec0304SVijay Mahadevan if (bdfaces) *bdfaces = *dmmoab->bndyfaces; 100169263071SVijay Mahadevan if (bdelems) *bdfaces = *dmmoab->bndyelems; 10021cec0304SVijay Mahadevan PetscFunctionReturn(0); 10031cec0304SVijay Mahadevan } 10041cec0304SVijay Mahadevan 10051cec0304SVijay Mahadevan 10061cec0304SVijay Mahadevan #undef __FUNCT__ 10071cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFields" 10081cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFields(DM dm,PetscInt nfields,const char** fields) 10091cec0304SVijay Mahadevan { 10101cec0304SVijay Mahadevan DM_Moab *dmmoab; 10111cec0304SVijay Mahadevan 10121cec0304SVijay Mahadevan PetscFunctionBegin; 10131cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 10141cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 10151cec0304SVijay Mahadevan 10161cec0304SVijay Mahadevan dmmoab->fields = fields; 10171cec0304SVijay Mahadevan dmmoab->nfields = nfields; 10181cec0304SVijay Mahadevan PetscFunctionReturn(0); 10191cec0304SVijay Mahadevan } 10201cec0304SVijay Mahadevan 10211cec0304SVijay Mahadevan 10221cec0304SVijay Mahadevan #undef __FUNCT__ 10231cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDof" 10241cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof) 10251cec0304SVijay Mahadevan { 10261cec0304SVijay Mahadevan PetscSection section; 1027fc418013SVijay Mahadevan PetscInt gid; 10281cec0304SVijay Mahadevan PetscErrorCode ierr; 1029fc418013SVijay Mahadevan moab::ErrorCode merr; 1030fc418013SVijay Mahadevan DM_Moab *dmmoab; 10311cec0304SVijay Mahadevan 10321cec0304SVijay Mahadevan PetscFunctionBegin; 10331cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1034fc418013SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1035fc418013SVijay Mahadevan 10361cec0304SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 1037fc418013SVijay Mahadevan 1038fc418013SVijay Mahadevan /* first get the global ID for the point */ 1039fc418013SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,&point,1,&gid);MBERRNM(merr); 1040fc418013SVijay Mahadevan 1041fc418013SVijay Mahadevan /* get the dof value for the field */ 1042fc418013SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, gid, field, dof);CHKERRQ(ierr); 10431cec0304SVijay Mahadevan PetscFunctionReturn(0); 10441cec0304SVijay Mahadevan } 10451cec0304SVijay Mahadevan 10461cec0304SVijay Mahadevan 10471cec0304SVijay Mahadevan #undef __FUNCT__ 10481cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofs" 10491cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof) 10501cec0304SVijay Mahadevan { 1051fc418013SVijay Mahadevan PetscInt i,gid; 10521cec0304SVijay Mahadevan PetscSection section; 10531cec0304SVijay Mahadevan PetscErrorCode ierr; 1054fc418013SVijay Mahadevan moab::ErrorCode merr; 1055fc418013SVijay Mahadevan DM_Moab *dmmoab; 10561cec0304SVijay Mahadevan 10571cec0304SVijay Mahadevan PetscFunctionBegin; 10581cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1059*324f1edfSVijay Mahadevan PetscValidPointer(points,2); 1060fc418013SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1061fc418013SVijay Mahadevan 10621cec0304SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 10631cec0304SVijay Mahadevan if (!dof) { 10641cec0304SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr); 10651cec0304SVijay Mahadevan } 1066fc418013SVijay Mahadevan 1067fc418013SVijay Mahadevan /* first get the local indices */ 1068fc418013SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,points,npoints,dof);MBERRNM(merr); 1069fc418013SVijay Mahadevan 10701cec0304SVijay Mahadevan for (i=0; i<npoints; ++i) { 1071fc418013SVijay Mahadevan gid=dof[i]; 1072fc418013SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, gid, field, &dof[i]);CHKERRQ(ierr); 10731cec0304SVijay Mahadevan } 10741cec0304SVijay Mahadevan PetscFunctionReturn(0); 10751cec0304SVijay Mahadevan } 10761cec0304SVijay Mahadevan 10771cec0304SVijay Mahadevan 1078fc418013SVijay Mahadevan #undef __FUNCT__ 1079212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofsLocal" 1080212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof) 1081eb9d2429SVijay Mahadevan { 1082eb9d2429SVijay Mahadevan PetscInt i,offset; 1083eb9d2429SVijay Mahadevan PetscErrorCode ierr; 1084eb9d2429SVijay Mahadevan DM_Moab *dmmoab; 1085eb9d2429SVijay Mahadevan 1086eb9d2429SVijay Mahadevan PetscFunctionBegin; 1087eb9d2429SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1088*324f1edfSVijay Mahadevan PetscValidPointer(points,2); 1089eb9d2429SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1090eb9d2429SVijay Mahadevan 1091eb9d2429SVijay Mahadevan if (!dof) { 1092eb9d2429SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr); 1093eb9d2429SVijay Mahadevan } 1094eb9d2429SVijay Mahadevan 1095eb9d2429SVijay Mahadevan if (dmmoab->bs > 1) { 1096eb9d2429SVijay Mahadevan for (i=0; i<npoints; ++i) 1097eb9d2429SVijay Mahadevan dof[i] = (points[i]-1)*dmmoab->bs+field; 1098eb9d2429SVijay Mahadevan } 1099eb9d2429SVijay Mahadevan else { 1100eb9d2429SVijay Mahadevan offset = field*dmmoab->n; /* assume all fields have equal distribution */ 1101eb9d2429SVijay Mahadevan for (i=0; i<npoints; ++i) 1102eb9d2429SVijay Mahadevan dof[i] = offset+points[i]-1; 1103eb9d2429SVijay Mahadevan } 1104eb9d2429SVijay Mahadevan PetscFunctionReturn(0); 1105eb9d2429SVijay Mahadevan } 1106eb9d2429SVijay Mahadevan 1107eb9d2429SVijay Mahadevan 1108eb9d2429SVijay Mahadevan #undef __FUNCT__ 1109212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofs" 1110212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 1111212ad6d1SVijay Mahadevan { 1112212ad6d1SVijay Mahadevan PetscInt i,f,gid; 1113212ad6d1SVijay Mahadevan PetscSection section; 1114212ad6d1SVijay Mahadevan PetscErrorCode ierr; 1115212ad6d1SVijay Mahadevan moab::ErrorCode merr; 1116212ad6d1SVijay Mahadevan DM_Moab *dmmoab; 1117212ad6d1SVijay Mahadevan 1118212ad6d1SVijay Mahadevan PetscFunctionBegin; 1119212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1120*324f1edfSVijay Mahadevan PetscValidPointer(points,2); 1121212ad6d1SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1122212ad6d1SVijay Mahadevan 1123212ad6d1SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 1124212ad6d1SVijay Mahadevan if (!dof) { 1125212ad6d1SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*dmmoab->nfields*npoints, &dof);CHKERRQ(ierr); 1126212ad6d1SVijay Mahadevan } 1127212ad6d1SVijay Mahadevan 1128212ad6d1SVijay Mahadevan /* first get the local indices */ 1129212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,points,npoints,dof);MBERRNM(merr); 1130212ad6d1SVijay Mahadevan 1131212ad6d1SVijay Mahadevan for (i=0; i<npoints; ++i) { 1132212ad6d1SVijay Mahadevan gid=dof[i]; 1133212ad6d1SVijay Mahadevan for (f=0; f<dmmoab->nfields; ++f) { 1134212ad6d1SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, gid, f, &dof[i*dmmoab->nfields+f]);CHKERRQ(ierr); 1135212ad6d1SVijay Mahadevan } 1136212ad6d1SVijay Mahadevan } 1137212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 1138212ad6d1SVijay Mahadevan } 1139212ad6d1SVijay Mahadevan 1140212ad6d1SVijay Mahadevan 1141212ad6d1SVijay Mahadevan #undef __FUNCT__ 1142212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsLocal" 1143212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 1144212ad6d1SVijay Mahadevan { 1145212ad6d1SVijay Mahadevan PetscInt i,f,offset; 1146212ad6d1SVijay Mahadevan PetscErrorCode ierr; 1147212ad6d1SVijay Mahadevan DM_Moab *dmmoab; 1148212ad6d1SVijay Mahadevan 1149212ad6d1SVijay Mahadevan PetscFunctionBegin; 1150212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1151*324f1edfSVijay Mahadevan PetscValidPointer(points,2); 1152212ad6d1SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1153212ad6d1SVijay Mahadevan 1154212ad6d1SVijay Mahadevan if (!dof) { 1155212ad6d1SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*dmmoab->nfields*npoints, &dof);CHKERRQ(ierr); 1156212ad6d1SVijay Mahadevan } 1157212ad6d1SVijay Mahadevan 1158212ad6d1SVijay Mahadevan if (dmmoab->bs > 1) { 1159212ad6d1SVijay Mahadevan for (f=0; f<dmmoab->nfields; ++f) 1160212ad6d1SVijay Mahadevan for (i=0; i<npoints; ++i) 1161212ad6d1SVijay Mahadevan dof[i*dmmoab->nfields+f] = (points[i]-1)*dmmoab->bs+f; 1162212ad6d1SVijay Mahadevan } 1163212ad6d1SVijay Mahadevan else { 1164212ad6d1SVijay Mahadevan for (f=0; f<dmmoab->nfields; ++f) { 1165212ad6d1SVijay Mahadevan offset = f*dmmoab->n; /* assume all fields have equal distribution - say all vertex based */ 1166212ad6d1SVijay Mahadevan for (i=0; i<npoints; ++i) 1167212ad6d1SVijay Mahadevan dof[i*dmmoab->nfields+f] = offset+points[i]-1; 1168212ad6d1SVijay Mahadevan } 1169212ad6d1SVijay Mahadevan } 1170212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 1171212ad6d1SVijay Mahadevan } 1172212ad6d1SVijay Mahadevan 1173212ad6d1SVijay Mahadevan 1174212ad6d1SVijay Mahadevan #undef __FUNCT__ 1175212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlocked" 1176212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlocked(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 1177212ad6d1SVijay Mahadevan { 1178212ad6d1SVijay Mahadevan PetscInt i,gid,dofindx; 1179212ad6d1SVijay Mahadevan PetscSection section; 1180212ad6d1SVijay Mahadevan PetscErrorCode ierr; 1181212ad6d1SVijay Mahadevan moab::ErrorCode merr; 1182212ad6d1SVijay Mahadevan DM_Moab *dmmoab; 1183212ad6d1SVijay Mahadevan 1184212ad6d1SVijay Mahadevan PetscFunctionBegin; 1185212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1186*324f1edfSVijay Mahadevan PetscValidPointer(points,2); 1187212ad6d1SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1188212ad6d1SVijay Mahadevan 1189212ad6d1SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 1190212ad6d1SVijay Mahadevan if (!dof) { 1191212ad6d1SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr); 1192212ad6d1SVijay Mahadevan } 1193212ad6d1SVijay Mahadevan 1194212ad6d1SVijay Mahadevan /* first get the local indices */ 1195212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,points,npoints,dof);MBERRNM(merr); 1196212ad6d1SVijay Mahadevan 1197212ad6d1SVijay Mahadevan for (i=0; i<npoints; ++i) { 1198212ad6d1SVijay Mahadevan gid=dof[i]; 1199212ad6d1SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, gid, 0, &dofindx);CHKERRQ(ierr); 1200212ad6d1SVijay Mahadevan if (dmmoab->bs > 1) dof[i]=dofindx/dmmoab->bs; 1201212ad6d1SVijay Mahadevan else dof[i]=dofindx; 1202212ad6d1SVijay Mahadevan } 1203212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 1204212ad6d1SVijay Mahadevan } 1205212ad6d1SVijay Mahadevan 1206212ad6d1SVijay Mahadevan 1207212ad6d1SVijay Mahadevan #undef __FUNCT__ 1208212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlockedLocal" 1209212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 1210212ad6d1SVijay Mahadevan { 1211212ad6d1SVijay Mahadevan PetscInt i; 1212212ad6d1SVijay Mahadevan PetscErrorCode ierr; 1213212ad6d1SVijay Mahadevan 1214212ad6d1SVijay Mahadevan PetscFunctionBegin; 1215212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1216*324f1edfSVijay Mahadevan PetscValidPointer(points,2); 1217212ad6d1SVijay Mahadevan 1218212ad6d1SVijay Mahadevan if (!dof) { 1219212ad6d1SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr); 1220212ad6d1SVijay Mahadevan } 1221212ad6d1SVijay Mahadevan 1222212ad6d1SVijay Mahadevan for (i=0; i<npoints; ++i) 1223212ad6d1SVijay Mahadevan dof[i] = points[i]-1; 1224212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 1225212ad6d1SVijay Mahadevan } 1226212ad6d1SVijay Mahadevan 1227212ad6d1SVijay Mahadevan #undef __FUNCT__ 1228fc418013SVijay Mahadevan #define __FUNCT__ "DMMoab_GetWriteOptions_Private" 1229fc418013SVijay Mahadevan PetscErrorCode DMMoab_GetWriteOptions_Private(PetscInt fsetid, PetscInt numproc, PetscInt dim, MoabWriteMode mode, PetscInt dbglevel, const char* extra_opts, const char** write_opts) 1230fc418013SVijay Mahadevan { 1231fc418013SVijay Mahadevan std::ostringstream str; 1232fc418013SVijay Mahadevan 1233fc418013SVijay Mahadevan PetscFunctionBegin; 1234fc418013SVijay Mahadevan 1235fc418013SVijay Mahadevan // do parallel read unless only one processor 1236fc418013SVijay Mahadevan if (numproc > 1) { 1237fc418013SVijay Mahadevan str << "PARALLEL=" << mode << ";"; 1238fc418013SVijay Mahadevan if (fsetid>=0) str << "PARALLEL_COMM=" << fsetid << ";"; 1239fc418013SVijay Mahadevan } 1240fc418013SVijay Mahadevan 1241fc418013SVijay Mahadevan if (dbglevel) 1242fc418013SVijay Mahadevan str << "CPUTIME;DEBUG_IO=" << dbglevel << ";"; 1243fc418013SVijay Mahadevan 1244fc418013SVijay Mahadevan if (extra_opts) 1245fc418013SVijay Mahadevan str << extra_opts ; 1246fc418013SVijay Mahadevan 1247fc418013SVijay Mahadevan *write_opts = str.str().c_str(); 1248fc418013SVijay Mahadevan PetscFunctionReturn(0); 1249fc418013SVijay Mahadevan } 1250fc418013SVijay Mahadevan 1251fc418013SVijay Mahadevan 1252fc418013SVijay Mahadevan #undef __FUNCT__ 1253fc418013SVijay Mahadevan #define __FUNCT__ "DMMoabOutput" 1254fc418013SVijay Mahadevan PetscErrorCode DMMoabOutput(DM dm,const char* filename,const char* usrwriteopts) 1255fc418013SVijay Mahadevan { 1256fc418013SVijay Mahadevan DM_Moab *dmmoab; 1257fc418013SVijay Mahadevan PetscInt dbglevel=0; 1258fc418013SVijay Mahadevan const char *writeopts; 1259fc418013SVijay Mahadevan 1260fc418013SVijay Mahadevan PetscErrorCode ierr; 1261fc418013SVijay Mahadevan moab::ErrorCode merr; 1262fc418013SVijay Mahadevan 1263fc418013SVijay Mahadevan PetscFunctionBegin; 1264fc418013SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1265fc418013SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1266fc418013SVijay Mahadevan 1267fc418013SVijay Mahadevan PetscBarrier((PetscObject)dm); 1268fc418013SVijay Mahadevan 1269fc418013SVijay Mahadevan /* TODO: Use command-line options to control by_rank, verbosity, MoabReadMode and extra options */ 1270fc418013SVijay Mahadevan ierr = PetscOptionsBegin(PETSC_COMM_WORLD, "", "Options for reading/writing MOAB based meshes from file", "DMMoab"); 1271fc418013SVijay Mahadevan ierr = PetscOptionsInt("-dmmb_rw_dbg", "The verbosity level for reading and writing MOAB meshes", "dmmbutil.cxx", dbglevel, &dbglevel, NULL);CHKERRQ(ierr); 1272fc418013SVijay Mahadevan ierr = PetscOptionsEnd(); 1273fc418013SVijay Mahadevan 1274fc418013SVijay Mahadevan /* add mesh loading options specific to the DM */ 1275fc418013SVijay Mahadevan ierr = DMMoab_GetWriteOptions_Private(dmmoab->pcomm->get_id(), dmmoab->pcomm->size(), dmmoab->dim, MOAB_PARWOPTS_WRITE_PART, dbglevel, usrwriteopts, &writeopts);CHKERRQ(ierr); 1276fc418013SVijay Mahadevan PetscInfo2(dm, "Writing file %s with options: %s\n",filename,writeopts); 1277fc418013SVijay Mahadevan 1278fc418013SVijay Mahadevan /* output file, using parallel write */ 1279fc418013SVijay Mahadevan merr = dmmoab->mbiface->write_file(filename, NULL, writeopts, &dmmoab->fileset, 1);MBERRVM(dmmoab->mbiface,"Writing output of DMMoab failed.",merr); 1280fc418013SVijay Mahadevan PetscFunctionReturn(0); 1281fc418013SVijay Mahadevan } 1282fc418013SVijay Mahadevan 1283