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> 6032b8ab6SVijay Mahadevan 7853cdec3SJed Brown #undef __FUNCT__ 8853cdec3SJed Brown #define __FUNCT__ "DMDestroy_Moab" 9853cdec3SJed Brown PetscErrorCode DMDestroy_Moab(DM dm) 10853cdec3SJed Brown { 11853cdec3SJed Brown PetscErrorCode ierr; 12032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 13853cdec3SJed Brown 14853cdec3SJed Brown PetscFunctionBegin; 15853cdec3SJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 16032b8ab6SVijay Mahadevan if (dmmoab->icreatedinstance) { 17032b8ab6SVijay Mahadevan delete dmmoab->mbiface; 18853cdec3SJed Brown } 19032b8ab6SVijay Mahadevan dmmoab->mbiface = NULL; 20032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 21032b8ab6SVijay Mahadevan delete dmmoab->vlocal; 22032b8ab6SVijay Mahadevan delete dmmoab->vowned; 23032b8ab6SVijay Mahadevan delete dmmoab->vghost; 24032b8ab6SVijay Mahadevan delete dmmoab->elocal; 25032b8ab6SVijay Mahadevan delete dmmoab->eghost; 26032b8ab6SVijay Mahadevan ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 27032b8ab6SVijay Mahadevan ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr); 28853cdec3SJed Brown ierr = PetscFree(dm->data);CHKERRQ(ierr); 29853cdec3SJed Brown PetscFunctionReturn(0); 30853cdec3SJed Brown } 31853cdec3SJed Brown 32aa768e4cSTim Tautges #undef __FUNCT__ 33032b8ab6SVijay Mahadevan #define __FUNCT__ "DMSetUp_Moab" 34032b8ab6SVijay Mahadevan PetscErrorCode DMSetUp_Moab(DM dm) 35032b8ab6SVijay Mahadevan { 36032b8ab6SVijay Mahadevan PetscErrorCode ierr; 37032b8ab6SVijay Mahadevan moab::ErrorCode merr; 38032b8ab6SVijay Mahadevan Vec local, global; 39032b8ab6SVijay Mahadevan IS from; 40032b8ab6SVijay Mahadevan moab::Range::iterator iter; 41*db66d124SVijay Mahadevan PetscInt bs, *gsindices,gsiz,lsiz; 42032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 43032b8ab6SVijay Mahadevan PetscInt count,dof,totsize; 44032b8ab6SVijay Mahadevan 45032b8ab6SVijay Mahadevan PetscFunctionBegin; 46032b8ab6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 47032b8ab6SVijay Mahadevan /* Get the local and shared vertices and cache it */ 48032b8ab6SVijay 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."); 49032b8ab6SVijay Mahadevan 50032b8ab6SVijay Mahadevan /* store the current mesh dimension */ 51032b8ab6SVijay Mahadevan merr = dmmoab->mbiface->get_dimension(dmmoab->dim);MBERRNM(merr); 52032b8ab6SVijay Mahadevan 53032b8ab6SVijay Mahadevan /* Get the entities recursively in the current part of the mesh */ 54032b8ab6SVijay Mahadevan if (dmmoab->vlocal->empty()) { 55032b8ab6SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_type(0,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr); 56032b8ab6SVijay Mahadevan *dmmoab->vowned = *dmmoab->vlocal; 57032b8ab6SVijay Mahadevan 58032b8ab6SVijay Mahadevan /* filter based on parallel status */ 59032b8ab6SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 60032b8ab6SVijay Mahadevan *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 61032b8ab6SVijay Mahadevan 62032b8ab6SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 63032b8ab6SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 64032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 65032b8ab6SVijay Mahadevan } 66032b8ab6SVijay Mahadevan 67032b8ab6SVijay Mahadevan /* get the information about the local elements in the mesh */ 68032b8ab6SVijay Mahadevan { 69032b8ab6SVijay Mahadevan dmmoab->elocal->clear(); 70032b8ab6SVijay Mahadevan dmmoab->eghost->clear(); 71032b8ab6SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(0, dmmoab->dim, *dmmoab->elocal, true);CHKERRQ(merr); 72032b8ab6SVijay Mahadevan *dmmoab->eghost = *dmmoab->elocal; 73032b8ab6SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 74032b8ab6SVijay Mahadevan *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal); 75032b8ab6SVijay Mahadevan 76032b8ab6SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 77032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 78032b8ab6SVijay Mahadevan } 79032b8ab6SVijay Mahadevan 80032b8ab6SVijay Mahadevan bs = dmmoab->bs; 81032b8ab6SVijay Mahadevan if (!dmmoab->ltog_tag) { 82*db66d124SVijay Mahadevan /* Get the global ID tag. The global ID tag is applied to each 83*db66d124SVijay Mahadevan vertex. It acts as an global identifier which MOAB uses to 84*db66d124SVijay Mahadevan assemble the individual pieces of the mesh */ 85032b8ab6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 86032b8ab6SVijay Mahadevan } 87032b8ab6SVijay Mahadevan 88032b8ab6SVijay Mahadevan { 89032b8ab6SVijay Mahadevan count=0; 90032b8ab6SVijay Mahadevan totsize=dmmoab->vlocal->size(); 91032b8ab6SVijay Mahadevan ierr = PetscMalloc(totsize*sizeof(PetscInt), &gsindices);CHKERRQ(ierr); 92032b8ab6SVijay Mahadevan /* first get the local indices */ 93032b8ab6SVijay Mahadevan for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) { 94032b8ab6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,&(*iter),1,&dof);MBERRNM(merr); 95032b8ab6SVijay Mahadevan gsindices[count++] = (dof); 96032b8ab6SVijay Mahadevan } 97032b8ab6SVijay Mahadevan /* now get the ghosted indices */ 98032b8ab6SVijay Mahadevan for(iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++) { 99032b8ab6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,&(*iter),1,&dof);MBERRNM(merr); 100032b8ab6SVijay Mahadevan gsindices[count++] = (dof); 101032b8ab6SVijay Mahadevan } 102032b8ab6SVijay Mahadevan 103032b8ab6SVijay Mahadevan /* Create Global to Local Vector Scatter Context */ 104032b8ab6SVijay Mahadevan ierr = DMCreateGlobalVector_Moab(dm, &global);CHKERRQ(ierr); 105032b8ab6SVijay Mahadevan ierr = DMCreateLocalVector_Moab(dm, &local);CHKERRQ(ierr); 106032b8ab6SVijay Mahadevan 107032b8ab6SVijay Mahadevan /* global to local must retrieve ghost points */ 108032b8ab6SVijay Mahadevan ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,gsindices,PETSC_COPY_VALUES,&from);CHKERRQ(ierr); 109032b8ab6SVijay Mahadevan 110*db66d124SVijay Mahadevan ierr = VecGetLocalSize(global,&gsiz);CHKERRQ(ierr); 111*db66d124SVijay Mahadevan ierr = VecGetLocalSize(local,&lsiz);CHKERRQ(ierr); 112032b8ab6SVijay Mahadevan 113032b8ab6SVijay Mahadevan ierr = VecScatterCreate(local,from,global,from,&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 114032b8ab6SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 115032b8ab6SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 116032b8ab6SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 117032b8ab6SVijay Mahadevan ierr = PetscFree(gsindices);CHKERRQ(ierr); 118032b8ab6SVijay Mahadevan } 119032b8ab6SVijay Mahadevan 120032b8ab6SVijay Mahadevan PetscFunctionReturn(0); 121032b8ab6SVijay Mahadevan } 122032b8ab6SVijay Mahadevan 123032b8ab6SVijay Mahadevan #undef __FUNCT__ 124aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab" 125853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 126aa768e4cSTim Tautges { 127aa768e4cSTim Tautges PetscErrorCode ierr; 128aa768e4cSTim Tautges 129aa768e4cSTim Tautges PetscFunctionBegin; 130aa768e4cSTim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 131032b8ab6SVijay Mahadevan ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr); 132032b8ab6SVijay Mahadevan 133032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 134032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 135032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 136032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 137032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 138032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 139032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL; 140032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL; 141032b8ab6SVijay Mahadevan 142032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 143032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 144032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 145032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 146032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 147aa768e4cSTim Tautges 14897ea90e6SJed Brown dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 14997ea90e6SJed Brown dm->ops->createlocalvector = DMCreateLocalVector_Moab; 150032b8ab6SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 151032b8ab6SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 15297ea90e6SJed Brown dm->ops->destroy = DMDestroy_Moab; 153032b8ab6SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 154032b8ab6SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 155032b8ab6SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 156032b8ab6SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 157aa768e4cSTim Tautges PetscFunctionReturn(0); 158aa768e4cSTim Tautges } 159fd349b41STim Tautges 160fd349b41STim Tautges #undef __FUNCT__ 1611d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate" 1621d72bce8STim Tautges /*@ 1631d72bce8STim Tautges DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance 1641d72bce8STim Tautges 1651d72bce8STim Tautges Collective on MPI_Comm 1661d72bce8STim Tautges 1671d72bce8STim Tautges Input Parameter: 1681d72bce8STim Tautges . comm - The communicator for the DMMoab object 1691d72bce8STim Tautges 1701d72bce8STim Tautges Output Parameter: 171032b8ab6SVijay Mahadevan . dmb - The DMMoab object 1721d72bce8STim Tautges 1731d72bce8STim Tautges Level: beginner 1741d72bce8STim Tautges 1751d72bce8STim Tautges .keywords: DMMoab, create 1761d72bce8STim Tautges @*/ 177032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb) 1781d72bce8STim Tautges { 1791d72bce8STim Tautges PetscErrorCode ierr; 1801d72bce8STim Tautges 1811d72bce8STim Tautges PetscFunctionBegin; 182032b8ab6SVijay Mahadevan PetscValidPointer(dmb,2); 183032b8ab6SVijay Mahadevan ierr = DMCreate(comm, dmb);CHKERRQ(ierr); 184032b8ab6SVijay Mahadevan ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr); 1851d72bce8STim Tautges PetscFunctionReturn(0); 1861d72bce8STim Tautges } 1871d72bce8STim Tautges 1881d72bce8STim Tautges #undef __FUNCT__ 189aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab" 1901d72bce8STim Tautges /*@ 191a4d2169cSTim Tautges DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data 1921d72bce8STim Tautges 1931d72bce8STim Tautges Collective on MPI_Comm 1941d72bce8STim Tautges 1951d72bce8STim Tautges Input Parameter: 1961d72bce8STim Tautges . comm - The communicator for the DMMoab object 197032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed 198a4d2169cSTim Tautges along with the DMMoab 199a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator 2001d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag 2011d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned 2021d72bce8STim Tautges 2031d72bce8STim Tautges Output Parameter: 204032b8ab6SVijay Mahadevan . dmb - The DMMoab object 2051d72bce8STim Tautges 206032b8ab6SVijay Mahadevan Level: intermediate 2071d72bce8STim Tautges 2081d72bce8STim Tautges .keywords: DMMoab, create 2091d72bce8STim Tautges @*/ 210032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb) 2111d72bce8STim Tautges { 2121d72bce8STim Tautges PetscErrorCode ierr; 213032b8ab6SVijay Mahadevan moab::ErrorCode merr; 214853cdec3SJed Brown DM_Moab *dmmoab; 2151d72bce8STim Tautges 2161d72bce8STim Tautges PetscFunctionBegin; 217032b8ab6SVijay Mahadevan PetscValidPointer(dmb,6); 218032b8ab6SVijay Mahadevan ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr); 219032b8ab6SVijay Mahadevan dmmoab = (DM_Moab*)(*dmb)->data; 220a4d2169cSTim Tautges 221a4d2169cSTim Tautges if (!mbiface) { 222a4d2169cSTim Tautges mbiface = new moab::Core(); 2237d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_TRUE; 2241d72bce8STim Tautges } 2257d89fc02STim Tautges else 2267d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_FALSE; 2277d89fc02STim Tautges 228a4d2169cSTim Tautges if (!pcomm) { 229032b8ab6SVijay Mahadevan moab::EntityHandle rootset,partnset; 2301d72bce8STim Tautges PetscInt rank, nprocs; 231032b8ab6SVijay Mahadevan ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 232032b8ab6SVijay Mahadevan ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr); 233032b8ab6SVijay Mahadevan 234*db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 235*db66d124SVijay Mahadevan to the load_file functions to be populated. */ 236032b8ab6SVijay Mahadevan merr = mbiface->create_meshset(moab::MESHSET_SET, rootset); 237032b8ab6SVijay Mahadevan MBERR("Creating root set failed", merr); 238032b8ab6SVijay Mahadevan merr = mbiface->create_meshset(moab::MESHSET_SET, partnset); 239032b8ab6SVijay Mahadevan MBERR("Creating partition set failed", merr); 240032b8ab6SVijay Mahadevan 241*db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 242032b8ab6SVijay Mahadevan pcomm = moab::ParallelComm::get_pcomm(mbiface, partnset, &comm); 243032b8ab6SVijay Mahadevan } 244032b8ab6SVijay Mahadevan 245032b8ab6SVijay Mahadevan if (!ltog_tag) { 246032b8ab6SVijay Mahadevan merr = mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, *ltog_tag);MBERRNM(merr); 247032b8ab6SVijay Mahadevan } 248032b8ab6SVijay Mahadevan else { 249032b8ab6SVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr); 250a4d2169cSTim Tautges } 251a4d2169cSTim Tautges 252*db66d124SVijay Mahadevan /* do the initialization of the DM */ 253032b8ab6SVijay Mahadevan dmmoab->bs = 1; 254032b8ab6SVijay Mahadevan ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr); 255032b8ab6SVijay Mahadevan dmmoab->ltog_tag = *ltog_tag; 256a4d2169cSTim Tautges if (range) { 257032b8ab6SVijay Mahadevan ierr = DMMoabSetRange(*dmb, range);CHKERRQ(ierr); 258a4d2169cSTim Tautges } 2591d72bce8STim Tautges PetscFunctionReturn(0); 2601d72bce8STim Tautges } 2611d72bce8STim Tautges 2621d72bce8STim Tautges #undef __FUNCT__ 2631d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm" 264aa768e4cSTim Tautges /*@ 265aa768e4cSTim Tautges DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab 266aa768e4cSTim Tautges 267aa768e4cSTim Tautges Collective on MPI_Comm 268aa768e4cSTim Tautges 269aa768e4cSTim Tautges Input Parameter: 270aa768e4cSTim Tautges . dm - The DMMoab object being set 271aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab 272aa768e4cSTim Tautges 273aa768e4cSTim Tautges Level: beginner 274aa768e4cSTim Tautges 275aa768e4cSTim Tautges .keywords: DMMoab, create 276aa768e4cSTim Tautges @*/ 2771d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm) 2781d72bce8STim Tautges { 279032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 280032b8ab6SVijay Mahadevan 2811d72bce8STim Tautges PetscFunctionBegin; 2821d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 283032b8ab6SVijay Mahadevan dmmoab->pcomm = pcomm; 284032b8ab6SVijay Mahadevan dmmoab->mbiface = pcomm->get_moab(); 285032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 2861d72bce8STim Tautges PetscFunctionReturn(0); 2871d72bce8STim Tautges } 2881d72bce8STim Tautges 2891d72bce8STim Tautges 2901d72bce8STim Tautges #undef __FUNCT__ 2911d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm" 292aa768e4cSTim Tautges /*@ 293aa768e4cSTim Tautges DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab 294aa768e4cSTim Tautges 295aa768e4cSTim Tautges Collective on MPI_Comm 296aa768e4cSTim Tautges 297aa768e4cSTim Tautges Input Parameter: 298aa768e4cSTim Tautges . dm - The DMMoab object being set 299aa768e4cSTim Tautges 300aa768e4cSTim Tautges Output Parameter: 301aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 302aa768e4cSTim Tautges 303aa768e4cSTim Tautges Level: beginner 304aa768e4cSTim Tautges 305aa768e4cSTim Tautges .keywords: DMMoab, create 306aa768e4cSTim Tautges @*/ 3071d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm) 3081d72bce8STim Tautges { 3091d72bce8STim Tautges PetscFunctionBegin; 3101d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 311032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 3121d72bce8STim Tautges PetscFunctionReturn(0); 3131d72bce8STim Tautges } 3141d72bce8STim Tautges 3151d72bce8STim Tautges 3161d72bce8STim Tautges #undef __FUNCT__ 3171d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface" 318aa768e4cSTim Tautges /*@ 319aa768e4cSTim Tautges DMMoabSetInterface - Set the MOAB instance used with this DMMoab 320aa768e4cSTim Tautges 321aa768e4cSTim Tautges Collective on MPI_Comm 322aa768e4cSTim Tautges 323aa768e4cSTim Tautges Input Parameter: 324aa768e4cSTim Tautges . dm - The DMMoab object being set 325aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab 326aa768e4cSTim Tautges 327aa768e4cSTim Tautges Level: beginner 328aa768e4cSTim Tautges 329aa768e4cSTim Tautges .keywords: DMMoab, create 330aa768e4cSTim Tautges @*/ 331a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface) 3321d72bce8STim Tautges { 333032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 334032b8ab6SVijay Mahadevan 3351d72bce8STim Tautges PetscFunctionBegin; 3361d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 337032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 338032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 339032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 3401d72bce8STim Tautges PetscFunctionReturn(0); 3411d72bce8STim Tautges } 3421d72bce8STim Tautges 3431d72bce8STim Tautges 3441d72bce8STim Tautges #undef __FUNCT__ 3451d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface" 346aa768e4cSTim Tautges /*@ 347aa768e4cSTim Tautges DMMoabGetInterface - Get the MOAB instance used with this DMMoab 348aa768e4cSTim Tautges 349aa768e4cSTim Tautges Collective on MPI_Comm 350aa768e4cSTim Tautges 351aa768e4cSTim Tautges Input Parameter: 352aa768e4cSTim Tautges . dm - The DMMoab object being set 353aa768e4cSTim Tautges 354aa768e4cSTim Tautges Output Parameter: 355aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab 356aa768e4cSTim Tautges 357aa768e4cSTim Tautges Level: beginner 358aa768e4cSTim Tautges 359aa768e4cSTim Tautges .keywords: DMMoab, create 360aa768e4cSTim Tautges @*/ 361a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface) 3621d72bce8STim Tautges { 3639426e041SSatish Balay PetscErrorCode ierr; 364cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 365cabb514dSBarry Smith 3661d72bce8STim Tautges PetscFunctionBegin; 3671d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 368cabb514dSBarry 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); 369a4d2169cSTim Tautges *mbiface = ((DM_Moab*)dm->data)->mbiface; 3701d72bce8STim Tautges PetscFunctionReturn(0); 3711d72bce8STim Tautges } 3721d72bce8STim Tautges 3731d72bce8STim Tautges 3741d72bce8STim Tautges #undef __FUNCT__ 3751d72bce8STim Tautges #define __FUNCT__ "DMMoabSetRange" 376aa768e4cSTim Tautges /*@ 377aa768e4cSTim Tautges DMMoabSetRange - Set the entities having DOFs on this DMMoab 378aa768e4cSTim Tautges 379aa768e4cSTim Tautges Collective on MPI_Comm 380aa768e4cSTim Tautges 381aa768e4cSTim Tautges Input Parameter: 382aa768e4cSTim Tautges . dm - The DMMoab object being set 383aa768e4cSTim Tautges . range - The entities treated by this DMMoab 384aa768e4cSTim Tautges 385aa768e4cSTim Tautges Level: beginner 386aa768e4cSTim Tautges 387aa768e4cSTim Tautges .keywords: DMMoab, create 388aa768e4cSTim Tautges @*/ 389032b8ab6SVijay Mahadevan PetscErrorCode DMMoabSetRange(DM dm,moab::Range *range) 3901d72bce8STim Tautges { 391032b8ab6SVijay Mahadevan moab::ErrorCode merr; 392032b8ab6SVijay Mahadevan PetscErrorCode ierr; 393032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 394032b8ab6SVijay Mahadevan 3951d72bce8STim Tautges PetscFunctionBegin; 3961d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 397032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 398032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 399032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 400032b8ab6SVijay Mahadevan *dmmoab->vowned = *dmmoab->vlocal; 401032b8ab6SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 402032b8ab6SVijay Mahadevan *dmmoab->vghost = moab::subtract(*range, *dmmoab->vowned); 403032b8ab6SVijay Mahadevan dmmoab->nloc=dmmoab->vowned->size(); 404032b8ab6SVijay Mahadevan dmmoab->nghost=dmmoab->vghost->size(); 405032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 4061d72bce8STim Tautges PetscFunctionReturn(0); 4071d72bce8STim Tautges } 4081d72bce8STim Tautges 4091d72bce8STim Tautges 4101d72bce8STim Tautges #undef __FUNCT__ 4111d72bce8STim Tautges #define __FUNCT__ "DMMoabGetRange" 412aa768e4cSTim Tautges /*@ 413aa768e4cSTim Tautges DMMoabGetRange - Get the entities having DOFs on this DMMoab 414aa768e4cSTim Tautges 415aa768e4cSTim Tautges Collective on MPI_Comm 416aa768e4cSTim Tautges 417aa768e4cSTim Tautges Input Parameter: 418aa768e4cSTim Tautges . dm - The DMMoab object being set 419aa768e4cSTim Tautges 420aa768e4cSTim Tautges Output Parameter: 421aa768e4cSTim Tautges . range - The entities treated by this DMMoab 422aa768e4cSTim Tautges 423aa768e4cSTim Tautges Level: beginner 424aa768e4cSTim Tautges 425aa768e4cSTim Tautges .keywords: DMMoab, create 426aa768e4cSTim Tautges @*/ 427032b8ab6SVijay Mahadevan PetscErrorCode DMMoabGetRange(DM dm,moab::Range **range) 4281d72bce8STim Tautges { 4291d72bce8STim Tautges PetscFunctionBegin; 4301d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 431032b8ab6SVijay Mahadevan *range = ((DM_Moab*)dm->data)->vowned; 4321d72bce8STim Tautges PetscFunctionReturn(0); 4331d72bce8STim Tautges } 4341d72bce8STim Tautges 4351d72bce8STim Tautges #undef __FUNCT__ 4361d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag" 437aa768e4cSTim Tautges /*@ 438aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 439aa768e4cSTim Tautges 440aa768e4cSTim Tautges Collective on MPI_Comm 441aa768e4cSTim Tautges 442aa768e4cSTim Tautges Input Parameter: 443aa768e4cSTim Tautges . dm - The DMMoab object being set 444aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 445aa768e4cSTim Tautges 446aa768e4cSTim Tautges Level: beginner 447aa768e4cSTim Tautges 448aa768e4cSTim Tautges .keywords: DMMoab, create 449aa768e4cSTim Tautges @*/ 4501d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag) 4511d72bce8STim Tautges { 4521d72bce8STim Tautges PetscFunctionBegin; 4531d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4541d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 4551d72bce8STim Tautges PetscFunctionReturn(0); 4561d72bce8STim Tautges } 4571d72bce8STim Tautges 4581d72bce8STim Tautges 4591d72bce8STim Tautges #undef __FUNCT__ 4601d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag" 461aa768e4cSTim Tautges /*@ 462aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 463aa768e4cSTim Tautges 464aa768e4cSTim Tautges Collective on MPI_Comm 465aa768e4cSTim Tautges 466aa768e4cSTim Tautges Input Parameter: 467aa768e4cSTim Tautges . dm - The DMMoab object being set 468aa768e4cSTim Tautges 469aa768e4cSTim Tautges Output Parameter: 470aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 471aa768e4cSTim Tautges 472aa768e4cSTim Tautges Level: beginner 473aa768e4cSTim Tautges 474aa768e4cSTim Tautges .keywords: DMMoab, create 475aa768e4cSTim Tautges @*/ 4761d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag) 4771d72bce8STim Tautges { 4781d72bce8STim Tautges PetscFunctionBegin; 4791d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4801d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 4811d72bce8STim Tautges PetscFunctionReturn(0); 4821d72bce8STim Tautges } 4831d72bce8STim Tautges 4841d72bce8STim Tautges 4851d72bce8STim Tautges #undef __FUNCT__ 4861d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize" 487aa768e4cSTim Tautges /*@ 488aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 489aa768e4cSTim Tautges 490aa768e4cSTim Tautges Collective on MPI_Comm 491aa768e4cSTim Tautges 492aa768e4cSTim Tautges Input Parameter: 493aa768e4cSTim Tautges . dm - The DMMoab object being set 494aa768e4cSTim Tautges . bs - The block size used with this DMMoab 495aa768e4cSTim Tautges 496aa768e4cSTim Tautges Level: beginner 497aa768e4cSTim Tautges 498aa768e4cSTim Tautges .keywords: DMMoab, create 499aa768e4cSTim Tautges @*/ 5001d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs) 5011d72bce8STim Tautges { 5021d72bce8STim Tautges PetscFunctionBegin; 5031d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5041d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 5051d72bce8STim Tautges PetscFunctionReturn(0); 5061d72bce8STim Tautges } 5071d72bce8STim Tautges 5081d72bce8STim Tautges 5091d72bce8STim Tautges #undef __FUNCT__ 5101d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize" 511aa768e4cSTim Tautges /*@ 512aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 513aa768e4cSTim Tautges 514aa768e4cSTim Tautges Collective on MPI_Comm 515aa768e4cSTim Tautges 516aa768e4cSTim Tautges Input Parameter: 517aa768e4cSTim Tautges . dm - The DMMoab object being set 518aa768e4cSTim Tautges 519aa768e4cSTim Tautges Output Parameter: 520aa768e4cSTim Tautges . bs - The block size used with this DMMoab 521aa768e4cSTim Tautges 522aa768e4cSTim Tautges Level: beginner 523aa768e4cSTim Tautges 524aa768e4cSTim Tautges .keywords: DMMoab, create 525aa768e4cSTim Tautges @*/ 5261d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs) 5271d72bce8STim Tautges { 5281d72bce8STim Tautges PetscFunctionBegin; 5291d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5301d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 5311d72bce8STim Tautges PetscFunctionReturn(0); 5321d72bce8STim Tautges } 5331d72bce8STim Tautges 534