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; 226324f1edfSVijay 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; 346324f1edfSVijay 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__ 757*4920ab11SVijay Mahadevan #define __FUNCT__ "DMMoabGetDimension" 758*4920ab11SVijay Mahadevan /*@ 759*4920ab11SVijay Mahadevan DMMoabGetDimension - Get the dimension of the DM Mesh 760*4920ab11SVijay Mahadevan 761*4920ab11SVijay Mahadevan Collective on MPI_Comm 762*4920ab11SVijay Mahadevan 763*4920ab11SVijay Mahadevan Input Parameter: 764*4920ab11SVijay Mahadevan . dm - The DMMoab object being set 765*4920ab11SVijay Mahadevan 766*4920ab11SVijay Mahadevan Output Parameter: 767*4920ab11SVijay Mahadevan . dim - The dimension of DM 768*4920ab11SVijay Mahadevan 769*4920ab11SVijay Mahadevan Level: beginner 770*4920ab11SVijay Mahadevan 771*4920ab11SVijay Mahadevan .keywords: DMMoab, create 772*4920ab11SVijay Mahadevan @*/ 773*4920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim) 774*4920ab11SVijay Mahadevan { 775*4920ab11SVijay Mahadevan PetscFunctionBegin; 776*4920ab11SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 777*4920ab11SVijay Mahadevan *dim = ((DM_Moab*)dm->data)->dim; 778*4920ab11SVijay Mahadevan PetscFunctionReturn(0); 779*4920ab11SVijay Mahadevan } 780*4920ab11SVijay Mahadevan 781*4920ab11SVijay Mahadevan 782*4920ab11SVijay Mahadevan 783*4920ab11SVijay Mahadevan #undef __FUNCT__ 7841cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldVector" 7851cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec) 7861cec0304SVijay Mahadevan { 7871cec0304SVijay Mahadevan DM_Moab *dmmoab; 7881cec0304SVijay Mahadevan moab::Tag vtag,ntag; 789212ad6d1SVijay Mahadevan const PetscScalar *varray; 790212ad6d1SVijay Mahadevan PetscScalar *farray; 7911cec0304SVijay Mahadevan moab::ErrorCode merr; 7921cec0304SVijay Mahadevan PetscErrorCode ierr; 7931cec0304SVijay Mahadevan PetscInt doff; 7941cec0304SVijay Mahadevan std::string tag_name; 7951cec0304SVijay Mahadevan moab::Range::iterator iter; 7961cec0304SVijay Mahadevan 7971cec0304SVijay Mahadevan PetscFunctionBegin; 7981cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7991cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8001cec0304SVijay Mahadevan 8011cec0304SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 8021cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag, 8031cec0304SVijay Mahadevan moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr); 8041cec0304SVijay Mahadevan 8051cec0304SVijay Mahadevan ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr); 8061cec0304SVijay Mahadevan 8071cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name); 8081cec0304SVijay Mahadevan if (!tag_name.length() && merr !=moab::MB_SUCCESS) { 809212ad6d1SVijay Mahadevan ierr = VecGetArrayRead(fvec,&varray);CHKERRQ(ierr); 810212ad6d1SVijay Mahadevan 8111cec0304SVijay Mahadevan for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) { 8121cec0304SVijay Mahadevan moab::EntityHandle vtx = (*iter); 8131cec0304SVijay Mahadevan 8141cec0304SVijay Mahadevan /* get field dof index */ 815212ad6d1SVijay Mahadevan ierr = DMMoabGetFieldDof(dm, vtx, ifield, &doff); 8161cec0304SVijay Mahadevan 8171cec0304SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */ 8181cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, &vtx, 1, (const void*)&varray[doff]);MBERRNM(merr); 8191cec0304SVijay Mahadevan } 820212ad6d1SVijay Mahadevan ierr = VecRestoreArrayRead(fvec,&varray);CHKERRQ(ierr); 8211cec0304SVijay Mahadevan } 8221cec0304SVijay Mahadevan else { 823212ad6d1SVijay Mahadevan ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&farray);CHKERRQ(ierr); 8241cec0304SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 825212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)farray);MBERRNM(merr); 826212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr); 8271cec0304SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 8281cec0304SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr); 829212ad6d1SVijay Mahadevan ierr = PetscFree(farray);CHKERRQ(ierr); 830212ad6d1SVijay Mahadevan } 831212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 832212ad6d1SVijay Mahadevan } 833212ad6d1SVijay Mahadevan 834212ad6d1SVijay Mahadevan 835212ad6d1SVijay Mahadevan #undef __FUNCT__ 836212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabSetGlobalFieldVector" 837212ad6d1SVijay Mahadevan PetscErrorCode DMMoabSetGlobalFieldVector(DM dm, Vec fvec) 838212ad6d1SVijay Mahadevan { 839212ad6d1SVijay Mahadevan DM_Moab *dmmoab; 840212ad6d1SVijay Mahadevan moab::Tag vtag,ntag; 841212ad6d1SVijay Mahadevan const PetscScalar *varray; 842212ad6d1SVijay Mahadevan PetscScalar *farray; 843212ad6d1SVijay Mahadevan moab::ErrorCode merr; 844212ad6d1SVijay Mahadevan PetscErrorCode ierr; 845212ad6d1SVijay Mahadevan PetscSection section; 846212ad6d1SVijay Mahadevan PetscInt i,doff,ifield; 847212ad6d1SVijay Mahadevan std::string tag_name; 848212ad6d1SVijay Mahadevan moab::Range::iterator iter; 849212ad6d1SVijay Mahadevan 850212ad6d1SVijay Mahadevan PetscFunctionBegin; 851212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 852212ad6d1SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 853212ad6d1SVijay Mahadevan 854212ad6d1SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 855212ad6d1SVijay Mahadevan 856212ad6d1SVijay Mahadevan /* get the Tag corresponding to the global vector - possible that there is no tag associated.. */ 857212ad6d1SVijay Mahadevan ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr); 858212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name); 859212ad6d1SVijay Mahadevan if (!tag_name.length() && merr !=moab::MB_SUCCESS) { 860212ad6d1SVijay Mahadevan /* not a MOAB vector - use VecGetSubVector to get the parts as needed */ 861212ad6d1SVijay Mahadevan 862212ad6d1SVijay Mahadevan ierr = VecGetArrayRead(fvec,&varray);CHKERRQ(ierr); 863212ad6d1SVijay Mahadevan for (ifield=0; ifield<dmmoab->nfields; ++ifield) { 864212ad6d1SVijay Mahadevan 865212ad6d1SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 866212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag, 867212ad6d1SVijay Mahadevan moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr); 868212ad6d1SVijay Mahadevan 869212ad6d1SVijay Mahadevan for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) { 870212ad6d1SVijay Mahadevan moab::EntityHandle vtx = (*iter); 871212ad6d1SVijay Mahadevan 872212ad6d1SVijay Mahadevan /* get field dof index */ 873212ad6d1SVijay Mahadevan ierr = DMMoabGetFieldDof(dm, vtx, ifield, &doff); 874212ad6d1SVijay Mahadevan 875212ad6d1SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */ 876212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, &vtx, 1, (const void*)&varray[doff]);MBERRNM(merr); 877212ad6d1SVijay Mahadevan } 878212ad6d1SVijay Mahadevan } 879212ad6d1SVijay Mahadevan ierr = VecRestoreArrayRead(fvec,&varray);CHKERRQ(ierr); 880212ad6d1SVijay Mahadevan } 881212ad6d1SVijay Mahadevan else { 882212ad6d1SVijay Mahadevan ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&farray);CHKERRQ(ierr); 883212ad6d1SVijay Mahadevan ierr = PetscMalloc(dmmoab->nloc*dmmoab->bs*sizeof(PetscScalar),&varray);CHKERRQ(ierr); 884212ad6d1SVijay Mahadevan 885212ad6d1SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 886212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray);MBERRNM(merr); 887212ad6d1SVijay Mahadevan for (ifield=0; ifield<dmmoab->nfields; ++ifield) { 888212ad6d1SVijay Mahadevan 889212ad6d1SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 890212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag, 891212ad6d1SVijay Mahadevan moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr); 892212ad6d1SVijay Mahadevan 893212ad6d1SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 894212ad6d1SVijay Mahadevan for(i=0; i < dmmoab->nloc; i++) { 895212ad6d1SVijay Mahadevan farray[i] = varray[i*dmmoab->bs+ifield]; 896212ad6d1SVijay Mahadevan } 897212ad6d1SVijay Mahadevan 898212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr); 899212ad6d1SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 900212ad6d1SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr); 901212ad6d1SVijay Mahadevan } 902212ad6d1SVijay Mahadevan ierr = PetscFree(farray);CHKERRQ(ierr); 9031cec0304SVijay Mahadevan ierr = PetscFree(varray);CHKERRQ(ierr); 9041cec0304SVijay Mahadevan } 9051cec0304SVijay Mahadevan PetscFunctionReturn(0); 9061cec0304SVijay Mahadevan } 9071cec0304SVijay Mahadevan 9081cec0304SVijay Mahadevan 909212ad6d1SVijay Mahadevan 9101cec0304SVijay Mahadevan #undef __FUNCT__ 9117023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates" 9127023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos) 9137023aa44SVijay Mahadevan { 9147023aa44SVijay Mahadevan DM_Moab *dmmoab; 9157023aa44SVijay Mahadevan PetscErrorCode ierr; 9167023aa44SVijay Mahadevan moab::ErrorCode merr; 9177023aa44SVijay Mahadevan 9187023aa44SVijay Mahadevan PetscFunctionBegin; 9197023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 9207023aa44SVijay Mahadevan PetscValidPointer(conn,3); 9217023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 9227023aa44SVijay Mahadevan 9237023aa44SVijay Mahadevan if (!vpos) { 9247023aa44SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr); 9257023aa44SVijay Mahadevan } 9267023aa44SVijay Mahadevan 9277023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 9287023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr); 9297023aa44SVijay Mahadevan PetscFunctionReturn(0); 9307023aa44SVijay Mahadevan } 9317023aa44SVijay Mahadevan 9327023aa44SVijay Mahadevan 9337023aa44SVijay Mahadevan #undef __FUNCT__ 9347023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity" 9357023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn) 9367023aa44SVijay Mahadevan { 9377023aa44SVijay Mahadevan DM_Moab *dmmoab; 9387023aa44SVijay Mahadevan const moab::EntityHandle *connect; 9397023aa44SVijay Mahadevan moab::ErrorCode merr; 9407023aa44SVijay Mahadevan PetscInt nnodes; 9417023aa44SVijay Mahadevan 9427023aa44SVijay Mahadevan PetscFunctionBegin; 9437023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 9447023aa44SVijay Mahadevan PetscValidPointer(conn,4); 9457023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 9467023aa44SVijay Mahadevan 9477023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 9487023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr); 9497023aa44SVijay Mahadevan if (conn) *conn=connect; 9507023aa44SVijay Mahadevan if (nconn) *nconn=nnodes; 9517023aa44SVijay Mahadevan PetscFunctionReturn(0); 9527023aa44SVijay Mahadevan } 9537023aa44SVijay Mahadevan 9547023aa44SVijay Mahadevan 9557023aa44SVijay Mahadevan #undef __FUNCT__ 95669263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary" 95769263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary) 95869263071SVijay Mahadevan { 95969263071SVijay Mahadevan moab::EntityType etype; 96069263071SVijay Mahadevan DM_Moab *dmmoab; 96169263071SVijay Mahadevan PetscInt edim; 96269263071SVijay Mahadevan 96369263071SVijay Mahadevan PetscFunctionBegin; 96469263071SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 96569263071SVijay Mahadevan PetscValidPointer(ent_on_boundary,3); 96669263071SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 96769263071SVijay Mahadevan 96869263071SVijay Mahadevan /* get the entity type and handle accordingly */ 96969263071SVijay Mahadevan etype=dmmoab->mbiface->type_from_handle(ent); 97069263071SVijay 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); 97169263071SVijay Mahadevan 97269263071SVijay Mahadevan /* get the entity dimension */ 97369263071SVijay Mahadevan edim=dmmoab->mbiface->dimension_from_handle(ent); 97469263071SVijay Mahadevan 97569263071SVijay Mahadevan *ent_on_boundary=PETSC_FALSE; 97669263071SVijay Mahadevan if(etype == moab::MBVERTEX && edim == 0) { 97769263071SVijay Mahadevan moab::Range::const_iterator giter = dmmoab->bndyvtx->find(ent); 97869263071SVijay Mahadevan if (giter != dmmoab->bndyvtx->end()) *ent_on_boundary=PETSC_TRUE; 97969263071SVijay Mahadevan } 98069263071SVijay Mahadevan else { 98169263071SVijay Mahadevan if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */ 98269263071SVijay Mahadevan moab::Range::const_iterator geiter = dmmoab->bndyelems->find(ent); 98369263071SVijay Mahadevan if (geiter != dmmoab->bndyelems->end()) *ent_on_boundary=PETSC_TRUE; 98469263071SVijay Mahadevan } 98569263071SVijay Mahadevan else { /* next check the lower-dimensional faces */ 98669263071SVijay Mahadevan moab::Range::const_iterator gfiter = dmmoab->bndyfaces->find(ent); 98769263071SVijay Mahadevan if (gfiter != dmmoab->bndyfaces->end()) *ent_on_boundary=PETSC_TRUE; 98869263071SVijay Mahadevan } 98969263071SVijay Mahadevan } 99069263071SVijay Mahadevan PetscFunctionReturn(0); 99169263071SVijay Mahadevan } 99269263071SVijay Mahadevan 99369263071SVijay Mahadevan 99469263071SVijay Mahadevan #undef __FUNCT__ 9957023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices" 99669263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx) 9977023aa44SVijay Mahadevan { 9987023aa44SVijay Mahadevan DM_Moab *dmmoab; 9997023aa44SVijay Mahadevan PetscInt i; 10007023aa44SVijay Mahadevan 10017023aa44SVijay Mahadevan PetscFunctionBegin; 10027023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 10037023aa44SVijay Mahadevan PetscValidPointer(cnt,3); 10047023aa44SVijay Mahadevan PetscValidPointer(isbdvtx,4); 10057023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 10067023aa44SVijay Mahadevan 10077023aa44SVijay Mahadevan for (i=0; i < nconn; ++i) { 10087023aa44SVijay Mahadevan moab::Range::const_iterator giter = dmmoab->bndyvtx->find(cnt[i]); 100969263071SVijay Mahadevan if (giter != dmmoab->bndyvtx->end()) isbdvtx[i] = PETSC_TRUE; 10107023aa44SVijay Mahadevan else isbdvtx[i] = PETSC_FALSE; 10117023aa44SVijay Mahadevan } 10127023aa44SVijay Mahadevan PetscFunctionReturn(0); 10137023aa44SVijay Mahadevan } 10147023aa44SVijay Mahadevan 10157023aa44SVijay Mahadevan 10167023aa44SVijay Mahadevan #undef __FUNCT__ 10171cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryEntities" 101869263071SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryEntities(DM dm,moab::Range *bdvtx,moab::Range* bdfaces,moab::Range* bdelems) 10191cec0304SVijay Mahadevan { 10201cec0304SVijay Mahadevan DM_Moab *dmmoab; 10211cec0304SVijay Mahadevan 10221cec0304SVijay Mahadevan PetscFunctionBegin; 10231cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 10241cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 10251cec0304SVijay Mahadevan 10261cec0304SVijay Mahadevan if (bdvtx) *bdvtx = *dmmoab->bndyvtx; 10271cec0304SVijay Mahadevan if (bdfaces) *bdfaces = *dmmoab->bndyfaces; 102869263071SVijay Mahadevan if (bdelems) *bdfaces = *dmmoab->bndyelems; 10291cec0304SVijay Mahadevan PetscFunctionReturn(0); 10301cec0304SVijay Mahadevan } 10311cec0304SVijay Mahadevan 10321cec0304SVijay Mahadevan 10331cec0304SVijay Mahadevan #undef __FUNCT__ 10341cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFields" 10351cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFields(DM dm,PetscInt nfields,const char** fields) 10361cec0304SVijay Mahadevan { 10371cec0304SVijay Mahadevan DM_Moab *dmmoab; 10381cec0304SVijay Mahadevan 10391cec0304SVijay Mahadevan PetscFunctionBegin; 10401cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 10411cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 10421cec0304SVijay Mahadevan 10431cec0304SVijay Mahadevan dmmoab->fields = fields; 10441cec0304SVijay Mahadevan dmmoab->nfields = nfields; 10451cec0304SVijay Mahadevan PetscFunctionReturn(0); 10461cec0304SVijay Mahadevan } 10471cec0304SVijay Mahadevan 10481cec0304SVijay Mahadevan 10491cec0304SVijay Mahadevan #undef __FUNCT__ 10501cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDof" 10511cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof) 10521cec0304SVijay Mahadevan { 10531cec0304SVijay Mahadevan PetscSection section; 1054fc418013SVijay Mahadevan PetscInt gid; 10551cec0304SVijay Mahadevan PetscErrorCode ierr; 1056fc418013SVijay Mahadevan moab::ErrorCode merr; 1057fc418013SVijay Mahadevan DM_Moab *dmmoab; 10581cec0304SVijay Mahadevan 10591cec0304SVijay Mahadevan PetscFunctionBegin; 10601cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1061fc418013SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1062fc418013SVijay Mahadevan 10631cec0304SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 1064fc418013SVijay Mahadevan 1065fc418013SVijay Mahadevan /* first get the global ID for the point */ 1066fc418013SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,&point,1,&gid);MBERRNM(merr); 1067fc418013SVijay Mahadevan 1068fc418013SVijay Mahadevan /* get the dof value for the field */ 1069fc418013SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, gid, field, dof);CHKERRQ(ierr); 10701cec0304SVijay Mahadevan PetscFunctionReturn(0); 10711cec0304SVijay Mahadevan } 10721cec0304SVijay Mahadevan 10731cec0304SVijay Mahadevan 10741cec0304SVijay Mahadevan #undef __FUNCT__ 10751cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofs" 10761cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof) 10771cec0304SVijay Mahadevan { 1078fc418013SVijay Mahadevan PetscInt i,gid; 10791cec0304SVijay Mahadevan PetscSection section; 10801cec0304SVijay Mahadevan PetscErrorCode ierr; 1081fc418013SVijay Mahadevan moab::ErrorCode merr; 1082fc418013SVijay Mahadevan DM_Moab *dmmoab; 10831cec0304SVijay Mahadevan 10841cec0304SVijay Mahadevan PetscFunctionBegin; 10851cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1086324f1edfSVijay Mahadevan PetscValidPointer(points,2); 1087fc418013SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1088fc418013SVijay Mahadevan 10891cec0304SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 10901cec0304SVijay Mahadevan if (!dof) { 10911cec0304SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr); 10921cec0304SVijay Mahadevan } 1093fc418013SVijay Mahadevan 1094fc418013SVijay Mahadevan /* first get the local indices */ 1095fc418013SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,points,npoints,dof);MBERRNM(merr); 1096fc418013SVijay Mahadevan 10971cec0304SVijay Mahadevan for (i=0; i<npoints; ++i) { 1098fc418013SVijay Mahadevan gid=dof[i]; 1099fc418013SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, gid, field, &dof[i]);CHKERRQ(ierr); 11001cec0304SVijay Mahadevan } 11011cec0304SVijay Mahadevan PetscFunctionReturn(0); 11021cec0304SVijay Mahadevan } 11031cec0304SVijay Mahadevan 11041cec0304SVijay Mahadevan 1105fc418013SVijay Mahadevan #undef __FUNCT__ 1106212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofsLocal" 1107212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof) 1108eb9d2429SVijay Mahadevan { 1109eb9d2429SVijay Mahadevan PetscInt i,offset; 1110eb9d2429SVijay Mahadevan PetscErrorCode ierr; 1111eb9d2429SVijay Mahadevan DM_Moab *dmmoab; 1112eb9d2429SVijay Mahadevan 1113eb9d2429SVijay Mahadevan PetscFunctionBegin; 1114eb9d2429SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1115324f1edfSVijay Mahadevan PetscValidPointer(points,2); 1116eb9d2429SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1117eb9d2429SVijay Mahadevan 1118eb9d2429SVijay Mahadevan if (!dof) { 1119eb9d2429SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr); 1120eb9d2429SVijay Mahadevan } 1121eb9d2429SVijay Mahadevan 1122eb9d2429SVijay Mahadevan if (dmmoab->bs > 1) { 1123eb9d2429SVijay Mahadevan for (i=0; i<npoints; ++i) 1124eb9d2429SVijay Mahadevan dof[i] = (points[i]-1)*dmmoab->bs+field; 1125eb9d2429SVijay Mahadevan } 1126eb9d2429SVijay Mahadevan else { 1127eb9d2429SVijay Mahadevan offset = field*dmmoab->n; /* assume all fields have equal distribution */ 1128eb9d2429SVijay Mahadevan for (i=0; i<npoints; ++i) 1129eb9d2429SVijay Mahadevan dof[i] = offset+points[i]-1; 1130eb9d2429SVijay Mahadevan } 1131eb9d2429SVijay Mahadevan PetscFunctionReturn(0); 1132eb9d2429SVijay Mahadevan } 1133eb9d2429SVijay Mahadevan 1134eb9d2429SVijay Mahadevan 1135eb9d2429SVijay Mahadevan #undef __FUNCT__ 1136212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofs" 1137212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 1138212ad6d1SVijay Mahadevan { 1139212ad6d1SVijay Mahadevan PetscInt i,f,gid; 1140212ad6d1SVijay Mahadevan PetscSection section; 1141212ad6d1SVijay Mahadevan PetscErrorCode ierr; 1142212ad6d1SVijay Mahadevan moab::ErrorCode merr; 1143212ad6d1SVijay Mahadevan DM_Moab *dmmoab; 1144212ad6d1SVijay Mahadevan 1145212ad6d1SVijay Mahadevan PetscFunctionBegin; 1146212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1147324f1edfSVijay Mahadevan PetscValidPointer(points,2); 1148212ad6d1SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1149212ad6d1SVijay Mahadevan 1150212ad6d1SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 1151212ad6d1SVijay Mahadevan if (!dof) { 1152212ad6d1SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*dmmoab->nfields*npoints, &dof);CHKERRQ(ierr); 1153212ad6d1SVijay Mahadevan } 1154212ad6d1SVijay Mahadevan 1155212ad6d1SVijay Mahadevan /* first get the local indices */ 1156212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,points,npoints,dof);MBERRNM(merr); 1157212ad6d1SVijay Mahadevan 1158212ad6d1SVijay Mahadevan for (i=0; i<npoints; ++i) { 1159212ad6d1SVijay Mahadevan gid=dof[i]; 1160212ad6d1SVijay Mahadevan for (f=0; f<dmmoab->nfields; ++f) { 1161212ad6d1SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, gid, f, &dof[i*dmmoab->nfields+f]);CHKERRQ(ierr); 1162212ad6d1SVijay Mahadevan } 1163212ad6d1SVijay Mahadevan } 1164212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 1165212ad6d1SVijay Mahadevan } 1166212ad6d1SVijay Mahadevan 1167212ad6d1SVijay Mahadevan 1168212ad6d1SVijay Mahadevan #undef __FUNCT__ 1169212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsLocal" 1170212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 1171212ad6d1SVijay Mahadevan { 1172212ad6d1SVijay Mahadevan PetscInt i,f,offset; 1173212ad6d1SVijay Mahadevan PetscErrorCode ierr; 1174212ad6d1SVijay Mahadevan DM_Moab *dmmoab; 1175212ad6d1SVijay Mahadevan 1176212ad6d1SVijay Mahadevan PetscFunctionBegin; 1177212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1178324f1edfSVijay Mahadevan PetscValidPointer(points,2); 1179212ad6d1SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1180212ad6d1SVijay Mahadevan 1181212ad6d1SVijay Mahadevan if (!dof) { 1182212ad6d1SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*dmmoab->nfields*npoints, &dof);CHKERRQ(ierr); 1183212ad6d1SVijay Mahadevan } 1184212ad6d1SVijay Mahadevan 1185212ad6d1SVijay Mahadevan if (dmmoab->bs > 1) { 1186212ad6d1SVijay Mahadevan for (f=0; f<dmmoab->nfields; ++f) 1187212ad6d1SVijay Mahadevan for (i=0; i<npoints; ++i) 1188212ad6d1SVijay Mahadevan dof[i*dmmoab->nfields+f] = (points[i]-1)*dmmoab->bs+f; 1189212ad6d1SVijay Mahadevan } 1190212ad6d1SVijay Mahadevan else { 1191212ad6d1SVijay Mahadevan for (f=0; f<dmmoab->nfields; ++f) { 1192212ad6d1SVijay Mahadevan offset = f*dmmoab->n; /* assume all fields have equal distribution - say all vertex based */ 1193212ad6d1SVijay Mahadevan for (i=0; i<npoints; ++i) 1194212ad6d1SVijay Mahadevan dof[i*dmmoab->nfields+f] = offset+points[i]-1; 1195212ad6d1SVijay Mahadevan } 1196212ad6d1SVijay Mahadevan } 1197212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 1198212ad6d1SVijay Mahadevan } 1199212ad6d1SVijay Mahadevan 1200212ad6d1SVijay Mahadevan 1201212ad6d1SVijay Mahadevan #undef __FUNCT__ 1202212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlocked" 1203212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlocked(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 1204212ad6d1SVijay Mahadevan { 1205212ad6d1SVijay Mahadevan PetscInt i,gid,dofindx; 1206212ad6d1SVijay Mahadevan PetscSection section; 1207212ad6d1SVijay Mahadevan PetscErrorCode ierr; 1208212ad6d1SVijay Mahadevan moab::ErrorCode merr; 1209212ad6d1SVijay Mahadevan DM_Moab *dmmoab; 1210212ad6d1SVijay Mahadevan 1211212ad6d1SVijay Mahadevan PetscFunctionBegin; 1212212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1213324f1edfSVijay Mahadevan PetscValidPointer(points,2); 1214212ad6d1SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1215212ad6d1SVijay Mahadevan 1216212ad6d1SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 1217212ad6d1SVijay Mahadevan if (!dof) { 1218212ad6d1SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr); 1219212ad6d1SVijay Mahadevan } 1220212ad6d1SVijay Mahadevan 1221212ad6d1SVijay Mahadevan /* first get the local indices */ 1222212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,points,npoints,dof);MBERRNM(merr); 1223212ad6d1SVijay Mahadevan 1224212ad6d1SVijay Mahadevan for (i=0; i<npoints; ++i) { 1225212ad6d1SVijay Mahadevan gid=dof[i]; 1226212ad6d1SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, gid, 0, &dofindx);CHKERRQ(ierr); 1227212ad6d1SVijay Mahadevan if (dmmoab->bs > 1) dof[i]=dofindx/dmmoab->bs; 1228212ad6d1SVijay Mahadevan else dof[i]=dofindx; 1229212ad6d1SVijay Mahadevan } 1230212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 1231212ad6d1SVijay Mahadevan } 1232212ad6d1SVijay Mahadevan 1233212ad6d1SVijay Mahadevan 1234212ad6d1SVijay Mahadevan #undef __FUNCT__ 1235212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlockedLocal" 1236212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 1237212ad6d1SVijay Mahadevan { 1238212ad6d1SVijay Mahadevan PetscInt i; 1239212ad6d1SVijay Mahadevan PetscErrorCode ierr; 1240212ad6d1SVijay Mahadevan 1241212ad6d1SVijay Mahadevan PetscFunctionBegin; 1242212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1243324f1edfSVijay Mahadevan PetscValidPointer(points,2); 1244212ad6d1SVijay Mahadevan 1245212ad6d1SVijay Mahadevan if (!dof) { 1246212ad6d1SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr); 1247212ad6d1SVijay Mahadevan } 1248212ad6d1SVijay Mahadevan 1249212ad6d1SVijay Mahadevan for (i=0; i<npoints; ++i) 1250212ad6d1SVijay Mahadevan dof[i] = points[i]-1; 1251212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 1252212ad6d1SVijay Mahadevan } 1253212ad6d1SVijay Mahadevan 1254212ad6d1SVijay Mahadevan #undef __FUNCT__ 1255fc418013SVijay Mahadevan #define __FUNCT__ "DMMoab_GetWriteOptions_Private" 1256fc418013SVijay Mahadevan PetscErrorCode DMMoab_GetWriteOptions_Private(PetscInt fsetid, PetscInt numproc, PetscInt dim, MoabWriteMode mode, PetscInt dbglevel, const char* extra_opts, const char** write_opts) 1257fc418013SVijay Mahadevan { 1258fc418013SVijay Mahadevan std::ostringstream str; 1259fc418013SVijay Mahadevan 1260fc418013SVijay Mahadevan PetscFunctionBegin; 1261fc418013SVijay Mahadevan 1262fc418013SVijay Mahadevan // do parallel read unless only one processor 1263fc418013SVijay Mahadevan if (numproc > 1) { 1264fc418013SVijay Mahadevan str << "PARALLEL=" << mode << ";"; 1265fc418013SVijay Mahadevan if (fsetid>=0) str << "PARALLEL_COMM=" << fsetid << ";"; 1266fc418013SVijay Mahadevan } 1267fc418013SVijay Mahadevan 1268fc418013SVijay Mahadevan if (dbglevel) 1269fc418013SVijay Mahadevan str << "CPUTIME;DEBUG_IO=" << dbglevel << ";"; 1270fc418013SVijay Mahadevan 1271fc418013SVijay Mahadevan if (extra_opts) 1272fc418013SVijay Mahadevan str << extra_opts ; 1273fc418013SVijay Mahadevan 1274fc418013SVijay Mahadevan *write_opts = str.str().c_str(); 1275fc418013SVijay Mahadevan PetscFunctionReturn(0); 1276fc418013SVijay Mahadevan } 1277fc418013SVijay Mahadevan 1278fc418013SVijay Mahadevan 1279fc418013SVijay Mahadevan #undef __FUNCT__ 1280fc418013SVijay Mahadevan #define __FUNCT__ "DMMoabOutput" 1281fc418013SVijay Mahadevan PetscErrorCode DMMoabOutput(DM dm,const char* filename,const char* usrwriteopts) 1282fc418013SVijay Mahadevan { 1283fc418013SVijay Mahadevan DM_Moab *dmmoab; 1284fc418013SVijay Mahadevan PetscInt dbglevel=0; 1285fc418013SVijay Mahadevan const char *writeopts; 1286fc418013SVijay Mahadevan 1287fc418013SVijay Mahadevan PetscErrorCode ierr; 1288fc418013SVijay Mahadevan moab::ErrorCode merr; 1289fc418013SVijay Mahadevan 1290fc418013SVijay Mahadevan PetscFunctionBegin; 1291fc418013SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1292fc418013SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1293fc418013SVijay Mahadevan 1294fc418013SVijay Mahadevan PetscBarrier((PetscObject)dm); 1295fc418013SVijay Mahadevan 1296fc418013SVijay Mahadevan /* TODO: Use command-line options to control by_rank, verbosity, MoabReadMode and extra options */ 1297fc418013SVijay Mahadevan ierr = PetscOptionsBegin(PETSC_COMM_WORLD, "", "Options for reading/writing MOAB based meshes from file", "DMMoab"); 1298fc418013SVijay Mahadevan ierr = PetscOptionsInt("-dmmb_rw_dbg", "The verbosity level for reading and writing MOAB meshes", "dmmbutil.cxx", dbglevel, &dbglevel, NULL);CHKERRQ(ierr); 1299fc418013SVijay Mahadevan ierr = PetscOptionsEnd(); 1300fc418013SVijay Mahadevan 1301fc418013SVijay Mahadevan /* add mesh loading options specific to the DM */ 1302fc418013SVijay Mahadevan ierr = DMMoab_GetWriteOptions_Private(dmmoab->pcomm->get_id(), dmmoab->pcomm->size(), dmmoab->dim, MOAB_PARWOPTS_WRITE_PART, dbglevel, usrwriteopts, &writeopts);CHKERRQ(ierr); 1303fc418013SVijay Mahadevan PetscInfo2(dm, "Writing file %s with options: %s\n",filename,writeopts); 1304fc418013SVijay Mahadevan 1305fc418013SVijay Mahadevan /* output file, using parallel write */ 1306fc418013SVijay Mahadevan merr = dmmoab->mbiface->write_file(filename, NULL, writeopts, &dmmoab->fileset, 1);MBERRVM(dmmoab->mbiface,"Writing output of DMMoab failed.",merr); 1307fc418013SVijay Mahadevan PetscFunctionReturn(0); 1308fc418013SVijay Mahadevan } 1309fc418013SVijay Mahadevan 1310