1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I "petscdmmoab.h" I*/ 21d72bce8STim Tautges 31d72bce8STim Tautges #include <petscdmmoab.h> 488face26SJed Brown #include <MBTagConventions.hpp> 59daf19fdSVijay Mahadevan #include <moab/NestedRefine.hpp> 61cec0304SVijay Mahadevan #include <moab/Skinner.hpp> 7032b8ab6SVijay Mahadevan 8c6ef30f9SVijay Mahadevan /*MC 9c6ef30f9SVijay Mahadevan DMMOAB = "moab" - A DM object that encapsulates an unstructured mesh described by the MOAB mesh database. 10c6ef30f9SVijay Mahadevan Direct access to the MOAB Interface and other mesh manipulation related objects are available 11c6ef30f9SVijay Mahadevan through public API. Ability to create global and local representation of Vecs containing all 12c6ef30f9SVijay Mahadevan unknowns in the interior and shared boundary via a transparent tag-data wrapper is provided 13c6ef30f9SVijay Mahadevan along with utility functions to traverse the mesh and assemble a discrete system via 14c6ef30f9SVijay Mahadevan field-based/blocked Vec(Get/Set) methods. Input from and output to different formats are 15c6ef30f9SVijay Mahadevan available. 16c6ef30f9SVijay Mahadevan 17c6ef30f9SVijay Mahadevan Reference: http://www.mcs.anl.gov/~fathom/moab-docs/html/contents.html 18c6ef30f9SVijay Mahadevan 19c6ef30f9SVijay Mahadevan Level: intermediate 20c6ef30f9SVijay Mahadevan 21c6ef30f9SVijay Mahadevan .seealso: DMType, DMMoabCreate(), DMCreate(), DMSetType(), DMMoabCreateMoab() 22c6ef30f9SVijay Mahadevan M*/ 23c6ef30f9SVijay Mahadevan 24304006b3SVijay Mahadevan /* External function declarations here */ 25304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInterpolation_Moab(DM dmCoarse, DM dmFine, Mat *interpolation, Vec *scaling); 26304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateDefaultConstraints_Moab(DM dm); 27304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm, Mat *J); 28304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateCoordinateDM_Moab(DM dm, DM *cdm); 29304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefine_Moab(DM dm, MPI_Comm comm, DM *dmRefined); 30304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsen_Moab(DM dm, MPI_Comm comm, DM *dmCoarsened); 31304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefineHierarchy_Moab(DM dm, PetscInt nlevels, DM dmRefined[]); 32304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsenHierarchy_Moab(DM dm, PetscInt nlevels, DM dmCoarsened[]); 33304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm); 34304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateGlobalVector_Moab(DM, Vec *); 35304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateLocalVector_Moab(DM, Vec *); 36304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm, Mat *J); 37304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalBegin_Moab(DM, Vec, InsertMode, Vec); 38304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalEnd_Moab(DM, Vec, InsertMode, Vec); 39304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalBegin_Moab(DM, Vec, InsertMode, Vec); 40304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalEnd_Moab(DM, Vec, InsertMode, Vec); 41304006b3SVijay Mahadevan 42304006b3SVijay Mahadevan 43304006b3SVijay Mahadevan /* Un-implemented routines */ 44304006b3SVijay Mahadevan /* 45304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateDefaultSection_Moab(DM dm); 46304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInjection_Moab(DM dmCoarse, DM dmFine, Mat *mat); 47304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLoad_Moab(DM dm, PetscViewer viewer); 48304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGetDimPoints_Moab(DM dm, PetscInt dim, PetscInt *pStart, PetscInt *pEnd); 49304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateSubDM_Moab(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm); 50304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocatePoints_Moab(DM dm, Vec v, IS *cellIS); 51304006b3SVijay Mahadevan */ 52c6ef30f9SVijay Mahadevan 531d72bce8STim Tautges /*@ 541d72bce8STim Tautges DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance 551d72bce8STim Tautges 561d72bce8STim Tautges Collective on MPI_Comm 571d72bce8STim Tautges 581d72bce8STim Tautges Input Parameter: 591d72bce8STim Tautges . comm - The communicator for the DMMoab object 601d72bce8STim Tautges 611d72bce8STim Tautges Output Parameter: 62032b8ab6SVijay Mahadevan . dmb - The DMMoab object 631d72bce8STim Tautges 641d72bce8STim Tautges Level: beginner 651d72bce8STim Tautges 661d72bce8STim Tautges .keywords: DMMoab, create 671d72bce8STim Tautges @*/ 68032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb) 691d72bce8STim Tautges { 701d72bce8STim Tautges PetscErrorCode ierr; 711d72bce8STim Tautges 721d72bce8STim Tautges PetscFunctionBegin; 73032b8ab6SVijay Mahadevan PetscValidPointer(dmb, 2); 74032b8ab6SVijay Mahadevan ierr = DMCreate(comm, dmb);CHKERRQ(ierr); 75032b8ab6SVijay Mahadevan ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr); 761d72bce8STim Tautges PetscFunctionReturn(0); 771d72bce8STim Tautges } 781d72bce8STim Tautges 791d72bce8STim Tautges /*@ 80b117cd09SVijay Mahadevan DMMoabCreateMoab - Creates a DMMoab object, optionally from an instance and other data 811d72bce8STim Tautges 821d72bce8STim Tautges Collective on MPI_Comm 831d72bce8STim Tautges 841d72bce8STim Tautges Input Parameter: 85*a2b725a8SWilliam Gropp + comm - The communicator for the DMMoab object 86032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed 87a4d2169cSTim Tautges along with the DMMoab 88a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator 891d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag 90*a2b725a8SWilliam Gropp - range - If non-NULL, contains range of entities to which DOFs will be assigned 911d72bce8STim Tautges 921d72bce8STim Tautges Output Parameter: 93032b8ab6SVijay Mahadevan . dmb - The DMMoab object 941d72bce8STim Tautges 95032b8ab6SVijay Mahadevan Level: intermediate 961d72bce8STim Tautges 971d72bce8STim Tautges .keywords: DMMoab, create 981d72bce8STim Tautges @*/ 999daf19fdSVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::Tag *ltog_tag, moab::Range *range, DM *dmb) 1001d72bce8STim Tautges { 1011d72bce8STim Tautges PetscErrorCode ierr; 102032b8ab6SVijay Mahadevan moab::ErrorCode merr; 10385d305f5SVijay Mahadevan DM dmmb; 104853cdec3SJed Brown DM_Moab *dmmoab; 1051d72bce8STim Tautges 1061d72bce8STim Tautges PetscFunctionBegin; 107032b8ab6SVijay Mahadevan PetscValidPointer(dmb, 6); 10885d305f5SVijay Mahadevan 10985d305f5SVijay Mahadevan ierr = DMMoabCreate(comm, &dmmb);CHKERRQ(ierr); 11085d305f5SVijay Mahadevan dmmoab = (DM_Moab*)(dmmb)->data; 111a4d2169cSTim Tautges 112a4d2169cSTim Tautges if (!mbiface) { 11372ff976dSVijay Mahadevan dmmoab->mbiface = new moab::Core(); 1147d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_TRUE; 1151d72bce8STim Tautges } 1161cec0304SVijay Mahadevan else { 1171cec0304SVijay Mahadevan dmmoab->mbiface = mbiface; 1187d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_FALSE; 1191cec0304SVijay Mahadevan } 1201cec0304SVijay Mahadevan 121b5410836SVijay Mahadevan /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */ 122b5410836SVijay Mahadevan dmmoab->fileset = 0; 123b117cd09SVijay Mahadevan dmmoab->hlevel = 0; 12449d66b22SVijay Mahadevan dmmoab->nghostrings = 0; 1257d89fc02STim Tautges 1269daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1279daf19fdSVijay Mahadevan moab::EntityHandle partnset; 128032b8ab6SVijay Mahadevan 129db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 130db66d124SVijay Mahadevan to the load_file functions to be populated. */ 1310c8a2322SVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset); MBERR("Creating partition set failed", merr); 132032b8ab6SVijay Mahadevan 133db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 13472ff976dSVijay Mahadevan dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm); 1359daf19fdSVijay Mahadevan #endif 136032b8ab6SVijay Mahadevan 1374973de03SVijay Mahadevan /* do the remaining initializations for DMMoab */ 1384973de03SVijay Mahadevan dmmoab->bs = 1; 139addae81cSVijay Mahadevan dmmoab->numFields = 1; 1403f1c6e43SVijay Mahadevan ierr = PetscMalloc(dmmoab->numFields * sizeof(char*), &dmmoab->fieldNames);CHKERRQ(ierr); 1413f1c6e43SVijay Mahadevan ierr = PetscStrallocpy("DEFAULT", (char**) &dmmoab->fieldNames[0]);CHKERRQ(ierr); 1422e4e7c01SVijay Mahadevan dmmoab->rw_dbglevel = 0; 1432e4e7c01SVijay Mahadevan dmmoab->partition_by_rank = PETSC_FALSE; 1442e4e7c01SVijay Mahadevan dmmoab->extra_read_options[0] = '\0'; 1452e4e7c01SVijay Mahadevan dmmoab->extra_write_options[0] = '\0'; 1462e4e7c01SVijay Mahadevan dmmoab->read_mode = READ_PART; 1472e4e7c01SVijay Mahadevan dmmoab->write_mode = WRITE_PART; 1484973de03SVijay Mahadevan 1494973de03SVijay Mahadevan /* set global ID tag handle */ 1501a845d2aSVijay Mahadevan if (ltog_tag && *ltog_tag) { 15185d305f5SVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag);CHKERRQ(ierr); 152032b8ab6SVijay Mahadevan } 153032b8ab6SVijay Mahadevan else { 1541a845d2aSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag); MBERRNM(merr); 1551a845d2aSVijay Mahadevan if (ltog_tag) *ltog_tag = dmmoab->ltog_tag; 156a4d2169cSTim Tautges } 157a4d2169cSTim Tautges 158340f3b9aSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag); MBERRNM(merr); 159340f3b9aSVijay Mahadevan 1604973de03SVijay Mahadevan /* set the local range of entities (vertices) of interest */ 161a4d2169cSTim Tautges if (range) { 16285d305f5SVijay Mahadevan ierr = DMMoabSetLocalVertices(dmmb, range);CHKERRQ(ierr); 163a4d2169cSTim Tautges } 16485d305f5SVijay Mahadevan *dmb = dmmb; 1651d72bce8STim Tautges PetscFunctionReturn(0); 1661d72bce8STim Tautges } 1671d72bce8STim Tautges 168304006b3SVijay Mahadevan 1699daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1701d72bce8STim Tautges 171aa768e4cSTim Tautges /*@ 172aa768e4cSTim Tautges DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab 173aa768e4cSTim Tautges 174aa768e4cSTim Tautges Collective on MPI_Comm 175aa768e4cSTim Tautges 176aa768e4cSTim Tautges Input Parameter: 177aa768e4cSTim Tautges . dm - The DMMoab object being set 178aa768e4cSTim Tautges 179aa768e4cSTim Tautges Output Parameter: 180aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 181aa768e4cSTim Tautges 182aa768e4cSTim Tautges Level: beginner 183aa768e4cSTim Tautges 184aa768e4cSTim Tautges .keywords: DMMoab, create 185aa768e4cSTim Tautges @*/ 1861d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm, moab::ParallelComm **pcomm) 1871d72bce8STim Tautges { 1881d72bce8STim Tautges PetscFunctionBegin; 1891d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 190032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 1911d72bce8STim Tautges PetscFunctionReturn(0); 1921d72bce8STim Tautges } 1931d72bce8STim Tautges 1949daf19fdSVijay Mahadevan #endif /* MOAB_HAVE_MPI */ 1959daf19fdSVijay Mahadevan 1961d72bce8STim Tautges 197aa768e4cSTim Tautges /*@ 198aa768e4cSTim Tautges DMMoabSetInterface - Set the MOAB instance used with this DMMoab 199aa768e4cSTim Tautges 200aa768e4cSTim Tautges Collective on MPI_Comm 201aa768e4cSTim Tautges 202aa768e4cSTim Tautges Input Parameter: 203*a2b725a8SWilliam Gropp + dm - The DMMoab object being set 204*a2b725a8SWilliam Gropp - mbiface - The MOAB instance being set on this DMMoab 205aa768e4cSTim Tautges 206aa768e4cSTim Tautges Level: beginner 207aa768e4cSTim Tautges 208aa768e4cSTim Tautges .keywords: DMMoab, create 209aa768e4cSTim Tautges @*/ 210a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm, moab::Interface *mbiface) 2111d72bce8STim Tautges { 212032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 213032b8ab6SVijay Mahadevan 2141d72bce8STim Tautges PetscFunctionBegin; 2151d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2161cec0304SVijay Mahadevan PetscValidPointer(mbiface, 2); 2179daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 218032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 2199daf19fdSVijay Mahadevan #endif 220032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 221032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 2221d72bce8STim Tautges PetscFunctionReturn(0); 2231d72bce8STim Tautges } 2241d72bce8STim Tautges 2251d72bce8STim Tautges 226aa768e4cSTim Tautges /*@ 227aa768e4cSTim Tautges DMMoabGetInterface - Get the MOAB instance used with this DMMoab 228aa768e4cSTim Tautges 229aa768e4cSTim Tautges Collective on MPI_Comm 230aa768e4cSTim Tautges 231aa768e4cSTim Tautges Input Parameter: 232aa768e4cSTim Tautges . dm - The DMMoab object being set 233aa768e4cSTim Tautges 234aa768e4cSTim Tautges Output Parameter: 235aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab 236aa768e4cSTim Tautges 237aa768e4cSTim Tautges Level: beginner 238aa768e4cSTim Tautges 239aa768e4cSTim Tautges .keywords: DMMoab, create 240aa768e4cSTim Tautges @*/ 241a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm, moab::Interface **mbiface) 2421d72bce8STim Tautges { 2439426e041SSatish Balay PetscErrorCode ierr; 244cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 245cabb514dSBarry Smith 2461d72bce8STim Tautges PetscFunctionBegin; 2471d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 248cabb514dSBarry 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); 249a4d2169cSTim Tautges *mbiface = ((DM_Moab*)dm->data)->mbiface; 2501d72bce8STim Tautges PetscFunctionReturn(0); 2511d72bce8STim Tautges } 2521d72bce8STim Tautges 2531d72bce8STim Tautges 254aa768e4cSTim Tautges /*@ 2555eb88e9dSVijay Mahadevan DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab 256aa768e4cSTim Tautges 257aa768e4cSTim Tautges Collective on MPI_Comm 258aa768e4cSTim Tautges 259aa768e4cSTim Tautges Input Parameter: 260*a2b725a8SWilliam Gropp + dm - The DMMoab object being set 261*a2b725a8SWilliam Gropp - range - The entities treated by this DMMoab 262aa768e4cSTim Tautges 263aa768e4cSTim Tautges Level: beginner 264aa768e4cSTim Tautges 265aa768e4cSTim Tautges .keywords: DMMoab, create 266aa768e4cSTim Tautges @*/ 2675eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm, moab::Range *range) 2681d72bce8STim Tautges { 269fd3326ddSVijay Mahadevan moab::Range tmpvtxs; 270032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 271032b8ab6SVijay Mahadevan 2721d72bce8STim Tautges PetscFunctionBegin; 2731d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 274032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 275032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 276fd3326ddSVijay Mahadevan 277032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 278fd3326ddSVijay Mahadevan 2799daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 2809daf19fdSVijay Mahadevan moab::ErrorCode merr; 281fd3326ddSVijay Mahadevan /* filter based on parallel status */ 282fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned); MBERRNM(merr); 283fd3326ddSVijay Mahadevan 284fd3326ddSVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 285fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 286fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(tmpvtxs, PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost); MBERRNM(merr); 287fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost); 288fd3326ddSVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs); 2899daf19fdSVijay Mahadevan #else 2909daf19fdSVijay Mahadevan *dmmoab->vowned = *dmmoab->vlocal; 2919daf19fdSVijay Mahadevan #endif 292fd3326ddSVijay Mahadevan 293fd3326ddSVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 294032b8ab6SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 295032b8ab6SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 2969daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 2979daf19fdSVijay Mahadevan PetscErrorCode ierr; 298b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 2999daf19fdSVijay Mahadevan #else 3009daf19fdSVijay Mahadevan dmmoab->n = dmmoab->nloc; 3019daf19fdSVijay Mahadevan #endif 3021d72bce8STim Tautges PetscFunctionReturn(0); 3031d72bce8STim Tautges } 3041d72bce8STim Tautges 3051d72bce8STim Tautges 3068d8d51c8SVijay Mahadevan /*@ 3078d8d51c8SVijay Mahadevan DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab 3088d8d51c8SVijay Mahadevan 3098d8d51c8SVijay Mahadevan Collective on MPI_Comm 3108d8d51c8SVijay Mahadevan 3118d8d51c8SVijay Mahadevan Input Parameter: 3128d8d51c8SVijay Mahadevan . dm - The DMMoab object being set 3138d8d51c8SVijay Mahadevan 3148d8d51c8SVijay Mahadevan Output Parameter: 3158d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted) 3168d8d51c8SVijay Mahadevan 3178d8d51c8SVijay Mahadevan Level: beginner 3188d8d51c8SVijay Mahadevan 3198d8d51c8SVijay Mahadevan .keywords: DMMoab, create 3208d8d51c8SVijay Mahadevan @*/ 3218d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm, moab::Range *local) 3228d8d51c8SVijay Mahadevan { 3238d8d51c8SVijay Mahadevan PetscFunctionBegin; 3248d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 3258d8d51c8SVijay Mahadevan if (local) *local = *((DM_Moab*)dm->data)->vlocal; 3268d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 3278d8d51c8SVijay Mahadevan } 3288d8d51c8SVijay Mahadevan 3298d8d51c8SVijay Mahadevan 3308d8d51c8SVijay Mahadevan 331aa768e4cSTim Tautges /*@ 3325eb88e9dSVijay Mahadevan DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab 333aa768e4cSTim Tautges 334aa768e4cSTim Tautges Collective on MPI_Comm 335aa768e4cSTim Tautges 336aa768e4cSTim Tautges Input Parameter: 337aa768e4cSTim Tautges . dm - The DMMoab object being set 338aa768e4cSTim Tautges 339*a2b725a8SWilliam Gropp Output Parameters: 340*a2b725a8SWilliam Gropp + owned - The owned vertex entities in this DMMoab 341*a2b725a8SWilliam Gropp - ghost - The ghosted entities (non-owned) stored locally in this partition 342aa768e4cSTim Tautges 343aa768e4cSTim Tautges Level: beginner 344aa768e4cSTim Tautges 345aa768e4cSTim Tautges .keywords: DMMoab, create 346aa768e4cSTim Tautges @*/ 347351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm, const moab::Range **owned, const moab::Range **ghost) 3481d72bce8STim Tautges { 3491d72bce8STim Tautges PetscFunctionBegin; 3501d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 351351b8a77SVijay Mahadevan if (owned) *owned = ((DM_Moab*)dm->data)->vowned; 352351b8a77SVijay Mahadevan if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost; 3531d72bce8STim Tautges PetscFunctionReturn(0); 3541d72bce8STim Tautges } 3551d72bce8STim Tautges 3565eb88e9dSVijay Mahadevan /*@ 3575eb88e9dSVijay Mahadevan DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned 3585eb88e9dSVijay Mahadevan 3595eb88e9dSVijay Mahadevan Collective on MPI_Comm 3605eb88e9dSVijay Mahadevan 3615eb88e9dSVijay Mahadevan Input Parameter: 3625eb88e9dSVijay Mahadevan . dm - The DMMoab object being set 3635eb88e9dSVijay Mahadevan 3645eb88e9dSVijay Mahadevan Output Parameter: 3655eb88e9dSVijay Mahadevan . range - The entities owned locally 3665eb88e9dSVijay Mahadevan 3675eb88e9dSVijay Mahadevan Level: beginner 3685eb88e9dSVijay Mahadevan 3695eb88e9dSVijay Mahadevan .keywords: DMMoab, create 3705eb88e9dSVijay Mahadevan @*/ 371351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm, const moab::Range **range) 3725eb88e9dSVijay Mahadevan { 3735eb88e9dSVijay Mahadevan PetscFunctionBegin; 3745eb88e9dSVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 375351b8a77SVijay Mahadevan if (range) *range = ((DM_Moab*)dm->data)->elocal; 3761cec0304SVijay Mahadevan PetscFunctionReturn(0); 3771cec0304SVijay Mahadevan } 3781cec0304SVijay Mahadevan 3791cec0304SVijay Mahadevan 3801cec0304SVijay Mahadevan /*@ 3811cec0304SVijay Mahadevan DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab 3821cec0304SVijay Mahadevan 3831cec0304SVijay Mahadevan Collective on MPI_Comm 3841cec0304SVijay Mahadevan 385*a2b725a8SWilliam Gropp Input Parameters: 386*a2b725a8SWilliam Gropp + dm - The DMMoab object being set 387*a2b725a8SWilliam Gropp - range - The entities treated by this DMMoab 3881cec0304SVijay Mahadevan 3891cec0304SVijay Mahadevan Level: beginner 3901cec0304SVijay Mahadevan 3911cec0304SVijay Mahadevan .keywords: DMMoab, create 3921cec0304SVijay Mahadevan @*/ 3931cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm, moab::Range *range) 3941cec0304SVijay Mahadevan { 3951cec0304SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 3961cec0304SVijay Mahadevan 3971cec0304SVijay Mahadevan PetscFunctionBegin; 3981cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 3991cec0304SVijay Mahadevan dmmoab->elocal->clear(); 4001cec0304SVijay Mahadevan dmmoab->eghost->clear(); 4011cec0304SVijay Mahadevan dmmoab->elocal->insert(range->begin(), range->end()); 4029daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 4039daf19fdSVijay Mahadevan moab::ErrorCode merr; 4041cec0304SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr); 4051cec0304SVijay Mahadevan *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal); 4069daf19fdSVijay Mahadevan #endif 4071cec0304SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 40841dd5348SVijay Mahadevan dmmoab->neleghost = dmmoab->eghost->size(); 4099daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 4109daf19fdSVijay Mahadevan PetscErrorCode ierr; 4119daf19fdSVijay Mahadevan ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 4128cbae1a6SVijay Mahadevan PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele); 4139daf19fdSVijay Mahadevan #else 4149daf19fdSVijay Mahadevan dmmoab->nele = dmmoab->neleloc; 4159daf19fdSVijay Mahadevan #endif 4165eb88e9dSVijay Mahadevan PetscFunctionReturn(0); 4175eb88e9dSVijay Mahadevan } 4185eb88e9dSVijay Mahadevan 4195eb88e9dSVijay Mahadevan 420aa768e4cSTim Tautges /*@ 421aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 422aa768e4cSTim Tautges 423aa768e4cSTim Tautges Collective on MPI_Comm 424aa768e4cSTim Tautges 425*a2b725a8SWilliam Gropp Input Parameters: 426*a2b725a8SWilliam Gropp + dm - The DMMoab object being set 427*a2b725a8SWilliam Gropp - ltogtag - The MOAB tag used for local to global ids 428aa768e4cSTim Tautges 429aa768e4cSTim Tautges Level: beginner 430aa768e4cSTim Tautges 431aa768e4cSTim Tautges .keywords: DMMoab, create 432aa768e4cSTim Tautges @*/ 4331d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm, moab::Tag ltogtag) 4341d72bce8STim Tautges { 4351d72bce8STim Tautges PetscFunctionBegin; 4361d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4371d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 4381d72bce8STim Tautges PetscFunctionReturn(0); 4391d72bce8STim Tautges } 4401d72bce8STim Tautges 4411d72bce8STim Tautges 442aa768e4cSTim Tautges /*@ 443aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 444aa768e4cSTim Tautges 445aa768e4cSTim Tautges Collective on MPI_Comm 446aa768e4cSTim Tautges 447aa768e4cSTim Tautges Input Parameter: 448aa768e4cSTim Tautges . dm - The DMMoab object being set 449aa768e4cSTim Tautges 450aa768e4cSTim Tautges Output Parameter: 451aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 452aa768e4cSTim Tautges 453aa768e4cSTim Tautges Level: beginner 454aa768e4cSTim Tautges 455aa768e4cSTim Tautges .keywords: DMMoab, create 456aa768e4cSTim Tautges @*/ 4571d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm, moab::Tag *ltog_tag) 4581d72bce8STim Tautges { 4591d72bce8STim Tautges PetscFunctionBegin; 4601d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4611d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 4621d72bce8STim Tautges PetscFunctionReturn(0); 4631d72bce8STim Tautges } 4641d72bce8STim Tautges 4651d72bce8STim Tautges 466aa768e4cSTim Tautges /*@ 467aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 468aa768e4cSTim Tautges 469aa768e4cSTim Tautges Collective on MPI_Comm 470aa768e4cSTim Tautges 471aa768e4cSTim Tautges Input Parameter: 472*a2b725a8SWilliam Gropp + dm - The DMMoab object being set 473*a2b725a8SWilliam Gropp - bs - The block size used with this DMMoab 474aa768e4cSTim Tautges 475aa768e4cSTim Tautges Level: beginner 476aa768e4cSTim Tautges 477aa768e4cSTim Tautges .keywords: DMMoab, create 478aa768e4cSTim Tautges @*/ 4791d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm, PetscInt bs) 4801d72bce8STim Tautges { 4811d72bce8STim Tautges PetscFunctionBegin; 4821d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4831d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 4841d72bce8STim Tautges PetscFunctionReturn(0); 4851d72bce8STim Tautges } 4861d72bce8STim Tautges 4871d72bce8STim Tautges 488aa768e4cSTim Tautges /*@ 489aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 490aa768e4cSTim Tautges 491aa768e4cSTim Tautges Collective on MPI_Comm 492aa768e4cSTim Tautges 493aa768e4cSTim Tautges Input Parameter: 494aa768e4cSTim Tautges . dm - The DMMoab object being set 495aa768e4cSTim Tautges 496aa768e4cSTim Tautges Output Parameter: 497aa768e4cSTim Tautges . bs - The block size used with this DMMoab 498aa768e4cSTim Tautges 499aa768e4cSTim Tautges Level: beginner 500aa768e4cSTim Tautges 501aa768e4cSTim Tautges .keywords: DMMoab, create 502aa768e4cSTim Tautges @*/ 5031d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm, PetscInt *bs) 5041d72bce8STim Tautges { 5051d72bce8STim Tautges PetscFunctionBegin; 5061d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 5071d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 5081d72bce8STim Tautges PetscFunctionReturn(0); 5091d72bce8STim Tautges } 5101d72bce8STim Tautges 5111cec0304SVijay Mahadevan 512212ad6d1SVijay Mahadevan /*@ 513212ad6d1SVijay Mahadevan DMMoabGetSize - Get the global vertex size used with this DMMoab 514212ad6d1SVijay Mahadevan 51500cc10feSVijay Mahadevan Collective on DM 516212ad6d1SVijay Mahadevan 517212ad6d1SVijay Mahadevan Input Parameter: 518212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 519212ad6d1SVijay Mahadevan 520212ad6d1SVijay Mahadevan Output Parameter: 521*a2b725a8SWilliam Gropp + neg - The number of global elements in the DMMoab instance 522*a2b725a8SWilliam Gropp - nvg - The number of global vertices in the DMMoab instance 523212ad6d1SVijay Mahadevan 524212ad6d1SVijay Mahadevan Level: beginner 525212ad6d1SVijay Mahadevan 526212ad6d1SVijay Mahadevan .keywords: DMMoab, create 527212ad6d1SVijay Mahadevan @*/ 52841dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm, PetscInt *neg, PetscInt *nvg) 529212ad6d1SVijay Mahadevan { 530212ad6d1SVijay Mahadevan PetscFunctionBegin; 531212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 53241dd5348SVijay Mahadevan if (neg) *neg = ((DM_Moab*)dm->data)->nele; 53341dd5348SVijay Mahadevan if (nvg) *nvg = ((DM_Moab*)dm->data)->n; 534212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 535212ad6d1SVijay Mahadevan } 536212ad6d1SVijay Mahadevan 537212ad6d1SVijay Mahadevan 538212ad6d1SVijay Mahadevan /*@ 539212ad6d1SVijay Mahadevan DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab 540212ad6d1SVijay Mahadevan 54100cc10feSVijay Mahadevan Collective on DM 542212ad6d1SVijay Mahadevan 543212ad6d1SVijay Mahadevan Input Parameter: 544212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 545212ad6d1SVijay Mahadevan 546212ad6d1SVijay Mahadevan Output Parameter: 547b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor 54800cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor 54900cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor 550*a2b725a8SWilliam Gropp - nvg - The number of ghosted vertices in this processor 551212ad6d1SVijay Mahadevan 552212ad6d1SVijay Mahadevan Level: beginner 553212ad6d1SVijay Mahadevan 554212ad6d1SVijay Mahadevan .keywords: DMMoab, create 555212ad6d1SVijay Mahadevan @*/ 55641dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm, PetscInt *nel, PetscInt *neg, PetscInt *nvl, PetscInt *nvg) 557212ad6d1SVijay Mahadevan { 558212ad6d1SVijay Mahadevan PetscFunctionBegin; 559212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 56041dd5348SVijay Mahadevan if (nel) *nel = ((DM_Moab*)dm->data)->neleloc; 56141dd5348SVijay Mahadevan if (neg) *neg = ((DM_Moab*)dm->data)->neleghost; 56241dd5348SVijay Mahadevan if (nvl) *nvl = ((DM_Moab*)dm->data)->nloc; 56341dd5348SVijay Mahadevan if (nvg) *nvg = ((DM_Moab*)dm->data)->nghost; 564212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 565212ad6d1SVijay Mahadevan } 566212ad6d1SVijay Mahadevan 567212ad6d1SVijay Mahadevan 56800cc10feSVijay Mahadevan /*@ 56900cc10feSVijay Mahadevan DMMoabGetOffset - Get the local offset for the global vector 57000cc10feSVijay Mahadevan 57100cc10feSVijay Mahadevan Collective on MPI_Comm 57200cc10feSVijay Mahadevan 57300cc10feSVijay Mahadevan Input Parameter: 57400cc10feSVijay Mahadevan . dm - The DMMoab object being set 57500cc10feSVijay Mahadevan 57600cc10feSVijay Mahadevan Output Parameter: 57700cc10feSVijay Mahadevan . offset - The local offset for the global vector 57800cc10feSVijay Mahadevan 57900cc10feSVijay Mahadevan Level: beginner 58000cc10feSVijay Mahadevan 58100cc10feSVijay Mahadevan .keywords: DMMoab, create 58200cc10feSVijay Mahadevan @*/ 58300cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm, PetscInt *offset) 58400cc10feSVijay Mahadevan { 58500cc10feSVijay Mahadevan PetscFunctionBegin; 58600cc10feSVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 58700cc10feSVijay Mahadevan *offset = ((DM_Moab*)dm->data)->vstart; 58800cc10feSVijay Mahadevan PetscFunctionReturn(0); 58900cc10feSVijay Mahadevan } 59000cc10feSVijay Mahadevan 59100cc10feSVijay Mahadevan 5924920ab11SVijay Mahadevan /*@ 5934920ab11SVijay Mahadevan DMMoabGetDimension - Get the dimension of the DM Mesh 5944920ab11SVijay Mahadevan 5954920ab11SVijay Mahadevan Collective on MPI_Comm 5964920ab11SVijay Mahadevan 5974920ab11SVijay Mahadevan Input Parameter: 598340f3b9aSVijay Mahadevan . dm - The DMMoab object 5994920ab11SVijay Mahadevan 6004920ab11SVijay Mahadevan Output Parameter: 6014920ab11SVijay Mahadevan . dim - The dimension of DM 6024920ab11SVijay Mahadevan 6034920ab11SVijay Mahadevan Level: beginner 6044920ab11SVijay Mahadevan 6054920ab11SVijay Mahadevan .keywords: DMMoab, create 6064920ab11SVijay Mahadevan @*/ 6074920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm, PetscInt *dim) 6084920ab11SVijay Mahadevan { 6094920ab11SVijay Mahadevan PetscFunctionBegin; 6104920ab11SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 6114920ab11SVijay Mahadevan *dim = ((DM_Moab*)dm->data)->dim; 6124920ab11SVijay Mahadevan PetscFunctionReturn(0); 6134920ab11SVijay Mahadevan } 6144920ab11SVijay Mahadevan 6154920ab11SVijay Mahadevan 616755f3dfbSVijay Mahadevan /*@ 617755f3dfbSVijay Mahadevan DMMoabGetHierarchyLevel - Get the current level of the mesh hierarchy 618755f3dfbSVijay Mahadevan generated through uniform refinement. 619755f3dfbSVijay Mahadevan 620755f3dfbSVijay Mahadevan Collective on DM 621755f3dfbSVijay Mahadevan 622755f3dfbSVijay Mahadevan Input Parameter: 623755f3dfbSVijay Mahadevan . dm - The DMMoab object being set 624755f3dfbSVijay Mahadevan 625755f3dfbSVijay Mahadevan Output Parameter: 626755f3dfbSVijay Mahadevan . nvg - The current mesh hierarchy level 627755f3dfbSVijay Mahadevan 628755f3dfbSVijay Mahadevan Level: beginner 629755f3dfbSVijay Mahadevan 630755f3dfbSVijay Mahadevan .keywords: DMMoab, multigrid 631755f3dfbSVijay Mahadevan @*/ 632755f3dfbSVijay Mahadevan PetscErrorCode DMMoabGetHierarchyLevel(DM dm, PetscInt *nlevel) 633755f3dfbSVijay Mahadevan { 634755f3dfbSVijay Mahadevan PetscFunctionBegin; 635755f3dfbSVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 636755f3dfbSVijay Mahadevan if (nlevel) *nlevel = ((DM_Moab*)dm->data)->hlevel; 637755f3dfbSVijay Mahadevan PetscFunctionReturn(0); 638755f3dfbSVijay Mahadevan } 639755f3dfbSVijay Mahadevan 640755f3dfbSVijay Mahadevan 641340f3b9aSVijay Mahadevan /*@ 642340f3b9aSVijay Mahadevan DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh 643340f3b9aSVijay Mahadevan 644340f3b9aSVijay Mahadevan Collective on MPI_Comm 645340f3b9aSVijay Mahadevan 646340f3b9aSVijay Mahadevan Input Parameter: 647*a2b725a8SWilliam Gropp + dm - The DMMoab object 648*a2b725a8SWilliam Gropp - ehandle - The element entity handle 649340f3b9aSVijay Mahadevan 650340f3b9aSVijay Mahadevan Output Parameter: 651340f3b9aSVijay Mahadevan . mat - The material ID for the current entity 652340f3b9aSVijay Mahadevan 653340f3b9aSVijay Mahadevan Level: beginner 654340f3b9aSVijay Mahadevan 655340f3b9aSVijay Mahadevan .keywords: DMMoab, create 656340f3b9aSVijay Mahadevan @*/ 657340f3b9aSVijay Mahadevan PetscErrorCode DMMoabGetMaterialBlock(DM dm, const moab::EntityHandle ehandle, PetscInt *mat) 658340f3b9aSVijay Mahadevan { 659340f3b9aSVijay Mahadevan DM_Moab *dmmoab; 660340f3b9aSVijay Mahadevan 661340f3b9aSVijay Mahadevan PetscFunctionBegin; 662340f3b9aSVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 663340f3b9aSVijay Mahadevan if (*mat) { 664340f3b9aSVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 665a044f6b6SVijay Mahadevan *mat = dmmoab->materials[dmmoab->elocal->index(ehandle)]; 666340f3b9aSVijay Mahadevan } 667340f3b9aSVijay Mahadevan PetscFunctionReturn(0); 668340f3b9aSVijay Mahadevan } 669340f3b9aSVijay Mahadevan 6704920ab11SVijay Mahadevan 67185d305f5SVijay Mahadevan /*@ 67285d305f5SVijay Mahadevan DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities 67385d305f5SVijay Mahadevan 67485d305f5SVijay Mahadevan Collective on MPI_Comm 67585d305f5SVijay Mahadevan 67685d305f5SVijay Mahadevan Input Parameter: 677*a2b725a8SWilliam Gropp + dm - The DMMoab object 67885d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 679*a2b725a8SWilliam Gropp - conn - The vertex entity handles 68085d305f5SVijay Mahadevan 68185d305f5SVijay Mahadevan Output Parameter: 68285d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities 68385d305f5SVijay Mahadevan 68485d305f5SVijay Mahadevan Level: beginner 68585d305f5SVijay Mahadevan 68685d305f5SVijay Mahadevan .seealso: DMMoabGetVertexConnectivity() 68785d305f5SVijay Mahadevan @*/ 688cade3ad9SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm, PetscInt nconn, const moab::EntityHandle *conn, PetscReal *vpos) 6897023aa44SVijay Mahadevan { 6907023aa44SVijay Mahadevan DM_Moab *dmmoab; 6917023aa44SVijay Mahadevan moab::ErrorCode merr; 6927023aa44SVijay Mahadevan 6937023aa44SVijay Mahadevan PetscFunctionBegin; 6947023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 6957023aa44SVijay Mahadevan PetscValidPointer(conn, 3); 6969c368985SVijay Mahadevan PetscValidPointer(vpos, 4); 6977023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6987023aa44SVijay Mahadevan 6997023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 7009c368985SVijay Mahadevan if (dmmoab->hlevel) { 7019c368985SVijay Mahadevan merr = dmmoab->hierarchy->get_coordinates(const_cast<moab::EntityHandle*>(conn), nconn, dmmoab->hlevel, vpos);MBERRNM(merr); 7029c368985SVijay Mahadevan } 7039c368985SVijay Mahadevan else { 7047023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr); 7059c368985SVijay Mahadevan } 7067023aa44SVijay Mahadevan PetscFunctionReturn(0); 7077023aa44SVijay Mahadevan } 7087023aa44SVijay Mahadevan 7097023aa44SVijay Mahadevan 71085d305f5SVijay Mahadevan /*@ 71185d305f5SVijay Mahadevan DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity 71285d305f5SVijay Mahadevan 71385d305f5SVijay Mahadevan Collective on MPI_Comm 71485d305f5SVijay Mahadevan 71585d305f5SVijay Mahadevan Input Parameter: 716*a2b725a8SWilliam Gropp + dm - The DMMoab object 717*a2b725a8SWilliam Gropp - vhandle - Vertex entity handle 71885d305f5SVijay Mahadevan 71985d305f5SVijay Mahadevan Output Parameter: 720*a2b725a8SWilliam Gropp + nconn - Number of entities whose coordinates are needed 721*a2b725a8SWilliam Gropp - conn - The vertex entity handles 72285d305f5SVijay Mahadevan 72385d305f5SVijay Mahadevan Level: beginner 72485d305f5SVijay Mahadevan 72585d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabRestoreVertexConnectivity() 72685d305f5SVijay Mahadevan @*/ 72785d305f5SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm, moab::EntityHandle vhandle, PetscInt* nconn, moab::EntityHandle **conn) 7288d8d51c8SVijay Mahadevan { 7298d8d51c8SVijay Mahadevan DM_Moab *dmmoab; 7308d8d51c8SVijay Mahadevan std::vector<moab::EntityHandle> adj_entities, connect; 7318d8d51c8SVijay Mahadevan PetscErrorCode ierr; 7328d8d51c8SVijay Mahadevan moab::ErrorCode merr; 7338d8d51c8SVijay Mahadevan 7348d8d51c8SVijay Mahadevan PetscFunctionBegin; 7358d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 7368d8d51c8SVijay Mahadevan PetscValidPointer(conn, 4); 7378d8d51c8SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7388d8d51c8SVijay Mahadevan 7398d8d51c8SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 74085d305f5SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION); MBERRNM(merr); 7418d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(&adj_entities[0], adj_entities.size(), connect); MBERRNM(merr); 7428d8d51c8SVijay Mahadevan 7438d8d51c8SVijay Mahadevan if (conn) { 7448d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(moab::EntityHandle) * connect.size(), conn);CHKERRQ(ierr); 7458d8d51c8SVijay Mahadevan ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle) * connect.size());CHKERRQ(ierr); 7468d8d51c8SVijay Mahadevan } 7478d8d51c8SVijay Mahadevan if (nconn) *nconn = connect.size(); 7488d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 7498d8d51c8SVijay Mahadevan } 7508d8d51c8SVijay Mahadevan 7518d8d51c8SVijay Mahadevan 75285d305f5SVijay Mahadevan /*@ 75385d305f5SVijay Mahadevan DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity 75485d305f5SVijay Mahadevan 75585d305f5SVijay Mahadevan Collective on MPI_Comm 75685d305f5SVijay Mahadevan 75785d305f5SVijay Mahadevan Input Parameter: 758*a2b725a8SWilliam Gropp + dm - The DMMoab object 75985d305f5SVijay Mahadevan . vhandle - Vertex entity handle 76085d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 761*a2b725a8SWilliam Gropp - conn - The vertex entity handles 76285d305f5SVijay Mahadevan 76385d305f5SVijay Mahadevan Level: beginner 76485d305f5SVijay Mahadevan 76585d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity() 76685d305f5SVijay Mahadevan @*/ 7678d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt* nconn, moab::EntityHandle **conn) 7688d8d51c8SVijay Mahadevan { 7698d8d51c8SVijay Mahadevan PetscErrorCode ierr; 7708d8d51c8SVijay Mahadevan 7718d8d51c8SVijay Mahadevan PetscFunctionBegin; 7728d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 7738d8d51c8SVijay Mahadevan PetscValidPointer(conn, 4); 7748d8d51c8SVijay Mahadevan 7758d8d51c8SVijay Mahadevan if (conn) { 7768d8d51c8SVijay Mahadevan ierr = PetscFree(*conn);CHKERRQ(ierr); 7778d8d51c8SVijay Mahadevan } 7788d8d51c8SVijay Mahadevan if (nconn) *nconn = 0; 7798d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 7808d8d51c8SVijay Mahadevan } 7818d8d51c8SVijay Mahadevan 7828d8d51c8SVijay Mahadevan 78385d305f5SVijay Mahadevan /*@ 78485d305f5SVijay Mahadevan DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity 78585d305f5SVijay Mahadevan 78685d305f5SVijay Mahadevan Collective on MPI_Comm 78785d305f5SVijay Mahadevan 78885d305f5SVijay Mahadevan Input Parameter: 789*a2b725a8SWilliam Gropp + dm - The DMMoab object 790*a2b725a8SWilliam Gropp - ehandle - Vertex entity handle 79185d305f5SVijay Mahadevan 79285d305f5SVijay Mahadevan Output Parameter: 793*a2b725a8SWilliam Gropp + nconn - Number of entities whose coordinates are needed 794*a2b725a8SWilliam Gropp - conn - The vertex entity handles 79585d305f5SVijay Mahadevan 79685d305f5SVijay Mahadevan Level: beginner 79785d305f5SVijay Mahadevan 79885d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity(), DMMoabRestoreVertexConnectivity() 79985d305f5SVijay Mahadevan @*/ 8007023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt* nconn, const moab::EntityHandle **conn) 8017023aa44SVijay Mahadevan { 8027023aa44SVijay Mahadevan DM_Moab *dmmoab; 8037023aa44SVijay Mahadevan const moab::EntityHandle *connect; 8049c368985SVijay Mahadevan std::vector<moab::EntityHandle> vconn; 8057023aa44SVijay Mahadevan moab::ErrorCode merr; 8067023aa44SVijay Mahadevan PetscInt nnodes; 8077023aa44SVijay Mahadevan 8087023aa44SVijay Mahadevan PetscFunctionBegin; 8097023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 8107023aa44SVijay Mahadevan PetscValidPointer(conn, 4); 8117023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8127023aa44SVijay Mahadevan 8137023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 8147023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes); MBERRNM(merr); 8157023aa44SVijay Mahadevan if (conn) *conn = connect; 8167023aa44SVijay Mahadevan if (nconn) *nconn = nnodes; 8177023aa44SVijay Mahadevan PetscFunctionReturn(0); 8187023aa44SVijay Mahadevan } 8197023aa44SVijay Mahadevan 8207023aa44SVijay Mahadevan 82185d305f5SVijay Mahadevan /*@ 82285d305f5SVijay Mahadevan DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element) 82385d305f5SVijay Mahadevan 82485d305f5SVijay Mahadevan Collective on MPI_Comm 82585d305f5SVijay Mahadevan 82685d305f5SVijay Mahadevan Input Parameter: 827*a2b725a8SWilliam Gropp + dm - The DMMoab object 828*a2b725a8SWilliam Gropp - ent - Entity handle 82985d305f5SVijay Mahadevan 83085d305f5SVijay Mahadevan Output Parameter: 83185d305f5SVijay Mahadevan . ent_on_boundary - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise 83285d305f5SVijay Mahadevan 83385d305f5SVijay Mahadevan Level: beginner 83485d305f5SVijay Mahadevan 83585d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices() 83685d305f5SVijay Mahadevan @*/ 83769263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm, const moab::EntityHandle ent, PetscBool* ent_on_boundary) 83869263071SVijay Mahadevan { 83969263071SVijay Mahadevan moab::EntityType etype; 84069263071SVijay Mahadevan DM_Moab *dmmoab; 84169263071SVijay Mahadevan PetscInt edim; 84269263071SVijay Mahadevan 84369263071SVijay Mahadevan PetscFunctionBegin; 84469263071SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 84569263071SVijay Mahadevan PetscValidPointer(ent_on_boundary, 3); 84669263071SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 84769263071SVijay Mahadevan 84869263071SVijay Mahadevan /* get the entity type and handle accordingly */ 84969263071SVijay Mahadevan etype = dmmoab->mbiface->type_from_handle(ent); 85069263071SVijay Mahadevan if (etype >= moab::MBPOLYHEDRON) SETERRQ1(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Entity type on the boundary skin is invalid. EntityType = %D\n", etype); 85169263071SVijay Mahadevan 85269263071SVijay Mahadevan /* get the entity dimension */ 85369263071SVijay Mahadevan edim = dmmoab->mbiface->dimension_from_handle(ent); 85469263071SVijay Mahadevan 85569263071SVijay Mahadevan *ent_on_boundary = PETSC_FALSE; 85669263071SVijay Mahadevan if (etype == moab::MBVERTEX && edim == 0) { 85749d66b22SVijay Mahadevan *ent_on_boundary = ((dmmoab->bndyvtx->index(ent) >= 0) ? PETSC_TRUE : PETSC_FALSE); 85869263071SVijay Mahadevan } 85969263071SVijay Mahadevan else { 86069263071SVijay Mahadevan if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */ 8616d9eb265SVijay Mahadevan if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE; 86269263071SVijay Mahadevan } 86369263071SVijay Mahadevan else { /* next check the lower-dimensional faces */ 8646d9eb265SVijay Mahadevan if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE; 86569263071SVijay Mahadevan } 86669263071SVijay Mahadevan } 86769263071SVijay Mahadevan PetscFunctionReturn(0); 86869263071SVijay Mahadevan } 86969263071SVijay Mahadevan 87069263071SVijay Mahadevan 87185d305f5SVijay Mahadevan /*@ 87285d305f5SVijay Mahadevan DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element) 87385d305f5SVijay Mahadevan 87485d305f5SVijay Mahadevan Input Parameter: 875*a2b725a8SWilliam Gropp + dm - The DMMoab object 87685d305f5SVijay Mahadevan . nconn - Number of handles 877*a2b725a8SWilliam Gropp - cnt - Array of entity handles 87885d305f5SVijay Mahadevan 87985d305f5SVijay Mahadevan Output Parameter: 88085d305f5SVijay Mahadevan . isbdvtx - Array of boundary markers - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise 88185d305f5SVijay Mahadevan 88285d305f5SVijay Mahadevan Level: beginner 88385d305f5SVijay Mahadevan 88485d305f5SVijay Mahadevan .seealso: DMMoabIsEntityOnBoundary() 88585d305f5SVijay Mahadevan @*/ 88669263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm, PetscInt nconn, const moab::EntityHandle *cnt, PetscBool* isbdvtx) 8877023aa44SVijay Mahadevan { 8887023aa44SVijay Mahadevan DM_Moab *dmmoab; 8897023aa44SVijay Mahadevan PetscInt i; 8907023aa44SVijay Mahadevan 8917023aa44SVijay Mahadevan PetscFunctionBegin; 8927023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 8937023aa44SVijay Mahadevan PetscValidPointer(cnt, 3); 8947023aa44SVijay Mahadevan PetscValidPointer(isbdvtx, 4); 8957023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8967023aa44SVijay Mahadevan 8977023aa44SVijay Mahadevan for (i = 0; i < nconn; ++i) { 8986d9eb265SVijay Mahadevan isbdvtx[i] = (dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE : PETSC_FALSE); 8997023aa44SVijay Mahadevan } 9007023aa44SVijay Mahadevan PetscFunctionReturn(0); 9017023aa44SVijay Mahadevan } 9027023aa44SVijay Mahadevan 9037023aa44SVijay Mahadevan 90485d305f5SVijay Mahadevan /*@ 90585d305f5SVijay Mahadevan DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary 90685d305f5SVijay Mahadevan 90785d305f5SVijay Mahadevan Input Parameter: 90885d305f5SVijay Mahadevan . dm - The DMMoab object 90985d305f5SVijay Mahadevan 91085d305f5SVijay Mahadevan Output Parameter: 911*a2b725a8SWilliam Gropp + bdvtx - Boundary vertices 91285d305f5SVijay Mahadevan . bdelems - Boundary elements 913*a2b725a8SWilliam Gropp - bdfaces - Boundary faces 91485d305f5SVijay Mahadevan 91585d305f5SVijay Mahadevan Level: beginner 91685d305f5SVijay Mahadevan 91785d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices(), DMMoabIsEntityOnBoundary() 91885d305f5SVijay Mahadevan @*/ 9196d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm, const moab::Range **bdvtx, const moab::Range** bdelems, const moab::Range** bdfaces) 9201cec0304SVijay Mahadevan { 9211cec0304SVijay Mahadevan DM_Moab *dmmoab; 9221cec0304SVijay Mahadevan 9231cec0304SVijay Mahadevan PetscFunctionBegin; 9241cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 9251cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 9261cec0304SVijay Mahadevan 9276d9eb265SVijay Mahadevan if (bdvtx) *bdvtx = dmmoab->bndyvtx; 9286d9eb265SVijay Mahadevan if (bdfaces) *bdfaces = dmmoab->bndyfaces; 9296d9eb265SVijay Mahadevan if (bdelems) *bdfaces = dmmoab->bndyelems; 9301cec0304SVijay Mahadevan PetscFunctionReturn(0); 9311cec0304SVijay Mahadevan } 9321cec0304SVijay Mahadevan 933f6829af0SVijay Mahadevan 934f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm) 935f6829af0SVijay Mahadevan { 936f6829af0SVijay Mahadevan PetscErrorCode ierr; 93785d305f5SVijay Mahadevan PetscInt i; 938e882eb38SVijay Mahadevan moab::ErrorCode merr; 939f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 940f6829af0SVijay Mahadevan 941f6829af0SVijay Mahadevan PetscFunctionBegin; 942f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 943304006b3SVijay Mahadevan 944304006b3SVijay Mahadevan dmmoab->refct--; 945304006b3SVijay Mahadevan if (!dmmoab->refct) { 946f6829af0SVijay Mahadevan delete dmmoab->vlocal; 947f6829af0SVijay Mahadevan delete dmmoab->vowned; 948f6829af0SVijay Mahadevan delete dmmoab->vghost; 949f6829af0SVijay Mahadevan delete dmmoab->elocal; 950f6829af0SVijay Mahadevan delete dmmoab->eghost; 951f6829af0SVijay Mahadevan delete dmmoab->bndyvtx; 952f6829af0SVijay Mahadevan delete dmmoab->bndyfaces; 953f6829af0SVijay Mahadevan delete dmmoab->bndyelems; 954f6829af0SVijay Mahadevan 955f6829af0SVijay Mahadevan ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr); 9567ae5e5b6SVijay Mahadevan ierr = PetscFree2(dmmoab->gidmap, dmmoab->lidmap);CHKERRQ(ierr); 9575905e1eaSVijay Mahadevan ierr = PetscFree(dmmoab->dfill);CHKERRQ(ierr); 9585905e1eaSVijay Mahadevan ierr = PetscFree(dmmoab->ofill);CHKERRQ(ierr); 9599c368985SVijay Mahadevan ierr = PetscFree(dmmoab->materials);CHKERRQ(ierr); 96085d305f5SVijay Mahadevan if (dmmoab->fieldNames) { 96185d305f5SVijay Mahadevan for (i = 0; i < dmmoab->numFields; i++) { 96285d305f5SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr); 96385d305f5SVijay Mahadevan } 96485d305f5SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr); 96585d305f5SVijay Mahadevan } 966b117cd09SVijay Mahadevan 967b117cd09SVijay Mahadevan if (dmmoab->nhlevels) { 968b117cd09SVijay Mahadevan ierr = PetscFree(dmmoab->hsets);CHKERRQ(ierr); 969e882eb38SVijay Mahadevan dmmoab->nhlevels = 0; 970e882eb38SVijay Mahadevan if (!dmmoab->hlevel && dmmoab->icreatedinstance) delete dmmoab->hierarchy; 971e882eb38SVijay Mahadevan dmmoab->hierarchy = NULL; 972b117cd09SVijay Mahadevan } 973e882eb38SVijay Mahadevan 974e882eb38SVijay Mahadevan if (dmmoab->icreatedinstance) { 9759c368985SVijay Mahadevan delete dmmoab->pcomm; 976e882eb38SVijay Mahadevan merr = dmmoab->mbiface->delete_mesh(); MBERRNM(merr); 977e882eb38SVijay Mahadevan delete dmmoab->mbiface; 978e882eb38SVijay Mahadevan } 979e882eb38SVijay Mahadevan dmmoab->mbiface = NULL; 9809daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 981e882eb38SVijay Mahadevan dmmoab->pcomm = NULL; 9829daf19fdSVijay Mahadevan #endif 983f6829af0SVijay Mahadevan ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 984f6829af0SVijay Mahadevan ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr); 985f6829af0SVijay Mahadevan ierr = PetscFree(dm->data);CHKERRQ(ierr); 986304006b3SVijay Mahadevan } 987f6829af0SVijay Mahadevan PetscFunctionReturn(0); 988f6829af0SVijay Mahadevan } 989f6829af0SVijay Mahadevan 990f6829af0SVijay Mahadevan 9914416b707SBarry Smith PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(PetscOptionItems *PetscOptionsObject, DM dm) 9922e4e7c01SVijay Mahadevan { 9932e4e7c01SVijay Mahadevan PetscErrorCode ierr; 9942e4e7c01SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 9952e4e7c01SVijay Mahadevan 9962e4e7c01SVijay Mahadevan PetscFunctionBegin; 9972e4e7c01SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 998cc310fddSBarry Smith ierr = PetscOptionsHead(PetscOptionsObject, "DMMoab Options");CHKERRQ(ierr); 9992e4e7c01SVijay Mahadevan ierr = PetscOptionsInt("-dm_moab_rw_dbg", "The verbosity level for reading and writing MOAB meshes", "DMView", dmmoab->rw_dbglevel, &dmmoab->rw_dbglevel, NULL);CHKERRQ(ierr); 10002e4e7c01SVijay Mahadevan ierr = PetscOptionsBool("-dm_moab_partiton_by_rank", "Use partition by rank when reading MOAB meshes from file", "DMView", dmmoab->partition_by_rank, &dmmoab->partition_by_rank, NULL);CHKERRQ(ierr); 10012e4e7c01SVijay Mahadevan /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */ 10022e4e7c01SVijay Mahadevan ierr = PetscOptionsString("-dm_moab_read_opts", "Extra options to enable MOAB reader to load DM from file", "DMView", dmmoab->extra_read_options, dmmoab->extra_read_options, PETSC_MAX_PATH_LEN, NULL);CHKERRQ(ierr); 10032e4e7c01SVijay Mahadevan ierr = PetscOptionsString("-dm_moab_write_opts", "Extra options to enable MOAB writer to serialize DM to file", "DMView", dmmoab->extra_write_options, dmmoab->extra_write_options, PETSC_MAX_PATH_LEN, NULL);CHKERRQ(ierr); 10042e4e7c01SVijay Mahadevan ierr = PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum*)&dmmoab->read_mode, NULL);CHKERRQ(ierr); 10052e4e7c01SVijay Mahadevan ierr = PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum*)&dmmoab->write_mode, NULL);CHKERRQ(ierr); 10062e4e7c01SVijay Mahadevan PetscFunctionReturn(0); 10072e4e7c01SVijay Mahadevan } 10082e4e7c01SVijay Mahadevan 10092e4e7c01SVijay Mahadevan 1010f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm) 1011f6829af0SVijay Mahadevan { 1012f6829af0SVijay Mahadevan PetscErrorCode ierr; 1013f6829af0SVijay Mahadevan moab::ErrorCode merr; 1014f6829af0SVijay Mahadevan Vec local, global; 1015f6829af0SVijay Mahadevan IS from, to; 1016f6829af0SVijay Mahadevan moab::Range::iterator iter; 1017304006b3SVijay Mahadevan PetscInt i, j, f, bs, vent, totsize, *lgmap; 1018f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 1019f6829af0SVijay Mahadevan moab::Range adjs; 1020f6829af0SVijay Mahadevan 1021f6829af0SVijay Mahadevan PetscFunctionBegin; 1022f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1023f6829af0SVijay Mahadevan /* Get the local and shared vertices and cache it */ 10249daf19fdSVijay Mahadevan if (dmmoab->mbiface == NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface before calling SetUp."); 10259daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 10269daf19fdSVijay Mahadevan if (dmmoab->pcomm == NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB ParallelComm object before calling SetUp."); 10279daf19fdSVijay Mahadevan #endif 1028f6829af0SVijay Mahadevan 1029f6829af0SVijay Mahadevan /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */ 1030f6829af0SVijay Mahadevan if (dmmoab->vlocal->empty()) 1031f6829af0SVijay Mahadevan { 103249d66b22SVijay Mahadevan //merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr); 103349d66b22SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, 0, *dmmoab->vlocal, false); MBERRNM(merr); 1034f6829af0SVijay Mahadevan 10359daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1036f6829af0SVijay Mahadevan /* filter based on parallel status */ 1037f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned); MBERRNM(merr); 1038f6829af0SVijay Mahadevan 1039f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 10409c368985SVijay Mahadevan // *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 1041f6829af0SVijay Mahadevan adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 104264e1c140SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(adjs, PSTATUS_GHOST | PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost); MBERRNM(merr); 1043f6829af0SVijay Mahadevan adjs = moab::subtract(adjs, *dmmoab->vghost); 1044f6829af0SVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs); 10459daf19fdSVijay Mahadevan #else 10469daf19fdSVijay Mahadevan *dmmoab->vowned = *dmmoab->vlocal; 10479daf19fdSVijay Mahadevan #endif 1048f6829af0SVijay Mahadevan 1049f6829af0SVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 1050f6829af0SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 1051f6829af0SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 105249d66b22SVijay Mahadevan 10539daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1054b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 105549d66b22SVijay Mahadevan PetscInfo4(NULL, "Filset ID: %u, Vertices: local - %D, owned - %D, ghosted - %D.\n", dmmoab->fileset, dmmoab->vlocal->size(), dmmoab->nloc, dmmoab->nghost); 10569daf19fdSVijay Mahadevan #else 10579daf19fdSVijay Mahadevan dmmoab->n = dmmoab->nloc; 10589daf19fdSVijay Mahadevan #endif 1059f6829af0SVijay Mahadevan } 1060f6829af0SVijay Mahadevan 1061f6829af0SVijay Mahadevan { 1062f6829af0SVijay Mahadevan /* get the information about the local elements in the mesh */ 1063f6829af0SVijay Mahadevan dmmoab->eghost->clear(); 1064f6829af0SVijay Mahadevan 1065f6829af0SVijay Mahadevan /* first decipher the leading dimension */ 1066f6829af0SVijay Mahadevan for (i = 3; i > 0; i--) { 1067f6829af0SVijay Mahadevan dmmoab->elocal->clear(); 106849d66b22SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, false); MBERRNM(merr); 1069f6829af0SVijay Mahadevan 1070f6829af0SVijay Mahadevan /* store the current mesh dimension */ 1071f6829af0SVijay Mahadevan if (dmmoab->elocal->size()) { 1072f6829af0SVijay Mahadevan dmmoab->dim = i; 1073f6829af0SVijay Mahadevan break; 1074f6829af0SVijay Mahadevan } 1075f6829af0SVijay Mahadevan } 1076f6829af0SVijay Mahadevan 1077b117cd09SVijay Mahadevan ierr = DMSetDimension(dm, dmmoab->dim);CHKERRQ(ierr); 1078b117cd09SVijay Mahadevan 10799daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1080f6829af0SVijay Mahadevan /* filter the ghosted and owned element list */ 1081f6829af0SVijay Mahadevan *dmmoab->eghost = *dmmoab->elocal; 1082f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr); 1083f6829af0SVijay Mahadevan *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal); 10849daf19fdSVijay Mahadevan #endif 1085f6829af0SVijay Mahadevan 1086f6829af0SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 1087f6829af0SVijay Mahadevan dmmoab->neleghost = dmmoab->eghost->size(); 108849d66b22SVijay Mahadevan 10899daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1090b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 109149d66b22SVijay Mahadevan PetscInfo3(NULL, "%d-dim elements: owned - %D, ghosted - %D.\n", dmmoab->dim, dmmoab->neleloc, dmmoab->neleghost); 10929daf19fdSVijay Mahadevan #else 10939daf19fdSVijay Mahadevan dmmoab->nele = dmmoab->neleloc; 10949daf19fdSVijay Mahadevan #endif 1095f6829af0SVijay Mahadevan } 1096f6829af0SVijay Mahadevan 1097f6829af0SVijay Mahadevan bs = dmmoab->bs; 1098f6829af0SVijay Mahadevan if (!dmmoab->ltog_tag) { 1099f6829af0SVijay Mahadevan /* Get the global ID tag. The global ID tag is applied to each 1100f6829af0SVijay Mahadevan vertex. It acts as an global identifier which MOAB uses to 1101f6829af0SVijay Mahadevan assemble the individual pieces of the mesh */ 1102f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag); MBERRNM(merr); 1103f6829af0SVijay Mahadevan } 1104f6829af0SVijay Mahadevan 1105f6829af0SVijay Mahadevan totsize = dmmoab->vlocal->size(); 110649d66b22SVijay Mahadevan if (totsize != dmmoab->nloc + dmmoab->nghost) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Mismatch between local and owned+ghost vertices. %D != %D.", totsize, dmmoab->nloc + dmmoab->nghost); 110749d66b22SVijay Mahadevan ierr = PetscCalloc1(totsize, &dmmoab->gsindices);CHKERRQ(ierr); 1108f6829af0SVijay Mahadevan { 1109f6829af0SVijay Mahadevan /* first get the local indices */ 1110f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vowned, &dmmoab->gsindices[0]); MBERRNM(merr); 11113f1c6e43SVijay Mahadevan if (dmmoab->nghost) { /* next get the ghosted indices */ 1112f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vghost, &dmmoab->gsindices[dmmoab->nloc]); MBERRNM(merr); 1113f6829af0SVijay Mahadevan } 1114f6829af0SVijay Mahadevan 1115f6829af0SVijay Mahadevan /* find out the local and global minima of GLOBAL_ID */ 1116304006b3SVijay Mahadevan dmmoab->lminmax[0] = dmmoab->lminmax[1] = dmmoab->gsindices[0]; 1117f6829af0SVijay Mahadevan for (i = 0; i < totsize; ++i) { 1118304006b3SVijay Mahadevan if (dmmoab->lminmax[0] > dmmoab->gsindices[i]) dmmoab->lminmax[0] = dmmoab->gsindices[i]; 1119304006b3SVijay Mahadevan if (dmmoab->lminmax[1] < dmmoab->gsindices[i]) dmmoab->lminmax[1] = dmmoab->gsindices[i]; 1120f6829af0SVijay Mahadevan } 1121f6829af0SVijay Mahadevan 1122304006b3SVijay Mahadevan ierr = MPIU_Allreduce(&dmmoab->lminmax[0], &dmmoab->gminmax[0], 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr); 1123304006b3SVijay Mahadevan ierr = MPIU_Allreduce(&dmmoab->lminmax[1], &dmmoab->gminmax[1], 1, MPI_INT, MPI_MAX, ((PetscObject)dm)->comm);CHKERRQ(ierr); 1124f6829af0SVijay Mahadevan 1125f6829af0SVijay Mahadevan /* set the GID map */ 1126f6829af0SVijay Mahadevan for (i = 0; i < totsize; ++i) { 1127304006b3SVijay Mahadevan dmmoab->gsindices[i] -= dmmoab->gminmax[0]; /* zero based index needed for IS */ 11289c368985SVijay Mahadevan 1129f6829af0SVijay Mahadevan } 1130304006b3SVijay Mahadevan dmmoab->lminmax[0] -= dmmoab->gminmax[0]; 1131304006b3SVijay Mahadevan dmmoab->lminmax[1] -= dmmoab->gminmax[0]; 1132f6829af0SVijay Mahadevan 1133304006b3SVijay Mahadevan PetscInfo4(NULL, "GLOBAL_ID: Local [min, max] - [%D, %D], Global [min, max] - [%D, %D]\n", dmmoab->lminmax[0], dmmoab->lminmax[1], dmmoab->gminmax[0], dmmoab->gminmax[1]); 1134f6829af0SVijay Mahadevan } 113582dfd14aSVijay Mahadevan if (!(dmmoab->bs == dmmoab->numFields || dmmoab->bs == 1)) SETERRQ3(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Mismatch between block size and number of component fields. %D != 1 OR %D != %D.", dmmoab->bs, dmmoab->bs, dmmoab->numFields); 1136f6829af0SVijay Mahadevan 1137f6829af0SVijay Mahadevan { 11389c368985SVijay Mahadevan dmmoab->seqstart = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->front()); 11399c368985SVijay Mahadevan dmmoab->seqend = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->back()); 1140304006b3SVijay Mahadevan PetscInfo2(NULL, "SEQUENCE: Local [min, max] - [%D, %D]\n", dmmoab->seqstart, dmmoab->seqend); 11413f1c6e43SVijay Mahadevan 114249d66b22SVijay Mahadevan ierr = PetscMalloc2(dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->gidmap, dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->lidmap);CHKERRQ(ierr); 11433f1c6e43SVijay Mahadevan ierr = PetscMalloc1(totsize * dmmoab->numFields, &lgmap);CHKERRQ(ierr); 1144f6829af0SVijay Mahadevan 1145f6829af0SVijay Mahadevan i = j = 0; 1146f6829af0SVijay Mahadevan /* set the owned vertex data first */ 1147f6829af0SVijay Mahadevan for (moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++, i++) { 1148e92d1c7cSVijay Mahadevan vent = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart; 1149f6829af0SVijay Mahadevan dmmoab->gidmap[vent] = dmmoab->gsindices[i]; 1150f6829af0SVijay Mahadevan dmmoab->lidmap[vent] = i; 1151f6829af0SVijay Mahadevan for (f = 0; f < dmmoab->numFields; f++, j++) { 11523f1c6e43SVijay Mahadevan lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]); 1153f6829af0SVijay Mahadevan } 1154f6829af0SVijay Mahadevan } 1155f6829af0SVijay Mahadevan /* next arrange all the ghosted data information */ 1156f6829af0SVijay Mahadevan for (moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++, i++) { 1157e92d1c7cSVijay Mahadevan vent = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart; 1158f6829af0SVijay Mahadevan dmmoab->gidmap[vent] = dmmoab->gsindices[i]; 1159f6829af0SVijay Mahadevan dmmoab->lidmap[vent] = i; 1160f6829af0SVijay Mahadevan for (f = 0; f < dmmoab->numFields; f++, j++) { 11613f1c6e43SVijay Mahadevan lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]); 1162f6829af0SVijay Mahadevan } 1163f6829af0SVijay Mahadevan } 1164f6829af0SVijay Mahadevan 1165f6829af0SVijay Mahadevan /* We need to create the Global to Local Vector Scatter Contexts 1166f6829af0SVijay Mahadevan 1) First create a local and global vector 1167f6829af0SVijay Mahadevan 2) Create a local and global IS 1168f6829af0SVijay Mahadevan 3) Create VecScatter and LtoGMapping objects 1169f6829af0SVijay Mahadevan 4) Cleanup the IS and Vec objects 1170f6829af0SVijay Mahadevan */ 1171f6829af0SVijay Mahadevan ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr); 1172f6829af0SVijay Mahadevan ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr); 1173f6829af0SVijay Mahadevan 1174f6829af0SVijay Mahadevan ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr); 1175f6829af0SVijay Mahadevan 1176f6829af0SVijay Mahadevan /* global to local must retrieve ghost points */ 1177f6829af0SVijay Mahadevan ierr = ISCreateStride(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, dmmoab->vstart, 1, &from);CHKERRQ(ierr); 1178f6829af0SVijay Mahadevan ierr = ISSetBlockSize(from, bs);CHKERRQ(ierr); 1179f6829af0SVijay Mahadevan 11803f1c6e43SVijay Mahadevan ierr = ISCreateGeneral(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, &lgmap[0], PETSC_COPY_VALUES, &to);CHKERRQ(ierr); 1181f6829af0SVijay Mahadevan ierr = ISSetBlockSize(to, bs);CHKERRQ(ierr); 1182f6829af0SVijay Mahadevan 1183f6829af0SVijay Mahadevan if (!dmmoab->ltog_map) { 1184f6829af0SVijay Mahadevan /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */ 11853f1c6e43SVijay Mahadevan ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm, dmmoab->bs, totsize * dmmoab->numFields, lgmap, 1186f6829af0SVijay Mahadevan PETSC_COPY_VALUES, &dmmoab->ltog_map);CHKERRQ(ierr); 1187f6829af0SVijay Mahadevan } 1188f6829af0SVijay Mahadevan 1189f6829af0SVijay Mahadevan /* now create the scatter object from local to global vector */ 11909448b7f1SJunchao Zhang ierr = VecScatterCreate(local, from, global, to, &dmmoab->ltog_sendrecv);CHKERRQ(ierr); 1191f6829af0SVijay Mahadevan 1192f6829af0SVijay Mahadevan /* clean up IS, Vec */ 11933f1c6e43SVijay Mahadevan ierr = PetscFree(lgmap);CHKERRQ(ierr); 1194f6829af0SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 1195f6829af0SVijay Mahadevan ierr = ISDestroy(&to);CHKERRQ(ierr); 1196f6829af0SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 1197f6829af0SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 1198f6829af0SVijay Mahadevan } 1199f6829af0SVijay Mahadevan 120049d66b22SVijay Mahadevan dmmoab->bndyvtx = new moab::Range(); 120149d66b22SVijay Mahadevan dmmoab->bndyfaces = new moab::Range(); 120249d66b22SVijay Mahadevan dmmoab->bndyelems = new moab::Range(); 1203f6829af0SVijay Mahadevan /* skin the boundary and store nodes */ 12049c368985SVijay Mahadevan if (!dmmoab->hlevel) { 1205f6829af0SVijay Mahadevan /* get the skin vertices of boundary faces for the current partition and then filter 1206f6829af0SVijay Mahadevan the local, boundary faces, vertices and elements alone via PSTATUS flags; 1207f6829af0SVijay Mahadevan this should not give us any ghosted boundary, but if user needs such a functionality 1208f6829af0SVijay Mahadevan it would be easy to add it based on the find_skin query below */ 1209f6829af0SVijay Mahadevan moab::Skinner skinner(dmmoab->mbiface); 1210f6829af0SVijay Mahadevan 1211f6829af0SVijay Mahadevan /* get the entities on the skin - only the faces */ 12122417220eSVijay Mahadevan merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, *dmmoab->bndyfaces, NULL, true, true, false); MBERRNM(merr); // 'false' param indicates we want faces back, not vertices 1213f6829af0SVijay Mahadevan 12149daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1215f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 1216f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr); 12172417220eSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_INTERFACE, PSTATUS_NOT); MBERRNM(merr); 12189daf19fdSVijay Mahadevan #endif 1219f6829af0SVijay Mahadevan 1220f6829af0SVijay Mahadevan /* get all the nodes via connectivity and the parent elements via adjacency information */ 1221f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false); MBERRNM(ierr); 1222755f3dfbSVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyvtx, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION); MBERRNM(ierr); 1223f6829af0SVijay Mahadevan } 12249c368985SVijay Mahadevan else { 12259c368985SVijay Mahadevan /* Let us query the hierarchy manager and get the results directly for this level */ 12269c368985SVijay Mahadevan for (moab::Range::iterator iter = dmmoab->elocal->begin(); iter != dmmoab->elocal->end(); iter++) { 12279c368985SVijay Mahadevan moab::EntityHandle elemHandle = *iter; 12289c368985SVijay Mahadevan if (dmmoab->hierarchy->is_entity_on_boundary(elemHandle)) { 12299c368985SVijay Mahadevan dmmoab->bndyelems->insert(elemHandle); 12309c368985SVijay Mahadevan /* For this boundary element, query the vertices and add them to the list */ 12319c368985SVijay Mahadevan std::vector<moab::EntityHandle> connect; 12329c368985SVijay Mahadevan merr = dmmoab->hierarchy->get_connectivity(elemHandle, dmmoab->hlevel, connect); MBERRNM(ierr); 12339c368985SVijay Mahadevan for (unsigned iv=0; iv < connect.size(); ++iv) 12349c368985SVijay Mahadevan if (dmmoab->hierarchy->is_entity_on_boundary(connect[iv])) 12359c368985SVijay Mahadevan dmmoab->bndyvtx->insert(connect[iv]); 12369c368985SVijay Mahadevan /* Next, let us query the boundary faces and add them also to the list */ 12379c368985SVijay Mahadevan std::vector<moab::EntityHandle> faces; 12389c368985SVijay Mahadevan merr = dmmoab->hierarchy->get_adjacencies(elemHandle, dmmoab->dim-1, faces); MBERRNM(ierr); 12399c368985SVijay Mahadevan for (unsigned ifa=0; ifa < faces.size(); ++ifa) 12409c368985SVijay Mahadevan if (dmmoab->hierarchy->is_entity_on_boundary(faces[ifa])) 12419c368985SVijay Mahadevan dmmoab->bndyfaces->insert(faces[ifa]); 12429c368985SVijay Mahadevan } 12439c368985SVijay Mahadevan } 12449c368985SVijay Mahadevan #ifdef MOAB_HAVE_MPI 12459c368985SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 12469c368985SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyvtx, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr); 12479c368985SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr); 12489c368985SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyelems, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr); 12499c368985SVijay Mahadevan #endif 12509c368985SVijay Mahadevan 12519c368985SVijay Mahadevan } 125249d66b22SVijay Mahadevan PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyfaces->size(), dmmoab->bndyelems->size()); 1253a044f6b6SVijay Mahadevan 1254a044f6b6SVijay Mahadevan /* Get the material sets and populate the data for all locally owned elements */ 1255a044f6b6SVijay Mahadevan { 1256a044f6b6SVijay Mahadevan ierr = PetscCalloc1(dmmoab->elocal->size(), &dmmoab->materials);CHKERRQ(ierr); 1257a044f6b6SVijay Mahadevan /* Get the count of entities of particular type from dmmoab->elocal 1258a044f6b6SVijay Mahadevan -- Then, for each non-zero type, loop through and query the fileset to get the material tag data */ 1259a044f6b6SVijay Mahadevan moab::Range msets; 1260a044f6b6SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_type_and_tag(dmmoab->fileset, moab::MBENTITYSET, &dmmoab->material_tag, NULL, 1, msets, moab::Interface::UNION);MB_CHK_ERR(merr); 1261a044f6b6SVijay Mahadevan if (msets.size() == 0) { 1262a044f6b6SVijay Mahadevan PetscInfo(NULL, "No material sets found in the fileset."); 1263a044f6b6SVijay Mahadevan } 1264a044f6b6SVijay Mahadevan 1265a044f6b6SVijay Mahadevan for (unsigned i=0; i < msets.size(); ++i) { 1266a044f6b6SVijay Mahadevan moab::Range msetelems; 1267a044f6b6SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(msets[i], dmmoab->dim, msetelems, true);MB_CHK_ERR(merr); 1268aedf4482SVijay Mahadevan #ifdef MOAB_HAVE_MPI 1269aedf4482SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 1270aedf4482SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(msetelems, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr); 1271aedf4482SVijay Mahadevan #endif 1272a044f6b6SVijay Mahadevan 1273a044f6b6SVijay Mahadevan int partID; 1274a044f6b6SVijay Mahadevan moab::EntityHandle mset=msets[i]; 1275a044f6b6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &mset, 1, &partID);MB_CHK_ERR(merr); 1276a044f6b6SVijay Mahadevan 1277a044f6b6SVijay Mahadevan for (unsigned j=0; j < msetelems.size(); ++j) 1278a044f6b6SVijay Mahadevan dmmoab->materials[dmmoab->elocal->index(msetelems[j])]=partID; 1279a044f6b6SVijay Mahadevan } 1280a044f6b6SVijay Mahadevan } 1281a044f6b6SVijay Mahadevan 1282f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1283f6829af0SVijay Mahadevan } 1284f6829af0SVijay Mahadevan 1285304006b3SVijay Mahadevan 1286304006b3SVijay Mahadevan /*@ 1287304006b3SVijay Mahadevan DMMoabCreateVertices - Creates and adds several vertices to the primary set represented by the DM. 1288304006b3SVijay Mahadevan 1289304006b3SVijay Mahadevan Collective on MPI_Comm 1290304006b3SVijay Mahadevan 1291304006b3SVijay Mahadevan Input Parameters: 1292304006b3SVijay Mahadevan + dm - The DM object 1293304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra) 1294304006b3SVijay Mahadevan . conn - The connectivity of the element 1295*a2b725a8SWilliam Gropp - nverts - The number of vertices that form the element 1296304006b3SVijay Mahadevan 1297304006b3SVijay Mahadevan Output Parameter: 1298304006b3SVijay Mahadevan . overts - The list of vertices that were created (can be NULL) 1299304006b3SVijay Mahadevan 1300304006b3SVijay Mahadevan Level: beginner 1301304006b3SVijay Mahadevan 1302304006b3SVijay Mahadevan .keywords: DM, create vertices 1303304006b3SVijay Mahadevan 1304304006b3SVijay Mahadevan .seealso: DMMoabCreateSubmesh(), DMMoabCreateElement() 1305304006b3SVijay Mahadevan @*/ 1306304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateVertices(DM dm, const PetscReal* coords, PetscInt nverts, moab::Range* overts) 1307304006b3SVijay Mahadevan { 1308304006b3SVijay Mahadevan moab::ErrorCode merr; 1309304006b3SVijay Mahadevan DM_Moab *dmmoab; 1310304006b3SVijay Mahadevan moab::Range verts; 1311304006b3SVijay Mahadevan 1312304006b3SVijay Mahadevan PetscFunctionBegin; 1313304006b3SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1314304006b3SVijay Mahadevan PetscValidPointer(coords, 2); 1315304006b3SVijay Mahadevan 1316304006b3SVijay Mahadevan dmmoab = (DM_Moab*) dm->data; 1317304006b3SVijay Mahadevan 1318304006b3SVijay Mahadevan /* Insert new points */ 1319304006b3SVijay Mahadevan merr = dmmoab->mbiface->create_vertices(&coords[0], nverts, verts); MBERRNM(merr); 1320304006b3SVijay Mahadevan merr = dmmoab->mbiface->add_entities(dmmoab->fileset, verts); MBERRNM(merr); 1321304006b3SVijay Mahadevan 1322304006b3SVijay Mahadevan if (overts) *overts = verts; 1323304006b3SVijay Mahadevan PetscFunctionReturn(0); 1324304006b3SVijay Mahadevan } 1325304006b3SVijay Mahadevan 1326304006b3SVijay Mahadevan 1327304006b3SVijay Mahadevan /*@ 1328304006b3SVijay Mahadevan DMMoabCreateElement - Adds an element of specified type to the primary set represented by the DM. 1329304006b3SVijay Mahadevan 1330304006b3SVijay Mahadevan Collective on MPI_Comm 1331304006b3SVijay Mahadevan 1332304006b3SVijay Mahadevan Input Parameters: 1333304006b3SVijay Mahadevan + dm - The DM object 1334304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra) 1335304006b3SVijay Mahadevan . conn - The connectivity of the element 1336*a2b725a8SWilliam Gropp - nverts - The number of vertices that form the element 1337304006b3SVijay Mahadevan 1338304006b3SVijay Mahadevan Output Parameter: 1339304006b3SVijay Mahadevan . oelem - The handle to the element created and added to the DM object 1340304006b3SVijay Mahadevan 1341304006b3SVijay Mahadevan Level: beginner 1342304006b3SVijay Mahadevan 1343304006b3SVijay Mahadevan .keywords: DM, create element 1344304006b3SVijay Mahadevan 1345304006b3SVijay Mahadevan .seealso: DMMoabCreateSubmesh(), DMMoabCreateVertices() 1346304006b3SVijay Mahadevan @*/ 1347304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateElement(DM dm, const moab::EntityType type, const moab::EntityHandle* conn, PetscInt nverts, moab::EntityHandle* oelem) 1348304006b3SVijay Mahadevan { 1349304006b3SVijay Mahadevan moab::ErrorCode merr; 1350304006b3SVijay Mahadevan DM_Moab *dmmoab; 1351304006b3SVijay Mahadevan moab::EntityHandle elem; 1352304006b3SVijay Mahadevan 1353304006b3SVijay Mahadevan PetscFunctionBegin; 1354304006b3SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1355304006b3SVijay Mahadevan PetscValidPointer(conn, 3); 1356304006b3SVijay Mahadevan 1357304006b3SVijay Mahadevan dmmoab = (DM_Moab*) dm->data; 1358304006b3SVijay Mahadevan 1359304006b3SVijay Mahadevan /* Insert new element */ 1360304006b3SVijay Mahadevan merr = dmmoab->mbiface->create_element(type, conn, nverts, elem); MBERRNM(merr); 1361304006b3SVijay Mahadevan merr = dmmoab->mbiface->add_entities(dmmoab->fileset, &elem, 1); MBERRNM(merr); 1362304006b3SVijay Mahadevan 1363304006b3SVijay Mahadevan if (oelem) *oelem = elem; 1364304006b3SVijay Mahadevan PetscFunctionReturn(0); 1365304006b3SVijay Mahadevan } 1366304006b3SVijay Mahadevan 1367304006b3SVijay Mahadevan 1368304006b3SVijay Mahadevan /*@ 1369304006b3SVijay Mahadevan DMMoabCreateSubmesh - Creates a sub-DM object with a set that contains all vertices/elements of the parent 1370304006b3SVijay Mahadevan in addition to providing support for dynamic mesh modifications. This is useful for AMR calculations to 1371304006b3SVijay Mahadevan create a DM object on a refined level. 1372304006b3SVijay Mahadevan 1373304006b3SVijay Mahadevan Collective on MPI_Comm 1374304006b3SVijay Mahadevan 1375304006b3SVijay Mahadevan Input Parameters: 1376*a2b725a8SWilliam Gropp . dm - The DM object 1377304006b3SVijay Mahadevan 1378304006b3SVijay Mahadevan Output Parameter: 1379304006b3SVijay Mahadevan . newdm - The sub DM object with updated set information 1380304006b3SVijay Mahadevan 1381304006b3SVijay Mahadevan Level: advanced 1382304006b3SVijay Mahadevan 1383304006b3SVijay Mahadevan .keywords: DM, sub-DM 1384304006b3SVijay Mahadevan 1385304006b3SVijay Mahadevan .seealso: DMCreate(), DMMoabCreateVertices(), DMMoabCreateElement() 1386304006b3SVijay Mahadevan @*/ 1387304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateSubmesh(DM dm, DM *newdm) 1388304006b3SVijay Mahadevan { 1389304006b3SVijay Mahadevan DM_Moab *dmmoab; 1390304006b3SVijay Mahadevan DM_Moab *ndmmoab; 1391304006b3SVijay Mahadevan moab::ErrorCode merr; 1392304006b3SVijay Mahadevan PetscErrorCode ierr; 1393304006b3SVijay Mahadevan 1394304006b3SVijay Mahadevan PetscFunctionBegin; 1395304006b3SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1396304006b3SVijay Mahadevan 1397304006b3SVijay Mahadevan dmmoab = (DM_Moab*) dm->data; 1398304006b3SVijay Mahadevan 1399304006b3SVijay Mahadevan /* Create the basic DMMoab object and keep the default parameters created by DM impls */ 14009daf19fdSVijay Mahadevan ierr = DMMoabCreateMoab(((PetscObject)dm)->comm, dmmoab->mbiface, &dmmoab->ltog_tag, PETSC_NULL, newdm);CHKERRQ(ierr); 1401304006b3SVijay Mahadevan 1402304006b3SVijay Mahadevan /* get all the necessary handles from the private DM object */ 1403304006b3SVijay Mahadevan ndmmoab = (DM_Moab*) (*newdm)->data; 1404304006b3SVijay Mahadevan 1405304006b3SVijay Mahadevan /* set the sub-mesh's parent DM reference */ 1406304006b3SVijay Mahadevan ndmmoab->parent = &dm; 1407304006b3SVijay Mahadevan 1408304006b3SVijay Mahadevan /* create a file set to associate all entities in current mesh */ 1409304006b3SVijay Mahadevan merr = ndmmoab->mbiface->create_meshset(moab::MESHSET_SET, ndmmoab->fileset); MBERR("Creating file set failed", merr); 1410304006b3SVijay Mahadevan 1411304006b3SVijay Mahadevan /* create a meshset and then add old fileset as child */ 1412304006b3SVijay Mahadevan merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->vlocal); MBERR("Adding child vertices to parent failed", merr); 1413304006b3SVijay Mahadevan merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->elocal); MBERR("Adding child elements to parent failed", merr); 1414304006b3SVijay Mahadevan 1415304006b3SVijay Mahadevan /* preserve the field association between the parent and sub-mesh objects */ 1416304006b3SVijay Mahadevan ierr = DMMoabSetFieldNames(*newdm, dmmoab->numFields, dmmoab->fieldNames);CHKERRQ(ierr); 1417304006b3SVijay Mahadevan PetscFunctionReturn(0); 1418304006b3SVijay Mahadevan } 1419304006b3SVijay Mahadevan 1420304006b3SVijay Mahadevan 1421304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_Ascii(DM dm, PetscViewer viewer) 1422304006b3SVijay Mahadevan { 1423304006b3SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 1424304006b3SVijay Mahadevan const char *name; 1425304006b3SVijay Mahadevan MPI_Comm comm; 1426304006b3SVijay Mahadevan PetscMPIInt size; 1427304006b3SVijay Mahadevan PetscErrorCode ierr; 1428304006b3SVijay Mahadevan 1429304006b3SVijay Mahadevan PetscFunctionBegin; 1430304006b3SVijay Mahadevan ierr = PetscObjectGetComm((PetscObject)dm, &comm);CHKERRQ(ierr); 1431304006b3SVijay Mahadevan ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr); 1432304006b3SVijay Mahadevan ierr = PetscObjectGetName((PetscObject) dm, &name);CHKERRQ(ierr); 1433304006b3SVijay Mahadevan ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1434304006b3SVijay Mahadevan if (name) {ierr = PetscViewerASCIIPrintf(viewer, "%s in %D dimensions:\n", name, dmmoab->dim);CHKERRQ(ierr);} 1435304006b3SVijay Mahadevan else {ierr = PetscViewerASCIIPrintf(viewer, "Mesh in %D dimensions:\n", dmmoab->dim);CHKERRQ(ierr);} 1436304006b3SVijay Mahadevan /* print details about the global mesh */ 1437304006b3SVijay Mahadevan { 1438304006b3SVijay Mahadevan ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 14399c368985SVijay Mahadevan ierr = PetscViewerASCIIPrintf(viewer, "Sizes: cells=%D, vertices=%D, blocks=%D\n", dmmoab->nele, dmmoab->n, dmmoab->bs);CHKERRQ(ierr); 1440304006b3SVijay Mahadevan /* print boundary data */ 1441304006b3SVijay Mahadevan ierr = PetscViewerASCIIPrintf(viewer, "Boundary trace:\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size());CHKERRQ(ierr); 1442304006b3SVijay Mahadevan { 1443304006b3SVijay Mahadevan ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1444304006b3SVijay Mahadevan ierr = PetscViewerASCIIPrintf(viewer, "cells=%D, faces=%D, vertices=%D\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size());CHKERRQ(ierr); 1445304006b3SVijay Mahadevan ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1446304006b3SVijay Mahadevan } 1447304006b3SVijay Mahadevan /* print field data */ 1448304006b3SVijay Mahadevan ierr = PetscViewerASCIIPrintf(viewer, "Fields: %D components\n", dmmoab->numFields);CHKERRQ(ierr); 1449304006b3SVijay Mahadevan { 1450304006b3SVijay Mahadevan ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1451304006b3SVijay Mahadevan for (int i = 0; i < dmmoab->numFields; ++i) { 1452304006b3SVijay Mahadevan ierr = PetscViewerASCIIPrintf(viewer, "[%D] - %s\n", i, dmmoab->fieldNames[i]);CHKERRQ(ierr); 1453304006b3SVijay Mahadevan } 1454304006b3SVijay Mahadevan ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1455304006b3SVijay Mahadevan } 1456304006b3SVijay Mahadevan ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1457304006b3SVijay Mahadevan } 1458304006b3SVijay Mahadevan ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1459304006b3SVijay Mahadevan ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 1460304006b3SVijay Mahadevan PetscFunctionReturn(0); 1461304006b3SVijay Mahadevan } 1462304006b3SVijay Mahadevan 1463304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_VTK(DM dm, PetscViewer v) 1464304006b3SVijay Mahadevan { 1465304006b3SVijay Mahadevan PetscFunctionReturn(0); 1466304006b3SVijay Mahadevan } 1467304006b3SVijay Mahadevan 1468304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_HDF5(DM dm, PetscViewer v) 1469304006b3SVijay Mahadevan { 1470304006b3SVijay Mahadevan PetscFunctionReturn(0); 1471304006b3SVijay Mahadevan } 1472304006b3SVijay Mahadevan 1473304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMView_Moab(DM dm, PetscViewer viewer) 1474304006b3SVijay Mahadevan { 1475304006b3SVijay Mahadevan PetscBool iascii, ishdf5, isvtk; 1476304006b3SVijay Mahadevan PetscErrorCode ierr; 1477304006b3SVijay Mahadevan 1478304006b3SVijay Mahadevan PetscFunctionBegin; 1479304006b3SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1480304006b3SVijay Mahadevan PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2); 1481304006b3SVijay Mahadevan ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr); 1482304006b3SVijay Mahadevan ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERVTK, &isvtk);CHKERRQ(ierr); 1483304006b3SVijay Mahadevan ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERHDF5, &ishdf5);CHKERRQ(ierr); 1484304006b3SVijay Mahadevan if (iascii) { 1485304006b3SVijay Mahadevan ierr = DMMoabView_Ascii(dm, viewer);CHKERRQ(ierr); 1486304006b3SVijay Mahadevan } else if (ishdf5) { 1487304006b3SVijay Mahadevan #if defined(PETSC_HAVE_HDF5) && defined(MOAB_HAVE_HDF5) 1488304006b3SVijay Mahadevan ierr = PetscViewerPushFormat(viewer, PETSC_VIEWER_HDF5_VIZ);CHKERRQ(ierr); 1489304006b3SVijay Mahadevan ierr = DMMoabView_HDF5(dm, viewer);CHKERRQ(ierr); 1490304006b3SVijay Mahadevan ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr); 1491304006b3SVijay Mahadevan #else 1492304006b3SVijay Mahadevan SETERRQ(PetscObjectComm((PetscObject) dm), PETSC_ERR_SUP, "HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5"); 1493304006b3SVijay Mahadevan #endif 1494304006b3SVijay Mahadevan } 1495304006b3SVijay Mahadevan else if (isvtk) { 1496304006b3SVijay Mahadevan ierr = DMMoabView_VTK(dm, viewer);CHKERRQ(ierr); 1497304006b3SVijay Mahadevan } 1498304006b3SVijay Mahadevan PetscFunctionReturn(0); 1499304006b3SVijay Mahadevan } 1500304006b3SVijay Mahadevan 1501304006b3SVijay Mahadevan 1502304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMInitialize_Moab(DM dm) 1503304006b3SVijay Mahadevan { 1504304006b3SVijay Mahadevan PetscFunctionBegin; 1505304006b3SVijay Mahadevan dm->ops->view = DMView_Moab; 1506304006b3SVijay Mahadevan dm->ops->load = NULL /* DMLoad_Moab */; 1507304006b3SVijay Mahadevan dm->ops->setfromoptions = DMSetFromOptions_Moab; 1508304006b3SVijay Mahadevan dm->ops->clone = DMClone_Moab; 1509304006b3SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 1510304006b3SVijay Mahadevan dm->ops->createdefaultsection = NULL; 1511304006b3SVijay Mahadevan dm->ops->createdefaultconstraints = NULL; 1512304006b3SVijay Mahadevan dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 1513304006b3SVijay Mahadevan dm->ops->createlocalvector = DMCreateLocalVector_Moab; 1514304006b3SVijay Mahadevan dm->ops->getlocaltoglobalmapping = NULL; 1515304006b3SVijay Mahadevan dm->ops->createfieldis = NULL; 1516304006b3SVijay Mahadevan dm->ops->createcoordinatedm = NULL /* DMCreateCoordinateDM_Moab */; 1517304006b3SVijay Mahadevan dm->ops->getcoloring = NULL; 1518304006b3SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 1519304006b3SVijay Mahadevan dm->ops->createinterpolation = DMCreateInterpolation_Moab; 1520304006b3SVijay Mahadevan dm->ops->getaggregates = NULL; 1521304006b3SVijay Mahadevan dm->ops->getinjection = NULL /* DMCreateInjection_Moab */; 1522304006b3SVijay Mahadevan dm->ops->refine = DMRefine_Moab; 1523304006b3SVijay Mahadevan dm->ops->coarsen = DMCoarsen_Moab; 1524304006b3SVijay Mahadevan dm->ops->refinehierarchy = DMRefineHierarchy_Moab; 1525304006b3SVijay Mahadevan dm->ops->coarsenhierarchy = DMCoarsenHierarchy_Moab; 1526304006b3SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 1527304006b3SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 1528304006b3SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 1529304006b3SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 1530304006b3SVijay Mahadevan dm->ops->destroy = DMDestroy_Moab; 1531304006b3SVijay Mahadevan dm->ops->createsubdm = NULL /* DMCreateSubDM_Moab */; 1532304006b3SVijay Mahadevan dm->ops->getdimpoints = NULL /* DMGetDimPoints_Moab */; 1533304006b3SVijay Mahadevan dm->ops->locatepoints = NULL /* DMLocatePoints_Moab */; 1534304006b3SVijay Mahadevan PetscFunctionReturn(0); 1535304006b3SVijay Mahadevan } 1536304006b3SVijay Mahadevan 1537304006b3SVijay Mahadevan 1538304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm) 1539304006b3SVijay Mahadevan { 1540304006b3SVijay Mahadevan PetscErrorCode ierr; 1541304006b3SVijay Mahadevan 1542304006b3SVijay Mahadevan PetscFunctionBegin; 1543304006b3SVijay Mahadevan ierr = PetscObjectChangeTypeName((PetscObject) * newdm, DMMOAB);CHKERRQ(ierr); 1544304006b3SVijay Mahadevan 1545304006b3SVijay Mahadevan /* get all the necessary handles from the private DM object */ 1546304006b3SVijay Mahadevan (*newdm)->data = (DM_Moab*) dm->data; 1547304006b3SVijay Mahadevan ((DM_Moab*)dm->data)->refct++; 1548304006b3SVijay Mahadevan 1549304006b3SVijay Mahadevan ierr = DMInitialize_Moab(*newdm);CHKERRQ(ierr); 1550304006b3SVijay Mahadevan PetscFunctionReturn(0); 1551304006b3SVijay Mahadevan } 1552304006b3SVijay Mahadevan 1553304006b3SVijay Mahadevan 1554f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 1555f6829af0SVijay Mahadevan { 1556f6829af0SVijay Mahadevan PetscErrorCode ierr; 1557f6829af0SVijay Mahadevan 1558f6829af0SVijay Mahadevan PetscFunctionBegin; 1559f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1560f90c3b0eSVijay Mahadevan ierr = PetscNewLog(dm, (DM_Moab**)&dm->data);CHKERRQ(ierr); 1561f6829af0SVijay Mahadevan 1562f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 1563f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->numFields = 1; 1564f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 1565f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 1566f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 1567f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 1568f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 1569f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleghost = 0; 1570c528d872SBarry Smith ((DM_Moab*)dm->data)->ltog_map = NULL; 1571c528d872SBarry Smith ((DM_Moab*)dm->data)->ltog_sendrecv = NULL; 1572f6829af0SVijay Mahadevan 1573304006b3SVijay Mahadevan ((DM_Moab*)dm->data)->refct = 1; 1574304006b3SVijay Mahadevan ((DM_Moab*)dm->data)->parent = NULL; 1575f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 1576f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 1577f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 1578f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 1579f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 1580f6829af0SVijay Mahadevan 1581304006b3SVijay Mahadevan ierr = DMInitialize_Moab(dm);CHKERRQ(ierr); 1582f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1583f6829af0SVijay Mahadevan } 1584f6829af0SVijay Mahadevan 1585