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; 14212ad6d1SVijay Mahadevan PetscSection section; 15853cdec3SJed Brown 16853cdec3SJed Brown PetscFunctionBegin; 17853cdec3SJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 18212ad6d1SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 19212ad6d1SVijay Mahadevan ierr = PetscSectionDestroy(§ion);CHKERRQ(ierr); 20032b8ab6SVijay Mahadevan if (dmmoab->icreatedinstance) { 21032b8ab6SVijay Mahadevan delete dmmoab->mbiface; 22853cdec3SJed Brown } 23032b8ab6SVijay Mahadevan dmmoab->mbiface = NULL; 24032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 25032b8ab6SVijay Mahadevan delete dmmoab->vlocal; 26032b8ab6SVijay Mahadevan delete dmmoab->vowned; 27032b8ab6SVijay Mahadevan delete dmmoab->vghost; 28032b8ab6SVijay Mahadevan delete dmmoab->elocal; 29032b8ab6SVijay Mahadevan delete dmmoab->eghost; 30*8d8d51c8SVijay Mahadevan 31*8d8d51c8SVijay Mahadevan ierr = PetscFree(dmmoab->isbndyvtx);CHKERRQ(ierr); 32*8d8d51c8SVijay Mahadevan ierr = PetscFree(dmmoab->isbndyfaces);CHKERRQ(ierr); 33*8d8d51c8SVijay Mahadevan ierr = PetscFree(dmmoab->isbndyelems);CHKERRQ(ierr); 341cec0304SVijay Mahadevan delete dmmoab->bndyvtx; 351cec0304SVijay Mahadevan delete dmmoab->bndyfaces; 3669263071SVijay Mahadevan delete dmmoab->bndyelems; 37fc418013SVijay Mahadevan 38fc418013SVijay Mahadevan ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr); 39032b8ab6SVijay Mahadevan ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 40032b8ab6SVijay Mahadevan ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr); 41853cdec3SJed Brown ierr = PetscFree(dm->data);CHKERRQ(ierr); 42853cdec3SJed Brown PetscFunctionReturn(0); 43853cdec3SJed Brown } 44853cdec3SJed Brown 45aa768e4cSTim Tautges #undef __FUNCT__ 46032b8ab6SVijay Mahadevan #define __FUNCT__ "DMSetUp_Moab" 47032b8ab6SVijay Mahadevan PetscErrorCode DMSetUp_Moab(DM dm) 48032b8ab6SVijay Mahadevan { 49032b8ab6SVijay Mahadevan PetscErrorCode ierr; 50032b8ab6SVijay Mahadevan moab::ErrorCode merr; 51032b8ab6SVijay Mahadevan Vec local, global; 52032b8ab6SVijay Mahadevan IS from; 53032b8ab6SVijay Mahadevan moab::Range::iterator iter; 54fc418013SVijay Mahadevan PetscInt i,j,bs,gsiz,lsiz; 55032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 56eb9d2429SVijay Mahadevan PetscInt totsize; 571cec0304SVijay Mahadevan PetscSection section; 58eb9d2429SVijay Mahadevan PetscInt gmin,lmin,lmax; 59032b8ab6SVijay Mahadevan 6069263071SVijay Mahadevan moab::Range adj; 6169263071SVijay Mahadevan 62032b8ab6SVijay Mahadevan PetscFunctionBegin; 63032b8ab6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 64032b8ab6SVijay Mahadevan /* Get the local and shared vertices and cache it */ 65032b8ab6SVijay 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."); 66032b8ab6SVijay Mahadevan 671cec0304SVijay Mahadevan /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */ 68032b8ab6SVijay Mahadevan if (dmmoab->vlocal->empty()) { 691cec0304SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr); 70032b8ab6SVijay Mahadevan 71032b8ab6SVijay Mahadevan /* filter based on parallel status */ 72fc418013SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 73032b8ab6SVijay Mahadevan *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 74032b8ab6SVijay Mahadevan 75032b8ab6SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 76032b8ab6SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 77032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 78fc418013SVijay Mahadevan 79e23c60ebSVijay Mahadevan #if 0 80fc418013SVijay Mahadevan if(dmmoab->pcomm->rank() || dmmoab->pcomm->size()==1) { 81fc418013SVijay Mahadevan PetscPrintf(PETSC_COMM_SELF, "Vertices: global: %D, local: %D", dmmoab->n, dmmoab->nloc+dmmoab->nghost); 82fc418013SVijay Mahadevan dmmoab->vlocal->print(0); 83fc418013SVijay Mahadevan PetscPrintf(PETSC_COMM_SELF, "Vertices: owned: %D", dmmoab->nloc); 84fc418013SVijay Mahadevan dmmoab->vowned->print(0); 85fc418013SVijay Mahadevan PetscPrintf(PETSC_COMM_SELF, "Vertices: ghost: %D", dmmoab->nghost); 86fc418013SVijay Mahadevan dmmoab->vghost->print(0); 87fc418013SVijay Mahadevan } 88fc418013SVijay Mahadevan #endif 89032b8ab6SVijay Mahadevan } 90032b8ab6SVijay Mahadevan 91032b8ab6SVijay Mahadevan /* get the information about the local elements in the mesh */ 92032b8ab6SVijay Mahadevan { 93032b8ab6SVijay Mahadevan dmmoab->eghost->clear(); 94fc418013SVijay Mahadevan 95fc418013SVijay Mahadevan /* first decipher the leading dimension */ 96fc418013SVijay Mahadevan for (i=3;i>0;i--) { 97fc418013SVijay Mahadevan dmmoab->elocal->clear(); 98fc418013SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr); 99fc418013SVijay Mahadevan 100fc418013SVijay Mahadevan /* store the current mesh dimension */ 101fc418013SVijay Mahadevan if (dmmoab->elocal->size()) { 102fc418013SVijay Mahadevan dmmoab->dim=i; 103fc418013SVijay Mahadevan break; 104fc418013SVijay Mahadevan } 105fc418013SVijay Mahadevan } 106fc418013SVijay Mahadevan 107032b8ab6SVijay Mahadevan *dmmoab->eghost = *dmmoab->elocal; 108032b8ab6SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 109032b8ab6SVijay Mahadevan *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal); 110032b8ab6SVijay Mahadevan 111032b8ab6SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 112032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 113032b8ab6SVijay Mahadevan } 114032b8ab6SVijay Mahadevan 115032b8ab6SVijay Mahadevan bs = dmmoab->bs; 116032b8ab6SVijay Mahadevan if (!dmmoab->ltog_tag) { 117db66d124SVijay Mahadevan /* Get the global ID tag. The global ID tag is applied to each 118db66d124SVijay Mahadevan vertex. It acts as an global identifier which MOAB uses to 119db66d124SVijay Mahadevan assemble the individual pieces of the mesh */ 120032b8ab6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 121032b8ab6SVijay Mahadevan } 122032b8ab6SVijay Mahadevan 123032b8ab6SVijay Mahadevan totsize=dmmoab->vlocal->size(); 124fc418013SVijay Mahadevan ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->gsindices);CHKERRQ(ierr); 1251cec0304SVijay Mahadevan { 126032b8ab6SVijay Mahadevan /* first get the local indices */ 127fc418013SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr); 1284a40b570SVijay Mahadevan /* next get the ghosted indices */ 129fc418013SVijay Mahadevan if (dmmoab->nghost) { 130fc418013SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr); 1311cec0304SVijay Mahadevan } 1326e40195eSVijay Mahadevan 1336e40195eSVijay Mahadevan /* find out the local and global minima of GLOBAL_ID */ 134eb9d2429SVijay Mahadevan lmin=lmax=dmmoab->gsindices[0]; 13569263071SVijay Mahadevan for (i=0; i<totsize; ++i) { 136eb9d2429SVijay Mahadevan if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i]; 137eb9d2429SVijay Mahadevan if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i]; 138fc418013SVijay Mahadevan } 1396e40195eSVijay Mahadevan 140eb9d2429SVijay Mahadevan ierr = MPI_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr); 141eb9d2429SVijay Mahadevan PetscInfo3(dm, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin); 1421cec0304SVijay Mahadevan } 143032b8ab6SVijay Mahadevan 1441cec0304SVijay Mahadevan { 1451cec0304SVijay Mahadevan ierr = PetscSectionCreate(((PetscObject)dm)->comm, §ion);CHKERRQ(ierr); 1461cec0304SVijay Mahadevan ierr = PetscSectionSetNumFields(section, dmmoab->nfields);CHKERRQ(ierr); 147eb9d2429SVijay Mahadevan ierr = PetscSectionSetChart(section, lmin, lmax+1);CHKERRQ(ierr); 148fc418013SVijay Mahadevan for (j=0; j<totsize; ++j) { 149fc418013SVijay Mahadevan PetscInt locgid = dmmoab->gsindices[j]; 1501cec0304SVijay Mahadevan for (i=0; i < dmmoab->nfields; ++i) { 1511cec0304SVijay Mahadevan ierr = PetscSectionSetFieldName(section, i, dmmoab->fields[i]);CHKERRQ(ierr); 1521cec0304SVijay Mahadevan if (bs>1) { 153eb9d2429SVijay Mahadevan ierr = PetscSectionSetFieldDof(section, locgid, i, (locgid-gmin)*dmmoab->nfields+i);CHKERRQ(ierr); 154eb9d2429SVijay Mahadevan ierr = PetscSectionSetFieldOffset(section, locgid, i, (locgid-gmin)*dmmoab->nfields); 1551cec0304SVijay Mahadevan } 1561cec0304SVijay Mahadevan else { 157eb9d2429SVijay Mahadevan ierr = PetscSectionSetFieldDof(section, locgid, i, dmmoab->n*i+locgid-gmin);CHKERRQ(ierr); 15869263071SVijay Mahadevan ierr = PetscSectionSetFieldOffset(section, locgid, i, i*dmmoab->n); 1591cec0304SVijay Mahadevan } 1601cec0304SVijay Mahadevan } 161fc418013SVijay Mahadevan ierr = PetscSectionSetDof(section, locgid, dmmoab->nfields);CHKERRQ(ierr); 1621cec0304SVijay Mahadevan } 1631cec0304SVijay Mahadevan ierr = PetscSectionSetUp(section);CHKERRQ(ierr); 1641cec0304SVijay Mahadevan ierr = DMSetDefaultSection(dm, section);CHKERRQ(ierr); 1651cec0304SVijay Mahadevan } 1661cec0304SVijay Mahadevan 1671cec0304SVijay Mahadevan { 168fc418013SVijay Mahadevan for (i=0; i<totsize; ++i) { 169eb9d2429SVijay Mahadevan dmmoab->gsindices[i]-=gmin; /* zero based index needed for IS */ 170fc418013SVijay Mahadevan } 171fc418013SVijay Mahadevan 172032b8ab6SVijay Mahadevan /* Create Global to Local Vector Scatter Context */ 173032b8ab6SVijay Mahadevan ierr = DMCreateGlobalVector_Moab(dm, &global);CHKERRQ(ierr); 174032b8ab6SVijay Mahadevan ierr = DMCreateLocalVector_Moab(dm, &local);CHKERRQ(ierr); 175032b8ab6SVijay Mahadevan 176032b8ab6SVijay Mahadevan /* global to local must retrieve ghost points */ 177fc418013SVijay Mahadevan ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&dmmoab->gsindices[0],PETSC_COPY_VALUES,&from);CHKERRQ(ierr); 178032b8ab6SVijay Mahadevan 179db66d124SVijay Mahadevan ierr = VecGetLocalSize(global,&gsiz);CHKERRQ(ierr); 180db66d124SVijay Mahadevan ierr = VecGetLocalSize(local,&lsiz);CHKERRQ(ierr); 181032b8ab6SVijay Mahadevan 182032b8ab6SVijay Mahadevan ierr = VecScatterCreate(local,from,global,from,&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 183032b8ab6SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 184032b8ab6SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 185032b8ab6SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 186032b8ab6SVijay Mahadevan } 187032b8ab6SVijay Mahadevan 1881cec0304SVijay Mahadevan /* skin the boundary and store nodes */ 1891cec0304SVijay Mahadevan { 190eb9d2429SVijay Mahadevan /* get the skin vertices of boundary faces for the current partition and then filter 191eb9d2429SVijay Mahadevan the local, boundary faces, vertices and elements alone via PSTATUS flags; 192eb9d2429SVijay Mahadevan this should not give us any ghosted boundary, but if user needs such a functionality 193eb9d2429SVijay Mahadevan it would be easy to add it based on the find_skin query below */ 1941cec0304SVijay Mahadevan moab::Skinner skinner(dmmoab->mbiface); 1951cec0304SVijay Mahadevan dmmoab->bndyvtx = new moab::Range(); 1961cec0304SVijay Mahadevan dmmoab->bndyfaces = new moab::Range(); 19769263071SVijay Mahadevan dmmoab->bndyelems = new moab::Range(); 198eb9d2429SVijay Mahadevan 199eb9d2429SVijay Mahadevan /* get the entities on the skin - only the faces */ 20069263071SVijay 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 201eb9d2429SVijay Mahadevan 202eb9d2429SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 203eb9d2429SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 204eb9d2429SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr); 20569263071SVijay Mahadevan 20669263071SVijay Mahadevan if (dmmoab->dim == 3) { 20769263071SVijay Mahadevan // get the edges from faces and then do the same if needed 20869263071SVijay Mahadevan } 20969263071SVijay Mahadevan 210eb9d2429SVijay Mahadevan /* get all the nodes via connectivity and the parent elements via adjacency information */ 21169263071SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr); 21269263071SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr); 21369263071SVijay Mahadevan PetscInfo3(dm, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size()); 214*8d8d51c8SVijay Mahadevan 215*8d8d51c8SVijay Mahadevan /* cache a bit-vector for easy query */ 216*8d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscBool)*(dmmoab->nloc+dmmoab->nghost),&dmmoab->isbndyvtx);CHKERRQ(ierr); 217*8d8d51c8SVijay Mahadevan ierr = PetscMemzero(dmmoab->isbndyvtx,sizeof(PetscBool)*(dmmoab->nloc+dmmoab->nghost));CHKERRQ(ierr); 218*8d8d51c8SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->bndyvtx->begin(); iter != dmmoab->bndyvtx->end(); iter++) { 219*8d8d51c8SVijay Mahadevan dmmoab->isbndyvtx[(PetscInt)*iter-1]=PETSC_TRUE; 220*8d8d51c8SVijay Mahadevan } 221*8d8d51c8SVijay Mahadevan 222*8d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscBool)*dmmoab->neleloc,&dmmoab->isbndyelems);CHKERRQ(ierr); 223*8d8d51c8SVijay Mahadevan ierr = PetscMemzero(dmmoab->isbndyelems,sizeof(PetscBool)*dmmoab->neleloc);CHKERRQ(ierr); 224*8d8d51c8SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->bndyelems->begin(); iter != dmmoab->bndyelems->end(); iter++) { 225*8d8d51c8SVijay Mahadevan dmmoab->isbndyelems[(PetscInt)*iter-1]=PETSC_TRUE; 226*8d8d51c8SVijay Mahadevan } 227*8d8d51c8SVijay Mahadevan 228*8d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscBool)*dmmoab->bndyfaces->size(),&dmmoab->isbndyfaces);CHKERRQ(ierr); 229*8d8d51c8SVijay Mahadevan ierr = PetscMemzero(dmmoab->isbndyfaces,sizeof(PetscBool)*dmmoab->bndyfaces->size());CHKERRQ(ierr); 230*8d8d51c8SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->bndyfaces->begin(); iter != dmmoab->bndyfaces->end(); iter++) { 231*8d8d51c8SVijay Mahadevan dmmoab->isbndyfaces[(PetscInt)*iter-1]=PETSC_TRUE; 232*8d8d51c8SVijay Mahadevan } 2331cec0304SVijay Mahadevan } 234032b8ab6SVijay Mahadevan PetscFunctionReturn(0); 235032b8ab6SVijay Mahadevan } 236032b8ab6SVijay Mahadevan 2371cec0304SVijay Mahadevan 238032b8ab6SVijay Mahadevan #undef __FUNCT__ 239aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab" 240853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 241aa768e4cSTim Tautges { 242aa768e4cSTim Tautges PetscErrorCode ierr; 243aa768e4cSTim Tautges 244aa768e4cSTim Tautges PetscFunctionBegin; 245aa768e4cSTim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 246032b8ab6SVijay Mahadevan ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr); 247032b8ab6SVijay Mahadevan 248032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 249324f1edfSVijay Mahadevan ((DM_Moab*)dm->data)->nfields = 1; 250032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 251032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 252032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 253032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 254032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 255032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL; 256032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL; 257032b8ab6SVijay Mahadevan 258032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 259032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 260032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 261032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 262032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 263aa768e4cSTim Tautges 26497ea90e6SJed Brown dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 26597ea90e6SJed Brown dm->ops->createlocalvector = DMCreateLocalVector_Moab; 266032b8ab6SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 267032b8ab6SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 26897ea90e6SJed Brown dm->ops->destroy = DMDestroy_Moab; 269032b8ab6SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 270032b8ab6SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 271032b8ab6SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 272032b8ab6SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 273aa768e4cSTim Tautges PetscFunctionReturn(0); 274aa768e4cSTim Tautges } 275fd349b41STim Tautges 276fd349b41STim Tautges #undef __FUNCT__ 2771d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate" 2781d72bce8STim Tautges /*@ 2791d72bce8STim Tautges DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance 2801d72bce8STim Tautges 2811d72bce8STim Tautges Collective on MPI_Comm 2821d72bce8STim Tautges 2831d72bce8STim Tautges Input Parameter: 2841d72bce8STim Tautges . comm - The communicator for the DMMoab object 2851d72bce8STim Tautges 2861d72bce8STim Tautges Output Parameter: 287032b8ab6SVijay Mahadevan . dmb - The DMMoab object 2881d72bce8STim Tautges 2891d72bce8STim Tautges Level: beginner 2901d72bce8STim Tautges 2911d72bce8STim Tautges .keywords: DMMoab, create 2921d72bce8STim Tautges @*/ 293032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb) 2941d72bce8STim Tautges { 2951d72bce8STim Tautges PetscErrorCode ierr; 2961d72bce8STim Tautges 2971d72bce8STim Tautges PetscFunctionBegin; 298032b8ab6SVijay Mahadevan PetscValidPointer(dmb,2); 299032b8ab6SVijay Mahadevan ierr = DMCreate(comm, dmb);CHKERRQ(ierr); 300032b8ab6SVijay Mahadevan ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr); 3011d72bce8STim Tautges PetscFunctionReturn(0); 3021d72bce8STim Tautges } 3031d72bce8STim Tautges 3041d72bce8STim Tautges #undef __FUNCT__ 305aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab" 3061d72bce8STim Tautges /*@ 307a4d2169cSTim Tautges DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data 3081d72bce8STim Tautges 3091d72bce8STim Tautges Collective on MPI_Comm 3101d72bce8STim Tautges 3111d72bce8STim Tautges Input Parameter: 3121d72bce8STim Tautges . comm - The communicator for the DMMoab object 313032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed 314a4d2169cSTim Tautges along with the DMMoab 315a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator 3161d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag 3171d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned 3181d72bce8STim Tautges 3191d72bce8STim Tautges Output Parameter: 320032b8ab6SVijay Mahadevan . dmb - The DMMoab object 3211d72bce8STim Tautges 322032b8ab6SVijay Mahadevan Level: intermediate 3231d72bce8STim Tautges 3241d72bce8STim Tautges .keywords: DMMoab, create 3251d72bce8STim Tautges @*/ 326032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb) 3271d72bce8STim Tautges { 3281d72bce8STim Tautges PetscErrorCode ierr; 329032b8ab6SVijay Mahadevan moab::ErrorCode merr; 3301cec0304SVijay Mahadevan moab::EntityHandle partnset; 3311cec0304SVijay Mahadevan PetscInt rank, nprocs; 332853cdec3SJed Brown DM_Moab *dmmoab; 3331d72bce8STim Tautges 3341d72bce8STim Tautges PetscFunctionBegin; 335032b8ab6SVijay Mahadevan PetscValidPointer(dmb,6); 336032b8ab6SVijay Mahadevan ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr); 337032b8ab6SVijay Mahadevan dmmoab = (DM_Moab*)(*dmb)->data; 338a4d2169cSTim Tautges 339a4d2169cSTim Tautges if (!mbiface) { 34072ff976dSVijay Mahadevan dmmoab->mbiface = new moab::Core(); 3417d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_TRUE; 3421d72bce8STim Tautges } 3431cec0304SVijay Mahadevan else { 3441cec0304SVijay Mahadevan dmmoab->mbiface = mbiface; 3457d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_FALSE; 3461cec0304SVijay Mahadevan } 3471cec0304SVijay Mahadevan 3481cec0304SVijay Mahadevan /* create a fileset to store the hierarchy of entities belonging to current DM */ 3491cec0304SVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_ORDERED, dmmoab->fileset);MBERR("Creating file set failed", merr); 3507d89fc02STim Tautges 351a4d2169cSTim Tautges if (!pcomm) { 352032b8ab6SVijay Mahadevan ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 353032b8ab6SVijay Mahadevan ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr); 354032b8ab6SVijay Mahadevan 355db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 356db66d124SVijay Mahadevan to the load_file functions to be populated. */ 35772ff976dSVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset); 358032b8ab6SVijay Mahadevan MBERR("Creating partition set failed", merr); 359032b8ab6SVijay Mahadevan 360db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 36172ff976dSVijay Mahadevan dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm); 36272ff976dSVijay Mahadevan } 36372ff976dSVijay Mahadevan else { 36472ff976dSVijay Mahadevan ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr); 365032b8ab6SVijay Mahadevan } 366032b8ab6SVijay Mahadevan 3674973de03SVijay Mahadevan /* do the remaining initializations for DMMoab */ 3684973de03SVijay Mahadevan dmmoab->bs = 1; 369324f1edfSVijay Mahadevan dmmoab->nfields = 1; 3704973de03SVijay Mahadevan 3714973de03SVijay Mahadevan /* set global ID tag handle */ 372032b8ab6SVijay Mahadevan if (!ltog_tag) { 3734973de03SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 374032b8ab6SVijay Mahadevan } 375032b8ab6SVijay Mahadevan else { 376032b8ab6SVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr); 377a4d2169cSTim Tautges } 378a4d2169cSTim Tautges 3794973de03SVijay Mahadevan /* set the local range of entities (vertices) of interest */ 380a4d2169cSTim Tautges if (range) { 3815eb88e9dSVijay Mahadevan ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr); 382a4d2169cSTim Tautges } 3831d72bce8STim Tautges PetscFunctionReturn(0); 3841d72bce8STim Tautges } 3851d72bce8STim Tautges 3861d72bce8STim Tautges #undef __FUNCT__ 3871d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm" 388aa768e4cSTim Tautges /*@ 389aa768e4cSTim Tautges DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab 390aa768e4cSTim Tautges 391aa768e4cSTim Tautges Collective on MPI_Comm 392aa768e4cSTim Tautges 393aa768e4cSTim Tautges Input Parameter: 394aa768e4cSTim Tautges . dm - The DMMoab object being set 395aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab 396aa768e4cSTim Tautges 397aa768e4cSTim Tautges Level: beginner 398aa768e4cSTim Tautges 399aa768e4cSTim Tautges .keywords: DMMoab, create 400aa768e4cSTim Tautges @*/ 4011d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm) 4021d72bce8STim Tautges { 403032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 404032b8ab6SVijay Mahadevan 4051d72bce8STim Tautges PetscFunctionBegin; 4061d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4071cec0304SVijay Mahadevan PetscValidPointer(pcomm,2); 408032b8ab6SVijay Mahadevan dmmoab->pcomm = pcomm; 409032b8ab6SVijay Mahadevan dmmoab->mbiface = pcomm->get_moab(); 410032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 4111d72bce8STim Tautges PetscFunctionReturn(0); 4121d72bce8STim Tautges } 4131d72bce8STim Tautges 4141d72bce8STim Tautges 4151d72bce8STim Tautges #undef __FUNCT__ 4161d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm" 417aa768e4cSTim Tautges /*@ 418aa768e4cSTim Tautges DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab 419aa768e4cSTim Tautges 420aa768e4cSTim Tautges Collective on MPI_Comm 421aa768e4cSTim Tautges 422aa768e4cSTim Tautges Input Parameter: 423aa768e4cSTim Tautges . dm - The DMMoab object being set 424aa768e4cSTim Tautges 425aa768e4cSTim Tautges Output Parameter: 426aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 427aa768e4cSTim Tautges 428aa768e4cSTim Tautges Level: beginner 429aa768e4cSTim Tautges 430aa768e4cSTim Tautges .keywords: DMMoab, create 431aa768e4cSTim Tautges @*/ 4321d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm) 4331d72bce8STim Tautges { 4341d72bce8STim Tautges PetscFunctionBegin; 4351d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 436032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 4371d72bce8STim Tautges PetscFunctionReturn(0); 4381d72bce8STim Tautges } 4391d72bce8STim Tautges 4401d72bce8STim Tautges 4411d72bce8STim Tautges #undef __FUNCT__ 4421d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface" 443aa768e4cSTim Tautges /*@ 444aa768e4cSTim Tautges DMMoabSetInterface - Set the MOAB instance used with this DMMoab 445aa768e4cSTim Tautges 446aa768e4cSTim Tautges Collective on MPI_Comm 447aa768e4cSTim Tautges 448aa768e4cSTim Tautges Input Parameter: 449aa768e4cSTim Tautges . dm - The DMMoab object being set 450aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab 451aa768e4cSTim Tautges 452aa768e4cSTim Tautges Level: beginner 453aa768e4cSTim Tautges 454aa768e4cSTim Tautges .keywords: DMMoab, create 455aa768e4cSTim Tautges @*/ 456a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface) 4571d72bce8STim Tautges { 458032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 459032b8ab6SVijay Mahadevan 4601d72bce8STim Tautges PetscFunctionBegin; 4611d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4621cec0304SVijay Mahadevan PetscValidPointer(mbiface,2); 463032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 464032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 465032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 4661d72bce8STim Tautges PetscFunctionReturn(0); 4671d72bce8STim Tautges } 4681d72bce8STim Tautges 4691d72bce8STim Tautges 4701d72bce8STim Tautges #undef __FUNCT__ 4711d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface" 472aa768e4cSTim Tautges /*@ 473aa768e4cSTim Tautges DMMoabGetInterface - Get the MOAB instance used with this DMMoab 474aa768e4cSTim Tautges 475aa768e4cSTim Tautges Collective on MPI_Comm 476aa768e4cSTim Tautges 477aa768e4cSTim Tautges Input Parameter: 478aa768e4cSTim Tautges . dm - The DMMoab object being set 479aa768e4cSTim Tautges 480aa768e4cSTim Tautges Output Parameter: 481aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab 482aa768e4cSTim Tautges 483aa768e4cSTim Tautges Level: beginner 484aa768e4cSTim Tautges 485aa768e4cSTim Tautges .keywords: DMMoab, create 486aa768e4cSTim Tautges @*/ 487a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface) 4881d72bce8STim Tautges { 4899426e041SSatish Balay PetscErrorCode ierr; 490cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 491cabb514dSBarry Smith 4921d72bce8STim Tautges PetscFunctionBegin; 4931d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 494cabb514dSBarry 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); 495a4d2169cSTim Tautges *mbiface = ((DM_Moab*)dm->data)->mbiface; 4961d72bce8STim Tautges PetscFunctionReturn(0); 4971d72bce8STim Tautges } 4981d72bce8STim Tautges 4991d72bce8STim Tautges 5001d72bce8STim Tautges #undef __FUNCT__ 5015eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices" 502aa768e4cSTim Tautges /*@ 5035eb88e9dSVijay Mahadevan DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab 504aa768e4cSTim Tautges 505aa768e4cSTim Tautges Collective on MPI_Comm 506aa768e4cSTim Tautges 507aa768e4cSTim Tautges Input Parameter: 508aa768e4cSTim Tautges . dm - The DMMoab object being set 509aa768e4cSTim Tautges . range - The entities treated by this DMMoab 510aa768e4cSTim Tautges 511aa768e4cSTim Tautges Level: beginner 512aa768e4cSTim Tautges 513aa768e4cSTim Tautges .keywords: DMMoab, create 514aa768e4cSTim Tautges @*/ 5155eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range) 5161d72bce8STim Tautges { 517032b8ab6SVijay Mahadevan moab::ErrorCode merr; 518032b8ab6SVijay Mahadevan PetscErrorCode ierr; 519032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 520032b8ab6SVijay Mahadevan 5211d72bce8STim Tautges PetscFunctionBegin; 5221d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 523032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 524032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 525032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 526032b8ab6SVijay Mahadevan *dmmoab->vowned = *dmmoab->vlocal; 527032b8ab6SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 528032b8ab6SVijay Mahadevan *dmmoab->vghost = moab::subtract(*range, *dmmoab->vowned); 529032b8ab6SVijay Mahadevan dmmoab->nloc=dmmoab->vowned->size(); 530032b8ab6SVijay Mahadevan dmmoab->nghost=dmmoab->vghost->size(); 531032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 5321d72bce8STim Tautges PetscFunctionReturn(0); 5331d72bce8STim Tautges } 5341d72bce8STim Tautges 5351d72bce8STim Tautges 5361d72bce8STim Tautges #undef __FUNCT__ 537*8d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetAllVertices" 538*8d8d51c8SVijay Mahadevan /*@ 539*8d8d51c8SVijay Mahadevan DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab 540*8d8d51c8SVijay Mahadevan 541*8d8d51c8SVijay Mahadevan Collective on MPI_Comm 542*8d8d51c8SVijay Mahadevan 543*8d8d51c8SVijay Mahadevan Input Parameter: 544*8d8d51c8SVijay Mahadevan . dm - The DMMoab object being set 545*8d8d51c8SVijay Mahadevan 546*8d8d51c8SVijay Mahadevan Output Parameter: 547*8d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted) 548*8d8d51c8SVijay Mahadevan 549*8d8d51c8SVijay Mahadevan Level: beginner 550*8d8d51c8SVijay Mahadevan 551*8d8d51c8SVijay Mahadevan .keywords: DMMoab, create 552*8d8d51c8SVijay Mahadevan @*/ 553*8d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local) 554*8d8d51c8SVijay Mahadevan { 555*8d8d51c8SVijay Mahadevan PetscFunctionBegin; 556*8d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 557*8d8d51c8SVijay Mahadevan if (local) *local = *((DM_Moab*)dm->data)->vlocal; 558*8d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 559*8d8d51c8SVijay Mahadevan } 560*8d8d51c8SVijay Mahadevan 561*8d8d51c8SVijay Mahadevan 562*8d8d51c8SVijay Mahadevan 563*8d8d51c8SVijay Mahadevan #undef __FUNCT__ 5645eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices" 565aa768e4cSTim Tautges /*@ 5665eb88e9dSVijay Mahadevan DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab 567aa768e4cSTim Tautges 568aa768e4cSTim Tautges Collective on MPI_Comm 569aa768e4cSTim Tautges 570aa768e4cSTim Tautges Input Parameter: 571aa768e4cSTim Tautges . dm - The DMMoab object being set 572aa768e4cSTim Tautges 573aa768e4cSTim Tautges Output Parameter: 5745eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab 5755eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition 576aa768e4cSTim Tautges 577aa768e4cSTim Tautges Level: beginner 578aa768e4cSTim Tautges 579aa768e4cSTim Tautges .keywords: DMMoab, create 580aa768e4cSTim Tautges @*/ 5811cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,moab::Range *owned,moab::Range *ghost) 5821d72bce8STim Tautges { 5831d72bce8STim Tautges PetscFunctionBegin; 5841d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5851cec0304SVijay Mahadevan if (owned) *owned = *((DM_Moab*)dm->data)->vowned; 5861cec0304SVijay Mahadevan if (ghost) *ghost = *((DM_Moab*)dm->data)->vghost; 5871d72bce8STim Tautges PetscFunctionReturn(0); 5881d72bce8STim Tautges } 5891d72bce8STim Tautges 5901d72bce8STim Tautges #undef __FUNCT__ 5915eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements" 5925eb88e9dSVijay Mahadevan /*@ 5935eb88e9dSVijay Mahadevan DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned 5945eb88e9dSVijay Mahadevan 5955eb88e9dSVijay Mahadevan Collective on MPI_Comm 5965eb88e9dSVijay Mahadevan 5975eb88e9dSVijay Mahadevan Input Parameter: 5985eb88e9dSVijay Mahadevan . dm - The DMMoab object being set 5995eb88e9dSVijay Mahadevan 6005eb88e9dSVijay Mahadevan Output Parameter: 6015eb88e9dSVijay Mahadevan . range - The entities owned locally 6025eb88e9dSVijay Mahadevan 6035eb88e9dSVijay Mahadevan Level: beginner 6045eb88e9dSVijay Mahadevan 6055eb88e9dSVijay Mahadevan .keywords: DMMoab, create 6065eb88e9dSVijay Mahadevan @*/ 6071cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,moab::Range *range) 6085eb88e9dSVijay Mahadevan { 6095eb88e9dSVijay Mahadevan PetscFunctionBegin; 6105eb88e9dSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6111cec0304SVijay Mahadevan if (range) *range = *((DM_Moab*)dm->data)->elocal; 6121cec0304SVijay Mahadevan PetscFunctionReturn(0); 6131cec0304SVijay Mahadevan } 6141cec0304SVijay Mahadevan 6151cec0304SVijay Mahadevan 6161cec0304SVijay Mahadevan #undef __FUNCT__ 6171cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements" 6181cec0304SVijay Mahadevan /*@ 6191cec0304SVijay Mahadevan DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab 6201cec0304SVijay Mahadevan 6211cec0304SVijay Mahadevan Collective on MPI_Comm 6221cec0304SVijay Mahadevan 6231cec0304SVijay Mahadevan Input Parameter: 6241cec0304SVijay Mahadevan . dm - The DMMoab object being set 6251cec0304SVijay Mahadevan . range - The entities treated by this DMMoab 6261cec0304SVijay Mahadevan 6271cec0304SVijay Mahadevan Level: beginner 6281cec0304SVijay Mahadevan 6291cec0304SVijay Mahadevan .keywords: DMMoab, create 6301cec0304SVijay Mahadevan @*/ 6311cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range) 6321cec0304SVijay Mahadevan { 6331cec0304SVijay Mahadevan moab::ErrorCode merr; 6341cec0304SVijay Mahadevan PetscErrorCode ierr; 6351cec0304SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 6361cec0304SVijay Mahadevan 6371cec0304SVijay Mahadevan PetscFunctionBegin; 6381cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6391cec0304SVijay Mahadevan dmmoab->elocal->clear(); 6401cec0304SVijay Mahadevan dmmoab->eghost->clear(); 6411cec0304SVijay Mahadevan dmmoab->elocal->insert(range->begin(), range->end()); 6421cec0304SVijay Mahadevan PetscInfo2(dm, "Range size = %D; elocal size = %D.\n", range->size(), dmmoab->elocal->size()); 6431cec0304SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 6441cec0304SVijay Mahadevan *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal); 6451cec0304SVijay Mahadevan dmmoab->neleloc=dmmoab->elocal->size(); 6461cec0304SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 6471cec0304SVijay Mahadevan PetscInfo2(dm, "Created %D local and %D glocal elements.\n", dmmoab->neleloc, dmmoab->nele); 6485eb88e9dSVijay Mahadevan PetscFunctionReturn(0); 6495eb88e9dSVijay Mahadevan } 6505eb88e9dSVijay Mahadevan 6515eb88e9dSVijay Mahadevan 6525eb88e9dSVijay Mahadevan #undef __FUNCT__ 6531d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag" 654aa768e4cSTim Tautges /*@ 655aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 656aa768e4cSTim Tautges 657aa768e4cSTim Tautges Collective on MPI_Comm 658aa768e4cSTim Tautges 659aa768e4cSTim Tautges Input Parameter: 660aa768e4cSTim Tautges . dm - The DMMoab object being set 661aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 662aa768e4cSTim Tautges 663aa768e4cSTim Tautges Level: beginner 664aa768e4cSTim Tautges 665aa768e4cSTim Tautges .keywords: DMMoab, create 666aa768e4cSTim Tautges @*/ 6671d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag) 6681d72bce8STim Tautges { 6691d72bce8STim Tautges PetscFunctionBegin; 6701d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6711d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 6721d72bce8STim Tautges PetscFunctionReturn(0); 6731d72bce8STim Tautges } 6741d72bce8STim Tautges 6751d72bce8STim Tautges 6761d72bce8STim Tautges #undef __FUNCT__ 6771d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag" 678aa768e4cSTim Tautges /*@ 679aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 680aa768e4cSTim Tautges 681aa768e4cSTim Tautges Collective on MPI_Comm 682aa768e4cSTim Tautges 683aa768e4cSTim Tautges Input Parameter: 684aa768e4cSTim Tautges . dm - The DMMoab object being set 685aa768e4cSTim Tautges 686aa768e4cSTim Tautges Output Parameter: 687aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 688aa768e4cSTim Tautges 689aa768e4cSTim Tautges Level: beginner 690aa768e4cSTim Tautges 691aa768e4cSTim Tautges .keywords: DMMoab, create 692aa768e4cSTim Tautges @*/ 6931d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag) 6941d72bce8STim Tautges { 6951d72bce8STim Tautges PetscFunctionBegin; 6961d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6971d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 6981d72bce8STim Tautges PetscFunctionReturn(0); 6991d72bce8STim Tautges } 7001d72bce8STim Tautges 7011d72bce8STim Tautges 7021d72bce8STim Tautges #undef __FUNCT__ 7031d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize" 704aa768e4cSTim Tautges /*@ 705aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 706aa768e4cSTim Tautges 707aa768e4cSTim Tautges Collective on MPI_Comm 708aa768e4cSTim Tautges 709aa768e4cSTim Tautges Input Parameter: 710aa768e4cSTim Tautges . dm - The DMMoab object being set 711aa768e4cSTim Tautges . bs - The block size used with this DMMoab 712aa768e4cSTim Tautges 713aa768e4cSTim Tautges Level: beginner 714aa768e4cSTim Tautges 715aa768e4cSTim Tautges .keywords: DMMoab, create 716aa768e4cSTim Tautges @*/ 7171d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs) 7181d72bce8STim Tautges { 7191d72bce8STim Tautges PetscFunctionBegin; 7201d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7211d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 7221d72bce8STim Tautges PetscFunctionReturn(0); 7231d72bce8STim Tautges } 7241d72bce8STim Tautges 7251d72bce8STim Tautges 7261d72bce8STim Tautges #undef __FUNCT__ 7271d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize" 728aa768e4cSTim Tautges /*@ 729aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 730aa768e4cSTim Tautges 731aa768e4cSTim Tautges Collective on MPI_Comm 732aa768e4cSTim Tautges 733aa768e4cSTim Tautges Input Parameter: 734aa768e4cSTim Tautges . dm - The DMMoab object being set 735aa768e4cSTim Tautges 736aa768e4cSTim Tautges Output Parameter: 737aa768e4cSTim Tautges . bs - The block size used with this DMMoab 738aa768e4cSTim Tautges 739aa768e4cSTim Tautges Level: beginner 740aa768e4cSTim Tautges 741aa768e4cSTim Tautges .keywords: DMMoab, create 742aa768e4cSTim Tautges @*/ 7431d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs) 7441d72bce8STim Tautges { 7451d72bce8STim Tautges PetscFunctionBegin; 7461d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7471d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 7481d72bce8STim Tautges PetscFunctionReturn(0); 7491d72bce8STim Tautges } 7501d72bce8STim Tautges 7511cec0304SVijay Mahadevan 7521cec0304SVijay Mahadevan #undef __FUNCT__ 753212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetSize" 754212ad6d1SVijay Mahadevan /*@ 755212ad6d1SVijay Mahadevan DMMoabGetSize - Get the global vertex size used with this DMMoab 756212ad6d1SVijay Mahadevan 757212ad6d1SVijay Mahadevan Collective on MPI_Comm 758212ad6d1SVijay Mahadevan 759212ad6d1SVijay Mahadevan Input Parameter: 760212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 761212ad6d1SVijay Mahadevan 762212ad6d1SVijay Mahadevan Output Parameter: 763212ad6d1SVijay Mahadevan . ng - The global size of the DMMoab instance 764212ad6d1SVijay Mahadevan 765212ad6d1SVijay Mahadevan Level: beginner 766212ad6d1SVijay Mahadevan 767212ad6d1SVijay Mahadevan .keywords: DMMoab, create 768212ad6d1SVijay Mahadevan @*/ 769212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *ng) 770212ad6d1SVijay Mahadevan { 771212ad6d1SVijay Mahadevan PetscFunctionBegin; 772212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 773212ad6d1SVijay Mahadevan if(ng) *ng = ((DM_Moab*)dm->data)->n; 774212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 775212ad6d1SVijay Mahadevan } 776212ad6d1SVijay Mahadevan 777212ad6d1SVijay Mahadevan 778212ad6d1SVijay Mahadevan #undef __FUNCT__ 779212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalSize" 780212ad6d1SVijay Mahadevan /*@ 781212ad6d1SVijay Mahadevan DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab 782212ad6d1SVijay Mahadevan 783212ad6d1SVijay Mahadevan Collective on MPI_Comm 784212ad6d1SVijay Mahadevan 785212ad6d1SVijay Mahadevan Input Parameter: 786212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 787212ad6d1SVijay Mahadevan 788212ad6d1SVijay Mahadevan Output Parameter: 789212ad6d1SVijay Mahadevan . nl - The local size of the DMMoab instance 790212ad6d1SVijay Mahadevan . ng - The ghosted size of the DMMoab instance 791212ad6d1SVijay Mahadevan 792212ad6d1SVijay Mahadevan Level: beginner 793212ad6d1SVijay Mahadevan 794212ad6d1SVijay Mahadevan .keywords: DMMoab, create 795212ad6d1SVijay Mahadevan @*/ 796212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nl,PetscInt *ng) 797212ad6d1SVijay Mahadevan { 798212ad6d1SVijay Mahadevan PetscFunctionBegin; 799212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 800212ad6d1SVijay Mahadevan if(nl) *nl = ((DM_Moab*)dm->data)->nloc; 801212ad6d1SVijay Mahadevan if(ng) *ng = ((DM_Moab*)dm->data)->nghost; 802212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 803212ad6d1SVijay Mahadevan } 804212ad6d1SVijay Mahadevan 805212ad6d1SVijay Mahadevan 806212ad6d1SVijay Mahadevan #undef __FUNCT__ 8074920ab11SVijay Mahadevan #define __FUNCT__ "DMMoabGetDimension" 8084920ab11SVijay Mahadevan /*@ 8094920ab11SVijay Mahadevan DMMoabGetDimension - Get the dimension of the DM Mesh 8104920ab11SVijay Mahadevan 8114920ab11SVijay Mahadevan Collective on MPI_Comm 8124920ab11SVijay Mahadevan 8134920ab11SVijay Mahadevan Input Parameter: 8144920ab11SVijay Mahadevan . dm - The DMMoab object being set 8154920ab11SVijay Mahadevan 8164920ab11SVijay Mahadevan Output Parameter: 8174920ab11SVijay Mahadevan . dim - The dimension of DM 8184920ab11SVijay Mahadevan 8194920ab11SVijay Mahadevan Level: beginner 8204920ab11SVijay Mahadevan 8214920ab11SVijay Mahadevan .keywords: DMMoab, create 8224920ab11SVijay Mahadevan @*/ 8234920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim) 8244920ab11SVijay Mahadevan { 8254920ab11SVijay Mahadevan PetscFunctionBegin; 8264920ab11SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8274920ab11SVijay Mahadevan *dim = ((DM_Moab*)dm->data)->dim; 8284920ab11SVijay Mahadevan PetscFunctionReturn(0); 8294920ab11SVijay Mahadevan } 8304920ab11SVijay Mahadevan 8314920ab11SVijay Mahadevan 8324920ab11SVijay Mahadevan 8334920ab11SVijay Mahadevan #undef __FUNCT__ 8341cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldVector" 8351cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec) 8361cec0304SVijay Mahadevan { 8371cec0304SVijay Mahadevan DM_Moab *dmmoab; 8381cec0304SVijay Mahadevan moab::Tag vtag,ntag; 839212ad6d1SVijay Mahadevan const PetscScalar *varray; 840212ad6d1SVijay Mahadevan PetscScalar *farray; 8411cec0304SVijay Mahadevan moab::ErrorCode merr; 8421cec0304SVijay Mahadevan PetscErrorCode ierr; 8431cec0304SVijay Mahadevan PetscInt doff; 8441cec0304SVijay Mahadevan std::string tag_name; 8451cec0304SVijay Mahadevan moab::Range::iterator iter; 8461cec0304SVijay Mahadevan 8471cec0304SVijay Mahadevan PetscFunctionBegin; 8481cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8491cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8501cec0304SVijay Mahadevan 8511cec0304SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 8521cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag, 8531cec0304SVijay Mahadevan moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr); 8541cec0304SVijay Mahadevan 8551cec0304SVijay Mahadevan ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr); 8561cec0304SVijay Mahadevan 8571cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name); 8581cec0304SVijay Mahadevan if (!tag_name.length() && merr !=moab::MB_SUCCESS) { 859212ad6d1SVijay Mahadevan ierr = VecGetArrayRead(fvec,&varray);CHKERRQ(ierr); 860212ad6d1SVijay Mahadevan 8611cec0304SVijay Mahadevan for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) { 8621cec0304SVijay Mahadevan moab::EntityHandle vtx = (*iter); 8631cec0304SVijay Mahadevan 8641cec0304SVijay Mahadevan /* get field dof index */ 865212ad6d1SVijay Mahadevan ierr = DMMoabGetFieldDof(dm, vtx, ifield, &doff); 8661cec0304SVijay Mahadevan 8671cec0304SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */ 8681cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, &vtx, 1, (const void*)&varray[doff]);MBERRNM(merr); 8691cec0304SVijay Mahadevan } 870212ad6d1SVijay Mahadevan ierr = VecRestoreArrayRead(fvec,&varray);CHKERRQ(ierr); 8711cec0304SVijay Mahadevan } 8721cec0304SVijay Mahadevan else { 873212ad6d1SVijay Mahadevan ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&farray);CHKERRQ(ierr); 8741cec0304SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 875212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)farray);MBERRNM(merr); 876212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr); 8771cec0304SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 8781cec0304SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr); 879212ad6d1SVijay Mahadevan ierr = PetscFree(farray);CHKERRQ(ierr); 880212ad6d1SVijay Mahadevan } 881212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 882212ad6d1SVijay Mahadevan } 883212ad6d1SVijay Mahadevan 884212ad6d1SVijay Mahadevan 885212ad6d1SVijay Mahadevan #undef __FUNCT__ 886212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabSetGlobalFieldVector" 887212ad6d1SVijay Mahadevan PetscErrorCode DMMoabSetGlobalFieldVector(DM dm, Vec fvec) 888212ad6d1SVijay Mahadevan { 889212ad6d1SVijay Mahadevan DM_Moab *dmmoab; 890212ad6d1SVijay Mahadevan moab::Tag vtag,ntag; 891212ad6d1SVijay Mahadevan const PetscScalar *varray; 892212ad6d1SVijay Mahadevan PetscScalar *farray; 893212ad6d1SVijay Mahadevan moab::ErrorCode merr; 894212ad6d1SVijay Mahadevan PetscErrorCode ierr; 895212ad6d1SVijay Mahadevan PetscSection section; 896212ad6d1SVijay Mahadevan PetscInt i,doff,ifield; 897212ad6d1SVijay Mahadevan std::string tag_name; 898212ad6d1SVijay Mahadevan moab::Range::iterator iter; 899212ad6d1SVijay Mahadevan 900212ad6d1SVijay Mahadevan PetscFunctionBegin; 901212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 902212ad6d1SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 903212ad6d1SVijay Mahadevan 904212ad6d1SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 905212ad6d1SVijay Mahadevan 906212ad6d1SVijay Mahadevan /* get the Tag corresponding to the global vector - possible that there is no tag associated.. */ 907212ad6d1SVijay Mahadevan ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr); 908212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name); 909212ad6d1SVijay Mahadevan if (!tag_name.length() && merr !=moab::MB_SUCCESS) { 910212ad6d1SVijay Mahadevan /* not a MOAB vector - use VecGetSubVector to get the parts as needed */ 911212ad6d1SVijay Mahadevan 912212ad6d1SVijay Mahadevan ierr = VecGetArrayRead(fvec,&varray);CHKERRQ(ierr); 913212ad6d1SVijay Mahadevan for (ifield=0; ifield<dmmoab->nfields; ++ifield) { 914212ad6d1SVijay Mahadevan 915212ad6d1SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 916212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag, 917212ad6d1SVijay Mahadevan moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr); 918212ad6d1SVijay Mahadevan 919212ad6d1SVijay Mahadevan for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) { 920212ad6d1SVijay Mahadevan moab::EntityHandle vtx = (*iter); 921212ad6d1SVijay Mahadevan 922212ad6d1SVijay Mahadevan /* get field dof index */ 923212ad6d1SVijay Mahadevan ierr = DMMoabGetFieldDof(dm, vtx, ifield, &doff); 924212ad6d1SVijay Mahadevan 925212ad6d1SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */ 926212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, &vtx, 1, (const void*)&varray[doff]);MBERRNM(merr); 927212ad6d1SVijay Mahadevan } 928212ad6d1SVijay Mahadevan } 929212ad6d1SVijay Mahadevan ierr = VecRestoreArrayRead(fvec,&varray);CHKERRQ(ierr); 930212ad6d1SVijay Mahadevan } 931212ad6d1SVijay Mahadevan else { 932212ad6d1SVijay Mahadevan ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&farray);CHKERRQ(ierr); 933212ad6d1SVijay Mahadevan ierr = PetscMalloc(dmmoab->nloc*dmmoab->bs*sizeof(PetscScalar),&varray);CHKERRQ(ierr); 934212ad6d1SVijay Mahadevan 935212ad6d1SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 936212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray);MBERRNM(merr); 937212ad6d1SVijay Mahadevan for (ifield=0; ifield<dmmoab->nfields; ++ifield) { 938212ad6d1SVijay Mahadevan 939212ad6d1SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 940212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag, 941212ad6d1SVijay Mahadevan moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr); 942212ad6d1SVijay Mahadevan 943212ad6d1SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 944212ad6d1SVijay Mahadevan for(i=0; i < dmmoab->nloc; i++) { 945212ad6d1SVijay Mahadevan farray[i] = varray[i*dmmoab->bs+ifield]; 946212ad6d1SVijay Mahadevan } 947212ad6d1SVijay Mahadevan 948212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr); 949212ad6d1SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 950212ad6d1SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr); 951212ad6d1SVijay Mahadevan } 952212ad6d1SVijay Mahadevan ierr = PetscFree(farray);CHKERRQ(ierr); 9531cec0304SVijay Mahadevan ierr = PetscFree(varray);CHKERRQ(ierr); 9541cec0304SVijay Mahadevan } 9551cec0304SVijay Mahadevan PetscFunctionReturn(0); 9561cec0304SVijay Mahadevan } 9571cec0304SVijay Mahadevan 9581cec0304SVijay Mahadevan 959212ad6d1SVijay Mahadevan 9601cec0304SVijay Mahadevan #undef __FUNCT__ 9617023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates" 9627023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos) 9637023aa44SVijay Mahadevan { 9647023aa44SVijay Mahadevan DM_Moab *dmmoab; 9657023aa44SVijay Mahadevan PetscErrorCode ierr; 9667023aa44SVijay Mahadevan moab::ErrorCode merr; 9677023aa44SVijay Mahadevan 9687023aa44SVijay Mahadevan PetscFunctionBegin; 9697023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 9707023aa44SVijay Mahadevan PetscValidPointer(conn,3); 9717023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 9727023aa44SVijay Mahadevan 9737023aa44SVijay Mahadevan if (!vpos) { 9747023aa44SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr); 9757023aa44SVijay Mahadevan } 9767023aa44SVijay Mahadevan 9777023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 9787023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr); 9797023aa44SVijay Mahadevan PetscFunctionReturn(0); 9807023aa44SVijay Mahadevan } 9817023aa44SVijay Mahadevan 9827023aa44SVijay Mahadevan 9837023aa44SVijay Mahadevan #undef __FUNCT__ 984*8d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexConnectivity" 985*8d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn) 986*8d8d51c8SVijay Mahadevan { 987*8d8d51c8SVijay Mahadevan DM_Moab *dmmoab; 988*8d8d51c8SVijay Mahadevan std::vector<moab::EntityHandle> adj_entities,connect; 989*8d8d51c8SVijay Mahadevan PetscErrorCode ierr; 990*8d8d51c8SVijay Mahadevan moab::ErrorCode merr; 991*8d8d51c8SVijay Mahadevan 992*8d8d51c8SVijay Mahadevan PetscFunctionBegin; 993*8d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 994*8d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 995*8d8d51c8SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 996*8d8d51c8SVijay Mahadevan 997*8d8d51c8SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 998*8d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(&ehandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr); 999*8d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr); 1000*8d8d51c8SVijay Mahadevan 1001*8d8d51c8SVijay Mahadevan #if 0 1002*8d8d51c8SVijay Mahadevan for(unsigned int jter = 0; jter < connect.size(); jter++) { 1003*8d8d51c8SVijay Mahadevan PetscPrintf(PETSC_COMM_SELF,"Handle=%D\tAdj_Size=%D\tAdj_Entity=%D\n",ehandle,connect.size(),connect[jter]); 1004*8d8d51c8SVijay Mahadevan } 1005*8d8d51c8SVijay Mahadevan #endif 1006*8d8d51c8SVijay Mahadevan 1007*8d8d51c8SVijay Mahadevan if (conn) { 1008*8d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr); 1009*8d8d51c8SVijay Mahadevan ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr); 1010*8d8d51c8SVijay Mahadevan } 1011*8d8d51c8SVijay Mahadevan if (nconn) *nconn=connect.size(); 1012*8d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 1013*8d8d51c8SVijay Mahadevan } 1014*8d8d51c8SVijay Mahadevan 1015*8d8d51c8SVijay Mahadevan 1016*8d8d51c8SVijay Mahadevan #undef __FUNCT__ 1017*8d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabRestoreVertexConnectivity" 1018*8d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn) 1019*8d8d51c8SVijay Mahadevan { 1020*8d8d51c8SVijay Mahadevan PetscErrorCode ierr; 1021*8d8d51c8SVijay Mahadevan 1022*8d8d51c8SVijay Mahadevan PetscFunctionBegin; 1023*8d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1024*8d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 1025*8d8d51c8SVijay Mahadevan 1026*8d8d51c8SVijay Mahadevan if (conn) { 1027*8d8d51c8SVijay Mahadevan ierr = PetscFree(*conn);CHKERRQ(ierr); 1028*8d8d51c8SVijay Mahadevan } 1029*8d8d51c8SVijay Mahadevan if (nconn) *nconn=0; 1030*8d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 1031*8d8d51c8SVijay Mahadevan } 1032*8d8d51c8SVijay Mahadevan 1033*8d8d51c8SVijay Mahadevan 1034*8d8d51c8SVijay Mahadevan 1035*8d8d51c8SVijay Mahadevan #undef __FUNCT__ 10367023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity" 10377023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn) 10387023aa44SVijay Mahadevan { 10397023aa44SVijay Mahadevan DM_Moab *dmmoab; 10407023aa44SVijay Mahadevan const moab::EntityHandle *connect; 10417023aa44SVijay Mahadevan moab::ErrorCode merr; 10427023aa44SVijay Mahadevan PetscInt nnodes; 10437023aa44SVijay Mahadevan 10447023aa44SVijay Mahadevan PetscFunctionBegin; 10457023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 10467023aa44SVijay Mahadevan PetscValidPointer(conn,4); 10477023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 10487023aa44SVijay Mahadevan 10497023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 10507023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr); 10517023aa44SVijay Mahadevan if (conn) *conn=connect; 10527023aa44SVijay Mahadevan if (nconn) *nconn=nnodes; 10537023aa44SVijay Mahadevan PetscFunctionReturn(0); 10547023aa44SVijay Mahadevan } 10557023aa44SVijay Mahadevan 10567023aa44SVijay Mahadevan 10577023aa44SVijay Mahadevan #undef __FUNCT__ 105869263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary" 105969263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary) 106069263071SVijay Mahadevan { 106169263071SVijay Mahadevan moab::EntityType etype; 106269263071SVijay Mahadevan DM_Moab *dmmoab; 106369263071SVijay Mahadevan PetscInt edim; 106469263071SVijay Mahadevan 106569263071SVijay Mahadevan PetscFunctionBegin; 106669263071SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 106769263071SVijay Mahadevan PetscValidPointer(ent_on_boundary,3); 106869263071SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 106969263071SVijay Mahadevan 107069263071SVijay Mahadevan /* get the entity type and handle accordingly */ 107169263071SVijay Mahadevan etype=dmmoab->mbiface->type_from_handle(ent); 107269263071SVijay 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); 107369263071SVijay Mahadevan 107469263071SVijay Mahadevan /* get the entity dimension */ 107569263071SVijay Mahadevan edim=dmmoab->mbiface->dimension_from_handle(ent); 107669263071SVijay Mahadevan 107769263071SVijay Mahadevan *ent_on_boundary=PETSC_FALSE; 107869263071SVijay Mahadevan if(etype == moab::MBVERTEX && edim == 0) { 1079*8d8d51c8SVijay Mahadevan if (ent < (*dmmoab->vlocal)[0] || ent > (*dmmoab->vlocal)[dmmoab->nloc-1]) SETERRQ1(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Invalid boundary vertex entity handle: %D\n",ent); 1080*8d8d51c8SVijay Mahadevan *ent_on_boundary=dmmoab->isbndyvtx[(PetscInt)ent-1]; 108169263071SVijay Mahadevan } 108269263071SVijay Mahadevan else { 108369263071SVijay Mahadevan if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */ 1084*8d8d51c8SVijay Mahadevan if (ent < (*dmmoab->elocal)[0] || ent > (*dmmoab->elocal)[dmmoab->neleloc-1]) SETERRQ1(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Invalid boundary element entity handle: %D\n",ent); 1085*8d8d51c8SVijay Mahadevan *ent_on_boundary=dmmoab->isbndyelems[(PetscInt)ent-1]; 108669263071SVijay Mahadevan } 108769263071SVijay Mahadevan else { /* next check the lower-dimensional faces */ 108869263071SVijay Mahadevan moab::Range::const_iterator gfiter = dmmoab->bndyfaces->find(ent); 108969263071SVijay Mahadevan if (gfiter != dmmoab->bndyfaces->end()) *ent_on_boundary=PETSC_TRUE; 109069263071SVijay Mahadevan } 109169263071SVijay Mahadevan } 109269263071SVijay Mahadevan PetscFunctionReturn(0); 109369263071SVijay Mahadevan } 109469263071SVijay Mahadevan 109569263071SVijay Mahadevan 109669263071SVijay Mahadevan #undef __FUNCT__ 10977023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices" 109869263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx) 10997023aa44SVijay Mahadevan { 11007023aa44SVijay Mahadevan DM_Moab *dmmoab; 11017023aa44SVijay Mahadevan PetscInt i; 11027023aa44SVijay Mahadevan 11037023aa44SVijay Mahadevan PetscFunctionBegin; 11047023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 11057023aa44SVijay Mahadevan PetscValidPointer(cnt,3); 11067023aa44SVijay Mahadevan PetscValidPointer(isbdvtx,4); 11077023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 11087023aa44SVijay Mahadevan 11097023aa44SVijay Mahadevan for (i=0; i < nconn; ++i) { 11107023aa44SVijay Mahadevan moab::Range::const_iterator giter = dmmoab->bndyvtx->find(cnt[i]); 111169263071SVijay Mahadevan if (giter != dmmoab->bndyvtx->end()) isbdvtx[i] = PETSC_TRUE; 11127023aa44SVijay Mahadevan else isbdvtx[i] = PETSC_FALSE; 11137023aa44SVijay Mahadevan } 11147023aa44SVijay Mahadevan PetscFunctionReturn(0); 11157023aa44SVijay Mahadevan } 11167023aa44SVijay Mahadevan 11177023aa44SVijay Mahadevan 11187023aa44SVijay Mahadevan #undef __FUNCT__ 11191cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryEntities" 112069263071SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryEntities(DM dm,moab::Range *bdvtx,moab::Range* bdfaces,moab::Range* bdelems) 11211cec0304SVijay Mahadevan { 11221cec0304SVijay Mahadevan DM_Moab *dmmoab; 11231cec0304SVijay Mahadevan 11241cec0304SVijay Mahadevan PetscFunctionBegin; 11251cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 11261cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 11271cec0304SVijay Mahadevan 11281cec0304SVijay Mahadevan if (bdvtx) *bdvtx = *dmmoab->bndyvtx; 11291cec0304SVijay Mahadevan if (bdfaces) *bdfaces = *dmmoab->bndyfaces; 113069263071SVijay Mahadevan if (bdelems) *bdfaces = *dmmoab->bndyelems; 11311cec0304SVijay Mahadevan PetscFunctionReturn(0); 11321cec0304SVijay Mahadevan } 11331cec0304SVijay Mahadevan 11341cec0304SVijay Mahadevan 11351cec0304SVijay Mahadevan #undef __FUNCT__ 11361cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFields" 11371cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFields(DM dm,PetscInt nfields,const char** fields) 11381cec0304SVijay Mahadevan { 11391cec0304SVijay Mahadevan DM_Moab *dmmoab; 11401cec0304SVijay Mahadevan 11411cec0304SVijay Mahadevan PetscFunctionBegin; 11421cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 11431cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 11441cec0304SVijay Mahadevan 11451cec0304SVijay Mahadevan dmmoab->fields = fields; 11461cec0304SVijay Mahadevan dmmoab->nfields = nfields; 11471cec0304SVijay Mahadevan PetscFunctionReturn(0); 11481cec0304SVijay Mahadevan } 11491cec0304SVijay Mahadevan 11501cec0304SVijay Mahadevan 11511cec0304SVijay Mahadevan #undef __FUNCT__ 11521cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDof" 11531cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof) 11541cec0304SVijay Mahadevan { 11551cec0304SVijay Mahadevan PetscSection section; 1156fc418013SVijay Mahadevan PetscInt gid; 11571cec0304SVijay Mahadevan PetscErrorCode ierr; 1158fc418013SVijay Mahadevan moab::ErrorCode merr; 1159fc418013SVijay Mahadevan DM_Moab *dmmoab; 11601cec0304SVijay Mahadevan 11611cec0304SVijay Mahadevan PetscFunctionBegin; 11621cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1163fc418013SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1164fc418013SVijay Mahadevan 11651cec0304SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 1166fc418013SVijay Mahadevan 1167fc418013SVijay Mahadevan /* first get the global ID for the point */ 1168fc418013SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,&point,1,&gid);MBERRNM(merr); 1169fc418013SVijay Mahadevan 1170fc418013SVijay Mahadevan /* get the dof value for the field */ 1171fc418013SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, gid, field, dof);CHKERRQ(ierr); 11721cec0304SVijay Mahadevan PetscFunctionReturn(0); 11731cec0304SVijay Mahadevan } 11741cec0304SVijay Mahadevan 11751cec0304SVijay Mahadevan 11761cec0304SVijay Mahadevan #undef __FUNCT__ 11771cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofs" 11781cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof) 11791cec0304SVijay Mahadevan { 1180fc418013SVijay Mahadevan PetscInt i,gid; 11811cec0304SVijay Mahadevan PetscSection section; 11821cec0304SVijay Mahadevan PetscErrorCode ierr; 1183fc418013SVijay Mahadevan moab::ErrorCode merr; 1184fc418013SVijay Mahadevan DM_Moab *dmmoab; 11851cec0304SVijay Mahadevan 11861cec0304SVijay Mahadevan PetscFunctionBegin; 11871cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1188324f1edfSVijay Mahadevan PetscValidPointer(points,2); 1189fc418013SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1190fc418013SVijay Mahadevan 11911cec0304SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 11921cec0304SVijay Mahadevan if (!dof) { 1193*8d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr); 11941cec0304SVijay Mahadevan } 1195fc418013SVijay Mahadevan 1196fc418013SVijay Mahadevan /* first get the local indices */ 1197fc418013SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,points,npoints,dof);MBERRNM(merr); 1198fc418013SVijay Mahadevan 11991cec0304SVijay Mahadevan for (i=0; i<npoints; ++i) { 1200fc418013SVijay Mahadevan gid=dof[i]; 1201fc418013SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, gid, field, &dof[i]);CHKERRQ(ierr); 12021cec0304SVijay Mahadevan } 12031cec0304SVijay Mahadevan PetscFunctionReturn(0); 12041cec0304SVijay Mahadevan } 12051cec0304SVijay Mahadevan 12061cec0304SVijay Mahadevan 1207fc418013SVijay Mahadevan #undef __FUNCT__ 1208212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofsLocal" 1209212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof) 1210eb9d2429SVijay Mahadevan { 1211eb9d2429SVijay Mahadevan PetscInt i,offset; 1212eb9d2429SVijay Mahadevan PetscErrorCode ierr; 1213eb9d2429SVijay Mahadevan DM_Moab *dmmoab; 1214eb9d2429SVijay Mahadevan 1215eb9d2429SVijay Mahadevan PetscFunctionBegin; 1216eb9d2429SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1217324f1edfSVijay Mahadevan PetscValidPointer(points,2); 1218eb9d2429SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1219eb9d2429SVijay Mahadevan 1220eb9d2429SVijay Mahadevan if (!dof) { 1221*8d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr); 1222eb9d2429SVijay Mahadevan } 1223eb9d2429SVijay Mahadevan 1224eb9d2429SVijay Mahadevan if (dmmoab->bs > 1) { 1225eb9d2429SVijay Mahadevan for (i=0; i<npoints; ++i) 1226eb9d2429SVijay Mahadevan dof[i] = (points[i]-1)*dmmoab->bs+field; 1227eb9d2429SVijay Mahadevan } 1228eb9d2429SVijay Mahadevan else { 1229eb9d2429SVijay Mahadevan offset = field*dmmoab->n; /* assume all fields have equal distribution */ 1230eb9d2429SVijay Mahadevan for (i=0; i<npoints; ++i) 1231eb9d2429SVijay Mahadevan dof[i] = offset+points[i]-1; 1232eb9d2429SVijay Mahadevan } 1233eb9d2429SVijay Mahadevan PetscFunctionReturn(0); 1234eb9d2429SVijay Mahadevan } 1235eb9d2429SVijay Mahadevan 1236eb9d2429SVijay Mahadevan 1237eb9d2429SVijay Mahadevan #undef __FUNCT__ 1238212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofs" 1239212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 1240212ad6d1SVijay Mahadevan { 1241212ad6d1SVijay Mahadevan PetscInt i,f,gid; 1242212ad6d1SVijay Mahadevan PetscSection section; 1243212ad6d1SVijay Mahadevan PetscErrorCode ierr; 1244212ad6d1SVijay Mahadevan moab::ErrorCode merr; 1245212ad6d1SVijay Mahadevan DM_Moab *dmmoab; 1246212ad6d1SVijay Mahadevan 1247212ad6d1SVijay Mahadevan PetscFunctionBegin; 1248212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1249324f1edfSVijay Mahadevan PetscValidPointer(points,2); 1250212ad6d1SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1251212ad6d1SVijay Mahadevan 1252212ad6d1SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 1253212ad6d1SVijay Mahadevan if (!dof) { 1254*8d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscInt)*dmmoab->nfields*npoints, &dof);CHKERRQ(ierr); 1255212ad6d1SVijay Mahadevan } 1256212ad6d1SVijay Mahadevan 1257212ad6d1SVijay Mahadevan /* first get the local indices */ 1258212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,points,npoints,dof);MBERRNM(merr); 1259212ad6d1SVijay Mahadevan 1260212ad6d1SVijay Mahadevan for (i=0; i<npoints; ++i) { 1261212ad6d1SVijay Mahadevan gid=dof[i]; 1262212ad6d1SVijay Mahadevan for (f=0; f<dmmoab->nfields; ++f) { 1263212ad6d1SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, gid, f, &dof[i*dmmoab->nfields+f]);CHKERRQ(ierr); 1264212ad6d1SVijay Mahadevan } 1265212ad6d1SVijay Mahadevan } 1266212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 1267212ad6d1SVijay Mahadevan } 1268212ad6d1SVijay Mahadevan 1269212ad6d1SVijay Mahadevan 1270212ad6d1SVijay Mahadevan #undef __FUNCT__ 1271212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsLocal" 1272212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 1273212ad6d1SVijay Mahadevan { 1274212ad6d1SVijay Mahadevan PetscInt i,f,offset; 1275212ad6d1SVijay Mahadevan PetscErrorCode ierr; 1276212ad6d1SVijay Mahadevan DM_Moab *dmmoab; 1277212ad6d1SVijay Mahadevan 1278212ad6d1SVijay Mahadevan PetscFunctionBegin; 1279212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1280324f1edfSVijay Mahadevan PetscValidPointer(points,2); 1281212ad6d1SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1282212ad6d1SVijay Mahadevan 1283212ad6d1SVijay Mahadevan if (!dof) { 1284*8d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscInt)*dmmoab->nfields*npoints, &dof);CHKERRQ(ierr); 1285212ad6d1SVijay Mahadevan } 1286212ad6d1SVijay Mahadevan 1287212ad6d1SVijay Mahadevan if (dmmoab->bs > 1) { 1288212ad6d1SVijay Mahadevan for (f=0; f<dmmoab->nfields; ++f) 1289212ad6d1SVijay Mahadevan for (i=0; i<npoints; ++i) 1290212ad6d1SVijay Mahadevan dof[i*dmmoab->nfields+f] = (points[i]-1)*dmmoab->bs+f; 1291212ad6d1SVijay Mahadevan } 1292212ad6d1SVijay Mahadevan else { 1293212ad6d1SVijay Mahadevan for (f=0; f<dmmoab->nfields; ++f) { 1294212ad6d1SVijay Mahadevan offset = f*dmmoab->n; /* assume all fields have equal distribution - say all vertex based */ 1295212ad6d1SVijay Mahadevan for (i=0; i<npoints; ++i) 1296212ad6d1SVijay Mahadevan dof[i*dmmoab->nfields+f] = offset+points[i]-1; 1297212ad6d1SVijay Mahadevan } 1298212ad6d1SVijay Mahadevan } 1299212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 1300212ad6d1SVijay Mahadevan } 1301212ad6d1SVijay Mahadevan 1302212ad6d1SVijay Mahadevan 1303212ad6d1SVijay Mahadevan #undef __FUNCT__ 1304212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlocked" 1305212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlocked(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 1306212ad6d1SVijay Mahadevan { 1307212ad6d1SVijay Mahadevan PetscInt i,gid,dofindx; 1308212ad6d1SVijay Mahadevan PetscSection section; 1309212ad6d1SVijay Mahadevan PetscErrorCode ierr; 1310212ad6d1SVijay Mahadevan moab::ErrorCode merr; 1311212ad6d1SVijay Mahadevan DM_Moab *dmmoab; 1312212ad6d1SVijay Mahadevan 1313212ad6d1SVijay Mahadevan PetscFunctionBegin; 1314212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1315324f1edfSVijay Mahadevan PetscValidPointer(points,2); 1316212ad6d1SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1317212ad6d1SVijay Mahadevan 1318212ad6d1SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 1319212ad6d1SVijay Mahadevan if (!dof) { 1320*8d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr); 1321212ad6d1SVijay Mahadevan } 1322212ad6d1SVijay Mahadevan 1323212ad6d1SVijay Mahadevan /* first get the local indices */ 1324212ad6d1SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,points,npoints,dof);MBERRNM(merr); 1325212ad6d1SVijay Mahadevan 1326212ad6d1SVijay Mahadevan for (i=0; i<npoints; ++i) { 1327212ad6d1SVijay Mahadevan gid=dof[i]; 1328212ad6d1SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, gid, 0, &dofindx);CHKERRQ(ierr); 1329212ad6d1SVijay Mahadevan if (dmmoab->bs > 1) dof[i]=dofindx/dmmoab->bs; 1330212ad6d1SVijay Mahadevan else dof[i]=dofindx; 1331212ad6d1SVijay Mahadevan } 1332212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 1333212ad6d1SVijay Mahadevan } 1334212ad6d1SVijay Mahadevan 1335212ad6d1SVijay Mahadevan 1336212ad6d1SVijay Mahadevan #undef __FUNCT__ 1337212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlockedLocal" 1338212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof) 1339212ad6d1SVijay Mahadevan { 1340212ad6d1SVijay Mahadevan PetscInt i; 1341212ad6d1SVijay Mahadevan PetscErrorCode ierr; 1342212ad6d1SVijay Mahadevan 1343212ad6d1SVijay Mahadevan PetscFunctionBegin; 1344212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1345324f1edfSVijay Mahadevan PetscValidPointer(points,2); 1346212ad6d1SVijay Mahadevan 1347212ad6d1SVijay Mahadevan if (!dof) { 1348*8d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr); 1349212ad6d1SVijay Mahadevan } 1350212ad6d1SVijay Mahadevan 1351212ad6d1SVijay Mahadevan for (i=0; i<npoints; ++i) 1352212ad6d1SVijay Mahadevan dof[i] = points[i]-1; 1353212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 1354212ad6d1SVijay Mahadevan } 1355212ad6d1SVijay Mahadevan 1356*8d8d51c8SVijay Mahadevan 1357*8d8d51c8SVijay Mahadevan #undef __FUNCT__ 1358*8d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexDofsBlocked" 1359*8d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlocked(DM dm,PetscInt** dof) 1360*8d8d51c8SVijay Mahadevan { 1361*8d8d51c8SVijay Mahadevan PetscInt i,gid; 1362*8d8d51c8SVijay Mahadevan DM_Moab *dmmoab; 1363*8d8d51c8SVijay Mahadevan PetscSection section; 1364*8d8d51c8SVijay Mahadevan PetscErrorCode ierr; 1365*8d8d51c8SVijay Mahadevan moab::ErrorCode merr; 1366*8d8d51c8SVijay Mahadevan 1367*8d8d51c8SVijay Mahadevan PetscFunctionBegin; 1368*8d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1369*8d8d51c8SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1370*8d8d51c8SVijay Mahadevan 1371*8d8d51c8SVijay Mahadevan *dof = dmmoab->gsindices; 1372*8d8d51c8SVijay Mahadevan 1373*8d8d51c8SVijay Mahadevan if (false) { 1374*8d8d51c8SVijay Mahadevan if (!dof) { 1375*8d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscInt)*(dmmoab->nloc+dmmoab->nghost), dof);CHKERRQ(ierr); 1376*8d8d51c8SVijay Mahadevan } 1377*8d8d51c8SVijay Mahadevan 1378*8d8d51c8SVijay Mahadevan /* first get the local indices */ 1379*8d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vlocal,*dof);MBERRNM(merr); 1380*8d8d51c8SVijay Mahadevan 1381*8d8d51c8SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 1382*8d8d51c8SVijay Mahadevan 1383*8d8d51c8SVijay Mahadevan /* Compute function over the locally owned part of the grid */ 1384*8d8d51c8SVijay Mahadevan for(i=0; i<dmmoab->nloc+dmmoab->nghost; i++) { 1385*8d8d51c8SVijay Mahadevan gid=(*dof)[i]; 1386*8d8d51c8SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, gid, 0, &(*dof)[i]);CHKERRQ(ierr); 1387*8d8d51c8SVijay Mahadevan } 1388*8d8d51c8SVijay Mahadevan } 1389*8d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 1390*8d8d51c8SVijay Mahadevan } 1391*8d8d51c8SVijay Mahadevan 1392*8d8d51c8SVijay Mahadevan 1393*8d8d51c8SVijay Mahadevan #undef __FUNCT__ 1394*8d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexDofsBlockedLocal" 1395*8d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlockedLocal(DM dm,PetscInt** dof) 1396*8d8d51c8SVijay Mahadevan { 1397*8d8d51c8SVijay Mahadevan PetscInt i; 1398*8d8d51c8SVijay Mahadevan DM_Moab *dmmoab; 1399*8d8d51c8SVijay Mahadevan PetscErrorCode ierr; 1400*8d8d51c8SVijay Mahadevan 1401*8d8d51c8SVijay Mahadevan PetscFunctionBegin; 1402*8d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1403*8d8d51c8SVijay Mahadevan PetscValidPointer(dof,2); 1404*8d8d51c8SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1405*8d8d51c8SVijay Mahadevan 1406*8d8d51c8SVijay Mahadevan if (!(*dof)) { 1407*8d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscInt)*(dmmoab->nloc+dmmoab->nghost), dof);CHKERRQ(ierr); 1408*8d8d51c8SVijay Mahadevan } 1409*8d8d51c8SVijay Mahadevan 1410*8d8d51c8SVijay Mahadevan i=0; 1411*8d8d51c8SVijay Mahadevan /* Compute function over the locally owned part of the grid */ 1412*8d8d51c8SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) { 1413*8d8d51c8SVijay Mahadevan (*dof)[i] = (*iter)-1; 1414*8d8d51c8SVijay Mahadevan } 1415*8d8d51c8SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) { 1416*8d8d51c8SVijay Mahadevan (*dof)[i] = (*iter)-1; 1417*8d8d51c8SVijay Mahadevan } 1418*8d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 1419*8d8d51c8SVijay Mahadevan } 1420*8d8d51c8SVijay Mahadevan 1421*8d8d51c8SVijay Mahadevan 1422212ad6d1SVijay Mahadevan #undef __FUNCT__ 1423fc418013SVijay Mahadevan #define __FUNCT__ "DMMoab_GetWriteOptions_Private" 1424fc418013SVijay Mahadevan PetscErrorCode DMMoab_GetWriteOptions_Private(PetscInt fsetid, PetscInt numproc, PetscInt dim, MoabWriteMode mode, PetscInt dbglevel, const char* extra_opts, const char** write_opts) 1425fc418013SVijay Mahadevan { 1426fc418013SVijay Mahadevan std::ostringstream str; 1427fc418013SVijay Mahadevan 1428fc418013SVijay Mahadevan PetscFunctionBegin; 1429fc418013SVijay Mahadevan 1430fc418013SVijay Mahadevan // do parallel read unless only one processor 1431fc418013SVijay Mahadevan if (numproc > 1) { 1432fc418013SVijay Mahadevan str << "PARALLEL=" << mode << ";"; 1433fc418013SVijay Mahadevan if (fsetid>=0) str << "PARALLEL_COMM=" << fsetid << ";"; 1434fc418013SVijay Mahadevan } 1435fc418013SVijay Mahadevan 1436fc418013SVijay Mahadevan if (dbglevel) 1437fc418013SVijay Mahadevan str << "CPUTIME;DEBUG_IO=" << dbglevel << ";"; 1438fc418013SVijay Mahadevan 1439fc418013SVijay Mahadevan if (extra_opts) 1440fc418013SVijay Mahadevan str << extra_opts ; 1441fc418013SVijay Mahadevan 1442fc418013SVijay Mahadevan *write_opts = str.str().c_str(); 1443fc418013SVijay Mahadevan PetscFunctionReturn(0); 1444fc418013SVijay Mahadevan } 1445fc418013SVijay Mahadevan 1446fc418013SVijay Mahadevan 1447fc418013SVijay Mahadevan #undef __FUNCT__ 1448fc418013SVijay Mahadevan #define __FUNCT__ "DMMoabOutput" 1449fc418013SVijay Mahadevan PetscErrorCode DMMoabOutput(DM dm,const char* filename,const char* usrwriteopts) 1450fc418013SVijay Mahadevan { 1451fc418013SVijay Mahadevan DM_Moab *dmmoab; 1452fc418013SVijay Mahadevan PetscInt dbglevel=0; 1453fc418013SVijay Mahadevan const char *writeopts; 1454fc418013SVijay Mahadevan 1455fc418013SVijay Mahadevan PetscErrorCode ierr; 1456fc418013SVijay Mahadevan moab::ErrorCode merr; 1457fc418013SVijay Mahadevan 1458fc418013SVijay Mahadevan PetscFunctionBegin; 1459fc418013SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1460fc418013SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1461fc418013SVijay Mahadevan 1462fc418013SVijay Mahadevan PetscBarrier((PetscObject)dm); 1463fc418013SVijay Mahadevan 1464fc418013SVijay Mahadevan /* TODO: Use command-line options to control by_rank, verbosity, MoabReadMode and extra options */ 1465fc418013SVijay Mahadevan ierr = PetscOptionsBegin(PETSC_COMM_WORLD, "", "Options for reading/writing MOAB based meshes from file", "DMMoab"); 1466fc418013SVijay Mahadevan ierr = PetscOptionsInt("-dmmb_rw_dbg", "The verbosity level for reading and writing MOAB meshes", "dmmbutil.cxx", dbglevel, &dbglevel, NULL);CHKERRQ(ierr); 1467fc418013SVijay Mahadevan ierr = PetscOptionsEnd(); 1468fc418013SVijay Mahadevan 1469fc418013SVijay Mahadevan /* add mesh loading options specific to the DM */ 1470fc418013SVijay Mahadevan ierr = DMMoab_GetWriteOptions_Private(dmmoab->pcomm->get_id(), dmmoab->pcomm->size(), dmmoab->dim, MOAB_PARWOPTS_WRITE_PART, dbglevel, usrwriteopts, &writeopts);CHKERRQ(ierr); 1471fc418013SVijay Mahadevan PetscInfo2(dm, "Writing file %s with options: %s\n",filename,writeopts); 1472fc418013SVijay Mahadevan 1473fc418013SVijay Mahadevan /* output file, using parallel write */ 1474fc418013SVijay Mahadevan merr = dmmoab->mbiface->write_file(filename, NULL, writeopts, &dmmoab->fileset, 1);MBERRVM(dmmoab->mbiface,"Writing output of DMMoab failed.",merr); 1475fc418013SVijay Mahadevan PetscFunctionReturn(0); 1476fc418013SVijay Mahadevan } 1477fc418013SVijay Mahadevan 1478