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> 6*1cec0304SVijay 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; 27*1cec0304SVijay Mahadevan delete dmmoab->bndyvtx; 28*1cec0304SVijay 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; 44*1cec0304SVijay Mahadevan PetscInt i,j,bs,gsiz,lsiz,*gsindices; 45032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 4672ff976dSVijay Mahadevan PetscInt totsize; 47*1cec0304SVijay 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 57*1cec0304SVijay 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()) { 59*1cec0304SVijay 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(); 75*1cec0304SVijay 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); 94*1cec0304SVijay 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 */ 98*1cec0304SVijay Mahadevan if (dmmoab->vghost->size()) { 994a40b570SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&gsindices[dmmoab->nloc]);MBERRNM(merr); 100*1cec0304SVijay Mahadevan } 101*1cec0304SVijay Mahadevan } 102032b8ab6SVijay Mahadevan 103*1cec0304SVijay Mahadevan { 104*1cec0304SVijay Mahadevan ierr = PetscSectionCreate(((PetscObject)dm)->comm, §ion);CHKERRQ(ierr); 105*1cec0304SVijay Mahadevan ierr = PetscSectionSetNumFields(section, dmmoab->nfields);CHKERRQ(ierr); 106*1cec0304SVijay Mahadevan ierr = PetscSectionSetChart(section, gsindices[0], gsindices[dmmoab->nloc-1]+1);CHKERRQ(ierr); 107*1cec0304SVijay Mahadevan for (j=gsindices[0]; j<=gsindices[dmmoab->nloc-1]; ++j) { 108*1cec0304SVijay Mahadevan for (i=0; i < dmmoab->nfields; ++i) { 109*1cec0304SVijay Mahadevan ierr = PetscSectionSetFieldName(section, i, dmmoab->fields[i]);CHKERRQ(ierr); 110*1cec0304SVijay Mahadevan if (bs>1) { 111*1cec0304SVijay Mahadevan ierr = PetscSectionSetFieldDof(section, j, i, j*dmmoab->nfields+i-1);CHKERRQ(ierr); 112*1cec0304SVijay Mahadevan ierr = PetscSectionSetFieldOffset(section, j, i, dmmoab->nfields); 113*1cec0304SVijay Mahadevan // PetscPrintf(PETSC_COMM_WORLD, "Point %D, Field %D, DOF %D, OFFSET = %D\n", j, i, j*dmmoab->nfields+i, dmmoab->nfields); 114*1cec0304SVijay Mahadevan } 115*1cec0304SVijay Mahadevan else { 116*1cec0304SVijay Mahadevan ierr = PetscSectionSetFieldDof(section, j, i, totsize*i+j-1);CHKERRQ(ierr); 117*1cec0304SVijay Mahadevan ierr = PetscSectionSetFieldOffset(section, j, i, totsize); 118*1cec0304SVijay Mahadevan // PetscPrintf(PETSC_COMM_WORLD, "Point %D, Field %D, DOF %D, OFFSET = %D\n", j, i, totsize*i+j, totsize); 119*1cec0304SVijay Mahadevan } 120*1cec0304SVijay Mahadevan } 121*1cec0304SVijay Mahadevan ierr = PetscSectionSetDof(section, j, dmmoab->nfields);CHKERRQ(ierr); 122*1cec0304SVijay Mahadevan } 123*1cec0304SVijay Mahadevan ierr = PetscSectionSetUp(section);CHKERRQ(ierr); 124*1cec0304SVijay Mahadevan ierr = DMSetDefaultSection(dm, section);CHKERRQ(ierr); 125*1cec0304SVijay Mahadevan } 126*1cec0304SVijay Mahadevan 127*1cec0304SVijay Mahadevan { 128032b8ab6SVijay Mahadevan /* Create Global to Local Vector Scatter Context */ 129032b8ab6SVijay Mahadevan ierr = DMCreateGlobalVector_Moab(dm, &global);CHKERRQ(ierr); 130032b8ab6SVijay Mahadevan ierr = DMCreateLocalVector_Moab(dm, &local);CHKERRQ(ierr); 131032b8ab6SVijay Mahadevan 132*1cec0304SVijay Mahadevan for (i=0; i<totsize; ++i) { 133*1cec0304SVijay Mahadevan gsindices[i]--; /* zero based index needed for IS */ 134*1cec0304SVijay Mahadevan } 135*1cec0304SVijay Mahadevan 136032b8ab6SVijay Mahadevan /* global to local must retrieve ghost points */ 137*1cec0304SVijay Mahadevan ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&gsindices[0],PETSC_COPY_VALUES,&from);CHKERRQ(ierr); 138032b8ab6SVijay Mahadevan 139db66d124SVijay Mahadevan ierr = VecGetLocalSize(global,&gsiz);CHKERRQ(ierr); 140db66d124SVijay Mahadevan ierr = VecGetLocalSize(local,&lsiz);CHKERRQ(ierr); 141032b8ab6SVijay Mahadevan 142032b8ab6SVijay Mahadevan ierr = VecScatterCreate(local,from,global,from,&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 143032b8ab6SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 144032b8ab6SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 145032b8ab6SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 146032b8ab6SVijay Mahadevan } 147032b8ab6SVijay Mahadevan 148*1cec0304SVijay Mahadevan /* skin the boundary and store nodes */ 149*1cec0304SVijay Mahadevan { 150*1cec0304SVijay Mahadevan // get the skin vertices of those faces and mark them as fixed; we don't want to fix the vertices on a 151*1cec0304SVijay Mahadevan // part boundary, but since we exchanged a layer of ghost faces, those vertices aren't on the skin locally 152*1cec0304SVijay Mahadevan // ok to mark non-owned skin vertices too, I won't move those anyway 153*1cec0304SVijay Mahadevan // use MOAB's skinner class to find the skin 154*1cec0304SVijay Mahadevan moab::Skinner skinner(dmmoab->mbiface); 155*1cec0304SVijay Mahadevan dmmoab->bndyvtx = new moab::Range(); 156*1cec0304SVijay Mahadevan dmmoab->bndyfaces = new moab::Range(); 157*1cec0304SVijay Mahadevan merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, true, *dmmoab->bndyvtx);MBERRNM(merr); // 'true' param indicates we want vertices back, not faces 158*1cec0304SVijay Mahadevan merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, *dmmoab->bndyfaces);MBERRNM(merr); // 'false' param indicates we want faces back, not vertices 159*1cec0304SVijay Mahadevan PetscPrintf(PETSC_COMM_WORLD, "\nFound %D boundary vertices and %D faces.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size()); 160*1cec0304SVijay Mahadevan } 161*1cec0304SVijay Mahadevan 162*1cec0304SVijay Mahadevan ierr = PetscFree(gsindices);CHKERRQ(ierr); 163032b8ab6SVijay Mahadevan PetscFunctionReturn(0); 164032b8ab6SVijay Mahadevan } 165032b8ab6SVijay Mahadevan 166*1cec0304SVijay Mahadevan 167032b8ab6SVijay Mahadevan #undef __FUNCT__ 168aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab" 169853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 170aa768e4cSTim Tautges { 171aa768e4cSTim Tautges PetscErrorCode ierr; 172aa768e4cSTim Tautges 173aa768e4cSTim Tautges PetscFunctionBegin; 174aa768e4cSTim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 175032b8ab6SVijay Mahadevan ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr); 176032b8ab6SVijay Mahadevan 177032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 178032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 179032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 180032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 181032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 182032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 183032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL; 184032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL; 185032b8ab6SVijay Mahadevan 186032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 187032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 188032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 189032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 190032b8ab6SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 191aa768e4cSTim Tautges 19297ea90e6SJed Brown dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 19397ea90e6SJed Brown dm->ops->createlocalvector = DMCreateLocalVector_Moab; 194032b8ab6SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 195032b8ab6SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 19697ea90e6SJed Brown dm->ops->destroy = DMDestroy_Moab; 197032b8ab6SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 198032b8ab6SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 199032b8ab6SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 200032b8ab6SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 201aa768e4cSTim Tautges PetscFunctionReturn(0); 202aa768e4cSTim Tautges } 203fd349b41STim Tautges 204fd349b41STim Tautges #undef __FUNCT__ 2051d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate" 2061d72bce8STim Tautges /*@ 2071d72bce8STim Tautges DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance 2081d72bce8STim Tautges 2091d72bce8STim Tautges Collective on MPI_Comm 2101d72bce8STim Tautges 2111d72bce8STim Tautges Input Parameter: 2121d72bce8STim Tautges . comm - The communicator for the DMMoab object 2131d72bce8STim Tautges 2141d72bce8STim Tautges Output Parameter: 215032b8ab6SVijay Mahadevan . dmb - The DMMoab object 2161d72bce8STim Tautges 2171d72bce8STim Tautges Level: beginner 2181d72bce8STim Tautges 2191d72bce8STim Tautges .keywords: DMMoab, create 2201d72bce8STim Tautges @*/ 221032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb) 2221d72bce8STim Tautges { 2231d72bce8STim Tautges PetscErrorCode ierr; 2241d72bce8STim Tautges 2251d72bce8STim Tautges PetscFunctionBegin; 226032b8ab6SVijay Mahadevan PetscValidPointer(dmb,2); 227032b8ab6SVijay Mahadevan ierr = DMCreate(comm, dmb);CHKERRQ(ierr); 228032b8ab6SVijay Mahadevan ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr); 2291d72bce8STim Tautges PetscFunctionReturn(0); 2301d72bce8STim Tautges } 2311d72bce8STim Tautges 2321d72bce8STim Tautges #undef __FUNCT__ 233aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab" 2341d72bce8STim Tautges /*@ 235a4d2169cSTim Tautges DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data 2361d72bce8STim Tautges 2371d72bce8STim Tautges Collective on MPI_Comm 2381d72bce8STim Tautges 2391d72bce8STim Tautges Input Parameter: 2401d72bce8STim Tautges . comm - The communicator for the DMMoab object 241032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed 242a4d2169cSTim Tautges along with the DMMoab 243a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator 2441d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag 2451d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned 2461d72bce8STim Tautges 2471d72bce8STim Tautges Output Parameter: 248032b8ab6SVijay Mahadevan . dmb - The DMMoab object 2491d72bce8STim Tautges 250032b8ab6SVijay Mahadevan Level: intermediate 2511d72bce8STim Tautges 2521d72bce8STim Tautges .keywords: DMMoab, create 2531d72bce8STim Tautges @*/ 254032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb) 2551d72bce8STim Tautges { 2561d72bce8STim Tautges PetscErrorCode ierr; 257032b8ab6SVijay Mahadevan moab::ErrorCode merr; 258*1cec0304SVijay Mahadevan moab::EntityHandle partnset; 259*1cec0304SVijay Mahadevan PetscInt rank, nprocs; 260853cdec3SJed Brown DM_Moab *dmmoab; 2611d72bce8STim Tautges 2621d72bce8STim Tautges PetscFunctionBegin; 263032b8ab6SVijay Mahadevan PetscValidPointer(dmb,6); 264032b8ab6SVijay Mahadevan ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr); 265032b8ab6SVijay Mahadevan dmmoab = (DM_Moab*)(*dmb)->data; 266a4d2169cSTim Tautges 267a4d2169cSTim Tautges if (!mbiface) { 26872ff976dSVijay Mahadevan dmmoab->mbiface = new moab::Core(); 2697d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_TRUE; 2701d72bce8STim Tautges } 271*1cec0304SVijay Mahadevan else { 272*1cec0304SVijay Mahadevan dmmoab->mbiface = mbiface; 2737d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_FALSE; 274*1cec0304SVijay Mahadevan } 275*1cec0304SVijay Mahadevan 276*1cec0304SVijay Mahadevan /* create a fileset to store the hierarchy of entities belonging to current DM */ 277*1cec0304SVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_ORDERED, dmmoab->fileset);MBERR("Creating file set failed", merr); 2787d89fc02STim Tautges 279a4d2169cSTim Tautges if (!pcomm) { 280032b8ab6SVijay Mahadevan ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 281032b8ab6SVijay Mahadevan ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr); 282032b8ab6SVijay Mahadevan 283db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 284db66d124SVijay Mahadevan to the load_file functions to be populated. */ 28572ff976dSVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset); 286032b8ab6SVijay Mahadevan MBERR("Creating partition set failed", merr); 287032b8ab6SVijay Mahadevan 288db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 28972ff976dSVijay Mahadevan dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm); 29072ff976dSVijay Mahadevan } 29172ff976dSVijay Mahadevan else { 29272ff976dSVijay Mahadevan ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr); 293032b8ab6SVijay Mahadevan } 294032b8ab6SVijay Mahadevan 2954973de03SVijay Mahadevan /* do the remaining initializations for DMMoab */ 2964973de03SVijay Mahadevan dmmoab->bs = 1; 2974973de03SVijay Mahadevan 2984973de03SVijay Mahadevan /* set global ID tag handle */ 299032b8ab6SVijay Mahadevan if (!ltog_tag) { 3004973de03SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 301032b8ab6SVijay Mahadevan } 302032b8ab6SVijay Mahadevan else { 303032b8ab6SVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr); 304a4d2169cSTim Tautges } 305a4d2169cSTim Tautges 3064973de03SVijay Mahadevan /* set the local range of entities (vertices) of interest */ 307a4d2169cSTim Tautges if (range) { 3085eb88e9dSVijay Mahadevan ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr); 309a4d2169cSTim Tautges } 3101d72bce8STim Tautges PetscFunctionReturn(0); 3111d72bce8STim Tautges } 3121d72bce8STim Tautges 3131d72bce8STim Tautges #undef __FUNCT__ 3141d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm" 315aa768e4cSTim Tautges /*@ 316aa768e4cSTim Tautges DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab 317aa768e4cSTim Tautges 318aa768e4cSTim Tautges Collective on MPI_Comm 319aa768e4cSTim Tautges 320aa768e4cSTim Tautges Input Parameter: 321aa768e4cSTim Tautges . dm - The DMMoab object being set 322aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab 323aa768e4cSTim Tautges 324aa768e4cSTim Tautges Level: beginner 325aa768e4cSTim Tautges 326aa768e4cSTim Tautges .keywords: DMMoab, create 327aa768e4cSTim Tautges @*/ 3281d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm) 3291d72bce8STim Tautges { 330032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 331032b8ab6SVijay Mahadevan 3321d72bce8STim Tautges PetscFunctionBegin; 3331d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 334*1cec0304SVijay Mahadevan PetscValidPointer(pcomm,2); 335032b8ab6SVijay Mahadevan dmmoab->pcomm = pcomm; 336032b8ab6SVijay Mahadevan dmmoab->mbiface = pcomm->get_moab(); 337032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 3381d72bce8STim Tautges PetscFunctionReturn(0); 3391d72bce8STim Tautges } 3401d72bce8STim Tautges 3411d72bce8STim Tautges 3421d72bce8STim Tautges #undef __FUNCT__ 3431d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm" 344aa768e4cSTim Tautges /*@ 345aa768e4cSTim Tautges DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab 346aa768e4cSTim Tautges 347aa768e4cSTim Tautges Collective on MPI_Comm 348aa768e4cSTim Tautges 349aa768e4cSTim Tautges Input Parameter: 350aa768e4cSTim Tautges . dm - The DMMoab object being set 351aa768e4cSTim Tautges 352aa768e4cSTim Tautges Output Parameter: 353aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 354aa768e4cSTim Tautges 355aa768e4cSTim Tautges Level: beginner 356aa768e4cSTim Tautges 357aa768e4cSTim Tautges .keywords: DMMoab, create 358aa768e4cSTim Tautges @*/ 3591d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm) 3601d72bce8STim Tautges { 3611d72bce8STim Tautges PetscFunctionBegin; 3621d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 363032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 3641d72bce8STim Tautges PetscFunctionReturn(0); 3651d72bce8STim Tautges } 3661d72bce8STim Tautges 3671d72bce8STim Tautges 3681d72bce8STim Tautges #undef __FUNCT__ 3691d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface" 370aa768e4cSTim Tautges /*@ 371aa768e4cSTim Tautges DMMoabSetInterface - Set the MOAB instance used with this DMMoab 372aa768e4cSTim Tautges 373aa768e4cSTim Tautges Collective on MPI_Comm 374aa768e4cSTim Tautges 375aa768e4cSTim Tautges Input Parameter: 376aa768e4cSTim Tautges . dm - The DMMoab object being set 377aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab 378aa768e4cSTim Tautges 379aa768e4cSTim Tautges Level: beginner 380aa768e4cSTim Tautges 381aa768e4cSTim Tautges .keywords: DMMoab, create 382aa768e4cSTim Tautges @*/ 383a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface) 3841d72bce8STim Tautges { 385032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 386032b8ab6SVijay Mahadevan 3871d72bce8STim Tautges PetscFunctionBegin; 3881d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 389*1cec0304SVijay Mahadevan PetscValidPointer(mbiface,2); 390032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 391032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 392032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 3931d72bce8STim Tautges PetscFunctionReturn(0); 3941d72bce8STim Tautges } 3951d72bce8STim Tautges 3961d72bce8STim Tautges 3971d72bce8STim Tautges #undef __FUNCT__ 3981d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface" 399aa768e4cSTim Tautges /*@ 400aa768e4cSTim Tautges DMMoabGetInterface - Get the MOAB instance used with this DMMoab 401aa768e4cSTim Tautges 402aa768e4cSTim Tautges Collective on MPI_Comm 403aa768e4cSTim Tautges 404aa768e4cSTim Tautges Input Parameter: 405aa768e4cSTim Tautges . dm - The DMMoab object being set 406aa768e4cSTim Tautges 407aa768e4cSTim Tautges Output Parameter: 408aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab 409aa768e4cSTim Tautges 410aa768e4cSTim Tautges Level: beginner 411aa768e4cSTim Tautges 412aa768e4cSTim Tautges .keywords: DMMoab, create 413aa768e4cSTim Tautges @*/ 414a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface) 4151d72bce8STim Tautges { 4169426e041SSatish Balay PetscErrorCode ierr; 417cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 418cabb514dSBarry Smith 4191d72bce8STim Tautges PetscFunctionBegin; 4201d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 421cabb514dSBarry 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); 422a4d2169cSTim Tautges *mbiface = ((DM_Moab*)dm->data)->mbiface; 4231d72bce8STim Tautges PetscFunctionReturn(0); 4241d72bce8STim Tautges } 4251d72bce8STim Tautges 4261d72bce8STim Tautges 4271d72bce8STim Tautges #undef __FUNCT__ 4285eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices" 429aa768e4cSTim Tautges /*@ 4305eb88e9dSVijay Mahadevan DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab 431aa768e4cSTim Tautges 432aa768e4cSTim Tautges Collective on MPI_Comm 433aa768e4cSTim Tautges 434aa768e4cSTim Tautges Input Parameter: 435aa768e4cSTim Tautges . dm - The DMMoab object being set 436aa768e4cSTim Tautges . range - The entities treated by this DMMoab 437aa768e4cSTim Tautges 438aa768e4cSTim Tautges Level: beginner 439aa768e4cSTim Tautges 440aa768e4cSTim Tautges .keywords: DMMoab, create 441aa768e4cSTim Tautges @*/ 4425eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range) 4431d72bce8STim Tautges { 444032b8ab6SVijay Mahadevan moab::ErrorCode merr; 445032b8ab6SVijay Mahadevan PetscErrorCode ierr; 446032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 447032b8ab6SVijay Mahadevan 4481d72bce8STim Tautges PetscFunctionBegin; 4491d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 450032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 451032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 452032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 453032b8ab6SVijay Mahadevan *dmmoab->vowned = *dmmoab->vlocal; 454032b8ab6SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 455032b8ab6SVijay Mahadevan *dmmoab->vghost = moab::subtract(*range, *dmmoab->vowned); 456032b8ab6SVijay Mahadevan dmmoab->nloc=dmmoab->vowned->size(); 457032b8ab6SVijay Mahadevan dmmoab->nghost=dmmoab->vghost->size(); 458032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 4591d72bce8STim Tautges PetscFunctionReturn(0); 4601d72bce8STim Tautges } 4611d72bce8STim Tautges 4621d72bce8STim Tautges 4631d72bce8STim Tautges #undef __FUNCT__ 4645eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices" 465aa768e4cSTim Tautges /*@ 4665eb88e9dSVijay Mahadevan DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab 467aa768e4cSTim Tautges 468aa768e4cSTim Tautges Collective on MPI_Comm 469aa768e4cSTim Tautges 470aa768e4cSTim Tautges Input Parameter: 471aa768e4cSTim Tautges . dm - The DMMoab object being set 472aa768e4cSTim Tautges 473aa768e4cSTim Tautges Output Parameter: 4745eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab 4755eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition 476aa768e4cSTim Tautges 477aa768e4cSTim Tautges Level: beginner 478aa768e4cSTim Tautges 479aa768e4cSTim Tautges .keywords: DMMoab, create 480aa768e4cSTim Tautges @*/ 481*1cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,moab::Range *owned,moab::Range *ghost) 4821d72bce8STim Tautges { 4831d72bce8STim Tautges PetscFunctionBegin; 4841d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 485*1cec0304SVijay Mahadevan if (owned) *owned = *((DM_Moab*)dm->data)->vowned; 486*1cec0304SVijay Mahadevan if (ghost) *ghost = *((DM_Moab*)dm->data)->vghost; 4871d72bce8STim Tautges PetscFunctionReturn(0); 4881d72bce8STim Tautges } 4891d72bce8STim Tautges 4901d72bce8STim Tautges #undef __FUNCT__ 4915eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements" 4925eb88e9dSVijay Mahadevan /*@ 4935eb88e9dSVijay Mahadevan DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned 4945eb88e9dSVijay Mahadevan 4955eb88e9dSVijay Mahadevan Collective on MPI_Comm 4965eb88e9dSVijay Mahadevan 4975eb88e9dSVijay Mahadevan Input Parameter: 4985eb88e9dSVijay Mahadevan . dm - The DMMoab object being set 4995eb88e9dSVijay Mahadevan 5005eb88e9dSVijay Mahadevan Output Parameter: 5015eb88e9dSVijay Mahadevan . range - The entities owned locally 5025eb88e9dSVijay Mahadevan 5035eb88e9dSVijay Mahadevan Level: beginner 5045eb88e9dSVijay Mahadevan 5055eb88e9dSVijay Mahadevan .keywords: DMMoab, create 5065eb88e9dSVijay Mahadevan @*/ 507*1cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,moab::Range *range) 5085eb88e9dSVijay Mahadevan { 5095eb88e9dSVijay Mahadevan PetscFunctionBegin; 5105eb88e9dSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 511*1cec0304SVijay Mahadevan if (range) *range = *((DM_Moab*)dm->data)->elocal; 512*1cec0304SVijay Mahadevan PetscFunctionReturn(0); 513*1cec0304SVijay Mahadevan } 514*1cec0304SVijay Mahadevan 515*1cec0304SVijay Mahadevan 516*1cec0304SVijay Mahadevan #undef __FUNCT__ 517*1cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements" 518*1cec0304SVijay Mahadevan /*@ 519*1cec0304SVijay Mahadevan DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab 520*1cec0304SVijay Mahadevan 521*1cec0304SVijay Mahadevan Collective on MPI_Comm 522*1cec0304SVijay Mahadevan 523*1cec0304SVijay Mahadevan Input Parameter: 524*1cec0304SVijay Mahadevan . dm - The DMMoab object being set 525*1cec0304SVijay Mahadevan . range - The entities treated by this DMMoab 526*1cec0304SVijay Mahadevan 527*1cec0304SVijay Mahadevan Level: beginner 528*1cec0304SVijay Mahadevan 529*1cec0304SVijay Mahadevan .keywords: DMMoab, create 530*1cec0304SVijay Mahadevan @*/ 531*1cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range) 532*1cec0304SVijay Mahadevan { 533*1cec0304SVijay Mahadevan moab::ErrorCode merr; 534*1cec0304SVijay Mahadevan PetscErrorCode ierr; 535*1cec0304SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 536*1cec0304SVijay Mahadevan 537*1cec0304SVijay Mahadevan PetscFunctionBegin; 538*1cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 539*1cec0304SVijay Mahadevan dmmoab->elocal->clear(); 540*1cec0304SVijay Mahadevan dmmoab->eghost->clear(); 541*1cec0304SVijay Mahadevan dmmoab->elocal->insert(range->begin(), range->end()); 542*1cec0304SVijay Mahadevan PetscInfo2(dm, "Range size = %D; elocal size = %D.\n", range->size(), dmmoab->elocal->size()); 543*1cec0304SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 544*1cec0304SVijay Mahadevan *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal); 545*1cec0304SVijay Mahadevan dmmoab->neleloc=dmmoab->elocal->size(); 546*1cec0304SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 547*1cec0304SVijay Mahadevan PetscInfo2(dm, "Created %D local and %D glocal elements.\n", dmmoab->neleloc, dmmoab->nele); 5485eb88e9dSVijay Mahadevan PetscFunctionReturn(0); 5495eb88e9dSVijay Mahadevan } 5505eb88e9dSVijay Mahadevan 5515eb88e9dSVijay Mahadevan 5525eb88e9dSVijay Mahadevan #undef __FUNCT__ 5531d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag" 554aa768e4cSTim Tautges /*@ 555aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 556aa768e4cSTim Tautges 557aa768e4cSTim Tautges Collective on MPI_Comm 558aa768e4cSTim Tautges 559aa768e4cSTim Tautges Input Parameter: 560aa768e4cSTim Tautges . dm - The DMMoab object being set 561aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 562aa768e4cSTim Tautges 563aa768e4cSTim Tautges Level: beginner 564aa768e4cSTim Tautges 565aa768e4cSTim Tautges .keywords: DMMoab, create 566aa768e4cSTim Tautges @*/ 5671d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag) 5681d72bce8STim Tautges { 5691d72bce8STim Tautges PetscFunctionBegin; 5701d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5711d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 5721d72bce8STim Tautges PetscFunctionReturn(0); 5731d72bce8STim Tautges } 5741d72bce8STim Tautges 5751d72bce8STim Tautges 5761d72bce8STim Tautges #undef __FUNCT__ 5771d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag" 578aa768e4cSTim Tautges /*@ 579aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 580aa768e4cSTim Tautges 581aa768e4cSTim Tautges Collective on MPI_Comm 582aa768e4cSTim Tautges 583aa768e4cSTim Tautges Input Parameter: 584aa768e4cSTim Tautges . dm - The DMMoab object being set 585aa768e4cSTim Tautges 586aa768e4cSTim Tautges Output Parameter: 587aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 588aa768e4cSTim Tautges 589aa768e4cSTim Tautges Level: beginner 590aa768e4cSTim Tautges 591aa768e4cSTim Tautges .keywords: DMMoab, create 592aa768e4cSTim Tautges @*/ 5931d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag) 5941d72bce8STim Tautges { 5951d72bce8STim Tautges PetscFunctionBegin; 5961d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5971d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 5981d72bce8STim Tautges PetscFunctionReturn(0); 5991d72bce8STim Tautges } 6001d72bce8STim Tautges 6011d72bce8STim Tautges 6021d72bce8STim Tautges #undef __FUNCT__ 6031d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize" 604aa768e4cSTim Tautges /*@ 605aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 606aa768e4cSTim Tautges 607aa768e4cSTim Tautges Collective on MPI_Comm 608aa768e4cSTim Tautges 609aa768e4cSTim Tautges Input Parameter: 610aa768e4cSTim Tautges . dm - The DMMoab object being set 611aa768e4cSTim Tautges . bs - The block size used with this DMMoab 612aa768e4cSTim Tautges 613aa768e4cSTim Tautges Level: beginner 614aa768e4cSTim Tautges 615aa768e4cSTim Tautges .keywords: DMMoab, create 616aa768e4cSTim Tautges @*/ 6171d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs) 6181d72bce8STim Tautges { 6191d72bce8STim Tautges PetscFunctionBegin; 6201d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6211d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 6221d72bce8STim Tautges PetscFunctionReturn(0); 6231d72bce8STim Tautges } 6241d72bce8STim Tautges 6251d72bce8STim Tautges 6261d72bce8STim Tautges #undef __FUNCT__ 6271d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize" 628aa768e4cSTim Tautges /*@ 629aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 630aa768e4cSTim Tautges 631aa768e4cSTim Tautges Collective on MPI_Comm 632aa768e4cSTim Tautges 633aa768e4cSTim Tautges Input Parameter: 634aa768e4cSTim Tautges . dm - The DMMoab object being set 635aa768e4cSTim Tautges 636aa768e4cSTim Tautges Output Parameter: 637aa768e4cSTim Tautges . bs - The block size used with this DMMoab 638aa768e4cSTim Tautges 639aa768e4cSTim Tautges Level: beginner 640aa768e4cSTim Tautges 641aa768e4cSTim Tautges .keywords: DMMoab, create 642aa768e4cSTim Tautges @*/ 6431d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs) 6441d72bce8STim Tautges { 6451d72bce8STim Tautges PetscFunctionBegin; 6461d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6471d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 6481d72bce8STim Tautges PetscFunctionReturn(0); 6491d72bce8STim Tautges } 6501d72bce8STim Tautges 651*1cec0304SVijay Mahadevan 652*1cec0304SVijay Mahadevan #undef __FUNCT__ 653*1cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldVector" 654*1cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec) 655*1cec0304SVijay Mahadevan { 656*1cec0304SVijay Mahadevan DM_Moab *dmmoab; 657*1cec0304SVijay Mahadevan moab::Tag vtag,ntag; 658*1cec0304SVijay Mahadevan PetscScalar *varray; 659*1cec0304SVijay Mahadevan moab::ErrorCode merr; 660*1cec0304SVijay Mahadevan PetscErrorCode ierr; 661*1cec0304SVijay Mahadevan PetscSection section; 662*1cec0304SVijay Mahadevan PetscInt doff; 663*1cec0304SVijay Mahadevan std::string tag_name; 664*1cec0304SVijay Mahadevan moab::Range::iterator iter; 665*1cec0304SVijay Mahadevan 666*1cec0304SVijay Mahadevan PetscFunctionBegin; 667*1cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 668*1cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 669*1cec0304SVijay Mahadevan 670*1cec0304SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 671*1cec0304SVijay Mahadevan 672*1cec0304SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 673*1cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag, 674*1cec0304SVijay Mahadevan moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr); 675*1cec0304SVijay Mahadevan 676*1cec0304SVijay Mahadevan ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr); 677*1cec0304SVijay Mahadevan 678*1cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name); 679*1cec0304SVijay Mahadevan if (!tag_name.length() && merr !=moab::MB_SUCCESS) { 680*1cec0304SVijay Mahadevan ierr = DMMoabVecGetArray(dm,fvec,&varray);CHKERRQ(ierr); 681*1cec0304SVijay Mahadevan for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) { 682*1cec0304SVijay Mahadevan moab::EntityHandle vtx = (*iter); 683*1cec0304SVijay Mahadevan 684*1cec0304SVijay Mahadevan /* get field dof index */ 685*1cec0304SVijay Mahadevan ierr = PetscSectionGetFieldOffset(section, vtx, ifield, &doff); 686*1cec0304SVijay Mahadevan 687*1cec0304SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */ 688*1cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, &vtx, 1, (const void*)&varray[doff]);MBERRNM(merr); 689*1cec0304SVijay Mahadevan } 690*1cec0304SVijay Mahadevan ierr = DMMoabVecRestoreArray(dm,fvec,&varray);CHKERRQ(ierr); 691*1cec0304SVijay Mahadevan } 692*1cec0304SVijay Mahadevan else { 693*1cec0304SVijay Mahadevan ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&varray);CHKERRQ(ierr); 694*1cec0304SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 695*1cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray);MBERRNM(merr); 696*1cec0304SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)varray);MBERRNM(merr); 697*1cec0304SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 698*1cec0304SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr); 699*1cec0304SVijay Mahadevan ierr = PetscFree(varray);CHKERRQ(ierr); 700*1cec0304SVijay Mahadevan } 701*1cec0304SVijay Mahadevan PetscFunctionReturn(0); 702*1cec0304SVijay Mahadevan } 703*1cec0304SVijay Mahadevan 704*1cec0304SVijay Mahadevan 705*1cec0304SVijay Mahadevan #undef __FUNCT__ 706*1cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryEntities" 707*1cec0304SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryEntities(DM dm,moab::Range *bdvtx,moab::Range* bdfaces) 708*1cec0304SVijay Mahadevan { 709*1cec0304SVijay Mahadevan DM_Moab *dmmoab; 710*1cec0304SVijay Mahadevan 711*1cec0304SVijay Mahadevan PetscFunctionBegin; 712*1cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 713*1cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 714*1cec0304SVijay Mahadevan 715*1cec0304SVijay Mahadevan if (bdvtx) *bdvtx = *dmmoab->bndyvtx; 716*1cec0304SVijay Mahadevan if (bdfaces) *bdfaces = *dmmoab->bndyfaces; 717*1cec0304SVijay Mahadevan PetscFunctionReturn(0); 718*1cec0304SVijay Mahadevan } 719*1cec0304SVijay Mahadevan 720*1cec0304SVijay Mahadevan 721*1cec0304SVijay Mahadevan #undef __FUNCT__ 722*1cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabOutput" 723*1cec0304SVijay Mahadevan PetscErrorCode DMMoabOutput(DM dm,const char* fname,const char* wopts) 724*1cec0304SVijay Mahadevan { 725*1cec0304SVijay Mahadevan DM_Moab *dmmoab; 726*1cec0304SVijay Mahadevan moab::ErrorCode merr; 727*1cec0304SVijay Mahadevan 728*1cec0304SVijay Mahadevan PetscFunctionBegin; 729*1cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 730*1cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 731*1cec0304SVijay Mahadevan 732*1cec0304SVijay Mahadevan // output file, using parallel write 733*1cec0304SVijay Mahadevan merr = dmmoab->mbiface->write_file(fname, NULL, wopts);MBERRVM(dmmoab->mbiface,"Writing output of DMMoab failed.",merr); 734*1cec0304SVijay Mahadevan PetscFunctionReturn(0); 735*1cec0304SVijay Mahadevan } 736*1cec0304SVijay Mahadevan 737*1cec0304SVijay Mahadevan 738*1cec0304SVijay Mahadevan #undef __FUNCT__ 739*1cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFields" 740*1cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFields(DM dm,PetscInt nfields,const char** fields) 741*1cec0304SVijay Mahadevan { 742*1cec0304SVijay Mahadevan DM_Moab *dmmoab; 743*1cec0304SVijay Mahadevan 744*1cec0304SVijay Mahadevan PetscFunctionBegin; 745*1cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 746*1cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 747*1cec0304SVijay Mahadevan 748*1cec0304SVijay Mahadevan dmmoab->fields = fields; 749*1cec0304SVijay Mahadevan dmmoab->nfields = nfields; 750*1cec0304SVijay Mahadevan PetscFunctionReturn(0); 751*1cec0304SVijay Mahadevan } 752*1cec0304SVijay Mahadevan 753*1cec0304SVijay Mahadevan 754*1cec0304SVijay Mahadevan #undef __FUNCT__ 755*1cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDof" 756*1cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof) 757*1cec0304SVijay Mahadevan { 758*1cec0304SVijay Mahadevan PetscSection section; 759*1cec0304SVijay Mahadevan PetscErrorCode ierr; 760*1cec0304SVijay Mahadevan 761*1cec0304SVijay Mahadevan PetscFunctionBegin; 762*1cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 763*1cec0304SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 764*1cec0304SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, (PetscInt)point, field, dof);CHKERRQ(ierr); 765*1cec0304SVijay Mahadevan PetscFunctionReturn(0); 766*1cec0304SVijay Mahadevan } 767*1cec0304SVijay Mahadevan 768*1cec0304SVijay Mahadevan 769*1cec0304SVijay Mahadevan #undef __FUNCT__ 770*1cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofs" 771*1cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof) 772*1cec0304SVijay Mahadevan { 773*1cec0304SVijay Mahadevan PetscInt i; 774*1cec0304SVijay Mahadevan PetscSection section; 775*1cec0304SVijay Mahadevan PetscErrorCode ierr; 776*1cec0304SVijay Mahadevan 777*1cec0304SVijay Mahadevan PetscFunctionBegin; 778*1cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 779*1cec0304SVijay Mahadevan ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 780*1cec0304SVijay Mahadevan if (!dof) { 781*1cec0304SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr); 782*1cec0304SVijay Mahadevan } 783*1cec0304SVijay Mahadevan for (i=0; i<npoints; ++i) { 784*1cec0304SVijay Mahadevan ierr = PetscSectionGetFieldDof(section, (PetscInt)points[i], field, &dof[i]);CHKERRQ(ierr); 785*1cec0304SVijay Mahadevan } 786*1cec0304SVijay Mahadevan PetscFunctionReturn(0); 787*1cec0304SVijay Mahadevan } 788*1cec0304SVijay Mahadevan 789*1cec0304SVijay Mahadevan 790