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; 466e40195eSVijay 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 } 1016e40195eSVijay Mahadevan 1026e40195eSVijay Mahadevan /* find out the local and global minima of GLOBAL_ID */ 1036e40195eSVijay Mahadevan local_min=gsindices[0]; 1046e40195eSVijay Mahadevan for (i=1; i<totsize; ++i) 1056e40195eSVijay Mahadevan if(local_min>gsindices[i]) local_min=gsindices[i]; 1066e40195eSVijay Mahadevan 1076e40195eSVijay Mahadevan ierr = MPI_Allreduce(&local_min, &global_min, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr); 1086e40195eSVijay 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) { 1166e40195eSVijay 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) { 1206e40195eSVijay 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 { 1246e40195eSVijay Mahadevan ierr = PetscSectionSetFieldDof(section, j, i, totsize*i+locgid);CHKERRQ(ierr); 1251cec0304SVijay Mahadevan ierr = PetscSectionSetFieldOffset(section, j, i, totsize); 126*7023aa44SVijay Mahadevan PetscPrintf(PETSC_COMM_SELF, "[%D] Index - %D, Local_GID = %D, FDOF = %D, OFF = %D.\n", dmmoab->pcomm->rank(), j, locgid, totsize*i+locgid, totsize ); 1271cec0304SVijay Mahadevan } 1281cec0304SVijay Mahadevan } 1291cec0304SVijay Mahadevan ierr = PetscSectionSetDof(section, j, dmmoab->nfields);CHKERRQ(ierr); 1301cec0304SVijay Mahadevan } 1311cec0304SVijay Mahadevan ierr = PetscSectionSetUp(section);CHKERRQ(ierr); 1321cec0304SVijay Mahadevan ierr = DMSetDefaultSection(dm, section);CHKERRQ(ierr); 1331cec0304SVijay Mahadevan } 1341cec0304SVijay Mahadevan 1351cec0304SVijay Mahadevan { 136032b8ab6SVijay Mahadevan /* Create Global to Local Vector Scatter Context */ 137032b8ab6SVijay Mahadevan ierr = DMCreateGlobalVector_Moab(dm, &global);CHKERRQ(ierr); 138032b8ab6SVijay Mahadevan ierr = DMCreateLocalVector_Moab(dm, &local);CHKERRQ(ierr); 139032b8ab6SVijay Mahadevan 1406e40195eSVijay Mahadevan for (i=0; i<totsize; ++i) 1416e40195eSVijay Mahadevan gsindices[i]-=global_min; /* zero based index needed for IS */ 1421cec0304SVijay Mahadevan 143032b8ab6SVijay Mahadevan /* global to local must retrieve ghost points */ 1441cec0304SVijay Mahadevan ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&gsindices[0],PETSC_COPY_VALUES,&from);CHKERRQ(ierr); 145032b8ab6SVijay Mahadevan 146db66d124SVijay Mahadevan ierr = VecGetLocalSize(global,&gsiz);CHKERRQ(ierr); 147db66d124SVijay Mahadevan ierr = VecGetLocalSize(local,&lsiz);CHKERRQ(ierr); 148032b8ab6SVijay Mahadevan 149032b8ab6SVijay Mahadevan ierr = VecScatterCreate(local,from,global,from,&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 150032b8ab6SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 151032b8ab6SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 152032b8ab6SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 153032b8ab6SVijay Mahadevan } 154032b8ab6SVijay Mahadevan 1551cec0304SVijay Mahadevan /* skin the boundary and store nodes */ 1561cec0304SVijay Mahadevan { 1571cec0304SVijay Mahadevan // get the skin vertices of those faces and mark them as fixed; we don't want to fix the vertices on a 1581cec0304SVijay Mahadevan // part boundary, but since we exchanged a layer of ghost faces, those vertices aren't on the skin locally 1591cec0304SVijay Mahadevan // ok to mark non-owned skin vertices too, I won't move those anyway 1601cec0304SVijay Mahadevan // use MOAB's skinner class to find the skin 1611cec0304SVijay Mahadevan moab::Skinner skinner(dmmoab->mbiface); 1621cec0304SVijay Mahadevan dmmoab->bndyvtx = new moab::Range(); 1631cec0304SVijay Mahadevan dmmoab->bndyfaces = new moab::Range(); 1641cec0304SVijay Mahadevan merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, true, *dmmoab->bndyvtx);MBERRNM(merr); // 'true' param indicates we want vertices back, not faces 1651cec0304SVijay Mahadevan merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, *dmmoab->bndyfaces);MBERRNM(merr); // 'false' param indicates we want faces back, not vertices 1666e40195eSVijay Mahadevan PetscInfo2(dm, "Found %D boundary vertices and %D faces.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size()); 1671cec0304SVijay Mahadevan } 1681cec0304SVijay Mahadevan 1691cec0304SVijay Mahadevan ierr = PetscFree(gsindices);CHKERRQ(ierr); 170032b8ab6SVijay Mahadevan PetscFunctionReturn(0); 171032b8ab6SVijay Mahadevan } 172032b8ab6SVijay Mahadevan 1731cec0304SVijay Mahadevan 174032b8ab6SVijay Mahadevan #undef __FUNCT__ 175aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab" 176853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 177aa768e4cSTim Tautges { 178aa768e4cSTim Tautges PetscErrorCode ierr; 179aa768e4cSTim Tautges 180aa768e4cSTim Tautges PetscFunctionBegin; 181aa768e4cSTim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 182032b8ab6SVijay Mahadevan ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr); 183032b8ab6SVijay Mahadevan 184032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 185032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 186032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 187032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 188032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 189032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 190032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL; 191032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL; 192032b8ab6SVijay Mahadevan 193032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 194032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 195032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 196032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 197032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 198aa768e4cSTim Tautges 19997ea90e6SJed Brown dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 20097ea90e6SJed Brown dm->ops->createlocalvector = DMCreateLocalVector_Moab; 201032b8ab6SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 202032b8ab6SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 20397ea90e6SJed Brown dm->ops->destroy = DMDestroy_Moab; 204032b8ab6SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 205032b8ab6SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 206032b8ab6SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 207032b8ab6SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 208aa768e4cSTim Tautges PetscFunctionReturn(0); 209aa768e4cSTim Tautges } 210fd349b41STim Tautges 211fd349b41STim Tautges #undef __FUNCT__ 2121d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate" 2131d72bce8STim Tautges /*@ 2141d72bce8STim Tautges DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance 2151d72bce8STim Tautges 2161d72bce8STim Tautges Collective on MPI_Comm 2171d72bce8STim Tautges 2181d72bce8STim Tautges Input Parameter: 2191d72bce8STim Tautges . comm - The communicator for the DMMoab object 2201d72bce8STim Tautges 2211d72bce8STim Tautges Output Parameter: 222032b8ab6SVijay Mahadevan . dmb - The DMMoab object 2231d72bce8STim Tautges 2241d72bce8STim Tautges Level: beginner 2251d72bce8STim Tautges 2261d72bce8STim Tautges .keywords: DMMoab, create 2271d72bce8STim Tautges @*/ 228032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb) 2291d72bce8STim Tautges { 2301d72bce8STim Tautges PetscErrorCode ierr; 2311d72bce8STim Tautges 2321d72bce8STim Tautges PetscFunctionBegin; 233032b8ab6SVijay Mahadevan PetscValidPointer(dmb,2); 234032b8ab6SVijay Mahadevan ierr = DMCreate(comm, dmb);CHKERRQ(ierr); 235032b8ab6SVijay Mahadevan ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr); 2361d72bce8STim Tautges PetscFunctionReturn(0); 2371d72bce8STim Tautges } 2381d72bce8STim Tautges 2391d72bce8STim Tautges #undef __FUNCT__ 240aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab" 2411d72bce8STim Tautges /*@ 242a4d2169cSTim Tautges DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data 2431d72bce8STim Tautges 2441d72bce8STim Tautges Collective on MPI_Comm 2451d72bce8STim Tautges 2461d72bce8STim Tautges Input Parameter: 2471d72bce8STim Tautges . comm - The communicator for the DMMoab object 248032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed 249a4d2169cSTim Tautges along with the DMMoab 250a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator 2511d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag 2521d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned 2531d72bce8STim Tautges 2541d72bce8STim Tautges Output Parameter: 255032b8ab6SVijay Mahadevan . dmb - The DMMoab object 2561d72bce8STim Tautges 257032b8ab6SVijay Mahadevan Level: intermediate 2581d72bce8STim Tautges 2591d72bce8STim Tautges .keywords: DMMoab, create 2601d72bce8STim Tautges @*/ 261032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb) 2621d72bce8STim Tautges { 2631d72bce8STim Tautges PetscErrorCode ierr; 264032b8ab6SVijay Mahadevan moab::ErrorCode merr; 2651cec0304SVijay Mahadevan moab::EntityHandle partnset; 2661cec0304SVijay Mahadevan PetscInt rank, nprocs; 267853cdec3SJed Brown DM_Moab *dmmoab; 2681d72bce8STim Tautges 2691d72bce8STim Tautges PetscFunctionBegin; 270032b8ab6SVijay Mahadevan PetscValidPointer(dmb,6); 271032b8ab6SVijay Mahadevan ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr); 272032b8ab6SVijay Mahadevan dmmoab = (DM_Moab*)(*dmb)->data; 273a4d2169cSTim Tautges 274a4d2169cSTim Tautges if (!mbiface) { 27572ff976dSVijay Mahadevan dmmoab->mbiface = new moab::Core(); 2767d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_TRUE; 2771d72bce8STim Tautges } 2781cec0304SVijay Mahadevan else { 2791cec0304SVijay Mahadevan dmmoab->mbiface = mbiface; 2807d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_FALSE; 2811cec0304SVijay Mahadevan } 2821cec0304SVijay Mahadevan 2831cec0304SVijay Mahadevan /* create a fileset to store the hierarchy of entities belonging to current DM */ 2841cec0304SVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_ORDERED, dmmoab->fileset);MBERR("Creating file set failed", merr); 2857d89fc02STim Tautges 286a4d2169cSTim Tautges if (!pcomm) { 287032b8ab6SVijay Mahadevan ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 288032b8ab6SVijay Mahadevan ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr); 289032b8ab6SVijay Mahadevan 290db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 291db66d124SVijay Mahadevan to the load_file functions to be populated. */ 29272ff976dSVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset); 293032b8ab6SVijay Mahadevan MBERR("Creating partition set failed", merr); 294032b8ab6SVijay Mahadevan 295db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 29672ff976dSVijay Mahadevan dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm); 29772ff976dSVijay Mahadevan } 29872ff976dSVijay Mahadevan else { 29972ff976dSVijay Mahadevan ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr); 300032b8ab6SVijay Mahadevan } 301032b8ab6SVijay Mahadevan 3024973de03SVijay Mahadevan /* do the remaining initializations for DMMoab */ 3034973de03SVijay Mahadevan dmmoab->bs = 1; 3044973de03SVijay Mahadevan 3054973de03SVijay Mahadevan /* set global ID tag handle */ 306032b8ab6SVijay Mahadevan if (!ltog_tag) { 3074973de03SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 308032b8ab6SVijay Mahadevan } 309032b8ab6SVijay Mahadevan else { 310032b8ab6SVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr); 311a4d2169cSTim Tautges } 312a4d2169cSTim Tautges 3134973de03SVijay Mahadevan /* set the local range of entities (vertices) of interest */ 314a4d2169cSTim Tautges if (range) { 3155eb88e9dSVijay Mahadevan ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr); 316a4d2169cSTim Tautges } 3171d72bce8STim Tautges PetscFunctionReturn(0); 3181d72bce8STim Tautges } 3191d72bce8STim Tautges 3201d72bce8STim Tautges #undef __FUNCT__ 3211d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm" 322aa768e4cSTim Tautges /*@ 323aa768e4cSTim Tautges DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab 324aa768e4cSTim Tautges 325aa768e4cSTim Tautges Collective on MPI_Comm 326aa768e4cSTim Tautges 327aa768e4cSTim Tautges Input Parameter: 328aa768e4cSTim Tautges . dm - The DMMoab object being set 329aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab 330aa768e4cSTim Tautges 331aa768e4cSTim Tautges Level: beginner 332aa768e4cSTim Tautges 333aa768e4cSTim Tautges .keywords: DMMoab, create 334aa768e4cSTim Tautges @*/ 3351d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm) 3361d72bce8STim Tautges { 337032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 338032b8ab6SVijay Mahadevan 3391d72bce8STim Tautges PetscFunctionBegin; 3401d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3411cec0304SVijay Mahadevan PetscValidPointer(pcomm,2); 342032b8ab6SVijay Mahadevan dmmoab->pcomm = pcomm; 343032b8ab6SVijay Mahadevan dmmoab->mbiface = pcomm->get_moab(); 344032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 3451d72bce8STim Tautges PetscFunctionReturn(0); 3461d72bce8STim Tautges } 3471d72bce8STim Tautges 3481d72bce8STim Tautges 3491d72bce8STim Tautges #undef __FUNCT__ 3501d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm" 351aa768e4cSTim Tautges /*@ 352aa768e4cSTim Tautges DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab 353aa768e4cSTim Tautges 354aa768e4cSTim Tautges Collective on MPI_Comm 355aa768e4cSTim Tautges 356aa768e4cSTim Tautges Input Parameter: 357aa768e4cSTim Tautges . dm - The DMMoab object being set 358aa768e4cSTim Tautges 359aa768e4cSTim Tautges Output Parameter: 360aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 361aa768e4cSTim Tautges 362aa768e4cSTim Tautges Level: beginner 363aa768e4cSTim Tautges 364aa768e4cSTim Tautges .keywords: DMMoab, create 365aa768e4cSTim Tautges @*/ 3661d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm) 3671d72bce8STim Tautges { 3681d72bce8STim Tautges PetscFunctionBegin; 3691d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 370032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 3711d72bce8STim Tautges PetscFunctionReturn(0); 3721d72bce8STim Tautges } 3731d72bce8STim Tautges 3741d72bce8STim Tautges 3751d72bce8STim Tautges #undef __FUNCT__ 3761d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface" 377aa768e4cSTim Tautges /*@ 378aa768e4cSTim Tautges DMMoabSetInterface - Set the MOAB instance used with this DMMoab 379aa768e4cSTim Tautges 380aa768e4cSTim Tautges Collective on MPI_Comm 381aa768e4cSTim Tautges 382aa768e4cSTim Tautges Input Parameter: 383aa768e4cSTim Tautges . dm - The DMMoab object being set 384aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab 385aa768e4cSTim Tautges 386aa768e4cSTim Tautges Level: beginner 387aa768e4cSTim Tautges 388aa768e4cSTim Tautges .keywords: DMMoab, create 389aa768e4cSTim Tautges @*/ 390a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface) 3911d72bce8STim Tautges { 392032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 393032b8ab6SVijay Mahadevan 3941d72bce8STim Tautges PetscFunctionBegin; 3951d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3961cec0304SVijay Mahadevan PetscValidPointer(mbiface,2); 397032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 398032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 399032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 4001d72bce8STim Tautges PetscFunctionReturn(0); 4011d72bce8STim Tautges } 4021d72bce8STim Tautges 4031d72bce8STim Tautges 4041d72bce8STim Tautges #undef __FUNCT__ 4051d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface" 406aa768e4cSTim Tautges /*@ 407aa768e4cSTim Tautges DMMoabGetInterface - Get the MOAB instance used with this DMMoab 408aa768e4cSTim Tautges 409aa768e4cSTim Tautges Collective on MPI_Comm 410aa768e4cSTim Tautges 411aa768e4cSTim Tautges Input Parameter: 412aa768e4cSTim Tautges . dm - The DMMoab object being set 413aa768e4cSTim Tautges 414aa768e4cSTim Tautges Output Parameter: 415aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab 416aa768e4cSTim Tautges 417aa768e4cSTim Tautges Level: beginner 418aa768e4cSTim Tautges 419aa768e4cSTim Tautges .keywords: DMMoab, create 420aa768e4cSTim Tautges @*/ 421a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface) 4221d72bce8STim Tautges { 4239426e041SSatish Balay PetscErrorCode ierr; 424cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 425cabb514dSBarry Smith 4261d72bce8STim Tautges PetscFunctionBegin; 4271d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 428cabb514dSBarry 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); 429a4d2169cSTim Tautges *mbiface = ((DM_Moab*)dm->data)->mbiface; 4301d72bce8STim Tautges PetscFunctionReturn(0); 4311d72bce8STim Tautges } 4321d72bce8STim Tautges 4331d72bce8STim Tautges 4341d72bce8STim Tautges #undef __FUNCT__ 4355eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices" 436aa768e4cSTim Tautges /*@ 4375eb88e9dSVijay Mahadevan DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab 438aa768e4cSTim Tautges 439aa768e4cSTim Tautges Collective on MPI_Comm 440aa768e4cSTim Tautges 441aa768e4cSTim Tautges Input Parameter: 442aa768e4cSTim Tautges . dm - The DMMoab object being set 443aa768e4cSTim Tautges . range - The entities treated by this DMMoab 444aa768e4cSTim Tautges 445aa768e4cSTim Tautges Level: beginner 446aa768e4cSTim Tautges 447aa768e4cSTim Tautges .keywords: DMMoab, create 448aa768e4cSTim Tautges @*/ 4495eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range) 4501d72bce8STim Tautges { 451032b8ab6SVijay Mahadevan moab::ErrorCode merr; 452032b8ab6SVijay Mahadevan PetscErrorCode ierr; 453032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 454032b8ab6SVijay Mahadevan 4551d72bce8STim Tautges PetscFunctionBegin; 4561d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 457032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 458032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 459032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 460032b8ab6SVijay Mahadevan *dmmoab->vowned = *dmmoab->vlocal; 461032b8ab6SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 462032b8ab6SVijay Mahadevan *dmmoab->vghost = moab::subtract(*range, *dmmoab->vowned); 463032b8ab6SVijay Mahadevan dmmoab->nloc=dmmoab->vowned->size(); 464032b8ab6SVijay Mahadevan dmmoab->nghost=dmmoab->vghost->size(); 465032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 4661d72bce8STim Tautges PetscFunctionReturn(0); 4671d72bce8STim Tautges } 4681d72bce8STim Tautges 4691d72bce8STim Tautges 4701d72bce8STim Tautges #undef __FUNCT__ 4715eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices" 472aa768e4cSTim Tautges /*@ 4735eb88e9dSVijay Mahadevan DMMoabGetLocalVertices - Get the entities having DOFs on 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: 4815eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab 4825eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition 483aa768e4cSTim Tautges 484aa768e4cSTim Tautges Level: beginner 485aa768e4cSTim Tautges 486aa768e4cSTim Tautges .keywords: DMMoab, create 487aa768e4cSTim Tautges @*/ 4881cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,moab::Range *owned,moab::Range *ghost) 4891d72bce8STim Tautges { 4901d72bce8STim Tautges PetscFunctionBegin; 4911d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4921cec0304SVijay Mahadevan if (owned) *owned = *((DM_Moab*)dm->data)->vowned; 4931cec0304SVijay Mahadevan if (ghost) *ghost = *((DM_Moab*)dm->data)->vghost; 4941d72bce8STim Tautges PetscFunctionReturn(0); 4951d72bce8STim Tautges } 4961d72bce8STim Tautges 4971d72bce8STim Tautges #undef __FUNCT__ 4985eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements" 4995eb88e9dSVijay Mahadevan /*@ 5005eb88e9dSVijay Mahadevan DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned 5015eb88e9dSVijay Mahadevan 5025eb88e9dSVijay Mahadevan Collective on MPI_Comm 5035eb88e9dSVijay Mahadevan 5045eb88e9dSVijay Mahadevan Input Parameter: 5055eb88e9dSVijay Mahadevan . dm - The DMMoab object being set 5065eb88e9dSVijay Mahadevan 5075eb88e9dSVijay Mahadevan Output Parameter: 5085eb88e9dSVijay Mahadevan . range - The entities owned locally 5095eb88e9dSVijay Mahadevan 5105eb88e9dSVijay Mahadevan Level: beginner 5115eb88e9dSVijay Mahadevan 5125eb88e9dSVijay Mahadevan .keywords: DMMoab, create 5135eb88e9dSVijay Mahadevan @*/ 5141cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,moab::Range *range) 5155eb88e9dSVijay Mahadevan { 5165eb88e9dSVijay Mahadevan PetscFunctionBegin; 5175eb88e9dSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5181cec0304SVijay Mahadevan if (range) *range = *((DM_Moab*)dm->data)->elocal; 5191cec0304SVijay Mahadevan PetscFunctionReturn(0); 5201cec0304SVijay Mahadevan } 5211cec0304SVijay Mahadevan 5221cec0304SVijay Mahadevan 5231cec0304SVijay Mahadevan #undef __FUNCT__ 5241cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements" 5251cec0304SVijay Mahadevan /*@ 5261cec0304SVijay Mahadevan DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab 5271cec0304SVijay Mahadevan 5281cec0304SVijay Mahadevan Collective on MPI_Comm 5291cec0304SVijay Mahadevan 5301cec0304SVijay Mahadevan Input Parameter: 5311cec0304SVijay Mahadevan . dm - The DMMoab object being set 5321cec0304SVijay Mahadevan . range - The entities treated by this DMMoab 5331cec0304SVijay Mahadevan 5341cec0304SVijay Mahadevan Level: beginner 5351cec0304SVijay Mahadevan 5361cec0304SVijay Mahadevan .keywords: DMMoab, create 5371cec0304SVijay Mahadevan @*/ 5381cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range) 5391cec0304SVijay Mahadevan { 5401cec0304SVijay Mahadevan moab::ErrorCode merr; 5411cec0304SVijay Mahadevan PetscErrorCode ierr; 5421cec0304SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 5431cec0304SVijay Mahadevan 5441cec0304SVijay Mahadevan PetscFunctionBegin; 5451cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5461cec0304SVijay Mahadevan dmmoab->elocal->clear(); 5471cec0304SVijay Mahadevan dmmoab->eghost->clear(); 5481cec0304SVijay Mahadevan dmmoab->elocal->insert(range->begin(), range->end()); 5491cec0304SVijay Mahadevan PetscInfo2(dm, "Range size = %D; elocal size = %D.\n", range->size(), dmmoab->elocal->size()); 5501cec0304SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 5511cec0304SVijay Mahadevan *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal); 5521cec0304SVijay Mahadevan dmmoab->neleloc=dmmoab->elocal->size(); 5531cec0304SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 5541cec0304SVijay Mahadevan PetscInfo2(dm, "Created %D local and %D glocal elements.\n", dmmoab->neleloc, dmmoab->nele); 5555eb88e9dSVijay Mahadevan PetscFunctionReturn(0); 5565eb88e9dSVijay Mahadevan } 5575eb88e9dSVijay Mahadevan 5585eb88e9dSVijay Mahadevan 5595eb88e9dSVijay Mahadevan #undef __FUNCT__ 5601d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag" 561aa768e4cSTim Tautges /*@ 562aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 563aa768e4cSTim Tautges 564aa768e4cSTim Tautges Collective on MPI_Comm 565aa768e4cSTim Tautges 566aa768e4cSTim Tautges Input Parameter: 567aa768e4cSTim Tautges . dm - The DMMoab object being set 568aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 569aa768e4cSTim Tautges 570aa768e4cSTim Tautges Level: beginner 571aa768e4cSTim Tautges 572aa768e4cSTim Tautges .keywords: DMMoab, create 573aa768e4cSTim Tautges @*/ 5741d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag) 5751d72bce8STim Tautges { 5761d72bce8STim Tautges PetscFunctionBegin; 5771d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5781d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 5791d72bce8STim Tautges PetscFunctionReturn(0); 5801d72bce8STim Tautges } 5811d72bce8STim Tautges 5821d72bce8STim Tautges 5831d72bce8STim Tautges #undef __FUNCT__ 5841d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag" 585aa768e4cSTim Tautges /*@ 586aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 587aa768e4cSTim Tautges 588aa768e4cSTim Tautges Collective on MPI_Comm 589aa768e4cSTim Tautges 590aa768e4cSTim Tautges Input Parameter: 591aa768e4cSTim Tautges . dm - The DMMoab object being set 592aa768e4cSTim Tautges 593aa768e4cSTim Tautges Output Parameter: 594aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 595aa768e4cSTim Tautges 596aa768e4cSTim Tautges Level: beginner 597aa768e4cSTim Tautges 598aa768e4cSTim Tautges .keywords: DMMoab, create 599aa768e4cSTim Tautges @*/ 6001d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag) 6011d72bce8STim Tautges { 6021d72bce8STim Tautges PetscFunctionBegin; 6031d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6041d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 6051d72bce8STim Tautges PetscFunctionReturn(0); 6061d72bce8STim Tautges } 6071d72bce8STim Tautges 6081d72bce8STim Tautges 6091d72bce8STim Tautges #undef __FUNCT__ 6101d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize" 611aa768e4cSTim Tautges /*@ 612aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 613aa768e4cSTim Tautges 614aa768e4cSTim Tautges Collective on MPI_Comm 615aa768e4cSTim Tautges 616aa768e4cSTim Tautges Input Parameter: 617aa768e4cSTim Tautges . dm - The DMMoab object being set 618aa768e4cSTim Tautges . bs - The block size used with this DMMoab 619aa768e4cSTim Tautges 620aa768e4cSTim Tautges Level: beginner 621aa768e4cSTim Tautges 622aa768e4cSTim Tautges .keywords: DMMoab, create 623aa768e4cSTim Tautges @*/ 6241d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs) 6251d72bce8STim Tautges { 6261d72bce8STim Tautges PetscFunctionBegin; 6271d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6281d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 6291d72bce8STim Tautges PetscFunctionReturn(0); 6301d72bce8STim Tautges } 6311d72bce8STim Tautges 6321d72bce8STim Tautges 6331d72bce8STim Tautges #undef __FUNCT__ 6341d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize" 635aa768e4cSTim Tautges /*@ 636aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 637aa768e4cSTim Tautges 638aa768e4cSTim Tautges Collective on MPI_Comm 639aa768e4cSTim Tautges 640aa768e4cSTim Tautges Input Parameter: 641aa768e4cSTim Tautges . dm - The DMMoab object being set 642aa768e4cSTim Tautges 643aa768e4cSTim Tautges Output Parameter: 644aa768e4cSTim Tautges . bs - The block size used with this DMMoab 645aa768e4cSTim Tautges 646aa768e4cSTim Tautges Level: beginner 647aa768e4cSTim Tautges 648aa768e4cSTim Tautges .keywords: DMMoab, create 649aa768e4cSTim Tautges @*/ 6501d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs) 6511d72bce8STim Tautges { 6521d72bce8STim Tautges PetscFunctionBegin; 6531d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6541d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 6551d72bce8STim Tautges PetscFunctionReturn(0); 6561d72bce8STim Tautges } 6571d72bce8STim Tautges 6581cec0304SVijay Mahadevan 6591cec0304SVijay Mahadevan #undef __FUNCT__ 6601cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldVector" 6611cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec) 6621cec0304SVijay Mahadevan { 6631cec0304SVijay Mahadevan DM_Moab *dmmoab; 6641cec0304SVijay Mahadevan moab::Tag vtag,ntag; 6651cec0304SVijay Mahadevan PetscScalar *varray; 6661cec0304SVijay Mahadevan moab::ErrorCode merr; 6671cec0304SVijay Mahadevan PetscErrorCode ierr; 6681cec0304SVijay Mahadevan PetscSection section; 6691cec0304SVijay Mahadevan PetscInt doff; 6701cec0304SVijay Mahadevan std::string tag_name; 6711cec0304SVijay Mahadevan moab::Range::iterator iter; 6721cec0304SVijay Mahadevan 6731cec0304SVijay Mahadevan PetscFunctionBegin; 6741cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6751cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6761cec0304SVijay Mahadevan 6771cec0304SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 6781cec0304SVijay Mahadevan 6791cec0304SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 6801cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag, 6811cec0304SVijay Mahadevan moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr); 6821cec0304SVijay Mahadevan 6831cec0304SVijay Mahadevan ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr); 6841cec0304SVijay Mahadevan 6851cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name); 6861cec0304SVijay Mahadevan if (!tag_name.length() && merr !=moab::MB_SUCCESS) { 6871cec0304SVijay Mahadevan ierr = DMMoabVecGetArray(dm,fvec,&varray);CHKERRQ(ierr); 6881cec0304SVijay Mahadevan for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) { 6891cec0304SVijay Mahadevan moab::EntityHandle vtx = (*iter); 6901cec0304SVijay Mahadevan 6911cec0304SVijay Mahadevan /* get field dof index */ 6921cec0304SVijay Mahadevan ierr = PetscSectionGetFieldOffset(section, vtx, ifield, &doff); 6931cec0304SVijay Mahadevan 6941cec0304SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */ 6951cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, &vtx, 1, (const void*)&varray[doff]);MBERRNM(merr); 6961cec0304SVijay Mahadevan } 6971cec0304SVijay Mahadevan ierr = DMMoabVecRestoreArray(dm,fvec,&varray);CHKERRQ(ierr); 6981cec0304SVijay Mahadevan } 6991cec0304SVijay Mahadevan else { 7001cec0304SVijay Mahadevan ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&varray);CHKERRQ(ierr); 7011cec0304SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 7021cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray);MBERRNM(merr); 7031cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)varray);MBERRNM(merr); 7041cec0304SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 7051cec0304SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr); 7061cec0304SVijay Mahadevan ierr = PetscFree(varray);CHKERRQ(ierr); 7071cec0304SVijay Mahadevan } 7081cec0304SVijay Mahadevan PetscFunctionReturn(0); 7091cec0304SVijay Mahadevan } 7101cec0304SVijay Mahadevan 7111cec0304SVijay Mahadevan 7121cec0304SVijay Mahadevan #undef __FUNCT__ 713*7023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates" 714*7023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos) 715*7023aa44SVijay Mahadevan { 716*7023aa44SVijay Mahadevan DM_Moab *dmmoab; 717*7023aa44SVijay Mahadevan PetscErrorCode ierr; 718*7023aa44SVijay Mahadevan moab::ErrorCode merr; 719*7023aa44SVijay Mahadevan 720*7023aa44SVijay Mahadevan PetscFunctionBegin; 721*7023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 722*7023aa44SVijay Mahadevan PetscValidPointer(conn,3); 723*7023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 724*7023aa44SVijay Mahadevan 725*7023aa44SVijay Mahadevan if (!vpos) { 726*7023aa44SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr); 727*7023aa44SVijay Mahadevan } 728*7023aa44SVijay Mahadevan 729*7023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 730*7023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr); 731*7023aa44SVijay Mahadevan PetscFunctionReturn(0); 732*7023aa44SVijay Mahadevan } 733*7023aa44SVijay Mahadevan 734*7023aa44SVijay Mahadevan 735*7023aa44SVijay Mahadevan #undef __FUNCT__ 736*7023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity" 737*7023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn) 738*7023aa44SVijay Mahadevan { 739*7023aa44SVijay Mahadevan DM_Moab *dmmoab; 740*7023aa44SVijay Mahadevan const moab::EntityHandle *connect; 741*7023aa44SVijay Mahadevan moab::ErrorCode merr; 742*7023aa44SVijay Mahadevan PetscInt nnodes; 743*7023aa44SVijay Mahadevan 744*7023aa44SVijay Mahadevan PetscFunctionBegin; 745*7023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 746*7023aa44SVijay Mahadevan PetscValidPointer(conn,4); 747*7023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 748*7023aa44SVijay Mahadevan 749*7023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 750*7023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr); 751*7023aa44SVijay Mahadevan if (conn) *conn=connect; 752*7023aa44SVijay Mahadevan if (nconn) *nconn=nnodes; 753*7023aa44SVijay Mahadevan PetscFunctionReturn(0); 754*7023aa44SVijay Mahadevan } 755*7023aa44SVijay Mahadevan 756*7023aa44SVijay Mahadevan 757*7023aa44SVijay Mahadevan #undef __FUNCT__ 758*7023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices" 759*7023aa44SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx,PetscBool* elem_on_boundary) 760*7023aa44SVijay Mahadevan { 761*7023aa44SVijay Mahadevan DM_Moab *dmmoab; 762*7023aa44SVijay Mahadevan PetscInt i; 763*7023aa44SVijay Mahadevan 764*7023aa44SVijay Mahadevan PetscFunctionBegin; 765*7023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 766*7023aa44SVijay Mahadevan PetscValidPointer(cnt,3); 767*7023aa44SVijay Mahadevan PetscValidPointer(isbdvtx,4); 768*7023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 769*7023aa44SVijay Mahadevan 770*7023aa44SVijay Mahadevan if (elem_on_boundary) *elem_on_boundary = PETSC_FALSE; 771*7023aa44SVijay Mahadevan for (i=0; i < nconn; ++i) { 772*7023aa44SVijay Mahadevan moab::Range::const_iterator giter = dmmoab->bndyvtx->find(cnt[i]); 773*7023aa44SVijay Mahadevan if (giter != dmmoab->bndyvtx->end()) { 774*7023aa44SVijay Mahadevan isbdvtx[i] = PETSC_TRUE; 775*7023aa44SVijay Mahadevan if (elem_on_boundary) *elem_on_boundary = PETSC_TRUE; 776*7023aa44SVijay Mahadevan } 777*7023aa44SVijay Mahadevan else isbdvtx[i] = PETSC_FALSE; 778*7023aa44SVijay Mahadevan } 779*7023aa44SVijay Mahadevan PetscFunctionReturn(0); 780*7023aa44SVijay Mahadevan } 781*7023aa44SVijay Mahadevan 782*7023aa44SVijay Mahadevan 783*7023aa44SVijay Mahadevan #undef __FUNCT__ 7841cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryEntities" 7851cec0304SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryEntities(DM dm,moab::Range *bdvtx,moab::Range* bdfaces) 7861cec0304SVijay Mahadevan { 7871cec0304SVijay Mahadevan DM_Moab *dmmoab; 7881cec0304SVijay Mahadevan 7891cec0304SVijay Mahadevan PetscFunctionBegin; 7901cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7911cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7921cec0304SVijay Mahadevan 7931cec0304SVijay Mahadevan if (bdvtx) *bdvtx = *dmmoab->bndyvtx; 7941cec0304SVijay Mahadevan if (bdfaces) *bdfaces = *dmmoab->bndyfaces; 7951cec0304SVijay Mahadevan PetscFunctionReturn(0); 7961cec0304SVijay Mahadevan } 7971cec0304SVijay Mahadevan 7981cec0304SVijay Mahadevan 7991cec0304SVijay Mahadevan #undef __FUNCT__ 8001cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabOutput" 8011cec0304SVijay Mahadevan PetscErrorCode DMMoabOutput(DM dm,const char* fname,const char* wopts) 8021cec0304SVijay Mahadevan { 8031cec0304SVijay Mahadevan DM_Moab *dmmoab; 8041cec0304SVijay Mahadevan moab::ErrorCode merr; 8051cec0304SVijay Mahadevan 8061cec0304SVijay Mahadevan PetscFunctionBegin; 8071cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8081cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8091cec0304SVijay Mahadevan 8101cec0304SVijay Mahadevan // output file, using parallel write 8111cec0304SVijay Mahadevan merr = dmmoab->mbiface->write_file(fname, NULL, wopts);MBERRVM(dmmoab->mbiface,"Writing output of DMMoab failed.",merr); 8121cec0304SVijay Mahadevan PetscFunctionReturn(0); 8131cec0304SVijay Mahadevan } 8141cec0304SVijay Mahadevan 8151cec0304SVijay Mahadevan 8161cec0304SVijay Mahadevan #undef __FUNCT__ 8171cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFields" 8181cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFields(DM dm,PetscInt nfields,const char** fields) 8191cec0304SVijay Mahadevan { 8201cec0304SVijay Mahadevan DM_Moab *dmmoab; 8211cec0304SVijay Mahadevan 8221cec0304SVijay Mahadevan PetscFunctionBegin; 8231cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8241cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8251cec0304SVijay Mahadevan 8261cec0304SVijay Mahadevan dmmoab->fields = fields; 8271cec0304SVijay Mahadevan dmmoab->nfields = nfields; 8281cec0304SVijay Mahadevan PetscFunctionReturn(0); 8291cec0304SVijay Mahadevan } 8301cec0304SVijay Mahadevan 8311cec0304SVijay Mahadevan 8321cec0304SVijay Mahadevan #undef __FUNCT__ 8331cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDof" 8341cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof) 8351cec0304SVijay Mahadevan { 8361cec0304SVijay Mahadevan PetscSection section; 8371cec0304SVijay Mahadevan PetscErrorCode ierr; 8381cec0304SVijay Mahadevan 8391cec0304SVijay Mahadevan PetscFunctionBegin; 8401cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8411cec0304SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 8421cec0304SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, (PetscInt)point, field, dof);CHKERRQ(ierr); 8431cec0304SVijay Mahadevan PetscFunctionReturn(0); 8441cec0304SVijay Mahadevan } 8451cec0304SVijay Mahadevan 8461cec0304SVijay Mahadevan 8471cec0304SVijay Mahadevan #undef __FUNCT__ 8481cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofs" 8491cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof) 8501cec0304SVijay Mahadevan { 8511cec0304SVijay Mahadevan PetscInt i; 8521cec0304SVijay Mahadevan PetscSection section; 8531cec0304SVijay Mahadevan PetscErrorCode ierr; 8541cec0304SVijay Mahadevan 8551cec0304SVijay Mahadevan PetscFunctionBegin; 8561cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8571cec0304SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 8581cec0304SVijay Mahadevan if (!dof) { 8591cec0304SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr); 8601cec0304SVijay Mahadevan } 8611cec0304SVijay Mahadevan for (i=0; i<npoints; ++i) { 8621cec0304SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, (PetscInt)points[i], field, &dof[i]);CHKERRQ(ierr); 8631cec0304SVijay Mahadevan } 8641cec0304SVijay Mahadevan PetscFunctionReturn(0); 8651cec0304SVijay Mahadevan } 8661cec0304SVijay Mahadevan 8671cec0304SVijay Mahadevan 868