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; 2969263071SVijay 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; 49*eb9d2429SVijay Mahadevan PetscInt totsize; 501cec0304SVijay Mahadevan PetscSection section; 51*eb9d2429SVijay Mahadevan PetscInt gmin,lmin,lmax; 52032b8ab6SVijay Mahadevan 5369263071SVijay Mahadevan moab::Range adj; 5469263071SVijay Mahadevan 55032b8ab6SVijay Mahadevan PetscFunctionBegin; 56032b8ab6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 57032b8ab6SVijay Mahadevan /* Get the local and shared vertices and cache it */ 58032b8ab6SVijay 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."); 59032b8ab6SVijay Mahadevan 601cec0304SVijay Mahadevan /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */ 61032b8ab6SVijay Mahadevan if (dmmoab->vlocal->empty()) { 621cec0304SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr); 63032b8ab6SVijay Mahadevan 64032b8ab6SVijay Mahadevan /* filter based on parallel status */ 65fc418013SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 66032b8ab6SVijay Mahadevan *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 67032b8ab6SVijay Mahadevan 68032b8ab6SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 69032b8ab6SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 70032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 71fc418013SVijay Mahadevan 72e23c60ebSVijay Mahadevan #if 0 73fc418013SVijay Mahadevan if(dmmoab->pcomm->rank() || dmmoab->pcomm->size()==1) { 74fc418013SVijay Mahadevan PetscPrintf(PETSC_COMM_SELF, "Vertices: global: %D, local: %D", dmmoab->n, dmmoab->nloc+dmmoab->nghost); 75fc418013SVijay Mahadevan dmmoab->vlocal->print(0); 76fc418013SVijay Mahadevan PetscPrintf(PETSC_COMM_SELF, "Vertices: owned: %D", dmmoab->nloc); 77fc418013SVijay Mahadevan dmmoab->vowned->print(0); 78fc418013SVijay Mahadevan PetscPrintf(PETSC_COMM_SELF, "Vertices: ghost: %D", dmmoab->nghost); 79fc418013SVijay Mahadevan dmmoab->vghost->print(0); 80fc418013SVijay Mahadevan } 81fc418013SVijay Mahadevan #endif 82032b8ab6SVijay Mahadevan } 83032b8ab6SVijay Mahadevan 84032b8ab6SVijay Mahadevan /* get the information about the local elements in the mesh */ 85032b8ab6SVijay Mahadevan { 86032b8ab6SVijay Mahadevan dmmoab->eghost->clear(); 87fc418013SVijay Mahadevan 88fc418013SVijay Mahadevan /* first decipher the leading dimension */ 89fc418013SVijay Mahadevan for (i=3;i>0;i--) { 90fc418013SVijay Mahadevan dmmoab->elocal->clear(); 91fc418013SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr); 92fc418013SVijay Mahadevan 93fc418013SVijay Mahadevan /* store the current mesh dimension */ 94fc418013SVijay Mahadevan if (dmmoab->elocal->size()) { 95fc418013SVijay Mahadevan dmmoab->dim=i; 96fc418013SVijay Mahadevan break; 97fc418013SVijay Mahadevan } 98fc418013SVijay Mahadevan } 99fc418013SVijay Mahadevan 100032b8ab6SVijay Mahadevan *dmmoab->eghost = *dmmoab->elocal; 101032b8ab6SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 102032b8ab6SVijay Mahadevan *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal); 103032b8ab6SVijay Mahadevan 104032b8ab6SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 105032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 106032b8ab6SVijay Mahadevan } 107032b8ab6SVijay Mahadevan 108032b8ab6SVijay Mahadevan bs = dmmoab->bs; 109032b8ab6SVijay Mahadevan if (!dmmoab->ltog_tag) { 110db66d124SVijay Mahadevan /* Get the global ID tag. The global ID tag is applied to each 111db66d124SVijay Mahadevan vertex. It acts as an global identifier which MOAB uses to 112db66d124SVijay Mahadevan assemble the individual pieces of the mesh */ 113032b8ab6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 114032b8ab6SVijay Mahadevan } 115032b8ab6SVijay Mahadevan 116032b8ab6SVijay Mahadevan totsize=dmmoab->vlocal->size(); 117fc418013SVijay Mahadevan ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->gsindices);CHKERRQ(ierr); 1181cec0304SVijay Mahadevan { 119032b8ab6SVijay Mahadevan /* first get the local indices */ 120fc418013SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr); 1214a40b570SVijay Mahadevan /* next get the ghosted indices */ 122fc418013SVijay Mahadevan if (dmmoab->nghost) { 123fc418013SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr); 1241cec0304SVijay Mahadevan } 1256e40195eSVijay Mahadevan 1266e40195eSVijay Mahadevan /* find out the local and global minima of GLOBAL_ID */ 127*eb9d2429SVijay Mahadevan lmin=lmax=dmmoab->gsindices[0]; 12869263071SVijay Mahadevan for (i=0; i<totsize; ++i) { 129*eb9d2429SVijay Mahadevan if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i]; 130*eb9d2429SVijay Mahadevan if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i]; 131fc418013SVijay Mahadevan } 1326e40195eSVijay Mahadevan 133*eb9d2429SVijay Mahadevan ierr = MPI_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr); 134*eb9d2429SVijay Mahadevan PetscInfo3(dm, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin); 1351cec0304SVijay Mahadevan } 136032b8ab6SVijay Mahadevan 1371cec0304SVijay Mahadevan { 1381cec0304SVijay Mahadevan ierr = PetscSectionCreate(((PetscObject)dm)->comm, §ion);CHKERRQ(ierr); 1391cec0304SVijay Mahadevan ierr = PetscSectionSetNumFields(section, dmmoab->nfields);CHKERRQ(ierr); 140*eb9d2429SVijay Mahadevan ierr = PetscSectionSetChart(section, lmin, lmax+1);CHKERRQ(ierr); 141fc418013SVijay Mahadevan for (j=0; j<totsize; ++j) { 142fc418013SVijay Mahadevan PetscInt locgid = dmmoab->gsindices[j]; 1431cec0304SVijay Mahadevan for (i=0; i < dmmoab->nfields; ++i) { 1441cec0304SVijay Mahadevan ierr = PetscSectionSetFieldName(section, i, dmmoab->fields[i]);CHKERRQ(ierr); 1451cec0304SVijay Mahadevan if (bs>1) { 146*eb9d2429SVijay Mahadevan ierr = PetscSectionSetFieldDof(section, locgid, i, (locgid-gmin)*dmmoab->nfields+i);CHKERRQ(ierr); 147*eb9d2429SVijay Mahadevan ierr = PetscSectionSetFieldOffset(section, locgid, i, (locgid-gmin)*dmmoab->nfields); 1481cec0304SVijay Mahadevan } 1491cec0304SVijay Mahadevan else { 150*eb9d2429SVijay Mahadevan ierr = PetscSectionSetFieldDof(section, locgid, i, dmmoab->n*i+locgid-gmin);CHKERRQ(ierr); 15169263071SVijay Mahadevan ierr = PetscSectionSetFieldOffset(section, locgid, i, i*dmmoab->n); 1521cec0304SVijay Mahadevan } 1531cec0304SVijay Mahadevan } 154fc418013SVijay Mahadevan ierr = PetscSectionSetDof(section, locgid, dmmoab->nfields);CHKERRQ(ierr); 1551cec0304SVijay Mahadevan } 1561cec0304SVijay Mahadevan ierr = PetscSectionSetUp(section);CHKERRQ(ierr); 1571cec0304SVijay Mahadevan ierr = DMSetDefaultSection(dm, section);CHKERRQ(ierr); 1581cec0304SVijay Mahadevan } 1591cec0304SVijay Mahadevan 1601cec0304SVijay Mahadevan { 161fc418013SVijay Mahadevan for (i=0; i<totsize; ++i) { 162*eb9d2429SVijay Mahadevan dmmoab->gsindices[i]-=gmin; /* zero based index needed for IS */ 163fc418013SVijay Mahadevan } 164fc418013SVijay Mahadevan 165032b8ab6SVijay Mahadevan /* Create Global to Local Vector Scatter Context */ 166032b8ab6SVijay Mahadevan ierr = DMCreateGlobalVector_Moab(dm, &global);CHKERRQ(ierr); 167032b8ab6SVijay Mahadevan ierr = DMCreateLocalVector_Moab(dm, &local);CHKERRQ(ierr); 168032b8ab6SVijay Mahadevan 169032b8ab6SVijay Mahadevan /* global to local must retrieve ghost points */ 170fc418013SVijay Mahadevan ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&dmmoab->gsindices[0],PETSC_COPY_VALUES,&from);CHKERRQ(ierr); 171032b8ab6SVijay Mahadevan 172db66d124SVijay Mahadevan ierr = VecGetLocalSize(global,&gsiz);CHKERRQ(ierr); 173db66d124SVijay Mahadevan ierr = VecGetLocalSize(local,&lsiz);CHKERRQ(ierr); 174032b8ab6SVijay Mahadevan 175032b8ab6SVijay Mahadevan ierr = VecScatterCreate(local,from,global,from,&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 176032b8ab6SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 177032b8ab6SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 178032b8ab6SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 179032b8ab6SVijay Mahadevan } 180032b8ab6SVijay Mahadevan 1811cec0304SVijay Mahadevan /* skin the boundary and store nodes */ 1821cec0304SVijay Mahadevan { 183*eb9d2429SVijay Mahadevan /* get the skin vertices of boundary faces for the current partition and then filter 184*eb9d2429SVijay Mahadevan the local, boundary faces, vertices and elements alone via PSTATUS flags; 185*eb9d2429SVijay Mahadevan this should not give us any ghosted boundary, but if user needs such a functionality 186*eb9d2429SVijay Mahadevan it would be easy to add it based on the find_skin query below */ 1871cec0304SVijay Mahadevan moab::Skinner skinner(dmmoab->mbiface); 1881cec0304SVijay Mahadevan dmmoab->bndyvtx = new moab::Range(); 1891cec0304SVijay Mahadevan dmmoab->bndyfaces = new moab::Range(); 19069263071SVijay Mahadevan dmmoab->bndyelems = new moab::Range(); 191*eb9d2429SVijay Mahadevan 192*eb9d2429SVijay Mahadevan /* get the entities on the skin - only the faces */ 19369263071SVijay 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 194*eb9d2429SVijay Mahadevan 195*eb9d2429SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 196*eb9d2429SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 197*eb9d2429SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr); 19869263071SVijay Mahadevan 19969263071SVijay Mahadevan if (dmmoab->dim == 3) { 20069263071SVijay Mahadevan // get the edges from faces and then do the same if needed 20169263071SVijay Mahadevan } 20269263071SVijay Mahadevan 203*eb9d2429SVijay Mahadevan /* get all the nodes via connectivity and the parent elements via adjacency information */ 20469263071SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr); 20569263071SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr); 20669263071SVijay Mahadevan PetscInfo3(dm, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size()); 2071cec0304SVijay Mahadevan } 208032b8ab6SVijay Mahadevan PetscFunctionReturn(0); 209032b8ab6SVijay Mahadevan } 210032b8ab6SVijay Mahadevan 2111cec0304SVijay Mahadevan 212032b8ab6SVijay Mahadevan #undef __FUNCT__ 213aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab" 214853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 215aa768e4cSTim Tautges { 216aa768e4cSTim Tautges PetscErrorCode ierr; 217aa768e4cSTim Tautges 218aa768e4cSTim Tautges PetscFunctionBegin; 219aa768e4cSTim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 220032b8ab6SVijay Mahadevan ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr); 221032b8ab6SVijay Mahadevan 222032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 223032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 224032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 225032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 226032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 227032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 228032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL; 229032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL; 230032b8ab6SVijay Mahadevan 231032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 232032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 233032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 234032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 235032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 236aa768e4cSTim Tautges 23797ea90e6SJed Brown dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 23897ea90e6SJed Brown dm->ops->createlocalvector = DMCreateLocalVector_Moab; 239032b8ab6SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 240032b8ab6SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 24197ea90e6SJed Brown dm->ops->destroy = DMDestroy_Moab; 242032b8ab6SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 243032b8ab6SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 244032b8ab6SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 245032b8ab6SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 246aa768e4cSTim Tautges PetscFunctionReturn(0); 247aa768e4cSTim Tautges } 248fd349b41STim Tautges 249fd349b41STim Tautges #undef __FUNCT__ 2501d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate" 2511d72bce8STim Tautges /*@ 2521d72bce8STim Tautges DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance 2531d72bce8STim Tautges 2541d72bce8STim Tautges Collective on MPI_Comm 2551d72bce8STim Tautges 2561d72bce8STim Tautges Input Parameter: 2571d72bce8STim Tautges . comm - The communicator for the DMMoab object 2581d72bce8STim Tautges 2591d72bce8STim Tautges Output Parameter: 260032b8ab6SVijay Mahadevan . dmb - The DMMoab object 2611d72bce8STim Tautges 2621d72bce8STim Tautges Level: beginner 2631d72bce8STim Tautges 2641d72bce8STim Tautges .keywords: DMMoab, create 2651d72bce8STim Tautges @*/ 266032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb) 2671d72bce8STim Tautges { 2681d72bce8STim Tautges PetscErrorCode ierr; 2691d72bce8STim Tautges 2701d72bce8STim Tautges PetscFunctionBegin; 271032b8ab6SVijay Mahadevan PetscValidPointer(dmb,2); 272032b8ab6SVijay Mahadevan ierr = DMCreate(comm, dmb);CHKERRQ(ierr); 273032b8ab6SVijay Mahadevan ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr); 2741d72bce8STim Tautges PetscFunctionReturn(0); 2751d72bce8STim Tautges } 2761d72bce8STim Tautges 2771d72bce8STim Tautges #undef __FUNCT__ 278aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab" 2791d72bce8STim Tautges /*@ 280a4d2169cSTim Tautges DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data 2811d72bce8STim Tautges 2821d72bce8STim Tautges Collective on MPI_Comm 2831d72bce8STim Tautges 2841d72bce8STim Tautges Input Parameter: 2851d72bce8STim Tautges . comm - The communicator for the DMMoab object 286032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed 287a4d2169cSTim Tautges along with the DMMoab 288a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator 2891d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag 2901d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned 2911d72bce8STim Tautges 2921d72bce8STim Tautges Output Parameter: 293032b8ab6SVijay Mahadevan . dmb - The DMMoab object 2941d72bce8STim Tautges 295032b8ab6SVijay Mahadevan Level: intermediate 2961d72bce8STim Tautges 2971d72bce8STim Tautges .keywords: DMMoab, create 2981d72bce8STim Tautges @*/ 299032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb) 3001d72bce8STim Tautges { 3011d72bce8STim Tautges PetscErrorCode ierr; 302032b8ab6SVijay Mahadevan moab::ErrorCode merr; 3031cec0304SVijay Mahadevan moab::EntityHandle partnset; 3041cec0304SVijay Mahadevan PetscInt rank, nprocs; 305853cdec3SJed Brown DM_Moab *dmmoab; 3061d72bce8STim Tautges 3071d72bce8STim Tautges PetscFunctionBegin; 308032b8ab6SVijay Mahadevan PetscValidPointer(dmb,6); 309032b8ab6SVijay Mahadevan ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr); 310032b8ab6SVijay Mahadevan dmmoab = (DM_Moab*)(*dmb)->data; 311a4d2169cSTim Tautges 312a4d2169cSTim Tautges if (!mbiface) { 31372ff976dSVijay Mahadevan dmmoab->mbiface = new moab::Core(); 3147d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_TRUE; 3151d72bce8STim Tautges } 3161cec0304SVijay Mahadevan else { 3171cec0304SVijay Mahadevan dmmoab->mbiface = mbiface; 3187d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_FALSE; 3191cec0304SVijay Mahadevan } 3201cec0304SVijay Mahadevan 3211cec0304SVijay Mahadevan /* create a fileset to store the hierarchy of entities belonging to current DM */ 3221cec0304SVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_ORDERED, dmmoab->fileset);MBERR("Creating file set failed", merr); 3237d89fc02STim Tautges 324a4d2169cSTim Tautges if (!pcomm) { 325032b8ab6SVijay Mahadevan ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 326032b8ab6SVijay Mahadevan ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr); 327032b8ab6SVijay Mahadevan 328db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 329db66d124SVijay Mahadevan to the load_file functions to be populated. */ 33072ff976dSVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset); 331032b8ab6SVijay Mahadevan MBERR("Creating partition set failed", merr); 332032b8ab6SVijay Mahadevan 333db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 33472ff976dSVijay Mahadevan dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm); 33572ff976dSVijay Mahadevan } 33672ff976dSVijay Mahadevan else { 33772ff976dSVijay Mahadevan ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr); 338032b8ab6SVijay Mahadevan } 339032b8ab6SVijay Mahadevan 3404973de03SVijay Mahadevan /* do the remaining initializations for DMMoab */ 3414973de03SVijay Mahadevan dmmoab->bs = 1; 3424973de03SVijay Mahadevan 3434973de03SVijay Mahadevan /* set global ID tag handle */ 344032b8ab6SVijay Mahadevan if (!ltog_tag) { 3454973de03SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 346032b8ab6SVijay Mahadevan } 347032b8ab6SVijay Mahadevan else { 348032b8ab6SVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr); 349a4d2169cSTim Tautges } 350a4d2169cSTim Tautges 3514973de03SVijay Mahadevan /* set the local range of entities (vertices) of interest */ 352a4d2169cSTim Tautges if (range) { 3535eb88e9dSVijay Mahadevan ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr); 354a4d2169cSTim Tautges } 3551d72bce8STim Tautges PetscFunctionReturn(0); 3561d72bce8STim Tautges } 3571d72bce8STim Tautges 3581d72bce8STim Tautges #undef __FUNCT__ 3591d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm" 360aa768e4cSTim Tautges /*@ 361aa768e4cSTim Tautges DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab 362aa768e4cSTim Tautges 363aa768e4cSTim Tautges Collective on MPI_Comm 364aa768e4cSTim Tautges 365aa768e4cSTim Tautges Input Parameter: 366aa768e4cSTim Tautges . dm - The DMMoab object being set 367aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab 368aa768e4cSTim Tautges 369aa768e4cSTim Tautges Level: beginner 370aa768e4cSTim Tautges 371aa768e4cSTim Tautges .keywords: DMMoab, create 372aa768e4cSTim Tautges @*/ 3731d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm) 3741d72bce8STim Tautges { 375032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 376032b8ab6SVijay Mahadevan 3771d72bce8STim Tautges PetscFunctionBegin; 3781d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3791cec0304SVijay Mahadevan PetscValidPointer(pcomm,2); 380032b8ab6SVijay Mahadevan dmmoab->pcomm = pcomm; 381032b8ab6SVijay Mahadevan dmmoab->mbiface = pcomm->get_moab(); 382032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 3831d72bce8STim Tautges PetscFunctionReturn(0); 3841d72bce8STim Tautges } 3851d72bce8STim Tautges 3861d72bce8STim Tautges 3871d72bce8STim Tautges #undef __FUNCT__ 3881d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm" 389aa768e4cSTim Tautges /*@ 390aa768e4cSTim Tautges DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab 391aa768e4cSTim Tautges 392aa768e4cSTim Tautges Collective on MPI_Comm 393aa768e4cSTim Tautges 394aa768e4cSTim Tautges Input Parameter: 395aa768e4cSTim Tautges . dm - The DMMoab object being set 396aa768e4cSTim Tautges 397aa768e4cSTim Tautges Output Parameter: 398aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 399aa768e4cSTim Tautges 400aa768e4cSTim Tautges Level: beginner 401aa768e4cSTim Tautges 402aa768e4cSTim Tautges .keywords: DMMoab, create 403aa768e4cSTim Tautges @*/ 4041d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm) 4051d72bce8STim Tautges { 4061d72bce8STim Tautges PetscFunctionBegin; 4071d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 408032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 4091d72bce8STim Tautges PetscFunctionReturn(0); 4101d72bce8STim Tautges } 4111d72bce8STim Tautges 4121d72bce8STim Tautges 4131d72bce8STim Tautges #undef __FUNCT__ 4141d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface" 415aa768e4cSTim Tautges /*@ 416aa768e4cSTim Tautges DMMoabSetInterface - Set 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 . mbiface - The MOAB instance being set on this DMMoab 423aa768e4cSTim Tautges 424aa768e4cSTim Tautges Level: beginner 425aa768e4cSTim Tautges 426aa768e4cSTim Tautges .keywords: DMMoab, create 427aa768e4cSTim Tautges @*/ 428a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface) 4291d72bce8STim Tautges { 430032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 431032b8ab6SVijay Mahadevan 4321d72bce8STim Tautges PetscFunctionBegin; 4331d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4341cec0304SVijay Mahadevan PetscValidPointer(mbiface,2); 435032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 436032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 437032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 4381d72bce8STim Tautges PetscFunctionReturn(0); 4391d72bce8STim Tautges } 4401d72bce8STim Tautges 4411d72bce8STim Tautges 4421d72bce8STim Tautges #undef __FUNCT__ 4431d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface" 444aa768e4cSTim Tautges /*@ 445aa768e4cSTim Tautges DMMoabGetInterface - Get the MOAB instance used with this DMMoab 446aa768e4cSTim Tautges 447aa768e4cSTim Tautges Collective on MPI_Comm 448aa768e4cSTim Tautges 449aa768e4cSTim Tautges Input Parameter: 450aa768e4cSTim Tautges . dm - The DMMoab object being set 451aa768e4cSTim Tautges 452aa768e4cSTim Tautges Output Parameter: 453aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab 454aa768e4cSTim Tautges 455aa768e4cSTim Tautges Level: beginner 456aa768e4cSTim Tautges 457aa768e4cSTim Tautges .keywords: DMMoab, create 458aa768e4cSTim Tautges @*/ 459a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface) 4601d72bce8STim Tautges { 4619426e041SSatish Balay PetscErrorCode ierr; 462cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 463cabb514dSBarry Smith 4641d72bce8STim Tautges PetscFunctionBegin; 4651d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 466cabb514dSBarry 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); 467a4d2169cSTim Tautges *mbiface = ((DM_Moab*)dm->data)->mbiface; 4681d72bce8STim Tautges PetscFunctionReturn(0); 4691d72bce8STim Tautges } 4701d72bce8STim Tautges 4711d72bce8STim Tautges 4721d72bce8STim Tautges #undef __FUNCT__ 4735eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices" 474aa768e4cSTim Tautges /*@ 4755eb88e9dSVijay Mahadevan DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab 476aa768e4cSTim Tautges 477aa768e4cSTim Tautges Collective on MPI_Comm 478aa768e4cSTim Tautges 479aa768e4cSTim Tautges Input Parameter: 480aa768e4cSTim Tautges . dm - The DMMoab object being set 481aa768e4cSTim Tautges . range - The entities treated by this DMMoab 482aa768e4cSTim Tautges 483aa768e4cSTim Tautges Level: beginner 484aa768e4cSTim Tautges 485aa768e4cSTim Tautges .keywords: DMMoab, create 486aa768e4cSTim Tautges @*/ 4875eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range) 4881d72bce8STim Tautges { 489032b8ab6SVijay Mahadevan moab::ErrorCode merr; 490032b8ab6SVijay Mahadevan PetscErrorCode ierr; 491032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 492032b8ab6SVijay Mahadevan 4931d72bce8STim Tautges PetscFunctionBegin; 4941d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 495032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 496032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 497032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 498032b8ab6SVijay Mahadevan *dmmoab->vowned = *dmmoab->vlocal; 499032b8ab6SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 500032b8ab6SVijay Mahadevan *dmmoab->vghost = moab::subtract(*range, *dmmoab->vowned); 501032b8ab6SVijay Mahadevan dmmoab->nloc=dmmoab->vowned->size(); 502032b8ab6SVijay Mahadevan dmmoab->nghost=dmmoab->vghost->size(); 503032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 5041d72bce8STim Tautges PetscFunctionReturn(0); 5051d72bce8STim Tautges } 5061d72bce8STim Tautges 5071d72bce8STim Tautges 5081d72bce8STim Tautges #undef __FUNCT__ 5095eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices" 510aa768e4cSTim Tautges /*@ 5115eb88e9dSVijay Mahadevan DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab 512aa768e4cSTim Tautges 513aa768e4cSTim Tautges Collective on MPI_Comm 514aa768e4cSTim Tautges 515aa768e4cSTim Tautges Input Parameter: 516aa768e4cSTim Tautges . dm - The DMMoab object being set 517aa768e4cSTim Tautges 518aa768e4cSTim Tautges Output Parameter: 5195eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab 5205eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition 521aa768e4cSTim Tautges 522aa768e4cSTim Tautges Level: beginner 523aa768e4cSTim Tautges 524aa768e4cSTim Tautges .keywords: DMMoab, create 525aa768e4cSTim Tautges @*/ 5261cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,moab::Range *owned,moab::Range *ghost) 5271d72bce8STim Tautges { 5281d72bce8STim Tautges PetscFunctionBegin; 5291d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5301cec0304SVijay Mahadevan if (owned) *owned = *((DM_Moab*)dm->data)->vowned; 5311cec0304SVijay Mahadevan if (ghost) *ghost = *((DM_Moab*)dm->data)->vghost; 5321d72bce8STim Tautges PetscFunctionReturn(0); 5331d72bce8STim Tautges } 5341d72bce8STim Tautges 5351d72bce8STim Tautges #undef __FUNCT__ 5365eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements" 5375eb88e9dSVijay Mahadevan /*@ 5385eb88e9dSVijay Mahadevan DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned 5395eb88e9dSVijay Mahadevan 5405eb88e9dSVijay Mahadevan Collective on MPI_Comm 5415eb88e9dSVijay Mahadevan 5425eb88e9dSVijay Mahadevan Input Parameter: 5435eb88e9dSVijay Mahadevan . dm - The DMMoab object being set 5445eb88e9dSVijay Mahadevan 5455eb88e9dSVijay Mahadevan Output Parameter: 5465eb88e9dSVijay Mahadevan . range - The entities owned locally 5475eb88e9dSVijay Mahadevan 5485eb88e9dSVijay Mahadevan Level: beginner 5495eb88e9dSVijay Mahadevan 5505eb88e9dSVijay Mahadevan .keywords: DMMoab, create 5515eb88e9dSVijay Mahadevan @*/ 5521cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,moab::Range *range) 5535eb88e9dSVijay Mahadevan { 5545eb88e9dSVijay Mahadevan PetscFunctionBegin; 5555eb88e9dSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5561cec0304SVijay Mahadevan if (range) *range = *((DM_Moab*)dm->data)->elocal; 5571cec0304SVijay Mahadevan PetscFunctionReturn(0); 5581cec0304SVijay Mahadevan } 5591cec0304SVijay Mahadevan 5601cec0304SVijay Mahadevan 5611cec0304SVijay Mahadevan #undef __FUNCT__ 5621cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements" 5631cec0304SVijay Mahadevan /*@ 5641cec0304SVijay Mahadevan DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab 5651cec0304SVijay Mahadevan 5661cec0304SVijay Mahadevan Collective on MPI_Comm 5671cec0304SVijay Mahadevan 5681cec0304SVijay Mahadevan Input Parameter: 5691cec0304SVijay Mahadevan . dm - The DMMoab object being set 5701cec0304SVijay Mahadevan . range - The entities treated by this DMMoab 5711cec0304SVijay Mahadevan 5721cec0304SVijay Mahadevan Level: beginner 5731cec0304SVijay Mahadevan 5741cec0304SVijay Mahadevan .keywords: DMMoab, create 5751cec0304SVijay Mahadevan @*/ 5761cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range) 5771cec0304SVijay Mahadevan { 5781cec0304SVijay Mahadevan moab::ErrorCode merr; 5791cec0304SVijay Mahadevan PetscErrorCode ierr; 5801cec0304SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 5811cec0304SVijay Mahadevan 5821cec0304SVijay Mahadevan PetscFunctionBegin; 5831cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5841cec0304SVijay Mahadevan dmmoab->elocal->clear(); 5851cec0304SVijay Mahadevan dmmoab->eghost->clear(); 5861cec0304SVijay Mahadevan dmmoab->elocal->insert(range->begin(), range->end()); 5871cec0304SVijay Mahadevan PetscInfo2(dm, "Range size = %D; elocal size = %D.\n", range->size(), dmmoab->elocal->size()); 5881cec0304SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 5891cec0304SVijay Mahadevan *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal); 5901cec0304SVijay Mahadevan dmmoab->neleloc=dmmoab->elocal->size(); 5911cec0304SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 5921cec0304SVijay Mahadevan PetscInfo2(dm, "Created %D local and %D glocal elements.\n", dmmoab->neleloc, dmmoab->nele); 5935eb88e9dSVijay Mahadevan PetscFunctionReturn(0); 5945eb88e9dSVijay Mahadevan } 5955eb88e9dSVijay Mahadevan 5965eb88e9dSVijay Mahadevan 5975eb88e9dSVijay Mahadevan #undef __FUNCT__ 5981d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag" 599aa768e4cSTim Tautges /*@ 600aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 601aa768e4cSTim Tautges 602aa768e4cSTim Tautges Collective on MPI_Comm 603aa768e4cSTim Tautges 604aa768e4cSTim Tautges Input Parameter: 605aa768e4cSTim Tautges . dm - The DMMoab object being set 606aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 607aa768e4cSTim Tautges 608aa768e4cSTim Tautges Level: beginner 609aa768e4cSTim Tautges 610aa768e4cSTim Tautges .keywords: DMMoab, create 611aa768e4cSTim Tautges @*/ 6121d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag) 6131d72bce8STim Tautges { 6141d72bce8STim Tautges PetscFunctionBegin; 6151d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6161d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 6171d72bce8STim Tautges PetscFunctionReturn(0); 6181d72bce8STim Tautges } 6191d72bce8STim Tautges 6201d72bce8STim Tautges 6211d72bce8STim Tautges #undef __FUNCT__ 6221d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag" 623aa768e4cSTim Tautges /*@ 624aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 625aa768e4cSTim Tautges 626aa768e4cSTim Tautges Collective on MPI_Comm 627aa768e4cSTim Tautges 628aa768e4cSTim Tautges Input Parameter: 629aa768e4cSTim Tautges . dm - The DMMoab object being set 630aa768e4cSTim Tautges 631aa768e4cSTim Tautges Output Parameter: 632aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 633aa768e4cSTim Tautges 634aa768e4cSTim Tautges Level: beginner 635aa768e4cSTim Tautges 636aa768e4cSTim Tautges .keywords: DMMoab, create 637aa768e4cSTim Tautges @*/ 6381d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag) 6391d72bce8STim Tautges { 6401d72bce8STim Tautges PetscFunctionBegin; 6411d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6421d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 6431d72bce8STim Tautges PetscFunctionReturn(0); 6441d72bce8STim Tautges } 6451d72bce8STim Tautges 6461d72bce8STim Tautges 6471d72bce8STim Tautges #undef __FUNCT__ 6481d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize" 649aa768e4cSTim Tautges /*@ 650aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 651aa768e4cSTim Tautges 652aa768e4cSTim Tautges Collective on MPI_Comm 653aa768e4cSTim Tautges 654aa768e4cSTim Tautges Input Parameter: 655aa768e4cSTim Tautges . dm - The DMMoab object being set 656aa768e4cSTim Tautges . bs - The block size used with this DMMoab 657aa768e4cSTim Tautges 658aa768e4cSTim Tautges Level: beginner 659aa768e4cSTim Tautges 660aa768e4cSTim Tautges .keywords: DMMoab, create 661aa768e4cSTim Tautges @*/ 6621d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs) 6631d72bce8STim Tautges { 6641d72bce8STim Tautges PetscFunctionBegin; 6651d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6661d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 6671d72bce8STim Tautges PetscFunctionReturn(0); 6681d72bce8STim Tautges } 6691d72bce8STim Tautges 6701d72bce8STim Tautges 6711d72bce8STim Tautges #undef __FUNCT__ 6721d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize" 673aa768e4cSTim Tautges /*@ 674aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 675aa768e4cSTim Tautges 676aa768e4cSTim Tautges Collective on MPI_Comm 677aa768e4cSTim Tautges 678aa768e4cSTim Tautges Input Parameter: 679aa768e4cSTim Tautges . dm - The DMMoab object being set 680aa768e4cSTim Tautges 681aa768e4cSTim Tautges Output Parameter: 682aa768e4cSTim Tautges . bs - The block size used with this DMMoab 683aa768e4cSTim Tautges 684aa768e4cSTim Tautges Level: beginner 685aa768e4cSTim Tautges 686aa768e4cSTim Tautges .keywords: DMMoab, create 687aa768e4cSTim Tautges @*/ 6881d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs) 6891d72bce8STim Tautges { 6901d72bce8STim Tautges PetscFunctionBegin; 6911d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6921d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 6931d72bce8STim Tautges PetscFunctionReturn(0); 6941d72bce8STim Tautges } 6951d72bce8STim Tautges 6961cec0304SVijay Mahadevan 6971cec0304SVijay Mahadevan #undef __FUNCT__ 6981cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldVector" 6991cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec) 7001cec0304SVijay Mahadevan { 7011cec0304SVijay Mahadevan DM_Moab *dmmoab; 7021cec0304SVijay Mahadevan moab::Tag vtag,ntag; 7031cec0304SVijay Mahadevan PetscScalar *varray; 7041cec0304SVijay Mahadevan moab::ErrorCode merr; 7051cec0304SVijay Mahadevan PetscErrorCode ierr; 7061cec0304SVijay Mahadevan PetscSection section; 7071cec0304SVijay Mahadevan PetscInt doff; 7081cec0304SVijay Mahadevan std::string tag_name; 7091cec0304SVijay Mahadevan moab::Range::iterator iter; 7101cec0304SVijay Mahadevan 7111cec0304SVijay Mahadevan PetscFunctionBegin; 7121cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7131cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7141cec0304SVijay Mahadevan 7151cec0304SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 7161cec0304SVijay Mahadevan 7171cec0304SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 7181cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag, 7191cec0304SVijay Mahadevan moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr); 7201cec0304SVijay Mahadevan 7211cec0304SVijay Mahadevan ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr); 7221cec0304SVijay Mahadevan 7231cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name); 7241cec0304SVijay Mahadevan if (!tag_name.length() && merr !=moab::MB_SUCCESS) { 7251cec0304SVijay Mahadevan ierr = DMMoabVecGetArray(dm,fvec,&varray);CHKERRQ(ierr); 7261cec0304SVijay Mahadevan for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) { 7271cec0304SVijay Mahadevan moab::EntityHandle vtx = (*iter); 7281cec0304SVijay Mahadevan 7291cec0304SVijay Mahadevan /* get field dof index */ 7301cec0304SVijay Mahadevan ierr = PetscSectionGetFieldOffset(section, vtx, ifield, &doff); 7311cec0304SVijay Mahadevan 7321cec0304SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */ 7331cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, &vtx, 1, (const void*)&varray[doff]);MBERRNM(merr); 7341cec0304SVijay Mahadevan } 7351cec0304SVijay Mahadevan ierr = DMMoabVecRestoreArray(dm,fvec,&varray);CHKERRQ(ierr); 7361cec0304SVijay Mahadevan } 7371cec0304SVijay Mahadevan else { 7381cec0304SVijay Mahadevan ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&varray);CHKERRQ(ierr); 7391cec0304SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 7401cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray);MBERRNM(merr); 7411cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)varray);MBERRNM(merr); 7421cec0304SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 7431cec0304SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr); 7441cec0304SVijay Mahadevan ierr = PetscFree(varray);CHKERRQ(ierr); 7451cec0304SVijay Mahadevan } 7461cec0304SVijay Mahadevan PetscFunctionReturn(0); 7471cec0304SVijay Mahadevan } 7481cec0304SVijay Mahadevan 7491cec0304SVijay Mahadevan 7501cec0304SVijay Mahadevan #undef __FUNCT__ 7517023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates" 7527023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos) 7537023aa44SVijay Mahadevan { 7547023aa44SVijay Mahadevan DM_Moab *dmmoab; 7557023aa44SVijay Mahadevan PetscErrorCode ierr; 7567023aa44SVijay Mahadevan moab::ErrorCode merr; 7577023aa44SVijay Mahadevan 7587023aa44SVijay Mahadevan PetscFunctionBegin; 7597023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7607023aa44SVijay Mahadevan PetscValidPointer(conn,3); 7617023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7627023aa44SVijay Mahadevan 7637023aa44SVijay Mahadevan if (!vpos) { 7647023aa44SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr); 7657023aa44SVijay Mahadevan } 7667023aa44SVijay Mahadevan 7677023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 7687023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr); 7697023aa44SVijay Mahadevan PetscFunctionReturn(0); 7707023aa44SVijay Mahadevan } 7717023aa44SVijay Mahadevan 7727023aa44SVijay Mahadevan 7737023aa44SVijay Mahadevan #undef __FUNCT__ 7747023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity" 7757023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn) 7767023aa44SVijay Mahadevan { 7777023aa44SVijay Mahadevan DM_Moab *dmmoab; 7787023aa44SVijay Mahadevan const moab::EntityHandle *connect; 7797023aa44SVijay Mahadevan moab::ErrorCode merr; 7807023aa44SVijay Mahadevan PetscInt nnodes; 7817023aa44SVijay Mahadevan 7827023aa44SVijay Mahadevan PetscFunctionBegin; 7837023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7847023aa44SVijay Mahadevan PetscValidPointer(conn,4); 7857023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7867023aa44SVijay Mahadevan 7877023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 7887023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr); 7897023aa44SVijay Mahadevan if (conn) *conn=connect; 7907023aa44SVijay Mahadevan if (nconn) *nconn=nnodes; 7917023aa44SVijay Mahadevan PetscFunctionReturn(0); 7927023aa44SVijay Mahadevan } 7937023aa44SVijay Mahadevan 7947023aa44SVijay Mahadevan 7957023aa44SVijay Mahadevan #undef __FUNCT__ 79669263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary" 79769263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary) 79869263071SVijay Mahadevan { 79969263071SVijay Mahadevan moab::EntityType etype; 80069263071SVijay Mahadevan DM_Moab *dmmoab; 80169263071SVijay Mahadevan PetscInt edim; 80269263071SVijay Mahadevan 80369263071SVijay Mahadevan PetscFunctionBegin; 80469263071SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 80569263071SVijay Mahadevan PetscValidPointer(ent_on_boundary,3); 80669263071SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 80769263071SVijay Mahadevan 80869263071SVijay Mahadevan /* get the entity type and handle accordingly */ 80969263071SVijay Mahadevan etype=dmmoab->mbiface->type_from_handle(ent); 81069263071SVijay 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); 81169263071SVijay Mahadevan 81269263071SVijay Mahadevan /* get the entity dimension */ 81369263071SVijay Mahadevan edim=dmmoab->mbiface->dimension_from_handle(ent); 81469263071SVijay Mahadevan 81569263071SVijay Mahadevan *ent_on_boundary=PETSC_FALSE; 81669263071SVijay Mahadevan if(etype == moab::MBVERTEX && edim == 0) { 81769263071SVijay Mahadevan moab::Range::const_iterator giter = dmmoab->bndyvtx->find(ent); 81869263071SVijay Mahadevan if (giter != dmmoab->bndyvtx->end()) *ent_on_boundary=PETSC_TRUE; 81969263071SVijay Mahadevan } 82069263071SVijay Mahadevan else { 82169263071SVijay Mahadevan if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */ 82269263071SVijay Mahadevan moab::Range::const_iterator geiter = dmmoab->bndyelems->find(ent); 82369263071SVijay Mahadevan if (geiter != dmmoab->bndyelems->end()) *ent_on_boundary=PETSC_TRUE; 82469263071SVijay Mahadevan } 82569263071SVijay Mahadevan else { /* next check the lower-dimensional faces */ 82669263071SVijay Mahadevan moab::Range::const_iterator gfiter = dmmoab->bndyfaces->find(ent); 82769263071SVijay Mahadevan if (gfiter != dmmoab->bndyfaces->end()) *ent_on_boundary=PETSC_TRUE; 82869263071SVijay Mahadevan } 82969263071SVijay Mahadevan } 83069263071SVijay Mahadevan PetscFunctionReturn(0); 83169263071SVijay Mahadevan } 83269263071SVijay Mahadevan 83369263071SVijay Mahadevan 83469263071SVijay Mahadevan #undef __FUNCT__ 8357023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices" 83669263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx) 8377023aa44SVijay Mahadevan { 8387023aa44SVijay Mahadevan DM_Moab *dmmoab; 8397023aa44SVijay Mahadevan PetscInt i; 8407023aa44SVijay Mahadevan 8417023aa44SVijay Mahadevan PetscFunctionBegin; 8427023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8437023aa44SVijay Mahadevan PetscValidPointer(cnt,3); 8447023aa44SVijay Mahadevan PetscValidPointer(isbdvtx,4); 8457023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8467023aa44SVijay Mahadevan 8477023aa44SVijay Mahadevan for (i=0; i < nconn; ++i) { 8487023aa44SVijay Mahadevan moab::Range::const_iterator giter = dmmoab->bndyvtx->find(cnt[i]); 84969263071SVijay Mahadevan if (giter != dmmoab->bndyvtx->end()) isbdvtx[i] = PETSC_TRUE; 8507023aa44SVijay Mahadevan else isbdvtx[i] = PETSC_FALSE; 8517023aa44SVijay Mahadevan } 8527023aa44SVijay Mahadevan PetscFunctionReturn(0); 8537023aa44SVijay Mahadevan } 8547023aa44SVijay Mahadevan 8557023aa44SVijay Mahadevan 8567023aa44SVijay Mahadevan #undef __FUNCT__ 8571cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryEntities" 85869263071SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryEntities(DM dm,moab::Range *bdvtx,moab::Range* bdfaces,moab::Range* bdelems) 8591cec0304SVijay Mahadevan { 8601cec0304SVijay Mahadevan DM_Moab *dmmoab; 8611cec0304SVijay Mahadevan 8621cec0304SVijay Mahadevan PetscFunctionBegin; 8631cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8641cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8651cec0304SVijay Mahadevan 8661cec0304SVijay Mahadevan if (bdvtx) *bdvtx = *dmmoab->bndyvtx; 8671cec0304SVijay Mahadevan if (bdfaces) *bdfaces = *dmmoab->bndyfaces; 86869263071SVijay Mahadevan if (bdelems) *bdfaces = *dmmoab->bndyelems; 8691cec0304SVijay Mahadevan PetscFunctionReturn(0); 8701cec0304SVijay Mahadevan } 8711cec0304SVijay Mahadevan 8721cec0304SVijay Mahadevan 8731cec0304SVijay Mahadevan #undef __FUNCT__ 8741cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFields" 8751cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFields(DM dm,PetscInt nfields,const char** fields) 8761cec0304SVijay Mahadevan { 8771cec0304SVijay Mahadevan DM_Moab *dmmoab; 8781cec0304SVijay Mahadevan 8791cec0304SVijay Mahadevan PetscFunctionBegin; 8801cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8811cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8821cec0304SVijay Mahadevan 8831cec0304SVijay Mahadevan dmmoab->fields = fields; 8841cec0304SVijay Mahadevan dmmoab->nfields = nfields; 8851cec0304SVijay Mahadevan PetscFunctionReturn(0); 8861cec0304SVijay Mahadevan } 8871cec0304SVijay Mahadevan 8881cec0304SVijay Mahadevan 8891cec0304SVijay Mahadevan #undef __FUNCT__ 8901cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDof" 8911cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof) 8921cec0304SVijay Mahadevan { 8931cec0304SVijay Mahadevan PetscSection section; 894fc418013SVijay Mahadevan PetscInt gid; 8951cec0304SVijay Mahadevan PetscErrorCode ierr; 896fc418013SVijay Mahadevan moab::ErrorCode merr; 897fc418013SVijay Mahadevan DM_Moab *dmmoab; 8981cec0304SVijay Mahadevan 8991cec0304SVijay Mahadevan PetscFunctionBegin; 9001cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 901fc418013SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 902fc418013SVijay Mahadevan 9031cec0304SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 904fc418013SVijay Mahadevan 905fc418013SVijay Mahadevan /* first get the global ID for the point */ 906fc418013SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,&point,1,&gid);MBERRNM(merr); 907fc418013SVijay Mahadevan 908fc418013SVijay Mahadevan /* get the dof value for the field */ 909fc418013SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, gid, field, dof);CHKERRQ(ierr); 9101cec0304SVijay Mahadevan PetscFunctionReturn(0); 9111cec0304SVijay Mahadevan } 9121cec0304SVijay Mahadevan 9131cec0304SVijay Mahadevan 9141cec0304SVijay Mahadevan #undef __FUNCT__ 9151cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofs" 9161cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof) 9171cec0304SVijay Mahadevan { 918fc418013SVijay Mahadevan PetscInt i,gid; 9191cec0304SVijay Mahadevan PetscSection section; 9201cec0304SVijay Mahadevan PetscErrorCode ierr; 921fc418013SVijay Mahadevan moab::ErrorCode merr; 922fc418013SVijay Mahadevan DM_Moab *dmmoab; 9231cec0304SVijay Mahadevan 9241cec0304SVijay Mahadevan PetscFunctionBegin; 9251cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 926fc418013SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 927fc418013SVijay Mahadevan 9281cec0304SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 9291cec0304SVijay Mahadevan if (!dof) { 9301cec0304SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr); 9311cec0304SVijay Mahadevan } 932fc418013SVijay Mahadevan 933fc418013SVijay Mahadevan /* first get the local indices */ 934fc418013SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,points,npoints,dof);MBERRNM(merr); 935fc418013SVijay Mahadevan 9361cec0304SVijay Mahadevan for (i=0; i<npoints; ++i) { 937fc418013SVijay Mahadevan gid=dof[i]; 938fc418013SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, gid, field, &dof[i]);CHKERRQ(ierr); 9391cec0304SVijay Mahadevan } 9401cec0304SVijay Mahadevan PetscFunctionReturn(0); 9411cec0304SVijay Mahadevan } 9421cec0304SVijay Mahadevan 9431cec0304SVijay Mahadevan 944fc418013SVijay Mahadevan #undef __FUNCT__ 945*eb9d2429SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalFieldDofs" 946*eb9d2429SVijay Mahadevan PetscErrorCode DMMoabGetLocalFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof) 947*eb9d2429SVijay Mahadevan { 948*eb9d2429SVijay Mahadevan PetscInt i,offset; 949*eb9d2429SVijay Mahadevan PetscErrorCode ierr; 950*eb9d2429SVijay Mahadevan DM_Moab *dmmoab; 951*eb9d2429SVijay Mahadevan 952*eb9d2429SVijay Mahadevan PetscFunctionBegin; 953*eb9d2429SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 954*eb9d2429SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 955*eb9d2429SVijay Mahadevan 956*eb9d2429SVijay Mahadevan if (!dof) { 957*eb9d2429SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr); 958*eb9d2429SVijay Mahadevan } 959*eb9d2429SVijay Mahadevan 960*eb9d2429SVijay Mahadevan if (dmmoab->bs > 1) { 961*eb9d2429SVijay Mahadevan for (i=0; i<npoints; ++i) 962*eb9d2429SVijay Mahadevan dof[i] = (points[i]-1)*dmmoab->bs+field; 963*eb9d2429SVijay Mahadevan } 964*eb9d2429SVijay Mahadevan else { 965*eb9d2429SVijay Mahadevan offset = field*dmmoab->n; /* assume all fields have equal distribution */ 966*eb9d2429SVijay Mahadevan for (i=0; i<npoints; ++i) 967*eb9d2429SVijay Mahadevan dof[i] = offset+points[i]-1; 968*eb9d2429SVijay Mahadevan } 969*eb9d2429SVijay Mahadevan PetscFunctionReturn(0); 970*eb9d2429SVijay Mahadevan } 971*eb9d2429SVijay Mahadevan 972*eb9d2429SVijay Mahadevan 973*eb9d2429SVijay Mahadevan #undef __FUNCT__ 974fc418013SVijay Mahadevan #define __FUNCT__ "DMMoab_GetWriteOptions_Private" 975fc418013SVijay Mahadevan PetscErrorCode DMMoab_GetWriteOptions_Private(PetscInt fsetid, PetscInt numproc, PetscInt dim, MoabWriteMode mode, PetscInt dbglevel, const char* extra_opts, const char** write_opts) 976fc418013SVijay Mahadevan { 977fc418013SVijay Mahadevan std::ostringstream str; 978fc418013SVijay Mahadevan 979fc418013SVijay Mahadevan PetscFunctionBegin; 980fc418013SVijay Mahadevan 981fc418013SVijay Mahadevan // do parallel read unless only one processor 982fc418013SVijay Mahadevan if (numproc > 1) { 983fc418013SVijay Mahadevan str << "PARALLEL=" << mode << ";"; 984fc418013SVijay Mahadevan if (fsetid>=0) str << "PARALLEL_COMM=" << fsetid << ";"; 985fc418013SVijay Mahadevan } 986fc418013SVijay Mahadevan 987fc418013SVijay Mahadevan if (dbglevel) 988fc418013SVijay Mahadevan str << "CPUTIME;DEBUG_IO=" << dbglevel << ";"; 989fc418013SVijay Mahadevan 990fc418013SVijay Mahadevan if (extra_opts) 991fc418013SVijay Mahadevan str << extra_opts ; 992fc418013SVijay Mahadevan 993fc418013SVijay Mahadevan *write_opts = str.str().c_str(); 994fc418013SVijay Mahadevan PetscFunctionReturn(0); 995fc418013SVijay Mahadevan } 996fc418013SVijay Mahadevan 997fc418013SVijay Mahadevan 998fc418013SVijay Mahadevan #undef __FUNCT__ 999fc418013SVijay Mahadevan #define __FUNCT__ "DMMoabOutput" 1000fc418013SVijay Mahadevan PetscErrorCode DMMoabOutput(DM dm,const char* filename,const char* usrwriteopts) 1001fc418013SVijay Mahadevan { 1002fc418013SVijay Mahadevan DM_Moab *dmmoab; 1003fc418013SVijay Mahadevan PetscInt dbglevel=0; 1004fc418013SVijay Mahadevan const char *writeopts; 1005fc418013SVijay Mahadevan 1006fc418013SVijay Mahadevan PetscErrorCode ierr; 1007fc418013SVijay Mahadevan moab::ErrorCode merr; 1008fc418013SVijay Mahadevan 1009fc418013SVijay Mahadevan PetscFunctionBegin; 1010fc418013SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1011fc418013SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1012fc418013SVijay Mahadevan 1013fc418013SVijay Mahadevan PetscBarrier((PetscObject)dm); 1014fc418013SVijay Mahadevan 1015fc418013SVijay Mahadevan /* TODO: Use command-line options to control by_rank, verbosity, MoabReadMode and extra options */ 1016fc418013SVijay Mahadevan ierr = PetscOptionsBegin(PETSC_COMM_WORLD, "", "Options for reading/writing MOAB based meshes from file", "DMMoab"); 1017fc418013SVijay Mahadevan ierr = PetscOptionsInt("-dmmb_rw_dbg", "The verbosity level for reading and writing MOAB meshes", "dmmbutil.cxx", dbglevel, &dbglevel, NULL);CHKERRQ(ierr); 1018fc418013SVijay Mahadevan ierr = PetscOptionsEnd(); 1019fc418013SVijay Mahadevan 1020fc418013SVijay Mahadevan /* add mesh loading options specific to the DM */ 1021fc418013SVijay Mahadevan ierr = DMMoab_GetWriteOptions_Private(dmmoab->pcomm->get_id(), dmmoab->pcomm->size(), dmmoab->dim, MOAB_PARWOPTS_WRITE_PART, dbglevel, usrwriteopts, &writeopts);CHKERRQ(ierr); 1022fc418013SVijay Mahadevan PetscInfo2(dm, "Writing file %s with options: %s\n",filename,writeopts); 1023fc418013SVijay Mahadevan 1024fc418013SVijay Mahadevan /* output file, using parallel write */ 1025fc418013SVijay Mahadevan merr = dmmoab->mbiface->write_file(filename, NULL, writeopts, &dmmoab->fileset, 1);MBERRVM(dmmoab->mbiface,"Writing output of DMMoab failed.",merr); 1026fc418013SVijay Mahadevan PetscFunctionReturn(0); 1027fc418013SVijay Mahadevan } 1028fc418013SVijay Mahadevan 1029