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; 41db66d124SVijay 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) { 82db66d124SVijay Mahadevan /* Get the global ID tag. The global ID tag is applied to each 83db66d124SVijay Mahadevan vertex. It acts as an global identifier which MOAB uses to 84db66d124SVijay 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 */ 93*4a40b570SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&gsindices[0]);MBERRNM(merr); 94*4a40b570SVijay Mahadevan /* next get the ghosted indices */ 95*4a40b570SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&gsindices[dmmoab->nloc]);MBERRNM(merr); 96032b8ab6SVijay Mahadevan 97032b8ab6SVijay Mahadevan /* Create Global to Local Vector Scatter Context */ 98032b8ab6SVijay Mahadevan ierr = DMCreateGlobalVector_Moab(dm, &global);CHKERRQ(ierr); 99032b8ab6SVijay Mahadevan ierr = DMCreateLocalVector_Moab(dm, &local);CHKERRQ(ierr); 100032b8ab6SVijay Mahadevan 101032b8ab6SVijay Mahadevan /* global to local must retrieve ghost points */ 102032b8ab6SVijay Mahadevan ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,gsindices,PETSC_COPY_VALUES,&from);CHKERRQ(ierr); 103032b8ab6SVijay Mahadevan 104db66d124SVijay Mahadevan ierr = VecGetLocalSize(global,&gsiz);CHKERRQ(ierr); 105db66d124SVijay Mahadevan ierr = VecGetLocalSize(local,&lsiz);CHKERRQ(ierr); 106032b8ab6SVijay Mahadevan 107032b8ab6SVijay Mahadevan ierr = VecScatterCreate(local,from,global,from,&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 108032b8ab6SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 109032b8ab6SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 110032b8ab6SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 111032b8ab6SVijay Mahadevan ierr = PetscFree(gsindices);CHKERRQ(ierr); 112032b8ab6SVijay Mahadevan } 113032b8ab6SVijay Mahadevan 114032b8ab6SVijay Mahadevan PetscFunctionReturn(0); 115032b8ab6SVijay Mahadevan } 116032b8ab6SVijay Mahadevan 117032b8ab6SVijay Mahadevan #undef __FUNCT__ 118aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab" 119853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 120aa768e4cSTim Tautges { 121aa768e4cSTim Tautges PetscErrorCode ierr; 122aa768e4cSTim Tautges 123aa768e4cSTim Tautges PetscFunctionBegin; 124aa768e4cSTim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 125032b8ab6SVijay Mahadevan ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr); 126032b8ab6SVijay Mahadevan 127032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 128032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 129032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 130032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 131032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 132032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 133032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL; 134032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL; 135032b8ab6SVijay Mahadevan 136032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 137032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 138032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 139032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 140032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 141aa768e4cSTim Tautges 14297ea90e6SJed Brown dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 14397ea90e6SJed Brown dm->ops->createlocalvector = DMCreateLocalVector_Moab; 144032b8ab6SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 145032b8ab6SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 14697ea90e6SJed Brown dm->ops->destroy = DMDestroy_Moab; 147032b8ab6SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 148032b8ab6SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 149032b8ab6SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 150032b8ab6SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 151aa768e4cSTim Tautges PetscFunctionReturn(0); 152aa768e4cSTim Tautges } 153fd349b41STim Tautges 154fd349b41STim Tautges #undef __FUNCT__ 1551d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate" 1561d72bce8STim Tautges /*@ 1571d72bce8STim Tautges DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance 1581d72bce8STim Tautges 1591d72bce8STim Tautges Collective on MPI_Comm 1601d72bce8STim Tautges 1611d72bce8STim Tautges Input Parameter: 1621d72bce8STim Tautges . comm - The communicator for the DMMoab object 1631d72bce8STim Tautges 1641d72bce8STim Tautges Output Parameter: 165032b8ab6SVijay Mahadevan . dmb - The DMMoab object 1661d72bce8STim Tautges 1671d72bce8STim Tautges Level: beginner 1681d72bce8STim Tautges 1691d72bce8STim Tautges .keywords: DMMoab, create 1701d72bce8STim Tautges @*/ 171032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb) 1721d72bce8STim Tautges { 1731d72bce8STim Tautges PetscErrorCode ierr; 1741d72bce8STim Tautges 1751d72bce8STim Tautges PetscFunctionBegin; 176032b8ab6SVijay Mahadevan PetscValidPointer(dmb,2); 177032b8ab6SVijay Mahadevan ierr = DMCreate(comm, dmb);CHKERRQ(ierr); 178032b8ab6SVijay Mahadevan ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr); 1791d72bce8STim Tautges PetscFunctionReturn(0); 1801d72bce8STim Tautges } 1811d72bce8STim Tautges 1821d72bce8STim Tautges #undef __FUNCT__ 183aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab" 1841d72bce8STim Tautges /*@ 185a4d2169cSTim Tautges DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data 1861d72bce8STim Tautges 1871d72bce8STim Tautges Collective on MPI_Comm 1881d72bce8STim Tautges 1891d72bce8STim Tautges Input Parameter: 1901d72bce8STim Tautges . comm - The communicator for the DMMoab object 191032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed 192a4d2169cSTim Tautges along with the DMMoab 193a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator 1941d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag 1951d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned 1961d72bce8STim Tautges 1971d72bce8STim Tautges Output Parameter: 198032b8ab6SVijay Mahadevan . dmb - The DMMoab object 1991d72bce8STim Tautges 200032b8ab6SVijay Mahadevan Level: intermediate 2011d72bce8STim Tautges 2021d72bce8STim Tautges .keywords: DMMoab, create 2031d72bce8STim Tautges @*/ 204032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb) 2051d72bce8STim Tautges { 2061d72bce8STim Tautges PetscErrorCode ierr; 207032b8ab6SVijay Mahadevan moab::ErrorCode merr; 208853cdec3SJed Brown DM_Moab *dmmoab; 2091d72bce8STim Tautges 2101d72bce8STim Tautges PetscFunctionBegin; 211032b8ab6SVijay Mahadevan PetscValidPointer(dmb,6); 212032b8ab6SVijay Mahadevan ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr); 213032b8ab6SVijay Mahadevan dmmoab = (DM_Moab*)(*dmb)->data; 214a4d2169cSTim Tautges 215a4d2169cSTim Tautges if (!mbiface) { 216a4d2169cSTim Tautges mbiface = new moab::Core(); 2177d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_TRUE; 2181d72bce8STim Tautges } 2197d89fc02STim Tautges else 2207d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_FALSE; 2217d89fc02STim Tautges 222a4d2169cSTim Tautges if (!pcomm) { 223032b8ab6SVijay Mahadevan moab::EntityHandle rootset,partnset; 2241d72bce8STim Tautges PetscInt rank, nprocs; 225032b8ab6SVijay Mahadevan ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 226032b8ab6SVijay Mahadevan ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr); 227032b8ab6SVijay Mahadevan 228db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 229db66d124SVijay Mahadevan to the load_file functions to be populated. */ 230032b8ab6SVijay Mahadevan merr = mbiface->create_meshset(moab::MESHSET_SET, rootset); 231032b8ab6SVijay Mahadevan MBERR("Creating root set failed", merr); 232032b8ab6SVijay Mahadevan merr = mbiface->create_meshset(moab::MESHSET_SET, partnset); 233032b8ab6SVijay Mahadevan MBERR("Creating partition set failed", merr); 234032b8ab6SVijay Mahadevan 235db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 236032b8ab6SVijay Mahadevan pcomm = moab::ParallelComm::get_pcomm(mbiface, partnset, &comm); 237032b8ab6SVijay Mahadevan } 238032b8ab6SVijay Mahadevan 239032b8ab6SVijay Mahadevan if (!ltog_tag) { 240032b8ab6SVijay Mahadevan merr = mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, *ltog_tag);MBERRNM(merr); 241032b8ab6SVijay Mahadevan } 242032b8ab6SVijay Mahadevan else { 243032b8ab6SVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr); 244a4d2169cSTim Tautges } 245a4d2169cSTim Tautges 246db66d124SVijay Mahadevan /* do the initialization of the DM */ 247032b8ab6SVijay Mahadevan dmmoab->bs = 1; 248032b8ab6SVijay Mahadevan ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr); 249032b8ab6SVijay Mahadevan dmmoab->ltog_tag = *ltog_tag; 250a4d2169cSTim Tautges if (range) { 251032b8ab6SVijay Mahadevan ierr = DMMoabSetRange(*dmb, range);CHKERRQ(ierr); 252a4d2169cSTim Tautges } 2531d72bce8STim Tautges PetscFunctionReturn(0); 2541d72bce8STim Tautges } 2551d72bce8STim Tautges 2561d72bce8STim Tautges #undef __FUNCT__ 2571d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm" 258aa768e4cSTim Tautges /*@ 259aa768e4cSTim Tautges DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab 260aa768e4cSTim Tautges 261aa768e4cSTim Tautges Collective on MPI_Comm 262aa768e4cSTim Tautges 263aa768e4cSTim Tautges Input Parameter: 264aa768e4cSTim Tautges . dm - The DMMoab object being set 265aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab 266aa768e4cSTim Tautges 267aa768e4cSTim Tautges Level: beginner 268aa768e4cSTim Tautges 269aa768e4cSTim Tautges .keywords: DMMoab, create 270aa768e4cSTim Tautges @*/ 2711d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm) 2721d72bce8STim Tautges { 273032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 274032b8ab6SVijay Mahadevan 2751d72bce8STim Tautges PetscFunctionBegin; 2761d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 277032b8ab6SVijay Mahadevan dmmoab->pcomm = pcomm; 278032b8ab6SVijay Mahadevan dmmoab->mbiface = pcomm->get_moab(); 279032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 2801d72bce8STim Tautges PetscFunctionReturn(0); 2811d72bce8STim Tautges } 2821d72bce8STim Tautges 2831d72bce8STim Tautges 2841d72bce8STim Tautges #undef __FUNCT__ 2851d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm" 286aa768e4cSTim Tautges /*@ 287aa768e4cSTim Tautges DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab 288aa768e4cSTim Tautges 289aa768e4cSTim Tautges Collective on MPI_Comm 290aa768e4cSTim Tautges 291aa768e4cSTim Tautges Input Parameter: 292aa768e4cSTim Tautges . dm - The DMMoab object being set 293aa768e4cSTim Tautges 294aa768e4cSTim Tautges Output Parameter: 295aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 296aa768e4cSTim Tautges 297aa768e4cSTim Tautges Level: beginner 298aa768e4cSTim Tautges 299aa768e4cSTim Tautges .keywords: DMMoab, create 300aa768e4cSTim Tautges @*/ 3011d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm) 3021d72bce8STim Tautges { 3031d72bce8STim Tautges PetscFunctionBegin; 3041d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 305032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 3061d72bce8STim Tautges PetscFunctionReturn(0); 3071d72bce8STim Tautges } 3081d72bce8STim Tautges 3091d72bce8STim Tautges 3101d72bce8STim Tautges #undef __FUNCT__ 3111d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface" 312aa768e4cSTim Tautges /*@ 313aa768e4cSTim Tautges DMMoabSetInterface - Set the MOAB instance used with this DMMoab 314aa768e4cSTim Tautges 315aa768e4cSTim Tautges Collective on MPI_Comm 316aa768e4cSTim Tautges 317aa768e4cSTim Tautges Input Parameter: 318aa768e4cSTim Tautges . dm - The DMMoab object being set 319aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab 320aa768e4cSTim Tautges 321aa768e4cSTim Tautges Level: beginner 322aa768e4cSTim Tautges 323aa768e4cSTim Tautges .keywords: DMMoab, create 324aa768e4cSTim Tautges @*/ 325a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface) 3261d72bce8STim Tautges { 327032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 328032b8ab6SVijay Mahadevan 3291d72bce8STim Tautges PetscFunctionBegin; 3301d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 331032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 332032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 333032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 3341d72bce8STim Tautges PetscFunctionReturn(0); 3351d72bce8STim Tautges } 3361d72bce8STim Tautges 3371d72bce8STim Tautges 3381d72bce8STim Tautges #undef __FUNCT__ 3391d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface" 340aa768e4cSTim Tautges /*@ 341aa768e4cSTim Tautges DMMoabGetInterface - Get the MOAB instance used with this DMMoab 342aa768e4cSTim Tautges 343aa768e4cSTim Tautges Collective on MPI_Comm 344aa768e4cSTim Tautges 345aa768e4cSTim Tautges Input Parameter: 346aa768e4cSTim Tautges . dm - The DMMoab object being set 347aa768e4cSTim Tautges 348aa768e4cSTim Tautges Output Parameter: 349aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab 350aa768e4cSTim Tautges 351aa768e4cSTim Tautges Level: beginner 352aa768e4cSTim Tautges 353aa768e4cSTim Tautges .keywords: DMMoab, create 354aa768e4cSTim Tautges @*/ 355a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface) 3561d72bce8STim Tautges { 3579426e041SSatish Balay PetscErrorCode ierr; 358cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 359cabb514dSBarry Smith 3601d72bce8STim Tautges PetscFunctionBegin; 3611d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 362cabb514dSBarry 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); 363a4d2169cSTim Tautges *mbiface = ((DM_Moab*)dm->data)->mbiface; 3641d72bce8STim Tautges PetscFunctionReturn(0); 3651d72bce8STim Tautges } 3661d72bce8STim Tautges 3671d72bce8STim Tautges 3681d72bce8STim Tautges #undef __FUNCT__ 3691d72bce8STim Tautges #define __FUNCT__ "DMMoabSetRange" 370aa768e4cSTim Tautges /*@ 371aa768e4cSTim Tautges DMMoabSetRange - Set the entities having DOFs on this DMMoab 372aa768e4cSTim Tautges 373aa768e4cSTim Tautges Collective on MPI_Comm 374aa768e4cSTim Tautges 375aa768e4cSTim Tautges Input Parameter: 376aa768e4cSTim Tautges . dm - The DMMoab object being set 377aa768e4cSTim Tautges . range - The entities treated by this DMMoab 378aa768e4cSTim Tautges 379aa768e4cSTim Tautges Level: beginner 380aa768e4cSTim Tautges 381aa768e4cSTim Tautges .keywords: DMMoab, create 382aa768e4cSTim Tautges @*/ 383032b8ab6SVijay Mahadevan PetscErrorCode DMMoabSetRange(DM dm,moab::Range *range) 3841d72bce8STim Tautges { 385032b8ab6SVijay Mahadevan moab::ErrorCode merr; 386032b8ab6SVijay Mahadevan PetscErrorCode ierr; 387032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 388032b8ab6SVijay Mahadevan 3891d72bce8STim Tautges PetscFunctionBegin; 3901d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 391032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 392032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 393032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 394032b8ab6SVijay Mahadevan *dmmoab->vowned = *dmmoab->vlocal; 395032b8ab6SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 396032b8ab6SVijay Mahadevan *dmmoab->vghost = moab::subtract(*range, *dmmoab->vowned); 397032b8ab6SVijay Mahadevan dmmoab->nloc=dmmoab->vowned->size(); 398032b8ab6SVijay Mahadevan dmmoab->nghost=dmmoab->vghost->size(); 399032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 4001d72bce8STim Tautges PetscFunctionReturn(0); 4011d72bce8STim Tautges } 4021d72bce8STim Tautges 4031d72bce8STim Tautges 4041d72bce8STim Tautges #undef __FUNCT__ 4051d72bce8STim Tautges #define __FUNCT__ "DMMoabGetRange" 406aa768e4cSTim Tautges /*@ 407aa768e4cSTim Tautges DMMoabGetRange - Get the entities having DOFs on this DMMoab 408aa768e4cSTim Tautges 409aa768e4cSTim Tautges Collective on MPI_Comm 410aa768e4cSTim Tautges 411aa768e4cSTim Tautges Input Parameter: 412aa768e4cSTim Tautges . dm - The DMMoab object being set 413aa768e4cSTim Tautges 414aa768e4cSTim Tautges Output Parameter: 415aa768e4cSTim Tautges . range - The entities treated by this DMMoab 416aa768e4cSTim Tautges 417aa768e4cSTim Tautges Level: beginner 418aa768e4cSTim Tautges 419aa768e4cSTim Tautges .keywords: DMMoab, create 420aa768e4cSTim Tautges @*/ 421032b8ab6SVijay Mahadevan PetscErrorCode DMMoabGetRange(DM dm,moab::Range **range) 4221d72bce8STim Tautges { 4231d72bce8STim Tautges PetscFunctionBegin; 4241d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 425032b8ab6SVijay Mahadevan *range = ((DM_Moab*)dm->data)->vowned; 4261d72bce8STim Tautges PetscFunctionReturn(0); 4271d72bce8STim Tautges } 4281d72bce8STim Tautges 4291d72bce8STim Tautges #undef __FUNCT__ 4301d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag" 431aa768e4cSTim Tautges /*@ 432aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 433aa768e4cSTim Tautges 434aa768e4cSTim Tautges Collective on MPI_Comm 435aa768e4cSTim Tautges 436aa768e4cSTim Tautges Input Parameter: 437aa768e4cSTim Tautges . dm - The DMMoab object being set 438aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 439aa768e4cSTim Tautges 440aa768e4cSTim Tautges Level: beginner 441aa768e4cSTim Tautges 442aa768e4cSTim Tautges .keywords: DMMoab, create 443aa768e4cSTim Tautges @*/ 4441d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag) 4451d72bce8STim Tautges { 4461d72bce8STim Tautges PetscFunctionBegin; 4471d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4481d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 4491d72bce8STim Tautges PetscFunctionReturn(0); 4501d72bce8STim Tautges } 4511d72bce8STim Tautges 4521d72bce8STim Tautges 4531d72bce8STim Tautges #undef __FUNCT__ 4541d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag" 455aa768e4cSTim Tautges /*@ 456aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 457aa768e4cSTim Tautges 458aa768e4cSTim Tautges Collective on MPI_Comm 459aa768e4cSTim Tautges 460aa768e4cSTim Tautges Input Parameter: 461aa768e4cSTim Tautges . dm - The DMMoab object being set 462aa768e4cSTim Tautges 463aa768e4cSTim Tautges Output Parameter: 464aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 465aa768e4cSTim Tautges 466aa768e4cSTim Tautges Level: beginner 467aa768e4cSTim Tautges 468aa768e4cSTim Tautges .keywords: DMMoab, create 469aa768e4cSTim Tautges @*/ 4701d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag) 4711d72bce8STim Tautges { 4721d72bce8STim Tautges PetscFunctionBegin; 4731d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4741d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 4751d72bce8STim Tautges PetscFunctionReturn(0); 4761d72bce8STim Tautges } 4771d72bce8STim Tautges 4781d72bce8STim Tautges 4791d72bce8STim Tautges #undef __FUNCT__ 4801d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize" 481aa768e4cSTim Tautges /*@ 482aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 483aa768e4cSTim Tautges 484aa768e4cSTim Tautges Collective on MPI_Comm 485aa768e4cSTim Tautges 486aa768e4cSTim Tautges Input Parameter: 487aa768e4cSTim Tautges . dm - The DMMoab object being set 488aa768e4cSTim Tautges . bs - The block size used with this DMMoab 489aa768e4cSTim Tautges 490aa768e4cSTim Tautges Level: beginner 491aa768e4cSTim Tautges 492aa768e4cSTim Tautges .keywords: DMMoab, create 493aa768e4cSTim Tautges @*/ 4941d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs) 4951d72bce8STim Tautges { 4961d72bce8STim Tautges PetscFunctionBegin; 4971d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4981d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 4991d72bce8STim Tautges PetscFunctionReturn(0); 5001d72bce8STim Tautges } 5011d72bce8STim Tautges 5021d72bce8STim Tautges 5031d72bce8STim Tautges #undef __FUNCT__ 5041d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize" 505aa768e4cSTim Tautges /*@ 506aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 507aa768e4cSTim Tautges 508aa768e4cSTim Tautges Collective on MPI_Comm 509aa768e4cSTim Tautges 510aa768e4cSTim Tautges Input Parameter: 511aa768e4cSTim Tautges . dm - The DMMoab object being set 512aa768e4cSTim Tautges 513aa768e4cSTim Tautges Output Parameter: 514aa768e4cSTim Tautges . bs - The block size used with this DMMoab 515aa768e4cSTim Tautges 516aa768e4cSTim Tautges Level: beginner 517aa768e4cSTim Tautges 518aa768e4cSTim Tautges .keywords: DMMoab, create 519aa768e4cSTim Tautges @*/ 5201d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs) 5211d72bce8STim Tautges { 5221d72bce8STim Tautges PetscFunctionBegin; 5231d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5241d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 5251d72bce8STim Tautges PetscFunctionReturn(0); 5261d72bce8STim Tautges } 5271d72bce8STim Tautges 528