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; 14853cdec3SJed Brown 15853cdec3SJed Brown PetscFunctionBegin; 16853cdec3SJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 17032b8ab6SVijay Mahadevan if (dmmoab->icreatedinstance) { 18032b8ab6SVijay Mahadevan delete dmmoab->mbiface; 19853cdec3SJed Brown } 20032b8ab6SVijay Mahadevan dmmoab->mbiface = NULL; 21032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 22032b8ab6SVijay Mahadevan delete dmmoab->vlocal; 23032b8ab6SVijay Mahadevan delete dmmoab->vowned; 24032b8ab6SVijay Mahadevan delete dmmoab->vghost; 25032b8ab6SVijay Mahadevan delete dmmoab->elocal; 26032b8ab6SVijay Mahadevan delete dmmoab->eghost; 271cec0304SVijay Mahadevan delete dmmoab->bndyvtx; 281cec0304SVijay Mahadevan delete dmmoab->bndyfaces; 29*69263071SVijay Mahadevan delete dmmoab->bndyelems; 30fc418013SVijay Mahadevan 31fc418013SVijay Mahadevan ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr); 32032b8ab6SVijay Mahadevan ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 33032b8ab6SVijay Mahadevan ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr); 34853cdec3SJed Brown ierr = PetscFree(dm->data);CHKERRQ(ierr); 35853cdec3SJed Brown PetscFunctionReturn(0); 36853cdec3SJed Brown } 37853cdec3SJed Brown 38aa768e4cSTim Tautges #undef __FUNCT__ 39032b8ab6SVijay Mahadevan #define __FUNCT__ "DMSetUp_Moab" 40032b8ab6SVijay Mahadevan PetscErrorCode DMSetUp_Moab(DM dm) 41032b8ab6SVijay Mahadevan { 42032b8ab6SVijay Mahadevan PetscErrorCode ierr; 43032b8ab6SVijay Mahadevan moab::ErrorCode merr; 44032b8ab6SVijay Mahadevan Vec local, global; 45032b8ab6SVijay Mahadevan IS from; 46032b8ab6SVijay Mahadevan moab::Range::iterator iter; 47fc418013SVijay Mahadevan PetscInt i,j,bs,gsiz,lsiz; 48032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 49fc418013SVijay Mahadevan PetscInt totsize,local_min,local_max,global_min; 501cec0304SVijay Mahadevan PetscSection section; 51032b8ab6SVijay Mahadevan 52*69263071SVijay Mahadevan moab::Range adj; 53*69263071SVijay Mahadevan 54032b8ab6SVijay Mahadevan PetscFunctionBegin; 55032b8ab6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 56032b8ab6SVijay Mahadevan /* Get the local and shared vertices and cache it */ 57032b8ab6SVijay Mahadevan if (dmmoab->mbiface == PETSC_NULL || dmmoab->pcomm == PETSC_NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface and ParallelComm objects before calling SetUp."); 58032b8ab6SVijay Mahadevan 591cec0304SVijay Mahadevan /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */ 60032b8ab6SVijay Mahadevan if (dmmoab->vlocal->empty()) { 611cec0304SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr); 62032b8ab6SVijay Mahadevan 63032b8ab6SVijay Mahadevan /* filter based on parallel status */ 64fc418013SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 65032b8ab6SVijay Mahadevan *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 66032b8ab6SVijay Mahadevan 67032b8ab6SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 68032b8ab6SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 69032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 70fc418013SVijay Mahadevan 71e23c60ebSVijay Mahadevan #if 0 72fc418013SVijay Mahadevan if(dmmoab->pcomm->rank() || dmmoab->pcomm->size()==1) { 73fc418013SVijay Mahadevan PetscPrintf(PETSC_COMM_SELF, "Vertices: global: %D, local: %D", dmmoab->n, dmmoab->nloc+dmmoab->nghost); 74fc418013SVijay Mahadevan dmmoab->vlocal->print(0); 75fc418013SVijay Mahadevan PetscPrintf(PETSC_COMM_SELF, "Vertices: owned: %D", dmmoab->nloc); 76fc418013SVijay Mahadevan dmmoab->vowned->print(0); 77fc418013SVijay Mahadevan PetscPrintf(PETSC_COMM_SELF, "Vertices: ghost: %D", dmmoab->nghost); 78fc418013SVijay Mahadevan dmmoab->vghost->print(0); 79fc418013SVijay Mahadevan } 80fc418013SVijay Mahadevan #endif 81032b8ab6SVijay Mahadevan } 82032b8ab6SVijay Mahadevan 83032b8ab6SVijay Mahadevan /* get the information about the local elements in the mesh */ 84032b8ab6SVijay Mahadevan { 85032b8ab6SVijay Mahadevan dmmoab->eghost->clear(); 86fc418013SVijay Mahadevan 87fc418013SVijay Mahadevan /* first decipher the leading dimension */ 88fc418013SVijay Mahadevan for (i=3;i>0;i--) { 89fc418013SVijay Mahadevan dmmoab->elocal->clear(); 90fc418013SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr); 91fc418013SVijay Mahadevan 92fc418013SVijay Mahadevan /* store the current mesh dimension */ 93fc418013SVijay Mahadevan if (dmmoab->elocal->size()) { 94fc418013SVijay Mahadevan dmmoab->dim=i; 95fc418013SVijay Mahadevan break; 96fc418013SVijay Mahadevan } 97fc418013SVijay Mahadevan } 98fc418013SVijay Mahadevan 99032b8ab6SVijay Mahadevan *dmmoab->eghost = *dmmoab->elocal; 100032b8ab6SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 101032b8ab6SVijay Mahadevan *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal); 102032b8ab6SVijay Mahadevan 103032b8ab6SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 104032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 105032b8ab6SVijay Mahadevan } 106032b8ab6SVijay Mahadevan 107032b8ab6SVijay Mahadevan bs = dmmoab->bs; 108032b8ab6SVijay Mahadevan if (!dmmoab->ltog_tag) { 109db66d124SVijay Mahadevan /* Get the global ID tag. The global ID tag is applied to each 110db66d124SVijay Mahadevan vertex. It acts as an global identifier which MOAB uses to 111db66d124SVijay Mahadevan assemble the individual pieces of the mesh */ 112032b8ab6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 113032b8ab6SVijay Mahadevan } 114032b8ab6SVijay Mahadevan 115032b8ab6SVijay Mahadevan totsize=dmmoab->vlocal->size(); 116fc418013SVijay Mahadevan ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->gsindices);CHKERRQ(ierr); 1171cec0304SVijay Mahadevan { 118032b8ab6SVijay Mahadevan /* first get the local indices */ 119fc418013SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr); 1204a40b570SVijay Mahadevan /* next get the ghosted indices */ 121fc418013SVijay Mahadevan if (dmmoab->nghost) { 122fc418013SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr); 1231cec0304SVijay Mahadevan } 1246e40195eSVijay Mahadevan 1256e40195eSVijay Mahadevan /* find out the local and global minima of GLOBAL_ID */ 126fc418013SVijay Mahadevan local_min=local_max=dmmoab->gsindices[0]; 127*69263071SVijay Mahadevan for (i=0; i<totsize; ++i) { 128fc418013SVijay Mahadevan // if (dmmoab->pcomm->rank()) 129fc418013SVijay Mahadevan // PetscPrintf(PETSC_COMM_SELF, "[%D] gsindices[%D] = %D\n", dmmoab->pcomm->rank(), i, dmmoab->gsindices[i]); 130fc418013SVijay Mahadevan if(local_min>dmmoab->gsindices[i]) local_min=dmmoab->gsindices[i]; 131fc418013SVijay Mahadevan if(local_max<dmmoab->gsindices[i]) local_max=dmmoab->gsindices[i]; 132fc418013SVijay Mahadevan } 1336e40195eSVijay Mahadevan 1346e40195eSVijay Mahadevan ierr = MPI_Allreduce(&local_min, &global_min, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr); 135fc418013SVijay Mahadevan PetscInfo3(dm, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", local_min, local_max, global_min); 136fc418013SVijay Mahadevan // PetscPrintf(PETSC_COMM_SELF, "[%D] GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", dmmoab->pcomm->rank(), local_min, local_max, global_min); 1371cec0304SVijay Mahadevan } 138032b8ab6SVijay Mahadevan 1391cec0304SVijay Mahadevan { 1401cec0304SVijay Mahadevan ierr = PetscSectionCreate(((PetscObject)dm)->comm, §ion);CHKERRQ(ierr); 1411cec0304SVijay Mahadevan ierr = PetscSectionSetNumFields(section, dmmoab->nfields);CHKERRQ(ierr); 142fc418013SVijay Mahadevan // ierr = PetscSectionSetChart(section, dmmoab->gsindices[0], dmmoab->gsindices[dmmoab->nloc-1]+1);CHKERRQ(ierr); 143fc418013SVijay Mahadevan ierr = PetscSectionSetChart(section, local_min, local_max+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) { 149fc418013SVijay Mahadevan ierr = PetscSectionSetFieldDof(section, locgid, i, (locgid-global_min)*dmmoab->nfields+i);CHKERRQ(ierr); 150fc418013SVijay Mahadevan ierr = PetscSectionSetFieldOffset(section, locgid, i, (locgid-global_min)*dmmoab->nfields); 1511cec0304SVijay Mahadevan } 1521cec0304SVijay Mahadevan else { 153*69263071SVijay Mahadevan ierr = PetscSectionSetFieldDof(section, locgid, i, dmmoab->n*i+locgid-global_min);CHKERRQ(ierr); 154*69263071SVijay Mahadevan ierr = PetscSectionSetFieldOffset(section, locgid, i, i*dmmoab->n); 155*69263071SVijay Mahadevan PetscPrintf(PETSC_COMM_SELF, "[%D] Local_GID = %D, FDOF = %D, OFF = %D.\n", dmmoab->pcomm->rank(), locgid, dmmoab->n*i+locgid-global_min, i*dmmoab->n ); 1561cec0304SVijay Mahadevan } 1571cec0304SVijay Mahadevan } 158fc418013SVijay Mahadevan ierr = PetscSectionSetDof(section, locgid, dmmoab->nfields);CHKERRQ(ierr); 1591cec0304SVijay Mahadevan } 1601cec0304SVijay Mahadevan ierr = PetscSectionSetUp(section);CHKERRQ(ierr); 1611cec0304SVijay Mahadevan ierr = DMSetDefaultSection(dm, section);CHKERRQ(ierr); 1621cec0304SVijay Mahadevan } 1631cec0304SVijay Mahadevan 1641cec0304SVijay Mahadevan { 165fc418013SVijay Mahadevan for (i=0; i<totsize; ++i) { 166fc418013SVijay Mahadevan dmmoab->gsindices[i]-=global_min; /* zero based index needed for IS */ 167fc418013SVijay Mahadevan // if (dmmoab->pcomm->rank()) 168fc418013SVijay Mahadevan // PetscPrintf(PETSC_COMM_SELF, "[%D] modified gsindices[%D] = %D\n", dmmoab->pcomm->rank(), i, dmmoab->gsindices[i]); 169fc418013SVijay Mahadevan } 170fc418013SVijay Mahadevan 171032b8ab6SVijay Mahadevan /* Create Global to Local Vector Scatter Context */ 172032b8ab6SVijay Mahadevan ierr = DMCreateGlobalVector_Moab(dm, &global);CHKERRQ(ierr); 173032b8ab6SVijay Mahadevan ierr = DMCreateLocalVector_Moab(dm, &local);CHKERRQ(ierr); 174032b8ab6SVijay Mahadevan 175032b8ab6SVijay Mahadevan /* global to local must retrieve ghost points */ 176fc418013SVijay Mahadevan ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&dmmoab->gsindices[0],PETSC_COPY_VALUES,&from);CHKERRQ(ierr); 177032b8ab6SVijay Mahadevan 178db66d124SVijay Mahadevan ierr = VecGetLocalSize(global,&gsiz);CHKERRQ(ierr); 179db66d124SVijay Mahadevan ierr = VecGetLocalSize(local,&lsiz);CHKERRQ(ierr); 180032b8ab6SVijay Mahadevan 181032b8ab6SVijay Mahadevan ierr = VecScatterCreate(local,from,global,from,&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 182032b8ab6SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 183032b8ab6SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 184032b8ab6SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 185032b8ab6SVijay Mahadevan } 186032b8ab6SVijay Mahadevan 1871cec0304SVijay Mahadevan /* skin the boundary and store nodes */ 1881cec0304SVijay Mahadevan { 1891cec0304SVijay Mahadevan // get the skin vertices of those faces and mark them as fixed; we don't want to fix the vertices on a 1901cec0304SVijay Mahadevan // part boundary, but since we exchanged a layer of ghost faces, those vertices aren't on the skin locally 1911cec0304SVijay Mahadevan // ok to mark non-owned skin vertices too, I won't move those anyway 1921cec0304SVijay Mahadevan // use MOAB's skinner class to find the skin 1931cec0304SVijay Mahadevan moab::Skinner skinner(dmmoab->mbiface); 1941cec0304SVijay Mahadevan dmmoab->bndyvtx = new moab::Range(); 1951cec0304SVijay Mahadevan dmmoab->bndyfaces = new moab::Range(); 196*69263071SVijay Mahadevan dmmoab->bndyelems = new moab::Range(); 197*69263071SVijay 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 198*69263071SVijay Mahadevan // merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, true, *dmmoab->bndyvtx, NULL, true, true, false, false);MBERRNM(merr); // 'true' param indicates we want vertices back, not faces 199*69263071SVijay Mahadevan 200*69263071SVijay Mahadevan if (dmmoab->dim == 3) { 201*69263071SVijay Mahadevan // get the edges from faces and then do the same if needed 202*69263071SVijay Mahadevan } 203*69263071SVijay Mahadevan 204*69263071SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 205*69263071SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr); 206*69263071SVijay Mahadevan // merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_MULTISHARED,PSTATUS_NOT);MBERRNM(merr); 207*69263071SVijay Mahadevan 208*69263071SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr); 209*69263071SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr); 210*69263071SVijay Mahadevan 211*69263071SVijay Mahadevan dmmoab->bndyfaces->print(0); 212*69263071SVijay Mahadevan dmmoab->bndyvtx->print(0); 213*69263071SVijay Mahadevan dmmoab->bndyelems->print(0); 214*69263071SVijay Mahadevan 215*69263071SVijay Mahadevan // merr = skinner.find_geometric_skin(dmmoab->fileset, *dmmoab->bndyelems, dmmoab->dim);MBERRV(dmmoab->mbiface,merr); 216*69263071SVijay Mahadevan // merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, dmmoab->bndyvtx, dmmoab->bndyfaces, dmmoab->bndyelems, true, true);MBERRNM(merr); 217*69263071SVijay Mahadevan 218*69263071SVijay Mahadevan PetscInfo3(dm, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size()); 2191cec0304SVijay Mahadevan } 220032b8ab6SVijay Mahadevan PetscFunctionReturn(0); 221032b8ab6SVijay Mahadevan } 222032b8ab6SVijay Mahadevan 2231cec0304SVijay Mahadevan 224032b8ab6SVijay Mahadevan #undef __FUNCT__ 225aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab" 226853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 227aa768e4cSTim Tautges { 228aa768e4cSTim Tautges PetscErrorCode ierr; 229aa768e4cSTim Tautges 230aa768e4cSTim Tautges PetscFunctionBegin; 231aa768e4cSTim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 232032b8ab6SVijay Mahadevan ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr); 233032b8ab6SVijay Mahadevan 234032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 235032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 236032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 237032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 238032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 239032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 240032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL; 241032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL; 242032b8ab6SVijay Mahadevan 243032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 244032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 245032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 246032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 247032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 248aa768e4cSTim Tautges 24997ea90e6SJed Brown dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 25097ea90e6SJed Brown dm->ops->createlocalvector = DMCreateLocalVector_Moab; 251032b8ab6SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 252032b8ab6SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 25397ea90e6SJed Brown dm->ops->destroy = DMDestroy_Moab; 254032b8ab6SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 255032b8ab6SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 256032b8ab6SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 257032b8ab6SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 258aa768e4cSTim Tautges PetscFunctionReturn(0); 259aa768e4cSTim Tautges } 260fd349b41STim Tautges 261fd349b41STim Tautges #undef __FUNCT__ 2621d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate" 2631d72bce8STim Tautges /*@ 2641d72bce8STim Tautges DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance 2651d72bce8STim Tautges 2661d72bce8STim Tautges Collective on MPI_Comm 2671d72bce8STim Tautges 2681d72bce8STim Tautges Input Parameter: 2691d72bce8STim Tautges . comm - The communicator for the DMMoab object 2701d72bce8STim Tautges 2711d72bce8STim Tautges Output Parameter: 272032b8ab6SVijay Mahadevan . dmb - The DMMoab object 2731d72bce8STim Tautges 2741d72bce8STim Tautges Level: beginner 2751d72bce8STim Tautges 2761d72bce8STim Tautges .keywords: DMMoab, create 2771d72bce8STim Tautges @*/ 278032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb) 2791d72bce8STim Tautges { 2801d72bce8STim Tautges PetscErrorCode ierr; 2811d72bce8STim Tautges 2821d72bce8STim Tautges PetscFunctionBegin; 283032b8ab6SVijay Mahadevan PetscValidPointer(dmb,2); 284032b8ab6SVijay Mahadevan ierr = DMCreate(comm, dmb);CHKERRQ(ierr); 285032b8ab6SVijay Mahadevan ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr); 2861d72bce8STim Tautges PetscFunctionReturn(0); 2871d72bce8STim Tautges } 2881d72bce8STim Tautges 2891d72bce8STim Tautges #undef __FUNCT__ 290aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab" 2911d72bce8STim Tautges /*@ 292a4d2169cSTim Tautges DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data 2931d72bce8STim Tautges 2941d72bce8STim Tautges Collective on MPI_Comm 2951d72bce8STim Tautges 2961d72bce8STim Tautges Input Parameter: 2971d72bce8STim Tautges . comm - The communicator for the DMMoab object 298032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed 299a4d2169cSTim Tautges along with the DMMoab 300a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator 3011d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag 3021d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned 3031d72bce8STim Tautges 3041d72bce8STim Tautges Output Parameter: 305032b8ab6SVijay Mahadevan . dmb - The DMMoab object 3061d72bce8STim Tautges 307032b8ab6SVijay Mahadevan Level: intermediate 3081d72bce8STim Tautges 3091d72bce8STim Tautges .keywords: DMMoab, create 3101d72bce8STim Tautges @*/ 311032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb) 3121d72bce8STim Tautges { 3131d72bce8STim Tautges PetscErrorCode ierr; 314032b8ab6SVijay Mahadevan moab::ErrorCode merr; 3151cec0304SVijay Mahadevan moab::EntityHandle partnset; 3161cec0304SVijay Mahadevan PetscInt rank, nprocs; 317853cdec3SJed Brown DM_Moab *dmmoab; 3181d72bce8STim Tautges 3191d72bce8STim Tautges PetscFunctionBegin; 320032b8ab6SVijay Mahadevan PetscValidPointer(dmb,6); 321032b8ab6SVijay Mahadevan ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr); 322032b8ab6SVijay Mahadevan dmmoab = (DM_Moab*)(*dmb)->data; 323a4d2169cSTim Tautges 324a4d2169cSTim Tautges if (!mbiface) { 32572ff976dSVijay Mahadevan dmmoab->mbiface = new moab::Core(); 3267d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_TRUE; 3271d72bce8STim Tautges } 3281cec0304SVijay Mahadevan else { 3291cec0304SVijay Mahadevan dmmoab->mbiface = mbiface; 3307d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_FALSE; 3311cec0304SVijay Mahadevan } 3321cec0304SVijay Mahadevan 3331cec0304SVijay Mahadevan /* create a fileset to store the hierarchy of entities belonging to current DM */ 3341cec0304SVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_ORDERED, dmmoab->fileset);MBERR("Creating file set failed", merr); 3357d89fc02STim Tautges 336a4d2169cSTim Tautges if (!pcomm) { 337032b8ab6SVijay Mahadevan ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 338032b8ab6SVijay Mahadevan ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr); 339032b8ab6SVijay Mahadevan 340db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 341db66d124SVijay Mahadevan to the load_file functions to be populated. */ 34272ff976dSVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset); 343032b8ab6SVijay Mahadevan MBERR("Creating partition set failed", merr); 344032b8ab6SVijay Mahadevan 345db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 34672ff976dSVijay Mahadevan dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm); 34772ff976dSVijay Mahadevan } 34872ff976dSVijay Mahadevan else { 34972ff976dSVijay Mahadevan ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr); 350032b8ab6SVijay Mahadevan } 351032b8ab6SVijay Mahadevan 3524973de03SVijay Mahadevan /* do the remaining initializations for DMMoab */ 3534973de03SVijay Mahadevan dmmoab->bs = 1; 3544973de03SVijay Mahadevan 3554973de03SVijay Mahadevan /* set global ID tag handle */ 356032b8ab6SVijay Mahadevan if (!ltog_tag) { 3574973de03SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 358032b8ab6SVijay Mahadevan } 359032b8ab6SVijay Mahadevan else { 360032b8ab6SVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr); 361a4d2169cSTim Tautges } 362a4d2169cSTim Tautges 3634973de03SVijay Mahadevan /* set the local range of entities (vertices) of interest */ 364a4d2169cSTim Tautges if (range) { 3655eb88e9dSVijay Mahadevan ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr); 366a4d2169cSTim Tautges } 3671d72bce8STim Tautges PetscFunctionReturn(0); 3681d72bce8STim Tautges } 3691d72bce8STim Tautges 3701d72bce8STim Tautges #undef __FUNCT__ 3711d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm" 372aa768e4cSTim Tautges /*@ 373aa768e4cSTim Tautges DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab 374aa768e4cSTim Tautges 375aa768e4cSTim Tautges Collective on MPI_Comm 376aa768e4cSTim Tautges 377aa768e4cSTim Tautges Input Parameter: 378aa768e4cSTim Tautges . dm - The DMMoab object being set 379aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab 380aa768e4cSTim Tautges 381aa768e4cSTim Tautges Level: beginner 382aa768e4cSTim Tautges 383aa768e4cSTim Tautges .keywords: DMMoab, create 384aa768e4cSTim Tautges @*/ 3851d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm) 3861d72bce8STim Tautges { 387032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 388032b8ab6SVijay Mahadevan 3891d72bce8STim Tautges PetscFunctionBegin; 3901d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3911cec0304SVijay Mahadevan PetscValidPointer(pcomm,2); 392032b8ab6SVijay Mahadevan dmmoab->pcomm = pcomm; 393032b8ab6SVijay Mahadevan dmmoab->mbiface = pcomm->get_moab(); 394032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 3951d72bce8STim Tautges PetscFunctionReturn(0); 3961d72bce8STim Tautges } 3971d72bce8STim Tautges 3981d72bce8STim Tautges 3991d72bce8STim Tautges #undef __FUNCT__ 4001d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm" 401aa768e4cSTim Tautges /*@ 402aa768e4cSTim Tautges DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab 403aa768e4cSTim Tautges 404aa768e4cSTim Tautges Collective on MPI_Comm 405aa768e4cSTim Tautges 406aa768e4cSTim Tautges Input Parameter: 407aa768e4cSTim Tautges . dm - The DMMoab object being set 408aa768e4cSTim Tautges 409aa768e4cSTim Tautges Output Parameter: 410aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 411aa768e4cSTim Tautges 412aa768e4cSTim Tautges Level: beginner 413aa768e4cSTim Tautges 414aa768e4cSTim Tautges .keywords: DMMoab, create 415aa768e4cSTim Tautges @*/ 4161d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm) 4171d72bce8STim Tautges { 4181d72bce8STim Tautges PetscFunctionBegin; 4191d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 420032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 4211d72bce8STim Tautges PetscFunctionReturn(0); 4221d72bce8STim Tautges } 4231d72bce8STim Tautges 4241d72bce8STim Tautges 4251d72bce8STim Tautges #undef __FUNCT__ 4261d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface" 427aa768e4cSTim Tautges /*@ 428aa768e4cSTim Tautges DMMoabSetInterface - Set the MOAB instance used with this DMMoab 429aa768e4cSTim Tautges 430aa768e4cSTim Tautges Collective on MPI_Comm 431aa768e4cSTim Tautges 432aa768e4cSTim Tautges Input Parameter: 433aa768e4cSTim Tautges . dm - The DMMoab object being set 434aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab 435aa768e4cSTim Tautges 436aa768e4cSTim Tautges Level: beginner 437aa768e4cSTim Tautges 438aa768e4cSTim Tautges .keywords: DMMoab, create 439aa768e4cSTim Tautges @*/ 440a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface) 4411d72bce8STim Tautges { 442032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 443032b8ab6SVijay Mahadevan 4441d72bce8STim Tautges PetscFunctionBegin; 4451d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4461cec0304SVijay Mahadevan PetscValidPointer(mbiface,2); 447032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 448032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 449032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 4501d72bce8STim Tautges PetscFunctionReturn(0); 4511d72bce8STim Tautges } 4521d72bce8STim Tautges 4531d72bce8STim Tautges 4541d72bce8STim Tautges #undef __FUNCT__ 4551d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface" 456aa768e4cSTim Tautges /*@ 457aa768e4cSTim Tautges DMMoabGetInterface - Get the MOAB instance used with this DMMoab 458aa768e4cSTim Tautges 459aa768e4cSTim Tautges Collective on MPI_Comm 460aa768e4cSTim Tautges 461aa768e4cSTim Tautges Input Parameter: 462aa768e4cSTim Tautges . dm - The DMMoab object being set 463aa768e4cSTim Tautges 464aa768e4cSTim Tautges Output Parameter: 465aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab 466aa768e4cSTim Tautges 467aa768e4cSTim Tautges Level: beginner 468aa768e4cSTim Tautges 469aa768e4cSTim Tautges .keywords: DMMoab, create 470aa768e4cSTim Tautges @*/ 471a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface) 4721d72bce8STim Tautges { 4739426e041SSatish Balay PetscErrorCode ierr; 474cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 475cabb514dSBarry Smith 4761d72bce8STim Tautges PetscFunctionBegin; 4771d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 478cabb514dSBarry 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); 479a4d2169cSTim Tautges *mbiface = ((DM_Moab*)dm->data)->mbiface; 4801d72bce8STim Tautges PetscFunctionReturn(0); 4811d72bce8STim Tautges } 4821d72bce8STim Tautges 4831d72bce8STim Tautges 4841d72bce8STim Tautges #undef __FUNCT__ 4855eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices" 486aa768e4cSTim Tautges /*@ 4875eb88e9dSVijay Mahadevan DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab 488aa768e4cSTim Tautges 489aa768e4cSTim Tautges Collective on MPI_Comm 490aa768e4cSTim Tautges 491aa768e4cSTim Tautges Input Parameter: 492aa768e4cSTim Tautges . dm - The DMMoab object being set 493aa768e4cSTim Tautges . range - The entities treated by this DMMoab 494aa768e4cSTim Tautges 495aa768e4cSTim Tautges Level: beginner 496aa768e4cSTim Tautges 497aa768e4cSTim Tautges .keywords: DMMoab, create 498aa768e4cSTim Tautges @*/ 4995eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range) 5001d72bce8STim Tautges { 501032b8ab6SVijay Mahadevan moab::ErrorCode merr; 502032b8ab6SVijay Mahadevan PetscErrorCode ierr; 503032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 504032b8ab6SVijay Mahadevan 5051d72bce8STim Tautges PetscFunctionBegin; 5061d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 507032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 508032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 509032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 510032b8ab6SVijay Mahadevan *dmmoab->vowned = *dmmoab->vlocal; 511032b8ab6SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 512032b8ab6SVijay Mahadevan *dmmoab->vghost = moab::subtract(*range, *dmmoab->vowned); 513032b8ab6SVijay Mahadevan dmmoab->nloc=dmmoab->vowned->size(); 514032b8ab6SVijay Mahadevan dmmoab->nghost=dmmoab->vghost->size(); 515032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 5161d72bce8STim Tautges PetscFunctionReturn(0); 5171d72bce8STim Tautges } 5181d72bce8STim Tautges 5191d72bce8STim Tautges 5201d72bce8STim Tautges #undef __FUNCT__ 5215eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices" 522aa768e4cSTim Tautges /*@ 5235eb88e9dSVijay Mahadevan DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab 524aa768e4cSTim Tautges 525aa768e4cSTim Tautges Collective on MPI_Comm 526aa768e4cSTim Tautges 527aa768e4cSTim Tautges Input Parameter: 528aa768e4cSTim Tautges . dm - The DMMoab object being set 529aa768e4cSTim Tautges 530aa768e4cSTim Tautges Output Parameter: 5315eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab 5325eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition 533aa768e4cSTim Tautges 534aa768e4cSTim Tautges Level: beginner 535aa768e4cSTim Tautges 536aa768e4cSTim Tautges .keywords: DMMoab, create 537aa768e4cSTim Tautges @*/ 5381cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,moab::Range *owned,moab::Range *ghost) 5391d72bce8STim Tautges { 5401d72bce8STim Tautges PetscFunctionBegin; 5411d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5421cec0304SVijay Mahadevan if (owned) *owned = *((DM_Moab*)dm->data)->vowned; 5431cec0304SVijay Mahadevan if (ghost) *ghost = *((DM_Moab*)dm->data)->vghost; 5441d72bce8STim Tautges PetscFunctionReturn(0); 5451d72bce8STim Tautges } 5461d72bce8STim Tautges 5471d72bce8STim Tautges #undef __FUNCT__ 5485eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements" 5495eb88e9dSVijay Mahadevan /*@ 5505eb88e9dSVijay Mahadevan DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned 5515eb88e9dSVijay Mahadevan 5525eb88e9dSVijay Mahadevan Collective on MPI_Comm 5535eb88e9dSVijay Mahadevan 5545eb88e9dSVijay Mahadevan Input Parameter: 5555eb88e9dSVijay Mahadevan . dm - The DMMoab object being set 5565eb88e9dSVijay Mahadevan 5575eb88e9dSVijay Mahadevan Output Parameter: 5585eb88e9dSVijay Mahadevan . range - The entities owned locally 5595eb88e9dSVijay Mahadevan 5605eb88e9dSVijay Mahadevan Level: beginner 5615eb88e9dSVijay Mahadevan 5625eb88e9dSVijay Mahadevan .keywords: DMMoab, create 5635eb88e9dSVijay Mahadevan @*/ 5641cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,moab::Range *range) 5655eb88e9dSVijay Mahadevan { 5665eb88e9dSVijay Mahadevan PetscFunctionBegin; 5675eb88e9dSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5681cec0304SVijay Mahadevan if (range) *range = *((DM_Moab*)dm->data)->elocal; 5691cec0304SVijay Mahadevan PetscFunctionReturn(0); 5701cec0304SVijay Mahadevan } 5711cec0304SVijay Mahadevan 5721cec0304SVijay Mahadevan 5731cec0304SVijay Mahadevan #undef __FUNCT__ 5741cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements" 5751cec0304SVijay Mahadevan /*@ 5761cec0304SVijay Mahadevan DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab 5771cec0304SVijay Mahadevan 5781cec0304SVijay Mahadevan Collective on MPI_Comm 5791cec0304SVijay Mahadevan 5801cec0304SVijay Mahadevan Input Parameter: 5811cec0304SVijay Mahadevan . dm - The DMMoab object being set 5821cec0304SVijay Mahadevan . range - The entities treated by this DMMoab 5831cec0304SVijay Mahadevan 5841cec0304SVijay Mahadevan Level: beginner 5851cec0304SVijay Mahadevan 5861cec0304SVijay Mahadevan .keywords: DMMoab, create 5871cec0304SVijay Mahadevan @*/ 5881cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range) 5891cec0304SVijay Mahadevan { 5901cec0304SVijay Mahadevan moab::ErrorCode merr; 5911cec0304SVijay Mahadevan PetscErrorCode ierr; 5921cec0304SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 5931cec0304SVijay Mahadevan 5941cec0304SVijay Mahadevan PetscFunctionBegin; 5951cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5961cec0304SVijay Mahadevan dmmoab->elocal->clear(); 5971cec0304SVijay Mahadevan dmmoab->eghost->clear(); 5981cec0304SVijay Mahadevan dmmoab->elocal->insert(range->begin(), range->end()); 5991cec0304SVijay Mahadevan PetscInfo2(dm, "Range size = %D; elocal size = %D.\n", range->size(), dmmoab->elocal->size()); 6001cec0304SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 6011cec0304SVijay Mahadevan *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal); 6021cec0304SVijay Mahadevan dmmoab->neleloc=dmmoab->elocal->size(); 6031cec0304SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 6041cec0304SVijay Mahadevan PetscInfo2(dm, "Created %D local and %D glocal elements.\n", dmmoab->neleloc, dmmoab->nele); 6055eb88e9dSVijay Mahadevan PetscFunctionReturn(0); 6065eb88e9dSVijay Mahadevan } 6075eb88e9dSVijay Mahadevan 6085eb88e9dSVijay Mahadevan 6095eb88e9dSVijay Mahadevan #undef __FUNCT__ 6101d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag" 611aa768e4cSTim Tautges /*@ 612aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 613aa768e4cSTim Tautges 614aa768e4cSTim Tautges Collective on MPI_Comm 615aa768e4cSTim Tautges 616aa768e4cSTim Tautges Input Parameter: 617aa768e4cSTim Tautges . dm - The DMMoab object being set 618aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 619aa768e4cSTim Tautges 620aa768e4cSTim Tautges Level: beginner 621aa768e4cSTim Tautges 622aa768e4cSTim Tautges .keywords: DMMoab, create 623aa768e4cSTim Tautges @*/ 6241d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag) 6251d72bce8STim Tautges { 6261d72bce8STim Tautges PetscFunctionBegin; 6271d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6281d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 6291d72bce8STim Tautges PetscFunctionReturn(0); 6301d72bce8STim Tautges } 6311d72bce8STim Tautges 6321d72bce8STim Tautges 6331d72bce8STim Tautges #undef __FUNCT__ 6341d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag" 635aa768e4cSTim Tautges /*@ 636aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 637aa768e4cSTim Tautges 638aa768e4cSTim Tautges Collective on MPI_Comm 639aa768e4cSTim Tautges 640aa768e4cSTim Tautges Input Parameter: 641aa768e4cSTim Tautges . dm - The DMMoab object being set 642aa768e4cSTim Tautges 643aa768e4cSTim Tautges Output Parameter: 644aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 645aa768e4cSTim Tautges 646aa768e4cSTim Tautges Level: beginner 647aa768e4cSTim Tautges 648aa768e4cSTim Tautges .keywords: DMMoab, create 649aa768e4cSTim Tautges @*/ 6501d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag) 6511d72bce8STim Tautges { 6521d72bce8STim Tautges PetscFunctionBegin; 6531d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6541d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 6551d72bce8STim Tautges PetscFunctionReturn(0); 6561d72bce8STim Tautges } 6571d72bce8STim Tautges 6581d72bce8STim Tautges 6591d72bce8STim Tautges #undef __FUNCT__ 6601d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize" 661aa768e4cSTim Tautges /*@ 662aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 663aa768e4cSTim Tautges 664aa768e4cSTim Tautges Collective on MPI_Comm 665aa768e4cSTim Tautges 666aa768e4cSTim Tautges Input Parameter: 667aa768e4cSTim Tautges . dm - The DMMoab object being set 668aa768e4cSTim Tautges . bs - The block size used with this DMMoab 669aa768e4cSTim Tautges 670aa768e4cSTim Tautges Level: beginner 671aa768e4cSTim Tautges 672aa768e4cSTim Tautges .keywords: DMMoab, create 673aa768e4cSTim Tautges @*/ 6741d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs) 6751d72bce8STim Tautges { 6761d72bce8STim Tautges PetscFunctionBegin; 6771d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6781d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 6791d72bce8STim Tautges PetscFunctionReturn(0); 6801d72bce8STim Tautges } 6811d72bce8STim Tautges 6821d72bce8STim Tautges 6831d72bce8STim Tautges #undef __FUNCT__ 6841d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize" 685aa768e4cSTim Tautges /*@ 686aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 687aa768e4cSTim Tautges 688aa768e4cSTim Tautges Collective on MPI_Comm 689aa768e4cSTim Tautges 690aa768e4cSTim Tautges Input Parameter: 691aa768e4cSTim Tautges . dm - The DMMoab object being set 692aa768e4cSTim Tautges 693aa768e4cSTim Tautges Output Parameter: 694aa768e4cSTim Tautges . bs - The block size used with this DMMoab 695aa768e4cSTim Tautges 696aa768e4cSTim Tautges Level: beginner 697aa768e4cSTim Tautges 698aa768e4cSTim Tautges .keywords: DMMoab, create 699aa768e4cSTim Tautges @*/ 7001d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs) 7011d72bce8STim Tautges { 7021d72bce8STim Tautges PetscFunctionBegin; 7031d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7041d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 7051d72bce8STim Tautges PetscFunctionReturn(0); 7061d72bce8STim Tautges } 7071d72bce8STim Tautges 7081cec0304SVijay Mahadevan 7091cec0304SVijay Mahadevan #undef __FUNCT__ 7101cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldVector" 7111cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec) 7121cec0304SVijay Mahadevan { 7131cec0304SVijay Mahadevan DM_Moab *dmmoab; 7141cec0304SVijay Mahadevan moab::Tag vtag,ntag; 7151cec0304SVijay Mahadevan PetscScalar *varray; 7161cec0304SVijay Mahadevan moab::ErrorCode merr; 7171cec0304SVijay Mahadevan PetscErrorCode ierr; 7181cec0304SVijay Mahadevan PetscSection section; 7191cec0304SVijay Mahadevan PetscInt doff; 7201cec0304SVijay Mahadevan std::string tag_name; 7211cec0304SVijay Mahadevan moab::Range::iterator iter; 7221cec0304SVijay Mahadevan 7231cec0304SVijay Mahadevan PetscFunctionBegin; 7241cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7251cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7261cec0304SVijay Mahadevan 7271cec0304SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 7281cec0304SVijay Mahadevan 7291cec0304SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 7301cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag, 7311cec0304SVijay Mahadevan moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr); 7321cec0304SVijay Mahadevan 7331cec0304SVijay Mahadevan ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr); 7341cec0304SVijay Mahadevan 7351cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name); 7361cec0304SVijay Mahadevan if (!tag_name.length() && merr !=moab::MB_SUCCESS) { 7371cec0304SVijay Mahadevan ierr = DMMoabVecGetArray(dm,fvec,&varray);CHKERRQ(ierr); 7381cec0304SVijay Mahadevan for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) { 7391cec0304SVijay Mahadevan moab::EntityHandle vtx = (*iter); 7401cec0304SVijay Mahadevan 7411cec0304SVijay Mahadevan /* get field dof index */ 7421cec0304SVijay Mahadevan ierr = PetscSectionGetFieldOffset(section, vtx, ifield, &doff); 7431cec0304SVijay Mahadevan 7441cec0304SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */ 7451cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, &vtx, 1, (const void*)&varray[doff]);MBERRNM(merr); 7461cec0304SVijay Mahadevan } 7471cec0304SVijay Mahadevan ierr = DMMoabVecRestoreArray(dm,fvec,&varray);CHKERRQ(ierr); 7481cec0304SVijay Mahadevan } 7491cec0304SVijay Mahadevan else { 7501cec0304SVijay Mahadevan ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&varray);CHKERRQ(ierr); 7511cec0304SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 7521cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray);MBERRNM(merr); 7531cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)varray);MBERRNM(merr); 7541cec0304SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 7551cec0304SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr); 7561cec0304SVijay Mahadevan ierr = PetscFree(varray);CHKERRQ(ierr); 7571cec0304SVijay Mahadevan } 7581cec0304SVijay Mahadevan PetscFunctionReturn(0); 7591cec0304SVijay Mahadevan } 7601cec0304SVijay Mahadevan 7611cec0304SVijay Mahadevan 7621cec0304SVijay Mahadevan #undef __FUNCT__ 7637023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates" 7647023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos) 7657023aa44SVijay Mahadevan { 7667023aa44SVijay Mahadevan DM_Moab *dmmoab; 7677023aa44SVijay Mahadevan PetscErrorCode ierr; 7687023aa44SVijay Mahadevan moab::ErrorCode merr; 7697023aa44SVijay Mahadevan 7707023aa44SVijay Mahadevan PetscFunctionBegin; 7717023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7727023aa44SVijay Mahadevan PetscValidPointer(conn,3); 7737023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7747023aa44SVijay Mahadevan 7757023aa44SVijay Mahadevan if (!vpos) { 7767023aa44SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr); 7777023aa44SVijay Mahadevan } 7787023aa44SVijay Mahadevan 7797023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 7807023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr); 7817023aa44SVijay Mahadevan PetscFunctionReturn(0); 7827023aa44SVijay Mahadevan } 7837023aa44SVijay Mahadevan 7847023aa44SVijay Mahadevan 7857023aa44SVijay Mahadevan #undef __FUNCT__ 7867023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity" 7877023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn) 7887023aa44SVijay Mahadevan { 7897023aa44SVijay Mahadevan DM_Moab *dmmoab; 7907023aa44SVijay Mahadevan const moab::EntityHandle *connect; 7917023aa44SVijay Mahadevan moab::ErrorCode merr; 7927023aa44SVijay Mahadevan PetscInt nnodes; 7937023aa44SVijay Mahadevan 7947023aa44SVijay Mahadevan PetscFunctionBegin; 7957023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7967023aa44SVijay Mahadevan PetscValidPointer(conn,4); 7977023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7987023aa44SVijay Mahadevan 7997023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 8007023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr); 8017023aa44SVijay Mahadevan if (conn) *conn=connect; 8027023aa44SVijay Mahadevan if (nconn) *nconn=nnodes; 8037023aa44SVijay Mahadevan PetscFunctionReturn(0); 8047023aa44SVijay Mahadevan } 8057023aa44SVijay Mahadevan 8067023aa44SVijay Mahadevan 8077023aa44SVijay Mahadevan #undef __FUNCT__ 808*69263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary" 809*69263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary) 810*69263071SVijay Mahadevan { 811*69263071SVijay Mahadevan moab::EntityType etype; 812*69263071SVijay Mahadevan DM_Moab *dmmoab; 813*69263071SVijay Mahadevan PetscInt edim; 814*69263071SVijay Mahadevan 815*69263071SVijay Mahadevan PetscFunctionBegin; 816*69263071SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 817*69263071SVijay Mahadevan PetscValidPointer(ent_on_boundary,3); 818*69263071SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 819*69263071SVijay Mahadevan 820*69263071SVijay Mahadevan /* get the entity type and handle accordingly */ 821*69263071SVijay Mahadevan etype=dmmoab->mbiface->type_from_handle(ent); 822*69263071SVijay 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); 823*69263071SVijay Mahadevan 824*69263071SVijay Mahadevan /* get the entity dimension */ 825*69263071SVijay Mahadevan edim=dmmoab->mbiface->dimension_from_handle(ent); 826*69263071SVijay Mahadevan 827*69263071SVijay Mahadevan *ent_on_boundary=PETSC_FALSE; 828*69263071SVijay Mahadevan if(etype == moab::MBVERTEX && edim == 0) { 829*69263071SVijay Mahadevan moab::Range::const_iterator giter = dmmoab->bndyvtx->find(ent); 830*69263071SVijay Mahadevan if (giter != dmmoab->bndyvtx->end()) *ent_on_boundary=PETSC_TRUE; 831*69263071SVijay Mahadevan } 832*69263071SVijay Mahadevan else { 833*69263071SVijay Mahadevan if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */ 834*69263071SVijay Mahadevan moab::Range::const_iterator geiter = dmmoab->bndyelems->find(ent); 835*69263071SVijay Mahadevan if (geiter != dmmoab->bndyelems->end()) *ent_on_boundary=PETSC_TRUE; 836*69263071SVijay Mahadevan } 837*69263071SVijay Mahadevan else { /* next check the lower-dimensional faces */ 838*69263071SVijay Mahadevan moab::Range::const_iterator gfiter = dmmoab->bndyfaces->find(ent); 839*69263071SVijay Mahadevan if (gfiter != dmmoab->bndyfaces->end()) *ent_on_boundary=PETSC_TRUE; 840*69263071SVijay Mahadevan } 841*69263071SVijay Mahadevan } 842*69263071SVijay Mahadevan PetscFunctionReturn(0); 843*69263071SVijay Mahadevan } 844*69263071SVijay Mahadevan 845*69263071SVijay Mahadevan 846*69263071SVijay Mahadevan #undef __FUNCT__ 8477023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices" 848*69263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx) 8497023aa44SVijay Mahadevan { 8507023aa44SVijay Mahadevan DM_Moab *dmmoab; 8517023aa44SVijay Mahadevan PetscInt i; 8527023aa44SVijay Mahadevan 8537023aa44SVijay Mahadevan PetscFunctionBegin; 8547023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8557023aa44SVijay Mahadevan PetscValidPointer(cnt,3); 8567023aa44SVijay Mahadevan PetscValidPointer(isbdvtx,4); 8577023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8587023aa44SVijay Mahadevan 8597023aa44SVijay Mahadevan for (i=0; i < nconn; ++i) { 8607023aa44SVijay Mahadevan moab::Range::const_iterator giter = dmmoab->bndyvtx->find(cnt[i]); 861*69263071SVijay Mahadevan if (giter != dmmoab->bndyvtx->end()) isbdvtx[i] = PETSC_TRUE; 8627023aa44SVijay Mahadevan else isbdvtx[i] = PETSC_FALSE; 8637023aa44SVijay Mahadevan } 8647023aa44SVijay Mahadevan PetscFunctionReturn(0); 8657023aa44SVijay Mahadevan } 8667023aa44SVijay Mahadevan 8677023aa44SVijay Mahadevan 8687023aa44SVijay Mahadevan #undef __FUNCT__ 8691cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryEntities" 870*69263071SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryEntities(DM dm,moab::Range *bdvtx,moab::Range* bdfaces,moab::Range* bdelems) 8711cec0304SVijay Mahadevan { 8721cec0304SVijay Mahadevan DM_Moab *dmmoab; 8731cec0304SVijay Mahadevan 8741cec0304SVijay Mahadevan PetscFunctionBegin; 8751cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8761cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8771cec0304SVijay Mahadevan 8781cec0304SVijay Mahadevan if (bdvtx) *bdvtx = *dmmoab->bndyvtx; 8791cec0304SVijay Mahadevan if (bdfaces) *bdfaces = *dmmoab->bndyfaces; 880*69263071SVijay Mahadevan if (bdelems) *bdfaces = *dmmoab->bndyelems; 8811cec0304SVijay Mahadevan PetscFunctionReturn(0); 8821cec0304SVijay Mahadevan } 8831cec0304SVijay Mahadevan 8841cec0304SVijay Mahadevan 8851cec0304SVijay Mahadevan #undef __FUNCT__ 8861cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFields" 8871cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFields(DM dm,PetscInt nfields,const char** fields) 8881cec0304SVijay Mahadevan { 8891cec0304SVijay Mahadevan DM_Moab *dmmoab; 8901cec0304SVijay Mahadevan 8911cec0304SVijay Mahadevan PetscFunctionBegin; 8921cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8931cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8941cec0304SVijay Mahadevan 8951cec0304SVijay Mahadevan dmmoab->fields = fields; 8961cec0304SVijay Mahadevan dmmoab->nfields = nfields; 8971cec0304SVijay Mahadevan PetscFunctionReturn(0); 8981cec0304SVijay Mahadevan } 8991cec0304SVijay Mahadevan 9001cec0304SVijay Mahadevan 9011cec0304SVijay Mahadevan #undef __FUNCT__ 9021cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDof" 9031cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof) 9041cec0304SVijay Mahadevan { 9051cec0304SVijay Mahadevan PetscSection section; 906fc418013SVijay Mahadevan PetscInt gid; 9071cec0304SVijay Mahadevan PetscErrorCode ierr; 908fc418013SVijay Mahadevan moab::ErrorCode merr; 909fc418013SVijay Mahadevan DM_Moab *dmmoab; 9101cec0304SVijay Mahadevan 9111cec0304SVijay Mahadevan PetscFunctionBegin; 9121cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 913fc418013SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 914fc418013SVijay Mahadevan 9151cec0304SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 916fc418013SVijay Mahadevan 917fc418013SVijay Mahadevan /* first get the global ID for the point */ 918fc418013SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,&point,1,&gid);MBERRNM(merr); 919fc418013SVijay Mahadevan 920fc418013SVijay Mahadevan /* get the dof value for the field */ 921fc418013SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, gid, field, dof);CHKERRQ(ierr); 9221cec0304SVijay Mahadevan PetscFunctionReturn(0); 9231cec0304SVijay Mahadevan } 9241cec0304SVijay Mahadevan 9251cec0304SVijay Mahadevan 9261cec0304SVijay Mahadevan #undef __FUNCT__ 9271cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofs" 9281cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof) 9291cec0304SVijay Mahadevan { 930fc418013SVijay Mahadevan PetscInt i,gid; 9311cec0304SVijay Mahadevan PetscSection section; 9321cec0304SVijay Mahadevan PetscErrorCode ierr; 933fc418013SVijay Mahadevan moab::ErrorCode merr; 934fc418013SVijay Mahadevan DM_Moab *dmmoab; 9351cec0304SVijay Mahadevan 9361cec0304SVijay Mahadevan PetscFunctionBegin; 9371cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 938fc418013SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 939fc418013SVijay Mahadevan 9401cec0304SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 9411cec0304SVijay Mahadevan if (!dof) { 9421cec0304SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr); 9431cec0304SVijay Mahadevan } 944fc418013SVijay Mahadevan 945fc418013SVijay Mahadevan /* first get the local indices */ 946fc418013SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,points,npoints,dof);MBERRNM(merr); 947fc418013SVijay Mahadevan 9481cec0304SVijay Mahadevan for (i=0; i<npoints; ++i) { 949fc418013SVijay Mahadevan gid=dof[i]; 950fc418013SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, gid, field, &dof[i]);CHKERRQ(ierr); 9511cec0304SVijay Mahadevan } 9521cec0304SVijay Mahadevan PetscFunctionReturn(0); 9531cec0304SVijay Mahadevan } 9541cec0304SVijay Mahadevan 9551cec0304SVijay Mahadevan 956fc418013SVijay Mahadevan #undef __FUNCT__ 957fc418013SVijay Mahadevan #define __FUNCT__ "DMMoab_GetWriteOptions_Private" 958fc418013SVijay Mahadevan PetscErrorCode DMMoab_GetWriteOptions_Private(PetscInt fsetid, PetscInt numproc, PetscInt dim, MoabWriteMode mode, PetscInt dbglevel, const char* extra_opts, const char** write_opts) 959fc418013SVijay Mahadevan { 960fc418013SVijay Mahadevan std::ostringstream str; 961fc418013SVijay Mahadevan 962fc418013SVijay Mahadevan PetscFunctionBegin; 963fc418013SVijay Mahadevan 964fc418013SVijay Mahadevan // do parallel read unless only one processor 965fc418013SVijay Mahadevan if (numproc > 1) { 966fc418013SVijay Mahadevan str << "PARALLEL=" << mode << ";"; 967fc418013SVijay Mahadevan if (fsetid>=0) str << "PARALLEL_COMM=" << fsetid << ";"; 968fc418013SVijay Mahadevan } 969fc418013SVijay Mahadevan 970fc418013SVijay Mahadevan if (dbglevel) 971fc418013SVijay Mahadevan str << "CPUTIME;DEBUG_IO=" << dbglevel << ";"; 972fc418013SVijay Mahadevan 973fc418013SVijay Mahadevan if (extra_opts) 974fc418013SVijay Mahadevan str << extra_opts ; 975fc418013SVijay Mahadevan 976fc418013SVijay Mahadevan *write_opts = str.str().c_str(); 977fc418013SVijay Mahadevan PetscFunctionReturn(0); 978fc418013SVijay Mahadevan } 979fc418013SVijay Mahadevan 980fc418013SVijay Mahadevan 981fc418013SVijay Mahadevan #undef __FUNCT__ 982fc418013SVijay Mahadevan #define __FUNCT__ "DMMoabOutput" 983fc418013SVijay Mahadevan PetscErrorCode DMMoabOutput(DM dm,const char* filename,const char* usrwriteopts) 984fc418013SVijay Mahadevan { 985fc418013SVijay Mahadevan DM_Moab *dmmoab; 986fc418013SVijay Mahadevan PetscInt dbglevel=0; 987fc418013SVijay Mahadevan const char *writeopts; 988fc418013SVijay Mahadevan 989fc418013SVijay Mahadevan PetscErrorCode ierr; 990fc418013SVijay Mahadevan moab::ErrorCode merr; 991fc418013SVijay Mahadevan 992fc418013SVijay Mahadevan PetscFunctionBegin; 993fc418013SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 994fc418013SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 995fc418013SVijay Mahadevan 996fc418013SVijay Mahadevan PetscBarrier((PetscObject)dm); 997fc418013SVijay Mahadevan 998fc418013SVijay Mahadevan /* TODO: Use command-line options to control by_rank, verbosity, MoabReadMode and extra options */ 999fc418013SVijay Mahadevan ierr = PetscOptionsBegin(PETSC_COMM_WORLD, "", "Options for reading/writing MOAB based meshes from file", "DMMoab"); 1000fc418013SVijay Mahadevan ierr = PetscOptionsInt("-dmmb_rw_dbg", "The verbosity level for reading and writing MOAB meshes", "dmmbutil.cxx", dbglevel, &dbglevel, NULL);CHKERRQ(ierr); 1001fc418013SVijay Mahadevan ierr = PetscOptionsEnd(); 1002fc418013SVijay Mahadevan 1003fc418013SVijay Mahadevan /* add mesh loading options specific to the DM */ 1004fc418013SVijay Mahadevan ierr = DMMoab_GetWriteOptions_Private(dmmoab->pcomm->get_id(), dmmoab->pcomm->size(), dmmoab->dim, MOAB_PARWOPTS_WRITE_PART, dbglevel, usrwriteopts, &writeopts);CHKERRQ(ierr); 1005fc418013SVijay Mahadevan PetscInfo2(dm, "Writing file %s with options: %s\n",filename,writeopts); 1006fc418013SVijay Mahadevan 1007fc418013SVijay Mahadevan /* output file, using parallel write */ 1008fc418013SVijay Mahadevan merr = dmmoab->mbiface->write_file(filename, NULL, writeopts, &dmmoab->fileset, 1);MBERRVM(dmmoab->mbiface,"Writing output of DMMoab failed.",merr); 1009fc418013SVijay Mahadevan PetscFunctionReturn(0); 1010fc418013SVijay Mahadevan } 1011fc418013SVijay Mahadevan 1012