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 17a8d69d7bSBarry Smith Reference: https://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 56d083f849SBarry Smith Collective 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 @*/ 67032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb) 681d72bce8STim Tautges { 691d72bce8STim Tautges PetscErrorCode ierr; 701d72bce8STim Tautges 711d72bce8STim Tautges PetscFunctionBegin; 72032b8ab6SVijay Mahadevan PetscValidPointer(dmb, 2); 73032b8ab6SVijay Mahadevan ierr = DMCreate(comm, dmb);CHKERRQ(ierr); 74032b8ab6SVijay Mahadevan ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr); 751d72bce8STim Tautges PetscFunctionReturn(0); 761d72bce8STim Tautges } 771d72bce8STim Tautges 781d72bce8STim Tautges /*@ 79b117cd09SVijay Mahadevan DMMoabCreateMoab - Creates a DMMoab object, optionally from an instance and other data 801d72bce8STim Tautges 81d083f849SBarry Smith Collective 821d72bce8STim Tautges 831d72bce8STim Tautges Input Parameter: 841d72bce8STim Tautges . comm - The communicator for the DMMoab object 85032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed 86a4d2169cSTim Tautges along with the DMMoab 87a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator 881d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag 891d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned 901d72bce8STim Tautges 911d72bce8STim Tautges Output Parameter: 92032b8ab6SVijay Mahadevan . dmb - The DMMoab object 931d72bce8STim Tautges 94032b8ab6SVijay Mahadevan Level: intermediate 951d72bce8STim Tautges 961d72bce8STim Tautges @*/ 979daf19fdSVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::Tag *ltog_tag, moab::Range *range, DM *dmb) 981d72bce8STim Tautges { 991d72bce8STim Tautges PetscErrorCode ierr; 100032b8ab6SVijay Mahadevan moab::ErrorCode merr; 10185d305f5SVijay Mahadevan DM dmmb; 102853cdec3SJed Brown DM_Moab *dmmoab; 1031d72bce8STim Tautges 1041d72bce8STim Tautges PetscFunctionBegin; 105032b8ab6SVijay Mahadevan PetscValidPointer(dmb, 6); 10685d305f5SVijay Mahadevan 10785d305f5SVijay Mahadevan ierr = DMMoabCreate(comm, &dmmb);CHKERRQ(ierr); 10885d305f5SVijay Mahadevan dmmoab = (DM_Moab*)(dmmb)->data; 109a4d2169cSTim Tautges 110a4d2169cSTim Tautges if (!mbiface) { 11172ff976dSVijay Mahadevan dmmoab->mbiface = new moab::Core(); 1127d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_TRUE; 1131d72bce8STim Tautges } 1141cec0304SVijay Mahadevan else { 1151cec0304SVijay Mahadevan dmmoab->mbiface = mbiface; 1167d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_FALSE; 1171cec0304SVijay Mahadevan } 1181cec0304SVijay Mahadevan 119b5410836SVijay Mahadevan /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */ 120b5410836SVijay Mahadevan dmmoab->fileset = 0; 121b117cd09SVijay Mahadevan dmmoab->hlevel = 0; 12249d66b22SVijay Mahadevan dmmoab->nghostrings = 0; 1237d89fc02STim Tautges 1249daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1259daf19fdSVijay Mahadevan moab::EntityHandle partnset; 126032b8ab6SVijay Mahadevan 127db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 128db66d124SVijay Mahadevan to the load_file functions to be populated. */ 1290c8a2322SVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset); MBERR("Creating partition set failed", merr); 130032b8ab6SVijay Mahadevan 131db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 13272ff976dSVijay Mahadevan dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm); 1339daf19fdSVijay Mahadevan #endif 134032b8ab6SVijay Mahadevan 1354973de03SVijay Mahadevan /* do the remaining initializations for DMMoab */ 1364973de03SVijay Mahadevan dmmoab->bs = 1; 137addae81cSVijay Mahadevan dmmoab->numFields = 1; 1383f1c6e43SVijay Mahadevan ierr = PetscMalloc(dmmoab->numFields * sizeof(char*), &dmmoab->fieldNames);CHKERRQ(ierr); 1393f1c6e43SVijay Mahadevan ierr = PetscStrallocpy("DEFAULT", (char**) &dmmoab->fieldNames[0]);CHKERRQ(ierr); 1402e4e7c01SVijay Mahadevan dmmoab->rw_dbglevel = 0; 1412e4e7c01SVijay Mahadevan dmmoab->partition_by_rank = PETSC_FALSE; 1422e4e7c01SVijay Mahadevan dmmoab->extra_read_options[0] = '\0'; 1432e4e7c01SVijay Mahadevan dmmoab->extra_write_options[0] = '\0'; 1442e4e7c01SVijay Mahadevan dmmoab->read_mode = READ_PART; 1452e4e7c01SVijay Mahadevan dmmoab->write_mode = WRITE_PART; 1464973de03SVijay Mahadevan 1474973de03SVijay Mahadevan /* set global ID tag handle */ 1481a845d2aSVijay Mahadevan if (ltog_tag && *ltog_tag) { 14985d305f5SVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag);CHKERRQ(ierr); 150032b8ab6SVijay Mahadevan } 151032b8ab6SVijay Mahadevan else { 1521a845d2aSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag); MBERRNM(merr); 1531a845d2aSVijay Mahadevan if (ltog_tag) *ltog_tag = dmmoab->ltog_tag; 154a4d2169cSTim Tautges } 155a4d2169cSTim Tautges 156340f3b9aSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag); MBERRNM(merr); 157340f3b9aSVijay Mahadevan 1584973de03SVijay Mahadevan /* set the local range of entities (vertices) of interest */ 159a4d2169cSTim Tautges if (range) { 16085d305f5SVijay Mahadevan ierr = DMMoabSetLocalVertices(dmmb, range);CHKERRQ(ierr); 161a4d2169cSTim Tautges } 16285d305f5SVijay Mahadevan *dmb = dmmb; 1631d72bce8STim Tautges PetscFunctionReturn(0); 1641d72bce8STim Tautges } 1651d72bce8STim Tautges 166304006b3SVijay Mahadevan 1679daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1681d72bce8STim Tautges 169aa768e4cSTim Tautges /*@ 170aa768e4cSTim Tautges DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab 171aa768e4cSTim Tautges 172d083f849SBarry Smith Collective 173aa768e4cSTim Tautges 174aa768e4cSTim Tautges Input Parameter: 175aa768e4cSTim Tautges . dm - The DMMoab object being set 176aa768e4cSTim Tautges 177aa768e4cSTim Tautges Output Parameter: 178aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 179aa768e4cSTim Tautges 180aa768e4cSTim Tautges Level: beginner 181aa768e4cSTim Tautges 182aa768e4cSTim Tautges @*/ 1831d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm, moab::ParallelComm **pcomm) 1841d72bce8STim Tautges { 1851d72bce8STim Tautges PetscFunctionBegin; 1861d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 187032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 1881d72bce8STim Tautges PetscFunctionReturn(0); 1891d72bce8STim Tautges } 1901d72bce8STim Tautges 1919daf19fdSVijay Mahadevan #endif /* MOAB_HAVE_MPI */ 1929daf19fdSVijay Mahadevan 1931d72bce8STim Tautges 194aa768e4cSTim Tautges /*@ 195aa768e4cSTim Tautges DMMoabSetInterface - Set the MOAB instance used with this DMMoab 196aa768e4cSTim Tautges 197d083f849SBarry Smith Collective 198aa768e4cSTim Tautges 199aa768e4cSTim Tautges Input Parameter: 200aa768e4cSTim Tautges . dm - The DMMoab object being set 201aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab 202aa768e4cSTim Tautges 203aa768e4cSTim Tautges Level: beginner 204aa768e4cSTim Tautges 205aa768e4cSTim Tautges @*/ 206a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm, moab::Interface *mbiface) 2071d72bce8STim Tautges { 208032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 209032b8ab6SVijay Mahadevan 2101d72bce8STim Tautges PetscFunctionBegin; 2111d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2121cec0304SVijay Mahadevan PetscValidPointer(mbiface, 2); 2139daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 214032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 2159daf19fdSVijay Mahadevan #endif 216032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 217032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 2181d72bce8STim Tautges PetscFunctionReturn(0); 2191d72bce8STim Tautges } 2201d72bce8STim Tautges 2211d72bce8STim Tautges 222aa768e4cSTim Tautges /*@ 223aa768e4cSTim Tautges DMMoabGetInterface - Get the MOAB instance used with this DMMoab 224aa768e4cSTim Tautges 225d083f849SBarry Smith Collective 226aa768e4cSTim Tautges 227aa768e4cSTim Tautges Input Parameter: 228aa768e4cSTim Tautges . dm - The DMMoab object being set 229aa768e4cSTim Tautges 230aa768e4cSTim Tautges Output Parameter: 231aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab 232aa768e4cSTim Tautges 233aa768e4cSTim Tautges Level: beginner 234aa768e4cSTim Tautges 235aa768e4cSTim Tautges @*/ 236a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm, moab::Interface **mbiface) 2371d72bce8STim Tautges { 2389426e041SSatish Balay PetscErrorCode ierr; 239cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 240cabb514dSBarry Smith 2411d72bce8STim Tautges PetscFunctionBegin; 2421d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 243cabb514dSBarry 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); 244a4d2169cSTim Tautges *mbiface = ((DM_Moab*)dm->data)->mbiface; 2451d72bce8STim Tautges PetscFunctionReturn(0); 2461d72bce8STim Tautges } 2471d72bce8STim Tautges 2481d72bce8STim Tautges 249aa768e4cSTim Tautges /*@ 2505eb88e9dSVijay Mahadevan DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab 251aa768e4cSTim Tautges 252d083f849SBarry Smith Collective 253aa768e4cSTim Tautges 254aa768e4cSTim Tautges Input Parameter: 255aa768e4cSTim Tautges . dm - The DMMoab object being set 256aa768e4cSTim Tautges . range - The entities treated by this DMMoab 257aa768e4cSTim Tautges 258aa768e4cSTim Tautges Level: beginner 259aa768e4cSTim Tautges 260aa768e4cSTim Tautges @*/ 2615eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm, moab::Range *range) 2621d72bce8STim Tautges { 263fd3326ddSVijay Mahadevan moab::Range tmpvtxs; 264032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 265032b8ab6SVijay Mahadevan 2661d72bce8STim Tautges PetscFunctionBegin; 2671d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 268032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 269032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 270fd3326ddSVijay Mahadevan 271032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 272fd3326ddSVijay Mahadevan 2739daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 2749daf19fdSVijay Mahadevan moab::ErrorCode merr; 275fd3326ddSVijay Mahadevan /* filter based on parallel status */ 276fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned); MBERRNM(merr); 277fd3326ddSVijay Mahadevan 278fd3326ddSVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 279fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 280fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(tmpvtxs, PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost); MBERRNM(merr); 281fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost); 282fd3326ddSVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs); 2839daf19fdSVijay Mahadevan #else 2849daf19fdSVijay Mahadevan *dmmoab->vowned = *dmmoab->vlocal; 2859daf19fdSVijay Mahadevan #endif 286fd3326ddSVijay Mahadevan 287fd3326ddSVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 288032b8ab6SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 289032b8ab6SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 2909daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 2919daf19fdSVijay Mahadevan PetscErrorCode ierr; 292b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 2939daf19fdSVijay Mahadevan #else 2949daf19fdSVijay Mahadevan dmmoab->n = dmmoab->nloc; 2959daf19fdSVijay Mahadevan #endif 2961d72bce8STim Tautges PetscFunctionReturn(0); 2971d72bce8STim Tautges } 2981d72bce8STim Tautges 2991d72bce8STim Tautges 3008d8d51c8SVijay Mahadevan /*@ 3018d8d51c8SVijay Mahadevan DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab 3028d8d51c8SVijay Mahadevan 303d083f849SBarry Smith Collective 3048d8d51c8SVijay Mahadevan 3058d8d51c8SVijay Mahadevan Input Parameter: 3068d8d51c8SVijay Mahadevan . dm - The DMMoab object being set 3078d8d51c8SVijay Mahadevan 3088d8d51c8SVijay Mahadevan Output Parameter: 3098d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted) 3108d8d51c8SVijay Mahadevan 3118d8d51c8SVijay Mahadevan Level: beginner 3128d8d51c8SVijay Mahadevan 3138d8d51c8SVijay Mahadevan @*/ 3148d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm, moab::Range *local) 3158d8d51c8SVijay Mahadevan { 3168d8d51c8SVijay Mahadevan PetscFunctionBegin; 3178d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 3188d8d51c8SVijay Mahadevan if (local) *local = *((DM_Moab*)dm->data)->vlocal; 3198d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 3208d8d51c8SVijay Mahadevan } 3218d8d51c8SVijay Mahadevan 3228d8d51c8SVijay Mahadevan 3238d8d51c8SVijay Mahadevan 324aa768e4cSTim Tautges /*@ 3255eb88e9dSVijay Mahadevan DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab 326aa768e4cSTim Tautges 327d083f849SBarry Smith Collective 328aa768e4cSTim Tautges 329aa768e4cSTim Tautges Input Parameter: 330aa768e4cSTim Tautges . dm - The DMMoab object being set 331aa768e4cSTim Tautges 332aa768e4cSTim Tautges Output Parameter: 3335eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab 3345eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition 335aa768e4cSTim Tautges 336aa768e4cSTim Tautges Level: beginner 337aa768e4cSTim Tautges 338aa768e4cSTim Tautges @*/ 339351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm, const moab::Range **owned, const moab::Range **ghost) 3401d72bce8STim Tautges { 3411d72bce8STim Tautges PetscFunctionBegin; 3421d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 343351b8a77SVijay Mahadevan if (owned) *owned = ((DM_Moab*)dm->data)->vowned; 344351b8a77SVijay Mahadevan if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost; 3451d72bce8STim Tautges PetscFunctionReturn(0); 3461d72bce8STim Tautges } 3471d72bce8STim Tautges 3485eb88e9dSVijay Mahadevan /*@ 3495eb88e9dSVijay Mahadevan DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned 3505eb88e9dSVijay Mahadevan 351d083f849SBarry Smith Collective 3525eb88e9dSVijay Mahadevan 3535eb88e9dSVijay Mahadevan Input Parameter: 3545eb88e9dSVijay Mahadevan . dm - The DMMoab object being set 3555eb88e9dSVijay Mahadevan 3565eb88e9dSVijay Mahadevan Output Parameter: 3575eb88e9dSVijay Mahadevan . range - The entities owned locally 3585eb88e9dSVijay Mahadevan 3595eb88e9dSVijay Mahadevan Level: beginner 3605eb88e9dSVijay Mahadevan 3615eb88e9dSVijay Mahadevan @*/ 362351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm, const moab::Range **range) 3635eb88e9dSVijay Mahadevan { 3645eb88e9dSVijay Mahadevan PetscFunctionBegin; 3655eb88e9dSVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 366351b8a77SVijay Mahadevan if (range) *range = ((DM_Moab*)dm->data)->elocal; 3671cec0304SVijay Mahadevan PetscFunctionReturn(0); 3681cec0304SVijay Mahadevan } 3691cec0304SVijay Mahadevan 3701cec0304SVijay Mahadevan 3711cec0304SVijay Mahadevan /*@ 3721cec0304SVijay Mahadevan DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab 3731cec0304SVijay Mahadevan 374d083f849SBarry Smith Collective 3751cec0304SVijay Mahadevan 3761cec0304SVijay Mahadevan Input Parameter: 3771cec0304SVijay Mahadevan . dm - The DMMoab object being set 3781cec0304SVijay Mahadevan . range - The entities treated by this DMMoab 3791cec0304SVijay Mahadevan 3801cec0304SVijay Mahadevan Level: beginner 3811cec0304SVijay Mahadevan 3821cec0304SVijay Mahadevan @*/ 3831cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm, moab::Range *range) 3841cec0304SVijay Mahadevan { 3851cec0304SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 3861cec0304SVijay Mahadevan 3871cec0304SVijay Mahadevan PetscFunctionBegin; 3881cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 3891cec0304SVijay Mahadevan dmmoab->elocal->clear(); 3901cec0304SVijay Mahadevan dmmoab->eghost->clear(); 3911cec0304SVijay Mahadevan dmmoab->elocal->insert(range->begin(), range->end()); 3929daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 3939daf19fdSVijay Mahadevan moab::ErrorCode merr; 3941cec0304SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr); 3951cec0304SVijay Mahadevan *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal); 3969daf19fdSVijay Mahadevan #endif 3971cec0304SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 39841dd5348SVijay Mahadevan dmmoab->neleghost = dmmoab->eghost->size(); 3999daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 4009daf19fdSVijay Mahadevan PetscErrorCode ierr; 4019daf19fdSVijay Mahadevan ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 4028cbae1a6SVijay Mahadevan PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele); 4039daf19fdSVijay Mahadevan #else 4049daf19fdSVijay Mahadevan dmmoab->nele = dmmoab->neleloc; 4059daf19fdSVijay Mahadevan #endif 4065eb88e9dSVijay Mahadevan PetscFunctionReturn(0); 4075eb88e9dSVijay Mahadevan } 4085eb88e9dSVijay Mahadevan 4095eb88e9dSVijay Mahadevan 410aa768e4cSTim Tautges /*@ 411aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 412aa768e4cSTim Tautges 413d083f849SBarry Smith Collective 414aa768e4cSTim Tautges 415aa768e4cSTim Tautges Input Parameter: 416aa768e4cSTim Tautges . dm - The DMMoab object being set 417aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 418aa768e4cSTim Tautges 419aa768e4cSTim Tautges Level: beginner 420aa768e4cSTim Tautges 421aa768e4cSTim Tautges @*/ 4221d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm, moab::Tag ltogtag) 4231d72bce8STim Tautges { 4241d72bce8STim Tautges PetscFunctionBegin; 4251d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4261d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 4271d72bce8STim Tautges PetscFunctionReturn(0); 4281d72bce8STim Tautges } 4291d72bce8STim Tautges 4301d72bce8STim Tautges 431aa768e4cSTim Tautges /*@ 432aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 433aa768e4cSTim Tautges 434d083f849SBarry Smith Collective 435aa768e4cSTim Tautges 436aa768e4cSTim Tautges Input Parameter: 437aa768e4cSTim Tautges . dm - The DMMoab object being set 438aa768e4cSTim Tautges 439aa768e4cSTim Tautges Output Parameter: 440aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 441aa768e4cSTim Tautges 442aa768e4cSTim Tautges Level: beginner 443aa768e4cSTim Tautges 444aa768e4cSTim Tautges @*/ 4451d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm, moab::Tag *ltog_tag) 4461d72bce8STim Tautges { 4471d72bce8STim Tautges PetscFunctionBegin; 4481d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4491d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 4501d72bce8STim Tautges PetscFunctionReturn(0); 4511d72bce8STim Tautges } 4521d72bce8STim Tautges 4531d72bce8STim Tautges 454aa768e4cSTim Tautges /*@ 455aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 456aa768e4cSTim Tautges 457d083f849SBarry Smith Collective 458aa768e4cSTim Tautges 459aa768e4cSTim Tautges Input Parameter: 460aa768e4cSTim Tautges . dm - The DMMoab object being set 461aa768e4cSTim Tautges . bs - The block size used with this DMMoab 462aa768e4cSTim Tautges 463aa768e4cSTim Tautges Level: beginner 464aa768e4cSTim Tautges 465aa768e4cSTim Tautges @*/ 4661d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm, PetscInt bs) 4671d72bce8STim Tautges { 4681d72bce8STim Tautges PetscFunctionBegin; 4691d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4701d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 4711d72bce8STim Tautges PetscFunctionReturn(0); 4721d72bce8STim Tautges } 4731d72bce8STim Tautges 4741d72bce8STim Tautges 475aa768e4cSTim Tautges /*@ 476aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 477aa768e4cSTim Tautges 478d083f849SBarry Smith Collective 479aa768e4cSTim Tautges 480aa768e4cSTim Tautges Input Parameter: 481aa768e4cSTim Tautges . dm - The DMMoab object being set 482aa768e4cSTim Tautges 483aa768e4cSTim Tautges Output Parameter: 484aa768e4cSTim Tautges . bs - The block size used with this DMMoab 485aa768e4cSTim Tautges 486aa768e4cSTim Tautges Level: beginner 487aa768e4cSTim Tautges 488aa768e4cSTim Tautges @*/ 4891d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm, PetscInt *bs) 4901d72bce8STim Tautges { 4911d72bce8STim Tautges PetscFunctionBegin; 4921d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4931d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 4941d72bce8STim Tautges PetscFunctionReturn(0); 4951d72bce8STim Tautges } 4961d72bce8STim Tautges 4971cec0304SVijay Mahadevan 498212ad6d1SVijay Mahadevan /*@ 499212ad6d1SVijay Mahadevan DMMoabGetSize - Get the global vertex size used with this DMMoab 500212ad6d1SVijay Mahadevan 501d083f849SBarry Smith Collective on dm 502212ad6d1SVijay Mahadevan 503212ad6d1SVijay Mahadevan Input Parameter: 504212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 505212ad6d1SVijay Mahadevan 506212ad6d1SVijay Mahadevan Output Parameter: 50700cc10feSVijay Mahadevan . neg - The number of global elements in the DMMoab instance 50800cc10feSVijay Mahadevan . nvg - The number of global vertices in the DMMoab instance 509212ad6d1SVijay Mahadevan 510212ad6d1SVijay Mahadevan Level: beginner 511212ad6d1SVijay Mahadevan 512212ad6d1SVijay Mahadevan @*/ 51341dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm, PetscInt *neg, PetscInt *nvg) 514212ad6d1SVijay Mahadevan { 515212ad6d1SVijay Mahadevan PetscFunctionBegin; 516212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 51741dd5348SVijay Mahadevan if (neg) *neg = ((DM_Moab*)dm->data)->nele; 51841dd5348SVijay Mahadevan if (nvg) *nvg = ((DM_Moab*)dm->data)->n; 519212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 520212ad6d1SVijay Mahadevan } 521212ad6d1SVijay Mahadevan 522212ad6d1SVijay Mahadevan 523212ad6d1SVijay Mahadevan /*@ 524212ad6d1SVijay Mahadevan DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab 525212ad6d1SVijay Mahadevan 526d083f849SBarry Smith Collective on dm 527212ad6d1SVijay Mahadevan 528212ad6d1SVijay Mahadevan Input Parameter: 529212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 530212ad6d1SVijay Mahadevan 531212ad6d1SVijay Mahadevan Output Parameter: 532b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor 53300cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor 53400cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor 53500cc10feSVijay Mahadevan . nvg - The number of ghosted vertices in this processor 536212ad6d1SVijay Mahadevan 537212ad6d1SVijay Mahadevan Level: beginner 538212ad6d1SVijay Mahadevan 539212ad6d1SVijay Mahadevan @*/ 54041dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm, PetscInt *nel, PetscInt *neg, PetscInt *nvl, PetscInt *nvg) 541212ad6d1SVijay Mahadevan { 542212ad6d1SVijay Mahadevan PetscFunctionBegin; 543212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 54441dd5348SVijay Mahadevan if (nel) *nel = ((DM_Moab*)dm->data)->neleloc; 54541dd5348SVijay Mahadevan if (neg) *neg = ((DM_Moab*)dm->data)->neleghost; 54641dd5348SVijay Mahadevan if (nvl) *nvl = ((DM_Moab*)dm->data)->nloc; 54741dd5348SVijay Mahadevan if (nvg) *nvg = ((DM_Moab*)dm->data)->nghost; 548212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 549212ad6d1SVijay Mahadevan } 550212ad6d1SVijay Mahadevan 551212ad6d1SVijay Mahadevan 55200cc10feSVijay Mahadevan /*@ 55300cc10feSVijay Mahadevan DMMoabGetOffset - Get the local offset for the global vector 55400cc10feSVijay Mahadevan 555d083f849SBarry Smith Collective 55600cc10feSVijay Mahadevan 55700cc10feSVijay Mahadevan Input Parameter: 55800cc10feSVijay Mahadevan . dm - The DMMoab object being set 55900cc10feSVijay Mahadevan 56000cc10feSVijay Mahadevan Output Parameter: 56100cc10feSVijay Mahadevan . offset - The local offset for the global vector 56200cc10feSVijay Mahadevan 56300cc10feSVijay Mahadevan Level: beginner 56400cc10feSVijay Mahadevan 56500cc10feSVijay Mahadevan @*/ 56600cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm, PetscInt *offset) 56700cc10feSVijay Mahadevan { 56800cc10feSVijay Mahadevan PetscFunctionBegin; 56900cc10feSVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 57000cc10feSVijay Mahadevan *offset = ((DM_Moab*)dm->data)->vstart; 57100cc10feSVijay Mahadevan PetscFunctionReturn(0); 57200cc10feSVijay Mahadevan } 57300cc10feSVijay Mahadevan 57400cc10feSVijay Mahadevan 5754920ab11SVijay Mahadevan /*@ 5764920ab11SVijay Mahadevan DMMoabGetDimension - Get the dimension of the DM Mesh 5774920ab11SVijay Mahadevan 578d083f849SBarry Smith Collective 5794920ab11SVijay Mahadevan 5804920ab11SVijay Mahadevan Input Parameter: 581340f3b9aSVijay Mahadevan . dm - The DMMoab object 5824920ab11SVijay Mahadevan 5834920ab11SVijay Mahadevan Output Parameter: 5844920ab11SVijay Mahadevan . dim - The dimension of DM 5854920ab11SVijay Mahadevan 5864920ab11SVijay Mahadevan Level: beginner 5874920ab11SVijay Mahadevan 5884920ab11SVijay Mahadevan @*/ 5894920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm, PetscInt *dim) 5904920ab11SVijay Mahadevan { 5914920ab11SVijay Mahadevan PetscFunctionBegin; 5924920ab11SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 5934920ab11SVijay Mahadevan *dim = ((DM_Moab*)dm->data)->dim; 5944920ab11SVijay Mahadevan PetscFunctionReturn(0); 5954920ab11SVijay Mahadevan } 5964920ab11SVijay Mahadevan 5974920ab11SVijay Mahadevan 598755f3dfbSVijay Mahadevan /*@ 599755f3dfbSVijay Mahadevan DMMoabGetHierarchyLevel - Get the current level of the mesh hierarchy 600755f3dfbSVijay Mahadevan generated through uniform refinement. 601755f3dfbSVijay Mahadevan 602d083f849SBarry Smith Collective on dm 603755f3dfbSVijay Mahadevan 604755f3dfbSVijay Mahadevan Input Parameter: 605755f3dfbSVijay Mahadevan . dm - The DMMoab object being set 606755f3dfbSVijay Mahadevan 607755f3dfbSVijay Mahadevan Output Parameter: 608755f3dfbSVijay Mahadevan . nvg - The current mesh hierarchy level 609755f3dfbSVijay Mahadevan 610755f3dfbSVijay Mahadevan Level: beginner 611755f3dfbSVijay Mahadevan 612755f3dfbSVijay Mahadevan @*/ 613755f3dfbSVijay Mahadevan PetscErrorCode DMMoabGetHierarchyLevel(DM dm, PetscInt *nlevel) 614755f3dfbSVijay Mahadevan { 615755f3dfbSVijay Mahadevan PetscFunctionBegin; 616755f3dfbSVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 617755f3dfbSVijay Mahadevan if (nlevel) *nlevel = ((DM_Moab*)dm->data)->hlevel; 618755f3dfbSVijay Mahadevan PetscFunctionReturn(0); 619755f3dfbSVijay Mahadevan } 620755f3dfbSVijay Mahadevan 621755f3dfbSVijay Mahadevan 622340f3b9aSVijay Mahadevan /*@ 623340f3b9aSVijay Mahadevan DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh 624340f3b9aSVijay Mahadevan 625d083f849SBarry Smith Collective 626340f3b9aSVijay Mahadevan 627340f3b9aSVijay Mahadevan Input Parameter: 628340f3b9aSVijay Mahadevan . dm - The DMMoab object 629340f3b9aSVijay Mahadevan . ehandle - The element entity handle 630340f3b9aSVijay Mahadevan 631340f3b9aSVijay Mahadevan Output Parameter: 632340f3b9aSVijay Mahadevan . mat - The material ID for the current entity 633340f3b9aSVijay Mahadevan 634340f3b9aSVijay Mahadevan Level: beginner 635340f3b9aSVijay Mahadevan 636340f3b9aSVijay Mahadevan @*/ 637340f3b9aSVijay Mahadevan PetscErrorCode DMMoabGetMaterialBlock(DM dm, const moab::EntityHandle ehandle, PetscInt *mat) 638340f3b9aSVijay Mahadevan { 639340f3b9aSVijay Mahadevan DM_Moab *dmmoab; 640340f3b9aSVijay Mahadevan 641340f3b9aSVijay Mahadevan PetscFunctionBegin; 642340f3b9aSVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 643340f3b9aSVijay Mahadevan if (*mat) { 644340f3b9aSVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 645a044f6b6SVijay Mahadevan *mat = dmmoab->materials[dmmoab->elocal->index(ehandle)]; 646340f3b9aSVijay Mahadevan } 647340f3b9aSVijay Mahadevan PetscFunctionReturn(0); 648340f3b9aSVijay Mahadevan } 649340f3b9aSVijay Mahadevan 6504920ab11SVijay Mahadevan 65185d305f5SVijay Mahadevan /*@ 65285d305f5SVijay Mahadevan DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities 65385d305f5SVijay Mahadevan 654d083f849SBarry Smith Collective 65585d305f5SVijay Mahadevan 65685d305f5SVijay Mahadevan Input Parameter: 65785d305f5SVijay Mahadevan . dm - The DMMoab object 65885d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 65985d305f5SVijay Mahadevan . conn - The vertex entity handles 66085d305f5SVijay Mahadevan 66185d305f5SVijay Mahadevan Output Parameter: 66285d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities 66385d305f5SVijay Mahadevan 66485d305f5SVijay Mahadevan Level: beginner 66585d305f5SVijay Mahadevan 66685d305f5SVijay Mahadevan .seealso: DMMoabGetVertexConnectivity() 66785d305f5SVijay Mahadevan @*/ 668cade3ad9SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm, PetscInt nconn, const moab::EntityHandle *conn, PetscReal *vpos) 6697023aa44SVijay Mahadevan { 6707023aa44SVijay Mahadevan DM_Moab *dmmoab; 6717023aa44SVijay Mahadevan moab::ErrorCode merr; 6727023aa44SVijay Mahadevan 6737023aa44SVijay Mahadevan PetscFunctionBegin; 6747023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 6757023aa44SVijay Mahadevan PetscValidPointer(conn, 3); 6769c368985SVijay Mahadevan PetscValidPointer(vpos, 4); 6777023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6787023aa44SVijay Mahadevan 6797023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 6809c368985SVijay Mahadevan if (dmmoab->hlevel) { 6819c368985SVijay Mahadevan merr = dmmoab->hierarchy->get_coordinates(const_cast<moab::EntityHandle*>(conn), nconn, dmmoab->hlevel, vpos);MBERRNM(merr); 6829c368985SVijay Mahadevan } 6839c368985SVijay Mahadevan else { 6847023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr); 6859c368985SVijay Mahadevan } 6867023aa44SVijay Mahadevan PetscFunctionReturn(0); 6877023aa44SVijay Mahadevan } 6887023aa44SVijay Mahadevan 6897023aa44SVijay Mahadevan 69085d305f5SVijay Mahadevan /*@ 69185d305f5SVijay Mahadevan DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity 69285d305f5SVijay Mahadevan 693d083f849SBarry Smith Collective 69485d305f5SVijay Mahadevan 69585d305f5SVijay Mahadevan Input Parameter: 69685d305f5SVijay Mahadevan . dm - The DMMoab object 69785d305f5SVijay Mahadevan . vhandle - Vertex entity handle 69885d305f5SVijay Mahadevan 69985d305f5SVijay Mahadevan Output Parameter: 70085d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 70185d305f5SVijay Mahadevan . conn - The vertex entity handles 70285d305f5SVijay Mahadevan 70385d305f5SVijay Mahadevan Level: beginner 70485d305f5SVijay Mahadevan 70585d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabRestoreVertexConnectivity() 70685d305f5SVijay Mahadevan @*/ 70785d305f5SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm, moab::EntityHandle vhandle, PetscInt* nconn, moab::EntityHandle **conn) 7088d8d51c8SVijay Mahadevan { 7098d8d51c8SVijay Mahadevan DM_Moab *dmmoab; 7108d8d51c8SVijay Mahadevan std::vector<moab::EntityHandle> adj_entities, connect; 7118d8d51c8SVijay Mahadevan PetscErrorCode ierr; 7128d8d51c8SVijay Mahadevan moab::ErrorCode merr; 7138d8d51c8SVijay Mahadevan 7148d8d51c8SVijay Mahadevan PetscFunctionBegin; 7158d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 7168d8d51c8SVijay Mahadevan PetscValidPointer(conn, 4); 7178d8d51c8SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7188d8d51c8SVijay Mahadevan 7198d8d51c8SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 72085d305f5SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION); MBERRNM(merr); 7218d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(&adj_entities[0], adj_entities.size(), connect); MBERRNM(merr); 7228d8d51c8SVijay Mahadevan 7238d8d51c8SVijay Mahadevan if (conn) { 7248d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(moab::EntityHandle) * connect.size(), conn);CHKERRQ(ierr); 725580bdb30SBarry Smith ierr = PetscArraycpy(*conn, &connect[0], connect.size());CHKERRQ(ierr); 7268d8d51c8SVijay Mahadevan } 7278d8d51c8SVijay Mahadevan if (nconn) *nconn = connect.size(); 7288d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 7298d8d51c8SVijay Mahadevan } 7308d8d51c8SVijay Mahadevan 7318d8d51c8SVijay Mahadevan 73285d305f5SVijay Mahadevan /*@ 73385d305f5SVijay Mahadevan DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity 73485d305f5SVijay Mahadevan 735d083f849SBarry Smith Collective 73685d305f5SVijay Mahadevan 73785d305f5SVijay Mahadevan Input Parameter: 73885d305f5SVijay Mahadevan . dm - The DMMoab object 73985d305f5SVijay Mahadevan . vhandle - Vertex entity handle 74085d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 74185d305f5SVijay Mahadevan . conn - The vertex entity handles 74285d305f5SVijay Mahadevan 74385d305f5SVijay Mahadevan Level: beginner 74485d305f5SVijay Mahadevan 74585d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity() 74685d305f5SVijay Mahadevan @*/ 7478d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt* nconn, moab::EntityHandle **conn) 7488d8d51c8SVijay Mahadevan { 7498d8d51c8SVijay Mahadevan PetscErrorCode ierr; 7508d8d51c8SVijay Mahadevan 7518d8d51c8SVijay Mahadevan PetscFunctionBegin; 7528d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 7538d8d51c8SVijay Mahadevan PetscValidPointer(conn, 4); 7548d8d51c8SVijay Mahadevan 7558d8d51c8SVijay Mahadevan if (conn) { 7568d8d51c8SVijay Mahadevan ierr = PetscFree(*conn);CHKERRQ(ierr); 7578d8d51c8SVijay Mahadevan } 7588d8d51c8SVijay Mahadevan if (nconn) *nconn = 0; 7598d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 7608d8d51c8SVijay Mahadevan } 7618d8d51c8SVijay Mahadevan 7628d8d51c8SVijay Mahadevan 76385d305f5SVijay Mahadevan /*@ 76485d305f5SVijay Mahadevan DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity 76585d305f5SVijay Mahadevan 766d083f849SBarry Smith Collective 76785d305f5SVijay Mahadevan 76885d305f5SVijay Mahadevan Input Parameter: 76985d305f5SVijay Mahadevan . dm - The DMMoab object 77085d305f5SVijay Mahadevan . ehandle - Vertex entity handle 77185d305f5SVijay Mahadevan 77285d305f5SVijay Mahadevan Output Parameter: 77385d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 77485d305f5SVijay Mahadevan . conn - The vertex entity handles 77585d305f5SVijay Mahadevan 77685d305f5SVijay Mahadevan Level: beginner 77785d305f5SVijay Mahadevan 77885d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity(), DMMoabRestoreVertexConnectivity() 77985d305f5SVijay Mahadevan @*/ 7807023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt* nconn, const moab::EntityHandle **conn) 7817023aa44SVijay Mahadevan { 7827023aa44SVijay Mahadevan DM_Moab *dmmoab; 7837023aa44SVijay Mahadevan const moab::EntityHandle *connect; 7849c368985SVijay Mahadevan std::vector<moab::EntityHandle> vconn; 7857023aa44SVijay Mahadevan moab::ErrorCode merr; 7867023aa44SVijay Mahadevan PetscInt nnodes; 7877023aa44SVijay Mahadevan 7887023aa44SVijay Mahadevan PetscFunctionBegin; 7897023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 7907023aa44SVijay Mahadevan PetscValidPointer(conn, 4); 7917023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7927023aa44SVijay Mahadevan 7937023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 7947023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes); MBERRNM(merr); 7957023aa44SVijay Mahadevan if (conn) *conn = connect; 7967023aa44SVijay Mahadevan if (nconn) *nconn = nnodes; 7977023aa44SVijay Mahadevan PetscFunctionReturn(0); 7987023aa44SVijay Mahadevan } 7997023aa44SVijay Mahadevan 8007023aa44SVijay Mahadevan 80185d305f5SVijay Mahadevan /*@ 80285d305f5SVijay Mahadevan DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element) 80385d305f5SVijay Mahadevan 804d083f849SBarry Smith Collective 80585d305f5SVijay Mahadevan 80685d305f5SVijay Mahadevan Input Parameter: 80785d305f5SVijay Mahadevan . dm - The DMMoab object 80885d305f5SVijay Mahadevan . ent - Entity handle 80985d305f5SVijay Mahadevan 81085d305f5SVijay Mahadevan Output Parameter: 81185d305f5SVijay Mahadevan . ent_on_boundary - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise 81285d305f5SVijay Mahadevan 81385d305f5SVijay Mahadevan Level: beginner 81485d305f5SVijay Mahadevan 81585d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices() 81685d305f5SVijay Mahadevan @*/ 81769263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm, const moab::EntityHandle ent, PetscBool* ent_on_boundary) 81869263071SVijay Mahadevan { 81969263071SVijay Mahadevan moab::EntityType etype; 82069263071SVijay Mahadevan DM_Moab *dmmoab; 82169263071SVijay Mahadevan PetscInt edim; 82269263071SVijay Mahadevan 82369263071SVijay Mahadevan PetscFunctionBegin; 82469263071SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 82569263071SVijay Mahadevan PetscValidPointer(ent_on_boundary, 3); 82669263071SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 82769263071SVijay Mahadevan 82869263071SVijay Mahadevan /* get the entity type and handle accordingly */ 82969263071SVijay Mahadevan etype = dmmoab->mbiface->type_from_handle(ent); 83069263071SVijay 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); 83169263071SVijay Mahadevan 83269263071SVijay Mahadevan /* get the entity dimension */ 83369263071SVijay Mahadevan edim = dmmoab->mbiface->dimension_from_handle(ent); 83469263071SVijay Mahadevan 83569263071SVijay Mahadevan *ent_on_boundary = PETSC_FALSE; 83669263071SVijay Mahadevan if (etype == moab::MBVERTEX && edim == 0) { 83749d66b22SVijay Mahadevan *ent_on_boundary = ((dmmoab->bndyvtx->index(ent) >= 0) ? PETSC_TRUE : PETSC_FALSE); 83869263071SVijay Mahadevan } 83969263071SVijay Mahadevan else { 84069263071SVijay Mahadevan if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */ 8416d9eb265SVijay Mahadevan if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE; 84269263071SVijay Mahadevan } 84369263071SVijay Mahadevan else { /* next check the lower-dimensional faces */ 8446d9eb265SVijay Mahadevan if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE; 84569263071SVijay Mahadevan } 84669263071SVijay Mahadevan } 84769263071SVijay Mahadevan PetscFunctionReturn(0); 84869263071SVijay Mahadevan } 84969263071SVijay Mahadevan 85069263071SVijay Mahadevan 85185d305f5SVijay Mahadevan /*@ 85285d305f5SVijay Mahadevan DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element) 85385d305f5SVijay Mahadevan 85485d305f5SVijay Mahadevan Input Parameter: 85585d305f5SVijay Mahadevan . dm - The DMMoab object 85685d305f5SVijay Mahadevan . nconn - Number of handles 85785d305f5SVijay Mahadevan . cnt - Array of entity handles 85885d305f5SVijay Mahadevan 85985d305f5SVijay Mahadevan Output Parameter: 86085d305f5SVijay Mahadevan . isbdvtx - Array of boundary markers - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise 86185d305f5SVijay Mahadevan 86285d305f5SVijay Mahadevan Level: beginner 86385d305f5SVijay Mahadevan 86485d305f5SVijay Mahadevan .seealso: DMMoabIsEntityOnBoundary() 86585d305f5SVijay Mahadevan @*/ 86669263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm, PetscInt nconn, const moab::EntityHandle *cnt, PetscBool* isbdvtx) 8677023aa44SVijay Mahadevan { 8687023aa44SVijay Mahadevan DM_Moab *dmmoab; 8697023aa44SVijay Mahadevan PetscInt i; 8707023aa44SVijay Mahadevan 8717023aa44SVijay Mahadevan PetscFunctionBegin; 8727023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 8737023aa44SVijay Mahadevan PetscValidPointer(cnt, 3); 8747023aa44SVijay Mahadevan PetscValidPointer(isbdvtx, 4); 8757023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8767023aa44SVijay Mahadevan 8777023aa44SVijay Mahadevan for (i = 0; i < nconn; ++i) { 8786d9eb265SVijay Mahadevan isbdvtx[i] = (dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE : PETSC_FALSE); 8797023aa44SVijay Mahadevan } 8807023aa44SVijay Mahadevan PetscFunctionReturn(0); 8817023aa44SVijay Mahadevan } 8827023aa44SVijay Mahadevan 8837023aa44SVijay Mahadevan 88485d305f5SVijay Mahadevan /*@ 88585d305f5SVijay Mahadevan DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary 88685d305f5SVijay Mahadevan 88785d305f5SVijay Mahadevan Input Parameter: 88885d305f5SVijay Mahadevan . dm - The DMMoab object 88985d305f5SVijay Mahadevan 89085d305f5SVijay Mahadevan Output Parameter: 89185d305f5SVijay Mahadevan . bdvtx - Boundary vertices 89285d305f5SVijay Mahadevan . bdelems - Boundary elements 89385d305f5SVijay Mahadevan . bdfaces - Boundary faces 89485d305f5SVijay Mahadevan 89585d305f5SVijay Mahadevan Level: beginner 89685d305f5SVijay Mahadevan 89785d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices(), DMMoabIsEntityOnBoundary() 89885d305f5SVijay Mahadevan @*/ 8996d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm, const moab::Range **bdvtx, const moab::Range** bdelems, const moab::Range** bdfaces) 9001cec0304SVijay Mahadevan { 9011cec0304SVijay Mahadevan DM_Moab *dmmoab; 9021cec0304SVijay Mahadevan 9031cec0304SVijay Mahadevan PetscFunctionBegin; 9041cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 9051cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 9061cec0304SVijay Mahadevan 9076d9eb265SVijay Mahadevan if (bdvtx) *bdvtx = dmmoab->bndyvtx; 9086d9eb265SVijay Mahadevan if (bdfaces) *bdfaces = dmmoab->bndyfaces; 9096d9eb265SVijay Mahadevan if (bdelems) *bdfaces = dmmoab->bndyelems; 9101cec0304SVijay Mahadevan PetscFunctionReturn(0); 9111cec0304SVijay Mahadevan } 9121cec0304SVijay Mahadevan 913f6829af0SVijay Mahadevan 914f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm) 915f6829af0SVijay Mahadevan { 916f6829af0SVijay Mahadevan PetscErrorCode ierr; 91785d305f5SVijay Mahadevan PetscInt i; 918e882eb38SVijay Mahadevan moab::ErrorCode merr; 919f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 920f6829af0SVijay Mahadevan 921f6829af0SVijay Mahadevan PetscFunctionBegin; 922f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 923304006b3SVijay Mahadevan 924304006b3SVijay Mahadevan dmmoab->refct--; 925304006b3SVijay Mahadevan if (!dmmoab->refct) { 926f6829af0SVijay Mahadevan delete dmmoab->vlocal; 927f6829af0SVijay Mahadevan delete dmmoab->vowned; 928f6829af0SVijay Mahadevan delete dmmoab->vghost; 929f6829af0SVijay Mahadevan delete dmmoab->elocal; 930f6829af0SVijay Mahadevan delete dmmoab->eghost; 931f6829af0SVijay Mahadevan delete dmmoab->bndyvtx; 932f6829af0SVijay Mahadevan delete dmmoab->bndyfaces; 933f6829af0SVijay Mahadevan delete dmmoab->bndyelems; 934f6829af0SVijay Mahadevan 935f6829af0SVijay Mahadevan ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr); 9367ae5e5b6SVijay Mahadevan ierr = PetscFree2(dmmoab->gidmap, dmmoab->lidmap);CHKERRQ(ierr); 9375905e1eaSVijay Mahadevan ierr = PetscFree(dmmoab->dfill);CHKERRQ(ierr); 9385905e1eaSVijay Mahadevan ierr = PetscFree(dmmoab->ofill);CHKERRQ(ierr); 9399c368985SVijay Mahadevan ierr = PetscFree(dmmoab->materials);CHKERRQ(ierr); 94085d305f5SVijay Mahadevan if (dmmoab->fieldNames) { 94185d305f5SVijay Mahadevan for (i = 0; i < dmmoab->numFields; i++) { 94285d305f5SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr); 94385d305f5SVijay Mahadevan } 94485d305f5SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr); 94585d305f5SVijay Mahadevan } 946b117cd09SVijay Mahadevan 947b117cd09SVijay Mahadevan if (dmmoab->nhlevels) { 948b117cd09SVijay Mahadevan ierr = PetscFree(dmmoab->hsets);CHKERRQ(ierr); 949e882eb38SVijay Mahadevan dmmoab->nhlevels = 0; 950e882eb38SVijay Mahadevan if (!dmmoab->hlevel && dmmoab->icreatedinstance) delete dmmoab->hierarchy; 951e882eb38SVijay Mahadevan dmmoab->hierarchy = NULL; 952b117cd09SVijay Mahadevan } 953e882eb38SVijay Mahadevan 954e882eb38SVijay Mahadevan if (dmmoab->icreatedinstance) { 9559c368985SVijay Mahadevan delete dmmoab->pcomm; 956e882eb38SVijay Mahadevan merr = dmmoab->mbiface->delete_mesh(); MBERRNM(merr); 957e882eb38SVijay Mahadevan delete dmmoab->mbiface; 958e882eb38SVijay Mahadevan } 959e882eb38SVijay Mahadevan dmmoab->mbiface = NULL; 9609daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 961e882eb38SVijay Mahadevan dmmoab->pcomm = NULL; 9629daf19fdSVijay Mahadevan #endif 963f6829af0SVijay Mahadevan ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 964f6829af0SVijay Mahadevan ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr); 965f6829af0SVijay Mahadevan ierr = PetscFree(dm->data);CHKERRQ(ierr); 966304006b3SVijay Mahadevan } 967f6829af0SVijay Mahadevan PetscFunctionReturn(0); 968f6829af0SVijay Mahadevan } 969f6829af0SVijay Mahadevan 970f6829af0SVijay Mahadevan 9714416b707SBarry Smith PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(PetscOptionItems *PetscOptionsObject, DM dm) 9722e4e7c01SVijay Mahadevan { 9732e4e7c01SVijay Mahadevan PetscErrorCode ierr; 9742e4e7c01SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 9752e4e7c01SVijay Mahadevan 9762e4e7c01SVijay Mahadevan PetscFunctionBegin; 9772e4e7c01SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 978cc310fddSBarry Smith ierr = PetscOptionsHead(PetscOptionsObject, "DMMoab Options");CHKERRQ(ierr); 9792e4e7c01SVijay 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); 9802e4e7c01SVijay 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); 9812e4e7c01SVijay Mahadevan /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */ 9822e4e7c01SVijay 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); 9832e4e7c01SVijay 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); 9842e4e7c01SVijay Mahadevan ierr = PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum*)&dmmoab->read_mode, NULL);CHKERRQ(ierr); 9852e4e7c01SVijay Mahadevan ierr = PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum*)&dmmoab->write_mode, NULL);CHKERRQ(ierr); 9862e4e7c01SVijay Mahadevan PetscFunctionReturn(0); 9872e4e7c01SVijay Mahadevan } 9882e4e7c01SVijay Mahadevan 9892e4e7c01SVijay Mahadevan 990f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm) 991f6829af0SVijay Mahadevan { 992f6829af0SVijay Mahadevan PetscErrorCode ierr; 993f6829af0SVijay Mahadevan moab::ErrorCode merr; 994f6829af0SVijay Mahadevan Vec local, global; 995f6829af0SVijay Mahadevan IS from, to; 996f6829af0SVijay Mahadevan moab::Range::iterator iter; 997304006b3SVijay Mahadevan PetscInt i, j, f, bs, vent, totsize, *lgmap; 998f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 999f6829af0SVijay Mahadevan moab::Range adjs; 1000f6829af0SVijay Mahadevan 1001f6829af0SVijay Mahadevan PetscFunctionBegin; 1002f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1003f6829af0SVijay Mahadevan /* Get the local and shared vertices and cache it */ 10049daf19fdSVijay Mahadevan if (dmmoab->mbiface == NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface before calling SetUp."); 10059daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 10069daf19fdSVijay Mahadevan if (dmmoab->pcomm == NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB ParallelComm object before calling SetUp."); 10079daf19fdSVijay Mahadevan #endif 1008f6829af0SVijay Mahadevan 1009f6829af0SVijay Mahadevan /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */ 1010f6829af0SVijay Mahadevan if (dmmoab->vlocal->empty()) 1011f6829af0SVijay Mahadevan { 101249d66b22SVijay Mahadevan //merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr); 101349d66b22SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, 0, *dmmoab->vlocal, false); MBERRNM(merr); 1014f6829af0SVijay Mahadevan 10159daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1016f6829af0SVijay Mahadevan /* filter based on parallel status */ 1017f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned); MBERRNM(merr); 1018f6829af0SVijay Mahadevan 1019f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 10209c368985SVijay Mahadevan // *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 1021f6829af0SVijay Mahadevan adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 102264e1c140SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(adjs, PSTATUS_GHOST | PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost); MBERRNM(merr); 1023f6829af0SVijay Mahadevan adjs = moab::subtract(adjs, *dmmoab->vghost); 1024f6829af0SVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs); 10259daf19fdSVijay Mahadevan #else 10269daf19fdSVijay Mahadevan *dmmoab->vowned = *dmmoab->vlocal; 10279daf19fdSVijay Mahadevan #endif 1028f6829af0SVijay Mahadevan 1029f6829af0SVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 1030f6829af0SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 1031f6829af0SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 103249d66b22SVijay Mahadevan 10339daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1034b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 103549d66b22SVijay Mahadevan PetscInfo4(NULL, "Filset ID: %u, Vertices: local - %D, owned - %D, ghosted - %D.\n", dmmoab->fileset, dmmoab->vlocal->size(), dmmoab->nloc, dmmoab->nghost); 10369daf19fdSVijay Mahadevan #else 10379daf19fdSVijay Mahadevan dmmoab->n = dmmoab->nloc; 10389daf19fdSVijay Mahadevan #endif 1039f6829af0SVijay Mahadevan } 1040f6829af0SVijay Mahadevan 1041f6829af0SVijay Mahadevan { 1042f6829af0SVijay Mahadevan /* get the information about the local elements in the mesh */ 1043f6829af0SVijay Mahadevan dmmoab->eghost->clear(); 1044f6829af0SVijay Mahadevan 1045f6829af0SVijay Mahadevan /* first decipher the leading dimension */ 1046f6829af0SVijay Mahadevan for (i = 3; i > 0; i--) { 1047f6829af0SVijay Mahadevan dmmoab->elocal->clear(); 104849d66b22SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, false); MBERRNM(merr); 1049f6829af0SVijay Mahadevan 1050f6829af0SVijay Mahadevan /* store the current mesh dimension */ 1051f6829af0SVijay Mahadevan if (dmmoab->elocal->size()) { 1052f6829af0SVijay Mahadevan dmmoab->dim = i; 1053f6829af0SVijay Mahadevan break; 1054f6829af0SVijay Mahadevan } 1055f6829af0SVijay Mahadevan } 1056f6829af0SVijay Mahadevan 1057b117cd09SVijay Mahadevan ierr = DMSetDimension(dm, dmmoab->dim);CHKERRQ(ierr); 1058b117cd09SVijay Mahadevan 10599daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1060f6829af0SVijay Mahadevan /* filter the ghosted and owned element list */ 1061f6829af0SVijay Mahadevan *dmmoab->eghost = *dmmoab->elocal; 1062f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr); 1063f6829af0SVijay Mahadevan *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal); 10649daf19fdSVijay Mahadevan #endif 1065f6829af0SVijay Mahadevan 1066f6829af0SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 1067f6829af0SVijay Mahadevan dmmoab->neleghost = dmmoab->eghost->size(); 106849d66b22SVijay Mahadevan 10699daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1070b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 107149d66b22SVijay Mahadevan PetscInfo3(NULL, "%d-dim elements: owned - %D, ghosted - %D.\n", dmmoab->dim, dmmoab->neleloc, dmmoab->neleghost); 10729daf19fdSVijay Mahadevan #else 10739daf19fdSVijay Mahadevan dmmoab->nele = dmmoab->neleloc; 10749daf19fdSVijay Mahadevan #endif 1075f6829af0SVijay Mahadevan } 1076f6829af0SVijay Mahadevan 1077f6829af0SVijay Mahadevan bs = dmmoab->bs; 1078f6829af0SVijay Mahadevan if (!dmmoab->ltog_tag) { 1079f6829af0SVijay Mahadevan /* Get the global ID tag. The global ID tag is applied to each 1080f6829af0SVijay Mahadevan vertex. It acts as an global identifier which MOAB uses to 1081f6829af0SVijay Mahadevan assemble the individual pieces of the mesh */ 1082f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag); MBERRNM(merr); 1083f6829af0SVijay Mahadevan } 1084f6829af0SVijay Mahadevan 1085f6829af0SVijay Mahadevan totsize = dmmoab->vlocal->size(); 108649d66b22SVijay 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); 108749d66b22SVijay Mahadevan ierr = PetscCalloc1(totsize, &dmmoab->gsindices);CHKERRQ(ierr); 1088f6829af0SVijay Mahadevan { 1089f6829af0SVijay Mahadevan /* first get the local indices */ 1090f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vowned, &dmmoab->gsindices[0]); MBERRNM(merr); 10913f1c6e43SVijay Mahadevan if (dmmoab->nghost) { /* next get the ghosted indices */ 1092f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vghost, &dmmoab->gsindices[dmmoab->nloc]); MBERRNM(merr); 1093f6829af0SVijay Mahadevan } 1094f6829af0SVijay Mahadevan 1095f6829af0SVijay Mahadevan /* find out the local and global minima of GLOBAL_ID */ 1096304006b3SVijay Mahadevan dmmoab->lminmax[0] = dmmoab->lminmax[1] = dmmoab->gsindices[0]; 1097f6829af0SVijay Mahadevan for (i = 0; i < totsize; ++i) { 1098304006b3SVijay Mahadevan if (dmmoab->lminmax[0] > dmmoab->gsindices[i]) dmmoab->lminmax[0] = dmmoab->gsindices[i]; 1099304006b3SVijay Mahadevan if (dmmoab->lminmax[1] < dmmoab->gsindices[i]) dmmoab->lminmax[1] = dmmoab->gsindices[i]; 1100f6829af0SVijay Mahadevan } 1101f6829af0SVijay Mahadevan 1102304006b3SVijay Mahadevan ierr = MPIU_Allreduce(&dmmoab->lminmax[0], &dmmoab->gminmax[0], 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr); 1103304006b3SVijay Mahadevan ierr = MPIU_Allreduce(&dmmoab->lminmax[1], &dmmoab->gminmax[1], 1, MPI_INT, MPI_MAX, ((PetscObject)dm)->comm);CHKERRQ(ierr); 1104f6829af0SVijay Mahadevan 1105f6829af0SVijay Mahadevan /* set the GID map */ 1106f6829af0SVijay Mahadevan for (i = 0; i < totsize; ++i) { 1107304006b3SVijay Mahadevan dmmoab->gsindices[i] -= dmmoab->gminmax[0]; /* zero based index needed for IS */ 11089c368985SVijay Mahadevan 1109f6829af0SVijay Mahadevan } 1110304006b3SVijay Mahadevan dmmoab->lminmax[0] -= dmmoab->gminmax[0]; 1111304006b3SVijay Mahadevan dmmoab->lminmax[1] -= dmmoab->gminmax[0]; 1112f6829af0SVijay Mahadevan 1113304006b3SVijay 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]); 1114f6829af0SVijay Mahadevan } 111582dfd14aSVijay 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); 1116f6829af0SVijay Mahadevan 1117f6829af0SVijay Mahadevan { 11189c368985SVijay Mahadevan dmmoab->seqstart = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->front()); 11199c368985SVijay Mahadevan dmmoab->seqend = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->back()); 1120304006b3SVijay Mahadevan PetscInfo2(NULL, "SEQUENCE: Local [min, max] - [%D, %D]\n", dmmoab->seqstart, dmmoab->seqend); 11213f1c6e43SVijay Mahadevan 112249d66b22SVijay Mahadevan ierr = PetscMalloc2(dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->gidmap, dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->lidmap);CHKERRQ(ierr); 11233f1c6e43SVijay Mahadevan ierr = PetscMalloc1(totsize * dmmoab->numFields, &lgmap);CHKERRQ(ierr); 1124f6829af0SVijay Mahadevan 1125f6829af0SVijay Mahadevan i = j = 0; 1126f6829af0SVijay Mahadevan /* set the owned vertex data first */ 1127f6829af0SVijay Mahadevan for (moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++, i++) { 1128e92d1c7cSVijay Mahadevan vent = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart; 1129f6829af0SVijay Mahadevan dmmoab->gidmap[vent] = dmmoab->gsindices[i]; 1130f6829af0SVijay Mahadevan dmmoab->lidmap[vent] = i; 1131f6829af0SVijay Mahadevan for (f = 0; f < dmmoab->numFields; f++, j++) { 11323f1c6e43SVijay Mahadevan lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]); 1133f6829af0SVijay Mahadevan } 1134f6829af0SVijay Mahadevan } 1135f6829af0SVijay Mahadevan /* next arrange all the ghosted data information */ 1136f6829af0SVijay Mahadevan for (moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++, i++) { 1137e92d1c7cSVijay Mahadevan vent = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart; 1138f6829af0SVijay Mahadevan dmmoab->gidmap[vent] = dmmoab->gsindices[i]; 1139f6829af0SVijay Mahadevan dmmoab->lidmap[vent] = i; 1140f6829af0SVijay Mahadevan for (f = 0; f < dmmoab->numFields; f++, j++) { 11413f1c6e43SVijay Mahadevan lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]); 1142f6829af0SVijay Mahadevan } 1143f6829af0SVijay Mahadevan } 1144f6829af0SVijay Mahadevan 1145f6829af0SVijay Mahadevan /* We need to create the Global to Local Vector Scatter Contexts 1146f6829af0SVijay Mahadevan 1) First create a local and global vector 1147f6829af0SVijay Mahadevan 2) Create a local and global IS 1148f6829af0SVijay Mahadevan 3) Create VecScatter and LtoGMapping objects 1149f6829af0SVijay Mahadevan 4) Cleanup the IS and Vec objects 1150f6829af0SVijay Mahadevan */ 1151f6829af0SVijay Mahadevan ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr); 1152f6829af0SVijay Mahadevan ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr); 1153f6829af0SVijay Mahadevan 1154f6829af0SVijay Mahadevan ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr); 1155f6829af0SVijay Mahadevan 1156f6829af0SVijay Mahadevan /* global to local must retrieve ghost points */ 1157f6829af0SVijay Mahadevan ierr = ISCreateStride(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, dmmoab->vstart, 1, &from);CHKERRQ(ierr); 1158f6829af0SVijay Mahadevan ierr = ISSetBlockSize(from, bs);CHKERRQ(ierr); 1159f6829af0SVijay Mahadevan 11603f1c6e43SVijay Mahadevan ierr = ISCreateGeneral(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, &lgmap[0], PETSC_COPY_VALUES, &to);CHKERRQ(ierr); 1161f6829af0SVijay Mahadevan ierr = ISSetBlockSize(to, bs);CHKERRQ(ierr); 1162f6829af0SVijay Mahadevan 1163f6829af0SVijay Mahadevan if (!dmmoab->ltog_map) { 1164f6829af0SVijay Mahadevan /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */ 11653f1c6e43SVijay Mahadevan ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm, dmmoab->bs, totsize * dmmoab->numFields, lgmap, 1166f6829af0SVijay Mahadevan PETSC_COPY_VALUES, &dmmoab->ltog_map);CHKERRQ(ierr); 1167f6829af0SVijay Mahadevan } 1168f6829af0SVijay Mahadevan 1169f6829af0SVijay Mahadevan /* now create the scatter object from local to global vector */ 11709448b7f1SJunchao Zhang ierr = VecScatterCreate(local, from, global, to, &dmmoab->ltog_sendrecv);CHKERRQ(ierr); 1171f6829af0SVijay Mahadevan 1172f6829af0SVijay Mahadevan /* clean up IS, Vec */ 11733f1c6e43SVijay Mahadevan ierr = PetscFree(lgmap);CHKERRQ(ierr); 1174f6829af0SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 1175f6829af0SVijay Mahadevan ierr = ISDestroy(&to);CHKERRQ(ierr); 1176f6829af0SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 1177f6829af0SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 1178f6829af0SVijay Mahadevan } 1179f6829af0SVijay Mahadevan 118049d66b22SVijay Mahadevan dmmoab->bndyvtx = new moab::Range(); 118149d66b22SVijay Mahadevan dmmoab->bndyfaces = new moab::Range(); 118249d66b22SVijay Mahadevan dmmoab->bndyelems = new moab::Range(); 1183f6829af0SVijay Mahadevan /* skin the boundary and store nodes */ 11849c368985SVijay Mahadevan if (!dmmoab->hlevel) { 1185f6829af0SVijay Mahadevan /* get the skin vertices of boundary faces for the current partition and then filter 1186f6829af0SVijay Mahadevan the local, boundary faces, vertices and elements alone via PSTATUS flags; 1187f6829af0SVijay Mahadevan this should not give us any ghosted boundary, but if user needs such a functionality 1188f6829af0SVijay Mahadevan it would be easy to add it based on the find_skin query below */ 1189f6829af0SVijay Mahadevan moab::Skinner skinner(dmmoab->mbiface); 1190f6829af0SVijay Mahadevan 1191f6829af0SVijay Mahadevan /* get the entities on the skin - only the faces */ 11922417220eSVijay 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 1193f6829af0SVijay Mahadevan 11949daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1195f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 1196f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr); 11972417220eSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_INTERFACE, PSTATUS_NOT); MBERRNM(merr); 11989daf19fdSVijay Mahadevan #endif 1199f6829af0SVijay Mahadevan 1200f6829af0SVijay Mahadevan /* get all the nodes via connectivity and the parent elements via adjacency information */ 1201f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false); MBERRNM(ierr); 1202755f3dfbSVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyvtx, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION); MBERRNM(ierr); 1203f6829af0SVijay Mahadevan } 12049c368985SVijay Mahadevan else { 12059c368985SVijay Mahadevan /* Let us query the hierarchy manager and get the results directly for this level */ 12069c368985SVijay Mahadevan for (moab::Range::iterator iter = dmmoab->elocal->begin(); iter != dmmoab->elocal->end(); iter++) { 12079c368985SVijay Mahadevan moab::EntityHandle elemHandle = *iter; 12089c368985SVijay Mahadevan if (dmmoab->hierarchy->is_entity_on_boundary(elemHandle)) { 12099c368985SVijay Mahadevan dmmoab->bndyelems->insert(elemHandle); 12109c368985SVijay Mahadevan /* For this boundary element, query the vertices and add them to the list */ 12119c368985SVijay Mahadevan std::vector<moab::EntityHandle> connect; 12129c368985SVijay Mahadevan merr = dmmoab->hierarchy->get_connectivity(elemHandle, dmmoab->hlevel, connect); MBERRNM(ierr); 12139c368985SVijay Mahadevan for (unsigned iv=0; iv < connect.size(); ++iv) 12149c368985SVijay Mahadevan if (dmmoab->hierarchy->is_entity_on_boundary(connect[iv])) 12159c368985SVijay Mahadevan dmmoab->bndyvtx->insert(connect[iv]); 12169c368985SVijay Mahadevan /* Next, let us query the boundary faces and add them also to the list */ 12179c368985SVijay Mahadevan std::vector<moab::EntityHandle> faces; 12189c368985SVijay Mahadevan merr = dmmoab->hierarchy->get_adjacencies(elemHandle, dmmoab->dim-1, faces); MBERRNM(ierr); 12199c368985SVijay Mahadevan for (unsigned ifa=0; ifa < faces.size(); ++ifa) 12209c368985SVijay Mahadevan if (dmmoab->hierarchy->is_entity_on_boundary(faces[ifa])) 12219c368985SVijay Mahadevan dmmoab->bndyfaces->insert(faces[ifa]); 12229c368985SVijay Mahadevan } 12239c368985SVijay Mahadevan } 12249c368985SVijay Mahadevan #ifdef MOAB_HAVE_MPI 12259c368985SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 12269c368985SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyvtx, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr); 12279c368985SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr); 12289c368985SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyelems, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr); 12299c368985SVijay Mahadevan #endif 12309c368985SVijay Mahadevan 12319c368985SVijay Mahadevan } 123249d66b22SVijay Mahadevan PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyfaces->size(), dmmoab->bndyelems->size()); 1233a044f6b6SVijay Mahadevan 1234a044f6b6SVijay Mahadevan /* Get the material sets and populate the data for all locally owned elements */ 1235a044f6b6SVijay Mahadevan { 1236a044f6b6SVijay Mahadevan ierr = PetscCalloc1(dmmoab->elocal->size(), &dmmoab->materials);CHKERRQ(ierr); 1237a044f6b6SVijay Mahadevan /* Get the count of entities of particular type from dmmoab->elocal 1238a044f6b6SVijay Mahadevan -- Then, for each non-zero type, loop through and query the fileset to get the material tag data */ 1239a044f6b6SVijay Mahadevan moab::Range msets; 1240a044f6b6SVijay 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); 1241a044f6b6SVijay Mahadevan if (msets.size() == 0) { 1242a044f6b6SVijay Mahadevan PetscInfo(NULL, "No material sets found in the fileset."); 1243a044f6b6SVijay Mahadevan } 1244a044f6b6SVijay Mahadevan 1245a044f6b6SVijay Mahadevan for (unsigned i=0; i < msets.size(); ++i) { 1246a044f6b6SVijay Mahadevan moab::Range msetelems; 1247a044f6b6SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(msets[i], dmmoab->dim, msetelems, true);MB_CHK_ERR(merr); 1248aedf4482SVijay Mahadevan #ifdef MOAB_HAVE_MPI 1249aedf4482SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 1250aedf4482SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(msetelems, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr); 1251aedf4482SVijay Mahadevan #endif 1252a044f6b6SVijay Mahadevan 1253a044f6b6SVijay Mahadevan int partID; 1254a044f6b6SVijay Mahadevan moab::EntityHandle mset=msets[i]; 1255a044f6b6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &mset, 1, &partID);MB_CHK_ERR(merr); 1256a044f6b6SVijay Mahadevan 1257a044f6b6SVijay Mahadevan for (unsigned j=0; j < msetelems.size(); ++j) 1258a044f6b6SVijay Mahadevan dmmoab->materials[dmmoab->elocal->index(msetelems[j])]=partID; 1259a044f6b6SVijay Mahadevan } 1260a044f6b6SVijay Mahadevan } 1261a044f6b6SVijay Mahadevan 1262f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1263f6829af0SVijay Mahadevan } 1264f6829af0SVijay Mahadevan 1265304006b3SVijay Mahadevan 1266304006b3SVijay Mahadevan /*@ 1267304006b3SVijay Mahadevan DMMoabCreateVertices - Creates and adds several vertices to the primary set represented by the DM. 1268304006b3SVijay Mahadevan 1269d083f849SBarry Smith Collective 1270304006b3SVijay Mahadevan 1271304006b3SVijay Mahadevan Input Parameters: 1272304006b3SVijay Mahadevan + dm - The DM object 1273304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra) 1274304006b3SVijay Mahadevan . conn - The connectivity of the element 1275304006b3SVijay Mahadevan . nverts - The number of vertices that form the element 1276304006b3SVijay Mahadevan 1277304006b3SVijay Mahadevan Output Parameter: 1278304006b3SVijay Mahadevan . overts - The list of vertices that were created (can be NULL) 1279304006b3SVijay Mahadevan 1280304006b3SVijay Mahadevan Level: beginner 1281304006b3SVijay Mahadevan 1282304006b3SVijay Mahadevan .seealso: DMMoabCreateSubmesh(), DMMoabCreateElement() 1283304006b3SVijay Mahadevan @*/ 1284304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateVertices(DM dm, const PetscReal* coords, PetscInt nverts, moab::Range* overts) 1285304006b3SVijay Mahadevan { 1286304006b3SVijay Mahadevan moab::ErrorCode merr; 1287304006b3SVijay Mahadevan DM_Moab *dmmoab; 1288304006b3SVijay Mahadevan moab::Range verts; 1289304006b3SVijay Mahadevan 1290304006b3SVijay Mahadevan PetscFunctionBegin; 1291304006b3SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1292304006b3SVijay Mahadevan PetscValidPointer(coords, 2); 1293304006b3SVijay Mahadevan 1294304006b3SVijay Mahadevan dmmoab = (DM_Moab*) dm->data; 1295304006b3SVijay Mahadevan 1296304006b3SVijay Mahadevan /* Insert new points */ 1297304006b3SVijay Mahadevan merr = dmmoab->mbiface->create_vertices(&coords[0], nverts, verts); MBERRNM(merr); 1298304006b3SVijay Mahadevan merr = dmmoab->mbiface->add_entities(dmmoab->fileset, verts); MBERRNM(merr); 1299304006b3SVijay Mahadevan 1300304006b3SVijay Mahadevan if (overts) *overts = verts; 1301304006b3SVijay Mahadevan PetscFunctionReturn(0); 1302304006b3SVijay Mahadevan } 1303304006b3SVijay Mahadevan 1304304006b3SVijay Mahadevan 1305304006b3SVijay Mahadevan /*@ 1306304006b3SVijay Mahadevan DMMoabCreateElement - Adds an element of specified type to the primary set represented by the DM. 1307304006b3SVijay Mahadevan 1308d083f849SBarry Smith Collective 1309304006b3SVijay Mahadevan 1310304006b3SVijay Mahadevan Input Parameters: 1311304006b3SVijay Mahadevan + dm - The DM object 1312304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra) 1313304006b3SVijay Mahadevan . conn - The connectivity of the element 1314304006b3SVijay Mahadevan . nverts - The number of vertices that form the element 1315304006b3SVijay Mahadevan 1316304006b3SVijay Mahadevan Output Parameter: 1317304006b3SVijay Mahadevan . oelem - The handle to the element created and added to the DM object 1318304006b3SVijay Mahadevan 1319304006b3SVijay Mahadevan Level: beginner 1320304006b3SVijay Mahadevan 1321304006b3SVijay Mahadevan .seealso: DMMoabCreateSubmesh(), DMMoabCreateVertices() 1322304006b3SVijay Mahadevan @*/ 1323304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateElement(DM dm, const moab::EntityType type, const moab::EntityHandle* conn, PetscInt nverts, moab::EntityHandle* oelem) 1324304006b3SVijay Mahadevan { 1325304006b3SVijay Mahadevan moab::ErrorCode merr; 1326304006b3SVijay Mahadevan DM_Moab *dmmoab; 1327304006b3SVijay Mahadevan moab::EntityHandle elem; 1328304006b3SVijay Mahadevan 1329304006b3SVijay Mahadevan PetscFunctionBegin; 1330304006b3SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1331304006b3SVijay Mahadevan PetscValidPointer(conn, 3); 1332304006b3SVijay Mahadevan 1333304006b3SVijay Mahadevan dmmoab = (DM_Moab*) dm->data; 1334304006b3SVijay Mahadevan 1335304006b3SVijay Mahadevan /* Insert new element */ 1336304006b3SVijay Mahadevan merr = dmmoab->mbiface->create_element(type, conn, nverts, elem); MBERRNM(merr); 1337304006b3SVijay Mahadevan merr = dmmoab->mbiface->add_entities(dmmoab->fileset, &elem, 1); MBERRNM(merr); 1338304006b3SVijay Mahadevan 1339304006b3SVijay Mahadevan if (oelem) *oelem = elem; 1340304006b3SVijay Mahadevan PetscFunctionReturn(0); 1341304006b3SVijay Mahadevan } 1342304006b3SVijay Mahadevan 1343304006b3SVijay Mahadevan 1344304006b3SVijay Mahadevan /*@ 1345304006b3SVijay Mahadevan DMMoabCreateSubmesh - Creates a sub-DM object with a set that contains all vertices/elements of the parent 1346304006b3SVijay Mahadevan in addition to providing support for dynamic mesh modifications. This is useful for AMR calculations to 1347304006b3SVijay Mahadevan create a DM object on a refined level. 1348304006b3SVijay Mahadevan 1349d083f849SBarry Smith Collective 1350304006b3SVijay Mahadevan 1351304006b3SVijay Mahadevan Input Parameters: 1352304006b3SVijay Mahadevan + dm - The DM object 1353304006b3SVijay Mahadevan 1354304006b3SVijay Mahadevan Output Parameter: 1355304006b3SVijay Mahadevan . newdm - The sub DM object with updated set information 1356304006b3SVijay Mahadevan 1357304006b3SVijay Mahadevan Level: advanced 1358304006b3SVijay Mahadevan 1359304006b3SVijay Mahadevan .seealso: DMCreate(), DMMoabCreateVertices(), DMMoabCreateElement() 1360304006b3SVijay Mahadevan @*/ 1361304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateSubmesh(DM dm, DM *newdm) 1362304006b3SVijay Mahadevan { 1363304006b3SVijay Mahadevan DM_Moab *dmmoab; 1364304006b3SVijay Mahadevan DM_Moab *ndmmoab; 1365304006b3SVijay Mahadevan moab::ErrorCode merr; 1366304006b3SVijay Mahadevan PetscErrorCode ierr; 1367304006b3SVijay Mahadevan 1368304006b3SVijay Mahadevan PetscFunctionBegin; 1369304006b3SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1370304006b3SVijay Mahadevan 1371304006b3SVijay Mahadevan dmmoab = (DM_Moab*) dm->data; 1372304006b3SVijay Mahadevan 1373304006b3SVijay Mahadevan /* Create the basic DMMoab object and keep the default parameters created by DM impls */ 13749daf19fdSVijay Mahadevan ierr = DMMoabCreateMoab(((PetscObject)dm)->comm, dmmoab->mbiface, &dmmoab->ltog_tag, PETSC_NULL, newdm);CHKERRQ(ierr); 1375304006b3SVijay Mahadevan 1376304006b3SVijay Mahadevan /* get all the necessary handles from the private DM object */ 1377304006b3SVijay Mahadevan ndmmoab = (DM_Moab*) (*newdm)->data; 1378304006b3SVijay Mahadevan 1379304006b3SVijay Mahadevan /* set the sub-mesh's parent DM reference */ 1380304006b3SVijay Mahadevan ndmmoab->parent = &dm; 1381304006b3SVijay Mahadevan 1382304006b3SVijay Mahadevan /* create a file set to associate all entities in current mesh */ 1383304006b3SVijay Mahadevan merr = ndmmoab->mbiface->create_meshset(moab::MESHSET_SET, ndmmoab->fileset); MBERR("Creating file set failed", merr); 1384304006b3SVijay Mahadevan 1385304006b3SVijay Mahadevan /* create a meshset and then add old fileset as child */ 1386304006b3SVijay Mahadevan merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->vlocal); MBERR("Adding child vertices to parent failed", merr); 1387304006b3SVijay Mahadevan merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->elocal); MBERR("Adding child elements to parent failed", merr); 1388304006b3SVijay Mahadevan 1389304006b3SVijay Mahadevan /* preserve the field association between the parent and sub-mesh objects */ 1390304006b3SVijay Mahadevan ierr = DMMoabSetFieldNames(*newdm, dmmoab->numFields, dmmoab->fieldNames);CHKERRQ(ierr); 1391304006b3SVijay Mahadevan PetscFunctionReturn(0); 1392304006b3SVijay Mahadevan } 1393304006b3SVijay Mahadevan 1394304006b3SVijay Mahadevan 1395304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_Ascii(DM dm, PetscViewer viewer) 1396304006b3SVijay Mahadevan { 1397304006b3SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 1398304006b3SVijay Mahadevan const char *name; 1399304006b3SVijay Mahadevan MPI_Comm comm; 1400304006b3SVijay Mahadevan PetscMPIInt size; 1401304006b3SVijay Mahadevan PetscErrorCode ierr; 1402304006b3SVijay Mahadevan 1403304006b3SVijay Mahadevan PetscFunctionBegin; 1404304006b3SVijay Mahadevan ierr = PetscObjectGetComm((PetscObject)dm, &comm);CHKERRQ(ierr); 1405304006b3SVijay Mahadevan ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr); 1406304006b3SVijay Mahadevan ierr = PetscObjectGetName((PetscObject) dm, &name);CHKERRQ(ierr); 1407304006b3SVijay Mahadevan ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1408304006b3SVijay Mahadevan if (name) {ierr = PetscViewerASCIIPrintf(viewer, "%s in %D dimensions:\n", name, dmmoab->dim);CHKERRQ(ierr);} 1409304006b3SVijay Mahadevan else {ierr = PetscViewerASCIIPrintf(viewer, "Mesh in %D dimensions:\n", dmmoab->dim);CHKERRQ(ierr);} 1410304006b3SVijay Mahadevan /* print details about the global mesh */ 1411304006b3SVijay Mahadevan { 1412304006b3SVijay Mahadevan ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 14139c368985SVijay Mahadevan ierr = PetscViewerASCIIPrintf(viewer, "Sizes: cells=%D, vertices=%D, blocks=%D\n", dmmoab->nele, dmmoab->n, dmmoab->bs);CHKERRQ(ierr); 1414304006b3SVijay Mahadevan /* print boundary data */ 1415304006b3SVijay Mahadevan ierr = PetscViewerASCIIPrintf(viewer, "Boundary trace:\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size());CHKERRQ(ierr); 1416304006b3SVijay Mahadevan { 1417304006b3SVijay Mahadevan ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1418304006b3SVijay Mahadevan ierr = PetscViewerASCIIPrintf(viewer, "cells=%D, faces=%D, vertices=%D\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size());CHKERRQ(ierr); 1419304006b3SVijay Mahadevan ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1420304006b3SVijay Mahadevan } 1421304006b3SVijay Mahadevan /* print field data */ 1422304006b3SVijay Mahadevan ierr = PetscViewerASCIIPrintf(viewer, "Fields: %D components\n", dmmoab->numFields);CHKERRQ(ierr); 1423304006b3SVijay Mahadevan { 1424304006b3SVijay Mahadevan ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1425304006b3SVijay Mahadevan for (int i = 0; i < dmmoab->numFields; ++i) { 1426304006b3SVijay Mahadevan ierr = PetscViewerASCIIPrintf(viewer, "[%D] - %s\n", i, dmmoab->fieldNames[i]);CHKERRQ(ierr); 1427304006b3SVijay Mahadevan } 1428304006b3SVijay Mahadevan ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1429304006b3SVijay Mahadevan } 1430304006b3SVijay Mahadevan ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1431304006b3SVijay Mahadevan } 1432304006b3SVijay Mahadevan ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1433304006b3SVijay Mahadevan ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 1434304006b3SVijay Mahadevan PetscFunctionReturn(0); 1435304006b3SVijay Mahadevan } 1436304006b3SVijay Mahadevan 1437304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_VTK(DM dm, PetscViewer v) 1438304006b3SVijay Mahadevan { 1439304006b3SVijay Mahadevan PetscFunctionReturn(0); 1440304006b3SVijay Mahadevan } 1441304006b3SVijay Mahadevan 1442304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_HDF5(DM dm, PetscViewer v) 1443304006b3SVijay Mahadevan { 1444304006b3SVijay Mahadevan PetscFunctionReturn(0); 1445304006b3SVijay Mahadevan } 1446304006b3SVijay Mahadevan 1447304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMView_Moab(DM dm, PetscViewer viewer) 1448304006b3SVijay Mahadevan { 1449304006b3SVijay Mahadevan PetscBool iascii, ishdf5, isvtk; 1450304006b3SVijay Mahadevan PetscErrorCode ierr; 1451304006b3SVijay Mahadevan 1452304006b3SVijay Mahadevan PetscFunctionBegin; 1453304006b3SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1454304006b3SVijay Mahadevan PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2); 1455304006b3SVijay Mahadevan ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr); 1456304006b3SVijay Mahadevan ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERVTK, &isvtk);CHKERRQ(ierr); 1457304006b3SVijay Mahadevan ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERHDF5, &ishdf5);CHKERRQ(ierr); 1458304006b3SVijay Mahadevan if (iascii) { 1459304006b3SVijay Mahadevan ierr = DMMoabView_Ascii(dm, viewer);CHKERRQ(ierr); 1460304006b3SVijay Mahadevan } else if (ishdf5) { 1461304006b3SVijay Mahadevan #if defined(PETSC_HAVE_HDF5) && defined(MOAB_HAVE_HDF5) 1462304006b3SVijay Mahadevan ierr = PetscViewerPushFormat(viewer, PETSC_VIEWER_HDF5_VIZ);CHKERRQ(ierr); 1463304006b3SVijay Mahadevan ierr = DMMoabView_HDF5(dm, viewer);CHKERRQ(ierr); 1464304006b3SVijay Mahadevan ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr); 1465304006b3SVijay Mahadevan #else 1466304006b3SVijay Mahadevan SETERRQ(PetscObjectComm((PetscObject) dm), PETSC_ERR_SUP, "HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5"); 1467304006b3SVijay Mahadevan #endif 1468304006b3SVijay Mahadevan } 1469304006b3SVijay Mahadevan else if (isvtk) { 1470304006b3SVijay Mahadevan ierr = DMMoabView_VTK(dm, viewer);CHKERRQ(ierr); 1471304006b3SVijay Mahadevan } 1472304006b3SVijay Mahadevan PetscFunctionReturn(0); 1473304006b3SVijay Mahadevan } 1474304006b3SVijay Mahadevan 1475304006b3SVijay Mahadevan 1476304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMInitialize_Moab(DM dm) 1477304006b3SVijay Mahadevan { 1478304006b3SVijay Mahadevan PetscFunctionBegin; 1479304006b3SVijay Mahadevan dm->ops->view = DMView_Moab; 1480304006b3SVijay Mahadevan dm->ops->load = NULL /* DMLoad_Moab */; 1481304006b3SVijay Mahadevan dm->ops->setfromoptions = DMSetFromOptions_Moab; 1482304006b3SVijay Mahadevan dm->ops->clone = DMClone_Moab; 1483304006b3SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 1484304006b3SVijay Mahadevan dm->ops->createdefaultsection = NULL; 1485304006b3SVijay Mahadevan dm->ops->createdefaultconstraints = NULL; 1486304006b3SVijay Mahadevan dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 1487304006b3SVijay Mahadevan dm->ops->createlocalvector = DMCreateLocalVector_Moab; 1488304006b3SVijay Mahadevan dm->ops->getlocaltoglobalmapping = NULL; 1489304006b3SVijay Mahadevan dm->ops->createfieldis = NULL; 1490304006b3SVijay Mahadevan dm->ops->createcoordinatedm = NULL /* DMCreateCoordinateDM_Moab */; 1491304006b3SVijay Mahadevan dm->ops->getcoloring = NULL; 1492304006b3SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 1493304006b3SVijay Mahadevan dm->ops->createinterpolation = DMCreateInterpolation_Moab; 1494304006b3SVijay Mahadevan dm->ops->getaggregates = NULL; 14955a84ad33SLisandro Dalcin dm->ops->createinjection = NULL /* DMCreateInjection_Moab */; 1496304006b3SVijay Mahadevan dm->ops->refine = DMRefine_Moab; 1497304006b3SVijay Mahadevan dm->ops->coarsen = DMCoarsen_Moab; 1498304006b3SVijay Mahadevan dm->ops->refinehierarchy = DMRefineHierarchy_Moab; 1499304006b3SVijay Mahadevan dm->ops->coarsenhierarchy = DMCoarsenHierarchy_Moab; 1500304006b3SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 1501304006b3SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 1502304006b3SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 1503304006b3SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 1504304006b3SVijay Mahadevan dm->ops->destroy = DMDestroy_Moab; 1505304006b3SVijay Mahadevan dm->ops->createsubdm = NULL /* DMCreateSubDM_Moab */; 1506304006b3SVijay Mahadevan dm->ops->getdimpoints = NULL /* DMGetDimPoints_Moab */; 1507304006b3SVijay Mahadevan dm->ops->locatepoints = NULL /* DMLocatePoints_Moab */; 1508304006b3SVijay Mahadevan PetscFunctionReturn(0); 1509304006b3SVijay Mahadevan } 1510304006b3SVijay Mahadevan 1511304006b3SVijay Mahadevan 1512304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm) 1513304006b3SVijay Mahadevan { 1514304006b3SVijay Mahadevan PetscErrorCode ierr; 1515304006b3SVijay Mahadevan 1516304006b3SVijay Mahadevan PetscFunctionBegin; 1517304006b3SVijay Mahadevan /* get all the necessary handles from the private DM object */ 1518304006b3SVijay Mahadevan (*newdm)->data = (DM_Moab*) dm->data; 1519304006b3SVijay Mahadevan ((DM_Moab*)dm->data)->refct++; 1520304006b3SVijay Mahadevan 1521*d57f96a3SLisandro Dalcin ierr = PetscObjectChangeTypeName((PetscObject) *newdm, DMMOAB);CHKERRQ(ierr); 1522304006b3SVijay Mahadevan ierr = DMInitialize_Moab(*newdm);CHKERRQ(ierr); 1523304006b3SVijay Mahadevan PetscFunctionReturn(0); 1524304006b3SVijay Mahadevan } 1525304006b3SVijay Mahadevan 1526304006b3SVijay Mahadevan 1527f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 1528f6829af0SVijay Mahadevan { 1529f6829af0SVijay Mahadevan PetscErrorCode ierr; 1530f6829af0SVijay Mahadevan 1531f6829af0SVijay Mahadevan PetscFunctionBegin; 1532f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1533f90c3b0eSVijay Mahadevan ierr = PetscNewLog(dm, (DM_Moab**)&dm->data);CHKERRQ(ierr); 1534f6829af0SVijay Mahadevan 1535f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 1536f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->numFields = 1; 1537f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 1538f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 1539f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 1540f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 1541f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 1542f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleghost = 0; 1543c528d872SBarry Smith ((DM_Moab*)dm->data)->ltog_map = NULL; 1544c528d872SBarry Smith ((DM_Moab*)dm->data)->ltog_sendrecv = NULL; 1545f6829af0SVijay Mahadevan 1546304006b3SVijay Mahadevan ((DM_Moab*)dm->data)->refct = 1; 1547304006b3SVijay Mahadevan ((DM_Moab*)dm->data)->parent = NULL; 1548f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 1549f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 1550f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 1551f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 1552f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 1553f6829af0SVijay Mahadevan 1554304006b3SVijay Mahadevan ierr = DMInitialize_Moab(dm);CHKERRQ(ierr); 1555f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1556f6829af0SVijay Mahadevan } 1557f6829af0SVijay Mahadevan 1558