1*032b8ab6SVijay 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> 688face26SJed Brown #include <sstream> 71d72bce8STim Tautges 8a4d2169cSTim Tautges 91d72bce8STim Tautges #undef __FUNCT__ 10*032b8ab6SVijay Mahadevan #define __FUNCT__ "DMGlobalToLocalBegin_Moab" 11*032b8ab6SVijay Mahadevan PetscErrorCode DMGlobalToLocalBegin_Moab(DM dm,Vec g,InsertMode mode,Vec l) 12fd349b41STim Tautges { 13fd349b41STim Tautges PetscErrorCode ierr; 14fd349b41STim Tautges DM_Moab *dmmoab = (DM_Moab*)dm->data; 15fd349b41STim Tautges 16fd349b41STim Tautges PetscFunctionBegin; 17*032b8ab6SVijay Mahadevan ierr = VecScatterBegin(dmmoab->ltog_sendrecv,g,l,mode,SCATTER_FORWARD/*SCATTER_FORWARD*/);CHKERRQ(ierr); 18fd349b41STim Tautges PetscFunctionReturn(0); 19fd349b41STim Tautges } 20fd349b41STim Tautges 21fd349b41STim Tautges 22fd349b41STim Tautges #undef __FUNCT__ 23*032b8ab6SVijay Mahadevan #define __FUNCT__ "DMGlobalToLocalEnd_Moab" 24*032b8ab6SVijay Mahadevan PetscErrorCode DMGlobalToLocalEnd_Moab(DM dm,Vec g,InsertMode mode,Vec l) 25fd349b41STim Tautges { 26fd349b41STim Tautges PetscErrorCode ierr; 27fd349b41STim Tautges DM_Moab *dmmoab = (DM_Moab*)dm->data; 28fd349b41STim Tautges 29fd349b41STim Tautges PetscFunctionBegin; 30*032b8ab6SVijay Mahadevan ierr = VecScatterEnd(dmmoab->ltog_sendrecv,g,l,mode,SCATTER_FORWARD/*SCATTER_FORWARD*/);CHKERRQ(ierr); 31fd349b41STim Tautges PetscFunctionReturn(0); 32fd349b41STim Tautges } 33fd349b41STim Tautges 34*032b8ab6SVijay Mahadevan 35*032b8ab6SVijay Mahadevan #undef __FUNCT__ 36*032b8ab6SVijay Mahadevan #define __FUNCT__ "DMLocalToGlobalBegin_Moab" 37*032b8ab6SVijay Mahadevan PetscErrorCode DMLocalToGlobalBegin_Moab(DM dm,Vec l,InsertMode mode,Vec g) 38*032b8ab6SVijay Mahadevan { 39*032b8ab6SVijay Mahadevan PetscErrorCode ierr; 40*032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 41*032b8ab6SVijay Mahadevan 42*032b8ab6SVijay Mahadevan PetscFunctionBegin; 43*032b8ab6SVijay Mahadevan // PetscPrintf(PETSC_COMM_WORLD,"\n Inside local-global begin. Printing global and local vecs.\n"); 44*032b8ab6SVijay Mahadevan // ierr = VecView(g, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 45*032b8ab6SVijay Mahadevan // ierr = VecView(l, PETSC_VIEWER_STDOUT_SELF);CHKERRQ(ierr); 46*032b8ab6SVijay Mahadevan ierr = VecScatterBegin(dmmoab->ltog_sendrecv,l,g,mode,SCATTER_REVERSE);CHKERRQ(ierr); 47*032b8ab6SVijay Mahadevan PetscFunctionReturn(0); 48*032b8ab6SVijay Mahadevan } 49*032b8ab6SVijay Mahadevan 50*032b8ab6SVijay Mahadevan 51*032b8ab6SVijay Mahadevan #undef __FUNCT__ 52*032b8ab6SVijay Mahadevan #define __FUNCT__ "DMLocalToGlobalEnd_Moab" 53*032b8ab6SVijay Mahadevan PetscErrorCode DMLocalToGlobalEnd_Moab(DM dm,Vec l,InsertMode mode,Vec g) 54*032b8ab6SVijay Mahadevan { 55*032b8ab6SVijay Mahadevan PetscErrorCode ierr; 56*032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 57*032b8ab6SVijay Mahadevan 58*032b8ab6SVijay Mahadevan PetscFunctionBegin; 59*032b8ab6SVijay Mahadevan ierr = VecScatterEnd(dmmoab->ltog_sendrecv,l,g,mode,SCATTER_REVERSE);CHKERRQ(ierr); 60*032b8ab6SVijay Mahadevan PetscFunctionReturn(0); 61*032b8ab6SVijay Mahadevan } 62*032b8ab6SVijay Mahadevan 63*032b8ab6SVijay Mahadevan 64853cdec3SJed Brown #undef __FUNCT__ 65853cdec3SJed Brown #define __FUNCT__ "DMDestroy_Moab" 66853cdec3SJed Brown PetscErrorCode DMDestroy_Moab(DM dm) 67853cdec3SJed Brown { 68853cdec3SJed Brown PetscErrorCode ierr; 69*032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 70853cdec3SJed Brown 71853cdec3SJed Brown PetscFunctionBegin; 72853cdec3SJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 73*032b8ab6SVijay Mahadevan if (dmmoab->icreatedinstance) { 74*032b8ab6SVijay Mahadevan delete dmmoab->mbiface; 75853cdec3SJed Brown } 76*032b8ab6SVijay Mahadevan dmmoab->mbiface = NULL; 77*032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 78*032b8ab6SVijay Mahadevan delete dmmoab->vlocal; 79*032b8ab6SVijay Mahadevan delete dmmoab->vowned; 80*032b8ab6SVijay Mahadevan delete dmmoab->vghost; 81*032b8ab6SVijay Mahadevan delete dmmoab->elocal; 82*032b8ab6SVijay Mahadevan delete dmmoab->eghost; 83*032b8ab6SVijay Mahadevan ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 84*032b8ab6SVijay Mahadevan ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr); 85853cdec3SJed Brown ierr = PetscFree(dm->data);CHKERRQ(ierr); 86853cdec3SJed Brown PetscFunctionReturn(0); 87853cdec3SJed Brown } 88853cdec3SJed Brown 89aa768e4cSTim Tautges #undef __FUNCT__ 90*032b8ab6SVijay Mahadevan #define __FUNCT__ "DMSetUp_Moab" 91*032b8ab6SVijay Mahadevan PetscErrorCode DMSetUp_Moab(DM dm) 92*032b8ab6SVijay Mahadevan { 93*032b8ab6SVijay Mahadevan PetscErrorCode ierr; 94*032b8ab6SVijay Mahadevan moab::ErrorCode merr; 95*032b8ab6SVijay Mahadevan Vec local, global; 96*032b8ab6SVijay Mahadevan IS from; 97*032b8ab6SVijay Mahadevan moab::Range::iterator iter; 98*032b8ab6SVijay Mahadevan PetscInt bs, *gsindices; 99*032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 100*032b8ab6SVijay Mahadevan PetscInt count,dof,totsize; 101*032b8ab6SVijay Mahadevan 102*032b8ab6SVijay Mahadevan PetscFunctionBegin; 103*032b8ab6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 104*032b8ab6SVijay Mahadevan /* Get the local and shared vertices and cache it */ 105*032b8ab6SVijay 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."); 106*032b8ab6SVijay Mahadevan 107*032b8ab6SVijay Mahadevan /* store the current mesh dimension */ 108*032b8ab6SVijay Mahadevan merr = dmmoab->mbiface->get_dimension(dmmoab->dim);MBERRNM(merr); 109*032b8ab6SVijay Mahadevan 110*032b8ab6SVijay Mahadevan /* Get the entities recursively in the current part of the mesh */ 111*032b8ab6SVijay Mahadevan if (dmmoab->vlocal->empty()) { 112*032b8ab6SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_type(0,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr); 113*032b8ab6SVijay Mahadevan *dmmoab->vowned = *dmmoab->vlocal; 114*032b8ab6SVijay Mahadevan 115*032b8ab6SVijay Mahadevan /* filter based on parallel status */ 116*032b8ab6SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 117*032b8ab6SVijay Mahadevan *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 118*032b8ab6SVijay Mahadevan 119*032b8ab6SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 120*032b8ab6SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 121*032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 122*032b8ab6SVijay Mahadevan } 123*032b8ab6SVijay Mahadevan 124*032b8ab6SVijay Mahadevan // PetscPrintf(PETSC_COMM_SELF, "\n Local vertices size = %D and shared vertices = %D", dmmoab->vowned->size(), dmmoab->vghost->size()); 125*032b8ab6SVijay Mahadevan // PetscPrintf(PETSC_COMM_SELF, "\n Global vertices size = %D and local vertices = %D", dmmoab->n, dmmoab->nloc); 126*032b8ab6SVijay Mahadevan 127*032b8ab6SVijay Mahadevan /* get the information about the local elements in the mesh */ 128*032b8ab6SVijay Mahadevan { 129*032b8ab6SVijay Mahadevan dmmoab->elocal->clear(); 130*032b8ab6SVijay Mahadevan dmmoab->eghost->clear(); 131*032b8ab6SVijay Mahadevan // PetscPrintf(PETSC_COMM_SELF, "\n Getting all elements of dimension = %D", dmmoab->dim); 132*032b8ab6SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(0, dmmoab->dim, *dmmoab->elocal, true);CHKERRQ(merr); 133*032b8ab6SVijay Mahadevan *dmmoab->eghost = *dmmoab->elocal; 134*032b8ab6SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 135*032b8ab6SVijay Mahadevan *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal); 136*032b8ab6SVijay Mahadevan 137*032b8ab6SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 138*032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 139*032b8ab6SVijay Mahadevan // PetscPrintf(PETSC_COMM_SELF, "\n Global elements = %D and local elements = %D", dmmoab->nele, dmmoab->neleloc); 140*032b8ab6SVijay Mahadevan } 141*032b8ab6SVijay Mahadevan 142*032b8ab6SVijay Mahadevan bs = dmmoab->bs; 143*032b8ab6SVijay Mahadevan if (!dmmoab->ltog_tag) { 144*032b8ab6SVijay Mahadevan // Get the global ID tag. The global ID tag is applied to each 145*032b8ab6SVijay Mahadevan // vertex. It acts as an global identifier which MOAB uses to 146*032b8ab6SVijay Mahadevan // assemble the individual pieces of the mesh: 147*032b8ab6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 148*032b8ab6SVijay Mahadevan } 149*032b8ab6SVijay Mahadevan 150*032b8ab6SVijay Mahadevan { 151*032b8ab6SVijay Mahadevan count=0; 152*032b8ab6SVijay Mahadevan totsize=dmmoab->vlocal->size(); 153*032b8ab6SVijay Mahadevan ierr = PetscMalloc(totsize*sizeof(PetscInt), &gsindices);CHKERRQ(ierr); 154*032b8ab6SVijay Mahadevan /* first get the local indices */ 155*032b8ab6SVijay Mahadevan for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) { 156*032b8ab6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,&(*iter),1,&dof);MBERRNM(merr); 157*032b8ab6SVijay Mahadevan gsindices[count++] = (dof); 158*032b8ab6SVijay Mahadevan } 159*032b8ab6SVijay Mahadevan /* now get the ghosted indices */ 160*032b8ab6SVijay Mahadevan for(iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++) { 161*032b8ab6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,&(*iter),1,&dof);MBERRNM(merr); 162*032b8ab6SVijay Mahadevan gsindices[count++] = (dof); 163*032b8ab6SVijay Mahadevan } 164*032b8ab6SVijay Mahadevan 165*032b8ab6SVijay Mahadevan /* Create Global to Local Vector Scatter Context */ 166*032b8ab6SVijay Mahadevan ierr = DMCreateGlobalVector_Moab(dm, &global);CHKERRQ(ierr); 167*032b8ab6SVijay Mahadevan ierr = DMCreateLocalVector_Moab(dm, &local);CHKERRQ(ierr); 168*032b8ab6SVijay Mahadevan 169*032b8ab6SVijay Mahadevan /* global to local must retrieve ghost points */ 170*032b8ab6SVijay Mahadevan ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,gsindices,PETSC_COPY_VALUES,&from);CHKERRQ(ierr); 171*032b8ab6SVijay Mahadevan // ierr = ISCreateGeneral(((PetscObject)dm)->comm,totsize*bs,gsindices,PETSC_COPY_VALUES,&from);CHKERRQ(ierr); 172*032b8ab6SVijay Mahadevan 173*032b8ab6SVijay Mahadevan PetscInt gsiz, lsiz; 174*032b8ab6SVijay Mahadevan VecGetLocalSize(global,&gsiz); 175*032b8ab6SVijay Mahadevan VecGetLocalSize(local,&lsiz); 176*032b8ab6SVijay Mahadevan // PetscPrintf(PETSC_COMM_SELF, "\n Global vec size = %D and local vec size = %D; Local=%D; Ghosted=%D; Start=%D\n Printing From and To IS \n", gsiz, lsiz, dmmoab->nloc, dmmoab->nghost, gsindices[0]); 177*032b8ab6SVijay Mahadevan // ISView(from, PETSC_VIEWER_STDOUT_WORLD); 178*032b8ab6SVijay Mahadevan 179*032b8ab6SVijay Mahadevan ierr = VecScatterCreate(local,from,global,from,&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 180*032b8ab6SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 181*032b8ab6SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 182*032b8ab6SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 183*032b8ab6SVijay Mahadevan ierr = PetscFree(gsindices);CHKERRQ(ierr); 184*032b8ab6SVijay Mahadevan 185*032b8ab6SVijay Mahadevan /* create the local to global mapping for all indices */ 186*032b8ab6SVijay Mahadevan // ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,dmmoab->nghost*bs,gsindices,PETSC_OWN_POINTER,&dmmoab->ltog_map);CHKERRQ(ierr); 187*032b8ab6SVijay Mahadevan } 188*032b8ab6SVijay Mahadevan 189*032b8ab6SVijay Mahadevan PetscFunctionReturn(0); 190*032b8ab6SVijay Mahadevan } 191*032b8ab6SVijay Mahadevan 192*032b8ab6SVijay Mahadevan #undef __FUNCT__ 193aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab" 194853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 195aa768e4cSTim Tautges { 196aa768e4cSTim Tautges PetscErrorCode ierr; 197aa768e4cSTim Tautges 198aa768e4cSTim Tautges PetscFunctionBegin; 199aa768e4cSTim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 200*032b8ab6SVijay Mahadevan ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr); 201*032b8ab6SVijay Mahadevan 202*032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 203*032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 204*032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 205*032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 206*032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 207*032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 208*032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL; 209*032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL; 210*032b8ab6SVijay Mahadevan 211*032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 212*032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 213*032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 214*032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 215*032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 216aa768e4cSTim Tautges 21797ea90e6SJed Brown dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 21897ea90e6SJed Brown dm->ops->createlocalvector = DMCreateLocalVector_Moab; 219*032b8ab6SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 220*032b8ab6SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 22197ea90e6SJed Brown dm->ops->destroy = DMDestroy_Moab; 222*032b8ab6SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 223*032b8ab6SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 224*032b8ab6SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 225*032b8ab6SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 226aa768e4cSTim Tautges PetscFunctionReturn(0); 227aa768e4cSTim Tautges } 228fd349b41STim Tautges 229fd349b41STim Tautges #undef __FUNCT__ 2301d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate" 2311d72bce8STim Tautges /*@ 2321d72bce8STim Tautges DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance 2331d72bce8STim Tautges 2341d72bce8STim Tautges Collective on MPI_Comm 2351d72bce8STim Tautges 2361d72bce8STim Tautges Input Parameter: 2371d72bce8STim Tautges . comm - The communicator for the DMMoab object 2381d72bce8STim Tautges 2391d72bce8STim Tautges Output Parameter: 240*032b8ab6SVijay Mahadevan . dmb - The DMMoab object 2411d72bce8STim Tautges 2421d72bce8STim Tautges Level: beginner 2431d72bce8STim Tautges 2441d72bce8STim Tautges .keywords: DMMoab, create 2451d72bce8STim Tautges @*/ 246*032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb) 2471d72bce8STim Tautges { 2481d72bce8STim Tautges PetscErrorCode ierr; 2491d72bce8STim Tautges 2501d72bce8STim Tautges PetscFunctionBegin; 251*032b8ab6SVijay Mahadevan PetscValidPointer(dmb,2); 252*032b8ab6SVijay Mahadevan ierr = DMCreate(comm, dmb);CHKERRQ(ierr); 253*032b8ab6SVijay Mahadevan ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr); 2541d72bce8STim Tautges PetscFunctionReturn(0); 2551d72bce8STim Tautges } 2561d72bce8STim Tautges 2571d72bce8STim Tautges #undef __FUNCT__ 258aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab" 2591d72bce8STim Tautges /*@ 260a4d2169cSTim Tautges DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data 2611d72bce8STim Tautges 2621d72bce8STim Tautges Collective on MPI_Comm 2631d72bce8STim Tautges 2641d72bce8STim Tautges Input Parameter: 2651d72bce8STim Tautges . comm - The communicator for the DMMoab object 266*032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed 267a4d2169cSTim Tautges along with the DMMoab 268a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator 2691d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag 2701d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned 2711d72bce8STim Tautges 2721d72bce8STim Tautges Output Parameter: 273*032b8ab6SVijay Mahadevan . dmb - The DMMoab object 2741d72bce8STim Tautges 275*032b8ab6SVijay Mahadevan Level: intermediate 2761d72bce8STim Tautges 2771d72bce8STim Tautges .keywords: DMMoab, create 2781d72bce8STim Tautges @*/ 279*032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb) 2801d72bce8STim Tautges { 2811d72bce8STim Tautges PetscErrorCode ierr; 282*032b8ab6SVijay Mahadevan moab::ErrorCode merr; 283853cdec3SJed Brown DM_Moab *dmmoab; 2841d72bce8STim Tautges 2851d72bce8STim Tautges PetscFunctionBegin; 286*032b8ab6SVijay Mahadevan PetscValidPointer(dmb,6); 287*032b8ab6SVijay Mahadevan ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr); 288*032b8ab6SVijay Mahadevan dmmoab = (DM_Moab*)(*dmb)->data; 289a4d2169cSTim Tautges 290a4d2169cSTim Tautges if (!mbiface) { 291a4d2169cSTim Tautges mbiface = new moab::Core(); 2927d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_TRUE; 2931d72bce8STim Tautges } 2947d89fc02STim Tautges else 2957d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_FALSE; 2967d89fc02STim Tautges 297a4d2169cSTim Tautges if (!pcomm) { 298*032b8ab6SVijay Mahadevan moab::EntityHandle rootset,partnset; 2991d72bce8STim Tautges PetscInt rank, nprocs; 300*032b8ab6SVijay Mahadevan ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 301*032b8ab6SVijay Mahadevan ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr); 302*032b8ab6SVijay Mahadevan 303*032b8ab6SVijay Mahadevan // Create root sets for each mesh. Then pass these 304*032b8ab6SVijay Mahadevan // to the load_file functions to be populated. 305*032b8ab6SVijay Mahadevan merr = mbiface->create_meshset(moab::MESHSET_SET, rootset); 306*032b8ab6SVijay Mahadevan MBERR("Creating root set failed", merr); 307*032b8ab6SVijay Mahadevan merr = mbiface->create_meshset(moab::MESHSET_SET, partnset); 308*032b8ab6SVijay Mahadevan MBERR("Creating partition set failed", merr); 309*032b8ab6SVijay Mahadevan 310*032b8ab6SVijay Mahadevan // Create the parallel communicator object with the partition handle associated with MOAB 311*032b8ab6SVijay Mahadevan pcomm = moab::ParallelComm::get_pcomm(mbiface, partnset, &comm); 312*032b8ab6SVijay Mahadevan } 313*032b8ab6SVijay Mahadevan 314*032b8ab6SVijay Mahadevan if (!ltog_tag) { 315*032b8ab6SVijay Mahadevan merr = mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, *ltog_tag);MBERRNM(merr); 316*032b8ab6SVijay Mahadevan } 317*032b8ab6SVijay Mahadevan else { 318*032b8ab6SVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr); 319a4d2169cSTim Tautges } 320a4d2169cSTim Tautges 321a4d2169cSTim Tautges // do the initialization of the DM 322*032b8ab6SVijay Mahadevan dmmoab->bs = 1; 323*032b8ab6SVijay Mahadevan ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr); 324*032b8ab6SVijay Mahadevan dmmoab->ltog_tag = *ltog_tag; 325a4d2169cSTim Tautges if (range) { 326*032b8ab6SVijay Mahadevan ierr = DMMoabSetRange(*dmb, range);CHKERRQ(ierr); 327a4d2169cSTim Tautges } 3281d72bce8STim Tautges PetscFunctionReturn(0); 3291d72bce8STim Tautges } 3301d72bce8STim Tautges 3311d72bce8STim Tautges #undef __FUNCT__ 3321d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm" 333aa768e4cSTim Tautges /*@ 334aa768e4cSTim Tautges DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab 335aa768e4cSTim Tautges 336aa768e4cSTim Tautges Collective on MPI_Comm 337aa768e4cSTim Tautges 338aa768e4cSTim Tautges Input Parameter: 339aa768e4cSTim Tautges . dm - The DMMoab object being set 340aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab 341aa768e4cSTim Tautges 342aa768e4cSTim Tautges Level: beginner 343aa768e4cSTim Tautges 344aa768e4cSTim Tautges .keywords: DMMoab, create 345aa768e4cSTim Tautges @*/ 3461d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm) 3471d72bce8STim Tautges { 348*032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 349*032b8ab6SVijay Mahadevan 3501d72bce8STim Tautges PetscFunctionBegin; 3511d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 352*032b8ab6SVijay Mahadevan dmmoab->pcomm = pcomm; 353*032b8ab6SVijay Mahadevan dmmoab->mbiface = pcomm->get_moab(); 354*032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 3551d72bce8STim Tautges PetscFunctionReturn(0); 3561d72bce8STim Tautges } 3571d72bce8STim Tautges 3581d72bce8STim Tautges 3591d72bce8STim Tautges #undef __FUNCT__ 3601d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm" 361aa768e4cSTim Tautges /*@ 362aa768e4cSTim Tautges DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab 363aa768e4cSTim Tautges 364aa768e4cSTim Tautges Collective on MPI_Comm 365aa768e4cSTim Tautges 366aa768e4cSTim Tautges Input Parameter: 367aa768e4cSTim Tautges . dm - The DMMoab object being set 368aa768e4cSTim Tautges 369aa768e4cSTim Tautges Output Parameter: 370aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 371aa768e4cSTim Tautges 372aa768e4cSTim Tautges Level: beginner 373aa768e4cSTim Tautges 374aa768e4cSTim Tautges .keywords: DMMoab, create 375aa768e4cSTim Tautges @*/ 3761d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm) 3771d72bce8STim Tautges { 3781d72bce8STim Tautges PetscFunctionBegin; 3791d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 380*032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 3811d72bce8STim Tautges PetscFunctionReturn(0); 3821d72bce8STim Tautges } 3831d72bce8STim Tautges 3841d72bce8STim Tautges 3851d72bce8STim Tautges #undef __FUNCT__ 3861d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface" 387aa768e4cSTim Tautges /*@ 388aa768e4cSTim Tautges DMMoabSetInterface - Set the MOAB instance used with this DMMoab 389aa768e4cSTim Tautges 390aa768e4cSTim Tautges Collective on MPI_Comm 391aa768e4cSTim Tautges 392aa768e4cSTim Tautges Input Parameter: 393aa768e4cSTim Tautges . dm - The DMMoab object being set 394aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab 395aa768e4cSTim Tautges 396aa768e4cSTim Tautges Level: beginner 397aa768e4cSTim Tautges 398aa768e4cSTim Tautges .keywords: DMMoab, create 399aa768e4cSTim Tautges @*/ 400a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface) 4011d72bce8STim Tautges { 402*032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 403*032b8ab6SVijay Mahadevan 4041d72bce8STim Tautges PetscFunctionBegin; 4051d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 406*032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 407*032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 408*032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 4091d72bce8STim Tautges PetscFunctionReturn(0); 4101d72bce8STim Tautges } 4111d72bce8STim Tautges 4121d72bce8STim Tautges 4131d72bce8STim Tautges #undef __FUNCT__ 4141d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface" 415aa768e4cSTim Tautges /*@ 416aa768e4cSTim Tautges DMMoabGetInterface - Get the MOAB instance used with this DMMoab 417aa768e4cSTim Tautges 418aa768e4cSTim Tautges Collective on MPI_Comm 419aa768e4cSTim Tautges 420aa768e4cSTim Tautges Input Parameter: 421aa768e4cSTim Tautges . dm - The DMMoab object being set 422aa768e4cSTim Tautges 423aa768e4cSTim Tautges Output Parameter: 424aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab 425aa768e4cSTim Tautges 426aa768e4cSTim Tautges Level: beginner 427aa768e4cSTim Tautges 428aa768e4cSTim Tautges .keywords: DMMoab, create 429aa768e4cSTim Tautges @*/ 430a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface) 4311d72bce8STim Tautges { 4329426e041SSatish Balay PetscErrorCode ierr; 433cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 434cabb514dSBarry Smith 4351d72bce8STim Tautges PetscFunctionBegin; 4361d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 437cabb514dSBarry 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); 438a4d2169cSTim Tautges *mbiface = ((DM_Moab*)dm->data)->mbiface; 4391d72bce8STim Tautges PetscFunctionReturn(0); 4401d72bce8STim Tautges } 4411d72bce8STim Tautges 4421d72bce8STim Tautges 4431d72bce8STim Tautges #undef __FUNCT__ 4441d72bce8STim Tautges #define __FUNCT__ "DMMoabSetRange" 445aa768e4cSTim Tautges /*@ 446aa768e4cSTim Tautges DMMoabSetRange - Set the entities having DOFs on this DMMoab 447aa768e4cSTim Tautges 448aa768e4cSTim Tautges Collective on MPI_Comm 449aa768e4cSTim Tautges 450aa768e4cSTim Tautges Input Parameter: 451aa768e4cSTim Tautges . dm - The DMMoab object being set 452aa768e4cSTim Tautges . range - The entities treated by this DMMoab 453aa768e4cSTim Tautges 454aa768e4cSTim Tautges Level: beginner 455aa768e4cSTim Tautges 456aa768e4cSTim Tautges .keywords: DMMoab, create 457aa768e4cSTim Tautges @*/ 458*032b8ab6SVijay Mahadevan PetscErrorCode DMMoabSetRange(DM dm,moab::Range *range) 4591d72bce8STim Tautges { 460*032b8ab6SVijay Mahadevan moab::ErrorCode merr; 461*032b8ab6SVijay Mahadevan PetscErrorCode ierr; 462*032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 463*032b8ab6SVijay Mahadevan 4641d72bce8STim Tautges PetscFunctionBegin; 4651d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 466*032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 467*032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 468*032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 469*032b8ab6SVijay Mahadevan *dmmoab->vowned = *dmmoab->vlocal; 470*032b8ab6SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 471*032b8ab6SVijay Mahadevan *dmmoab->vghost = moab::subtract(*range, *dmmoab->vowned); 472*032b8ab6SVijay Mahadevan dmmoab->nloc=dmmoab->vowned->size(); 473*032b8ab6SVijay Mahadevan dmmoab->nghost=dmmoab->vghost->size(); 474*032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 4751d72bce8STim Tautges PetscFunctionReturn(0); 4761d72bce8STim Tautges } 4771d72bce8STim Tautges 4781d72bce8STim Tautges 4791d72bce8STim Tautges #undef __FUNCT__ 4801d72bce8STim Tautges #define __FUNCT__ "DMMoabGetRange" 481aa768e4cSTim Tautges /*@ 482aa768e4cSTim Tautges DMMoabGetRange - Get the entities having DOFs on 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 489aa768e4cSTim Tautges Output Parameter: 490aa768e4cSTim Tautges . range - The entities treated by this DMMoab 491aa768e4cSTim Tautges 492aa768e4cSTim Tautges Level: beginner 493aa768e4cSTim Tautges 494aa768e4cSTim Tautges .keywords: DMMoab, create 495aa768e4cSTim Tautges @*/ 496*032b8ab6SVijay Mahadevan PetscErrorCode DMMoabGetRange(DM dm,moab::Range **range) 4971d72bce8STim Tautges { 4981d72bce8STim Tautges PetscFunctionBegin; 4991d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 500*032b8ab6SVijay Mahadevan *range = ((DM_Moab*)dm->data)->vowned; 5011d72bce8STim Tautges PetscFunctionReturn(0); 5021d72bce8STim Tautges } 5031d72bce8STim Tautges 5041d72bce8STim Tautges #undef __FUNCT__ 5051d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag" 506aa768e4cSTim Tautges /*@ 507aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 508aa768e4cSTim Tautges 509aa768e4cSTim Tautges Collective on MPI_Comm 510aa768e4cSTim Tautges 511aa768e4cSTim Tautges Input Parameter: 512aa768e4cSTim Tautges . dm - The DMMoab object being set 513aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 514aa768e4cSTim Tautges 515aa768e4cSTim Tautges Level: beginner 516aa768e4cSTim Tautges 517aa768e4cSTim Tautges .keywords: DMMoab, create 518aa768e4cSTim Tautges @*/ 5191d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag) 5201d72bce8STim Tautges { 5211d72bce8STim Tautges PetscFunctionBegin; 5221d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5231d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 5241d72bce8STim Tautges PetscFunctionReturn(0); 5251d72bce8STim Tautges } 5261d72bce8STim Tautges 5271d72bce8STim Tautges 5281d72bce8STim Tautges #undef __FUNCT__ 5291d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag" 530aa768e4cSTim Tautges /*@ 531aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 532aa768e4cSTim Tautges 533aa768e4cSTim Tautges Collective on MPI_Comm 534aa768e4cSTim Tautges 535aa768e4cSTim Tautges Input Parameter: 536aa768e4cSTim Tautges . dm - The DMMoab object being set 537aa768e4cSTim Tautges 538aa768e4cSTim Tautges Output Parameter: 539aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 540aa768e4cSTim Tautges 541aa768e4cSTim Tautges Level: beginner 542aa768e4cSTim Tautges 543aa768e4cSTim Tautges .keywords: DMMoab, create 544aa768e4cSTim Tautges @*/ 5451d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag) 5461d72bce8STim Tautges { 5471d72bce8STim Tautges PetscFunctionBegin; 5481d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5491d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 5501d72bce8STim Tautges PetscFunctionReturn(0); 5511d72bce8STim Tautges } 5521d72bce8STim Tautges 5531d72bce8STim Tautges 5541d72bce8STim Tautges #undef __FUNCT__ 5551d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize" 556aa768e4cSTim Tautges /*@ 557aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 558aa768e4cSTim Tautges 559aa768e4cSTim Tautges Collective on MPI_Comm 560aa768e4cSTim Tautges 561aa768e4cSTim Tautges Input Parameter: 562aa768e4cSTim Tautges . dm - The DMMoab object being set 563aa768e4cSTim Tautges . bs - The block size used with this DMMoab 564aa768e4cSTim Tautges 565aa768e4cSTim Tautges Level: beginner 566aa768e4cSTim Tautges 567aa768e4cSTim Tautges .keywords: DMMoab, create 568aa768e4cSTim Tautges @*/ 5691d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs) 5701d72bce8STim Tautges { 5711d72bce8STim Tautges PetscFunctionBegin; 5721d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5731d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 5741d72bce8STim Tautges PetscFunctionReturn(0); 5751d72bce8STim Tautges } 5761d72bce8STim Tautges 5771d72bce8STim Tautges 5781d72bce8STim Tautges #undef __FUNCT__ 5791d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize" 580aa768e4cSTim Tautges /*@ 581aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 582aa768e4cSTim Tautges 583aa768e4cSTim Tautges Collective on MPI_Comm 584aa768e4cSTim Tautges 585aa768e4cSTim Tautges Input Parameter: 586aa768e4cSTim Tautges . dm - The DMMoab object being set 587aa768e4cSTim Tautges 588aa768e4cSTim Tautges Output Parameter: 589aa768e4cSTim Tautges . bs - The block size used with this DMMoab 590aa768e4cSTim Tautges 591aa768e4cSTim Tautges Level: beginner 592aa768e4cSTim Tautges 593aa768e4cSTim Tautges .keywords: DMMoab, create 594aa768e4cSTim Tautges @*/ 5951d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs) 5961d72bce8STim Tautges { 5971d72bce8STim Tautges PetscFunctionBegin; 5981d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5991d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 6001d72bce8STim Tautges PetscFunctionReturn(0); 6011d72bce8STim Tautges } 6021d72bce8STim Tautges 603