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; 29032b8ab6SVijay Mahadevan ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 30032b8ab6SVijay Mahadevan ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr); 31853cdec3SJed Brown ierr = PetscFree(dm->data);CHKERRQ(ierr); 32853cdec3SJed Brown PetscFunctionReturn(0); 33853cdec3SJed Brown } 34853cdec3SJed Brown 35aa768e4cSTim Tautges #undef __FUNCT__ 36032b8ab6SVijay Mahadevan #define __FUNCT__ "DMSetUp_Moab" 37032b8ab6SVijay Mahadevan PetscErrorCode DMSetUp_Moab(DM dm) 38032b8ab6SVijay Mahadevan { 39032b8ab6SVijay Mahadevan PetscErrorCode ierr; 40032b8ab6SVijay Mahadevan moab::ErrorCode merr; 41032b8ab6SVijay Mahadevan Vec local, global; 42032b8ab6SVijay Mahadevan IS from; 43032b8ab6SVijay Mahadevan moab::Range::iterator iter; 441cec0304SVijay Mahadevan PetscInt i,j,bs,gsiz,lsiz,*gsindices; 45032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 46*6e40195eSVijay Mahadevan PetscInt totsize,local_min,global_min; 471cec0304SVijay Mahadevan PetscSection section; 48032b8ab6SVijay Mahadevan 49032b8ab6SVijay Mahadevan PetscFunctionBegin; 50032b8ab6SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 51032b8ab6SVijay Mahadevan /* Get the local and shared vertices and cache it */ 52032b8ab6SVijay 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."); 53032b8ab6SVijay Mahadevan 54032b8ab6SVijay Mahadevan /* store the current mesh dimension */ 55032b8ab6SVijay Mahadevan merr = dmmoab->mbiface->get_dimension(dmmoab->dim);MBERRNM(merr); 56032b8ab6SVijay Mahadevan 571cec0304SVijay Mahadevan /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */ 58032b8ab6SVijay Mahadevan if (dmmoab->vlocal->empty()) { 591cec0304SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr); 60032b8ab6SVijay Mahadevan *dmmoab->vowned = *dmmoab->vlocal; 61032b8ab6SVijay Mahadevan 62032b8ab6SVijay Mahadevan /* filter based on parallel status */ 63032b8ab6SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 64032b8ab6SVijay Mahadevan *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 65032b8ab6SVijay Mahadevan 66032b8ab6SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 67032b8ab6SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 68032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 69032b8ab6SVijay Mahadevan } 70032b8ab6SVijay Mahadevan 71032b8ab6SVijay Mahadevan /* get the information about the local elements in the mesh */ 72032b8ab6SVijay Mahadevan { 73032b8ab6SVijay Mahadevan dmmoab->elocal->clear(); 74032b8ab6SVijay Mahadevan dmmoab->eghost->clear(); 751cec0304SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, dmmoab->dim, *dmmoab->elocal, true);CHKERRQ(merr); 76032b8ab6SVijay Mahadevan *dmmoab->eghost = *dmmoab->elocal; 77032b8ab6SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 78032b8ab6SVijay Mahadevan *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal); 79032b8ab6SVijay Mahadevan 80032b8ab6SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 81032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 82032b8ab6SVijay Mahadevan } 83032b8ab6SVijay Mahadevan 84032b8ab6SVijay Mahadevan bs = dmmoab->bs; 85032b8ab6SVijay Mahadevan if (!dmmoab->ltog_tag) { 86db66d124SVijay Mahadevan /* Get the global ID tag. The global ID tag is applied to each 87db66d124SVijay Mahadevan vertex. It acts as an global identifier which MOAB uses to 88db66d124SVijay Mahadevan assemble the individual pieces of the mesh */ 89032b8ab6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 90032b8ab6SVijay Mahadevan } 91032b8ab6SVijay Mahadevan 92032b8ab6SVijay Mahadevan totsize=dmmoab->vlocal->size(); 93032b8ab6SVijay Mahadevan ierr = PetscMalloc(totsize*sizeof(PetscInt), &gsindices);CHKERRQ(ierr); 941cec0304SVijay Mahadevan { 95032b8ab6SVijay Mahadevan /* first get the local indices */ 964a40b570SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&gsindices[0]);MBERRNM(merr); 974a40b570SVijay Mahadevan /* next get the ghosted indices */ 981cec0304SVijay Mahadevan if (dmmoab->vghost->size()) { 994a40b570SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&gsindices[dmmoab->nloc]);MBERRNM(merr); 1001cec0304SVijay Mahadevan } 101*6e40195eSVijay Mahadevan 102*6e40195eSVijay Mahadevan /* find out the local and global minima of GLOBAL_ID */ 103*6e40195eSVijay Mahadevan local_min=gsindices[0]; 104*6e40195eSVijay Mahadevan for (i=1; i<totsize; ++i) 105*6e40195eSVijay Mahadevan if(local_min>gsindices[i]) local_min=gsindices[i]; 106*6e40195eSVijay Mahadevan 107*6e40195eSVijay Mahadevan ierr = MPI_Allreduce(&local_min, &global_min, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr); 108*6e40195eSVijay Mahadevan PetscInfo2(dm, "GLOBAL_ID: Local minima - %D, Global minima - %D.\n", local_min, global_min); 1091cec0304SVijay Mahadevan } 110032b8ab6SVijay Mahadevan 1111cec0304SVijay Mahadevan { 1121cec0304SVijay Mahadevan ierr = PetscSectionCreate(((PetscObject)dm)->comm, §ion);CHKERRQ(ierr); 1131cec0304SVijay Mahadevan ierr = PetscSectionSetNumFields(section, dmmoab->nfields);CHKERRQ(ierr); 1141cec0304SVijay Mahadevan ierr = PetscSectionSetChart(section, gsindices[0], gsindices[dmmoab->nloc-1]+1);CHKERRQ(ierr); 1151cec0304SVijay Mahadevan for (j=gsindices[0]; j<=gsindices[dmmoab->nloc-1]; ++j) { 116*6e40195eSVijay Mahadevan PetscInt locgid = j-global_min; 1171cec0304SVijay Mahadevan for (i=0; i < dmmoab->nfields; ++i) { 1181cec0304SVijay Mahadevan ierr = PetscSectionSetFieldName(section, i, dmmoab->fields[i]);CHKERRQ(ierr); 1191cec0304SVijay Mahadevan if (bs>1) { 120*6e40195eSVijay Mahadevan ierr = PetscSectionSetFieldDof(section, j, i, locgid*dmmoab->nfields+i);CHKERRQ(ierr); 1211cec0304SVijay Mahadevan ierr = PetscSectionSetFieldOffset(section, j, i, dmmoab->nfields); 1221cec0304SVijay Mahadevan } 1231cec0304SVijay Mahadevan else { 124*6e40195eSVijay Mahadevan ierr = PetscSectionSetFieldDof(section, j, i, totsize*i+locgid);CHKERRQ(ierr); 1251cec0304SVijay Mahadevan ierr = PetscSectionSetFieldOffset(section, j, i, totsize); 1261cec0304SVijay Mahadevan } 1271cec0304SVijay Mahadevan } 1281cec0304SVijay Mahadevan ierr = PetscSectionSetDof(section, j, dmmoab->nfields);CHKERRQ(ierr); 1291cec0304SVijay Mahadevan } 1301cec0304SVijay Mahadevan ierr = PetscSectionSetUp(section);CHKERRQ(ierr); 1311cec0304SVijay Mahadevan ierr = DMSetDefaultSection(dm, section);CHKERRQ(ierr); 1321cec0304SVijay Mahadevan } 1331cec0304SVijay Mahadevan 1341cec0304SVijay Mahadevan { 135032b8ab6SVijay Mahadevan /* Create Global to Local Vector Scatter Context */ 136032b8ab6SVijay Mahadevan ierr = DMCreateGlobalVector_Moab(dm, &global);CHKERRQ(ierr); 137032b8ab6SVijay Mahadevan ierr = DMCreateLocalVector_Moab(dm, &local);CHKERRQ(ierr); 138032b8ab6SVijay Mahadevan 139*6e40195eSVijay Mahadevan for (i=0; i<totsize; ++i) 140*6e40195eSVijay Mahadevan gsindices[i]-=global_min; /* zero based index needed for IS */ 1411cec0304SVijay Mahadevan 142032b8ab6SVijay Mahadevan /* global to local must retrieve ghost points */ 1431cec0304SVijay Mahadevan ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&gsindices[0],PETSC_COPY_VALUES,&from);CHKERRQ(ierr); 144032b8ab6SVijay Mahadevan 145db66d124SVijay Mahadevan ierr = VecGetLocalSize(global,&gsiz);CHKERRQ(ierr); 146db66d124SVijay Mahadevan ierr = VecGetLocalSize(local,&lsiz);CHKERRQ(ierr); 147032b8ab6SVijay Mahadevan 148032b8ab6SVijay Mahadevan ierr = VecScatterCreate(local,from,global,from,&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 149032b8ab6SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 150032b8ab6SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 151032b8ab6SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 152032b8ab6SVijay Mahadevan } 153032b8ab6SVijay Mahadevan 1541cec0304SVijay Mahadevan /* skin the boundary and store nodes */ 1551cec0304SVijay Mahadevan { 1561cec0304SVijay Mahadevan // get the skin vertices of those faces and mark them as fixed; we don't want to fix the vertices on a 1571cec0304SVijay Mahadevan // part boundary, but since we exchanged a layer of ghost faces, those vertices aren't on the skin locally 1581cec0304SVijay Mahadevan // ok to mark non-owned skin vertices too, I won't move those anyway 1591cec0304SVijay Mahadevan // use MOAB's skinner class to find the skin 1601cec0304SVijay Mahadevan moab::Skinner skinner(dmmoab->mbiface); 1611cec0304SVijay Mahadevan dmmoab->bndyvtx = new moab::Range(); 1621cec0304SVijay Mahadevan dmmoab->bndyfaces = new moab::Range(); 1631cec0304SVijay Mahadevan merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, true, *dmmoab->bndyvtx);MBERRNM(merr); // 'true' param indicates we want vertices back, not faces 1641cec0304SVijay Mahadevan merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, *dmmoab->bndyfaces);MBERRNM(merr); // 'false' param indicates we want faces back, not vertices 165*6e40195eSVijay Mahadevan PetscInfo2(dm, "Found %D boundary vertices and %D faces.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size()); 1661cec0304SVijay Mahadevan } 1671cec0304SVijay Mahadevan 1681cec0304SVijay Mahadevan ierr = PetscFree(gsindices);CHKERRQ(ierr); 169032b8ab6SVijay Mahadevan PetscFunctionReturn(0); 170032b8ab6SVijay Mahadevan } 171032b8ab6SVijay Mahadevan 1721cec0304SVijay Mahadevan 173032b8ab6SVijay Mahadevan #undef __FUNCT__ 174aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab" 175853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 176aa768e4cSTim Tautges { 177aa768e4cSTim Tautges PetscErrorCode ierr; 178aa768e4cSTim Tautges 179aa768e4cSTim Tautges PetscFunctionBegin; 180aa768e4cSTim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 181032b8ab6SVijay Mahadevan ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr); 182032b8ab6SVijay Mahadevan 183032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 184032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 185032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 186032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 187032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 188032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 189032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL; 190032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL; 191032b8ab6SVijay Mahadevan 192032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 193032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 194032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 195032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 196032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 197aa768e4cSTim Tautges 19897ea90e6SJed Brown dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 19997ea90e6SJed Brown dm->ops->createlocalvector = DMCreateLocalVector_Moab; 200032b8ab6SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 201032b8ab6SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 20297ea90e6SJed Brown dm->ops->destroy = DMDestroy_Moab; 203032b8ab6SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 204032b8ab6SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 205032b8ab6SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 206032b8ab6SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 207aa768e4cSTim Tautges PetscFunctionReturn(0); 208aa768e4cSTim Tautges } 209fd349b41STim Tautges 210fd349b41STim Tautges #undef __FUNCT__ 2111d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate" 2121d72bce8STim Tautges /*@ 2131d72bce8STim Tautges DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance 2141d72bce8STim Tautges 2151d72bce8STim Tautges Collective on MPI_Comm 2161d72bce8STim Tautges 2171d72bce8STim Tautges Input Parameter: 2181d72bce8STim Tautges . comm - The communicator for the DMMoab object 2191d72bce8STim Tautges 2201d72bce8STim Tautges Output Parameter: 221032b8ab6SVijay Mahadevan . dmb - The DMMoab object 2221d72bce8STim Tautges 2231d72bce8STim Tautges Level: beginner 2241d72bce8STim Tautges 2251d72bce8STim Tautges .keywords: DMMoab, create 2261d72bce8STim Tautges @*/ 227032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb) 2281d72bce8STim Tautges { 2291d72bce8STim Tautges PetscErrorCode ierr; 2301d72bce8STim Tautges 2311d72bce8STim Tautges PetscFunctionBegin; 232032b8ab6SVijay Mahadevan PetscValidPointer(dmb,2); 233032b8ab6SVijay Mahadevan ierr = DMCreate(comm, dmb);CHKERRQ(ierr); 234032b8ab6SVijay Mahadevan ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr); 2351d72bce8STim Tautges PetscFunctionReturn(0); 2361d72bce8STim Tautges } 2371d72bce8STim Tautges 2381d72bce8STim Tautges #undef __FUNCT__ 239aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab" 2401d72bce8STim Tautges /*@ 241a4d2169cSTim Tautges DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data 2421d72bce8STim Tautges 2431d72bce8STim Tautges Collective on MPI_Comm 2441d72bce8STim Tautges 2451d72bce8STim Tautges Input Parameter: 2461d72bce8STim Tautges . comm - The communicator for the DMMoab object 247032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed 248a4d2169cSTim Tautges along with the DMMoab 249a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator 2501d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag 2511d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned 2521d72bce8STim Tautges 2531d72bce8STim Tautges Output Parameter: 254032b8ab6SVijay Mahadevan . dmb - The DMMoab object 2551d72bce8STim Tautges 256032b8ab6SVijay Mahadevan Level: intermediate 2571d72bce8STim Tautges 2581d72bce8STim Tautges .keywords: DMMoab, create 2591d72bce8STim Tautges @*/ 260032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb) 2611d72bce8STim Tautges { 2621d72bce8STim Tautges PetscErrorCode ierr; 263032b8ab6SVijay Mahadevan moab::ErrorCode merr; 2641cec0304SVijay Mahadevan moab::EntityHandle partnset; 2651cec0304SVijay Mahadevan PetscInt rank, nprocs; 266853cdec3SJed Brown DM_Moab *dmmoab; 2671d72bce8STim Tautges 2681d72bce8STim Tautges PetscFunctionBegin; 269032b8ab6SVijay Mahadevan PetscValidPointer(dmb,6); 270032b8ab6SVijay Mahadevan ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr); 271032b8ab6SVijay Mahadevan dmmoab = (DM_Moab*)(*dmb)->data; 272a4d2169cSTim Tautges 273a4d2169cSTim Tautges if (!mbiface) { 27472ff976dSVijay Mahadevan dmmoab->mbiface = new moab::Core(); 2757d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_TRUE; 2761d72bce8STim Tautges } 2771cec0304SVijay Mahadevan else { 2781cec0304SVijay Mahadevan dmmoab->mbiface = mbiface; 2797d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_FALSE; 2801cec0304SVijay Mahadevan } 2811cec0304SVijay Mahadevan 2821cec0304SVijay Mahadevan /* create a fileset to store the hierarchy of entities belonging to current DM */ 2831cec0304SVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_ORDERED, dmmoab->fileset);MBERR("Creating file set failed", merr); 2847d89fc02STim Tautges 285a4d2169cSTim Tautges if (!pcomm) { 286032b8ab6SVijay Mahadevan ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 287032b8ab6SVijay Mahadevan ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr); 288032b8ab6SVijay Mahadevan 289db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 290db66d124SVijay Mahadevan to the load_file functions to be populated. */ 29172ff976dSVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset); 292032b8ab6SVijay Mahadevan MBERR("Creating partition set failed", merr); 293032b8ab6SVijay Mahadevan 294db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 29572ff976dSVijay Mahadevan dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm); 29672ff976dSVijay Mahadevan } 29772ff976dSVijay Mahadevan else { 29872ff976dSVijay Mahadevan ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr); 299032b8ab6SVijay Mahadevan } 300032b8ab6SVijay Mahadevan 3014973de03SVijay Mahadevan /* do the remaining initializations for DMMoab */ 3024973de03SVijay Mahadevan dmmoab->bs = 1; 3034973de03SVijay Mahadevan 3044973de03SVijay Mahadevan /* set global ID tag handle */ 305032b8ab6SVijay Mahadevan if (!ltog_tag) { 3064973de03SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 307032b8ab6SVijay Mahadevan } 308032b8ab6SVijay Mahadevan else { 309032b8ab6SVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr); 310a4d2169cSTim Tautges } 311a4d2169cSTim Tautges 3124973de03SVijay Mahadevan /* set the local range of entities (vertices) of interest */ 313a4d2169cSTim Tautges if (range) { 3145eb88e9dSVijay Mahadevan ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr); 315a4d2169cSTim Tautges } 3161d72bce8STim Tautges PetscFunctionReturn(0); 3171d72bce8STim Tautges } 3181d72bce8STim Tautges 3191d72bce8STim Tautges #undef __FUNCT__ 3201d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm" 321aa768e4cSTim Tautges /*@ 322aa768e4cSTim Tautges DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab 323aa768e4cSTim Tautges 324aa768e4cSTim Tautges Collective on MPI_Comm 325aa768e4cSTim Tautges 326aa768e4cSTim Tautges Input Parameter: 327aa768e4cSTim Tautges . dm - The DMMoab object being set 328aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab 329aa768e4cSTim Tautges 330aa768e4cSTim Tautges Level: beginner 331aa768e4cSTim Tautges 332aa768e4cSTim Tautges .keywords: DMMoab, create 333aa768e4cSTim Tautges @*/ 3341d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm) 3351d72bce8STim Tautges { 336032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 337032b8ab6SVijay Mahadevan 3381d72bce8STim Tautges PetscFunctionBegin; 3391d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3401cec0304SVijay Mahadevan PetscValidPointer(pcomm,2); 341032b8ab6SVijay Mahadevan dmmoab->pcomm = pcomm; 342032b8ab6SVijay Mahadevan dmmoab->mbiface = pcomm->get_moab(); 343032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 3441d72bce8STim Tautges PetscFunctionReturn(0); 3451d72bce8STim Tautges } 3461d72bce8STim Tautges 3471d72bce8STim Tautges 3481d72bce8STim Tautges #undef __FUNCT__ 3491d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm" 350aa768e4cSTim Tautges /*@ 351aa768e4cSTim Tautges DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab 352aa768e4cSTim Tautges 353aa768e4cSTim Tautges Collective on MPI_Comm 354aa768e4cSTim Tautges 355aa768e4cSTim Tautges Input Parameter: 356aa768e4cSTim Tautges . dm - The DMMoab object being set 357aa768e4cSTim Tautges 358aa768e4cSTim Tautges Output Parameter: 359aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 360aa768e4cSTim Tautges 361aa768e4cSTim Tautges Level: beginner 362aa768e4cSTim Tautges 363aa768e4cSTim Tautges .keywords: DMMoab, create 364aa768e4cSTim Tautges @*/ 3651d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm) 3661d72bce8STim Tautges { 3671d72bce8STim Tautges PetscFunctionBegin; 3681d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 369032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 3701d72bce8STim Tautges PetscFunctionReturn(0); 3711d72bce8STim Tautges } 3721d72bce8STim Tautges 3731d72bce8STim Tautges 3741d72bce8STim Tautges #undef __FUNCT__ 3751d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface" 376aa768e4cSTim Tautges /*@ 377aa768e4cSTim Tautges DMMoabSetInterface - Set the MOAB instance used with this DMMoab 378aa768e4cSTim Tautges 379aa768e4cSTim Tautges Collective on MPI_Comm 380aa768e4cSTim Tautges 381aa768e4cSTim Tautges Input Parameter: 382aa768e4cSTim Tautges . dm - The DMMoab object being set 383aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab 384aa768e4cSTim Tautges 385aa768e4cSTim Tautges Level: beginner 386aa768e4cSTim Tautges 387aa768e4cSTim Tautges .keywords: DMMoab, create 388aa768e4cSTim Tautges @*/ 389a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface) 3901d72bce8STim Tautges { 391032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 392032b8ab6SVijay Mahadevan 3931d72bce8STim Tautges PetscFunctionBegin; 3941d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3951cec0304SVijay Mahadevan PetscValidPointer(mbiface,2); 396032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 397032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 398032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 3991d72bce8STim Tautges PetscFunctionReturn(0); 4001d72bce8STim Tautges } 4011d72bce8STim Tautges 4021d72bce8STim Tautges 4031d72bce8STim Tautges #undef __FUNCT__ 4041d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface" 405aa768e4cSTim Tautges /*@ 406aa768e4cSTim Tautges DMMoabGetInterface - Get the MOAB instance used with this DMMoab 407aa768e4cSTim Tautges 408aa768e4cSTim Tautges Collective on MPI_Comm 409aa768e4cSTim Tautges 410aa768e4cSTim Tautges Input Parameter: 411aa768e4cSTim Tautges . dm - The DMMoab object being set 412aa768e4cSTim Tautges 413aa768e4cSTim Tautges Output Parameter: 414aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab 415aa768e4cSTim Tautges 416aa768e4cSTim Tautges Level: beginner 417aa768e4cSTim Tautges 418aa768e4cSTim Tautges .keywords: DMMoab, create 419aa768e4cSTim Tautges @*/ 420a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface) 4211d72bce8STim Tautges { 4229426e041SSatish Balay PetscErrorCode ierr; 423cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 424cabb514dSBarry Smith 4251d72bce8STim Tautges PetscFunctionBegin; 4261d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 427cabb514dSBarry 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); 428a4d2169cSTim Tautges *mbiface = ((DM_Moab*)dm->data)->mbiface; 4291d72bce8STim Tautges PetscFunctionReturn(0); 4301d72bce8STim Tautges } 4311d72bce8STim Tautges 4321d72bce8STim Tautges 4331d72bce8STim Tautges #undef __FUNCT__ 4345eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices" 435aa768e4cSTim Tautges /*@ 4365eb88e9dSVijay Mahadevan DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab 437aa768e4cSTim Tautges 438aa768e4cSTim Tautges Collective on MPI_Comm 439aa768e4cSTim Tautges 440aa768e4cSTim Tautges Input Parameter: 441aa768e4cSTim Tautges . dm - The DMMoab object being set 442aa768e4cSTim Tautges . range - The entities treated by this DMMoab 443aa768e4cSTim Tautges 444aa768e4cSTim Tautges Level: beginner 445aa768e4cSTim Tautges 446aa768e4cSTim Tautges .keywords: DMMoab, create 447aa768e4cSTim Tautges @*/ 4485eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range) 4491d72bce8STim Tautges { 450032b8ab6SVijay Mahadevan moab::ErrorCode merr; 451032b8ab6SVijay Mahadevan PetscErrorCode ierr; 452032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 453032b8ab6SVijay Mahadevan 4541d72bce8STim Tautges PetscFunctionBegin; 4551d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 456032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 457032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 458032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 459032b8ab6SVijay Mahadevan *dmmoab->vowned = *dmmoab->vlocal; 460032b8ab6SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 461032b8ab6SVijay Mahadevan *dmmoab->vghost = moab::subtract(*range, *dmmoab->vowned); 462032b8ab6SVijay Mahadevan dmmoab->nloc=dmmoab->vowned->size(); 463032b8ab6SVijay Mahadevan dmmoab->nghost=dmmoab->vghost->size(); 464032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 4651d72bce8STim Tautges PetscFunctionReturn(0); 4661d72bce8STim Tautges } 4671d72bce8STim Tautges 4681d72bce8STim Tautges 4691d72bce8STim Tautges #undef __FUNCT__ 4705eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices" 471aa768e4cSTim Tautges /*@ 4725eb88e9dSVijay Mahadevan DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab 473aa768e4cSTim Tautges 474aa768e4cSTim Tautges Collective on MPI_Comm 475aa768e4cSTim Tautges 476aa768e4cSTim Tautges Input Parameter: 477aa768e4cSTim Tautges . dm - The DMMoab object being set 478aa768e4cSTim Tautges 479aa768e4cSTim Tautges Output Parameter: 4805eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab 4815eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition 482aa768e4cSTim Tautges 483aa768e4cSTim Tautges Level: beginner 484aa768e4cSTim Tautges 485aa768e4cSTim Tautges .keywords: DMMoab, create 486aa768e4cSTim Tautges @*/ 4871cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,moab::Range *owned,moab::Range *ghost) 4881d72bce8STim Tautges { 4891d72bce8STim Tautges PetscFunctionBegin; 4901d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4911cec0304SVijay Mahadevan if (owned) *owned = *((DM_Moab*)dm->data)->vowned; 4921cec0304SVijay Mahadevan if (ghost) *ghost = *((DM_Moab*)dm->data)->vghost; 4931d72bce8STim Tautges PetscFunctionReturn(0); 4941d72bce8STim Tautges } 4951d72bce8STim Tautges 4961d72bce8STim Tautges #undef __FUNCT__ 4975eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements" 4985eb88e9dSVijay Mahadevan /*@ 4995eb88e9dSVijay Mahadevan DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned 5005eb88e9dSVijay Mahadevan 5015eb88e9dSVijay Mahadevan Collective on MPI_Comm 5025eb88e9dSVijay Mahadevan 5035eb88e9dSVijay Mahadevan Input Parameter: 5045eb88e9dSVijay Mahadevan . dm - The DMMoab object being set 5055eb88e9dSVijay Mahadevan 5065eb88e9dSVijay Mahadevan Output Parameter: 5075eb88e9dSVijay Mahadevan . range - The entities owned locally 5085eb88e9dSVijay Mahadevan 5095eb88e9dSVijay Mahadevan Level: beginner 5105eb88e9dSVijay Mahadevan 5115eb88e9dSVijay Mahadevan .keywords: DMMoab, create 5125eb88e9dSVijay Mahadevan @*/ 5131cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,moab::Range *range) 5145eb88e9dSVijay Mahadevan { 5155eb88e9dSVijay Mahadevan PetscFunctionBegin; 5165eb88e9dSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5171cec0304SVijay Mahadevan if (range) *range = *((DM_Moab*)dm->data)->elocal; 5181cec0304SVijay Mahadevan PetscFunctionReturn(0); 5191cec0304SVijay Mahadevan } 5201cec0304SVijay Mahadevan 5211cec0304SVijay Mahadevan 5221cec0304SVijay Mahadevan #undef __FUNCT__ 5231cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements" 5241cec0304SVijay Mahadevan /*@ 5251cec0304SVijay Mahadevan DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab 5261cec0304SVijay Mahadevan 5271cec0304SVijay Mahadevan Collective on MPI_Comm 5281cec0304SVijay Mahadevan 5291cec0304SVijay Mahadevan Input Parameter: 5301cec0304SVijay Mahadevan . dm - The DMMoab object being set 5311cec0304SVijay Mahadevan . range - The entities treated by this DMMoab 5321cec0304SVijay Mahadevan 5331cec0304SVijay Mahadevan Level: beginner 5341cec0304SVijay Mahadevan 5351cec0304SVijay Mahadevan .keywords: DMMoab, create 5361cec0304SVijay Mahadevan @*/ 5371cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range) 5381cec0304SVijay Mahadevan { 5391cec0304SVijay Mahadevan moab::ErrorCode merr; 5401cec0304SVijay Mahadevan PetscErrorCode ierr; 5411cec0304SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 5421cec0304SVijay Mahadevan 5431cec0304SVijay Mahadevan PetscFunctionBegin; 5441cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5451cec0304SVijay Mahadevan dmmoab->elocal->clear(); 5461cec0304SVijay Mahadevan dmmoab->eghost->clear(); 5471cec0304SVijay Mahadevan dmmoab->elocal->insert(range->begin(), range->end()); 5481cec0304SVijay Mahadevan PetscInfo2(dm, "Range size = %D; elocal size = %D.\n", range->size(), dmmoab->elocal->size()); 5491cec0304SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 5501cec0304SVijay Mahadevan *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal); 5511cec0304SVijay Mahadevan dmmoab->neleloc=dmmoab->elocal->size(); 5521cec0304SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 5531cec0304SVijay Mahadevan PetscInfo2(dm, "Created %D local and %D glocal elements.\n", dmmoab->neleloc, dmmoab->nele); 5545eb88e9dSVijay Mahadevan PetscFunctionReturn(0); 5555eb88e9dSVijay Mahadevan } 5565eb88e9dSVijay Mahadevan 5575eb88e9dSVijay Mahadevan 5585eb88e9dSVijay Mahadevan #undef __FUNCT__ 5591d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag" 560aa768e4cSTim Tautges /*@ 561aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 562aa768e4cSTim Tautges 563aa768e4cSTim Tautges Collective on MPI_Comm 564aa768e4cSTim Tautges 565aa768e4cSTim Tautges Input Parameter: 566aa768e4cSTim Tautges . dm - The DMMoab object being set 567aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 568aa768e4cSTim Tautges 569aa768e4cSTim Tautges Level: beginner 570aa768e4cSTim Tautges 571aa768e4cSTim Tautges .keywords: DMMoab, create 572aa768e4cSTim Tautges @*/ 5731d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag) 5741d72bce8STim Tautges { 5751d72bce8STim Tautges PetscFunctionBegin; 5761d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5771d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 5781d72bce8STim Tautges PetscFunctionReturn(0); 5791d72bce8STim Tautges } 5801d72bce8STim Tautges 5811d72bce8STim Tautges 5821d72bce8STim Tautges #undef __FUNCT__ 5831d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag" 584aa768e4cSTim Tautges /*@ 585aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 586aa768e4cSTim Tautges 587aa768e4cSTim Tautges Collective on MPI_Comm 588aa768e4cSTim Tautges 589aa768e4cSTim Tautges Input Parameter: 590aa768e4cSTim Tautges . dm - The DMMoab object being set 591aa768e4cSTim Tautges 592aa768e4cSTim Tautges Output Parameter: 593aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 594aa768e4cSTim Tautges 595aa768e4cSTim Tautges Level: beginner 596aa768e4cSTim Tautges 597aa768e4cSTim Tautges .keywords: DMMoab, create 598aa768e4cSTim Tautges @*/ 5991d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag) 6001d72bce8STim Tautges { 6011d72bce8STim Tautges PetscFunctionBegin; 6021d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6031d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 6041d72bce8STim Tautges PetscFunctionReturn(0); 6051d72bce8STim Tautges } 6061d72bce8STim Tautges 6071d72bce8STim Tautges 6081d72bce8STim Tautges #undef __FUNCT__ 6091d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize" 610aa768e4cSTim Tautges /*@ 611aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 612aa768e4cSTim Tautges 613aa768e4cSTim Tautges Collective on MPI_Comm 614aa768e4cSTim Tautges 615aa768e4cSTim Tautges Input Parameter: 616aa768e4cSTim Tautges . dm - The DMMoab object being set 617aa768e4cSTim Tautges . bs - The block size used with this DMMoab 618aa768e4cSTim Tautges 619aa768e4cSTim Tautges Level: beginner 620aa768e4cSTim Tautges 621aa768e4cSTim Tautges .keywords: DMMoab, create 622aa768e4cSTim Tautges @*/ 6231d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs) 6241d72bce8STim Tautges { 6251d72bce8STim Tautges PetscFunctionBegin; 6261d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6271d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 6281d72bce8STim Tautges PetscFunctionReturn(0); 6291d72bce8STim Tautges } 6301d72bce8STim Tautges 6311d72bce8STim Tautges 6321d72bce8STim Tautges #undef __FUNCT__ 6331d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize" 634aa768e4cSTim Tautges /*@ 635aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 636aa768e4cSTim Tautges 637aa768e4cSTim Tautges Collective on MPI_Comm 638aa768e4cSTim Tautges 639aa768e4cSTim Tautges Input Parameter: 640aa768e4cSTim Tautges . dm - The DMMoab object being set 641aa768e4cSTim Tautges 642aa768e4cSTim Tautges Output Parameter: 643aa768e4cSTim Tautges . bs - The block size used with this DMMoab 644aa768e4cSTim Tautges 645aa768e4cSTim Tautges Level: beginner 646aa768e4cSTim Tautges 647aa768e4cSTim Tautges .keywords: DMMoab, create 648aa768e4cSTim Tautges @*/ 6491d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs) 6501d72bce8STim Tautges { 6511d72bce8STim Tautges PetscFunctionBegin; 6521d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6531d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 6541d72bce8STim Tautges PetscFunctionReturn(0); 6551d72bce8STim Tautges } 6561d72bce8STim Tautges 6571cec0304SVijay Mahadevan 6581cec0304SVijay Mahadevan #undef __FUNCT__ 6591cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldVector" 6601cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec) 6611cec0304SVijay Mahadevan { 6621cec0304SVijay Mahadevan DM_Moab *dmmoab; 6631cec0304SVijay Mahadevan moab::Tag vtag,ntag; 6641cec0304SVijay Mahadevan PetscScalar *varray; 6651cec0304SVijay Mahadevan moab::ErrorCode merr; 6661cec0304SVijay Mahadevan PetscErrorCode ierr; 6671cec0304SVijay Mahadevan PetscSection section; 6681cec0304SVijay Mahadevan PetscInt doff; 6691cec0304SVijay Mahadevan std::string tag_name; 6701cec0304SVijay Mahadevan moab::Range::iterator iter; 6711cec0304SVijay Mahadevan 6721cec0304SVijay Mahadevan PetscFunctionBegin; 6731cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6741cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6751cec0304SVijay Mahadevan 6761cec0304SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 6771cec0304SVijay Mahadevan 6781cec0304SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 6791cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag, 6801cec0304SVijay Mahadevan moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr); 6811cec0304SVijay Mahadevan 6821cec0304SVijay Mahadevan ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr); 6831cec0304SVijay Mahadevan 6841cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name); 6851cec0304SVijay Mahadevan if (!tag_name.length() && merr !=moab::MB_SUCCESS) { 6861cec0304SVijay Mahadevan ierr = DMMoabVecGetArray(dm,fvec,&varray);CHKERRQ(ierr); 6871cec0304SVijay Mahadevan for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) { 6881cec0304SVijay Mahadevan moab::EntityHandle vtx = (*iter); 6891cec0304SVijay Mahadevan 6901cec0304SVijay Mahadevan /* get field dof index */ 6911cec0304SVijay Mahadevan ierr = PetscSectionGetFieldOffset(section, vtx, ifield, &doff); 6921cec0304SVijay Mahadevan 6931cec0304SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */ 6941cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, &vtx, 1, (const void*)&varray[doff]);MBERRNM(merr); 6951cec0304SVijay Mahadevan } 6961cec0304SVijay Mahadevan ierr = DMMoabVecRestoreArray(dm,fvec,&varray);CHKERRQ(ierr); 6971cec0304SVijay Mahadevan } 6981cec0304SVijay Mahadevan else { 6991cec0304SVijay Mahadevan ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&varray);CHKERRQ(ierr); 7001cec0304SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 7011cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray);MBERRNM(merr); 7021cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)varray);MBERRNM(merr); 7031cec0304SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 7041cec0304SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr); 7051cec0304SVijay Mahadevan ierr = PetscFree(varray);CHKERRQ(ierr); 7061cec0304SVijay Mahadevan } 7071cec0304SVijay Mahadevan PetscFunctionReturn(0); 7081cec0304SVijay Mahadevan } 7091cec0304SVijay Mahadevan 7101cec0304SVijay Mahadevan 7111cec0304SVijay Mahadevan #undef __FUNCT__ 7121cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryEntities" 7131cec0304SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryEntities(DM dm,moab::Range *bdvtx,moab::Range* bdfaces) 7141cec0304SVijay Mahadevan { 7151cec0304SVijay Mahadevan DM_Moab *dmmoab; 7161cec0304SVijay Mahadevan 7171cec0304SVijay Mahadevan PetscFunctionBegin; 7181cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7191cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7201cec0304SVijay Mahadevan 7211cec0304SVijay Mahadevan if (bdvtx) *bdvtx = *dmmoab->bndyvtx; 7221cec0304SVijay Mahadevan if (bdfaces) *bdfaces = *dmmoab->bndyfaces; 7231cec0304SVijay Mahadevan PetscFunctionReturn(0); 7241cec0304SVijay Mahadevan } 7251cec0304SVijay Mahadevan 7261cec0304SVijay Mahadevan 7271cec0304SVijay Mahadevan #undef __FUNCT__ 7281cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabOutput" 7291cec0304SVijay Mahadevan PetscErrorCode DMMoabOutput(DM dm,const char* fname,const char* wopts) 7301cec0304SVijay Mahadevan { 7311cec0304SVijay Mahadevan DM_Moab *dmmoab; 7321cec0304SVijay Mahadevan moab::ErrorCode merr; 7331cec0304SVijay Mahadevan 7341cec0304SVijay Mahadevan PetscFunctionBegin; 7351cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7361cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7371cec0304SVijay Mahadevan 7381cec0304SVijay Mahadevan // output file, using parallel write 7391cec0304SVijay Mahadevan merr = dmmoab->mbiface->write_file(fname, NULL, wopts);MBERRVM(dmmoab->mbiface,"Writing output of DMMoab failed.",merr); 7401cec0304SVijay Mahadevan PetscFunctionReturn(0); 7411cec0304SVijay Mahadevan } 7421cec0304SVijay Mahadevan 7431cec0304SVijay Mahadevan 7441cec0304SVijay Mahadevan #undef __FUNCT__ 7451cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFields" 7461cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFields(DM dm,PetscInt nfields,const char** fields) 7471cec0304SVijay Mahadevan { 7481cec0304SVijay Mahadevan DM_Moab *dmmoab; 7491cec0304SVijay Mahadevan 7501cec0304SVijay Mahadevan PetscFunctionBegin; 7511cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7521cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7531cec0304SVijay Mahadevan 7541cec0304SVijay Mahadevan dmmoab->fields = fields; 7551cec0304SVijay Mahadevan dmmoab->nfields = nfields; 7561cec0304SVijay Mahadevan PetscFunctionReturn(0); 7571cec0304SVijay Mahadevan } 7581cec0304SVijay Mahadevan 7591cec0304SVijay Mahadevan 7601cec0304SVijay Mahadevan #undef __FUNCT__ 7611cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDof" 7621cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof) 7631cec0304SVijay Mahadevan { 7641cec0304SVijay Mahadevan PetscSection section; 7651cec0304SVijay Mahadevan PetscErrorCode ierr; 7661cec0304SVijay Mahadevan 7671cec0304SVijay Mahadevan PetscFunctionBegin; 7681cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7691cec0304SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 7701cec0304SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, (PetscInt)point, field, dof);CHKERRQ(ierr); 7711cec0304SVijay Mahadevan PetscFunctionReturn(0); 7721cec0304SVijay Mahadevan } 7731cec0304SVijay Mahadevan 7741cec0304SVijay Mahadevan 7751cec0304SVijay Mahadevan #undef __FUNCT__ 7761cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofs" 7771cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof) 7781cec0304SVijay Mahadevan { 7791cec0304SVijay Mahadevan PetscInt i; 7801cec0304SVijay Mahadevan PetscSection section; 7811cec0304SVijay Mahadevan PetscErrorCode ierr; 7821cec0304SVijay Mahadevan 7831cec0304SVijay Mahadevan PetscFunctionBegin; 7841cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7851cec0304SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 7861cec0304SVijay Mahadevan if (!dof) { 7871cec0304SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr); 7881cec0304SVijay Mahadevan } 7891cec0304SVijay Mahadevan for (i=0; i<npoints; ++i) { 7901cec0304SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, (PetscInt)points[i], field, &dof[i]);CHKERRQ(ierr); 7911cec0304SVijay Mahadevan } 7921cec0304SVijay Mahadevan PetscFunctionReturn(0); 7931cec0304SVijay Mahadevan } 7941cec0304SVijay Mahadevan 7951cec0304SVijay Mahadevan 796